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

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

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

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

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

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

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

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