Commit Graph
68 Commits
Author SHA1 Message Date
Linus Rath 7848c90625 feat: add error handling for sessionStorage in redirect logic across multiple pages 2026-03-11 23:35:27 +01:00
Linus Rath f996ab77b8 feat: implement redirect after login functionality across multiple pages 2026-03-11 23:35:00 +01:00
Linus Rath a88b4e4407 feat: enhance folder settings with subfolder creation and navigation improvements 2026-03-11 23:19:01 +01:00
Linus Rath cc8195209b feat: add toolbar position setting and update email viewer layout
- Introduced a new setting for toolbar position in appearance settings, allowing users to choose between 'top' and 'below-subject'.
- Updated the EmailViewer component to conditionally render the toolbar based on the selected position.
- Enhanced the UI for the toolbar with action buttons for replying, archiving, and deleting emails.
- Added translations for the new toolbar position setting in multiple languages.
2026-03-11 22:42:21 +01:00
Linus Rath 288205fbac feat: add recipient popover component for enhanced contact interaction 2026-03-11 21:23:57 +01:00
Linus Rath 15dbb3d349 feat: update email composer to handle trailing commas and improve recipient input handling 2026-03-11 21:07:00 +01:00
Linus Rath 5f539161d5 feat: enhance toast component with enter/exit animations and progress bar 2026-03-11 20:40:24 +01:00
Linus Rath d3a5b4189e feat: enhance event modal for desktop and mobile views 2026-03-11 20:35:25 +01:00
Linus Rath e5c1cd45c5 feat: europeanize mock JMAP data and refine email list layout
Replace all mock data in the dev JMAP server with European-themed
content: 42 emails (was 13), 20 contacts across 2 address books
(was 3), 5 calendars and 35 events with recurrence, overlaps,
and all-day entries.

Move keyword tags in email/thread list items from the subject line
to the header row alongside the date for a cleaner layout.

Update test assertions to match the new mock data.
2026-03-11 20:21:39 +01:00
Linus Rath 454d51e283 feat: refactor email tagging system to use labels instead of colors
- Updated EmailContextMenu to replace color tag functionality with label tags.
- Modified EmailListItem to display label badges for emails based on keywords.
- Enhanced EmailViewer to include a tag picker for emails.
- Adjusted ThreadListItem to show label badges for email subjects.
- Added tests for email list item and keyword settings to ensure proper functionality of the new tagging system.
- Updated localization files to reflect changes from color tags to labels in multiple languages.
2026-03-11 18:56:43 +01:00
Linus Rath ffeb534740 feat: implement email keyword management with color tagging
- Introduced a new settings section for managing email keywords (labels/tags) with associated colors.
- Updated email context menu, viewer, and list item components to support the new keyword system.
- Refactored color tag handling to accommodate both new $label: and legacy $color: prefixes.
- Added utility functions for retrieving email color tags based on keywords.
- Enhanced localization files to include translations for the new keyword management features.
- Updated the settings store to manage keyword definitions, including add, update, delete, and reorder functionalities.
- Added tests for the new keyword handling logic.
2026-03-11 18:40:09 +01:00
Linus Rath 61459c4923 feat: update bottom navigation to support tablet view in mobile layout 2026-03-11 18:13:19 +01:00
Linus Rath d23e9a642c feat: enhance mobile responsiveness across calendar and contact components
- Added `isMobile` prop to `CalendarWeekView`, `EventDetailPopover`, `ContactDetail`, `ContactGroupDetail`, and `EmailComposer` components for improved mobile layout.
- Adjusted layout and styles in `CalendarWeekView` to display a 3-day view on mobile.
- Updated `EventDetailPopover` to adapt its size and layout for mobile devices.
- Modified `ContactDetail` and `ContactGroupDetail` to adjust padding and font sizes based on mobile view.
- Enhanced `EmailComposer` with mobile-friendly header and field layouts, including auto-saving draft functionality.
- Added confirmation dialog for unsaved changes when closing the email composer.
- Updated localization files to include new strings for draft management.
2026-03-11 18:07:44 +01:00
Linus Rath 723aff38f2 feat: add settings synchronization feature with server, including UI toggle and localization 2026-03-11 16:46:43 +01:00
Linus Rath a8a1ad1d54 feat: implement settings synchronization with server, including encryption and API endpoints 2026-03-11 16:22:47 +01:00
Linus Rath cf5f271be2 Merge branch 'main' of https://github.com/rathlinus/jmap-webmail 2026-03-11 16:04:59 +01:00
Linus Rath d09022378b feat: add devMode configuration to runtime settings and update LoginPage for theme management 2026-03-11 16:01:31 +01:00
Linus Rath 4576d37c7a feat: enhance settings page with mobile layout and add tab groups to localization files 2026-03-11 11:11:27 +01:00
Linus Rath 40e7fa3776 style: format CSS 2026-03-10 16:12:48 +01:00
Linus Rath c1956bfb2d feat: enhance WelcomeBanner with settings button and update styles for better layout 2026-03-10 16:11:14 +01:00
Linus Rath c7485f532c Merge fix/sieve-filter-save-21: fix sieve activation (RFC 9661) - fixes #21 2026-03-10 15:30:24 +01:00
Linus Rath 9008a3decf fix: use onSuccessActivateScript for sieve activation - fixes #21 2026-03-10 15:25:58 +01:00
Linus Rath fed508d5b7 fix: demo-only features for gender inference and custom avatars in development 2026-03-09 21:08:45 +01:00
Linus Rath 8985865843 feat: inline search filters, folder icon picker, richer demo data & UI polish
- Replace advanced search panel with inline filter chips and collapsible fields
  (from/to/subject/body inputs, folder dropdown, attachment/flagged/read toggles)
- Add debounced auto-search on filter field changes
- Folder settings: add icon picker for custom per-folder icons, toast feedback,
  reorder sections (folder list first, roles second), empty-state illustration
- Avatar: show sender favicon for company domains, randomuser.me portraits for
  personal emails, custom avatars for demo senders, fallback to initials
- Add /api/favicon proxy route for fetching domain favicons
- Settings store: add senderFavicons toggle and folderIcons persistence
- Richer mock inbox with 11 realistic emails (GitHub, Slack, Stripe, Vercel, etc.)
- Navigation rail & sidebar cleanup, permanent-delete warning i18n (all 8 locales)
- Rename search toggle label to 'More', add body/folder filter translations
2026-03-09 20:59:32 +01:00
Linus Rath d41718768b feat: folder management settings with CRUD and standard role assignment 2026-03-09 19:27:32 +01:00
Linus Rath cf02f587de feat: resizable columns, nav rail overhaul, multi-select & drag-drop, UI polish
Resizable Columns
- Add ResizeHandle component with mouse drag, keyboard (Arrow keys),
  and double-click to reset to default width
- Add sidebarWidth/emailListWidth to ui-store with clamping + persistence
- Wire resize handles between sidebar/email-list panels on desktop

Navigation Rail Overhaul
- Move StorageQuotaCircle, push-status, sign-out from Sidebar to NavigationRail
- Interactive SVG ring with popover breakdown (used/free/total)
- Sidebar collapse state lifted to ui-store
- Show total email count per mailbox alongside unread badge

Email Multi-Selection & Drag-and-Drop
- Ctrl+Click (toggle) and Shift+Click (range) on all list items
- Add selectRangeEmails and lastSelectedEmailId to email-store
- Enable drag-and-drop on thread items and thread headers
- useEmailDrag accepts optional threadEmails for full-thread drag

Email Viewer Layout
- Remove card wrapper for cleaner full-width reading
- Always render HTML body when available
- Adjust skeleton loader to match flat layout

Modal & UI Polish
- Standardise backdrops, close buttons, padding, border-radius, transitions
- Migrate template-string classNames to cn() in settings
- Unify focus-ring token to ring-ring on form controls

i18n
- Add storage_used/free/total keys to all 8 locales

Dev Mock JMAP Server (new, gated by DEV_MOCK_JMAP=true)
- Session, Mailbox/Email/Thread/Identity CRUD, back-references, upload
- GET /download with Content-Disposition, GET /eventsource SSE

Tests (46 new)
- ui-store (13), email-selection (10), resize-handle (9), mock-server (14)
2026-03-09 16:46:25 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 58b9b70871 fix: resolve context menu submenu and move-to-folder issues (#19) 2026-03-02 09:10:03 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 92620fb790 fix: details toggle UX, Edge Runtime warnings, minimatch CVE
- Keep show/hide details button in place when expanded (#18)
- Use i18n translations for details toggle text
- Split instrumentation for Edge Runtime compatibility
- Patch minimatch ReDoS (CVE-2026-27903)
2026-02-28 21:03:02 +01:00
Matthieu MALVACHEandMatthieu MALVACHE a3fe9deaa6 feat: add server-side version update check
Logs current version on startup and checks GitHub for newer releases.
Only runs in production, output stays in server logs (no client exposure).
2026-02-28 14:59:11 +01:00
Matthieu MALVACHEandMatthieu MALVACHE c65a6454c5 fix: remove jmap-jam reference, clean up README language 2026-02-26 13:50:39 +01:00
Matthieu MALVACHEandMatthieu MALVACHE a7908692ef fix(docker): resolve 4 CVEs in production image
Remove npm/npx from runner stage and upgrade Alpine packages to
patch minimatch, tar, busybox, and zlib vulnerabilities.
2026-02-26 13:39:57 +01:00
Matthieu MALVACHEandMatthieu MALVACHE c59bf63603 chore: disable Next.js telemetry in Docker image 2026-02-26 01:16:24 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 29f186b6f2 feat(ci): publish Docker image to Docker Hub and GHCR
Add dual-registry publishing to both Docker Hub (rootfr/jmap-webmail)
and GitHub Container Registry. Multi-arch support for amd64/arm64.
2026-02-26 01:13:29 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 1b0e3e41c6 feat: add "Remember me" session persistence and simplify 2FA UX 2026-02-26 00:47:53 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 7b6b8fc132 feat(auth): add RP-initiated logout and OAuth unit tests
OAuth logout now terminates the IdP session via end_session_endpoint
with HTTPS-only URL validation. Adds 14 unit tests for PKCE and
OAuth discovery.
2026-02-26 00:08:57 +01:00
Matthieu MALVACHEandMatthieu MALVACHE ec06b0c494 feat: add OAuth2/OIDC with PKCE for SSO login
Add opt-in SSO authentication alongside Basic Auth. OAuth endpoints are
auto-discovered via .well-known, with support for external IdPs
(Keycloak, Authentik) via configurable OAUTH_ISSUER_URL. Sessions
persist through httpOnly refresh token cookies with automatic renewal.
2026-02-25 23:41:37 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 110dd98ad4 fix(spam): use correct mailbox ID when moving emails out of junk 2026-02-25 16:14:05 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 08ee6b6932 fix: robust session URL rewriting for default port normalization 2026-02-25 12:45:10 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 02f4ce81e3 fix: include sender display name in From header and default identity selection
- Emails now include the identity display name in the From field so recipients
  see "Name <email>" instead of bare "<email>"
- Primary identity (matching login username) is pre-selected in composer dropdown
2026-02-25 12:35:39 +01:00
Matthieu MALVACHEandMatthieu MALVACHE ff3ae80f23 fix: rewrite JMAP session URLs to match user-configured server origin
Fixes Docker/reverse proxy deployments where the JMAP server returns
its internal hostname in session URLs, causing all requests after
login to fail.
2026-02-24 15:17:49 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 913f673f73 feat: detect CORS errors and show actionable guidance on login
Distinguish CORS-blocked requests from genuine network failures using
a no-cors probe, so users deploying via Docker see a specific message
pointing to their JMAP server's CORS settings instead of a misleading
"unable to reach the server" error.
2026-02-23 18:21:23 +01:00
Matthieu MALVACHEandMatthieu MALVACHE a0bb200da4 chore: remove unused dependencies and explicit phantom deps 2026-02-22 23:00:35 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 15c14b1833 chore: update dependencies and fix calendar event hooks
Bump tailwindcss 4.2.0, lucide-react 0.575.0, @typescript-eslint 8.56.0,
tailwind-merge 3.5.0, and patch-level updates across 48 transitive packages.
Fix missing useCallback dependency in calendar event card.
2026-02-22 18:07:30 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 838ee4b8e5 fix(calendar): produce correct JMAP patch when removing recurrence rules
Include recurrenceRules, recurrenceOverrides, and excludedRecurrenceRules
in the update patch when clearing recurrence from an event. Also fix
"this and future" scope overriding user's recurrence changes.

Fixes #14
2026-02-22 17:52:21 +01:00
Matthieu MALVACHEandMatthieu MALVACHE ccbab654f3 feat(calendar): add drag-create, resize, recurring scope, quick-create, and duplication
- Click-drag on empty time slots to create events with pre-filled time range
- Resize events by dragging bottom edge (15-min snap, optimistic JMAP update)
- Recurring event edit/delete scope dialog (this/following/all occurrences)
- Double-click quick event creation with inline title input
- Event duplication button in modal (+1 day offset)
- Shared interaction hook for pointer-based calendar interactions

Fixes #13
2026-02-22 17:32:10 +01:00
Matthieu MALVACHEandMatthieu MALVACHE fb7cfe1634 fix(ci): add path filters to Docker workflow to avoid unnecessary rebuilds 2026-02-21 23:59:03 +01:00
Matthieu MALVACHEandMatthieu MALVACHE d7cda6f870 chore(docker): use pre-built GHCR image in docker-compose
Replace local build with ghcr.io/root-fr/jmap-webmail:latest so users
can deploy without cloning and building the source.
2026-02-21 23:57:39 +01:00
Matthieu MALVACHEandMatthieu MALVACHE a932e1a1c7 feat: add GHCR Docker image publishing with multi-arch support
Add GitHub Actions workflow to automatically build and publish Docker
images to ghcr.io on releases. Supports amd64 and arm64 architectures.
Pre-built image available at ghcr.io/root-fr/jmap-webmail.
2026-02-21 23:30:44 +01:00
Matthieu MALVACHEandMatthieu MALVACHE a43096485b feat: add UI/UX polish with navigation rail, confirm dialogs, welcome banner, and form validation
- Add NavigationRail component (desktop vertical icon sidebar + mobile bottom tab bar)
- Add ConfirmDialog with promise-based useConfirmDialog hook for async confirmation flow
- Add WelcomeBanner onboarding component (one-time display, localStorage persistence)
- Polish login form UX (shake on error, TOTP slide animation, password visibility toggle, session expired banner)
- Add inline form validation with shake animation in email composer and contacts
- Add empty state patterns for contacts (no data vs no search results with contextual actions)
- Improve toast notification system with undo action support and typed durations
- Add WCAG AA prefers-reduced-motion media query, safe area insets, sr-only live regions
- Add template settings tab and keyboard shortcut integration
- Update all 8 locale translations
2026-02-17 02:31:50 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 2636a88820 feat: add email templates with placeholder variables and composer integration
- Reusable email templates with local storage persistence
- Dynamic placeholder variables ({{recipientName}}, {{date}}, etc.) with auto-fill
- Template manager modal with category filtering and search
- Template picker integrated in composer toolbar (Ctrl+Shift+T)
- Settings tab for template management
- 48 unit tests for template utilities
- i18n support for all 8 languages
2026-02-17 01:35:26 +01:00