@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.141

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 (220) hide show
  1. package/lib/features/agent-chat/NativeAgentChat.js +21 -4
  2. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  3. package/lib/features/chat/ApprovalCard.js +353 -0
  4. package/lib/features/chat/ApprovalCard.js.map +1 -0
  5. package/lib/features/chat/AskUserCard.js +9 -2
  6. package/lib/features/chat/AskUserCard.js.map +1 -1
  7. package/lib/features/chat/askUser.js +25 -3
  8. package/lib/features/chat/askUser.js.map +1 -1
  9. package/lib/features/chat/queuedFollowUpRows.js +13 -0
  10. package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
  11. package/lib/features/devices/bodyComposition.js +116 -0
  12. package/lib/features/devices/bodyComposition.js.map +1 -0
  13. package/lib/features/devices/readings.js.map +1 -1
  14. package/lib/features/devices/session.js +22 -2
  15. package/lib/features/devices/session.js.map +1 -1
  16. package/lib/features/discover/DiscoverArticle.js +105 -92
  17. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  18. package/lib/features/discover/DiscoverFeed.js +97 -48
  19. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  20. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  21. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  22. package/lib/features/discover/DiscoverSidebar.js +555 -0
  23. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  24. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  25. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  26. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  27. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  28. package/lib/features/discover/followUpQuery.js +42 -0
  29. package/lib/features/discover/followUpQuery.js.map +1 -0
  30. package/lib/features/discover/markets.js +37 -0
  31. package/lib/features/discover/markets.js.map +1 -0
  32. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  33. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  34. package/lib/features/discover/weather.js +42 -0
  35. package/lib/features/discover/weather.js.map +1 -0
  36. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  37. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  38. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  39. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  40. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  41. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  42. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  43. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  44. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  45. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  46. package/lib/features/notion/NotionBlockSheets.js +206 -0
  47. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  48. package/lib/features/notion/NotionBlockView.js +36 -0
  49. package/lib/features/notion/NotionBlockView.js.map +1 -0
  50. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  51. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  52. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  53. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  54. package/lib/features/notion/NotionHistorySheet.js +439 -0
  55. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  56. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  57. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  58. package/lib/features/notion/NotionMentionSheet.js +279 -0
  59. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  60. package/lib/features/notion/NotionPageMenu.js +585 -0
  61. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  62. package/lib/features/notion/NotionPageTree.js +220 -0
  63. package/lib/features/notion/NotionPageTree.js.map +1 -0
  64. package/lib/features/notion/NotionPageView.js +1253 -152
  65. package/lib/features/notion/NotionPageView.js.map +1 -1
  66. package/lib/features/notion/NotionShareSheet.js +606 -0
  67. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  68. package/lib/features/notion/NotionSheets.js +87 -15
  69. package/lib/features/notion/NotionSheets.js.map +1 -1
  70. package/lib/features/notion/NotionSidebarSections.js +492 -0
  71. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  72. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  73. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  74. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  75. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  76. package/lib/features/notion/database/DatabaseCells.js +554 -0
  77. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  78. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  79. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  80. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  81. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  82. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  83. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  84. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  85. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  86. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  87. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  88. package/lib/features/notion/database/chartData.js +89 -0
  89. package/lib/features/notion/database/chartData.js.map +1 -0
  90. package/lib/features/notion/database/chartView.js +112 -0
  91. package/lib/features/notion/database/chartView.js.map +1 -0
  92. package/lib/features/notion/database/connectorButton.js +33 -0
  93. package/lib/features/notion/database/connectorButton.js.map +1 -0
  94. package/lib/features/notion/database/databaseCalc.js +208 -0
  95. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  96. package/lib/features/notion/database/databaseCalendar.js +157 -0
  97. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  98. package/lib/features/notion/database/databaseCsv.js +98 -0
  99. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  100. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  101. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  102. package/lib/features/notion/database/databaseFilter.js +473 -0
  103. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  104. package/lib/features/notion/database/databaseFormula.js +1072 -0
  105. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  106. package/lib/features/notion/database/databaseGroup.js +151 -0
  107. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  108. package/lib/features/notion/database/databaseRollup.js +58 -0
  109. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  110. package/lib/features/notion/database/databaseTimeline.js +156 -0
  111. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  112. package/lib/features/notion/database/databaseView.js +1188 -0
  113. package/lib/features/notion/database/databaseView.js.map +1 -0
  114. package/lib/features/notion/database/databaseViews.js +310 -0
  115. package/lib/features/notion/database/databaseViews.js.map +1 -0
  116. package/lib/features/notion/database/relationSource.js +92 -0
  117. package/lib/features/notion/database/relationSource.js.map +1 -0
  118. package/lib/features/notion/database/uniqueId.js +17 -0
  119. package/lib/features/notion/database/uniqueId.js.map +1 -0
  120. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  121. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  122. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  123. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  124. package/lib/features/notion/notionCodeLanguages.js +112 -0
  125. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  126. package/lib/features/notion/notionComments.js +86 -0
  127. package/lib/features/notion/notionComments.js.map +1 -0
  128. package/lib/features/notion/notionConnections.js +74 -0
  129. package/lib/features/notion/notionConnections.js.map +1 -0
  130. package/lib/features/notion/notionDocuments.js +453 -1
  131. package/lib/features/notion/notionDocuments.js.map +1 -1
  132. package/lib/features/notion/notionEditorModel.js +142 -7
  133. package/lib/features/notion/notionEditorModel.js.map +1 -1
  134. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  135. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  136. package/lib/features/notion/notionMedia.js +119 -0
  137. package/lib/features/notion/notionMedia.js.map +1 -0
  138. package/lib/features/notion/notionMentionDate.js +32 -0
  139. package/lib/features/notion/notionMentionDate.js.map +1 -0
  140. package/lib/features/notion/notionMentionOptions.js +162 -0
  141. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  142. package/lib/features/notion/notionNotesAgent.js +445 -0
  143. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  144. package/lib/features/notion/notionPageAccess.js +168 -0
  145. package/lib/features/notion/notionPageAccess.js.map +1 -0
  146. package/lib/features/notion/notionPageActions.js +138 -0
  147. package/lib/features/notion/notionPageActions.js.map +1 -0
  148. package/lib/features/notion/notionPageHistory.js +154 -0
  149. package/lib/features/notion/notionPageHistory.js.map +1 -0
  150. package/lib/features/notion/notionPageKinds.js +200 -0
  151. package/lib/features/notion/notionPageKinds.js.map +1 -0
  152. package/lib/features/notion/notionRecents.js +48 -0
  153. package/lib/features/notion/notionRecents.js.map +1 -0
  154. package/lib/features/notion/notionRichText.js +177 -0
  155. package/lib/features/notion/notionRichText.js.map +1 -0
  156. package/lib/features/notion/notionRichTitle.js +336 -0
  157. package/lib/features/notion/notionRichTitle.js.map +1 -0
  158. package/lib/features/notion/useNotionWorkspace.js +272 -13
  159. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  160. package/lib/features/notion/usePageActions.js +155 -0
  161. package/lib/features/notion/usePageActions.js.map +1 -0
  162. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  163. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  164. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  165. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  166. package/lib/features/study/StudyAgentChatPane.js +1 -1
  167. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  168. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  169. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  170. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  171. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  172. package/lib/features/webbuilder/buildFragments.js +1 -1
  173. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  174. package/lib/features/webbuilder/codeFiles.js +302 -0
  175. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  176. package/lib/features/webbuilder/codeHighlight.js +209 -0
  177. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  178. package/lib/features/webbuilder/components/CodeView.js +682 -52
  179. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  180. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  181. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  182. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  183. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  184. package/lib/features/webbuilder/stepLabels.js +68 -0
  185. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  186. package/lib/hooks/useHostChatSteering.js +45 -0
  187. package/lib/hooks/useHostChatSteering.js.map +1 -0
  188. package/lib/screens/Chat/index.js +2 -12
  189. package/lib/screens/Chat/index.js.map +1 -1
  190. package/lib/screens/Devices/index.js +205 -3
  191. package/lib/screens/Devices/index.js.map +1 -1
  192. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  193. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  194. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  195. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  196. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  197. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  198. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  199. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  200. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  201. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  202. package/lib/screens/NotionPage/index.js +2 -2
  203. package/lib/screens/NotionPage/index.js.map +1 -1
  204. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  205. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  206. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  207. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  208. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  209. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  210. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  211. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  212. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  213. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  214. package/lib/screens/WebBuilderNative/index.js +1 -1
  215. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  216. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  217. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  218. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  219. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  220. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseView.js","sources":["../../../../src/features/notion/database/databaseView.ts"],"sourcesContent":["/**\n * databaseView — pure helpers for the database table/board views.\n *\n * Everything here is framework-free so it can be unit tested: value normalisation and display\n * text per property type, editor-string <-> stored-value conversion, type-aware sorting,\n * filtering, board grouping and schema (property) edits.\n *\n * Stored value shapes (row.properties[propName]):\n * title rich-text array `[{ text: { content }, plainText }]` (a plain string is tolerated)\n * text string (a rich-text array is tolerated and preserved on write)\n * number number | null\n * select `{ name }` | null (a plain string is tolerated)\n * status `{ name }` | null — like select; each schema option belongs to a group\n * (`options[i].group`: 'todo' | 'in_progress' | 'complete')\n * multi_select `[{ name }]` (plain strings tolerated)\n * date ISO string (`YYYY-MM-DD` or full ISO) or `{ start, end? }` (a date range; a\n * plain string / `{ start }` without `end` is a single date)\n * checkbox boolean\n * url / email / phone string\n * person `[{ name }]` free-text names (single-user app: no member directory; strings tolerated);\n * entries may also carry `{ id?, name, avatarUrl? }` (kept on edit)\n * files `[{ name, url }]` external links (strings tolerated)\n * relation `[{ id }]` row ids in the target database (`schema[prop].databaseId`; strings tolerated)\n *\n * Computed (read-only, never stored on the row):\n * created_time / last_edited_time the row block's `createdTime` / `lastEditedTime`\n * formula `schema[prop].expression`, evaluated by utils/databaseFormula.ts\n */\n\nimport { buttonCellText, type ButtonColumnDef } from './connectorButton';\nimport { toneChipClass } from './notionTones';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type PropertyType =\n | 'title'\n | 'text'\n | 'number'\n | 'select'\n | 'status'\n | 'multi_select'\n | 'date'\n | 'checkbox'\n | 'url'\n | 'email'\n | 'phone'\n | 'person'\n | 'files'\n | 'relation'\n | 'formula'\n | 'connector'\n | 'button'\n | 'created_time'\n | 'last_edited_time'\n | 'created_by'\n | 'last_edited_by'\n | 'unique_id'\n | 'rollup';\n\nexport const PROPERTY_TYPES: Array<{ type: PropertyType; label: string }> = [\n { type: 'text', label: 'Text' },\n { type: 'number', label: 'Number' },\n { type: 'select', label: 'Select' },\n { type: 'status', label: 'Status' },\n { type: 'multi_select', label: 'Multi-select' },\n { type: 'date', label: 'Date' },\n { type: 'checkbox', label: 'Checkbox' },\n { type: 'url', label: 'URL' },\n { type: 'email', label: 'Email' },\n { type: 'phone', label: 'Phone' },\n { type: 'person', label: 'Person' },\n { type: 'files', label: 'Files & media' },\n { type: 'relation', label: 'Relation' },\n { type: 'formula', label: 'Formula' },\n { type: 'connector', label: 'Connector' },\n { type: 'button', label: 'Button' },\n { type: 'created_time', label: 'Created time' },\n { type: 'last_edited_time', label: 'Last edited time' },\n { type: 'created_by', label: 'Created by' },\n { type: 'last_edited_by', label: 'Last edited by' },\n { type: 'unique_id', label: 'ID' },\n { type: 'rollup', label: 'Rollup' },\n];\n\n/**\n * Types whose value is derived (row metadata / formula / connector) — never edited by the user.\n * (A connector property is written per row, but only by its refresh engine: see\n * utils/connectorProperty.ts.)\n */\nexport const COMPUTED_TYPES: ReadonlySet<string> = new Set([\n 'formula',\n 'connector',\n // A button cell holds the row's last run, written only when the button runs.\n 'button',\n 'created_time',\n 'last_edited_time',\n 'created_by',\n 'last_edited_by',\n // Assigned by the app (create / duplicate / backfill), never typed.\n 'unique_id',\n // Aggregated from related rows (utils/databaseRollup).\n 'rollup',\n]);\n\nexport function isComputedType(type: string): boolean {\n return COMPUTED_TYPES.has(type);\n}\n\n/** Types that read like a date (filters, calendar, sorting). */\nexport function isDateLikeType(type: string): boolean {\n return type === 'date' || type === 'created_time' || type === 'last_edited_time';\n}\n\n/** Types whose value is a list of names (`[{ name }]`). */\nexport function isNameListType(type: string): boolean {\n return type === 'multi_select' || type === 'person';\n}\n\nexport function propertyTypeLabel(type: string): string {\n if (type === 'title') return 'Title';\n return PROPERTY_TYPES.find((t) => t.type === type)?.label ?? 'Text';\n}\n\nexport interface SchemaOption {\n name: string;\n color?: string;\n /** status: the group the option belongs to. */\n group?: StatusGroup;\n}\n\n// ============================================================================\n// STATUS (option groups)\n// ============================================================================\n\nexport type StatusGroup = 'todo' | 'in_progress' | 'complete';\n\nexport const STATUS_GROUPS: Array<{ id: StatusGroup; label: string; color: string }> = [\n { id: 'todo', label: 'To-do', color: 'gray' },\n { id: 'in_progress', label: 'In progress', color: 'blue' },\n { id: 'complete', label: 'Complete', color: 'green' },\n];\n\n/** Options of a new Status property (Notion's defaults). */\nexport const DEFAULT_STATUS_OPTIONS: SchemaOption[] = [\n { name: 'Not started', color: 'gray', group: 'todo' },\n { name: 'In progress', color: 'blue', group: 'in_progress' },\n { name: 'Done', color: 'green', group: 'complete' },\n];\n\nexport function isStatusGroup(value: unknown): value is StatusGroup {\n return value === 'todo' || value === 'in_progress' || value === 'complete';\n}\n\n/** Types whose value is one option name (`{ name }`): select and status. */\nexport function isSingleOptionType(type: string): boolean {\n return type === 'select' || type === 'status';\n}\n\n/** Types with schema options (select, status, multi-select). */\nexport function hasOptions(type: string): boolean {\n return type === 'select' || type === 'status' || type === 'multi_select';\n}\n\n/** Best-guess group for an option name (select → status conversion). */\nexport function guessStatusGroup(name: string): StatusGroup {\n const n = name.toLowerCase();\n if (/(done|complete|merged|shipped|closed|resolved|launched|finished|archived|cancel)/.test(n)) return 'complete';\n if (/(progress|doing|review|testing|active|track|started|blocked|wip|ready)/.test(n) && !/not started/.test(n)) {\n return 'in_progress';\n }\n return 'todo';\n}\n\n/** The group of a status option (unknown / ungrouped options count as to-do). */\nexport function statusGroupOf(options: SchemaOption[] | undefined, name: string | null): StatusGroup {\n const g = options?.find((o) => o.name === name)?.group;\n return isStatusGroup(g) ? g : 'todo';\n}\n\n/** Status options with a group each (missing groups guessed), in group order (stable within a group). */\nexport function normalizeStatusOptions(options: SchemaOption[] | undefined): SchemaOption[] {\n const list = (options ?? []).map((o) => ({\n ...o,\n group: isStatusGroup(o.group) ? o.group : guessStatusGroup(o.name),\n }));\n const rank = (g: StatusGroup) => STATUS_GROUPS.findIndex((x) => x.id === g);\n return list\n .map((o, i) => ({ o, i }))\n .sort((a, b) => rank(a.o.group as StatusGroup) - rank(b.o.group as StatusGroup) || a.i - b.i)\n .map((x) => x.o);\n}\n\n/** Status options grouped (To-do / In progress / Complete), every group present. */\nexport function statusOptionsByGroup(\n options: SchemaOption[] | undefined,\n): Array<{ id: StatusGroup; label: string; options: SchemaOption[] }> {\n const normalized = normalizeStatusOptions(options);\n return STATUS_GROUPS.map((g) => ({\n id: g.id,\n label: g.label,\n options: normalized.filter((o) => o.group === g.id),\n }));\n}\n\nexport interface PropertyDef {\n type: PropertyType | string;\n options?: SchemaOption[];\n [key: string]: unknown;\n}\n\nexport type DatabaseSchema = Record<string, PropertyDef>;\n\nexport type SortDirection = 'ascending' | 'descending';\n\nexport interface SortSpec {\n property: string;\n direction: SortDirection;\n}\n\n/** Sentinel used in select filters for \"rows with no value\". */\nexport const EMPTY_FILTER_VALUE = '__empty__';\n\nexport interface RowFilter {\n /** Case-insensitive text search across every cell's display text. */\n search?: string;\n /** Per select / multi_select property: the accepted option names (OR). Empty list = no filter. */\n selects?: Record<string, string[]>;\n}\n\nexport interface ColumnLike {\n name: string;\n type: string;\n /** relation: at most one related page. */\n relationLimit?: number;\n /** relation (two-way): the paired property on the target database. */\n dualProperty?: string;\n options?: SchemaOption[];\n /** formula: the expression source. */\n expression?: string;\n /** relation: the target database id. */\n databaseId?: string;\n /** connector: the property definition (see utils/connectorProperty.ts `ConnectorPropertyDef`). */\n connector?: ConnectorColumnConfig;\n /** button: the action each row's button runs (utils/connectorButton.ts `ButtonColumnDef`). */\n button?: ButtonColumnDef;\n /** number: display format (utils/numberFormat). */\n numberFormat?: string;\n /** number: 'number' | 'bar' | 'ring'. */\n numberDisplay?: string;\n /** number: the 100% mark for bar / ring. */\n numberMax?: number;\n /** unique_id: the \"TASK\" in TASK-12. */\n uniquePrefix?: string;\n /** rollup: relation property, related property, function (utils/databaseRollup). */\n rollup?: { relation: string; target: string; fn: string };\n}\n\n/** The parts of a connector property definition the generic view helpers need. */\nexport interface ConnectorColumnConfig {\n resultType?: string;\n options?: SchemaOption[];\n}\n\n/**\n * The value of a stored connector cell (`{ value, at, ok, … }`, see utils/connectorProperty.ts).\n * A bare primitive is tolerated (seeded / legacy data).\n */\nexport function connectorCellValue(raw: unknown): string | number | boolean | null {\n if (raw === null || raw === undefined) return null;\n if (typeof raw === 'string' || typeof raw === 'number' || typeof raw === 'boolean') return raw;\n if (typeof raw === 'object' && !Array.isArray(raw) && 'value' in (raw as object)) {\n const v = (raw as { value?: unknown }).value;\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') return v;\n }\n return null;\n}\n\nconst CONNECTOR_ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}(?:[T ]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\n/** Display text of a connector value: checked / number / date / text. */\nexport function connectorDisplayText(value: unknown): string {\n const v = connectorCellValue(value);\n if (v === null) return '';\n if (typeof v === 'boolean') return v ? 'Checked' : '';\n if (typeof v === 'number') return Number.isFinite(v) ? String(Number(v.toPrecision(10))) : '';\n if (CONNECTOR_ISO_DATE.test(v) && !Number.isNaN(Date.parse(v))) {\n const dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(v);\n const d = new Date(dateOnly ? `${v}T00:00:00Z` : v);\n return dateOnly\n ? d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric', timeZone: 'UTC' })\n : d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n }\n return v;\n}\n\nexport interface RowLike {\n id: string;\n properties: Record<string, any>;\n createdTime?: string;\n lastEditedTime?: string;\n /** User ids (Created by / Last edited by). */\n createdBy?: string;\n lastEditedBy?: string;\n}\n\n/** Reads a row's value for a column (computed columns need more than `row.properties`). */\nexport type CellGetter = (row: RowLike, column: ColumnLike) => unknown;\n\n/**\n * A row's value for a column without formulas: row metadata for created / last edited time,\n * otherwise the stored property. (Formula columns resolve through `rowCellValue` in\n * utils/databaseFormula.ts, which falls back to this.)\n */\nexport const baseCellValue: CellGetter = (row, column) => {\n if (column.type === 'created_time') return row.createdTime ?? null;\n if (column.type === 'last_edited_time') return row.lastEditedTime ?? null;\n if (column.type === 'created_by') return row.createdBy ?? null;\n if (column.type === 'last_edited_by') return row.lastEditedBy ?? null;\n if (column.type === 'connector') return connectorCellValue(row.properties?.[column.name]);\n return row.properties?.[column.name];\n};\n\nexport const OPTION_COLORS = ['gray', 'blue', 'green', 'yellow', 'orange', 'red', 'purple', 'pink', 'brown'];\n\n// ============================================================================\n// READING VALUES\n// ============================================================================\n\n/** Plain text of a rich-text array / string / anything. */\nexport function richTextToPlain(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) {\n return value\n .map((rt: any) => {\n if (typeof rt === 'string') return rt;\n return rt?.plainText ?? rt?.text?.content ?? rt?.plain_text ?? '';\n })\n .join('');\n }\n if (typeof value === 'object') {\n const v = value as any;\n if (typeof v.plainText === 'string') return v.plainText;\n if (typeof v.text?.content === 'string') return v.text.content;\n if (typeof v.name === 'string') return v.name;\n }\n return '';\n}\n\n/** Name of a select value (`{name}` or string), or null. */\nexport function selectName(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'string') return value.trim() ? value : null;\n if (typeof value === 'object' && typeof (value as any).name === 'string') {\n return (value as any).name || null;\n }\n return null;\n}\n\n/** Names of a multi_select value. Tolerates a single select-shaped value. */\nexport function multiSelectNames(value: unknown): string[] {\n if (value === null || value === undefined) return [];\n if (Array.isArray(value)) {\n return value.map((v) => selectName(v)).filter((n): n is string => !!n);\n }\n const single = selectName(value);\n return single ? [single] : [];\n}\n\n/** ISO date string of a date value (`string` or `{start}`), or null. */\nexport function dateString(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'string') return value.trim() ? value : null;\n if (typeof value === 'object' && typeof (value as any).start === 'string') {\n return (value as any).start || null;\n }\n return null;\n}\n\n/** `YYYY-MM-DD` for an `<input type=\"date\">`, or '' when absent/invalid. */\nexport function toDateInputValue(value: unknown): string {\n const s = dateString(value);\n if (!s) return '';\n const m = /^(\\d{4}-\\d{2}-\\d{2})/.exec(s);\n if (m) return m[1];\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return '';\n return d.toISOString().slice(0, 10);\n}\n\n/** Epoch ms of a date value, or null. Date-only strings are read as UTC midnight. */\nexport function dateTime(value: unknown): number | null {\n const s = dateString(value);\n if (!s) return null;\n const t = new Date(s).getTime();\n return Number.isNaN(t) ? null : t;\n}\n\n/** End of a date range value (`{ start, end }`), or null for a single date. */\nexport function dateEndString(value: unknown): string | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n const end = (value as any).end;\n return typeof end === 'string' && end.trim() ? end : null;\n}\n\n/** `{ start, end }` as `YYYY-MM-DD` day keys (`end` null for a single date), or null when empty. */\nexport function dateRangeValue(value: unknown): { start: string; end: string | null } | null {\n const start = toDateInputValue(value);\n if (!start) return null;\n const endRaw = dateEndString(value);\n const end = endRaw ? toDateInputValue(endRaw) : '';\n return { start, end: end || null };\n}\n\n/**\n * Stored value for a date (range) edited to `start` / `end` (`YYYY-MM-DD`), keeping the previous\n * value's shape: a plain string stays a plain string while there is no end; `{ start, … }` keeps\n * its other fields. An `end` before `start` is swapped; `end === start` keeps the range.\n * Empty `start` clears the value.\n */\nexport function serializeDateRange(start: string | null, end: string | null, previous?: unknown): unknown {\n if (!start) return null;\n let s = start;\n let e = end || null;\n if (e && e < s) [s, e] = [e, s];\n const keepTime = (prev: string | null, day: string) => {\n const m = prev ? /^\\d{4}-\\d{2}-\\d{2}(T.*)$/.exec(prev) : null;\n return m ? `${day}${m[1]}` : day;\n };\n const prevStart = dateString(previous);\n const prevEnd = dateEndString(previous);\n const nextStart = keepTime(prevStart, s);\n if (previous && typeof previous === 'object' && !Array.isArray(previous)) {\n const next: Record<string, unknown> = { ...(previous as object), start: nextStart };\n if (e) next.end = keepTime(prevEnd, e);\n else delete next.end;\n return next;\n }\n return e ? { start: nextStart, end: keepTime(prevEnd, e) } : nextStart;\n}\n\n/** A person entry: a name, optionally an id and an avatar image. */\nexport interface PersonEntry {\n id?: string;\n name: string;\n avatarUrl?: string;\n}\n\n/** Entries of a person value (`[{ name, id?, avatarUrl? }]`, strings tolerated). */\nexport function personEntries(value: unknown): PersonEntry[] {\n if (value === null || value === undefined) return [];\n const list = Array.isArray(value) ? value : [value];\n const out: PersonEntry[] = [];\n for (const v of list) {\n if (typeof v === 'string') {\n if (v.trim()) out.push({ name: v.trim() });\n } else if (v && typeof v === 'object' && typeof (v as any).name === 'string' && (v as any).name.trim()) {\n const e: PersonEntry = { name: (v as any).name };\n if (typeof (v as any).id === 'string' && (v as any).id) e.id = (v as any).id;\n const url = (v as any).avatarUrl ?? (v as any).avatar_url;\n if (typeof url === 'string' && url) e.avatarUrl = url;\n out.push(e);\n }\n }\n return out;\n}\n\n/** A file entry of a files & media value. */\nexport interface FileEntry {\n name: string;\n url: string;\n}\n\n/** Display name for a file URL: its last path segment (decoded), else the host. */\nexport function fileNameFromUrl(url: string): string {\n const clean = url\n .trim()\n .replace(/[?#].*$/, '')\n .replace(/\\/+$/, '');\n const noScheme = clean.replace(/^[a-z][a-z0-9+.-]*:\\/\\//i, '');\n const parts = noScheme.split('/');\n if (parts.length < 2) return noScheme || url.trim();\n const last = parts[parts.length - 1];\n try {\n return decodeURIComponent(last) || noScheme;\n } catch {\n return last || noScheme;\n }\n}\n\n/** Entries of a files value (`[{ name, url }]`, tolerating plain URL strings). */\nexport function filesValue(value: unknown): FileEntry[] {\n if (value === null || value === undefined || value === '') return [];\n const list = Array.isArray(value) ? value : [value];\n const out: FileEntry[] = [];\n for (const v of list) {\n if (typeof v === 'string') {\n if (v.trim()) out.push({ name: fileNameFromUrl(v), url: v.trim() });\n } else if (v && typeof v === 'object') {\n const url = (v as any).url ?? (v as any).external?.url ?? (v as any).file?.url;\n if (typeof url === 'string' && url.trim()) {\n const name =\n typeof (v as any).name === 'string' && (v as any).name ? (v as any).name : fileNameFromUrl(url);\n out.push({ name, url: url.trim() });\n }\n }\n }\n return out;\n}\n\n/** Row ids of a relation value (`[{ id }]`, tolerating plain id strings). */\nexport function relationIds(value: unknown): string[] {\n if (value === null || value === undefined) return [];\n const list = Array.isArray(value) ? value : [value];\n const seen = new Set<string>();\n for (const v of list) {\n const id = typeof v === 'string' ? v : v && typeof v === 'object' ? (v as any).id : null;\n if (typeof id === 'string' && id) seen.add(id);\n }\n return [...seen];\n}\n\nexport function relationToCell(ids: string[]): Array<{ id: string }> {\n return [...new Set(ids.filter(Boolean))].map((id) => ({ id }));\n}\n\n/** Toggle a row id in a relation value; returns the new stored value. */\nexport function toggleRelation(value: unknown, id: string): Array<{ id: string }> {\n const ids = relationIds(value);\n return relationToCell(ids.includes(id) ? ids.filter((x) => x !== id) : [...ids, id]);\n}\n\nexport function numberValue(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null;\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'string') {\n const n = Number(value.trim());\n return value.trim() && Number.isFinite(n) ? n : null;\n }\n return null;\n}\n\n/** Normalised JS value for a cell, per property type. */\nexport function normalizeCellValue(value: unknown, type: string): unknown {\n switch (type) {\n case 'number':\n return numberValue(value);\n case 'select':\n case 'status':\n return selectName(value);\n case 'multi_select':\n case 'person':\n return multiSelectNames(value);\n case 'date': {\n const s = dateString(value);\n const e = dateEndString(value);\n return s && e ? `${s}/${e}` : s;\n }\n case 'created_time':\n case 'last_edited_time':\n return dateString(value);\n case 'checkbox':\n return value === true || value === 'true';\n case 'files':\n return filesValue(value).map((f) => f.url);\n case 'relation':\n return relationIds(value);\n case 'formula':\n return formulaNormalize(value);\n case 'connector':\n return connectorCellValue(value);\n case 'button':\n return buttonCellText(value);\n default: {\n const s = richTextToPlain(value);\n return s;\n }\n }\n}\n\n/** A formula list result (vs. stored rich text, which is an array of segment objects). */\nfunction isFormulaList(value: unknown): value is unknown[] {\n return (\n Array.isArray(value) &&\n value.every((v) => v === null || v instanceof Date || Array.isArray(v) || typeof v !== 'object')\n );\n}\n\n/** Formula results are number | string | boolean | Date | null | lists (see utils/databaseFormula.ts). */\nfunction formulaNormalize(value: unknown): unknown {\n if (isFormulaList(value)) return value.map((v) => formulaDisplayText(v)).join(', ');\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value.toISOString();\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'boolean') return value;\n if (value === null || value === undefined) return null;\n return richTextToPlain(value);\n}\n\n/** Display text of a formula result: numbers rounded to 10 significant digits, dates localized. */\nexport function formulaDisplayText(value: unknown): string {\n if (isFormulaList(value))\n return value\n .map((v) => formulaDisplayText(v))\n .filter(Boolean)\n .join(', ');\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) return '';\n const midnight = value.getHours() === 0 && value.getMinutes() === 0 && value.getSeconds() === 0;\n return midnight\n ? value.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' })\n : value.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });\n }\n if (typeof value === 'number') return Number.isFinite(value) ? String(Number(value.toPrecision(10))) : '';\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return richTextToPlain(value);\n}\n\n/** \"Oct 7, 2026, 3:04 PM\" for created / last edited time (local timezone). */\nexport function timestampDisplayText(value: unknown): string {\n const s = dateString(value);\n if (!s) return '';\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return '';\n return d.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });\n}\n\nexport function isEmptyCell(value: unknown, type: string): boolean {\n const v = normalizeCellValue(value, type);\n if (type === 'checkbox') return false;\n if (v === null || v === undefined || v === '') return true;\n if (Array.isArray(v)) return v.length === 0;\n return false;\n}\n\n/** Human-readable text of a cell (used for search, previews and plain display). */\n/**\n * A URL as cards show it (Notion keeps them short): no scheme / \"www.\", and for deep links only\n * the last three path segments — `https://github.com/acme-labs/acme-app/pull/412` →\n * `acme-app/pull/412`. Query and hash are dropped; anything unparsable comes back unchanged.\n */\nexport function compactUrl(url: string): string {\n const raw = (url ?? '').trim();\n if (!raw) return '';\n let u: URL;\n try {\n u = new URL(/^[a-z][a-z0-9+.-]*:/i.test(raw) ? raw : `https://${raw}`);\n } catch {\n return raw;\n }\n if (u.protocol !== 'http:' && u.protocol !== 'https:') return raw;\n const host = u.hostname.replace(/^www\\./i, '');\n const segs = u.pathname.split('/').filter(Boolean);\n if (segs.length > 3) return segs.slice(-3).join('/');\n return segs.length ? `${host}/${segs.join('/')}` : host;\n}\n\nexport function cellDisplayText(value: unknown, type: string): string {\n switch (type) {\n case 'number': {\n const n = numberValue(value);\n return n === null ? '' : String(n);\n }\n case 'select':\n case 'status':\n return selectName(value) ?? '';\n case 'multi_select':\n case 'person':\n return multiSelectNames(value).join(', ');\n case 'files':\n return filesValue(value)\n .map((f) => f.name)\n .join(', ');\n case 'relation':\n // Titles need the target database; callers with a title lookup render those instead.\n return relationIds(value).join(', ');\n case 'formula':\n return formulaDisplayText(value);\n case 'connector':\n return connectorDisplayText(value);\n case 'button':\n return buttonCellText(value);\n case 'created_time':\n case 'last_edited_time':\n return timestampDisplayText(value);\n case 'unique_id': {\n const n = numberValue(value);\n return n === null ? '' : String(n);\n }\n case 'rollup':\n return value === null || value === undefined ? '' : String(value);\n case 'date': {\n const range = dateRangeValue(value);\n if (!range) return '';\n // Format date-only values in UTC so the calendar day never shifts with the timezone.\n const fmt = (day: string) =>\n new Date(`${day}T00:00:00Z`).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n timeZone: 'UTC',\n });\n if (!range.end) return fmt(range.start);\n // Same year: say it once (\"3 Oct → 10 Oct 2026\"), or not at all for this year\n // (\"3 Oct → 10 Oct\"), so a range fits a normal column. The cell's tooltip has it all.\n if (range.start.slice(0, 4) === range.end.slice(0, 4)) {\n const short = (day: string) =>\n new Date(`${day}T00:00:00Z`).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n timeZone: 'UTC',\n });\n const thisYear = range.start.slice(0, 4) === String(new Date().getFullYear());\n return `${short(range.start)} → ${thisYear ? short(range.end) : fmt(range.end)}`;\n }\n return `${fmt(range.start)} → ${fmt(range.end)}`;\n }\n case 'checkbox':\n return value === true || value === 'true' ? 'Checked' : '';\n default:\n return richTextToPlain(value);\n }\n}\n\n// ============================================================================\n// EDITOR <-> STORED VALUE\n// ============================================================================\n\n/** The string an inline text/number/date/url editor starts with. */\nexport function cellToEditorString(value: unknown, type: string): string {\n switch (type) {\n case 'number': {\n const n = numberValue(value);\n return n === null ? '' : String(n);\n }\n case 'date':\n return toDateInputValue(value);\n case 'select':\n case 'status':\n return selectName(value) ?? '';\n case 'multi_select':\n case 'person':\n return multiSelectNames(value).join(', ');\n case 'files':\n return filesValue(value)\n .map((f) => f.url)\n .join('\\n');\n case 'checkbox':\n return value === true || value === 'true' ? 'true' : 'false';\n default:\n return richTextToPlain(value);\n }\n}\n\n/** Split a person / multi-select editor string (\"Ann, Bo\") into trimmed names. */\nexport function splitNames(input: string): string[] {\n return input\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Is `s` an http(s) URL or a bare domain-ish path (no other scheme)? */\nexport function isSafeLinkText(s: string): boolean {\n const t = s.trim();\n if (!t || /\\s/.test(t)) return false;\n if (/^https?:\\/\\//i.test(t)) return true;\n return !/^[a-z][a-z0-9+.-]*:/i.test(t) && /\\./.test(t);\n}\n\nexport function toRichText(text: string): Array<{ text: { content: string }; plainText: string }> {\n return [{ text: { content: text }, plainText: text }];\n}\n\n// The optional `never`-ish members keep property access valid without strictNullChecks narrowing.\nexport type ParseResult =\n | { ok: true; value: unknown; error?: undefined }\n | { ok: false; error: string; value?: undefined };\n\n/**\n * Convert an editor string back to the stored value for `type`. `previous` is the current stored\n * value, used to keep its shape (rich-text `text`, `{start}` dates).\n */\nexport function editorStringToCell(input: string, type: string, previous?: unknown): ParseResult {\n const raw = input ?? '';\n const trimmed = raw.trim();\n switch (type) {\n case 'title':\n return { ok: true, value: toRichText(raw) };\n case 'text':\n return { ok: true, value: Array.isArray(previous) ? toRichText(raw) : raw };\n case 'number': {\n if (!trimmed) return { ok: true, value: null };\n const n = Number(trimmed.replace(/,/g, ''));\n if (!Number.isFinite(n)) return { ok: false, error: 'Enter a number' };\n return { ok: true, value: n };\n }\n case 'date': {\n if (!trimmed) return { ok: true, value: null };\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed) || Number.isNaN(new Date(trimmed).getTime())) {\n return { ok: false, error: 'Enter a valid date' };\n }\n if (previous && typeof previous === 'object' && !Array.isArray(previous)) {\n return { ok: true, value: { ...(previous as object), start: trimmed } };\n }\n return { ok: true, value: trimmed };\n }\n case 'select':\n case 'status':\n return { ok: true, value: selectValueToCell(trimmed || null) };\n case 'multi_select':\n return {\n ok: true,\n value: multiSelectToCell(\n trimmed\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean),\n ),\n };\n case 'checkbox':\n return { ok: true, value: trimmed === 'true' };\n case 'email':\n if (trimmed && !/^[^\\s@]+@[^\\s@]+$/.test(trimmed)) return { ok: false, error: 'Enter a valid email' };\n return { ok: true, value: trimmed || null };\n case 'phone':\n if (trimmed && !/^[+\\d\\s().\\-/x#*]+$/i.test(trimmed)) return { ok: false, error: 'Enter a phone number' };\n if (trimmed && !/\\d/.test(trimmed)) return { ok: false, error: 'Enter a phone number' };\n return { ok: true, value: trimmed || null };\n case 'person': {\n // Keep ids / avatars of people that stay in the list.\n const prev = personEntries(previous);\n const seen = new Set<string>();\n const out: PersonEntry[] = [];\n for (const name of splitNames(trimmed)) {\n if (seen.has(name)) continue;\n seen.add(name);\n out.push(prev.find((p) => p.name === name) ?? { name });\n }\n return { ok: true, value: out };\n }\n case 'files': {\n const urls = trimmed.split(/[\\n\\s]+/).filter(Boolean);\n const bad = urls.find((u) => !isSafeLinkText(u));\n if (bad) return { ok: false, error: `Not a web link: ${bad}` };\n const prev = filesValue(previous);\n return {\n ok: true,\n value: urls.map((url) => prev.find((f) => f.url === url) ?? { name: fileNameFromUrl(url), url }),\n };\n }\n case 'relation':\n return { ok: true, value: relationToCell(splitNames(trimmed)) };\n case 'formula':\n case 'connector':\n case 'button':\n case 'rollup':\n case 'created_time':\n case 'last_edited_time':\n case 'created_by':\n case 'last_edited_by':\n return { ok: false, error: 'This property is read-only' };\n case 'url':\n return { ok: true, value: trimmed || null };\n default:\n return { ok: true, value: raw };\n }\n}\n\nexport function selectValueToCell(name: string | null): { name: string } | null {\n return name ? { name } : null;\n}\n\nexport function multiSelectToCell(names: string[]): Array<{ name: string }> {\n const seen = new Set<string>();\n const out: Array<{ name: string }> = [];\n for (const n of names) {\n if (!n || seen.has(n)) continue;\n seen.add(n);\n out.push({ name: n });\n }\n return out;\n}\n\n/** Toggle `name` in a multi_select value; returns the new stored value. */\nexport function toggleMultiSelect(value: unknown, name: string): Array<{ name: string }> {\n const names = multiSelectNames(value);\n return multiSelectToCell(names.includes(name) ? names.filter((n) => n !== name) : [...names, name]);\n}\n\n/** Do two stored values render the same for `type`? (Skip no-op writes.) */\nexport function cellValuesEqual(a: unknown, b: unknown, type: string): boolean {\n return JSON.stringify(normalizeCellValue(a, type)) === JSON.stringify(normalizeCellValue(b, type));\n}\n\n/** Safe href for a url cell (adds https:// to bare domains, rejects script schemes). */\nexport function safeHref(value: unknown, type: 'url' | 'email' | 'phone'): string | null {\n const s = richTextToPlain(value).trim();\n if (!s) return null;\n if (type === 'email') return `mailto:${s}`;\n if (type === 'phone') {\n const dial = s.replace(/[^\\d+#*]/g, '');\n return dial ? `tel:${dial}` : null;\n }\n if (/^(https?:|mailto:)/i.test(s)) return s;\n if (/^[a-z][a-z0-9+.-]*:/i.test(s)) return null; // javascript:, data:, …\n return `https://${s}`;\n}\n\n// ============================================================================\n// SORTING\n// ============================================================================\n\n/**\n * Compare two non-empty normalised cell values for `type` (ascending). Select values compare by\n * their position in the schema options (unknown options after known ones, alphabetically).\n */\nexport function compareCellValues(a: unknown, b: unknown, column: ColumnLike): number {\n switch (column.type) {\n case 'number':\n case 'unique_id':\n return (numberValue(a) ?? 0) - (numberValue(b) ?? 0);\n case 'date':\n case 'created_time':\n case 'last_edited_time':\n return (dateTime(a) ?? 0) - (dateTime(b) ?? 0);\n case 'formula':\n return compareFormulaValues(a, b);\n case 'connector': {\n // A select result follows its option order; everything else compares by value.\n const x = connectorCellValue(a);\n const y = connectorCellValue(b);\n if (column.connector?.resultType === 'select' && typeof x === 'string' && typeof y === 'string') {\n return compareOptionNames(x, y, column.options);\n }\n return compareFormulaValues(x, y);\n }\n case 'checkbox': {\n const x = a === true ? 1 : 0;\n const y = b === true ? 1 : 0;\n return x - y;\n }\n case 'select':\n return compareOptionNames(selectName(a), selectName(b), column.options);\n case 'status':\n // Group order (To-do → In progress → Complete), then option order.\n return compareOptionNames(selectName(a), selectName(b), normalizeStatusOptions(column.options));\n case 'person':\n case 'multi_select': {\n const x = multiSelectNames(a);\n const y = multiSelectNames(b);\n const len = Math.min(x.length, y.length);\n for (let i = 0; i < len; i++) {\n const c = compareOptionNames(x[i], y[i], column.options);\n if (c !== 0) return c;\n }\n return x.length - y.length;\n }\n default:\n return cellDisplayText(a, column.type).localeCompare(cellDisplayText(b, column.type), undefined, {\n numeric: true,\n sensitivity: 'base',\n });\n }\n}\n\nfunction compareFormulaValues(a: unknown, b: unknown): number {\n const x = formulaNormalize(a);\n const y = formulaNormalize(b);\n if (typeof x === 'number' && typeof y === 'number') return x - y;\n if (typeof x === 'boolean' && typeof y === 'boolean') return Number(x) - Number(y);\n return String(x ?? '').localeCompare(String(y ?? ''), undefined, { numeric: true, sensitivity: 'base' });\n}\n\nfunction compareOptionNames(a: string | null, b: string | null, options: SchemaOption[] | undefined): number {\n const order = (n: string | null) => {\n const i = (options ?? []).findIndex((o) => o.name === n);\n return i === -1 ? Number.MAX_SAFE_INTEGER : i;\n };\n const d = order(a) - order(b);\n if (d !== 0) return d;\n return (a ?? '').localeCompare(b ?? '', undefined, { sensitivity: 'base' });\n}\n\n/**\n * Sort rows by one or more sort specs. Stable; empty cells always sort last regardless of\n * direction (Notion behaviour). Sorts on properties that are not columns are ignored.\n */\nexport function sortRows<R extends RowLike>(\n rows: R[],\n sorts: SortSpec[],\n columns: ColumnLike[],\n getValue: CellGetter = baseCellValue,\n): R[] {\n const active = sorts\n .map((s) => ({ ...s, column: columns.find((c) => c.name === s.property) }))\n .filter((s): s is SortSpec & { column: ColumnLike } => !!s.column);\n if (active.length === 0) return rows;\n return rows\n .map((row, index) => ({ row, index }))\n .sort((x, y) => {\n for (const s of active) {\n const a = getValue(x.row, s.column);\n const b = getValue(y.row, s.column);\n const ea = isEmptyCell(a, s.column.type);\n const eb = isEmptyCell(b, s.column.type);\n if (ea && eb) continue;\n if (ea) return 1;\n if (eb) return -1;\n const c = compareCellValues(a, b, s.column);\n if (c !== 0) return s.direction === 'descending' ? -c : c;\n }\n return x.index - y.index;\n })\n .map((e) => e.row);\n}\n\n/** Header click cycle: none -> ascending -> descending -> none. Single-column sort. */\nexport function nextSort(current: SortSpec[], property: string): SortSpec[] {\n const existing = current.find((s) => s.property === property);\n if (!existing) return [{ property, direction: 'ascending' }];\n if (existing.direction === 'ascending') return [{ property, direction: 'descending' }];\n return [];\n}\n\n/** Read a view's persisted sorts (tolerates `asc`/`desc` and `{propertyName}` shapes). */\nexport function parseViewSorts(sorts: unknown): SortSpec[] {\n if (!Array.isArray(sorts)) return [];\n const out: SortSpec[] = [];\n for (const s of sorts) {\n if (!s || typeof s !== 'object') continue;\n const property = (s as any).property ?? (s as any).propertyName ?? (s as any).key;\n if (typeof property !== 'string' || !property) continue;\n const dir = String((s as any).direction ?? 'ascending').toLowerCase();\n out.push({ property, direction: dir === 'descending' || dir === 'desc' ? 'descending' : 'ascending' });\n }\n return out;\n}\n\n/** aria-sort value for a header. */\nexport function ariaSortFor(sorts: SortSpec[], property: string): 'ascending' | 'descending' | 'none' {\n return sorts.find((s) => s.property === property)?.direction ?? 'none';\n}\n\n// ============================================================================\n// FILTERING\n// ============================================================================\n\nexport function isFilterActive(filter: RowFilter | undefined): boolean {\n if (!filter) return false;\n if (filter.search && filter.search.trim()) return true;\n return Object.values(filter.selects ?? {}).some((v) => v.length > 0);\n}\n\nexport function rowMatchesFilter(\n row: RowLike,\n columns: ColumnLike[],\n filter: RowFilter | undefined,\n getValue: CellGetter = baseCellValue,\n): boolean {\n if (!filter) return true;\n const q = (filter.search ?? '').trim().toLowerCase();\n if (q) {\n const hit = columns.some((c) => cellDisplayText(getValue(row, c), c.type).toLowerCase().includes(q));\n if (!hit) return false;\n }\n for (const [prop, accepted] of Object.entries(filter.selects ?? {})) {\n if (!accepted || accepted.length === 0) continue;\n const column = columns.find((c) => c.name === prop);\n if (!column) continue;\n const value = row.properties?.[prop];\n const names = column.type === 'multi_select' ? multiSelectNames(value) : [selectName(value)].filter(Boolean);\n const ok =\n names.length === 0\n ? accepted.includes(EMPTY_FILTER_VALUE)\n : names.some((n) => accepted.includes(n as string));\n if (!ok) return false;\n }\n return true;\n}\n\n/**\n * Rows matching the filter. `keepIds` always pass — used for rows the user just added so a new\n * row hidden by an active search / filter still shows up (and opens for editing) until the filter\n * changes.\n */\nexport function filterRows<R extends RowLike>(\n rows: R[],\n columns: ColumnLike[],\n filter: RowFilter | undefined,\n keepIds?: ReadonlySet<string>,\n): R[] {\n if (!isFilterActive(filter)) return rows;\n return rows.filter((r) => keepIds?.has(r.id) || rowMatchesFilter(r, columns, filter));\n}\n\n/** Point a select filter at a renamed property. Returns the same object when nothing changes. */\nexport function renameFilterProperty(filter: RowFilter, from: string, to: string): RowFilter {\n const selects = filter.selects ?? {};\n if (!(from in selects) || from === to) return filter;\n const next: Record<string, string[]> = {};\n for (const [k, v] of Object.entries(selects)) next[k === from ? to : k] = v;\n return { ...filter, selects: next };\n}\n\n/** Remove a property's select filter (property deleted). Same object when nothing changes. */\nexport function dropFilterProperty(filter: RowFilter, name: string): RowFilter {\n const selects = filter.selects ?? {};\n if (!(name in selects)) return filter;\n const next = { ...selects };\n delete next[name];\n return { ...filter, selects: next };\n}\n\n/**\n * Drop select filters whose property no longer exists or is no longer a select / multi_select\n * (deleted, renamed elsewhere, type changed) so `isFilterActive` doesn't report a stale filter.\n * Same object when nothing changes.\n */\nexport function pruneFilter(filter: RowFilter, columns: ColumnLike[]): RowFilter {\n const selects = filter.selects ?? {};\n let next: Record<string, string[]> | null = null;\n for (const k of Object.keys(selects)) {\n const c = columns.find((x) => x.name === k);\n if (c && hasOptions(c.type)) continue;\n next = next ?? { ...selects };\n delete next[k];\n }\n return next ? { ...filter, selects: next } : filter;\n}\n\n/** Point sorts at a renamed property. Same array when nothing changes. */\nexport function renameSortProperty(sorts: SortSpec[], from: string, to: string): SortSpec[] {\n if (!sorts.some((s) => s.property === from) || from === to) return sorts;\n return sorts.map((s) => (s.property === from ? { ...s, property: to } : s));\n}\n\n/** Remove sorts on a deleted property. Same array when nothing changes. */\nexport function dropSortProperty(sorts: SortSpec[], name: string): SortSpec[] {\n return sorts.some((s) => s.property === name) ? sorts.filter((s) => s.property !== name) : sorts;\n}\n\n/**\n * Initial cell values for a row created while select filters are active, so the new row matches\n * them (Notion behaviour): the first accepted option per filtered select / multi_select property.\n * Filters that also accept \"Empty\" need no value.\n */\nexport function prefillFromFilter(filter: RowFilter | undefined, columns: ColumnLike[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [prop, accepted] of Object.entries(filter?.selects ?? {})) {\n if (!accepted?.length || accepted.includes(EMPTY_FILTER_VALUE)) continue;\n const column = columns.find((c) => c.name === prop);\n if (!column) continue;\n if (isSingleOptionType(column.type)) out[prop] = selectValueToCell(accepted[0]);\n else if (column.type === 'multi_select') out[prop] = multiSelectToCell([accepted[0]]);\n }\n return out;\n}\n\n/** Toggle an option in a select filter, returning a new filter. */\nexport function toggleSelectFilter(filter: RowFilter, property: string, option: string): RowFilter {\n const current = filter.selects?.[property] ?? [];\n const next = current.includes(option) ? current.filter((o) => o !== option) : [...current, option];\n return { ...filter, selects: { ...(filter.selects ?? {}), [property]: next } };\n}\n\n// ============================================================================\n// BOARD GROUPING\n// ============================================================================\n\nexport const NO_GROUP = 'No Status';\n\n/**\n * Stable React key for a board group. Keyed by value, not display name: an option literally named\n * \"No Status\" must not collide with the empty bucket.\n */\nexport function boardGroupKey(group: { value: string | null }): string {\n return group.value === null ? '__none__' : `v:${group.value}`;\n}\n\nexport interface RowGroup<R> {\n name: string;\n /** null for the \"no value\" bucket. */\n value: string | null;\n color?: string;\n rows: R[];\n}\n\n/**\n * Group rows by a select property. Buckets follow option order; values not in the options get\n * their own bucket (after options); the no-value bucket comes last.\n */\nexport function groupRows<R extends RowLike>(rows: R[], property: string, options: SchemaOption[]): RowGroup<R>[] {\n const groups = new Map<string, RowGroup<R>>();\n for (const o of options) groups.set(o.name, { name: o.name, value: o.name, color: o.color, rows: [] });\n const empty: RowGroup<R> = { name: NO_GROUP, value: null, rows: [] };\n for (const row of rows) {\n const stored = row.properties?.[property];\n // A connector property groups by its result value (`{ value, at, … }`).\n const isConnectorCell =\n !!stored && typeof stored === 'object' && !Array.isArray(stored) && 'value' in stored && 'at' in stored;\n const name = isConnectorCell ? selectName(String(connectorCellValue(stored) ?? '')) : selectName(stored);\n if (!name) {\n empty.rows.push(row);\n continue;\n }\n let g = groups.get(name);\n if (!g) {\n g = { name, value: name, rows: [] };\n groups.set(name, g);\n }\n g.rows.push(row);\n }\n return [...groups.values(), empty];\n}\n\n// ============================================================================\n// SCHEMA EDITS (return a new schema; never mutate)\n// ============================================================================\n\nexport type SchemaResult =\n | { ok: true; schema: DatabaseSchema; error?: undefined }\n | { ok: false; error: string; schema?: undefined };\n\nexport function validatePropertyName(schema: DatabaseSchema, name: string, except?: string): string | null {\n const n = name.trim();\n if (!n) return 'Name is required';\n const clash = Object.keys(schema).some((k) => k !== except && k.toLowerCase() === n.toLowerCase());\n if (clash) return `A property named \"${n}\" already exists`;\n if (['icon', 'cover', 'schema'].includes(n)) return `\"${n}\" is a reserved name`;\n return null;\n}\n\nexport function uniquePropertyName(schema: DatabaseSchema, base = 'Property'): string {\n const taken = new Set(Object.keys(schema).map((k) => k.toLowerCase()));\n if (!taken.has(base.toLowerCase())) return base;\n for (let i = 2; ; i++) {\n const candidate = `${base} ${i}`;\n if (!taken.has(candidate.toLowerCase())) return candidate;\n }\n}\n\nexport function addSchemaProperty(\n schema: DatabaseSchema,\n name: string,\n type: PropertyType | string,\n /**\n * Type-specific settings: `{ expression }` for formula, `{ databaseId }` for relation,\n * `{ connector }` (a ConnectorPropertyDef without `type`) for connector.\n */\n config: {\n expression?: string;\n databaseId?: string;\n connector?: Record<string, unknown>;\n /** Generic settings merged into the definition (unique id prefix, number format …). */\n settings?: Record<string, unknown>;\n } = {},\n): SchemaResult {\n const error = validatePropertyName(schema, name);\n if (error) return { ok: false, error };\n if (type === 'title') return { ok: false, error: 'A database has exactly one title property' };\n if (type === 'relation' && !config.databaseId) return { ok: false, error: 'Pick a database to relate to' };\n const def: PropertyDef = { type };\n if (type === 'select' || type === 'multi_select') def.options = [];\n if (type === 'status') def.options = DEFAULT_STATUS_OPTIONS.map((o) => ({ ...o }));\n if (type === 'formula') def.expression = config.expression ?? '';\n if (type === 'relation') def.databaseId = config.databaseId;\n if ((type === 'connector' || type === 'button') && config.connector)\n Object.assign(def, withoutType(config.connector));\n for (const [k, v] of Object.entries(config.settings ?? {})) {\n if (k !== 'type' && k !== 'options' && v !== undefined && v !== null && v !== '') def[k] = v;\n }\n return { ok: true, schema: { ...schema, [name.trim()]: def } };\n}\n\n/** Rename keeping the property's position in the schema (column order). */\nexport function renameSchemaProperty(schema: DatabaseSchema, from: string, to: string): SchemaResult {\n if (!(from in schema)) return { ok: false, error: `Unknown property \"${from}\"` };\n const target = to.trim();\n if (target === from) return { ok: true, schema };\n const error = validatePropertyName(schema, target, from);\n if (error) return { ok: false, error };\n const out: DatabaseSchema = {};\n for (const [k, v] of Object.entries(schema)) out[k === from ? target : k] = v;\n return { ok: true, schema: out };\n}\n\nexport function changeSchemaPropertyType(\n schema: DatabaseSchema,\n name: string,\n type: PropertyType | string,\n): SchemaResult {\n const def = schema[name];\n if (!def) return { ok: false, error: `Unknown property \"${name}\"` };\n if (def.type === 'title') return { ok: false, error: 'The title property type cannot be changed' };\n if (type === 'title') return { ok: false, error: 'A database has exactly one title property' };\n const next: PropertyDef = { ...def, type };\n if (type === 'status') {\n // Keep the options (each gets a group); a property without options gets the defaults.\n next.options = def.options?.length\n ? normalizeStatusOptions(def.options)\n : DEFAULT_STATUS_OPTIONS.map((o) => ({ ...o }));\n } else if (type === 'select' || type === 'multi_select') {\n next.options = (def.options ?? []).map(({ group: _g, ...o }) => o);\n } else if (type === 'connector') {\n // A connector's select result keeps its options (set with the connector config).\n if (def.options) next.options = def.options.map(({ group: _g, ...o }) => o);\n } else delete next.options;\n // Formula / relation settings are kept when switching away (harmless) so switching back\n // restores them; a relation still needs a target.\n if (type === 'formula' && typeof next.expression !== 'string') next.expression = '';\n if (type === 'relation' && !next.databaseId) return { ok: false, error: 'Pick a database to relate to' };\n return { ok: true, schema: { ...schema, [name]: next } };\n}\n\n/** Set a property's type-specific settings (formula expression / relation target). */\nexport function updateSchemaPropertyConfig(\n schema: DatabaseSchema,\n name: string,\n config: {\n expression?: string;\n databaseId?: string;\n connector?: Record<string, unknown>;\n /** Generic settings merged into the definition (`undefined` removes a key). */\n settings?: Record<string, unknown>;\n },\n): SchemaResult {\n const def = schema[name];\n if (!def) return { ok: false, error: `Unknown property \"${name}\"` };\n const next: PropertyDef = { ...def };\n for (const [k, v] of Object.entries(config.settings ?? {})) {\n if (k === 'type' || k === 'options') continue;\n if (v === undefined || v === null || v === '') delete next[k];\n else next[k] = v;\n }\n if (config.expression !== undefined) next.expression = config.expression;\n if (config.databaseId !== undefined) next.databaseId = config.databaseId;\n if (config.connector !== undefined) {\n // Replace the whole connector config (keys dropped by the editor must go, e.g. valueMap).\n for (const k of CONNECTOR_DEF_KEYS) delete next[k];\n Object.assign(next, withoutType(config.connector));\n }\n return { ok: true, schema: { ...schema, [name]: next } };\n}\n\n/** Keys of a connector property definition (besides `type`). */\nconst CONNECTOR_DEF_KEYS = [\n 'connector',\n 'action',\n 'actionTitle',\n 'params',\n 'valuePath',\n 'resultType',\n 'valueMap',\n 'options',\n 'refresh',\n 'credentialId',\n // button properties\n 'buttonLabel',\n 'buttonConfirm',\n 'buttonSet',\n] as const;\n\nfunction withoutType(config: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(config)) if (k !== 'type' && v !== undefined) out[k] = v;\n return out;\n}\n\n/**\n * Can a board (or grouped table) group by this column? Select / status, and a connector property\n * whose result is a select (e.g. \"Pull request\": Open / Merged).\n */\nexport function isGroupableColumn(column: ColumnLike): boolean {\n if (column.type === 'select' || column.type === 'status') return true;\n return column.type === 'connector' && column.connector?.resultType === 'select';\n}\n\nexport function removeSchemaProperty(schema: DatabaseSchema, name: string): SchemaResult {\n const def = schema[name];\n if (!def) return { ok: false, error: `Unknown property \"${name}\"` };\n if (def.type === 'title') return { ok: false, error: 'The title property cannot be deleted' };\n const out = { ...schema };\n delete out[name];\n return { ok: true, schema: out };\n}\n\n/** Add an option to a select/multi_select property (no-op if it exists). Colour cycles. */\nexport function addSchemaOption(\n schema: DatabaseSchema,\n property: string,\n optionName: string,\n color?: string,\n /** status: the option's group (default: guessed from the name, else to-do). */\n group?: StatusGroup,\n): SchemaResult {\n const def = schema[property];\n if (!def) return { ok: false, error: `Unknown property \"${property}\"` };\n if (!hasOptions(String(def.type))) {\n return { ok: false, error: `\"${property}\" is not a select property` };\n }\n const name = optionName.trim();\n if (!name) return { ok: false, error: 'Option name is required' };\n const options = def.options ?? [];\n if (options.some((o) => o.name === name)) return { ok: true, schema };\n const nextColor = color ?? OPTION_COLORS[options.length % OPTION_COLORS.length];\n const option: SchemaOption = { name, color: nextColor };\n // New status options join a group (to-do unless the name says otherwise).\n if (def.type === 'status') option.group = group ?? guessStatusGroup(name);\n return {\n ok: true,\n schema: { ...schema, [property]: { ...def, options: [...options, option] } },\n };\n}\n\n/**\n * Row patch that moves a value from `from` to `to` after a property rename (the old key is nulled,\n * since updateBlock merges and cannot delete keys). Null when the row has no value under `from`.\n */\nexport function renameRowPatch(properties: Record<string, any> | undefined, from: string, to: string) {\n if (!properties || !(from in properties) || properties[from] === null || properties[from] === undefined) {\n return null;\n }\n return { [to]: properties[from], [from]: null } as Record<string, any>;\n}\n\n/**\n * Convert a value when a property's type changes (best effort, like Notion: text <-> select keeps\n * the text, number parses, etc.).\n */\nexport function convertCellValue(value: unknown, fromType: string, toType: string): unknown {\n if (fromType === toType) return value;\n // Computed targets ignore the stored value (it stays untouched, so switching back restores it).\n if (isComputedType(toType)) return value;\n if (value === null || value === undefined) return toType === 'checkbox' ? false : null;\n // Relation ids mean nothing as text (and text can't name rows): the value is cleared.\n if (fromType === 'relation' || toType === 'relation') return toType === 'checkbox' ? false : null;\n const text =\n fromType === 'date' || isDateLikeType(fromType)\n ? toDateInputValue(value)\n : fromType === 'files'\n ? filesValue(value)\n .map((f) => f.url)\n .join(' ')\n : cellDisplayText(value, fromType);\n switch (toType) {\n case 'number':\n return numberValue(fromType === 'checkbox' ? (value ? 1 : 0) : text);\n case 'select':\n case 'status': {\n const first = isNameListType(fromType) ? multiSelectNames(value)[0] : text.trim();\n return selectValueToCell(first || null);\n }\n case 'multi_select':\n case 'person':\n return multiSelectToCell(\n (isNameListType(fromType) ? multiSelectNames(value) : text.split(',')).map((s) => s.trim()),\n );\n case 'files': {\n const urls = text.split(/[\\s,]+/).filter((u) => isSafeLinkText(u));\n return urls.length ? urls.map((url) => ({ name: fileNameFromUrl(url), url })) : null;\n }\n case 'phone': {\n const r = editorStringToCell(text, 'phone');\n return r.ok ? r.value : null;\n }\n case 'date': {\n const r = editorStringToCell(toDateInputValue(text), 'date');\n return r.ok ? r.value : null;\n }\n case 'checkbox':\n return value === true || ['true', 'yes', '1', 'checked'].includes(text.trim().toLowerCase());\n case 'title':\n return toRichText(text);\n default:\n return text || null;\n }\n}\n\n/**\n * Does a cell carry information? Like `!isEmptyCell`, except an unchecked checkbox counts as\n * empty (so checkbox -> text of `false` is not a loss, and text -> checkbox that ends up unchecked\n * is).\n */\nexport function cellHasContent(value: unknown, type: string): boolean {\n if (type === 'checkbox') return normalizeCellValue(value, 'checkbox') === true;\n return !isEmptyCell(value, type);\n}\n\n/**\n * How many rows hold a value for `name` that `convertCellValue` would turn into nothing when the\n * property changes from `fromType` to `toType` (e.g. \"abc\" -> number). Used to confirm a type\n * change before it clears data.\n */\nexport function countLossyConversions(\n rows: Array<{ properties?: Record<string, any> }>,\n name: string,\n fromType: string,\n toType: string,\n): number {\n if (fromType === toType || isComputedType(toType)) return 0;\n let n = 0;\n for (const row of rows) {\n const value = row.properties?.[name];\n if (!cellHasContent(value, fromType)) continue;\n if (!cellHasContent(convertCellValue(value, fromType, toType), toType)) n += 1;\n }\n return n;\n}\n\n// ============================================================================\n// OPTION COLOURS (theme-aware chips)\n// ============================================================================\n\n/** Option chip of the given colour; the palette lives with the other content tones. */\nexport const optionChipClass = toneChipClass;\n\nexport function optionColor(options: SchemaOption[] | undefined, name: string | null): string | undefined {\n if (!name) return undefined;\n return options?.find((o) => o.name === name)?.color;\n}\n\n/** What a column is called on screen: the built-in title column is \"Name\" (its key is \"title\"). */\nexport function columnLabel(c: { name: string; type?: string }): string {\n return c.type === 'title' && c.name === 'title' ? 'Name' : c.name;\n}\n\n/**\n * Generic per-type column settings read from a property definition (number format, …). Spread\n * into columns next to connectorColumnFields wherever a schema becomes columns.\n */\nexport function extraColumnFields(def: unknown): Partial<ColumnLike> {\n const d = (def ?? {}) as Record<string, unknown>;\n const out: Partial<ColumnLike> = {};\n if (typeof d.numberFormat === 'string') out.numberFormat = d.numberFormat;\n if (typeof d.numberDisplay === 'string') out.numberDisplay = d.numberDisplay;\n if (typeof d.numberMax === 'number' && Number.isFinite(d.numberMax)) out.numberMax = d.numberMax;\n if (typeof d.prefix === 'string') out.uniquePrefix = d.prefix;\n if (d.limit === 1) out.relationLimit = 1;\n if (typeof d.dualProperty === 'string' && d.dualProperty) out.dualProperty = d.dualProperty;\n const r = d.rollup as { relation?: unknown; target?: unknown; fn?: unknown } | undefined;\n if (r && typeof r.relation === 'string' && typeof r.target === 'string') {\n out.rollup = { relation: r.relation, target: r.target, fn: typeof r.fn === 'string' ? r.fn : 'show_original' };\n }\n return out;\n}\n\n/**\n * Insert a property next to `anchor` (left or right) — the schema's key order is the column\n * order. A missing anchor appends. `def` is copied as given (duplicate / blank text property).\n */\nexport function insertSchemaProperty(\n schema: DatabaseSchema,\n name: string,\n def: PropertyDef,\n anchor: string,\n side: 'left' | 'right',\n): SchemaResult {\n const error = validatePropertyName(schema, name);\n if (error) return { ok: false, error };\n const entries = Object.entries(schema);\n const i = entries.findIndex(([k]) => k === anchor);\n const at = i < 0 ? entries.length : side === 'left' ? i : i + 1;\n entries.splice(at, 0, [name, def]);\n return { ok: true, schema: Object.fromEntries(entries) };\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,310 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __restKey = (key) => typeof key === "symbol" ? key : key + "";
21
+ var __objRest = (source, exclude) => {
22
+ var target = {};
23
+ for (var prop in source)
24
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
25
+ target[prop] = source[prop];
26
+ if (source != null && __getOwnPropSymbols)
27
+ for (var prop of __getOwnPropSymbols(source)) {
28
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
29
+ target[prop] = source[prop];
30
+ }
31
+ return target;
32
+ };
33
+ const VIEW_TYPES = [{
34
+ type: "table",
35
+ label: "Table",
36
+ glyph: "\u25A6",
37
+ hint: "Rows and columns"
38
+ }, {
39
+ type: "board",
40
+ label: "Board",
41
+ glyph: "\u25A5",
42
+ hint: "Cards grouped by a select property"
43
+ }, {
44
+ type: "calendar",
45
+ label: "Calendar",
46
+ glyph: "\u25A4",
47
+ hint: "Rows on a month grid by date"
48
+ }, {
49
+ type: "timeline",
50
+ label: "Timeline",
51
+ glyph: "\u2550",
52
+ hint: "Bars on a date axis (start \u2192 end)"
53
+ }, {
54
+ type: "gallery",
55
+ label: "Gallery",
56
+ glyph: "\u25A3",
57
+ hint: "Cards with a cover image"
58
+ }, {
59
+ type: "list",
60
+ label: "List",
61
+ glyph: "\u2630",
62
+ hint: "Compact rows"
63
+ }, {
64
+ type: "chart",
65
+ label: "Chart",
66
+ glyph: "\u25AE",
67
+ hint: "Bars or a donut of rows per group"
68
+ }];
69
+ const DEFAULT_VIEW_ID = "__default_table__";
70
+ function isViewType(type) {
71
+ return VIEW_TYPES.some((t) => t.type === type);
72
+ }
73
+ function viewLayout(type) {
74
+ return isViewType(type) ? type : "table";
75
+ }
76
+ function uniqueViewName(existing, base) {
77
+ const taken = new Set(existing.map((v) => v.name.trim().toLowerCase()));
78
+ if (!taken.has(base.toLowerCase())) return base;
79
+ for (let i = 2; ; i++) {
80
+ const candidate = `${base} ${i}`;
81
+ if (!taken.has(candidate.toLowerCase())) return candidate;
82
+ }
83
+ }
84
+ const MAX_VIEW_NAME = 80;
85
+ function validateViewName(name) {
86
+ const n = name.trim();
87
+ if (!n) return "Name is required";
88
+ if (n.length > MAX_VIEW_NAME) return `Keep it under ${MAX_VIEW_NAME} characters`;
89
+ return null;
90
+ }
91
+ function layoutPropertyCandidates(type, columns) {
92
+ if (type === "board") {
93
+ return [
94
+ ...columns.filter((c) => c.type === "status"),
95
+ ...columns.filter((c) => c.type === "select"),
96
+ // Connector properties with a select result ("Pull request": Open / Merged) group read-only.
97
+ ...columns.filter((c) => {
98
+ var _a;
99
+ return c.type === "connector" && ((_a = c.connector) == null ? void 0 : _a.resultType) === "select";
100
+ })
101
+ ];
102
+ }
103
+ if (type === "calendar" || type === "timeline") {
104
+ return columns.filter((c) => c.type === "date" || c.type === "created_time" || c.type === "last_edited_time");
105
+ }
106
+ return [];
107
+ }
108
+ function buildNewView(draft, columns) {
109
+ var _a, _b;
110
+ const nameError = validateViewName(draft.name);
111
+ if (nameError) return {
112
+ ok: false,
113
+ error: nameError
114
+ };
115
+ const name = draft.name.trim();
116
+ const candidates = layoutPropertyCandidates(draft.type, columns);
117
+ if (draft.type === "calendar" || draft.type === "timeline") {
118
+ const prop = (_a = candidates.find((c) => c.name === draft.layoutProperty)) != null ? _a : candidates[0];
119
+ if (!prop) {
120
+ return {
121
+ ok: false,
122
+ error: `A ${draft.type === "calendar" ? "calendar" : "timeline"} needs a Date property \u2014 add one first`
123
+ };
124
+ }
125
+ return {
126
+ ok: true,
127
+ input: {
128
+ type: draft.type,
129
+ name,
130
+ groupBy: prop.name
131
+ }
132
+ };
133
+ }
134
+ if (draft.type === "board") {
135
+ const prop = (_b = candidates.find((c) => c.name === draft.layoutProperty)) != null ? _b : candidates[0];
136
+ return {
137
+ ok: true,
138
+ input: prop ? {
139
+ type: "board",
140
+ name,
141
+ groupBy: prop.name
142
+ } : {
143
+ type: "board",
144
+ name
145
+ }
146
+ };
147
+ }
148
+ return {
149
+ ok: true,
150
+ input: {
151
+ type: draft.type,
152
+ name
153
+ }
154
+ };
155
+ }
156
+ function parseVisibleProperties(properties, columns) {
157
+ var _a;
158
+ if (!Array.isArray(properties)) return null;
159
+ const names = new Set(columns.map((c) => c.name));
160
+ const out = [];
161
+ for (const p of properties) {
162
+ const name = typeof p === "string" ? p : p && typeof p === "object" ? (_a = p.property) != null ? _a : p.name : null;
163
+ const visible = typeof p === "string" ? true : (p == null ? void 0 : p.visible) !== false;
164
+ if (typeof name === "string" && visible && names.has(name) && !out.includes(name)) out.push(name);
165
+ }
166
+ return out;
167
+ }
168
+ function serializeVisibleProperties(names, widths, allNames) {
169
+ const entry = (property, visible) => (widths == null ? void 0 : widths[property]) ? {
170
+ property,
171
+ visible,
172
+ width: widths[property]
173
+ } : {
174
+ property,
175
+ visible
176
+ };
177
+ return [...names.map((n) => entry(n, true)), ...(allNames != null ? allNames : []).filter((n) => !names.includes(n)).map((n) => entry(n, false))];
178
+ }
179
+ function parseHiddenProperties(properties) {
180
+ if (!Array.isArray(properties)) return [];
181
+ return properties.filter((p) => p && typeof p === "object" && p.visible === false).map((p) => {
182
+ var _a;
183
+ return (_a = p.property) != null ? _a : p.name;
184
+ }).filter((n) => typeof n === "string");
185
+ }
186
+ function parseViewWidths(properties) {
187
+ var _a;
188
+ const out = {};
189
+ if (!Array.isArray(properties)) return out;
190
+ for (const p of properties) {
191
+ const name = p && typeof p === "object" ? (_a = p.property) != null ? _a : p.name : null;
192
+ const w = p && typeof p === "object" ? Number(p.width) : NaN;
193
+ if (typeof name === "string" && Number.isFinite(w) && w > 0) out[name] = w;
194
+ }
195
+ return out;
196
+ }
197
+ function tableDisplayColumns(all, visible, widths, hidden = []) {
198
+ const title = all.find((c) => c.type === "title");
199
+ const rest = all.filter((c) => c !== title);
200
+ const ordered = visible ? [...visible.map((n) => rest.find((c) => c.name === n)).filter((c) => !!c), ...rest.filter((c) => !visible.includes(c.name) && !hidden.includes(c.name))] : rest;
201
+ const out = title ? [title, ...ordered] : ordered;
202
+ return widths && Object.keys(widths).length ? out.map((c) => widths[c.name] ? __spreadProps(__spreadValues({}, c), {
203
+ width: widths[c.name]
204
+ }) : c) : out;
205
+ }
206
+ function shownProperties(columns, visible, {
207
+ limit = 3,
208
+ exclude = []
209
+ } = {}) {
210
+ const pool = columns.filter((c) => c.type !== "title" && !exclude.includes(c.name));
211
+ if (visible) return visible.map((n) => pool.find((c) => c.name === n)).filter((c) => !!c);
212
+ return pool.slice(0, limit);
213
+ }
214
+ function remapSettingsProperty(settings, from, to) {
215
+ if (!settings || typeof settings !== "object" || Array.isArray(settings)) return null;
216
+ const s = settings;
217
+ const next = __spreadValues({}, s);
218
+ let changed = false;
219
+ const calcs = s.calculations;
220
+ if (calcs && typeof calcs === "object" && from in calcs) {
221
+ const _a = calcs, {
222
+ [from]: kind
223
+ } = _a, rest = __objRest(_a, [
224
+ __restKey(from)
225
+ ]);
226
+ next.calculations = to === null ? rest : __spreadProps(__spreadValues({}, rest), {
227
+ [to]: kind
228
+ });
229
+ changed = true;
230
+ }
231
+ if (Array.isArray(s.wrapColumns) && s.wrapColumns.includes(from)) {
232
+ next.wrapColumns = to === null ? s.wrapColumns.filter((n) => n !== from) : s.wrapColumns.map((n) => n === from ? to : n);
233
+ changed = true;
234
+ }
235
+ const chart = s.chart;
236
+ if (chart && typeof chart === "object") {
237
+ const c = __spreadValues({}, chart);
238
+ for (const key of ["groupBy", "valueProperty"]) {
239
+ if (c[key] !== from) continue;
240
+ if (to === null) delete c[key];
241
+ else c[key] = to;
242
+ changed = true;
243
+ }
244
+ next.chart = c;
245
+ }
246
+ return changed ? next : null;
247
+ }
248
+ function renameViewProperty(view, from, to) {
249
+ const patch = {};
250
+ if (view.groupBy === from) patch.groupBy = to;
251
+ const settings = remapSettingsProperty(view.settings, from, to);
252
+ if (settings) patch.settings = settings;
253
+ if (Array.isArray(view.properties)) {
254
+ let changed = false;
255
+ const next = view.properties.map((p) => {
256
+ var _a;
257
+ const name = typeof p === "string" ? p : (_a = p == null ? void 0 : p.property) != null ? _a : p == null ? void 0 : p.name;
258
+ if (name !== from) return p;
259
+ changed = true;
260
+ return typeof p === "string" ? to : __spreadValues(__spreadProps(__spreadValues({}, p), {
261
+ property: to
262
+ }), (p == null ? void 0 : p.name) !== void 0 ? {
263
+ name: to
264
+ } : {});
265
+ });
266
+ if (changed) patch.properties = next;
267
+ }
268
+ return Object.keys(patch).length ? patch : null;
269
+ }
270
+ function parseViewSettings(raw) {
271
+ return raw && typeof raw === "object" && !Array.isArray(raw) ? __spreadValues({}, raw) : {};
272
+ }
273
+ function mergeViewSettings(base, patch) {
274
+ const next = __spreadValues({}, base != null ? base : {});
275
+ for (const [k, v] of Object.entries(patch)) {
276
+ if (v === void 0) delete next[k];
277
+ else next[k] = v;
278
+ }
279
+ return next;
280
+ }
281
+ const CARD_SIZES = [{
282
+ size: "small",
283
+ label: "Small"
284
+ }, {
285
+ size: "medium",
286
+ label: "Medium"
287
+ }, {
288
+ size: "large",
289
+ label: "Large"
290
+ }];
291
+ function readCardLayout(settings, defaults = {}) {
292
+ var _a, _b;
293
+ const s = parseViewSettings(settings);
294
+ const size = CARD_SIZES.some((c) => c.size === s.cardSize) ? s.cardSize : (_a = defaults.size) != null ? _a : "medium";
295
+ const cover = typeof s.cardCover === "boolean" ? s.cardCover : (_b = defaults.cover) != null ? _b : false;
296
+ const coverSource = typeof s.cardCoverSource === "string" && s.cardCoverSource ? s.cardCoverSource : "auto";
297
+ return {
298
+ cover,
299
+ size,
300
+ coverSource
301
+ };
302
+ }
303
+ function readBoardGroups(settings) {
304
+ const s = parseViewSettings(settings);
305
+ const list = (v) => Array.isArray(v) ? v.filter((x) => typeof x === "string") : [];
306
+ return {
307
+ collapsed: list(s.collapsedGroups),
308
+ hidden: list(s.hiddenGroups)
309
+ };
310
+ }export{CARD_SIZES,DEFAULT_VIEW_ID,MAX_VIEW_NAME,VIEW_TYPES,buildNewView,isViewType,layoutPropertyCandidates,mergeViewSettings,parseHiddenProperties,parseViewSettings,parseViewWidths,parseVisibleProperties,readBoardGroups,readCardLayout,remapSettingsProperty,renameViewProperty,serializeVisibleProperties,shownProperties,tableDisplayColumns,uniqueViewName,validateViewName,viewLayout};//# sourceMappingURL=databaseViews.js.map