etouch
Sign in
Back to changelog
by Théo Daguier

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.

#feature#bugfix#refactor#infrastructure#tests

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 CreateReservationDialog collects 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:write scopes 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"> and datetime-local elements with a shared shadcn DatePicker / DateTimePicker component (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 CreateSessionDialog which 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 derivationedoBookingToEvent always set endTime: 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 VALUE that failed if COLORAMA already existed, blocking all future prisma migrate deploy. Switched to ADD 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 /machines so 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 /calendar page was missing a generateMetadata export, showing the generic "Etouch" title in the browser tab. Now emits proper page metadata via buildPageMetadata. #672

♻️ Refactoring & Technical Improvements

  • Studio scope test coverage — Added resolver-level tests asserting that createApiKey accepts studio:read / studio:write (alone and mixed) and still rejects unknown scopes, preventing future silent breakage of Studio-scoped key creation. #664