@svgrid/enterprise 3.0.1 → 3.0.3

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 (445) hide show
  1. package/LICENSE +94 -24
  2. package/README.md +36 -4
  3. package/dist/SvAdvancedFilter.svelte +1 -1
  4. package/dist/SvAlertsManager.svelte +2 -1
  5. package/dist/SvBoard.svelte +2 -1
  6. package/dist/SvExportMenu.svelte +4 -1
  7. package/dist/SvExportMenu.svelte.d.ts +0 -13
  8. package/dist/SvExpressionEditor.svelte +3 -3
  9. package/dist/SvFormulaBar.svelte +680 -0
  10. package/dist/SvFormulaBar.svelte.d.ts +69 -0
  11. package/dist/SvGridAlerts.svelte +49 -9
  12. package/dist/SvGridBoard.svelte +13 -8
  13. package/dist/SvGridBulkEditDrawer.svelte +26 -2
  14. package/dist/SvGridEditPanel.svelte +3 -0
  15. package/dist/SvGridScheduler.svelte +69 -40
  16. package/dist/SvGridSelectionBar.svelte +10 -3
  17. package/dist/SvPivotDesigner.svelte +263 -54
  18. package/dist/SvPivotDesigner.svelte.d.ts +27 -20
  19. package/dist/SvRibbonIcon.svelte +46 -0
  20. package/dist/SvRibbonIcon.svelte.d.ts +17 -0
  21. package/dist/SvSchemaChart.svelte +4 -2
  22. package/dist/SvSheet.svelte +7914 -0
  23. package/dist/SvSheet.svelte.d.ts +215 -0
  24. package/dist/SvSheetChartSetup.svelte +151 -0
  25. package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
  26. package/dist/SvSheetComment.svelte +283 -0
  27. package/dist/SvSheetComment.svelte.d.ts +22 -0
  28. package/dist/SvSheetConditionalFormat.svelte +159 -0
  29. package/dist/SvSheetConditionalFormat.svelte.d.ts +14 -0
  30. package/dist/SvSheetDataValidation.svelte +273 -0
  31. package/dist/SvSheetDataValidation.svelte.d.ts +14 -0
  32. package/dist/SvSheetEditRanges.svelte +217 -0
  33. package/dist/SvSheetEditRanges.svelte.d.ts +15 -0
  34. package/dist/SvSheetErrors.svelte +125 -0
  35. package/dist/SvSheetErrors.svelte.d.ts +20 -0
  36. package/dist/SvSheetEvaluate.svelte +133 -0
  37. package/dist/SvSheetEvaluate.svelte.d.ts +15 -0
  38. package/dist/SvSheetFilterMenu.svelte +320 -0
  39. package/dist/SvSheetFilterMenu.svelte.d.ts +22 -0
  40. package/dist/SvSheetFindReplace.svelte +132 -0
  41. package/dist/SvSheetFindReplace.svelte.d.ts +10 -0
  42. package/dist/SvSheetFormatCells.svelte +465 -0
  43. package/dist/SvSheetFormatCells.svelte.d.ts +17 -0
  44. package/dist/SvSheetGoalSeek.svelte +145 -0
  45. package/dist/SvSheetGoalSeek.svelte.d.ts +12 -0
  46. package/dist/SvSheetInsertFunction.svelte +149 -0
  47. package/dist/SvSheetInsertFunction.svelte.d.ts +8 -0
  48. package/dist/SvSheetIteration.svelte +81 -0
  49. package/dist/SvSheetIteration.svelte.d.ts +10 -0
  50. package/dist/SvSheetLink.svelte +99 -0
  51. package/dist/SvSheetLink.svelte.d.ts +17 -0
  52. package/dist/SvSheetListPicker.svelte +91 -0
  53. package/dist/SvSheetListPicker.svelte.d.ts +10 -0
  54. package/dist/SvSheetManageRules.svelte +187 -0
  55. package/dist/SvSheetManageRules.svelte.d.ts +16 -0
  56. package/dist/SvSheetNameManager.svelte +227 -0
  57. package/dist/SvSheetNameManager.svelte.d.ts +11 -0
  58. package/dist/SvSheetPageSetup.svelte +159 -0
  59. package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
  60. package/dist/SvSheetPasteSpecial.svelte +107 -0
  61. package/dist/SvSheetPasteSpecial.svelte.d.ts +12 -0
  62. package/dist/SvSheetPivot.svelte +220 -0
  63. package/dist/SvSheetPivot.svelte.d.ts +21 -0
  64. package/dist/SvSheetProtectSheet.svelte +81 -0
  65. package/dist/SvSheetProtectSheet.svelte.d.ts +11 -0
  66. package/dist/SvSheetRemoveDuplicates.svelte +152 -0
  67. package/dist/SvSheetRemoveDuplicates.svelte.d.ts +12 -0
  68. package/dist/SvSheetRibbon.svelte +1254 -0
  69. package/dist/SvSheetRibbon.svelte.d.ts +34 -0
  70. package/dist/SvSheetSizeDialog.svelte +60 -0
  71. package/dist/SvSheetSizeDialog.svelte.d.ts +11 -0
  72. package/dist/SvSheetSort.svelte +218 -0
  73. package/dist/SvSheetSort.svelte.d.ts +28 -0
  74. package/dist/SvSheetSparklines.svelte +135 -0
  75. package/dist/SvSheetSparklines.svelte.d.ts +14 -0
  76. package/dist/SvSheetTable.svelte +160 -0
  77. package/dist/SvSheetTable.svelte.d.ts +24 -0
  78. package/dist/SvSheetTabs.svelte +571 -0
  79. package/dist/SvSheetTabs.svelte.d.ts +50 -0
  80. package/dist/SvSheetTabs.test-harness.svelte.d.ts +17 -0
  81. package/dist/SvSheetTabs.test-harness.svelte.js +22 -0
  82. package/dist/SvSheetTextToColumns.svelte +172 -0
  83. package/dist/SvSheetTextToColumns.svelte.d.ts +13 -0
  84. package/dist/SvSheetValidationAlert.svelte +85 -0
  85. package/dist/SvSheetValidationAlert.svelte.d.ts +15 -0
  86. package/dist/advanced-filter-enable.js +1 -1
  87. package/dist/alerts/alert-engine.d.ts +6 -0
  88. package/dist/alerts/alert-engine.js +21 -4
  89. package/dist/alerts/alert-formats.js +2 -0
  90. package/dist/alerts/alert-types.d.ts +1 -1
  91. package/dist/alerts.d.ts +1 -1
  92. package/dist/alerts.js +2 -2
  93. package/dist/board.js +2 -2
  94. package/dist/bulk-edit.d.ts +3 -1
  95. package/dist/bulk-edit.js +1 -1
  96. package/dist/cdn/svgrid-enterprise.svelte-external.js +43538 -6539
  97. package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
  98. package/dist/designer/assets/SvChartMenu-BDoeqGz6.js +1 -0
  99. package/dist/designer/assets/SvChartMenu-BYO9cYdy.css +1 -0
  100. package/dist/designer/assets/SvDateRangeInput-BBRzrQeg.js +1 -0
  101. package/dist/designer/assets/SvDateTimePicker-DCPg7WGN.js +1 -0
  102. package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
  103. package/dist/designer/assets/SvGridChart-BgLuPO7I.css +1 -0
  104. package/dist/designer/assets/SvGridChart-Cy1ATrWh.js +3 -0
  105. package/dist/designer/assets/SvGridChartBuilder-08YWWeqY.css +1 -0
  106. package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
  107. package/dist/designer/assets/SvGridChartPanel-4Pc8y5yO.css +1 -0
  108. package/dist/designer/assets/SvGridChartPanel-CATdVc9X.js +4 -0
  109. package/dist/designer/assets/{SvGridChartView-DUc-1RUf.css → SvGridChartView-7msfnWZT.css} +1 -1
  110. package/dist/designer/assets/SvGridChartView-CmsZtCED.js +1 -0
  111. package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
  112. package/dist/designer/assets/SvListBox-BDS66lmZ.js +110 -0
  113. package/dist/designer/assets/SvMenuList-DJ47ba1h.css +1 -0
  114. package/dist/designer/assets/SvMenuList-Dgq2D5VN.js +1 -0
  115. package/dist/designer/assets/SvTabs-2mHC6oaz.js +1 -0
  116. package/dist/designer/assets/SvTabs-DKmwb5p1.css +1 -0
  117. package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
  118. package/dist/designer/assets/chart-Cn7MnNqA.js +1 -0
  119. package/dist/designer/assets/chart-export-B6bkQ3X8.js +11 -0
  120. package/dist/designer/assets/chart-export-pdf-BbA28-gt.js +11 -0
  121. package/dist/designer/assets/chart-panel-messages-Dz7PTIqT.js +1 -0
  122. package/dist/designer/assets/chart-summary-BD1qYB2R.js +1 -0
  123. package/dist/designer/assets/chart-trend-B8xr5LuD.js +1 -0
  124. package/dist/designer/assets/chart-validate-BMqM-qkF.js +1 -0
  125. package/dist/designer/assets/column-resize-BYDzR1Ve.js +1 -0
  126. package/dist/designer/assets/date-format-B8JbEtIG.js +1 -0
  127. package/dist/designer/assets/date-format-DKS-z0xS.css +1 -0
  128. package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
  129. package/dist/designer/assets/editor-contract-Bpoa7A5g.js +1 -0
  130. package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
  131. package/dist/designer/assets/focus-trap-V2-6Fy9I.js +1 -0
  132. package/dist/designer/assets/{index-C_a9Cj8Y.js → index-D5bVbuzI.js} +318 -315
  133. package/dist/designer/assets/index-_JVFxt02.css +1 -0
  134. package/dist/designer/assets/list-option-BP_dWS66.js +1 -0
  135. package/dist/designer/assets/row-resize-BInFWCpr.js +1 -0
  136. package/dist/designer/assets/server-block-cache-CXJKkJpy.js +1 -0
  137. package/dist/designer/assets/src-CITpcm6b.js +1 -0
  138. package/dist/designer/assets/src-DUQ4xE3x.js +58 -0
  139. package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
  140. package/dist/designer/index.html +29 -19
  141. package/dist/export-pdf.d.ts +164 -0
  142. package/dist/export-pdf.js +346 -15
  143. package/dist/export.js +25 -10
  144. package/dist/gantt/SvGridGantt.svelte +2890 -0
  145. package/dist/gantt/SvGridGantt.svelte.d.ts +30 -0
  146. package/dist/gantt/gantt-config.d.ts +73 -0
  147. package/dist/gantt/gantt-config.js +1 -0
  148. package/dist/gantt/gantt-critical-path.d.ts +67 -0
  149. package/dist/gantt/gantt-critical-path.js +207 -0
  150. package/dist/gantt/gantt-model.d.ts +257 -0
  151. package/dist/gantt/gantt-model.js +651 -0
  152. package/dist/gantt/gantt-resources.d.ts +59 -0
  153. package/dist/gantt/gantt-resources.js +71 -0
  154. package/dist/gantt/gantt.d.ts +7 -0
  155. package/dist/gantt/gantt.js +36 -0
  156. package/dist/gantt/index.d.ts +15 -0
  157. package/dist/gantt/index.js +22 -0
  158. package/dist/gantt/timeline-arrows.d.ts +102 -0
  159. package/dist/gantt/timeline-arrows.js +181 -0
  160. package/dist/import.d.ts +2 -2
  161. package/dist/import.js +1 -1
  162. package/dist/index.d.ts +93 -3
  163. package/dist/index.js +107 -3
  164. package/dist/install.js +13 -1
  165. package/dist/license-core.d.ts +17 -1
  166. package/dist/license-core.js +16 -5
  167. package/dist/license.d.ts +18 -2
  168. package/dist/license.js +71 -6
  169. package/dist/node/studio.js +203 -9
  170. package/dist/pivot-chart.d.ts +25 -1
  171. package/dist/pivot-chart.js +25 -69
  172. package/dist/pivot-enable.js +2 -2
  173. package/dist/scheduler-dependencies.d.ts +35 -0
  174. package/dist/scheduler-dependencies.js +36 -1
  175. package/dist/scheduler.js +2 -2
  176. package/dist/selection-bar.js +2 -2
  177. package/dist/server/SvGroupCell.svelte +213 -0
  178. package/dist/server/SvGroupCell.svelte.d.ts +62 -0
  179. package/dist/server/SvRowGroupPanel.svelte +322 -0
  180. package/dist/server/SvRowGroupPanel.svelte.d.ts +37 -0
  181. package/dist/server/enable.d.ts +17 -0
  182. package/dist/server/enable.js +49 -0
  183. package/dist/server/index.d.ts +22 -0
  184. package/dist/server/index.js +24 -0
  185. package/dist/server/messages.d.ts +45 -0
  186. package/dist/server/messages.js +35 -0
  187. package/dist/server/server-group-model.d.ts +104 -0
  188. package/dist/server/server-group-model.js +272 -0
  189. package/dist/server/server-pivot.d.ts +46 -0
  190. package/dist/server/server-pivot.js +57 -0
  191. package/dist/server/server-row-model.d.ts +547 -0
  192. package/dist/server/server-row-model.js +1551 -0
  193. package/dist/server/server-selection.d.ts +99 -0
  194. package/dist/server/server-selection.js +215 -0
  195. package/dist/server/svgrid-adapter.d.ts +155 -0
  196. package/dist/server/svgrid-adapter.js +202 -0
  197. package/dist/sheet/address.d.ts +43 -0
  198. package/dist/sheet/address.js +81 -0
  199. package/dist/sheet/ast.d.ts +138 -0
  200. package/dist/sheet/ast.js +70 -0
  201. package/dist/sheet/auto-filter.d.ts +120 -0
  202. package/dist/sheet/auto-filter.js +295 -0
  203. package/dist/sheet/autocomplete.d.ts +51 -0
  204. package/dist/sheet/autocomplete.js +248 -0
  205. package/dist/sheet/cell-images.d.ts +39 -0
  206. package/dist/sheet/cell-images.js +90 -0
  207. package/dist/sheet/cell-types.d.ts +58 -0
  208. package/dist/sheet/cell-types.js +96 -0
  209. package/dist/sheet/coerce.d.ts +71 -0
  210. package/dist/sheet/coerce.js +289 -0
  211. package/dist/sheet/commands.d.ts +89 -0
  212. package/dist/sheet/commands.js +230 -0
  213. package/dist/sheet/comments.d.ts +63 -0
  214. package/dist/sheet/comments.js +131 -0
  215. package/dist/sheet/conditional-formats.d.ts +167 -0
  216. package/dist/sheet/conditional-formats.js +341 -0
  217. package/dist/sheet/csv.d.ts +32 -0
  218. package/dist/sheet/csv.js +158 -0
  219. package/dist/sheet/culture.d.ts +87 -0
  220. package/dist/sheet/culture.js +247 -0
  221. package/dist/sheet/delta.d.ts +102 -0
  222. package/dist/sheet/delta.js +203 -0
  223. package/dist/sheet/deps.d.ts +104 -0
  224. package/dist/sheet/deps.js +274 -0
  225. package/dist/sheet/document.d.ts +252 -0
  226. package/dist/sheet/document.js +465 -0
  227. package/dist/sheet/edit-keys.d.ts +14 -0
  228. package/dist/sheet/edit-keys.js +40 -0
  229. package/dist/sheet/engine.d.ts +67 -0
  230. package/dist/sheet/engine.js +19 -0
  231. package/dist/sheet/entry.d.ts +35 -0
  232. package/dist/sheet/entry.js +226 -0
  233. package/dist/sheet/error-check.d.ts +49 -0
  234. package/dist/sheet/error-check.js +83 -0
  235. package/dist/sheet/evaluate-steps.d.ts +48 -0
  236. package/dist/sheet/evaluate-steps.js +196 -0
  237. package/dist/sheet/evaluate.d.ts +128 -0
  238. package/dist/sheet/evaluate.js +1049 -0
  239. package/dist/sheet/filter-files.d.ts +37 -0
  240. package/dist/sheet/filter-files.js +465 -0
  241. package/dist/sheet/find-replace.d.ts +62 -0
  242. package/dist/sheet/find-replace.js +152 -0
  243. package/dist/sheet/format-store.d.ts +114 -0
  244. package/dist/sheet/format-store.js +243 -0
  245. package/dist/sheet/freeze.d.ts +54 -0
  246. package/dist/sheet/freeze.js +58 -0
  247. package/dist/sheet/from-rows.d.ts +14 -0
  248. package/dist/sheet/from-rows.js +50 -0
  249. package/dist/sheet/function-catalog.d.ts +10 -0
  250. package/dist/sheet/function-catalog.js +385 -0
  251. package/dist/sheet/functions.d.ts +28 -0
  252. package/dist/sheet/functions.js +634 -0
  253. package/dist/sheet/goal-seek.d.ts +73 -0
  254. package/dist/sheet/goal-seek.js +153 -0
  255. package/dist/sheet/index.d.ts +80 -0
  256. package/dist/sheet/index.js +80 -0
  257. package/dist/sheet/links.d.ts +57 -0
  258. package/dist/sheet/links.js +174 -0
  259. package/dist/sheet/merges.d.ts +71 -0
  260. package/dist/sheet/merges.js +137 -0
  261. package/dist/sheet/messages.d.ts +778 -0
  262. package/dist/sheet/messages.js +806 -0
  263. package/dist/sheet/names.d.ts +31 -0
  264. package/dist/sheet/names.js +87 -0
  265. package/dist/sheet/navigate.d.ts +52 -0
  266. package/dist/sheet/navigate.js +135 -0
  267. package/dist/sheet/number-format.d.ts +110 -0
  268. package/dist/sheet/number-format.js +905 -0
  269. package/dist/sheet/objects.d.ts +106 -0
  270. package/dist/sheet/objects.js +149 -0
  271. package/dist/sheet/ods-document.d.ts +44 -0
  272. package/dist/sheet/ods-document.js +1275 -0
  273. package/dist/sheet/open-file.d.ts +26 -0
  274. package/dist/sheet/open-file.js +56 -0
  275. package/dist/sheet/outline.d.ts +82 -0
  276. package/dist/sheet/outline.js +228 -0
  277. package/dist/sheet/packs/array.d.ts +16 -0
  278. package/dist/sheet/packs/array.js +172 -0
  279. package/dist/sheet/packs/database.d.ts +42 -0
  280. package/dist/sheet/packs/database.js +142 -0
  281. package/dist/sheet/packs/engineering.d.ts +2 -0
  282. package/dist/sheet/packs/engineering.js +296 -0
  283. package/dist/sheet/packs/financial.d.ts +5 -0
  284. package/dist/sheet/packs/financial.js +220 -0
  285. package/dist/sheet/packs/math-stats.d.ts +2 -0
  286. package/dist/sheet/packs/math-stats.js +372 -0
  287. package/dist/sheet/packs/special.d.ts +44 -0
  288. package/dist/sheet/packs/special.js +187 -0
  289. package/dist/sheet/packs/stats-dist.d.ts +2 -0
  290. package/dist/sheet/packs/stats-dist.js +785 -0
  291. package/dist/sheet/packs/text-date.d.ts +2 -0
  292. package/dist/sheet/packs/text-date.js +332 -0
  293. package/dist/sheet/packs/trig.d.ts +2 -0
  294. package/dist/sheet/packs/trig.js +73 -0
  295. package/dist/sheet/page-setup.d.ts +73 -0
  296. package/dist/sheet/page-setup.js +73 -0
  297. package/dist/sheet/palette.d.ts +19 -0
  298. package/dist/sheet/palette.js +84 -0
  299. package/dist/sheet/parse.d.ts +13 -0
  300. package/dist/sheet/parse.js +140 -0
  301. package/dist/sheet/paste-special.d.ts +186 -0
  302. package/dist/sheet/paste-special.js +601 -0
  303. package/dist/sheet/pivot-range.d.ts +160 -0
  304. package/dist/sheet/pivot-range.js +333 -0
  305. package/dist/sheet/presence.d.ts +73 -0
  306. package/dist/sheet/presence.js +79 -0
  307. package/dist/sheet/print.d.ts +104 -0
  308. package/dist/sheet/print.js +169 -0
  309. package/dist/sheet/protection.d.ts +75 -0
  310. package/dist/sheet/protection.js +101 -0
  311. package/dist/sheet/rects.d.ts +45 -0
  312. package/dist/sheet/rects.js +112 -0
  313. package/dist/sheet/refs.d.ts +130 -0
  314. package/dist/sheet/refs.js +413 -0
  315. package/dist/sheet/ribbon-icons.d.ts +31 -0
  316. package/dist/sheet/ribbon-icons.js +536 -0
  317. package/dist/sheet/ribbon.d.ts +173 -0
  318. package/dist/sheet/ribbon.js +1054 -0
  319. package/dist/sheet/sheet-kinds.d.ts +74 -0
  320. package/dist/sheet/sheet-kinds.js +91 -0
  321. package/dist/sheet/shortcuts.d.ts +174 -0
  322. package/dist/sheet/shortcuts.js +674 -0
  323. package/dist/sheet/sort.d.ts +51 -0
  324. package/dist/sheet/sort.js +107 -0
  325. package/dist/sheet/sparklines.d.ts +111 -0
  326. package/dist/sheet/sparklines.js +204 -0
  327. package/dist/sheet/structure.d.ts +87 -0
  328. package/dist/sheet/structure.js +166 -0
  329. package/dist/sheet/table-styles.d.ts +74 -0
  330. package/dist/sheet/table-styles.js +152 -0
  331. package/dist/sheet/tables.d.ts +89 -0
  332. package/dist/sheet/tables.js +178 -0
  333. package/dist/sheet/tokenize.d.ts +71 -0
  334. package/dist/sheet/tokenize.js +355 -0
  335. package/dist/sheet/transforms.d.ts +76 -0
  336. package/dist/sheet/transforms.js +154 -0
  337. package/dist/sheet/validation.d.ts +108 -0
  338. package/dist/sheet/validation.js +278 -0
  339. package/dist/sheet/workbook.d.ts +217 -0
  340. package/dist/sheet/workbook.js +1120 -0
  341. package/dist/sheet/xls-cfb.d.ts +32 -0
  342. package/dist/sheet/xls-cfb.js +290 -0
  343. package/dist/sheet/xls-document.d.ts +10 -0
  344. package/dist/sheet/xls-document.js +1243 -0
  345. package/dist/sheet/xls-formula.d.ts +40 -0
  346. package/dist/sheet/xls-formula.js +569 -0
  347. package/dist/sheet/xlsx-document.d.ts +108 -0
  348. package/dist/sheet/xlsx-document.js +1849 -0
  349. package/dist/sheet/xlsx-drawing.d.ts +99 -0
  350. package/dist/sheet/xlsx-drawing.js +420 -0
  351. package/dist/sheet-enable.d.ts +6 -0
  352. package/dist/sheet-enable.js +45 -0
  353. package/dist/sheet-text.d.ts +7 -0
  354. package/dist/sheet-text.js +29 -0
  355. package/dist/sources/auth-supabase.js +2 -2
  356. package/dist/sources/realtime-supabase.js +2 -2
  357. package/dist/sources/rest.d.ts +6 -2
  358. package/dist/sources/rest.js +42 -7
  359. package/dist/sources/supabase.d.ts +10 -1
  360. package/dist/sources/supabase.js +73 -40
  361. package/dist/studio/emit-project.js +14 -1
  362. package/dist/studio/index.js +1 -1
  363. package/dist/studio/project.d.ts +11 -2
  364. package/dist/studio/project.js +5 -2
  365. package/dist/studio/ui-components.generated.js +170 -3
  366. package/dist/sveltekit/in-memory.d.ts +2 -2
  367. package/dist/sveltekit/in-memory.js +125 -4
  368. package/dist/sveltekit/index.d.ts +1 -1
  369. package/dist/sveltekit/index.js +1 -1
  370. package/dist/sveltekit/query-plan.d.ts +50 -4
  371. package/dist/sveltekit/query-plan.js +25 -3
  372. package/dist/sveltekit/sql-source.d.ts +6 -0
  373. package/dist/sveltekit/sql-source.js +34 -6
  374. package/dist/sveltekit/sql.d.ts +31 -0
  375. package/dist/sveltekit/sql.js +135 -25
  376. package/dist/sveltekit/transport.d.ts +10 -2
  377. package/dist/sveltekit/transport.js +30 -6
  378. package/dist/upgrade-prompt.d.ts +1 -1
  379. package/dist/version.d.ts +1 -1
  380. package/dist/version.js +1 -1
  381. package/dist/watermark.js +35 -2
  382. package/dist/wc/GridMenus-By9vPuq0.js +1088 -0
  383. package/dist/wc/SvChartMenu-CQNrQGT2.js +308 -0
  384. package/dist/wc/SvDateRangeInput-DR6m7bSM.js +199 -0
  385. package/dist/wc/SvDateTimePicker-D-vRnaMo.js +771 -0
  386. package/dist/wc/SvField-B_kurx_P.js +149 -0
  387. package/dist/wc/SvGrid.helpers-BdVDtjUm.js +135 -0
  388. package/dist/wc/SvGridCellEditor-Bnf1Kr5C.js +560 -0
  389. package/dist/wc/SvGridChart-BqUJh2pG.js +3572 -0
  390. package/dist/wc/SvGridChartBuilder-CGycC5cn.js +988 -0
  391. package/dist/wc/SvGridChartPanel-CRnizsHD.js +1746 -0
  392. package/dist/wc/SvGridChartView-D1pa_xMy.js +47 -0
  393. package/dist/wc/SvGridDropdown-45WsObLL.js +259 -0
  394. package/dist/wc/SvModal-DrfOYYyX.js +189 -0
  395. package/dist/wc/cell-formatting-CBfgahv1.js +86 -0
  396. package/dist/wc/chart-6OXlybVT.js +4341 -0
  397. package/dist/wc/chart-export-CeSADGfi.js +135 -0
  398. package/dist/wc/chart-export-pdf-BGko7MER.js +104 -0
  399. package/dist/wc/chart-summary-2m3ia1-n.js +137 -0
  400. package/dist/wc/chart-trend-CQOQtTMl.js +50 -0
  401. package/dist/wc/chart-validate-CD6ptiwg.js +180 -0
  402. package/dist/wc/client-DQIzjDBG.js +3064 -0
  403. package/dist/wc/column-resize-DUPgynvc.js +101 -0
  404. package/dist/wc/date-format-DS-z_h9v.js +1130 -0
  405. package/dist/wc/dismissable-CQ6XFXsk.js +45 -0
  406. package/dist/wc/editor-contract-peBDxir_.js +22 -0
  407. package/dist/wc/editor-registry-DxGKqcvx.js +24 -0
  408. package/dist/wc/focus-trap-Dbb2tJxb.js +65 -0
  409. package/dist/wc/list-option-DrRyivWp.js +82 -0
  410. package/dist/wc/popover-WsGlvtQv.js +69 -0
  411. package/dist/wc/positioning-BiKLfu1E.js +112 -0
  412. package/dist/wc/react.d.ts +41 -0
  413. package/dist/wc/react.js +90 -0
  414. package/dist/wc/rolldown-runtime-Dy4uBu1J.js +11 -0
  415. package/dist/wc/row-drag-touch-CycRR65n.js +93 -0
  416. package/dist/wc/row-resize-limG_N1z.js +111 -0
  417. package/dist/wc/sv-sheet-element.d.ts +97 -0
  418. package/dist/wc/sv-sheet-element.js +44213 -0
  419. package/dist/wc/svelte-virtualizer.svelte-CXtQy2TQ.js +530 -0
  420. package/dist/wc/validate-BqDthkNr.js +88 -0
  421. package/dist/wc/vue.d.ts +31 -0
  422. package/dist/wc/vue.js +75 -0
  423. package/package.json +36 -6
  424. package/dist/designer/assets/GridMenus-B1JtIN21.js +0 -8
  425. package/dist/designer/assets/SvDateRangeInput-CjO7nn_x.js +0 -1
  426. package/dist/designer/assets/SvDateTimePicker-ByBD_ov6.js +0 -1
  427. package/dist/designer/assets/SvField-YDLipR6O.css +0 -1
  428. package/dist/designer/assets/SvField-cj1PFNgZ.js +0 -1
  429. package/dist/designer/assets/SvGridCellEditor-0W1L2hJ1.js +0 -2
  430. package/dist/designer/assets/SvGridChart-DBOR4xcz.js +0 -2
  431. package/dist/designer/assets/SvGridChart-fkMWeh1J.css +0 -1
  432. package/dist/designer/assets/SvGridChartPanel-symrhNnR.js +0 -11
  433. package/dist/designer/assets/SvGridChartView-BmRxq6mU.js +0 -1
  434. package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
  435. package/dist/designer/assets/SvListBox-1oUF6Iav.js +0 -110
  436. package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
  437. package/dist/designer/assets/chart-DXFganU8.js +0 -1
  438. package/dist/designer/assets/column-resize-C_inr5zT.js +0 -1
  439. package/dist/designer/assets/date-format-DGagAqRc.css +0 -1
  440. package/dist/designer/assets/date-format-onlYDsrY.js +0 -1
  441. package/dist/designer/assets/easing-zaypKrr0.js +0 -3
  442. package/dist/designer/assets/index-k2stW6L8.css +0 -1
  443. package/dist/designer/assets/row-resize-B0FWHcNr.js +0 -1
  444. package/dist/designer/assets/src-D9p27OGC.js +0 -58
  445. package/dist/designer/assets/validate-h-aslRV9.js +0 -1
@@ -0,0 +1,104 @@
1
+ /**
2
+ * A sheet as the page File > Print opens: one standalone HTML document the
3
+ * browser's own print engine lays out, so fonts, CJK and RTL come out
4
+ * right and nothing is bundled. The print area (or the used range) as a
5
+ * table, column widths and row heights as the sheet shows them, hidden
6
+ * lines left out, merges as spans, every cell with its format and its
7
+ * conditional style, the title rows in a `<thead>` so they repeat on each
8
+ * page, gridlines and headings when the setup asks, and `@page` carrying
9
+ * the orientation, paper and margins. Pure: the shell hands in what a cell
10
+ * shows and where; a test reads the HTML back.
11
+ */
12
+ import type { CellFormatEntry, Rect } from './format-store.js';
13
+ import type { CfStyle } from './conditional-formats.js';
14
+ import { type PageSetup } from './page-setup.js';
15
+ export type SheetPrintCell = {
16
+ /** What the cell shows. */
17
+ text: string;
18
+ /**
19
+ * The sparkline drawn in this cell, as SVG markup ready to place. Placed
20
+ * behind the text, as it is on screen, so a label typed over one still
21
+ * reads on the page.
22
+ */
23
+ sparkline?: string;
24
+ /**
25
+ * The picture an `IMAGE` cell shows, as markup ready to place. Fitted
26
+ * inside the cell, as it is on screen.
27
+ */
28
+ image?: string;
29
+ /**
30
+ * The table's look on this cell, where it is inside one: Excel prints a
31
+ * table banded, and the shell draws the look rather than writing it into
32
+ * the cells, so it has to be handed in here or the page comes out plain.
33
+ * Laid under the cell's own format, as it is on screen.
34
+ */
35
+ table?: {
36
+ fill?: string;
37
+ color?: string;
38
+ bold?: boolean;
39
+ borderTop?: string;
40
+ borderBottom?: string;
41
+ };
42
+ /** An error's colour, as the sheet paints it. */
43
+ color?: string;
44
+ /** Numbers right, text left, unless the format says. */
45
+ align?: 'left' | 'center' | 'right';
46
+ entry?: CellFormatEntry;
47
+ cf?: CfStyle;
48
+ };
49
+ export type SheetPrintInput = {
50
+ /** The sheet's name, the page's title. */
51
+ name: string;
52
+ /** The used range: rows and columns with anything in them. */
53
+ rowCount: number;
54
+ colCount: number;
55
+ cellAt: (r: number, c: number) => SheetPrintCell;
56
+ widths: Readonly<Record<string, number>>;
57
+ defaultWidth: number;
58
+ heights: ReadonlyMap<number, number>;
59
+ defaultHeight: number;
60
+ hidden: {
61
+ rows: ReadonlySet<number>;
62
+ cols: ReadonlySet<number>;
63
+ };
64
+ merges: ReadonlyArray<Rect>;
65
+ setup: PageSetup;
66
+ /**
67
+ * The charts and pictures over the cells, each as markup ready to place:
68
+ * an `<img>`, or a chart already drawn to `<svg>`.
69
+ *
70
+ * An object is placed against its ANCHOR CELL with the offset and size it
71
+ * has on the sheet, so the printed page puts it where the sheet does
72
+ * without the print builder knowing anything about layout. One anchored
73
+ * outside the printed area, or to a hidden line, is left out: there is no
74
+ * cell on the page to hang it from.
75
+ */
76
+ objects?: ReadonlyArray<SheetPrintObject>;
77
+ };
78
+ export type SheetPrintObject = {
79
+ /** The cell it hangs from. */
80
+ row: number;
81
+ col: number;
82
+ /** Its offset inside that cell, and its size, in pixels. */
83
+ dx: number;
84
+ dy: number;
85
+ width: number;
86
+ height: number;
87
+ /** The markup, placed as it stands. The caller has escaped it. */
88
+ html: string;
89
+ };
90
+ /** The rectangles that print: the setup's area, or the whole used range. */
91
+ export declare function printAreas(input: Pick<SheetPrintInput, 'rowCount' | 'colCount' | 'setup'>): Rect[];
92
+ /**
93
+ * The used range grown to hold what floats over it.
94
+ *
95
+ * A chart is almost always anchored BELOW the numbers it reads, which is
96
+ * past the last row with anything typed in it. Printing the used range and
97
+ * nothing else would drop it, so the default area grows to cover each
98
+ * object's cells, walking the widths and heights out from its anchor until
99
+ * the object is covered. An explicit print area is left exactly as it is:
100
+ * someone who named a block meant that block.
101
+ */
102
+ export declare function areasWithObjects(input: SheetPrintInput): Rect[];
103
+ /** One printable HTML document for the sheet. */
104
+ export declare function sheetPrintHtml(input: SheetPrintInput): string;
@@ -0,0 +1,169 @@
1
+ import { entryToStyle } from './format-store.js';
2
+ import { colToLetters } from './address.js';
3
+ import { mergeAt, isCoveredCell } from './merges.js';
4
+ import { marginsCss, PAPER_SIZES } from './page-setup.js';
5
+ const HTML_ESCAPE = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' };
6
+ const esc = (s) => s.replace(/[&<>"']/g, (c) => HTML_ESCAPE[c]);
7
+ /** The rectangles that print: the setup's area, or the whole used range. */
8
+ export function printAreas(input) {
9
+ if (input.setup.printArea?.length)
10
+ return input.setup.printArea;
11
+ return [[0, 0, Math.max(0, input.rowCount - 1), Math.max(0, input.colCount - 1)]];
12
+ }
13
+ /**
14
+ * The used range grown to hold what floats over it.
15
+ *
16
+ * A chart is almost always anchored BELOW the numbers it reads, which is
17
+ * past the last row with anything typed in it. Printing the used range and
18
+ * nothing else would drop it, so the default area grows to cover each
19
+ * object's cells, walking the widths and heights out from its anchor until
20
+ * the object is covered. An explicit print area is left exactly as it is:
21
+ * someone who named a block meant that block.
22
+ */
23
+ export function areasWithObjects(input) {
24
+ const areas = printAreas(input);
25
+ if (input.setup.printArea?.length || !input.objects?.length)
26
+ return areas;
27
+ const area = areas[0];
28
+ let [r1, c1, r2, c2] = area;
29
+ for (const object of input.objects) {
30
+ let row = object.row;
31
+ for (let covered = -object.dy; covered < object.height; row += 1) {
32
+ covered += input.heights.get(row) ?? input.defaultHeight;
33
+ }
34
+ let col = object.col;
35
+ for (let covered = -object.dx; covered < object.width; col += 1) {
36
+ covered += input.widths[colToLetters(col)] ?? input.defaultWidth;
37
+ }
38
+ r1 = Math.min(r1, object.row);
39
+ c1 = Math.min(c1, object.col);
40
+ r2 = Math.max(r2, row - 1);
41
+ c2 = Math.max(c2, col - 1);
42
+ }
43
+ return [[r1, c1, r2, c2]];
44
+ }
45
+ /** One printable HTML document for the sheet. */
46
+ export function sheetPrintHtml(input) {
47
+ const { setup } = input;
48
+ /** The objects hanging from each cell, so a cell is one lookup. */
49
+ const byAnchor = new Map();
50
+ for (const object of input.objects ?? []) {
51
+ const key = `${object.row},${object.col}`;
52
+ const list = byAnchor.get(key);
53
+ if (list)
54
+ list.push(object);
55
+ else
56
+ byAnchor.set(key, [object]);
57
+ }
58
+ const visibleRows = (r1, r2) => { const out = []; for (let r = r1; r <= r2; r += 1)
59
+ if (!input.hidden.rows.has(r))
60
+ out.push(r); return out; };
61
+ const visibleCols = (c1, c2) => { const out = []; for (let c = c1; c <= c2; c += 1)
62
+ if (!input.hidden.cols.has(c))
63
+ out.push(c); return out; };
64
+ const cellHtml = (r, c, area, tag = 'td') => {
65
+ if (isCoveredCell(input.merges, r, c))
66
+ return '';
67
+ const cell = input.cellAt(r, c);
68
+ const merge = mergeAt(input.merges, r, c);
69
+ let span = '';
70
+ if (merge) {
71
+ const cols = visibleCols(Math.max(merge[1], area[1]), Math.min(merge[3], area[3])).length;
72
+ const rows = visibleRows(Math.max(merge[0], area[0]), Math.min(merge[2], area[2])).length;
73
+ if (cols > 1)
74
+ span += ` colspan="${cols}"`;
75
+ if (rows > 1)
76
+ span += ` rowspan="${rows}"`;
77
+ }
78
+ const styles = [];
79
+ const align = cell.entry?.align ?? cell.align;
80
+ if (align && align !== 'left')
81
+ styles.push(`text-align:${align}`);
82
+ // The table's bands go in first, so a fill or a colour written on the
83
+ // cell still wins, which is the order the screen draws them in.
84
+ if (cell.table) {
85
+ if (cell.table.fill)
86
+ styles.push(`background:${cell.table.fill}`);
87
+ if (cell.table.color)
88
+ styles.push(`color:${cell.table.color}`);
89
+ if (cell.table.bold)
90
+ styles.push('font-weight:600');
91
+ if (cell.table.borderTop)
92
+ styles.push(`border-top:1px solid ${cell.table.borderTop}`);
93
+ if (cell.table.borderBottom)
94
+ styles.push(`border-bottom:1px solid ${cell.table.borderBottom}`);
95
+ }
96
+ const own = entryToStyle(cell.entry);
97
+ if (own)
98
+ styles.push(own);
99
+ if (cell.cf)
100
+ styles.push(entryToStyle(cell.cf));
101
+ if (cell.color)
102
+ styles.push(`color:${cell.color}`);
103
+ const style = styles.length ? ` style="${esc(styles.filter(Boolean).join(';'))}"` : '';
104
+ // A sparkline goes behind the text; an object hangs from the cell and is
105
+ // allowed to overflow it, which is what makes a chart bigger than one
106
+ // cell print as a chart rather than as a sliver.
107
+ const spark = cell.sparkline ? `<span class="sp">${cell.sparkline}</span>` : '';
108
+ const picture = cell.image ? `<span class="im">${cell.image}</span>` : '';
109
+ const objects = (byAnchor.get(`${r},${c}`) ?? [])
110
+ .map((o) => `<span class="ob" style="inset-inline-start:${o.dx}px;top:${o.dy}px;width:${o.width}px;height:${o.height}px">${o.html}</span>`)
111
+ .join('');
112
+ const classes = [spark || picture ? 'sp-cell' : '', objects ? 'ob-cell' : ''].filter(Boolean).join(' ');
113
+ const cls = classes ? ` class="${classes}"` : '';
114
+ // A cell past the written area has nothing to say, and a caller reading
115
+ // one is not a reason to throw during a print.
116
+ const text = esc(cell.text ?? '');
117
+ const body = spark || picture || objects
118
+ ? `${spark}${picture}${objects}<span class="tx">${cell.image ? '' : text}</span>`
119
+ : text;
120
+ return `<${tag}${span}${cls}${style}>${body}</${tag}>`;
121
+ };
122
+ const rowHtml = (r, cols, area, head = false) => {
123
+ const h = input.heights.get(r) ?? input.defaultHeight;
124
+ const heading = setup.headings ? `<th class="rh">${r + 1}</th>` : '';
125
+ return `<tr style="height:${h}px">${heading}${cols.map((c) => cellHtml(r, c, area, head ? 'th' : 'td')).join('')}</tr>`;
126
+ };
127
+ const tables = areasWithObjects(input).map((area) => {
128
+ const cols = visibleCols(area[1], area[3]);
129
+ const rows = visibleRows(area[0], area[2]);
130
+ const colgroup = `<colgroup>${setup.headings ? '<col style="width:40px">' : ''}${cols.map((c) => `<col style="width:${input.widths[colToLetters(c)] ?? input.defaultWidth}px">`).join('')}</colgroup>`;
131
+ const headings = setup.headings ? `<tr class="ch"><th class="corner"></th>${cols.map((c) => `<th>${colToLetters(c)}</th>`).join('')}</tr>` : '';
132
+ // The title rows repeat on every page when they sit above or inside the area.
133
+ const titles = setup.printTitleRows;
134
+ const titleRows = titles && titles[0] <= area[2] ? visibleRows(titles[0], Math.min(titles[1], area[2])).filter((r) => r < area[0] || r <= area[2]) : [];
135
+ const bodyRows = rows.filter((r) => !titleRows.includes(r));
136
+ const thead = headings || titleRows.length
137
+ ? `<thead>${headings}${titleRows.map((r) => rowHtml(r, cols, [Math.min(r, area[0]), area[1], area[2], area[3]], true)).join('')}</thead>`
138
+ : '';
139
+ return `<table>${colgroup}${thead}<tbody>${bodyRows.map((r) => rowHtml(r, cols, area)).join('')}</tbody></table>`;
140
+ });
141
+ const paper = PAPER_SIZES[setup.paper]?.css ?? 'A4';
142
+ const grid = setup.gridlines ? 'td, th { border: 1px solid #d0d0d0; }' : 'td, th { border: 1px solid transparent; }';
143
+ return `<!DOCTYPE html>
144
+ <html><head><meta charset="utf-8"><title>${esc(input.name)}</title>
145
+ <style>
146
+ @page { size: ${paper} ${setup.orientation}; margin: ${marginsCss(setup.margins)}; }
147
+ @media print { body { -webkit-print-color-adjust: exact; print-color-adjust: exact; } }
148
+ body { font-family: Calibri, "Segoe UI", -apple-system, Roboto, sans-serif; font-size: 11pt; color: #000; margin: 0; }
149
+ table { border-collapse: collapse; table-layout: fixed; zoom: ${setup.scale / 100}; }
150
+ table + table { break-before: page; }
151
+ thead { display: table-header-group; }
152
+ tr { break-inside: avoid; }
153
+ ${grid}
154
+ td, th { padding: 1px 4px; overflow: hidden; white-space: nowrap; text-overflow: clip; text-align: left; font-weight: 400; vertical-align: bottom; }
155
+ th.rh, tr.ch th { background: #f2f2f2; color: #444; text-align: center; font-size: 9pt; border: 1px solid #c8c8c8; }
156
+ td.sp-cell, td.ob-cell { position: relative; }
157
+ td.ob-cell { overflow: visible; }
158
+ td .sp { position: absolute; inset: 1px 4px; display: block; }
159
+ td .sp svg { width: 100%; height: 100%; }
160
+ td .im { position: absolute; inset: 1px 2px; display: block; }
161
+ td .im img { width: 100%; height: 100%; object-fit: contain; }
162
+ td .ob { position: absolute; display: block; overflow: hidden; }
163
+ td .ob img, td .ob svg { width: 100%; height: 100%; object-fit: contain; }
164
+ td .tx { position: relative; }
165
+ </style></head>
166
+ <body>
167
+ ${tables.join('\n ')}
168
+ </body></html>`;
169
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Sheet protection, the way Excel has it: every cell is locked by default,
3
+ * Format Cells > Protection unlocks the ones that may change, and Protect
4
+ * Sheet turns the flags on. Until then a locked cell is an ordinary cell.
5
+ *
6
+ * Two refinements ride beside the flag, as they do in Excel. The "allow
7
+ * all users of this worksheet to" list of the Protect Sheet dialog says
8
+ * which kinds of change stay open while the sheet is protected (format
9
+ * cells, size and hide lines, insert and delete, sort, filter); and Allow
10
+ * Edit Ranges names blocks that take an edit on a protected sheet whether
11
+ * their cells are locked or not. There is no password.
12
+ *
13
+ * The rules live here so the shell, the ribbon and the commands agree on
14
+ * them without each reading the format entry its own way.
15
+ */
16
+ import type { CellAddressLookup, CellFormatEntry, Rect, SheetFormatStore } from './format-store.js';
17
+ /** What the sheet says when a protected cell is asked to change. */
18
+ export declare const PROTECTED_MESSAGE = "The cell you're trying to change is on a protected sheet. To make a change, unprotect the sheet.";
19
+ /**
20
+ * What stays allowed on a protected sheet: Excel's Protect Sheet list, the
21
+ * entries the shell has something behind. An absent key is not allowed.
22
+ */
23
+ export type ProtectionAllow = {
24
+ /** Format Cells, the Home > Font / Alignment / Number buttons, merges, Lock Cell. */
25
+ formatCells?: boolean;
26
+ /** Column width, AutoFit, hide and unhide columns, the resize handle. */
27
+ formatColumns?: boolean;
28
+ /** Row height, AutoFit, hide and unhide rows, the resize handle. */
29
+ formatRows?: boolean;
30
+ insertColumns?: boolean;
31
+ insertRows?: boolean;
32
+ deleteColumns?: boolean;
33
+ deleteRows?: boolean;
34
+ /** Sort, of a block with no locked cell: Excel refuses one with, whatever this says. */
35
+ sort?: boolean;
36
+ /** Filter on and off, and the arrows' menus. */
37
+ autoFilter?: boolean;
38
+ };
39
+ export type ProtectionPermission = keyof ProtectionAllow;
40
+ /** The list in the order Excel's dialog shows it. */
41
+ export declare const PROTECTION_PERMISSIONS: ReadonlyArray<ProtectionPermission>;
42
+ /** Excel's Allow Users to Edit Ranges entry: a name over some cells. */
43
+ export type EditRange = {
44
+ id: string;
45
+ title: string;
46
+ rects: Rect[];
47
+ };
48
+ /** What a sheet keeps beside its `protected` flag. */
49
+ export type SheetProtection = {
50
+ allow: ProtectionAllow;
51
+ ranges: EditRange[];
52
+ };
53
+ export declare const defaultProtection: () => SheetProtection;
54
+ /** A cell is locked unless its format says otherwise. */
55
+ export declare function isLocked(entry: CellFormatEntry | undefined): boolean;
56
+ /** Whether (r, c) lies in one of the ranges that stay editable. */
57
+ export declare function inEditRange(ranges: ReadonlyArray<EditRange>, r: number, c: number): boolean;
58
+ /** Whether the cell holds on a protected sheet: locked, and in no edit range. */
59
+ export declare function cellLocked(entry: CellFormatEntry | undefined, ranges: ReadonlyArray<EditRange>, r: number, c: number): boolean;
60
+ /**
61
+ * Whether any cell of the rectangles is locked. A protected sheet refuses
62
+ * a change that touches one locked cell rather than doing the rest, which
63
+ * is what Excel does and what keeps an undo step whole.
64
+ */
65
+ export declare function rectsHaveLocked(store: SheetFormatStore, lookup: CellAddressLookup, rects: ReadonlyArray<Rect>, ranges?: ReadonlyArray<EditRange>): boolean;
66
+ /** Whether the rectangles hold both locked and unlocked cells. */
67
+ export declare function rectsMixLocked(store: SheetFormatStore, lookup: CellAddressLookup, rects: ReadonlyArray<Rect>): boolean;
68
+ /** A copy safe to hand out or save. */
69
+ export declare function copyProtection(protection: SheetProtection): SheetProtection;
70
+ /** An id no other range of this session carries. */
71
+ export declare const newEditRangeId: () => string;
72
+ /** `B2:B10, A1 C3:C5` as rectangles; null when any piece is not a cell or a range. */
73
+ export declare function parseRangeText(text: string): Rect[] | null;
74
+ /** Rectangles as `B2:B10, A1`, the way the dialog lists them. */
75
+ export declare function rangeText(rects: ReadonlyArray<Rect>): string;
@@ -0,0 +1,101 @@
1
+ import { colToLetters, parseA1 } from './address.js';
2
+ /** What the sheet says when a protected cell is asked to change. */
3
+ export const PROTECTED_MESSAGE = "The cell you're trying to change is on a protected sheet. To make a change, unprotect the sheet.";
4
+ /** The list in the order Excel's dialog shows it. */
5
+ export const PROTECTION_PERMISSIONS = [
6
+ 'formatCells', 'formatColumns', 'formatRows', 'insertColumns', 'insertRows', 'deleteColumns', 'deleteRows', 'sort', 'autoFilter',
7
+ ];
8
+ export const defaultProtection = () => ({ allow: {}, ranges: [] });
9
+ /** A cell is locked unless its format says otherwise. */
10
+ export function isLocked(entry) {
11
+ return entry?.locked !== false;
12
+ }
13
+ /** Whether (r, c) lies in one of the ranges that stay editable. */
14
+ export function inEditRange(ranges, r, c) {
15
+ for (const range of ranges) {
16
+ for (const [r1, c1, r2, c2] of range.rects)
17
+ if (r >= r1 && r <= r2 && c >= c1 && c <= c2)
18
+ return true;
19
+ }
20
+ return false;
21
+ }
22
+ /** Whether the cell holds on a protected sheet: locked, and in no edit range. */
23
+ export function cellLocked(entry, ranges, r, c) {
24
+ return isLocked(entry) && !inEditRange(ranges, r, c);
25
+ }
26
+ /**
27
+ * Whether any cell of the rectangles is locked. A protected sheet refuses
28
+ * a change that touches one locked cell rather than doing the rest, which
29
+ * is what Excel does and what keeps an undo step whole.
30
+ */
31
+ export function rectsHaveLocked(store, lookup, rects, ranges = []) {
32
+ for (const [minRow, minCol, maxRow, maxCol] of rects) {
33
+ for (let r = minRow; r <= maxRow; r += 1) {
34
+ for (let c = minCol; c <= maxCol; c += 1) {
35
+ const rowId = lookup.rowIdAt(r);
36
+ const columnId = lookup.columnIdAt(c);
37
+ if (rowId == null || columnId == null)
38
+ continue;
39
+ if (cellLocked(store.get(rowId, columnId), ranges, r, c))
40
+ return true;
41
+ }
42
+ }
43
+ }
44
+ return false;
45
+ }
46
+ /** Whether the rectangles hold both locked and unlocked cells. */
47
+ export function rectsMixLocked(store, lookup, rects) {
48
+ let locked = false;
49
+ let unlocked = false;
50
+ for (const [minRow, minCol, maxRow, maxCol] of rects) {
51
+ for (let r = minRow; r <= maxRow; r += 1) {
52
+ for (let c = minCol; c <= maxCol; c += 1) {
53
+ const rowId = lookup.rowIdAt(r);
54
+ const columnId = lookup.columnIdAt(c);
55
+ if (rowId == null || columnId == null)
56
+ continue;
57
+ if (isLocked(store.get(rowId, columnId)))
58
+ locked = true;
59
+ else
60
+ unlocked = true;
61
+ if (locked && unlocked)
62
+ return true;
63
+ }
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+ /** A copy safe to hand out or save. */
69
+ export function copyProtection(protection) {
70
+ return {
71
+ allow: { ...protection.allow },
72
+ ranges: protection.ranges.map((range) => ({ ...range, rects: range.rects.map(([r1, c1, r2, c2]) => [r1, c1, r2, c2]) })),
73
+ };
74
+ }
75
+ let nextRangeId = 1;
76
+ /** An id no other range of this session carries. */
77
+ export const newEditRangeId = () => `range-${Date.now().toString(36)}-${(nextRangeId += 1).toString(36)}`;
78
+ /** `B2:B10, A1 C3:C5` as rectangles; null when any piece is not a cell or a range. */
79
+ export function parseRangeText(text) {
80
+ const pieces = text.split(/[,\s]+/).map((p) => p.trim().replace(/^=/, '')).filter(Boolean);
81
+ if (!pieces.length)
82
+ return null;
83
+ const out = [];
84
+ for (const piece of pieces) {
85
+ const [first, last] = piece.split(':');
86
+ const a = parseA1(first ?? '');
87
+ const b = last === undefined ? a : parseA1(last);
88
+ if (!a || !b || a.row === null || b.row === null)
89
+ return null;
90
+ out.push([Math.min(a.row, b.row), Math.min(a.col, b.col), Math.max(a.row, b.row), Math.max(a.col, b.col)]);
91
+ }
92
+ return out;
93
+ }
94
+ /** Rectangles as `B2:B10, A1`, the way the dialog lists them. */
95
+ export function rangeText(rects) {
96
+ return rects.map(([r1, c1, r2, c2]) => {
97
+ const a = `${colToLetters(c1)}${r1 + 1}`;
98
+ const b = `${colToLetters(c2)}${r2 + 1}`;
99
+ return a === b ? a : `${a}:${b}`;
100
+ }).join(', ');
101
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Rectangles of cells, and how they move when rows or columns are inserted
3
+ * or deleted.
4
+ *
5
+ * A sheet keys more than its formats by position: validation rules,
6
+ * conditional formats, merges and an AutoFilter range are all rectangles,
7
+ * and every one of them has to move with the cells it covers, the way the
8
+ * format store's entries do. This is the one place that rule lives, so a
9
+ * band on rows 5-8 and a rule on rows 5-8 cannot disagree about where an
10
+ * insert above them put them.
11
+ */
12
+ import type { Rect } from './navigate.js';
13
+ import type { StructuralEdit } from './refs.js';
14
+ export type { Rect };
15
+ /**
16
+ * Where `rect` is after `edit`, or null when the edit deleted all of it.
17
+ *
18
+ * An insert above a range moves it; an insert inside it grows it, the way
19
+ * a reference to the range would grow. A delete above it moves it up, a
20
+ * delete overlapping an edge shrinks it to what survives, and a delete of
21
+ * every line it covers removes it.
22
+ */
23
+ export declare function shiftRect(rect: Rect, edit: StructuralEdit): Rect | null;
24
+ /** Every item's rectangles moved; an item left with none is dropped. */
25
+ export declare function shiftRects<T extends {
26
+ rects: ReadonlyArray<Rect>;
27
+ }>(items: ReadonlyArray<T>, edit: StructuralEdit): T[];
28
+ export declare function rectContains(rect: Rect, row: number, col: number): boolean;
29
+ export declare function rectsIntersect(a: Rect, b: Rect): boolean;
30
+ /**
31
+ * `rect` with `hole` cut out of it: up to four rectangles (above, below,
32
+ * left and right of the hole), or the rect itself when they do not meet.
33
+ * Clear Rules on a selection takes the selection out of every rule this way.
34
+ */
35
+ export declare function subtractRect(rect: Rect, hole: Rect): Rect[];
36
+ /** The grid's notes shape: row id (`r4`) to column id (`B`) to text. */
37
+ export type NotesMap = Record<string, Record<string, string>>;
38
+ /**
39
+ * Notes moved along with their rows or columns. `shift` says where line i
40
+ * is after the edit, or null when the edit deleted it, which drops its
41
+ * notes with it.
42
+ */
43
+ export declare function remapNotes<T = string>(notes: Record<string, Record<string, T>>, axis: 'rows' | 'cols', shift: (index: number) => number | null): Record<string, Record<string, T>>;
44
+ /** The shift function a structural edit implies, shared by every keyed part. */
45
+ export declare function lineShift(edit: StructuralEdit): (index: number) => number | null;
@@ -0,0 +1,112 @@
1
+ import { colToLetters, lettersToCol } from './address.js';
2
+ /**
3
+ * Where `rect` is after `edit`, or null when the edit deleted all of it.
4
+ *
5
+ * An insert above a range moves it; an insert inside it grows it, the way
6
+ * a reference to the range would grow. A delete above it moves it up, a
7
+ * delete overlapping an edge shrinks it to what survives, and a delete of
8
+ * every line it covers removes it.
9
+ */
10
+ export function shiftRect(rect, edit) {
11
+ const [r1, c1, r2, c2] = rect;
12
+ const { at, count } = edit;
13
+ const rows = edit.kind === 'insertRows' || edit.kind === 'deleteRows';
14
+ const lo = rows ? r1 : c1;
15
+ const hi = rows ? r2 : c2;
16
+ let nlo;
17
+ let nhi;
18
+ if (edit.kind === 'insertRows' || edit.kind === 'insertCols') {
19
+ nlo = lo >= at ? lo + count : lo;
20
+ nhi = hi >= at ? hi + count : hi;
21
+ }
22
+ else {
23
+ const end = at + count;
24
+ if (lo >= at && hi < end)
25
+ return null;
26
+ nlo = lo >= end ? lo - count : lo >= at ? at : lo;
27
+ nhi = hi >= end ? hi - count : hi >= at ? at - 1 : hi;
28
+ }
29
+ if (nhi < nlo)
30
+ return null;
31
+ return rows ? [nlo, c1, nhi, c2] : [r1, nlo, r2, nhi];
32
+ }
33
+ /** Every item's rectangles moved; an item left with none is dropped. */
34
+ export function shiftRects(items, edit) {
35
+ const out = [];
36
+ for (const item of items) {
37
+ const rects = [];
38
+ for (const rect of item.rects) {
39
+ const moved = shiftRect(rect, edit);
40
+ if (moved)
41
+ rects.push(moved);
42
+ }
43
+ if (rects.length)
44
+ out.push({ ...item, rects });
45
+ }
46
+ return out;
47
+ }
48
+ export function rectContains(rect, row, col) {
49
+ return row >= rect[0] && row <= rect[2] && col >= rect[1] && col <= rect[3];
50
+ }
51
+ export function rectsIntersect(a, b) {
52
+ return a[0] <= b[2] && b[0] <= a[2] && a[1] <= b[3] && b[1] <= a[3];
53
+ }
54
+ /**
55
+ * `rect` with `hole` cut out of it: up to four rectangles (above, below,
56
+ * left and right of the hole), or the rect itself when they do not meet.
57
+ * Clear Rules on a selection takes the selection out of every rule this way.
58
+ */
59
+ export function subtractRect(rect, hole) {
60
+ if (!rectsIntersect(rect, hole))
61
+ return [rect];
62
+ const [r1, c1, r2, c2] = rect;
63
+ const [h1, hc1, h2, hc2] = hole;
64
+ const out = [];
65
+ if (h1 > r1)
66
+ out.push([r1, c1, h1 - 1, c2]);
67
+ if (h2 < r2)
68
+ out.push([h2 + 1, c1, r2, c2]);
69
+ const top = Math.max(r1, h1);
70
+ const bottom = Math.min(r2, h2);
71
+ if (hc1 > c1)
72
+ out.push([top, c1, bottom, hc1 - 1]);
73
+ if (hc2 < c2)
74
+ out.push([top, hc2 + 1, bottom, c2]);
75
+ return out;
76
+ }
77
+ /**
78
+ * Notes moved along with their rows or columns. `shift` says where line i
79
+ * is after the edit, or null when the edit deleted it, which drops its
80
+ * notes with it.
81
+ */
82
+ export function remapNotes(notes, axis, shift) {
83
+ const out = {};
84
+ for (const [rowId, line] of Object.entries(notes)) {
85
+ if (axis === 'rows') {
86
+ const index = Number(rowId.slice(1));
87
+ const next = Number.isInteger(index) ? shift(index) : index;
88
+ if (next === null)
89
+ continue;
90
+ out[`r${next}`] = { ...line };
91
+ continue;
92
+ }
93
+ const moved = {};
94
+ for (const [columnId, text] of Object.entries(line)) {
95
+ const index = lettersToCol(columnId);
96
+ const next = index < 0 ? index : shift(index);
97
+ if (next === null)
98
+ continue;
99
+ moved[index < 0 ? columnId : colToLetters(next)] = text;
100
+ }
101
+ if (Object.keys(moved).length)
102
+ out[rowId] = moved;
103
+ }
104
+ return out;
105
+ }
106
+ /** The shift function a structural edit implies, shared by every keyed part. */
107
+ export function lineShift(edit) {
108
+ const { at, count } = edit;
109
+ if (edit.kind === 'insertRows' || edit.kind === 'insertCols')
110
+ return (i) => (i >= at ? i + count : i);
111
+ return (i) => (i >= at + count ? i - count : i >= at ? null : i);
112
+ }