popover_menus_data: Hide actions user can't take for archived channels.

Hide actions users cannot perform for messages and topics within
archived channels.
This commit is contained in:
sanchi-t
2025-02-09 17:33:36 +05:30
committed by Tim Abbott
parent a2ef0c6185
commit 874e7bacf9
10 changed files with 65 additions and 31 deletions

View File

@@ -110,6 +110,7 @@ const stream_context_properties: (keyof StreamContext)[] = [
type TopicContext = {
is_topic: boolean;
stream_id: number;
stream_archived: boolean;
topic_name: string;
topic_display_name: string;
is_empty_string_topic: boolean;
@@ -128,6 +129,7 @@ type TopicContext = {
const topic_context_properties: (keyof TopicContext)[] = [
"is_topic",
"stream_id",
"stream_archived",
"topic_name",
"topic_display_name",
"is_empty_string_topic",
@@ -409,11 +411,18 @@ function update_stream_data(
): void {
const stream_topics_data = new Map<string, TopicContext>();
const stream_data = format_stream(stream_id);
const stream_archived = stream_data.is_archived;
let stream_post_filter_unread_count = 0;
for (const [topic, {topic_count, latest_msg_id}] of topic_dict) {
const topic_key = get_topic_key(stream_id, topic);
if (topic_count) {
const topic_data = format_topic(stream_id, topic, topic_count, latest_msg_id);
const topic_data = format_topic(
stream_id,
stream_archived,
topic,
topic_count,
latest_msg_id,
);
stream_topics_data.set(topic_key, topic_data);
if (!topic_data.is_hidden) {
stream_post_filter_unread_count += topic_data.unread_count;
@@ -441,6 +450,7 @@ function rerender_stream_inbox_header_if_needed(
function format_topic(
stream_id: number,
stream_archived: boolean,
topic: string,
topic_unread_count: number,
latest_msg_id: number,
@@ -448,6 +458,7 @@ function format_topic(
const context = {
is_topic: true,
stream_id,
stream_archived,
topic_name: topic,
topic_display_name: util.get_final_topic_display_name(topic),
is_empty_string_topic: topic === "",
@@ -1307,12 +1318,14 @@ export function update(): void {
const topic_keys_to_insert: string[] = [];
const new_stream_data = format_stream(stream_id);
const stream_archived = new_stream_data.is_archived;
for (const [topic, {topic_count, latest_msg_id}] of topic_dict) {
const topic_key = get_topic_key(stream_id, topic);
if (topic_count) {
const old_topic_data = stream_topics_data.get(topic_key);
const new_topic_data = format_topic(
stream_id,
stream_archived,
topic,
topic_count,
latest_msg_id,

View File

@@ -187,6 +187,10 @@ export function is_content_editable(message: Message, edit_limit_seconds_buffer
return false;
}
if (message.type === "stream" && stream_data.is_stream_archived(message.stream_id)) {
return false;
}
if (realm.realm_message_content_edit_limit_seconds === null) {
return true;
}

View File

@@ -51,6 +51,7 @@ type TopicPopoverContext = {
stream_name: string;
stream_id: number;
stream_muted: boolean;
stream_archived: boolean;
topic_display_name: string;
is_empty_string_topic: boolean;
topic_unmuted: boolean;
@@ -250,8 +251,10 @@ export function get_topic_popover_content_context({
const topic_unmuted = user_topics.is_topic_unmuted(sub.stream_id, topic_name);
const has_starred_messages = starred_messages.get_count_in_topic(sub.stream_id, topic_name) > 0;
const has_unread_messages = num_unread_for_topic(sub.stream_id, topic_name) > 0;
const can_move_topic = settings_data.user_can_move_messages_between_streams();
const can_rename_topic = settings_data.user_can_move_messages_to_another_topic();
const can_move_topic =
!sub.is_archived && settings_data.user_can_move_messages_between_streams();
const can_rename_topic =
!sub.is_archived && settings_data.user_can_move_messages_to_another_topic();
const visibility_policy = user_topics.get_topic_visibility_policy(sub.stream_id, topic_name);
const all_visibility_policies = user_topics.all_visibility_policies;
const is_spectator = page_params.is_spectator;
@@ -260,6 +263,7 @@ export function get_topic_popover_content_context({
stream_name: sub.name,
stream_id: sub.stream_id,
stream_muted: sub.is_muted,
stream_archived: sub.is_archived,
topic_display_name: util.get_final_topic_display_name(topic_name),
is_empty_string_topic: topic_name === "",
topic_unmuted,

View File

@@ -617,6 +617,7 @@ type ConversationContext = {
stream_url: string;
invite_only: boolean;
is_web_public: boolean;
is_archived: boolean;
topic: string;
topic_display_name: string;
is_empty_string_topic: boolean;
@@ -656,6 +657,7 @@ function format_conversation(conversation_data: ConversationData): ConversationC
const stream_url = hash_util.by_stream_url(stream_id);
const invite_only = stream_info.invite_only;
const is_web_public = stream_info.is_web_public;
const is_archived = stream_info.is_archived;
// Topic info
const topic = last_msg.topic;
const topic_display_name = util.get_final_topic_display_name(topic);
@@ -685,6 +687,7 @@ function format_conversation(conversation_data: ConversationData): ConversationC
stream_url,
invite_only,
is_web_public,
is_archived,
topic,
topic_display_name,
is_empty_string_topic,

View File

@@ -49,7 +49,7 @@
{{#unless is_direct}}
<div class="inbox-right-part-wrapper">
<div class="inbox-right-part">
{{#if is_topic}}
{{#if (and is_topic (not stream_archived))}}
<span class="visibility-policy-indicator change_visibility_policy hidden-for-spectators{{#if (eq visibility_policy all_visibility_policies.INHERIT)}} inbox-row-visibility-policy-inherit{{/if}}"
data-stream-id="{{stream_id}}" data-topic-name="{{topic_name}}" tabindex="0" data-col-index="{{ column_indexes.TOPIC_VISIBILITY }}">
{{#if (eq visibility_policy all_visibility_policies.FOLLOWED)}}

View File

@@ -67,6 +67,7 @@
{{/if}}
</a>
</li>
{{#unless stream.is_archived}}
<li role="none" class="link-item popover-menu-list-item hidden-for-spectators">
<a role="menuitem" class="popover_sub_unsub_button popover-menu-link" tabindex="0">
<i class="popover-menu-icon zulip-icon zulip-icon-circle-x" aria-hidden="true"></i>
@@ -80,5 +81,6 @@
<span class="popover-menu-label">{{t "Change color"}}</span>
</a>
</li>
{{/unless}}
</ul>
</div>

View File

@@ -5,30 +5,32 @@
</li>
{{!-- Group 1 --}}
{{#unless is_spectator}}
<li role="separator" class="popover-menu-separator"></li>
<li role="none" class="popover-menu-list-item">
<div role="group" class="tab-picker popover-menu-tab-group" aria-label="{{t 'Topic visibility' }}">
<input type="radio" id="sidebar-topic-muted-policy" class="tab-option" name="sidebar-topic-visibility-select" data-visibility-policy="{{all_visibility_policies.MUTED}}" {{#if (eq visibility_policy all_visibility_policies.MUTED)}}checked{{/if}} />
<label role="menuitemradio" class="tab-option-content tippy-zulip-delayed-tooltip" for="sidebar-topic-muted-policy" aria-label="{{t 'Mute' }}" data-tippy-content="{{t 'Mute' }}" tabindex="0">
<i class="zulip-icon zulip-icon-mute-new" aria-hidden="true"></i>
</label>
<input type="radio" id="sidebar-topic-inherit-policy" class="tab-option" name="sidebar-topic-visibility-select" data-visibility-policy="{{all_visibility_policies.INHERIT}}" {{#if (eq visibility_policy all_visibility_policies.INHERIT)}}checked{{/if}} />
<label role="menuitemradio" class="tab-option-content tippy-zulip-delayed-tooltip" for="sidebar-topic-inherit-policy" aria-label="{{t 'Default' }}" data-tippy-content="{{t 'Default' }}" tabindex="0">
<i class="zulip-icon zulip-icon-inherit" aria-hidden="true"></i>
</label>
{{#if (or stream_muted topic_unmuted)}}
<input type="radio" id="sidebar-topic-unmuted-policy" class="tab-option" name="sidebar-topic-visibility-select" data-visibility-policy="{{all_visibility_policies.UNMUTED}}" {{#if (eq visibility_policy all_visibility_policies.UNMUTED)}}checked{{/if}} />
<label role="menuitemradio" class="tab-option-content tippy-zulip-delayed-tooltip" for="sidebar-topic-unmuted-policy" aria-label="{{t 'Unmute' }}" data-tippy-content="{{t 'Unmute' }}" tabindex="0">
<i class="zulip-icon zulip-icon-unmute-new" aria-hidden="true"></i>
</label>
{{/if}}
<input type="radio" id="sidebar-topic-followed-policy" class="tab-option" name="sidebar-topic-visibility-select" data-visibility-policy="{{all_visibility_policies.FOLLOWED}}" {{#if (eq visibility_policy all_visibility_policies.FOLLOWED)}}checked{{/if}} />
<label role="menuitemradio" class="tab-option-content tippy-zulip-delayed-tooltip" for="sidebar-topic-followed-policy" aria-label="{{t 'Follow' }}" data-tippy-content="{{t 'Follow' }}" tabindex="0">
<i class="zulip-icon zulip-icon-follow" aria-hidden="true"></i>
</label>
<span class="slider"></span>
</div>
</li>
{{#unless stream_archived}}
<li role="separator" class="popover-menu-separator"></li>
<li role="none" class="popover-menu-list-item">
<div role="group" class="tab-picker popover-menu-tab-group" aria-label="{{t 'Topic visibility' }}">
<input type="radio" id="sidebar-topic-muted-policy" class="tab-option" name="sidebar-topic-visibility-select" data-visibility-policy="{{all_visibility_policies.MUTED}}" {{#if (eq visibility_policy all_visibility_policies.MUTED)}}checked{{/if}} />
<label role="menuitemradio" class="tab-option-content tippy-zulip-delayed-tooltip" for="sidebar-topic-muted-policy" aria-label="{{t 'Mute' }}" data-tippy-content="{{t 'Mute' }}" tabindex="0">
<i class="zulip-icon zulip-icon-mute-new" aria-hidden="true"></i>
</label>
<input type="radio" id="sidebar-topic-inherit-policy" class="tab-option" name="sidebar-topic-visibility-select" data-visibility-policy="{{all_visibility_policies.INHERIT}}" {{#if (eq visibility_policy all_visibility_policies.INHERIT)}}checked{{/if}} />
<label role="menuitemradio" class="tab-option-content tippy-zulip-delayed-tooltip" for="sidebar-topic-inherit-policy" aria-label="{{t 'Default' }}" data-tippy-content="{{t 'Default' }}" tabindex="0">
<i class="zulip-icon zulip-icon-inherit" aria-hidden="true"></i>
</label>
{{#if (or stream_muted topic_unmuted)}}
<input type="radio" id="sidebar-topic-unmuted-policy" class="tab-option" name="sidebar-topic-visibility-select" data-visibility-policy="{{all_visibility_policies.UNMUTED}}" {{#if (eq visibility_policy all_visibility_policies.UNMUTED)}}checked{{/if}} />
<label role="menuitemradio" class="tab-option-content tippy-zulip-delayed-tooltip" for="sidebar-topic-unmuted-policy" aria-label="{{t 'Unmute' }}" data-tippy-content="{{t 'Unmute' }}" tabindex="0">
<i class="zulip-icon zulip-icon-unmute-new" aria-hidden="true"></i>
</label>
{{/if}}
<input type="radio" id="sidebar-topic-followed-policy" class="tab-option" name="sidebar-topic-visibility-select" data-visibility-policy="{{all_visibility_policies.FOLLOWED}}" {{#if (eq visibility_policy all_visibility_policies.FOLLOWED)}}checked{{/if}} />
<label role="menuitemradio" class="tab-option-content tippy-zulip-delayed-tooltip" for="sidebar-topic-followed-policy" aria-label="{{t 'Follow' }}" data-tippy-content="{{t 'Follow' }}" tabindex="0">
<i class="zulip-icon zulip-icon-follow" aria-hidden="true"></i>
</label>
<span class="slider"></span>
</div>
</li>
{{/unless}}
{{/unless}}
{{#if is_topic_empty}}
<li role="separator" class="popover-menu-separator"></li>
@@ -77,7 +79,9 @@
</li>
{{!-- Group 3 --}}
{{#if (or can_move_topic can_rename_topic is_realm_admin)}}
<li role="separator" class="popover-menu-separator"></li>
{{#unless stream_archived}}
<li role="separator" class="popover-menu-separator"></li>
{{/unless}}
{{/if}}
{{#if can_move_topic}}
<li role="none" class="link-item popover-menu-list-item">
@@ -107,7 +111,7 @@
</a>
</li>
{{/if}}
{{#if is_realm_admin}}
{{#if (and is_realm_admin (not stream_archived))}}
<li role="none" class="link-item popover-menu-list-item">
<a role="menuitem" class="sidebar-popover-delete-topic-messages popover-menu-link" tabindex="0">
<i class="popover-menu-icon zulip-icon zulip-icon-trash" aria-hidden="true"></i>

View File

@@ -62,6 +62,7 @@
</div>
<div class="recent_topic_actions">
<div class="hidden-for-spectators">
{{#unless is_archived}}
<span class="recent_view_focusable change_visibility_policy hidden-for-spectators" data-stream-id="{{stream_id}}" data-topic-name="{{topic}}" data-col-index="{{ column_indexes.mute }}">
{{#if (eq visibility_policy all_visibility_policies.FOLLOWED)}}
<i class="zulip-icon zulip-icon-follow recipient_bar_icon visibility-status-icon" tabindex="0" aria-label="{{t 'Topic actions menu' }}" aria-haspopup="true" data-stream-id="{{stream_id}}" data-topic-name="{{topic}}" data-topic-url="{{topic_url}}" data-tippy-content="{{t 'You follow this topic.'}}" role="button"></i>
@@ -73,6 +74,7 @@
<i class="zulip-icon zulip-icon-more-vertical recent-view-row-topic-menu visibility-status-icon" tabindex="0" aria-label="{{t 'Topic actions menu' }}" aria-haspopup="true" data-stream-id="{{stream_id}}" data-topic-name="{{topic}}" data-topic-url="{{topic_url}}" role="button"></i>
{{/if}}
</span>
{{/unless}}
</div>
</div>
{{/if}}

View File

@@ -59,7 +59,7 @@
<div class="toggle_resolve_topic_spinner" style="display: none"></div>
{{/if}}
{{#if is_subscribed}}
{{#if (and is_subscribed (not is_archived))}}
<span class="change_visibility_policy recipient-bar-control hidden-for-spectators" data-stream-id="{{stream_id}}" data-topic-name="{{topic}}">
{{#if (eq visibility_policy all_visibility_policies.FOLLOWED)}}
<i class="zulip-icon zulip-icon-follow recipient_bar_icon" data-tippy-content="{{t 'You follow this topic.'}}"

View File

@@ -225,6 +225,7 @@ for (const stream_id of [stream1, stream2, stream3, stream4, stream6]) {
color: "",
invite_only: false,
is_web_public: true,
is_archived: false,
subscribed: true,
});
}
@@ -415,6 +416,7 @@ function generate_topic_data(topic_info_array) {
invite_only: false,
is_web_public: true,
is_private: false,
is_archived: false,
last_msg_time: "Just now",
last_msg_url: "https://www.example.com",
full_last_msg_date_time: "date at time",