100 Commits

Author SHA1 Message Date
daf4dbea14 test(front): add e2e test for theme CSS token integration
Some checks failed
Frontend Workflow / install-front (push) Has been cancelled
Main Workflow / lint-back (push) Has been cancelled
Main Workflow / test-back (push) Has been cancelled
Docker Hub Workflow / build-and-push-backend (push) Has been cancelled
Docker Hub Workflow / build-and-push-frontend (push) Has been cancelled
Frontend Workflow / lint-front (push) Has been cancelled
Frontend Workflow / test-unit (push) Has been cancelled
Verify that Cunningham contextual tokens resolve at runtime and that
the scheduler toolbar no longer uses hardcoded white background,
confirming the theme CSS chain works end-to-end.
2026-03-18 18:35:23 +00:00
03126ea5bf refactor(front): replace hardcoded colors with Cunningham contextual tokens
Migrate ~47 hardcoded hex colors and v3 --c--theme--colors--* tokens
across 13 SCSS/TSX files to v4 --c--contextuals--* tokens. This lets
the calendar UI adapt to any runtime theme (sunbeam dark, La Suite
default, ANCT) via the integration service's theme.css. FreeBusyTimeline
rgba overlays use color-mix() for theme-aware transparency.
2026-03-18 18:35:06 +00:00
cfefc9287d feat(front): add sunbeam theme and Cunningham v4 token plumbing
Add sunbeam dark theme to cunningham.ts with amber brand palette and
navy grey scale. Wire THEME_CSS_URL through Dockerfile build args and
_app.tsx <link> injection so the integration service theme CSS loads at
runtime. Regenerate Cunningham design tokens (CSS, SCSS, TS). Add
Monaspace Neon variable font-face for monospace UI elements.
2026-03-18 18:34:05 +00:00
Nathan Panchout
eb54778154 Merge pull request #36 from suitenumerique/responsive/make-first-responsive-pass
(front) add responsive/mobile support for calendar
2026-03-11 11:22:07 +01:00
Nathan Panchout
b448126fc5 💄(front) add responsive styles for calendar and modal
Add media queries and responsive adjustments for the
calendar page, scheduler, event modal, section pills,
section rows, and calendar list components.
2026-03-11 11:19:55 +01:00
Nathan Panchout
3ce6fea0bd (front) integrate mobile views into Scheduler component
Wire mobile components into the main Scheduler, adapt
useSchedulerInit for mobile viewport, update EventModal
and MiniCalendar for responsive behavior.
2026-03-11 11:19:55 +01:00
Nathan Panchout
ca743b3fc7 (front) add mobile toolbar, week bar, FAB and list view
Add dedicated mobile components: MobileToolbar for
navigation, WeekDayBar for day selection, FloatingActionButton
for quick event creation, and MobileListView for agenda.
Also add mobile navigation hook and translations.
2026-03-11 11:19:55 +01:00
Nathan Panchout
e7446788f2 (front) add LeftPanelContext for mobile panel state
Introduce a context to manage left panel visibility on
mobile, integrate it into SimpleLayout and calendar page.
2026-03-11 11:19:55 +01:00
Nathan Panchout
75f26b59d2 ♻️(front) add shared date utils and useIsMobile hook
Add date formatting utilities and a custom hook to
detect mobile viewport for responsive behavior.
2026-03-11 10:43:08 +01:00
Nathan Panchout
2760770f3f 🔧(front) relax node engine constraint to <=25.8.0
Update the node engine version constraint in package.json
files and regenerate yarn.lock accordingly.
2026-03-11 10:43:00 +01:00
Sylvain Zimmer
7cb8d5e7b6 (freebusy) add availability management (#35)
Adds organization-level default calendar sharing controls, "Find a Time" scheduling UI with a Free/Busy timeline showing attendee availability and conflicts, Working hours editor in Settings to manage and save availability, Autocomplete attendee search with debounced, partial name/email matching and timezone display.

Fixes #26. Fixes #25. Fixes #24.
2026-03-10 01:30:42 +01:00
Sylvain Zimmer
9c18f96090 (all) add organizations, resources, channels, and infra migration (#34)
Add multi-tenant organization model populated from OIDC claims with
org-scoped user discovery, CalDAV principal filtering, and cross-org
isolation at the SabreDAV layer.

Add bookable resource principals (rooms, equipment) with CalDAV
auto-scheduling that handles conflict detection, auto-accept/decline,
and org-scoped booking enforcement. Fixes #14.

Replace CalendarSubscriptionToken with a unified Channel model
supporting CalDAV integration tokens and iCal feed URLs, with
encrypted token storage and role-based access control. Fixes #16.

Migrate task queue from Celery to Dramatiq with async ICS import,
progress tracking, and task status polling endpoint.

Replace nginx with Caddy for both the reverse proxy and frontend
static serving. Switch frontend package manager from yarn/pnpm to
npm and upgrade Node to 24, Next.js to 16, TypeScript to 5.9.

Harden security with fail-closed entitlements, RSVP rate limiting
and token expiry, CalDAV proxy path validation blocking internal
API routes, channel path scope enforcement, and ETag-based
conflict prevention.

Add frontend pages for resource management and integration channel
CRUD, with resource booking in the event modal.

Restructure CalDAV paths to /calendars/users/ and
/calendars/resources/ with nested principal collections in SabreDAV.
2026-03-09 09:09:34 +01:00
Sylvain Zimmer
cd2b15b3b5 (entitlements) add Entitlements backend with Deploy Center support (#31)
This checks if the user has access to the app and can create calendars.
2026-03-06 02:47:03 +01:00
Sylvain Zimmer
5e0506d64b 📝(docs) reorganize docs in docs/ 2026-02-24 11:37:32 +01:00
Sylvain Zimmer
07a4ca3332 💬(homepage) fix homepage texts 2026-02-22 15:11:09 +01:00
Sylvain Zimmer
3e11794d02 💚(repo) fix CI and general cleanup (#12) 2026-02-21 00:49:44 +01:00
Stephan Meijer
4f4eccd9c8 👷(docker) add arm64 support and upgrade CI workflow steps (#11)
* 👷(docker) add arm64 platform support for image builds

Add QEMU and Buildx setup steps to enable multi-architecture Docker
image builds for both linux/amd64 and linux/arm64 platforms.

Signed-off-by: Stephan Meijer <me@stephanmeijer.com>

* ⬆️(ci) upgrade GitHub Actions workflow steps to latest versions

Update actions/setup-node from v4 to v6 and actions/cache from v4 to v5
for improved performance, security patches, and Node.js runtime compatibility.

Signed-off-by: Stephan Meijer <me@stephanmeijer.com>

---------

Signed-off-by: Stephan Meijer <me@stephanmeijer.com>
2026-02-19 22:14:35 +01:00
Sylvain Zimmer
4f8dbeffbb 🐛(calendars) add default calendar color 2026-02-19 20:44:49 +01:00
Sylvain Zimmer
81954a4ead (invitations) add invitation RSVP links in HTML emails (#10)
Also include many fixes and scalingo deployment
2026-02-19 18:15:47 +01:00
Sylvain Zimmer
acce8d1425 (sharing) add shared calendars, remove "agenda" wording 2026-02-11 23:35:46 +01:00
Sylvain Zimmer
a38845e523 (sharing) use UI Kit native sharing modal 2026-02-11 18:36:55 +01:00
Sylvain Zimmer
ef1583b595 (deploy) add Scalingo buildpack + dynamic favicon 2026-02-11 09:49:30 +01:00
Sylvain Zimmer
797d92ff62 ️(fetch) only fetch visible calendars + try single query expanded 2026-02-10 10:53:39 +01:00
Sylvain Zimmer
659029dd1f (ui) improve event display and add some niceties to the modal 2026-02-09 22:19:20 +01:00
Sylvain Zimmer
3051100f8a 🐛(data) remove Calendar and CalendarShare models
The only source of truth for those is now in the caldav server
2026-02-09 20:48:11 +01:00
Sylvain Zimmer
3a0f64e791 (import) add import modal
Synchronous for now, can be offloaded to worker later.

Also lint the codebase
2026-02-09 18:43:49 +01:00
Nathan Panchout
23a66f21e6 🎨(front,back) minor style and formatting fixes
- Add gap to attendees input layout
- Fix long line formatting in subscription API test

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 17:41:04 +01:00
Nathan Panchout
53920585a5 Merge pull request #8 from suitenumerique/visio-button
Add video conference link generation
2026-02-06 17:39:44 +01:00
Nathan Panchout
52a26f5747 (front,back) add tests for visio conference feature
- Frontend: 3 unit tests for generateVisioRoomId (format, length,
  uniqueness)
- Backend: 7 tests for ICalendarParser URL extraction and email
  template rendering with/without visio URL

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 17:39:16 +01:00
Nathan Panchout
e26193dc3c (back) extract ICS URL property and display in invitation emails
Add visio conference URL support to invitation emails:
- Add url field to EventDetails dataclass
- Extract URL property in ICalendarParser.parse()
- Fix extract_property regex to preserve full URLs (was truncating
  https:// by splitting on colon)
- Add conditional visio section to all 8 email templates
  (invitation, update, cancel, reply — HTML and text)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 17:39:08 +01:00
Nathan Panchout
eac8cde272 (front) add video conference link generation in event modal
Implement the visio conference feature in the event modal:
- Add NEXT_PUBLIC_VISIO_BASE_URL env var for configurable base URL
- Create generateVisioRoomId() utility (xxx-xxxx-xxx format, a-z)
- Refactor VideoConferenceSection: button to create, link + remove
  when URL exists
- Hide visio pill when env var is not configured (feature flag)
- Add removeVisio i18n key in EN/FR/NL

The visio URL is stored via the standard ICS URL property, which
is already wired through useEventForm.toIcsEvent() and CalDavService.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 17:38:57 +01:00
Nathan Panchout
5c86f79192 Refactor EventModal into section components (#7)
* 🙈(tools) remove OpenSpec skills and commands from Git tracking

Remove .claude/skills/openspec-*/ and .claude/commands/opsx/ from
Git tracking while keeping them locally. Extends the previous
cleanup (d24eed9) that handled the openspec/ directory.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* (front) add EventModal section components and useEventForm hook

Extract modal sections into dedicated components (DateTimeSection,
RecurrenceSection, LocationSection, VideoConferenceSection,
AttendeesSection, DescriptionSection, InvitationResponseSection,
RemindersSection, StatusSection, AttachmentsSection) with shared
SectionRow and SectionPill layout components.
Add useEventForm hook to centralize form state management.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ♻️(front) refactor EventModal to use extracted sections

Simplify EventModal by delegating to section components and
useEventForm hook. Replace alert() with addToast() for error
feedback, convert useCallback to useMemo for buildSummary in
RecurrenceEditor, and add missing organizer dependency in
useEventForm useEffect.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* 💄(front) update scheduler styles for new modal design

Rework SCSS for EventModal, AttendeesInput, RecurrenceEditor,
and Scheduler. Move inline styles to CSS classes. Update
globals and frontend dependencies.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 16:30:37 +01:00
Nathan Panchout
d24eed9cd1 🙈(tools) remove openspec/ from Git tracking
The openspec/ directory is now gitignored and removed from
the repository index while kept locally. This prevents
OpenSpec working artifacts from being pushed to GitHub.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 14:14:35 +01:00
Nathan Panchout
1ed0ba7206 🐛(front) fix timezone double conversion in scheduler display
Fix events displaying with +1h offset (e.g. 14h→15h) caused by
icsDateToJsDate() returning fake UTC (local.date) which then got
the browser offset applied again by dateToLocalISOString().

Changes:
- Return true UTC (icsDate.date) from icsDateToJsDate() instead of
  fake UTC (local.date)
- Add getDateComponentsInTimezone() using Intl.DateTimeFormat with
  formatter caching for correct cross-timezone write path
- Refactor jsDateToIcsDate() to use Intl instead of isFakeUtc flag
- Replace optimistic updates with refetchEvents() after modal save
  to avoid fake UTC leaking into the display path
- Align standalone helper jsDateToIcsDate() with adapter conversion
- Narrow useCallback dependencies in useSchedulerHandlers
- Remove dead code addDurationToDate()
- Add 42 timezone conversion tests covering DST transitions,
  cross-timezone round-trips, half-hour/45min offsets

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:25:34 +01:00
Nathan Panchout
9e982a8eb1 📝(front) add OpenSpec artifacts for timezone double conversion fix
Add proposal, design, specs and tasks for the fix-timezone-double-conversion
change. Documents the root cause (icsDateToJsDate returning fake UTC causing
double browser offset), the Intl.DateTimeFormat-based solution, and 40+
test scenarios covering DST, cross-timezone, half-hour offsets, and
round-trip conversions.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:25:34 +01:00
Nathan Panchout
79f352b738 🔧(tools) update OpenSpec skills and commands
Update all OpenSpec OPSX skills and commands definitions
to their latest versions.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:25:34 +01:00
Nathan Panchout
3fbd87145e 🎨(front) update cunningham theme tokens
Regenerate theme tokens from cunningham configuration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 17:51:49 +01:00
Nathan Panchout
a5117e385e ♻️(front) use DynamicCalendarLogo in app
Replace static logo divs with DynamicCalendarLogo component in:
- Header.tsx: header variant for main navigation
- index.tsx: both header and icon variants for home page
- calendar.tsx: header variant for calendar page

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 17:51:49 +01:00
Nathan Panchout
595059df68 (front) add DynamicCalendarLogo component
Create a React component that displays the calendar logo with
the current day number overlaid dynamically.

Features:
- Two variants: "header" (full logo) and "icon" (icon only)
- Day number positioned with CSS overlay
- Client-side rendering to avoid SSR hydration issues
- Translated alt text using i18n

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 17:51:49 +01:00
Nathan Panchout
2af4b892aa (front) add SVG assets for dynamic calendar logo
Add two SVG files for the calendar logo:
- cal_logotype_text_no_number.svg: full logo with "Calendriers" text
- cal_icon_no_number.svg: icon-only version

Both versions have no day number, allowing dynamic overlay.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 17:51:49 +01:00
Nathan Panchout
ffda528a00 (front) improve Scheduler UX and performance
- Enable sticky header by setting height: 100% on .ec
- Scroll to current time on calendar initialization
- Parallelize CalDAV event fetching with Promise.all
- Use event-handler-refs pattern for stable callbacks
- Import shared CalendarApi interface from types

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 15:42:49 +01:00
Nathan Panchout
1c8fd116df ♻️(front) reorganize calendar components into subfolders
- Move scheduler components (AttendeesInput, RecurrenceEditor,
  EventModal styles) to scheduler/
- Move left panel components (LeftPanel, MiniCalendar) to left-panel/
- Move CalendarList.scss to calendar-list/
- Simplify SchedulerToolbar component
- Update imports, exports and page layout

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 15:42:49 +01:00
Nathan Panchout
92bea3fd96 📝(docs) archive calendar-central-design change
Archive completed OpenSpec change with all artifacts:
- proposal.md: Initial design requirements
- design.md: Architecture decisions
- specs/: calendar-theme and scheduler-toolbar specifications
- tasks.md: 34/34 tasks completed

Sync delta specs to main specs:
- openspec/specs/calendar-theme/spec.md
- openspec/specs/scheduler-toolbar/spec.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 13:00:21 +01:00
Nathan Panchout
9e7c6fbff1 🎨(front) update LeftPanel border style
Use contextual border token for consistency with design system.
Remove unused divider class.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 13:00:21 +01:00
Nathan Panchout
7d0072a7b3 🎨(front) reorder day header elements
Display day-of-week before day-of-month in calendar column headers
for better visual hierarchy.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 13:00:21 +01:00
Nathan Panchout
e2d80fbdde 🌐(front) add calendar navigation translations
Add calendar.navigation.previous/next keys for toolbar
accessibility labels in EN, FR, and NL.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 13:00:21 +01:00
Nathan Panchout
8799579606 ♻️(front) integrate custom toolbar in Scheduler
- Integrate SchedulerToolbar component above calendar container
- Disable native headerToolbar in useSchedulerInit
- Add toolbar state (currentView, viewTitle) to Scheduler
- Use datesSet callback to sync toolbar with calendar navigation
- Update CalendarContext to use CalendarApi type for better type safety
- Pass calendarRef to toolbar for API method access

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 13:00:21 +01:00
Nathan Panchout
213d1d41c0 (front) add SchedulerToolbar component
Create custom React toolbar for EventCalendar replacing native toolbar:

- Today button to navigate to current date
- Previous/Next navigation buttons with icons
- Dynamic period title synced with calendar view
- Custom dropdown menu for view selection (Day/Week/Month/List)
- Full keyboard accessibility (Escape, Arrow keys, Enter, Tab)
- CalendarApi interface for type-safe calendar interactions
- Responsive layout with Cunningham design system

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 13:00:21 +01:00
Nathan Panchout
29ee4b8590 (front) add EventCalendar theme overrides
Create scheduler-theme.scss to align @event-calendar/core with
La Suite design system (Cunningham):

- Map --ec-* CSS variables to Cunningham tokens
- Hide native toolbar (replaced by custom React toolbar)
- Style today indicator with bordered frame (no fill)
- Style events with 6px border-radius, no shadow
- Style now indicator with brand-500 color
- Remove intermediate 30-min grid lines
- Unify header zone (ec-col-head + ec-all-day)
- Add border to grid body

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 13:00:21 +01:00
Nathan Panchout
c789762e47 🎨(front) update Cunningham design tokens
Regenerate Cunningham tokens with latest design system values.
This provides updated CSS variables for theming.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 13:00:21 +01:00