@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,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Goal Seek: find the input value that makes a formula cell hit a target.
|
|
3
|
+
*
|
|
4
|
+
* "What interest rate makes the monthly payment 1500?" You know the answer
|
|
5
|
+
* you want and one cell you are willing to change; the solver finds it.
|
|
6
|
+
*
|
|
7
|
+
* The method is secant with a bisection fallback, not Newton. Newton needs a
|
|
8
|
+
* derivative, and the function here is "recalculate a spreadsheet", which has
|
|
9
|
+
* no analytic one. Secant approximates the slope from two evaluations, which
|
|
10
|
+
* is the same information a numerical derivative would cost anyway.
|
|
11
|
+
*
|
|
12
|
+
* Bisection is the fallback because secant is fast but not safe: it can step
|
|
13
|
+
* to infinity on a flat stretch or oscillate on a kink. When a bracket is
|
|
14
|
+
* known - two inputs whose results straddle the target - bisection cannot
|
|
15
|
+
* fail, only be slow. Trying secant first and falling back keeps the common
|
|
16
|
+
* case quick and the awkward case terminating.
|
|
17
|
+
*/
|
|
18
|
+
export type GoalSeekOptions = {
|
|
19
|
+
/** Stop once the result is this close to the target. */
|
|
20
|
+
tolerance?: number;
|
|
21
|
+
/** Give up after this many recalculations. */
|
|
22
|
+
maxIterations?: number;
|
|
23
|
+
/** Where to start looking. Defaults to the input cell's current value. */
|
|
24
|
+
initialGuess?: number;
|
|
25
|
+
/** Keep the answer inside these bounds. A rate solver wants [0, 1]. */
|
|
26
|
+
min?: number;
|
|
27
|
+
max?: number;
|
|
28
|
+
};
|
|
29
|
+
export type GoalSeekResult = {
|
|
30
|
+
/** Whether the target was reached within tolerance. */
|
|
31
|
+
converged: boolean;
|
|
32
|
+
/** The input value found. Present even when it did not converge, so a
|
|
33
|
+
* caller can show the closest attempt rather than nothing. */
|
|
34
|
+
value: number;
|
|
35
|
+
/** What the formula produced at that input. */
|
|
36
|
+
result: number;
|
|
37
|
+
iterations: number;
|
|
38
|
+
/** Why it stopped, when it did not converge. */
|
|
39
|
+
reason?: 'maxIterations' | 'notNumeric' | 'flat' | 'outOfBounds';
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Solve `evaluate(input) = target` for `input`.
|
|
43
|
+
*
|
|
44
|
+
* `evaluate` sets the input cell, recalculates, and returns the formula
|
|
45
|
+
* cell's value. It is called many times, so it should be the workbook's own
|
|
46
|
+
* recalculation rather than anything that touches the DOM.
|
|
47
|
+
*
|
|
48
|
+
* The caller owns the input cell: this never writes. It reports the value it
|
|
49
|
+
* found and lets the caller decide whether to keep it, which is what makes
|
|
50
|
+
* Excel's "Goal Seek found a solution / OK or Cancel" dialog possible.
|
|
51
|
+
*/
|
|
52
|
+
export declare function goalSeek(evaluate: (input: number) => unknown, target: number, start: number, options?: GoalSeekOptions): GoalSeekResult;
|
|
53
|
+
/** What `goalSeekCell` needs of a workbook. */
|
|
54
|
+
export type GoalSeekSheet = {
|
|
55
|
+
getRaw(sheet: string, row: number, col: number): string;
|
|
56
|
+
setRaw(sheet: string, row: number, col: number, text: string): void;
|
|
57
|
+
getValue(sheet: string, row: number, col: number): unknown;
|
|
58
|
+
};
|
|
59
|
+
export type CellAddress = {
|
|
60
|
+
sheet: string;
|
|
61
|
+
row: number;
|
|
62
|
+
col: number;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Goal Seek over a workbook: change `input` until `formula` reads `target`.
|
|
66
|
+
*
|
|
67
|
+
* The input cell is RESTORED before returning, whatever the outcome. The
|
|
68
|
+
* solver writes to it dozens of times while searching, and leaving the last
|
|
69
|
+
* probe behind would be worse than not running: Excel shows you the answer
|
|
70
|
+
* and asks before keeping it, which it cannot do if the sheet has already
|
|
71
|
+
* moved. Apply `result.value` yourself once the user says yes.
|
|
72
|
+
*/
|
|
73
|
+
export declare function goalSeekCell(book: GoalSeekSheet, formula: CellAddress, input: CellAddress, target: number, options?: GoalSeekOptions): GoalSeekResult;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Goal Seek: find the input value that makes a formula cell hit a target.
|
|
3
|
+
*
|
|
4
|
+
* "What interest rate makes the monthly payment 1500?" You know the answer
|
|
5
|
+
* you want and one cell you are willing to change; the solver finds it.
|
|
6
|
+
*
|
|
7
|
+
* The method is secant with a bisection fallback, not Newton. Newton needs a
|
|
8
|
+
* derivative, and the function here is "recalculate a spreadsheet", which has
|
|
9
|
+
* no analytic one. Secant approximates the slope from two evaluations, which
|
|
10
|
+
* is the same information a numerical derivative would cost anyway.
|
|
11
|
+
*
|
|
12
|
+
* Bisection is the fallback because secant is fast but not safe: it can step
|
|
13
|
+
* to infinity on a flat stretch or oscillate on a kink. When a bracket is
|
|
14
|
+
* known - two inputs whose results straddle the target - bisection cannot
|
|
15
|
+
* fail, only be slow. Trying secant first and falling back keeps the common
|
|
16
|
+
* case quick and the awkward case terminating.
|
|
17
|
+
*/
|
|
18
|
+
const DEFAULTS = {
|
|
19
|
+
tolerance: 1e-7,
|
|
20
|
+
maxIterations: 100,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Solve `evaluate(input) = target` for `input`.
|
|
24
|
+
*
|
|
25
|
+
* `evaluate` sets the input cell, recalculates, and returns the formula
|
|
26
|
+
* cell's value. It is called many times, so it should be the workbook's own
|
|
27
|
+
* recalculation rather than anything that touches the DOM.
|
|
28
|
+
*
|
|
29
|
+
* The caller owns the input cell: this never writes. It reports the value it
|
|
30
|
+
* found and lets the caller decide whether to keep it, which is what makes
|
|
31
|
+
* Excel's "Goal Seek found a solution / OK or Cancel" dialog possible.
|
|
32
|
+
*/
|
|
33
|
+
export function goalSeek(evaluate, target, start, options = {}) {
|
|
34
|
+
const tolerance = options.tolerance ?? DEFAULTS.tolerance;
|
|
35
|
+
const maxIterations = options.maxIterations ?? DEFAULTS.maxIterations;
|
|
36
|
+
const min = options.min ?? Number.NEGATIVE_INFINITY;
|
|
37
|
+
const max = options.max ?? Number.POSITIVE_INFINITY;
|
|
38
|
+
let iterations = 0;
|
|
39
|
+
const clamp = (x) => Math.min(Math.max(x, min), max);
|
|
40
|
+
/** The signed distance from the target. Zero is the answer. */
|
|
41
|
+
const f = (x) => {
|
|
42
|
+
iterations += 1;
|
|
43
|
+
const raw = evaluate(x);
|
|
44
|
+
const n = typeof raw === 'number' ? raw : Number(raw);
|
|
45
|
+
return Number.isFinite(n) ? n - target : null;
|
|
46
|
+
};
|
|
47
|
+
let x0 = clamp(options.initialGuess ?? start);
|
|
48
|
+
let f0 = f(x0);
|
|
49
|
+
if (f0 === null) {
|
|
50
|
+
return { converged: false, value: x0, result: NaN, iterations, reason: 'notNumeric' };
|
|
51
|
+
}
|
|
52
|
+
if (Math.abs(f0) <= tolerance) {
|
|
53
|
+
return { converged: true, value: x0, result: f0 + target, iterations };
|
|
54
|
+
}
|
|
55
|
+
// A second point, offset enough to see a slope. Scaling with the guess
|
|
56
|
+
// matters: a fixed step of 1 is enormous next to an interest rate of 0.05
|
|
57
|
+
// and invisible next to a loan of 300000.
|
|
58
|
+
let x1 = clamp(x0 !== 0 ? x0 * 1.1 : 1);
|
|
59
|
+
if (x1 === x0)
|
|
60
|
+
x1 = clamp(x0 + 1);
|
|
61
|
+
let f1 = f(x1);
|
|
62
|
+
if (f1 === null) {
|
|
63
|
+
return { converged: false, value: x0, result: f0 + target, iterations, reason: 'notNumeric' };
|
|
64
|
+
}
|
|
65
|
+
/** Best seen so far, so a failure still reports the closest attempt. */
|
|
66
|
+
let best = Math.abs(f0) <= Math.abs(f1) ? { x: x0, fx: f0 } : { x: x1, fx: f1 };
|
|
67
|
+
const bracket = { lo: null, hi: null };
|
|
68
|
+
const noteBracket = (a, b) => {
|
|
69
|
+
if (a.fx === 0 || b.fx === 0)
|
|
70
|
+
return;
|
|
71
|
+
if ((a.fx < 0) !== (b.fx < 0)) {
|
|
72
|
+
bracket.lo = a.fx < 0 ? a : b;
|
|
73
|
+
bracket.hi = a.fx < 0 ? b : a;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
noteBracket({ x: x0, fx: f0 }, { x: x1, fx: f1 });
|
|
77
|
+
while (iterations < maxIterations) {
|
|
78
|
+
if (Math.abs(f1) <= tolerance) {
|
|
79
|
+
return { converged: true, value: x1, result: f1 + target, iterations };
|
|
80
|
+
}
|
|
81
|
+
let next;
|
|
82
|
+
const slope = f1 - f0;
|
|
83
|
+
if (slope === 0) {
|
|
84
|
+
// Flat between the two points. Secant divides by this, so bisect if a
|
|
85
|
+
// bracket exists and give up if not - a genuinely flat function has no
|
|
86
|
+
// solution to find.
|
|
87
|
+
const { lo, hi } = bracket;
|
|
88
|
+
if (!lo || !hi) {
|
|
89
|
+
return { converged: false, value: best.x, result: best.fx + target, iterations, reason: 'flat' };
|
|
90
|
+
}
|
|
91
|
+
next = (lo.x + hi.x) / 2;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
next = x1 - f1 * ((x1 - x0) / slope);
|
|
95
|
+
// Secant can step anywhere, including outside a bracket we already
|
|
96
|
+
// trust. Bisect instead when it does.
|
|
97
|
+
const { lo, hi } = bracket;
|
|
98
|
+
const outside = !Number.isFinite(next) ||
|
|
99
|
+
(lo !== null && hi !== null && (next < Math.min(lo.x, hi.x) || next > Math.max(lo.x, hi.x)));
|
|
100
|
+
if (outside)
|
|
101
|
+
next = lo && hi ? (lo.x + hi.x) / 2 : clamp(next);
|
|
102
|
+
}
|
|
103
|
+
next = clamp(next);
|
|
104
|
+
if (next === x1) {
|
|
105
|
+
// Clamped against a bound and cannot move.
|
|
106
|
+
return {
|
|
107
|
+
converged: false, value: best.x, result: best.fx + target, iterations,
|
|
108
|
+
reason: Number.isFinite(min) || Number.isFinite(max) ? 'outOfBounds' : 'flat',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const fNext = f(next);
|
|
112
|
+
if (fNext === null) {
|
|
113
|
+
return { converged: false, value: best.x, result: best.fx + target, iterations, reason: 'notNumeric' };
|
|
114
|
+
}
|
|
115
|
+
if (Math.abs(fNext) < Math.abs(best.fx))
|
|
116
|
+
best = { x: next, fx: fNext };
|
|
117
|
+
noteBracket({ x: x1, fx: f1 }, { x: next, fx: fNext });
|
|
118
|
+
x0 = x1;
|
|
119
|
+
f0 = f1;
|
|
120
|
+
x1 = next;
|
|
121
|
+
f1 = fNext;
|
|
122
|
+
}
|
|
123
|
+
if (Math.abs(f1) <= tolerance) {
|
|
124
|
+
return { converged: true, value: x1, result: f1 + target, iterations };
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
converged: false, value: best.x, result: best.fx + target,
|
|
128
|
+
iterations, reason: 'maxIterations',
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Goal Seek over a workbook: change `input` until `formula` reads `target`.
|
|
133
|
+
*
|
|
134
|
+
* The input cell is RESTORED before returning, whatever the outcome. The
|
|
135
|
+
* solver writes to it dozens of times while searching, and leaving the last
|
|
136
|
+
* probe behind would be worse than not running: Excel shows you the answer
|
|
137
|
+
* and asks before keeping it, which it cannot do if the sheet has already
|
|
138
|
+
* moved. Apply `result.value` yourself once the user says yes.
|
|
139
|
+
*/
|
|
140
|
+
export function goalSeekCell(book, formula, input, target, options = {}) {
|
|
141
|
+
const original = book.getRaw(input.sheet, input.row, input.col);
|
|
142
|
+
const startText = original.trim();
|
|
143
|
+
const start = Number(startText);
|
|
144
|
+
try {
|
|
145
|
+
return goalSeek((x) => {
|
|
146
|
+
book.setRaw(input.sheet, input.row, input.col, String(x));
|
|
147
|
+
return book.getValue(formula.sheet, formula.row, formula.col);
|
|
148
|
+
}, target, Number.isFinite(start) ? start : 0, options);
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
book.setRaw(input.sheet, input.row, input.col, original);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@svgrid/enterprise/sheet` - the Excel keyboard layer on its own subpath.
|
|
3
|
+
*
|
|
4
|
+
* Importing the package barrel pulls every module it reaches into the chunk
|
|
5
|
+
* (the package sets no `sideEffects` flag), which for an app that only wants
|
|
6
|
+
* the shortcuts would mean shipping export, pivot, the scheduler and the board
|
|
7
|
+
* as well. This subpath is the shortcuts and nothing else. It matters more once
|
|
8
|
+
* the formula engine lands beside them in phase 2.
|
|
9
|
+
*/
|
|
10
|
+
export { enableSheet } from '../sheet-enable.js';
|
|
11
|
+
export { createTableRegistry, isValidTableName, resolveTableRange, columnIndexOf, rowCountOf, type TableRegion, type TableRegistry, type TableRange, type TableSpecifier, } from './tables.js';
|
|
12
|
+
export { TABLE_STYLES, DEFAULT_TABLE_STYLE, NO_TABLE_STYLE, findTableStyle, tableStyleColours, tableStyleLabel, type TableStyle, type TableStyleTone, type TableStyleColours, } from './table-styles.js';
|
|
13
|
+
export { goalSeek, goalSeekCell, type GoalSeekOptions, type GoalSeekResult, type GoalSeekSheet, type CellAddress as GoalSeekCellAddress, } from './goal-seek.js';
|
|
14
|
+
export { evaluationSteps, printNode, printValue, type EvaluationStep, } from './evaluate-steps.js';
|
|
15
|
+
export { checkSheet, describeFinding, ERROR_MEANINGS, type ErrorFinding, type ErrorFindingKind, type SheetReader, } from './error-check.js';
|
|
16
|
+
export { imageCall, isDrawableImageSource, type ImageCall } from './cell-images.js';
|
|
17
|
+
export { livePresence, presenceOnSheet, presenceAnchor, presenceColour, presenceInitials, PRESENCE_COLOURS, type SheetPresence, } from './presence.js';
|
|
18
|
+
export { default as SvSheetTabs } from '../SvSheetTabs.svelte';
|
|
19
|
+
export { createWorkbook, isValidSheetName, cleanIteration, DEFAULT_ITERATION, type Workbook, type SheetData, type WorkbookOptions, type IterationSettings, } from './workbook.js';
|
|
20
|
+
export { setWorkbook, getWorkbook } from './shortcuts.js';
|
|
21
|
+
export { createSheetDocument, type SheetDocument, type SheetDocumentInit, type SheetState, type SheetStateEntry, type PerSheetState, type SheetChangeReason, } from './document.js';
|
|
22
|
+
export { shiftRect, shiftRects, subtractRect, rectContains, rectsIntersect, remapNotes, lineShift, type NotesMap } from './rects.js';
|
|
23
|
+
export { isLocked, cellLocked, inEditRange, rectsHaveLocked, rectsMixLocked, PROTECTED_MESSAGE, PROTECTION_PERMISSIONS, defaultProtection, copyProtection, newEditRangeId, parseRangeText, rangeText, type ProtectionAllow, type ProtectionPermission, type EditRange, type SheetProtection, } from './protection.js';
|
|
24
|
+
export { commentAt, withComment, withThread, threadAt, threadOf, threadText, notesOf, isThreaded, listComments, nextComment, type CommentEntry, type CommentThread, type CommentValue, type CommentsMap, } from './comments.js';
|
|
25
|
+
export { ruleAt, rulesIn, checkEntry, listChoices, shiftValidation, removeValidation, describeRule, dateValue, validationId, DEFAULT_ALERT_MESSAGE, OPERATOR_LABELS, type ValidationRule, type ValidationAllow, type ValidationOperator, type ValidationContext, type ValidationVerdict, type ValidationSpec, } from './validation.js';
|
|
26
|
+
export { ruleStats, evaluateCf, shiftCf, removeCf, cfIn, describeCf, scaleColor, iconIndex, hasStyle, cfId, CF_PRESET_STYLES, COLOR_SCALES, DATA_BAR_COLOR, DATA_BAR_NEGATIVE_COLOR, type CfRule, type CfRuleBody, type CfStyledRule, type CfBody, type CfPreset, type CfStyle, type CfStats, type CfResult, type CfContext, type CfOperator, type CfTextMatch, type CfIconSet, type CfScaleColors, type CfKind, } from './conditional-formats.js';
|
|
27
|
+
export { mergePlan, unmergePlan, mergeDropsValues, mergesIn, mergeAt as sheetMergeAt, isCoveredCell, selectionMerged, toGridMerges, sortBlockedByMerges, reorderMerges, normalRect, type MergeKind, type MergePlan, } from './merges.js';
|
|
28
|
+
export { distinctValues, hiddenRowsFor, passesFilter, isFiltering, withColumnFilter, valuesFilter, shiftAutoFilter, describeFilter, datePeriodBounds, distinctFills, isDateColumn, type AutoFilterState, type ColumnFilter, type FilterCondition, type FilterValue, type DatePeriod, type FilterContext, } from './auto-filter.js';
|
|
29
|
+
export { sortOrder, guessHeaderRow, type SortKey, type SortDirection } from './sort.js';
|
|
30
|
+
export { documentToXlsxParts, documentFromXlsxParts, documentToXlsx, documentFromXlsx } from './xlsx-document.js';
|
|
31
|
+
export { csvText, csvRows, guessCsvSeparator, sheetStateFromCsv } from './csv.js';
|
|
32
|
+
export { sheetStateFromOds, documentFromOds, documentToOds, documentToOdsParts, formulaFromOdf, formulaToOdf } from './ods-document.js';
|
|
33
|
+
export { sheetStateFromXls, documentFromXls, documentToXls, isXlsFile } from './xls-document.js';
|
|
34
|
+
export { documentFromFile, readSpreadsheetFile, type OpenedFile } from './open-file.js';
|
|
35
|
+
export { defaultPageSetup, copyPageSetup, marginPresetOf, shiftPageSetup, marginsCss, MARGIN_PRESETS, PAPER_SIZES, type PageSetup, type PageMargins, type PageOrientation, type PaperSize, type MarginPreset, } from './page-setup.js';
|
|
36
|
+
export { sheetPrintHtml, printAreas, type SheetPrintInput, type SheetPrintCell } from './print.js';
|
|
37
|
+
export { sheetCellsFromRows, cellTextOf, type SheetField, type SheetFromRowsOptions } from './from-rows.js';
|
|
38
|
+
export { builtinEngine, type SheetEngine, type SheetEngineHost, type SheetEngineCell, type SheetEngineResult } from './engine.js';
|
|
39
|
+
export { chartSpecOf, chartFromRange, shiftObject, shiftObjects, objectAt, copyObject, objectId, SHEET_CHART_TYPES, type SheetObject, type SheetChartObject, type SheetImageObject, type ObjectAnchor, type SheetChartType, } from './objects.js';
|
|
40
|
+
export { sparklineSeries, sparklineAt, sparklineScale, sparklinesFromRange, clearSparklines, shiftSparkline, shiftSparklines, copySparkline, sparklineId, isColumnLocation, SPARKLINE_TYPES, type SparklineGroup, type SheetSparklineType, } from './sparklines.js';
|
|
41
|
+
export { pivotFields, pivotFieldValues, pivotRecords, filteredRecords, pivotBlock, pivotLayout, pivotDrill, pivotFromRange, pivotWrittenRect, flattenPivotColumns, ALL_VALUES, shiftPivot, shiftPivots, copyPivot, pivotId, SHEET_PIVOT_AGGS, type SheetPivot, type SheetPivotValue, type SheetPivotAgg, type SheetPivotFilter, type PivotLayout, type PivotDrill, } from './pivot-range.js';
|
|
42
|
+
export { createDeltaStream, applySheetDelta, partsOfReasons, type SheetDelta, type SheetDeltaStream, type SheetDeltaOptions, type SheetCellWrite, } from './delta.js';
|
|
43
|
+
export { linkAt, setLink, removeLink, listLinks, shiftLinks, copyLinks, parseLinkTarget, isSafeLinkTarget, linkTitle, type SheetLink, type LinksMap, type LinkTarget, } from './links.js';
|
|
44
|
+
export { default as SvSheetSort } from '../SvSheetSort.svelte';
|
|
45
|
+
export { splitText, textToColumns, guessDelimiter, findDuplicates, removeDuplicates, type SplitOptions, type DuplicateOptions, type DuplicateReport, } from './transforms.js';
|
|
46
|
+
export { insertRows, deleteRows, insertColumns, deleteColumns, axisForSelection, setStructureTarget, getStructureTarget, rewriteFormulas, type StructureTarget, } from './structure.js';
|
|
47
|
+
export { findAll, findNext, replaceOne, replaceAll, replaceInText, cellMatches, setFindTarget, getFindTarget, type FindOptions, type FindHit, type FindTarget, } from './find-replace.js';
|
|
48
|
+
export { splitFrozenRows, frozenColumnIds, applyFreeze, freezeAtActiveCell, freezeTopRow, freezeFirstColumn, unfreeze, type FreezeState, type FreezeSplit, } from './freeze.js';
|
|
49
|
+
export { buildClipboardPayload, parseClipboard, parseClipboardText, parseClipboardHtml, readClipboardOrigin, anchorForeignFormulas, resolvePasteCell, planPaste, msoNumberFormat, numFmtFromMso, isR1C1, r1c1ToA1, type PasteSpecialOptions, type PasteWhat, type PasteOperation, type ClipboardCell, type ClipboardGrid, type PasteResolution, } from './paste-special.js';
|
|
50
|
+
export { setFindReplaceHandler, setPasteSpecialHandler } from './shortcuts.js';
|
|
51
|
+
export { default as SvFormulaBar } from '../SvFormulaBar.svelte';
|
|
52
|
+
export { default as SvSheet } from '../SvSheet.svelte';
|
|
53
|
+
export { default as SvSheetRibbon } from '../SvSheetRibbon.svelte';
|
|
54
|
+
export { RIBBON_TABS, ribbonItems, withDecimals, applyBorders, type RibbonTab, type RibbonGroup, type RibbonItem, type RibbonOption, type RibbonItemKind, type RibbonActionId, type BorderPreset, } from './ribbon.js';
|
|
55
|
+
export { RIBBON_ICONS, RIBBON_ICON_NAMES, type RibbonIconName, type IconPath } from './ribbon-icons.js';
|
|
56
|
+
export { THEME_COLOURS, STANDARD_COLOURS, ALL_COLOURS, tint, type PaletteColour } from './palette.js';
|
|
57
|
+
export { default as SvRibbonIcon } from '../SvRibbonIcon.svelte';
|
|
58
|
+
export { move, selectRegion, selectLine, applyFormat, toggleFormat, preset, autoSum, structural, switchSheet, gridOf, } from './shortcuts.js';
|
|
59
|
+
export { compileNumberFormat, formatWithPattern, FORMAT_PRESETS, FORMAT_CATEGORY_PATTERNS, SPECIAL_FORMATS, formatCategory, accountingPattern, accountingParts, type CompiledFormat, type FormatPresetName, type SpecialFormatName, } from './number-format.js';
|
|
60
|
+
export { createFormatStore, entryToStyle, type SheetFormatStore, type CellFormatEntry, type CellAddressLookup, } from './format-store.js';
|
|
61
|
+
export { createNames, isValidName, type SheetNames, type DefinedName, } from './names.js';
|
|
62
|
+
export { defaultSheetMessages, defaultSheetTextMessages, defaultDialogMessages, ribbonMessageDefaults, resolveSheetMessages, formatMessage, type SheetMessages, type SheetTextMessages, type SheetDialogMessages, type SheetLocalization, } from './messages.js';
|
|
63
|
+
export { suggestFunctions, applySuggestion, signatureAt, partialAt, SIGNATURES, type FunctionSuggestion, } from './autocomplete.js';
|
|
64
|
+
export { setFormatTarget, getFormatTarget, setFormatDialogHandler, type SheetFormatTarget, } from './shortcuts.js';
|
|
65
|
+
export { parseFormula, parse, } from './parse.js';
|
|
66
|
+
export { tokenize, type Token } from './tokenize.js';
|
|
67
|
+
export { evaluate, evaluateSpill, formatValue, type EvalContext } from './evaluate.js';
|
|
68
|
+
export { ARRAY_FUNCTIONS, type ArrayFunction, type Grid as SpillGrid } from './packs/array.js';
|
|
69
|
+
export { FUNCTIONS, withCustomFunctions, type SheetFunction, type FnArgs, } from './functions.js';
|
|
70
|
+
export { translateFormula, fixupReferences, renameSheetReferences, formatFormula, referenceSpans, repointReferences, REFERENCE_COLOURS, type StructuralEdit, type EditScope, type ReferenceSpan, type CellMove, } from './refs.js';
|
|
71
|
+
export { createDependencyGraph, precedentsOf, cellKey, parseCellKey, type DependencyGraph, type CellKey, } from './deps.js';
|
|
72
|
+
export { parseA1, formatA1, colToLetters, lettersToCol, type CellRef, } from './address.js';
|
|
73
|
+
export { isError, type CellValue, type SheetError, type Node as FormulaNode, } from './ast.js';
|
|
74
|
+
export { SHEET_BINDINGS, handleSheetKey, type SheetBinding, type SheetCommand, } from './shortcuts.js';
|
|
75
|
+
export { edgeOfRegion, currentRegion, isWholeSheet, wholeSheet, isBlankValue, type Direction, type Grid, type Cell, type Rect, } from './navigate.js';
|
|
76
|
+
export { fillDown, fillRight, fillSelection, stampDate, stampNow, copyFromAbove, copyValueFromAbove, guessSumRange, looksNumeric, numericAt, targetRect, setFillTranslator, setSheetValueProbe, getSheetValueProbe, type FillTranslator, type SheetValueProbe, } from './commands.js';
|
|
77
|
+
export { cultureFromLocale, formulaToCulture, formulaFromCulture, parseNumberInCulture, formatNumberInCulture, slashDateParts, isInvariant, INVARIANT_CULTURE, type SheetCulture, } from './culture.js';
|
|
78
|
+
export { emptyOutline, groupLines, ungroupLines, clearOutline, toggleCollapsed, showLevel, hiddenByOutline, detailRange, shiftOutline, autoOutline, outlineLevel, isOutlined, deepestLevel, MAX_OUTLINE_LEVEL, type OutlineState, type OutlineSide, } from './outline.js';
|
|
79
|
+
export { cellTypeAt, isChecked, toggledValue, radioIndex, applyCellType, removeCellTypes, shiftCellTypes, checkboxValues, newCellTypeId, copyCellType, CHECKED, UNCHECKED, type CellTypeRegion, type CellTypeKind, } from './cell-types.js';
|
|
80
|
+
export { projectGridSheet, rowOfRecord, recordOfRow, isRecordRow, columnOfField, copyGridSheet, coerceFieldValue, emptyGridSheet, type SheetKind, type GridSheetSpec, type GridSheetField, } from './sheet-kinds.js';
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@svgrid/enterprise/sheet` - the Excel keyboard layer on its own subpath.
|
|
3
|
+
*
|
|
4
|
+
* Importing the package barrel pulls every module it reaches into the chunk
|
|
5
|
+
* (the package sets no `sideEffects` flag), which for an app that only wants
|
|
6
|
+
* the shortcuts would mean shipping export, pivot, the scheduler and the board
|
|
7
|
+
* as well. This subpath is the shortcuts and nothing else. It matters more once
|
|
8
|
+
* the formula engine lands beside them in phase 2.
|
|
9
|
+
*/
|
|
10
|
+
export { enableSheet } from '../sheet-enable.js';
|
|
11
|
+
export { createTableRegistry, isValidTableName, resolveTableRange, columnIndexOf, rowCountOf, } from './tables.js';
|
|
12
|
+
export { TABLE_STYLES, DEFAULT_TABLE_STYLE, NO_TABLE_STYLE, findTableStyle, tableStyleColours, tableStyleLabel, } from './table-styles.js';
|
|
13
|
+
export { goalSeek, goalSeekCell, } from './goal-seek.js';
|
|
14
|
+
export { evaluationSteps, printNode, printValue, } from './evaluate-steps.js';
|
|
15
|
+
export { checkSheet, describeFinding, ERROR_MEANINGS, } from './error-check.js';
|
|
16
|
+
export { imageCall, isDrawableImageSource } from './cell-images.js';
|
|
17
|
+
export { livePresence, presenceOnSheet, presenceAnchor, presenceColour, presenceInitials, PRESENCE_COLOURS, } from './presence.js';
|
|
18
|
+
export { default as SvSheetTabs } from '../SvSheetTabs.svelte';
|
|
19
|
+
export { createWorkbook, isValidSheetName, cleanIteration, DEFAULT_ITERATION, } from './workbook.js';
|
|
20
|
+
export { setWorkbook, getWorkbook } from './shortcuts.js';
|
|
21
|
+
export { createSheetDocument, } from './document.js';
|
|
22
|
+
export { shiftRect, shiftRects, subtractRect, rectContains, rectsIntersect, remapNotes, lineShift } from './rects.js';
|
|
23
|
+
export { isLocked, cellLocked, inEditRange, rectsHaveLocked, rectsMixLocked, PROTECTED_MESSAGE, PROTECTION_PERMISSIONS, defaultProtection, copyProtection, newEditRangeId, parseRangeText, rangeText, } from './protection.js';
|
|
24
|
+
export { commentAt, withComment, withThread, threadAt, threadOf, threadText, notesOf, isThreaded, listComments, nextComment, } from './comments.js';
|
|
25
|
+
export { ruleAt, rulesIn, checkEntry, listChoices, shiftValidation, removeValidation, describeRule, dateValue, validationId, DEFAULT_ALERT_MESSAGE, OPERATOR_LABELS, } from './validation.js';
|
|
26
|
+
export { ruleStats, evaluateCf, shiftCf, removeCf, cfIn, describeCf, scaleColor, iconIndex, hasStyle, cfId, CF_PRESET_STYLES, COLOR_SCALES, DATA_BAR_COLOR, DATA_BAR_NEGATIVE_COLOR, } from './conditional-formats.js';
|
|
27
|
+
export { mergePlan, unmergePlan, mergeDropsValues, mergesIn, mergeAt as sheetMergeAt, isCoveredCell, selectionMerged, toGridMerges, sortBlockedByMerges, reorderMerges, normalRect, } from './merges.js';
|
|
28
|
+
export { distinctValues, hiddenRowsFor, passesFilter, isFiltering, withColumnFilter, valuesFilter, shiftAutoFilter, describeFilter, datePeriodBounds, distinctFills, isDateColumn, } from './auto-filter.js';
|
|
29
|
+
export { sortOrder, guessHeaderRow } from './sort.js';
|
|
30
|
+
export { documentToXlsxParts, documentFromXlsxParts, documentToXlsx, documentFromXlsx } from './xlsx-document.js';
|
|
31
|
+
export { csvText, csvRows, guessCsvSeparator, sheetStateFromCsv } from './csv.js';
|
|
32
|
+
export { sheetStateFromOds, documentFromOds, documentToOds, documentToOdsParts, formulaFromOdf, formulaToOdf } from './ods-document.js';
|
|
33
|
+
export { sheetStateFromXls, documentFromXls, documentToXls, isXlsFile } from './xls-document.js';
|
|
34
|
+
export { documentFromFile, readSpreadsheetFile } from './open-file.js';
|
|
35
|
+
export { defaultPageSetup, copyPageSetup, marginPresetOf, shiftPageSetup, marginsCss, MARGIN_PRESETS, PAPER_SIZES, } from './page-setup.js';
|
|
36
|
+
export { sheetPrintHtml, printAreas } from './print.js';
|
|
37
|
+
export { sheetCellsFromRows, cellTextOf } from './from-rows.js';
|
|
38
|
+
export { builtinEngine } from './engine.js';
|
|
39
|
+
export { chartSpecOf, chartFromRange, shiftObject, shiftObjects, objectAt, copyObject, objectId, SHEET_CHART_TYPES, } from './objects.js';
|
|
40
|
+
export { sparklineSeries, sparklineAt, sparklineScale, sparklinesFromRange, clearSparklines, shiftSparkline, shiftSparklines, copySparkline, sparklineId, isColumnLocation, SPARKLINE_TYPES, } from './sparklines.js';
|
|
41
|
+
export { pivotFields, pivotFieldValues, pivotRecords, filteredRecords, pivotBlock, pivotLayout, pivotDrill, pivotFromRange, pivotWrittenRect, flattenPivotColumns, ALL_VALUES, shiftPivot, shiftPivots, copyPivot, pivotId, SHEET_PIVOT_AGGS, } from './pivot-range.js';
|
|
42
|
+
export { createDeltaStream, applySheetDelta, partsOfReasons, } from './delta.js';
|
|
43
|
+
export { linkAt, setLink, removeLink, listLinks, shiftLinks, copyLinks, parseLinkTarget, isSafeLinkTarget, linkTitle, } from './links.js';
|
|
44
|
+
export { default as SvSheetSort } from '../SvSheetSort.svelte';
|
|
45
|
+
export { splitText, textToColumns, guessDelimiter, findDuplicates, removeDuplicates, } from './transforms.js';
|
|
46
|
+
export { insertRows, deleteRows, insertColumns, deleteColumns, axisForSelection, setStructureTarget, getStructureTarget, rewriteFormulas, } from './structure.js';
|
|
47
|
+
export { findAll, findNext, replaceOne, replaceAll, replaceInText, cellMatches, setFindTarget, getFindTarget, } from './find-replace.js';
|
|
48
|
+
export { splitFrozenRows, frozenColumnIds, applyFreeze, freezeAtActiveCell, freezeTopRow, freezeFirstColumn, unfreeze, } from './freeze.js';
|
|
49
|
+
export { buildClipboardPayload, parseClipboard, parseClipboardText, parseClipboardHtml, readClipboardOrigin, anchorForeignFormulas, resolvePasteCell, planPaste, msoNumberFormat, numFmtFromMso, isR1C1, r1c1ToA1, } from './paste-special.js';
|
|
50
|
+
export { setFindReplaceHandler, setPasteSpecialHandler } from './shortcuts.js';
|
|
51
|
+
export { default as SvFormulaBar } from '../SvFormulaBar.svelte';
|
|
52
|
+
export { default as SvSheet } from '../SvSheet.svelte';
|
|
53
|
+
export { default as SvSheetRibbon } from '../SvSheetRibbon.svelte';
|
|
54
|
+
export { RIBBON_TABS, ribbonItems, withDecimals, applyBorders, } from './ribbon.js';
|
|
55
|
+
export { RIBBON_ICONS, RIBBON_ICON_NAMES } from './ribbon-icons.js';
|
|
56
|
+
export { THEME_COLOURS, STANDARD_COLOURS, ALL_COLOURS, tint } from './palette.js';
|
|
57
|
+
export { default as SvRibbonIcon } from '../SvRibbonIcon.svelte';
|
|
58
|
+
export { move, selectRegion, selectLine, applyFormat, toggleFormat, preset, autoSum, structural, switchSheet, gridOf, } from './shortcuts.js';
|
|
59
|
+
export { compileNumberFormat, formatWithPattern, FORMAT_PRESETS, FORMAT_CATEGORY_PATTERNS, SPECIAL_FORMATS, formatCategory, accountingPattern, accountingParts, } from './number-format.js';
|
|
60
|
+
export { createFormatStore, entryToStyle, } from './format-store.js';
|
|
61
|
+
export { createNames, isValidName, } from './names.js';
|
|
62
|
+
export { defaultSheetMessages, defaultSheetTextMessages, defaultDialogMessages, ribbonMessageDefaults, resolveSheetMessages, formatMessage, } from './messages.js';
|
|
63
|
+
export { suggestFunctions, applySuggestion, signatureAt, partialAt, SIGNATURES, } from './autocomplete.js';
|
|
64
|
+
export { setFormatTarget, getFormatTarget, setFormatDialogHandler, } from './shortcuts.js';
|
|
65
|
+
export { parseFormula, parse, } from './parse.js';
|
|
66
|
+
export { tokenize } from './tokenize.js';
|
|
67
|
+
export { evaluate, evaluateSpill, formatValue } from './evaluate.js';
|
|
68
|
+
export { ARRAY_FUNCTIONS } from './packs/array.js';
|
|
69
|
+
export { FUNCTIONS, withCustomFunctions, } from './functions.js';
|
|
70
|
+
export { translateFormula, fixupReferences, renameSheetReferences, formatFormula, referenceSpans, repointReferences, REFERENCE_COLOURS, } from './refs.js';
|
|
71
|
+
export { createDependencyGraph, precedentsOf, cellKey, parseCellKey, } from './deps.js';
|
|
72
|
+
export { parseA1, formatA1, colToLetters, lettersToCol, } from './address.js';
|
|
73
|
+
export { isError, } from './ast.js';
|
|
74
|
+
export { SHEET_BINDINGS, handleSheetKey, } from './shortcuts.js';
|
|
75
|
+
export { edgeOfRegion, currentRegion, isWholeSheet, wholeSheet, isBlankValue, } from './navigate.js';
|
|
76
|
+
export { fillDown, fillRight, fillSelection, stampDate, stampNow, copyFromAbove, copyValueFromAbove, guessSumRange, looksNumeric, numericAt, targetRect, setFillTranslator, setSheetValueProbe, getSheetValueProbe, } from './commands.js';
|
|
77
|
+
export { cultureFromLocale, formulaToCulture, formulaFromCulture, parseNumberInCulture, formatNumberInCulture, slashDateParts, isInvariant, INVARIANT_CULTURE, } from './culture.js';
|
|
78
|
+
export { emptyOutline, groupLines, ungroupLines, clearOutline, toggleCollapsed, showLevel, hiddenByOutline, detailRange, shiftOutline, autoOutline, outlineLevel, isOutlined, deepestLevel, MAX_OUTLINE_LEVEL, } from './outline.js';
|
|
79
|
+
export { cellTypeAt, isChecked, toggledValue, radioIndex, applyCellType, removeCellTypes, shiftCellTypes, checkboxValues, newCellTypeId, copyCellType, CHECKED, UNCHECKED, } from './cell-types.js';
|
|
80
|
+
export { projectGridSheet, rowOfRecord, recordOfRow, isRecordRow, columnOfField, copyGridSheet, coerceFieldValue, emptyGridSheet, } from './sheet-kinds.js';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { StructuralEdit } from './refs.js';
|
|
2
|
+
export type SheetLink = {
|
|
3
|
+
/** Where it goes: a URL, or an address on this workbook. */
|
|
4
|
+
target: string;
|
|
5
|
+
/** Excel's ScreenTip: what hovering says, when it is not the target. */
|
|
6
|
+
tip?: string;
|
|
7
|
+
};
|
|
8
|
+
/** `r4` -> `B` -> the link on B5. */
|
|
9
|
+
export type LinksMap = Record<string, Record<string, SheetLink>>;
|
|
10
|
+
/** The link on a cell, or undefined. */
|
|
11
|
+
export declare function linkAt(links: LinksMap, row: number, col: number): SheetLink | undefined;
|
|
12
|
+
/** A copy with the link set on one cell. */
|
|
13
|
+
export declare function setLink(links: LinksMap, row: number, col: number, link: SheetLink): LinksMap;
|
|
14
|
+
/** A copy with the link removed from one cell, and the row dropped if empty. */
|
|
15
|
+
export declare function removeLink(links: LinksMap, row: number, col: number): LinksMap;
|
|
16
|
+
/** Every link, as rows and columns, for a writer or a test. */
|
|
17
|
+
export declare function listLinks(links: LinksMap): Array<{
|
|
18
|
+
row: number;
|
|
19
|
+
col: number;
|
|
20
|
+
link: SheetLink;
|
|
21
|
+
}>;
|
|
22
|
+
/** The links after an insert or delete: they move with their cells. */
|
|
23
|
+
export declare function shiftLinks(links: LinksMap, edit: StructuralEdit): LinksMap;
|
|
24
|
+
/** A deep enough copy to hand out or save. */
|
|
25
|
+
export declare function copyLinks(links: LinksMap): LinksMap;
|
|
26
|
+
/** Whether a target is one this shell will follow out of the page. */
|
|
27
|
+
export declare function isSafeLinkTarget(target: string): boolean;
|
|
28
|
+
export type LinkTarget = {
|
|
29
|
+
kind: 'external';
|
|
30
|
+
href: string;
|
|
31
|
+
} | {
|
|
32
|
+
kind: 'internal';
|
|
33
|
+
sheet: string | null;
|
|
34
|
+
row: number;
|
|
35
|
+
col: number;
|
|
36
|
+
} | {
|
|
37
|
+
kind: 'name';
|
|
38
|
+
name: string;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* What a target means. An address wins over a name, so `B4` is a cell and
|
|
42
|
+
* `Sales` is a defined name; `Sheet1!B4` is the cell on that sheet.
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseLinkTarget(target: string): LinkTarget | null;
|
|
45
|
+
/** What a linked cell's title says: the tip, or where it goes. */
|
|
46
|
+
export declare function linkTitle(link: SheetLink): string;
|
|
47
|
+
/**
|
|
48
|
+
* The first argument of a top-level `=HYPERLINK(...)`, as it was written,
|
|
49
|
+
* so the caller can evaluate it and learn where the cell goes.
|
|
50
|
+
*
|
|
51
|
+
* Excel makes a cell holding that formula clickable, and the target is
|
|
52
|
+
* whatever the first argument works out to, which may be an expression
|
|
53
|
+
* (`"…/issues/" & A2`). Null for anything that is not that call, including
|
|
54
|
+
* one nested inside another formula, since only the outermost one decides
|
|
55
|
+
* where the cell goes.
|
|
56
|
+
*/
|
|
57
|
+
export declare function hyperlinkArgument(text: string): string | null;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hyperlinks: Excel's Insert > Link, and the `HYPERLINK` function.
|
|
3
|
+
*
|
|
4
|
+
* A link belongs to a CELL rather than to its text, the way Excel keeps
|
|
5
|
+
* one: the cell still holds whatever was typed, and the link is kept beside
|
|
6
|
+
* it so that editing the text does not lose the target and clearing the
|
|
7
|
+
* cell does. That also means a link survives a format change, a sort of the
|
|
8
|
+
* text around it and a save, and moves with an insert or a delete.
|
|
9
|
+
*
|
|
10
|
+
* Two kinds of target, told apart by how they read rather than by a flag
|
|
11
|
+
* the user has to set:
|
|
12
|
+
*
|
|
13
|
+
* external `https://…`, `mailto:…`, anything with a scheme, opened in
|
|
14
|
+
* a new tab;
|
|
15
|
+
* internal `Sheet1!B4`, `B4`, or a defined name, which moves the
|
|
16
|
+
* selection instead of leaving the page.
|
|
17
|
+
*
|
|
18
|
+
* The map is keyed the way the comments map is (`r4` -> `B` -> the link),
|
|
19
|
+
* so the same `remapNotes` moves both when a row or column is inserted.
|
|
20
|
+
*/
|
|
21
|
+
import { remapNotes } from './rects.js';
|
|
22
|
+
import { colToLetters, lettersToCol, parseA1 } from './address.js';
|
|
23
|
+
import { lineShift } from './rects.js';
|
|
24
|
+
/** The link on a cell, or undefined. */
|
|
25
|
+
export function linkAt(links, row, col) {
|
|
26
|
+
return links[`r${row}`]?.[colToLetters(col)];
|
|
27
|
+
}
|
|
28
|
+
/** A copy with the link set on one cell. */
|
|
29
|
+
export function setLink(links, row, col, link) {
|
|
30
|
+
const rowId = `r${row}`;
|
|
31
|
+
return { ...links, [rowId]: { ...(links[rowId] ?? {}), [colToLetters(col)]: { ...link } } };
|
|
32
|
+
}
|
|
33
|
+
/** A copy with the link removed from one cell, and the row dropped if empty. */
|
|
34
|
+
export function removeLink(links, row, col) {
|
|
35
|
+
const rowId = `r${row}`;
|
|
36
|
+
const line = links[rowId];
|
|
37
|
+
if (!line || !(colToLetters(col) in line))
|
|
38
|
+
return links;
|
|
39
|
+
const next = { ...line };
|
|
40
|
+
delete next[colToLetters(col)];
|
|
41
|
+
const out = { ...links };
|
|
42
|
+
if (Object.keys(next).length)
|
|
43
|
+
out[rowId] = next;
|
|
44
|
+
else
|
|
45
|
+
delete out[rowId];
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
/** Every link, as rows and columns, for a writer or a test. */
|
|
49
|
+
export function listLinks(links) {
|
|
50
|
+
const out = [];
|
|
51
|
+
for (const [rowId, line] of Object.entries(links)) {
|
|
52
|
+
const row = Number(rowId.slice(1));
|
|
53
|
+
if (!Number.isInteger(row))
|
|
54
|
+
continue;
|
|
55
|
+
for (const [columnId, link] of Object.entries(line)) {
|
|
56
|
+
const col = lettersToCol(columnId);
|
|
57
|
+
if (col >= 0)
|
|
58
|
+
out.push({ row, col, link: { ...link } });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return out.sort((a, b) => a.row - b.row || a.col - b.col);
|
|
62
|
+
}
|
|
63
|
+
/** The links after an insert or delete: they move with their cells. */
|
|
64
|
+
export function shiftLinks(links, edit) {
|
|
65
|
+
const rows = edit.kind === 'insertRows' || edit.kind === 'deleteRows';
|
|
66
|
+
return remapNotes(links, rows ? 'rows' : 'cols', lineShift(edit));
|
|
67
|
+
}
|
|
68
|
+
/** A deep enough copy to hand out or save. */
|
|
69
|
+
export function copyLinks(links) {
|
|
70
|
+
const out = {};
|
|
71
|
+
for (const [rowId, line] of Object.entries(links)) {
|
|
72
|
+
out[rowId] = Object.fromEntries(Object.entries(line).map(([c, link]) => [c, { ...link }]));
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
/** Anything with a scheme, or a bare `www.`, is a link out of the page. */
|
|
77
|
+
const EXTERNAL = /^(?:[a-z][a-z0-9+.-]*:|www\.)/i;
|
|
78
|
+
/**
|
|
79
|
+
* The schemes a cell's link may carry.
|
|
80
|
+
*
|
|
81
|
+
* A link is data: it is typed by a colleague, arrives on a delta stream, or
|
|
82
|
+
* comes out of a file someone sent. Following `javascript:` from one runs
|
|
83
|
+
* that text in the page, so the set of schemes that may be followed is
|
|
84
|
+
* named here rather than assumed, and anything else is not a link at all.
|
|
85
|
+
*/
|
|
86
|
+
const SAFE_SCHEMES = new Set(['http', 'https', 'mailto', 'tel', 'sms', 'ftp', 'ftps']);
|
|
87
|
+
/** Whether a target is one this shell will follow out of the page. */
|
|
88
|
+
export function isSafeLinkTarget(target) {
|
|
89
|
+
const text = target.trim();
|
|
90
|
+
const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(text);
|
|
91
|
+
return scheme ? SAFE_SCHEMES.has(scheme[1].toLowerCase()) : true;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* What a target means. An address wins over a name, so `B4` is a cell and
|
|
95
|
+
* `Sales` is a defined name; `Sheet1!B4` is the cell on that sheet.
|
|
96
|
+
*/
|
|
97
|
+
export function parseLinkTarget(target) {
|
|
98
|
+
// Not a string at all: a state built by hand, or one from a version that
|
|
99
|
+
// spelled a link differently. No link, rather than a thrown TypeError
|
|
100
|
+
// taking a whole Save As with it.
|
|
101
|
+
if (typeof target !== 'string')
|
|
102
|
+
return null;
|
|
103
|
+
const text = target.trim();
|
|
104
|
+
if (text === '')
|
|
105
|
+
return null;
|
|
106
|
+
// A scheme that is not one of the safe ones is not a link: null rather
|
|
107
|
+
// than an address, so nothing downstream can follow it or write it into
|
|
108
|
+
// a file.
|
|
109
|
+
if (!isSafeLinkTarget(text))
|
|
110
|
+
return null;
|
|
111
|
+
if (EXTERNAL.test(text))
|
|
112
|
+
return { kind: 'external', href: text.toLowerCase().startsWith('www.') ? `https://${text}` : text };
|
|
113
|
+
// `Sheet1!B4` and `'Two words'!B4`: the sheet is whatever is before the
|
|
114
|
+
// last `!`, which `parseA1` takes as an argument rather than parsing.
|
|
115
|
+
const bang = text.lastIndexOf('!');
|
|
116
|
+
const sheet = bang < 0 ? null : text.slice(0, bang).replace(/^'(.*)'$/, '$1').replace(/''/g, "'");
|
|
117
|
+
const cell = bang < 0 ? text : text.slice(bang + 1);
|
|
118
|
+
const ref = parseA1(cell, sheet);
|
|
119
|
+
if (ref && ref.row !== null)
|
|
120
|
+
return { kind: 'internal', sheet: ref.sheet, row: ref.row, col: ref.col };
|
|
121
|
+
return { kind: 'name', name: text };
|
|
122
|
+
}
|
|
123
|
+
/** What a linked cell's title says: the tip, or where it goes. */
|
|
124
|
+
export function linkTitle(link) {
|
|
125
|
+
return link.tip?.trim() ? link.tip : link.target;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* The first argument of a top-level `=HYPERLINK(...)`, as it was written,
|
|
129
|
+
* so the caller can evaluate it and learn where the cell goes.
|
|
130
|
+
*
|
|
131
|
+
* Excel makes a cell holding that formula clickable, and the target is
|
|
132
|
+
* whatever the first argument works out to, which may be an expression
|
|
133
|
+
* (`"…/issues/" & A2`). Null for anything that is not that call, including
|
|
134
|
+
* one nested inside another formula, since only the outermost one decides
|
|
135
|
+
* where the cell goes.
|
|
136
|
+
*/
|
|
137
|
+
export function hyperlinkArgument(text) {
|
|
138
|
+
const m = /^=\s*HYPERLINK\s*\(/i.exec(text.trim());
|
|
139
|
+
if (!m)
|
|
140
|
+
return null;
|
|
141
|
+
const inside = text.trim().slice(m[0].length);
|
|
142
|
+
let depth = 0;
|
|
143
|
+
let quoted = false;
|
|
144
|
+
for (let i = 0; i < inside.length; i += 1) {
|
|
145
|
+
const ch = inside[i];
|
|
146
|
+
if (quoted) {
|
|
147
|
+
// `""` inside a string is an escaped quote, not the end of one.
|
|
148
|
+
if (ch === '"') {
|
|
149
|
+
if (inside[i + 1] === '"')
|
|
150
|
+
i += 1;
|
|
151
|
+
else
|
|
152
|
+
quoted = false;
|
|
153
|
+
}
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (ch === '"') {
|
|
157
|
+
quoted = true;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (ch === '(') {
|
|
161
|
+
depth += 1;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (ch === ')') {
|
|
165
|
+
if (depth === 0)
|
|
166
|
+
return inside.slice(0, i).trim() || null;
|
|
167
|
+
depth -= 1;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (ch === ',' && depth === 0)
|
|
171
|
+
return inside.slice(0, i).trim() || null;
|
|
172
|
+
}
|
|
173
|
+
return null;
|
|
174
|
+
}
|