Commit graph

15 commits

Author SHA1 Message Date
23a85267bf feat(acadenice): add sync blocks for cross-page content sharing — R4.2
Implements Notion-style sync blocks: a Tiptap node whose content is shared
across N pages. Editing via the Hocuspocus overlay propagates to all instances
via Yjs collab + SSE broadcast (EventEmitter2 bus).

Server: DB migration, NestJS module (CRUD + BFS cycle detection + broadcast),
Hocuspocus persistence extension extended for sync-block-* docs, 3 new RBAC
permissions (sync_blocks:create/edit/delete), seeded to Admin/Editor/Member.

Client: SyncBlockExtension (Tiptap node), SyncBlockNodeView (NodeView +
Mantine Modal overlay + SSE hook), /sync-block slash command, service client.

Tests: 32 server Jest + 18 client Vitest, all green.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 11:40:12 +02:00
d0b75774d8 feat(acadenice): add timeline view (Gantt) for databases — R4.1
- New TimelineRenderer using @fullcalendar/timeline + @fullcalendar/resource-timeline
- Column mapping config (title/start/end/resource) persisted in bridge Redis TTL 30d
- useTimelineConfig hook (GET+POST /views/:viewId/timeline-config)
- Inline config panel shown on first use; re-accessible via Configure button
- Resource swimlane mode activated automatically when resourceCol is configured
- eventResize persists endCol via useUpdateRow (respects canWriteRows)
- End date fallback: start + 1 day when endCol is absent
- InsertDatabaseModal extended with step 3 for column mapping on timeline views
- database-view-component dispatches timeline viewType to TimelineRenderer
- 14 client Vitest tests + 12 bridge Vitest tests (26 total new, all green)
- 0 TypeScript errors (client + bridge)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 11:27:11 +02:00
4cf04080cf fix(acadenice): resolve test suite failures across R3 sub-blocks (Patch 017)
- Convert 17 server spec files from vitest to Jest (vi -> jest globals)
- Add jest.mock stubs for ESM-only prosemirror/html and collaboration modules
- Fix Zod v4 strict UUID validation failures in test fixtures (version byte [1-8] required)
- Add JwtAuthGuard.overrideGuard in all controller specs that lacked it
- Fix jest.Mock type inference (ReturnType<typeof jest.fn> -> jest.Mock) to prevent 'never' arg errors
- Delete vitest.config.ts (CJS), keep vitest.config.mts (ESM-compatible) on client
- Add global mocks for @excalidraw/excalidraw and @/main.tsx in client test-setup
- Result: client 38/38 suites 313/313 tests, server acadenice 21/21 suites 210/210 tests, 0 TS errors

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 10:36:19 +02:00
be951a22ac feat(acadenice): add inline comments threads for R3.8 (30 tests, Patch 016)
Page comments: REST resolve/unresolve facade over native comments table
(PageCommentResolveService + CollaborationGateway yjs mark sync).
Row comments: new acadenice_row_comment table + full CRUD + resolve
(RowCommentService, RowCommentsController) + React panel in RowDetailModal.
4 new permissions: comments:read/write/resolve/moderate (30 total).
i18n FR+EN. R3 ENTIEREMENT TERMINE.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 02:47:15 +02:00
7d076aa86f feat(acadenice): add mentions notifications system for R3.7 (45 tests, Patch 015)
Bridges native Docmost mention notification pipeline (already active for
collab path) to the REST API path via NotificationEmitterService.  Adds
AcadeniceNotificationsModule with mention detector, notification facade API,
preferences endpoint, /notifications full page, /settings/notifications
preferences page, and bell count polling (30s).  No new DB migration —
native notifications table handles page.user_mention.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 02:29:01 +02:00
614533f228 feat(acadenice): add page templates system for R3.6 (65 tests, Patch 014)
- DB migration: acadenice_template table (JSONB content, is_built_in, is_workspace_default, usage_count)
- 3 new permissions: templates:read|create|manage — catalogue goes to 26
- NestJS AcadeniceTemplatesModule: TemplateService (CRUD + instantiate + setDefault), TemplateSeedService (5 built-ins), TemplatesController (7 endpoints)
- Built-in seed: Meeting Note, Project Brief, Daily Standup, Weekly Review, Empty Page — clone-then-edit pattern
- Frontend: templates-admin gallery (TemplatesPage /settings/templates, TemplateGallery, TemplateCard, TemplateForm)
- Frontend: TemplatePickerModal — opened via "New page from template" sidebar dropdown + /template slash command (custom DOM event)
- i18n: 39 keys FR + EN
- Tests: 40 backend (22 service + 18 controller) + 25 frontend (9 client + 9 page + 7 card) = 65 tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 02:12:58 +02:00
aac0149e7a feat(acadenice): add graph view UI for R3.5.2 (58 tests, Patch 013)
Frontend knowledge-graph page at /graph. Force-directed canvas via
react-force-graph-2d (lazy-loaded, falls back to placeholder when lib
absent). Controls sidebar: space filter, edge-type checkboxes, depth
slider 1-5, include-orphans toggle, node search, stats, truncated
banner. Side panel Drawer on node click: title, space, in/out degree,
open-page CTA. Jotai atoms for cross-component state. React Query
hook with 300ms debounce. Interactions: zoom/pan/drag, click->side
panel, double-click->navigate, right-click->focus, Esc/F keyboard.
Upstream patches: +route /graph in App.tsx, +Graph nav entry in
global-sidebar, +24 i18n keys FR+EN.

New deps (not installed): react-force-graph-2d, d3-force.
Completes R3.5 entirely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 01:39:13 +02:00
9be979ee90 feat(acadenice): add dual editor (WYSIWYG + markdown source) for R3.4
Custom bidirectional markdown converter (no new deps) with full round-trip
support for database-view, wikilink, mention nodes. DualEditor component wraps
PageEditor with a toolbar toggle (WYSIWYG<->markdown), lossy-switch modal, and
localStorage persistence per page. 77 tests covering 24 round-trip cases + 4
custom nodes + 9 edge cases. i18n FR+EN.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 01:18:29 +02:00
4e2af88144 feat(acadenice): add custom slash commands system for R3.3
Workspace admins can declare dynamic /keyword commands via settings UI
without recompile. Five action types: insert-template, insert-table,
embed-url, run-webhook, insert-snippet. Webhook security: HTTPS-only,
ACADENICE_WEBHOOK_ALLOWLIST allowlist, 10s timeout, no redirects, 1MB cap.
New permission slash_commands:manage added to catalogue (23 perms) and
seeded to Owner + Admin roles.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 01:06:11 +02:00
2fc310a2f2 feat(acadenice): add bidirectional backlinks + wikilinks for R3.2
- Migration: acadenice_backlink table (source/target/link_type/excerpt/workspace)
  with 3 indexes and UNIQUE(source,target,type) constraint. Up+down.
- Backend module AcadeniceBacklinksModule:
  BacklinkParserService: walks Tiptap JSON, extracts wikilinks/mentions/databaseView.
  BacklinkIndexerService: idempotent delete-then-insert per page save.
  BacklinkService: permission-aware query (space_members / public visibility).
  BacklinksController: GET /api/acadenice/pages/:pageId/backlinks (JWT auth).
  PageContentUpdatedListener: OnEvent handler for collab saves -> async reindex.
  Tests: 16 Vitest specs (parser/indexer/service/controller).
- PersistenceExtension patch: emits ACADENICE_PAGE_CONTENT_UPDATED_EVENT after
  each collab onStoreDocument (fire-and-forget, no impact on save path).
- CoreModule patch: imports AcadeniceBacklinksModule.
- Frontend WikilinkExtension: Tiptap inline atom node, [[Title]] / [[Title|alias]],
  Suggestion popup (reuses mention pattern + floating-ui), ReactNodeView with
  broken-link state, insertWikilink command.
  Tests: 9 Vitest specs (schema/attrs/commands/HTML parse+render).
- LinkedReferencesPanel: React Query useBacklinks(pageId, staleTime=30s),
  accordion grouped by link_type, excerpt preview, navigate to source page.
  Tests: 7 Vitest specs (loading/error/empty/render/navigate/groups).
- extensions.ts patch: + WikilinkExtension in mainExtensions[].
- full-editor.tsx patch: + LinkedReferencesPanel below editor (Divider + panel).
- i18n: 11 keys added in en-US and fr-FR (backlinks.* + wikilink.*).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 00:51:02 +02:00
ba8d8678a0 test(e2e): add data-testid attributes for Playwright e2e (Patch 008 R3.1.e)
Minimal testid additions to 4 renderer files so Playwright can target
stable selectors: table-renderer, cell-{rowId}-{fieldName}, kanban-board,
kanban-column-{label}, kanban-card-{rowId}, calendar-renderer,
inline-editor-input, inline-editor-readonly.

Also adds Dockerfile.e2e for the client build used in docker-compose.e2e.yml.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 00:37:39 +02:00
f3fae2ac78 feat(client): add kanban + calendar renderers + inline edit for R3.1.d
- KanbanRenderer: @dnd-kit drag-drop, group by single_select field,
  optimistic update + rollback, empty column placeholder, read-only mode
- CalendarRenderer: @fullcalendar month/week/day toggle, eventDrop ->
  PATCH date field, event click -> RowDetailModal, stub deps noted
- InlineEditor: polymorphic (text/number/date/select/multi-select),
  save on blur/Enter, cancel on Escape, permission denied read-only
- RowDetailModal: simple field detail view opened from calendar events
- useUpdateRow: generic PATCH with React Query v5 optimistic+rollback
- usePermissions: reads acadenice_permissions from window global or cookie
- patchRow helper added to bridge-client.ts
- DatabaseViewComponent: dispatches kanban/calendar to real renderers
- TableRenderer: integrates InlineEditor on double-click cells
- i18n: +12 keys (kanban.*, calendar.*, edit.*, row_detail.*) in en-US + fr-FR
- 5 new test suites: kanban, calendar, inline-editor, use-update-row, use-permissions
- Updated database-view-component.test.tsx for R3.1.d dispatch

Deps to install: @dnd-kit/core@^6 @dnd-kit/sortable@^8 @dnd-kit/utilities@^3
  @fullcalendar/react@^6 @fullcalendar/daygrid@^6
  @fullcalendar/timegrid@^6 @fullcalendar/interaction@^6

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 00:24:12 +02:00
71c2abad8a feat(client): add database-view Tiptap extension for R3.1.c
- Tiptap Node extension (database-view) with attrs tableId/viewId/viewType/bridgeUrl
- NodeViewWrapper dispatches on viewType: grid/table -> TableRenderer, other -> PlaceholderRenderer
- TableRenderer (HTML table, TanStack Table v8 migration-ready - dep not yet installed)
- InsertDatabaseModal (Mantine, 2-step: table -> view selection)
- useDatabaseRealtimeUpdates SSE hook (EventSource + exponential backoff + React Query invalidation)
- bridge-client.ts (axios wrapper, per-origin singleton, cookie Bearer passthrough)
- Slash command /database registered in menu-items CommandGroups
- DatabaseViewExtension wired in mainExtensions array
- i18n: 22 keys added in en-US and fr-FR
- 41 Vitest tests across 5 suites (extension schema, component dispatch, renderer states, modal steps, SSE hook)

Upstream patches: extensions.ts (+2 lines), menu-items.ts (+4 lines), 2 translation files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 00:07:33 +02:00
4d8bd250be feat(rbac): R2.3a endpoint /permissions/me + frontend hook propre 2026-05-07 22:58:22 +02:00
022add9acc feat(rbac): R2.2 frontend pages settings RBAC dynamique avec PermissionMatrix
- Pages /settings/roles (liste + filtres + create), /settings/roles/:id (matrix
  permissions + danger zone), /settings/users/:userId/roles (multi-select +
  preview union)
- PermissionMatrix : groupes Mantine cards, wildcard <group>:* qui grise les
  individuals, admin:* qui court-circuite tout, indeterminate states, tooltips
  avec descriptions du catalogue
- React Query hooks pour CRUD roles + assignations user-roles, notifications
  Mantine sur succes / erreurs avec extraction du message backend
- Hook useAcadenicePermissions : best-effort lecture du claim JWT R2.1, fallback
  sur role natif Docmost (defense en profondeur — backend reste source de verite)
- i18n complet FR + EN (~80 cles)
- Vitest + Testing Library introduits dans apps/client (devDeps + config + setup)
- 22 tests couvrant matrix wildcards, list filters, detail save/delete flow,
  multi-select assignments
- Patches upstream minimaux : 3 routes ajoutees au router, 1 entree sidebar
  (visible si canManageRoles)
- Documente comme Patch 004 dans ACADENICE_PATCHES.md
2026-05-07 22:42:39 +02:00