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/user_group_settings/add_members_form.hbs
Normal file
28
web/templates/user_group_settings/add_members_form.hbs
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
29
web/templates/user_group_settings/group_permissions.hbs
Normal file
29
web/templates/user_group_settings/group_permissions.hbs
Normal 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 }}
|
||||
7
web/templates/user_group_settings/member_links.hbs
Normal file
7
web/templates/user_group_settings/member_links.hbs
Normal 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}}
|
||||
@@ -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>
|
||||
41
web/templates/user_group_settings/new_user_group_users.hbs
Normal file
41
web/templates/user_group_settings/new_user_group_users.hbs
Normal 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>
|
||||
@@ -0,0 +1,2 @@
|
||||
<span class="user-group-info-title-text">{{t 'User group settings' }}</span>
|
||||
{{> ../help_link_widget link="/help/user-groups" }}
|
||||
31
web/templates/user_group_settings/selected_group_title.hbs
Normal file
31
web/templates/user_group_settings/selected_group_title.hbs
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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}}
|
||||
35
web/templates/user_group_settings/user_group_members.hbs
Normal file
35
web/templates/user_group_settings/user_group_members.hbs
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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}}.
|
||||
{{/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}}
|
||||
@@ -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}}
|
||||
@@ -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>
|
||||
61
web/templates/user_group_settings/user_group_settings.hbs
Normal file
61
web/templates/user_group_settings/user_group_settings.hbs
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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">×</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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user