diff --git a/ACADENICE_PATCHES.md b/ACADENICE_PATCHES.md index c5953bbd..0cf34180 100644 --- a/ACADENICE_PATCHES.md +++ b/ACADENICE_PATCHES.md @@ -555,6 +555,73 @@ En attendant, le rendu est identique fonctionnellement (HTML table + colonnes de --- +## Patch 007 — R3.1.d : Kanban + Calendar renderers + Inline edit + +**Date** : 2026-05-08 +**Scope** : renderers kanban (@dnd-kit) et calendar (@fullcalendar) + edition inline cellules (table) et cartes (kanban) + hook generique useUpdateRow + check permissions +**Commit** : `f3fae2a` + +### Fichiers crees + +| Fichier | Role | +|---------|------| +| `renderers/kanban-renderer.tsx` + `.module.css` | Renderer kanban avec @dnd-kit drag-drop, group by single_select, optimistic update | +| `renderers/calendar-renderer.tsx` + `.module.css` | Renderer calendar avec @fullcalendar month/week/day, eventDrop -> PATCH date | +| `hooks/use-update-row.ts` | PATCH row generique avec optimistic update + rollback React Query v5 | +| `hooks/use-permissions.ts` | Lecture acadenice_permissions depuis window global ou cookie acadenicePerms | +| `components/inline-editor.tsx` + `.module.css` | Editor polymorphe (text/number/date/single_select/multi_select) | +| `components/row-detail-modal.tsx` | Modal detail row ouverte depuis click event calendar | +| `__tests__/kanban-renderer.test.tsx` | 8 tests kanban | +| `__tests__/calendar-renderer.test.tsx` | 8 tests calendar (FullCalendar mocke) | +| `__tests__/inline-editor.test.tsx` | 7 tests inline editor | +| `__tests__/use-update-row.test.tsx` | 5 tests optimistic/rollback/endpoint/invalidation | +| `__tests__/use-permissions.test.tsx` | 5 tests permissions | + +### Fichiers modifies (touches minimales) + +| Fichier | Modification | +|---------|--------------| +| `extension/database-view-component.tsx` | switch/case dispatch vers KanbanRenderer + CalendarRenderer (au lieu de PlaceholderRenderer) | +| `renderers/table-renderer.tsx` | Integration InlineEditor sur double-click cellule + useUpdateRow + usePermissions | +| `services/bridge-client.ts` | Ajout helper `patchRow(tableId, rowId, payload, bridgeUrl)` | +| `types/database-view.types.ts` | SUPPORTED_VIEW_TYPES etendu : + "kanban" + "calendar" | +| `__tests__/database-view-component.test.tsx` | Mocks KanbanRenderer + CalendarRenderer, tests kanban/calendar -> real renderers, test unknown -> placeholder | +| `public/locales/en-US/translation.json` | +12 cles i18n (kanban.*, calendar.*, edit.*, row_detail.*) | +| `public/locales/fr-FR/translation.json` | +12 cles i18n traductions FR | + +### Nouvelles dependances a installer + +``` +@dnd-kit/core@^6.3.1 +@dnd-kit/sortable@^8.0.0 +@dnd-kit/utilities@^3.2.2 +@fullcalendar/react@^6.1.15 +@fullcalendar/daygrid@^6.1.15 +@fullcalendar/timegrid@^6.1.15 +@fullcalendar/interaction@^6.1.15 +``` + +### Tests count + +- Avant R3.1.d : 41 tests (5 suites R3.1.c) + 22 tests RBAC (R2.x) = 63 tests total +- Apres R3.1.d : 63 + 33 nouveaux = 96 tests total (10 suites) + +### Verifications skipped (convention fork) + +- pnpm install : non execute (deps a ajouter listees ci-dessus) +- pnpm typecheck : non execute (deps FullCalendar + dnd-kit absentes) +- pnpm test : non execute +- Lint : non execute + +### Points a debattre avec Corentin + +1. **usePermissions global cache** : le hook lit `window.__acadenice_perms` qui n'est pas set par le code existant. Il faut que le hook RBAC R2.3a set ce global apres resolution. A connecter dans `use-acadenice-permissions.ts` : apres la query resoud, `window.__acadenice_perms = data.permissions`. +2. **KanbanRenderer drag-drop crosscolumn** : le DragEndEvent detecte la colonne cible via `closestCenter`. Si l'utilisateur drop dans une colonne vide (pas de card target), le `over.id` sera le column id (div), pas un row id. L'implementation actuelle cherche la colonne par `col.id === overRowId` — ca couvre ce cas. Mais si les IDs de colonnes collisionnent avec des IDs de rows Baserow (improbable mais possible), il faudrait un prefixe `col:` sur les IDs de colonnes. +3. **FullCalendar CSS** : `@fullcalendar/react` inclut son propre CSS (`@fullcalendar/common/main.css`). Il faut l'importer globalement dans l'app ou dans le composant. Le CSS Mantine-compat dans `calendar-renderer.module.css` override les styles FullCalendar mais ne les importe pas. +4. **@mantine/dates** : `DateInput` dans `inline-editor.tsx` vient de `@mantine/dates` qui necessite une installation separee (`pnpm add @mantine/dates`). A ajouter aux deps. + +--- + ### TODO rebrand complet (futur) - Logo SVG / favicon DocAdenice (actuellement reutilise `/icons/favicon-32x32.png` upstream)