Commit Graph
78 Commits
Author SHA1 Message Date
Steven RYDELL eda9c9c8bf fix: remove PWA service worker that breaks Stalwart /admin and /account mounts 2026-07-30 18:30:36 +02:00
Steven RYDELL 4e089d9b6b fix(appearance): keep Rounded corners preview curved in square mode 2026-07-30 18:09:51 +02:00
Steven RYDELLandClaude Sonnet 5 8b5b9c8f8e docs: add v1.0.9 CHANGELOG entry
Documents everything since the v1.0.8 entry: icon batches, the Web
Applications active-app info card, PWA support, Log Entries filters
and refresh button, Accounts list columns, the account-switch fixes
(reviewed against and aligned with upstream's own fix for the same
issue), the WebUI Fork rename, mailbox hierarchy, new color themes,
and the confirmed-backend-only limitations (Log filter properties,
exact-match-only text search across the admin API).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 17:51:04 +02:00
Steven RYDELLandClaude Sonnet 5 bd00b4e922 fix: persist active account across reload, remount views on switch
Aligns with upstream stalwartlabs/webui@189e270 (v1.0.7, "fixes #17"),
reviewed after they independently landed a fix for the same issue:

- authStore now persists activeAccountId (sessionStorage) and
  setSession preserves it across a session refresh instead of always
  resetting to primaryAccountId, so a hard reload keeps you on the
  group account you had selected instead of bouncing back to your own.
- switchAccount now clears cacheStore (displayNames/objectLists) when
  actually changing account, since those were resolved against the
  previous account and would otherwise show stale labels.
- The ErrorBoundary wrapping MainContent is now keyed on
  activeAccountId, forcing a full remount of every view on switch.
  This is more robust than gating individual components' fetch
  effects on activeAccountId (our earlier fix in DynamicList.tsx,
  kept as-is — harmless now, but no longer load-bearing on its own)
  since it covers every current and future view type, not just lists.

Verified against a live instance: switching to a group account updates
the JMAP accountId immediately (no tab switch needed), and a full page
reload keeps the group account active instead of resetting to admin.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 17:48:19 +02:00
Steven RYDELLandClaude Sonnet 5 8c1e826d63 feat: add Rose/Amber/Teal color themes, default to Ocean + Square
Adds three new color themes alongside the existing Stalwart/Ocean/
Forest/Violet set so more people can find one they like, and switches
the out-of-the-box defaults to Ocean + square corners instead of the
neutral Stalwart theme + rounded corners (existing users' saved
preferences are untouched, this only changes what a fresh install
starts with).

Verified in the browser: all three new themes render with legible
primary-foreground contrast in both light and dark mode, and the
pre-hydration flash-prevention script in main.tsx (which reads
localStorage before React mounts) now recognizes the new theme names.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 17:38:40 +02:00
Steven RYDELLandClaude Sonnet 5 7a96fa6786 feat: show mailbox hierarchy in the Mailboxes list
Fixes stalwartlabs/webui#16. Mailboxes had no visual indication of
parent/child relationships. Since a mailbox's parent can land on a
different server page than the mailbox itself, the Mailbox list now
always fetches the full set (like the existing client-filter path)
and orders it depth-first by parentId, then indents each row's name
with a corner connector proportional to its depth.

Verified against a live instance with a 3-level nested hierarchy
(Projects > Alpha > Docs) alongside the default flat mailboxes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 17:27:48 +02:00
Steven RYDELLandClaude Sonnet 5 3e08dcaff5 chore: rename WebUI label to "Stalwart WebUI Fork"
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 17:07:44 +02:00
Steven RYDELLandClaude Sonnet 5 2ac3526da9 fix: refresh account-scoped lists when switching accounts
Switching accounts via the profile dropdown (TopBar) only updates
authStore.activeAccountId with no navigation, but DynamicList's fetch
effect depended on [viewName, sort, resolved?.list, appliedFilters] —
missing activeAccountId, and account resolution only happened through
a non-reactive getState() snapshot inside getAccountId(). So views
like Mailboxes, Calendars, or Sieve Scripts kept showing the previous
account's data until an unrelated viewName change (switching tabs)
incidentally re-ran the effect.

Reproduced and verified against a live Stalwart instance: a mailbox
list stayed on accountId "b" after switching to a group account "d"
in the dropdown, and only picked up "d" after navigating away and
back. Subscribing to activeAccountId reactively and adding it to the
effect's dependencies fixes the switch to apply immediately.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 17:05:12 +02:00
Steven RYDELLandClaude Sonnet 5 3dda6d1527 feat: show Role and Usage/Quota columns on the Accounts list
Created At is replaced with two columns that previously required
opening each account individually: Role (badge, resolved against
x:UserRoles specifically since the list's merged User/Group field
definitions otherwise resolve `roles` against the wrong object) and
Usage / Quota (usedDiskQuota vs quotas.maxDiskQuota, "Unlimited" when
no limit is set).

Also makes renderCellValue's generic 'object' case resolve variant
labels via schema.schemas, instead of only ever printing the raw
@type string.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 16:47:26 +02:00
Steven RYDELLandClaude Sonnet 5 3113e6309d feat: add rate-limited manual refresh button to Log Entries
Adds a Refresh button next to Filters, right-aligned, specific to the
Logs list. Guarded to one click per 5 seconds (button disabled and
re-enabled via a timer) to avoid hammering the server if left clicked
repeatedly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 16:36:25 +02:00
Steven RYDELLandClaude Sonnet 5 21b183327c feat: add client-side Level/Event filters to Log Entries
The backend rejects `level`/`event` as x:Log/query filter conditions
(unsupportedFilter), even though both are already returned per row.
Since a real fix requires backend changes outside this repo, the two
filters are injected into the schema client-side (clientOnly flag) and
applied entirely in the browser: excluded from the JMAP filter sent to
the server, and used to narrow an eagerly-fetched, locally-paginated
result set instead.

Also makes large enum filters (Event has 634 values) render as a
searchable Combobox instead of a plain Select, generically for any
list with more than 15 enum options.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 16:31:36 +02:00
Steven RYDELLandClaude Sonnet 5 da2c99990f feat: add PWA support (manifest, service worker, icons)
Adds vite-plugin-pwa with a generated manifest, icon set derived from
the Stalwart mark (192/512/maskable/apple-touch), and theme-color meta
tags. /api and /jmap are excluded from the service worker's navigate
fallback and are never precached or runtime-cached, so authenticated
mail data can't end up in Cache Storage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 16:06:59 +02:00
Steven RYDELL 25a38cd560 fix: prevent custom logo blink with global loading state 2026-07-30 15:42:27 +02:00
Steven RYDELL fe24a9bec0 chore: upgrade Vite to 8.2.0 and @vitejs/plugin-react to 6.0.5 2026-07-30 15:42:16 +02:00
Steven RYDELL b9489a795b feat: show Redis and Valkey icons for Redis/Valkey backend variant 2026-07-30 15:31:16 +02:00
Steven RYDELL 49b3d60378 chore(icons): add final batch of backend/provider icons 2026-07-30 15:13:29 +02:00
Steven RYDELL 532e560106 fix(ui): align icon and label in backend select trigger 2026-07-30 14:47:04 +02:00
Steven RYDELL 0a417c5123 chore(icons): rescan backend icons and add DNS provider mappings 2026-07-30 14:43:45 +02:00
Steven RYDELL 0e41f4d18e feat(ui): add backend icons to variant selectors 2026-07-30 14:28:43 +02:00
Steven RYDELL a7e69eefa6 refactor(ui): move Appearance from sidebar to header user dropdown 2026-07-30 13:50:28 +02:00
Steven RYDELL bfdf8f4ba2 fix(web-applications): show Enabled column and active WebUI info card 2026-07-30 13:43:23 +02:00
Steven RYDELL 87cabf3886 Align x:Application list layout with Domains: Description first, Enabled second 2026-07-30 13:06:33 +02:00
Steven RYDELL aa48b90323 Show active WebUI column in x:Application list and active app info card 2026-07-30 13:03:05 +02:00
Steven RYDELL 231f2ec3ee Remember last visited page per section in localStorage 2026-07-30 12:48:25 +02:00
Steven RYDELL 5127a3bf8a Show current user username and email in the TopBar user menu trigger 2026-07-30 12:37:36 +02:00
Steven RYDELL e4223d8cb4 Prefix dynamic page titles with Stalwart | 2026-07-30 12:14:17 +02:00
Steven RYDELL b1849230dc Update lucide-react to 1.28.0 2026-07-30 12:10:02 +02:00
Steven RYDELL 40c04555b4 Remove the Web Applications version column and update action 2026-07-30 12:00:01 +02:00
Steven RYDELL 5dac3490ee Update react-router-dom and migrate to @daypicker/react 10 2026-07-29 11:40:29 +02:00
Steven RYDELL 868dd5e877 v1.0.8 2026-07-29 11:28:56 +02:00
Steven RYDELL eec7f2ada5 Redirect to a default page when the URL has no view 2026-07-29 11:23:50 +02:00
Steven RYDELL 2ac9a6b90e Add an Appearance settings page with color theme and corner options 2026-07-29 11:21:44 +02:00
Steven RYDELL dca6082039 Restore the direct light/dark toggle instead of a dropdown 2026-07-29 11:16:42 +02:00
Steven RYDELL 544ee36a1e Set dynamic document titles per page 2026-07-29 09:43:30 +02:00
Steven RYDELL 5152b07a9a Make the theme switcher available on the login pages 2026-07-29 09:41:28 +02:00
Steven RYDELL 2a872d2ccf Add selectable color themes with a global appearance switcher 2026-07-29 09:40:40 +02:00
Steven RYDELL 0a8dfb44be Mark the logout menu item as destructive 2026-07-29 09:06:20 +02:00
Steven RYDELL 09d43f1e9b Stretch sidebar hover full-width with a separated footer in square mode 2026-07-29 08:55:57 +02:00
Steven RYDELL 272502e0a3 Add a square corners toggle for a border-radius-free interface 2026-07-29 08:52:37 +02:00
Steven RYDELL 13c21fc6d5 v1.0.7 2026-07-29 08:05:20 +02:00
Steven RYDELL 23bef766ca Hide the close cross in the global search palette 2026-07-29 07:55:24 +02:00
Steven RYDELL 0fb734a6c7 Replace native datetime inputs with a calendar date picker 2026-07-29 07:50:55 +02:00
Steven RYDELL 3f31a115c9 Show an ESC hint instead of the close button in the command palette 2026-07-29 07:34:48 +02:00
Steven RYDELL 149524376b Make the sidebar an animated accordion with a softer hover 2026-07-29 07:32:36 +02:00
Steven RYDELL 956212031a Clip table header background inside the rounded border 2026-07-29 07:24:58 +02:00
Steven RYDELL 6d3ea6c6b1 Keep the sidebar section synced with the URL on full page loads 2026-07-29 07:21:27 +02:00
Steven RYDELL c15cb22be4 Adopt the shared ScrollArea for app-wide scrolling 2026-07-29 07:20:43 +02:00
Steven RYDELL bd16e64e51 Show WebUI version and update action in the Web Applications list 2026-07-29 06:48:41 +02:00
Steven RYDELL 8fde771ff2 Show switch state with green when on and red when off 2026-07-29 06:48:34 +02:00
Steven RYDELL da5eaf0558 Center main content horizontally
Wrap the main area in a centered max-w-7xl container and center the max-w-4xl form column inside it, so pages no longer hug the left edge on wide screens. Lists and views center up to 7xl, forms stay at a readable 4xl.
2026-07-29 06:20:14 +02:00