@arbidocs/blocks 0.5.37 → 0.5.38

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.
Files changed (153) hide show
  1. package/dist/{ConnectedCallDock-2NYM46HU.js → ConnectedCallDock-CT3D6LLI.js} +8 -8
  2. package/dist/{ConnectedCallDock-2NYM46HU.js.map → ConnectedCallDock-CT3D6LLI.js.map} +1 -1
  3. package/dist/{ConnectedCallDock-2LMIR4ID.cjs → ConnectedCallDock-V7DPSE6X.cjs} +17 -17
  4. package/dist/{ConnectedCallDock-2LMIR4ID.cjs.map → ConnectedCallDock-V7DPSE6X.cjs.map} +1 -1
  5. package/dist/{ConnectedCallRoom-QJ2UV6GV.js → ConnectedCallRoom-A27AM7IQ.js} +8 -8
  6. package/dist/{ConnectedCallRoom-QJ2UV6GV.js.map → ConnectedCallRoom-A27AM7IQ.js.map} +1 -1
  7. package/dist/{ConnectedCallRoom-26PBMTCC.cjs → ConnectedCallRoom-TNOCSTX2.cjs} +9 -9
  8. package/dist/{ConnectedCallRoom-26PBMTCC.cjs.map → ConnectedCallRoom-TNOCSTX2.cjs.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-5MN7PVRE.cjs → ConnectedNativeDocxComparison-H2OZMWHT.cjs} +13 -13
  10. package/dist/{ConnectedNativeDocxComparison-5MN7PVRE.cjs.map → ConnectedNativeDocxComparison-H2OZMWHT.cjs.map} +1 -1
  11. package/dist/{ConnectedNativeDocxComparison-GHOEFJUN.js → ConnectedNativeDocxComparison-RWKFPJPJ.js} +12 -12
  12. package/dist/{ConnectedNativeDocxComparison-GHOEFJUN.js.map → ConnectedNativeDocxComparison-RWKFPJPJ.js.map} +1 -1
  13. package/dist/{ConnectedNativeDocxEditor-HWPSWU2A.js → ConnectedNativeDocxEditor-43BI5LN6.js} +11 -11
  14. package/dist/{ConnectedNativeDocxEditor-HWPSWU2A.js.map → ConnectedNativeDocxEditor-43BI5LN6.js.map} +1 -1
  15. package/dist/{ConnectedNativeDocxEditor-VA7476NF.cjs → ConnectedNativeDocxEditor-6DQEM6SD.cjs} +13 -13
  16. package/dist/{ConnectedNativeDocxEditor-VA7476NF.cjs.map → ConnectedNativeDocxEditor-6DQEM6SD.cjs.map} +1 -1
  17. package/dist/{ConnectedStreamedWordArtifact-UMSTUZBY.cjs → ConnectedStreamedWordArtifact-3VKYIG6C.cjs} +13 -13
  18. package/dist/ConnectedStreamedWordArtifact-3VKYIG6C.cjs.map +1 -0
  19. package/dist/{ConnectedStreamedWordArtifact-KZUZB47X.js → ConnectedStreamedWordArtifact-TEB332E3.js} +12 -12
  20. package/dist/ConnectedStreamedWordArtifact-TEB332E3.js.map +1 -0
  21. package/dist/{WorkspaceTableView-DYXHUIRA.cjs → WorkspaceTableView-KG546U7M.cjs} +9 -9
  22. package/dist/{WorkspaceTableView-DYXHUIRA.cjs.map → WorkspaceTableView-KG546U7M.cjs.map} +1 -1
  23. package/dist/{WorkspaceTableView-HXSBJY42.js → WorkspaceTableView-OSFIWJ5C.js} +7 -7
  24. package/dist/{WorkspaceTableView-HXSBJY42.js.map → WorkspaceTableView-OSFIWJ5C.js.map} +1 -1
  25. package/dist/agents/index.cjs +401 -401
  26. package/dist/agents/index.js +10 -10
  27. package/dist/calls/index.cjs +131 -131
  28. package/dist/calls/index.js +9 -9
  29. package/dist/chat/index.cjs +81 -81
  30. package/dist/chat/index.js +3 -3
  31. package/dist/{chunk-3ON5DJLR.js → chunk-24H5WTGM.js} +4 -4
  32. package/dist/{chunk-3ON5DJLR.js.map → chunk-24H5WTGM.js.map} +1 -1
  33. package/dist/{chunk-EHRT5M5F.js → chunk-2C3I27VI.js} +3 -3
  34. package/dist/{chunk-EHRT5M5F.js.map → chunk-2C3I27VI.js.map} +1 -1
  35. package/dist/{chunk-UKG4DDLI.cjs → chunk-2QDNQM63.cjs} +10 -10
  36. package/dist/{chunk-UKG4DDLI.cjs.map → chunk-2QDNQM63.cjs.map} +1 -1
  37. package/dist/{chunk-EZJOJFY2.cjs → chunk-3ZLNI7ZA.cjs} +3 -3
  38. package/dist/{chunk-EZJOJFY2.cjs.map → chunk-3ZLNI7ZA.cjs.map} +1 -1
  39. package/dist/{chunk-JYASRZUQ.js → chunk-4DKI37QQ.js} +7 -7
  40. package/dist/{chunk-JYASRZUQ.js.map → chunk-4DKI37QQ.js.map} +1 -1
  41. package/dist/{chunk-OXIGJYMO.cjs → chunk-5NTSJV5H.cjs} +3 -3
  42. package/dist/{chunk-OXIGJYMO.cjs.map → chunk-5NTSJV5H.cjs.map} +1 -1
  43. package/dist/{chunk-7P2IL7RX.cjs → chunk-6EQSP77K.cjs} +5 -5
  44. package/dist/{chunk-7P2IL7RX.cjs.map → chunk-6EQSP77K.cjs.map} +1 -1
  45. package/dist/{chunk-T7O73MX2.js → chunk-7CHI36EP.js} +5 -5
  46. package/dist/{chunk-T7O73MX2.js.map → chunk-7CHI36EP.js.map} +1 -1
  47. package/dist/{chunk-CXY2ELL5.js → chunk-AL7EXOX5.js} +3 -3
  48. package/dist/{chunk-CXY2ELL5.js.map → chunk-AL7EXOX5.js.map} +1 -1
  49. package/dist/{chunk-YRWMYVHU.cjs → chunk-BIWPXSGS.cjs} +20 -20
  50. package/dist/{chunk-YRWMYVHU.cjs.map → chunk-BIWPXSGS.cjs.map} +1 -1
  51. package/dist/{chunk-ZZ76AUGX.cjs → chunk-BRYRZOS3.cjs} +4 -4
  52. package/dist/{chunk-ZZ76AUGX.cjs.map → chunk-BRYRZOS3.cjs.map} +1 -1
  53. package/dist/{chunk-ABKRLMWN.cjs → chunk-EFSL4O3B.cjs} +5 -5
  54. package/dist/{chunk-ABKRLMWN.cjs.map → chunk-EFSL4O3B.cjs.map} +1 -1
  55. package/dist/{chunk-32ZIHUXE.cjs → chunk-EGSSLWNZ.cjs} +3 -3
  56. package/dist/{chunk-32ZIHUXE.cjs.map → chunk-EGSSLWNZ.cjs.map} +1 -1
  57. package/dist/{chunk-ZXU2TKUV.js → chunk-EZSYYENN.js} +6 -6
  58. package/dist/{chunk-ZXU2TKUV.js.map → chunk-EZSYYENN.js.map} +1 -1
  59. package/dist/{chunk-LPGFODB4.cjs → chunk-FEVJA4BP.cjs} +3 -3
  60. package/dist/{chunk-LPGFODB4.cjs.map → chunk-FEVJA4BP.cjs.map} +1 -1
  61. package/dist/{chunk-IC2BXIUT.js → chunk-FHB4G77H.js} +3 -3
  62. package/dist/{chunk-IC2BXIUT.js.map → chunk-FHB4G77H.js.map} +1 -1
  63. package/dist/{chunk-UCCYCT3R.cjs → chunk-FY4C7HU5.cjs} +16 -16
  64. package/dist/{chunk-UCCYCT3R.cjs.map → chunk-FY4C7HU5.cjs.map} +1 -1
  65. package/dist/{chunk-RVCQE66I.cjs → chunk-H5BFOVVL.cjs} +5 -5
  66. package/dist/{chunk-RVCQE66I.cjs.map → chunk-H5BFOVVL.cjs.map} +1 -1
  67. package/dist/{chunk-WDMWWBPB.cjs → chunk-H6K7EWL2.cjs} +7 -7
  68. package/dist/{chunk-WDMWWBPB.cjs.map → chunk-H6K7EWL2.cjs.map} +1 -1
  69. package/dist/{chunk-NNUNS47F.js → chunk-ICCBNHPU.js} +3 -3
  70. package/dist/{chunk-NNUNS47F.js.map → chunk-ICCBNHPU.js.map} +1 -1
  71. package/dist/{chunk-U7IEC2EM.cjs → chunk-JKMV4QNV.cjs} +74 -74
  72. package/dist/{chunk-U7IEC2EM.cjs.map → chunk-JKMV4QNV.cjs.map} +1 -1
  73. package/dist/{chunk-GMECFWVT.js → chunk-K6W2GWCN.js} +3 -3
  74. package/dist/{chunk-GMECFWVT.js.map → chunk-K6W2GWCN.js.map} +1 -1
  75. package/dist/{chunk-7W7TPWSZ.cjs → chunk-LNYEYR7W.cjs} +3 -3
  76. package/dist/{chunk-7W7TPWSZ.cjs.map → chunk-LNYEYR7W.cjs.map} +1 -1
  77. package/dist/{chunk-VWX5UECZ.js → chunk-MLHOG7YH.js} +3 -3
  78. package/dist/{chunk-VWX5UECZ.js.map → chunk-MLHOG7YH.js.map} +1 -1
  79. package/dist/{chunk-L7IBURSP.js → chunk-N3HVTMQK.js} +3 -3
  80. package/dist/{chunk-L7IBURSP.js.map → chunk-N3HVTMQK.js.map} +1 -1
  81. package/dist/{chunk-OJTXFIXU.cjs → chunk-NOKTUWTN.cjs} +4 -4
  82. package/dist/{chunk-OJTXFIXU.cjs.map → chunk-NOKTUWTN.cjs.map} +1 -1
  83. package/dist/{chunk-2VEBUYEJ.js → chunk-NUV5F6MM.js} +3 -3
  84. package/dist/{chunk-2VEBUYEJ.js.map → chunk-NUV5F6MM.js.map} +1 -1
  85. package/dist/{chunk-MJYGHJ4Y.js → chunk-P6MVDOCL.js} +3 -3
  86. package/dist/{chunk-MJYGHJ4Y.js.map → chunk-P6MVDOCL.js.map} +1 -1
  87. package/dist/{chunk-GI5ITZ53.js → chunk-PRY52BW5.js} +4 -4
  88. package/dist/{chunk-GI5ITZ53.js.map → chunk-PRY52BW5.js.map} +1 -1
  89. package/dist/chunk-PTYERKEU.js +2132 -0
  90. package/dist/chunk-PTYERKEU.js.map +1 -0
  91. package/dist/{chunk-IYW6Q33D.cjs → chunk-PUX4M22Q.cjs} +50 -50
  92. package/dist/{chunk-IYW6Q33D.cjs.map → chunk-PUX4M22Q.cjs.map} +1 -1
  93. package/dist/{chunk-ORBXJ4IT.js → chunk-QFYRXQTD.js} +3 -3
  94. package/dist/{chunk-ORBXJ4IT.js.map → chunk-QFYRXQTD.js.map} +1 -1
  95. package/dist/{chunk-UHYO2E25.js → chunk-RH4XIABH.js} +3 -3
  96. package/dist/{chunk-UHYO2E25.js.map → chunk-RH4XIABH.js.map} +1 -1
  97. package/dist/{chunk-GMZ2XFQQ.js → chunk-S3YRRD54.js} +3 -3
  98. package/dist/{chunk-GMZ2XFQQ.js.map → chunk-S3YRRD54.js.map} +1 -1
  99. package/dist/chunk-TQSU3I4C.cjs +2180 -0
  100. package/dist/chunk-TQSU3I4C.cjs.map +1 -0
  101. package/dist/{chunk-LXF22VRI.js → chunk-VKY4SQMH.js} +4 -4
  102. package/dist/{chunk-LXF22VRI.js.map → chunk-VKY4SQMH.js.map} +1 -1
  103. package/dist/{chunk-H3JKC55K.cjs → chunk-VMLEISRZ.cjs} +9 -9
  104. package/dist/{chunk-H3JKC55K.cjs.map → chunk-VMLEISRZ.cjs.map} +1 -1
  105. package/dist/{chunk-VP5TGUBY.js → chunk-VPWCARVO.js} +5 -5
  106. package/dist/{chunk-VP5TGUBY.js.map → chunk-VPWCARVO.js.map} +1 -1
  107. package/dist/{chunk-N2SUDWY2.cjs → chunk-WALADS2S.cjs} +3 -3
  108. package/dist/{chunk-N2SUDWY2.cjs.map → chunk-WALADS2S.cjs.map} +1 -1
  109. package/dist/{chunk-ME3R44JN.cjs → chunk-XFSEPGF7.cjs} +4 -4
  110. package/dist/{chunk-ME3R44JN.cjs.map → chunk-XFSEPGF7.cjs.map} +1 -1
  111. package/dist/{chunk-K7OF4KGP.cjs → chunk-YDY4GIC2.cjs} +5 -5
  112. package/dist/{chunk-K7OF4KGP.cjs.map → chunk-YDY4GIC2.cjs.map} +1 -1
  113. package/dist/{chunk-APPHGHMM.js → chunk-YPR4FSDJ.js} +3 -3
  114. package/dist/{chunk-APPHGHMM.js.map → chunk-YPR4FSDJ.js.map} +1 -1
  115. package/dist/collaboration/index.cjs +1 -1
  116. package/dist/collaboration/index.js +1 -1
  117. package/dist/connect/docx.cjs +15 -15
  118. package/dist/connect/docx.js +11 -11
  119. package/dist/connect/index.cjs +1433 -928
  120. package/dist/connect/index.cjs.map +1 -1
  121. package/dist/connect/index.d.ts +1 -0
  122. package/dist/connect/index.js +563 -59
  123. package/dist/connect/index.js.map +1 -1
  124. package/dist/connect/viewer.cjs +63 -63
  125. package/dist/connect/viewer.js +16 -16
  126. package/dist/connection/databases/ConnectedDatabasesPage.d.ts +1 -0
  127. package/dist/connection/databases/DatabaseViewsMenu.d.ts +10 -0
  128. package/dist/connection/databases/index.d.ts +1 -0
  129. package/dist/connection/databases/useDatabaseCellSources.d.ts +6 -0
  130. package/dist/databases/index.cjs +193 -2173
  131. package/dist/databases/index.cjs.map +1 -1
  132. package/dist/databases/index.js +4 -2129
  133. package/dist/databases/index.js.map +1 -1
  134. package/dist/facts/index.cjs +2 -2
  135. package/dist/facts/index.js +2 -2
  136. package/dist/files/index.cjs +223 -223
  137. package/dist/files/index.js +3 -3
  138. package/dist/home/index.cjs +29 -29
  139. package/dist/home/index.js +4 -4
  140. package/dist/index.cjs +1656 -1656
  141. package/dist/index.js +22 -22
  142. package/dist/settings/index.cjs +156 -156
  143. package/dist/settings/index.js +3 -3
  144. package/dist/shell/index.cjs +72 -72
  145. package/dist/shell/index.js +4 -4
  146. package/dist/studio/index.cjs +8 -8
  147. package/dist/studio/index.js +7 -7
  148. package/dist/workflow-canvas/index.cjs +23 -23
  149. package/dist/workflow-canvas/index.js +10 -10
  150. package/node_modules/@arbidocs/coedit/package.json +1 -1
  151. package/package.json +5 -5
  152. package/dist/ConnectedStreamedWordArtifact-KZUZB47X.js.map +0 -1
  153. package/dist/ConnectedStreamedWordArtifact-UMSTUZBY.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/databases/column-types.ts","../src/databases/linkCells.tsx","../src/databases/PickCellEditor.tsx","../src/databases/SelectChip.tsx","../src/databases/SelectCellEditor.tsx","../src/databases/databaseColumns.tsx","../src/databases/ColumnConfigFields.tsx","../src/databases/DatabaseRowDetail.tsx","../src/databases/DatabaseTable.tsx","../src/databases/DatabaseToolbar.tsx","../src/databases/DatabaseColumnDialog.tsx","../src/databases/DatabaseList.tsx","../src/databases/NewDatabaseDialog.tsx"],"names":["jsxs","jsx","cn","useState","useRef","useEffect","Check","FileText","ArrowUpRight","Search","target","Fragment","Input","useMemo","Button","Plus","Trash2","MoreHorizontal","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","X","SPREADSHEET_ACCEPT","FileSpreadsheet","Eye","Upload","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter"],"mappings":"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","file":"chunk-PTYERKEU.js","sourcesContent":["/**\n * Databases: the shapes the blocks read, and the per-type rules for showing and editing a cell.\n *\n * A database is a user-defined table (a client database, billing records). Its columns are typed:\n * `text`, `number`, `date`, `checkbox` and `select` hold a value; `person` holds a workspace member's\n * id (`usr-…`); `document` and `relation` hold lists of ids (documents of the workspace, rows of the\n * target database); `lookup` (the values of a column of the related rows) and `rollup` (a number\n * measured over them) are computed by the server and never written. The server checks and\n * normalises every cell (dates arrive as ISO `YYYY-MM-DD` or a full timestamp, numbers as numbers, a\n * select as one of its options) and names every id a row refers to in the row's `titles`, so the\n * blocks only format for display and turn an editor's value into what the API takes.\n */\n\nexport type DatabaseColumnType =\n | 'text'\n | 'number'\n | 'date'\n | 'checkbox'\n | 'select'\n | 'person'\n | 'document'\n | 'relation'\n | 'lookup'\n | 'rollup'\n\n/** Every type, in the order a type picker lists them. */\nexport const DATABASE_COLUMN_TYPES: DatabaseColumnType[] = [\n 'text',\n 'number',\n 'date',\n 'checkbox',\n 'select',\n 'person',\n 'document',\n 'relation',\n 'lookup',\n 'rollup',\n]\n\n/** Types whose cells the server computes from a relation: shown, never edited. */\nexport const COMPUTED_COLUMN_TYPES: ReadonlySet<DatabaseColumnType> = new Set<DatabaseColumnType>([\n 'lookup',\n 'rollup',\n])\n\n/** Types whose cells are lists of ids (written as a list that replaces the cell's links). */\nexport const LINK_COLUMN_TYPES: ReadonlySet<DatabaseColumnType> = new Set<DatabaseColumnType>([\n 'document',\n 'relation',\n])\n\nexport const isComputedColumn = (column: Pick<DatabaseColumnView, 'type'>): boolean =>\n COMPUTED_COLUMN_TYPES.has(column.type)\n\nexport type DatabaseRollupOp = 'count' | 'sum' | 'avg' | 'min' | 'max'\n\nexport const DATABASE_ROLLUP_OPS: DatabaseRollupOp[] = ['count', 'sum', 'avg', 'min', 'max']\n\n/**\n * A relation column's target. A `two_way` column has a paired column on the target database\n * (`pair_column_id`) showing the same links from the other side; `reverse` marks the paired side.\n */\nexport interface DatabaseRelationView {\n database_id: string\n two_way?: boolean\n pair_column_id?: string | null\n reverse?: boolean\n}\n\n/** A lookup: `column` of the target database, read through this database's `relation` column. */\nexport interface DatabaseLookupView {\n relation: string\n column: string\n}\n\n/** A rollup: `op` over the rows linked through `relation` (`column`: a number column, not for count). */\nexport interface DatabaseRollupView {\n relation: string\n column?: string | null\n op?: DatabaseRollupOp\n}\n\n/** A column as the blocks read it (the API's `DatabaseColumn`). */\nexport interface DatabaseColumnView {\n id: string\n name: string\n type: DatabaseColumnType\n options?: string[] | null\n relation?: DatabaseRelationView | null\n lookup?: DatabaseLookupView | null\n rollup?: DatabaseRollupView | null\n}\n\n/**\n * A row as the blocks read it: cell values keyed by column id; an empty cell is absent. `titles`\n * names every person, document and related row the cells refer to (id → display name).\n */\nexport interface DatabaseRowView {\n id: string\n values: Record<string, unknown>\n titles?: Record<string, string>\n}\n\n/** A database as a list shows it (the API's `DatabaseRead`). */\nexport interface DatabaseSummaryView {\n id: string\n name: string\n description?: string | null\n columns: DatabaseColumnView[]\n row_count: number\n /** False for a database of another (public) workspace: read here, edited in its own workspace. */\n editable: boolean\n updated_at?: string | null\n}\n\nexport interface DatabaseColumnTypeLabels {\n text: string\n number: string\n date: string\n checkbox: string\n select: string\n person: string\n document: string\n relation: string\n lookup: string\n rollup: string\n}\n\nexport const DEFAULT_DATABASE_COLUMN_TYPE_LABELS: DatabaseColumnTypeLabels = {\n text: 'Text',\n number: 'Number',\n date: 'Date',\n checkbox: 'Checkbox',\n select: 'Select',\n person: 'Person',\n document: 'Documents',\n relation: 'Relation',\n lookup: 'Lookup',\n rollup: 'Rollup',\n}\n\n/**\n * Chip colours for select options: a stable colour per option text, so a value keeps its colour.\n * Theme tone pairs (tokens.css), so light and dark follow the host.\n */\nconst OPTION_TONES = [\n 'bg-blue-bg text-blue-text',\n 'bg-green-bg text-green-text',\n 'bg-yellow-bg text-yellow-text',\n 'bg-purple-bg text-purple-text',\n 'bg-red-bg text-red-text',\n 'bg-gray-bg text-gray-text',\n]\n\nexport function optionTone(option: string): string {\n let hash = 0\n for (const ch of option.toLowerCase()) hash = (hash * 31 + ch.charCodeAt(0)) >>> 0\n return OPTION_TONES[hash % OPTION_TONES.length]\n}\n\nconst isEmpty = (value: unknown): boolean =>\n value === null ||\n value === undefined ||\n (typeof value === 'string' && value.trim() === '') ||\n (Array.isArray(value) && value.length === 0)\n\n/** A cell as a list: a list cell as is, a single value as a list of one, an empty cell as none. */\nexport function cellList(value: unknown): unknown[] {\n if (isEmpty(value)) return []\n return Array.isArray(value) ? value.filter((v) => !isEmpty(v)) : [value]\n}\n\n/** The ids a person, document or relation cell holds. */\nexport function cellIds(value: unknown): string[] {\n return cellList(value).filter((v): v is string => typeof v === 'string')\n}\n\n/** An id's display name from the row's titles (the id itself when the server could not name it). */\nexport function titleOf(id: string, titles?: Record<string, string>): string {\n return titles?.[id] ?? id\n}\n\n/** Two cell values, as the API stores them, are the same (lists compare item by item). */\nexport function sameCellValue(a: unknown, b: unknown): boolean {\n if (Array.isArray(a) || Array.isArray(b)) {\n const la = cellList(a)\n const lb = cellList(b)\n return la.length === lb.length && la.every((v, i) => v === lb[i])\n }\n return (a ?? null) === (b ?? null)\n}\n\n/**\n * A stored date for display. A bare `YYYY-MM-DD` is a calendar day: it is shown from its own\n * components, never through a time zone (which would move it a day for viewers west of UTC).\n */\nexport function formatDateValue(value: string, locale?: string): string {\n const day = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value)\n if (day) {\n const [, y, m, d] = day\n return new Date(Date.UTC(+y, +m - 1, +d)).toLocaleDateString(locale, { timeZone: 'UTC' })\n }\n const at = new Date(value)\n return Number.isNaN(at.getTime()) ? value : at.toLocaleString(locale)\n}\n\nexport function formatNumberValue(value: number, locale?: string): string {\n return value.toLocaleString(locale, { maximumFractionDigits: 6 })\n}\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$/\n\n/**\n * One value of a lookup cell, whose type is the looked-up column's: an id reads as its title, a\n * number and an ISO date as their own column would show them.\n */\nexport function formatLookupValue(\n value: unknown,\n titles?: Record<string, string>,\n locale?: string\n): string {\n if (isEmpty(value)) return ''\n if (typeof value === 'number') return formatNumberValue(value, locale)\n if (typeof value === 'boolean') return value ? 'Yes' : 'No'\n if (typeof value === 'string') {\n if (titles?.[value] !== undefined) return titles[value]\n if (ISO_DATE.test(value)) return formatDateValue(value, locale)\n }\n return String(value)\n}\n\nconst NAMED_TYPES: ReadonlySet<DatabaseColumnType> = new Set<DatabaseColumnType>([\n 'person',\n 'document',\n 'relation',\n])\n\n/**\n * A cell as text: what a cell shows, what search and copy see. Checkboxes read as Yes/No; people,\n * documents and related rows by their titles (the row's `titles`), lists joined with commas.\n */\nexport function formatCell(\n value: unknown,\n type: DatabaseColumnType,\n locale?: string,\n titles?: Record<string, string>\n): string {\n if (isEmpty(value)) return ''\n if ((type === 'number' || type === 'rollup') && typeof value === 'number')\n return formatNumberValue(value, locale)\n if (type === 'date' && typeof value === 'string') return formatDateValue(value, locale)\n if (type === 'checkbox') return value ? 'Yes' : 'No'\n if (NAMED_TYPES.has(type))\n return cellIds(value)\n .map((id) => titleOf(id, titles))\n .join(', ')\n if (type === 'lookup')\n return cellList(value)\n .map((v) => formatLookupValue(v, titles, locale))\n .join(', ')\n return String(value)\n}\n\n/**\n * An editor's value as the API takes it. Empty becomes `null` (which empties the cell); everything\n * else goes as typed and the server checks it, so a bad value comes back as a 422 naming the column.\n * A document or relation cell goes as its list of ids (which replaces the cell's links).\n */\nexport function toApiValue(value: unknown, type: DatabaseColumnType): unknown {\n if (isEmpty(value)) return null\n if (LINK_COLUMN_TYPES.has(type)) return cellIds(value)\n if (type === 'checkbox') return Boolean(value)\n if (type === 'date' && value instanceof Date) {\n const pad = (n: number) => String(n).padStart(2, '0')\n return `${value.getFullYear()}-${pad(value.getMonth() + 1)}-${pad(value.getDate())}`\n }\n if (type === 'number' && typeof value === 'string') {\n const n = Number(value.replace(/,/g, ''))\n return Number.isFinite(n) ? n : value\n }\n return value\n}\n\n/**\n * Sort comparator for a column's stored values: empty cells last, then by type. People, documents,\n * related rows and lookups sort by what they show, so pass each row's titles.\n */\nexport function compareCells(\n a: unknown,\n b: unknown,\n type: DatabaseColumnType,\n titlesA?: Record<string, string>,\n titlesB?: Record<string, string>\n): number {\n const ea = isEmpty(a)\n const eb = isEmpty(b)\n if (ea || eb) return ea === eb ? 0 : ea ? 1 : -1\n if (type === 'number' || type === 'checkbox' || type === 'rollup') return Number(a) - Number(b)\n const shown = NAMED_TYPES.has(type) || type === 'lookup'\n const ta = shown ? formatCell(a, type, undefined, titlesA) : String(a)\n const tb = shown ? formatCell(b, type, undefined, titlesB) : String(b)\n return ta.localeCompare(tb, undefined, { sensitivity: 'base', numeric: true })\n}\n\n/**\n * A row's title: its first column as text (what a relation picker and a row's detail call it), or\n * `''` when that cell is empty.\n */\nexport function rowTitle(\n row: Pick<DatabaseRowView, 'values' | 'titles'>,\n columns: DatabaseColumnView[],\n locale?: string\n): string {\n const first = columns[0]\n return first ? formatCell(row.values[first.id], first.type, locale, row.titles) : ''\n}\n","/**\n * Cells that refer to other things: a person (a workspace member), documents of the workspace, rows\n * of a related database, and the computed lookup and rollup cells read through a relation.\n *\n * The row's `titles` names every id its cells hold, so a cell shows names without another call. A\n * document chip opens the document (the host's `onOpenDocument`).\n */\nimport type { MouseEvent, ReactNode } from 'react'\nimport { ArrowUpRight, FileText } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { cellIds, cellList, formatLookupValue, titleOf } from './column-types'\n\n/** Something a person, document or relation cell can hold, as a picker lists it. */\nexport interface DatabasePickOption {\n id: string\n label: string\n /** A second, quieter line (an email, a file's folder). */\n description?: string\n}\n\n/**\n * Where the pickers of person, document and relation cells get their choices, and what a document\n * chip does. The host owns the data; without a source the cell still shows, but does not edit.\n */\nexport interface DatabaseCellSources {\n /** The workspace's members (person cells). */\n members?: DatabasePickOption[]\n /** The workspace's documents (document cells). */\n documents?: DatabasePickOption[]\n /** Rows of `databaseId` matching `q` (relation cells; an empty `q` lists the first rows). */\n searchRows?: (databaseId: string, q: string) => Promise<DatabasePickOption[]>\n /** Open a document (a click on a document chip). */\n onOpenDocument?: (documentId: string) => void\n}\n\nconst CHIP =\n 'inline-flex h-[22px] min-w-0 max-w-[14rem] shrink-0 items-center gap-1 rounded-md border border-border bg-muted/50 px-1.5 text-xs text-foreground'\n\nfunction initials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n const letters = parts.length > 1 ? parts[0][0] + parts[parts.length - 1][0] : name.slice(0, 2)\n return letters.toUpperCase()\n}\n\n/** A member's avatar initials and name. */\nexport function PersonChip({ name }: { name: string }) {\n return (\n <span className=\"inline-flex min-w-0 items-center gap-1.5 text-sm\">\n <span\n aria-hidden\n className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-muted text-[10px] font-medium text-muted-foreground\"\n >\n {initials(name)}\n </span>\n <span className=\"truncate\">{name}</span>\n </span>\n )\n}\n\n/** A document or related row as a chip; a document chip opens the document when clicked. */\nexport function LinkChip({\n label,\n kind,\n onOpen,\n testId,\n}: {\n label: string\n kind: 'document' | 'relation'\n onOpen?: () => void\n testId?: string\n}) {\n const Icon = kind === 'document' ? FileText : ArrowUpRight\n const body = (\n <>\n <Icon className=\"size-3 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n </>\n )\n if (!onOpen) {\n return (\n <span className={CHIP} title={label} data-testid={testId}>\n {body}\n </span>\n )\n }\n // The grid edits on double-click: a click on the chip opens the document and nothing else.\n const stop = (e: MouseEvent) => e.stopPropagation()\n return (\n <button\n type=\"button\"\n title={label}\n data-testid={testId}\n onClick={(e) => {\n e.stopPropagation()\n onOpen()\n }}\n onDoubleClick={stop}\n onMouseDown={stop}\n className={cn(CHIP, 'hover:bg-muted hover:underline')}\n >\n {body}\n </button>\n )\n}\n\n/** Chips on one line (a grid cell), or wrapping onto more (`wrap`: a row's detail). */\nfunction ChipRow({ children, wrap }: { children: ReactNode; wrap?: boolean }) {\n return (\n <span\n className={cn(\n 'flex min-w-0 items-center gap-1',\n wrap ? 'flex-wrap py-0.5' : 'h-full overflow-hidden'\n )}\n >\n {children}\n </span>\n )\n}\n\nexport function PersonCell({ value, titles }: { value: unknown; titles?: Record<string, string> }) {\n const [id] = cellIds(value)\n return id ? <PersonChip name={titleOf(id, titles)} /> : null\n}\n\nexport function LinkChipsCell({\n value,\n titles,\n kind,\n onOpenDocument,\n wrap,\n}: {\n value: unknown\n titles?: Record<string, string>\n kind: 'document' | 'relation'\n onOpenDocument?: (id: string) => void\n wrap?: boolean\n}) {\n const ids = cellIds(value)\n if (ids.length === 0) return null\n return (\n <ChipRow wrap={wrap}>\n {ids.map((id) => (\n <LinkChip\n key={id}\n label={titleOf(id, titles)}\n kind={kind}\n testId={`database-chip-${id}`}\n onOpen={kind === 'document' && onOpenDocument ? () => onOpenDocument(id) : undefined}\n />\n ))}\n </ChipRow>\n )\n}\n\n/** A lookup's values: related rows and documents as chips, anything else as quiet tags. */\nexport function LookupCell({\n value,\n titles,\n locale,\n wrap,\n}: {\n value: unknown\n titles?: Record<string, string>\n locale?: string\n wrap?: boolean\n}) {\n const values = cellList(value)\n if (values.length === 0) return null\n return (\n <ChipRow wrap={wrap}>\n {values.map((v, i) => {\n const text = formatLookupValue(v, titles, locale)\n const key = `${i}-${text}`\n if (typeof v === 'string' && /^doc-/.test(v))\n return <LinkChip key={key} label={text} kind=\"document\" />\n if (typeof v === 'string' && /^dbr-/.test(v))\n return <LinkChip key={key} label={text} kind=\"relation\" />\n return (\n <span\n key={key}\n title={text}\n className=\"inline-flex h-[22px] min-w-0 max-w-[14rem] shrink-0 items-center truncate rounded-md bg-muted/60 px-1.5 text-xs text-foreground\"\n >\n {text}\n </span>\n )\n })}\n </ChipRow>\n )\n}\n","/**\n * PickCellEditor: the editor of person, document and relation cells. Opening the cell shows a search\n * box over the choices (workspace members, workspace documents, rows of the related database), the\n * way Notion and Airtable do.\n *\n * Single (person): one click, or the arrow keys and Enter, picks a value and closes. Multiple\n * (documents, related rows): a click toggles a choice and the picker stays open; the chosen ones\n * sit on top, removable, and Backspace in an empty search removes the last. Clicking away or \"Done\"\n * keeps the change; Escape keeps the old value. Used as an AG Grid popup editor (`cellEditorPopup`)\n * and in a row's detail panel (`DatabaseRowDetail`).\n *\n * Choices come from a fixed list (`options`, filtered here) or a server search (`search`, debounced).\n */\nimport { useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport type { CustomCellEditorProps } from 'ag-grid-react'\nimport { Check, Loader2, Search, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { cellIds, type DatabaseRowView } from './column-types'\nimport { LinkChip, PersonChip, type DatabasePickOption } from './linkCells'\n\n/** The most choices a picker lists at once (refine the search for more). */\nconst MAX_SHOWN = 50\nconst SEARCH_DEBOUNCE_MS = 200\n\nexport interface PickCellEditorLabels {\n searchPlaceholder: string\n noMatches: string\n searching: string\n clear: string\n done: string\n remove: (label: string) => string\n}\n\nexport const DEFAULT_PICK_CELL_EDITOR_LABELS: PickCellEditorLabels = {\n searchPlaceholder: 'Search…',\n noMatches: 'No matches',\n searching: 'Searching…',\n clear: 'Clear',\n done: 'Done',\n remove: (label) => `Remove ${label}`,\n}\n\nexport interface PickCellEditorParams {\n kind: 'person' | 'document' | 'relation'\n /** A fixed list of choices, filtered as the user types. */\n options?: DatabasePickOption[]\n /** Choices from the server for a search (instead of `options`). */\n search?: (q: string) => Promise<DatabasePickOption[]>\n labels?: Partial<PickCellEditorLabels>\n}\n\nfunction useChoices(\n query: string,\n options: DatabasePickOption[] | undefined,\n search: ((q: string) => Promise<DatabasePickOption[]>) | undefined\n): { choices: DatabasePickOption[]; loading: boolean } {\n const [found, setFound] = useState<DatabasePickOption[]>([])\n const [loading, setLoading] = useState(Boolean(search))\n useEffect(() => {\n if (!search) return\n let live = true\n setLoading(true)\n const t = setTimeout(\n () => {\n search(query.trim())\n .then((rows) => live && setFound(rows))\n .catch(() => live && setFound([]))\n .finally(() => live && setLoading(false))\n },\n query ? SEARCH_DEBOUNCE_MS : 0\n )\n return () => {\n live = false\n clearTimeout(t)\n }\n }, [query, search])\n\n const filtered = useMemo(() => {\n if (search) return found.slice(0, MAX_SHOWN)\n const q = query.trim().toLowerCase()\n const all = options ?? []\n const hits = q\n ? all.filter(\n (o) =>\n o.label.toLowerCase().includes(q) || (o.description ?? '').toLowerCase().includes(q)\n )\n : all\n return hits.slice(0, MAX_SHOWN)\n }, [found, options, query, search])\n\n return { choices: filtered, loading: Boolean(search) && loading }\n}\n\n/**\n * What the editor reads of AG Grid's editor props: the value, a setter, a close and the row (whose\n * `titles` name the chosen ids). A host outside the grid (a row's detail panel) passes just these.\n */\nexport type PickCellEditorProps = Pick<\n CustomCellEditorProps<DatabaseRowView>,\n 'value' | 'onValueChange' | 'stopEditing'\n> & { data?: DatabaseRowView } & PickCellEditorParams\n\nexport function PickCellEditor(props: PickCellEditorProps) {\n const { value, onValueChange, stopEditing, data, kind, options, search } = props\n const l = { ...DEFAULT_PICK_CELL_EDITOR_LABELS, ...props.labels }\n const multiple = kind !== 'person'\n const [chosen, setChosen] = useState<string[]>(() => cellIds(value))\n const [query, setQuery] = useState('')\n const [active, setActive] = useState(0)\n const input = useRef<HTMLInputElement>(null)\n const { choices, loading } = useChoices(query, options, search)\n\n // Names for the chosen ids: the row's titles, then whatever the pickers have shown.\n const names = useRef<Record<string, string>>({ ...(data?.titles ?? {}) })\n for (const o of options ?? []) names.current[o.id] ??= o.label\n for (const o of choices) names.current[o.id] = o.label\n const nameOf = (id: string) => names.current[id] ?? id\n\n useEffect(() => input.current?.focus(), [])\n useEffect(() => setActive(0), [query])\n\n const commit = (ids: string[]) => {\n setChosen(ids)\n // The cell shows the new chips by name before the server answers with the row's titles.\n if (data) {\n const titles = { ...(data.titles ?? {}) }\n for (const id of ids) titles[id] ??= nameOf(id)\n data.titles = titles\n }\n onValueChange(multiple ? ids : (ids[0] ?? null))\n }\n\n const close = () => setTimeout(() => stopEditing(), 0)\n\n const toggle = (id: string) => {\n if (!multiple) {\n commit([id])\n close()\n return\n }\n commit(chosen.includes(id) ? chosen.filter((x) => x !== id) : [...chosen, id])\n }\n\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n e.stopPropagation()\n if (choices.length === 0) return\n const step = e.key === 'ArrowDown' ? 1 : -1\n setActive((i) => (i + step + choices.length) % choices.length)\n } else if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n const pick = choices[active]\n if (pick) toggle(pick.id)\n else if (multiple) close()\n } else if (e.key === 'Backspace' && multiple && !query && chosen.length > 0) {\n commit(chosen.slice(0, -1))\n } else if (\n e.key === 'ArrowLeft' ||\n e.key === 'ArrowRight' ||\n e.key === 'Home' ||\n e.key === 'End'\n ) {\n // Move the caret in the search box, not the grid's focused cell.\n e.stopPropagation()\n }\n }\n\n return (\n <div\n data-testid=\"database-pick-editor\"\n className=\"flex w-72 flex-col rounded-md border border-border bg-popover shadow-md\"\n >\n {multiple && chosen.length > 0 && (\n <div className=\"flex flex-wrap gap-1 border-b border-border p-1.5\">\n {chosen.map((id) => (\n <span key={id} className=\"inline-flex min-w-0 items-center\">\n <LinkChip label={nameOf(id)} kind={kind === 'document' ? 'document' : 'relation'} />\n <button\n type=\"button\"\n aria-label={l.remove(nameOf(id))}\n onClick={() => commit(chosen.filter((x) => x !== id))}\n data-testid={`database-pick-remove-${id}`}\n className=\"rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <X className=\"size-3\" />\n </button>\n </span>\n ))}\n </div>\n )}\n <div className=\"flex items-center gap-1.5 border-b border-border px-2\">\n <Search className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <input\n ref={input}\n value={query}\n placeholder={l.searchPlaceholder}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n data-testid=\"database-pick-search\"\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n />\n {loading && <Loader2 className=\"size-3.5 animate-spin text-muted-foreground\" />}\n </div>\n <div role=\"listbox\" aria-multiselectable={multiple} className=\"max-h-64 overflow-y-auto p-1\">\n {choices.map((o, i) => {\n const isChosen = chosen.includes(o.id)\n return (\n <button\n key={o.id}\n type=\"button\"\n role=\"option\"\n aria-selected={isChosen}\n onMouseEnter={() => setActive(i)}\n onClick={() => toggle(o.id)}\n data-testid={`database-pick-option-${o.id}`}\n className={cn(\n 'flex w-full items-center gap-2 rounded px-2 py-1 text-left text-sm',\n i === active && 'bg-muted'\n )}\n >\n <span className=\"flex min-w-0 flex-1 flex-col\">\n {kind === 'person' ? (\n <PersonChip name={o.label} />\n ) : (\n <span className=\"truncate\">{o.label}</span>\n )}\n {o.description && (\n <span className=\"truncate text-xs text-muted-foreground\">{o.description}</span>\n )}\n </span>\n {isChosen && <Check className=\"size-3.5 shrink-0\" />}\n </button>\n )\n })}\n {choices.length === 0 && (\n <p className=\"px-2 py-1.5 text-sm text-muted-foreground\">\n {loading ? l.searching : l.noMatches}\n </p>\n )}\n </div>\n {(multiple || chosen.length > 0) && (\n <div className=\"flex justify-end border-t border-border p-1\">\n {!multiple ? (\n <button\n type=\"button\"\n onClick={() => {\n commit([])\n close()\n }}\n data-testid=\"database-pick-clear\"\n className=\"rounded px-2 py-1 text-sm text-muted-foreground hover:bg-muted\"\n >\n {l.clear}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={close}\n data-testid=\"database-pick-done\"\n className=\"rounded px-2 py-1 text-sm font-medium hover:bg-muted\"\n >\n {l.done}\n </button>\n )}\n </div>\n )}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\nimport { optionTone } from './column-types'\n\n/** A select option as a coloured chip (the same colour wherever the option appears). */\nexport function SelectChip({ value }: { value: string }) {\n return (\n <span\n className={cn(\n 'inline-flex max-w-full items-center truncate rounded-md px-2 py-0.5 text-xs font-medium',\n optionTone(value)\n )}\n >\n {value}\n </span>\n )\n}\n","/**\n * SelectCellEditor: the editor of a select column. Opening the cell shows its options straight away,\n * as the chips the cell displays (plus \"Clear\"), the way Notion and Airtable do: one click, or the\n * arrow keys and Enter, picks a value and closes; Escape or clicking away keeps the old one.\n * Used as an AG Grid popup editor (`cellEditorPopup`) and in a row's detail panel (`DatabaseRowDetail`).\n */\nimport { useEffect, useRef, useState, type KeyboardEvent } from 'react'\nimport type { CustomCellEditorProps } from 'ag-grid-react'\nimport { Check } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { SelectChip } from './SelectChip'\n\nexport interface SelectCellEditorParams {\n options: string[]\n clearLabel?: string\n}\n\n/**\n * What the editor reads of AG Grid's editor props: the value, a setter and a close. A host outside\n * the grid (a row's detail panel) passes just these.\n */\nexport type SelectCellEditorProps = Pick<\n CustomCellEditorProps,\n 'value' | 'onValueChange' | 'stopEditing'\n> &\n SelectCellEditorParams\n\nexport function SelectCellEditor(props: SelectCellEditorProps) {\n const { value, onValueChange, stopEditing, options, clearLabel = 'Clear' } = props\n const items: Array<string | null> = [...options, null]\n const [active, setActive] = useState(() => Math.max(0, options.indexOf(String(value ?? ''))))\n const list = useRef<HTMLDivElement>(null)\n\n useEffect(() => list.current?.focus(), [])\n\n const pick = (option: string | null) => {\n onValueChange(option)\n // Let the grid take the new value before the editor closes.\n setTimeout(() => stopEditing(), 0)\n }\n\n const onKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n e.stopPropagation()\n const step = e.key === 'ArrowDown' ? 1 : -1\n setActive((i) => (i + step + items.length) % items.length)\n } else if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n pick(items[active])\n }\n }\n\n return (\n <div\n ref={list}\n role=\"listbox\"\n tabIndex={-1}\n onKeyDown={onKeyDown}\n data-testid=\"database-select-editor\"\n className=\"flex min-w-44 flex-col gap-0.5 rounded-md border border-border bg-popover p-1 shadow-md outline-none\"\n >\n {items.map((option, i) => (\n <button\n key={option ?? '__clear'}\n type=\"button\"\n role=\"option\"\n aria-selected={option === value}\n onMouseEnter={() => setActive(i)}\n onClick={() => pick(option)}\n data-testid={\n option === null ? 'database-select-clear' : `database-select-option-${option}`\n }\n className={cn(\n 'flex items-center gap-2 rounded px-2 py-1 text-left text-sm',\n i === active && 'bg-muted'\n )}\n >\n {option === null ? (\n <span className=\"text-muted-foreground\">{clearLabel}</span>\n ) : (\n <SelectChip value={option} />\n )}\n {option !== null && option === value && <Check className=\"ml-auto size-3.5\" />}\n </button>\n ))}\n </div>\n )\n}\n","/**\n * Column definitions for a database grid, built from the database's own (user-defined) columns.\n *\n * Each column edits in place with the editor for its type (AG Grid's for text, number, date and\n * checkbox; a chip list for select; a searchable picker for a person, documents and related rows); a\n * checkbox toggles with one click, a select shows its value as a coloured chip, documents and\n * related rows as chips named from the row's `titles`. Lookup and rollup columns are computed by the\n * server: read-only, their header marked with a quiet \"computed\" sign. The header carries the type's\n * icon and a button that opens the column's settings, and a trailing narrow column holds the \"add a\n * column\" button: a Notion/Airtable-style table.\n *\n * Every column's `colId` is the database column id (`col-…`), so AG Grid's saved column state\n * (order, width) survives renames.\n */\nimport type { ReactNode } from 'react'\nimport type {\n ColDef,\n ICellRendererParams,\n ValueFormatterParams,\n ValueGetterParams,\n ValueSetterParams,\n} from 'ag-grid-community'\nimport {\n ArrowUpRight,\n CalendarDays,\n CheckSquare,\n ChevronDown,\n FileText,\n Hash,\n Lock,\n Maximize2,\n MoreHorizontal,\n Plus,\n Search,\n Sigma,\n Type,\n UserRound,\n} from 'lucide-react'\nimport {\n compareCells,\n formatCell,\n isComputedColumn,\n sameCellValue,\n toApiValue,\n type DatabaseColumnType,\n type DatabaseColumnView,\n type DatabaseRowView,\n} from './column-types'\nimport { SelectChip } from './SelectChip'\nimport { SelectCellEditor } from './SelectCellEditor'\nimport { PickCellEditor, type PickCellEditorParams } from './PickCellEditor'\nimport { LinkChipsCell, LookupCell, PersonCell, type DatabaseCellSources } from './linkCells'\n\nexport { SelectChip }\n\nexport interface DatabaseColumnLabels {\n addColumn: string\n columnSettings: (name: string) => string\n computed: string\n openRow: string\n}\n\nexport const DEFAULT_DATABASE_COLUMN_LABELS: DatabaseColumnLabels = {\n addColumn: 'Add a column',\n columnSettings: (name) => `${name} column settings`,\n computed: 'Computed from a relation (read-only)',\n openRow: 'Open row',\n}\n\n/** colId of the trailing \"add a column\" column (never a database column id). */\nexport const ADD_COLUMN_COL_ID = '__add_column'\n\n/** colId of the leading \"open the row\" column (never a database column id). */\nexport const OPEN_ROW_COL_ID = '__open_row'\n\nexport const COLUMN_TYPE_ICONS: Record<DatabaseColumnType, typeof Type> = {\n text: Type,\n number: Hash,\n date: CalendarDays,\n checkbox: CheckSquare,\n select: ChevronDown,\n person: UserRound,\n document: FileText,\n relation: ArrowUpRight,\n lookup: Search,\n rollup: Sigma,\n}\n\nexport interface DatabaseColumnOptions {\n /** No editing, no column settings, no add-column button (a database of another workspace). */\n readOnly?: boolean\n /** Open a column's settings (rename, options, delete). */\n onEditColumn?: (column: DatabaseColumnView) => void\n /** Add a column (the trailing \"+\" header). */\n onAddColumn?: () => void\n /** Open a row in full (a leading column of \"open\" buttons). */\n onOpenRow?: (row: DatabaseRowView) => void\n /** Choices for person, document and relation cells, and what a document chip opens. */\n sources?: DatabaseCellSources\n /** Locale for numbers and dates. */\n locale?: string\n labels?: Partial<DatabaseColumnLabels>\n}\n\nconst WIDTHS: Record<DatabaseColumnType, number> = {\n text: 220,\n number: 130,\n date: 140,\n checkbox: 110,\n select: 160,\n person: 180,\n document: 240,\n relation: 240,\n lookup: 200,\n rollup: 130,\n}\n\nfunction HeaderLabel({\n column,\n onEdit,\n label,\n computedLabel,\n}: {\n column: DatabaseColumnView\n onEdit?: () => void\n label: string\n computedLabel: string\n}) {\n const Icon = COLUMN_TYPE_ICONS[column.type]\n return (\n <span className=\"group/dbh flex min-w-0 items-center gap-1.5\">\n <Icon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"truncate text-[12.5px] font-medium\">{column.name}</span>\n {isComputedColumn(column) && (\n <span title={computedLabel} data-testid={`database-column-computed-${column.id}`}>\n <Lock className=\"size-3 shrink-0 text-muted-foreground/70\" aria-label={computedLabel} />\n </span>\n )}\n {onEdit && (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n data-testid={`database-column-settings-${column.id}`}\n // The header sorts on click: keep the settings button's click to itself.\n onClick={(e) => {\n e.stopPropagation()\n onEdit()\n }}\n onMouseDown={(e) => e.stopPropagation()}\n className=\"ml-auto rounded p-0.5 text-muted-foreground opacity-0 hover:bg-muted hover:text-foreground focus-visible:opacity-100 group-hover/dbh:opacity-100\"\n >\n <MoreHorizontal className=\"size-3.5\" />\n </button>\n )}\n </span>\n )\n}\n\n/** Wide enough for the type's values and for the header (icon, name, settings button). */\nexport function columnWidth(column: DatabaseColumnView): number {\n // A computed column's header also carries its read-only sign.\n const header = Math.round(column.name.length * 8) + 76 + (isComputedColumn(column) ? 16 : 0)\n return Math.min(320, Math.max(WIDTHS[column.type], header))\n}\n\n/** Whether a cell of this column can be edited here (given the sources the host supplied). */\nexport function canEditColumn(column: DatabaseColumnView, sources?: DatabaseCellSources): boolean {\n if (isComputedColumn(column)) return false\n if (column.type === 'person') return Boolean(sources?.members)\n if (column.type === 'document') return Boolean(sources?.documents)\n if (column.type === 'relation') return Boolean(sources?.searchRows && column.relation)\n return true\n}\n\nfunction editorFor(\n column: DatabaseColumnView,\n sources?: DatabaseCellSources\n): Pick<ColDef, 'cellEditor' | 'cellEditorParams' | 'cellEditorPopup'> {\n const pick = (params: PickCellEditorParams) => ({\n cellEditor: PickCellEditor,\n cellEditorPopup: true,\n cellEditorParams: params,\n })\n switch (column.type) {\n case 'number':\n return { cellEditor: 'agNumberCellEditor', cellEditorParams: { showStepperButtons: false } }\n case 'date':\n return { cellEditor: 'agDateStringCellEditor' }\n case 'checkbox':\n return { cellEditor: 'agCheckboxCellEditor' }\n case 'select':\n // Options show as chips the moment the cell opens (AG Grid's own select needs a second click).\n return {\n cellEditor: SelectCellEditor,\n cellEditorPopup: true,\n cellEditorParams: { options: column.options ?? [] },\n }\n case 'person':\n return pick({ kind: 'person', options: sources?.members ?? [] })\n case 'document':\n return pick({ kind: 'document', options: sources?.documents ?? [] })\n case 'relation': {\n const target = column.relation?.database_id\n const searchRows = sources?.searchRows\n return pick({\n kind: 'relation',\n search: target && searchRows ? (q: string) => searchRows(target, q) : undefined,\n })\n }\n case 'lookup':\n case 'rollup':\n return {}\n default:\n return { cellEditor: 'agTextCellEditor' }\n }\n}\n\nfunction rendererFor(\n column: DatabaseColumnView,\n locale?: string,\n sources?: DatabaseCellSources\n): Partial<ColDef<DatabaseRowView>> {\n switch (column.type) {\n case 'checkbox':\n return {\n cellRenderer: 'agCheckboxCellRenderer',\n cellClass: 'flex items-center justify-center',\n }\n case 'select':\n return {\n cellRenderer: (p: ICellRendererParams<DatabaseRowView>): ReactNode =>\n typeof p.value === 'string' && p.value ? <SelectChip value={p.value} /> : null,\n }\n case 'number':\n return {\n cellClass: 'cell-numeric',\n valueFormatter: (p: ValueFormatterParams<DatabaseRowView>) =>\n formatCell(p.value, 'number', locale),\n }\n case 'rollup':\n return {\n cellClass: 'cell-numeric text-muted-foreground',\n valueFormatter: (p: ValueFormatterParams<DatabaseRowView>) =>\n formatCell(p.value, 'rollup', locale),\n }\n case 'date':\n return {\n valueFormatter: (p: ValueFormatterParams<DatabaseRowView>) =>\n formatCell(p.value, 'date', locale),\n }\n case 'person':\n return {\n cellRenderer: (p: ICellRendererParams<DatabaseRowView>): ReactNode => (\n <PersonCell value={p.value} titles={p.data?.titles} />\n ),\n }\n case 'document':\n case 'relation':\n return {\n cellRenderer: (p: ICellRendererParams<DatabaseRowView>): ReactNode => (\n <LinkChipsCell\n value={p.value}\n titles={p.data?.titles}\n kind={column.type === 'document' ? 'document' : 'relation'}\n onOpenDocument={sources?.onOpenDocument}\n />\n ),\n }\n case 'lookup':\n return {\n cellRenderer: (p: ICellRendererParams<DatabaseRowView>): ReactNode => (\n <LookupCell value={p.value} titles={p.data?.titles} locale={locale} />\n ),\n }\n default:\n return {}\n }\n}\n\n/** One grid column per database column, then the \"add a column\" column (unless read-only). */\nexport function createDatabaseColumns(\n columns: DatabaseColumnView[],\n options: DatabaseColumnOptions = {}\n): ColDef<DatabaseRowView>[] {\n const { readOnly, onEditColumn, onAddColumn, onOpenRow, locale, sources } = options\n const l = { ...DEFAULT_DATABASE_COLUMN_LABELS, ...options.labels }\n const openRow: ColDef<DatabaseRowView>[] =\n onOpenRow && columns.length > 0\n ? [\n {\n colId: OPEN_ROW_COL_ID,\n headerName: '',\n width: 40,\n minWidth: 40,\n maxWidth: 40,\n resizable: false,\n sortable: false,\n editable: false,\n suppressMovable: true,\n // Pinned: the button stays in view however far the table scrolls.\n pinned: 'left',\n lockPinned: true,\n lockPosition: 'left',\n cellClass: 'flex items-center justify-center !px-0',\n valueGetter: () => null,\n cellRenderer: (p: ICellRendererParams<DatabaseRowView>): ReactNode =>\n p.data ? (\n <button\n type=\"button\"\n aria-label={l.openRow}\n title={l.openRow}\n data-testid={`database-open-row-${p.data.id}`}\n onClick={(e) => {\n e.stopPropagation()\n if (p.data) onOpenRow(p.data)\n }}\n onDoubleClick={(e) => e.stopPropagation()}\n className=\"flex size-6 items-center justify-center rounded text-muted-foreground/70 hover:bg-muted hover:text-foreground\"\n >\n <Maximize2 className=\"size-3.5\" />\n </button>\n ) : null,\n },\n ]\n : []\n const defs: ColDef<DatabaseRowView>[] = columns.map((column) => ({\n colId: column.id,\n headerName: column.name,\n width: columnWidth(column),\n minWidth: 90,\n resizable: true,\n sortable: true,\n editable: !readOnly && canEditColumn(column, sources),\n // The grid's own type inference must not second-guess the database's column type.\n cellDataType: false,\n headerComponentParams: {\n innerHeaderComponent: () => (\n <HeaderLabel\n column={column}\n label={l.columnSettings(column.name)}\n computedLabel={l.computed}\n onEdit={!readOnly && onEditColumn ? () => onEditColumn(column) : undefined}\n />\n ),\n },\n // An empty checkbox reads as unticked (not indeterminate).\n valueGetter: (p: ValueGetterParams<DatabaseRowView>) =>\n column.type === 'checkbox'\n ? p.data?.values[column.id] === true\n : (p.data?.values[column.id] ?? null),\n // Edits land in the row's values as the API would store them; the host saves them in\n // onCellValueChanged and puts the server's normalised row back.\n valueSetter: (p: ValueSetterParams<DatabaseRowView>) => {\n if (!p.data) return false\n const next = toApiValue(p.newValue, column.type)\n if (sameCellValue(next, p.oldValue)) return false\n p.data.values = { ...p.data.values, [column.id]: next }\n return true\n },\n comparator: (a: unknown, b: unknown, nodeA, nodeB) =>\n compareCells(a, b, column.type, nodeA?.data?.titles, nodeB?.data?.titles),\n getQuickFilterText: (p) => formatCell(p.value, column.type, locale, p.data?.titles),\n ...editorFor(column, sources),\n ...rendererFor(column, locale, sources),\n }))\n defs.unshift(...openRow)\n if (!readOnly && onAddColumn) {\n defs.push({\n colId: ADD_COLUMN_COL_ID,\n width: 52,\n minWidth: 52,\n maxWidth: 52,\n resizable: false,\n sortable: false,\n editable: false,\n suppressMovable: true,\n // Pinned: on a wide table the add button stays in view instead of scrolling off the right.\n pinned: 'right',\n lockPinned: true,\n headerComponent: () => (\n <button\n type=\"button\"\n aria-label={l.addColumn}\n title={l.addColumn}\n data-testid=\"database-add-column\"\n onClick={onAddColumn}\n className=\"flex size-7 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <Plus className=\"size-4\" />\n </button>\n ),\n valueGetter: () => null,\n })\n }\n return defs\n}\n","/**\n * The settings a relation, lookup or rollup column needs, inside the column dialog.\n *\n * - relation: the database it links to (fixed once added) and, when adding, whether the target\n * shows the links back in a paired column (\"Show on <target>\"), with an optional name for it.\n * - lookup: a relation column of this database, then the column of its target to show.\n * - rollup: a relation column, what to measure (count, or the sum / average / min / max of a number\n * column of the target) and, unless counting, that number column.\n */\nimport type { ReactNode } from 'react'\nimport {\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Switch,\n} from '@arbidocs/react/ui'\nimport { COLUMN_TYPE_ICONS } from './databaseColumns'\nimport {\n DATABASE_ROLLUP_OPS,\n isComputedColumn,\n type DatabaseColumnView,\n type DatabaseRollupOp,\n type DatabaseSummaryView,\n} from './column-types'\n\nexport interface ColumnConfigLabels {\n relatedDatabase: string\n pickDatabase: string\n noDatabases: string\n targetFixed: string\n thisDatabase: string\n showOnTarget: (target: string) => string\n showOnTargetHint: string\n pairName: string\n pairNamePlaceholder: (name: string) => string\n pairedWith: (target: string) => string\n oneWay: string\n relation: string\n pickRelation: string\n noRelations: string\n lookupColumn: string\n pickColumn: string\n noColumns: string\n rollupOp: string\n rollupColumn: string\n noNumberColumns: string\n ops: Record<DatabaseRollupOp, string>\n}\n\nexport const DEFAULT_COLUMN_CONFIG_LABELS: ColumnConfigLabels = {\n relatedDatabase: 'Related database',\n pickDatabase: 'Pick a database',\n noDatabases: 'There is no database to link to yet.',\n targetFixed: 'The related database can’t be changed once the column has been added.',\n thisDatabase: 'this database',\n showOnTarget: (target) => `Show on ${target}`,\n showOnTargetHint: 'Adds a column to the related database that lists the links back.',\n pairName: 'Name of the column there',\n pairNamePlaceholder: (name) => name,\n pairedWith: (target) => `Shown on ${target} too (two-way).`,\n oneWay: 'One-way: only this database shows the links.',\n relation: 'Relation',\n pickRelation: 'Pick a relation column',\n noRelations: 'Add a relation column first: lookups and rollups read through one.',\n lookupColumn: 'Column to show',\n pickColumn: 'Pick a column',\n noColumns: 'The related database has no column to show.',\n rollupOp: 'Calculate',\n rollupColumn: 'Of the number column',\n noNumberColumns: 'The related database has no number column.',\n ops: { count: 'Count', sum: 'Sum', avg: 'Average', min: 'Min', max: 'Max' },\n}\n\nexport interface RelationDraft {\n database_id: string\n two_way: boolean\n pair_name: string\n}\n\nexport interface LookupDraft {\n relation: string\n column: string\n}\n\nexport interface RollupDraft {\n relation: string\n column: string\n op: DatabaseRollupOp\n}\n\nfunction Field({ label, children, hint }: { label: string; children: ReactNode; hint?: string }) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Label>{label}</Label>\n {children}\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )\n}\n\nfunction Hint({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <p className=\"text-xs text-muted-foreground\" data-testid={testId}>\n {children}\n </p>\n )\n}\n\nfunction ColumnSelect({\n value,\n onChange,\n columns,\n placeholder,\n testId,\n}: {\n value: string\n onChange: (id: string) => void\n columns: DatabaseColumnView[]\n placeholder: string\n testId: string\n}) {\n return (\n <Select value={value || undefined} onValueChange={onChange}>\n <SelectTrigger data-testid={testId}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {columns.map((c) => {\n const Icon = COLUMN_TYPE_ICONS[c.type]\n return (\n <SelectItem key={c.id} value={c.id} data-testid={`${testId}-${c.id}`}>\n <span className=\"flex items-center gap-2\">\n <Icon className=\"size-4 text-muted-foreground\" />\n {c.name}\n </span>\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n )\n}\n\nexport function RelationFields({\n draft,\n onChange,\n databases,\n databaseId,\n databaseName,\n editing,\n column,\n labels,\n}: {\n draft: RelationDraft\n onChange: (draft: RelationDraft) => void\n databases: DatabaseSummaryView[]\n databaseId?: string\n databaseName?: string\n editing: boolean\n column?: DatabaseColumnView | null\n labels: ColumnConfigLabels\n}) {\n const nameOf = (id: string) =>\n databases.find((d) => d.id === id)?.name ?? (id === databaseId ? labels.thisDatabase : id)\n if (editing && column?.relation) {\n const target = nameOf(column.relation.database_id)\n return (\n <Field label={labels.relatedDatabase} hint={labels.targetFixed}>\n <p className=\"text-sm\" data-testid=\"database-column-relation-target\">\n {target}\n </p>\n <Hint>{column.relation.two_way ? labels.pairedWith(target) : labels.oneWay}</Hint>\n </Field>\n )\n }\n if (databases.length === 0) return <Hint>{labels.noDatabases}</Hint>\n const target = draft.database_id ? nameOf(draft.database_id) : ''\n return (\n <>\n <Field label={labels.relatedDatabase}>\n <Select\n value={draft.database_id || undefined}\n onValueChange={(v) => onChange({ ...draft, database_id: v })}\n >\n <SelectTrigger data-testid=\"database-column-relation-database\">\n <SelectValue placeholder={labels.pickDatabase} />\n </SelectTrigger>\n <SelectContent>\n {databases.map((d) => (\n <SelectItem\n key={d.id}\n value={d.id}\n data-testid={`database-column-relation-database-${d.id}`}\n >\n {d.id === databaseId ? `${d.name} (${labels.thisDatabase})` : d.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n {draft.database_id && (\n <div className=\"flex flex-col gap-2 rounded-md border border-border p-3\">\n <label className=\"flex items-center justify-between gap-3 text-sm\">\n <span className=\"flex flex-col\">\n <span className=\"font-medium\">{labels.showOnTarget(target)}</span>\n <span className=\"text-xs text-muted-foreground\">{labels.showOnTargetHint}</span>\n </span>\n <Switch\n checked={draft.two_way}\n onCheckedChange={(two_way) => onChange({ ...draft, two_way })}\n data-testid=\"database-column-relation-two-way\"\n />\n </label>\n {draft.two_way && (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"database-column-pair-name\">{labels.pairName}</Label>\n <Input\n id=\"database-column-pair-name\"\n value={draft.pair_name}\n maxLength={200}\n placeholder={labels.pairNamePlaceholder(databaseName ?? '')}\n onChange={(e) => onChange({ ...draft, pair_name: e.target.value })}\n data-testid=\"database-column-pair-name\"\n />\n </div>\n )}\n </div>\n )}\n </>\n )\n}\n\n/** The relation columns of this database, and the columns of a relation's target. */\nfunction relationColumnsOf(columns: DatabaseColumnView[]): DatabaseColumnView[] {\n return columns.filter((c) => c.type === 'relation' && c.relation)\n}\n\nfunction targetColumnsOf(\n relationId: string,\n columns: DatabaseColumnView[],\n databases: DatabaseSummaryView[],\n databaseId?: string\n): DatabaseColumnView[] {\n const relation = columns.find((c) => c.id === relationId)?.relation\n if (!relation) return []\n // This database's own columns are the freshest copy of a relation to itself.\n if (relation.database_id === databaseId) return columns\n return databases.find((d) => d.id === relation.database_id)?.columns ?? []\n}\n\nexport function LookupFields({\n draft,\n onChange,\n columns,\n databases,\n databaseId,\n labels,\n}: {\n draft: LookupDraft\n onChange: (draft: LookupDraft) => void\n columns: DatabaseColumnView[]\n databases: DatabaseSummaryView[]\n databaseId?: string\n labels: ColumnConfigLabels\n}) {\n const relations = relationColumnsOf(columns)\n if (relations.length === 0)\n return <Hint testId=\"database-column-no-relations\">{labels.noRelations}</Hint>\n const shown = targetColumnsOf(draft.relation, columns, databases, databaseId).filter(\n (c) => !isComputedColumn(c)\n )\n return (\n <>\n <Field label={labels.relation}>\n <ColumnSelect\n value={draft.relation}\n onChange={(relation) => onChange({ relation, column: '' })}\n columns={relations}\n placeholder={labels.pickRelation}\n testId=\"database-column-lookup-relation\"\n />\n </Field>\n {draft.relation && (\n <Field label={labels.lookupColumn}>\n {shown.length ? (\n <ColumnSelect\n value={draft.column}\n onChange={(column) => onChange({ ...draft, column })}\n columns={shown}\n placeholder={labels.pickColumn}\n testId=\"database-column-lookup-column\"\n />\n ) : (\n <Hint>{labels.noColumns}</Hint>\n )}\n </Field>\n )}\n </>\n )\n}\n\nexport function RollupFields({\n draft,\n onChange,\n columns,\n databases,\n databaseId,\n labels,\n}: {\n draft: RollupDraft\n onChange: (draft: RollupDraft) => void\n columns: DatabaseColumnView[]\n databases: DatabaseSummaryView[]\n databaseId?: string\n labels: ColumnConfigLabels\n}) {\n const relations = relationColumnsOf(columns)\n if (relations.length === 0)\n return <Hint testId=\"database-column-no-relations\">{labels.noRelations}</Hint>\n const numbers = targetColumnsOf(draft.relation, columns, databases, databaseId).filter(\n (c) => c.type === 'number'\n )\n return (\n <>\n <Field label={labels.relation}>\n <ColumnSelect\n value={draft.relation}\n onChange={(relation) => onChange({ ...draft, relation, column: '' })}\n columns={relations}\n placeholder={labels.pickRelation}\n testId=\"database-column-rollup-relation\"\n />\n </Field>\n {draft.relation && (\n <div className=\"grid grid-cols-[8rem_1fr] gap-2\">\n <Field label={labels.rollupOp}>\n <Select\n value={draft.op}\n onValueChange={(op) => onChange({ ...draft, op: op as DatabaseRollupOp })}\n >\n <SelectTrigger data-testid=\"database-column-rollup-op\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {DATABASE_ROLLUP_OPS.map((op) => (\n <SelectItem key={op} value={op} data-testid={`database-column-rollup-op-${op}`}>\n {labels.ops[op]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n {draft.op !== 'count' && (\n <Field label={labels.rollupColumn}>\n {numbers.length ? (\n <ColumnSelect\n value={draft.column}\n onChange={(column) => onChange({ ...draft, column })}\n columns={numbers}\n placeholder={labels.pickColumn}\n testId=\"database-column-rollup-column\"\n />\n ) : (\n <Hint>{labels.noNumberColumns}</Hint>\n )}\n </Field>\n )}\n </div>\n )}\n </>\n )\n}\n","/**\n * DatabaseRowDetail: one database row in full, in the shared detail panel (`DetailPanel`, as a tag\n * is shown): every column as a field with the editor its grid cell uses (a text, number or date\n * box, a checkbox, the select chips, the person / document / related-row picker), the computed\n * lookups and rollups read-only, and the documents the row links to, each opening in the viewer.\n * Each edit goes to the host as the grid's cell edits do (`onChange`, the value in the API's form).\n */\nimport { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { FileText, Rows3, Trash2 } from 'lucide-react'\nimport {\n Button,\n Checkbox,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport {\n DetailEmpty,\n DetailField,\n DetailFields,\n DetailLinkItem,\n DetailLinkList,\n DetailPanel,\n DetailSection,\n} from '../components/DetailPanel'\nimport {\n cellIds,\n formatCell,\n isComputedColumn,\n rowTitle,\n sameCellValue,\n titleOf,\n toApiValue,\n type DatabaseColumnView,\n type DatabaseRowView,\n} from './column-types'\nimport { COLUMN_TYPE_ICONS, canEditColumn } from './databaseColumns'\nimport { LinkChipsCell, LookupCell, PersonCell, type DatabaseCellSources } from './linkCells'\nimport { PickCellEditor } from './PickCellEditor'\nimport { SelectCellEditor } from './SelectCellEditor'\nimport { SelectChip } from './SelectChip'\n\nexport interface DatabaseRowDetailLabels {\n untitled: string\n fields: string\n documents: string\n noDocuments: string\n /** An empty cell that can be filled in. */\n empty: string\n deleteRow: string\n close: string\n /** Under a computed (lookup / rollup) field. */\n computed: string\n}\n\nexport const DEFAULT_DATABASE_ROW_DETAIL_LABELS: DatabaseRowDetailLabels = {\n untitled: 'Untitled',\n fields: 'Fields',\n documents: 'Linked documents',\n noDocuments: 'No document is linked to this row.',\n empty: 'Empty',\n deleteRow: 'Delete row',\n close: 'Close',\n computed: 'Computed from a relation',\n}\n\nexport interface DatabaseRowDetailProps {\n /** The row (absent while it loads). */\n row: DatabaseRowView | undefined\n columns: DatabaseColumnView[]\n /** A field edited here: the value is in the API's form (`null` empties the cell). */\n onChange?: (row: DatabaseRowView, columnId: string, value: unknown) => void\n /** The pickers' choices and what a document opens (the grid's sources). */\n sources?: DatabaseCellSources\n onDelete?: (row: DatabaseRowView) => void\n onClose?: () => void\n readOnly?: boolean\n locale?: string\n labels?: Partial<DatabaseRowDetailLabels>\n className?: string\n testId?: string\n}\n\n/** A text, number or date box: saved on Enter or leaving it, Escape puts the value back. */\nfunction DraftInput({\n value,\n type,\n onCommit,\n testId,\n label,\n}: {\n value: string\n type: 'text' | 'number' | 'date'\n onCommit: (next: string) => void\n testId: string\n label: string\n}) {\n const [draft, setDraft] = useState(value)\n useEffect(() => setDraft(value), [value])\n return (\n <Input\n type={type}\n value={draft}\n aria-label={label}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => draft !== value && onCommit(draft)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') e.currentTarget.blur()\n if (e.key === 'Escape') {\n setDraft(value)\n // Leave without saving: the blur sees the old value.\n requestAnimationFrame(() => (e.target as HTMLInputElement).blur())\n }\n }}\n className=\"h-8\"\n data-testid={testId}\n />\n )\n}\n\n/**\n * A field edited in a popover (select, person, documents, related rows), with the grid's own editor\n * inside: the change is saved when the popover closes, Escape keeps the old value.\n */\nfunction PopoverField({\n display,\n emptyLabel,\n testId,\n label,\n renderEditor,\n onCommit,\n}: {\n display: ReactNode\n emptyLabel: string\n testId: string\n label: string\n renderEditor: (props: {\n onValueChange: (value: unknown) => void\n stopEditing: () => void\n }) => ReactNode\n onCommit: (value: unknown) => void\n}) {\n const [open, setOpen] = useState(false)\n const pending = useRef<{ value: unknown } | null>(null)\n const cancelled = useRef(false)\n\n const close = (keep: boolean) => {\n setOpen(false)\n const change = pending.current\n pending.current = null\n if (keep && change && !cancelled.current) onCommit(change.value)\n cancelled.current = false\n }\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n if (next) {\n pending.current = null\n cancelled.current = false\n setOpen(true)\n } else close(true)\n }}\n >\n <PopoverTrigger asChild>\n {/* Not a <button>: a document chip inside is its own button (it opens the document). */}\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={label}\n aria-haspopup=\"dialog\"\n onKeyDown={(e) => {\n if (e.target === e.currentTarget && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n setOpen(true)\n }\n }}\n className=\"flex min-h-8 w-full min-w-0 cursor-pointer items-center rounded-md border border-input bg-transparent px-2 py-1 text-left text-sm outline-none hover:bg-muted/50 focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={testId}\n >\n {display ?? <span className=\"text-muted-foreground\">{emptyLabel}</span>}\n </div>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"w-auto border-0 bg-transparent p-0 shadow-none\"\n onEscapeKeyDown={() => {\n cancelled.current = true\n }}\n >\n {renderEditor({\n onValueChange: (value) => {\n pending.current = { value }\n },\n stopEditing: () => close(true),\n })}\n </PopoverContent>\n </Popover>\n )\n}\n\nexport function DatabaseRowDetail({\n row,\n columns,\n onChange,\n sources,\n onDelete,\n onClose,\n readOnly = false,\n locale,\n labels,\n className,\n testId = 'database-row-detail',\n}: DatabaseRowDetailProps) {\n const l = { ...DEFAULT_DATABASE_ROW_DETAIL_LABELS, ...labels }\n const title = row ? rowTitle(row, columns, locale) || l.untitled : ''\n\n const commit = (column: DatabaseColumnView, value: unknown) => {\n if (!row || !onChange) return\n const next = toApiValue(value, column.type)\n if (sameCellValue(next, row.values[column.id])) return\n onChange(row, column.id, next)\n }\n\n const fieldEditor = (column: DatabaseColumnView): ReactNode => {\n if (!row) return null\n const value = row.values[column.id]\n const id = `${testId}-input-${column.id}`\n const editable = !readOnly && Boolean(onChange) && canEditColumn(column, sources)\n const display = (): ReactNode => {\n switch (column.type) {\n case 'select':\n return typeof value === 'string' && value ? <SelectChip value={value} /> : null\n case 'person':\n return cellIds(value).length ? <PersonCell value={value} titles={row.titles} /> : null\n case 'document':\n case 'relation':\n return cellIds(value).length ? (\n <LinkChipsCell\n value={value}\n titles={row.titles}\n kind={column.type}\n onOpenDocument={sources?.onOpenDocument}\n wrap\n />\n ) : null\n case 'lookup':\n return <LookupCell value={value} titles={row.titles} locale={locale} wrap />\n default: {\n const text = formatCell(value, column.type, locale, row.titles)\n return text ? <span className=\"break-words\">{text}</span> : null\n }\n }\n }\n\n if (!editable) {\n const shown = display()\n return (\n <div\n className={cn(\n 'flex min-h-8 min-w-0 items-center py-1 text-sm',\n isComputedColumn(column) && 'text-muted-foreground'\n )}\n title={isComputedColumn(column) ? l.computed : undefined}\n data-testid={id}\n >\n {shown ?? <span className=\"text-muted-foreground\">—</span>}\n </div>\n )\n }\n\n switch (column.type) {\n case 'checkbox':\n return (\n <div className=\"flex min-h-8 items-center\">\n <Checkbox\n checked={value === true}\n aria-label={column.name}\n onCheckedChange={(checked) => commit(column, checked === true)}\n data-testid={id}\n />\n </div>\n )\n case 'number':\n case 'date':\n case 'text': {\n const text =\n value == null ? '' : column.type === 'date' ? String(value).slice(0, 10) : String(value)\n return (\n <DraftInput\n value={text}\n type={column.type}\n label={column.name}\n onCommit={(next) => commit(column, next)}\n testId={id}\n />\n )\n }\n case 'select':\n return (\n <PopoverField\n display={display()}\n emptyLabel={l.empty}\n label={column.name}\n testId={id}\n onCommit={(next) => commit(column, next)}\n renderEditor={(editor) => (\n <SelectCellEditor {...editor} value={value} options={column.options ?? []} />\n )}\n />\n )\n case 'person':\n case 'document':\n case 'relation': {\n const target = column.relation?.database_id\n const searchRows = sources?.searchRows\n return (\n <PopoverField\n display={display()}\n emptyLabel={l.empty}\n label={column.name}\n testId={id}\n onCommit={(next) => commit(column, next)}\n renderEditor={(editor) => (\n <PickCellEditor\n {...editor}\n value={value}\n data={row}\n kind={column.type as 'person' | 'document' | 'relation'}\n options={\n column.type === 'person'\n ? sources?.members\n : column.type === 'document'\n ? sources?.documents\n : undefined\n }\n search={\n column.type === 'relation' && target && searchRows\n ? (q: string) => searchRows(target, q)\n : undefined\n }\n />\n )}\n />\n )\n }\n default:\n return null\n }\n }\n\n // The documents this row links to, once each, with the columns that link them.\n const documents = new Map<string, string[]>()\n if (row) {\n for (const column of columns) {\n if (column.type !== 'document') continue\n for (const id of cellIds(row.values[column.id])) {\n documents.set(id, [...(documents.get(id) ?? []), column.name])\n }\n }\n }\n const openDocument = sources?.onOpenDocument\n\n return (\n <DetailPanel\n title={title}\n icon={<Rows3 className=\"size-4\" />}\n isLoading={!row}\n onClose={onClose}\n labels={{ close: l.close }}\n className={className}\n testId={testId}\n actions={\n row && onDelete && !readOnly ? (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 text-red-text\"\n onClick={() => onDelete(row)}\n aria-label={l.deleteRow}\n title={l.deleteRow}\n data-testid={`${testId}-delete`}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n ) : undefined\n }\n >\n <DetailSection title={l.fields} testId={`${testId}-fields`}>\n <DetailFields>\n {columns.map((column) => {\n const Icon = COLUMN_TYPE_ICONS[column.type]\n return (\n <DetailField\n key={column.id}\n label={column.name}\n icon={Icon ? <Icon className=\"size-3.5\" /> : undefined}\n testId={`${testId}-field-${column.id}`}\n >\n {fieldEditor(column)}\n </DetailField>\n )\n })}\n </DetailFields>\n </DetailSection>\n {columns.some((c) => c.type === 'document') && (\n <DetailSection title={l.documents} count={documents.size} testId={`${testId}-documents`}>\n {documents.size ? (\n <DetailLinkList>\n {[...documents].map(([id, via]) => (\n <DetailLinkItem\n key={id}\n icon={<FileText className=\"size-4\" />}\n onClick={openDocument ? () => openDocument(id) : undefined}\n testId={`${testId}-doc-${id}`}\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">{titleOf(id, row?.titles)}</span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {via.join(', ')}\n </span>\n </span>\n </DetailLinkItem>\n ))}\n </DetailLinkList>\n ) : (\n <DetailEmpty>{l.noDocuments}</DetailEmpty>\n )}\n </DetailSection>\n )}\n </DetailPanel>\n )\n}\n","/**\n * DatabaseTable: a database's rows in an editable grid, Notion/Airtable style. Cells edit in place\n * (double-click or Enter; a checkbox toggles with one click), the header of each column opens its\n * settings, the trailing \"+\" header adds a column and the footer adds a row. Ticked rows are\n * reported for a bulk delete. Pure: the host owns the data and saves each edit.\n */\nimport { useEffect, useMemo, useRef } from 'react'\nimport type { CellValueChangedEvent, GridApi } from 'ag-grid-community'\nimport { Plus, Table2 } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { GridView, type GridViewProps } from '../files/GridView'\nimport { testIdOr } from '../chat/test-id'\nimport {\n DEFAULT_DATABASE_COLUMN_LABELS,\n createDatabaseColumns,\n type DatabaseColumnLabels,\n} from './databaseColumns'\nimport type { DatabaseColumnView, DatabaseRowView } from './column-types'\nimport type { DatabaseCellSources } from './linkCells'\n\nconst escapeHtml = (text: string): string =>\n text.replace(/[&<>\"']/g, (ch) => `&#${ch.charCodeAt(0)};`)\n\nexport interface DatabaseTableLabels {\n newRow: string\n emptyTitle: string\n emptyMessage: string\n noColumnsTitle: string\n noColumnsMessage: string\n noMatches: string\n}\n\nexport const DEFAULT_DATABASE_TABLE_LABELS: DatabaseTableLabels = {\n newRow: 'New row',\n emptyTitle: 'No rows yet',\n emptyMessage: 'Add a row, or import a spreadsheet.',\n noColumnsTitle: 'No columns yet',\n noColumnsMessage: 'Add a column to start.',\n noMatches: 'No rows match your search.',\n}\n\nexport interface DatabaseTableProps {\n columns: DatabaseColumnView[]\n rows: DatabaseRowView[]\n /** An edited cell: the value is already in the API's form (`null` empties the cell). */\n onCellChange?: (row: DatabaseRowView, columnId: string, value: unknown) => void\n onAddRow?: () => void\n onAddColumn?: () => void\n onEditColumn?: (column: DatabaseColumnView) => void\n /** Open a row in full (its detail): a leading column of \"open\" buttons. */\n onOpenRow?: (row: DatabaseRowView) => void\n /**\n * Choices for person, document and relation cells (workspace members, documents, a search of\n * the related database's rows) and what a document chip opens. Keep it stable (memoise it): the\n * columns are rebuilt when it changes.\n */\n sources?: DatabaseCellSources\n /** Ticked rows (for a bulk delete). With it, rows show a checkbox. */\n onSelectionChange?: (rows: DatabaseRowView[]) => void\n selected?: DatabaseRowView[]\n /** Read-only: a database of another (public) workspace. */\n readOnly?: boolean\n /** Rows are filtered by a search: an empty result says so instead of \"no rows yet\". */\n isFiltered?: boolean\n isLoading?: boolean\n locale?: string\n /** Saved column state key (AG Grid persists by it): one per database. */\n gridId?: string\n height?: GridViewProps<DatabaseRowView>['height']\n labels?: Partial<DatabaseTableLabels>\n columnLabels?: Partial<DatabaseColumnLabels>\n gridProps?: Partial<Omit<GridViewProps<DatabaseRowView>, 'items' | 'columnDefs' | 'getItemId'>>\n testId?: string\n}\n\nexport function DatabaseTable({\n columns,\n rows,\n onCellChange,\n onAddRow,\n onAddColumn,\n onEditColumn,\n onOpenRow,\n sources,\n onSelectionChange,\n selected,\n readOnly = false,\n isFiltered = false,\n isLoading,\n locale,\n gridId,\n height = '100%',\n labels,\n columnLabels,\n gridProps,\n testId,\n}: DatabaseTableProps) {\n const l = { ...DEFAULT_DATABASE_TABLE_LABELS, ...labels }\n const columnDefs = useMemo(\n () =>\n createDatabaseColumns(columns, {\n readOnly,\n onEditColumn,\n onAddColumn,\n onOpenRow,\n sources,\n locale,\n labels: columnLabels,\n }),\n [columns, readOnly, onEditColumn, onAddColumn, onOpenRow, sources, locale, columnLabels]\n )\n\n // No columns: a full empty state (there is no header to add one from). Columns but no rows: the\n // grid stays, header and all, with a no-rows overlay, so columns can still be added and resized.\n const noColumns = columns.length === 0\n const emptyState = {\n icon: <Table2 className=\"size-8 text-muted-foreground\" />,\n title: l.noColumnsTitle,\n message: readOnly ? undefined : l.noColumnsMessage,\n action:\n !readOnly && onAddColumn ? (\n <Button onClick={onAddColumn} data-testid=\"database-empty-add-column\" className=\"gap-1.5\">\n <Plus className=\"size-4\" />\n {columnLabels?.addColumn ?? DEFAULT_DATABASE_COLUMN_LABELS.addColumn}\n </Button>\n ) : undefined,\n }\n const noRowsText = isFiltered\n ? l.noMatches\n : readOnly\n ? l.emptyTitle\n : `${l.emptyTitle}. ${l.emptyMessage}`\n\n // A column just added lands at the right edge, often past the viewport: bring it into view.\n const api = useRef<GridApi<DatabaseRowView> | null>(null)\n const knownColumns = useRef<Set<string> | null>(null)\n useEffect(() => {\n const ids = new Set(columns.map((c) => c.id))\n const added = knownColumns.current\n ? columns.filter((c) => !knownColumns.current!.has(c.id))\n : []\n knownColumns.current = ids\n const last = added[added.length - 1]\n if (last && api.current) {\n const grid = api.current\n // After the grid has applied the new column definitions.\n setTimeout(() => grid.ensureColumnVisible(last.id, 'end'), 0)\n }\n }, [columns])\n\n const handleCellValueChanged = (event: CellValueChangedEvent<DatabaseRowView>) => {\n const columnId = event.column.getColId()\n if (!event.data || !onCellChange) return\n onCellChange(event.data, columnId, event.data.values[columnId] ?? null)\n }\n\n return (\n <div\n className=\"flex h-full min-h-0 flex-col\"\n data-testid={testIdOr(testId, { testId: 'database-table' })}\n >\n <div className=\"min-h-0 flex-1\">\n <GridView<DatabaseRowView>\n testId=\"database-grid\"\n items={rows}\n columnDefs={columnDefs}\n getItemId={(row) => row.id}\n getRowTestId={(row) => `database-row-${row.id}`}\n getCellTestId={(colId, row) => `database-cell-${row.id}-${colId}`}\n isLoading={isLoading}\n emptyState={emptyState}\n showEmpty={noColumns}\n gridId={gridId}\n height={height}\n rowHeight={38}\n selection={\n onSelectionChange\n ? { mode: 'multiple', selected: selected ?? [], onSelectionChange, controlled: true }\n : undefined\n }\n onCellValueChanged={handleCellValueChanged}\n {...gridProps}\n onGridReady={(params) => {\n api.current = params.api\n gridProps?.onGridReady?.(params)\n }}\n gridOptions={{\n overlayNoRowsTemplate: `<span class=\"text-sm text-muted-foreground\">${escapeHtml(noRowsText)}</span>`,\n singleClickEdit: false,\n stopEditingWhenCellsLoseFocus: true,\n enterNavigatesVerticallyAfterEdit: true,\n undoRedoCellEditing: false,\n ...gridProps?.gridOptions,\n }}\n />\n </div>\n {!readOnly && onAddRow && columns.length > 0 && (\n <div className=\"border-t border-border px-2 py-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onAddRow}\n data-testid=\"database-add-row\"\n className=\"gap-1.5 text-muted-foreground\"\n >\n <Plus className=\"size-4\" />\n {l.newRow}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","/**\n * DatabaseToolbar: the header of an open database. Back to the list, the database's name (rename\n * in place), its row count, a search box, the saved-views menu, the bulk delete for ticked rows, and the import/export\n * menu. A database of another workspace is read-only here and says where to edit it.\n */\nimport {\n useEffect,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport {\n ArrowLeft,\n Download,\n Eye,\n FileSpreadsheet,\n MoreHorizontal,\n Search,\n Trash2,\n Upload,\n} from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n} from '@arbidocs/react/ui'\n\nexport type DatabaseExportFormat = 'csv' | 'xlsx'\n\nexport interface DatabaseToolbarLabels {\n back: string\n rename: string\n rows: (count: number) => string\n showing: (shown: number, total: number) => string\n search: string\n deleteSelected: (count: number) => string\n more: string\n importRows: string\n exportXlsx: string\n exportCsv: string\n deleteDatabase: string\n readOnly: string\n}\n\nexport const DEFAULT_DATABASE_TOOLBAR_LABELS: DatabaseToolbarLabels = {\n back: 'All databases',\n rename: 'Rename database',\n rows: (n) => `${n.toLocaleString()} row${n === 1 ? '' : 's'}`,\n showing: (shown, total) => `Showing ${shown.toLocaleString()} of ${total.toLocaleString()}`,\n search: 'Search',\n deleteSelected: (n) => `Delete ${n} row${n === 1 ? '' : 's'}`,\n more: 'More actions',\n importRows: 'Import rows from a spreadsheet…',\n exportXlsx: 'Export to Excel (.xlsx)',\n exportCsv: 'Export to CSV',\n deleteDatabase: 'Delete database',\n readOnly: 'Read-only here: this database belongs to another workspace.',\n}\n\nexport interface DatabaseToolbarProps {\n name: string\n description?: string | null\n /** Rows matching the search (all rows without one). */\n total: number\n /** Rows loaded into the grid, when fewer than `total`. */\n shown?: number\n search: string\n onSearchChange: (text: string) => void\n onBack?: () => void\n onRename?: (name: string) => void\n selectedCount?: number\n onDeleteSelected?: () => void\n /** Append rows from a .csv / .xlsx file. */\n onImportRows?: (file: File) => void\n onExport?: (format: DatabaseExportFormat) => void\n /** Delete the whole database (the host confirms first). */\n onDeleteDatabase?: () => void\n readOnly?: boolean\n /** The saved-views menu (`ViewSelectorMenu`, as the Files table has), beside the search. */\n views?: ReactNode\n labels?: Partial<DatabaseToolbarLabels>\n}\n\nconst SPREADSHEET_ACCEPT =\n '.csv,.xlsx,text/csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n\nexport function DatabaseToolbar({\n name,\n description,\n total,\n shown,\n search,\n onSearchChange,\n onBack,\n onRename,\n selectedCount = 0,\n onDeleteSelected,\n onImportRows,\n onExport,\n onDeleteDatabase,\n readOnly = false,\n views,\n labels,\n}: DatabaseToolbarProps) {\n const l = { ...DEFAULT_DATABASE_TOOLBAR_LABELS, ...labels }\n const [title, setTitle] = useState(name)\n const fileInput = useRef<HTMLInputElement>(null)\n useEffect(() => setTitle(name), [name])\n\n const commitTitle = () => {\n const next = title.trim()\n if (next && next !== name) onRename?.(next)\n else setTitle(name)\n }\n const onTitleKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') e.currentTarget.blur()\n if (e.key === 'Escape') {\n setTitle(name)\n e.currentTarget.blur()\n }\n }\n const onFile = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) onImportRows?.(file)\n e.target.value = ''\n }\n\n const canRename = !readOnly && Boolean(onRename)\n const hasMenu = Boolean(onExport || (!readOnly && (onImportRows || onDeleteDatabase)))\n\n return (\n <div className=\"flex flex-col gap-2 px-2 pb-2 pt-1\" data-testid=\"database-toolbar\">\n <div className=\"flex min-w-0 items-center gap-2\">\n {onBack && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onBack}\n aria-label={l.back}\n title={l.back}\n data-testid=\"database-back\"\n >\n <ArrowLeft className=\"size-4\" />\n </Button>\n )}\n <FileSpreadsheet className=\"size-5 shrink-0 text-muted-foreground\" aria-hidden />\n {canRename ? (\n <input\n value={title}\n aria-label={l.rename}\n maxLength={200}\n onChange={(e) => setTitle(e.target.value)}\n onBlur={commitTitle}\n onKeyDown={onTitleKey}\n data-testid=\"database-title\"\n className=\"min-w-0 flex-1 truncate rounded-md bg-transparent px-1 text-xl font-semibold outline-none hover:bg-muted/60 focus:bg-muted/60\"\n />\n ) : (\n <h2\n className=\"min-w-0 flex-1 truncate px-1 text-xl font-semibold\"\n data-testid=\"database-title\"\n >\n {name}\n </h2>\n )}\n <span className=\"shrink-0 text-sm text-muted-foreground\" data-testid=\"database-row-count\">\n {shown !== undefined && shown < total ? l.showing(shown, total) : l.rows(total)}\n </span>\n </div>\n {description && <p className=\"px-1 text-sm text-muted-foreground\">{description}</p>}\n {readOnly && (\n <p\n className=\"flex items-center gap-1.5 rounded-md bg-muted px-2 py-1 text-xs text-muted-foreground\"\n data-testid=\"database-read-only\"\n >\n <Eye className=\"size-3.5\" />\n {l.readOnly}\n </p>\n )}\n <div className=\"flex items-center gap-2\">\n <div className=\"relative max-w-sm flex-1\">\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) => onSearchChange(e.target.value)}\n placeholder={l.search}\n aria-label={l.search}\n className=\"h-8 pl-8\"\n data-testid=\"database-search\"\n />\n </div>\n <span className=\"flex-1\" />\n {views}\n {!readOnly && selectedCount > 0 && onDeleteSelected && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onDeleteSelected}\n className=\"gap-1.5 text-red-text\"\n data-testid=\"database-delete-rows\"\n >\n <Trash2 className=\"size-4\" />\n {l.deleteSelected(selectedCount)}\n </Button>\n )}\n {hasMenu && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"icon\"\n aria-label={l.more}\n title={l.more}\n data-testid=\"database-menu\"\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-64\">\n {!readOnly && onImportRows && (\n <DropdownMenuItem\n onSelect={() => fileInput.current?.click()}\n data-testid=\"database-import-rows\"\n >\n <Upload className=\"size-4\" />\n {l.importRows}\n </DropdownMenuItem>\n )}\n {onExport && (\n <>\n <DropdownMenuItem\n onSelect={() => onExport('xlsx')}\n data-testid=\"database-export-xlsx\"\n >\n <Download className=\"size-4\" />\n {l.exportXlsx}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => onExport('csv')}\n data-testid=\"database-export-csv\"\n >\n <Download className=\"size-4\" />\n {l.exportCsv}\n </DropdownMenuItem>\n </>\n )}\n {!readOnly && onDeleteDatabase && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={onDeleteDatabase}\n className=\"text-red-text\"\n data-testid=\"database-delete\"\n >\n <Trash2 className=\"size-4\" />\n {l.deleteDatabase}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n <input\n ref={fileInput}\n type=\"file\"\n accept={SPREADSHEET_ACCEPT}\n className=\"hidden\"\n onChange={onFile}\n data-testid=\"database-import-rows-input\"\n />\n </div>\n </div>\n )\n}\n","/**\n * DatabaseColumnDialog: add a column, or change one (rename, edit a select's options, delete).\n *\n * A column's type is chosen when it is added and fixed after (the server keeps every stored cell\n * valid for its column's type), so editing shows the type but does not offer to change it.\n *\n * A relation column links rows to rows of another database of the workspace (or this one), picked\n * when it is added; it can also add a paired column to that database that shows the links back.\n * Lookup and rollup columns read through a relation column: a column of the related rows, or a\n * count / sum / average / min / max over them. Their settings can be changed after they are added.\n */\nimport { useEffect, useState, type FormEvent, type KeyboardEvent } from 'react'\nimport { Trash2, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@arbidocs/react/ui'\nimport { COLUMN_TYPE_ICONS } from './databaseColumns'\nimport { SelectChip } from './SelectChip'\nimport {\n DATABASE_COLUMN_TYPES,\n DEFAULT_DATABASE_COLUMN_TYPE_LABELS,\n type DatabaseColumnType,\n type DatabaseColumnTypeLabels,\n type DatabaseColumnView,\n type DatabaseRollupOp,\n type DatabaseSummaryView,\n} from './column-types'\nimport {\n DEFAULT_COLUMN_CONFIG_LABELS,\n LookupFields,\n RelationFields,\n RollupFields,\n type ColumnConfigLabels,\n type LookupDraft,\n type RelationDraft,\n type RollupDraft,\n} from './ColumnConfigFields'\n\nexport interface DatabaseColumnDialogLabels {\n addTitle: string\n editTitle: string\n addDescription: string\n editDescription: string\n name: string\n namePlaceholder: string\n type: string\n typeFixed: string\n options: string\n optionPlaceholder: string\n addOption: string\n removeOption: (option: string) => string\n needsOptions: string\n cancel: string\n add: string\n save: string\n saving: string\n delete: string\n confirmDelete: string\n}\n\nexport const DEFAULT_DATABASE_COLUMN_DIALOG_LABELS: DatabaseColumnDialogLabels = {\n addTitle: 'Add a column',\n editTitle: 'Column settings',\n addDescription: 'Pick what the column holds; every cell in it is checked against its type.',\n editDescription: 'Rename the column or change its options.',\n name: 'Name',\n namePlaceholder: 'e.g. Client, Reference, Fee',\n type: 'Type',\n typeFixed: 'A column’s type can’t be changed once it has been added.',\n options: 'Options',\n optionPlaceholder: 'Add an option and press Enter',\n addOption: 'Add',\n removeOption: (option) => `Remove ${option}`,\n needsOptions: 'A select column needs at least one option.',\n cancel: 'Cancel',\n add: 'Add column',\n save: 'Save',\n saving: 'Saving…',\n delete: 'Delete column',\n confirmDelete: 'Delete this column and every value in it?',\n}\n\nexport interface DatabaseColumnDraft {\n name: string\n type: DatabaseColumnType\n options: string[] | null\n /** A new relation column's target (and paired column). Absent when editing: it cannot change. */\n relation?: { database_id: string; two_way: boolean; pair_name?: string | null } | null\n lookup?: { relation: string; column: string } | null\n rollup?: { relation: string; column?: string | null; op: DatabaseRollupOp } | null\n}\n\nexport interface DatabaseColumnDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The column being edited; omit to add one. */\n column?: DatabaseColumnView | null\n /** The database the column belongs to (relations to it are marked \"this database\"). */\n databaseId?: string\n /** Its name: the default name of a two-way relation's paired column. */\n databaseName?: string\n /** Its columns: lookups and rollups read through one of its relation columns. */\n columns?: DatabaseColumnView[]\n /** The databases a relation can link to (this workspace's), with their columns. */\n databases?: DatabaseSummaryView[]\n onSave: (draft: DatabaseColumnDraft) => void\n /** Delete the column (editing only). */\n onDelete?: () => void\n isSaving?: boolean\n /** The server's reason the last save failed. */\n error?: string | null\n labels?: Partial<DatabaseColumnDialogLabels>\n typeLabels?: Partial<DatabaseColumnTypeLabels>\n configLabels?: Partial<ColumnConfigLabels>\n}\n\nconst NO_RELATION: RelationDraft = { database_id: '', two_way: false, pair_name: '' }\nconst NO_LOOKUP: LookupDraft = { relation: '', column: '' }\nconst NO_ROLLUP: RollupDraft = { relation: '', column: '', op: 'count' }\nconst NO_COLUMNS: DatabaseColumnView[] = []\nconst NO_DATABASES: DatabaseSummaryView[] = []\n\n/** Whether a column of this type has everything it needs to be saved. */\nfunction configComplete(\n type: DatabaseColumnType,\n editing: boolean,\n relation: RelationDraft,\n lookup: LookupDraft,\n rollup: RollupDraft\n): boolean {\n if (type === 'relation') return editing || Boolean(relation.database_id)\n if (type === 'lookup') return Boolean(lookup.relation && lookup.column)\n if (type === 'rollup') return Boolean(rollup.relation && (rollup.op === 'count' || rollup.column))\n return true\n}\n\nexport function DatabaseColumnDialog({\n open,\n onOpenChange,\n column,\n databaseId,\n databaseName,\n columns = NO_COLUMNS,\n databases = NO_DATABASES,\n onSave,\n onDelete,\n isSaving = false,\n error,\n labels,\n typeLabels,\n configLabels,\n}: DatabaseColumnDialogProps) {\n const l = { ...DEFAULT_DATABASE_COLUMN_DIALOG_LABELS, ...labels }\n const tl = { ...DEFAULT_DATABASE_COLUMN_TYPE_LABELS, ...typeLabels }\n const cl = { ...DEFAULT_COLUMN_CONFIG_LABELS, ...configLabels }\n const editing = Boolean(column)\n const [name, setName] = useState('')\n const [type, setType] = useState<DatabaseColumnType>('text')\n const [options, setOptions] = useState<string[]>([])\n const [optionDraft, setOptionDraft] = useState('')\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const [relation, setRelation] = useState<RelationDraft>(NO_RELATION)\n const [lookup, setLookup] = useState<LookupDraft>(NO_LOOKUP)\n const [rollup, setRollup] = useState<RollupDraft>(NO_ROLLUP)\n\n useEffect(() => {\n if (!open) return\n setName(column?.name ?? '')\n setType(column?.type ?? 'text')\n setOptions(column?.options ?? [])\n setOptionDraft('')\n setConfirmingDelete(false)\n setRelation(NO_RELATION)\n setLookup(column?.lookup ? { ...column.lookup } : NO_LOOKUP)\n setRollup(\n column?.rollup\n ? {\n relation: column.rollup.relation,\n column: column.rollup.column ?? '',\n op: column.rollup.op ?? 'count',\n }\n : NO_ROLLUP\n )\n }, [open, column])\n\n const addOption = () => {\n const option = optionDraft.trim()\n if (option && !options.some((o) => o.toLowerCase() === option.toLowerCase())) {\n setOptions([...options, option])\n }\n setOptionDraft('')\n }\n\n const pendingOptions = optionDraft.trim() ? [...options, optionDraft.trim()] : options\n const missingOptions = type === 'select' && pendingOptions.length === 0\n const canSave =\n name.trim().length > 0 &&\n !missingOptions &&\n configComplete(type, editing, relation, lookup, rollup) &&\n !isSaving\n\n const submit = (e: FormEvent) => {\n e.preventDefault()\n if (!canSave) return\n const draft: DatabaseColumnDraft = {\n name: name.trim(),\n type,\n options: type === 'select' ? Array.from(new Set(pendingOptions)) : null,\n }\n if (type === 'relation' && !editing)\n draft.relation = {\n database_id: relation.database_id,\n two_way: relation.two_way,\n pair_name: relation.two_way ? relation.pair_name.trim() || null : null,\n }\n if (type === 'lookup') draft.lookup = { ...lookup }\n if (type === 'rollup')\n draft.rollup = {\n relation: rollup.relation,\n op: rollup.op,\n column: rollup.op === 'count' ? null : rollup.column,\n }\n onSave(draft)\n }\n\n const onOptionKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addOption()\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"database-column-dialog\">\n <form onSubmit={submit} className=\"flex flex-col gap-4\">\n <DialogHeader>\n <DialogTitle>{editing ? l.editTitle : l.addTitle}</DialogTitle>\n <DialogDescription>{editing ? l.editDescription : l.addDescription}</DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"database-column-name\">{l.name}</Label>\n <Input\n id=\"database-column-name\"\n autoFocus\n value={name}\n maxLength={200}\n placeholder={l.namePlaceholder}\n onChange={(e) => setName(e.target.value)}\n data-testid=\"database-column-name\"\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label>{l.type}</Label>\n <Select\n value={type}\n onValueChange={(v) => setType(v as DatabaseColumnType)}\n disabled={editing}\n >\n <SelectTrigger data-testid=\"database-column-type\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {DATABASE_COLUMN_TYPES.map((t) => {\n const Icon = COLUMN_TYPE_ICONS[t]\n return (\n <SelectItem key={t} value={t} data-testid={`database-column-type-${t}`}>\n <span className=\"flex items-center gap-2\">\n <Icon className=\"size-4 text-muted-foreground\" />\n {tl[t]}\n </span>\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n {editing && <p className=\"text-xs text-muted-foreground\">{l.typeFixed}</p>}\n </div>\n\n {type === 'select' && (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"database-column-option\">{l.options}</Label>\n {options.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\" data-testid=\"database-column-options\">\n {options.map((option) => (\n <span key={option} className=\"inline-flex items-center gap-0.5\">\n <SelectChip value={option} />\n <button\n type=\"button\"\n aria-label={l.removeOption(option)}\n onClick={() => setOptions(options.filter((o) => o !== option))}\n className=\"rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <X className=\"size-3\" />\n </button>\n </span>\n ))}\n </div>\n )}\n <div className=\"flex gap-2\">\n <Input\n id=\"database-column-option\"\n value={optionDraft}\n maxLength={200}\n placeholder={l.optionPlaceholder}\n onChange={(e) => setOptionDraft(e.target.value)}\n onKeyDown={onOptionKey}\n data-testid=\"database-column-option-input\"\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={addOption}\n disabled={!optionDraft.trim()}\n >\n {l.addOption}\n </Button>\n </div>\n {missingOptions && <p className=\"text-xs text-muted-foreground\">{l.needsOptions}</p>}\n </div>\n )}\n\n {type === 'relation' && (\n <RelationFields\n draft={relation}\n onChange={setRelation}\n databases={databases}\n databaseId={databaseId}\n databaseName={databaseName}\n editing={editing}\n column={column}\n labels={cl}\n />\n )}\n {type === 'lookup' && (\n <LookupFields\n draft={lookup}\n onChange={setLookup}\n columns={columns}\n databases={databases}\n databaseId={databaseId}\n labels={cl}\n />\n )}\n {type === 'rollup' && (\n <RollupFields\n draft={rollup}\n onChange={setRollup}\n columns={columns}\n databases={databases}\n databaseId={databaseId}\n labels={cl}\n />\n )}\n\n {error && (\n <p role=\"alert\" className=\"text-sm text-red-text\" data-testid=\"database-column-error\">\n {error}\n </p>\n )}\n\n <DialogFooter className=\"flex-row items-center gap-2 sm:justify-between\">\n {editing && onDelete ? (\n confirmingDelete ? (\n <span className=\"flex items-center gap-2 text-sm\">\n <span className=\"text-muted-foreground\">{l.confirmDelete}</span>\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={onDelete}\n data-testid=\"database-column-delete-confirm\"\n >\n {l.delete}\n </Button>\n </span>\n ) : (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setConfirmingDelete(true)}\n className=\"gap-1.5 text-red-text\"\n data-testid=\"database-column-delete\"\n >\n <Trash2 className=\"size-4\" />\n {l.delete}\n </Button>\n )\n ) : (\n <span />\n )}\n <span className=\"flex gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n {l.cancel}\n </Button>\n <Button type=\"submit\" disabled={!canSave} data-testid=\"database-column-save\">\n {isSaving ? l.saving : editing ? l.save : l.add}\n </Button>\n </span>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * DatabaseList: the databases a workspace can use, as cards. The workspace's own databases come\n * first; databases of public workspaces (a firm-wide client database, a precedent database) follow,\n * marked read-only here. New database and Import spreadsheet are the page's two ways in.\n */\nimport { useRef, type ChangeEvent } from 'react'\nimport { Eye, FileSpreadsheet, Plus, Upload } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { COLUMN_TYPE_ICONS } from './databaseColumns'\nimport type { DatabaseSummaryView } from './column-types'\n\nexport interface DatabaseListLabels {\n title: string\n subtitle: string\n newDatabase: string\n importSpreadsheet: string\n importing: string\n ownGroup: string\n sharedGroup: string\n readOnly: string\n rows: (count: number) => string\n columns: (count: number) => string\n emptyTitle: string\n emptyMessage: string\n loading: string\n}\n\nexport const DEFAULT_DATABASE_LIST_LABELS: DatabaseListLabels = {\n title: 'Databases',\n subtitle: 'Tables your team keeps and searches — a client database, billing records, precedents.',\n newDatabase: 'New database',\n importSpreadsheet: 'Import spreadsheet',\n importing: 'Importing…',\n ownGroup: 'In this workspace',\n sharedGroup: 'Shared with everyone',\n readOnly: 'Read-only',\n rows: (n) => `${n.toLocaleString()} row${n === 1 ? '' : 's'}`,\n columns: (n) => `${n} column${n === 1 ? '' : 's'}`,\n emptyTitle: 'No databases yet',\n emptyMessage:\n 'Start from a blank table, or import a spreadsheet (.xlsx or .csv) — its columns and their types come with it.',\n loading: 'Loading databases…',\n}\n\nexport interface DatabaseListProps {\n databases: DatabaseSummaryView[]\n onOpen: (database: DatabaseSummaryView) => void\n onNew?: () => void\n /** Create a database from a .csv / .xlsx file. */\n onImport?: (file: File) => void\n isImporting?: boolean\n isLoading?: boolean\n labels?: Partial<DatabaseListLabels>\n}\n\nconst SPREADSHEET_ACCEPT =\n '.csv,.xlsx,text/csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n\nfunction DatabaseCard({\n database,\n onOpen,\n l,\n}: {\n database: DatabaseSummaryView\n onOpen: () => void\n l: DatabaseListLabels\n}) {\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n data-testid={`database-card-${database.id}`}\n className={cn(\n 'flex min-h-32 flex-col gap-2 rounded-lg border border-border bg-background p-4 text-left transition-colors',\n 'hover:border-primary/40 hover:bg-muted/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring'\n )}\n >\n <span className=\"flex w-full items-start gap-2\">\n <FileSpreadsheet className=\"mt-0.5 size-5 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate font-medium\">{database.name}</span>\n {!database.editable && (\n <span className=\"inline-flex shrink-0 items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[11px] text-muted-foreground\">\n <Eye className=\"size-3\" />\n {l.readOnly}\n </span>\n )}\n </span>\n {database.description && (\n <span className=\"line-clamp-2 text-sm text-muted-foreground\">{database.description}</span>\n )}\n <span className=\"mt-auto flex w-full items-center gap-3 text-xs text-muted-foreground\">\n <span>{l.rows(database.row_count)}</span>\n <span>{l.columns(database.columns.length)}</span>\n <span className=\"ml-auto flex items-center gap-1\" aria-hidden>\n {database.columns.slice(0, 6).map((c) => {\n const Icon = COLUMN_TYPE_ICONS[c.type]\n return <Icon key={c.id} className=\"size-3.5\" />\n })}\n </span>\n </span>\n </button>\n )\n}\n\nexport function DatabaseList({\n databases,\n onOpen,\n onNew,\n onImport,\n isImporting = false,\n isLoading = false,\n labels,\n}: DatabaseListProps) {\n const l = { ...DEFAULT_DATABASE_LIST_LABELS, ...labels }\n const fileInput = useRef<HTMLInputElement>(null)\n const own = databases.filter((d) => d.editable)\n const shared = databases.filter((d) => !d.editable)\n\n const onFile = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) onImport?.(file)\n e.target.value = ''\n }\n\n const actions = (\n <span className=\"flex gap-2\">\n {onImport && (\n <Button\n variant=\"outline\"\n onClick={() => fileInput.current?.click()}\n disabled={isImporting}\n className=\"gap-1.5\"\n data-testid=\"database-import\"\n >\n <Upload className=\"size-4\" />\n {isImporting ? l.importing : l.importSpreadsheet}\n </Button>\n )}\n {onNew && (\n <Button onClick={onNew} className=\"gap-1.5\" data-testid=\"database-new\">\n <Plus className=\"size-4\" />\n {l.newDatabase}\n </Button>\n )}\n </span>\n )\n\n const grid = (items: DatabaseSummaryView[]) => (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {items.map((d) => (\n <DatabaseCard key={d.id} database={d} onOpen={() => onOpen(d)} l={l} />\n ))}\n </div>\n )\n\n return (\n <div className=\"flex flex-col gap-6 p-2 sm:p-4\" data-testid=\"database-list\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{l.title}</h1>\n <p className=\"text-sm text-muted-foreground\">{l.subtitle}</p>\n </div>\n {actions}\n </div>\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\">{l.loading}</p>\n ) : databases.length === 0 ? (\n <div\n className=\"flex flex-col items-center gap-2 rounded-lg border border-dashed border-border px-6 py-12 text-center\"\n data-testid=\"database-list-empty\"\n >\n <FileSpreadsheet className=\"size-8 text-muted-foreground\" />\n <h3 className=\"text-lg font-medium\">{l.emptyTitle}</h3>\n <p className=\"max-w-md text-sm text-muted-foreground\">{l.emptyMessage}</p>\n </div>\n ) : (\n <>\n {own.length > 0 && (\n <section className=\"flex flex-col gap-2\">\n {shared.length > 0 && (\n <h2 className=\"text-sm font-medium text-muted-foreground\">{l.ownGroup}</h2>\n )}\n {grid(own)}\n </section>\n )}\n {shared.length > 0 && (\n <section className=\"flex flex-col gap-2\" data-testid=\"database-list-shared\">\n <h2 className=\"text-sm font-medium text-muted-foreground\">{l.sharedGroup}</h2>\n {grid(shared)}\n </section>\n )}\n </>\n )}\n <input\n ref={fileInput}\n type=\"file\"\n accept={SPREADSHEET_ACCEPT}\n className=\"hidden\"\n onChange={onFile}\n data-testid=\"database-import-input\"\n />\n </div>\n )\n}\n","/**\n * NewDatabaseDialog: name a new, blank database. It starts with one text column (a table with no\n * columns has nothing to type into); more are added from the table's \"+\" header.\n */\nimport { useEffect, useState, type FormEvent } from 'react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n Textarea,\n} from '@arbidocs/react/ui'\n\nexport interface NewDatabaseDialogLabels {\n title: string\n description: string\n name: string\n namePlaceholder: string\n about: string\n aboutPlaceholder: string\n cancel: string\n create: string\n creating: string\n}\n\nexport const DEFAULT_NEW_DATABASE_DIALOG_LABELS: NewDatabaseDialogLabels = {\n title: 'New database',\n description: 'A table your workspace keeps: add columns of the kinds you need, then rows.',\n name: 'Name',\n namePlaceholder: 'e.g. Client database',\n about: 'Description',\n aboutPlaceholder: 'Optional: what it holds and who keeps it',\n cancel: 'Cancel',\n create: 'Create',\n creating: 'Creating…',\n}\n\nexport interface NewDatabaseDraft {\n name: string\n description: string | null\n}\n\nexport interface NewDatabaseDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n onCreate: (draft: NewDatabaseDraft) => void\n isCreating?: boolean\n error?: string | null\n labels?: Partial<NewDatabaseDialogLabels>\n}\n\nexport function NewDatabaseDialog({\n open,\n onOpenChange,\n onCreate,\n isCreating = false,\n error,\n labels,\n}: NewDatabaseDialogProps) {\n const l = { ...DEFAULT_NEW_DATABASE_DIALOG_LABELS, ...labels }\n const [name, setName] = useState('')\n const [about, setAbout] = useState('')\n useEffect(() => {\n if (open) {\n setName('')\n setAbout('')\n }\n }, [open])\n\n const submit = (e: FormEvent) => {\n e.preventDefault()\n if (!name.trim() || isCreating) return\n onCreate({ name: name.trim(), description: about.trim() || null })\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"new-database-dialog\">\n <form onSubmit={submit} className=\"flex flex-col gap-4\">\n <DialogHeader>\n <DialogTitle>{l.title}</DialogTitle>\n <DialogDescription>{l.description}</DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"new-database-name\">{l.name}</Label>\n <Input\n id=\"new-database-name\"\n autoFocus\n value={name}\n maxLength={200}\n placeholder={l.namePlaceholder}\n onChange={(e) => setName(e.target.value)}\n data-testid=\"new-database-name\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"new-database-about\">{l.about}</Label>\n <Textarea\n id=\"new-database-about\"\n value={about}\n maxLength={2000}\n rows={2}\n placeholder={l.aboutPlaceholder}\n onChange={(e) => setAbout(e.target.value)}\n data-testid=\"new-database-description\"\n />\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-red-text\">\n {error}\n </p>\n )}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n {l.cancel}\n </Button>\n <Button\n type=\"submit\"\n disabled={!name.trim() || isCreating}\n data-testid=\"new-database-create\"\n >\n {isCreating ? l.creating : l.create}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n"]}