Changelog — June 3, 2026
Major calendar overhaul with real-duration rendering across all views, E-Do reservation creation from the calendar, shadcn date pickers, Studio API-key authorization, and CMS-driven machine provisioning.
Release
v1.45.2✨ New Features
-
Calendar reservation creation — The calendar "+" button now creates an E-Do reservation (booking) via the E-Do Booking integration instead of an internal session. A new
CreateReservationDialogcollects client info, project type, preferred date and notes, with full en/fr/es translations.#676 -
Studio API-key authorization — API keys can now control Studio resources (sessions, machines, products, consumables) over GraphQL. Adds
studio:read/studio:writescopes with resolver-level enforcement. Dashboard/JWT viewers are unaffected.#662 -
API-key scope selector redesign — The "Create API Key" dialog now shows a structured per-domain layout with icons, descriptions and segmented Read/Write toggles. Write implies Read; read-only domains show only the Read toggle. Dark-mode friendly, keyboard accessible, localized in fr/en.
#665 -
Arrival → end time across all calendar views — Every calendar view (month, week, day) now displays the full time range (HH:mm – HH:mm) instead of just the start time. The selected view (month/week/day) persists across reloads via localStorage.
#670 -
shadcn date pickers — Replaced native
<input type="date">anddatetime-localelements with a shared shadcnDatePicker/DateTimePickercomponent (Popover + Calendar, locale-aware, time input). Required fields are now marked with a red asterisk.#674 -
CMS-driven machine provisioning — Added an idempotent script that reads studio plateaux from the Strapi CMS and creates matching etouch Machine records via the GraphQL API. Maps pricing rows to TimeSlot enums; skips unmappable entries. Dry-run by default, writes only with
--confirm.#671
🐛 Bug Fixes
-
Calendar session dialog regression — PR #676's free-text reservation dialog broke client linking and machine selection. Restored the
CreateSessionDialogwhich links existing clients via combobox, supports machine/time-slot picking, and sets scheduled dates.#677 -
Calendar event block height — Week-view event blocks were hardcoded at 22px regardless of duration, making a 4h booking look like ~1h. Now computes height from event duration (ROW_H per hour), clamped to a minimum and to the bottom of the day.
#663 -
Day-view booking block duration — The day view had the same collapsed-height bug as the week view. Switched to absolute positioning mirroring the week view so multi-hour bookings span their real duration.
#669 -
E-Do booking endTime derivation —
edoBookingToEventalways setendTime: null, so edo-bookings collapsed to minimum height. Now derives endTime from startTime + total session hours.#666 -
COLORAMA enum migration idempotency — The migration used a bare
ADD VALUEthat failed if COLORAMA already existed, blocking all futureprisma migrate deploy. Switched toADD VALUE IF NOT EXISTS(safe on PG 12+).#668 -
createApiKey scope error diagnostics — Invalid scopes produced an opaque "Invalid scopes provided" error. Now lists the offending scope(s) and the full valid catalogue so callers can self-diagnose.
#667 -
Machine assignment visibility — The Machines section was hidden when the studio had no machines configured. Now always rendered with an empty-state link to
/machinesso users can configure machines first.#661 -
Cyclorama pricing — The Cyclorama plateau (sold in 5h/10h blocks) had no matching TimeSlot enum, so the machine was created with empty pricing. Mapped 5h → HALF_DAY and 10h → FULL_DAY; existing machines are now reconciled on re-run.
#673 -
Calendar page metadata — The
/calendarpage was missing agenerateMetadataexport, showing the generic "Etouch" title in the browser tab. Now emits proper page metadata viabuildPageMetadata.#672
♻️ Refactoring & Technical Improvements
- Studio scope test coverage — Added resolver-level tests asserting that
createApiKeyacceptsstudio:read/studio:write(alone and mixed) and still rejects unknown scopes, preventing future silent breakage of Studio-scoped key creation.#664