@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,107 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's Paste Special: what to paste (everything, values, formulas or
4
+ * formats), an operation to combine the pasted numbers with what is there,
5
+ * and whether to skip blanks or transpose. The shell keeps what Ctrl+C
6
+ * took and applies the choice through `planPaste` / `resolvePasteCell`;
7
+ * this component only asks the question.
8
+ */
9
+ import { useSheetText } from './sheet-text'
10
+ import { SvModal } from '@svgrid/grid'
11
+ import type { PasteSpecialOptions, PasteWhat, PasteOperation } from './sheet/paste-special'
12
+
13
+ type Props = {
14
+ open?: boolean
15
+ /** Whether the sheet has anything to paste; Excel greys the whole
16
+ * dialog out without a copy, this one says so. */
17
+ hasClipboard: boolean
18
+ onPaste: (options: PasteSpecialOptions) => void
19
+ onClose?: () => void
20
+ }
21
+
22
+ let { open = $bindable(false), hasClipboard, onPaste, onClose }: Props = $props()
23
+ const t = useSheetText()
24
+
25
+ let what = $state<PasteWhat>('all')
26
+ let operation = $state<PasteOperation>('none')
27
+ let skipBlanks = $state(false)
28
+ let transpose = $state(false)
29
+
30
+ const WHAT: ReadonlyArray<{ value: PasteWhat; label: string }> = [
31
+ { value: 'all', label: 'pasteSpecial.all' },
32
+ { value: 'formulas', label: 'pasteSpecial.formulas' },
33
+ { value: 'values', label: 'pasteSpecial.values' },
34
+ { value: 'formats', label: 'pasteSpecial.formats' },
35
+ ]
36
+ const OPERATIONS: ReadonlyArray<{ value: PasteOperation; label: string }> = [
37
+ { value: 'none', label: 'pasteSpecial.none' },
38
+ { value: 'add', label: 'pasteSpecial.add' },
39
+ { value: 'subtract', label: 'pasteSpecial.subtract' },
40
+ { value: 'multiply', label: 'pasteSpecial.multiply' },
41
+ { value: 'divide', label: 'pasteSpecial.divide' },
42
+ ]
43
+
44
+ function ok() {
45
+ onPaste({ what, operation, skipBlanks, transpose })
46
+ open = false
47
+ onClose?.()
48
+ }
49
+
50
+ function close() {
51
+ open = false
52
+ onClose?.()
53
+ }
54
+ </script>
55
+
56
+ <SvModal bind:open onClose={onClose} title={t('pasteSpecial.title')} size="sm">
57
+ <div class="sv-sheet-dialog" role="group" aria-label={t('pasteSpecial.title')}>
58
+ {#if !hasClipboard}
59
+ <p class="status">{t('pasteSpecial.empty')}</p>
60
+ {/if}
61
+ <div class="columns">
62
+ <fieldset class="group">
63
+ <legend>{t('pasteSpecial.paste')}</legend>
64
+ {#each WHAT as choice (choice.value)}
65
+ <label class="check"><input type="radio" name="sheet-paste-what" value={choice.value} bind:group={what} /> {t(choice.label)}</label>
66
+ {/each}
67
+ </fieldset>
68
+ <fieldset class="group">
69
+ <legend>{t('pasteSpecial.operation')}</legend>
70
+ {#each OPERATIONS as choice (choice.value)}
71
+ <label class="check"><input type="radio" name="sheet-paste-op" value={choice.value} bind:group={operation} /> {t(choice.label)}</label>
72
+ {/each}
73
+ </fieldset>
74
+ </div>
75
+ <div class="checks">
76
+ <label class="check"><input type="checkbox" bind:checked={skipBlanks} /> {t('pasteSpecial.skipBlanks')}</label>
77
+ <label class="check"><input type="checkbox" bind:checked={transpose} /> {t('pasteSpecial.transpose')}</label>
78
+ </div>
79
+ </div>
80
+ {#snippet footer()}
81
+ <div class="sv-sheet-dialog-buttons">
82
+ <button type="button" class="btn primary" onclick={ok} disabled={!hasClipboard}>{t('ok')}</button>
83
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
84
+ </div>
85
+ {/snippet}
86
+ </SvModal>
87
+
88
+ <style>
89
+ .columns {
90
+ display: grid;
91
+ grid-template-columns: 1fr 1fr;
92
+ gap: 12px;
93
+ }
94
+ .group {
95
+ display: flex;
96
+ flex-direction: column;
97
+ gap: 4px;
98
+ margin: 0;
99
+ padding: 6px 10px 8px;
100
+ border: 1px solid var(--sg-border, #d1d1d1);
101
+ border-radius: var(--sg-radius, 3px);
102
+ }
103
+ .group legend {
104
+ padding: 0 4px;
105
+ font-weight: 600;
106
+ }
107
+ </style>
@@ -0,0 +1,12 @@
1
+ import type { PasteSpecialOptions } from './sheet/paste-special.js';
2
+ type Props = {
3
+ open?: boolean;
4
+ /** Whether the sheet has anything to paste; Excel greys the whole
5
+ * dialog out without a copy, this one says so. */
6
+ hasClipboard: boolean;
7
+ onPaste: (options: PasteSpecialOptions) => void;
8
+ onClose?: () => void;
9
+ };
10
+ declare const SvSheetPasteSpecial: import("svelte").Component<Props, {}, "open">;
11
+ type SvSheetPasteSpecial = ReturnType<typeof SvSheetPasteSpecial>;
12
+ export default SvSheetPasteSpecial;
@@ -0,0 +1,220 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's Create PivotTable dialog with its field list folded in: the
4
+ * source block, where the result goes, and which field is a row, a column
5
+ * or a measure. Opened by Insert > PivotTable, and again by Refresh on a
6
+ * cell inside a pivot, which is how one is changed.
7
+ */
8
+ import { SvModal } from '@svgrid/grid'
9
+ import { useSheetText } from './sheet-text'
10
+ import { parseRangeText, rangeText } from './sheet/protection'
11
+ import { parseA1, formatA1 } from './sheet/address'
12
+ import {
13
+ SHEET_PIVOT_AGGS, ALL_VALUES,
14
+ type SheetPivot, type SheetPivotAgg, type SheetPivotValue, type SheetPivotFilter,
15
+ } from './sheet/pivot-range'
16
+ import type { Rect } from './sheet/format-store'
17
+
18
+ type Props = {
19
+ open?: boolean
20
+ /** The pivot as it stands, new or being edited. */
21
+ pivot: SheetPivot
22
+ /** The source's field names, read from its header row. */
23
+ fields: ReadonlyArray<string>
24
+ /**
25
+ * The values each field carries, for the Filters area's value list.
26
+ * The dialog has the definition, not the cells, so the shell reads
27
+ * them off the source.
28
+ */
29
+ valuesOf?: (field: string) => ReadonlyArray<string>
30
+ existing?: boolean
31
+ onApply: (pivot: SheetPivot) => void
32
+ onDelete?: () => void
33
+ onClose?: () => void
34
+ }
35
+
36
+ let { open = $bindable(false), pivot, fields, valuesOf, existing = false, onApply, onDelete, onClose }: Props = $props()
37
+ const t = useSheetText()
38
+
39
+ let source = $state('')
40
+ let target = $state('')
41
+ let rows = $state<string[]>([])
42
+ let cols = $state<string[]>([])
43
+ let values = $state<SheetPivotValue[]>([])
44
+ let filters = $state<SheetPivotFilter[]>([])
45
+ let grandTotalRow = $state(true)
46
+ let rowSubtotals = $state(true)
47
+ let error = $state('')
48
+ let first = $state<HTMLInputElement | null>(null)
49
+
50
+ $effect(() => {
51
+ if (!open) return
52
+ source = rangeText([pivot.source])
53
+ target = formatA1({ sheet: null, row: pivot.target.row, col: pivot.target.col, rowAbs: false, colAbs: false })
54
+ rows = [...pivot.rows]
55
+ cols = [...pivot.cols]
56
+ values = pivot.values.map((v) => ({ ...v }))
57
+ filters = (pivot.filters ?? []).map((f) => ({ ...f }))
58
+ grandTotalRow = pivot.grandTotalRow !== false
59
+ rowSubtotals = pivot.rowSubtotals !== false
60
+ error = ''
61
+ queueMicrotask(() => first?.focus())
62
+ })
63
+
64
+ /** Where a field sits now: down the rows, across the columns, or a measure. */
65
+ function placeOf(field: string): Placement {
66
+ if (rows.includes(field)) return 'rows'
67
+ if (cols.includes(field)) return 'cols'
68
+ if (values.some((v) => v.field === field)) return 'values'
69
+ if (filters.some((f) => f.field === field)) return 'filters'
70
+ return 'none'
71
+ }
72
+
73
+ type Placement = 'none' | 'rows' | 'cols' | 'values' | 'filters'
74
+
75
+ function place(field: string, to: Placement) {
76
+ rows = rows.filter((f) => f !== field)
77
+ cols = cols.filter((f) => f !== field)
78
+ values = values.filter((v) => v.field !== field)
79
+ filters = filters.filter((f) => f.field !== field)
80
+ if (to === 'rows') rows = [...rows, field]
81
+ else if (to === 'cols') cols = [...cols, field]
82
+ else if (to === 'values') values = [...values, { field, agg: 'sum' }]
83
+ else if (to === 'filters') filters = [...filters, { field, value: '' }]
84
+ }
85
+
86
+ function setFilter(field: string, value: string) {
87
+ filters = filters.map((f) => (f.field === field ? { ...f, value } : f))
88
+ }
89
+
90
+ function setAgg(field: string, agg: SheetPivotAgg) {
91
+ values = values.map((v) => (v.field === field ? { ...v, agg } : v))
92
+ }
93
+
94
+ function ok() {
95
+ const rects = parseRangeText(source)
96
+ const block = rects && rects.length === 1 ? rects[0]! : null
97
+ const at = parseA1(target.trim())
98
+ if (!block || !at || at.row === null) { error = t('pivot.badRange'); return }
99
+ if (!values.length) { error = t('pivot.needValue'); return }
100
+ const next: SheetPivot = {
101
+ ...pivot,
102
+ source: block as Rect,
103
+ target: { row: at.row, col: at.col },
104
+ rows: [...rows],
105
+ cols: [...cols],
106
+ values: values.map((v) => ({ ...v })),
107
+ ...(filters.length ? { filters: filters.map((f) => ({ ...f })) } : { filters: [] }),
108
+ grandTotalRow,
109
+ rowSubtotals,
110
+ }
111
+ if (!next.filters?.length) delete next.filters
112
+ open = false
113
+ onApply(next)
114
+ onClose?.()
115
+ }
116
+
117
+ function close() {
118
+ open = false
119
+ onClose?.()
120
+ }
121
+ </script>
122
+
123
+ <SvModal bind:open onClose={onClose} title={t('pivot.title')} size="md">
124
+ <form class="sv-sheet-dialog" onsubmit={(e) => { e.preventDefault(); ok() }}>
125
+ <label class="field">
126
+ <span>{t('pivot.source')}</span>
127
+ <input type="text" bind:this={first} bind:value={source} spellcheck="false" placeholder={t('pivot.sourcePlaceholder')} />
128
+ </label>
129
+ <label class="field">
130
+ <span>{t('pivot.target')}</span>
131
+ <input type="text" bind:value={target} spellcheck="false" placeholder={t('pivot.targetPlaceholder')} />
132
+ </label>
133
+ <div class="fields">
134
+ <div class="head">
135
+ <span>{t('pivot.field')}</span>
136
+ <span>{t('pivot.place')}</span>
137
+ <span>{t('pivot.summarise')}</span>
138
+ </div>
139
+ {#each fields as field (field)}
140
+ {@const place_ = placeOf(field)}
141
+ <div class="row">
142
+ <span class="name" title={field}>{field}</span>
143
+ <select value={place_} onchange={(e) => place(field, e.currentTarget.value as Placement)}>
144
+ <option value="none">{t('pivot.place.none')}</option>
145
+ <option value="rows">{t('pivot.place.rows')}</option>
146
+ <option value="cols">{t('pivot.place.cols')}</option>
147
+ <option value="values">{t('pivot.place.values')}</option>
148
+ <option value="filters">{t('pivot.place.filters')}</option>
149
+ </select>
150
+ {#if place_ === 'values'}
151
+ {@const agg = values.find((v) => v.field === field)?.agg ?? 'sum'}
152
+ <select value={agg} onchange={(e) => setAgg(field, e.currentTarget.value as SheetPivotAgg)}>
153
+ {#each SHEET_PIVOT_AGGS as id (id)}<option value={id}>{t(`pivot.agg.${id}`)}</option>{/each}
154
+ </select>
155
+ {:else if place_ === 'filters'}
156
+ {@const chosen = filters.find((f) => f.field === field)?.value ?? ''}
157
+ <select value={chosen} onchange={(e) => setFilter(field, e.currentTarget.value)} aria-label={t('pivot.filterValue', { field })}>
158
+ <option value="">{ALL_VALUES}</option>
159
+ {#each valuesOf?.(field) ?? [] as value (value)}<option value={value}>{value}</option>{/each}
160
+ </select>
161
+ {:else}
162
+ <span class="dash">&mdash;</span>
163
+ {/if}
164
+ </div>
165
+ {/each}
166
+ </div>
167
+ <div class="checks">
168
+ <label class="check"><input type="checkbox" bind:checked={grandTotalRow} /> {t('pivot.grandTotal')}</label>
169
+ <label class="check"><input type="checkbox" bind:checked={rowSubtotals} /> {t('pivot.subtotals')}</label>
170
+ </div>
171
+ {#if error}<p class="error">{error}</p>{/if}
172
+ <p class="hint">{t('pivot.hint')}</p>
173
+ </form>
174
+ {#snippet footer()}
175
+ <div class="sv-sheet-dialog-buttons">
176
+ {#if existing && onDelete}
177
+ <button type="button" class="btn" onclick={() => { open = false; onDelete?.() }}>{t('delete')}</button>
178
+ {/if}
179
+ <span class="spacer"></span>
180
+ <button type="button" class="btn primary" onclick={ok}>{t('ok')}</button>
181
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
182
+ </div>
183
+ {/snippet}
184
+ </SvModal>
185
+
186
+ <style>
187
+ .spacer { flex: 1; }
188
+ .error { margin: 4px 0 0; color: var(--sg-danger, #c42b1c); font-size: 12px; }
189
+ .fields {
190
+ margin-top: 8px;
191
+ max-height: 220px;
192
+ overflow: auto;
193
+ border: 1px solid var(--sg-border, #d1d1d1);
194
+ border-radius: var(--sg-radius, 4px);
195
+ }
196
+ .head,
197
+ .row {
198
+ display: grid;
199
+ grid-template-columns: 1fr 120px 130px;
200
+ gap: 8px;
201
+ align-items: center;
202
+ padding: 4px 8px;
203
+ }
204
+ .head {
205
+ position: sticky;
206
+ top: 0;
207
+ background: var(--sg-header-bg, #f3f3f3);
208
+ color: var(--sg-muted, #616161);
209
+ font-size: 11px;
210
+ text-transform: uppercase;
211
+ letter-spacing: 0.04em;
212
+ }
213
+ .row + .row { border-top: 1px solid var(--sg-border, #ececec); }
214
+ .name {
215
+ overflow: hidden;
216
+ text-overflow: ellipsis;
217
+ white-space: nowrap;
218
+ }
219
+ .dash { color: var(--sg-muted, #9a9a9a); text-align: center; }
220
+ </style>
@@ -0,0 +1,21 @@
1
+ import { type SheetPivot } from './sheet/pivot-range.js';
2
+ type Props = {
3
+ open?: boolean;
4
+ /** The pivot as it stands, new or being edited. */
5
+ pivot: SheetPivot;
6
+ /** The source's field names, read from its header row. */
7
+ fields: ReadonlyArray<string>;
8
+ /**
9
+ * The values each field carries, for the Filters area's value list.
10
+ * The dialog has the definition, not the cells, so the shell reads
11
+ * them off the source.
12
+ */
13
+ valuesOf?: (field: string) => ReadonlyArray<string>;
14
+ existing?: boolean;
15
+ onApply: (pivot: SheetPivot) => void;
16
+ onDelete?: () => void;
17
+ onClose?: () => void;
18
+ };
19
+ declare const SvSheetPivot: import("svelte").Component<Props, {}, "open">;
20
+ type SvSheetPivot = ReturnType<typeof SvSheetPivot>;
21
+ export default SvSheetPivot;
@@ -0,0 +1,81 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's Protect Sheet dialog, without the password: the "allow all
4
+ * users of this worksheet to" list, each entry a kind of change that
5
+ * stays open once the sheet is protected. OK protects with what is
6
+ * ticked; the shell keeps the list per sheet, so Unprotect and Protect
7
+ * again offer the same ticks.
8
+ */
9
+ import { useSheetText } from './sheet-text'
10
+ import { SvModal } from '@svgrid/grid'
11
+ import { PROTECTION_PERMISSIONS, type ProtectionAllow, type ProtectionPermission } from './sheet/protection'
12
+
13
+ type Props = {
14
+ open?: boolean
15
+ /** The sheet's list as it stands, what the ticks open on. */
16
+ allow: ProtectionAllow
17
+ onApply: (allow: ProtectionAllow) => void
18
+ onClose?: () => void
19
+ }
20
+
21
+ let { open = $bindable(false), allow, onApply, onClose }: Props = $props()
22
+ const t = useSheetText()
23
+
24
+ let ticks = $state<Record<ProtectionPermission, boolean>>({} as Record<ProtectionPermission, boolean>)
25
+ let first = $state<HTMLInputElement | null>(null)
26
+
27
+ $effect(() => {
28
+ if (!open) return
29
+ const next = {} as Record<ProtectionPermission, boolean>
30
+ for (const key of PROTECTION_PERMISSIONS) next[key] = Boolean(allow[key])
31
+ ticks = next
32
+ queueMicrotask(() => first?.focus())
33
+ })
34
+
35
+ function ok() {
36
+ const next: ProtectionAllow = {}
37
+ for (const key of PROTECTION_PERMISSIONS) if (ticks[key]) next[key] = true
38
+ open = false
39
+ onApply(next)
40
+ onClose?.()
41
+ }
42
+
43
+ function close() {
44
+ open = false
45
+ onClose?.()
46
+ }
47
+ </script>
48
+
49
+ <SvModal bind:open onClose={onClose} title={t('protectSheet.title')} size="sm">
50
+ <form class="sv-sheet-dialog" onsubmit={(e) => { e.preventDefault(); ok() }}>
51
+ <div class="lead">{t('protectSheet.lead')}</div>
52
+ <div class="checks column" role="group" aria-label={t('protectSheet.lead')}>
53
+ {#each PROTECTION_PERMISSIONS as key, i (key)}
54
+ <label class="check">
55
+ {#if i === 0}
56
+ <input bind:this={first} type="checkbox" bind:checked={ticks[key]} />
57
+ {:else}
58
+ <input type="checkbox" bind:checked={ticks[key]} />
59
+ {/if}
60
+ {t(`protectSheet.${key}`)}
61
+ </label>
62
+ {/each}
63
+ </div>
64
+ <p class="hint">{t('protectSheet.hint')}</p>
65
+ </form>
66
+ {#snippet footer()}
67
+ <div class="sv-sheet-dialog-buttons">
68
+ <button type="button" class="btn primary" onclick={ok}>{t('ok')}</button>
69
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
70
+ </div>
71
+ {/snippet}
72
+ </SvModal>
73
+
74
+ <style>
75
+ .checks.column {
76
+ display: flex;
77
+ flex-direction: column;
78
+ gap: 4px;
79
+ padding: 4px 0;
80
+ }
81
+ </style>
@@ -0,0 +1,11 @@
1
+ import { type ProtectionAllow } from './sheet/protection.js';
2
+ type Props = {
3
+ open?: boolean;
4
+ /** The sheet's list as it stands, what the ticks open on. */
5
+ allow: ProtectionAllow;
6
+ onApply: (allow: ProtectionAllow) => void;
7
+ onClose?: () => void;
8
+ };
9
+ declare const SvSheetProtectSheet: import("svelte").Component<Props, {}, "open">;
10
+ type SvSheetProtectSheet = ReturnType<typeof SvSheetProtectSheet>;
11
+ export default SvSheetProtectSheet;
@@ -0,0 +1,152 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's Remove Duplicates: the columns of the block around the
4
+ * selection, tick the ones that decide what a duplicate is, say whether
5
+ * the first row is headers, OK. Survivors close up from the top and the
6
+ * rows they vacated go blank, in one batch, so it is one Ctrl+Z; the
7
+ * sentence Excel's dialog ends on is handed back for the status bar.
8
+ */
9
+ import { useSheetText } from './sheet-text'
10
+ import { untrack } from 'svelte'
11
+ import { SvModal } from '@svgrid/grid'
12
+ import type { GridCommandContext } from '@svgrid/grid/shortcuts'
13
+ import type { Workbook } from './sheet/workbook'
14
+ import { findDuplicates } from './sheet/transforms'
15
+ import { colToLetters } from './sheet/address'
16
+
17
+ type Props = {
18
+ open?: boolean
19
+ workbook: Workbook
20
+ cmd: () => GridCommandContext | null
21
+ onDone: (message: string) => void
22
+ onClose?: () => void
23
+ }
24
+
25
+ let { open = $bindable(false), workbook, cmd, onDone, onClose }: Props = $props()
26
+ const t = useSheetText()
27
+
28
+ type Block = { top: number; left: number; bottom: number; right: number }
29
+ let block = $state<Block>({ top: 0, left: 0, bottom: 0, right: 0 })
30
+ let chosen = $state<boolean[]>([])
31
+ let hasHeaders = $state(true)
32
+
33
+ const raw = (r: number, c: number) => workbook.getRaw(workbook.active, r, c)
34
+
35
+ const headers = $derived.by(() =>
36
+ Array.from({ length: block.right - block.left + 1 }, (_, i) => {
37
+ const letter = colToLetters(block.left + i)
38
+ const fallback = t('removeDuplicates.columnLetter', { letter })
39
+ return hasHeaders ? raw(block.top, block.left + i) || fallback : fallback
40
+ }),
41
+ )
42
+
43
+ /**
44
+ * The block: the selection when it is a range, else everything used from
45
+ * the active cell's column rightwards, top row down, the way Excel grows
46
+ * a single cell to its current region.
47
+ */
48
+ $effect(() => {
49
+ if (!open) return
50
+ untrack(prepare)
51
+ })
52
+
53
+ function prepare() {
54
+ const c = cmd()
55
+ const range = c?.ranges[c.ranges.length - 1]
56
+ const rows = Math.max(workbook.rowCount(workbook.active) - 1, 0)
57
+ const cols = Math.max(workbook.colCount(workbook.active) - 1, 0)
58
+ if (range && (range[0] !== range[2] || range[1] !== range[3])) {
59
+ block = { top: range[0], left: range[1], bottom: Math.min(range[2], rows), right: Math.min(range[3], cols) }
60
+ } else {
61
+ const left = c?.activeCell?.colIndex ?? 0
62
+ block = { top: 0, left, bottom: rows, right: Math.max(cols, left) }
63
+ }
64
+ chosen = Array.from({ length: block.right - block.left + 1 }, () => true)
65
+ }
66
+
67
+ function remove() {
68
+ const c = cmd()
69
+ if (!c) return
70
+ const first = hasHeaders ? block.top + 1 : block.top
71
+ const width = block.right - block.left + 1
72
+ const rows = Array.from({ length: Math.max(block.bottom - first + 1, 0) }, (_, i) =>
73
+ Array.from({ length: width }, (_, k) => raw(first + i, block.left + k)),
74
+ )
75
+ const columns = chosen.flatMap((on, i) => (on ? [i] : []))
76
+ const report = findDuplicates(rows, { columns })
77
+ const message = `${report.remove.length} duplicate value${report.remove.length === 1 ? '' : 's'} found and removed; ${report.keep.length} unique value${report.keep.length === 1 ? '' : 's'} remain.`
78
+ if (report.remove.length > 0) {
79
+ const kept = report.keep.map((i) => rows[i]!)
80
+ c.batch(() => {
81
+ for (let i = 0; i < rows.length; i += 1) {
82
+ const source = kept[i]
83
+ for (let k = 0; k < width; k += 1) {
84
+ c.setCellValue(first + i, block.left + k, source ? source[k] ?? '' : '')
85
+ }
86
+ }
87
+ })
88
+ }
89
+ open = false
90
+ if (report.remove.length > 0) {
91
+ c.setSelection(block.top, block.left)
92
+ c.extendSelection(first + (report.keep.length || 1) - 1, block.right)
93
+ }
94
+ onDone(message)
95
+ onClose?.()
96
+ }
97
+
98
+ function close() {
99
+ open = false
100
+ onClose?.()
101
+ }
102
+ </script>
103
+
104
+ <SvModal bind:open onClose={onClose} title={t('removeDuplicates.title')} size="sm">
105
+ <div class="sv-sheet-dialog" role="group" aria-label={t('removeDuplicates.title')}>
106
+ <p class="lead">{t('removeDuplicates.lead')}</p>
107
+ <div class="checks">
108
+ <button type="button" class="small" onclick={() => (chosen = chosen.map(() => true))}>{t('removeDuplicates.selectAll')}</button>
109
+ <button type="button" class="small" onclick={() => (chosen = chosen.map(() => false))}>{t('removeDuplicates.unselectAll')}</button>
110
+ <label class="check"><input type="checkbox" bind:checked={hasHeaders} /> {t('removeDuplicates.hasHeaders')}</label>
111
+ </div>
112
+ <fieldset class="group">
113
+ <legend>{t('removeDuplicates.columns')}</legend>
114
+ {#each headers as header, i (i)}
115
+ <label class="check"><input type="checkbox" bind:checked={chosen[i]} /> {header}</label>
116
+ {/each}
117
+ </fieldset>
118
+ </div>
119
+ {#snippet footer()}
120
+ <div class="sv-sheet-dialog-buttons">
121
+ <button type="button" class="btn primary" onclick={remove} disabled={!chosen.some(Boolean)}>{t('ok')}</button>
122
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
123
+ </div>
124
+ {/snippet}
125
+ </SvModal>
126
+
127
+ <style>
128
+ .lead { margin: 0; }
129
+ .group {
130
+ display: flex;
131
+ flex-direction: column;
132
+ gap: 4px;
133
+ max-height: 200px;
134
+ overflow: auto;
135
+ margin: 0;
136
+ padding: 6px 10px 8px;
137
+ border: 1px solid var(--sg-border, #d1d1d1);
138
+ border-radius: var(--sg-radius, 3px);
139
+ }
140
+ .group legend { padding: 0 4px; font-weight: 600; }
141
+ .small {
142
+ height: 24px;
143
+ padding: 0 10px;
144
+ font: inherit;
145
+ font-size: 12px;
146
+ color: var(--sg-fg, #242424);
147
+ background: var(--sg-bg, #fff);
148
+ border: 1px solid var(--sg-border, #d1d1d1);
149
+ border-radius: var(--sg-radius, 3px);
150
+ cursor: pointer;
151
+ }
152
+ </style>
@@ -0,0 +1,12 @@
1
+ import type { GridCommandContext } from '@svgrid/grid/shortcuts';
2
+ import type { Workbook } from './sheet/workbook.js';
3
+ type Props = {
4
+ open?: boolean;
5
+ workbook: Workbook;
6
+ cmd: () => GridCommandContext | null;
7
+ onDone: (message: string) => void;
8
+ onClose?: () => void;
9
+ };
10
+ declare const SvSheetRemoveDuplicates: import("svelte").Component<Props, {}, "open">;
11
+ type SvSheetRemoveDuplicates = ReturnType<typeof SvSheetRemoveDuplicates>;
12
+ export default SvSheetRemoveDuplicates;