Order every inbox tab, and let a built-in one be switched off

One order across the built-in tabs and the reader's own, and a set of
built-ins switched off, both beside the other sorting choices on the
user (CategorySorting). The order replaces the categories' own position
column, which never shipped: the strip is one list, so its order is too.
Primary is always first and cannot be switched off — it is where the
rest falls back to.

A switched-off category takes no mail. Whatever would have gone there —
by the header rules, Google's label or the assistant — is in Primary,
and the message panel says it would have been that category. The
answer is mapped rather than the next rule consulted: "Forums is off"
does not make a mailing list Promotions for its List-Unsubscribe.

Until the re-sort a switch queues has run, and for a conversation
somebody pinned there, Primary lists and counts the switched-off
category's conversations too, so nothing is in no tab at all.

InboxTabs is where order and on/off are applied, so the strip, the drop
targets and every key that resolves agree. A restore rewrites the
order's own-tab keys to the categories' new ids.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Paul LütznerandClaude Opus 5.5 committed 2026-10-14 11:34:45 +02:00
1 parent 52ad273359
commit 3c0769c1e6
22 files changed
+522 -86

No files matched your search

@@ -267,6 +267,10 @@ mailed-by and signed-by were silently missing from every IMAP message.
— {{ 'message.details.categorised.pinned'|trans }}
{%- elseif category.own %}
— {{ 'message.details.categorised.own_filter'|trans }}
{%- elseif category.effective.reason == 'switched_off' %}
{#- The signal is the category it would have been, named
the way its tab was. #}
— {{ 'message.details.categorised.switched_off'|trans({'%category%': ('tabs.' ~ category.effective.signal)|trans}) }}
{%- else %}
— {{ ('message.details.categorised.' ~ category.effective.reason)|trans }}
{%- if category.effective.signal %}