@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,98 @@
1
+ import {columnLabel}from'./databaseView.js';function csvEscape(value) {
2
+ return /[",\r\n]/.test(value) || /^\s|\s$/.test(value) ? `"${value.replace(/"/g, '""')}"` : value;
3
+ }
4
+ function csvSafeCell(value) {
5
+ if (!/^[=+\-@\t\r]/.test(value)) return value;
6
+ if (/^[+-]?\d+(\.\d+)?$/.test(value.trim())) return value;
7
+ return `'${value}`;
8
+ }
9
+ function toCsv(rows) {
10
+ return rows.map((r) => r.map((c) => csvEscape(csvSafeCell(c != null ? c : ""))).join(",")).join("\r\n") + "\r\n";
11
+ }
12
+ function parseCsv(input) {
13
+ const text = input.replace(/^/, "");
14
+ const rows = [];
15
+ let row = [];
16
+ let cell = "";
17
+ let quoted = false;
18
+ for (let i = 0; i < text.length; i++) {
19
+ const ch = text[i];
20
+ if (quoted) {
21
+ if (ch === '"') {
22
+ if (text[i + 1] === '"') {
23
+ cell += '"';
24
+ i++;
25
+ } else quoted = false;
26
+ } else cell += ch;
27
+ continue;
28
+ }
29
+ if (ch === '"' && cell === "") quoted = true;
30
+ else if (ch === ",") {
31
+ row.push(cell);
32
+ cell = "";
33
+ } else if (ch === "\n" || ch === "\r") {
34
+ if (ch === "\r" && text[i + 1] === "\n") i++;
35
+ row.push(cell);
36
+ rows.push(row);
37
+ row = [];
38
+ cell = "";
39
+ } else cell += ch;
40
+ }
41
+ if (cell !== "" || row.length) {
42
+ row.push(cell);
43
+ rows.push(row);
44
+ }
45
+ while (rows.length && rows[rows.length - 1].every((c) => c.trim() === "")) rows.pop();
46
+ return rows;
47
+ }
48
+ const BOOL = /^(true|false|yes|no|checked|unchecked|x|)$/i;
49
+ const DATE = /^\d{4}-\d{2}-\d{2}$/;
50
+ function inferColumnType(values) {
51
+ const filled = values.map((v) => v.trim()).filter(Boolean);
52
+ if (!filled.length) return "text";
53
+ if (filled.every((v) => /^-?\d+(\.\d+)?$/.test(v.replace(/,/g, "")))) return "number";
54
+ if (filled.every((v) => DATE.test(v))) return "date";
55
+ if (values.every((v) => BOOL.test(v.trim())) && filled.some((v) => /^(true|false|yes|no)$/i.test(v))) return "checkbox";
56
+ return "text";
57
+ }
58
+ function csvCheckbox(v) {
59
+ return /^(true|yes|checked|x)$/i.test(v.trim());
60
+ }
61
+ function planCsvImport(headers, body, schema) {
62
+ var _a, _b, _c;
63
+ const entries = Object.entries(schema);
64
+ const titleKey = (_b = (_a = entries.find(([, d]) => (d == null ? void 0 : d.type) === "title")) == null ? void 0 : _a[0]) != null ? _b : "title";
65
+ const find = (h) => {
66
+ var _a2;
67
+ const k = h.trim().toLowerCase();
68
+ return (_a2 = entries.find(([name, d]) => name.toLowerCase() === k || columnLabel({
69
+ name,
70
+ type: String(d == null ? void 0 : d.type)
71
+ }).toLowerCase() === k)) == null ? void 0 : _a2[0];
72
+ };
73
+ let titleHeader = (_c = headers.find((h) => find(h) === titleKey)) != null ? _c : null;
74
+ if (!titleHeader && headers.length) titleHeader = headers[0];
75
+ const columns = headers.map((header, i) => {
76
+ if (header === titleHeader) return {
77
+ header,
78
+ property: titleKey
79
+ };
80
+ const existing = find(header);
81
+ if (existing) return {
82
+ header,
83
+ property: existing
84
+ };
85
+ return {
86
+ header,
87
+ property: header.trim() || `Column ${i + 1}`,
88
+ create: inferColumnType(body.map((r) => {
89
+ var _a2;
90
+ return (_a2 = r[i]) != null ? _a2 : "";
91
+ }))
92
+ };
93
+ });
94
+ return {
95
+ columns,
96
+ titleHeader
97
+ };
98
+ }export{csvCheckbox,csvEscape,csvSafeCell,inferColumnType,parseCsv,planCsvImport,toCsv};//# sourceMappingURL=databaseCsv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseCsv.js","sources":["../../../../src/features/notion/database/databaseCsv.ts"],"sourcesContent":["/**\n * CSV for databases: export a view, import a file into this database (Notion's \"Export → CSV\"\n * and \"Merge with CSV\").\n *\n * toCsv([['Name','Status'], ['A','Done']]) → \"Name,Status\\r\\nA,Done\\r\\n\" (RFC 4180 quoting)\n * parseCsv(text) → string[][] (quotes, \"\" escapes, CRLF, BOM)\n * inferColumnType(values) → 'number' | 'checkbox' | 'date' | 'text'\n * planCsvImport(headers, schema) → which header maps to which property / new property\n */\nimport { columnLabel, type DatabaseSchema } from './databaseView';\n\nexport function csvEscape(value: string): string {\n return /[\",\\r\\n]/.test(value) || /^\\s|\\s$/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n}\n\n/**\n * Spreadsheets run cells starting with `=`, `+`, `-`, `@`, tab or CR as formulas: such text gets a\n * leading `'` (plain numbers like `-5` are left alone).\n */\nexport function csvSafeCell(value: string): string {\n if (!/^[=+\\-@\\t\\r]/.test(value)) return value;\n if (/^[+-]?\\d+(\\.\\d+)?$/.test(value.trim())) return value;\n return `'${value}`;\n}\n\nexport function toCsv(rows: string[][]): string {\n return rows.map((r) => r.map((c) => csvEscape(csvSafeCell(c ?? ''))).join(',')).join('\\r\\n') + '\\r\\n';\n}\n\nexport function parseCsv(input: string): string[][] {\n const text = input.replace(/^/, '');\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = '';\n let quoted = false;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n if (quoted) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"';\n i++;\n } else quoted = false;\n } else cell += ch;\n continue;\n }\n if (ch === '\"' && cell === '') quoted = true;\n else if (ch === ',') {\n row.push(cell);\n cell = '';\n } else if (ch === '\\n' || ch === '\\r') {\n if (ch === '\\r' && text[i + 1] === '\\n') i++;\n row.push(cell);\n rows.push(row);\n row = [];\n cell = '';\n } else cell += ch;\n }\n if (cell !== '' || row.length) {\n row.push(cell);\n rows.push(row);\n }\n // Drop fully empty trailing lines.\n while (rows.length && rows[rows.length - 1].every((c) => c.trim() === '')) rows.pop();\n return rows;\n}\n\nconst BOOL = /^(true|false|yes|no|checked|unchecked|x|)$/i;\nconst DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** A type for a new property from its CSV values (empty cells don't count). */\nexport function inferColumnType(values: string[]): 'number' | 'checkbox' | 'date' | 'text' {\n const filled = values.map((v) => v.trim()).filter(Boolean);\n if (!filled.length) return 'text';\n if (filled.every((v) => /^-?\\d+(\\.\\d+)?$/.test(v.replace(/,/g, '')))) return 'number';\n if (filled.every((v) => DATE.test(v))) return 'date';\n if (values.every((v) => BOOL.test(v.trim())) && filled.some((v) => /^(true|false|yes|no)$/i.test(v)))\n return 'checkbox';\n return 'text';\n}\n\nexport function csvCheckbox(v: string): boolean {\n return /^(true|yes|checked|x)$/i.test(v.trim());\n}\n\nexport interface CsvImportPlan {\n /** Per header: the existing property it fills, or a new one to create (with its type). */\n columns: Array<{ header: string; property: string; create?: 'number' | 'checkbox' | 'date' | 'text' }>;\n /** Header that becomes the row title (the \"Name\" / first column). */\n titleHeader: string | null;\n}\n\n/**\n * Map CSV headers to properties: same name (case-insensitive, \"Name\" = the title) → that\n * property; otherwise a new property named like the header, typed from its values. The title is\n * the header matching the title property, else the first column.\n */\nexport function planCsvImport(headers: string[], body: string[][], schema: DatabaseSchema): CsvImportPlan {\n const entries = Object.entries(schema);\n const titleKey = entries.find(([, d]) => d?.type === 'title')?.[0] ?? 'title';\n const find = (h: string) => {\n const k = h.trim().toLowerCase();\n return entries.find(\n ([name, d]) => name.toLowerCase() === k || columnLabel({ name, type: String(d?.type) }).toLowerCase() === k,\n )?.[0];\n };\n let titleHeader: string | null = headers.find((h) => find(h) === titleKey) ?? null;\n if (!titleHeader && headers.length) titleHeader = headers[0];\n const columns = headers.map((header, i) => {\n if (header === titleHeader) return { header, property: titleKey };\n const existing = find(header);\n if (existing) return { header, property: existing };\n return {\n header,\n property: header.trim() || `Column ${i + 1}`,\n create: inferColumnType(body.map((r) => r[i] ?? '')),\n };\n });\n return { columns, titleHeader };\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import {toCsv,parseCsv,planCsvImport,csvCheckbox}from'./databaseCsv.js';import {columnLabel,addSchemaProperty,addSchemaOption,toRichText,isComputedType,editorStringToCell,cellToEditorString,cellDisplayText}from'./databaseView.js';function databaseCsv(rows, columns, getValue) {
2
+ const cell = (row, c) => {
3
+ const v = getValue(row, c);
4
+ if (c.type === "checkbox") return v === true || v === "true" ? "Yes" : "No";
5
+ if (c.type === "date") return cellToEditorString(v, "date");
6
+ return cellDisplayText(v, c.type);
7
+ };
8
+ return toCsv([columns.map((c) => columnLabel(c)), ...rows.map((r) => columns.map((c) => cell(r, c)))]);
9
+ }
10
+ function planDatabaseCsvImport(text, schema) {
11
+ const parsed = parseCsv(text);
12
+ if (parsed.length < 2) return {
13
+ ok: false,
14
+ error: "That CSV has no rows to import."
15
+ };
16
+ const [headers, ...body] = parsed;
17
+ const plan = planCsvImport(headers, body, schema);
18
+ let next = schema;
19
+ for (const col of plan.columns) {
20
+ if (!col.create) continue;
21
+ const r = addSchemaProperty(next, col.property, col.create);
22
+ if (r.ok) next = r.schema;
23
+ }
24
+ plan.columns.forEach((col, i) => {
25
+ var _a, _b, _c, _d;
26
+ const type = String((_b = (_a = next[col.property]) == null ? void 0 : _a.type) != null ? _b : "");
27
+ if (type !== "select" && type !== "status" && type !== "multi_select") return;
28
+ for (const r of body) {
29
+ const names = type === "multi_select" ? ((_c = r[i]) != null ? _c : "").split(",") : [(_d = r[i]) != null ? _d : ""];
30
+ for (const n of names.map((x) => x.trim()).filter(Boolean)) {
31
+ const res = addSchemaOption(next, col.property, n);
32
+ if (res.ok) next = res.schema;
33
+ }
34
+ }
35
+ });
36
+ const rows = body.map((r) => {
37
+ const properties = {};
38
+ plan.columns.forEach((col, i) => {
39
+ var _a, _b, _c;
40
+ const raw = ((_a = r[i]) != null ? _a : "").trim();
41
+ if (!raw) return;
42
+ const type = String((_c = (_b = next[col.property]) == null ? void 0 : _b.type) != null ? _c : "text");
43
+ if (type === "title") properties[col.property] = toRichText(raw);
44
+ else if (type === "checkbox") properties[col.property] = csvCheckbox(raw);
45
+ else if (!isComputedType(type)) {
46
+ const v = editorStringToCell(raw, type);
47
+ if (v.ok) properties[col.property] = v.value;
48
+ }
49
+ });
50
+ return properties;
51
+ });
52
+ return {
53
+ ok: true,
54
+ schema: next,
55
+ schemaChanged: next !== schema,
56
+ rows
57
+ };
58
+ }export{databaseCsv,planDatabaseCsvImport};//# sourceMappingURL=databaseCsvActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseCsvActions.js","sources":["../../../../src/features/notion/database/databaseCsvActions.ts"],"sourcesContent":["/**\n * CSV export / import for a database - the web DatabasePage `handleExportCsv` /\n * `handleImportCsv` logic without the browser file plumbing.\n *\n * Export writes the view's columns and rows on screen (dates as YYYY-MM-DD so the file imports\n * back, checkboxes as Yes / No). Import maps headers onto properties (planCsvImport), adds the\n * new properties and any select options the rows use in one schema change, and returns the row\n * properties to create.\n */\nimport { csvCheckbox, parseCsv, planCsvImport, toCsv } from './databaseCsv';\nimport {\n addSchemaOption,\n addSchemaProperty,\n cellDisplayText,\n cellToEditorString,\n columnLabel,\n editorStringToCell,\n isComputedType,\n toRichText,\n type CellGetter,\n type ColumnLike,\n type DatabaseSchema,\n type RowLike,\n} from './databaseView';\n\nexport function databaseCsv(rows: RowLike[], columns: ColumnLike[], getValue: CellGetter): string {\n const cell = (row: RowLike, c: ColumnLike) => {\n const v = getValue(row, c);\n if (c.type === 'checkbox') return v === true || v === 'true' ? 'Yes' : 'No';\n if (c.type === 'date') return cellToEditorString(v, 'date');\n return cellDisplayText(v, c.type);\n };\n return toCsv([columns.map((c) => columnLabel(c)), ...rows.map((r) => columns.map((c) => cell(r, c)))]);\n}\n\nexport type CsvImport =\n | { ok: true; schema: DatabaseSchema; schemaChanged: boolean; rows: Array<Record<string, unknown>> }\n | { ok: false; error: string };\n\nexport function planDatabaseCsvImport(text: string, schema: DatabaseSchema): CsvImport {\n const parsed = parseCsv(text);\n if (parsed.length < 2) return { ok: false, error: 'That CSV has no rows to import.' };\n const [headers, ...body] = parsed;\n const plan = planCsvImport(headers, body, schema);\n let next: DatabaseSchema = schema;\n for (const col of plan.columns) {\n if (!col.create) continue;\n const r = addSchemaProperty(next, col.property, col.create);\n if (r.ok) next = r.schema;\n }\n plan.columns.forEach((col, i) => {\n const type = String(next[col.property]?.type ?? '');\n if (type !== 'select' && type !== 'status' && type !== 'multi_select') return;\n for (const r of body) {\n const names = type === 'multi_select' ? (r[i] ?? '').split(',') : [r[i] ?? ''];\n for (const n of names.map((x) => x.trim()).filter(Boolean)) {\n const res = addSchemaOption(next, col.property, n);\n if (res.ok) next = res.schema;\n }\n }\n });\n const rows = body.map((r) => {\n const properties: Record<string, unknown> = {};\n plan.columns.forEach((col, i) => {\n const raw = (r[i] ?? '').trim();\n if (!raw) return;\n const type = String(next[col.property]?.type ?? 'text');\n if (type === 'title') properties[col.property] = toRichText(raw);\n else if (type === 'checkbox') properties[col.property] = csvCheckbox(raw);\n else if (!isComputedType(type)) {\n const v = editorStringToCell(raw, type);\n if (v.ok) properties[col.property] = v.value;\n }\n });\n return properties;\n });\n return { ok: true, schema: next, schemaChanged: next !== schema, rows };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,473 @@
1
+ import {baseCellValue,rowMatchesFilter,multiSelectNames,selectName,normalizeCellValue,isEmptyCell,cellDisplayText,numberValue,relationIds,dateString}from'./databaseView.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
+ var __objRest = (source, exclude) => {
21
+ var target = {};
22
+ for (var prop in source)
23
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
+ target[prop] = source[prop];
25
+ if (source != null && __getOwnPropSymbols)
26
+ for (var prop of __getOwnPropSymbols(source)) {
27
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
+ target[prop] = source[prop];
29
+ }
30
+ return target;
31
+ };
32
+ function filterItems(conds) {
33
+ const out = [];
34
+ const groups = /* @__PURE__ */ new Map();
35
+ for (const c of conds) {
36
+ if (!c.group) {
37
+ out.push({
38
+ kind: "cond",
39
+ cond: c
40
+ });
41
+ continue;
42
+ }
43
+ let g = groups.get(c.group);
44
+ if (!g) {
45
+ g = {
46
+ kind: "group",
47
+ id: c.group,
48
+ mode: c.groupConj === "or" ? "or" : "and",
49
+ conds: []
50
+ };
51
+ groups.set(c.group, g);
52
+ out.push(g);
53
+ }
54
+ g.conds.push(c);
55
+ }
56
+ return out;
57
+ }
58
+ const O = (op, label, input) => ({
59
+ op,
60
+ label,
61
+ input
62
+ });
63
+ const EMPTY_OPS = [O("is_empty", "is empty", "none"), O("is_not_empty", "is not empty", "none")];
64
+ const TEXT_OPS = [O("contains", "contains", "text"), O("does_not_contain", "does not contain", "text"), O("equals", "is", "text"), O("does_not_equal", "is not", "text"), ...EMPTY_OPS];
65
+ const NUMBER_OPS = [O("equals", "=", "number"), O("does_not_equal", "\u2260", "number"), O("greater_than", ">", "number"), O("less_than", "<", "number"), O("greater_than_or_equal_to", "\u2265", "number"), O("less_than_or_equal_to", "\u2264", "number"), ...EMPTY_OPS];
66
+ const SELECT_OPS = [O("equals", "is", "option"), O("does_not_equal", "is not", "option"), O("is_any_of", "is any of", "options"), O("is_none_of", "is none of", "options"), ...EMPTY_OPS];
67
+ const LIST_OPS = [O("contains", "contains", "option"), O("does_not_contain", "does not contain", "option"), O("is_any_of", "contains any of", "options"), O("is_none_of", "contains none of", "options"), ...EMPTY_OPS];
68
+ const PERSON_OPS = [O("contains", "contains", "text"), O("does_not_contain", "does not contain", "text"), O("is_me", "is me", "none"), O("is_not_me", "is not me", "none"), ...EMPTY_OPS];
69
+ const CHECKBOX_OPS = [O("is_checked", "is checked", "none"), O("is_unchecked", "is unchecked", "none")];
70
+ const DATE_OPS = [O("on", "is on", "date"), O("is_relative", "is", "relative"), O("before", "is before", "date"), O("after", "is after", "date"), O("on_or_before", "is on or before", "date"), O("on_or_after", "is on or after", "date"), O("within_past_days", "is within the past", "days"), O("within_next_days", "is within the next", "days"), ...EMPTY_OPS];
71
+ const RELATIVE_DATES = [{
72
+ value: "today",
73
+ label: "Today"
74
+ }, {
75
+ value: "yesterday",
76
+ label: "Yesterday"
77
+ }, {
78
+ value: "tomorrow",
79
+ label: "Tomorrow"
80
+ }, {
81
+ value: "this_week",
82
+ label: "This week"
83
+ }, {
84
+ value: "last_week",
85
+ label: "Last week"
86
+ }, {
87
+ value: "next_week",
88
+ label: "Next week"
89
+ }, {
90
+ value: "this_month",
91
+ label: "This month"
92
+ }, {
93
+ value: "last_month",
94
+ label: "Last month"
95
+ }, {
96
+ value: "next_month",
97
+ label: "Next month"
98
+ }, {
99
+ value: "past_7_days",
100
+ label: "Past 7 days"
101
+ }, {
102
+ value: "next_7_days",
103
+ label: "Next 7 days"
104
+ }, {
105
+ value: "past_30_days",
106
+ label: "Past 30 days"
107
+ }, {
108
+ value: "next_30_days",
109
+ label: "Next 30 days"
110
+ }];
111
+ function relativeDateRange(token, now = /* @__PURE__ */ new Date()) {
112
+ const today = localDayKey(now);
113
+ const dow = now.getDay();
114
+ const weekStart = shiftDayKey(today, -dow);
115
+ const monthStart = (y2, m2) => localDayKey(new Date(y2, m2, 1));
116
+ const monthEnd = (y2, m2) => localDayKey(new Date(y2, m2 + 1, 0));
117
+ const y = now.getFullYear();
118
+ const m = now.getMonth();
119
+ switch (token) {
120
+ case "today":
121
+ return [today, today];
122
+ case "yesterday":
123
+ return [shiftDayKey(today, -1), shiftDayKey(today, -1)];
124
+ case "tomorrow":
125
+ return [shiftDayKey(today, 1), shiftDayKey(today, 1)];
126
+ case "this_week":
127
+ return [weekStart, shiftDayKey(weekStart, 6)];
128
+ case "last_week":
129
+ return [shiftDayKey(weekStart, -7), shiftDayKey(weekStart, -1)];
130
+ case "next_week":
131
+ return [shiftDayKey(weekStart, 7), shiftDayKey(weekStart, 13)];
132
+ case "this_month":
133
+ return [monthStart(y, m), monthEnd(y, m)];
134
+ case "last_month":
135
+ return [monthStart(y, m - 1), monthEnd(y, m - 1)];
136
+ case "next_month":
137
+ return [monthStart(y, m + 1), monthEnd(y, m + 1)];
138
+ case "past_7_days":
139
+ return [shiftDayKey(today, -7), today];
140
+ case "next_7_days":
141
+ return [today, shiftDayKey(today, 7)];
142
+ case "past_30_days":
143
+ return [shiftDayKey(today, -30), today];
144
+ case "next_30_days":
145
+ return [today, shiftDayKey(today, 30)];
146
+ default:
147
+ return null;
148
+ }
149
+ }
150
+ const FORMULA_OPS = [O("contains", "contains", "text"), O("equals", "is", "text"), O("does_not_equal", "is not", "text"), O("greater_than", ">", "number"), O("less_than", "<", "number"), O("is_checked", "is true", "none"), O("is_unchecked", "is false", "none"), ...EMPTY_OPS];
151
+ function operatorsFor(type) {
152
+ switch (type) {
153
+ case "number":
154
+ case "unique_id":
155
+ return NUMBER_OPS;
156
+ case "select":
157
+ case "status":
158
+ return SELECT_OPS;
159
+ case "multi_select":
160
+ return LIST_OPS;
161
+ case "person":
162
+ return PERSON_OPS;
163
+ case "checkbox":
164
+ return CHECKBOX_OPS;
165
+ case "date":
166
+ case "created_time":
167
+ case "last_edited_time":
168
+ return DATE_OPS;
169
+ case "files":
170
+ return EMPTY_OPS;
171
+ case "relation":
172
+ return [O("contains", "contains", "row"), O("does_not_contain", "does not contain", "row"), ...EMPTY_OPS];
173
+ case "created_by":
174
+ case "last_edited_by":
175
+ return [O("is_me", "is me", "none"), O("is_not_me", "is not me", "none"), ...EMPTY_OPS];
176
+ case "formula":
177
+ case "connector":
178
+ case "rollup":
179
+ return FORMULA_OPS;
180
+ default:
181
+ return TEXT_OPS;
182
+ }
183
+ }
184
+ function operatorInfo(type, op) {
185
+ return operatorsFor(type).find((o) => o.op === op);
186
+ }
187
+ let idSeq = 0;
188
+ function newConditionId() {
189
+ idSeq += 1;
190
+ return `fc${Date.now().toString(36)}${idSeq}`;
191
+ }
192
+ function newCondition(column) {
193
+ const first = operatorsFor(column.type)[0];
194
+ return {
195
+ id: newConditionId(),
196
+ property: column.name,
197
+ operator: first.op,
198
+ value: null
199
+ };
200
+ }
201
+ function isConditionActive(cond, column) {
202
+ if (!column) return false;
203
+ const info = operatorInfo(column.type, cond.operator);
204
+ if (!info) return false;
205
+ if (info.input === "none") return true;
206
+ const v = cond.value;
207
+ if (v === null || v === void 0) return false;
208
+ if (Array.isArray(v)) return v.length > 0;
209
+ if (typeof v === "string") return v.trim() !== "";
210
+ return Number.isFinite(v);
211
+ }
212
+ function isOrMode(conds) {
213
+ return !!(conds == null ? void 0 : conds.length) && conds.every((c) => c.conj === "or");
214
+ }
215
+ function setFilterMode(conds, mode) {
216
+ if (mode === "or" ? isOrMode(conds) : conds.every((c) => !c.conj)) return conds;
217
+ return conds.map((c) => {
218
+ if (mode === "or") return __spreadProps(__spreadValues({}, c), {
219
+ conj: "or"
220
+ });
221
+ const _a = c, {
222
+ conj: _drop
223
+ } = _a, rest = __objRest(_a, [
224
+ "conj"
225
+ ]);
226
+ return rest;
227
+ });
228
+ }
229
+ const pad = (n) => String(n).padStart(2, "0");
230
+ function localDayKey(d) {
231
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
232
+ }
233
+ function dayKeyOf(value) {
234
+ if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : localDayKey(value);
235
+ const s = dateString(value);
236
+ if (!s) return null;
237
+ if (/^\d{4}-\d{2}-\d{2}$/.test(s)) return s;
238
+ const d = new Date(s);
239
+ return Number.isNaN(d.getTime()) ? null : localDayKey(d);
240
+ }
241
+ function shiftDayKey(day, days) {
242
+ const [y, m, d] = day.split("-").map(Number);
243
+ return localDayKey(new Date(y, m - 1, d + days));
244
+ }
245
+ function textMatches(op, haystack, needle) {
246
+ const h = haystack.toLowerCase();
247
+ const n = needle.trim().toLowerCase();
248
+ switch (op) {
249
+ case "contains":
250
+ return h.includes(n);
251
+ case "does_not_contain":
252
+ return !h.includes(n);
253
+ case "equals":
254
+ return h.trim() === n;
255
+ case "does_not_equal":
256
+ return h.trim() !== n;
257
+ default:
258
+ return true;
259
+ }
260
+ }
261
+ function numberMatches(op, n, target) {
262
+ if (n === null) return op === "does_not_equal";
263
+ switch (op) {
264
+ case "equals":
265
+ return n === target;
266
+ case "does_not_equal":
267
+ return n !== target;
268
+ case "greater_than":
269
+ return n > target;
270
+ case "less_than":
271
+ return n < target;
272
+ case "greater_than_or_equal_to":
273
+ return n >= target;
274
+ case "less_than_or_equal_to":
275
+ return n <= target;
276
+ default:
277
+ return true;
278
+ }
279
+ }
280
+ function conditionMatches(cond, value, column, now = /* @__PURE__ */ new Date(), ctx = {}) {
281
+ var _a;
282
+ if (!isConditionActive(cond, column)) return true;
283
+ const op = cond.operator;
284
+ const type = column.type;
285
+ if ((op === "is_me" || op === "is_not_me") && (type === "created_by" || type === "last_edited_by")) {
286
+ const mine = !!ctx.meId && value === ctx.meId;
287
+ return op === "is_me" ? mine : !mine;
288
+ }
289
+ if (op === "is_me" || op === "is_not_me") {
290
+ const me = ((_a = ctx.me) != null ? _a : "").trim().toLowerCase();
291
+ const has = !!me && multiSelectNames(value).some((n) => n.trim().toLowerCase() === me);
292
+ return op === "is_me" ? has : !has;
293
+ }
294
+ if (op === "is_any_of" || op === "is_none_of") {
295
+ const wanted = new Set((Array.isArray(cond.value) ? cond.value : [String(cond.value)]).map(String));
296
+ const names = type === "multi_select" ? multiSelectNames(value) : [selectName(value)].filter(Boolean);
297
+ const any = names.some((n) => wanted.has(n));
298
+ return op === "is_any_of" ? any : !any;
299
+ }
300
+ if (op === "is_empty" || op === "is_not_empty") {
301
+ const empty = type === "checkbox" ? normalizeCellValue(value, "checkbox") !== true : isEmptyCell(value, type);
302
+ return op === "is_empty" ? empty : !empty;
303
+ }
304
+ if (op === "is_checked" || op === "is_unchecked") {
305
+ const checked = value === true || value === "true";
306
+ return op === "is_checked" ? checked : !checked;
307
+ }
308
+ const raw = cond.value;
309
+ switch (type) {
310
+ case "number":
311
+ case "unique_id":
312
+ return numberMatches(op, numberValue(value), Number(raw));
313
+ case "select":
314
+ case "status": {
315
+ const name = selectName(value);
316
+ const target = String(raw);
317
+ return op === "equals" ? name === target : name !== target;
318
+ }
319
+ case "multi_select": {
320
+ const names = multiSelectNames(value);
321
+ const has = names.includes(String(raw));
322
+ return op === "contains" ? has : !has;
323
+ }
324
+ case "relation": {
325
+ const has = relationIds(value).includes(String(raw));
326
+ return op === "contains" ? has : !has;
327
+ }
328
+ case "person": {
329
+ const needle = String(raw).trim().toLowerCase();
330
+ const has = multiSelectNames(value).some((n) => n.toLowerCase().includes(needle));
331
+ return op === "contains" ? has : !has;
332
+ }
333
+ case "date":
334
+ case "created_time":
335
+ case "last_edited_time": {
336
+ const day = dayKeyOf(value);
337
+ if (!day) return false;
338
+ if (op === "within_past_days" || op === "within_next_days") {
339
+ const n = Math.max(0, Math.trunc(Number(raw)));
340
+ const today = localDayKey(now);
341
+ return op === "within_past_days" ? day <= today && day >= shiftDayKey(today, -n) : day >= today && day <= shiftDayKey(today, n);
342
+ }
343
+ if (op === "is_relative") {
344
+ const range = relativeDateRange(String(raw), now);
345
+ return !range || day >= range[0] && day <= range[1];
346
+ }
347
+ const target = dayKeyOf(String(raw));
348
+ if (!target) return true;
349
+ if (op === "on") return day === target;
350
+ if (op === "before") return day < target;
351
+ if (op === "after") return day > target;
352
+ if (op === "on_or_before") return day <= target;
353
+ if (op === "on_or_after") return day >= target;
354
+ return true;
355
+ }
356
+ case "formula":
357
+ case "connector":
358
+ case "rollup": {
359
+ if (op === "greater_than" || op === "less_than") {
360
+ const n = typeof value === "number" ? value : numberValue(value);
361
+ return n !== null && numberMatches(op, n, Number(raw));
362
+ }
363
+ const text = type === "connector" ? String(value != null ? value : "") : cellDisplayText(value, "formula");
364
+ return textMatches(op, text, String(raw));
365
+ }
366
+ default:
367
+ return textMatches(op, cellDisplayText(value, type), String(raw));
368
+ }
369
+ }
370
+ function rowMatchesConditions(row, columns, conditions, getValue = baseCellValue, now = /* @__PURE__ */ new Date(), ctx = {}) {
371
+ const known = (conditions != null ? conditions : []).filter((cond) => columns.some((c) => c.name === cond.property));
372
+ if (!known.length) return true;
373
+ const test = (cond) => {
374
+ const column = columns.find((c) => c.name === cond.property);
375
+ return conditionMatches(cond, getValue(row, column), column, now, ctx);
376
+ };
377
+ const items = filterItems(known).map((it) => it.kind === "cond" ? () => test(it.cond) : () => it.mode === "or" ? it.conds.some(test) : it.conds.every(test));
378
+ return isOrMode(known) ? items.some((f) => f()) : items.every((f) => f());
379
+ }
380
+ function activeConditions(conditions, columns) {
381
+ return (conditions != null ? conditions : []).filter((c) => isConditionActive(c, columns.find((x) => x.name === c.property)));
382
+ }
383
+ function applyRowFilter(rows, columns, filter, conditions, opts = {}) {
384
+ var _a, _b, _c, _d;
385
+ const getValue = (_a = opts.getValue) != null ? _a : baseCellValue;
386
+ const conds = activeConditions(conditions, columns);
387
+ const q = ((_b = filter == null ? void 0 : filter.search) != null ? _b : "").trim();
388
+ const selects = Object.values((_c = filter == null ? void 0 : filter.selects) != null ? _c : {}).some((v) => v.length > 0);
389
+ if (!conds.length && !q && !selects) return rows;
390
+ const now = (_d = opts.now) != null ? _d : /* @__PURE__ */ new Date();
391
+ return rows.filter((r) => {
392
+ var _a2;
393
+ return ((_a2 = opts.keepIds) == null ? void 0 : _a2.has(r.id)) || rowMatchesFilter(r, columns, filter, getValue) && rowMatchesConditions(r, columns, conds, getValue, now, {
394
+ me: opts.me,
395
+ meId: opts.meId
396
+ });
397
+ });
398
+ }
399
+ function renameConditionProperty(conds, from, to) {
400
+ if (from === to || !conds.some((c) => c.property === from)) return conds;
401
+ return conds.map((c) => c.property === from ? __spreadProps(__spreadValues({}, c), {
402
+ property: to
403
+ }) : c);
404
+ }
405
+ function dropConditionProperty(conds, name) {
406
+ return conds.some((c) => c.property === name) ? conds.filter((c) => c.property !== name) : conds;
407
+ }
408
+ const ALL_OPERATORS = /* @__PURE__ */ new Set(["contains", "does_not_contain", "equals", "does_not_equal", "greater_than", "less_than", "greater_than_or_equal_to", "less_than_or_equal_to", "is_empty", "is_not_empty", "is_checked", "is_unchecked", "before", "after", "on", "within_past_days", "within_next_days", "on_or_before", "on_or_after", "is_relative", "is_any_of", "is_none_of", "is_me", "is_not_me"]);
409
+ function parseViewFilter(filter) {
410
+ if (!filter) return [];
411
+ const orList = !Array.isArray(filter) && Array.isArray(filter.or) ? filter.or : null;
412
+ const list = Array.isArray(filter) ? filter : orList ? orList : Array.isArray(filter.and) ? filter.and : [];
413
+ const out = [];
414
+ const leaf = (c, id, extra) => {
415
+ if (!c || typeof c !== "object") return;
416
+ const property = c.property;
417
+ const operator = c.operator;
418
+ if (typeof property !== "string" || !property || !ALL_OPERATORS.has(operator)) return;
419
+ const v = c.value;
420
+ out.push(__spreadValues(__spreadValues({
421
+ id,
422
+ property,
423
+ operator,
424
+ value: typeof v === "string" || typeof v === "number" ? v : Array.isArray(v) ? v.filter((x) => typeof x === "string") : null
425
+ }, orList ? {
426
+ conj: "or"
427
+ } : {}), extra));
428
+ };
429
+ list.forEach((c, i) => {
430
+ const nestedOr = c && typeof c === "object" && Array.isArray(c.or) ? c.or : null;
431
+ const nestedAnd = c && typeof c === "object" && Array.isArray(c.and) ? c.and : null;
432
+ const nested = nestedOr != null ? nestedOr : nestedAnd;
433
+ if (nested) {
434
+ const group = `g${i}`;
435
+ nested.forEach((n, j) => leaf(n, `p${i}_${j}`, __spreadValues({
436
+ group
437
+ }, nestedOr ? {
438
+ groupConj: "or"
439
+ } : {})));
440
+ return;
441
+ }
442
+ leaf(c, `p${i}`, {});
443
+ });
444
+ const selects = filter == null ? void 0 : filter.selects;
445
+ if (selects && typeof selects === "object" && !Array.isArray(filter)) {
446
+ for (const [property, accepted] of Object.entries(selects)) {
447
+ if (Array.isArray(accepted) && accepted.length === 1 && typeof accepted[0] === "string") {
448
+ out.push({
449
+ id: `s${out.length}`,
450
+ property,
451
+ operator: "equals",
452
+ value: accepted[0]
453
+ });
454
+ }
455
+ }
456
+ }
457
+ return out;
458
+ }
459
+ function serializeViewFilter(conds) {
460
+ const leaf = (c) => ({
461
+ property: c.property,
462
+ operator: c.operator,
463
+ value: c.value === void 0 ? null : c.value
464
+ });
465
+ const list = filterItems(conds).map((it) => it.kind === "cond" ? leaf(it.cond) : {
466
+ [it.mode]: it.conds.map(leaf)
467
+ });
468
+ return isOrMode(conds) ? {
469
+ or: list
470
+ } : {
471
+ and: list
472
+ };
473
+ }export{RELATIVE_DATES,activeConditions,applyRowFilter,conditionMatches,dayKeyOf,dropConditionProperty,filterItems,isConditionActive,isOrMode,localDayKey,newCondition,newConditionId,operatorInfo,operatorsFor,parseViewFilter,relativeDateRange,renameConditionProperty,rowMatchesConditions,serializeViewFilter,setFilterMode,shiftDayKey};//# sourceMappingURL=databaseFilter.js.map