Commit Graph
26 Commits
Author SHA1 Message Date
Philipinho bfa85b9835 fix(base): scope per-base UI atoms by pageId to prevent embed render loops
Two BaseTable instances on the same page (e.g. multiple base embeds in
one document) shared the same global jotai atoms for activeViewId,
editingCell, property menu state, and row selection. Each instance's
useEffect that synced activeViewId would clobber the other's value
every render, pinning React into a "Maximum update depth exceeded"
loop.

Convert every UI atom in base-atoms.ts to an atomFamily keyed by pageId
so each base owns its own scope, and thread pageId through the grid
component tree (GridRow, GridCell, GridHeaderCell, RowNumberCell,
RowNumberHeaderCell, PropertyMenuContent) plus useRowSelection so each
consumer reaches the per-base atom. use-base-socket already had pageId
in scope; its store.get/store.set calls now resolve through
selectedRowIdsAtomFamily(pageId) too.
2026-04-27 21:35:39 +01:00
Philipinho cd8d1e0ed8 feat(base): make column headers sticky in standalone and inline contexts
Split the unified .gridWrapper into a sticky band (containing column
headers, plus banner + toolbar in inline) and a body grid that owns
horizontal scroll. The band's vertical sticky anchor is automatic CSS:
the table's scrollport in standalone, the page in inline. A small
useHorizontalScrollSync hook mirrors body scrollLeft onto the header
and turns wheel-on-header into pan-on-body.
2026-04-27 20:25:13 +01:00
Philipinho fc13520322 feat(base): add useHorizontalScrollSync hook 2026-04-27 13:59:07 +01:00
Philipinho 3e9f26a8dd refactor(base): rename baseId to pageId in client atoms, hooks, types 2026-04-27 01:42:54 +01:00
Philipinho dcff8d3c53 fix(base): mirror filter-clear fix for sorts so deleting the last sort sticks 2026-04-24 03:04:51 +01:00
Philipinho f99450f04a fix formula 2026-04-24 01:33:14 +01:00
Philipinho 28fed815ba feat(base): add formula editor popover with live parse and palette 2026-04-24 00:35:26 +01:00
Philipinho 46f9292c05 feat(base): subscribe to formula WS events on client 2026-04-24 00:29:23 +01:00
Philipinho f524243da1 refactor(base): accept baselineConfig option in useBaseTable 2026-04-20 22:47:00 +01:00
Philipinho d5093da863 feat(base): add useViewDraft hook for local filter/sort drafts 2026-04-20 22:44:05 +01:00
Philipinho 44ec2dbe88 fix(base): stop jsonb char-key corruption in seed and guard view config spread 2026-04-18 23:26:03 +01:00
Philipinho 93b1fc534b fix(base): adopt server view state when no local edit is pending 2026-04-18 22:03:25 +01:00
Philipinho ab9b00f91c fix(base): include new properties in local column state so the grid can scroll to them 2026-04-18 21:11:09 +01:00
Philipinho c6f993b610 fix(base): only re-seed column state when view identity changes 2026-04-18 19:23:56 +01:00
Philipinho 53ee685874 refactor(base): extract buildViewConfigFromTable helper 2026-04-18 19:21:17 +01:00
Philipinho 5c11e59128 fix(base): stabilize properties identity to break render loop 2026-04-18 18:48:41 +01:00
Philipinho b6882d774b fix(base): widen row-number column so drag grip sits left of checkbox 2026-04-18 17:09:00 +01:00
Philipinho 8994575437 feat(base): confirm before bulk deleting selected rows 2026-04-18 17:00:43 +01:00
Philipinho b6b6e1809a feat(base): reconcile bulk delete over socket + prune selection 2026-04-18 16:47:05 +01:00
Philipinho 05406640f0 feat(base): floating selection action bar with bulk delete 2026-04-18 16:44:07 +01:00
Philipinho fda163311a feat(base): add use-row-selection hook 2026-04-18 16:37:47 +01:00
Philipinho f8edb587e4 feat(base): add useListKeyboardNav hook for dropdown keyboard nav 2026-04-18 14:48:30 +01:00
Philipinho 6d9107b727 refactor(base): drop unused schema:bumped socket handler 2026-04-18 13:23:36 +01:00
Philipinho 89638fb11d refactor(base): append remote row creates to cache instead of invalidating 2026-04-18 13:15:49 +01:00
Philipinho f5b19316af Base WIP 2026-04-18 13:13:53 +01:00
Philipinho 94ee1e80fb feat: bases - WIP 2026-03-08 00:56:24 +00:00