snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
28
web/templates/stream_settings/add_subscribers_form.hbs
Normal file
28
web/templates/stream_settings/add_subscribers_form.hbs
Normal file
@@ -0,0 +1,28 @@
|
||||
<div class="add_subscribers_container add-button-container">
|
||||
<div class="subscriber-input-scrollable-container" data-simplebar>
|
||||
<div class="pill-container person_picker">
|
||||
<div class="input" contenteditable="true"
|
||||
data-placeholder="{{t 'Add subscribers.' }}">
|
||||
{{~! Squash whitespace so that placeholder is displayed when empty. ~}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{#if (not hide_add_button)}}
|
||||
<div class="add_subscriber_button_wrapper add-users-button-wrapper inline-block">
|
||||
{{> ../components/action_button
|
||||
label=(t "Add")
|
||||
custom_classes="add-subscriber-button add-users-button"
|
||||
variant="subtle"
|
||||
intent="brand"
|
||||
type="submit"
|
||||
}}
|
||||
|
||||
{{> ../components/icon_button
|
||||
icon="check"
|
||||
intent="success"
|
||||
custom_classes="check hidden-below"
|
||||
disabled=true
|
||||
}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
14
web/templates/stream_settings/announce_stream_checkbox.hbs
Normal file
14
web/templates/stream_settings/announce_stream_checkbox.hbs
Normal file
@@ -0,0 +1,14 @@
|
||||
<label class="checkbox" for="id_should_announce_new_stream">
|
||||
<input type="checkbox" name="announce" value="announce" checked id="id_should_announce_new_stream"/>
|
||||
<span class="rendered-checkbox"></span>
|
||||
{{t "Announce new channel in"}}
|
||||
{{#if new_stream_announcements_stream_sub}}
|
||||
<strong>
|
||||
{{> ../decorated_channel_name
|
||||
inline_with_text=true
|
||||
stream=new_stream_announcements_stream_sub
|
||||
}}
|
||||
</strong>
|
||||
{{/if}}
|
||||
{{> ../help_link_widget link="/help/configure-automated-notices#new-channel-announcements"}}
|
||||
</label>
|
||||
3
web/templates/stream_settings/browse_streams_list.hbs
Normal file
3
web/templates/stream_settings/browse_streams_list.hbs
Normal file
@@ -0,0 +1,3 @@
|
||||
{{#each subscriptions}}
|
||||
{{> browse_streams_list_item . }}
|
||||
{{/each}}
|
||||
70
web/templates/stream_settings/browse_streams_list_item.hbs
Normal file
70
web/templates/stream_settings/browse_streams_list_item.hbs
Normal file
@@ -0,0 +1,70 @@
|
||||
{{! Client-side Handlebars template for rendering subscriptions. }}
|
||||
<div class="stream-row" data-stream-id="{{stream_id}}" data-stream-name="{{name}}">
|
||||
|
||||
{{#if subscribed}}
|
||||
<div class="check checked sub_unsub_button">
|
||||
|
||||
<div class="tippy-zulip-tooltip" data-tooltip-template-id="unsubscribe-from-{{stream_id}}-stream-tooltip-template">
|
||||
<template id="unsubscribe-from-{{stream_id}}-stream-tooltip-template">
|
||||
<span>
|
||||
{{#tr}}
|
||||
Unsubscribe from <z-stream></z-stream>
|
||||
{{#*inline "z-stream"}}{{> ../decorated_channel_name inline_with_text=true stream=this}}{{/inline}}
|
||||
{{/tr}}
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<i class="zulip-icon zulip-icon-subscriber-check sub-unsub-icon"></i>
|
||||
</div>
|
||||
<div class='sub_unsub_status'></div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="check sub_unsub_button {{#unless should_display_subscription_button}}disabled{{/unless}}">
|
||||
|
||||
<div class="tippy-zulip-tooltip" data-tooltip-template-id="{{#if should_display_subscription_button}}subscribe-to-{{stream_id}}-stream-tooltip-template{{else}}cannot-subscribe-to-{{stream_id}}-stream-tooltip-template{{/if}}">
|
||||
<template id="subscribe-to-{{stream_id}}-stream-tooltip-template">
|
||||
<span>
|
||||
{{#tr}}
|
||||
Subscribe to <z-stream></z-stream>
|
||||
{{#*inline "z-stream"}}{{> ../decorated_channel_name inline_with_text=true stream=this}}{{/inline}}
|
||||
{{/tr}}
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<template id="cannot-subscribe-to-{{stream_id}}-stream-tooltip-template">
|
||||
<span>
|
||||
{{#tr}}
|
||||
Cannot subscribe to <z-stream></z-stream>
|
||||
{{#*inline "z-stream"}}{{> ../decorated_channel_name inline_with_text=true stream=this}}{{/inline}}
|
||||
{{/tr}}
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<i class="zulip-icon zulip-icon-subscriber-plus sub-unsub-icon"></i>
|
||||
</div>
|
||||
<div class='sub_unsub_status'></div>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{> subscription_setting_icon . }}
|
||||
<div class="sub-info-box">
|
||||
<div class="top-bar">
|
||||
<div class="stream-name">{{name}}</div>
|
||||
<div class="subscriber-count tippy-zulip-tooltip" data-tippy-content="{{t 'Subscriber count' }}">
|
||||
{{> subscriber_count .}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom-bar">
|
||||
<div class="description rendered_markdown" data-no-description="{{t 'No description.'}}">{{rendered_markdown rendered_description}}</div>
|
||||
{{#if is_old_stream}}
|
||||
<div class="stream-message-count tippy-zulip-tooltip" data-tippy-content="{{t 'Estimated messages per week' }}">
|
||||
<i class="fa fa-bar-chart"></i>
|
||||
<span class="stream-message-count-text">{{stream_weekly_traffic}}</span>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="stream-message-count tippy-zulip-tooltip" data-tippy-content="{{t 'Channel created recently' }}">
|
||||
<span class="stream-message-count-text">{{t "New" }}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
14
web/templates/stream_settings/change_stream_info_modal.hbs
Normal file
14
web/templates/stream_settings/change_stream_info_modal.hbs
Normal file
@@ -0,0 +1,14 @@
|
||||
<div class="change-stream-name-container">
|
||||
<label for="change_stream_name" class="modal-field-label">
|
||||
{{t 'Channel name' }}
|
||||
</label>
|
||||
<input type="text" id="change_stream_name" class="modal_text_input" name="stream_name" value="{{ stream_name }}" maxlength="{{ max_stream_name_length }}" />
|
||||
<div id="change_stream_name_error"></div>
|
||||
</div>
|
||||
<div>
|
||||
<label for="change_stream_description" class="modal-field-label">
|
||||
{{t 'Description' }}
|
||||
{{> ../help_link_widget link="/help/change-the-channel-description" }}
|
||||
</label>
|
||||
<textarea id="change_stream_description" class="modal-textarea" name="stream_description" maxlength="{{ max_stream_description_length }}">{{ stream_description }}</textarea>
|
||||
</div>
|
||||
31
web/templates/stream_settings/channel_folder.hbs
Normal file
31
web/templates/stream_settings/channel_folder.hbs
Normal file
@@ -0,0 +1,31 @@
|
||||
<div class="channel-folder-subsection">
|
||||
<div class="input-group channel-folder-container">
|
||||
{{!-- This is a modified version of dropdown_widget_with_label.hbs
|
||||
component so that we can show dropdown button and button to create
|
||||
a new folder on same line without having to add much CSS with
|
||||
hardcoded margin and padding values. --}}
|
||||
<label class="settings-field-label" for="{{channel_folder_widget_name}}_widget">
|
||||
{{t "Channel folder"}}
|
||||
{{> ../help_link_widget link="/help/channel-folders" }}
|
||||
</label>
|
||||
<span class="prop-element hide" id="id_{{channel_folder_widget_name}}" data-setting-widget-type="dropdown-list-widget" data-setting-value-type="number"></span>
|
||||
<div class="dropdown_widget_with_label_wrapper channel-folder-widget-container">
|
||||
{{> ../dropdown_widget widget_name=channel_folder_widget_name}}
|
||||
|
||||
{{#if is_admin}}
|
||||
{{> ../components/action_button
|
||||
label=(t "Create new folder")
|
||||
variant="subtle"
|
||||
intent="neutral"
|
||||
type="button"
|
||||
custom_classes="create-channel-folder-button"
|
||||
}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span class="settings-field-label no-folders-configured-message">
|
||||
{{t "There are no channel folders configured in this organization."}}
|
||||
{{> ../help_link_widget link="/help/channel-folders" }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -0,0 +1,22 @@
|
||||
{{#if is_archived}}
|
||||
{{#if can_view_channel}}
|
||||
{{#tr}}
|
||||
An <z-link>archived channel</z-link> with this name already exists.
|
||||
{{#*inline "z-link"}}<a href="#channels/{{stream_id}}/general" class="stream-settings-link">{{> @partial-block}}</a>{{/inline}}
|
||||
{{/tr}}
|
||||
{{else}}
|
||||
{{t "An archived channel with this name already exists." }}
|
||||
{{/if}}
|
||||
{{#if show_rename}}
|
||||
<a id="archived_stream_rename" data-stream-id="{{stream_id}}">{{t "Rename it" }}</a>
|
||||
{{/if}}
|
||||
{{else}}
|
||||
{{#if can_view_channel}}
|
||||
{{#tr}}
|
||||
A <z-link>channel</z-link> with this name already exists.
|
||||
{{#*inline "z-link"}}<a href="#channels/{{stream_id}}/general" class="stream-settings-link">{{> @partial-block}}</a>{{/inline}}
|
||||
{{/tr}}
|
||||
{{else}}
|
||||
{{t "A channel with this name already exists." }}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
164
web/templates/stream_settings/channel_permissions.hbs
Normal file
164
web/templates/stream_settings/channel_permissions.hbs
Normal file
@@ -0,0 +1,164 @@
|
||||
<div id="channel-subscription-permissions" class="settings-subsection-parent">
|
||||
<div class="subsection-header">
|
||||
<h3 class="settings-subsection-title">{{t "Subscription management"}}</h3>
|
||||
{{#if is_stream_edit}}
|
||||
{{> ../settings/settings_save_discard_widget section_name="subscription-permissions" show_save_discard_buttons=true}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{#if is_stream_edit}}
|
||||
<div class="stream-permissions-warning-banner"></div>
|
||||
{{> channel_type .
|
||||
channel_privacy_widget_name="channel_privacy" }}
|
||||
|
||||
<div class="default-stream">
|
||||
{{> ../settings/settings_checkbox
|
||||
prefix=prefix
|
||||
setting_name="is_default_stream"
|
||||
is_checked=check_default_stream
|
||||
label=(t "Default channel for new users")
|
||||
help_link="/help/set-default-channels-for-new-users"
|
||||
}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_subscribe_group"
|
||||
label=group_setting_labels.can_subscribe_group
|
||||
prefix=prefix }}
|
||||
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_add_subscribers_group"
|
||||
label=group_setting_labels.can_add_subscribers_group
|
||||
prefix=prefix }}
|
||||
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_remove_subscribers_group"
|
||||
label=group_setting_labels.can_remove_subscribers_group
|
||||
prefix=prefix }}
|
||||
|
||||
{{#unless is_stream_edit}}
|
||||
{{#if is_admin}}
|
||||
<div class="default-push-notifications">
|
||||
{{> ../settings/settings_checkbox
|
||||
prefix=prefix
|
||||
setting_name="default_push_notifications"
|
||||
is_checked=false
|
||||
is_disabled=disable_push_notifications
|
||||
label=(t "Mobile push notifications enabled by default")
|
||||
tooltip_message=push_notifications_tooltip
|
||||
}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
</div>
|
||||
|
||||
<div id="channel-messaging-permissions" class="settings-subsection-parent">
|
||||
<div class="subsection-header">
|
||||
<h3 class="settings-subsection-title">{{t "Messaging permissions"}}</h3>
|
||||
{{#if is_stream_edit}}
|
||||
{{> ../settings/settings_save_discard_widget section_name="messaging-permissions" show_save_discard_buttons=true}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_send_message_group"
|
||||
label=group_setting_labels.can_send_message_group
|
||||
prefix=prefix
|
||||
help_link="/help/channel-posting-policy" }}
|
||||
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_create_topic_group"
|
||||
label=group_setting_labels.can_create_topic_group
|
||||
prefix=prefix
|
||||
help_link="/help/configure-who-can-start-new-topics" }}
|
||||
|
||||
<div class="input-group">
|
||||
<label for="{{prefix}}topics_policy" class="settings-field-label">{{> stream_topics_policy_label .}}</label>
|
||||
<select name="stream-topics-policy-setting" id="{{prefix}}topics_policy" class="prop-element settings_select bootstrap-focus-style" data-setting-widget-type="string">
|
||||
{{> ../settings/dropdown_options_widget option_values=(object_values stream_topics_policy_values)}}
|
||||
</select>
|
||||
{{> topics_already_exist_error .}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="channel-moderation-permissions" class="settings-subsection-parent">
|
||||
<div class="subsection-header">
|
||||
<h3 class="settings-subsection-title">{{t "Moderation permissions"}}</h3>
|
||||
{{#if is_stream_edit}}
|
||||
{{> ../settings/settings_save_discard_widget section_name="moderation-permissions" show_save_discard_buttons=true}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_move_messages_within_channel_group"
|
||||
label=group_setting_labels.can_move_messages_within_channel_group
|
||||
prefix=prefix }}
|
||||
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_move_messages_out_of_channel_group"
|
||||
label=group_setting_labels.can_move_messages_out_of_channel_group
|
||||
prefix=prefix }}
|
||||
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_resolve_topics_group"
|
||||
label=group_setting_labels.can_resolve_topics_group
|
||||
prefix=prefix }}
|
||||
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_delete_any_message_group"
|
||||
label=group_setting_labels.can_delete_any_message_group
|
||||
prefix=prefix }}
|
||||
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_delete_own_message_group"
|
||||
label=group_setting_labels.can_delete_own_message_group
|
||||
prefix=prefix }}
|
||||
</div>
|
||||
|
||||
<div id="channel-administrative-permissions" class="settings-subsection-parent">
|
||||
<div class="subsection-header">
|
||||
<h3 class="settings-subsection-title">{{t "Administrative permissions"}}</h3>
|
||||
{{#if is_stream_edit}}
|
||||
{{> ../settings/settings_save_discard_widget section_name="administrative-permissions" show_save_discard_buttons=true}}
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="admin-permissions-tip">
|
||||
{{t 'Organization administrators can automatically administer all channels.'}}
|
||||
</div>
|
||||
{{> ../settings/group_setting_value_pill_input
|
||||
setting_name="can_administer_channel_group"
|
||||
label=group_setting_labels.can_administer_channel_group
|
||||
prefix=prefix }}
|
||||
|
||||
{{#if (or is_owner is_stream_edit)}}
|
||||
<div>
|
||||
<div class="input-group message-retention-setting-group time-limit-setting">
|
||||
<label class="dropdown-title settings-field-label" for="{{prefix}}message_retention_days">{{t "Message retention period" }}
|
||||
{{> ../help_link_widget link="/help/message-retention-policy" }}
|
||||
</label>
|
||||
|
||||
{{> ../settings/upgrade_tip_widget .}}
|
||||
|
||||
<select name="stream_message_retention_setting"
|
||||
class="stream_message_retention_setting prop-element settings_select bootstrap-focus-style"
|
||||
id="{{prefix}}message_retention_days"
|
||||
data-setting-widget-type="message-retention-setting">
|
||||
<option value="realm_default">{{t "Organization default {org_level_message_retention_setting}" }}</option>
|
||||
<option value="unlimited">{{t 'Retain forever' }}</option>
|
||||
<option value="custom_period">{{t 'Custom' }}</option>
|
||||
</select>
|
||||
|
||||
<div class="dependent-settings-block stream-message-retention-days-input">
|
||||
<label class="inline-block" for="{{prefix}}stream_message_retention_custom_input">
|
||||
{{t 'Retention period (days)' }}:
|
||||
</label>
|
||||
<input type="text" autocomplete="off"
|
||||
name="stream-message-retention-days"
|
||||
class="stream-message-retention-days message-retention-setting-custom-input time-limit-custom-input"
|
||||
id="{{prefix}}stream_message_retention_custom_input" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
13
web/templates/stream_settings/channel_type.hbs
Normal file
13
web/templates/stream_settings/channel_type.hbs
Normal file
@@ -0,0 +1,13 @@
|
||||
{{> ../dropdown_widget_with_label
|
||||
widget_name=channel_privacy_widget_name
|
||||
label=(t 'Who can access this channel')}}
|
||||
|
||||
<div class="history-public-to-subscribers">
|
||||
{{> ../settings/settings_checkbox
|
||||
prefix=prefix
|
||||
setting_name="history_public_to_subscribers"
|
||||
is_checked=history_public_to_subscribers
|
||||
label=(t "Subscribers can view messages sent before they joined")
|
||||
help_link="/help/channel-permissions#private-channels"
|
||||
}}
|
||||
</div>
|
||||
30
web/templates/stream_settings/copy_email_address_modal.hbs
Normal file
30
web/templates/stream_settings/copy_email_address_modal.hbs
Normal file
@@ -0,0 +1,30 @@
|
||||
<div class="copy-email-modal">
|
||||
{{> ../dropdown_widget_with_label
|
||||
widget_name="sender_channel_email_address"
|
||||
label=(t 'Who should be the sender of the Zulip messages for this email address?')}}
|
||||
<p class="question-which-parts">
|
||||
{{t "Which parts of the emails should be included in the Zulip messages?"}}
|
||||
</p>
|
||||
{{#each tags}}
|
||||
{{#if (eq this.name "prefer-html") }}
|
||||
<hr />
|
||||
{{/if}}
|
||||
<div class="input-group" id="{{this.name}}-input-group">
|
||||
<label class="checkbox">
|
||||
<input class="tag-checkbox" id="{{ this.name }}" type="checkbox"/>
|
||||
<span class="rendered-checkbox"></span>
|
||||
</label>
|
||||
<label class="inline" for="{{this.name}}">{{this.description}}</label>
|
||||
</div>
|
||||
{{/each}}
|
||||
<hr />
|
||||
<p class="stream-email-header">
|
||||
{{t "Channel email address:"}}
|
||||
</p>
|
||||
<div class="stream-email">
|
||||
<div class="email-address">{{email_address}}</div>
|
||||
<span class="copy-button tippy-zulip-tooltip copy-email-address" data-tippy-content="{{t 'Copy email address' }}" data-clipboard-text="{{email_address}}">
|
||||
<i class="zulip-icon zulip-icon-copy"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,12 @@
|
||||
<div class="channel-folder-name-container">
|
||||
<label for="new_channel_folder_name" class="modal-field-label">
|
||||
{{t 'Channel folder name' }}
|
||||
</label>
|
||||
<input type="text" id="new_channel_folder_name" class="modal_text_input" name="channel_folder_name" maxlength="{{ max_channel_folder_name_length }}" />
|
||||
</div>
|
||||
<div>
|
||||
<label for="new_channel_folder_description" class="modal-field-label">
|
||||
{{t 'Description' }}
|
||||
</label>
|
||||
<textarea id="new_channel_folder_description" class="modal-textarea" name="channel_folder_description" maxlength="{{ max_channel_folder_description_length }}"></textarea>
|
||||
</div>
|
||||
45
web/templates/stream_settings/edit_channel_folder_modal.hbs
Normal file
45
web/templates/stream_settings/edit_channel_folder_modal.hbs
Normal file
@@ -0,0 +1,45 @@
|
||||
<div id="channel_folder_banner" class="banner-wrapper"></div>
|
||||
<div class="channel-folder-name-container">
|
||||
<label for="edit_channel_folder_name" class="modal-field-label">
|
||||
{{t 'Channel folder name' }}
|
||||
</label>
|
||||
<input type="text" id="edit_channel_folder_name" class="modal_text_input" name="channel_folder_name" maxlength="{{ max_channel_folder_name_length }}" value="{{name}}" {{#unless can_manage_folder}} disabled {{/unless}}/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="edit_channel_folder_description" class="modal-field-label">
|
||||
{{t 'Description' }}
|
||||
</label>
|
||||
<textarea id="edit_channel_folder_description" class="modal-textarea" name="channel_folder_description" maxlength="{{ max_channel_folder_description_length }}" {{#unless can_manage_folder}} disabled {{/unless}}>{{~description~}}</textarea>
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
<h3 class="folder-channels-list-header">
|
||||
{{t 'Channels' }}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="stream-list-container" data-folder-id="{{folder_id}}">
|
||||
<div class="stream-search-container filter-input has-input-icon has-input-button input-element-wrapper">
|
||||
<i class="input-icon zulip-icon zulip-icon-search" aria-hidden="true"></i>
|
||||
<input type="text" class="input-element stream-search" placeholder="{{t 'Filter' }}" />
|
||||
<button type="button" class="input-button input-close-filter-button icon-button icon-button-square icon-button-neutral ">
|
||||
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="edit-channel-folder-stream-list modal-list-scroll-container" data-simplebar data-simplebar-tab-index="-1">
|
||||
<ul class="folder-stream-list modal-item-list" data-empty="{{t 'No channel in channel folder.' }}" data-search-results-empty="{{t 'No matching channels.' }}"></ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{#if can_manage_folder}}
|
||||
<div>
|
||||
<div>
|
||||
<h3 class="folder-channels-list-header">
|
||||
{{t 'Add a channel' }}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="add_channel_folder_widget">
|
||||
{{> ../dropdown_widget widget_name="add_channel_folder"}}
|
||||
{{> ../components/action_button label=(t "Add") custom_classes="add-channel-button" variant="subtle" intent="brand" aria-label=(t "Add") }}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
15
web/templates/stream_settings/first_stream_created_modal.hbs
Normal file
15
web/templates/stream_settings/first_stream_created_modal.hbs
Normal file
@@ -0,0 +1,15 @@
|
||||
{{t 'You will now see the channel you created. To go back to channel settings, you can:' }}
|
||||
<ul class="modal-options-list">
|
||||
<li>
|
||||
{{#tr}}
|
||||
Click on <z-stream></z-stream> at the top of your Zulip window.
|
||||
{{#*inline "z-stream"}}<b class="highlighted-element">{{> ../decorated_channel_name stream=stream}}</b>{{/inline}}
|
||||
{{/tr}}
|
||||
</li>
|
||||
<li>
|
||||
{{#tr}}
|
||||
Use the <z-highlight>back</z-highlight> button in your browser or desktop app.
|
||||
{{#*inline "z-highlight"}}<b class="highlighted-element">{{> @partial-block}}</b>{{/inline}}
|
||||
{{/tr}}
|
||||
</li>
|
||||
</ul>
|
||||
12
web/templates/stream_settings/new_channel_members_title.hbs
Normal file
12
web/templates/stream_settings/new_channel_members_title.hbs
Normal file
@@ -0,0 +1,12 @@
|
||||
<span>
|
||||
{{#tr}}
|
||||
Add subscribers to <z-channel-name></z-channel-name>
|
||||
{{#*inline "z-channel-name"}}
|
||||
{{> stream_privacy_icon
|
||||
invite_only=sub.invite_only
|
||||
is_web_public=sub.is_web_public
|
||||
is_archived=sub.is_archived }}
|
||||
<span class="stream-name-title">{{sub.name}}</span>
|
||||
{{/inline}}
|
||||
{{/tr}}
|
||||
</span>
|
||||
34
web/templates/stream_settings/new_stream_configuration.hbs
Normal file
34
web/templates/stream_settings/new_stream_configuration.hbs
Normal file
@@ -0,0 +1,34 @@
|
||||
{{> channel_type .
|
||||
channel_privacy_widget_name="new_channel_privacy" }}
|
||||
|
||||
{{#if ask_to_announce_stream}}
|
||||
<div id="announce-new-stream">
|
||||
{{>announce_stream_checkbox . }}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="default-stream">
|
||||
{{> ../settings/settings_checkbox
|
||||
prefix=prefix
|
||||
setting_name="is_default_stream"
|
||||
is_checked=check_default_stream
|
||||
label=(t "Default channel for new users")
|
||||
help_link="/help/set-default-channels-for-new-users"
|
||||
}}
|
||||
</div>
|
||||
|
||||
{{> channel_folder .
|
||||
is_stream_edit=false
|
||||
}}
|
||||
|
||||
<div class="advanced-configurations-container">
|
||||
<div class="subsection-header advance-config-toggle-area">
|
||||
<i class="fa fa-sm fa-caret-right toggle-advanced-configurations-icon" aria-hidden="true"></i>
|
||||
<h3 class="settings-subsection-title">{{t 'Advanced configuration' }}</h3>
|
||||
</div>
|
||||
<div class="advanced-configurations-collapase-view hide">
|
||||
{{> channel_permissions .
|
||||
is_stream_edit=false
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
17
web/templates/stream_settings/new_stream_user.hbs
Normal file
17
web/templates/stream_settings/new_stream_user.hbs
Normal file
@@ -0,0 +1,17 @@
|
||||
<tr class="settings-subscriber-row" data-user-id="{{user_id}}" >
|
||||
<td class="panel_user_list">
|
||||
{{> ../user_display_only_pill . display_value=full_name strikethrough=soft_removed is_active=true is_bot=is_bot}}
|
||||
</td>
|
||||
{{#if email}}
|
||||
<td class="subscriber-email settings-email-column {{#if soft_removed}} strikethrough {{/if}}">{{email}}</td>
|
||||
{{else}}
|
||||
<td class="hidden-subscriber-email {{#if soft_removed}} strikethrough {{/if}}">{{t "(hidden)"}}</td>
|
||||
{{/if}}
|
||||
<td class="action-column">
|
||||
{{#if soft_removed}}
|
||||
{{> ../components/action_button custom_classes="undo_soft_removed_potential_subscriber" label=(t "Add") variant="subtle" intent="neutral" aria-label=(t "Add") }}
|
||||
{{else}}
|
||||
{{> ../components/action_button custom_classes="remove_potential_subscriber" label=(t "Remove") variant="subtle" intent="neutral" aria-label=(t "Remove") }}
|
||||
{{/if}}
|
||||
</td>
|
||||
</tr>
|
||||
41
web/templates/stream_settings/new_stream_users.hbs
Normal file
41
web/templates/stream_settings/new_stream_users.hbs
Normal file
@@ -0,0 +1,41 @@
|
||||
{{> add_subscribers_form hide_add_button=true}}
|
||||
|
||||
<div class="add-subscribers-subtitle">
|
||||
{{#tr}}
|
||||
Enter a <z-user-roles-link>user role</z-user-roles-link>,
|
||||
<z-user-groups-link>user group</z-user-groups-link>,
|
||||
or <z-channel-link>#channel</z-channel-link> to add multiple users at once.
|
||||
{{#*inline "z-user-roles-link"}}<a href="/help/user-roles" target="_blank" rel="noopener noreferrer">{{> @partial-block}}</a>{{/inline}}
|
||||
{{#*inline "z-user-groups-link"}}<a href="/help/user-groups" target="_blank" rel="noopener noreferrer">{{> @partial-block}}</a>{{/inline}}
|
||||
{{#*inline "z-channel-link"}}<a href="/help/introduction-to-channels" target="_blank" rel="noopener noreferrer">{{> @partial-block}}</a>{{/inline}}
|
||||
{{/tr}}
|
||||
</div>
|
||||
|
||||
<div class="settings_panel_list_header">
|
||||
<div class="subscribers-heading">
|
||||
<h3 class="settings-table-title">{{t 'Subscribers preview' }}</h3>
|
||||
<div class="add-subscriber-loading-spinner"></div>
|
||||
</div>
|
||||
<div class="user_filters">
|
||||
{{> ../settings/filter_text_input placeholder=(t 'Filter') aria_label=(t 'Filter subscribers') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="subscriber-list-box">
|
||||
<div class="subscriber_list_container" data-simplebar data-simplebar-tab-index="-1">
|
||||
<table class="subscriber-list table table-striped">
|
||||
<thead class="table-sticky-headers">
|
||||
<tr>
|
||||
<th class="panel_user_list" data-sort="alphabetic" data-sort-prop="full_name">{{t "Name" }}
|
||||
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
|
||||
</th>
|
||||
<th class="settings-email-column" data-sort="email">{{t "Email" }}
|
||||
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
|
||||
</th>
|
||||
<th class="action-column">{{t "Action" }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="create_stream_subscribers" class="subscriber_table" data-empty="{{t 'This channel has no subscribers.' }}" data-search-results-empty="{{t 'No channel subscribers match your current filter.'}}"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
79
web/templates/stream_settings/selected_stream_title.hbs
Normal file
79
web/templates/stream_settings/selected_stream_title.hbs
Normal file
@@ -0,0 +1,79 @@
|
||||
<div class="selected-stream-title">
|
||||
<a class="tippy-zulip-delayed-tooltip selected-stream" data-tooltip-template-id="view-stream-tooltip-template" data-tippy-placement="top" href="{{preview_url}}">
|
||||
{{> stream_privacy_icon
|
||||
invite_only=sub.invite_only
|
||||
is_web_public=sub.is_web_public
|
||||
is_archived=sub.is_archived }}
|
||||
<span class="stream-name-title">{{sub.name}}</span>
|
||||
</a>
|
||||
<template id="view-stream-tooltip-template">
|
||||
<span class="view-channel-tooltip">
|
||||
<span class="view-channel-text">
|
||||
{{#tr}}
|
||||
View <z-channel-name></z-channel-name>
|
||||
{{#*inline "z-channel-name"}}{{> ../decorated_channel_name inline_with_text=true stream=sub}}{{/inline}}
|
||||
{{/tr}}
|
||||
</span>
|
||||
{{tooltip_hotkey_hints "Shift" "V"}}
|
||||
</span>
|
||||
</template>
|
||||
{{#with sub}}
|
||||
<div class="button-group stream-title-buttons" data-stream-id="{{stream_id}}">
|
||||
<div class="left-end button-group">
|
||||
{{> ../components/icon_button
|
||||
icon="edit"
|
||||
intent="neutral"
|
||||
custom_classes="tippy-zulip-delayed-tooltip"
|
||||
id="channel_title_open_channel_info_modal"
|
||||
data-tippy-content=(t 'Edit channel name and description')
|
||||
hidden=(not can_change_name_description)
|
||||
}}
|
||||
</div>
|
||||
<div class="right-end button-group">
|
||||
<div class="large-window-alert-notification-container">
|
||||
<div class="stream_change_property_info alert-notification"></div>
|
||||
</div>
|
||||
<div class="sub_unsub_button_wrapper inline-block {{#unless should_display_subscription_button }}cannot-subscribe-tooltip{{/unless}}" data-tooltip-template-id="cannot-subscribe-tooltip-template">
|
||||
<template id="cannot-subscribe-tooltip-template">
|
||||
<span>
|
||||
{{#tr}}
|
||||
Cannot subscribe to private channel <z-stream></z-stream>
|
||||
{{#*inline "z-stream"}}{{> ../decorated_channel_name inline_with_text=true stream=../sub}}{{/inline}}
|
||||
{{/tr}}
|
||||
</span>
|
||||
</template>
|
||||
<button class="action-button subscribe-button sub_unsub_button {{#if subscribed}}action-button-subtle-neutral{{else}}action-button-subtle-brand{{/if}} {{#if should_display_subscription_button}}toggle-subscription-tooltip{{/if}} {{#unless subscribed }}unsubscribed{{/unless}}" type="button" name="button" data-tooltip-template-id="toggle-subscription-tooltip-template" {{#unless should_display_subscription_button}}disabled="disabled"{{/unless}}>
|
||||
<span class="action-button-label">
|
||||
{{#if subscribed }}
|
||||
{{t "Unsubscribe" }}
|
||||
{{else}}
|
||||
{{t "Subscribe" }}
|
||||
{{/if}}
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
{{> ../components/action_button
|
||||
icon="eye"
|
||||
variant="subtle"
|
||||
intent="neutral"
|
||||
custom_classes="tippy-zulip-delayed-tooltip"
|
||||
data-tooltip-template-id="view-stream-tooltip-template"
|
||||
id="preview-stream-button"
|
||||
hidden=(not should_display_preview_button)
|
||||
}}
|
||||
{{> ../components/icon_button
|
||||
icon="archive"
|
||||
intent="danger"
|
||||
custom_classes="tippy-zulip-delayed-tooltip deactivate"
|
||||
data-tippy-content=(t 'Archive channel')
|
||||
}}
|
||||
{{> ../components/icon_button
|
||||
icon="unarchive"
|
||||
intent="success"
|
||||
custom_classes="tippy-zulip-delayed-tooltip reactivate"
|
||||
data-tippy-content=(t 'Unarchive channel')
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
{{/with}}
|
||||
</div>
|
||||
@@ -0,0 +1,4 @@
|
||||
{{t "Who can subscribe to this channel"}}
|
||||
{{#unless is_invite_only}}
|
||||
<i>({{t "everyone except guests can subscribe to any public channel"}})</i>
|
||||
{{/unless}}
|
||||
80
web/templates/stream_settings/stream_creation_form.hbs
Normal file
80
web/templates/stream_settings/stream_creation_form.hbs
Normal file
@@ -0,0 +1,80 @@
|
||||
<div class="hide two-pane-settings-right-simplebar-container" id="stream-creation" tabindex="-1" role="dialog"
|
||||
aria-label="{{t 'Channel creation' }}">
|
||||
<form id="stream_creation_form">
|
||||
<div class="two-pane-settings-creation-simplebar-container" data-simplebar data-simplebar-tab-index="-1">
|
||||
<div class="alert stream_create_info"></div>
|
||||
<div id="stream_creating_indicator"></div>
|
||||
<div class="stream-creation-body">
|
||||
<div class="configure_channel_settings stream_creation_container">
|
||||
<section id="create_stream_title_container">
|
||||
<label for="create_stream_name">
|
||||
{{t "Channel name" }}
|
||||
</label>
|
||||
<input type="text" name="stream_name" id="create_stream_name" class="settings_text_input"
|
||||
placeholder="{{t 'Channel name' }}" value="" autocomplete="off" />
|
||||
<div id="stream_name_error" class="stream_creation_error"></div>
|
||||
</section>
|
||||
<section id="create_stream_description_container">
|
||||
<label for="create_stream_description" class="settings-field-label">
|
||||
{{t "Channel description" }}
|
||||
{{> ../help_link_widget link="/help/change-the-channel-description" }}
|
||||
</label>
|
||||
<input type="text" name="stream_description" id="create_stream_description" class="settings_text_input"
|
||||
placeholder="{{t 'Channel description' }}" value="" autocomplete="off" maxlength="{{ max_stream_description_length }}" />
|
||||
</section>
|
||||
<section id="make-invite-only">
|
||||
<div class="new-stream-configuration">
|
||||
{{> new_stream_configuration .
|
||||
prefix="id_new_"
|
||||
channel_folder_widget_name="new_channel_folder_id"}}
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<div class="subscribers_container stream_creation_container">
|
||||
<section class="stream_create_add_subscriber_container">
|
||||
<div class="subsection-header">
|
||||
<h3 class="settings-subsection-title">
|
||||
<label class="choose-subscribers-label">{{t "Choose subscribers" }}</label>
|
||||
</h3>
|
||||
</div>
|
||||
<div id="stream_subscription_error" class="stream_creation_error"></div>
|
||||
<div class="controls" id="people_to_add"></div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-sticky-footer">
|
||||
<div class="settings-sticky-footer-left">
|
||||
{{> ../components/action_button
|
||||
label=(t "Back to settings")
|
||||
custom_classes="hide"
|
||||
id="stream_creation_go_to_configure_channel_settings"
|
||||
variant="subtle"
|
||||
intent="brand"
|
||||
}}
|
||||
</div>
|
||||
<div class="settings-sticky-footer-right">
|
||||
{{> ../components/action_button
|
||||
label=(t "Cancel")
|
||||
custom_classes="create_stream_cancel inline-block"
|
||||
variant="subtle"
|
||||
intent="neutral"
|
||||
}}
|
||||
{{> ../components/action_button
|
||||
label=(t "Create")
|
||||
custom_classes="finalize_create_stream hide"
|
||||
variant="subtle"
|
||||
intent="brand"
|
||||
type="submit"
|
||||
}}
|
||||
{{> ../components/action_button
|
||||
label=(t "Continue to add subscribers")
|
||||
custom_classes="inline-block"
|
||||
id="stream_creation_go_to_subscribers"
|
||||
variant="subtle"
|
||||
intent="brand"
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
9
web/templates/stream_settings/stream_description.hbs
Normal file
9
web/templates/stream_settings/stream_description.hbs
Normal file
@@ -0,0 +1,9 @@
|
||||
{{#if rendered_description}}
|
||||
<div class="sub-stream-description {{#if use_view_only_styling}}settings-view-only-textarea{{/if}} rendered_markdown">
|
||||
{{rendered_markdown rendered_description}}
|
||||
</div>
|
||||
{{else}}
|
||||
<span class="sub-stream-description no-description">
|
||||
{{t "No description." }}
|
||||
</span>
|
||||
{{/if}}
|
||||
19
web/templates/stream_settings/stream_member_list_entry.hbs
Normal file
19
web/templates/stream_settings/stream_member_list_entry.hbs
Normal file
@@ -0,0 +1,19 @@
|
||||
<tr data-subscriber-id="{{user_id}}" class="hidden-remove-button-row">
|
||||
<td class="subscriber-name panel_user_list">
|
||||
{{> ../user_display_only_pill . display_value=name is_active=true}}
|
||||
</td>
|
||||
{{#if email}}
|
||||
<td class="subscriber-email settings-email-column">{{email}}</td>
|
||||
{{else}}
|
||||
<td class="hidden-subscriber-email">{{t "(hidden)"}}</td>
|
||||
{{/if}}
|
||||
{{#if can_remove_subscribers}}
|
||||
<td class="unsubscribe remove-button-wrapper remove-button-column">
|
||||
{{#if for_user_group_members}}
|
||||
{{> ../components/icon_button icon="close" custom_classes="hidden-remove-button remove-subscriber-button tippy-zulip-delayed-tooltip" intent="danger" aria-label=(t "Remove") data-tippy-content=(t "Remove") }}
|
||||
{{else}}
|
||||
{{> ../components/icon_button icon="close" custom_classes="hidden-remove-button remove-subscriber-button tippy-zulip-delayed-tooltip" intent="danger" aria-label=(t "Unsubscribe") data-tippy-content=(t "Unsubscribe") }}
|
||||
{{/if}}
|
||||
</td>
|
||||
{{/if}}
|
||||
</tr>
|
||||
39
web/templates/stream_settings/stream_members.hbs
Normal file
39
web/templates/stream_settings/stream_members.hbs
Normal file
@@ -0,0 +1,39 @@
|
||||
<div class="subscriber_list_settings_container no-display">
|
||||
<div class="subsection-header add-subscribers-heading">
|
||||
<h3 class="settings-subsection-title">
|
||||
{{t "Add subscribers" }}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="stream_subscription_request_result banner-wrapper"></div>
|
||||
{{> add_subscribers_form .}}
|
||||
<div class="add-subscribers-subtitle">
|
||||
{{#tr}}
|
||||
Enter a <z-user-roles-link>user role</z-user-roles-link>,
|
||||
<z-user-groups-link>user group</z-user-groups-link>,
|
||||
or <z-channel-link>#channel</z-channel-link> to add multiple users at once.
|
||||
{{#*inline "z-user-roles-link"}}<a href="/help/user-roles" target="_blank" rel="noopener noreferrer">{{> @partial-block}}</a>{{/inline}}
|
||||
{{#*inline "z-user-groups-link"}}<a href="/help/user-groups" target="_blank" rel="noopener noreferrer">{{> @partial-block}}</a>{{/inline}}
|
||||
{{#*inline "z-channel-link"}}<a href="/help/introduction-to-channels" target="_blank" rel="noopener noreferrer">{{> @partial-block}}</a>{{/inline}}
|
||||
{{/tr}}
|
||||
</div>
|
||||
<div class="subsection-parent send_notification_to_new_subscribers_container">
|
||||
{{> ./../settings/settings_checkbox
|
||||
setting_name="send_notification_to_new_subscribers"
|
||||
is_checked=true
|
||||
label=(t "Send notification message to newly subscribed users")
|
||||
}}
|
||||
</div>
|
||||
<div class="settings_panel_list_header">
|
||||
<div class="subscribers-heading">
|
||||
<h3 class="settings-table-title">{{t "Subscribers"}}</h3>
|
||||
<div class="add-subscriber-loading-spinner"></div>
|
||||
</div>
|
||||
<div class="user_filters">
|
||||
{{> ../settings/filter_text_input placeholder=(t 'Filter') aria_label=(t 'Filter subscribers') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="subscriber-list-box">
|
||||
{{> stream_members_table .}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="subscriber-list-settings-loading"></div>
|
||||
19
web/templates/stream_settings/stream_members_table.hbs
Normal file
19
web/templates/stream_settings/stream_members_table.hbs
Normal file
@@ -0,0 +1,19 @@
|
||||
<div class="subscriber_list_container" data-simplebar data-simplebar-tab-index="-1">
|
||||
<div class="subscriber_list_loading_indicator"></div>
|
||||
<table id="stream_members_list" class="subscriber-list table table-striped">
|
||||
<thead class="table-sticky-headers">
|
||||
<tr>
|
||||
<th class="panel_user_list" data-sort="alphabetic" data-sort-prop="full_name">{{t "Name" }}
|
||||
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
|
||||
</th>
|
||||
<th class="settings-email-column" data-sort="email">{{t "Email" }}
|
||||
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
|
||||
</th>
|
||||
{{#if can_remove_subscribers}}
|
||||
<th class="remove-button-column"></th>
|
||||
{{/if}}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="subscriber_table" data-empty="{{t 'This channel has no subscribers.' }}" data-search-results-empty="{{t 'No channel subscribers match your current filter.'}}"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
18
web/templates/stream_settings/stream_privacy_icon.hbs
Normal file
18
web/templates/stream_settings/stream_privacy_icon.hbs
Normal file
@@ -0,0 +1,18 @@
|
||||
{{! This controls whether the swatch next to streams in the stream edit page has a lock icon. }}
|
||||
{{#if is_archived}}
|
||||
<div class="large-icon" {{#if title_icon_color}}style="color: {{title_icon_color}}"{{/if}}>
|
||||
<i class="zulip-icon zulip-icon-archive" aria-hidden="true"></i>
|
||||
</div>
|
||||
{{else if invite_only}}
|
||||
<div class="large-icon" {{#if title_icon_color}}style="color: {{title_icon_color}}"{{/if}}>
|
||||
<i class="zulip-icon zulip-icon-lock" aria-hidden="true"></i>
|
||||
</div>
|
||||
{{else if is_web_public}}
|
||||
<div class="large-icon" {{#if title_icon_color}}style="color: {{title_icon_color}}"{{/if}}>
|
||||
<i class="zulip-icon zulip-icon-globe" aria-hidden="true"></i>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="large-icon" {{#if title_icon_color}}style="color: {{title_icon_color}}"{{/if}}>
|
||||
<i class="zulip-icon zulip-icon-hashtag" aria-hidden="true"></i>
|
||||
</div>
|
||||
{{/if}}
|
||||
159
web/templates/stream_settings/stream_settings.hbs
Normal file
159
web/templates/stream_settings/stream_settings.hbs
Normal file
@@ -0,0 +1,159 @@
|
||||
<div class="stream_settings_header" data-stream-id="{{sub.stream_id}}">
|
||||
<div class="tab-container"></div>
|
||||
</div>
|
||||
<div class="subscription_settings" data-stream-id="{{sub.stream_id}}">
|
||||
<div class="inner-box">
|
||||
<div class="small-window-alert-notification-container">
|
||||
<div class="stream_change_property_info alert-notification"></div>
|
||||
</div>
|
||||
<div class="stream-creation-confirmation-banner"></div>
|
||||
<div class="stream_section" data-stream-section="general">
|
||||
{{#with sub}}
|
||||
<div class="stream-settings-tip-container">
|
||||
{{> stream_settings_tip .}}
|
||||
</div>
|
||||
<div class="channel-description-box">
|
||||
<label class="settings-field-label {{#unless can_change_name_description}}cursor-text{{/unless}}"
|
||||
for="{{#if can_change_name_description}}open_stream_info_modal{{/if}}">
|
||||
{{t "Description" }}
|
||||
{{> ../help_link_widget link="/help/change-the-channel-description" }}
|
||||
</label>
|
||||
<div class="channel-description-field">
|
||||
<div class="stream-description">
|
||||
{{> stream_description
|
||||
rendered_description=rendered_description
|
||||
use_view_only_styling=true
|
||||
}}
|
||||
</div>
|
||||
{{> ../components/icon_button
|
||||
icon="edit"
|
||||
intent="neutral"
|
||||
custom_classes="tippy-zulip-delayed-tooltip"
|
||||
id="open_stream_info_modal"
|
||||
data-tippy-content=(t 'Edit channel name and description' )
|
||||
hidden=(not can_change_name_description)
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="creator_details stream_details_box">
|
||||
{{> ../creator_details .}}
|
||||
</div>
|
||||
{{/with}}
|
||||
|
||||
<div class="stream-settings-subsection settings-subsection-parent">
|
||||
<div class="subsection-header">
|
||||
<h3 class="settings-subsection-title">
|
||||
{{t "Settings" }}
|
||||
</h3>
|
||||
{{> ../settings/settings_save_discard_widget section_name="channel-general-settings" show_save_discard_buttons=true}}
|
||||
</div>
|
||||
|
||||
{{> channel_folder .
|
||||
is_stream_edit=true
|
||||
channel_folder_widget_name="folder_id"
|
||||
}}
|
||||
|
||||
<div class="default-push-notifications">
|
||||
{{> ../settings/settings_checkbox
|
||||
prefix="id_"
|
||||
setting_name="default_push_notifications"
|
||||
is_checked=(lookup sub "default_push_notifications")
|
||||
label=(t "Mobile push notifications enabled by default")
|
||||
tooltip_message=push_notifications_tooltip
|
||||
}}
|
||||
</div>
|
||||
|
||||
<div class="input-group stream-email-box">
|
||||
<label for="copy_stream_email_button" class="settings-field-label">
|
||||
{{t "Email address" }}
|
||||
{{> ../help_link_widget link="/help/message-a-channel-by-email" }}
|
||||
</label>
|
||||
{{> ../components/action_button
|
||||
label=(t "Generate email address")
|
||||
variant="subtle"
|
||||
intent="neutral"
|
||||
type="button"
|
||||
custom_classes="copy_email_button"
|
||||
id="copy_stream_email_button"
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="personal-stream-settings" class="stream_section" data-stream-section="personal">
|
||||
<div class="subsection-parent">
|
||||
<div class="subsection-header">
|
||||
<h3 class="settings-subsection-title">{{t "Personal settings" }}</h3>
|
||||
<div class="stream_change_property_status alert-notification"></div>
|
||||
</div>
|
||||
{{#each other_settings}}
|
||||
<div class="input-group">
|
||||
{{> stream_settings_checkbox
|
||||
setting_name=name
|
||||
is_checked=is_checked
|
||||
is_muted=(lookup ../sub "is_muted")
|
||||
stream_id=(lookup ../sub "stream_id")
|
||||
notification_setting=false
|
||||
disabled_realm_setting=disabled_realm_setting
|
||||
is_disabled=is_disabled
|
||||
label=label}}
|
||||
</div>
|
||||
{{/each}}
|
||||
<div class="input-group">
|
||||
<label class="settings-field-label channel-color-label">{{t "Channel color" }}</label>
|
||||
<button class="action-button action-button-subtle-neutral stream-settings-color-selector choose_stream_color" data-stream-id="{{ sub.stream_id }}">
|
||||
<span class="stream-settings-color-preview" style="background: {{sub.color}};"></span>
|
||||
<span class="stream-settings-color-selector-label">{{t "Change color"}}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="subsection-parent">
|
||||
<div class="subsection-header">
|
||||
<h3 class="settings-subsection-title">{{t "Notification settings" }}</h3>
|
||||
<div class="stream_change_property_status alert-notification"></div>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
{{> ../components/action_button
|
||||
label=(t "Reset to default notifications")
|
||||
variant="subtle"
|
||||
intent="neutral"
|
||||
custom_classes="reset-stream-notifications-button"
|
||||
type="button"
|
||||
}}
|
||||
</div>
|
||||
{{#each notification_settings}}
|
||||
<div class="input-group">
|
||||
{{> stream_settings_checkbox
|
||||
setting_name=name
|
||||
is_checked=is_checked
|
||||
stream_id=(lookup ../sub "stream_id")
|
||||
notification_setting=true
|
||||
disabled_realm_setting=disabled_realm_setting
|
||||
is_disabled=is_disabled
|
||||
label=label}}
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stream_section" data-stream-section="subscribers">
|
||||
{{#with sub}}
|
||||
<div class="edit_subscribers_for_stream">
|
||||
{{> stream_members .}}
|
||||
</div>
|
||||
{{/with}}
|
||||
</div>
|
||||
|
||||
<div class="stream_section channel-permissions" data-stream-section="permissions">
|
||||
<div class="stream-settings-tip-container">
|
||||
{{> stream_settings_tip
|
||||
can_change_stream_permissions_requiring_metadata_access=sub.can_change_stream_permissions_requiring_metadata_access }}
|
||||
</div>
|
||||
{{> channel_permissions .
|
||||
prefix="id_"
|
||||
is_stream_edit=true
|
||||
history_public_to_subscribers=sub.history_public_to_subscribers
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
23
web/templates/stream_settings/stream_settings_checkbox.hbs
Normal file
23
web/templates/stream_settings/stream_settings_checkbox.hbs
Normal file
@@ -0,0 +1,23 @@
|
||||
{{!-- If setting is disabled on realm level, then render setting as control-label-disabled and do not set setting value. Setting status should not change on any click handler, as it is disabled at realm level. --}}
|
||||
<div class="sub_setting_checkbox">
|
||||
<div id="sub_{{setting_name}}_setting" class="{{#if disabled_realm_setting}}control-label-disabled
|
||||
{{else if notification_setting}}sub_notification_setting{{/if}}">
|
||||
<span {{#if (and disabled_realm_setting (eq setting_name "push_notifications"))}}class="tippy-zulip-tooltip" data-tooltip-template-id="mobile-push-notification-tooltip-template"{{/if}}>
|
||||
<label class="checkbox">
|
||||
<input id="{{setting_name}}_{{stream_id}}" name="{{setting_name}}"
|
||||
class="sub_setting_control" type="checkbox"
|
||||
{{#if is_checked}}checked{{/if}}
|
||||
{{#if is_disabled}}disabled="disabled"{{/if}} />
|
||||
<span class="rendered-checkbox"></span>
|
||||
</label>
|
||||
<label class="inline" for="{{setting_name}}_{{stream_id}}">
|
||||
{{label}}
|
||||
</label>
|
||||
</span>
|
||||
</div>
|
||||
{{#if (eq setting_name "is_muted")}}
|
||||
{{> ../help_link_widget link="/help/mute-a-channel" }}
|
||||
{{else if (eq setting_name "push_notifications")}}
|
||||
{{> ../help_link_widget link="/help/mobile-notifications#enabling-push-notifications-for-self-hosted-servers" }}
|
||||
{{/if}}
|
||||
</div>
|
||||
101
web/templates/stream_settings/stream_settings_overlay.hbs
Normal file
101
web/templates/stream_settings/stream_settings_overlay.hbs
Normal file
@@ -0,0 +1,101 @@
|
||||
<div id="subscription_overlay" class="overlay two-pane-settings-overlay" data-overlay="subscriptions">
|
||||
<div class="flex overlay-content">
|
||||
<div class="two-pane-settings-container overlay-container">
|
||||
<div class="two-pane-settings-header">
|
||||
<div class="fa fa-chevron-left"></div>
|
||||
<span class="subscriptions-title">{{t 'Channels' }}</span>
|
||||
<div class="exit">
|
||||
<span class="exit-sign">×</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="two-pane-settings-content">
|
||||
<div class="left">
|
||||
<div class="two-pane-settings-subheader">
|
||||
<div class="list-toggler-container">
|
||||
<div id="add_new_subscription">
|
||||
{{#if can_create_streams}}
|
||||
<button class="create_stream_button two-pane-settings-plus-button tippy-zulip-delayed-tooltip" data-tooltip-template-id="create-new-stream-tooltip-template" data-tippy-placement="bottom">
|
||||
<i class="create_button_plus_sign zulip-icon zulip-icon-square-plus" aria-hidden="true"></i>
|
||||
</button>
|
||||
{{/if}}
|
||||
<div class="float-clear"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="two-pane-settings-body">
|
||||
<div class="input-append stream_name_search_section two-pane-settings-search" id="stream_filter">
|
||||
<div id="folder_filter_container">
|
||||
<button type="button" id="folder_filter_button" class="filter-folders-dropdown-widget-button icon-button icon-button-neutral" tabindex="0" aria-label="{{t 'Filter channels' }}">
|
||||
<i class="zulip-icon zulip-icon-folder-chevron" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
<input type="text" name="stream_name" id="search_stream_name" class="filter_text_input" autocomplete="off"
|
||||
placeholder="{{t 'Filter' }}" value=""/>
|
||||
<button type="button" class="clear_search_button" id="clear_search_stream_name">
|
||||
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
|
||||
</button>
|
||||
<div class="stream_settings_filter_container {{#unless realm_has_archived_channels}}hide_filter{{/unless}}">
|
||||
{{> ../dropdown_widget widget_name="stream_settings_filter"}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="no-streams-to-show">
|
||||
<div class="subscribed_streams_tab_empty_text">
|
||||
<span class="settings-empty-option-text">
|
||||
{{t 'You are not subscribed to any channels.'}}
|
||||
{{#if can_view_all_streams}}
|
||||
<a href="#channels/all">{{t 'View all channels'}}</a>
|
||||
{{/if}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="available_streams_tab_empty_text">
|
||||
<span class="settings-empty-option-text">
|
||||
{{t 'No channels to show.'}}
|
||||
<a href="#channels/all">{{t 'View all channels'}}</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="no_stream_match_filter_empty_text">
|
||||
<span class="settings-empty-option-text">
|
||||
{{t 'No channels match your filter.'}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="all_streams_tab_empty_text">
|
||||
<span class="settings-empty-option-text">
|
||||
{{t 'There are no channels you can view in this organization.'}}
|
||||
{{#if can_create_streams}}
|
||||
<a href="#channels/new">{{t 'Create a channel'}}</a>
|
||||
{{/if}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="streams-list two-pane-settings-left-simplebar-container" data-simplebar data-simplebar-tab-index="-1">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="two-pane-settings-subheader">
|
||||
<div class="display-type">
|
||||
<div id="stream_settings_title" class="stream-info-title">{{t 'Channel settings' }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="two-pane-settings-body">
|
||||
<div class="nothing-selected">
|
||||
<div class="stream-info-banner banner-wrapper"></div>
|
||||
<div class="create-stream-button-container">
|
||||
<button type="button" class="create_stream_button animated-purple-button" {{#unless can_create_streams}}disabled{{/unless}}>{{t 'Create channel' }}</button>
|
||||
{{#unless can_create_streams}}
|
||||
<span class="settings-empty-option-text">
|
||||
{{t 'You do not have permission to create channels.' }}
|
||||
</span>
|
||||
{{/unless}}
|
||||
</div>
|
||||
</div>
|
||||
<div id="stream_settings" class="two-pane-settings-right-simplebar-container settings" data-simplebar data-simplebar-tab-index="-1" data-simplebar-auto-hide="false">
|
||||
{{!-- edit stream here --}}
|
||||
</div>
|
||||
{{> stream_creation_form . }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
9
web/templates/stream_settings/stream_settings_tip.hbs
Normal file
9
web/templates/stream_settings/stream_settings_tip.hbs
Normal file
@@ -0,0 +1,9 @@
|
||||
{{#unless can_change_stream_permissions_requiring_metadata_access}}
|
||||
{{> ../components/banner
|
||||
label=(t "Only channel administrators can edit these settings.")
|
||||
intent="info"
|
||||
custom_classes="admin-permissions-banner"
|
||||
close_button=false
|
||||
process=false
|
||||
}}
|
||||
{{/unless}}
|
||||
@@ -0,0 +1 @@
|
||||
<i class="{{icon_class}}" data-tippy-content="{{tooltip}}"></i>
|
||||
@@ -0,0 +1,40 @@
|
||||
{{#if error_message}}
|
||||
{{error_message}}
|
||||
{{else}}
|
||||
{{!-- We want to show ignored deactivated users message even when there are
|
||||
no new subscribers --}}
|
||||
{{#if (and (eq subscribed_users_count 0) (eq ignored_deactivated_users_count 0))}}
|
||||
{{t "All users were already subscribed."}}
|
||||
{{else}}
|
||||
{{#if (not is_total_subscriber_more_than_five) }}
|
||||
{{#unless (eq subscribed_users_count 0)}}
|
||||
{{t "Subscribed:" }} {{> user_links users=subscribed_users}}.
|
||||
{{/unless}}
|
||||
{{#unless (eq already_subscribed_users_count 0)}}
|
||||
{{t "Already a subscriber:" }} {{> user_links users=already_subscribed_users}}.
|
||||
{{/unless}}
|
||||
{{#unless (eq ignored_deactivated_users_count 0)}}
|
||||
{{t "Ignored deactivated users:" }} {{> user_links users=ignored_deactivated_users}}.
|
||||
{{/unless}}
|
||||
{{else}}
|
||||
{{#unless (eq subscribed_users_count 0)}}
|
||||
{{t "{subscribed_users_count, plural,
|
||||
one {Subscribed: {subscribed_users_count} user.}
|
||||
other {Subscribed: {subscribed_users_count} users.}
|
||||
}"}}
|
||||
{{/unless}}
|
||||
{{#unless (eq already_subscribed_users_count 0)}}
|
||||
{{t "{already_subscribed_users_count, plural,
|
||||
one {Already subscribed: {already_subscribed_users_count} user.}
|
||||
other {Already subscribed: {already_subscribed_users_count} users.}
|
||||
}"}}
|
||||
{{/unless}}
|
||||
{{#unless (eq ignored_deactivated_users_count 0)}}
|
||||
{{t "{ignored_deactivated_users_count, plural,
|
||||
one {Ignored deactivated: {ignored_deactivated_users_count} user.}
|
||||
other {Ignored deactivated: {ignored_deactivated_users_count} users.}
|
||||
}"}}
|
||||
{{/unless}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
@@ -0,0 +1,4 @@
|
||||
{{#tr}}
|
||||
Allow posting to the <z-empty-string-topic-display-name></z-empty-string-topic-display-name> topic?
|
||||
{{#*inline "z-empty-string-topic-display-name"}}<span class="empty-topic-display">{{empty_string_topic_display_name}}</span>{{/inline}}
|
||||
{{/tr}}
|
||||
6
web/templates/stream_settings/subscriber_count.hbs
Normal file
6
web/templates/stream_settings/subscriber_count.hbs
Normal file
@@ -0,0 +1,6 @@
|
||||
<i class="fa fa-user-o" aria-hidden="true"></i>
|
||||
{{#if can_access_subscribers}}
|
||||
<span class="subscriber-count-text">{{numberFormat subscriber_count}}</span>
|
||||
{{else}}
|
||||
<i class="subscriber-count-lock fa fa-lock" aria-hidden="true"></i>
|
||||
{{/if}}
|
||||
13
web/templates/stream_settings/subscription_setting_icon.hbs
Normal file
13
web/templates/stream_settings/subscription_setting_icon.hbs
Normal file
@@ -0,0 +1,13 @@
|
||||
<div class="icon" style="background-color: {{color}}">
|
||||
<div class="flex">
|
||||
{{#if is_archived}}
|
||||
<i class="zulip-icon zulip-icon-archive fa-lg" aria-hidden="true"></i>
|
||||
{{else if invite_only}}
|
||||
<i class="zulip-icon zulip-icon-lock" aria-hidden="true"></i>
|
||||
{{else if is_web_public}}
|
||||
<i class="zulip-icon zulip-icon-globe fa-lg" aria-hidden="true"></i>
|
||||
{{else}}
|
||||
<span class="zulip-icon zulip-icon-hashtag"></span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,7 @@
|
||||
<div id="settings-topics-already-exist-error">
|
||||
{{#tr}}
|
||||
To enable this configuration, all messages in this channel must be in the <z-empty-string-topic-display-name></z-empty-string-topic-display-name> topic. Consider <z-link-rename>renaming</z-link-rename> other topics to <z-empty-string-topic-display-name></z-empty-string-topic-display-name>.
|
||||
{{#*inline "z-link-rename"}}<a target="_blank" rel="noopener noreferrer" href="/help/rename-a-topic">{{> @partial-block}}</a>{{/inline}}
|
||||
{{#*inline "z-empty-string-topic-display-name"}}<span class="empty-topic-display">{{empty_string_topic_display_name}}</span>{{/inline}}
|
||||
{{/tr}}
|
||||
</div>
|
||||
3
web/templates/stream_settings/user_links.hbs
Normal file
3
web/templates/stream_settings/user_links.hbs
Normal file
@@ -0,0 +1,3 @@
|
||||
{{#list_each users as |user| ~}}
|
||||
<a data-user-id="{{user.user_id}}" class="view_user_profile">{{user.full_name}}</a>
|
||||
{{~/list_each}}
|
||||
Reference in New Issue
Block a user