Commit Graph
60 Commits
Author SHA1 Message Date
Linus Rath b22968a7df fix: show the message list, not only the reader, with a large browser text size and wrap cut-off labels 2026-10-29 19:38:45 +01:00
Linus Rath 693687dc0b fix: show a contact's copy and compose buttons on keyboard focus and touch 2026-10-29 17:53:51 +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 38720f2d43 feat: print contact lists, contacts, groups and directory entries from Print or Ctrl+P 2026-10-28 21:08:21 +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 ac5596165a fix: show only the app's own message for a wrong address in the contact form, without the browser bubble over it 2026-10-28 13:05:43 +01:00
Linus Rath 2f790a2d75 fix: keep toasts above the Save and Cancel buttons of the contact and group forms 2026-10-28 10:43:55 +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 cb4f4c9168 fix: add the open contact to the selection on Ctrl+click and Shift+click in Contacts 2026-10-28 10:14:19 +01:00
Linus Rath bae76bcc4e fix: keep a category typed without Enter when the contact is saved 2026-10-28 10:09:57 +01:00
Linus Rath 330627cec1 fix: name the contact or group in the delete confirm and say what is lost 2026-10-28 10:04:42 +01:00
Linus Rath b882d4b4de fix: say Moving, not Adding, in the Move to address book dialog 2026-10-28 09:56:39 +01:00
Linus Rath 6c63b6f5b8 fix: name the group delete entry Delete group in the sidebar menu too 2026-10-28 09:50:36 +01:00
Linus Rath 5f34700553 fix: stop the React warning about isPressed on every Contacts visit 2026-10-28 09:48:43 +01:00
Linus Rath aad2e01777 fix: print a contact even when the browser blocks pop-ups 2026-10-28 06:10:27 +01:00
Linus Rath 84093be964 fix: one word per action and sentence case in Contacts and Files, "Couldn't …" error titles, and "Address book" in the contact form 2026-10-28 05:42:37 +01:00
Linus Rath 15446aa0b6 fix: say when duplicating a contact fails, and why a folder rename failed 2026-10-28 05:22:46 +01:00
Linus Rath b7d68191dd fix: keep accented names in vCard file names, show an imported card's own name, stop starring both name fields, and compose from Contacts without asking for an account 2026-10-28 05:20:37 +01:00
Linus Rath b540b68706 fix: tell an empty address book from an empty account, offer Import there, and use one empty state in Contacts and Files 2026-10-28 05:09:04 +01:00
Linus Rath 083bb1f6bc fix: put New group, Import and Refresh in the phone header menu of Contacts and Files 2026-10-28 05:04:13 +01:00
Linus Rath 26aef32786 fix: show the same actions in the same order in every menu of a contact, group or folder 2026-10-28 04:57:25 +01:00
Linus Rath 1748b5329b fix: name every icon button in Contacts and the file preview for screen readers 2026-10-28 04:34:08 +01:00
Linus Rath 6f371deaa7 fix: show contact dates, print headings and the disabled notice in the app's language 2026-10-28 04:28:09 +01:00
Linus Rath e53578454a feat: list the Contacts and Files keys under ? and add their commands to the command palette 2026-10-28 04:20:48 +01:00
Linus Rath a826214545 fix: show a new or duplicated contact after saving instead of an empty pane 2026-10-28 04:12:58 +01:00
Linus Rath 49b6405435 fix: give Contacts a create button and long-press menus on the phone, like Mail and Files 2026-10-28 04:09:08 +01:00
Linus Rath 57b7405ba0 fix: move through the contact list with the keyboard: arrows, Enter, Space, Ctrl+A, Delete, Escape and / 2026-10-28 04:06:03 +01:00
Linus Rath 754dbf56dc fix: reach address book, category and group actions by ⋮, long-press and keyboard, move contacts with Move to…, and delete categories 2026-10-28 03:59:25 +01:00
Linus Rath 02ce389140 fix: make rename, new folder, address book and import dialogs close on Escape, keep focus and select the name 2026-10-28 03:20:09 +01:00
Linus Rath f6e4aaa254 fix: start the new group with the selected contacts when Add to group finds no group 2026-10-28 03:12:17 +01:00
Linus Rath 2e86f7af07 fix: open the composer from a contact's right-click Send email instead of leaving the app 2026-10-28 03:08:21 +01:00
Linus Rath 5447c40b7b fix: ask before leaving a contact or group form with unsaved changes 2026-10-28 03:04:40 +01:00
Linus Rath fdc3535c7b fix: close the Contacts and Files drawer when you pick something in it 2026-10-28 02:43:58 +01:00
Linus Rath 893696791d fix: keep the hidden Contacts and Files sidebar from covering the nav rail on tablets 2026-10-28 02:40:48 +01:00
Linus Rath dcde570ebe fix: say the directory can't be browsed instead of that a refresh failed when the server lists only the people you know 2026-10-26 12:25:32 +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
Linus RathandFrench-Asgeir 7163a5dcc1 fix: translate contact field types and more French strings
Co-authored-by: French-Asgeir <109287366+French-Asgeir@users.noreply.github.com>
2026-10-18 14:19:07 +02:00
Linus Rath 964626794b feat: browse the company directory in contacts and the composer #1253 2026-10-16 20:46:27 +02:00
Linus Rath 41a0716c50 Merge branch 'main' into feat/stalwart-1.0 2026-10-16 01:41:48 +02:00
Linus Rath 5e71c22f56 feat: let plugins add a section to contact details and buttons for selected contacts 2026-10-14 04:46:08 +02:00
Linus Rath 8ec7dc54ab feat: tell plugins when contacts are opened, selected, moved or imported and when groups change 2026-10-14 03:27:50 +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 6d518f1849 fix(contacts): show placeholders instead of "No contacts yet" while contacts load 2026-10-11 17:20:43 +02:00
Linus Rath 6bd55c9501 fix: export contact photos in batches on Stalwart 1.0
On 1.0 a vCard export sent every blob photo through the avatar download
queue, a burst of 40 and then 6 a second, two at a time: about 160 s for
1000 photos. Avatars and print (which gives up after 5 s) waited behind
it, the Export button showed nothing, and a second click started the
whole export again.

- Export fetches the blob media of all cards with Blob/get
  (`data:asBase64`), asking for the sizes first and packing the requests
  to about 4 MiB. `urn:ietf:params:jmap:blob` goes into `using` only
  when the session advertises it; without it, or when a request is
  refused, the rest is downloaded one by one behind avatars and print,
  which keep half of the download burst for themselves.
- The export buttons in the settings, the bulk bar, the context menu and
  the detail menu show that an export is running and ignore clicks until
  it is done.
- When the photo changes, the form rebuilds `media` on the card as the
  server has it now. A logo or sound blobId from the list's older copy
  made 1.0 refuse the whole update ("The following blobIds do not exist
  or are not accessible").
- A new photo takes the key, place, `pref`, `label` and `contexts` of the
  one it replaces, so it stays the photo shown on cards with several.
  Removing the photo removes every photo the card had instead of only the
  shown one, which brought up the next; logos and sounds stay.
- A card whose login has no client downloads nothing, instead of asking
  the active login's server and remembering the refusal for two minutes.
- Photo downloads run at half the server's `maxConcurrentRequests`
  instead of a fixed two.
- `invalidProperties` naming `media/...` also counts as a refused blobId
  in media, not only `media` itself.
2026-09-25 20:05:19 +02:00
Linus Rath c23e306789 fix: show and keep contact photos on Stalwart 1.0
Stalwart 1.0 returns every photo, logo and sound in a contact card as a
blobId without a uri, including every photo Bulwark saved as a data:
URI. Bulwark read only `uri`, so avatars, the contact list and detail,
print, vCard export and the "has photo" filter showed nothing, and the
form sent `media` without the photo on every save, so editing a phone
number deleted the photo on the server.

- `ContactMedia` carries `blobId`, `label`, `pref` and `contexts`; `uri`
  is optional, and `getContactPhotoRef`/`hasContactPhoto` read both.
- Blob photos are downloaded once each, at most two at a time and at a
  paced rate, only while on screen, into an LRU of object URLs revoked
  on eviction, account switch and logout. They share Stalwart's
  per-account budget of 4 concurrent requests and 1000 a minute.
- Avatars look senders up in an index built once per contact list.
- The form leaves `media` out unless the photo changed, and otherwise
  passes the other entries through as the server returned them.
- A new photo is uploaded into the user's own account and sent as a
  blobId where the blob capability lists ContactCard (1.0). 0.16 refuses
  blobIds in media and keeps getting a data: URI; a refusal at runtime
  falls back the same way for the rest of the session.
- Print and vCard export download blob media first; duplicate and
  cross-account move send the bytes instead of the source's blobIds.
- vCard export also writes photos whose data: URI names no media type
  (`data:;base64,`, `data:base64,`), which it dropped before.
2026-09-25 17:35:56 +02:00
Linus Rath fb24ef5d24 feat: sort contacts by last name #963 2026-09-09 19:47:33 +02:00
Linus Rath a210b22e49 fix: set name.full on all contact write paths so vCards carry mandatory FN #430 2026-08-31 23:53:24 +02:00
Linus Rath 1807b2df6b feat: allow setting an address book as default (#924) 2026-08-29 17:15:50 +02:00
Linus Rath e659fe3d38 feat: allow contact cards for organizations #701 2026-07-30 19:44:36 +02:00
Kristofer Pettijohn babacca482 fix(contacts): clear photo on server by sending media: null when removed 2026-07-04 14:59:06 +02:00