Commit Graph
2550 Commits
Author SHA1 Message Date
Linus Rath 81f8bf6d60 feat: save a document edited in its program back into Files, and ask Keep both or Replace when it changed there meanwhile 2026-11-04 13:56:15 +01:00
Linus Rath b70ab8a50c feat: upload files dropped on the Files screen without asking, and add several .ics or .vcf in one import 2026-11-04 13:56:09 +01:00
Linus Rath 49286649dd Merge branch 'feat/do-ux-p2-settings-fix' into feat/do-ux-p2-pim-fix
# Conflicts:
#	components/settings/__tests__/notification-settings.test.tsx
2026-11-04 13:27:06 +01:00
Linus Rath 0b16295b45 Merge branch 'feat/desktop-offline' into feat/do-ux-p2-desktop-fix 2026-11-04 13:07:35 +01:00
Linus Rath b1ae1cc8c5 Merge branch 'feat/desktop-offline' into feat/do-ux-p2-settings-fix
# Conflicts:
#	components/calendar/event-modal.tsx
#	components/calendar/task-list-view.tsx
#	components/calendar/task-modal.tsx
#	components/email/calendar-invitation-banner.tsx
2026-11-04 12:56:40 +01:00
Linus Rath 60c7efad10 fix: call the default calendar and address book "Calendar" and "Contacts" everywhere, as Settings does
Stalwart names them "Stalwart Calendar (<address>)" and "Stalwart
Address Book (<address>)". Settings already showed plain names; the
sidebars, pickers, the event and task editors, invitations, print and
confirm texts now use the same helper. A colleague's shared default keeps
whose it is. Two test fixtures used Stalwart's default name for a long or
own book name and now use a name the user chose, since a default name is
no longer shown as is.
2026-11-04 12:51:03 +01:00
Linus Rath 07b6cae9e8 fix: call the unread count the taskbar icon's in the desktop app, and write "Not sent:" with a colon 2026-11-04 12:50:52 +01:00
Linus Rath 7186f89de7 test: check the desktop menus get File > Unlock in the app's language 2026-11-04 12:44:04 +01:00
Linus Rath b7686552a3 fix: translate File > Unlock in the desktop app's menus 2026-11-04 12:43:18 +01:00
Linus Rath 98f814fced fix: open a mail link from another program from the default account with no question, and drop "protocol link" from the account picker 2026-11-04 12:42:30 +01:00
Linus Rath badbd616df Merge branch 'feat/do-ux-p2-settings-search' into feat/do-ux-p2-settings-fix 2026-11-04 12:39:59 +01:00
Linus Rath 641489775b Merge branch 'feat/do-ux-p2-settings-ident' into feat/do-ux-p2-settings-fix 2026-11-04 12:39:57 +01:00
Linus Rath 01f2860613 feat: edit each address's signature right on the Composing settings page 2026-11-04 12:39:11 +01:00
Linus Rath 3a2be9a7d4 fix: edit the name recipients see on the Account page and stop cutting account addresses
Settings > Account had a "Display name" that edited Stalwart's account
description, while mail went out with the identity's name, so changing
it changed nothing people saw. The page now shows "Your name", the
primary address's name, and saves it to that identity. The account
switcher and avatars take the same name; the principal description is
only used for an account without an identity name. The address editor
calls the field "Your name" too, and "identities" are "addresses" in
the Account section and its dialog, said once instead of twice.

Logged-in accounts show the server only for an account in trouble or
one sharing its address with another, with no drag hint or arrows for a
single account. The switcher wraps addresses instead of cutting them and
has no remove button per row; an account you're not in is removed from
Settings > Account.

Changed tests: auth-store-display-name now expects the identity name to
win over the principal; account-switcher-remove expects no remove
button on the rows; settings-editors-unsaved uses the renamed "Add
address" button and the "Your name" label, which has no placeholder.
2026-11-04 12:38:38 +01:00
Linus Rath 4b426e1469 fix: find the desktop app's own settings in search, and drop browser words from its pages
Settings search knew none of the desktop app's rows, short words matched
a dozen descriptions, and the app's Notifications, Privacy and Backup
pages talked about websites, browsers and Safari.

- Search indexes the app's rows when its bridge is there (tray, start at
  sign-in, menu bar, quiet hours, taskbar, default mail app, updates,
  developer tools, usage info, crash reports) with translated synonyms,
  and the browser-only push rows only in a browser. New synonyms for
  threads, block images, dark mode, timezone, reading pane, week start,
  empty trash and quiet hours. A single word of up to five letters looks
  only in names and synonyms, so "about" finds About.
- In the app, Notifications has no push relay section; one row says the
  app tells about new mail while it runs, with a link to General. Its
  taskbar and quiet hours section is "On this computer". Privacy has no
  relay link there, Backup says "other devices".
- In a browser that can't push, two sentences, and the home screen hint
  only on iPhone and iPad.
- Several accounts get one notification switch each instead of a
  checklist with "Enable for selected" and "Disable for selected".
- Developer tools show only with advanced settings on.
- "Two-step sign-in" heads its section, "Pictures from company websites"
  replaces "Sender favicons", the Privacy relay link no longer points to
  a hidden choice, Offline warns about disk encryption once, and the
  reset confirm says what stays and whether other devices change. A
  reset keeps the choice to sync settings.

Changed assertions: account-security-signin looks for the heading by its
new name, settings-search expects the renamed rows, multi-account-push
tests the switches that replace the checklist.
2026-11-04 12:38:35 +01:00
Linus Rath 03ea1ab1aa fix: open files sent from Explorer's Send to and Open with in a compose window, leaving the main window where it is 2026-11-04 12:32:54 +01:00
Linus Rath df62335545 feat: name the desktop app's windows in the Window menu by folder and account, subject or New message 2026-11-04 12:25:33 +01:00
Linus Rath 5e34dc59ab fix: name keys in the app's language in menus, hints and the shortcut help (Strg, Umschalt, Entf in German) 2026-11-04 12:09:08 +01:00
Linus Rath 4333cc4080 fix: find time zones by abbreviation and list the exact offset first 2026-11-04 12:04:32 +01:00
Linus Rath a2edb10e93 docs: list Ctrl+F for Forward in the desktop app's shortcut help 2026-11-04 12:04:15 +01:00
Linus Rath 39e43de51e fix: offer to apply a filter rule to the Inbox from its dialog, not a passing toast 2026-11-04 12:04:01 +01:00
Linus Rath 3be99a4bf7 fix: count an event's length on its own clock across a daylight-saving switch 2026-11-04 12:01:27 +01:00
Linus Rath 5f450c6945 fix: keep the work or home mark of a second address in Google's older contacts CSV 2026-11-04 11:40:09 +01:00
Linus Rath 4e662d8a60 fix: give "Show the app" a key the composer doesn't use, and refuse the app's own keys for global shortcuts 2026-11-04 11:29:34 +01:00
Linus Rath b17f36d7ba fix: show the tray's next event in the app's time format 2026-11-04 11:26:58 +01:00
Linus Rath 3f4a1365f8 fix: keep the window's buttons clear of the app's after a maximise, restore, snap or resize 2026-11-04 11:11:36 +01:00
Linus Rath a415db9bac Merge branch 'feat/desktop-offline' into feat/do-ux-pim-fixes
# Conflicts:
#	stores/settings-store.ts
2026-11-04 11:10:15 +01:00
Linus Rath b8e9d76f0e Merge branch 'feat/do-ux-pim-menu' into feat/do-ux-pim-fixes 2026-11-04 11:09:47 +01:00
Linus Rath c08e9e56fb Merge branch 'feat/do-ux-pim-files' into feat/do-ux-pim-fixes 2026-11-04 11:09:45 +01:00
Linus Rath 71abb5216f Merge branch 'feat/do-ux-pim-cimport' into feat/do-ux-pim-fixes
# Conflicts:
#	components/contacts/contact-list.tsx
#	components/contacts/contacts-app.tsx
2026-11-04 11:09:40 +01:00
Linus Rath 2cb70d475e Merge branch 'feat/do-ux-pim-contact' into feat/do-ux-pim-fixes 2026-11-04 11:09:24 +01:00
Linus Rath e25d3e1e56 fix: keep a contact's address as stored when other fields change, and lay addresses out by country 2026-11-04 11:06:40 +01:00
Linus Rath b04292ff4d feat: merge duplicate contacts and list possible duplicates
The contact menus offered "Duplicate", which made more copies. They now
offer "Merge with…", the selection bar has "Merge…" for two or more
contacts, and a "Possible duplicates (n)" line over the list opens a view
that groups cards with the same name, email address or phone. The test
that expected "Duplicate" in both menus now expects "Merge with…", and
the test for a failed duplicate became tests for merging.
2026-11-04 11:02:52 +01:00
Linus Rath e5dc1dd247 feat: ask Replace, Keep both or Skip when an upload's name exists in Files
An upload over a name that is taken in the target folder used to add
"name (1)" without a word. Every upload path (picker, drag and drop, the
drop overlay, folder upload) now asks per name, with "Do this for all n
conflicts" when there are several:
- Replace gives the existing node the new blob, so it keeps its id,
  shares and links; for a folder it merges into the existing one and
  replaces files of the same name.
- Keep both numbers the new one, as before.
- Skip leaves it out; Cancel stops the whole upload.

Also in Files:
- A file with no preview and no office editor opens a pane with its
  icon, size and Download instead of downloading at once, and in the
  desktop app also Open in default app (the attachment Edit path). The
  item menu gets Open for such files, and Open in default app in the
  desktop app.
- Enter opens the row Tab put the focus on.
- After sharing with someone new, a toast offers Send a message, which
  opens the composer to them with a link to the file.
- The empty folder's buttons read Upload files... and New folder..., as
  the menus do.
2026-11-04 11:01:25 +01:00
Linus Rath 0c022459d2 feat: import contacts from Outlook and Google CSV files into the address book you choose 2026-11-04 10:57:56 +01:00
Linus Rath 409c7110c0 feat: mark unanswered invitations in the calendar grid and answer them from it 2026-11-04 10:57:13 +01:00
Linus Rath 7c7800c639 fix: write the week title and other date ranges the way each language does 2026-11-04 10:55:56 +01:00
Linus Rath 22903cdfc0 feat: search the screen you're on and import calendars and contacts from the desktop app's menus 2026-11-04 10:51:19 +01:00
Linus Rath d783981373 Merge branch 'feat/desktop-offline' into feat/do-ux-pim-fixes
The settings pass hid each calendar's CalDAV address behind "Use in
other apps"; pim-26 lists the address once per account. The list now
waits behind one "Use in other apps" button, and the wording test
clicks the new Edit… button instead of the old pencil.
2026-11-04 10:09:03 +01:00
Linus Rath a1673dd77a Merge branch 'feat/desktop-offline' into feat/do-ux-compose-fixes 2026-11-04 09:59:11 +01:00
Linus Rath a2559713e9 test: compare the plugin kit's text area with the signature editor it now copies 2026-11-04 09:55:40 +01:00
Linus Rath 989385f4f6 Merge branch 'feat/desktop-offline' into feat/do-ux-compose-fixes
# Conflicts:
#	components/email/email-viewer.tsx
#	components/settings/accessibility-settings.tsx
#	lib/__tests__/settings-search.test.ts
#	lib/settings-search.ts
2026-11-04 09:54:25 +01:00
Linus Rath aa62855759 Merge branch 'feat/do-ux-settings-fixes' into feat/desktop-offline
# Conflicts:
#	components/layout/__tests__/account-switcher-mountain-view.test.tsx
#	components/layout/account-switcher.tsx
#	components/settings/accessibility-settings.tsx
#	components/settings/reading-settings.tsx
2026-11-04 09:44:51 +01:00
Linus Rath 3134205260 fix: show an invitation's date once, its zone only when it differs, and the answer once given
Changed assertions: the schedule tests in calendar-invitation.test now
expect Intl's range format ("Tue, Oct 20, 16:00 – 16:25") with the
event's own times after it when its zone's clock differs, instead of
the repeated date and "GMT+2". The banner test's next-intl mock gets
useLocale.
2026-11-04 09:35:37 +01:00
Linus Rath f607f48bf2 fix: keep events in their own time zone and ask for the time first in the event form
Saving an event wrote it in the user's zone, so a title change moved a
New York meeting to Europe/Berlin. The form now shows and saves the
times on the event's own clock, with a time zone field ("Time zone: New
York", or a "Time zone" link when it is yours), and the popover shows
"10:00–11:00 New York (16:00–17:00 your time)". The form asks for the
date and time right after the title and for the description last.
Participant answers read in plain words ("Not answered yet"), the
untitled preview is translated, and the quick editor grows to fit long
calendar names.

Changed assertions: rsvp-buttons.test expects the plain status key, and
event-modal-organizer.test expects an unchanged save to keep the event's
New York zone instead of rewriting it into the user's.
2026-11-04 09:35:22 +01:00
Linus Rath 4a764150b2 Merge branch 'feat/desktop-offline' into feat/do-ux-settings-fixes 2026-11-04 09:22:44 +01:00
Linus Rath ceaceb7f2a Merge branch 'feat/desktop-offline' into feat/do-ux-compose-fixes
# Conflicts:
#	components/email/email-composer.tsx
#	components/email/email-viewer.tsx
#	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/et/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/th/common.json
#	locales/tr/common.json
#	locales/uk/common.json
#	locales/vi/common.json
#	locales/zh-TW/common.json
#	locales/zh/common.json
2026-11-04 09:20:50 +01:00
Linus Rath a0dca05585 test: keep single letters out of the composer's shortcut list 2026-11-04 09:13:46 +01:00
Linus Rath 2ca4946c6e feat: add Ctrl+K for a link, Ctrl+S to save the draft and Ctrl+Shift+C or B for Cc and Bcc in the composer 2026-11-04 09:13:05 +01:00
Linus Rath fcc9fc0cc0 Merge branch 'feat/desktop-offline' into feat/do-ux-mail-fixes
# Conflicts:
#	components/email/email-viewer.tsx
#	components/mail/mail-app.tsx
#	components/offline/offline-host.tsx
#	components/ui/welcome-banner.tsx
#	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/et/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/th/common.json
#	locales/tr/common.json
#	locales/uk/common.json
#	locales/vi/common.json
#	locales/zh-TW/common.json
#	locales/zh/common.json
2026-11-04 09:11:09 +01:00