Commit Graph
1423 Commits
Author SHA1 Message Date
Linus Rath d47f26da20 fix: show invitation times in your time zone #1252 2026-10-17 19:17:49 +02:00
Linus Rath deb106736e fix: load the admin panel when the config is read-only #1249 2026-10-17 19:17:48 +02:00
Linus Rath a854447346 fix: apply admin policy defaults to user settings #1248 2026-10-17 19:17:46 +02:00
balabommablock-cpu 3a7ebdeacc fix: count calendar days in the time zone for the relative date #1259 2026-10-17 03:38:45 +00:00
Jacob ZeitzandClaude Opus 5.5 99b0bced3b feat: admin policy gate to turn off archiving #1257
A new feature gate, archiveActionEnabled (default on), lets the admin turn the
Archive action off for installations that archive mail elsewhere, such as a
mail gateway. With it off, Bulwark offers no Archive anywhere: the viewer's
button and its overflow entry, the context menu for one or several messages,
Mountain View's selection bar, the hover and swipe actions, the E shortcut and
its help row, archiving after an export, and the archive mode setting (also in
the settings search). With it off nothing creates an Archive folder:
ensureArchiveMailbox returns null. Existing Archive folders stay ordinary
folders, moving mail into them by hand still works, and the plugin API is
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 20:48:28 +02:00
Linus Rath 964626794b feat: browse the company directory in contacts and the composer #1253 2026-10-16 20:46:27 +02:00
Sebastian SanitzandClaude Opus 5.5 629781ffd4 fix(tasks): send an all-day task's due and start as a LocalDateTime
The task modal and the plugin API send an all-day due as a bare date
("2026-10-14"). A task's due and start are LocalDateTimes (RFC 8984).
Stalwart accepts the bare date and echoes it back over JMAP, but the
stored iCalendar has no DUE, so CalDAV clients (phones, Thunderbird)
show the task without a date. "2026-10-14T00:00:00" with showWithoutTime
is stored as DUE;VALUE=DATE.

createCalendarTask and updateCalendarTask now complete a bare due or
start to midnight. Every write goes through them, so a task saved by an
older client gets a proper due when it moves to another account.

Tests: create, update and the cross-account move against round trips
recorded on Stalwart v0.16.24 (JMAP set, then CalDAV GET of the stored
iCalendar); times and a cleared due stay as they are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 17:30:39 +02:00
raudraidoandClaude Sonnet 5.5 ae7f794d2f feat: add Estonian (et) locale
Complete Estonian translation (every key in en), wired into the locale list, the message loaders, the language switcher (with an Estonian flag drawn in the Twemoji style, since Twemoji's set is not used for it) and the locale-count test.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 18:19:29 +03:00
Tobias Genannt d6d3683b65 feat(plugins): add Combobox component to UI kit with host floating dropdown portal
- Add Combobox component supporting single and multiselect modes, search filtering, and clear button
- Implement floating dropdown bridge and host slot portal so dropdown renders cleanly outside plugin iframe
- Fix clear button and chip removals to not unexpectedly open the dropdown
- Add comprehensive unit tests covering Combobox options, clear behavior, multiselect, and bridge communication
2026-10-16 10:08:27 +02:00
lucamzanon db38ad320e feat: optionally keep mailbox passwords in the account list backup
Part 2 of 3 of the account archive agreed in #1198. When the admin turns on
"Account List Backup: Passwords" (off by default), saving the list offers to
include the passwords of the accounts signed in here with a plain password.
They are encrypted in the browser together with the list. On restore, those
accounts are signed in to in the background, one by one, without leaving the
active account; a refused password leaves the account waiting for a sign-in by
hand, as before. OAuth and TOTP accounts are saved without a password.
2026-10-16 05:46:46 +02:00
Linus Rath 41a0716c50 Merge branch 'main' into feat/stalwart-1.0 2026-10-16 01:41:48 +02:00
Linus Rath 0e61705841 Merge pull request #1244 from lucletoffe/feat/calendar-sort-order
feat(calendar): order calendars by sortOrder and let users reorder them
2026-10-15 23:54:41 +02:00
Linus Rath 12e46bd718 Merge pull request #1245 from lucletoffe/feat/calendar-share-recipients
feat(calendar): say whom a calendar is shared with
2026-10-15 23:54:40 +02:00
Linus Rath 3db1799fda Merge pull request #1070 from ibayue/feature/batch-forward-as-attachment
feat: forward selected emails as attachments from the context menu
2026-10-15 23:54:38 +02:00
Linus Rath 0b49d01a76 fix: keep synced calendar subscriptions from stale devices and past deletions #1064 2026-10-15 23:54:37 +02:00
Linus Rath fe40567398 Merge pull request #1064 from sanitz/feat/sync-ical-subscriptions
feat(calendar): sync iCal subscriptions via encrypted settings store
2026-10-15 23:54:37 +02:00
Linus Rath 7eb0835834 fix: check every calendar for events within the server's request limits #1065 2026-10-15 23:54:36 +02:00
Linus Rath 2f06ef45f5 Merge pull request #1065 from sanitz/fix/tasks-only-calendar-detection
fix(calendar): detect tasks-only calendars per-calendar instead of scanning whole account
2026-10-15 23:54:35 +02:00
lucletoffeandClaude Opus 5.5 de388a1d12 feat(calendar): order calendars by sortOrder and let users reorder them
Calendars were listed in the order the server returns them, which for
Stalwart is creation order, and the sortOrder property was never read.
Follow the JMAP Calendars rule instead: lower sortOrder first, equal
sortOrder by name (case- and accent-insensitive, numbers by value). The
store keeps the list sorted, so the sidebar, the calendar pickers and the
settings all show the same order; each account's calendars stay together.

Calendar settings gain move up / move down buttons, visible on touch
screens too, and drag and drop for the user's own calendars. A move
renumbers that account's calendars 1, 2, 3... and writes sortOrder only
where it changes. The renumbering also covers the account's calendars the
settings list does not show (iCal subscriptions), so they keep their
place relative to the others. Shared calendars are not offered for
reordering, their order is the owner's.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 22:31:07 +02:00
lucletoffeandClaude Opus 5.5 8cf6783cdb feat(calendar): say whom a calendar is shared with
The sidebar showed the same people icon for any calendar with a share,
labelled "Share calendar", and the settings badge only gave a count, so
there was no way to tell from either who could see the calendar. A share
granted to a service account read like a share with other people.

Both now carry a hint listing the recipients ("Shared with
bot@example.com (Booking robot)"), resolved from the principals the
server lists. Until every recipient is known the hint falls back to the
count. Principals are fetched only when a calendar on screen is shared.

The per-client principal cache of the attendee availability check moves
to lib/jmap/principal-cache.ts so both use it. It no longer keeps an
empty or failed answer: the next caller asks again instead of seeing
no principals for the rest of the session.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 22:19:53 +02:00
Linus Rath dd2104cdda feat: mute notifications for single folders or whole accounts #1169 2026-10-15 21:50:08 +02:00
Linus Rath a852001d4f feat: let admins turn off the custom From address in the composer 2026-10-15 14:43:07 +02:00
Linus Rath 6ef0d97900 fix: count storage quota against softLimit when the server sets one #1242 2026-10-15 14:31:09 +02:00
Linus Rath d693fbc7c2 fix: leave the all mailbox out of the cross views #1241 2026-10-15 14:25:32 +02:00
Linus Rath 24bd1f8e44 fix: only offer contacts, filters, calendars and files for shared accounts that support them #1239 2026-10-15 14:22:54 +02:00
Linus Rath b1360b8588 fix: leave blank signatures out when creating an identity #1240 2026-10-15 14:18:06 +02:00
Linus Rath 6f5d20454c fix: stop the message list reordering and repainting when switching accounts 2026-10-15 14:15:20 +02:00
VasilisNtovolos 69519bf344 fix: respect account permissions when creating Archive 2026-10-15 14:24:44 +03:00
VasilisNtovolos d1350758a4 fix: route bulk archive by owning account 2026-10-15 14:20:25 +03:00
daluchenandClaude Code 5dde5e00e1 feat: add batch forward-as-attachment for selected emails
Multi-select emails in the list, right-click, and pick "Forward as
attachments" to open one composer carrying every selected message as
its own message/rfc822 (.eml) attachment - the batch sibling of the
existing single-message action.

- lib/forward-as-attachment.ts: buildBatchForwardAsAttachmentPayload
  builds one payload from many emails. The subject is count-based
  (there is no single original subject), with the count localized via
  an injected label so the subject never claims more attachments than
  the composer carries. Emails without a blobId are skipped; null when
  none has one, matching the single flow's silent no-op.
- mail-app.tsx: handleBatchForwardAsAttachment resolves the selection
  through useEmailStore.getState() (fresh state, list-ordered
  attachments, stale ids drop out), runs the plugin transform and veto
  hooks per email - one veto cancels the whole compose - and opens the
  composer with the attachments seeded via replyTo. Clears the
  selection only on success.
- email-context-menu.tsx / email-list.tsx: new batch menu item shown
  when the right-clicked email belongs to a multi-selection; hidden in
  the scheduled view like the single item.
- locales: context_menu.forward_as_attachments and
  email_composer.forward_batch_count in all 27 locales.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-15 14:50:31 +08:00
Linus Rath 18633b72ba test: type the fetch mock in the large HTML body test 2026-10-15 06:15:57 +02:00
Linus Rath 3a0c988419 perf: skip the verification-code scan of HTML mail that names no code 2026-10-15 06:15:15 +02:00
Linus Rath 15c3acd779 perf: open large HTML messages with one request instead of two 2026-10-15 06:05:22 +02:00
Linus Rath 59d762a385 perf: start loading a message when the mouse is pressed on it 2026-10-15 01:17:39 +02:00
Linus Rath a0563c1fed perf: reopen a visited folder without re-reading or redrawing its list 2026-10-15 01:03:02 +02:00
Linus Rath bccad4dddf perf: reuse date formatters in the message list 2026-10-15 00:41:08 +02:00
Linus Rath 6d6e9d445e perf: measure the message toolbar and body height with fewer layout passes 2026-10-15 00:41:07 +02:00
Linus Rath db2c0aff3d perf: load conversation sizes with the folder page instead of in a second request 2026-10-15 00:14:57 +02:00
Linus Rath 06d00e10ee perf: keep the list on screen while a search runs and stop re-rendering on every keystroke 2026-10-15 00:12:59 +02:00
Linus Rath 2d67442a2b perf: list search results without waiting for the highlighted excerpts 2026-10-14 23:51:17 +02:00
Linus Rath 15edc5943b feat: check the extension directory's signature before installing from the marketplace 2026-10-14 21:36:50 +02:00
Linus Rath 3fac196d3f fix: ask plugins before creating archive folders and marking whole folders read 2026-10-14 20:08:37 +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 bcd044f4fc fix: stop translating the composer as a music composer and the certificate subject as an email subject 2026-10-14 19:19:51 +02:00
Linus Rath 3d5c46bbcf fix: make plugin sidebar rows as tall as folder rows on phones 2026-10-14 18:49:56 +02:00
Linus Rath 9affb1c9b9 fix: show plugins the message that was already open when they start 2026-10-14 18:49:22 +02:00
Linus Rath eba711bd54 Merge branch 'feat/plugin-system-audit' 2026-10-14 18:09:19 +02:00
Linus Rath db7a4408a1 fix: list plugin composer buttons under Options when the composer is too narrow for them 2026-10-14 14:59:29 +02:00
Linus Rath c6ec58e5cc fix: keep a compact info bar's text on one line next to its icon 2026-10-14 14:22:13 +02:00
Linus Rath 60fe6f159a fix: keep plugin frames on the page's theme when it changes outside the theme store 2026-10-14 14:16:32 +02:00