Commit Graph
770 Commits
Author SHA1 Message Date
Linus Rath a69d7eee33 feat: let plugins work with team mailboxes: list filters, row badge icons, account info and message conditions
What the team inbox plugin needs, kept general for other plugins:

- `api.ui.setListFilters`: keyword filters drawn as chips in the list
  header of the folders they apply to (by account kind and folder
  role). A chip the user turns on is ANDed into the folder's query and
  comes off with one click; a keyword change a filter tests loads the
  list again (ui:message-list).
- Actions get `accounts`, `hasKeyword` and `notKeyword`, so a button
  shows only on messages of group accounts, or of a keyword state; the
  click of message-row-actions and reader-actions carries the message's
  `accountId`.
- `api.email.updateKeywords`: several keywords in one change, through
  the list for a listed message (email:write).
- `api.user.getSelf`, `getMailAccounts` and `findPeople`: the user's own
  account id (Stalwart's principal id), which accounts are group
  accounts, and people from the directory (account:read).
- `api.accountData`: a plugin's own entry in a mail account's shared
  Inbox metadata on Stalwart 1.0 (email:read / email:write).
- Row badges take an `icon`.
2026-10-28 06:39:57 +01:00
Linus Rath 687cd89346 Merge branch 'feat/org-external' into feat/org-features
# Conflicts:
#	lib/outgoing/quick-reply.ts
#	lib/outgoing/send-pipeline.ts
2026-10-28 05:46:11 +01:00
Linus Rath 823da8c810 Merge branch 'feat/org-features' into feat/org-external
# Conflicts:
#	components/email/email-viewer.tsx
#	components/mail/mail-app.tsx
2026-10-28 05:19:21 +01:00
Linus Rath 2ace501871 Merge branch 'feat/org-features' into feat/org-signatures 2026-10-28 04:51:22 +01:00
Linus Rath 73c12d03eb fix: ask about every external recipient but the identity's own Bcc, trust only the identity's From, and queue a second question 2026-10-28 04:15:12 +01:00
Linus Rath 65e83e4b0d fix: show the session warning above every overlay and count the server's sign-in time 2026-10-28 03:53:56 +01:00
Linus Rath 6e5d8faec6 feat: refuse to restore or renew sessions older than the admin-set maximum length 2026-10-28 02:30:32 +01:00
Linus Rath 65e3d0d2d4 feat: let admins set an organisation signature with user details per domain or group #908
Admins write an HTML and a plain-text signature with placeholders on
Organisation > Signatures, per scope. Users fill in the details it asks
for once, under Settings > Account. Without a lock it is the default for
addresses without a signature of their own; locked or hidden, it
replaces every signature.

- `lib/org-signature.ts` fills the templates: values escaped, lines whose
  placeholders are all empty dropped
- the composer applies it right before the plugin signature, so new mail,
  replies, forwards, re-opened drafts, plain text and identity swaps all
  take it the way they take an identity signature; quick reply too
- a send finaliser puts a locked signature back once when it was deleted
- the identity editor shows the filled-in signature read-only with "Set
  by your organisation" when locked, and no editor when hidden
- `signatureDetails` is a synced setting
2026-10-28 02:23:55 +01:00
Linus Rath 45cc6988e0 feat: sign out after an admin-set idle time or session length, with a warning first 2026-10-28 02:18:07 +01:00
Linus Rath 2855ca0010 feat: confirm before sending to recipients outside the organisation 2026-10-28 01:59:13 +01:00
Linus Rath 084cf3cf3a fix: fetch the policy again only for an account of a domain it doesn't cover 2026-10-28 01:08:56 +01:00
Linus Rath d19095fafe feat: fetch the policy again when an account from another domain is added 2026-10-28 00:35:00 +01:00
Linus Rath 4b69f1307f feat: let admins scope the user policy per domain or group 2026-10-28 00:29:02 +01:00
Linus Rath ec295ad59f Merge pull request #1384 from VasilisNtovolos/fix/bulk-delete-partial-results
fix: reconcile confirmed permanent bulk deletions
2026-10-27 23:14:11 +01:00
Linus Rath 73015c7d0e Merge pull request #1380 from HOLOEYE-JZ/fix/task-fetch-race
fix: keep one account's tasks out of another's task list
2026-10-27 23:14:05 +01:00
Linus Rath 011ff0e93a feat: warn before sending a message with unfilled placeholders 2026-10-27 22:30:33 +01:00
VasilisNtovolos fb52770b58 test: register source clients in cross-account deletion tests 2026-10-27 15:39:48 +02:00
VasilisNtovolos ac99c68ef3 fix: reconcile confirmed permanent bulk deletions 2026-10-27 14:51:38 +02:00
Jacob ZeitzandClaude Opus 5.5 1509e8c799 fix: keep one account's tasks out of another's task list
The task store was not cleared on an account switch, unlike the calendar,
contacts and the other account-scoped stores, so the next account showed
the previous one's tasks until its own arrived. And a fetch answered after
a later one had started still wrote its list: the outgoing account's
answer could put its tasks back after the switch, and an older answer
could replace a newer one.

clearAllStores now clears the tasks, and each fetch gets a number: only
the latest one's answer or error is kept, and clearing drops the fetches
still under way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 10:31:54 +01:00
Linus Rath aa860e5a85 fix: sign in to Bulwark Lite with password and TOTP on Stalwart 1.0 2026-10-26 20:27:16 +01:00
Linus Rath e5f9099658 fix: show new mail of a group or shared account in the unified inbox without a click #1350 2026-10-26 20:01:11 +01:00
Linus Rath 9de2efb722 fix: open a shared or group account's message from its link instead of the own message with the same id #1351 2026-10-26 20:01:11 +01:00
Linus Rath 613451dfef fix: keep loading older mail when a saved or refreshed list has no total from the server #1364 2026-10-26 20:01:09 +01:00
Linus Rath 87d0bbeb01 fix: show a calendar that appears after the first load instead of leaving it unticked #1372 2026-10-26 20:01:08 +01:00
Linus Rath 2f8b4863ff Merge pull request #1338 from HOLOEYE-JZ/feat/plugin-search-results 2026-10-26 19:32:56 +01:00
Linus Rath e99cce05fe Merge pull request #1370 from maxhaomh/feat/disable-quick-reply 2026-10-26 19:24:49 +01:00
Max Hao 7216089629 feat: add quick reply feature with toggle in settings and tests 2026-10-26 11:40:47 -04:00
Linus Rath 89be5f1e5b fix: keep every calendar hidden after reload when the user hid them all 2026-10-26 16:13:52 +01:00
Linus Rath 0b917d6262 fix: mark the replied, forwarded or receipted message as answered in its own account, not another account's message with the same id 2026-10-26 16:11:52 +01:00
Linus Rath ea6d414e5b fix: show the scheduled badge and its buttons only on the scheduled message, not on another account's message with the same id 2026-10-26 16:11:51 +01:00
Linus Rath acac3128bc fix: archive and delete a message from its own account's folders in tag and unified views 2026-10-26 16:11:51 +01:00
Linus Rath d72bff95f9 fix: stop acting on a message of a signed-out account through the active account 2026-10-26 16:11:51 +01:00
Linus Rath 87701c8c20 fix: keep the calendars shown or hidden in the Pro interface as the user set them 2026-10-26 15:15:58 +01:00
Linus Rath 2e9bb56071 fix: apply a subscribed calendar feed's changes to events it still carries 2026-10-26 15:15:58 +01:00
Linus Rath f829d4a2e8 fix: ask the next user again before running plugins installed by someone who signed out 2026-10-26 15:15:58 +01:00
Linus Rath abef4224b5 fix: switch to the remaining account on sign-out instead of signing out of all when it was signed in before the page loaded 2026-10-26 14:58:31 +01:00
Linus RathandAlmost-Senseless-Coder b88397dfd2 fix: renew a background OAuth account with its own token instead of the active account's #989
Co-authored-by: Almost-Senseless-Coder <109462027+Almost-Senseless-Coder@users.noreply.github.com>
2026-10-26 14:58:31 +01:00
Linus Rath e314e56661 fix: keep the own and a group's scheduled mail apart when their ids are the same 2026-10-26 12:26:58 +01:00
Linus Rath 292ccce9ee fix: delete, move and change groups of another signed-in account's contacts in that account 2026-10-26 12:25:31 +01:00
Linus Rath 4cfdc877d1 fix: keep a contact created in a shared address book from being mistaken for an own contact with the same id 2026-10-26 12:25:31 +01:00
Linus Rath cd2bcc0520 fix: load the calendar range once, not twice, after creating a recurring event 2026-10-26 12:25:31 +01:00
Linus Rath 33c5ca8125 test: check bulk moves against the per-login routing 2026-10-26 12:25:09 +01:00
Linus Rath 72e5af2c52 fix: take a shared folder's Trash from the viewed folder list when bulk deleting 2026-10-26 12:25:09 +01:00
Linus Rath 88b960d605 fix: stop deleting the active account's mail after removing the account whose folder is open 2026-10-26 12:25:08 +01:00
Linus Rath eeb6ccc4db fix: create each account's Archive when bulk archiving in the unified inbox 2026-10-26 12:25:08 +01:00
Linus Rath f9ccc6adf1 fix: clear the refresh token of an OAuth account that could not be restored 2026-10-26 11:33:37 +01:00
Linus Rath 680742c3ef fix: end a password and TOTP sign-in without remember me with the browser session 2026-10-26 11:33:37 +01:00
Linus Rath e762943f7b fix: let a plugin move a single message that is not in the open list 2026-10-26 11:29:37 +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
Jacob ZeitzandClaude Opus 5.5 d02988f431 feat: show the results plugins provide through onProvideSearchResults
The hook was called on every search, but nothing showed its entries,
the list waited for it, and an entry's onClick could not cross from the
plugin's sandbox. Its entries are now drawn as a block above the
search's message list, a group per plugin and source.

Each plugin is asked on its own (HookBus.collect) beside the search, so
the list no longer waits, and the answer to a search that was replaced
is dropped. The answer is checked: at most 20 entries, a key and a
title, plain text cut to its limits. A click goes to the plugin that
gave the entry as onAction with surface "search-results", the entry's
key and the query; ExternalSearchResult loses onClick.

Closes #1336

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 15:22:33 +01:00