templates: Fix invalid <th> inside <thead> (missing <tr>).

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg
2025-09-05 16:43:37 -07:00
committed by Tim Abbott
parent d3238e9a1b
commit 460d63c4dc
19 changed files with 218 additions and 178 deletions

View File

@@ -653,9 +653,11 @@ export function handle_sort<Key, Item>($th: JQuery, list: ListWidget<Key, Item>)
to find custom sort function
<thead>
<tr>
<th data-sort="alphabetic" data-sort-prop="name"></th>
<th data-sort="numeric" data-sort-prop="age"></th>
<th data-sort="status"></th>
</tr>
</thead>
*/
const sort_type = $th.attr("data-sort");

View File

@@ -12,6 +12,7 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table">
<thead class="table-sticky-headers">
<tr>
<th class="active" data-sort="alphabetic" data-sort-prop="full_name">{{t "Name" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
@@ -27,6 +28,7 @@
{{#if is_admin}}
<th class="actions">{{t "Actions" }}</th>
{{/if}}
</tr>
</thead>
<tbody id="admin_users_table" class="admin_user_table"
data-empty="{{t 'No users match your filters.' }}"></tbody>

View File

@@ -18,10 +18,12 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table">
<thead class="table-sticky-headers">
<tr>
<th data-sort="alphabetic" data-sort-prop="word">{{t "Word" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
<th class="actions">{{t "Actions" }}</th>
</tr>
</thead>
<tbody id="alert-words-table" class="alert-words-table"
data-empty="{{t 'There are no current alert words.' }}"></tbody>

View File

@@ -9,6 +9,7 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table">
<thead class="table-sticky-headers">
<tr>
<th data-sort="alphabetic" data-sort-prop="name" class="upload-file-name">{{t "File" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
@@ -22,6 +23,7 @@
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
<th class="upload-actions actions">{{t "Actions" }}</th>
</tr>
</thead>
<tbody data-empty="{{t 'You have not uploaded any files.' }}" data-search-results-empty="{{t 'No uploaded files match your current filter.' }}" id="uploaded_files_table"></tbody>
</table>

View File

@@ -27,6 +27,7 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table">
<thead class="table-sticky-headers">
<tr>
<th class="active" data-sort="alphabetic" data-sort-prop="full_name">{{t "Name" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
@@ -45,6 +46,7 @@
{{#if is_admin}}
<th class="actions">{{t "Actions" }}</th>
{{/if}}
</tr>
</thead>
<tbody id="admin_bots_table" class="admin_bot_table"
data-empty="{{t 'There are no bots.' }}" data-search-results-empty="{{t 'No bots match your current filter.' }}"></tbody>

View File

@@ -43,6 +43,7 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table admin_exports_table">
<thead class="table-sticky-headers">
<tr>
<th class="active" data-sort="user">{{t "Requesting user" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
@@ -52,6 +53,7 @@
</th>
<th>{{t "Status" }}</th>
<th class="actions">{{t "Actions" }}</th>
</tr>
</thead>
<tbody id="admin_exports_table" data-empty="{{t 'There are no exports.' }}"></tbody>
</table>
@@ -70,8 +72,10 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table">
<thead class="table-sticky-headers">
<tr>
<th class="active" data-sort="full_name">{{t "Name" }}</th>
<th>{{t "Export permission"}}</th>
</tr>
</thead>
<tbody id="admin_export_consents_table"></tbody>
</table>

View File

@@ -15,6 +15,7 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table">
<thead class="table-sticky-headers">
<tr>
<th class="active" data-sort="alphabetic" data-sort-prop="full_name">{{t "Name" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
@@ -29,6 +30,7 @@
{{#if is_admin}}
<th class="actions">{{t "Actions" }}</th>
{{/if}}
</tr>
</thead>
<tbody id="admin_deactivated_users_table" class="admin_user_table"
data-empty="{{t 'There are no deactivated users.' }}"

View File

@@ -20,12 +20,14 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table">
<thead class="table-sticky-headers">
<tr>
<th class="active" data-sort="alphabetic" data-sort-prop="name">{{t "Name" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
{{#if is_admin}}
<th class="actions"></th>
{{/if}}
</tr>
</thead>
<tbody data-empty="{{t 'There are no default channels.' }}" data-search-results-empty="{{t 'No default channels match your current filter.' }}"
id="admin_default_streams_table" class="admin_default_stream_table"></tbody>

View File

@@ -20,6 +20,7 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table admin_emoji_table">
<thead class="table-sticky-headers">
<tr>
<th class="active" data-sort="alphabetic" data-sort-prop="name">{{t "Name" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
@@ -28,6 +29,7 @@
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
<th class="actions">{{t "Actions" }}</th>
</tr>
</thead>
<tbody id="admin_emoji_table" data-empty="{{t 'There are no custom emoji.' }}" data-search-results-empty="{{t 'No custom emojis match your current filter.' }}"></tbody>
</table>

View File

@@ -30,6 +30,7 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped">
<thead class="table-sticky-headers">
<tr>
<th class="active" data-sort="invitee">{{t "Invitee" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
@@ -48,6 +49,7 @@
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
<th class="actions">{{t "Actions" }}</th>
</tr>
</thead>
<tbody id="admin_invites_table" class="admin_invites_table" data-empty="{{t 'There are no invitations.' }}" data-search-results-empty="{{t 'No invitations match your current filter.' }}"></tbody>
</table>

View File

@@ -66,11 +66,13 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table admin_linkifiers_table">
<thead class="table-sticky-headers">
<tr>
<th>{{t "Pattern" }}</th>
<th>{{t "URL template" }}</th>
{{#if is_admin}}
<th class="actions">{{t "Actions" }}</th>
{{/if}}
</tr>
</thead>
<tbody id="admin_linkifiers_table" data-empty="{{t 'No linkifiers configured.' }}" data-search-results-empty="{{t 'No linkifiers match your current filter.' }}"></tbody>
</table>

View File

@@ -6,6 +6,7 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table">
<thead class="table-sticky-headers">
<tr>
<th data-sort="alphabetic" data-sort-prop="user_name">{{t "User" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
@@ -13,6 +14,7 @@
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
<th class="actions">{{t "Actions" }}</th>
</tr>
</thead>
<tbody id="muted_users_table" data-empty="{{t 'You have not muted any users yet.'}}" data-search-results-empty="{{t 'No users match your current filter.' }}"></tbody>
</table>

View File

@@ -74,6 +74,7 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table admin_playgrounds_table">
<thead class="table-sticky-headers">
<tr>
<th class="active" data-sort="alphabetic" data-sort-prop="pygments_language">{{t "Language" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
@@ -86,6 +87,7 @@
{{#if is_admin}}
<th class="actions">{{t "Actions" }}</th>
{{/if}}
</tr>
</thead>
<tbody id="admin_playgrounds_table" data-empty="{{t 'No playgrounds configured.' }}" data-search-results-empty="{{t 'No playgrounds match your current filter.' }}"></tbody>
</table>

View File

@@ -1,8 +1,10 @@
<table class="table table-stripped" id="realm_domains_table">
<thead>
<tr>
<th>{{t "Domain" }}</th>
<th>{{t "Allow subdomains"}}</th>
<th>{{t "Action" }}</th>
</tr>
</thead>
<tbody>
</tbody>

View File

@@ -17,6 +17,7 @@
<div class="progressive-table-wrapper" data-simplebar data-simplebar-tab-index="-1">
<table class="table table-striped wrapped-table">
<thead class="table-sticky-headers">
<tr>
<th data-sort="alphabetic" data-sort-prop="stream">{{t "Channel" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
@@ -29,6 +30,7 @@
<th data-sort="numeric" data-sort-prop="date_updated" class="active topic_date_updated">{{t "Date updated" }}
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
</tr>
</thead>
<tbody id="user_topics_table" data-empty="{{t 'You have not configured any topics yet.'}}" data-search-results-empty="{{t 'No topics match your current filter.' }}"></tbody>
</table>

View File

@@ -17,6 +17,7 @@
<div class="subscriber_list_container" data-simplebar data-simplebar-tab-index="-1">
<table class="subscriber-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>
@@ -24,6 +25,7 @@
<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_stream_subscribers" class="subscriber_table" data-empty="{{t 'This channel has no subscribers.' }}" data-search-results-empty="{{t 'No channel subscribers match your current filter.'}}"></tbody>
</table>

View File

@@ -2,6 +2,7 @@
<div class="subscriber_list_loading_indicator"></div>
<table id="stream_members_list" class="subscriber-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>
@@ -11,6 +12,7 @@
{{#if can_remove_subscribers}}
<th class="remove-button-column"></th>
{{/if}}
</tr>
</thead>
<tbody class="subscriber_table" data-empty="{{t 'This channel has no subscribers.' }}" data-search-results-empty="{{t 'No channel subscribers match your current filter.'}}"></tbody>
</table>

View File

@@ -15,6 +15,7 @@
<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>
@@ -22,6 +23,7 @@
<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>

View File

@@ -2,6 +2,7 @@
<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>
@@ -9,6 +10,7 @@
<i class="table-sortable-arrow zulip-icon zulip-icon-sort-arrow-down"></i>
</th>
<th class="remove-button-column" {{#unless can_remove_members}}style="display:none"{{/unless}}></th>
</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>