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:
25
web/templates/inbox_view/inbox_folder_row.hbs
Normal file
25
web/templates/inbox_view/inbox_folder_row.hbs
Normal file
@@ -0,0 +1,25 @@
|
||||
{{!-- col-index `0` is COLUMNS.FULL_ROW --}}
|
||||
<div id="{{ header_id }}" tabindex="0" class="inbox-header inbox-folder {{#unless is_header_visible}}hidden_by_filters{{/unless}} {{#if is_collapsed}}inbox-collapsed-state{{/if}}" data-col-index="0">
|
||||
<div class="inbox-focus-border">
|
||||
<div class="inbox-left-part-wrapper">
|
||||
<div class="inbox-left-part">
|
||||
<div class="inbox-header-name">
|
||||
<span class="inbox-header-name-text">
|
||||
{{#if is_dm_header}}
|
||||
{{t 'DIRECT MESSAGES'}}
|
||||
{{else}}
|
||||
{{name}}
|
||||
{{/if}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="collapsible-button"><i class="folder-row-chevron zulip-icon zulip-icon-chevron-down"></i></div>
|
||||
<span class="unread_mention_info tippy-zulip-tooltip
|
||||
{{#unless has_unread_mention}}hidden{{/unless}}"
|
||||
data-tippy-content="{{t 'You have unread mentions' }}">@</span>
|
||||
<div class="unread-count-focus-outline">
|
||||
<span class="unread_count">{{unread_count}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
21
web/templates/inbox_view/inbox_folder_with_channels.hbs
Normal file
21
web/templates/inbox_view/inbox_folder_with_channels.hbs
Normal file
@@ -0,0 +1,21 @@
|
||||
{{> inbox_folder_row
|
||||
name=name
|
||||
header_id=header_id
|
||||
is_header_visible=is_header_visible
|
||||
is_dm_header=false
|
||||
is_collapsed=is_collapsed
|
||||
has_unread_mention=has_unread_mention
|
||||
unread_count=unread_count
|
||||
}}
|
||||
<div class="inbox-streams-container inbox-folder-components">
|
||||
{{#each stream_rows}}
|
||||
<div id="{{stream_key}}" class="inbox-folder-channel">
|
||||
{{> inbox_row stream_row}}
|
||||
<div class="inbox-topic-container">
|
||||
{{#each topic_rows}}
|
||||
{{> inbox_row .}}
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
25
web/templates/inbox_view/inbox_list.hbs
Normal file
25
web/templates/inbox_view/inbox_list.hbs
Normal file
@@ -0,0 +1,25 @@
|
||||
{{> inbox_folder_row
|
||||
header_id="inbox-dm-header"
|
||||
is_header_visible=has_dms_post_filter
|
||||
is_dm_header=true
|
||||
is_collapsed=is_dms_collapsed
|
||||
has_unread_mention=has_unread_mention
|
||||
unread_count=unread_dms_count
|
||||
}}
|
||||
<div id="inbox-direct-messages-container" class="inbox-folder-components">
|
||||
{{#each (map_entries dms_dict)}}
|
||||
{{> inbox_row this.[1]}}
|
||||
{{/each}}
|
||||
</div>
|
||||
{{#each folders_with_stream_rows}}
|
||||
{{> inbox_folder_with_channels
|
||||
id=id
|
||||
name=name
|
||||
header_id=header_id
|
||||
is_header_visible=is_header_visible
|
||||
is_collapsed=is_collapsed
|
||||
has_unread_mention=has_unread_mention
|
||||
unread_count=unread_count
|
||||
stream_rows=stream_rows
|
||||
}}
|
||||
{{/each}}
|
||||
19
web/templates/inbox_view/inbox_no_unreads.hbs
Normal file
19
web/templates/inbox_view/inbox_no_unreads.hbs
Normal file
@@ -0,0 +1,19 @@
|
||||
<div id="inbox-empty-without-search" class="inbox-empty-text">
|
||||
<div class="inbox-empty-illustration"></div>
|
||||
<div class="inbox-empty-title">
|
||||
{{t "There are no unread messages in your inbox."}}
|
||||
</div>
|
||||
<div class="inbox-empty-action inbox-empty-action-default">
|
||||
{{#tr}}
|
||||
You might be interested in <z-link>recent conversations</z-link>.
|
||||
{{#*inline "z-link"}}<a class="inbox-empty-action-link" href="#recent">{{> @partial-block}}</a>{{/inline}}
|
||||
{{/tr}}
|
||||
</div>
|
||||
<div class="inbox-empty-action inbox-empty-action-filtered">
|
||||
{{#tr}}
|
||||
You can <z-link-unfollowed>include topics you don't follow</z-link-unfollowed> or <z-link>view recent conversations</z-link>.
|
||||
{{#*inline "z-link-unfollowed"}}<a class="inbox-empty-action-link inbox-toggle-followed-filter">{{> @partial-block}}</a>{{/inline}}
|
||||
{{#*inline "z-link"}}<a class="inbox-empty-action-link" href="#recent">{{> @partial-block}}</a>{{/inline}}
|
||||
{{/tr}}
|
||||
</div>
|
||||
</div>
|
||||
79
web/templates/inbox_view/inbox_row.hbs
Normal file
79
web/templates/inbox_view/inbox_row.hbs
Normal file
@@ -0,0 +1,79 @@
|
||||
{{#if is_stream}}
|
||||
{{> inbox_stream_header_row .}}
|
||||
{{else}}
|
||||
<div id="inbox-row-conversation-{{conversation_key}}" class="inbox-row {{#if is_hidden}}hidden_by_filters{{/if}}" tabindex="0" data-col-index="{{ column_indexes.FULL_ROW }}">
|
||||
<div class="inbox-focus-border">
|
||||
<div class="inbox-left-part-wrapper">
|
||||
<div class="inbox-left-part">
|
||||
{{#if is_direct}}
|
||||
<a class="recipients_info {{#unless user_circle_class}}inbox-group-or-bot-dm{{/unless}}" href="{{dm_url}}" tabindex="-1">
|
||||
<span class="user_block">
|
||||
{{#if is_bot}}
|
||||
<span class="zulip-icon zulip-icon-bot" aria-hidden="true"></span>
|
||||
{{else if is_group}}
|
||||
<span class="conversation-partners-icon zulip-icon zulip-icon-dm-groups-3" aria-hidden="true"></span>
|
||||
{{else}}
|
||||
<span class="zulip-icon zulip-icon-{{user_circle_class}} {{user_circle_class}} user-circle" data-presence-indicator-user-id="{{user_ids_string}}"></span>
|
||||
{{/if}}
|
||||
<span class="recipients_name">{{{rendered_dm_with_html}}}</span>
|
||||
</span>
|
||||
</a>
|
||||
<span class="unread_mention_info tippy-zulip-tooltip
|
||||
{{#unless has_unread_mention}}hidden{{/unless}}"
|
||||
data-tippy-content="{{t 'You have unread mentions' }}">@</span>
|
||||
<div class="unread-count-focus-outline" tabindex="0" data-col-index="{{ column_indexes.UNREAD_COUNT }}">
|
||||
<span class="unread_count tippy-zulip-delayed-tooltip on_hover_dm_read"
|
||||
data-user-ids-string="{{user_ids_string}}" data-tippy-content="{{t 'Mark as read' }}"
|
||||
aria-label="{{t 'Mark as read' }}">{{unread_count}}</span>
|
||||
</div>
|
||||
{{else if is_topic}}
|
||||
<div class="inbox-topic-name">
|
||||
<a tabindex="-1" href="{{topic_url}}" {{#if is_empty_string_topic}}class="empty-topic-display"{{/if}}>{{topic_display_name}}</a>
|
||||
</div>
|
||||
<span class="unread_mention_info tippy-zulip-tooltip
|
||||
{{#unless mention_in_unread}}hidden{{/unless}}"
|
||||
data-tippy-content="{{t 'You have unread mentions'}}">@</span>
|
||||
{{#unless (or (eq unread_count undefined) (eq unread_count 0))}}
|
||||
<div class="unread-count-focus-outline" tabindex="0" data-col-index="{{ column_indexes.UNREAD_COUNT }}">
|
||||
<span class="unread_count tippy-zulip-delayed-tooltip on_hover_topic_read"
|
||||
data-stream-id="{{stream_id}}" data-topic-name="{{topic_name}}"
|
||||
data-tippy-content="{{t 'Mark as read' }}" aria-label="{{t 'Mark as read' }}">
|
||||
{{unread_count}}
|
||||
</span>
|
||||
</div>
|
||||
{{/unless}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{#unless is_direct}}
|
||||
<div class="inbox-right-part-wrapper">
|
||||
<div class="inbox-right-part">
|
||||
{{#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)}}
|
||||
<i class="zulip-icon zulip-icon-follow recipient_bar_icon" data-tippy-content="{{t 'You follow this topic.'}}"
|
||||
role="button" aria-haspopup="true" aria-label="{{t 'You follow this topic.' }}"></i>
|
||||
{{else if (eq visibility_policy all_visibility_policies.UNMUTED)}}
|
||||
<i class="zulip-icon zulip-icon-unmute recipient_bar_icon" data-tippy-content="{{t 'You have unmuted this topic.'}}"
|
||||
role="button" aria-haspopup="true" aria-label="{{t 'You have unmuted this topic.' }}"></i>
|
||||
{{else if (eq visibility_policy all_visibility_policies.MUTED)}}
|
||||
<i class="zulip-icon zulip-icon-mute recipient_bar_icon" data-tippy-content="{{t 'You have muted this topic.'}}"
|
||||
role="button" aria-haspopup="true" aria-label="{{t 'You have muted this topic.' }}"></i>
|
||||
{{else if (eq visibility_policy all_visibility_policies.INHERIT)}}
|
||||
<i class="zulip-icon zulip-icon-inherit recipient_bar_icon"
|
||||
role="button" aria-haspopup="true" aria-label="{{t 'Notifications are based on your configuration for this channel.' }}"></i>
|
||||
{{/if}}
|
||||
</span>
|
||||
{{/if}}
|
||||
<div class="inbox-action-button inbox-topic-menu"
|
||||
{{#if is_topic}}data-stream-id="{{stream_id}}" data-topic-name="{{topic_name}}"
|
||||
data-topic-url="{{topic_url}}"{{/if}} tabindex="0" data-col-index="{{ column_indexes.ACTION_MENU }}">
|
||||
<i class="zulip-icon zulip-icon-more-vertical" aria-hidden="true"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/unless}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
8
web/templates/inbox_view/inbox_stream_container.hbs
Normal file
8
web/templates/inbox_view/inbox_stream_container.hbs
Normal file
@@ -0,0 +1,8 @@
|
||||
<div id="{{stream_key}}">
|
||||
{{> inbox_row stream_row}}
|
||||
<div class="inbox-topic-container">
|
||||
{{#each topic_rows}}
|
||||
{{> inbox_row .}}
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
40
web/templates/inbox_view/inbox_stream_header_row.hbs
Normal file
40
web/templates/inbox_view/inbox_stream_header_row.hbs
Normal file
@@ -0,0 +1,40 @@
|
||||
<div id="inbox-stream-header-{{stream_id}}" class="inbox-header {{#if is_hidden}}hidden_by_filters{{/if}} {{#if is_collapsed}}inbox-collapsed-state{{/if}}" data-col-index="{{ column_indexes.FULL_ROW }}" tabindex="0" data-stream-id="{{stream_id}}" style="background: {{stream_header_color}};">
|
||||
<div class="inbox-focus-border">
|
||||
<div class="inbox-left-part-wrapper">
|
||||
<div class="inbox-left-part">
|
||||
<div class="inbox-header-name">
|
||||
<span class="stream-privacy-original-color-{{stream_id}} stream-privacy filter-icon" style="color: {{stream_color}}">
|
||||
{{> ../stream_privacy . }}
|
||||
</span>
|
||||
<span class="inbox-header-name-text">{{stream_name}}</span>
|
||||
{{#if is_archived}}
|
||||
<span class="inbox-header-stream-archived">
|
||||
<i class="archived-indicator">({{t 'archived' }})</i>
|
||||
</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="collapsible-button toggle-inbox-header-icon {{#if is_collapsed}}icon-collapsed-state{{/if}}"><i class="channel-row-chevron zulip-icon zulip-icon-chevron-down"></i></div>
|
||||
<span class="unread_mention_info tippy-zulip-tooltip
|
||||
{{#unless mention_in_unread}}hidden{{/unless}}"
|
||||
data-tippy-content="{{t 'You have unread mentions'}}">@</span>
|
||||
<div class="unread-count-focus-outline" tabindex="0" data-col-index="{{ column_indexes.UNREAD_COUNT }}">
|
||||
<span class="unread_count tippy-zulip-delayed-tooltip on_hover_topic_read"
|
||||
data-stream-id="{{stream_id}}" data-tippy-content="{{t 'Mark as read' }}"
|
||||
aria-label="{{t 'Mark as read' }}">{{unread_count}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inbox-right-part-wrapper">
|
||||
<div class="inbox-right-part">
|
||||
{{#if is_muted}}
|
||||
<span class="channel-visibility-policy-indicator toggle-channel-visibility tippy-zulip-tooltip" data-stream-id="{{stream_id}}" tabindex="0" data-col-index="{{ column_indexes.TOPIC_VISIBILITY }}" data-tooltip-template-id="inbox-channel-mute-toggle-tooltip-template">
|
||||
<i class="zulip-icon zulip-icon-mute recipient_bar_icon" role="button" aria-label="{{t 'Unmute channel' }}"></i>
|
||||
</span>
|
||||
{{/if}}
|
||||
<div class="inbox-action-button inbox-stream-menu" data-stream-id="{{stream_id}}" tabindex="0" data-col-index="{{ column_indexes.ACTION_MENU }}">
|
||||
<i class="zulip-icon zulip-icon-more-vertical" aria-hidden="true"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
50
web/templates/inbox_view/inbox_view.hbs
Normal file
50
web/templates/inbox_view/inbox_view.hbs
Normal file
@@ -0,0 +1,50 @@
|
||||
<div id="inbox-main">
|
||||
{{#if unknown_channel}}
|
||||
<div id="inbox-unknown-channel-view" class="empty-list-message">
|
||||
{{t "This channel doesn't exist, or you are not allowed to view it."}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="search_group" id="inbox-filters" role="group">
|
||||
{{> ../dropdown_widget widget_name="inbox-filter"}}
|
||||
{{#> ../components/input_wrapper . input_type="filter-input" custom_classes="inbox-search-wrapper" icon="search" input_button_icon="close"}}
|
||||
<input type="text" id="{{INBOX_SEARCH_ID}}" class="input-element" value="{{search_val}}" autocomplete="off" placeholder="{{t 'Filter' }}" />
|
||||
{{/../components/input_wrapper}}
|
||||
{{#if show_channel_folder_toggle}}
|
||||
<span class="sidebar-menu-icon channel-folders-inbox-menu-icon hidden-for-spectators"><i class="zulip-icon zulip-icon-more-vertical" aria-label="{{t 'Show channel folders'}}"></i></span>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div id="inbox-empty-with-search" class="inbox-empty-text empty-list-message">
|
||||
{{t "No conversations match your filters."}}
|
||||
</div>
|
||||
<div id="inbox-empty-channel-view-with-search" class="inbox-empty-text empty-list-message">
|
||||
{{t "No topics match your filters."}}
|
||||
</div>
|
||||
<div id="inbox-empty-channel-view-without-search" class="inbox-empty-text empty-list-message">
|
||||
{{t "There are no topics in this view."}}
|
||||
</div>
|
||||
{{#if normal_view}}
|
||||
{{> inbox_no_unreads}}
|
||||
{{/if}}
|
||||
<div id="inbox-list">
|
||||
{{#if normal_view}}
|
||||
{{> inbox_list .}}
|
||||
{{/if}}
|
||||
</div>
|
||||
<div id="inbox-collapsed-note">
|
||||
<div class="inbox-collapsed-note-and-button-wrapper">
|
||||
<span class="inbox-collapsed-note-span">
|
||||
{{t "All unread conversations are hidden. Click on a section, folder, or channel to expand it."}}
|
||||
</span>
|
||||
<button id="inbox-expand-all-button" class="action-button action-button-subtle-neutral" tabindex="0">
|
||||
<span class="action-button-label">{{t "Show all"}}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="inbox-animation-extra-content-blocker" class="collapse-expand-animation-extra-content-blocker"></div>
|
||||
<div id="inbox-loading-indicator">
|
||||
{{#unless normal_view}}
|
||||
{{> ../view_bottom_loading_indicator}}
|
||||
{{/unless}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
Reference in New Issue
Block a user