Commit Graph
514 Commits
Author SHA1 Message Date
Linus Rath 12e643db9f test: expect spaces around the arrow in a filter rule summary 2026-11-03 06:42:39 +01:00
Linus Rath 5e4ed8772d fix: give filter rule names a line of their own on a phone 2026-11-03 06:40:51 +01:00
Linus Rath f9ff7cab65 fix: keep settings fields and long addresses inside the page at large text sizes 2026-11-03 06:12:30 +01:00
Linus Rath 58df82b6e0 fix: stack plugin settings rows on small phones instead of squeezing their text 2026-11-03 06:01:01 +01:00
Linus Rath f88620208a fix: keep the open settings page when the window narrows to the phone layout 2026-11-03 05:52:19 +01:00
Linus Rath e457bfd69e fix: stop the file preview covering the whole settings page on short screens 2026-11-03 05:45:41 +01:00
Linus Rath 8fa9a72d61 fix: keep the new folder form's buttons on screen on small phones and show counter names on touch 2026-11-03 05:32:34 +01:00
Linus Rath 308178beda fix: open each settings page at its top and keep the place in the phone's page list 2026-11-03 05:06:26 +01:00
Linus Rath d9316101e8 fix: stop a theme card cutting its name next to the default badge 2026-11-03 05:02:43 +01:00
Linus Rath 494f2d5fff fix: stop the filter page footer and rule summaries overflowing on a phone 2026-11-03 05:02:39 +01:00
Linus Rath 158fe588b1 fix: show the label name above its controls on a phone 2026-11-03 05:02:37 +01:00
Linus Rath f5ed731b51 fix: keep settings selects and option buttons inside the page on small phones 2026-11-03 05:02:35 +01:00
Linus Rath bf19f21eaf test: give the composing settings test the useLocale the proofreading section needs 2026-11-03 02:35:24 +01:00
Linus Rath e9e07ddb64 Merge main into feat/assistant-everywhere 2026-11-03 01:35:57 +01:00
Linus Rath e716f529cd test: match template sync and server-state guard to current behaviour 2026-11-03 00:29:56 +01:00
Linus Rath 267ca40522 Merge branch 'feat/assistant-everywhere' into feat/assistant-c 2026-11-03 00:24:12 +01:00
Linus Rath ad36f8d382 fix: show the side panel only where the plugin does, and keep it steady
- The button and the panel of Calendar, Contacts, Files and Settings
  show only when the plugin's shouldShow says yes, so a plugin switched
  off for these views (admin, user or no service) leaves no button that
  opens an empty panel, and no extra rows in Contacts and Settings.
- Files: while the details are open the panel steps aside there only;
  the other views keep it as the user left it. With both stored open the
  details fold when the page loads.
- Resizing stops where the view keeps its 480 px, so a drag or the arrow
  keys no longer fold the panel away (and the handle keeps the focus).
- Settings and Contacts render the same element with or without the
  panel, so a form keeps what was typed when the panel starts docking.
- Contacts on a phone: the panel button sits over an open contact too.
- The panel buttons of the reader and the views have one name, "Plugin
  panel", with aria-pressed, and name the plugin's panel shortcut in
  their title; the open panels are named landmarks.

The reader tests look the button up by its new name and pressed state
(viewer-toolbar-over-side-panel, reader-plugin-surfaces,
viewer-plugin-panel-width), since "Show/Hide plugin panel" is gone.
2026-11-02 23:54:53 +01:00
Linus Rath 8905d31b38 fix: show the admin's locks for plain text and the reply identity on the composing page 2026-11-02 23:14:21 +01:00
Linus Rath 4bf676dec1 fix: keep the vacation reply's plain-text part in step with its HTML after a reload 2026-11-02 22:52:03 +01:00
Linus Rath 54c9c2f353 fix: stop the vacation page saving over and over after an HTML reply is saved 2026-11-02 22:52:03 +01:00
Linus Rath 8fcd647215 feat: let plugins show a side panel next to Calendar, Contacts, Files and Settings 2026-11-02 21:59:36 +01:00
Linus Rath 72117c8a71 Merge branch 'main' into feat/proofreading
# Conflicts:
#	components/admin/admin-shell.tsx
2026-11-02 21:27:17 +01:00
Linus Rath 6055dac1cb fix: keep proofreading text from plugins that shouldn't get it, and work it by keyboard #1397
A security and an accessibility review of the proofreading hook found
gaps, fixed here.

What leaves the browser:
- A checker gets a name for each composer of its own, not the composer's
  id, so it can't reach the message through the other api.composer calls
  after proofreading stops.
- Checking pauses while a plugin that can sign or encrypt is turned on but
  still starting, and while the policy couldn't be fetched (the built-in
  defaults could undo an admin's lock).
- No plugin can hold up turning proofreading off (onBeforeSettingChange).
- Suggestions can't carry zero-width, bidi or line-separator characters;
  messages lose bidi overrides; a flood of annotations is cut off early.
- The notices name the plugin as installed, not a label it chose, and say
  that text written before signing or encryption was turned on may
  already have been checked.
- A checker registered during start-up no longer fails its first check.

Keyboard and screen readers:
- Escape in the issue panel closes the panel, not the message.
- Underlines carry aria-invalid, as the browser's own markers do.
- The focus goes somewhere sensible when a button or an issue goes away,
  Tab past the popup's edges goes back to the text, and the shortcuts work
  in the popup and the panel.
- Ctrl+' and Ctrl+; follow the character typed, so other layouts keep
  their own keys (Ctrl+S on Dvorak), with Ä and Ö on German keyboards.
- The popup is described by its message, sits inside a modal composer,
  fits narrow screens, and the panel fits a phone.
2026-11-02 20:26:21 +01:00
Linus Rath 7b59f2562f Merge pull request #1493 from ibayue/feat/signature-insert-toggles 2026-11-02 20:23:58 +01:00
Linus Rath 67549d5f54 feat: show proofreading suggestions in a popup and an issue list in the composer #1397 2026-11-02 19:46:00 +01:00
daluchenandClaude Code 1f8b1f4533 feat: add signature auto-insert toggles, off by default
Automatic signature insertion was unconditional: any identity with a
signature got it embedded in new mail and appended to replies, forwards
and quick replies. Users who want a signature only in specific contexts
had no way to opt out.

Add two per-account synced settings, both defaulting to off:

- signatureNewMailEnabled: insert the signature in new messages (and
  re-opened drafts, which open in compose mode)
- signatureReplyForwardEnabled: append it in replies, forwards and the
  quick reply box

With a toggle off the composer neither embeds the signature into the
body, nor appends one at send or draft-save time, nor shows the
read-only preview under the editor - the preview would promise a
signature that never goes out. A signature pasted in by hand is never
stripped (bodyCarriesSignature still short-circuits the append).

Also flip signatureSeparatorEnabled's default from true to false: the
RFC 3676 "-- " delimiter surprised users more than it helped. Only the
default changes - no migration, so users who already set it keep their
choice.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-11-02 11:05:17 +08:00
Linus Rath 96243169d7 fix: wait for the settings page before scrolling to a linked section 2026-11-01 19:46:58 +01:00
Linus Rath 5166cd0a5a feat: show the settings page's shape while the app loads 2026-11-01 19:24:13 +01:00
Linus Rath f5ed12f5cb refactor: keep the density tables and legacy settings tabs in plain modules 2026-11-01 18:41:36 +01:00
Linus Rath e4338ac47d feat: add the Search in setting to Message list settings #1485 2026-11-01 17:44:15 +01:00
Linus Rath db5ac82f53 feat: keep recent mail on this device and send mail written offline #523
Settings > Backup & reset gets "Keep mail on this device", off until the
user turns it on in this browser. While it is on:

- the JMAP client hands the server's answers to an encrypted cache in
  IndexedDB (AES-GCM, non-extractable key) and answers from it when the
  network is gone: the folder list, the last 30 days of the Inbox and of
  the folders the user opened, bodies and attachments, at most 250 MB,
  oldest out first; a background sync keeps it current
- read, flag, tags and moves made offline are queued and sent in order
  when the server answers again; deleting for good and emptying a folder
  are refused offline
- the composer, quick reply and the S/MIME and PGP plugins' sends that
  complete the composer's go to an outbox once every step up to the
  transport ran (checks, label, signature, plugin send checks); only the
  finished send waits, with files attached offline
- the service worker keeps this build's app shell, so the app also
  starts offline from the kept session and the last policy
- a full sign-out, the idle sign-out and signing one account out delete
  it, a sign-out the user starts asks first when mail is unsent, and the
  login page names what an automatic sign-out deleted; a policy fetch
  that forbids it (devices.noOffline) wipes that account

Not in Lite.
2026-11-01 11:46:11 +01:00
Linus Rath a4b140b651 fix: keep out-of-office dates right when the time zone setting arrives or changes after the page opened 2026-11-01 09:48:58 +01:00
Linus Rath 47784cc07a feat: offer admin out-of-office templates and show the absence dates in the user's time zone 2026-11-01 08:02:39 +01:00
Linus Rath 2a952f4b72 Merge branch 'feat/enterprise-pack-c'
# Conflicts:
#	lib/sign-out-cleanup.ts
2026-11-01 07:39:30 +01:00
Linus Rath cbd23db2fe fix: give mail import and export their own settings section and name the upload limit as the server does
- Settings > Backup & reset gets a Mail files section for Import mail
  and Export all mail, instead of sitting under settings backup.
- The pause message names Stalwart's 50000000-byte quota as 50 MB, not
  48 MB, and the dialog and settings texts mention .ost files.
- The old import's leftovers go: expandImportableEmails and
  EML_IMPORT_ACCEPT in lib/eml-import.ts, and the strings
  email_viewer.import_email, mailbox_context_menu.import_email and
  notifications.import_email_success/_error in all 30 locales.

lib/__tests__/eml-import.test.ts loses the tests of the removed
functions; its #891 checks that an .eml and an .eml in a ZIP keep their
Date header now run against the import's own sources.
2026-11-01 07:05:02 +01:00
Linus Rath e7c8df01fd fix: show the out-of-office calendar choice the way the organisation's lock applies it 2026-11-01 06:42:37 +01:00
Linus Rath a8f9d81337 feat: block the calendar while the out-of-office reply is on 2026-11-01 05:19:07 +01:00
Linus Rath d714957f98 feat: import mbox, EML and ZIP mail with progress, pause and resume 2026-11-01 04:58:55 +01:00
Linus Rath ab2fc6454d feat: let admins share every user's free/busy with a group 2026-11-01 04:51:30 +01:00
Linus Rath 84de2395f0 fix: keep trusted senders from loading remote content anywhere while the organisation blocks it 2026-11-01 03:27:49 +01:00
Linus Rath eb2e3b2baa feat: make the attachment bar the default and retire attachments beside the sender 2026-10-31 23:35:54 +01:00
Linus Rath 417f512765 feat: add preview cards under the message as an attachment position 2026-10-31 23:28:20 +01:00
Jacob Zeitz fca08981a1 feat: compact shared mailboxes in the sidebar #1342
Closes #1483
2026-10-31 22:17:39 +01:00
Linus Rath d23a2869d1 Merge remote-tracking branch 'origin/main' into fix/found-fix-server
# Conflicts:
#	Dockerfile
#	docker-compose.yml
2026-10-31 18:17:39 +01:00
Linus Rath 6a1da49f52 fix: let accessibility reset bring back the organisation's defaults and cover every option 2026-10-31 17:57:20 +01:00
Linus Rath a9e93881b5 feat: match filter conditions against a regular expression #885 2026-10-31 17:45:26 +01:00
Linus Rath bc6fee7556 feat: let timed events show as coloured text or a dot in the month view #1449 2026-10-31 16:23:00 +01:00
Linus Rath d3fecae85f feat: hide the contacts directory when the server refuses it, and let users or admins turn it off #1457 2026-10-31 16:22:24 +01:00
Linus Rath b11139887d fix: stop the hearing preset card from looking selected 2026-10-31 02:06:19 +01:00
Linus Rath c166651d14 fix: leave the preview line out of the density sample while show preview is off 2026-10-31 01:41:35 +01:00