@arbidocs/blocks 0.5.99 → 0.5.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/dist/ConnectedCallDock-OJ4UR5PR.js +1 -1
- package/dist/ConnectedCallDock-OKH3FT2U.cjs +1 -1
- package/dist/ConnectedCallRoom-NB7I6RLQ.cjs +1 -1
- package/dist/ConnectedCallRoom-OX7ZIF76.js +1 -1
- package/dist/{ConnectedNativeDocxComparison-F4XKHVTI.cjs → ConnectedNativeDocxComparison-6BQ2WFF6.cjs} +9 -9
- package/dist/{ConnectedNativeDocxComparison-F4XKHVTI.cjs.map → ConnectedNativeDocxComparison-6BQ2WFF6.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-TDWHGYQX.js → ConnectedNativeDocxComparison-DIRGCHMY.js} +8 -8
- package/dist/{ConnectedStreamedWordArtifact-ZPFR5HFS.js.map → ConnectedNativeDocxComparison-DIRGCHMY.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-J3E3QDFA.cjs → ConnectedNativeDocxEditor-4HNYAZEG.cjs} +9 -9
- package/dist/{ConnectedNativeDocxEditor-J3E3QDFA.cjs.map → ConnectedNativeDocxEditor-4HNYAZEG.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-O7QB6DVI.js → ConnectedNativeDocxEditor-DKSE3R6C.js} +7 -7
- package/dist/{ConnectedNativeDocxEditor-O7QB6DVI.js.map → ConnectedNativeDocxEditor-DKSE3R6C.js.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-34NEZNEQ.js → ConnectedProductionSetDialog-34UV5VH2.js} +3 -3
- package/dist/{ConnectedProductionSetDialog-34NEZNEQ.js.map → ConnectedProductionSetDialog-34UV5VH2.js.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-NFASXSLG.cjs → ConnectedProductionSetDialog-XH725VSO.cjs} +3 -3
- package/dist/{ConnectedProductionSetDialog-NFASXSLG.cjs.map → ConnectedProductionSetDialog-XH725VSO.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-UR4LM4RB.cjs → ConnectedStreamedWordArtifact-S5I5QCZ7.cjs} +9 -9
- package/dist/ConnectedStreamedWordArtifact-S5I5QCZ7.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-ZPFR5HFS.js → ConnectedStreamedWordArtifact-USNAF4ZM.js} +8 -8
- package/dist/{ConnectedNativeDocxComparison-TDWHGYQX.js.map → ConnectedStreamedWordArtifact-USNAF4ZM.js.map} +1 -1
- package/dist/{DocumentReviewCard-7VJ3MMYG.cjs → DocumentReviewCard-QHYHBDUA.cjs} +14 -14
- package/dist/{DocumentReviewCard-7VJ3MMYG.cjs.map → DocumentReviewCard-QHYHBDUA.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-5NZM6FOB.js → DocumentReviewCard-TFAJYWS6.js} +9 -9
- package/dist/{DocumentReviewCard-5NZM6FOB.js.map → DocumentReviewCard-TFAJYWS6.js.map} +1 -1
- package/dist/{FilesViewerDialog-EQ4UT6LW.js → FilesViewerDialog-LE5GQQDX.js} +12 -12
- package/dist/{FilesViewerDialog-EQ4UT6LW.js.map → FilesViewerDialog-LE5GQQDX.js.map} +1 -1
- package/dist/{FilesViewerDialog-XIJAGQAU.cjs → FilesViewerDialog-Y5YZJ5O2.cjs} +13 -13
- package/dist/{FilesViewerDialog-XIJAGQAU.cjs.map → FilesViewerDialog-Y5YZJ5O2.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-6MLEC6I6.cjs → WorkspaceTableView-3D6SYOWT.cjs} +5 -5
- package/dist/{WorkspaceTableView-6MLEC6I6.cjs.map → WorkspaceTableView-3D6SYOWT.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-YGLOQ6JA.js → WorkspaceTableView-WD754UBK.js} +4 -4
- package/dist/{WorkspaceTableView-YGLOQ6JA.js.map → WorkspaceTableView-WD754UBK.js.map} +1 -1
- package/dist/agents/index.cjs +187 -187
- package/dist/agents/index.js +5 -5
- package/dist/ai-5JTBFZAO.js +1 -1
- package/dist/ai-ZLZNDUUS.cjs +1 -1
- package/dist/calls/index.cjs +1 -1
- package/dist/calls/index.js +1 -1
- package/dist/chat/index.cjs +1 -1
- package/dist/chat/index.js +1 -1
- package/dist/{chunk-ERDQ4DAX.cjs → chunk-2GFB43GN.cjs} +4 -4
- package/dist/{chunk-ERDQ4DAX.cjs.map → chunk-2GFB43GN.cjs.map} +1 -1
- package/dist/{chunk-CS4KQSLY.cjs → chunk-2ROYKDEA.cjs} +5 -5
- package/dist/{chunk-CS4KQSLY.cjs.map → chunk-2ROYKDEA.cjs.map} +1 -1
- package/dist/{chunk-YHNTGQSW.cjs → chunk-2VWE46ZF.cjs} +114 -57
- package/dist/chunk-2VWE46ZF.cjs.map +1 -0
- package/dist/{chunk-6KKVJ2V6.js → chunk-3PV25ICC.js} +3 -3
- package/dist/{chunk-6KKVJ2V6.js.map → chunk-3PV25ICC.js.map} +1 -1
- package/dist/{chunk-IK4MSXXR.cjs → chunk-4IRS55N2.cjs} +50 -31
- package/dist/chunk-4IRS55N2.cjs.map +1 -0
- package/dist/{chunk-4WW34DPM.js → chunk-4IXUIRXB.js} +4 -4
- package/dist/{chunk-4WW34DPM.js.map → chunk-4IXUIRXB.js.map} +1 -1
- package/dist/{chunk-WYLY5UQ4.js → chunk-5ZUA3JRB.js} +3 -3
- package/dist/{chunk-WYLY5UQ4.js.map → chunk-5ZUA3JRB.js.map} +1 -1
- package/dist/{chunk-UOGXKHTJ.cjs → chunk-6KQVTMRL.cjs} +3 -3
- package/dist/{chunk-UOGXKHTJ.cjs.map → chunk-6KQVTMRL.cjs.map} +1 -1
- package/dist/{chunk-KBXATCF4.cjs → chunk-ANT32I6E.cjs} +8 -8
- package/dist/{chunk-KBXATCF4.cjs.map → chunk-ANT32I6E.cjs.map} +1 -1
- package/dist/{chunk-SWW3KBH2.js → chunk-AZGELQSS.js} +4 -4
- package/dist/{chunk-SWW3KBH2.js.map → chunk-AZGELQSS.js.map} +1 -1
- package/dist/{chunk-RAF72BBC.cjs → chunk-DVGT3MU6.cjs} +4 -4
- package/dist/{chunk-RAF72BBC.cjs.map → chunk-DVGT3MU6.cjs.map} +1 -1
- package/dist/{chunk-TVJAVK2G.js → chunk-DW5DFV4O.js} +4 -4
- package/dist/{chunk-TVJAVK2G.js.map → chunk-DW5DFV4O.js.map} +1 -1
- package/dist/{chunk-4AQ47AB4.js → chunk-DWSSFIK2.js} +3 -3
- package/dist/{chunk-4AQ47AB4.js.map → chunk-DWSSFIK2.js.map} +1 -1
- package/dist/{chunk-ZXEGVXEV.cjs → chunk-FXR6YYPC.cjs} +4 -4
- package/dist/{chunk-ZXEGVXEV.cjs.map → chunk-FXR6YYPC.cjs.map} +1 -1
- package/dist/{chunk-POEWHRQV.js → chunk-G7DQFL52.js} +8 -8
- package/dist/{chunk-POEWHRQV.js.map → chunk-G7DQFL52.js.map} +1 -1
- package/dist/{chunk-MT3RPUQC.cjs → chunk-H7UDEZEO.cjs} +4 -4
- package/dist/{chunk-MT3RPUQC.cjs.map → chunk-H7UDEZEO.cjs.map} +1 -1
- package/dist/{chunk-3VKULQEG.js → chunk-HPS5O6XK.js} +6 -6
- package/dist/{chunk-LT2RPGKW.cjs.map → chunk-HPS5O6XK.js.map} +1 -1
- package/dist/{chunk-ETYBZA5E.cjs → chunk-IGVTLCHD.cjs} +4 -4
- package/dist/{chunk-ETYBZA5E.cjs.map → chunk-IGVTLCHD.cjs.map} +1 -1
- package/dist/{chunk-J24LYNTY.cjs → chunk-ILH2KOHA.cjs} +37 -37
- package/dist/{chunk-J24LYNTY.cjs.map → chunk-ILH2KOHA.cjs.map} +1 -1
- package/dist/{chunk-7F5Z4K5W.js → chunk-IU5CHOEU.js} +9 -10
- package/dist/chunk-IU5CHOEU.js.map +1 -0
- package/dist/{chunk-ZATTTPWL.cjs → chunk-KCP42W67.cjs} +4 -4
- package/dist/{chunk-ZATTTPWL.cjs.map → chunk-KCP42W67.cjs.map} +1 -1
- package/dist/{chunk-YG4S7OCD.js → chunk-LNWEJJUY.js} +3 -3
- package/dist/{chunk-YG4S7OCD.js.map → chunk-LNWEJJUY.js.map} +1 -1
- package/dist/{chunk-KYR3TXHS.js → chunk-OLCQPGB4.js} +3 -3
- package/dist/{chunk-KYR3TXHS.js.map → chunk-OLCQPGB4.js.map} +1 -1
- package/dist/{chunk-STCXXO7T.js → chunk-PGCKTXYH.js} +3 -3
- package/dist/{chunk-STCXXO7T.js.map → chunk-PGCKTXYH.js.map} +1 -1
- package/dist/{chunk-X426D2LX.cjs → chunk-Q3OLTA47.cjs} +4 -4
- package/dist/{chunk-X426D2LX.cjs.map → chunk-Q3OLTA47.cjs.map} +1 -1
- package/dist/{chunk-UBI4HXT6.js → chunk-Q45LV2DL.js} +5 -5
- package/dist/{chunk-UBI4HXT6.js.map → chunk-Q45LV2DL.js.map} +1 -1
- package/dist/{chunk-ZARYAYQO.js → chunk-QAKL6LNR.js} +12 -12
- package/dist/{chunk-ZARYAYQO.js.map → chunk-QAKL6LNR.js.map} +1 -1
- package/dist/{chunk-JL6MDUV7.cjs → chunk-QSPKL754.cjs} +30 -30
- package/dist/{chunk-JL6MDUV7.cjs.map → chunk-QSPKL754.cjs.map} +1 -1
- package/dist/{chunk-HJBVSG6H.cjs → chunk-QYDMOBGP.cjs} +4 -4
- package/dist/{chunk-HJBVSG6H.cjs.map → chunk-QYDMOBGP.cjs.map} +1 -1
- package/dist/{chunk-OYSTBNNA.js → chunk-R3AHNYSS.js} +3 -3
- package/dist/{chunk-OYSTBNNA.js.map → chunk-R3AHNYSS.js.map} +1 -1
- package/dist/{chunk-EMTRPNYB.js → chunk-RP3IDFHS.js} +3 -3
- package/dist/{chunk-EMTRPNYB.js.map → chunk-RP3IDFHS.js.map} +1 -1
- package/dist/{chunk-3BCKTFOP.cjs → chunk-RV2YGRV6.cjs} +53 -53
- package/dist/{chunk-3BCKTFOP.cjs.map → chunk-RV2YGRV6.cjs.map} +1 -1
- package/dist/{chunk-SWILV6LT.cjs → chunk-TGHBXJTN.cjs} +4 -4
- package/dist/{chunk-SWILV6LT.cjs.map → chunk-TGHBXJTN.cjs.map} +1 -1
- package/dist/{chunk-LT2RPGKW.cjs → chunk-TQXMASFX.cjs} +16 -16
- package/dist/chunk-TQXMASFX.cjs.map +1 -0
- package/dist/{chunk-I44X7O6X.js → chunk-UPXQDULH.js} +112 -55
- package/dist/chunk-UPXQDULH.js.map +1 -0
- package/dist/{chunk-L3V2ANBD.js → chunk-VEHHI5WS.js} +3 -3
- package/dist/{chunk-L3V2ANBD.js.map → chunk-VEHHI5WS.js.map} +1 -1
- package/dist/{chunk-6OEAZ2TJ.js → chunk-VJQCOZ7O.js} +50 -31
- package/dist/chunk-VJQCOZ7O.js.map +1 -0
- package/dist/{chunk-VD33HXFZ.cjs → chunk-WW2H5C6L.cjs} +28 -28
- package/dist/{chunk-VD33HXFZ.cjs.map → chunk-WW2H5C6L.cjs.map} +1 -1
- package/dist/{chunk-OOYT5A7W.js → chunk-X2QJWFFO.js} +3 -3
- package/dist/{chunk-OOYT5A7W.js.map → chunk-X2QJWFFO.js.map} +1 -1
- package/dist/{chunk-3CV4M6MB.js → chunk-XCE4HB3F.js} +3 -3
- package/dist/{chunk-3CV4M6MB.js.map → chunk-XCE4HB3F.js.map} +1 -1
- package/dist/{chunk-LKK52DEY.cjs → chunk-XNXNLXIC.cjs} +9 -10
- package/dist/chunk-XNXNLXIC.cjs.map +1 -0
- package/dist/{chunk-OC5K2J6V.cjs → chunk-YMNKMIFG.cjs} +3 -3
- package/dist/{chunk-OC5K2J6V.cjs.map → chunk-YMNKMIFG.cjs.map} +1 -1
- package/dist/collaboration/index.cjs +70 -70
- package/dist/collaboration/index.js +2 -2
- package/dist/connect/docx.cjs +12 -12
- package/dist/connect/docx.js +8 -8
- package/dist/connect/index.cjs +888 -825
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +287 -224
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +11 -11
- package/dist/connect/viewer.js +10 -10
- package/dist/connection/files/grid/documentCellRenderers.d.ts +72 -0
- package/dist/connection/files/grid/documentColumns.d.ts +2 -2
- package/dist/connection/files/grid/useDocumentGridSync.d.ts +4 -15
- package/dist/connection/files/grid/useDocumentTable.d.ts +0 -1
- package/dist/databases/index.cjs +49 -49
- package/dist/databases/index.js +2 -2
- package/dist/embed/index.cjs +17 -17
- package/dist/embed/index.js +11 -11
- package/dist/facts/index.cjs +43 -43
- package/dist/facts/index.js +2 -2
- package/dist/files/index.cjs +224 -224
- package/dist/files/index.js +2 -2
- package/dist/index.cjs +353 -353
- package/dist/index.js +12 -12
- package/dist/settings/index.cjs +1 -1
- package/dist/settings/index.js +1 -1
- package/dist/studio/index.cjs +1 -1
- package/dist/studio/index.js +1 -1
- package/dist/tags/TagTable.d.ts +4 -1
- package/dist/workflow-canvas/index.cjs +25 -25
- package/dist/workflow-canvas/index.js +14 -14
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +10 -6
- package/dist/ConnectedStreamedWordArtifact-UR4LM4RB.cjs.map +0 -1
- package/dist/chunk-3VKULQEG.js.map +0 -1
- package/dist/chunk-6OEAZ2TJ.js.map +0 -1
- package/dist/chunk-7F5Z4K5W.js.map +0 -1
- package/dist/chunk-I44X7O6X.js.map +0 -1
- package/dist/chunk-IK4MSXXR.cjs.map +0 -1
- package/dist/chunk-LKK52DEY.cjs.map +0 -1
- package/dist/chunk-YHNTGQSW.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/files/grid-test-ids.ts","../src/files/GridView.tsx"],"names":[],"mappings":"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","file":"chunk-7F5Z4K5W.js","sourcesContent":["/**\n * Test-id hooks for AG Grid, which owns its row and cell DOM. AG Grid stamps every row with a\n * `row-id` attribute and every cell with `col-id`; these helpers turn them into `data-testid`s\n * a host chooses, so a custom UI keeps its own test-id scheme.\n */\n\nexport interface GridTestIdOptions<T> {\n /** Test id of the row for `item` (set on the centre-column row element). */\n getRowTestId?: (item: T) => string\n /** Test id of the cell in column `colId` of `item`. */\n getCellTestId?: (colId: string, item: T) => string\n}\n\n/** Stamp `data-testid`s onto the rows and cells under `root`. Idempotent. */\nexport function applyGridTestIds<T>(\n root: ParentNode,\n itemsById: Map<string, T>,\n { getRowTestId, getCellTestId }: GridTestIdOptions<T>\n): void {\n if (!getRowTestId && !getCellTestId) return\n root.querySelectorAll<HTMLElement>('.ag-center-cols-container .ag-row[row-id]').forEach((row) => {\n const item = itemsById.get(row.getAttribute('row-id') ?? '')\n if (item === undefined) return\n if (getRowTestId) row.setAttribute('data-testid', getRowTestId(item))\n if (getCellTestId) {\n row.querySelectorAll<HTMLElement>('.ag-cell[col-id]').forEach((cell) => {\n cell.setAttribute('data-testid', getCellTestId(cell.getAttribute('col-id') ?? '', item))\n })\n }\n })\n}\n\n/**\n * Keep the ids applied as AG Grid creates and recycles rows (it virtualises). Returns the\n * disconnect function.\n */\nexport function watchGridTestIds<T>(\n root: HTMLElement,\n getItemsById: () => Map<string, T>,\n options: GridTestIdOptions<T>\n): () => void {\n if (!options.getRowTestId && !options.getCellTestId) return () => {}\n const run = () => applyGridTestIds(root, getItemsById(), options)\n run()\n if (typeof MutationObserver === 'undefined') return () => {}\n const observer = new MutationObserver(run)\n observer.observe(root, { childList: true, subtree: true })\n return () => observer.disconnect()\n}\n","/**\n * GridView — a flexible AG Grid presentational core.\n *\n * Pure and app-agnostic: it owns no global state and pulls in no store. Column\n * state persistence (order / width / visibility / sort / filter) is exposed as a\n * controlled/uncontrolled prop pair — `gridState` (initial state, read once at\n * mount) and `onGridStateChange` (called whenever AG Grid's state changes). An\n * app wires those to wherever it keeps the state (Zustand, localStorage, a URL,\n * a server) via a thin adapter; the core stays decoupled.\n *\n * Themed here (colours/fonts/borders via the host CSS variables, so it inherits the host's\n * light/dark theme). The structural helper classes (cell-numeric, multiline clamp, scrollbars,\n * row kebabs) live in `@arbidocs/blocks/grid.css`, which the consuming app imports globally.\n */\n\nimport React, { useRef, useCallback, useMemo, useEffect } from 'react'\nimport { AgGridReact } from 'ag-grid-react'\nimport {\n ColDef,\n GridOptions,\n GridApi,\n IRowNode,\n GridState,\n themeQuartz,\n CellValueChangedEvent,\n GridReadyEvent,\n RowClickedEvent,\n} from 'ag-grid-community'\nimport { AllCommunityModule } from 'ag-grid-community'\nimport { BREAKPOINT_QUERIES, useMediaQuery } from '../lib/use-media-query'\nimport { watchGridTestIds } from './grid-test-ids'\n\n// Create the custom ARBI theme using themeQuartz\n// Colours reference the host CSS variables (hsl(var(--token))), so dark mode follows the app.\n// This enables dark mode support and consistent theming\nconst cssVar = (name: string, alpha?: number): string =>\n alpha === undefined ? `hsl(var(--${name}))` : `hsl(var(--${name}) / ${alpha})`\n\nconst arbiTheme = themeQuartz.withParams({\n // Match TagTable: a plain canvas, muted header, fine row borders and a rounded frame.\n // Every colour is a host CSS variable, so light/dark follow the app with no .dark overrides.\n backgroundColor: cssVar('background'),\n foregroundColor: cssVar('foreground'),\n borderColor: cssVar('border'),\n headerBackgroundColor: cssVar('muted', 0.4),\n headerTextColor: cssVar('foreground'),\n oddRowBackgroundColor: cssVar('background'),\n rowHoverColor: cssVar('muted', 0.6),\n // Checkbox-selected rows: a light accent tint. A row opened elsewhere (e.g. the viewer) may take\n // the full accent, so the two states stay distinguishable.\n selectedRowBackgroundColor: cssVar('accent', 0.6),\n rangeSelectionBackgroundColor: cssVar('accent'),\n accentColor: cssVar('primary'),\n inputFocusBorder: { color: cssVar('primary') },\n headerColumnBorder: false,\n // Keep the header as quiet as TagTable; reveal resize handles on hover (see grid.css).\n headerColumnResizeHandleColor: 'transparent',\n headerColumnResizeHandleHeight: '40%',\n headerColumnResizeHandleWidth: 1,\n\n // Font settings — inherit the host app's font. A googleFont here never\n // loaded under the apps' CSP, so every grid silently fell back to the\n // browser's default SERIF and read as unstyled.\n fontFamily: 'inherit',\n fontSize: 14,\n headerFontSize: 14,\n headerFontWeight: 500,\n\n // Sizing\n headerHeight: 37,\n rowHeight: 40,\n cellHorizontalPadding: 12,\n\n // Borders - structural settings only.\n // Row border is a real hairline in the theme border colour (not hardcoded\n // white, which was invisible on the light-mode background and wrong in dark\n // mode) so adjacent rows are clearly separated — important now that rows can\n // be tall and multi-line (e.g. the Abstract column).\n rowBorder: { style: 'solid', width: 1, color: 'hsl(var(--border))' },\n columnBorder: false, // Row hairlines only\n wrapperBorder: { style: 'solid', width: 1, color: cssVar('border') },\n\n // Use the same radius token as TagTable's rounded-lg container.\n borderRadius: 'var(--radius-lg, 8px)',\n wrapperBorderRadius: 'var(--radius-lg, 8px)',\n checkboxBorderRadius: 2, // Keep checkboxes square\n})\n\n// Selection configuration\nexport interface GridViewSelection<T> {\n mode: 'single' | 'multiple'\n selected: T[]\n onSelectionChange: (items: T[]) => void\n /**\n * Keep the grid's ticked rows equal to `selected` after mount (default: `selected` only seeds the\n * grid). For a host that changes the selection itself, e.g. ticking a parent ticks its sub-tasks.\n */\n controlled?: boolean\n}\n\n// Empty state configuration\nexport interface GridViewEmptyState {\n icon?: React.ReactNode\n title?: string\n message?: string\n action?: React.ReactNode\n}\n\n/** Grid events GridView binds itself; `gridOptions` may not override them. */\ntype GridViewOwnedEvent =\n | 'onGridReady'\n | 'onFirstDataRendered'\n | 'onModelUpdated'\n | 'onSelectionChanged'\n | 'onCellValueChanged'\n | 'onRowClicked'\n | 'onStateUpdated'\n | 'onColumnVisible'\n\n// Generic props to make this grid reusable with different data types\nexport interface GridViewProps<T> {\n // Core data\n items: T[]\n // Column configuration\n columnDefs: ColDef<T>[]\n // Row identity function\n getItemId: (item: T) => string\n // Selection handling\n selection?: GridViewSelection<T>\n // Empty state\n emptyState?: GridViewEmptyState\n // Loading state\n isLoading?: boolean\n loadingMessage?: string\n // Grid options. The events GridView handles itself are left out: they are spread over its own\n // handlers, so passing one here silently replaced them (an `onGridReady` here left the grid api\n // unset and selection never reached `selection.onSelectionChange`). Use the dedicated props.\n gridOptions?: Partial<Omit<GridOptions<T>, GridViewOwnedEvent>>\n // Grid initialization\n onGridReady?: (params: { api: GridApi<T> }) => void\n // Cell value changes\n onCellValueChanged?: (event: CellValueChangedEvent<T>) => void\n // Row click handler\n onRowClick?: (item: T) => void\n // State persistence.\n // The core is decoupled from any store: when `persistState` is on it seeds\n // AG Grid from `gridState` (read once at mount) and reports every subsequent\n // state change through `onGridStateChange`. An app-adapter wires these to its\n // own store. `gridId` is retained as an opaque identity hint for adapters\n // (the core itself does not read it).\n persistState?: boolean\n gridId?: string\n // Persisted column/sort/filter state to restore at mount (controlled input).\n gridState?: GridState\n // Called whenever AG Grid's state changes so an adapter can persist it.\n onGridStateChange?: (state: GridState) => void\n // Initial visible columns (applied when no saved state exists)\n initialVisibleColumns?: string[]\n // Basic styling\n className?: string\n height?: string | number\n // Per-instance row height. Applied via the theme (not just gridOptions) so the\n // theme's calculated line-height tracks it and cell content stays vertically\n // centered. Fixed height — keeps row virtualization on the fast path.\n rowHeight?: number\n testId?: string\n // Pinned rows\n pinnedBottomRowData?: T[]\n pinnedTopRowData?: T[]\n // Pagination (disabled by default)\n pagination?: boolean\n paginationPageSizeSelector?: number[]\n // Test-id hooks: the grid owns its row/cell DOM, so ids are stamped onto it after render.\n // `getRowTestId` names a row; `getCellTestId` a cell (by colId). Without them AG Grid's own\n // `row-id` / `col-id` attributes are still there to select by.\n getRowTestId?: (item: T) => string\n getCellTestId?: (colId: string, item: T) => string\n // Force empty-state UI even when items.length > 0.\n // Used when rows are present but all hidden by an external filter.\n showEmpty?: boolean\n}\n\n/** Minimum row height on coarse pointers: 44px touch target + the 1px row border + breathing room. */\nconst TOUCH_ROW_HEIGHT = 52\n\nexport function GridView<T>({\n items,\n columnDefs,\n getItemId,\n selection,\n emptyState,\n isLoading = false,\n loadingMessage = 'Loading...',\n gridOptions,\n onGridReady,\n onCellValueChanged,\n onRowClick,\n persistState = false,\n gridState,\n onGridStateChange,\n initialVisibleColumns,\n className = 'w-full',\n height = 500,\n rowHeight: rowHeightProp,\n testId = 'grid-view',\n pinnedBottomRowData,\n pinnedTopRowData,\n pagination = false,\n paginationPageSizeSelector,\n getRowTestId,\n getCellTestId,\n showEmpty,\n}: GridViewProps<T>) {\n // Reference to the grid API\n const gridApiRef = useRef<GridApi<T> | null>(null)\n\n // On touch screens rows grow to a 44px-hit-area-friendly height: AG Grid clips cell content\n // (pills, filename buttons, avatar chips) to the row, so a taller hit area needs a taller row.\n const isCoarsePointer = useMediaQuery(BREAKPOINT_QUERIES.coarsePointer)\n const rowHeight = isCoarsePointer\n ? Math.max(rowHeightProp ?? gridOptions?.rowHeight ?? 40, TOUCH_ROW_HEIGHT)\n : rowHeightProp\n\n // Initial row height, captured once so it can live in the (stable) default\n // grid options. rowHeight is NOT passed as a reactive prop — that would make\n // the AgGridReact wrapper re-process grid options on every change and snap\n // manually-resized columns back to their colDef widths. Subsequent changes are\n // applied imperatively (see effect below).\n const initialRowHeightRef = useRef(rowHeight)\n\n // Persisted state to seed the grid with — captured once at mount so a reactive\n // `gridState` prop (e.g. an adapter re-reading its store each render) can never\n // re-initialise the grid mid-session. Mirrors AG Grid's own initialState,\n // which is read once.\n const initialGridStateRef = useRef(gridState)\n\n // Get initial state for the grid (read once at mount)\n const initialState = useMemo(() => {\n if (!persistState) return undefined\n return initialGridStateRef.current\n }, [persistState])\n\n // Save grid state via the adapter using modern AG Grid state API\n const saveGridState = useCallback(() => {\n if (!persistState || !onGridStateChange || !gridApiRef.current) return\n\n // Use AG Grid's comprehensive state API to capture complete state\n // This includes: filters, sort, column order, column visibility, column widths, etc.\n const state = gridApiRef.current.getState()\n\n onGridStateChange(state)\n }, [persistState, onGridStateChange])\n\n // Ensure selection column is visible after grid initialization\n const ensureSelectionColumnVisible = useCallback(() => {\n if (!gridApiRef.current || !selection?.mode) return\n\n // IMPORTANT: Force selection column to be visible after state restoration\n // This ensures even old saved states don't hide the selection column\n // Also handles case where selection column is completely missing from state\n const currentState = gridApiRef.current.getColumnState()\n const selectionColumn = currentState.find((col) => col.colId === 'ag-Grid-SelectionColumn')\n const selectionColumnIndex = currentState.findIndex(\n (col) => col.colId === 'ag-Grid-SelectionColumn'\n )\n\n // Fix if column is hidden OR missing entirely OR not in first position\n if (!selectionColumn || selectionColumn.hide || selectionColumnIndex !== 0) {\n // Use setColumnsVisible for more reliable visibility control\n gridApiRef.current.setColumnsVisible(['ag-Grid-SelectionColumn'], true)\n\n // Also apply state to ensure proper width\n gridApiRef.current.applyColumnState({\n state: [\n {\n colId: 'ag-Grid-SelectionColumn',\n hide: false,\n width: selectionColumn?.width || 48,\n pinned: null, // Ensure not pinned in wrong position\n },\n ],\n defaultState: { hide: undefined },\n applyOrder: false,\n })\n\n // Move selection column to first position if it's not there\n if (selectionColumnIndex !== 0) {\n gridApiRef.current.moveColumns(['ag-Grid-SelectionColumn'], 0)\n }\n }\n }, [selection?.mode])\n\n // Stamp host test ids onto AG Grid's rows and cells (it virtualises, so keep watching).\n const containerRef = useRef<HTMLDivElement>(null)\n const itemsRef = useRef(items)\n itemsRef.current = items\n const getItemIdRef = useRef(getItemId)\n getItemIdRef.current = getItemId\n const hasTestIdHooks = Boolean(getRowTestId || getCellTestId)\n useEffect(() => {\n const root = containerRef.current\n if (!root || !hasTestIdHooks) return\n return watchGridTestIds(\n root,\n () => new Map(itemsRef.current.map((item) => [getItemIdRef.current(item), item])),\n { getRowTestId, getCellTestId }\n )\n }, [hasTestIdHooks, getRowTestId, getCellTestId, isLoading])\n\n // Handle row ID\n const getRowId = useCallback(\n (params: { data: T }) => {\n return getItemId(params.data)\n },\n [getItemId]\n )\n\n // Refs for selection — avoids handleGridReady/handleSelectionChanged recreating\n // when selection object changes (which happens on every selectionConfig recompute)\n const selectionRef = useRef(selection)\n selectionRef.current = selection\n\n const onSelectionChangeRef = useRef(selection?.onSelectionChange)\n onSelectionChangeRef.current = selection?.onSelectionChange\n\n const syncingSelectionRef = useRef(false)\n\n const handleSelectionChanged = useCallback(() => {\n if (syncingSelectionRef.current) return\n if (!onSelectionChangeRef.current || !gridApiRef.current) return\n\n const selectedNodes = gridApiRef.current.getSelectedNodes()\n const selectedData = selectedNodes\n .map((node) => node.data)\n .filter((item): item is T => item !== undefined)\n\n onSelectionChangeRef.current(selectedData)\n }, [])\n\n // Handle row clicks\n // A controlled selection: tick and untick rows so the grid shows exactly `selection.selected`.\n const controlledSelected = selection?.controlled ? selection.selected : undefined\n useEffect(() => {\n const api = gridApiRef.current\n if (!api || api.isDestroyed() || !controlledSelected) return\n const wanted = new Set(controlledSelected.map(getItemId))\n const tick: IRowNode<T>[] = []\n const untick: IRowNode<T>[] = []\n api.forEachNode((node) => {\n if (!node.data) return\n const want = wanted.has(getItemId(node.data))\n if (want && !node.isSelected()) tick.push(node)\n else if (!want && node.isSelected()) untick.push(node)\n })\n syncingSelectionRef.current = true\n try {\n if (tick.length) api.setNodesSelected({ nodes: tick, newValue: true, source: 'api' })\n if (untick.length) api.setNodesSelected({ nodes: untick, newValue: false, source: 'api' })\n } finally {\n syncingSelectionRef.current = false\n }\n }, [controlledSelected, getItemId])\n\n const handleRowClicked = useCallback(\n (event: RowClickedEvent<T>) => {\n if (!onRowClick || !event.data) return\n // Don't fire when the click originated from an interactive element inside the cell\n // (e.g. action buttons). AG Grid fires rowClicked regardless of DOM stopPropagation.\n const target = event.event?.target as HTMLElement | null\n if (target?.closest('button, input, a, select, textarea, [role=\"button\"]')) return\n onRowClick(event.data)\n },\n [onRowClick]\n )\n\n // The visibility the user actually intends, per colId. AG Grid re-processes the\n // column definitions on some React re-renders even when the `columnDefs`\n // reference is unchanged, and that reset restores each colDef's `hide` — so a\n // column the user turned on (e.g. via a fields menu) silently disappears the\n // next time the host re-renders (opening an editor, selecting a row, …). We\n // remember the intended visibility and restore it whenever such a reset fires.\n // A Map (not a Set of hidden ids) so a genuinely NEW column from a real\n // columnDefs change — one we've never seen — is left at its colDef default\n // rather than force-shown.\n const desiredHiddenRef = useRef<Map<string, boolean> | null>(null)\n\n const snapshotDesiredHidden = useCallback(() => {\n const api = gridApiRef.current\n if (!api) return\n desiredHiddenRef.current = new Map(api.getColumnState().map((c) => [c.colId, !!c.hide]))\n }, [])\n\n // Handle grid ready\n const handleGridReady = useCallback(\n (event: GridReadyEvent<T>) => {\n gridApiRef.current = event.api\n\n // Apply initial visible columns when no saved state exists\n // This prevents showing all columns by default for new users\n if (!initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const stateMap = new Map(currentState.map((col) => [col.colId, col]))\n const visibleSet = new Set(initialVisibleColumns)\n\n // Build ordered state: selection column first (always visible), then visible columns, then hidden\n const selectionCol = stateMap.get('ag-Grid-SelectionColumn')\n const orderedState = [\n // Selection column first - ALWAYS visible, create if not in state\n selectionCol\n ? { ...selectionCol, hide: false }\n : { colId: 'ag-Grid-SelectionColumn', hide: false, width: 48 },\n // Visible columns in specified order\n ...initialVisibleColumns\n .filter((colId) => colId !== 'ag-Grid-SelectionColumn') // Don't duplicate selection column\n .map((colId) => {\n const col = stateMap.get(colId)\n return col ? { ...col, hide: false } : undefined\n }),\n // Hidden columns (everything else)\n ...currentState\n .filter((col) => col.colId !== 'ag-Grid-SelectionColumn' && !visibleSet.has(col.colId))\n .map((col) => ({ ...col, hide: true })),\n ].filter((col): col is NonNullable<typeof col> => col !== undefined)\n\n event.api.applyColumnState({ state: orderedState, applyOrder: true })\n }\n\n // When restoring persisted state, detect columns from columnDefs that\n // aren't in the saved state (e.g. newly added columns) and append them.\n // AG Grid's maintainColumnOrder adds them but may place them inconsistently;\n // this ensures they appear as hidden at the end so the navigator picks them up.\n if (initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const savedColIds = new Set(\n initialState.columnOrder?.orderedColIds ?? currentState.map((c) => c.colId)\n )\n const newCols = currentState.filter(\n (col) => !savedColIds.has(col.colId) && col.colId !== 'ag-Grid-SelectionColumn'\n )\n if (newCols.length > 0) {\n // Make new columns visible if they're in the default visible set\n const defaultVisible = new Set(initialVisibleColumns)\n event.api.applyColumnState({\n state: newCols.map((col) => ({\n ...col,\n hide: !defaultVisible.has(col.colId),\n })),\n })\n }\n }\n\n // Ensure selection column is visible (in case saved state hides it)\n ensureSelectionColumnVisible()\n\n // Seed the intended column visibility from the state AG Grid settled on\n // (colDefs + restored persisted state) so a later colDef-driven reset can\n // be undone rather than silently hiding a user-shown column.\n snapshotDesiredHidden()\n\n // Call the provided onGridReady callback\n if (onGridReady) {\n onGridReady({ api: event.api })\n }\n\n // Restore selection state if needed (read from ref to keep callback stable)\n const sel = selectionRef.current\n if (sel && sel.selected.length > 0) {\n const selectedIds = new Set(sel.selected.map(getItemId))\n event.api.forEachNode((node) => {\n if (node.data && selectedIds.has(getItemId(node.data))) {\n node.setSelected(true)\n }\n })\n }\n },\n [\n onGridReady,\n getItemId,\n ensureSelectionColumnVisible,\n snapshotDesiredHidden,\n initialState,\n initialVisibleColumns,\n ]\n )\n\n // Undo AG Grid's colDef-driven visibility reset; record genuine user changes.\n const handleColumnVisible = useCallback(\n (event: { source?: string }) => {\n const api = gridApiRef.current\n if (!api) return\n // A columnDefs re-apply reports `gridOptionsChanged`; a real toggle reports\n // an interaction source (api, toolPanelUi, columnMenu, …).\n if (event.source === 'gridOptionsChanged') {\n const desired = desiredHiddenRef.current\n if (!desired) return\n // Only correct columns we've seen before (in the snapshot); a brand-new\n // column keeps its colDef default.\n const fixes = api\n .getColumnState()\n .filter(\n (c) =>\n c.colId !== 'ag-Grid-SelectionColumn' &&\n desired.has(c.colId) &&\n desired.get(c.colId) !== !!c.hide\n )\n .map((c) => ({ colId: c.colId, hide: desired.get(c.colId) }))\n if (fixes.length) api.applyColumnState({ state: fixes })\n } else {\n // Genuine change — this is now the intended visibility.\n snapshotDesiredHidden()\n }\n },\n [snapshotDesiredHidden]\n )\n\n // Handle first data rendered - no auto-sizing, let flex columns handle it\n const handleFirstDataRendered = useCallback(() => {\n // Columns with flex will auto-fill, columns with width stay fixed\n // Also ensure selection column is visible as a backup (handles timing issues with initialState)\n ensureSelectionColumnVisible()\n // Seed the intended visibility from the state AG Grid settled on (colDefs +\n // any restored persisted state), so later resets can be undone.\n snapshotDesiredHidden()\n }, [ensureSelectionColumnVisible, snapshotDesiredHidden])\n\n // Track when AG Grid processes row updates\n const handleModelUpdated = useCallback(() => {\n // AG Grid handles model updates internally\n }, [])\n\n // Track row data changes for AG Grid updates\n const prevItemsRef = useRef<T[]>([])\n useEffect(() => {\n prevItemsRef.current = items\n }, [items])\n\n // Handle state updates - save state when it changes (modern AG Grid approach)\n const handleStateUpdated = useCallback(() => {\n saveGridState()\n }, [saveGridState])\n\n // Removed problematic useEffect that caused unnecessary re-renders\n // AG Grid handles selection internally, only sync on initial load\n\n // Default grid options with minimal settings - memoized to prevent re-renders\n const defaultOptions: GridOptions<T> = useMemo(() => {\n return {\n // Initial row height (stable — captured once). Live changes go through the\n // imperative effect, not this option, to avoid column-state churn.\n rowHeight: initialRowHeightRef.current,\n suppressMenuHide: true, // Prevent hiding columns since we don't have enterprise sidebar\n maintainColumnOrder: true, // Preserve column order when columns are added/removed\n\n // Row virtualization: Render rows as needed for performance\n // rowBuffer renders extra rows above/below viewport for smoother scrolling\n rowBuffer: 10, // Render 10 extra rows above/below viewport for smooth scrolling\n suppressColumnVirtualisation: false, // Keep column virtualization enabled\n suppressRowVirtualisation: false, // ENABLE row virtualization - only render visible rows\n animateRows: false, // Disable row animations\n suppressColumnMoveAnimation: true, // Disable column move/resize animations\n\n // Efficient updates with React Query cache\n // getRowId enables change detection - grid only re-renders changed rows\n // Works perfectly with React Query's cache updates\n getRowId: getRowId,\n\n rowSelection: selection?.mode\n ? {\n mode: selection.mode === 'single' ? 'singleRow' : 'multiRow',\n selectAll: 'filtered', // Header checkbox selects all filtered rows (across all pages)\n // In multi-row mode, only checkboxes should toggle selection (clicking row body would replace selection)\n enableClickSelection: selection.mode === 'single',\n checkboxes: true,\n headerCheckbox: selection.mode === 'multiple',\n }\n : undefined,\n selectionColumnDef: selection?.mode\n ? {\n sortable: selection.mode === 'multiple',\n width: 48,\n lockVisible: true, // Cannot be hidden\n suppressMovable: true, // Cannot be moved\n }\n : undefined,\n // Use normal layout for better performance - autoHeight causes forced reflows\n domLayout: 'normal',\n // Stop editing when clicking outside the cell/grid\n stopEditingWhenCellsLoseFocus: true,\n // Additional performance optimizations\n suppressCellFocus: true, // Don't focus cells on click (faster)\n suppressRowHoverHighlight: true, // Disable hover highlight - reduces DOM manipulation during scroll\n suppressScrollOnNewData: true, // Don't scroll when data updates\n suppressAggFuncInHeader: true, // Don't show aggregation functions (faster)\n // Tooltip UX: the AG Grid default show-delay is 2 s which hurts\n // discoverability for cells where tooltips carry the \"reveal full\n // content\" affordance for non-editable users. 300 ms is snappy\n // without being accidental. tooltipInteraction lets users hover\n // onto the tooltip itself (e.g. to select / copy long text).\n // These are AG Grid's native tooltip controls — no React / Radix\n // provider involved, zero per-row cost; tooltip DOM is created on\n // demand when hover-delay elapses and destroyed on mouseout.\n tooltipShowDelay: 300,\n tooltipHideDelay: 4000,\n tooltipInteraction: true,\n // Pagination (disabled by default)\n pagination,\n paginationPageSizeSelector,\n defaultColDef: {\n sortable: true,\n resizable: true,\n unSortIcon: false, // Sort glyph only on the sorted column (every header carrying one was noise)\n sortingOrder: ['asc', 'desc', null], // 3-way sorting: asc → desc → unsorted (AG Grid default)\n wrapText: false, // Disable text wrapping for cleaner display\n autoHeight: false, // Use fixed row height from theme\n wrapHeaderText: false, // Disable header text wrapping for cleaner look\n autoHeaderHeight: false, // Fixed header height\n filterParams: {\n maxNumConditions: 1,\n buttons: ['reset'],\n },\n },\n }\n }, [selection?.mode, getRowId, pagination, paginationPageSizeSelector])\n\n // Combine default options with passed options - memoized to prevent re-renders\n const combinedOptions = useMemo(\n () => ({ ...defaultOptions, ...gridOptions }),\n [defaultOptions, gridOptions]\n )\n\n // Apply fixed height for better performance — autoHeight causes forced\n // reflows by measuring all rows, avoid it.\n //\n // Also derive the geometry the wrapping multiline columns (.cell-multiline —\n // Abstract, Author, custom text fields) need so their overflow clip lands on\n // a WHOLE-line boundary (never mid-line, which reads as a half-line\n // \"bleeding\" into the neighbouring row). All computed once here per\n // row-height change and handed to CSS as variables — zero per-row cost on the\n // million-row grid:\n // --multiline-line-clamp : whole number of lines that fit — drives the CSS\n // line-clamp that hides overflow lines entirely.\n // --multiline-pad-y : vertical cell padding, shrunk on very short rows so\n // at least one whole line always fits.\n // --multiline-max-h : cap of exactly N whole lines + TOP padding + borders.\n // Deliberately excludes the bottom padding: AG Grid\n // forces cell height, so overflow clips at the\n // padding-box edge and any bottom padding becomes a\n // window onto the next (clamped-away) line. Ending the\n // box right at line N's bottom puts the clip on the\n // line boundary; the row supplies the visual gap below.\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = { height }\n if (rowHeight) {\n const LINE_PX = 14 * 1.35 // grid font-size × multiline line-height (18.9px)\n const BORDER = 2 // multiline cell top + bottom border (1px each, border-box)\n const PREFERRED_PAD = 16 // preferred total vertical padding (8px top + 8px bottom)\n // Don't let padding eat the room a single line needs on short rows.\n const padTotal = Math.max(0, Math.min(PREFERRED_PAD, rowHeight - BORDER - LINE_PX))\n const lines = Math.max(1, Math.floor((rowHeight - BORDER - padTotal) / LINE_PX))\n const vars = style as Record<string, string | number>\n vars['--multiline-line-clamp'] = `${lines}`\n vars['--multiline-pad-y'] = `${padTotal / 2}px`\n vars['--multiline-max-h'] = `${lines * LINE_PX + padTotal / 2 + BORDER}px`\n }\n return style\n }, [height, rowHeight])\n\n // Apply rowHeight changes imperatively via the grid option (not the theme —\n // recreating the theme would re-initialise the grid). This only re-lays-out\n // rows; columns, row virtualization, and the transaction bus are untouched.\n useEffect(() => {\n const api = gridApiRef.current\n if (!api || api.isDestroyed() || !rowHeight) return\n api.setGridOption('rowHeight', rowHeight)\n api.resetRowHeights()\n }, [rowHeight])\n\n const containerClassName = useMemo(() => {\n const baseClass = className || ''\n // Height-adjustable grids vertically center cell content (CSS) so a\n // one-line cell or a lone pill sits in the middle of the row, and multi-line\n // text (e.g. Abstract) is balanced top-to-bottom — flagged here, applied in\n // grid.css.\n const alignClass = rowHeight ? 'ag-cells-centered' : ''\n return [baseClass, alignClass].filter(Boolean).join(' ')\n }, [className, rowHeight])\n\n // Show loading state — grey skeleton rows so the page transition feels instant\n if (isLoading) {\n const skeletonRowCount = 12\n return (\n <div\n data-testid={`${testId}-loading`}\n className={`${containerClassName} overflow-hidden rounded-lg border border-border`}\n style={containerStyle}\n aria-busy=\"true\"\n aria-label={loadingMessage}\n >\n {/* Header skeleton */}\n <div className=\"flex h-[37px] items-center gap-4 border-b border-border bg-muted/40 px-3\">\n <div className=\"h-3 w-6 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-24 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-20 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-28 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-16 rounded bg-muted animate-pulse ml-auto\" />\n </div>\n {/* Row skeletons */}\n {Array.from({ length: skeletonRowCount }).map((_, rowIdx) => (\n <div key={rowIdx} className=\"flex h-10 items-center gap-4 border-b border-border px-3\">\n <div className=\"h-4 w-4 rounded-sm bg-muted/70 animate-pulse\" />\n <div\n className=\"h-3 rounded bg-muted/70 animate-pulse\"\n style={{ width: `${20 + ((rowIdx * 17) % 40)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${8 + ((rowIdx * 11) % 12)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${6 + ((rowIdx * 7) % 10)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/50 animate-pulse ml-auto\"\n style={{ width: `${5 + ((rowIdx * 5) % 8)}%` }}\n />\n </div>\n ))}\n </div>\n )\n }\n\n // Show empty state\n // showEmpty lets callers force this UI (e.g. when an external filter hid\n // every row but the underlying items array is non-empty).\n if ((showEmpty ?? items.length === 0) && emptyState) {\n return (\n <div\n data-testid={`${testId}-empty`}\n // Capped by its container (a landscape phone is shorter than 24rem) and scrollable, with the\n // content centred by auto margins so a tall one still starts at the top.\n className=\"flex h-96 max-h-full flex-col items-center overflow-y-auto p-6 text-center\"\n >\n <div className=\"my-auto flex flex-col items-center\">\n {emptyState.icon && (\n <div className=\"text-muted-foreground/60 mb-4\">{emptyState.icon}</div>\n )}\n {emptyState.title && <h3 className=\"text-xl font-medium mb-2\">{emptyState.title}</h3>}\n {emptyState.message && (\n <p className=\"text-muted-foreground mb-6 max-w-md\">{emptyState.message}</p>\n )}\n {emptyState.action}\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className={containerClassName}\n style={containerStyle}\n data-testid={testId}\n >\n <AgGridReact\n theme={arbiTheme}\n modules={[AllCommunityModule]}\n columnDefs={columnDefs}\n rowData={items}\n pinnedBottomRowData={pinnedBottomRowData}\n pinnedTopRowData={pinnedTopRowData}\n getRowId={getRowId}\n initialState={initialState}\n onGridReady={handleGridReady}\n onFirstDataRendered={handleFirstDataRendered}\n onModelUpdated={handleModelUpdated}\n onSelectionChanged={handleSelectionChanged}\n onCellValueChanged={onCellValueChanged}\n onRowClicked={handleRowClicked}\n onStateUpdated={handleStateUpdated}\n onColumnVisible={handleColumnVisible}\n {...combinedOptions}\n />\n </div>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tips/useTipsPlacement.ts","../src/components/LoadingIndicator.tsx","../src/components/GridRowNavigator.tsx","../src/components/Toolbar.tsx","../src/components/EntityIdentityBar.tsx","../src/activity/workspace-activity.ts","../src/activity/WorkspaceActivityList.tsx","../src/tags/tagTableModel.ts","../src/tags/TagColumnsEditor.tsx","../src/tags/TagTable.tsx","../src/tags/TagDetail.tsx","../src/tags/tagTableDocx.ts","../src/tags/glossary.ts","../src/tags/page/tagsPageLabels.ts","../src/tags/page/ExtractEntitiesDialog.tsx"],"names":["useState","useEffect","total","jsx","cn","jsxs","Input","body","Button","count","FileText","useMemo","Loader2","Plus","Fragment","Lightbulb","MessagesSquare","escapeCell","Checkbox"],"mappings":"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","file":"chunk-I44X7O6X.js","sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport type { TipsRegistry } from './registry'\n\nexport interface UseTipsPlacementOptions<Context extends string, State, Cta> {\n registry: Pick<TipsRegistry<Context, State, Cta>, 'select' | 'subscribe'>\n context: Context\n /** Serializable situation values; equal inline objects do not restart the placement. */\n state: State\n dismissed?: readonly string[]\n /** Seconds between tips. Zero disables rotation. Default 30. */\n autoRotateSeconds?: number\n}\n\n/**\n * The lifecycle of a tips placement: live registry updates, per-user dismissal filtering,\n * priority-first selection, cyclic paging and hover-paused rotation. Content, CTA dispatch,\n * visibility preferences and the card's actual placement belong to the host.\n */\nexport function useTipsPlacement<Context extends string, State, Cta>({\n registry,\n context,\n state,\n dismissed = [],\n autoRotateSeconds = 30,\n}: UseTipsPlacementOptions<Context, State, Cta>) {\n const [editVersion, setEditVersion] = useState(0)\n useEffect(() => registry.subscribe(() => setEditVersion((value) => value + 1)), [registry])\n const stateKey = JSON.stringify(state ?? {})\n const dismissedKey = JSON.stringify(dismissed)\n const tips = useMemo(\n () => registry.select(context, state).filter((tip) => !dismissed.includes(tip.code)),\n // Values, not the identity of inline situation/dismissal objects, select and reset the tips.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [registry, context, stateKey, editVersion, dismissedKey]\n )\n const [cursor, setCursor] = useState(0)\n const [paused, setPaused] = useState(false)\n useEffect(() => setCursor(0), [registry, context, stateKey])\n useEffect(() => {\n if (tips.length <= 1 || paused || autoRotateSeconds <= 0) return\n const timer = setTimeout(\n () => setCursor((value) => (value + 1) % tips.length),\n autoRotateSeconds * 1000\n )\n return () => clearTimeout(timer)\n }, [tips.length, paused, autoRotateSeconds, cursor])\n\n const index = tips.length ? cursor % tips.length : 0\n return {\n tips,\n tip: tips.at(index),\n index,\n count: tips.length,\n previous: () =>\n setCursor((value) => (tips.length ? (value - 1 + tips.length) % tips.length : 0)),\n next: () => setCursor((value) => (tips.length ? (value + 1) % tips.length : 0)),\n onHoverChange: setPaused,\n }\n}\n","/**\n * LoadingIndicator Component\n *\n * Centralized loading indicator for consistent loading states across the app\n * A spinner in a 16rem-tall centered box, or the full-screen `splash`\n */\n\nimport { useEffect, useState, type ReactNode } from 'react'\nimport { Sparkle } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface LoadingIndicatorProps {\n /**\n * `spinner` (default): a ring spinner. `splash`: the full-screen loading screen, the host's\n * `logo` pulsing above three bouncing sparkles, over the whole viewport.\n */\n variant?: 'spinner' | 'splash'\n /** The brand mark a `splash` shows (e.g. the site's logo `<img>`). */\n logo?: ReactNode\n /**\n * Render nothing for this long first, so a short load (a lazy chunk on a first visit) never\n * flashes a loading state. In ms; default 0.\n */\n delayMs?: number\n /** Optional message to display below the spinner */\n message?: string\n /** Additional CSS classes */\n className?: string\n /** Test ID for testing */\n testId?: string\n}\n\nconst SPARKLE_DELAYS = ['0s', '0.1s', '0.2s']\nconst SPLASH_CLASS =\n 'fixed top-0 left-0 w-full h-full flex flex-col items-center justify-center bg-background bg-opacity-50 z-50'\n\nfunction useShowAfter(delayMs: number): boolean {\n const [show, setShow] = useState(delayMs <= 0)\n useEffect(() => {\n if (delayMs <= 0) return\n const timer = setTimeout(() => setShow(true), delayMs)\n return () => clearTimeout(timer)\n }, [delayMs])\n return show\n}\n\nexport function LoadingIndicator({\n variant = 'spinner',\n logo,\n delayMs = 0,\n message,\n className,\n testId = 'loading-indicator',\n}: LoadingIndicatorProps) {\n const show = useShowAfter(delayMs)\n if (!show) return null\n\n if (variant === 'splash') {\n return (\n <div\n data-testid={testId}\n // Joined, not `cn`-merged: tailwind-merge reads `bg-opacity-50` as a background colour\n // and would drop `bg-background`.\n className={[SPLASH_CLASS, className].filter(Boolean).join(' ')}\n >\n <div className=\"flex flex-col items-center space-y-4\">\n {logo}\n <div className=\"flex space-x-1\">\n {SPARKLE_DELAYS.map((delay) => (\n <Sparkle\n key={delay}\n className=\"w-4 h-4 text-primary animate-bounce fill-current\"\n style={delay === '0s' ? undefined : { animationDelay: delay }}\n />\n ))}\n </div>\n {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={cn('flex h-64 flex-col items-center justify-center gap-3', className)}\n data-testid={testId}\n >\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-border border-t-primary\" />\n {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n </div>\n )\n}\n","/**\n * GridRowNavigator\n *\n * A ‹ n / N › row navigator for an AG Grid table — the table twin of the one\n * the calendar and timeline blocks portal into the Facts toolbar, and the same\n * control on the Files table. It walks the rows in the ORDER THE TABLE SHOWS\n * THEM (after the grid's own sort and quick filters), scrolls each into view\n * and hands it to `onSelect` (Facts opens it in the composer, Files in the\n * viewer), so the row being stepped to is the one highlighted on screen.\n *\n * The position tracks `selectedId` (the fact open in the composer / the doc in\n * the viewer), falling back to \"– / N\" when nothing is open. It re-reads the\n * grid whenever its row model changes (sort, filter, data), so the counter\n * stays honest.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport type { GridApi } from 'ag-grid-community'\nimport { RowNavigatorControls } from './RowNavigatorControls'\n\nexport interface GridRowNavigatorProps<T> {\n /** The mounted grid's API, or null until the grid is ready. */\n gridApi: GridApi<T> | null\n /** The row currently open — where the counter points. */\n selectedId: string | null\n /** Open the row the user stepped to. */\n onSelect: (item: T) => void\n /** Prefix for every `data-testid` this control emits. */\n testId: string\n /** Noun for the buttons' aria-labels (\"Previous fact\" / \"Next document\"). */\n itemLabel?: string\n}\n\n/** Grid events after which the displayed row order or count may differ. */\nconst ROW_MODEL_EVENTS = ['modelUpdated', 'sortChanged', 'filterChanged', 'rowDataUpdated'] as const\n\nexport function GridRowNavigator<T>({\n gridApi,\n selectedId,\n onSelect,\n testId,\n itemLabel = 'row',\n}: GridRowNavigatorProps<T>) {\n const [{ total, currentIndex }, setPosition] = useState<{\n total: number\n currentIndex: number | null\n }>({ total: 0, currentIndex: null })\n\n const readPosition = useCallback(() => {\n if (!gridApi || gridApi.isDestroyed()) {\n setPosition({ total: 0, currentIndex: null })\n return\n }\n const total = gridApi.getDisplayedRowCount()\n const node = selectedId ? gridApi.getRowNode(selectedId) : undefined\n const index = node?.rowIndex\n // A selected row hidden by the grid's filter has no displayed index.\n setPosition({ total, currentIndex: typeof index === 'number' && index >= 0 ? index : null })\n }, [gridApi, selectedId])\n\n useEffect(() => {\n readPosition()\n if (!gridApi || gridApi.isDestroyed()) return\n for (const ev of ROW_MODEL_EVENTS) gridApi.addEventListener(ev, readPosition)\n return () => {\n if (gridApi.isDestroyed()) return\n for (const ev of ROW_MODEL_EVENTS) gridApi.removeEventListener(ev, readPosition)\n }\n }, [gridApi, readPosition])\n\n const goTo = (index: number) => {\n if (!gridApi || gridApi.isDestroyed()) return\n const clamped = Math.max(0, Math.min(total - 1, index))\n const node = gridApi.getDisplayedRowAtIndex(clamped)\n if (!node?.data) return\n gridApi.ensureIndexVisible(clamped, 'middle')\n onSelect(node.data)\n }\n\n return (\n <RowNavigatorControls\n total={total}\n currentIndex={currentIndex}\n onGo={goTo}\n testId={testId}\n itemLabel={itemLabel}\n />\n )\n}\n","import { Search } from 'lucide-react'\nimport { Input, cn } from '@arbidocs/react/ui'\n\n/** The search bar above a list view. */\nexport function Toolbar({\n search,\n onSearch,\n searchPlaceholder = 'Search…',\n className,\n testId,\n}: {\n search?: string\n onSearch?: (v: string) => void\n searchPlaceholder?: string\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className\n )}\n data-testid={testId}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-2\">\n {onSearch && (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"bg-card text-sm placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring pl-8\"\n data-testid={testId ? `${testId}-search` : 'toolbar-search'}\n />\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { Pencil } from 'lucide-react'\nimport { Input, Textarea, cn } from '@arbidocs/react/ui'\n\n/** Longest a name may be. Exported so a form editing the same field agrees. */\nexport const IDENTITY_NAME_MAX_LENGTH = 50\n\n/** Shown once the remaining allowance gets this low, not for the whole time. */\nconst COUNTER_THRESHOLD = 10\n\nexport interface EntityIdentityField {\n /** Row caption. Rendered with a trailing colon. */\n label: string\n value: string\n /** Stands in for an empty value, in italics — never a blank row. */\n placeholder: string\n /** Commits the edit. Not called when the value is unchanged. */\n onSave: (next: string) => void\n /** A description needs line breaks; a name does not. */\n multiline?: boolean\n /** Caps the input and shows a counter as it fills. Names only, by default. */\n maxLength?: number\n /** Classes for the read-mode value, e.g. a larger weight for the name. */\n valueClassName?: string\n /**\n * Content pinned to the RIGHT END of this row — e.g. the owning project\n * beside a name, a member stack beside a status. Rows without one let their\n * value run the full width, which is what a description wants.\n */\n trailing?: ReactNode\n /**\n * Content rendered immediately BEFORE the value — the entity's own mark.\n * Sits outside the edit swap, so starting to edit the name doesn't make the\n * icon jump or disappear.\n */\n leading?: ReactNode\n /**\n * Drops the caption from view for this row, leaving the value flush left.\n * For a field whose value already says what it is — a workspace's name and\n * description read as exactly that — the caption is a word the eye has to\n * step over on the way in. The caption stays in the markup for screen\n * readers, which have no such visual cue to fall back on.\n */\n hideLabel?: boolean\n /** Row test id; the pencil and input derive `-edit` and `-input`. */\n testId?: string\n}\n\nexport interface EntityIdentityBarProps {\n /** The editable text fields, in order. Usually name then description. */\n fields: EntityIdentityField[]\n /** Hides every pencil. A viewer without permission sees values, not controls. */\n canEdit?: boolean\n /** Trailing controls, pinned right — e.g. a member stack, a status. */\n actions?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The \"what am I looking at\" bar for an entity's own page.\n *\n * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The\n * captions are the point: a bare bold string at the top of a page reads equally\n * as a workspace, a project, a case file or a folder, and people read it as\n * whichever they expected. Saying which field is which costs one column and\n * removes the ambiguity entirely.\n *\n * Editing happens in place. The pencil is always visible to someone who can use\n * it rather than revealed on hover — a control you have to go hunting for is one\n * most people never find, and hover doesn't exist on touch. Commit is on blur\n * and on Enter (single-line fields only, so a description can hold line\n * breaks); Escape abandons the edit.\n *\n * Deliberately NOT a form: no submit, no dirty state, no field-level errors.\n * When a consumer needs visibility toggles, destructive actions or validation\n * messages, those belong in its settings form — this bar is the identity of the\n * thing, shown where you are working on it.\n *\n * Styled with SEMANTIC tokens only, so every host gets it in its own colours.\n */\nexport function EntityIdentityBar({\n fields,\n canEdit = false,\n actions,\n className,\n testId,\n}: EntityIdentityBarProps) {\n return (\n <div\n className={cn('flex flex-wrap items-start justify-between gap-x-6 gap-y-3', className)}\n data-testid={testId}\n >\n <dl className=\"min-w-0 flex-1 space-y-1.5\">\n {fields.map((field) => (\n <IdentityFieldRow key={field.label} field={field} canEdit={canEdit} />\n ))}\n </dl>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n )\n}\n\nfunction IdentityFieldRow({ field, canEdit }: { field: EntityIdentityField; canEdit: boolean }) {\n const {\n label,\n value,\n placeholder,\n onSave,\n multiline = false,\n maxLength,\n valueClassName,\n leading,\n hideLabel,\n trailing,\n testId,\n } = field\n\n const [isEditing, setIsEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n\n // Track the value while not editing, so an update from elsewhere (another\n // tab, a websocket) doesn't get overwritten by a stale draft on the next edit.\n useEffect(() => {\n if (!isEditing) setDraft(value)\n }, [value, isEditing])\n\n const commit = () => {\n setIsEditing(false)\n const next = draft.trim()\n if (next !== value) onSave(next)\n }\n\n const cancel = () => {\n setDraft(value)\n setIsEditing(false)\n }\n\n const charsLeft = maxLength === undefined ? null : maxLength - draft.length\n\n // Editing must not move anything. The input carries the read view's exact\n // typography and padding, drops the border and shadow entirely, and marks\n // focus with a contrasting FIELD instead — a box appearing around the text\n // (and the row growing to fit it) reads as the page jumping under the cursor.\n const fieldClass =\n 'h-auto rounded border-0 bg-muted px-1.5 py-0.5 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\n const shared = {\n autoFocus: true,\n value: draft,\n placeholder,\n maxLength,\n 'aria-label': label,\n 'data-testid': testId && `${testId}-input`,\n onBlur: commit,\n onChange: (e: { target: { value: string } }) => setDraft(e.target.value),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n } else if (e.key === 'Enter' && !multiline) {\n e.preventDefault()\n commit()\n }\n },\n }\n\n // Every row shares one minimum height: that of the small controls (h-7) a\n // row may carry at its trailing end. A row that is only text then sits in\n // the same rhythm as one holding a button, so the captions fall on an even\n // beat down the bar instead of bunching up wherever a row has no control.\n return (\n <div className={cn('flex min-h-7 min-w-0 gap-2', multiline ? 'items-start' : 'items-center')}>\n <dt\n className={cn(\n hideLabel\n ? 'sr-only'\n : cn('w-24 shrink-0 text-sm font-medium text-muted-foreground', multiline && 'pt-1')\n )}\n >\n {label}:\n </dt>\n {/* Wraps under sm: the trailing controls drop to their own line instead of overflowing. */}\n <dd className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1.5 sm:flex-nowrap\">\n {leading}\n {isEditing ? (\n <div className=\"relative min-w-0 flex-1 max-sm:basis-[calc(100%-2.5rem)]\">\n {multiline ? (\n <Textarea\n {...shared}\n rows={2}\n className={cn(fieldClass, 'min-h-0 resize-none leading-snug', valueClassName)}\n />\n ) : (\n <Input {...shared} className={cn(fieldClass, 'pr-20', valueClassName)} />\n )}\n {charsLeft !== null && charsLeft <= COUNTER_THRESHOLD && (\n <span\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-destructive' : 'text-muted-foreground'\n )}\n data-testid={testId && `${testId}-counter`}\n >\n {charsLeft < 0 ? `${-charsLeft} over` : `${charsLeft} left`}\n </span>\n )}\n </div>\n ) : (\n // `identity-field` (not the generic `group`) scopes the pencil's hover\n // to THIS field only — an ancestor card also carries `group`, so a\n // `.group:hover` rule would reveal every field's pencil at once.\n <span className=\"identity-field flex min-w-0 flex-1 items-center gap-1.5 sm:flex-none\">\n {/* Same padding as the input above — the swap must not nudge the\n text sideways or change the row's height. */}\n <span className={cn('px-1.5 py-0.5', valueClassName)} data-testid={testId}>\n {value || <span className=\"italic text-muted-foreground\">{placeholder}</span>}\n </span>\n {canEdit && (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n aria-label={`Edit ${label.toLowerCase()}`}\n title={`Edit ${label.toLowerCase()}`}\n // Quiet by default — the pencil only surfaces when the row is\n // hovered so it reads as clean text, and stays reachable by\n // keyboard (focus-visible).\n //\n // NB: use the ungated `[.identity-field:hover_&]` selector rather\n // than Tailwind's `group-hover:`. The latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (whose PRIMARY\n // pointer reports `hover: none`) the rule is disabled even when a\n // real mouse is firing hover events — the pencil then stays at\n // opacity-0 forever. The arbitrary selector has no media gate, so\n // it reveals on any genuine `:hover`.\n className=\"shrink-0 cursor-pointer rounded p-1 text-muted-foreground opacity-60 transition-[color,background-color,opacity] hover:bg-accent hover:text-foreground focus-visible:opacity-100 pointer-coarse:p-[15px] [.identity-field:hover_&]:opacity-100\"\n data-testid={testId && `${testId}-edit`}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n </span>\n )}\n {trailing ? (\n <div className=\"min-w-0 shrink-0 max-sm:w-full sm:ml-auto\">{trailing}</div>\n ) : null}\n </dd>\n </div>\n )\n}\n","/**\n * The workspace activity feed's entries, as `GET /v1/workspace/{id}/activity` returns them, and what\n * each one says and opens. Everything a person is not pushed (uploads, other people's threads, runs)\n * can still be found here.\n */\n\nimport {\n DEFAULT_TASK_ACTIVITY_LABELS,\n taskActivityHeadline,\n type TaskActivityKind,\n} from '../agents/tasks/TaskActivityTimeline'\n\n/** Where an entry comes from. */\nexport type WorkspaceActivitySource = 'thread' | 'message' | 'document' | 'workflow'\n\n/** One entry of the feed (the shape of the API's `WorkspaceActivityEntry`). */\nexport interface WorkspaceActivityItem {\n external_id: string\n source: WorkspaceActivitySource\n /** A thread event kind, `message_posted`, `document_uploaded` / `_version` / `_signed`, `workflow_run`. */\n kind: string\n actor_ext_id?: string | null\n conversation_ext_id?: string | null\n /** Decrypted when the session has the workspace open, else null. */\n conversation_title?: string | null\n message_ext_id?: string | null\n document_ext_id?: string | null\n document_name?: string | null\n version?: number | null\n workflow_ext_id?: string | null\n workflow_name?: string | null\n /** A workflow run's status. */\n status?: string | null\n detail?: Record<string, unknown> | null\n created_at: string\n}\n\n/** What clicking an entry opens. */\nexport type WorkspaceActivityTarget =\n | { kind: 'thread'; conversationId: string; messageId?: string }\n | { kind: 'document'; documentId: string; version?: number }\n | { kind: 'workflow'; workflowId: string; conversationId?: string }\n\n/** The thread, document version or run an entry opens; null when it names nothing openable. */\nexport function workspaceActivityTarget(\n item: WorkspaceActivityItem\n): WorkspaceActivityTarget | null {\n switch (item.source) {\n case 'thread':\n case 'message':\n return item.conversation_ext_id\n ? {\n kind: 'thread',\n conversationId: item.conversation_ext_id,\n ...(item.message_ext_id ? { messageId: item.message_ext_id } : {}),\n }\n : null\n case 'document':\n if (!item.document_ext_id) return null\n // An upload is the document as it was first saved; a new version or a signature opens that version.\n return item.kind !== 'document_uploaded' && item.version\n ? { kind: 'document', documentId: item.document_ext_id, version: item.version }\n : { kind: 'document', documentId: item.document_ext_id }\n case 'workflow':\n return item.workflow_ext_id\n ? {\n kind: 'workflow',\n workflowId: item.workflow_ext_id,\n ...(item.conversation_ext_id ? { conversationId: item.conversation_ext_id } : {}),\n }\n : null\n default:\n return null\n }\n}\n\nconst quoted = (name: string | null | undefined, fallback: string) =>\n name ? `“${name}”` : fallback\n\n/** What happened, without who did it: \"Uploaded “Lease.pdf”\", \"Marked done in “Smith v Jones”\". */\nexport function workspaceActivityHeadline(item: WorkspaceActivityItem): string {\n const thread = quoted(item.conversation_title, 'a thread')\n const document = quoted(item.document_name, 'a document')\n switch (item.kind) {\n case 'message_posted':\n return `Posted in ${thread}`\n case 'document_uploaded':\n return `Uploaded ${document}`\n case 'document_version':\n return item.version\n ? `Saved version ${item.version} of ${document}`\n : `Saved a new version of ${document}`\n case 'document_signed':\n return `Signed ${document}`\n case 'workflow_run': {\n const run = `Ran ${quoted(item.workflow_name, 'a workflow')}`\n return item.status ? `${run} (${item.status.replace(/_/g, ' ')})` : run\n }\n default: {\n const headline = taskActivityHeadline(\n { kind: item.kind as TaskActivityKind, detail: item.detail },\n DEFAULT_TASK_ACTIVITY_LABELS\n )\n return `${headline} in ${thread}`\n }\n }\n}\n","import type { ReactNode } from 'react'\nimport { Activity, FileText, MessageSquare, Workflow } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport {\n workspaceActivityHeadline,\n workspaceActivityTarget,\n type WorkspaceActivityItem,\n type WorkspaceActivitySource,\n type WorkspaceActivityTarget,\n} from './workspace-activity'\n\nexport interface WorkspaceActivityListLabels {\n empty: string\n loading: string\n error: string\n loadMore: string\n loadingMore: string\n retry: string\n /** Who did it when the entry names no one. */\n system: string\n}\n\nexport const DEFAULT_WORKSPACE_ACTIVITY_LABELS: WorkspaceActivityListLabels = {\n empty: 'Nothing has happened in this workspace yet.',\n loading: 'Loading activity…',\n error: 'Could not load the activity.',\n loadMore: 'Show older',\n loadingMore: 'Loading…',\n retry: 'Retry',\n system: 'ARBI',\n}\n\nexport interface WorkspaceActivityListProps {\n /** Entries, newest first (every page loaded so far). */\n items: readonly WorkspaceActivityItem[]\n isLoading?: boolean\n isError?: boolean\n /** Another page exists. */\n hasMore?: boolean\n isLoadingMore?: boolean\n onLoadMore?: () => void\n onRetry?: () => void\n /** Open what an entry is about: its thread, document version or run. */\n onOpen?: (target: WorkspaceActivityTarget, item: WorkspaceActivityItem) => void\n /** A person's or agent's display name by id. */\n nameOf?: (id: string) => string | undefined\n /** \"2 hours ago\"; default the local date and time. */\n formatTime?: (iso: string) => string\n labels?: Partial<WorkspaceActivityListLabels>\n className?: string\n testId?: string\n}\n\nconst ICONS: Record<WorkspaceActivitySource, ReactNode> = {\n thread: <Activity className=\"size-4\" aria-hidden />,\n message: <MessageSquare className=\"size-4\" aria-hidden />,\n document: <FileText className=\"size-4\" aria-hidden />,\n workflow: <Workflow className=\"size-4\" aria-hidden />,\n}\n\nconst localTime = (iso: string) => new Date(iso).toLocaleString()\n\n/** A workspace's activity, newest first, one line per entry; a line opens what it is about. */\nexport function WorkspaceActivityList({\n items,\n isLoading,\n isError,\n hasMore,\n isLoadingMore,\n onLoadMore,\n onRetry,\n onOpen,\n nameOf,\n formatTime = localTime,\n labels,\n className,\n testId = 'workspace-activity',\n}: WorkspaceActivityListProps) {\n const l = { ...DEFAULT_WORKSPACE_ACTIVITY_LABELS, ...labels }\n if (isLoading)\n return (\n <p className={cn('p-3 text-sm text-muted-foreground', className)} data-testid={testId}>\n {l.loading}\n </p>\n )\n if (isError && items.length === 0)\n return (\n <div\n className={cn('flex items-center gap-2 p-3 text-sm text-muted-foreground', className)}\n data-testid={testId}\n >\n <span role=\"alert\">{l.error}</span>\n {onRetry && (\n <Button size=\"sm\" variant=\"ghost\" onClick={onRetry}>\n {l.retry}\n </Button>\n )}\n </div>\n )\n if (items.length === 0)\n return (\n <p className={cn('p-3 text-sm text-muted-foreground', className)} data-testid={testId}>\n {l.empty}\n </p>\n )\n\n return (\n <div className={cn('flex flex-col', className)} data-testid={testId}>\n <ul className=\"divide-y divide-border\" data-testid={`${testId}-list`}>\n {items.map((item) => {\n const target = workspaceActivityTarget(item)\n const actor = item.actor_ext_id ? (nameOf?.(item.actor_ext_id) ?? null) : l.system\n const body = (\n <>\n <span className=\"mt-0.5 shrink-0 text-muted-foreground\">{ICONS[item.source]}</span>\n <span className=\"min-w-0 flex-1 text-sm\">\n {actor && <span className=\"font-medium\">{actor} </span>}\n <span className=\"text-muted-foreground\">{workspaceActivityHeadline(item)}</span>\n </span>\n <time\n dateTime={item.created_at}\n className=\"shrink-0 text-xs tabular-nums text-muted-foreground\"\n >\n {formatTime(item.created_at)}\n </time>\n </>\n )\n return (\n <li\n key={item.external_id}\n data-testid={`${testId}-item-${item.external_id}`}\n data-kind={item.kind}\n >\n {target && onOpen ? (\n <button\n type=\"button\"\n className=\"flex w-full items-start gap-3 px-3 py-2 text-left hover:bg-accent focus-visible:bg-accent focus-visible:outline-none\"\n onClick={() => onOpen(target, item)}\n >\n {body}\n </button>\n ) : (\n <div className=\"flex items-start gap-3 px-3 py-2\">{body}</div>\n )}\n </li>\n )\n })}\n </ul>\n {hasMore && onLoadMore && (\n <div className=\"flex justify-center p-2\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={isLoadingMore}\n onClick={onLoadMore}\n data-testid={`${testId}-load-more`}\n >\n {isLoadingMore ? l.loadingMore : l.loadMore}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","/**\n * A table of tags as data: the rows are tags (every issue, every person, a label's children) with\n * their values and links, the columns their kind's fields in the workspace (its issue fields …),\n * and each row's linked documents, facts and threads its evidence. Pure helpers for `TagTable`: a\n * row's value, the gaps, and the snapshot as a Markdown document.\n */\n\nimport type { components } from '@arbidocs/client'\n\n/**\n * A column: one of the kind's fields. A `'tag'` field links to tags (its `options` are the kinds it\n * may point at; its value is a list of tag ids), e.g. a person's Organisation.\n */\nexport type TagTableField = components['schemas']['FieldDefinition']\nexport type TagTableFieldType = TagTableField['type']\n/** A field as written back to the kind (`id` keeps it and its values). */\nexport type TagTableFieldWrite = components['schemas']['FieldDefinitionWrite']\n/** A row: a tag, with its links (`include=links` on the list). */\nexport type TagTableRow = components['schemas']['TagResponse']\nexport type TagTableLinks = components['schemas']['TagLinks']\n\n/** What a table shows: the kind's fields as columns, and its tags as rows. */\nexport interface TagTableData {\n columns: TagTableField[]\n rows: TagTableRow[]\n}\n\nconst NO_LINKS: TagTableLinks = {\n docs: [],\n facts: [],\n threads: [],\n doc_count: 0,\n fact_count: 0,\n thread_count: 0,\n}\n\n/** A row's links (none when the list was read without them). */\nexport const rowLinks = (row: TagTableRow): TagTableLinks => row.links ?? NO_LINKS\n\n/** A row's value for a column (values are keyed by field id). */\nexport const cellValue = (row: TagTableRow, column: TagTableField): unknown =>\n row.field_values?.[column.id]\n\n/** A row with nothing behind it: no linked document, fact or thread. */\nexport const isGap = (row: TagTableRow): boolean => {\n const l = rowLinks(row)\n return l.doc_count + l.fact_count + l.thread_count === 0\n}\n\n/**\n * The tags a link field (`type: 'tag'`) points at: a list of tag ids (a single id is read as one;\n * anything else is none).\n */\nexport function linkedTagIds(value: unknown): string[] {\n if (typeof value === 'string') return value ? [value] : []\n return Array.isArray(value) ? value.filter((id): id is string => typeof id === 'string') : []\n}\n\n/** A value as text (a person or a linked tag by name, a checkbox as yes or no, blank as empty). */\nexport function cellText(\n value: unknown,\n column: Pick<TagTableField, 'type'>,\n nameOf?: (id: string) => string | undefined\n): string {\n if (value === undefined || value === null || value === '') return ''\n if (column.type === 'checkbox') return value ? 'Yes' : 'No'\n if (column.type === 'person' && typeof value === 'string') return nameOf?.(value) ?? value\n if (column.type === 'tag')\n return linkedTagIds(value)\n .map((id) => nameOf?.(id) ?? id)\n .join(', ')\n if (Array.isArray(value)) return value.map(String).join(', ')\n return String(value)\n}\n\n/** A typed input's text back as the value to store (`null` clears it). */\nexport function parseCell(text: string, type: TagTableFieldType): unknown {\n const t = text.trim()\n if (t === '') return null\n if (type === 'number') {\n const n = Number(t)\n return Number.isNaN(n) ? null : n\n }\n return t\n}\n\n/** The kind's fields as definitions to write back, every one kept by id. */\nexport const fieldWrites = (columns: readonly TagTableField[]): TagTableFieldWrite[] =>\n columns.map((c) => ({ id: c.id, name: c.name, type: c.type, options: c.options ?? null }))\n\nconst escapeCell = (text: string) => text.replace(/\\|/g, '\\\\|').replace(/\\n+/g, ' ')\n\nexport interface TagTableMarkdownOptions {\n title: string\n /** The evidence column's heading. */\n evidence?: string\n /** The row column's heading. */\n rowHeading?: string\n nameOf?: (id: string) => string | undefined\n /** When the snapshot was taken (ISO); default now. */\n at?: string\n}\n\n/**\n * The table as a Markdown document: a heading, when it was taken, and one table (a row per tag, a\n * column per field, then the evidence counts). What a host files or has signed.\n */\nexport function tagTableMarkdown(table: TagTableData, options: TagTableMarkdownOptions): string {\n const { columns } = table\n const heads = [\n options.rowHeading ?? 'Item',\n ...columns.map((c) => c.name),\n options.evidence ?? 'Evidence',\n ]\n const lines = [\n `# ${options.title}`,\n '',\n `_Snapshot taken ${new Date(options.at ?? Date.now()).toISOString().slice(0, 16).replace('T', ' ')} UTC_`,\n '',\n `| ${heads.map(escapeCell).join(' | ')} |`,\n `| ${heads.map(() => '---').join(' | ')} |`,\n ]\n for (const row of table.rows) {\n const l = rowLinks(row)\n const evidence = [\n `${l.doc_count} document${l.doc_count === 1 ? '' : 's'}`,\n `${l.fact_count} fact${l.fact_count === 1 ? '' : 's'}`,\n ...(l.thread_count ? [`${l.thread_count} thread${l.thread_count === 1 ? '' : 's'}`] : []),\n ].join(', ')\n const cells = [\n row.name,\n ...columns.map((c) => cellText(cellValue(row, c), c, options.nameOf)),\n evidence,\n ]\n lines.push(`| ${cells.map(escapeCell).join(' | ')} |`)\n }\n return `${lines.join('\\n')}\\n`\n}\n","/**\n * The columns of a table of tags — the fields of their kind in the workspace (its issue fields …) —\n * edited as one list: rename, reorder by position, add, remove, and a choice field's options. A kept\n * column keeps its id, so its values stay (its type is fixed once created). Saved in full through\n * the host (`onSave`); data-free.\n */\n\nimport { useState } from 'react'\nimport { ArrowDown, ArrowUp, Loader2, Plus, X } from 'lucide-react'\nimport { Button, Input, cn } from '@arbidocs/react/ui'\nimport type { TagTableField, TagTableFieldType, TagTableFieldWrite } from './tagTableModel'\n\nexport interface TagColumnsEditorLabels {\n title: string\n addColumn: string\n name: string\n type: string\n options: string\n optionsPlaceholder: string\n remove: string\n moveUp: string\n moveDown: string\n save: string\n saving: string\n cancel: string\n empty: string\n types: Record<TagTableFieldType, string>\n}\n\nexport const DEFAULT_TAG_COLUMNS_EDITOR_LABELS: TagColumnsEditorLabels = {\n title: 'Columns',\n addColumn: 'Add column',\n name: 'Column name',\n type: 'Type',\n options: 'Choices',\n optionsPlaceholder: 'Choices, comma-separated',\n remove: 'Remove column',\n moveUp: 'Move up',\n moveDown: 'Move down',\n save: 'Save columns',\n saving: 'Saving…',\n cancel: 'Cancel',\n empty: 'No columns.',\n types: {\n text: 'Text',\n number: 'Number',\n date: 'Date',\n checkbox: 'Yes / no',\n select: 'Choice',\n person: 'Person',\n document: 'Document',\n relation: 'Relation',\n lookup: 'Lookup',\n rollup: 'Rollup',\n tag: 'Link to tags',\n },\n}\n\n/** The types a tag's field can have. */\nconst TYPES: TagTableFieldType[] = ['text', 'number', 'date', 'checkbox', 'select', 'person']\n\ninterface Draft {\n id?: string\n name: string\n type: TagTableFieldType\n options: string\n}\n\nconst toDraft = (f: TagTableField): Draft => ({\n id: f.id,\n name: f.name,\n type: f.type,\n options: (f.options ?? []).join(', '),\n})\n\nconst toWrite = (d: Draft): TagTableFieldWrite => ({\n ...(d.id ? { id: d.id } : {}),\n name: d.name.trim(),\n type: d.type,\n options:\n d.type === 'tag'\n ? d.options\n .split(',')\n .map((o) => o.trim())\n .filter(Boolean)\n : d.type === 'select'\n ? d.options\n .split(',')\n .map((o) => o.trim())\n .filter(Boolean)\n : null,\n})\n\nexport interface TagColumnsEditorProps {\n columns: TagTableField[]\n /** Save the columns in full; a rejection (e.g. two columns of one name) stays on screen. */\n onSave: (fields: TagTableFieldWrite[]) => void | Promise<unknown>\n onCancel: () => void\n labels?: Partial<TagColumnsEditorLabels>\n className?: string\n testId?: string\n}\n\nexport function TagColumnsEditor({\n columns,\n onSave,\n onCancel,\n labels,\n className,\n testId = 'tag-columns',\n}: TagColumnsEditorProps) {\n const l = { ...DEFAULT_TAG_COLUMNS_EDITOR_LABELS, ...labels }\n const [drafts, setDrafts] = useState<Draft[]>(() => columns.map(toDraft))\n const [saving, setSaving] = useState(false)\n const patch = (i: number, change: Partial<Draft>) =>\n setDrafts((ds) => ds.map((d, j) => (j === i ? { ...d, ...change } : d)))\n const move = (i: number, by: number) =>\n setDrafts((ds) => {\n const next = [...ds]\n const [d] = next.splice(i, 1)\n next.splice(i + by, 0, d)\n return next\n })\n const valid = drafts.every(\n (d) => d.name.trim() && (d.type !== 'select' || toWrite(d).options?.length)\n )\n const input =\n 'h-8 rounded-md border border-input bg-background px-2 text-sm focus:outline-none focus:ring-1 focus:ring-ring'\n\n return (\n <form\n className={cn('space-y-2 rounded-lg border border-border p-3', className)}\n onSubmit={async (e) => {\n e.preventDefault()\n if (!valid) return\n setSaving(true)\n try {\n await onSave(drafts.map(toWrite))\n } finally {\n setSaving(false)\n }\n }}\n data-testid={testId}\n >\n <h3 className=\"text-sm font-semibold\">{l.title}</h3>\n {drafts.length === 0 && <p className=\"text-sm text-muted-foreground\">{l.empty}</p>}\n <ul className=\"space-y-2\">\n {drafts.map((d, i) => (\n <li\n key={d.id ?? `new-${i}`}\n className=\"flex flex-wrap items-center gap-2\"\n data-testid={`${testId}-column-${i}`}\n >\n <Input\n className=\"h-8 w-48\"\n value={d.name}\n placeholder={l.name}\n aria-label={l.name}\n onChange={(e) => patch(i, { name: e.target.value })}\n data-testid={`${testId}-name-${i}`}\n />\n <select\n className={cn(input, 'w-32')}\n value={d.type}\n // A column's type is fixed once it exists: its values were written for it.\n disabled={!!d.id}\n aria-label={l.type}\n onChange={(e) => patch(i, { type: e.target.value as TagTableFieldType })}\n data-testid={`${testId}-type-${i}`}\n >\n {(TYPES.includes(d.type) ? TYPES : [d.type, ...TYPES]).map((t) => (\n <option key={t} value={t}>\n {l.types[t]}\n </option>\n ))}\n </select>\n {d.type === 'select' && (\n <Input\n className=\"h-8 min-w-48 flex-1\"\n value={d.options}\n placeholder={l.optionsPlaceholder}\n aria-label={l.options}\n onChange={(e) => patch(i, { options: e.target.value })}\n data-testid={`${testId}-options-${i}`}\n />\n )}\n <div className=\"ml-auto flex items-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={i === 0}\n aria-label={l.moveUp}\n onClick={() => move(i, -1)}\n >\n <ArrowUp className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={i === drafts.length - 1}\n aria-label={l.moveDown}\n onClick={() => move(i, 1)}\n >\n <ArrowDown className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={l.remove}\n onClick={() => setDrafts((ds) => ds.filter((_, j) => j !== i))}\n data-testid={`${testId}-remove-${i}`}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n </li>\n ))}\n </ul>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setDrafts((ds) => [...ds, { name: '', type: 'text', options: '' }])}\n data-testid={`${testId}-add`}\n >\n <Plus className=\"size-4\" /> {l.addColumn}\n </Button>\n <div className=\"ml-auto flex items-center gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n {l.cancel}\n </Button>\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!valid || saving}\n data-testid={`${testId}-save`}\n >\n {saving && <Loader2 className=\"size-4 animate-spin\" />}\n {saving ? l.saving : l.save}\n </Button>\n </div>\n </div>\n </form>\n )\n}\n","/**\n * A table of tags (every issue, every person, a label's children): one row per tag, a column per\n * field of their kind in the workspace, editable in place by type (text, number, date, checkbox,\n * choice, person, a link to other tags), and counts of the documents,\n * facts and threads tagged with each row. A count opens its filtered content page. A row with nothing tagged yet is a normal row with an empty\n * cell. Rows and columns can be added (the columns are the kind's fields, edited as one list), and\n * the table exported as a Word document snapshot (filed in the workspace) or downloaded.\n * The data and every write come from the host (`ConnectedTagTable` binds them to ARBI).\n */\n\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport {\n ArrowUpRight,\n ChevronDown,\n Download,\n FileDown,\n FileText,\n Lightbulb,\n Loader2,\n MessagesSquare,\n MoreHorizontal,\n Plus,\n SlidersHorizontal,\n} from 'lucide-react'\nimport {\n Button,\n TagEntity,\n Checkbox,\n Input,\n cn,\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@arbidocs/react/ui'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { GridView } from '../files/GridView'\nimport {\n cellText,\n cellValue,\n isGap,\n linkedTagIds,\n parseCell,\n rowLinks,\n type TagTableData,\n type TagTableField,\n type TagTableFieldWrite,\n type TagTableRow,\n} from './tagTableModel'\nimport { TagColumnsEditor, type TagColumnsEditorLabels } from './TagColumnsEditor'\n\nexport interface TagTableLabels {\n row: string\n evidence: string\n /** `{count}` documents linked. */\n documents: string\n /** `{count}` facts linked. */\n facts: string\n /** `{count}` threads linked. */\n threads: string\n /** One document, one fact, one thread. */\n document: string\n fact: string\n thread: string\n /** A thread without a title. */\n untitledThread: string\n /** `{count}` more links than shown. */\n more: string\n addRow: string\n addRowPlaceholder: string\n add: string\n export: string\n exporting: string\n download: string\n empty: string\n loading: string\n noColumns: string\n choose: string\n yes: string\n /** Opens the column editor. */\n moreActions: string\n editColumns: string\n /** The column editor's own labels. */\n columns?: Partial<TagColumnsEditorLabels>\n}\n\nexport const DEFAULT_TAG_TABLE_LABELS: TagTableLabels = {\n row: 'Item',\n evidence: 'Tagged items',\n documents: '{count} documents',\n facts: '{count} facts',\n threads: '{count} threads',\n document: '1 document',\n fact: '1 fact',\n thread: '1 thread',\n untitledThread: 'Untitled thread',\n more: '+{count} more',\n addRow: 'Add row',\n addRowPlaceholder: 'Name of the new row',\n add: 'Add',\n export: 'Save as Word document',\n download: 'Download .docx',\n exporting: 'Exporting…',\n empty: 'No rows yet.',\n loading: 'Loading…',\n noColumns: 'No columns yet: add one to give each row a value.',\n choose: '—',\n yes: 'Yes',\n editColumns: 'Columns',\n moreActions: 'More',\n}\n\nexport type TagContentKind = 'documents' | 'facts' | 'threads'\n\nexport interface TagTableProps {\n /** The kind's fields (the columns) and its tags (the rows, with their links). */\n table: TagTableData | undefined\n isLoading?: boolean\n /** Change one cell (`null` clears it). Absent: read only. */\n onChangeValue?: (tagId: string, fieldId: string, value: unknown) => void | Promise<unknown>\n /** Add a row (a new tag of the kind). Absent: no \"Add row\". */\n onAddRow?: (name: string) => void | Promise<unknown>\n /**\n * Set the columns (the kind's fields) in full: a kept column has its `id`. Absent: the columns\n * are fixed.\n */\n onChangeColumns?: (fields: TagTableFieldWrite[]) => void | Promise<unknown>\n /** Open a linked document. */\n onOpenDocument?: (documentId: string) => void\n /** Open a linked fact. */\n onOpenFact?: (factId: string) => void\n /** Open a linked thread (conversation). */\n onOpenThread?: (conversationId: string) => void\n /** Open a row's tag (everything tagged with it). */\n onOpenRow?: (tagId: string) => void\n /** Open the relevant content page filtered by this tag. */\n onOpenTaggedItems?: (tagId: string, kind: TagContentKind) => void\n /** Export the table as it stands (filed as a document). Absent: no export button. */\n onExport?: () => void | Promise<unknown>\n /** Download the table as it stands as a file. Absent: no download button. */\n onDownload?: () => void | Promise<unknown>\n /** Who a person column offers. */\n people?: ReadonlyArray<{ value: string; label: string }>\n /**\n * The tags a link column (`type: 'tag'`) offers — each with its kind; a column offers those of\n * the kinds in its `options` — and names its values by.\n */\n tags?: ReadonlyArray<{ value: string; label: string; kind: string }>\n /** Open a linked tag (a link column's value). */\n onOpenTag?: (tagId: string) => void\n /** Extra controls in the toolbar. */\n actions?: ReactNode\n /** Secondary controls shown inside More, beside column setup and exports. */\n secondaryActions?: ReactNode\n labels?: Partial<TagTableLabels>\n className?: string\n testId?: string\n}\n\n/**\n * The shared GridView keeps the row name pinned, followed by tagged content and sortable fields.\n * Rows fit their content and use the page scroll, preserving the existing table layout. Long names wrap in their column (cut after\n * three lines, in full in the tooltip) and tagged-item chips wrap, so nothing runs into the next\n * column or off the page. Only a matrix with very many fields scrolls, inside its own box.\n */\nconst ROW_LABEL = 'line-clamp-3 whitespace-normal break-words'\n\n/**\n * One editable field value of a tag, by its type: committed on blur or Enter (a checkbox and a\n * choice at once). A table cell, and a field of a single tag's form (`TagDetail`).\n */\nexport function TagTableCell({\n row,\n column,\n people,\n tags,\n onOpenTag,\n onChange,\n l,\n testId,\n}: {\n row: TagTableRow\n column: TagTableField\n people?: TagTableProps['people']\n tags?: TagTableProps['tags']\n onOpenTag?: TagTableProps['onOpenTag']\n onChange?: TagTableProps['onChangeValue']\n l: TagTableLabels\n testId: string\n}) {\n const value = cellValue(row, column)\n const nameOf = (id: string) =>\n (column.type === 'tag' ? tags : people)?.find((p) => p.value === id)?.label\n const shown = cellText(value, column, nameOf)\n const [draft, setDraft] = useState(shown)\n useEffect(() => setDraft(cellText(value, column)), [value, column])\n const set = (next: unknown) => void onChange?.(row.external_id, column.id, next)\n\n if (column.type === 'tag')\n return (\n <TagLinkCell\n row={row}\n column={column}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChange ? set : undefined}\n l={l}\n testId={testId}\n />\n )\n if (!onChange)\n return (\n <span className=\"block truncate\" title={shown} data-testid={testId}>\n {shown || <span className=\"text-muted-foreground\">{l.choose}</span>}\n </span>\n )\n const field =\n 'h-8 w-full min-w-0 rounded-md border border-transparent bg-transparent px-1.5 text-sm hover:border-input focus:border-input focus:bg-background focus:outline-none'\n switch (column.type) {\n case 'checkbox':\n return (\n <Checkbox\n checked={value === true}\n onCheckedChange={(v) => set(v === true)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n />\n )\n case 'select':\n case 'person': {\n const options =\n column.type === 'select'\n ? (column.options ?? []).map((o) => ({ value: o, label: o }))\n : (people ?? [])\n return (\n <select\n className={cn(field, 'pr-6')}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => set(e.target.value || null)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n >\n <option value=\"\">{l.choose}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n {typeof value === 'string' && value && !options.some((o) => o.value === value) && (\n <option value={value}>{value}</option>\n )}\n </select>\n )\n }\n default: {\n const commit = () => {\n if (draft !== cellText(value, column)) set(parseCell(draft, column.type))\n }\n return (\n <input\n className={cn(field, 'pr-6')}\n type={column.type === 'number' ? 'number' : column.type === 'date' ? 'date' : 'text'}\n value={column.type === 'date' ? draft.slice(0, 10) : draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur()\n if (e.key === 'Escape') setDraft(cellText(value, column))\n }}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n />\n )\n }\n }\n}\n\n/**\n * A link field's value: the linked tags as chips that open them, and (editable) a choice among the\n * tags of the kinds the field allows. One link at a time; the value is stored as a list.\n */\nfunction TagLinkCell({\n row,\n column,\n tags,\n onOpenTag,\n onChange,\n l,\n testId,\n}: {\n row: TagTableRow\n column: TagTableField\n tags?: TagTableProps['tags']\n onOpenTag?: TagTableProps['onOpenTag']\n onChange?: (next: unknown) => void\n l: TagTableLabels\n testId: string\n}) {\n const ids = linkedTagIds(cellValue(row, column))\n const kinds = column.options ?? []\n const options = (tags ?? []).filter(\n (t) => t.value !== row.external_id && (kinds.length === 0 || kinds.includes(t.kind))\n )\n const label = (id: string) => tags?.find((t) => t.value === id)?.label ?? id\n const chips = ids.map((id) =>\n onOpenTag ? (\n <button\n key={id}\n type=\"button\"\n onClick={() => onOpenTag(id)}\n className=\"inline-flex min-w-0 max-w-full items-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={`${testId}-link-${id}`}\n >\n <TagEntity tag={{ external_id: id, name: label(id) }} showTooltip={false} wrap />\n </button>\n ) : (\n <span\n key={id}\n className=\"inline-flex min-w-0 max-w-full\"\n data-testid={`${testId}-link-${id}`}\n >\n <TagEntity tag={{ external_id: id, name: label(id) }} showTooltip={false} wrap />\n </span>\n )\n )\n if (!onChange)\n return (\n <span className=\"flex min-w-0 flex-wrap gap-1\" data-testid={testId}>\n {chips.length ? chips : <span className=\"text-muted-foreground\">{l.choose}</span>}\n </span>\n )\n const current = ids[0]\n // The linked name is text that wraps (a narrow column never cuts it to \"Acm…\"), and opens the\n // tag; the picker behind the chevron changes it.\n return (\n // Wraps: in a narrow column the name breaks between words and the picker moves below it.\n <span className=\"flex min-w-0 flex-wrap items-center gap-x-1 py-1\">\n {current &&\n (onOpenTag ? (\n <button\n type=\"button\"\n onClick={() => onOpenTag(current)}\n className=\"max-w-full rounded px-1 text-left text-sm break-words hover:text-primary hover:underline focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={`Open ${label(current)}`}\n title={`Open ${label(current)}`}\n data-testid={`${testId}-open`}\n >\n <TagEntity\n tag={{ external_id: current, name: label(current) }}\n showTooltip={false}\n wrap\n />\n <ArrowUpRight className=\"ml-0.5 inline size-3.5 align-[-2px] text-muted-foreground\" />\n </button>\n ) : (\n <TagEntity\n tag={{ external_id: current, name: label(current) }}\n showTooltip={false}\n wrap\n />\n ))}\n <span\n className={cn(\n 'relative inline-flex h-6 shrink-0 items-center rounded text-muted-foreground hover:bg-muted hover:text-foreground focus-within:ring-2 focus-within:ring-ring',\n current ? 'w-6 justify-center' : 'min-w-0 flex-1 gap-1 px-1 text-sm'\n )}\n title={current ? `${column.name}: ${label(current)}` : undefined}\n >\n {!current && <span className=\"truncate\">{l.choose}</span>}\n <ChevronDown className=\"size-3.5 shrink-0\" />\n <select\n className=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n value={current ?? ''}\n onChange={(e) => onChange(e.target.value ? [e.target.value] : null)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n >\n <option value=\"\">{l.choose}</option>\n {options.map((t) => (\n <option key={t.value} value={t.value}>\n {t.label}\n </option>\n ))}\n {current && !options.some((t) => t.value === current) && (\n <option value={current}>{label(current)}</option>\n )}\n </select>\n </span>\n </span>\n )\n}\n\n/** A count as a phrase: \"1 document\", \"3 facts\", or nothing for none. */\nconst countText = (count: number, one: string, many: string) =>\n count === 1 ? one : count ? many.replace('{count}', String(count)) : null\n\n/** Counts open the existing content pages filtered by this tag. No item previews. */\nexport function TagContentCounts({\n row,\n l,\n onOpenTaggedItems,\n onOpenRow,\n testId,\n}: {\n row: TagTableRow\n l: TagTableLabels\n onOpenTaggedItems?: TagTableProps['onOpenTaggedItems']\n onOpenRow?: TagTableProps['onOpenRow']\n testId: string\n}) {\n if (isGap(row)) return null\n const links = rowLinks(row)\n const groups = [\n {\n kind: 'documents' as const,\n count: links.doc_count,\n label: countText(links.doc_count, l.document, l.documents),\n Icon: FileText,\n },\n {\n kind: 'facts' as const,\n count: links.fact_count,\n label: countText(links.fact_count, l.fact, l.facts),\n Icon: Lightbulb,\n },\n {\n kind: 'threads' as const,\n count: links.thread_count,\n label: countText(links.thread_count, l.thread, l.threads),\n Icon: MessagesSquare,\n },\n ].filter((group) => group.count > 0)\n return (\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\" data-testid={testId}>\n {groups.map(({ kind, label, Icon }, index) => (\n <span key={kind} className=\"inline-flex items-center gap-2\">\n {index > 0 && (\n <span aria-hidden className=\"text-muted-foreground\">\n {' · '}\n </span>\n )}\n {onOpenTaggedItems || onOpenRow ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 text-sm text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={`${testId}-${kind}`}\n title={`Show ${label} tagged “${row.name}”`}\n onClick={() =>\n onOpenTaggedItems\n ? onOpenTaggedItems(row.external_id, kind)\n : onOpenRow?.(row.external_id)\n }\n >\n <Icon className=\"size-3.5\" />\n {label}\n </button>\n ) : (\n <span className=\"inline-flex items-center gap-1 text-sm text-muted-foreground\">\n <Icon className=\"size-3.5\" />\n {label}\n </span>\n )}\n </span>\n ))}\n </div>\n )\n}\n\nexport function TagTable({\n table,\n isLoading,\n onChangeValue,\n onAddRow,\n onChangeColumns,\n onOpenRow,\n onOpenTaggedItems,\n onExport,\n onDownload,\n people,\n tags,\n onOpenTag,\n actions,\n secondaryActions,\n labels,\n className,\n testId = 'tag-table',\n}: TagTableProps) {\n const l = useMemo(() => ({ ...DEFAULT_TAG_TABLE_LABELS, ...labels }), [labels])\n const columns = useMemo(() => table?.columns ?? [], [table])\n const rows = table?.rows ?? []\n const [editingColumns, setEditingColumns] = useState(false)\n const [name, setName] = useState('')\n const [adding, setAdding] = useState(false)\n const [exporting, setExporting] = useState(false)\n\n const add = async () => {\n const n = name.trim()\n if (!n || !onAddRow) return\n setAdding(true)\n try {\n await onAddRow(n)\n setName('')\n } finally {\n setAdding(false)\n }\n }\n\n const columnDefs = useMemo<ColDef<TagTableRow>[]>(\n () => [\n {\n colId: 'name',\n headerName: l.row,\n field: 'name',\n width: 176,\n minWidth: 160,\n pinned: 'left',\n sortable: true,\n filter: false,\n autoHeight: true,\n cellClass: 'px-3! py-2! leading-normal!',\n cellRenderer: ({ data: row }: ICellRendererParams<TagTableRow>) =>\n row ? (\n onOpenRow ? (\n <button\n type=\"button\"\n className={cn(\n ROW_LABEL,\n 'text-left font-medium hover:text-primary hover:underline'\n )}\n title={row.name}\n onClick={() => onOpenRow(row.external_id)}\n data-testid={`${testId}-row-${row.external_id}-label`}\n >\n <TagEntity tag={row} showTooltip={false} wrap />\n </button>\n ) : (\n <span\n className={cn(ROW_LABEL, 'font-medium')}\n title={row.name}\n data-testid={`${testId}-row-${row.external_id}-label`}\n >\n <TagEntity tag={row} showTooltip={false} wrap />\n </span>\n )\n ) : null,\n },\n {\n colId: 'evidence',\n headerName: l.evidence,\n width: 250,\n minWidth: 224,\n flex: 1,\n sortable: true,\n filter: false,\n autoHeight: true,\n cellClass: 'px-3! py-2! leading-normal!',\n valueGetter: ({ data }) => {\n if (!data) return 0\n const links = rowLinks(data)\n return links.doc_count + links.fact_count + links.thread_count\n },\n cellRenderer: ({ data: row }: ICellRendererParams<TagTableRow>) =>\n row ? (\n <TagContentCounts\n row={row}\n l={l}\n onOpenRow={onOpenRow}\n onOpenTaggedItems={onOpenTaggedItems}\n testId={`${testId}-evidence-${row.external_id}`}\n />\n ) : null,\n },\n ...columns.map((column): ColDef<TagTableRow> => ({\n colId: column.id,\n headerName: column.name,\n flex: 1,\n minWidth: 150,\n sortable: true,\n filter: false,\n // These are native inline editors: let their caret, select and checkbox keys work.\n suppressKeyboardEvent: ({ event }) =>\n event.target instanceof HTMLElement &&\n Boolean(\n event.target.closest(\n 'input, select, textarea, button, [role=\"checkbox\"], [role=\"combobox\"]'\n )\n ),\n cellClass: 'px-1.5! py-1! leading-normal!',\n valueGetter: ({ data }) => {\n if (!data) return null\n const value = cellValue(data, column)\n if (value == null || value === '') return null\n if (column.type === 'number') return Number(value)\n if (column.type === 'checkbox') return value ? 1 : 0\n return cellText(\n value,\n column,\n (id) =>\n people?.find((p) => p.value === id)?.label ?? tags?.find((t) => t.value === id)?.label\n )\n },\n cellRenderer: ({ data: row }: ICellRendererParams<TagTableRow>) =>\n row ? (\n <TagTableCell\n row={row}\n column={column}\n people={people}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChangeValue}\n l={l}\n testId={`${testId}-cell-${row.external_id}-${column.id}`}\n />\n ) : null,\n })),\n ],\n [columns, l, people, tags, onOpenRow, onOpenTaggedItems, onOpenTag, onChangeValue, testId]\n )\n\n return (\n <div className={cn('space-y-3', className)} data-testid={testId}>\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {actions}\n {(secondaryActions || onChangeColumns || onDownload || onExport) && (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={l.moreActions}\n data-testid={`${testId}-more`}\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"flex w-auto min-w-48 flex-col items-stretch gap-1 p-2\"\n >\n {secondaryActions}\n {onChangeColumns && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"justify-start\"\n onClick={() => setEditingColumns((v) => !v)}\n data-testid={`${testId}-edit-columns`}\n >\n <SlidersHorizontal className=\"size-4\" /> {l.editColumns}\n </Button>\n )}\n {onExport && (\n <Button\n disabled={exporting || rows.length === 0}\n variant=\"ghost\"\n size=\"sm\"\n className=\"justify-start\"\n onClick={() => {\n setExporting(true)\n void Promise.resolve()\n .then(() => onExport())\n .finally(() => setExporting(false))\n }}\n data-testid={`${testId}-export`}\n >\n {exporting ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <FileDown className=\"size-4\" />\n )}\n {exporting ? l.exporting : l.export}\n </Button>\n )}\n {onDownload && (\n <Button\n disabled={rows.length === 0}\n variant=\"ghost\"\n size=\"sm\"\n className=\"justify-start\"\n onClick={() => void onDownload()}\n data-testid={`${testId}-download`}\n >\n <Download className=\"size-4\" /> {l.download}\n </Button>\n )}\n </PopoverContent>\n </Popover>\n )}\n </div>\n </div>\n\n {editingColumns && onChangeColumns && (\n <TagColumnsEditor\n columns={columns}\n labels={l.columns}\n onCancel={() => setEditingColumns(false)}\n onSave={async (fields) => {\n await onChangeColumns(fields)\n setEditingColumns(false)\n }}\n testId={`${testId}-columns`}\n />\n )}\n\n {onAddRow && (\n <form\n className=\"flex max-w-md items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n void add()\n }}\n >\n <Input\n value={name}\n placeholder={l.addRowPlaceholder}\n aria-label={l.addRow}\n onChange={(e) => setName(e.target.value)}\n data-testid={`${testId}-add-name`}\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n variant=\"outline\"\n disabled={!name.trim() || adding}\n data-testid={`${testId}-add`}\n >\n <Plus className=\"size-4\" /> {l.addRow}\n </Button>\n </form>\n )}\n\n {isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {l.loading}\n </p>\n ) : (\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <GridView\n items={rows}\n columnDefs={columnDefs}\n getItemId={(row) => row.external_id}\n height=\"auto\"\n emptyState={{ title: l.empty }}\n gridOptions={{\n ensureDomOrder: true,\n domLayout: 'autoHeight',\n }}\n getRowTestId={(row) => `${testId}-row-${row.external_id}`}\n testId={`${testId}-table`}\n />\n {columns.length === 0 && rows.length > 0 && (\n <p className=\"border-t border-border px-3 py-2 text-xs text-muted-foreground\">\n {l.noColumns}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * One tag in full: its values for its kind's fields (position, role, status, …) editable in place,\n * then everything across the workspace that carries it — the documents (with the value or note the\n * tag has on each, and how many passages back it), the facts and the threads. The data is the tag\n * read with its links (`TagTableRow`) and its kind's fields; every write goes back through the host.\n * Laid out with the shared detail parts (`DetailPanel`), as a database row is.\n */\n\nimport type { ReactNode } from 'react'\nimport { FileText, Lightbulb, MessagesSquare } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport {\n DetailBody,\n DetailEmpty,\n DetailField,\n DetailFields,\n DetailLinkItem,\n DetailLinkList,\n DetailLoading,\n DetailSection,\n} from '../components/DetailPanel'\nimport {\n DEFAULT_TAG_TABLE_LABELS,\n TagTableCell,\n TagContentCounts,\n type TagTableLabels,\n type TagTableProps,\n} from './TagTable'\nimport { rowLinks, type TagTableField, type TagTableRow } from './tagTableModel'\n\nexport interface TagDetailLabels {\n fields: string\n documents: string\n facts: string\n threads: string\n /** `{shown}` of `{count}` listed. */\n showing: string\n noDocuments: string\n noFacts: string\n /** An annotation with no value on a document. */\n noValue: string\n noThreads: string\n untitledThread: string\n /** When a thread was last active: `{date}`. */\n threadUpdated: string\n /** `{count}` passages cited. */\n passages: string\n passage: string\n loading: string\n}\n\nexport const DEFAULT_TAG_DETAIL_LABELS: TagDetailLabels = {\n fields: 'Fields',\n documents: 'Documents',\n facts: 'Facts',\n threads: 'Threads',\n showing: 'Showing {shown} of {count}',\n noDocuments: 'No document carries this tag yet.',\n noFacts: 'No fact carries this tag yet.',\n noValue: 'No note',\n noThreads: 'No thread carries this tag yet.',\n untitledThread: 'Untitled thread',\n threadUpdated: 'Updated {date}',\n passages: '{count} passages',\n passage: '1 passage',\n loading: 'Loading…',\n}\n\nexport interface TagDetailProps extends Pick<\n TagTableProps,\n | 'onChangeValue'\n | 'onOpenTaggedItems'\n | 'onOpenDocument'\n | 'onOpenFact'\n | 'onOpenThread'\n | 'people'\n | 'tags'\n | 'onOpenTag'\n> {\n /** The tag with its values and links (documents, facts, threads). */\n row: TagTableRow | undefined\n /** Its kind's fields in the workspace (none: no Fields section). */\n fields?: TagTableField[]\n /**\n * What the tag's note on a document is, e.g. \"Note\" for an annotation or \"Role\" for a person.\n * Given, each document row names it before the note.\n */\n noteLabel?: string\n /**\n * The note is the point of the row (an annotation's value): shown prominently, and a document\n * without one says so.\n */\n noteIsValue?: boolean\n /**\n * Render a document's cited passages in place of the plain \"N passages\" count (e.g. a popover\n * listing them); `label` is that count's text. Called only for a document with passages.\n */\n renderPassages?: (\n doc: { doc_ext_id: string; citations_count: number },\n label: string\n ) => ReactNode\n isLoading?: boolean\n labels?: Partial<TagDetailLabels>\n /** Labels of the field inputs (the empty choice). */\n fieldLabels?: Partial<TagTableLabels>\n className?: string\n testId?: string\n}\n\n/** A timestamp as a day in the viewer's locale (\"18 Oct 2026\"). */\nconst formatDay = (iso: string) => {\n const at = new Date(iso)\n return Number.isNaN(at.getTime())\n ? iso\n : at.toLocaleDateString(undefined, { day: 'numeric', month: 'short', year: 'numeric' })\n}\n\nexport function TagDetail({\n row,\n fields = [],\n isLoading,\n people,\n tags,\n onOpenTag,\n onChangeValue,\n onOpenDocument,\n onOpenFact,\n onOpenThread,\n onOpenTaggedItems,\n noteLabel,\n noteIsValue = false,\n renderPassages,\n labels,\n fieldLabels,\n className,\n testId = 'tag-detail',\n}: TagDetailProps) {\n const l = { ...DEFAULT_TAG_DETAIL_LABELS, ...labels }\n const cellLabels = { ...DEFAULT_TAG_TABLE_LABELS, ...fieldLabels }\n if (isLoading || !row) return <DetailLoading label={l.loading} />\n const links = rowLinks(row)\n const docs = links.docs ?? []\n const facts = links.facts ?? []\n const threads = links.threads ?? []\n const passages = (n: number) => (n === 1 ? l.passage : l.passages.replace('{count}', String(n)))\n\n return (\n <DetailBody className={className} testId={testId}>\n {onOpenTaggedItems ? (\n <TagContentCounts\n row={row}\n l={cellLabels}\n onOpenTaggedItems={onOpenTaggedItems}\n testId={`${testId}-counts`}\n />\n ) : (\n <>\n <DetailSection\n title={l.documents}\n count={links.doc_count}\n shown={docs.length}\n showingLabel={l.showing}\n testId={`${testId}-documents`}\n >\n {docs.length ? (\n <DetailLinkList>\n {docs.map((d) => (\n <DetailLinkItem\n key={d.doc_ext_id}\n icon={<FileText className=\"size-4\" />}\n onClick={onOpenDocument ? () => onOpenDocument(d.doc_ext_id) : undefined}\n testId={`${testId}-doc-${d.doc_ext_id}`}\n trailing={\n d.citations_count > 0 &&\n !renderPassages && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {passages(d.citations_count)}\n </span>\n )\n }\n after={\n d.citations_count > 0 &&\n renderPassages && (\n <span className=\"shrink-0 px-3 py-2 text-xs\">\n {renderPassages(d, passages(d.citations_count))}\n </span>\n )\n }\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">{d.file_name}</span>\n {(d.note || noteIsValue) && (\n <span\n className={cn(\n 'mt-0.5 flex min-w-0 items-baseline gap-2',\n noteIsValue ? 'text-base text-foreground' : 'text-muted-foreground'\n )}\n data-testid={`${testId}-doc-${d.doc_ext_id}-note`}\n >\n {noteLabel && (\n <span className=\"shrink-0 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {noteLabel}\n </span>\n )}\n <span\n className={cn(\n 'line-clamp-3 min-w-0 whitespace-pre-line',\n noteIsValue && 'font-semibold',\n !d.note && 'font-normal italic text-muted-foreground'\n )}\n >\n {d.note || l.noValue}\n </span>\n </span>\n )}\n </span>\n </DetailLinkItem>\n ))}\n </DetailLinkList>\n ) : (\n <DetailEmpty>{l.noDocuments}</DetailEmpty>\n )}\n </DetailSection>\n\n <DetailSection\n title={l.facts}\n count={links.fact_count}\n shown={facts.length}\n showingLabel={l.showing}\n testId={`${testId}-facts`}\n >\n {facts.length ? (\n <DetailLinkList>\n {facts.map((f) => (\n <DetailLinkItem\n key={f.fact_ext_id}\n icon={<Lightbulb className=\"size-4\" />}\n onClick={onOpenFact ? () => onOpenFact(f.fact_ext_id) : undefined}\n testId={`${testId}-fact-${f.fact_ext_id}`}\n >\n <span className=\"line-clamp-3 min-w-0 flex-1\">{f.text}</span>\n </DetailLinkItem>\n ))}\n </DetailLinkList>\n ) : (\n <DetailEmpty>{l.noFacts}</DetailEmpty>\n )}\n </DetailSection>\n\n <DetailSection\n title={l.threads}\n count={links.thread_count}\n shown={threads.length}\n showingLabel={l.showing}\n testId={`${testId}-threads`}\n >\n {threads.length ? (\n <DetailLinkList>\n {threads.map((t) => (\n <DetailLinkItem\n key={t.conversation_ext_id}\n icon={<MessagesSquare className=\"size-4\" />}\n onClick={onOpenThread ? () => onOpenThread(t.conversation_ext_id) : undefined}\n testId={`${testId}-thread-${t.conversation_ext_id}`}\n trailing={\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {l.threadUpdated.replace('{date}', formatDay(t.updated_at))}\n </span>\n }\n >\n <span className=\"min-w-0 flex-1 truncate font-medium\">\n {t.title || l.untitledThread}\n </span>\n </DetailLinkItem>\n ))}\n </DetailLinkList>\n ) : (\n <DetailEmpty>{l.noThreads}</DetailEmpty>\n )}\n </DetailSection>\n </>\n )}\n {fields.length > 0 && (\n <DetailSection title={l.fields} testId={`${testId}-fields`}>\n <DetailFields>\n {fields.map((field) => (\n <DetailField key={field.id} label={field.name}>\n <TagTableCell\n row={row}\n column={field}\n people={people}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChangeValue}\n l={cellLabels}\n testId={`${testId}-field-${field.id}`}\n />\n </DetailField>\n ))}\n </DetailFields>\n </DetailSection>\n )}\n </DetailBody>\n )\n}\n","/**\n * A table of tags as a Word document: a title, when the snapshot was taken, then one table with a\n * row per tag, a column per field of its kind, the evidence behind it (linked document names and fact\n * excerpts) and its gaps. Written straight as WordprocessingML and zipped with `fflate` (already a\n * dependency, and what `docx/export.ts` uses), so the result opens in the native Word editor and\n * in Word without pulling the editor engine into the tags module.\n */\n\nimport {\n cellText,\n cellValue,\n isGap,\n rowLinks,\n type TagTableData,\n type TagTableField,\n type TagTableRow,\n} from './tagTableModel'\nimport {\n cell,\n docxPackage,\n documentXml,\n minuteUtc,\n page,\n paragraph,\n TABLE_DOCUMENT_STYLES,\n} from './ooxml'\n\nexport { DOCX_MIME_TYPE } from './ooxml'\n\n/** More table columns than this (item, fields, evidence, gaps) turn the page to landscape. */\nexport const TAG_TABLE_DOCX_LANDSCAPE_AFTER = 6\n\nexport interface TagTableDocxLabels {\n /** The row column's heading. */\n row: string\n evidence: string\n gaps: string\n /** `{at}` is the snapshot time, `YYYY-MM-DD HH:MM UTC`. */\n takenAt: string\n /** A row with no linked document, fact or thread. */\n noEvidence: string\n /** `{fields}`: the row's empty fields. */\n missing: string\n /** `{count}` more links than listed. */\n more: string\n document: string\n documents: string\n fact: string\n facts: string\n thread: string\n threads: string\n untitledThread: string\n empty: string\n}\n\nexport const DEFAULT_TAG_TABLE_DOCX_LABELS: TagTableDocxLabels = {\n row: 'Item',\n evidence: 'Evidence',\n gaps: 'Gaps',\n takenAt: 'Snapshot taken {at}',\n noEvidence: 'No evidence',\n missing: 'Missing: {fields}',\n more: '+{count} more',\n document: '1 document',\n documents: '{count} documents',\n fact: '1 fact',\n facts: '{count} facts',\n thread: '1 thread',\n threads: '{count} threads',\n untitledThread: 'Untitled thread',\n empty: 'No rows.',\n}\n\nexport interface TagTableDocxOptions {\n title: string\n nameOf?: (id: string) => string | undefined\n /** When the snapshot was taken (ISO); default now. */\n at?: string\n labels?: Partial<TagTableDocxLabels>\n}\n\nconst count = (n: number, one: string, many: string) =>\n n === 1 ? one : many.replace('{count}', String(n))\n\nfunction evidenceParagraphs(row: TagTableRow, l: TagTableDocxLabels): string[] {\n if (isGap(row)) return []\n const links = rowLinks(row)\n const docs = links.docs ?? []\n const facts = links.facts ?? []\n const threads = links.threads ?? []\n const more =\n links.doc_count -\n docs.length +\n (links.fact_count - facts.length) +\n (links.thread_count - threads.length)\n return [\n paragraph(\n [\n {\n text: [\n links.doc_count ? count(links.doc_count, l.document, l.documents) : null,\n links.fact_count ? count(links.fact_count, l.fact, l.facts) : null,\n links.thread_count ? count(links.thread_count, l.thread, l.threads) : null,\n ]\n .filter(Boolean)\n .join(' · '),\n muted: true,\n },\n ],\n 'TagTableCell'\n ),\n ...docs.map((d) =>\n paragraph(\n [{ text: d.file_name, bold: true }, ...(d.note ? [{ text: ` — ${d.note}` }] : [])],\n 'TagTableCell'\n )\n ),\n ...facts.map((f) => paragraph([{ text: `“${f.text}”`, italic: true }], 'TagTableCell')),\n ...threads.map((t) => paragraph([{ text: t.title || l.untitledThread }], 'TagTableCell')),\n ...(more > 0\n ? [\n paragraph(\n [{ text: l.more.replace('{count}', String(more)), muted: true }],\n 'TagTableCell'\n ),\n ]\n : []),\n ]\n}\n\nfunction gapParagraphs(\n row: TagTableRow,\n columns: TagTableField[],\n l: TagTableDocxLabels\n): string[] {\n const missing = columns\n .filter((c) => c.type !== 'checkbox' && cellText(cellValue(row, c), c) === '')\n .map((c) => c.name)\n return [\n ...(isGap(row) ? [paragraph([{ text: l.noEvidence, bold: true }], 'TagTableCell')] : []),\n ...(missing.length\n ? [paragraph([{ text: l.missing.replace('{fields}', missing.join(', ')) }], 'TagTableCell')]\n : []),\n ]\n}\n\n/** `word/document.xml` for the table (exposed for tests and for hosts that assemble their own package). */\nexport function tagTableDocumentXml(table: TagTableData, options: TagTableDocxOptions): string {\n const l = { ...DEFAULT_TAG_TABLE_DOCX_LABELS, ...options.labels }\n const { columns, rows } = table\n const heads = [l.row, ...columns.map((c) => c.name), l.evidence, l.gaps]\n const landscape = heads.length > TAG_TABLE_DOCX_LANDSCAPE_AFTER\n const { textWidth, sectPr } = page(landscape)\n // Relative widths: the item and evidence get room to read, each field and the gaps a share.\n const weights = [2, ...columns.map(() => 1), 3, 1.5]\n const total = weights.reduce((a, b) => a + b, 0)\n const widths = weights.map((w) => Math.floor((textWidth * w) / total))\n const at = minuteUtc(options.at ?? new Date().toISOString())\n\n const header = `<w:tr><w:trPr><w:tblHeader/><w:cantSplit/></w:trPr>${heads\n .map((h, i) =>\n cell([paragraph([{ text: h, bold: true }], 'TagTableCell')], widths[i], 'E7E6E6')\n )\n .join('')}</w:tr>`\n const body = rows.map((row) => {\n const fill = isGap(row) ? 'FFF2CC' : undefined\n const cells = [\n cell([paragraph([{ text: row.name, bold: true }], 'TagTableCell')], widths[0], fill),\n ...columns.map((c, i) => {\n const text = cellText(cellValue(row, c), c, options.nameOf)\n return cell(text ? [paragraph([{ text }], 'TagTableCell')] : [], widths[i + 1], fill)\n }),\n cell(evidenceParagraphs(row, l), widths[columns.length + 1], fill),\n cell(gapParagraphs(row, columns, l), widths[columns.length + 2], fill),\n ]\n return `<w:tr><w:trPr><w:cantSplit/></w:trPr>${cells.join('')}</w:tr>`\n })\n\n const grid = `<w:tbl><w:tblPr><w:tblStyle w:val=\"TagTableGrid\"/><w:tblW w:w=\"${textWidth}\" w:type=\"dxa\"/><w:tblLayout w:type=\"fixed\"/><w:tblLook w:val=\"04A0\" w:firstRow=\"1\" w:lastRow=\"0\" w:firstColumn=\"1\" w:lastColumn=\"0\" w:noHBand=\"0\" w:noVBand=\"1\"/></w:tblPr><w:tblGrid>${widths\n .map((w) => `<w:gridCol w:w=\"${w}\"/>`)\n .join('')}</w:tblGrid>${header}${body.join('')}</w:tbl>`\n\n return documentXml(\n `${paragraph(\n [{ text: options.title }],\n 'Title'\n )}${paragraph([{ text: l.takenAt.replace('{at}', `${at} UTC`), muted: true }])}${grid}${\n rows.length ? '' : paragraph([{ text: l.empty, muted: true }])\n }<w:p/>${sectPr}`\n )\n}\n\n/** The table as `.docx` bytes. */\nexport function tagTableDocx(table: TagTableData, options: TagTableDocxOptions): Uint8Array {\n const at = new Date(options.at ?? Date.now()).toISOString()\n return docxPackage({\n document: tagTableDocumentXml(table, { ...options, at }),\n styles: TABLE_DOCUMENT_STYLES,\n title: options.title,\n at,\n })\n}\n","/**\n * The glossary: every definition fact (optionally one agreement's), alphabetical by term, as a\n * three-column table — Term, Definition, Source — printed as a Word document or as Markdown with\n * the same WordprocessingML the tag tables export with (`ooxml.ts`).\n */\n\nimport {\n cell,\n docxPackage,\n documentXml,\n minuteUtc,\n page,\n paragraph,\n TABLE_DOCUMENT_STYLES,\n} from './ooxml'\nimport { compareDefinitions, groupDefinitions, type DefinitionSource } from './definitions'\n\n/** One glossary row. */\nexport interface GlossaryEntry {\n /** Empty for a definition whose text names no term (listed last, as written). */\n term: string\n definition: string\n source: string\n factId: string\n}\n\nexport interface GlossaryLabels {\n term: string\n definition: string\n source: string\n /** `{at}` is when it was printed, `YYYY-MM-DD HH:MM UTC`. */\n takenAt: string\n empty: string\n}\n\nexport const DEFAULT_GLOSSARY_LABELS: GlossaryLabels = {\n term: 'Term',\n definition: 'Definition',\n source: 'Source',\n takenAt: 'Printed {at}',\n empty: 'No definitions.',\n}\n\nexport interface GlossaryOptions {\n title: string\n /** When it was printed (ISO); default now. */\n at?: string\n labels?: Partial<GlossaryLabels>\n}\n\n/** What follows the term, a leading colon or dash dropped: `means the issued shares.` */\nconst body = (rest: string) => rest.replace(/^\\s*[:—–-]\\s*/, '').trim()\n\n/**\n * The glossary's rows: every definition, alphabetical by term and, within a term, the preferred one\n * first. Definitions whose text names no term follow, as written. `labelId` keeps one label's.\n */\nexport function glossaryEntries(\n sources: readonly DefinitionSource[],\n options: { labelId?: string | null } = {}\n): GlossaryEntry[] {\n const { groups, unparsed } = groupDefinitions(sources, options)\n return [\n ...groups.flatMap((g) =>\n g.definitions.map((d) => ({\n term: d.term,\n definition: body(d.rest),\n source: d.source ?? '',\n factId: d.id,\n }))\n ),\n ...[...unparsed].sort(compareDefinitions).map((d) => ({\n term: '',\n definition: d.text.trim(),\n source: d.source ?? '',\n factId: d.id,\n })),\n ]\n}\n\nconst escapeCell = (text: string) => text.replace(/\\|/g, '\\\\|').replace(/\\n+/g, ' ')\n\n/** The glossary as a Markdown document: a heading, when it was printed, and one table. */\nexport function glossaryMarkdown(\n entries: readonly GlossaryEntry[],\n options: GlossaryOptions\n): string {\n const l = { ...DEFAULT_GLOSSARY_LABELS, ...options.labels }\n const at = minuteUtc(options.at ?? new Date().toISOString())\n const lines = [\n `# ${options.title}`,\n '',\n `_${l.takenAt.replace('{at}', `${at} UTC`)}_`,\n '',\n `| ${l.term} | ${l.definition} | ${l.source} |`,\n '| --- | --- | --- |',\n ...entries.map(\n (e) =>\n `| ${e.term ? `**${escapeCell(e.term)}**` : ''} | ${escapeCell(e.definition)} | ${escapeCell(e.source)} |`\n ),\n ]\n if (!entries.length) lines.push('', l.empty)\n return `${lines.join('\\n')}\\n`\n}\n\n/** `word/document.xml` of the glossary (exposed for tests). */\nexport function glossaryDocumentXml(\n entries: readonly GlossaryEntry[],\n options: GlossaryOptions\n): string {\n const l = { ...DEFAULT_GLOSSARY_LABELS, ...options.labels }\n const { textWidth, sectPr } = page(false)\n const widths = [2, 6, 2].map((w) => Math.floor((textWidth * w) / 10))\n const at = minuteUtc(options.at ?? new Date().toISOString())\n const text = (t: string, bold = false) => [paragraph([{ text: t, bold }], 'TagTableCell')]\n const header = `<w:tr><w:trPr><w:tblHeader/><w:cantSplit/></w:trPr>${[\n l.term,\n l.definition,\n l.source,\n ]\n .map((h, i) => cell(text(h, true), widths[i], 'E7E6E6'))\n .join('')}</w:tr>`\n const rows = entries.map(\n (e) =>\n `<w:tr><w:trPr><w:cantSplit/></w:trPr>${cell(e.term ? text(e.term, true) : [], widths[0])}${cell(\n text(e.definition),\n widths[1]\n )}${cell(e.source ? text(e.source) : [], widths[2])}</w:tr>`\n )\n const table = `<w:tbl><w:tblPr><w:tblStyle w:val=\"TagTableGrid\"/><w:tblW w:w=\"${textWidth}\" w:type=\"dxa\"/><w:tblLayout w:type=\"fixed\"/><w:tblLook w:val=\"04A0\" w:firstRow=\"1\" w:lastRow=\"0\" w:firstColumn=\"1\" w:lastColumn=\"0\" w:noHBand=\"0\" w:noVBand=\"1\"/></w:tblPr><w:tblGrid>${widths\n .map((w) => `<w:gridCol w:w=\"${w}\"/>`)\n .join('')}</w:tblGrid>${header}${rows.join('')}</w:tbl>`\n return documentXml(\n `${paragraph([{ text: options.title }], 'Title')}${paragraph([\n { text: l.takenAt.replace('{at}', `${at} UTC`), muted: true },\n ])}${table}${entries.length ? '' : paragraph([{ text: l.empty, muted: true }])}<w:p/>${sectPr}`\n )\n}\n\n/** The glossary as `.docx` bytes. */\nexport function glossaryDocx(\n entries: readonly GlossaryEntry[],\n options: GlossaryOptions\n): Uint8Array {\n const at = new Date(options.at ?? Date.now()).toISOString()\n return docxPackage({\n document: glossaryDocumentXml(entries, { ...options, at }),\n styles: TABLE_DOCUMENT_STYLES,\n title: options.title,\n at,\n })\n}\n\n/** A file name for the glossary: `Glossary - SPA.docx`. */\nexport function glossaryFileName(title: string, extension: 'docx' | 'md'): string {\n return `${title.replace(/[\\\\/:*?\"<>|]+/g, ' ').trim() || 'Glossary'}.${extension}`\n}\n","/**\n * The nouns of the Tags page, all from the entity registry (`getEntityLabel`) so a deployment that\n * renames an entity (a document to \"File\", a tag to \"Label\") renames it here too. Read at render\n * time, after any `configureEntityRegistry` override.\n */\nimport type { TagKind } from '@arbidocs/sdk/browser'\nimport { getEntityLabel, tagKindNouns, tagKindTitle } from '@arbidocs/react/ui'\nimport type { TagDetailLabels } from '../TagDetail'\nimport type { TagTableLabels } from '../TagTable'\n\nconst lower = (text: string) => text.toLowerCase()\n\n/** Singular and plural, title-case forms of the page's nouns. */\nexport function tagsPageNouns() {\n return {\n // ANY_TAG, not TAG: TAG is the Files page's \"Field\" (a document column).\n tag: getEntityLabel('ANY_TAG'),\n tags: getEntityLabel('ANY_TAG', 'PLURAL'),\n document: getEntityLabel('DOCUMENT'),\n documents: getEntityLabel('DOCUMENT', 'PLURAL'),\n fact: getEntityLabel('FACT'),\n facts: getEntityLabel('FACT', 'PLURAL'),\n thread: getEntityLabel('CONVERSATION'),\n threads: getEntityLabel('CONVERSATION', 'PLURAL'),\n people: getEntityLabel('PERSON', 'PLURAL'),\n organisations: getEntityLabel('ORGANISATION', 'PLURAL'),\n }\n}\n\n/** \"People and organisations\", as the extraction calls what it finds. */\nexport function entitiesPhrase(): string {\n const n = tagsPageNouns()\n return `${n.people} and ${lower(n.organisations)}`\n}\n\n/** \"3 documents\" / \"1 document\". */\nexport function documentCount(count: number): string {\n const n = tagsPageNouns()\n return `${count} ${lower(count === 1 ? n.document : n.documents)}`\n}\n\n/** What a kind's table calls its rows and the items tagged with each. */\nexport function tagTableLabels(kind: TagKind): Partial<TagTableLabels> {\n const n = tagsPageNouns()\n const k = tagKindNouns(kind)\n return {\n row: tagKindTitle(kind),\n evidence: 'Tagged items',\n documents: `{count} ${lower(n.documents)}`,\n document: `1 ${lower(n.document)}`,\n facts: `{count} ${lower(n.facts)}`,\n fact: `1 ${lower(n.fact)}`,\n threads: `{count} ${lower(n.threads)}`,\n thread: `1 ${lower(n.thread)}`,\n untitledThread: `Untitled ${lower(n.thread)}`,\n empty: `No ${k.plural} yet.`,\n noColumns: 'No fields yet.',\n }\n}\n\n/** The headings and empty states of one tag's detail. */\nexport function tagDetailLabels(): Partial<TagDetailLabels> {\n const n = tagsPageNouns()\n const carries = (noun: string) => `No ${lower(noun)} carries this ${lower(n.tag)} yet.`\n return {\n documents: n.documents,\n facts: n.facts,\n threads: n.threads,\n noDocuments: carries(n.document),\n noFacts: carries(n.fact),\n noThreads: carries(n.thread),\n untitledThread: `Untitled ${lower(n.thread)}`,\n }\n}\n\n/**\n * What a tag's note on a document is called: \"Note\" for every kind that carries one (a label's\n * links carry none). A person's or organisation's role is its own Role field, not the link's.\n */\nexport function tagNoteLabel(kind: TagKind): string | undefined {\n return kind === 'label' || kind === 'search' ? undefined : 'Note'\n}\n\n/** What each kind is for, under its heading on the Tags page. */\nexport function tagKindDescription(kind: TagKind): string {\n const n = tagsPageNouns()\n const k = tagKindNouns(kind)\n const docs = lower(n.documents)\n switch (kind) {\n case 'label':\n return `Short names that file ${docs}, ${lower(n.facts)} and ${lower(n.threads)}.`\n case 'annotation':\n return `A note on each ${lower(n.document)} (text, number, choice or date), filled in by hand or by AI.`\n case 'issue':\n return `Points in dispute, each with the same ${lower(k.singular)} fields.`\n case 'person':\n case 'organisation':\n return `${tagKindTitle(kind, { plural: true })} the ${docs} mention.`\n case 'search':\n return `${tagKindTitle(kind, { plural: true })}.`\n }\n}\n","/**\n * \"Extract from documents\": pick documents (or all of them) and have the AI find the people and\n * organisations they name, each linked to its entity tag. The host runs the extraction\n * (`onExtract`, accepted at once); the dialog closes once it is accepted.\n */\nimport type { components } from '@arbidocs/client'\nimport { useMemo, useState } from 'react'\nimport {\n Button,\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n getDocumentTitle,\n isImageDocument,\n} from '@arbidocs/react/ui'\nimport { DocumentPicker, type PickerGroup } from '../../settings/DocumentPicker'\nimport { ModalHeader } from '../../settings/ModalScaffold'\nimport { documentCount, entitiesPhrase, tagsPageNouns } from './tagsPageLabels'\n\ntype DocResponse = components['schemas']['DocResponse']\n\n/** Most documents one extraction takes (the endpoint's limit). */\nexport const EXTRACT_LIMIT = 500\n\n/** What the dialog reads of a document. */\nexport type ExtractableDocument = Pick<\n DocResponse,\n | 'external_id'\n | 'file_name'\n | 'file_type'\n | 'doc_metadata'\n | 'parent_ext_id'\n | 'n_pages'\n | 'tokens'\n>\n\n/** Extracted child documents (e.g. email attachments) are reached through their parent. */\nconst isTopLevel = (d: ExtractableDocument) => !d.parent_ext_id\n\nexport interface ExtractEntitiesDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The workspace's documents. */\n documents: readonly ExtractableDocument[]\n /** Run the extraction over these documents; the dialog closes when it resolves. */\n onExtract: (docIds: string[]) => Promise<unknown>\n /** Too many documents chosen (more than {@link EXTRACT_LIMIT}). */\n onTooMany: (message: string) => void\n isPending?: boolean\n}\n\nexport function ExtractEntitiesDialog({\n open,\n onOpenChange,\n documents,\n onExtract,\n onTooMany,\n isPending,\n}: ExtractEntitiesDialogProps) {\n const [picked, setPicked] = useState<string[]>([])\n const [all, setAll] = useState(false)\n const topLevel = useMemo(() => documents.filter(isTopLevel), [documents])\n const allIds = topLevel.map((d) => d.external_id)\n const docIds = all ? allIds : picked\n const nouns = tagsPageNouns()\n const entities = entitiesPhrase().toLowerCase()\n const groups = useMemo(\n (): PickerGroup[] => [\n {\n id: 'all',\n heading: 'In this workspace',\n docs: topLevel\n .map((d) => ({\n id: d.external_id,\n title: getDocumentTitle(d, d.file_name ?? undefined),\n fileName: d.file_name,\n pages: isImageDocument(d) ? null : (d.n_pages ?? null),\n tokens: isImageDocument(d) ? null : (d.tokens ?? null),\n }))\n .sort((a, b) => a.title.toLowerCase().localeCompare(b.title.toLowerCase())),\n },\n ],\n [topLevel]\n )\n\n const toggle = (id: string) =>\n setPicked((ids) => (ids.includes(id) ? ids.filter((x) => x !== id) : [...ids, id]))\n\n const close = () => {\n setPicked([])\n setAll(false)\n onOpenChange(false)\n }\n\n const run = async () => {\n if (docIds.length > EXTRACT_LIMIT) {\n onTooMany(`Choose at most ${documentCount(EXTRACT_LIMIT)} at a time.`)\n return\n }\n try {\n await onExtract(docIds)\n close()\n } catch {\n // The host has said why; the dialog stays open to try again.\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={(next) => (next ? onOpenChange(true) : close())}>\n <DialogContent\n presentation=\"sheet\"\n className=\"w-modal max-w-modal-vw max-h-panel flex flex-col overflow-hidden p-0\"\n data-testid=\"extract-entities-dialog\"\n >\n <ModalHeader>\n <DialogTitle>Extract {entities}</DialogTitle>\n <DialogDescription>\n The AI finds the {entities} each {nouns.document.toLowerCase()} names and links them,\n with the passages that name them. {entitiesPhrase()} already here are matched by name.\n </DialogDescription>\n </ModalHeader>\n <div className=\"flex flex-1 min-h-0 flex-col gap-3 overflow-auto p-4\">\n <label className=\"flex items-center gap-2 text-sm\">\n <Checkbox\n checked={all}\n onCheckedChange={(v) => setAll(v === true)}\n data-testid=\"extract-entities-all\"\n />\n All {nouns.documents.toLowerCase()} ({allIds.length})\n </label>\n {!all && (\n <DocumentPicker\n groups={groups}\n value=\"\"\n onValueChange={toggle}\n selectedIds={picked}\n labels={{ placeholder: `Search ${nouns.documents.toLowerCase()}…` }}\n />\n )}\n </div>\n <div className=\"flex items-center justify-end gap-2 border-t border-border px-4 py-3\">\n <Button variant=\"ghost\" onClick={close}>\n Cancel\n </Button>\n <Button\n onClick={() => void run()}\n disabled={docIds.length === 0 || isPending}\n data-testid=\"extract-entities-run\"\n >\n {docIds.length > 0 ? `Extract from ${documentCount(docIds.length)}` : 'Extract'}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n"]}
|