Commit Graph
1611 Commits
Author SHA1 Message Date
Jacob Zeitz 03876158fe feat(plugins): hold the search results block's place while a plugin still searches
A plugin's results to a search came all at once after its handler answered,
with nothing before: the block then appeared above the message list and
pushed it down, under a pointer about to click a row. onProvideSearchResults
handlers that search elsewhere (a CRM's search by meaning) take seconds.

Each plugin's answer now shows as it comes, and the store keeps the plugins
still asked. One that has not answered after 300 ms gets the block at a fixed
height with placeholder rows under "Searching for more results…"; its
entries then fill that height, so the list moves once, with its own results.
A plugin that answers at once (one not searching for this query) shows
nothing.
2026-10-29 10:25:59 +01:00
Linus Rath 63375f6870 Merge pull request #1410 from motofix/fix/1407-vcard-4-export
fix: export contacts as valid vCard 4.0 #1407
2026-10-29 00:13:30 +01:00
Linus Rath e3cd9546fc fix: stop Safari's login dialog in Lite on Stalwart when the access token expired #1396 2026-10-29 00:05:50 +01:00
Linus Rath f12a13e1fd feat: create documents in the formats the document editor can edit from New file #1393 2026-10-29 00:01:13 +01:00
Linus Rath 8b35962efb fix: show section labels in sentence case instead of all caps 2026-10-28 22:26:39 +01:00
Linus Rath 0d3916cfcc feat: add a light event colors setting that shows calendar events tinted with a color bar, as in Outlook 2026-10-28 21:50:47 +01:00
Linus Rath d5bf6b98c4 feat: print the calendar's month, week, day, agenda, tasks and single events 2026-10-28 21:08:20 +01:00
Linus Rath 2b24b4503f fix: load shared accounts' folders in batched, parallel requests #1409 2026-10-28 19:15:51 +01:00
Julien Béti a3fdd72763 fix: export contacts as valid vCard 4.0 #1407
The export declared VERSION:3.0 but wrote vCard 4.0 syntax, and wrote the JSContact phone feature \"mobile\" as TYPE=MOBILE, which is no vCard type, so importers dropped such numbers.

- Declare VERSION:4.0 and write 4.0 throughout: basic-format dates and timestamps, data: URIs for inline media, VALUE=text for a UID or RELATED that is no URI, geo: URIs, lines folded at 75 octets, CRLF after every line, and the webmail's own PRODID.
- Map "mobile" to CELL and back; MAIN-NUMBER and x- types are kept.
- Write N before FN: some importers ignore the name otherwise.
- The contact form stores mobile phones as "mobile" (RFC 9553) and still reads the "cell" it used to write.
2026-10-28 17:27:07 +01:00
Linus Rath 8108249a35 Merge pull request #1406 from HOLOEYE-JZ/feat/plugin-ui-navigate
# Conflicts:
#	app/(main)/[locale]/layout.tsx
2026-10-28 17:02:42 +01:00
Linus Rath 935f48c450 Merge pull request #1399 from lucamzanon/perf/tag-counts-keyword-get 2026-10-28 17:02:23 +01:00
Linus Rath fba04d2251 Merge pull request #1401 from lucamzanon/perf/keepalive-while-push-healthy 2026-10-28 17:02:23 +01:00
Linus Rath 3f71bbedee test: allow JMAP Metadata only in the Bulwark metadata adapter, now that Stalwart v1.0.0 implements it 2026-10-28 15:14:49 +01:00
Linus Rath 96797597c5 Merge branch 'main' into feat/org-features 2026-10-28 15:14:34 +01:00
Jacob Zeitz ba45d0f8b9 feat(plugins): api.ui.openPage moves the tab to one of the plugin's own pages 2026-10-28 13:50:12 +01:00
Linus Rath fdd00ac639 Merge branch 'ux/final-ccs' 2026-10-28 13:24:08 +01:00
Linus Rath 0c5ed0c606 fix: show the lite 404 page in the language of its address, right to left for arabic, hebrew and persian 2026-10-28 13:09:30 +01:00
Linus Rath a2877173a1 fix: drop the admin save bar when a field is put back to its saved value, empty included 2026-10-28 12:52:23 +01:00
Linus Rath 382b26f128 fix: ask before the rail or the mountain view top bar leaves an event or task with unsaved changes 2026-10-28 12:50:59 +01:00
Linus Rath 2bb63f648b fix: keep the phone conversation's reply buttons readable and count its messages with each language's plural forms 2026-10-28 12:46:18 +01:00
Linus Rath 8fb4e51dc5 fix: end mail menu items in an ellipsis only where they open a dialog, drop the key hint and say Report spam on the reader button in every language 2026-10-28 12:42:22 +01:00
Linus Rath 106d16e9f5 fix: keep the mail search placeholder short enough to show in full in every language 2026-10-28 12:37:26 +01:00
Linus Rath 8597858865 fix: bring mail back to its list after the tour on phones instead of an empty reading pane 2026-10-28 12:34:27 +01:00
Linus Rath e654eadd37 Merge branch 'main' into ux/mail3 2026-10-28 11:10:56 +01:00
Linus Rath 0eb68f1743 Merge branch 'ux/settings-admin2' 2026-10-28 11:06:39 +01:00
Linus Rath 9014dda3cb Merge branch 'ux/contacts-files2' 2026-10-28 11:04:04 +01:00
Linus Rath 94029e5aa2 fix: ask before the nav rail or the phone tab bar leaves a contact or group form with changes 2026-10-28 10:43:55 +01:00
Linus Rath f8a2d7821a fix: say when a rescheduled message goes out now after Reschedule 2026-10-28 10:35:53 +01:00
Linus Rath feac899133 fix: say "new calendar", "new app password", "new API key", "add public key", "sub-addressing" and "back to mail" in settings and the admin 2026-10-28 10:33:03 +01:00
Linus Rath 53c49143ec fix: drop the scheduled badge from a demo message once its send is cancelled 2026-10-28 10:29:26 +01:00
Linus Rath 039ed0598b fix: make Forward as attachment, Export as .eml and View source work in the demo 2026-10-28 10:23:20 +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 a9468929fd fix: say that address books and contact categories can be deleted in settings, not only renamed 2026-10-28 10:21:35 +01:00
Linus Rath 945fd219a7 fix: point the mail client hint to the app passwords section below it 2026-10-28 10:20:41 +01:00
Linus Rath 55fb5acef5 fix: keep a file's Modified time on move, Undo and restore in the demo 2026-10-28 10:19:46 +01:00
Linus Rath 9c2952c437 fix: take the tour to the screen of each step on a phone and count only the steps it shows 2026-10-28 10:19:13 +01:00
Linus Rath 62ab48aee4 fix: ask "discard changes?" with keep editing and discard in settings editors and the admin pages, as in calendar and contacts 2026-10-28 10:19:10 +01:00
Linus Rath cc46573524 fix: say "filters saved", "identity created" and "templates exported" without "successfully" 2026-10-28 10:13:14 +01:00
Linus Rath ce092ac1ab fix: stop adding blank lines to the external rules block on every filter save 2026-10-28 09:55:39 +01:00
Linus Rath 1322f6c3f0 fix: switch between demo accounts without the app crashing 2026-10-28 09:48:49 +01:00
Linus Rath 5d90a850bd Merge branch 'feat/org-recovery' into feat/org-features
# Conflicts:
#	components/email/email-list.tsx
2026-10-28 09:17:56 +01:00
lucamzanon 825f47caa1 perf: skip the keep-alive echo while the push stream is live
Every connected client sent a Core/echo every 30 seconds for as long as
the page was open, background tabs included: 120 requests an hour per
login, which on an otherwise idle night made up nearly all the traffic
a server saw. A client with an SSE stream already hears from the server
every 30 seconds, since the stream is opened with ping=30.

The keep-alive tick now skips the echo when the stream delivered an
event or a ping within the last 45 seconds and the previous echo did not
fail. A stream that goes quiet or drops lets the echo through again on
the next tick, so a lost connection is still reported and reconnected
as before, at most one tick later. Clients without a stream (no
eventSourceUrl, or over the per-tab stream budget) keep pinging every
30 seconds.
2026-10-28 09:15:36 +01:00
Linus Rath 272083399c Merge branch 'feat/org-tags' into feat/org-features
# Conflicts:
#	lib/admin/restriction-keys.ts
#	lib/jmap/client.ts
2026-10-28 09:15:17 +01:00
lucamzanon 15ec489178 perf: count tags with one Keyword/get on servers that count keywords
getTagCounts sends two Email/query per tag: 240 method calls for 120
tags, and the sidebar re-runs it after every push. A server that
advertises the keywords capability with supportsCounts already reports
each keyword's total and unread in Keyword/get, so the counts now come
from one call there, and from the queries as before everywhere else or
when that call fails.

Trash and Junk (#1156) are not subtracted on this path. Keyword/get has
no filter, and taking them out would need the two per-tag queries this
avoids. The counts are the server's own for the keyword; a gateway that
maps tags to provider labels reports what the provider shows for the
label.
2026-10-28 09:09:14 +01:00
Linus Rath f1a666777b Merge branch 'feat/org-features' into feat/org-recovery 2026-10-28 09:08:49 +01:00
Linus Rath 4d846cfc91 fix: read the whole deleted items archive newest first and only for the account shown #1319
Stalwart's x:ArchivedItem/query without calculateTotal scans ids
ascending, stops at 5000 and only then reverses them, so the newest
items of a large archive never showed, and admin accounts got every
account's items. The review of the branch also found gaps around
account switches, restores and focus.

- Read the archive in pages of 500 with calculateTotal, newest first,
  stop at a whole page older than the days limit, and offer
  "Show older" after 2000 items; detection asks for one item.
- Send the accountId filter and fall back without it on
  unsupportedFilter; keep only items of the account, never one without
  an account id.
- Ask nothing until config and policy are loaded and the policy is the
  current account's; the later check after a refusal is forced.
- Show the Trash link only when the archive holds a message inside the
  days limit; the Settings page shows whenever the server has the
  feature and says that archiving must be on in Stalwart.
- Restore: notFound leaves the list with a note, forbidden hides the
  page, results for another account are dropped, the button keeps focus.
- Forget what servers said at a full sign-out.
2026-10-28 09:08:44 +01:00
Linus Rath 3a03bc363b Merge branch 'feat/org-templates' into feat/org-features 2026-10-28 09:01:42 +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 e82679c3dc fix: name the admin section for deleted mail Recover deleted items, as users see it 2026-10-28 08:30:11 +01:00
Linus Rath 08f25506d4 Merge branch 'feat/org-teaminbox' into feat/org-features 2026-10-28 08:26:48 +01:00