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_members_container add-button-container">
<div class="members-input-scrollable-container" data-simplebar>
<div class="pill-container person_picker">
<div class="input" contenteditable="true"
data-placeholder="{{t 'Add users or groups. Use #channelname to add all subscribers.' }}">
{{~! Squash whitespace so that placeholder is displayed when empty. ~}}
</div>
</div>
</div>
{{#if (not hide_add_button)}}
<div class="add_member_button_wrapper add-users-button-wrapper inline-block">
{{> ../components/action_button
label=(t "Add")
custom_classes="add-member-button add-users-button"
id="add_member"
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,89 @@
<div class="group-row {{#if deactivated}}deactivated-group{{/if}} {{#if is_system_group}}system-group{{/if}}" data-group-id="{{id}}" data-group-name="{{name}}">
{{#unless is_system_group}}
{{#if is_member}}
<div class="check checked join_leave_button {{#unless can_leave}}disabled{{/unless}} {{#unless is_direct_member}}not-direct-member{{/unless}}">
<div class="tippy-zulip-tooltip" data-tooltip-template-id="{{#if can_leave}}{{#if is_direct_member}}leave-{{id}}-group-tooltip-template{{else}}cannot-leave-{{id}}-because-of-subgroup-tooltip-template{{/if}}{{else}}cannot-leave-{{id}}-group-tooltip-template{{/if}}">
<template id="leave-{{id}}-group-tooltip-template">
<span>
{{#tr}}
Leave group {name}
{{/tr}}
</span>
</template>
<template id="cannot-leave-{{id}}-because-of-subgroup-tooltip-template">
<span>
{{#tr}}
You are a member of this group because you are a member of a subgroup (<z-highlight>{associated_subgroup_names}</z-highlight>).
{{#*inline "z-highlight"}}<b class="highlighted-element">{{> @partial-block}}</b>{{/inline}}
{{/tr}}
</span>
</template>
<template id="cannot-leave-{{id}}-group-tooltip-template">
{{#if deactivated}}
<span>
{{#tr}}
You cannot leave a deactivated user group.
{{/tr}}
</span>
{{else}}
<span>
{{#tr}}
You do not have permission to leave this group.
{{/tr}}
</span>
{{/if}}
</template>
<i class="zulip-icon zulip-icon-subscriber-check sub-unsub-icon"></i>
</div>
<div class='join_leave_status'></div>
</div>
{{else}}
<div class="check join_leave_button {{#unless can_join}}disabled{{/unless}}">
<div class="tippy-zulip-tooltip" data-tooltip-template-id="{{#if can_join}}join-{{id}}-group-tooltip-template{{else}}cannot-join-{{id}}-group-tooltip-template{{/if}}">
<template id="join-{{id}}-group-tooltip-template">
<span>
{{#tr}}
Join group {name}
{{/tr}}
</span>
</template>
<template id="cannot-join-{{id}}-group-tooltip-template">
{{#if deactivated}}
<span>
{{#tr}}
You cannot join a deactivated user group.
{{/tr}}
</span>
{{else}}
<span>
{{#tr}}
You do not have permission to join this group.
{{/tr}}
</span>
{{/if}}
</template>
<i class="zulip-icon zulip-icon-subscriber-plus sub-unsub-icon"></i>
</div>
<div class='join_leave_status'></div>
</div>
{{/if}}
{{/unless}}
<div class="group-info-box">
<div class="top-bar">
<div class="group-name-wrapper">
<div class="group-name">{{name}}</div>
{{#if deactivated}}
<i class="fa fa-ban deactivated-user-icon"></i>
{{/if}}
</div>
</div>
<div class="bottom-bar">
<div class="description rendered_markdown" data-no-description="{{t 'No description.'}}">{{description}}</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,22 @@
<div class="cannot-deactivate-group-banner main-view-banner error">
<p class="banner-text">
{{#if group_used_for_permissions}}
{{t "To deactivate this group, you must first remove all permissions assigned to it."}}
{{else}}
{{#tr}}
To deactivate this group, you must first remove it from all other groups. This group is currently a subgroup of: <z-supergroup-names></z-supergroup-names>.
{{#*inline "z-supergroup-names"}}
{{#each supergroups}}
<a class="view-group-members" data-group-id="{{group_id}}" href="{{settings_url}}">{{group_name}}</a>
{{~#unless @last}}, {{/unless~}}
{{/each}}
{{/inline}}
{{/tr}}
{{/if}}
</p>
{{#if group_used_for_permissions}}
<button class="permissions-button main-view-banner-action-button">
{{t "View permissions"}}
</button>
{{/if}}
</div>

View File

@@ -0,0 +1,17 @@
<div class="user-group-info-modal-fields">
<div>
<label for="change_user_group_name" class="modal-field-label">
{{t 'User group name' }}
</label>
<input type="text" id="change_user_group_name" class="modal_text_input" name="user_group_name" value="{{ group_name }}" maxlength="{{max_user_group_name_length}}" />
</div>
{{#if allow_editing_description}}
<div>
<label for="change_user_group_description" class="modal-field-label">
{{t 'User group description' }}
</label>
<textarea id="change_user_group_description" class="modal-textarea" name="user_group_description">{{ group_description }}</textarea>
</div>
{{/if}}
</div>

View File

@@ -0,0 +1,53 @@
<div class="group-permissions">
<div class="realm-group-permissions group-permissions-section {{#if group_has_no_realm_permissions}}hide{{/if}}">
<h3>{{t "Organization permissions"}}</h3>
{{#each group_assigned_realm_permissions}}
<div class="settings-subsection-parent {{subsection_key}} {{#if (eq assigned_permissions.length 0)}}hide{{/if}}">
<div class="subsection-header">
<h3 class="settings-subsection-title">{{subsection_heading}}</h3>
{{> ../settings/settings_save_discard_widget show_save_discard_buttons=true }}
</div>
<div class="subsection-settings">
{{#each assigned_permissions}}
{{> ../settings/settings_checkbox
setting_name=setting_name
prefix="id_group_permission_"
is_checked=true
label=(lookup ../../all_group_setting_labels.realm setting_name)
is_disabled=(not can_edit)
tooltip_message=tooltip_message}}
{{/each}}
</div>
</div>
{{/each}}
</div>
<div class="channel-group-permissions group-permissions-section {{#if (eq group_assigned_stream_permissions.length 0)}}hide{{/if}}">
<h3>{{t "Channel permissions"}}</h3>
{{#each group_assigned_stream_permissions}}
{{> stream_group_permission_settings
stream=stream
assigned_permissions=assigned_permissions
setting_labels=../all_group_setting_labels.stream
id_prefix=id_prefix
}}
{{/each}}
</div>
<div class="user-group-permissions group-permissions-section {{#if (eq group_assigned_user_group_permissions.length 0)}}hide{{/if}}">
<h3>{{t "User group permissions"}}</h3>
{{#each group_assigned_user_group_permissions}}
{{> user_group_permission_settings
group_id=group_id
group_name=group_name
assigned_permissions=assigned_permissions
setting_labels=../all_group_setting_labels.group
id_prefix=id_prefix
}}
{{/each}}
</div>
</div>

View File

@@ -0,0 +1,29 @@
{{> ../settings/group_setting_value_pill_input
setting_name="can_manage_group"
label=group_setting_labels.can_manage_group
prefix=prefix }}
{{> ../settings/group_setting_value_pill_input
setting_name="can_mention_group"
label=group_setting_labels.can_mention_group
prefix=prefix }}
{{> ../settings/group_setting_value_pill_input
setting_name="can_add_members_group"
label=group_setting_labels.can_add_members_group
prefix=prefix }}
{{> ../settings/group_setting_value_pill_input
setting_name="can_remove_members_group"
label=group_setting_labels.can_remove_members_group
prefix=prefix }}
{{> ../settings/group_setting_value_pill_input
setting_name="can_join_group"
label=group_setting_labels.can_join_group
prefix=prefix }}
{{> ../settings/group_setting_value_pill_input
setting_name="can_leave_group"
label=group_setting_labels.can_leave_group
prefix=prefix }}

View File

@@ -0,0 +1,7 @@
{{#list_each members as |member| ~}}
{{~#if (eq member.type "user") ~}}
<a data-user-id="{{member.user.user_id}}" class="view_user_profile">{{member.user.full_name}}</a>
{{~else if (eq member.type "user_group") ~}}
<a data-user-group-id="{{member.id}}" class="view_user_group">{{member.name}}</a>
{{~/if ~}}
{{~/list_each}}

View File

@@ -0,0 +1,13 @@
<tr class="user-group-subgroup-row" data-group-id="{{group_id}}">
<td class="panel_user_list">
{{> ../user_group_display_only_pill . strikethrough=soft_removed}}
</td>
<td class="empty-email-col-for-user-group"></td>
<td class="action-column">
{{#if soft_removed}}
{{> ../components/action_button custom_classes="undo_soft_removed_potential_subgroup" label=(t "Add") variant="subtle" intent="neutral" aria-label=(t "Add") }}
{{else}}
{{> ../components/action_button custom_classes="remove_potential_subgroup" label=(t "Remove") variant="subtle" intent="neutral" aria-label=(t "Remove") }}
{{/if}}
</td>
</tr>

View File

@@ -0,0 +1,41 @@
{{> add_members_form hide_add_button=true}}
<div class="add-members-subtitle">
{{#tr}}
You can add members by name or email address.
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 create_user_group_member_list_header">
<h3 class="settings-table-title">{{t 'Members preview' }}</h3>
<div class="user_filters">
{{> ../settings/filter_text_input placeholder=(t 'Filter') aria_label=(t 'Filter members') }}
</div>
</div>
<div class="add-group-member-loading-spinner"></div>
<div class="member-list-box">
<div class="member_list_container" data-simplebar data-simplebar-tab-index="-1">
<table class="member-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_user_group_members" class="member_table" data-empty="{{t 'This group has no members.' }}" data-search-results-empty="{{t 'No group members match your current filter.'}}"></tbody>
</table>
</div>
</div>

View File

@@ -0,0 +1,2 @@
<span class="user-group-info-title-text">{{t 'User group settings' }}</span>
{{> ../help_link_widget link="/help/user-groups" }}

View File

@@ -0,0 +1,31 @@
<div class="selected-group-title">
<span class="selected-group">
<span class="large-icon">
<i class="zulip-icon zulip-icon-deactivated-circle deactivated-user-group-icon" aria-hidden="true"></i>
</span>
<span class="selected-group-name" data-tippy-content="{{group_name}}">{{group_name}}</span>
</span>
{{#unless is_system_group}}
<div class="button-group selected-group-buttons" data-group-id="{{group_id}}">
<div class="left-end button-group">
{{> ../components/icon_button icon="edit" intent="neutral" custom_classes="open-group-info-button tippy-zulip-delayed-tooltip"
data-tippy-content=(t 'Change group info') id="group_title_open_group_info_modal" }}
</div>
<div class="right-end button-group">
<div class="join_leave_button_wrapper inline-block">
{{#if is_direct_member}}
{{> ../components/action_button label=(t "Leave group") custom_classes="join_leave_button" type="button"
variant="subtle" intent="neutral" }}
{{else}}
{{> ../components/action_button label=(t "Join group") custom_classes="join_leave_button" type="button"
variant="subtle" intent="brand" }}
{{/if}}
</div>
{{> ../components/icon_button icon="user-group-x" intent="danger" custom_classes="deactivate-group-button deactivate tippy-zulip-delayed-tooltip"
data-tippy-content=(t 'Deactivate group') }}
{{> ../components/icon_button icon="user-group-plus" intent="success" custom_classes="reactivate-group-button reactivate tippy-zulip-delayed-tooltip"
data-tippy-content=(t 'Reactivate group') }}
</div>
</div>
{{/unless}}
</div>

View File

@@ -0,0 +1,21 @@
<div class="settings-subsection-parent" data-stream-id="{{stream.stream_id}}">
<div class="subsection-header">
<h3 class="settings-subsection-title">
{{> ../decorated_channel_name stream=stream }}
</h3>
{{> ../settings/settings_save_discard_widget show_save_discard_buttons=true }}
</div>
<div class="subsection-settings">
{{#each assigned_permissions}}
{{> ../settings/settings_checkbox
setting_name=setting_name
prefix=../id_prefix
is_checked=true
label=(lookup ../setting_labels setting_name)
is_disabled=(not can_edit)
tooltip_message=tooltip_message
}}
{{/each}}
</div>
</div>

View File

@@ -0,0 +1,83 @@
<div class="hide two-pane-settings-right-simplebar-container" id="user-group-creation" tabindex="-1" role="dialog"
aria-label="{{t 'User group creation' }}">
<form id="user_group_creation_form">
<div class="two-pane-settings-creation-simplebar-container" data-simplebar data-simplebar-tab-index="-1">
<div class="alert user_group_create_info"></div>
<div id="user_group_creating_indicator"></div>
<div class="user-group-creation-body">
<div class="configure_user_group_settings user_group_creation">
<section id="user-group-name-container">
<label for="create_user_group_name" class="settings-field-label">
{{t "User group name" }}
</label>
<input type="text" name="user_group_name" id="create_user_group_name" class="settings_text_input"
placeholder="{{t 'User group name' }}" value="" autocomplete="off" maxlength="{{ max_user_group_name_length }}"/>
<div id="user_group_name_error" class="user_group_creation_error"></div>
<a id="deactivated_group_rename"></a>
</section>
<section id="user-group-description-container">
<label for="create_user_group_description" class="settings-field-label">
{{t "User group description" }}
</label>
<input type="text" name="user_group_description" id="create_user_group_description" class="settings_text_input"
placeholder="{{t 'User group description' }}" value="" autocomplete="off" />
</section>
<section id="user-group-permission-container">
<div class="group-permissions settings-subsection-parent" id="new_group_permission_settings">
<div class="subsection-header">
<h3 class="settings-subsection-title">{{t "Group permissions" }}
</h3>
</div>
{{> group_permissions prefix="id_new_group_" group_setting_labels=all_group_setting_labels.group}}
</div>
</section>
</div>
<div class="user_group_members_container user_group_creation">
<section id="choose_member_section">
<div class="subsection-header">
<h3 class="settings-subsection-title">
<label for="people_to_add_in_group">{{t "Choose members" }}</label>
</h3>
</div>
<div id="user_group_membership_error" class="user_group_creation_error"></div>
<div class="controls" id="people_to_add_in_group"></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"
variant="subtle"
intent="brand"
id="user_group_go_to_configure_settings"
}}
</div>
<div class="settings-sticky-footer-right">
{{> ../components/action_button
label=(t "Cancel")
custom_classes="create_user_group_cancel inline-block"
variant="subtle"
intent="neutral"
}}
{{> ../components/action_button
label=(t "Create")
custom_classes="finalize_create_user_group hide"
variant="subtle"
intent="brand"
type="submit"
}}
{{> ../components/action_button
label=(t "Continue to add members")
id="user_group_go_to_members"
custom_classes="inline-block"
variant="subtle"
intent="brand"
}}
</div>
</div>
</form>
</div>

View File

@@ -0,0 +1,9 @@
{{#if rendered_description}}
<div class="group-description settings-view-only-textarea">
{{rendered_description}}
</div>
{{else}}
<span class="no-description">
{{t "No description." }}
</span>
{{/if}}

View File

@@ -0,0 +1,35 @@
<div class="member_list_settings_container">
<div class="membership-status">
{{> user_group_membership_status .}}
</div>
{{#unless group.is_system_group}}
<div class="subsection-header">
<h3 class="settings-subsection-title">
{{t "Add members" }}
</h3>
</div>
<div class="user_group_subscription_request_result banner-wrapper"></div>
{{> add_members_form .}}
<div class="add-members-subtitle">
{{#tr}}
You can add members by name or email address.
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>
{{/unless}}
<div class="settings_panel_list_header members-list-header">
<h3 class="settings-table-title">{{t "Members"}}</h3>
<div class="user_filters">
{{> ../settings/filter_text_input placeholder=(t 'Filter') aria_label=(t 'Filter members') }}
</div>
</div>
<div class="add-group-member-loading-spinner"></div>
<div class="member-list-box">
{{> user_group_members_table .}}
</div>
</div>

View File

@@ -0,0 +1,19 @@
<div class="member_list_container" data-simplebar data-simplebar-tab-index="-1">
<div class="member_list_loading_indicator"></div>
<table class="member-list table table-striped">
<thead class="table-sticky-headers">
<tr>
<th class="panel_user_list" data-sort="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_members}}
<th class="remove-button-column"></th>
{{/if}}
</tr>
</thead>
<tbody class="member_table" data-empty="{{t 'This group has no members.' }}" data-search-results-empty="{{t 'No group members match your current filter.'}}"></tbody>
</table>
</div>

View File

@@ -0,0 +1,59 @@
{{#if error_message}}
{{error_message}}
{{else}}
{{#if (and (eq newly_added_member_count 0) (eq ignored_deactivated_member_count 0))}}
{{#unless (or (eq already_added_user_count 0) (eq already_added_subgroups_count 0))}}
{{t "All users and groups were already members."}}
{{else unless (eq already_added_user_count 0)}}
{{t "All users were already members."}}
{{else}}
{{t "All groups were already members."}}
{{/unless}}
{{else}}
{{#if (not total_member_count_exceeds_five)}}
{{#unless (eq newly_added_member_count 0)}}
{{t "Added:" }} {{> member_links members=additions.newly_added_members}}.&nbsp;
{{/unless}}
{{#unless (eq already_added_member_count 0)}}
{{t "Already a member:"}} {{> member_links members=additions.already_added_members}}.
{{/unless}}
{{#unless (eq ignored_deactivated_users_count 0)}}
{{t "Ignored deactivated users:"}} {{> member_links members=additions.ignored_deactivated_users}}.
{{/unless}}
{{#unless (eq ignored_deactivated_groups_count 0)}}
{{t "Ignored deactivated groups:"}} {{> member_links members=additions.ignored_deactivated_groups}}.
{{/unless}}
{{else}}
{{#unless (eq newly_added_member_count 0)}}
{{t "Added:"}}
{{#unless (or (eq newly_added_user_count 0) (eq newly_added_subgroups_count 0))}}
{{t "{newly_added_user_count, plural, one {# user} other {# users}} and {newly_added_subgroups_count, plural, one {# group.} other {# groups.}}"}}
{{else unless (eq newly_added_user_count 0)}}
{{t "{newly_added_user_count, plural, one {# user.} other {# users.}}"}}
{{else unless (eq newly_added_subgroups_count 0)}}
{{t "{newly_added_subgroups_count, plural, one {# group.} other {# groups.}}"}}
{{/unless}}
{{/unless}}
{{#unless (eq already_added_member_count 0)}}
{{t "Already a member:"}}
{{#unless (or (eq already_added_user_count 0) (eq already_added_subgroups_count 0))}}
{{t "{already_added_user_count, plural, one {# user} other {# users}} and {already_added_subgroups_count, plural, one {# group.} other {# groups.}}"}}
{{else unless (eq already_added_user_count 0)}}
{{t "{already_added_user_count, plural, one {# user.} other {# users.}}"}}
{{else unless (eq already_added_subgroups_count 0)}}
{{t "{already_added_subgroups_count, plural, one {# group.} other {# groups.}}"}}
{{/unless}}
{{/unless}}
{{#unless (eq ignored_deactivated_member_count 0)}}
{{t "Ignored deactivated:"}}
{{#unless (or (eq ignored_deactivated_users_count 0) (eq ignored_deactivated_groups_count 0))}}
{{t "{ignored_deactivated_users_count, plural, one {# user} other {# users}} and {ignored_deactivated_groups_count, plural, one {# group.} other {# groups.}}"}}
{{else unless (eq ignored_deactivated_users_count 0)}}
{{t "{ignored_deactivated_users_count, plural, one {# user.} other {# users.}}"}}
{{else unless (eq ignored_deactivated_groups_count 0)}}
{{t "{ignored_deactivated_groups_count, plural, one {# group.} other {# groups.}}"}}
{{/unless}}
{{/unless}}
{{/if}}
{{/if}}
{{/if}}

View File

@@ -0,0 +1,33 @@
{{#if is_direct_member}}
{{#if group.is_system_group}}
{{t "You have this role."}}
{{else}}
{{t "You are a member of this group."}}
{{/if}}
{{else if (not is_member)}}
{{#if group.is_system_group}}
{{t "You do not have this role."}}
{{else}}
{{t "You are not a member of this group."}}
{{/if}}
{{else}}
{{#if group.is_system_group}}
{{#tr}}
You have this role because you have a higher role (<z-subgroup-names></z-subgroup-names>).
{{#*inline "z-subgroup-names" ~}}
{{~#list_each associated_subgroup_names type="unit" as |name| ~}}
<b class="highlighted-element">{{name}}</b>
{{~/list_each ~}}
{{~/inline}}
{{/tr}}
{{else}}
{{#tr}}
You are a member of this group because you are a member of a subgroup (<z-subgroup-names></z-subgroup-names>).
{{#*inline "z-subgroup-names" ~}}
{{~#list_each associated_subgroup_names type="unit" as |name| ~}}
<b class="highlighted-element">{{name}}</b>
{{~/list_each ~}}
{{~/inline}}
{{/tr}}
{{/if}}
{{/if}}

View File

@@ -0,0 +1,19 @@
<div class="settings-subsection-parent" data-group-id="{{group_id}}">
<div class="subsection-header">
<h3 class="settings-subsection-title">{{group_name}}</h3>
{{> ../settings/settings_save_discard_widget show_save_discard_buttons=true }}
</div>
<div class="subsection-settings">
{{#each assigned_permissions}}
{{> ../settings/settings_checkbox
setting_name=setting_name
prefix=../id_prefix
is_checked=true
label=(lookup ../setting_labels setting_name)
is_disabled=(not can_edit)
tooltip_message=tooltip_message
}}
{{/each}}
</div>
</div>

View File

@@ -0,0 +1,61 @@
<div class="group_settings_header">
<div class="tab-container"></div>
</div>
<div class="user_group_settings_wrapper" data-group-id="{{group.id}}">
<div class="inner-box">
<div class="group_general_settings group_setting_section" data-group-section="general">
<div class="group-reactivation-error-banner"></div>
<div class="group-banner"></div>
<label class="group-setting-label" for="open_group_info_modal">
{{t "Description" }}
</label>
<div class="group-description-field">
<div class="user-group-description">
{{> ../user_group_settings/user_group_description
rendered_description=group.description }}
</div>
{{#unless group.is_system_group}}
{{> ../components/icon_button icon="edit" intent="neutral" custom_classes="open-group-info-button tippy-zulip-delayed-tooltip"
data-tippy-content=(t 'Change group info') id="open_group_info_modal" }}
{{/unless}}
</div>
<div class="creator_details group_detail_box">
{{> ../creator_details .
group_id=group.id }}
</div>
{{#unless group.is_system_group}}
<div class="group-permissions settings-subsection-parent" id="group_permission_settings">
<div class="subsection-header">
<h3 class="settings-subsection-title">
{{t "Group permissions" }}
{{> ../help_link_widget link="/help/manage-user-groups#configure-group-permissions"}}
</h3>
{{> ../settings/settings_save_discard_widget section_name="group-permissions" show_save_discard_buttons=true }}
</div>
{{> group_permissions prefix="id_" group_setting_labels=all_group_setting_labels.group}}
</div>
{{/unless}}
</div>
<div class="group_member_settings group_setting_section" data-group-section="members">
<div class="edit_members_for_user_group">
{{> user_group_members .}}
</div>
</div>
<div class="group_setting_section" data-group-section="permissions">
<div class="group-assigned-permissions">
<span class="no-permissions-for-group-text {{#unless group_has_no_permissions}}hide{{/unless}}">
{{#if group.is_system_group}}
{{t 'This role has no assigned permissions.'}}
{{else}}
{{t 'This group has no assigned permissions.'}}
{{/if}}
</span>
{{> group_permission_settings .}}
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,11 @@
<div class="no-groups-to-show-message">
<span class="settings-empty-option-text">
{{empty_user_group_list_message}}
{{#if show_view_all_groups_button}}
{{> ../components/action_button label=(t "View all groups") custom_classes="view-all-groups-button" type="button" variant="subtle" intent="neutral" }}
{{/if}}
{{#if show_create_user_group_button}}
{{> ../components/action_button label=(t "Create user group") custom_classes="create-user-group-button" type="button" variant="subtle" intent="brand" }}
{{/if}}
</span>
</div>

View File

@@ -0,0 +1,68 @@
<div id="groups_overlay" class="two-pane-settings-overlay overlay" data-overlay="group_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="user-groups-title">{{t 'User groups' }}</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_user_group">
<button class="create_user_group_button two-pane-settings-plus-button">
<i class="create_button_plus_sign zulip-icon zulip-icon-user-group-plus" aria-hidden="true"></i>
</button>
<div class="float-clear"></div>
</div>
</div>
</div>
<div class="two-pane-settings-body">
<div class="input-append group_name_search_section two-pane-settings-search" id="group_filter">
<input type="text" name="group_name" id="search_group_name" class="filter_text_input" autocomplete="off"
placeholder="{{t 'Filter' }}" value=""/>
<button type="button" class="clear_search_button" id="clear_search_group_name">
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
</button>
<span>
<label class="checkbox" id="user-group-edit-filter-options">
{{> ../dropdown_widget widget_name="user_group_visibility_settings"}}
</label>
</span>
</div>
<div class="no-groups-to-show">
</div>
<div class="user-groups-list-wrapper two-pane-settings-left-simplebar-container" data-simplebar data-simplebar-tab-index="-1">
<div class="user-groups-list"></div>
</div>
</div>
</div>
<div class="right">
<div class="two-pane-settings-subheader">
<div class="display-type">
<div id="user_group_settings_title" class="user-group-info-title"></div>
</div>
</div>
<div class="two-pane-settings-body">
<div class="nothing-selected">
<div class="create-group-button-container">
{{> ../settings/upgrade_tip_widget . }}
<button type="button" class="create_user_group_button animated-purple-button">{{t 'Create user group' }}</button>
<span class="settings-empty-option-text creation-permission-text">
{{t 'You do not have permission to create user groups.' }}
</span>
</div>
</div>
<div id="user_group_settings" class="two-pane-settings-right-simplebar-container settings" data-simplebar data-simplebar-tab-index="-1" data-simplebar-auto-hide="false">
{{!-- edit user group here --}}
</div>
{{> user_group_creation_form . }}
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,11 @@
<tr data-subgroup-id="{{group_id}}" class="hidden-remove-button-row">
<td class="subgroup-name panel_user_list">
{{> ../user_group_display_only_pill .}}
</td>
<td class="empty-email-col-for-user-group"></td>
{{#if can_remove_members}}
<td class="remove remove-button-wrapper remove-button-column">
{{> ../components/icon_button icon="close" custom_classes="hidden-remove-button remove-subgroup-button tippy-zulip-delayed-tooltip" intent="danger" aria-label=(t "Remove") data-tippy-content=(t "Remove") }}
</td>
{{/if}}
</tr>