@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.
- package/LICENSE +94 -24
- package/README.md +36 -4
- package/dist/SvAdvancedFilter.svelte +1 -1
- package/dist/SvAlertsManager.svelte +2 -1
- package/dist/SvBoard.svelte +2 -1
- package/dist/SvExportMenu.svelte +4 -1
- package/dist/SvExportMenu.svelte.d.ts +0 -13
- package/dist/SvExpressionEditor.svelte +3 -3
- package/dist/SvFormulaBar.svelte +680 -0
- package/dist/SvFormulaBar.svelte.d.ts +69 -0
- package/dist/SvGridAlerts.svelte +49 -9
- package/dist/SvGridBoard.svelte +13 -8
- package/dist/SvGridBulkEditDrawer.svelte +26 -2
- package/dist/SvGridEditPanel.svelte +3 -0
- package/dist/SvGridScheduler.svelte +69 -40
- package/dist/SvGridSelectionBar.svelte +10 -3
- package/dist/SvPivotDesigner.svelte +263 -54
- package/dist/SvPivotDesigner.svelte.d.ts +27 -20
- package/dist/SvRibbonIcon.svelte +46 -0
- package/dist/SvRibbonIcon.svelte.d.ts +17 -0
- package/dist/SvSchemaChart.svelte +4 -2
- package/dist/SvSheet.svelte +7914 -0
- package/dist/SvSheet.svelte.d.ts +215 -0
- package/dist/SvSheetChartSetup.svelte +151 -0
- package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
- package/dist/SvSheetComment.svelte +283 -0
- package/dist/SvSheetComment.svelte.d.ts +22 -0
- package/dist/SvSheetConditionalFormat.svelte +159 -0
- package/dist/SvSheetConditionalFormat.svelte.d.ts +14 -0
- package/dist/SvSheetDataValidation.svelte +273 -0
- package/dist/SvSheetDataValidation.svelte.d.ts +14 -0
- package/dist/SvSheetEditRanges.svelte +217 -0
- package/dist/SvSheetEditRanges.svelte.d.ts +15 -0
- package/dist/SvSheetErrors.svelte +125 -0
- package/dist/SvSheetErrors.svelte.d.ts +20 -0
- package/dist/SvSheetEvaluate.svelte +133 -0
- package/dist/SvSheetEvaluate.svelte.d.ts +15 -0
- package/dist/SvSheetFilterMenu.svelte +320 -0
- package/dist/SvSheetFilterMenu.svelte.d.ts +22 -0
- package/dist/SvSheetFindReplace.svelte +132 -0
- package/dist/SvSheetFindReplace.svelte.d.ts +10 -0
- package/dist/SvSheetFormatCells.svelte +465 -0
- package/dist/SvSheetFormatCells.svelte.d.ts +17 -0
- package/dist/SvSheetGoalSeek.svelte +145 -0
- package/dist/SvSheetGoalSeek.svelte.d.ts +12 -0
- package/dist/SvSheetInsertFunction.svelte +149 -0
- package/dist/SvSheetInsertFunction.svelte.d.ts +8 -0
- package/dist/SvSheetIteration.svelte +81 -0
- package/dist/SvSheetIteration.svelte.d.ts +10 -0
- package/dist/SvSheetLink.svelte +99 -0
- package/dist/SvSheetLink.svelte.d.ts +17 -0
- package/dist/SvSheetListPicker.svelte +91 -0
- package/dist/SvSheetListPicker.svelte.d.ts +10 -0
- package/dist/SvSheetManageRules.svelte +187 -0
- package/dist/SvSheetManageRules.svelte.d.ts +16 -0
- package/dist/SvSheetNameManager.svelte +227 -0
- package/dist/SvSheetNameManager.svelte.d.ts +11 -0
- package/dist/SvSheetPageSetup.svelte +159 -0
- package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
- package/dist/SvSheetPasteSpecial.svelte +107 -0
- package/dist/SvSheetPasteSpecial.svelte.d.ts +12 -0
- package/dist/SvSheetPivot.svelte +220 -0
- package/dist/SvSheetPivot.svelte.d.ts +21 -0
- package/dist/SvSheetProtectSheet.svelte +81 -0
- package/dist/SvSheetProtectSheet.svelte.d.ts +11 -0
- package/dist/SvSheetRemoveDuplicates.svelte +152 -0
- package/dist/SvSheetRemoveDuplicates.svelte.d.ts +12 -0
- package/dist/SvSheetRibbon.svelte +1254 -0
- package/dist/SvSheetRibbon.svelte.d.ts +34 -0
- package/dist/SvSheetSizeDialog.svelte +60 -0
- package/dist/SvSheetSizeDialog.svelte.d.ts +11 -0
- package/dist/SvSheetSort.svelte +218 -0
- package/dist/SvSheetSort.svelte.d.ts +28 -0
- package/dist/SvSheetSparklines.svelte +135 -0
- package/dist/SvSheetSparklines.svelte.d.ts +14 -0
- package/dist/SvSheetTable.svelte +160 -0
- package/dist/SvSheetTable.svelte.d.ts +24 -0
- package/dist/SvSheetTabs.svelte +571 -0
- package/dist/SvSheetTabs.svelte.d.ts +50 -0
- package/dist/SvSheetTabs.test-harness.svelte.d.ts +17 -0
- package/dist/SvSheetTabs.test-harness.svelte.js +22 -0
- package/dist/SvSheetTextToColumns.svelte +172 -0
- package/dist/SvSheetTextToColumns.svelte.d.ts +13 -0
- package/dist/SvSheetValidationAlert.svelte +85 -0
- package/dist/SvSheetValidationAlert.svelte.d.ts +15 -0
- package/dist/advanced-filter-enable.js +1 -1
- package/dist/alerts/alert-engine.d.ts +6 -0
- package/dist/alerts/alert-engine.js +21 -4
- package/dist/alerts/alert-formats.js +2 -0
- package/dist/alerts/alert-types.d.ts +1 -1
- package/dist/alerts.d.ts +1 -1
- package/dist/alerts.js +2 -2
- package/dist/board.js +2 -2
- package/dist/bulk-edit.d.ts +3 -1
- package/dist/bulk-edit.js +1 -1
- package/dist/cdn/svgrid-enterprise.svelte-external.js +43538 -6539
- package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
- package/dist/designer/assets/SvChartMenu-BDoeqGz6.js +1 -0
- package/dist/designer/assets/SvChartMenu-BYO9cYdy.css +1 -0
- package/dist/designer/assets/SvDateRangeInput-BBRzrQeg.js +1 -0
- package/dist/designer/assets/SvDateTimePicker-DCPg7WGN.js +1 -0
- package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
- package/dist/designer/assets/SvGridChart-BgLuPO7I.css +1 -0
- package/dist/designer/assets/SvGridChart-Cy1ATrWh.js +3 -0
- package/dist/designer/assets/SvGridChartBuilder-08YWWeqY.css +1 -0
- package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
- package/dist/designer/assets/SvGridChartPanel-4Pc8y5yO.css +1 -0
- package/dist/designer/assets/SvGridChartPanel-CATdVc9X.js +4 -0
- package/dist/designer/assets/{SvGridChartView-DUc-1RUf.css → SvGridChartView-7msfnWZT.css} +1 -1
- package/dist/designer/assets/SvGridChartView-CmsZtCED.js +1 -0
- package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
- package/dist/designer/assets/SvListBox-BDS66lmZ.js +110 -0
- package/dist/designer/assets/SvMenuList-DJ47ba1h.css +1 -0
- package/dist/designer/assets/SvMenuList-Dgq2D5VN.js +1 -0
- package/dist/designer/assets/SvTabs-2mHC6oaz.js +1 -0
- package/dist/designer/assets/SvTabs-DKmwb5p1.css +1 -0
- package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
- package/dist/designer/assets/chart-Cn7MnNqA.js +1 -0
- package/dist/designer/assets/chart-export-B6bkQ3X8.js +11 -0
- package/dist/designer/assets/chart-export-pdf-BbA28-gt.js +11 -0
- package/dist/designer/assets/chart-panel-messages-Dz7PTIqT.js +1 -0
- package/dist/designer/assets/chart-summary-BD1qYB2R.js +1 -0
- package/dist/designer/assets/chart-trend-B8xr5LuD.js +1 -0
- package/dist/designer/assets/chart-validate-BMqM-qkF.js +1 -0
- package/dist/designer/assets/column-resize-BYDzR1Ve.js +1 -0
- package/dist/designer/assets/date-format-B8JbEtIG.js +1 -0
- package/dist/designer/assets/date-format-DKS-z0xS.css +1 -0
- package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
- package/dist/designer/assets/editor-contract-Bpoa7A5g.js +1 -0
- package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
- package/dist/designer/assets/focus-trap-V2-6Fy9I.js +1 -0
- package/dist/designer/assets/{index-C_a9Cj8Y.js → index-D5bVbuzI.js} +318 -315
- package/dist/designer/assets/index-_JVFxt02.css +1 -0
- package/dist/designer/assets/list-option-BP_dWS66.js +1 -0
- package/dist/designer/assets/row-resize-BInFWCpr.js +1 -0
- package/dist/designer/assets/server-block-cache-CXJKkJpy.js +1 -0
- package/dist/designer/assets/src-CITpcm6b.js +1 -0
- package/dist/designer/assets/src-DUQ4xE3x.js +58 -0
- package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
- package/dist/designer/index.html +29 -19
- package/dist/export-pdf.d.ts +164 -0
- package/dist/export-pdf.js +346 -15
- package/dist/export.js +25 -10
- package/dist/gantt/SvGridGantt.svelte +2890 -0
- package/dist/gantt/SvGridGantt.svelte.d.ts +30 -0
- package/dist/gantt/gantt-config.d.ts +73 -0
- package/dist/gantt/gantt-config.js +1 -0
- package/dist/gantt/gantt-critical-path.d.ts +67 -0
- package/dist/gantt/gantt-critical-path.js +207 -0
- package/dist/gantt/gantt-model.d.ts +257 -0
- package/dist/gantt/gantt-model.js +651 -0
- package/dist/gantt/gantt-resources.d.ts +59 -0
- package/dist/gantt/gantt-resources.js +71 -0
- package/dist/gantt/gantt.d.ts +7 -0
- package/dist/gantt/gantt.js +36 -0
- package/dist/gantt/index.d.ts +15 -0
- package/dist/gantt/index.js +22 -0
- package/dist/gantt/timeline-arrows.d.ts +102 -0
- package/dist/gantt/timeline-arrows.js +181 -0
- package/dist/import.d.ts +2 -2
- package/dist/import.js +1 -1
- package/dist/index.d.ts +93 -3
- package/dist/index.js +107 -3
- package/dist/install.js +13 -1
- package/dist/license-core.d.ts +17 -1
- package/dist/license-core.js +16 -5
- package/dist/license.d.ts +18 -2
- package/dist/license.js +71 -6
- package/dist/node/studio.js +203 -9
- package/dist/pivot-chart.d.ts +25 -1
- package/dist/pivot-chart.js +25 -69
- package/dist/pivot-enable.js +2 -2
- package/dist/scheduler-dependencies.d.ts +35 -0
- package/dist/scheduler-dependencies.js +36 -1
- package/dist/scheduler.js +2 -2
- package/dist/selection-bar.js +2 -2
- package/dist/server/SvGroupCell.svelte +213 -0
- package/dist/server/SvGroupCell.svelte.d.ts +62 -0
- package/dist/server/SvRowGroupPanel.svelte +322 -0
- package/dist/server/SvRowGroupPanel.svelte.d.ts +37 -0
- package/dist/server/enable.d.ts +17 -0
- package/dist/server/enable.js +49 -0
- package/dist/server/index.d.ts +22 -0
- package/dist/server/index.js +24 -0
- package/dist/server/messages.d.ts +45 -0
- package/dist/server/messages.js +35 -0
- package/dist/server/server-group-model.d.ts +104 -0
- package/dist/server/server-group-model.js +272 -0
- package/dist/server/server-pivot.d.ts +46 -0
- package/dist/server/server-pivot.js +57 -0
- package/dist/server/server-row-model.d.ts +547 -0
- package/dist/server/server-row-model.js +1551 -0
- package/dist/server/server-selection.d.ts +99 -0
- package/dist/server/server-selection.js +215 -0
- package/dist/server/svgrid-adapter.d.ts +155 -0
- package/dist/server/svgrid-adapter.js +202 -0
- package/dist/sheet/address.d.ts +43 -0
- package/dist/sheet/address.js +81 -0
- package/dist/sheet/ast.d.ts +138 -0
- package/dist/sheet/ast.js +70 -0
- package/dist/sheet/auto-filter.d.ts +120 -0
- package/dist/sheet/auto-filter.js +295 -0
- package/dist/sheet/autocomplete.d.ts +51 -0
- package/dist/sheet/autocomplete.js +248 -0
- package/dist/sheet/cell-images.d.ts +39 -0
- package/dist/sheet/cell-images.js +90 -0
- package/dist/sheet/cell-types.d.ts +58 -0
- package/dist/sheet/cell-types.js +96 -0
- package/dist/sheet/coerce.d.ts +71 -0
- package/dist/sheet/coerce.js +289 -0
- package/dist/sheet/commands.d.ts +89 -0
- package/dist/sheet/commands.js +230 -0
- package/dist/sheet/comments.d.ts +63 -0
- package/dist/sheet/comments.js +131 -0
- package/dist/sheet/conditional-formats.d.ts +167 -0
- package/dist/sheet/conditional-formats.js +341 -0
- package/dist/sheet/csv.d.ts +32 -0
- package/dist/sheet/csv.js +158 -0
- package/dist/sheet/culture.d.ts +87 -0
- package/dist/sheet/culture.js +247 -0
- package/dist/sheet/delta.d.ts +102 -0
- package/dist/sheet/delta.js +203 -0
- package/dist/sheet/deps.d.ts +104 -0
- package/dist/sheet/deps.js +274 -0
- package/dist/sheet/document.d.ts +252 -0
- package/dist/sheet/document.js +465 -0
- package/dist/sheet/edit-keys.d.ts +14 -0
- package/dist/sheet/edit-keys.js +40 -0
- package/dist/sheet/engine.d.ts +67 -0
- package/dist/sheet/engine.js +19 -0
- package/dist/sheet/entry.d.ts +35 -0
- package/dist/sheet/entry.js +226 -0
- package/dist/sheet/error-check.d.ts +49 -0
- package/dist/sheet/error-check.js +83 -0
- package/dist/sheet/evaluate-steps.d.ts +48 -0
- package/dist/sheet/evaluate-steps.js +196 -0
- package/dist/sheet/evaluate.d.ts +128 -0
- package/dist/sheet/evaluate.js +1049 -0
- package/dist/sheet/filter-files.d.ts +37 -0
- package/dist/sheet/filter-files.js +465 -0
- package/dist/sheet/find-replace.d.ts +62 -0
- package/dist/sheet/find-replace.js +152 -0
- package/dist/sheet/format-store.d.ts +114 -0
- package/dist/sheet/format-store.js +243 -0
- package/dist/sheet/freeze.d.ts +54 -0
- package/dist/sheet/freeze.js +58 -0
- package/dist/sheet/from-rows.d.ts +14 -0
- package/dist/sheet/from-rows.js +50 -0
- package/dist/sheet/function-catalog.d.ts +10 -0
- package/dist/sheet/function-catalog.js +385 -0
- package/dist/sheet/functions.d.ts +28 -0
- package/dist/sheet/functions.js +634 -0
- package/dist/sheet/goal-seek.d.ts +73 -0
- package/dist/sheet/goal-seek.js +153 -0
- package/dist/sheet/index.d.ts +80 -0
- package/dist/sheet/index.js +80 -0
- package/dist/sheet/links.d.ts +57 -0
- package/dist/sheet/links.js +174 -0
- package/dist/sheet/merges.d.ts +71 -0
- package/dist/sheet/merges.js +137 -0
- package/dist/sheet/messages.d.ts +778 -0
- package/dist/sheet/messages.js +806 -0
- package/dist/sheet/names.d.ts +31 -0
- package/dist/sheet/names.js +87 -0
- package/dist/sheet/navigate.d.ts +52 -0
- package/dist/sheet/navigate.js +135 -0
- package/dist/sheet/number-format.d.ts +110 -0
- package/dist/sheet/number-format.js +905 -0
- package/dist/sheet/objects.d.ts +106 -0
- package/dist/sheet/objects.js +149 -0
- package/dist/sheet/ods-document.d.ts +44 -0
- package/dist/sheet/ods-document.js +1275 -0
- package/dist/sheet/open-file.d.ts +26 -0
- package/dist/sheet/open-file.js +56 -0
- package/dist/sheet/outline.d.ts +82 -0
- package/dist/sheet/outline.js +228 -0
- package/dist/sheet/packs/array.d.ts +16 -0
- package/dist/sheet/packs/array.js +172 -0
- package/dist/sheet/packs/database.d.ts +42 -0
- package/dist/sheet/packs/database.js +142 -0
- package/dist/sheet/packs/engineering.d.ts +2 -0
- package/dist/sheet/packs/engineering.js +296 -0
- package/dist/sheet/packs/financial.d.ts +5 -0
- package/dist/sheet/packs/financial.js +220 -0
- package/dist/sheet/packs/math-stats.d.ts +2 -0
- package/dist/sheet/packs/math-stats.js +372 -0
- package/dist/sheet/packs/special.d.ts +44 -0
- package/dist/sheet/packs/special.js +187 -0
- package/dist/sheet/packs/stats-dist.d.ts +2 -0
- package/dist/sheet/packs/stats-dist.js +785 -0
- package/dist/sheet/packs/text-date.d.ts +2 -0
- package/dist/sheet/packs/text-date.js +332 -0
- package/dist/sheet/packs/trig.d.ts +2 -0
- package/dist/sheet/packs/trig.js +73 -0
- package/dist/sheet/page-setup.d.ts +73 -0
- package/dist/sheet/page-setup.js +73 -0
- package/dist/sheet/palette.d.ts +19 -0
- package/dist/sheet/palette.js +84 -0
- package/dist/sheet/parse.d.ts +13 -0
- package/dist/sheet/parse.js +140 -0
- package/dist/sheet/paste-special.d.ts +186 -0
- package/dist/sheet/paste-special.js +601 -0
- package/dist/sheet/pivot-range.d.ts +160 -0
- package/dist/sheet/pivot-range.js +333 -0
- package/dist/sheet/presence.d.ts +73 -0
- package/dist/sheet/presence.js +79 -0
- package/dist/sheet/print.d.ts +104 -0
- package/dist/sheet/print.js +169 -0
- package/dist/sheet/protection.d.ts +75 -0
- package/dist/sheet/protection.js +101 -0
- package/dist/sheet/rects.d.ts +45 -0
- package/dist/sheet/rects.js +112 -0
- package/dist/sheet/refs.d.ts +130 -0
- package/dist/sheet/refs.js +413 -0
- package/dist/sheet/ribbon-icons.d.ts +31 -0
- package/dist/sheet/ribbon-icons.js +536 -0
- package/dist/sheet/ribbon.d.ts +173 -0
- package/dist/sheet/ribbon.js +1054 -0
- package/dist/sheet/sheet-kinds.d.ts +74 -0
- package/dist/sheet/sheet-kinds.js +91 -0
- package/dist/sheet/shortcuts.d.ts +174 -0
- package/dist/sheet/shortcuts.js +674 -0
- package/dist/sheet/sort.d.ts +51 -0
- package/dist/sheet/sort.js +107 -0
- package/dist/sheet/sparklines.d.ts +111 -0
- package/dist/sheet/sparklines.js +204 -0
- package/dist/sheet/structure.d.ts +87 -0
- package/dist/sheet/structure.js +166 -0
- package/dist/sheet/table-styles.d.ts +74 -0
- package/dist/sheet/table-styles.js +152 -0
- package/dist/sheet/tables.d.ts +89 -0
- package/dist/sheet/tables.js +178 -0
- package/dist/sheet/tokenize.d.ts +71 -0
- package/dist/sheet/tokenize.js +355 -0
- package/dist/sheet/transforms.d.ts +76 -0
- package/dist/sheet/transforms.js +154 -0
- package/dist/sheet/validation.d.ts +108 -0
- package/dist/sheet/validation.js +278 -0
- package/dist/sheet/workbook.d.ts +217 -0
- package/dist/sheet/workbook.js +1120 -0
- package/dist/sheet/xls-cfb.d.ts +32 -0
- package/dist/sheet/xls-cfb.js +290 -0
- package/dist/sheet/xls-document.d.ts +10 -0
- package/dist/sheet/xls-document.js +1243 -0
- package/dist/sheet/xls-formula.d.ts +40 -0
- package/dist/sheet/xls-formula.js +569 -0
- package/dist/sheet/xlsx-document.d.ts +108 -0
- package/dist/sheet/xlsx-document.js +1849 -0
- package/dist/sheet/xlsx-drawing.d.ts +99 -0
- package/dist/sheet/xlsx-drawing.js +420 -0
- package/dist/sheet-enable.d.ts +6 -0
- package/dist/sheet-enable.js +45 -0
- package/dist/sheet-text.d.ts +7 -0
- package/dist/sheet-text.js +29 -0
- package/dist/sources/auth-supabase.js +2 -2
- package/dist/sources/realtime-supabase.js +2 -2
- package/dist/sources/rest.d.ts +6 -2
- package/dist/sources/rest.js +42 -7
- package/dist/sources/supabase.d.ts +10 -1
- package/dist/sources/supabase.js +73 -40
- package/dist/studio/emit-project.js +14 -1
- package/dist/studio/index.js +1 -1
- package/dist/studio/project.d.ts +11 -2
- package/dist/studio/project.js +5 -2
- package/dist/studio/ui-components.generated.js +170 -3
- package/dist/sveltekit/in-memory.d.ts +2 -2
- package/dist/sveltekit/in-memory.js +125 -4
- package/dist/sveltekit/index.d.ts +1 -1
- package/dist/sveltekit/index.js +1 -1
- package/dist/sveltekit/query-plan.d.ts +50 -4
- package/dist/sveltekit/query-plan.js +25 -3
- package/dist/sveltekit/sql-source.d.ts +6 -0
- package/dist/sveltekit/sql-source.js +34 -6
- package/dist/sveltekit/sql.d.ts +31 -0
- package/dist/sveltekit/sql.js +135 -25
- package/dist/sveltekit/transport.d.ts +10 -2
- package/dist/sveltekit/transport.js +30 -6
- package/dist/upgrade-prompt.d.ts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/watermark.js +35 -2
- package/dist/wc/GridMenus-By9vPuq0.js +1088 -0
- package/dist/wc/SvChartMenu-CQNrQGT2.js +308 -0
- package/dist/wc/SvDateRangeInput-DR6m7bSM.js +199 -0
- package/dist/wc/SvDateTimePicker-D-vRnaMo.js +771 -0
- package/dist/wc/SvField-B_kurx_P.js +149 -0
- package/dist/wc/SvGrid.helpers-BdVDtjUm.js +135 -0
- package/dist/wc/SvGridCellEditor-Bnf1Kr5C.js +560 -0
- package/dist/wc/SvGridChart-BqUJh2pG.js +3572 -0
- package/dist/wc/SvGridChartBuilder-CGycC5cn.js +988 -0
- package/dist/wc/SvGridChartPanel-CRnizsHD.js +1746 -0
- package/dist/wc/SvGridChartView-D1pa_xMy.js +47 -0
- package/dist/wc/SvGridDropdown-45WsObLL.js +259 -0
- package/dist/wc/SvModal-DrfOYYyX.js +189 -0
- package/dist/wc/cell-formatting-CBfgahv1.js +86 -0
- package/dist/wc/chart-6OXlybVT.js +4341 -0
- package/dist/wc/chart-export-CeSADGfi.js +135 -0
- package/dist/wc/chart-export-pdf-BGko7MER.js +104 -0
- package/dist/wc/chart-summary-2m3ia1-n.js +137 -0
- package/dist/wc/chart-trend-CQOQtTMl.js +50 -0
- package/dist/wc/chart-validate-CD6ptiwg.js +180 -0
- package/dist/wc/client-DQIzjDBG.js +3064 -0
- package/dist/wc/column-resize-DUPgynvc.js +101 -0
- package/dist/wc/date-format-DS-z_h9v.js +1130 -0
- package/dist/wc/dismissable-CQ6XFXsk.js +45 -0
- package/dist/wc/editor-contract-peBDxir_.js +22 -0
- package/dist/wc/editor-registry-DxGKqcvx.js +24 -0
- package/dist/wc/focus-trap-Dbb2tJxb.js +65 -0
- package/dist/wc/list-option-DrRyivWp.js +82 -0
- package/dist/wc/popover-WsGlvtQv.js +69 -0
- package/dist/wc/positioning-BiKLfu1E.js +112 -0
- package/dist/wc/react.d.ts +41 -0
- package/dist/wc/react.js +90 -0
- package/dist/wc/rolldown-runtime-Dy4uBu1J.js +11 -0
- package/dist/wc/row-drag-touch-CycRR65n.js +93 -0
- package/dist/wc/row-resize-limG_N1z.js +111 -0
- package/dist/wc/sv-sheet-element.d.ts +97 -0
- package/dist/wc/sv-sheet-element.js +44213 -0
- package/dist/wc/svelte-virtualizer.svelte-CXtQy2TQ.js +530 -0
- package/dist/wc/validate-BqDthkNr.js +88 -0
- package/dist/wc/vue.d.ts +31 -0
- package/dist/wc/vue.js +75 -0
- package/package.json +36 -6
- package/dist/designer/assets/GridMenus-B1JtIN21.js +0 -8
- package/dist/designer/assets/SvDateRangeInput-CjO7nn_x.js +0 -1
- package/dist/designer/assets/SvDateTimePicker-ByBD_ov6.js +0 -1
- package/dist/designer/assets/SvField-YDLipR6O.css +0 -1
- package/dist/designer/assets/SvField-cj1PFNgZ.js +0 -1
- package/dist/designer/assets/SvGridCellEditor-0W1L2hJ1.js +0 -2
- package/dist/designer/assets/SvGridChart-DBOR4xcz.js +0 -2
- package/dist/designer/assets/SvGridChart-fkMWeh1J.css +0 -1
- package/dist/designer/assets/SvGridChartPanel-symrhNnR.js +0 -11
- package/dist/designer/assets/SvGridChartView-BmRxq6mU.js +0 -1
- package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
- package/dist/designer/assets/SvListBox-1oUF6Iav.js +0 -110
- package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
- package/dist/designer/assets/chart-DXFganU8.js +0 -1
- package/dist/designer/assets/column-resize-C_inr5zT.js +0 -1
- package/dist/designer/assets/date-format-DGagAqRc.css +0 -1
- package/dist/designer/assets/date-format-onlYDsrY.js +0 -1
- package/dist/designer/assets/easing-zaypKrr0.js +0 -3
- package/dist/designer/assets/index-k2stW6L8.css +0 -1
- package/dist/designer/assets/row-resize-B0FWHcNr.js +0 -1
- package/dist/designer/assets/src-D9p27OGC.js +0 -58
- package/dist/designer/assets/validate-h-aslRV9.js +0 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference rewriting. The one module allowed to move a reference.
|
|
3
|
+
*
|
|
4
|
+
* Two jobs, both of which the demo engines could not do because they discarded
|
|
5
|
+
* `$` at parse time:
|
|
6
|
+
*
|
|
7
|
+
* - `translateFormula` shifts RELATIVE parts by a delta and leaves pinned
|
|
8
|
+
* parts alone. This is what makes fill-down, copy/paste and drag-fill
|
|
9
|
+
* correct: `=$A$1*B2` filled one row down becomes `=$A$1*B3`.
|
|
10
|
+
* - `fixupReferences` rewrites every formula in a sheet after rows or columns
|
|
11
|
+
* are inserted or removed. A reference to a deleted cell becomes `#REF!`;
|
|
12
|
+
* everything past the edit shifts; a range straddling an insertion grows.
|
|
13
|
+
*
|
|
14
|
+
* Both re-serialise from the AST rather than editing text, so `SUM( A1 : B2 )`
|
|
15
|
+
* comes back normalised instead of half-rewritten.
|
|
16
|
+
*/
|
|
17
|
+
import { type Node } from './ast.js';
|
|
18
|
+
/** Serialise an AST back to formula text, with the leading `=`. */
|
|
19
|
+
export declare function formatFormula(node: Node): string;
|
|
20
|
+
/**
|
|
21
|
+
* Shift every relative reference in a formula by (dRow, dCol).
|
|
22
|
+
*
|
|
23
|
+
* Anything that is not a formula comes back untouched, so callers can pass a
|
|
24
|
+
* whole column of mixed literals and formulas through it.
|
|
25
|
+
*/
|
|
26
|
+
export declare function translateFormula(text: unknown, dRow: number, dCol: number): unknown;
|
|
27
|
+
/**
|
|
28
|
+
* A formula for a cell that a transposed paste moves from `source` to
|
|
29
|
+
* `dest`, its relative references turned with it.
|
|
30
|
+
*
|
|
31
|
+
* Excel rotates a relative offset on a transpose: a reference `dr` rows
|
|
32
|
+
* and `dc` columns away becomes `dc` rows and `dr` columns away. A cell
|
|
33
|
+
* inside the block moved the same way, so a formula that read the price
|
|
34
|
+
* beside it still reads that price, now above it, which is what makes a
|
|
35
|
+
* transposed totals column still total. A reference outside the block is
|
|
36
|
+
* turned too, as Excel turns it. Absolute parts stay where they point.
|
|
37
|
+
* A column-only reference has no row to turn and is left as it is.
|
|
38
|
+
*/
|
|
39
|
+
export declare function transposeFormula(text: unknown, source: {
|
|
40
|
+
row: number;
|
|
41
|
+
col: number;
|
|
42
|
+
}, dest: {
|
|
43
|
+
row: number;
|
|
44
|
+
col: number;
|
|
45
|
+
}): unknown;
|
|
46
|
+
/**
|
|
47
|
+
* Point every reference that names sheet `from` at `to` instead: what a
|
|
48
|
+
* sheet rename owes the formulas on the other sheets and the defined
|
|
49
|
+
* names, and what Excel does on one. Parsed and re-rendered rather than
|
|
50
|
+
* substituted as text, so a string literal that happens to contain the old
|
|
51
|
+
* name is left alone and a new name with a space comes out quoted. A
|
|
52
|
+
* formula that names no such sheet is returned as it was, untouched.
|
|
53
|
+
*/
|
|
54
|
+
/**
|
|
55
|
+
* A block of cells that has MOVED: cut and pasted somewhere else, or dragged
|
|
56
|
+
* there. `sheet` is where it was, `toSheet` where it landed, and the rect is
|
|
57
|
+
* the block's old position, zero-based and inclusive.
|
|
58
|
+
*/
|
|
59
|
+
export type CellMove = {
|
|
60
|
+
sheet: string;
|
|
61
|
+
toSheet: string;
|
|
62
|
+
top: number;
|
|
63
|
+
left: number;
|
|
64
|
+
bottom: number;
|
|
65
|
+
right: number;
|
|
66
|
+
dRow: number;
|
|
67
|
+
dCol: number;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Point every reference to a moved cell at where the cell now is.
|
|
71
|
+
*
|
|
72
|
+
* This is what a cut and paste owes the rest of the workbook, and Excel does
|
|
73
|
+
* it: moving A1 to D1 rewrites `=A1*2` as `=D1*2` rather than leaving it
|
|
74
|
+
* reading an emptied cell. A `$` makes no difference - the cell moved, so
|
|
75
|
+
* every way of naming it moves - and a RANGE only follows when the whole of
|
|
76
|
+
* it moved, which is why `=SUM(A1:A2)` stays as it is when only A1 goes.
|
|
77
|
+
*
|
|
78
|
+
* `self` is the sheet the formula lives on, so an unqualified reference is
|
|
79
|
+
* read against the right geometry; a reference that lands on another sheet
|
|
80
|
+
* takes that sheet's name, as Excel writes it.
|
|
81
|
+
*/
|
|
82
|
+
export declare function repointReferences(text: unknown, move: CellMove, self: string | null): unknown;
|
|
83
|
+
/**
|
|
84
|
+
* Excel's reference colours: the A1 references in a formula being typed,
|
|
85
|
+
* each occurrence with the colour of its range, so the cells a formula
|
|
86
|
+
* names and the text that names them can be painted alike. Colours go by
|
|
87
|
+
* distinct range in order of first appearance, so `B5` twice is one
|
|
88
|
+
* colour; `$` anchors and case do not tell ranges apart; a reference into
|
|
89
|
+
* another sheet and anything inside a string are skipped. `rect` is
|
|
90
|
+
* [row1, col1, row2, col2], zero-based and normalised.
|
|
91
|
+
*/
|
|
92
|
+
export type ReferenceSpan = {
|
|
93
|
+
start: number;
|
|
94
|
+
end: number;
|
|
95
|
+
key: string;
|
|
96
|
+
colour: string;
|
|
97
|
+
rect: readonly [number, number, number, number];
|
|
98
|
+
};
|
|
99
|
+
export declare const REFERENCE_COLOURS: ReadonlyArray<string>;
|
|
100
|
+
export declare function referenceSpans(text: string, colours?: ReadonlyArray<string>): ReferenceSpan[];
|
|
101
|
+
export declare function renameSheetReferences(text: unknown, from: string, to: string): unknown;
|
|
102
|
+
export type StructuralEdit = {
|
|
103
|
+
kind: 'insertRows' | 'deleteRows' | 'insertCols' | 'deleteCols';
|
|
104
|
+
/** 0-based index the edit happens at. */
|
|
105
|
+
at: number;
|
|
106
|
+
count: number;
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Rewrite a formula's references after rows or columns are inserted or
|
|
110
|
+
* removed. A reference into the deleted span becomes `#REF!`.
|
|
111
|
+
*
|
|
112
|
+
* A RANGE only breaks when the edit removes all of it. Deleting rows inside a
|
|
113
|
+
* range shrinks it, which is what Excel does and what keeps `=SUM(A1:A10)`
|
|
114
|
+
* meaningful after you delete row 5.
|
|
115
|
+
*/
|
|
116
|
+
/**
|
|
117
|
+
* Which sheet an edit happened on, and which sheet the formula being
|
|
118
|
+
* rewritten lives on. With a scope, only references INTO the edited sheet
|
|
119
|
+
* move: an unqualified reference belongs to `self`, a qualified one to the
|
|
120
|
+
* sheet it names. Without one every reference moves, which is right for a
|
|
121
|
+
* single grid that has no sheets to tell apart.
|
|
122
|
+
*/
|
|
123
|
+
export type EditScope = {
|
|
124
|
+
/** The sheet the rows or columns were inserted in or deleted from. */
|
|
125
|
+
sheet: string;
|
|
126
|
+
/** The sheet the formula lives on; null for a defined name, which has no
|
|
127
|
+
* home sheet, so only its qualified references can match. */
|
|
128
|
+
self: string | null;
|
|
129
|
+
};
|
|
130
|
+
export declare function fixupReferences(text: unknown, edit: StructuralEdit, scope?: EditScope): unknown;
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference rewriting. The one module allowed to move a reference.
|
|
3
|
+
*
|
|
4
|
+
* Two jobs, both of which the demo engines could not do because they discarded
|
|
5
|
+
* `$` at parse time:
|
|
6
|
+
*
|
|
7
|
+
* - `translateFormula` shifts RELATIVE parts by a delta and leaves pinned
|
|
8
|
+
* parts alone. This is what makes fill-down, copy/paste and drag-fill
|
|
9
|
+
* correct: `=$A$1*B2` filled one row down becomes `=$A$1*B3`.
|
|
10
|
+
* - `fixupReferences` rewrites every formula in a sheet after rows or columns
|
|
11
|
+
* are inserted or removed. A reference to a deleted cell becomes `#REF!`;
|
|
12
|
+
* everything past the edit shifts; a range straddling an insertion grows.
|
|
13
|
+
*
|
|
14
|
+
* Both re-serialise from the AST rather than editing text, so `SUM( A1 : B2 )`
|
|
15
|
+
* comes back normalised instead of half-rewritten.
|
|
16
|
+
*/
|
|
17
|
+
import { mapNode, PRECEDENCE } from './ast.js';
|
|
18
|
+
import { formatA1, colToLetters, lettersToCol } from './address.js';
|
|
19
|
+
import { parseFormula } from './parse.js';
|
|
20
|
+
/** Shift a single reference's relative parts. */
|
|
21
|
+
function translateRef(ref, dRow, dCol) {
|
|
22
|
+
return {
|
|
23
|
+
...ref,
|
|
24
|
+
col: ref.colAbs ? ref.col : ref.col + dCol,
|
|
25
|
+
row: ref.row === null || ref.rowAbs ? ref.row : ref.row + dRow,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** True once a reference has been shifted off the sheet. */
|
|
29
|
+
function isBroken(ref) {
|
|
30
|
+
return ref.col < 0 || (ref.row !== null && ref.row < 0);
|
|
31
|
+
}
|
|
32
|
+
/** Serialise an AST back to formula text, with the leading `=`. */
|
|
33
|
+
export function formatFormula(node) {
|
|
34
|
+
return `=${render(node)}`;
|
|
35
|
+
}
|
|
36
|
+
/** Render `node` as an operand of something binding at `minPrec`, adding
|
|
37
|
+
* parentheses when it would otherwise re-associate. */
|
|
38
|
+
function wrap(node, minPrec) {
|
|
39
|
+
const text = render(node);
|
|
40
|
+
if (node.k === 'binary' && PRECEDENCE[node.op] < minPrec)
|
|
41
|
+
return `(${text})`;
|
|
42
|
+
// A unary minus has to be parenthesised inside anything tighter than it,
|
|
43
|
+
// so -(A1+B1) and 2^-A1 both survive.
|
|
44
|
+
if (node.k === 'unary' && node.op !== '%' && minPrec > 5)
|
|
45
|
+
return `(${text})`;
|
|
46
|
+
return text;
|
|
47
|
+
}
|
|
48
|
+
function render(node) {
|
|
49
|
+
switch (node.k) {
|
|
50
|
+
case 'num': return String(node.v);
|
|
51
|
+
case 'str': return `"${node.v.replace(/"/g, '""')}"`;
|
|
52
|
+
case 'bool': return node.v ? 'TRUE' : 'FALSE';
|
|
53
|
+
case 'err': return node.v;
|
|
54
|
+
case 'ref': return node.ref.col < 0 || (node.ref.row ?? 0) < 0 ? '#REF!' : formatA1(node.ref);
|
|
55
|
+
case 'spill': return node.ref.col < 0 || (node.ref.row ?? 0) < 0 ? '#REF!' : `${formatA1(node.ref)}#`;
|
|
56
|
+
case 'range': {
|
|
57
|
+
if (isBroken(node.from) || isBroken(node.to))
|
|
58
|
+
return '#REF!';
|
|
59
|
+
// A whole-column range prints as A:C, not A1:C.
|
|
60
|
+
if (node.from.row === null || node.to.row === null) {
|
|
61
|
+
const left = `${node.from.colAbs ? '$' : ''}${colToLetters(node.from.col)}`;
|
|
62
|
+
const right = `${node.to.colAbs ? '$' : ''}${colToLetters(node.to.col)}`;
|
|
63
|
+
const prefix = node.from.sheet ? `${formatA1({ ...node.from, row: null }).split('!')[0]}!` : '';
|
|
64
|
+
return `${prefix}${left}:${right}`;
|
|
65
|
+
}
|
|
66
|
+
const from = formatA1(node.from);
|
|
67
|
+
// The right-hand side drops a repeated sheet prefix: Sheet1!A1:B2.
|
|
68
|
+
const to = formatA1({ ...node.to, sheet: null });
|
|
69
|
+
return `${from}:${to}`;
|
|
70
|
+
}
|
|
71
|
+
case 'ref3d': {
|
|
72
|
+
if (isBroken(node.from) || isBroken(node.to))
|
|
73
|
+
return '#REF!';
|
|
74
|
+
const q = (s) => (/^[A-Za-z_][A-Za-z0-9_.]*$/.test(s) ? s : `'${s.replace(/'/g, "''")}'`);
|
|
75
|
+
const cell = formatA1({ ...node.from, sheet: null });
|
|
76
|
+
const to = node.from.row === node.to.row && node.from.col === node.to.col
|
|
77
|
+
? ''
|
|
78
|
+
: `:${formatA1({ ...node.to, sheet: null })}`;
|
|
79
|
+
return `${q(node.sheetFrom)}:${q(node.sheetTo)}!${cell}${to}`;
|
|
80
|
+
}
|
|
81
|
+
case 'name': return node.name;
|
|
82
|
+
case 'table': {
|
|
83
|
+
// Re-serialised, never translated: the whole point of a structured
|
|
84
|
+
// reference is that it does not move when the formula does.
|
|
85
|
+
const parts = [];
|
|
86
|
+
if (node.specifier === '#ThisRow')
|
|
87
|
+
parts.push(node.column ? `@${node.column}` : '@');
|
|
88
|
+
else if (node.specifier !== '#Data')
|
|
89
|
+
parts.push(node.specifier);
|
|
90
|
+
if (node.specifier !== '#ThisRow' && node.column) {
|
|
91
|
+
parts.push(node.columnTo ? `[${node.column}]:[${node.columnTo}]` : node.column);
|
|
92
|
+
}
|
|
93
|
+
return `${node.table ?? ''}[${parts.join(',')}]`;
|
|
94
|
+
}
|
|
95
|
+
case 'unary':
|
|
96
|
+
return node.op === '%'
|
|
97
|
+
? `${wrap(node.arg, 6)}%`
|
|
98
|
+
: `${node.op}${wrap(node.arg, 5)}`;
|
|
99
|
+
case 'binary': {
|
|
100
|
+
const prec = PRECEDENCE[node.op];
|
|
101
|
+
// The AST does not record parentheses, so they have to be reconstructed
|
|
102
|
+
// from precedence. Emitting the operands bare turns =(A1+B1)*2 into
|
|
103
|
+
// =A2+B2*2, which is a silent wrong answer on every fill and paste.
|
|
104
|
+
//
|
|
105
|
+
// Which SIDE needs one at equal precedence depends on associativity,
|
|
106
|
+
// and every operator here binds left, `^` included: the RIGHT operand
|
|
107
|
+
// is the one that needs the bracket, because a-(b-c) is not a-b-c and
|
|
108
|
+
// a^(b^c) is not a^b^c.
|
|
109
|
+
const leftMin = prec;
|
|
110
|
+
const rightMin = prec + 1;
|
|
111
|
+
return `${wrap(node.left, leftMin)}${node.op}${wrap(node.right, rightMin)}`;
|
|
112
|
+
}
|
|
113
|
+
// `(` is the call node an immediate or curried lambda builds:
|
|
114
|
+
// LAMBDA(x, x*2)(21) is the callee, then its arguments.
|
|
115
|
+
case 'fn': return node.name === '('
|
|
116
|
+
? `${render(node.args[0])}(${node.args.slice(1).map(render).join(',')})`
|
|
117
|
+
: `${node.name}(${node.args.map(render).join(',')})`;
|
|
118
|
+
case 'empty': return '';
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Shift every relative reference in a formula by (dRow, dCol).
|
|
123
|
+
*
|
|
124
|
+
* Anything that is not a formula comes back untouched, so callers can pass a
|
|
125
|
+
* whole column of mixed literals and formulas through it.
|
|
126
|
+
*/
|
|
127
|
+
export function translateFormula(text, dRow, dCol) {
|
|
128
|
+
if (typeof text !== 'string' || !text.startsWith('='))
|
|
129
|
+
return text;
|
|
130
|
+
if (dRow === 0 && dCol === 0)
|
|
131
|
+
return text;
|
|
132
|
+
let ast;
|
|
133
|
+
try {
|
|
134
|
+
ast = parseFormula(text);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Not parseable: leave it exactly as the user typed it. Rewriting a
|
|
138
|
+
// half-understood formula is worse than leaving it alone.
|
|
139
|
+
return text;
|
|
140
|
+
}
|
|
141
|
+
const moved = mapNode(ast, (n) => {
|
|
142
|
+
if (n.k === 'ref')
|
|
143
|
+
return { ...n, ref: translateRef(n.ref, dRow, dCol) };
|
|
144
|
+
if (n.k === 'spill')
|
|
145
|
+
return { ...n, ref: translateRef(n.ref, dRow, dCol) };
|
|
146
|
+
if (n.k === 'range') {
|
|
147
|
+
return { ...n, from: translateRef(n.from, dRow, dCol), to: translateRef(n.to, dRow, dCol) };
|
|
148
|
+
}
|
|
149
|
+
if (n.k === 'ref3d') {
|
|
150
|
+
return { ...n, from: translateRef(n.from, dRow, dCol), to: translateRef(n.to, dRow, dCol) };
|
|
151
|
+
}
|
|
152
|
+
return n;
|
|
153
|
+
});
|
|
154
|
+
return formatFormula(moved);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* A formula for a cell that a transposed paste moves from `source` to
|
|
158
|
+
* `dest`, its relative references turned with it.
|
|
159
|
+
*
|
|
160
|
+
* Excel rotates a relative offset on a transpose: a reference `dr` rows
|
|
161
|
+
* and `dc` columns away becomes `dc` rows and `dr` columns away. A cell
|
|
162
|
+
* inside the block moved the same way, so a formula that read the price
|
|
163
|
+
* beside it still reads that price, now above it, which is what makes a
|
|
164
|
+
* transposed totals column still total. A reference outside the block is
|
|
165
|
+
* turned too, as Excel turns it. Absolute parts stay where they point.
|
|
166
|
+
* A column-only reference has no row to turn and is left as it is.
|
|
167
|
+
*/
|
|
168
|
+
export function transposeFormula(text, source, dest) {
|
|
169
|
+
if (typeof text !== 'string' || !text.startsWith('='))
|
|
170
|
+
return text;
|
|
171
|
+
let ast;
|
|
172
|
+
try {
|
|
173
|
+
ast = parseFormula(text);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return text;
|
|
177
|
+
}
|
|
178
|
+
const turn = (ref) => {
|
|
179
|
+
if (ref.row === null)
|
|
180
|
+
return ref;
|
|
181
|
+
return {
|
|
182
|
+
...ref,
|
|
183
|
+
row: ref.rowAbs ? ref.row : dest.row + (ref.col - source.col),
|
|
184
|
+
col: ref.colAbs ? ref.col : dest.col + (ref.row - source.row),
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
const moved = mapNode(ast, (n) => {
|
|
188
|
+
if (n.k === 'ref')
|
|
189
|
+
return { ...n, ref: turn(n.ref) };
|
|
190
|
+
if (n.k === 'spill')
|
|
191
|
+
return { ...n, ref: turn(n.ref) };
|
|
192
|
+
if (n.k === 'range') {
|
|
193
|
+
// A turned range may come out with its corners swapped; a range is
|
|
194
|
+
// spelled top-left to bottom-right, so put them back in order.
|
|
195
|
+
const a = turn(n.from);
|
|
196
|
+
const b = turn(n.to);
|
|
197
|
+
const from = { ...a, row: a.row === null || b.row === null ? a.row : Math.min(a.row, b.row), col: Math.min(a.col, b.col), rowAbs: a.rowAbs, colAbs: a.colAbs };
|
|
198
|
+
const to = { ...b, row: a.row === null || b.row === null ? b.row : Math.max(a.row, b.row), col: Math.max(a.col, b.col), rowAbs: b.rowAbs, colAbs: b.colAbs };
|
|
199
|
+
return { ...n, from, to };
|
|
200
|
+
}
|
|
201
|
+
return n;
|
|
202
|
+
});
|
|
203
|
+
return formatFormula(moved);
|
|
204
|
+
}
|
|
205
|
+
const inside = (move, row, col) => row !== null && row >= move.top && row <= move.bottom && col >= move.left && col <= move.right;
|
|
206
|
+
/**
|
|
207
|
+
* Point every reference to a moved cell at where the cell now is.
|
|
208
|
+
*
|
|
209
|
+
* This is what a cut and paste owes the rest of the workbook, and Excel does
|
|
210
|
+
* it: moving A1 to D1 rewrites `=A1*2` as `=D1*2` rather than leaving it
|
|
211
|
+
* reading an emptied cell. A `$` makes no difference - the cell moved, so
|
|
212
|
+
* every way of naming it moves - and a RANGE only follows when the whole of
|
|
213
|
+
* it moved, which is why `=SUM(A1:A2)` stays as it is when only A1 goes.
|
|
214
|
+
*
|
|
215
|
+
* `self` is the sheet the formula lives on, so an unqualified reference is
|
|
216
|
+
* read against the right geometry; a reference that lands on another sheet
|
|
217
|
+
* takes that sheet's name, as Excel writes it.
|
|
218
|
+
*/
|
|
219
|
+
export function repointReferences(text, move, self) {
|
|
220
|
+
if (typeof text !== 'string' || !text.startsWith('='))
|
|
221
|
+
return text;
|
|
222
|
+
if (move.dRow === 0 && move.dCol === 0 && move.sheet === move.toSheet)
|
|
223
|
+
return text;
|
|
224
|
+
let ast;
|
|
225
|
+
try {
|
|
226
|
+
ast = parseFormula(text);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return text;
|
|
230
|
+
}
|
|
231
|
+
const names = (sheet) => (sheet ?? self ?? '').toLowerCase() === move.sheet.toLowerCase();
|
|
232
|
+
const landed = (ref) => ({
|
|
233
|
+
...ref,
|
|
234
|
+
row: ref.row === null ? null : ref.row + move.dRow,
|
|
235
|
+
col: ref.col + move.dCol,
|
|
236
|
+
// Unqualified only when the formula already lives on the sheet it landed on.
|
|
237
|
+
sheet: move.toSheet.toLowerCase() === (self ?? '').toLowerCase() ? null : move.toSheet,
|
|
238
|
+
});
|
|
239
|
+
const moved = mapNode(ast, (n) => {
|
|
240
|
+
if (n.k === 'ref') {
|
|
241
|
+
if (!names(n.ref.sheet) || !inside(move, n.ref.row, n.ref.col))
|
|
242
|
+
return n;
|
|
243
|
+
return { ...n, ref: landed(n.ref) };
|
|
244
|
+
}
|
|
245
|
+
if (n.k === 'spill') {
|
|
246
|
+
if (!names(n.ref.sheet) || !inside(move, n.ref.row, n.ref.col))
|
|
247
|
+
return n;
|
|
248
|
+
return { ...n, ref: landed(n.ref) };
|
|
249
|
+
}
|
|
250
|
+
if (n.k === 'range') {
|
|
251
|
+
const sheet = n.from.sheet ?? n.to.sheet;
|
|
252
|
+
if (!names(sheet))
|
|
253
|
+
return n;
|
|
254
|
+
if (!inside(move, n.from.row, n.from.col) || !inside(move, n.to.row, n.to.col))
|
|
255
|
+
return n;
|
|
256
|
+
return { ...n, from: landed(n.from), to: landed(n.to) };
|
|
257
|
+
}
|
|
258
|
+
return n;
|
|
259
|
+
});
|
|
260
|
+
const next = formatFormula(moved);
|
|
261
|
+
return next === text ? text : next;
|
|
262
|
+
}
|
|
263
|
+
export const REFERENCE_COLOURS = ['#1e6fd9', '#d62828', '#8e44ad', '#0f9d58', '#e67e22', '#0097a7'];
|
|
264
|
+
export function referenceSpans(text, colours = REFERENCE_COLOURS) {
|
|
265
|
+
const out = [];
|
|
266
|
+
if (!text.startsWith('='))
|
|
267
|
+
return out;
|
|
268
|
+
const blanked = text
|
|
269
|
+
.replace(/"[^"]*"/g, (m) => ' '.repeat(m.length))
|
|
270
|
+
// A sheet-qualified reference belongs to another sheet.
|
|
271
|
+
.replace(/(?:'[^']*'|[A-Za-z_][\w.]*)!\$?[A-Z]{1,3}\$?\d+(?::\$?[A-Z]{1,3}\$?\d+)?/gi, (m) => ' '.repeat(m.length));
|
|
272
|
+
// Case-insensitive: a reference is typed as "b5" as often as "B5", and
|
|
273
|
+
// the engine reads both.
|
|
274
|
+
const re = /(?<![A-Za-z0-9_.!])\$?([A-Za-z]{1,3})\$?(\d{1,7})(?::\$?([A-Za-z]{1,3})\$?(\d{1,7}))?(?![A-Za-z0-9_(])/g;
|
|
275
|
+
const order = new Map();
|
|
276
|
+
for (const m of blanked.matchAll(re)) {
|
|
277
|
+
const key = m[0].replace(/\$/g, '').toUpperCase();
|
|
278
|
+
const c1 = lettersToCol(m[1].toUpperCase()), r1 = Number(m[2]) - 1;
|
|
279
|
+
const c2 = m[3] ? lettersToCol(m[3].toUpperCase()) : c1, r2 = m[4] ? Number(m[4]) - 1 : r1;
|
|
280
|
+
if (c1 < 0 || c2 < 0 || r1 < 0 || r2 < 0)
|
|
281
|
+
continue;
|
|
282
|
+
let index = order.get(key);
|
|
283
|
+
if (index === undefined) {
|
|
284
|
+
index = order.size;
|
|
285
|
+
order.set(key, index);
|
|
286
|
+
}
|
|
287
|
+
out.push({
|
|
288
|
+
start: m.index,
|
|
289
|
+
end: m.index + m[0].length,
|
|
290
|
+
key,
|
|
291
|
+
colour: colours[index % colours.length],
|
|
292
|
+
rect: [Math.min(r1, r2), Math.min(c1, c2), Math.max(r1, r2), Math.max(c1, c2)],
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
return out;
|
|
296
|
+
}
|
|
297
|
+
export function renameSheetReferences(text, from, to) {
|
|
298
|
+
if (typeof text !== 'string' || !text.startsWith('='))
|
|
299
|
+
return text;
|
|
300
|
+
const wanted = from.toLowerCase();
|
|
301
|
+
if (!text.toLowerCase().includes(wanted))
|
|
302
|
+
return text;
|
|
303
|
+
let ast;
|
|
304
|
+
try {
|
|
305
|
+
ast = parseFormula(text);
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
return text;
|
|
309
|
+
}
|
|
310
|
+
let changed = false;
|
|
311
|
+
const swap = (ref) => {
|
|
312
|
+
if (ref.sheet === null || ref.sheet.toLowerCase() !== wanted)
|
|
313
|
+
return ref;
|
|
314
|
+
changed = true;
|
|
315
|
+
return { ...ref, sheet: to };
|
|
316
|
+
};
|
|
317
|
+
const swapName = (name) => {
|
|
318
|
+
if (name.toLowerCase() !== wanted)
|
|
319
|
+
return name;
|
|
320
|
+
changed = true;
|
|
321
|
+
return to;
|
|
322
|
+
};
|
|
323
|
+
const moved = mapNode(ast, (n) => {
|
|
324
|
+
if (n.k === 'ref')
|
|
325
|
+
return { ...n, ref: swap(n.ref) };
|
|
326
|
+
if (n.k === 'spill')
|
|
327
|
+
return { ...n, ref: swap(n.ref) };
|
|
328
|
+
if (n.k === 'range')
|
|
329
|
+
return { ...n, from: swap(n.from), to: swap(n.to) };
|
|
330
|
+
// A 3D reference names its sheets by string, either end of the tab range.
|
|
331
|
+
if (n.k === 'ref3d')
|
|
332
|
+
return { ...n, sheetFrom: swapName(n.sheetFrom), sheetTo: swapName(n.sheetTo) };
|
|
333
|
+
return n;
|
|
334
|
+
});
|
|
335
|
+
return changed ? formatFormula(moved) : text;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Shift one coordinate through a structural edit. Returns null when the thing
|
|
339
|
+
* it pointed at was deleted, which becomes `#REF!`.
|
|
340
|
+
*/
|
|
341
|
+
function shiftCoord(value, edit, inserting) {
|
|
342
|
+
if (inserting) {
|
|
343
|
+
return value >= edit.at ? value + edit.count : value;
|
|
344
|
+
}
|
|
345
|
+
if (value < edit.at)
|
|
346
|
+
return value;
|
|
347
|
+
if (value < edit.at + edit.count)
|
|
348
|
+
return null;
|
|
349
|
+
return value - edit.count;
|
|
350
|
+
}
|
|
351
|
+
function fixRef(ref, edit) {
|
|
352
|
+
const rows = edit.kind === 'insertRows' || edit.kind === 'deleteRows';
|
|
353
|
+
const inserting = edit.kind === 'insertRows' || edit.kind === 'insertCols';
|
|
354
|
+
if (rows) {
|
|
355
|
+
if (ref.row === null)
|
|
356
|
+
return ref;
|
|
357
|
+
const next = shiftCoord(ref.row, edit, inserting);
|
|
358
|
+
return next === null ? null : { ...ref, row: next };
|
|
359
|
+
}
|
|
360
|
+
const next = shiftCoord(ref.col, edit, inserting);
|
|
361
|
+
return next === null ? null : { ...ref, col: next };
|
|
362
|
+
}
|
|
363
|
+
const sameSheet = (a, b) => a !== null && a.toLowerCase() === b.toLowerCase();
|
|
364
|
+
export function fixupReferences(text, edit, scope) {
|
|
365
|
+
if (typeof text !== 'string' || !text.startsWith('='))
|
|
366
|
+
return text;
|
|
367
|
+
if (edit.count <= 0)
|
|
368
|
+
return text;
|
|
369
|
+
let ast;
|
|
370
|
+
try {
|
|
371
|
+
ast = parseFormula(text);
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
return text;
|
|
375
|
+
}
|
|
376
|
+
const broken = { col: -1, colAbs: false, row: -1, rowAbs: false, sheet: null };
|
|
377
|
+
const touched = (sheet) => !scope || sameSheet(sheet ?? scope.self, scope.sheet);
|
|
378
|
+
const moved = mapNode(ast, (n) => {
|
|
379
|
+
if (n.k === 'ref') {
|
|
380
|
+
if (!touched(n.ref.sheet))
|
|
381
|
+
return n;
|
|
382
|
+
const next = fixRef(n.ref, edit);
|
|
383
|
+
return next === null ? { k: 'ref', ref: broken } : { ...n, ref: next };
|
|
384
|
+
}
|
|
385
|
+
if (n.k === 'spill') {
|
|
386
|
+
// The anchor moving carries the spill with it; the anchor being
|
|
387
|
+
// deleted takes the whole array reference to #REF!.
|
|
388
|
+
if (!touched(n.ref.sheet))
|
|
389
|
+
return n;
|
|
390
|
+
const next = fixRef(n.ref, edit);
|
|
391
|
+
return next === null ? { k: 'ref', ref: broken } : { ...n, ref: next };
|
|
392
|
+
}
|
|
393
|
+
if (n.k === 'range') {
|
|
394
|
+
if (!touched(n.from.sheet ?? n.to.sheet))
|
|
395
|
+
return n;
|
|
396
|
+
const from = fixRef(n.from, edit);
|
|
397
|
+
const to = fixRef(n.to, edit);
|
|
398
|
+
// Both ends gone means the whole range was deleted.
|
|
399
|
+
if (from === null && to === null)
|
|
400
|
+
return { k: 'ref', ref: broken };
|
|
401
|
+
// One end gone: clamp it to the edit point so the range shrinks.
|
|
402
|
+
const rows = edit.kind === 'deleteRows';
|
|
403
|
+
const clamp = (ref) => rows ? { ...ref, row: Math.max(edit.at - 1, 0) } : { ...ref, col: Math.max(edit.at - 1, 0) };
|
|
404
|
+
return {
|
|
405
|
+
...n,
|
|
406
|
+
from: from ?? clamp(n.from),
|
|
407
|
+
to: to ?? clamp(n.to),
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
return n;
|
|
411
|
+
});
|
|
412
|
+
return formatFormula(moved);
|
|
413
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ribbon's icons, as path data on a 16 x 16 grid.
|
|
3
|
+
*
|
|
4
|
+
* Drawn here rather than pulled from an icon font or a package: the ribbon
|
|
5
|
+
* is the one place in the library that needs a coordinated set of command
|
|
6
|
+
* glyphs (a clipboard, scissors, a paint bucket, a funnel), and an icon set
|
|
7
|
+
* that is part of the source can be read, tested and tuned like anything
|
|
8
|
+
* else. `SvRibbonIcon.svelte` renders one by name; a large button draws the
|
|
9
|
+
* same paths at twice the size, which is why they are vectors.
|
|
10
|
+
*
|
|
11
|
+
* One style, one colour. These are line icons - a 1.4px stroke with round
|
|
12
|
+
* caps and joins, the way Excel's own monochrome set is drawn - and every
|
|
13
|
+
* one of them is `currentColor`, so they are black on a light ribbon and
|
|
14
|
+
* white on a dark one and never carry a colour of their own. The only fills
|
|
15
|
+
* are the small solid parts Excel also fills: a dot, a corner, the head of
|
|
16
|
+
* an arrow. Colour belongs to the colour bar under Fill Colour and Font
|
|
17
|
+
* Colour, which shows the colour the face will apply, not to the glyph.
|
|
18
|
+
*/
|
|
19
|
+
export type IconPath = {
|
|
20
|
+
d: string;
|
|
21
|
+
/** Solid shape in the icon colour instead of a stroked outline. */
|
|
22
|
+
fill?: boolean;
|
|
23
|
+
/** Stroke width when not the default 1.4. */
|
|
24
|
+
width?: number;
|
|
25
|
+
/** Dashed stroke, for the "no border" sides. */
|
|
26
|
+
dash?: string;
|
|
27
|
+
};
|
|
28
|
+
export type RibbonIconName = 'undo' | 'redo' | 'paste' | 'cut' | 'copy' | 'paste-special' | 'font-grow' | 'font-shrink' | 'borders' | 'border-none' | 'border-bottom' | 'border-top' | 'border-left' | 'border-right' | 'border-all' | 'border-outside' | 'border-thick-bottom' | 'fill-colour' | 'font-colour' | 'align-left' | 'align-center' | 'align-right' | 'wrap' | 'valign-top' | 'valign-center' | 'valign-bottom' | 'dec-more' | 'dec-less' | 'insert-cells' | 'delete-cells' | 'freeze' | 'unfreeze' | 'autosum' | 'fill-down' | 'fill-right' | 'clear' | 'find' | 'filter' | 'sort-asc' | 'sort-desc' | 'sort' | 'chart' | 'table' | 'function' | 'new-sheet' | 'file-new' | 'file-open' | 'file-save' | 'file-csv' | 'cf-formula' | 'trace-precedents' | 'trace-dependents' | 'remove-arrows' | 'name-manager' | 'show-formulas' | 'calculate' | 'goal-seek' | 'evaluate-formula' | 'error-checking' | 'text-to-columns' | 'remove-duplicates' | 'chevron-down' | 'format-cells' | 'format-painter' | 'protect' | 'unprotect' | 'lock' | 'edit-ranges' | 'print' | 'page-setup' | 'margins' | 'orientation' | 'paper' | 'print-area' | 'print-titles' | 'picture' | 'chart-setup' | 'sparkline-line' | 'sparkline-column' | 'sparkline-winloss' | 'pivot' | 'link' | 'unlink' | 'comment' | 'comment-delete' | 'comment-prev' | 'comment-next' | 'comments-all' | 'validation' | 'cf' | 'cf-greater' | 'cf-less' | 'cf-between' | 'cf-equal' | 'cf-text' | 'cf-duplicates' | 'cf-top' | 'cf-bottom' | 'cf-above' | 'cf-below' | 'cf-bar' | 'cf-scale' | 'cf-icons' | 'merge' | 'unmerge' | 'gridlines' | 'formula-bar' | 'headings' | 'font' | 'number' | 'clear-formats' | 'column-width' | 'row-height' | 'hide' | 'unhide' | 'group-rows' | 'group-cols' | 'ungroup-rows' | 'ungroup-cols' | 'show-detail' | 'hide-detail' | 'checkbox' | 'cell-button';
|
|
29
|
+
export declare const RIBBON_ICONS: Record<RibbonIconName, ReadonlyArray<IconPath>>;
|
|
30
|
+
/** The names, for tests and for anyone building their own toolbar. */
|
|
31
|
+
export declare const RIBBON_ICON_NAMES: RibbonIconName[];
|