@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,145 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Excel's Goal Seek: set a formula cell to a value by changing one input
|
|
4
|
+
* cell. The solver restores the input while it searches and the status
|
|
5
|
+
* page shows what it found; OK keeps the answer through the command
|
|
6
|
+
* context, so it lands in the grid's history like a typed number.
|
|
7
|
+
*/
|
|
8
|
+
import { useSheetText } from './sheet-text'
|
|
9
|
+
import { untrack } from 'svelte'
|
|
10
|
+
import { SvModal } from '@svgrid/grid'
|
|
11
|
+
import type { GridCommandContext } from '@svgrid/grid/shortcuts'
|
|
12
|
+
import type { Workbook } from './sheet/workbook'
|
|
13
|
+
import { goalSeekCell, type GoalSeekResult } from './sheet/goal-seek'
|
|
14
|
+
import { parseA1, colToLetters } from './sheet/address'
|
|
15
|
+
|
|
16
|
+
type Props = {
|
|
17
|
+
open?: boolean
|
|
18
|
+
workbook: Workbook
|
|
19
|
+
/** The command context the dialog was opened with. */
|
|
20
|
+
cmd: () => GridCommandContext | null
|
|
21
|
+
onClose?: () => void
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let { open = $bindable(false), workbook, cmd, onClose }: Props = $props()
|
|
25
|
+
const t = useSheetText()
|
|
26
|
+
|
|
27
|
+
let step = $state<'ask' | 'done'>('ask')
|
|
28
|
+
let setCell = $state('')
|
|
29
|
+
let toValue = $state('')
|
|
30
|
+
let byCell = $state('')
|
|
31
|
+
let problem = $state<string | null>(null)
|
|
32
|
+
let found = $state<GoalSeekResult | null>(null)
|
|
33
|
+
let firstInput = $state<HTMLInputElement | null>(null)
|
|
34
|
+
|
|
35
|
+
// The active cell is the natural "Set cell", as it is in Excel.
|
|
36
|
+
$effect(() => {
|
|
37
|
+
if (!open) return
|
|
38
|
+
untrack(prepare)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
function prepare() {
|
|
42
|
+
const at = cmd()?.activeCell
|
|
43
|
+
setCell = at ? `${colToLetters(at.colIndex)}${at.rowIndex + 1}` : ''
|
|
44
|
+
toValue = ''
|
|
45
|
+
byCell = ''
|
|
46
|
+
step = 'ask'
|
|
47
|
+
problem = null
|
|
48
|
+
found = null
|
|
49
|
+
queueMicrotask(() => firstInput?.focus())
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function address(text: string): { row: number; col: number } | null {
|
|
53
|
+
const ref = parseA1(text.trim().toUpperCase())
|
|
54
|
+
return ref && ref.row !== null ? { row: ref.row, col: ref.col } : null
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function solve() {
|
|
58
|
+
const formula = address(setCell)
|
|
59
|
+
const input = address(byCell)
|
|
60
|
+
const target = Number(toValue)
|
|
61
|
+
if (!formula) { problem = t('goalSeek.notAddress', { text: setCell }); return }
|
|
62
|
+
if (!input) { problem = t('goalSeek.notAddress', { text: byCell }); return }
|
|
63
|
+
if (toValue.trim() === '' || !Number.isFinite(target)) { problem = t('goalSeek.toValueNumber'); return }
|
|
64
|
+
const sheet = workbook.active
|
|
65
|
+
if (!workbook.getRaw(sheet, formula.row, formula.col).startsWith('=')) {
|
|
66
|
+
problem = t('goalSeek.needsFormula', { cell: setCell.toUpperCase() })
|
|
67
|
+
return
|
|
68
|
+
}
|
|
69
|
+
if (workbook.getRaw(sheet, input.row, input.col).startsWith('=')) {
|
|
70
|
+
problem = `${byCell.toUpperCase()} must contain a value, not a formula`
|
|
71
|
+
return
|
|
72
|
+
}
|
|
73
|
+
found = goalSeekCell(workbook, { sheet, ...formula }, { sheet, ...input }, target, { maxIterations: 100 })
|
|
74
|
+
problem = null
|
|
75
|
+
step = 'done'
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function keep() {
|
|
79
|
+
const input = address(byCell)
|
|
80
|
+
const c = cmd()
|
|
81
|
+
if (!input || !found || !c) return
|
|
82
|
+
c.setCellValue(input.row, input.col, String(round(found.value)))
|
|
83
|
+
c.setActiveCell(input.row, input.col)
|
|
84
|
+
close()
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function close() {
|
|
88
|
+
open = false
|
|
89
|
+
onClose?.()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const round = (n: number) => Number(n.toFixed(4))
|
|
93
|
+
const money = (n: number) => n.toLocaleString('en-US', { maximumFractionDigits: 2 })
|
|
94
|
+
</script>
|
|
95
|
+
|
|
96
|
+
<SvModal bind:open onClose={onClose} title={t(step === 'ask' ? 'goalSeek.title' : 'goalSeek.statusTitle')} size="sm">
|
|
97
|
+
{#if step === 'ask'}
|
|
98
|
+
<form class="sv-sheet-dialog" onsubmit={(e) => { e.preventDefault(); solve() }}>
|
|
99
|
+
<label class="field">
|
|
100
|
+
<span>{t('goalSeek.setCell')}</span>
|
|
101
|
+
<input bind:this={firstInput} type="text" bind:value={setCell} spellcheck="false" />
|
|
102
|
+
</label>
|
|
103
|
+
<label class="field">
|
|
104
|
+
<span>{t('goalSeek.toValue')}</span>
|
|
105
|
+
<input type="text" bind:value={toValue} inputmode="decimal" />
|
|
106
|
+
</label>
|
|
107
|
+
<label class="field">
|
|
108
|
+
<span>{t('goalSeek.byChanging')}</span>
|
|
109
|
+
<input type="text" bind:value={byCell} spellcheck="false" />
|
|
110
|
+
</label>
|
|
111
|
+
{#if problem}<p class="status problem" role="alert">{problem}</p>{/if}
|
|
112
|
+
</form>
|
|
113
|
+
{:else if found}
|
|
114
|
+
<div class="sv-sheet-dialog">
|
|
115
|
+
<p class="lead">
|
|
116
|
+
{t(found.converged ? 'goalSeek.found' : 'goalSeek.notFound', { cell: setCell.toUpperCase() })}
|
|
117
|
+
</p>
|
|
118
|
+
<dl class="facts">
|
|
119
|
+
<dt>{t('goalSeek.target')}</dt><dd>{money(Number(toValue))}</dd>
|
|
120
|
+
<dt>{t('goalSeek.current')}</dt><dd>{money(found.result)}</dd>
|
|
121
|
+
<dt>{t('goalSeek.becomes', { cell: byCell.toUpperCase() })}</dt><dd>{money(round(found.value))}</dd>
|
|
122
|
+
</dl>
|
|
123
|
+
<p class="status">{t('goalSeek.iterations', { count: found.iterations })}</p>
|
|
124
|
+
</div>
|
|
125
|
+
{/if}
|
|
126
|
+
{#snippet footer()}
|
|
127
|
+
<div class="sv-sheet-dialog-buttons">
|
|
128
|
+
<button type="button" class="btn primary" onclick={step === 'ask' ? solve : keep}>{t('ok')}</button>
|
|
129
|
+
<button type="button" class="btn" onclick={close}>{t('cancel')}</button>
|
|
130
|
+
</div>
|
|
131
|
+
{/snippet}
|
|
132
|
+
</SvModal>
|
|
133
|
+
|
|
134
|
+
<style>
|
|
135
|
+
.lead { margin: 0; }
|
|
136
|
+
.facts {
|
|
137
|
+
display: grid;
|
|
138
|
+
grid-template-columns: auto 1fr;
|
|
139
|
+
gap: 4px 12px;
|
|
140
|
+
margin: 0;
|
|
141
|
+
}
|
|
142
|
+
.facts dt { color: var(--sg-muted, #616161); }
|
|
143
|
+
.facts dd { margin: 0; font-variant-numeric: tabular-nums; }
|
|
144
|
+
.problem { color: var(--sg-danger, #dc2626); }
|
|
145
|
+
</style>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GridCommandContext } from '@svgrid/grid/shortcuts';
|
|
2
|
+
import type { Workbook } from './sheet/workbook.js';
|
|
3
|
+
type Props = {
|
|
4
|
+
open?: boolean;
|
|
5
|
+
workbook: Workbook;
|
|
6
|
+
/** The command context the dialog was opened with. */
|
|
7
|
+
cmd: () => GridCommandContext | null;
|
|
8
|
+
onClose?: () => void;
|
|
9
|
+
};
|
|
10
|
+
declare const SvSheetGoalSeek: import("svelte").Component<Props, {}, "open">;
|
|
11
|
+
type SvSheetGoalSeek = ReturnType<typeof SvSheetGoalSeek>;
|
|
12
|
+
export default SvSheetGoalSeek;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Excel's Insert Function: search or pick a category, choose a function,
|
|
4
|
+
* read its argument list and what it does, and OK starts the active cell
|
|
5
|
+
* on `=NAME(` with the caret inside the parentheses, where the formula
|
|
6
|
+
* bar's autocomplete and signature hint take over. Excel follows with a
|
|
7
|
+
* Function Arguments dialog; typing the arguments in place with the
|
|
8
|
+
* signature shown is the same information with less chrome.
|
|
9
|
+
*/
|
|
10
|
+
import { useSheetText } from './sheet-text'
|
|
11
|
+
import { SvModal } from '@svgrid/grid'
|
|
12
|
+
import { functionCatalog, FUNCTION_GROUPS, type FunctionGroup, type FunctionInfo } from './sheet/function-catalog'
|
|
13
|
+
|
|
14
|
+
type Props = {
|
|
15
|
+
open?: boolean
|
|
16
|
+
onPick: (name: string) => void
|
|
17
|
+
onClose?: () => void
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let { open = $bindable(false), onPick, onClose }: Props = $props()
|
|
21
|
+
const t = useSheetText()
|
|
22
|
+
|
|
23
|
+
const all = functionCatalog()
|
|
24
|
+
let search = $state('')
|
|
25
|
+
let group = $state<FunctionGroup | 'All'>('All')
|
|
26
|
+
let selected = $state<string>(all[0]?.name ?? '')
|
|
27
|
+
let searchInput = $state<HTMLInputElement | null>(null)
|
|
28
|
+
|
|
29
|
+
const shown = $derived.by<FunctionInfo[]>(() => {
|
|
30
|
+
const needle = search.trim().toUpperCase()
|
|
31
|
+
return all.filter((f) =>
|
|
32
|
+
(group === 'All' || f.group === group) &&
|
|
33
|
+
(needle === '' || f.name.includes(needle) || f.description.toUpperCase().includes(needle)),
|
|
34
|
+
)
|
|
35
|
+
})
|
|
36
|
+
const current = $derived(all.find((f) => f.name === selected) ?? null)
|
|
37
|
+
|
|
38
|
+
// The highlighted function follows the filter, so Enter always inserts
|
|
39
|
+
// something visible.
|
|
40
|
+
$effect(() => {
|
|
41
|
+
if (shown.length && !shown.some((f) => f.name === selected)) selected = shown[0]!.name
|
|
42
|
+
})
|
|
43
|
+
$effect(() => {
|
|
44
|
+
if (open) queueMicrotask(() => searchInput?.focus())
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
function ok() {
|
|
48
|
+
if (!current) return
|
|
49
|
+
onPick(current.name)
|
|
50
|
+
open = false
|
|
51
|
+
onClose?.()
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function close() {
|
|
55
|
+
open = false
|
|
56
|
+
onClose?.()
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function onListKey(event: KeyboardEvent) {
|
|
60
|
+
const index = shown.findIndex((f) => f.name === selected)
|
|
61
|
+
if (event.key === 'ArrowDown') {
|
|
62
|
+
event.preventDefault()
|
|
63
|
+
selected = shown[Math.min(index + 1, shown.length - 1)]?.name ?? selected
|
|
64
|
+
} else if (event.key === 'ArrowUp') {
|
|
65
|
+
event.preventDefault()
|
|
66
|
+
selected = shown[Math.max(index - 1, 0)]?.name ?? selected
|
|
67
|
+
} else if (event.key === 'Enter') {
|
|
68
|
+
event.preventDefault()
|
|
69
|
+
ok()
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<SvModal bind:open onClose={onClose} title={t('insertFunction.title')} size="md">
|
|
75
|
+
<div class="sv-sheet-dialog insert" role="group" aria-label={t('insertFunction.title')}>
|
|
76
|
+
<label class="field">
|
|
77
|
+
<span>{t('insertFunction.search')}</span>
|
|
78
|
+
<input bind:this={searchInput} type="text" bind:value={search} onkeydown={onListKey} spellcheck="false" autocomplete="off" placeholder={t('insertFunction.searchPlaceholder')} />
|
|
79
|
+
</label>
|
|
80
|
+
<label class="field">
|
|
81
|
+
<span>{t('insertFunction.category')}</span>
|
|
82
|
+
<select bind:value={group}>
|
|
83
|
+
<option value="All">{t('insertFunction.all')}</option>
|
|
84
|
+
{#each FUNCTION_GROUPS as g (g)}
|
|
85
|
+
<option value={g}>{t(`insertFunction.group.${g}`)}</option>
|
|
86
|
+
{/each}
|
|
87
|
+
</select>
|
|
88
|
+
</label>
|
|
89
|
+
<div class="label">{t('insertFunction.select')}</div>
|
|
90
|
+
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
91
|
+
<ul class="list" role="listbox" aria-label={t('insertFunction.functions')} tabindex="0" onkeydown={onListKey}>
|
|
92
|
+
{#each shown as fn (fn.name)}
|
|
93
|
+
<!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_noninteractive_element_interactions -->
|
|
94
|
+
<li
|
|
95
|
+
role="option"
|
|
96
|
+
aria-selected={fn.name === selected}
|
|
97
|
+
class:selected={fn.name === selected}
|
|
98
|
+
onclick={() => (selected = fn.name)}
|
|
99
|
+
ondblclick={ok}
|
|
100
|
+
>{fn.name}</li>
|
|
101
|
+
{:else}
|
|
102
|
+
<li class="empty">{t('insertFunction.noMatch')}</li>
|
|
103
|
+
{/each}
|
|
104
|
+
</ul>
|
|
105
|
+
{#if current}
|
|
106
|
+
<div class="about">
|
|
107
|
+
<div class="signature">{current.signature}</div>
|
|
108
|
+
<div class="description">{current.description || t('insertFunction.noDescription')}</div>
|
|
109
|
+
</div>
|
|
110
|
+
{/if}
|
|
111
|
+
</div>
|
|
112
|
+
{#snippet footer()}
|
|
113
|
+
<div class="sv-sheet-dialog-buttons">
|
|
114
|
+
<button type="button" class="btn primary" onclick={ok} disabled={!current}>{t('ok')}</button>
|
|
115
|
+
<button type="button" class="btn" onclick={close}>{t('cancel')}</button>
|
|
116
|
+
</div>
|
|
117
|
+
{/snippet}
|
|
118
|
+
</SvModal>
|
|
119
|
+
|
|
120
|
+
<style>
|
|
121
|
+
.label { font-weight: 600; }
|
|
122
|
+
.insert :global(.field) { grid-template-columns: 160px 1fr; }
|
|
123
|
+
.list {
|
|
124
|
+
height: 160px;
|
|
125
|
+
margin: 0;
|
|
126
|
+
padding: 2px 0;
|
|
127
|
+
overflow-y: auto;
|
|
128
|
+
list-style: none;
|
|
129
|
+
background: var(--sg-bg, #fff);
|
|
130
|
+
border: 1px solid var(--sg-border, #d1d1d1);
|
|
131
|
+
border-radius: var(--sg-radius, 3px);
|
|
132
|
+
font-family: ui-monospace, Consolas, monospace;
|
|
133
|
+
font-size: 12px;
|
|
134
|
+
}
|
|
135
|
+
.list:focus { outline: none; border-color: var(--sg-accent, #217346); }
|
|
136
|
+
.list li {
|
|
137
|
+
padding: 2px 8px;
|
|
138
|
+
cursor: default;
|
|
139
|
+
}
|
|
140
|
+
.list li:hover { background: var(--sg-row-hover-bg, #f5f5f5); }
|
|
141
|
+
.list li.selected {
|
|
142
|
+
color: var(--sg-on-accent, #fff);
|
|
143
|
+
background: var(--sg-accent, #217346);
|
|
144
|
+
}
|
|
145
|
+
.list li.empty { color: var(--sg-muted, #616161); font-family: inherit; }
|
|
146
|
+
.about { display: flex; flex-direction: column; gap: 4px; min-height: 52px; }
|
|
147
|
+
.signature { font-weight: 600; font-family: ui-monospace, Consolas, monospace; font-size: 12px; }
|
|
148
|
+
.description { color: var(--sg-muted, #616161); }
|
|
149
|
+
</style>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
open?: boolean;
|
|
3
|
+
onPick: (name: string) => void;
|
|
4
|
+
onClose?: () => void;
|
|
5
|
+
};
|
|
6
|
+
declare const SvSheetInsertFunction: import("svelte").Component<Props, {}, "open">;
|
|
7
|
+
type SvSheetInsertFunction = ReturnType<typeof SvSheetInsertFunction>;
|
|
8
|
+
export default SvSheetInsertFunction;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Excel's File > Options > Formulas > Calculation options, raised to the
|
|
4
|
+
* Formulas tab because it is the one setting there that changes what a
|
|
5
|
+
* formula is worth: with iteration on a circular reference settles on its
|
|
6
|
+
* fixed point instead of showing #CYCLE!.
|
|
7
|
+
*/
|
|
8
|
+
import { SvModal } from '@svgrid/grid'
|
|
9
|
+
import { useSheetText } from './sheet-text'
|
|
10
|
+
import type { IterationSettings } from './sheet/workbook'
|
|
11
|
+
|
|
12
|
+
type Props = {
|
|
13
|
+
open?: boolean
|
|
14
|
+
iteration: IterationSettings
|
|
15
|
+
onApply: (next: IterationSettings) => void
|
|
16
|
+
onClose?: () => void
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let { open = $bindable(false), iteration, onApply, onClose }: Props = $props()
|
|
20
|
+
const t = useSheetText()
|
|
21
|
+
|
|
22
|
+
let enabled = $state(false)
|
|
23
|
+
let passes = $state('100')
|
|
24
|
+
let change = $state('0.001')
|
|
25
|
+
let error = $state('')
|
|
26
|
+
let first = $state<HTMLInputElement | null>(null)
|
|
27
|
+
|
|
28
|
+
$effect(() => {
|
|
29
|
+
if (!open) return
|
|
30
|
+
enabled = iteration.enabled
|
|
31
|
+
passes = String(iteration.maxIterations)
|
|
32
|
+
change = String(iteration.maxChange)
|
|
33
|
+
error = ''
|
|
34
|
+
queueMicrotask(() => first?.focus())
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
function ok() {
|
|
38
|
+
const maxIterations = Number(passes)
|
|
39
|
+
const maxChange = Number(change)
|
|
40
|
+
if (!Number.isFinite(maxIterations) || maxIterations < 1 || !Number.isFinite(maxChange) || maxChange < 0) {
|
|
41
|
+
error = t('iteration.badNumbers')
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
open = false
|
|
45
|
+
onApply({ enabled, maxIterations: Math.round(maxIterations), maxChange })
|
|
46
|
+
onClose?.()
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function close() {
|
|
50
|
+
open = false
|
|
51
|
+
onClose?.()
|
|
52
|
+
}
|
|
53
|
+
</script>
|
|
54
|
+
|
|
55
|
+
<SvModal bind:open onClose={onClose} title={t('iteration.title')} size="sm">
|
|
56
|
+
<form class="sv-sheet-dialog" onsubmit={(e) => { e.preventDefault(); ok() }}>
|
|
57
|
+
<label class="check"><input type="checkbox" bind:this={first} bind:checked={enabled} /> {t('iteration.enable')}</label>
|
|
58
|
+
<label class="field">
|
|
59
|
+
<span>{t('iteration.maxIterations')}</span>
|
|
60
|
+
<input type="number" min="1" step="1" bind:value={passes} disabled={!enabled} />
|
|
61
|
+
</label>
|
|
62
|
+
<label class="field">
|
|
63
|
+
<span>{t('iteration.maxChange')}</span>
|
|
64
|
+
<input type="number" min="0" step="0.0001" bind:value={change} disabled={!enabled} />
|
|
65
|
+
</label>
|
|
66
|
+
{#if error}<p class="error">{error}</p>{/if}
|
|
67
|
+
<p class="hint">{t('iteration.hint')}</p>
|
|
68
|
+
</form>
|
|
69
|
+
{#snippet footer()}
|
|
70
|
+
<div class="sv-sheet-dialog-buttons">
|
|
71
|
+
<span class="spacer"></span>
|
|
72
|
+
<button type="button" class="btn primary" onclick={ok}>{t('ok')}</button>
|
|
73
|
+
<button type="button" class="btn" onclick={close}>{t('cancel')}</button>
|
|
74
|
+
</div>
|
|
75
|
+
{/snippet}
|
|
76
|
+
</SvModal>
|
|
77
|
+
|
|
78
|
+
<style>
|
|
79
|
+
.spacer { flex: 1; }
|
|
80
|
+
.error { margin: 4px 0 0; color: var(--sg-danger, #c42b1c); font-size: 12px; }
|
|
81
|
+
</style>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IterationSettings } from './sheet/workbook.js';
|
|
2
|
+
type Props = {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
iteration: IterationSettings;
|
|
5
|
+
onApply: (next: IterationSettings) => void;
|
|
6
|
+
onClose?: () => void;
|
|
7
|
+
};
|
|
8
|
+
declare const SvSheetIteration: import("svelte").Component<Props, {}, "open">;
|
|
9
|
+
type SvSheetIteration = ReturnType<typeof SvSheetIteration>;
|
|
10
|
+
export default SvSheetIteration;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Excel's Insert Hyperlink dialog, as the three fields that matter: where
|
|
4
|
+
* it goes, what the cell says, and what hovering says. Opened by
|
|
5
|
+
* Insert > Link or Ctrl+K, and again on a cell that already has one,
|
|
6
|
+
* which is how a link is edited.
|
|
7
|
+
*/
|
|
8
|
+
import { SvModal } from '@svgrid/grid'
|
|
9
|
+
import { useSheetText } from './sheet-text'
|
|
10
|
+
import { isSafeLinkTarget, parseLinkTarget, type SheetLink } from './sheet/links'
|
|
11
|
+
|
|
12
|
+
type Props = {
|
|
13
|
+
open?: boolean
|
|
14
|
+
/** The link as it stands, or a blank one for a cell that has none. */
|
|
15
|
+
link: SheetLink
|
|
16
|
+
/** What the cell shows right now, offered as the text. */
|
|
17
|
+
text: string
|
|
18
|
+
/** The cell's address, for the title. */
|
|
19
|
+
where: string
|
|
20
|
+
existing?: boolean
|
|
21
|
+
onApply: (link: SheetLink, text: string) => void
|
|
22
|
+
onRemove?: () => void
|
|
23
|
+
onClose?: () => void
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let { open = $bindable(false), link, text, where, existing = false, onApply, onRemove, onClose }: Props = $props()
|
|
27
|
+
const t = useSheetText()
|
|
28
|
+
|
|
29
|
+
let address = $state('')
|
|
30
|
+
let label = $state('')
|
|
31
|
+
let tip = $state('')
|
|
32
|
+
let error = $state('')
|
|
33
|
+
let first = $state<HTMLInputElement | null>(null)
|
|
34
|
+
|
|
35
|
+
$effect(() => {
|
|
36
|
+
if (!open) return
|
|
37
|
+
address = link.target
|
|
38
|
+
label = text
|
|
39
|
+
tip = link.tip ?? ''
|
|
40
|
+
error = ''
|
|
41
|
+
queueMicrotask(() => first?.focus())
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
function ok() {
|
|
45
|
+
const target = parseLinkTarget(address)
|
|
46
|
+
if (!target) {
|
|
47
|
+
// Two ways to have no target, and they are not the same mistake: an
|
|
48
|
+
// address nobody typed, and one carrying a scheme this shell will not
|
|
49
|
+
// open. Telling the second one it is empty sends the user back to a
|
|
50
|
+
// field that is not.
|
|
51
|
+
error = address.trim() && !isSafeLinkTarget(address) ? t('link.unsafeScheme') : t('link.badAddress')
|
|
52
|
+
return
|
|
53
|
+
}
|
|
54
|
+
const next: SheetLink = { target: address.trim() }
|
|
55
|
+
if (tip.trim()) next.tip = tip.trim()
|
|
56
|
+
open = false
|
|
57
|
+
onApply(next, label)
|
|
58
|
+
onClose?.()
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function close() {
|
|
62
|
+
open = false
|
|
63
|
+
onClose?.()
|
|
64
|
+
}
|
|
65
|
+
</script>
|
|
66
|
+
|
|
67
|
+
<SvModal bind:open onClose={onClose} title={`${t('link.title')} – ${where}`} size="sm">
|
|
68
|
+
<form class="sv-sheet-dialog" onsubmit={(e) => { e.preventDefault(); ok() }}>
|
|
69
|
+
<label class="field">
|
|
70
|
+
<span>{t('link.address')}</span>
|
|
71
|
+
<input type="text" bind:this={first} bind:value={address} spellcheck="false" placeholder={t('link.addressPlaceholder')} />
|
|
72
|
+
</label>
|
|
73
|
+
<label class="field">
|
|
74
|
+
<span>{t('link.text')}</span>
|
|
75
|
+
<input type="text" bind:value={label} placeholder={t('link.textPlaceholder')} />
|
|
76
|
+
</label>
|
|
77
|
+
<label class="field">
|
|
78
|
+
<span>{t('link.tip')}</span>
|
|
79
|
+
<input type="text" bind:value={tip} placeholder={t('link.tipPlaceholder')} />
|
|
80
|
+
</label>
|
|
81
|
+
{#if error}<p class="error">{error}</p>{/if}
|
|
82
|
+
<p class="hint">{t('link.hint')}</p>
|
|
83
|
+
</form>
|
|
84
|
+
{#snippet footer()}
|
|
85
|
+
<div class="sv-sheet-dialog-buttons">
|
|
86
|
+
{#if existing && onRemove}
|
|
87
|
+
<button type="button" class="btn" onclick={() => { open = false; onRemove?.() }}>{t('link.remove')}</button>
|
|
88
|
+
{/if}
|
|
89
|
+
<span class="spacer"></span>
|
|
90
|
+
<button type="button" class="btn primary" onclick={ok}>{t('ok')}</button>
|
|
91
|
+
<button type="button" class="btn" onclick={close}>{t('cancel')}</button>
|
|
92
|
+
</div>
|
|
93
|
+
{/snippet}
|
|
94
|
+
</SvModal>
|
|
95
|
+
|
|
96
|
+
<style>
|
|
97
|
+
.spacer { flex: 1; }
|
|
98
|
+
.error { margin: 4px 0 0; color: var(--sg-danger, #c42b1c); font-size: 12px; }
|
|
99
|
+
</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type SheetLink } from './sheet/links.js';
|
|
2
|
+
type Props = {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
/** The link as it stands, or a blank one for a cell that has none. */
|
|
5
|
+
link: SheetLink;
|
|
6
|
+
/** What the cell shows right now, offered as the text. */
|
|
7
|
+
text: string;
|
|
8
|
+
/** The cell's address, for the title. */
|
|
9
|
+
where: string;
|
|
10
|
+
existing?: boolean;
|
|
11
|
+
onApply: (link: SheetLink, text: string) => void;
|
|
12
|
+
onRemove?: () => void;
|
|
13
|
+
onClose?: () => void;
|
|
14
|
+
};
|
|
15
|
+
declare const SvSheetLink: import("svelte").Component<Props, {}, "open">;
|
|
16
|
+
type SvSheetLink = ReturnType<typeof SvSheetLink>;
|
|
17
|
+
export default SvSheetLink;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* The list a validated cell drops down: Excel's in-cell dropdown. The
|
|
4
|
+
* choices as the rule lists them, the current value marked, arrow keys
|
|
5
|
+
* and Enter to pick, Escape to leave the cell as it is. The shell mounts
|
|
6
|
+
* it inside the popover anchored to the cell.
|
|
7
|
+
*/
|
|
8
|
+
import { useSheetText } from './sheet-text'
|
|
9
|
+
type Props = {
|
|
10
|
+
choices: ReadonlyArray<string>
|
|
11
|
+
/** The cell's current text, marked in the list. */
|
|
12
|
+
value: string
|
|
13
|
+
onPick: (choice: string) => void
|
|
14
|
+
onCancel: () => void
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let { choices, value, onPick, onCancel }: Props = $props()
|
|
18
|
+
const t = useSheetText()
|
|
19
|
+
|
|
20
|
+
let list = $state<HTMLDivElement | null>(null)
|
|
21
|
+
let index = $state(0)
|
|
22
|
+
|
|
23
|
+
$effect(() => {
|
|
24
|
+
const at = choices.findIndex((c) => c.toLowerCase() === value.trim().toLowerCase())
|
|
25
|
+
index = at >= 0 ? at : 0
|
|
26
|
+
queueMicrotask(() => list?.focus())
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
function onKeyDown(event: KeyboardEvent) {
|
|
30
|
+
if (event.key === 'ArrowDown') { event.preventDefault(); index = Math.min(index + 1, choices.length - 1); scrollTo() }
|
|
31
|
+
else if (event.key === 'ArrowUp') { event.preventDefault(); index = Math.max(index - 1, 0); scrollTo() }
|
|
32
|
+
else if (event.key === 'Home') { event.preventDefault(); index = 0; scrollTo() }
|
|
33
|
+
else if (event.key === 'End') { event.preventDefault(); index = choices.length - 1; scrollTo() }
|
|
34
|
+
else if (event.key === 'Enter' || event.key === 'Tab') { event.preventDefault(); const c = choices[index]; if (c !== undefined) onPick(c) }
|
|
35
|
+
else if (event.key === 'Escape') { event.preventDefault(); onCancel() }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function scrollTo() {
|
|
39
|
+
list?.querySelector<HTMLElement>(`[data-index="${index}"]`)?.scrollIntoView({ block: 'nearest' })
|
|
40
|
+
}
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<div
|
|
44
|
+
bind:this={list}
|
|
45
|
+
class="sv-sheet-list-picker"
|
|
46
|
+
role="listbox"
|
|
47
|
+
aria-label={t('choices')}
|
|
48
|
+
tabindex="0"
|
|
49
|
+
aria-activedescendant={choices.length ? `sv-sheet-choice-${index}` : undefined}
|
|
50
|
+
onkeydown={onKeyDown}
|
|
51
|
+
>
|
|
52
|
+
{#if choices.length === 0}
|
|
53
|
+
<div class="empty">{t('listEmpty')}</div>
|
|
54
|
+
{:else}
|
|
55
|
+
{#each choices as choice, i (i)}
|
|
56
|
+
<!-- svelte-ignore a11y_click_events_have_key_events, a11y_interactive_supports_focus -->
|
|
57
|
+
<div
|
|
58
|
+
id={`sv-sheet-choice-${i}`}
|
|
59
|
+
class="choice"
|
|
60
|
+
class:on={i === index}
|
|
61
|
+
role="option"
|
|
62
|
+
aria-selected={i === index}
|
|
63
|
+
data-index={i}
|
|
64
|
+
onpointermove={() => (index = i)}
|
|
65
|
+
onclick={() => onPick(choice)}
|
|
66
|
+
>{choice}</div>
|
|
67
|
+
{/each}
|
|
68
|
+
{/if}
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<style>
|
|
72
|
+
.sv-sheet-list-picker {
|
|
73
|
+
min-width: 120px;
|
|
74
|
+
max-width: 320px;
|
|
75
|
+
max-height: 200px;
|
|
76
|
+
overflow-y: auto;
|
|
77
|
+
padding: 4px 0;
|
|
78
|
+
font-size: 12px;
|
|
79
|
+
color: var(--sg-fg, #242424);
|
|
80
|
+
outline: none;
|
|
81
|
+
}
|
|
82
|
+
.choice {
|
|
83
|
+
padding: 4px 10px;
|
|
84
|
+
white-space: nowrap;
|
|
85
|
+
overflow: hidden;
|
|
86
|
+
text-overflow: ellipsis;
|
|
87
|
+
cursor: default;
|
|
88
|
+
}
|
|
89
|
+
.choice.on { background: var(--sg-selection-bg, rgba(16, 124, 65, 0.12)); }
|
|
90
|
+
.empty { padding: 4px 10px; color: var(--sg-muted, #616161); }
|
|
91
|
+
</style>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
choices: ReadonlyArray<string>;
|
|
3
|
+
/** The cell's current text, marked in the list. */
|
|
4
|
+
value: string;
|
|
5
|
+
onPick: (choice: string) => void;
|
|
6
|
+
onCancel: () => void;
|
|
7
|
+
};
|
|
8
|
+
declare const SvSheetListPicker: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type SvSheetListPicker = ReturnType<typeof SvSheetListPicker>;
|
|
10
|
+
export default SvSheetListPicker;
|