Commit Graph
82 Commits
Author SHA1 Message Date
Linus Rath 96797597c5 Merge branch 'main' into feat/org-features 2026-10-28 15:14:34 +01:00
Linus Rath 9a4f46f553 fix: show the first hour label whole under the day header when the day and week views open 2026-10-28 13:06:49 +01:00
Linus Rath e654eadd37 Merge branch 'main' into ux/mail3 2026-10-28 11:10:56 +01:00
Linus Rath 8566cf2b29 Merge branch 'ux/calendar3' 2026-10-28 11:06:37 +01:00
Linus Rath 4dc13c229b fix: list a repeating event under its own title in calendar search when one occurrence was renamed 2026-10-28 10:28:13 +01:00
Linus Rath 715c3f03a3 fix: let Enter on the skip link move focus to the message list instead of opening a message 2026-10-28 10:22:00 +01:00
Linus Rath 82aeddfdaa fix: keep hover previews closed while an editor, card or dialog is open and after one closes until the pointer moves 2026-10-28 10:19:02 +01:00
Linus Rath e48a0ed8f6 fix: write event dates in each language's own order on the event card, the event view and the import preview 2026-10-28 10:13:53 +01:00
Linus Rath 2fbfa7a177 fix: give the focus back to the folder or message checkbox after closing a menu opened with Shift+F10 2026-10-28 09:57:32 +01:00
Linus Rath 33ca8efb0f fix: keep shared tags safe when members edit at once or the server fails
The first version wrote the whole tag list on every change, guessed a
group when the server wouldn't say, and treated a failed read like a
server without metadata. Now:

- Definitions are a map by tag id under `tags`, and each change patches
  one tag (`metadata/org.bulwarkmail.tags/tags/<id>`), so two members
  adding tags at once both keep theirs. Fields and colors this version
  doesn't know survive. The `{ list }` and bare-array shapes are still
  read and converted by the first save.
- Shared tags appear only for confirmed group principals. A failed
  principal lookup keeps the user's own tags and asks again later.
- "No metadata advertised" (0.16) and "the read failed" are separate.
  A failed read keeps the last good tags; a failed save keeps the change,
  says so, and sends it with the next good read after the client's
  pause.
- Push reloads wait for 5 s of quiet and skip the echo of our own save;
  a returning tab reloads definitions only, and the scan for unnamed tags
  runs once per sign-in and then at most every 30 minutes.
- The editor names its buttons after the tag, shows the delete warning
  and 44 px buttons on phones, returns focus to the edit button, and
  asks for Inbox rights only for confirmed groups.
2026-10-28 08:58:11 +01:00
Linus Rath 0cd28097e6 Merge branch 'main' into ux/mail2 2026-10-28 08:16:51 +01:00
Linus Rath ed9fa2de45 feat: offer Undo after a move to another account and in lists that mix accounts, moving the messages back into their folders 2026-10-28 08:06:45 +01:00
Linus Rath 4b2aba430c fix: let Back close overlays the same way in calendar, contacts and files 2026-10-28 07:32:05 +01:00
Linus Rath 731ec15af4 Merge branch 'main' into ux/calendar2
# Conflicts:
#	hooks/use-close-on-back.ts
2026-10-28 07:21:42 +01:00
Linus Rath d87678a7ba feat: search events from the calendar toolbar, with / and a palette command 2026-10-28 07:17:16 +01:00
Linus Rath b049b6f470 feat: share tag names and colours in group mailboxes #1310 2026-10-28 06:43:46 +01:00
Linus Rath 1d5091f68b fix: close the event or task editor on browser back instead of leaving the calendar, asking first when it has changes 2026-10-28 06:39:15 +01:00
Linus Rath afd5d8263c fix: delete a contact category the same way in Settings and Contacts, with the same Undo toast 2026-10-28 06:16:10 +01:00
Linus Rath ecbbe137c4 fix: wait for sends and keep quick replies as drafts before an automatic sign-out 2026-10-28 04:06:05 +01:00
Linus Rath 5a898dcfd7 fix: let Escape close only the dialog, not also clear the selection behind it 2026-10-28 02:07:54 +01:00
Linus Rath 4c8d597f82 fix: keep Escape working in dialogs after a click inside or on the backdrop 2026-10-28 01:12:42 +01:00
Linus Rath d610312483 fix: update the open calendar and show reminders on time when events change elsewhere #1349 2026-10-26 20:35:52 +01:00
Linus Rath af536ac90a fix: keep the account and other query parameters of a mail link Lite replays after a 404 #1352 2026-10-26 20:01:10 +01:00
Linus Rath 3a225031bc fix: resize calendar events to the clock time the edge was dropped at on DST change days #1348 2026-10-26 20:01:07 +01:00
Linus Rath cf2c27157d Merge branch 'main' into feat/stalwart-1.0
# Conflicts:
#	components/contacts/contacts-app.tsx
#	components/email/__tests__/composer-discard.test.tsx
#	components/email/calendar-invitation-banner.tsx
#	components/email/email-composer.tsx
#	components/mail/mail-app.tsx
#	components/pro/pro-compose-tab-body.tsx
#	components/pro/pro-email-tab-body.tsx
#	components/ui/__tests__/avatar.test.tsx
#	components/ui/avatar.tsx
#	hooks/use-mailbox-drop.ts
#	lib/__tests__/calendar-alerts.test.ts
#	lib/__tests__/jmap-calendar-tasks.test.ts
#	lib/__tests__/jmap-send-threading.test.ts
#	lib/demo/demo-client.ts
#	lib/demo/fixtures/calendars.ts
#	lib/jmap/client-interface.ts
#	lib/jmap/client.ts
#	lib/web-push.ts
#	stores/__tests__/contact-store.test.ts
#	stores/__tests__/email-store-thread-key.test.ts
#	stores/calendar-store.ts
#	stores/contact-store.ts
#	stores/email-store.ts
2026-10-26 10:14:12 +01:00
VasilisNtovolos 96ae3ce4df fix: reject incomplete email ZIP exports and allow retry 2026-10-21 13:11:41 +03:00
Linus Rath 8428219699 chore: drop the drag test notes from the test folder 2026-10-20 21:15:36 +02:00
VasilisNtovolos cfa16e1bc2 docs: clarify message drag routing verification 2026-10-20 15:49:05 +03:00
VasilisNtovolos 345fe64515 fix: route dragged emails by owning account 2026-10-20 15:45:47 +03:00
Linus Rath 03031fcb13 feat: jump to the next unread message with n #514 2026-10-17 19:18:20 +02:00
Linus Rath 3fd93df4b2 feat: extend the message selection with shift+arrow keys #992 2026-10-17 19:18:15 +02:00
Linus Rath 41a0716c50 Merge branch 'main' into feat/stalwart-1.0 2026-10-16 01:41:48 +02:00
Linus Rath 1cc949416c perf: load the mail view's code while the login form is shown 2026-10-15 03:24:05 +02:00
Linus Rath 97e13a199c perf: stop re-rendering every message row when the list changes 2026-10-15 02:24:58 +02:00
Linus Rath 47762bedf6 perf: re-render only the message rows that changed 2026-10-15 00:41:07 +02:00
Linus Rath 8204678847 fix: stop reporting mail actions as done when a plugin stopped them 2026-10-14 19:44:54 +02:00
Linus Rath be26f96bea Merge branch 'hooks/calendar' into feat/plugin-system-audit 2026-10-14 03:44:13 +02:00
Linus Rath 348ec1d399 feat: let plugins stop app shortcuts and hear when one ran 2026-10-14 03:44:09 +02:00
Linus Rath 89452871fb feat: tell plugins when an event reminder fires and when it is dismissed 2026-10-14 03:40:19 +02:00
Linus Rath 051e82b487 feat: tell plugins about layout changes, drag and drop, and sidebar apps 2026-10-14 03:40:04 +02:00
Linus Rath 9cae33e3cb feat: keep the mountain view compose window open while reading other mail #1229 2026-10-13 15:25:56 +02:00
Linus Rath c633185cda Merge branch 'main' into feat/stalwart-1.0
# Conflicts:
#	CONTRIBUTING.md
#	LICENSE
#	README.md
#	app/api/calendar-agenda/route.ts
#	app/api/wopi/files/[fileId]/contents/route.ts
#	app/api/wopi/launch/route.ts
#	components/calendar/calendar-app.tsx
#	components/calendar/calendar-day-view.tsx
#	components/calendar/calendar-month-view.tsx
#	components/calendar/calendar-week-view.tsx
#	components/calendar/event-modal.tsx
#	components/contacts/contact-detail.tsx
#	components/email/email-composer.tsx
#	components/email/email-list.tsx
#	components/files/file-browser.tsx
#	components/files/files-app.tsx
#	components/files/folder-tree-sidebar.tsx
#	components/filters/filter-rule-modal.tsx
#	components/mail/mail-app.tsx
#	hooks/use-mailbox-drop.ts
#	integration/run-tests.sh
#	lib/__tests__/calendar-agenda-route.test.ts
#	lib/__tests__/jmap-draft-lifecycle.test.ts
#	lib/__tests__/web-push.test.ts
#	lib/account-state-manager.ts
#	lib/jmap/client-interface.ts
#	lib/jmap/client.ts
#	lib/jmap/types.ts
#	lib/message-list-order.ts
#	lib/sieve/generator.ts
#	lib/sieve/parser.ts
#	lib/telemetry/payload.ts
#	lib/thread-utils.ts
#	lib/unified-mailbox.ts
#	lib/web-push.ts
#	lib/wopi/token.ts
#	locales/ar/common.json
#	locales/ca/common.json
#	locales/cs/common.json
#	locales/da/common.json
#	locales/de/common.json
#	locales/en/common.json
#	locales/es/common.json
#	locales/fa/common.json
#	locales/fr/common.json
#	locales/he/common.json
#	locales/hu/common.json
#	locales/it/common.json
#	locales/ja/common.json
#	locales/ko/common.json
#	locales/lv/common.json
#	locales/mn/common.json
#	locales/nb/common.json
#	locales/nl/common.json
#	locales/pl/common.json
#	locales/pt/common.json
#	locales/ro/common.json
#	locales/ru/common.json
#	locales/sk/common.json
#	locales/tr/common.json
#	locales/uk/common.json
#	locales/zh-TW/common.json
#	locales/zh/common.json
#	scripts/lite/lib.mjs
#	stores/__tests__/calendar-store-synthetic-ids.test.ts
#	stores/__tests__/email-store-shared-folder-keywords.test.ts
#	stores/__tests__/email-store-unified-actions.test.ts
#	stores/__tests__/file-store.test.ts
#	stores/email-store.ts
#	stores/file-store.ts
#	stores/message-list-tabs-store.ts
2026-10-12 08:35:08 +02:00
Linus Rath 4af42858f0 Merge pull request #1168 from lucamzanon/feat/mountain-view-layout
feat: add Mountain View, an optional alternative layout
2026-10-10 19:23:59 +02:00
lucamzanon 4347d25890 fix(mountain-view): show the admin console link in the top bar
The top bar replaces the navigation rail on desktop, and with it went
the shield that takes a Stalwart admin to the console, so an admin under
Mountain View had no way in. The bar now shows it, with the same update
dot. The check that decides it moves out of the rail into
useStalwartAdmin so both use the same one.
2026-10-09 08:28:40 +02:00
dealerweb 8abb817111 fix: keep a subject with runs of whitespace from freezing the tab title
The browser reads document.title back with its whitespace stripped and
collapsed, so a title with two spaces in a row, a tab or a space at the
edge never reads back as written. useDocumentTitle put its title back on
every <head> mutation whenever the two differed, and its own write was
such a mutation: an endless loop that froze the tab at full CPU, for
example on opening a message whose subject has two spaces in a row. It
now also accepts what the browser read back after its own write.
2026-10-08 18:10:47 +02:00
Linus Rath 2e262b9d5c fix: title the browser tab after the Pro tab in view #1186 2026-10-07 19:34:19 +02:00
Oğuz YılmazandClaude Opus 5.5 8ca7dbbe9b feat: name the active account in the browser-tab title
The tab title was "<context> - <app>", so two mailboxes open side by side
read the same in the tab strip and in the browser's session-restore list.

It is now "<context> - <account> - <app>", the order Gmail and Outlook Web
use: browsers cut a long title from the end, so the part that changes comes
first and the app name last. There is no setting for it; the account is what
tells the tabs apart.

The formatting, and the mail view's choice of context (composer, then
message, then mailbox), live in lib/tab-title.ts with tests. The mail view
sets its title through useDocumentTitle(), which other surfaces can use too.
Next renders the root layout's metadata <title> again on every client-side
navigation, after the surface has mounted; the hook puts its title back when
that happens. Only the surface that set the title last does so, so two
titles never fight.

Refs #1159

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 08:26:23 +03:00
Linus Rath 6e5c5390df Merge pull request #1162 from dealerweb/fix/focus-trap-rerender
fix: keep the focus in dialogs while the page behind renders again
2026-10-06 23:28:51 +02:00
Linus Rath 0b4d0b0f3c feat: limit the day and week views to working hours and days #1164 2026-10-02 22:56:16 +02:00
dealerweb 0c376dd0e4 fix: keep the focus in a dialog's field while the page behind renders again
useFocusTrap started over whenever its onEscape changed, and callers pass
a new function on every render. Each start moved the focus back to the
opener and then to the dialog's first element, so a field lost the focus
whenever the page behind rendered again: every 30 seconds through the
connection check, or when new mail updated the folder counts. The trap
now reads the latest onEscape from a ref and starts once per opening.

A view change in a dialog (a list giving way to a form) can remove the
element that had the focus. The restart used to pull it back by
accident; the trap now does that on purpose, and only when the focused
element was removed.
2026-10-02 12:42:40 +02:00