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

This commit is contained in:
upstream-mirror
2026-09-15 15:05:30 +05:00
commit 64898b2c79
8999 changed files with 1757358 additions and 0 deletions

View 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>

View 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>

View File

@@ -0,0 +1,3 @@
{{#each subscriptions}}
{{> browse_streams_list_item . }}
{{/each}}

View 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>

View 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>

View 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>

View File

@@ -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}}

View 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>

View 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>

View 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>

View File

@@ -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>

View 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}}

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@@ -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}}

View 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>

View 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}}

View 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>

View 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>

View 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>

View 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}}

View 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>

View 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>

View 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">&times;</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>

View 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}}

View File

@@ -0,0 +1 @@
<i class="{{icon_class}}" data-tippy-content="{{tooltip}}"></i>

View File

@@ -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}}

View File

@@ -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}}

View 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}}

View 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>

View File

@@ -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>

View 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}}