@adminide-stack/yantra-mobile 12.0.140 → 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 (213) 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/discover/DiscoverArticle.js +105 -92
  12. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  13. package/lib/features/discover/DiscoverFeed.js +97 -48
  14. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  15. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  16. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  17. package/lib/features/discover/DiscoverSidebar.js +555 -0
  18. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  19. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  20. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  21. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  22. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  23. package/lib/features/discover/followUpQuery.js +42 -0
  24. package/lib/features/discover/followUpQuery.js.map +1 -0
  25. package/lib/features/discover/markets.js +37 -0
  26. package/lib/features/discover/markets.js.map +1 -0
  27. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  28. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  29. package/lib/features/discover/weather.js +42 -0
  30. package/lib/features/discover/weather.js.map +1 -0
  31. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  32. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  33. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  34. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  35. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  36. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  37. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  38. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  39. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  40. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  41. package/lib/features/notion/NotionBlockSheets.js +206 -0
  42. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  43. package/lib/features/notion/NotionBlockView.js +36 -0
  44. package/lib/features/notion/NotionBlockView.js.map +1 -0
  45. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  46. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  47. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  48. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  49. package/lib/features/notion/NotionHistorySheet.js +439 -0
  50. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  51. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  52. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  53. package/lib/features/notion/NotionMentionSheet.js +279 -0
  54. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  55. package/lib/features/notion/NotionPageMenu.js +585 -0
  56. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  57. package/lib/features/notion/NotionPageTree.js +220 -0
  58. package/lib/features/notion/NotionPageTree.js.map +1 -0
  59. package/lib/features/notion/NotionPageView.js +1253 -152
  60. package/lib/features/notion/NotionPageView.js.map +1 -1
  61. package/lib/features/notion/NotionShareSheet.js +606 -0
  62. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  63. package/lib/features/notion/NotionSheets.js +87 -15
  64. package/lib/features/notion/NotionSheets.js.map +1 -1
  65. package/lib/features/notion/NotionSidebarSections.js +492 -0
  66. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  67. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  68. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  69. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  70. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  71. package/lib/features/notion/database/DatabaseCells.js +554 -0
  72. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  73. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  74. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  75. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  76. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  77. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  78. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  79. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  80. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  81. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  82. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  83. package/lib/features/notion/database/chartData.js +89 -0
  84. package/lib/features/notion/database/chartData.js.map +1 -0
  85. package/lib/features/notion/database/chartView.js +112 -0
  86. package/lib/features/notion/database/chartView.js.map +1 -0
  87. package/lib/features/notion/database/connectorButton.js +33 -0
  88. package/lib/features/notion/database/connectorButton.js.map +1 -0
  89. package/lib/features/notion/database/databaseCalc.js +208 -0
  90. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  91. package/lib/features/notion/database/databaseCalendar.js +157 -0
  92. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  93. package/lib/features/notion/database/databaseCsv.js +98 -0
  94. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  95. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  96. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  97. package/lib/features/notion/database/databaseFilter.js +473 -0
  98. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  99. package/lib/features/notion/database/databaseFormula.js +1072 -0
  100. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  101. package/lib/features/notion/database/databaseGroup.js +151 -0
  102. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  103. package/lib/features/notion/database/databaseRollup.js +58 -0
  104. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  105. package/lib/features/notion/database/databaseTimeline.js +156 -0
  106. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  107. package/lib/features/notion/database/databaseView.js +1188 -0
  108. package/lib/features/notion/database/databaseView.js.map +1 -0
  109. package/lib/features/notion/database/databaseViews.js +310 -0
  110. package/lib/features/notion/database/databaseViews.js.map +1 -0
  111. package/lib/features/notion/database/relationSource.js +92 -0
  112. package/lib/features/notion/database/relationSource.js.map +1 -0
  113. package/lib/features/notion/database/uniqueId.js +17 -0
  114. package/lib/features/notion/database/uniqueId.js.map +1 -0
  115. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  116. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  117. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  118. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  119. package/lib/features/notion/notionCodeLanguages.js +112 -0
  120. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  121. package/lib/features/notion/notionComments.js +86 -0
  122. package/lib/features/notion/notionComments.js.map +1 -0
  123. package/lib/features/notion/notionConnections.js +74 -0
  124. package/lib/features/notion/notionConnections.js.map +1 -0
  125. package/lib/features/notion/notionDocuments.js +453 -1
  126. package/lib/features/notion/notionDocuments.js.map +1 -1
  127. package/lib/features/notion/notionEditorModel.js +142 -7
  128. package/lib/features/notion/notionEditorModel.js.map +1 -1
  129. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  130. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  131. package/lib/features/notion/notionMedia.js +119 -0
  132. package/lib/features/notion/notionMedia.js.map +1 -0
  133. package/lib/features/notion/notionMentionDate.js +32 -0
  134. package/lib/features/notion/notionMentionDate.js.map +1 -0
  135. package/lib/features/notion/notionMentionOptions.js +162 -0
  136. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  137. package/lib/features/notion/notionNotesAgent.js +445 -0
  138. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  139. package/lib/features/notion/notionPageAccess.js +168 -0
  140. package/lib/features/notion/notionPageAccess.js.map +1 -0
  141. package/lib/features/notion/notionPageActions.js +138 -0
  142. package/lib/features/notion/notionPageActions.js.map +1 -0
  143. package/lib/features/notion/notionPageHistory.js +154 -0
  144. package/lib/features/notion/notionPageHistory.js.map +1 -0
  145. package/lib/features/notion/notionPageKinds.js +200 -0
  146. package/lib/features/notion/notionPageKinds.js.map +1 -0
  147. package/lib/features/notion/notionRecents.js +48 -0
  148. package/lib/features/notion/notionRecents.js.map +1 -0
  149. package/lib/features/notion/notionRichText.js +177 -0
  150. package/lib/features/notion/notionRichText.js.map +1 -0
  151. package/lib/features/notion/notionRichTitle.js +336 -0
  152. package/lib/features/notion/notionRichTitle.js.map +1 -0
  153. package/lib/features/notion/useNotionWorkspace.js +272 -13
  154. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  155. package/lib/features/notion/usePageActions.js +155 -0
  156. package/lib/features/notion/usePageActions.js.map +1 -0
  157. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  158. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  159. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  160. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  161. package/lib/features/study/StudyAgentChatPane.js +1 -1
  162. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  163. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  164. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  165. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  166. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  167. package/lib/features/webbuilder/buildFragments.js +1 -1
  168. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  169. package/lib/features/webbuilder/codeFiles.js +302 -0
  170. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  171. package/lib/features/webbuilder/codeHighlight.js +209 -0
  172. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  173. package/lib/features/webbuilder/components/CodeView.js +682 -52
  174. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  175. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  176. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  177. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  178. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  179. package/lib/features/webbuilder/stepLabels.js +68 -0
  180. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  181. package/lib/hooks/useHostChatSteering.js +45 -0
  182. package/lib/hooks/useHostChatSteering.js.map +1 -0
  183. package/lib/screens/Chat/index.js +2 -12
  184. package/lib/screens/Chat/index.js.map +1 -1
  185. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  186. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  187. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  188. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  189. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  190. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  191. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  192. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  193. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  194. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  195. package/lib/screens/NotionPage/index.js +2 -2
  196. package/lib/screens/NotionPage/index.js.map +1 -1
  197. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  198. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  199. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  200. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  201. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  202. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  203. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  204. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  205. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  206. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  207. package/lib/screens/WebBuilderNative/index.js +1 -1
  208. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  209. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  210. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  211. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  212. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  213. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseViews.js","sources":["../../../../src/features/notion/database/databaseViews.ts"],"sourcesContent":["/**\n * databaseViews — pure helpers for a database's views (tabs): view types, names, the per-view\n * layout settings and their persisted shapes.\n *\n * Persisted view fields (NotionDatabaseView): `type`, `name`, `filter` (`{ and: [...] }`, see\n * utils/databaseFilter.ts), `sorts`, `groupBy` and `properties`.\n * - `groupBy` holds the layout property: the select / status property a board (or a grouped\n * table) groups by, and the date property a calendar or timeline lays rows out by (a\n * timeline bar spans the date's `{ start, end }` range). (The API has no separate field.)\n * - `properties` is the list of visible properties for gallery cards / list rows:\n * `[{ property, visible: true }, …]` in display order. Absent = a sensible default.\n */\nimport type { ColumnLike } from './databaseView';\n\nexport type ViewType = 'table' | 'board' | 'calendar' | 'timeline' | 'gallery' | 'list' | 'chart';\n\nexport const VIEW_TYPES: Array<{ type: ViewType; label: string; glyph: string; hint: string }> = [\n { type: 'table', label: 'Table', glyph: '▦', hint: 'Rows and columns' },\n { type: 'board', label: 'Board', glyph: '▥', hint: 'Cards grouped by a select property' },\n { type: 'calendar', label: 'Calendar', glyph: '▤', hint: 'Rows on a month grid by date' },\n { type: 'timeline', label: 'Timeline', glyph: '═', hint: 'Bars on a date axis (start → end)' },\n { type: 'gallery', label: 'Gallery', glyph: '▣', hint: 'Cards with a cover image' },\n { type: 'list', label: 'List', glyph: '☰', hint: 'Compact rows' },\n { type: 'chart', label: 'Chart', glyph: '▮', hint: 'Bars or a donut of rows per group' },\n];\n\n/** Synthetic id for the implicit table view of a database that has no saved views yet. */\nexport const DEFAULT_VIEW_ID = '__default_table__';\n\nexport function isViewType(type: unknown): type is ViewType {\n return VIEW_TYPES.some((t) => t.type === type);\n}\n\n/** The layout to render: unknown / unsupported types fall back to table. */\nexport function viewLayout(type: unknown): ViewType {\n return isViewType(type) ? type : 'table';\n}\n\nexport function viewTypeLabel(type: string): string {\n return VIEW_TYPES.find((t) => t.type === type)?.label ?? 'Table';\n}\n\nexport function viewTypeGlyph(type: string): string {\n return VIEW_TYPES.find((t) => t.type === type)?.glyph ?? '▦';\n}\n\n/** \"Calendar\", \"Calendar 2\", … unique among existing view names (case-insensitive). */\nexport function uniqueViewName(existing: Array<{ name: string }>, base: string): string {\n const taken = new Set(existing.map((v) => v.name.trim().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 const MAX_VIEW_NAME = 80;\n\nexport function validateViewName(name: string): string | null {\n const n = name.trim();\n if (!n) return 'Name is required';\n if (n.length > MAX_VIEW_NAME) return `Keep it under ${MAX_VIEW_NAME} characters`;\n return null;\n}\n\n/** View types laid out by a date property (stored in `groupBy`). */\nexport function isDateLayout(type: string): boolean {\n return type === 'calendar' || type === 'timeline';\n}\n\n/** Properties a view type can lay out by: status / selects for board, date-likes for calendar / timeline. */\nexport function layoutPropertyCandidates(type: ViewType, columns: ColumnLike[]): ColumnLike[] {\n if (type === 'board') {\n // Status first (Notion boards group by Status by default).\n return [\n ...columns.filter((c) => c.type === 'status'),\n ...columns.filter((c) => c.type === 'select'),\n // Connector properties with a select result (\"Pull request\": Open / Merged) group read-only.\n ...columns.filter((c) => c.type === 'connector' && c.connector?.resultType === 'select'),\n ];\n }\n if (type === 'calendar' || type === 'timeline') {\n return columns.filter((c) => c.type === 'date' || c.type === 'created_time' || c.type === 'last_edited_time');\n }\n return [];\n}\n\nexport interface NewViewDraft {\n type: ViewType;\n name: string;\n /** Board: status / select property; calendar / timeline: date property. */\n layoutProperty?: string | null;\n}\n\nexport type NewViewResult =\n | { ok: true; input: { type: ViewType; name: string; groupBy?: string }; error?: undefined }\n | { ok: false; error: string; input?: undefined };\n\n/**\n * Validate a \"+ New view\" draft into the create input. A calendar needs a date property; a board\n * without a select property is allowed (it shows its \"add a Status property\" empty state).\n */\nexport function buildNewView(draft: NewViewDraft, columns: ColumnLike[]): NewViewResult {\n const nameError = validateViewName(draft.name);\n if (nameError) return { ok: false, error: nameError };\n const name = draft.name.trim();\n const candidates = layoutPropertyCandidates(draft.type, columns);\n if (draft.type === 'calendar' || draft.type === 'timeline') {\n const prop = candidates.find((c) => c.name === draft.layoutProperty) ?? candidates[0];\n if (!prop) {\n return {\n ok: false,\n error: `A ${draft.type === 'calendar' ? 'calendar' : 'timeline'} needs a Date property — add one first`,\n };\n }\n return { ok: true, input: { type: draft.type, name, groupBy: prop.name } };\n }\n if (draft.type === 'board') {\n const prop = candidates.find((c) => c.name === draft.layoutProperty) ?? candidates[0];\n return { ok: true, input: prop ? { type: 'board', name, groupBy: prop.name } : { type: 'board', name } };\n }\n return { ok: true, input: { type: draft.type, name } };\n}\n\n/**\n * Visible properties of a view (`properties` field), in order, limited to existing columns.\n * Accepts `[{ property, visible }]`, `[{ name, visible }]` or plain names. Null = not configured.\n */\nexport function parseVisibleProperties(properties: unknown, columns: ColumnLike[]): string[] | null {\n if (!Array.isArray(properties)) return null;\n const names = new Set(columns.map((c) => c.name));\n const out: string[] = [];\n for (const p of properties) {\n const name =\n typeof p === 'string' ? p : p && typeof p === 'object' ? ((p as any).property ?? (p as any).name) : null;\n const visible = typeof p === 'string' ? true : (p as any)?.visible !== false;\n if (typeof name === 'string' && visible && names.has(name) && !out.includes(name)) out.push(name);\n }\n return out;\n}\n\nexport function serializeVisibleProperties(\n names: string[],\n widths?: Record<string, number>,\n /** Every property: the ones not in `names` are saved as hidden (so a later-added one shows). */\n allNames?: string[],\n): Array<{ property: string; visible: boolean; width?: number }> {\n const entry = (property: string, visible: boolean) =>\n widths?.[property] ? { property, visible, width: widths[property] } : { property, visible };\n return [\n ...names.map((n) => entry(n, true)),\n ...(allNames ?? []).filter((n) => !names.includes(n)).map((n) => entry(n, false)),\n ];\n}\n\n/** Properties a view hides explicitly (`visible: false`). */\nexport function parseHiddenProperties(properties: unknown): string[] {\n if (!Array.isArray(properties)) return [];\n return properties\n .filter((p) => p && typeof p === 'object' && (p as any).visible === false)\n .map((p) => (p as any).property ?? (p as any).name)\n .filter((n): n is string => typeof n === 'string');\n}\n\n/** Saved column widths of a view (`properties[].width`). */\nexport function parseViewWidths(properties: unknown): Record<string, number> {\n const out: Record<string, number> = {};\n if (!Array.isArray(properties)) return out;\n for (const p of properties) {\n const name = p && typeof p === 'object' ? ((p as any).property ?? (p as any).name) : null;\n const w = p && typeof p === 'object' ? Number((p as any).width) : NaN;\n if (typeof name === 'string' && Number.isFinite(w) && w > 0) out[name] = w;\n }\n return out;\n}\n\n/**\n * Table columns as shown: the title first, then the view's visible properties in their saved order\n * (all properties when the view has no list yet), with saved widths applied.\n */\nexport function tableDisplayColumns<C extends { name: string; type: string; width?: number }>(\n all: C[],\n visible: string[] | null,\n widths?: Record<string, number>,\n hidden: string[] = [],\n): C[] {\n const title = all.find((c) => c.type === 'title');\n const rest = all.filter((c) => c !== title);\n // Saved order first; properties the view has never seen (added later) follow, unless hidden.\n const ordered = visible\n ? [\n ...visible.map((n) => rest.find((c) => c.name === n)).filter((c): c is C => !!c),\n ...rest.filter((c) => !visible.includes(c.name) && !hidden.includes(c.name)),\n ]\n : rest;\n const out = title ? [title, ...ordered] : ordered;\n return widths && Object.keys(widths).length\n ? out.map((c) => (widths[c.name] ? { ...c, width: widths[c.name] } : c))\n : out;\n}\n\n/**\n * Properties shown on a gallery card / list row: the configured ones, else up to `limit`\n * non-title properties (skipping `exclude`, e.g. a board's group property).\n */\nexport function shownProperties<C extends ColumnLike>(\n columns: C[],\n visible: string[] | null,\n { limit = 3, exclude = [] as string[] } = {},\n): C[] {\n const pool = columns.filter((c) => c.type !== 'title' && !exclude.includes(c.name));\n if (visible) return visible.map((n) => pool.find((c) => c.name === n)).filter((c): c is C => !!c);\n return pool.slice(0, limit);\n}\n\n/** Move `name` up / down in a visible-properties list (no-op at the edges). */\nexport function moveInList(list: string[], name: string, delta: -1 | 1): string[] {\n const i = list.indexOf(name);\n const j = i + delta;\n if (i < 0 || j < 0 || j >= list.length) return list;\n const next = [...list];\n [next[i], next[j]] = [next[j], next[i]];\n return next;\n}\n\n/**\n * View settings that name properties (footer calculations, wrapped columns, chart axes) after a\n * rename (`to`) or delete (`to === null`). Null when nothing changes.\n */\nexport function remapSettingsProperty(settings: unknown, from: string, to: string | null): ViewSettings | null {\n if (!settings || typeof settings !== 'object' || Array.isArray(settings)) return null;\n const s = settings as ViewSettings;\n const next: ViewSettings = { ...s };\n let changed = false;\n const calcs = s.calculations;\n if (calcs && typeof calcs === 'object' && from in calcs) {\n const { [from]: kind, ...rest } = calcs as Record<string, string>;\n next.calculations = to === null ? rest : { ...rest, [to]: kind };\n changed = true;\n }\n if (Array.isArray(s.wrapColumns) && s.wrapColumns.includes(from)) {\n next.wrapColumns =\n to === null ? s.wrapColumns.filter((n) => n !== from) : s.wrapColumns.map((n) => (n === from ? to : n));\n changed = true;\n }\n const chart = s.chart as Record<string, unknown> | undefined;\n if (chart && typeof chart === 'object') {\n const c = { ...chart };\n for (const key of ['groupBy', 'valueProperty']) {\n if (c[key] !== from) continue;\n if (to === null) delete c[key];\n else c[key] = to;\n changed = true;\n }\n next.chart = c;\n }\n return changed ? next : null;\n}\n\n/** Point a view's layout / visible properties at a renamed property. */\nexport function renameViewProperty<V extends { groupBy?: string | null; properties?: unknown; settings?: unknown }>(\n view: V,\n from: string,\n to: string,\n): Partial<V> | null {\n const patch: Partial<V> = {};\n if (view.groupBy === from) (patch as any).groupBy = to;\n const settings = remapSettingsProperty(view.settings, from, to);\n if (settings) (patch as any).settings = settings;\n if (Array.isArray(view.properties)) {\n let changed = false;\n const next = view.properties.map((p: any) => {\n const name = typeof p === 'string' ? p : (p?.property ?? p?.name);\n if (name !== from) return p;\n changed = true;\n return typeof p === 'string' ? to : { ...p, property: to, ...(p?.name !== undefined ? { name: to } : {}) };\n });\n if (changed) (patch as any).properties = next;\n }\n return Object.keys(patch).length ? patch : null;\n}\n\n/**\n * Free-form per-view options, saved as the view's `settings` (server: NotionDatabaseView.settings).\n * Every key is optional; unknown keys from newer clients are kept as-is.\n */\nexport interface ViewSettings {\n /** Footer calculation per property (utils/databaseCalc CalcKind). */\n calculations?: Record<string, string>;\n /** Table: wrap cell text instead of truncating. */\n wrap?: boolean;\n /** Table: columns whose cells wrap their text (\"Wrap column\"). */\n wrapColumns?: string[];\n /** Table: keep the first N property columns in view while scrolling sideways. */\n frozenColumns?: number;\n /** Board / grouped table: leave out groups with no rows. */\n hideEmptyGroups?: boolean;\n [key: string]: unknown;\n}\n\nexport function parseViewSettings(raw: unknown): ViewSettings {\n return raw && typeof raw === 'object' && !Array.isArray(raw) ? { ...(raw as ViewSettings) } : {};\n}\n\n/** Merge a patch into settings; `undefined` values remove the key. */\nexport function mergeViewSettings(base: ViewSettings | undefined, patch: Partial<ViewSettings>): ViewSettings {\n const next: ViewSettings = { ...(base ?? {}) };\n for (const [k, v] of Object.entries(patch)) {\n if (v === undefined) delete next[k];\n else next[k] = v;\n }\n return next;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Card layout (board / gallery) and board group visibility, kept in the view's `settings`.\n// ---------------------------------------------------------------------------------------------\n\nexport type CardSize = 'small' | 'medium' | 'large';\n\nexport interface CardLayout {\n /** Show the page cover (or the first image in a files property) on top of each card. */\n cover: boolean;\n size: CardSize;\n /**\n * Gallery \"Card preview\": 'auto' (page cover, else the first image in a files property),\n * 'cover' (page cover only), 'none', or the name of one files property.\n */\n coverSource?: string;\n}\n\nexport const CARD_SIZES: Array<{ size: CardSize; label: string }> = [\n { size: 'small', label: 'Small' },\n { size: 'medium', label: 'Medium' },\n { size: 'large', label: 'Large' },\n];\n\nexport function readCardLayout(settings: unknown, defaults: Partial<CardLayout> = {}): CardLayout {\n const s = parseViewSettings(settings);\n const size = CARD_SIZES.some((c) => c.size === s.cardSize) ? (s.cardSize as CardSize) : (defaults.size ?? 'medium');\n const cover = typeof s.cardCover === 'boolean' ? s.cardCover : (defaults.cover ?? false);\n const coverSource = typeof s.cardCoverSource === 'string' && s.cardCoverSource ? s.cardCoverSource : 'auto';\n return { cover, size, coverSource };\n}\n\n/** Group keys ('' = the empty group) the board shows collapsed, or leaves out (\"Hide group\"). */\nexport function readBoardGroups(settings: unknown): { collapsed: string[]; hidden: string[] } {\n const s = parseViewSettings(settings);\n const list = (v: unknown) => (Array.isArray(v) ? v.filter((x): x is string => typeof x === 'string') : []);\n return { collapsed: list(s.collapsedGroups), hidden: list(s.hiddenGroups) };\n}\n\n/** Add or remove `key` from a settings list; an empty list is removed from settings. */\nexport function toggleInList(list: string[], key: string, on: boolean): string[] | undefined {\n const next = on ? (list.includes(key) ? list : [...list, key]) : list.filter((k) => k !== key);\n return next.length ? next : undefined;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import {jsx}from'react/jsx-runtime';import {useMemo,useState,useEffect,createContext,useContext}from'react';import {useApolloClient}from'@apollo/client/index.js';import {NATIVE_NOTION_BLOCK,NATIVE_NOTION_QUERY_DATABASE}from'../notionDocuments.js';import {databaseTitle}from'./useNotionDatabase.js';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
+ function useRelationSource(columns, selfId, selfRows, selfSchema) {
21
+ const client = useApolloClient();
22
+ const targets = useMemo(() => [...new Set(columns.filter((c) => c.type === "relation" && c.databaseId && c.databaseId !== selfId).map((c) => c.databaseId))].sort(), [columns, selfId]);
23
+ const key = targets.join(",");
24
+ const [loaded, setLoaded] = useState({});
25
+ useEffect(() => {
26
+ let live = true;
27
+ targets.forEach(async (databaseId) => {
28
+ var _a, _b, _c;
29
+ try {
30
+ const [block, rows] = await Promise.all([client.query({
31
+ query: NATIVE_NOTION_BLOCK,
32
+ variables: {
33
+ input: {
34
+ blockId: databaseId
35
+ }
36
+ },
37
+ fetchPolicy: "cache-first"
38
+ }), client.query({
39
+ query: NATIVE_NOTION_QUERY_DATABASE,
40
+ variables: {
41
+ input: {
42
+ databaseId,
43
+ pageSize: 200
44
+ }
45
+ },
46
+ fetchPolicy: "network-only"
47
+ })]);
48
+ if (!live) return;
49
+ const list = (_c = (_b = (_a = rows.data) == null ? void 0 : _a.queryDatabase) == null ? void 0 : _b.results) != null ? _c : [];
50
+ setLoaded((prev) => {
51
+ var _a2, _b2, _c2, _d;
52
+ return __spreadProps(__spreadValues({}, prev), {
53
+ [databaseId]: {
54
+ schema: (_d = (_c2 = (_b2 = (_a2 = block.data) == null ? void 0 : _a2.getBlock) == null ? void 0 : _b2.properties) == null ? void 0 : _c2.schema) != null ? _d : {},
55
+ rows: new Map(list.filter((r) => r == null ? void 0 : r.id).map((r) => [r.id, r]))
56
+ }
57
+ });
58
+ });
59
+ } catch (e) {
60
+ }
61
+ });
62
+ return () => {
63
+ live = false;
64
+ };
65
+ }, [client, key]);
66
+ const self = useMemo(() => new Map(selfRows.map((r) => [r.id, r])), [selfRows]);
67
+ return useMemo(() => ({
68
+ rowOf: (databaseId, rowId) => {
69
+ var _a;
70
+ return databaseId === selfId ? self.get(rowId) : (_a = loaded[databaseId]) == null ? void 0 : _a.rows.get(rowId);
71
+ },
72
+ schemaOf: (databaseId) => {
73
+ var _a;
74
+ return databaseId === selfId ? selfSchema : (_a = loaded[databaseId]) == null ? void 0 : _a.schema;
75
+ },
76
+ titleOf: (databaseId, rowId) => {
77
+ var _a;
78
+ const row = databaseId === selfId ? self.get(rowId) : (_a = loaded[databaseId]) == null ? void 0 : _a.rows.get(rowId);
79
+ return row ? databaseTitle(row.properties) || "Untitled" : void 0;
80
+ }
81
+ }), [loaded, self, selfId, selfSchema]);
82
+ }
83
+ const RelationContext = createContext(null);
84
+ function RelationProvider({
85
+ source,
86
+ children
87
+ }) {
88
+ return /* @__PURE__ */ jsx(RelationContext.Provider, { value: source, children });
89
+ }
90
+ function useRelationTitles() {
91
+ return useContext(RelationContext);
92
+ }export{RelationProvider,useRelationSource,useRelationTitles};//# sourceMappingURL=relationSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationSource.js","sources":["../../../../src/features/notion/database/relationSource.tsx"],"sourcesContent":["/**\n * Related databases for relation and rollup properties - the web components/DatabaseRelation\n * source on a phone. Every database a relation points at is read once (its schema and first\n * page of rows), so relation cells show the related rows' titles and rollups compute from them.\n */\nimport React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { useApolloClient } from '@apollo/client';\nimport { NATIVE_NOTION_BLOCK, NATIVE_NOTION_QUERY_DATABASE } from '../notionDocuments';\nimport type { RollupSource } from './databaseRollup';\nimport type { ColumnLike } from './databaseView';\nimport { databaseTitle } from './useNotionDatabase';\n\ntype RelatedRow = { id: string; properties?: Record<string, any>; createdTime?: string; lastEditedTime?: string };\ntype Related = { schema: Record<string, { type?: string }>; rows: Map<string, RelatedRow> };\n\nexport interface RelationSource extends RollupSource {\n titleOf: (databaseId: string, rowId: string) => string | undefined;\n}\n\nexport function useRelationSource(\n columns: ColumnLike[],\n selfId: string,\n selfRows: RelatedRow[],\n selfSchema: Record<string, { type?: string }>,\n): RelationSource {\n const client = useApolloClient();\n const targets = useMemo(\n () =>\n [\n ...new Set(\n columns\n .filter((c) => c.type === 'relation' && c.databaseId && c.databaseId !== selfId)\n .map((c) => c.databaseId as string),\n ),\n ].sort(),\n [columns, selfId],\n );\n const key = targets.join(',');\n const [loaded, setLoaded] = useState<Record<string, Related>>({});\n\n useEffect(() => {\n let live = true;\n targets.forEach(async (databaseId) => {\n try {\n const [block, rows] = await Promise.all([\n client.query({\n query: NATIVE_NOTION_BLOCK,\n variables: { input: { blockId: databaseId } },\n fetchPolicy: 'cache-first',\n }),\n client.query({\n query: NATIVE_NOTION_QUERY_DATABASE,\n variables: { input: { databaseId, pageSize: 200 } },\n fetchPolicy: 'network-only',\n }),\n ]);\n if (!live) return;\n const list = (rows.data?.queryDatabase?.results ?? []) as RelatedRow[];\n setLoaded((prev) => ({\n ...prev,\n [databaseId]: {\n schema: (block.data?.getBlock?.properties?.schema ?? {}) as Related['schema'],\n rows: new Map(list.filter((r) => r?.id).map((r) => [r.id, r])),\n },\n }));\n } catch {\n /* a missing / forbidden target database leaves its cells as ids */\n }\n });\n return () => {\n live = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, key]);\n\n // The database itself is a valid target (self relations): read it from the rows on screen.\n const self = useMemo(() => new Map(selfRows.map((r) => [r.id, r])), [selfRows]);\n\n return useMemo<RelationSource>(\n () => ({\n rowOf: (databaseId, rowId) =>\n databaseId === selfId ? self.get(rowId) : loaded[databaseId]?.rows.get(rowId),\n schemaOf: (databaseId) => (databaseId === selfId ? selfSchema : loaded[databaseId]?.schema),\n titleOf: (databaseId, rowId) => {\n const row = databaseId === selfId ? self.get(rowId) : loaded[databaseId]?.rows.get(rowId);\n return row ? databaseTitle(row.properties) || 'Untitled' : undefined;\n },\n }),\n [loaded, self, selfId, selfSchema],\n );\n}\n\nconst RelationContext = createContext<RelationSource | null>(null);\n\nexport function RelationProvider({ source, children }: { source: RelationSource; children: React.ReactNode }) {\n return <RelationContext.Provider value={source}>{children}</RelationContext.Provider>;\n}\n\nexport function useRelationTitles(): RelationSource | null {\n return useContext(RelationContext);\n}\n"],"names":["_a","_b","_c"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import {numberValue}from'./databaseView.js';function uniqueIdProperties(schema) {
2
+ return Object.entries(schema != null ? schema : {}).filter(([, def]) => (def == null ? void 0 : def.type) === "unique_id").map(([name]) => name);
3
+ }
4
+ function maxUniqueId(rows, property) {
5
+ var _a;
6
+ let max = 0;
7
+ for (const r of rows) {
8
+ const n = numberValue((_a = r.properties) == null ? void 0 : _a[property]);
9
+ if (n !== null && n > max) max = n;
10
+ }
11
+ return max;
12
+ }
13
+ function formatUniqueId(value, prefix) {
14
+ const n = numberValue(value);
15
+ if (n === null) return "";
16
+ return prefix ? `${prefix}-${n}` : String(n);
17
+ }export{formatUniqueId,maxUniqueId,uniqueIdProperties};//# sourceMappingURL=uniqueId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniqueId.js","sources":["../../../../src/features/notion/database/uniqueId.ts"],"sourcesContent":["/**\n * Unique ID property (`{ type: 'unique_id', prefix? }`): rows are numbered 1, 2, 3 … per\n * database, shown as \"PREFIX-12\". The number is stored on the row; the browser assigns it (on\n * create, on duplicate, and a backfill in creation order when the property is added) until the\n * server keeps a counter.\n */\nimport { numberValue, type DatabaseSchema, type RowLike } from './databaseView';\n\nexport function uniqueIdProperties(schema: DatabaseSchema | undefined): string[] {\n return Object.entries(schema ?? {})\n .filter(([, def]) => def?.type === 'unique_id')\n .map(([name]) => name);\n}\n\nexport function maxUniqueId(rows: RowLike[], property: string): number {\n let max = 0;\n for (const r of rows) {\n const n = numberValue(r.properties?.[property]);\n if (n !== null && n > max) max = n;\n }\n return max;\n}\n\n/** Numbers for rows that have none yet, oldest first, continuing after the current max. */\nexport function uniqueIdBackfill(rows: RowLike[], property: string): Array<{ id: string; value: number }> {\n let next = maxUniqueId(rows, property);\n return [...rows]\n .filter((r) => numberValue(r.properties?.[property]) === null)\n .sort((a, b) => (a.createdTime ?? '').localeCompare(b.createdTime ?? ''))\n .map((r) => ({ id: r.id, value: ++next }));\n}\n\nexport function formatUniqueId(value: unknown, prefix?: string | null): string {\n const n = numberValue(value);\n if (n === null) return '';\n return prefix ? `${prefix}-${n}` : String(n);\n}\n"],"names":[],"mappings":"4CAOO,SAAS,mBAAmB,MAA8C,EAAA;AAC/E,EAAO,OAAA,MAAA,CAAO,QAAQ,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,EAAE,CAAE,CAAA,MAAA,CAAO,CAAC,GAAG,GAAG,CAAM,KAAA,CAAA,GAAA,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAK,UAAS,WAAW,CAAA,CAAE,IAAI,CAAC,CAAC,IAAI,CAAA,KAAM,IAAI,CAAA;AACzG;AACgB,SAAA,WAAA,CAAY,MAAiB,QAA0B,EAAA;AAVvE,EAAA,IAAA,EAAA;AAWE,EAAA,IAAI,GAAM,GAAA,CAAA;AACV,EAAA,KAAA,MAAW,KAAK,IAAM,EAAA;AACpB,IAAA,MAAM,CAAI,GAAA,WAAA,CAAA,CAAY,EAAE,GAAA,CAAA,CAAA,UAAA,KAAF,mBAAe,QAAS,CAAA,CAAA;AAC9C,IAAA,IAAI,CAAM,KAAA,IAAA,IAAQ,CAAI,GAAA,GAAA,EAAW,GAAA,GAAA,CAAA;AAAA;AAEnC,EAAO,OAAA,GAAA;AACT;AAagB,SAAA,cAAA,CAAe,OAAgB,MAAgC,EAAA;AAC7E,EAAM,MAAA,CAAA,GAAI,YAAY,KAAK,CAAA;AAC3B,EAAI,IAAA,CAAA,KAAM,MAAa,OAAA,EAAA;AACvB,EAAA,OAAO,SAAS,CAAG,EAAA,MAAM,IAAI,CAAC,CAAA,CAAA,GAAK,OAAO,CAAC,CAAA;AAC7C"}