@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,159 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Excel's small conditional-formatting dialogs, one component: Greater
|
|
4
|
+
* Than..., Less Than..., Between..., Equal To..., Text that Contains...,
|
|
5
|
+
* Duplicate Values..., Top 10 Items..., Bottom 10 Items..., Above Average
|
|
6
|
+
* and Below Average. Each is a sentence with its inputs and the "with"
|
|
7
|
+
* picker of Excel's six styles. It opens empty for a new rule from the
|
|
8
|
+
* ribbon, or on a rule from Manage Rules > Edit, and hands back the rule's
|
|
9
|
+
* body for the shell to place.
|
|
10
|
+
*/
|
|
11
|
+
import { useSheetText } from './sheet-text'
|
|
12
|
+
import { SvModal } from '@svgrid/grid'
|
|
13
|
+
import { CF_PRESET_STYLES, type CfPreset, type CfBody, type CfStyledRule } from './sheet/conditional-formats'
|
|
14
|
+
|
|
15
|
+
type Props = {
|
|
16
|
+
open?: boolean
|
|
17
|
+
preset: CfPreset
|
|
18
|
+
/** The rule being edited, for Manage Rules > Edit. */
|
|
19
|
+
rule?: CfStyledRule | null
|
|
20
|
+
/** The selection as A1, for the heading. */
|
|
21
|
+
address: string
|
|
22
|
+
onApply: (body: CfBody) => void
|
|
23
|
+
onClose?: () => void
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let { open = $bindable(false), preset, rule = null, address, onApply, onClose }: Props = $props()
|
|
27
|
+
const t = useSheetText()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
let value1 = $state('')
|
|
31
|
+
let value2 = $state('')
|
|
32
|
+
let rank = $state('10')
|
|
33
|
+
let percent = $state(false)
|
|
34
|
+
let unique = $state(false)
|
|
35
|
+
let styleId = $state(CF_PRESET_STYLES[0]!.id)
|
|
36
|
+
let first = $state<HTMLInputElement | HTMLSelectElement | null>(null)
|
|
37
|
+
|
|
38
|
+
$effect(() => {
|
|
39
|
+
if (!open) return
|
|
40
|
+
value1 = ''
|
|
41
|
+
value2 = ''
|
|
42
|
+
rank = '10'
|
|
43
|
+
percent = false
|
|
44
|
+
unique = false
|
|
45
|
+
styleId = CF_PRESET_STYLES[0]!.id
|
|
46
|
+
const r = rule
|
|
47
|
+
if (r) {
|
|
48
|
+
if (r.kind === 'cellIs') { value1 = r.value1; value2 = r.value2 ?? '' }
|
|
49
|
+
else if (r.kind === 'text') value1 = r.value
|
|
50
|
+
else if (r.kind === 'duplicates') unique = !!r.unique
|
|
51
|
+
else if (r.kind === 'topBottom') { rank = String(r.rank); percent = !!r.percent }
|
|
52
|
+
else if (r.kind === 'formula') value1 = r.formula
|
|
53
|
+
const match = CF_PRESET_STYLES.find((p) => JSON.stringify(p.style) === JSON.stringify(r.style))
|
|
54
|
+
if (match) styleId = match.id
|
|
55
|
+
}
|
|
56
|
+
queueMicrotask(() => first?.focus())
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
const needsValue = $derived(preset === 'greater' || preset === 'less' || preset === 'between' || preset === 'equal' || preset === 'text' || preset === 'formula')
|
|
60
|
+
const valid = $derived(
|
|
61
|
+
(!needsValue || value1.trim() !== '')
|
|
62
|
+
&& (preset !== 'between' || value2.trim() !== '')
|
|
63
|
+
&& ((preset !== 'top10' && preset !== 'bottom10') || (Number.isInteger(Number(rank)) && Number(rank) > 0)),
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
function body(): CfBody {
|
|
67
|
+
const style = CF_PRESET_STYLES.find((p) => p.id === styleId)?.style ?? CF_PRESET_STYLES[0]!.style
|
|
68
|
+
switch (preset) {
|
|
69
|
+
case 'greater': return { kind: 'cellIs', operator: 'greater', value1: value1.trim(), style }
|
|
70
|
+
case 'less': return { kind: 'cellIs', operator: 'less', value1: value1.trim(), style }
|
|
71
|
+
case 'between': return { kind: 'cellIs', operator: 'between', value1: value1.trim(), value2: value2.trim(), style }
|
|
72
|
+
case 'equal': return { kind: 'cellIs', operator: 'equal', value1: value1.trim(), style }
|
|
73
|
+
case 'text': return { kind: 'text', match: 'contains', value: value1.trim(), style }
|
|
74
|
+
case 'duplicates': return { kind: 'duplicates', unique, style }
|
|
75
|
+
case 'top10': return { kind: 'topBottom', top: true, rank: Number(rank), percent, style }
|
|
76
|
+
case 'bottom10': return { kind: 'topBottom', top: false, rank: Number(rank), percent, style }
|
|
77
|
+
case 'aboveAverage': return { kind: 'average', above: true, style }
|
|
78
|
+
case 'belowAverage': return { kind: 'average', above: false, style }
|
|
79
|
+
case 'formula': {
|
|
80
|
+
const text = value1.trim()
|
|
81
|
+
return { kind: 'formula', formula: text.startsWith('=') ? text : `=${text}`, style }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function ok() {
|
|
87
|
+
if (!valid) return
|
|
88
|
+
onApply(body())
|
|
89
|
+
open = false
|
|
90
|
+
onClose?.()
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function close() {
|
|
94
|
+
open = false
|
|
95
|
+
onClose?.()
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const sample = $derived(CF_PRESET_STYLES.find((p) => p.id === styleId)?.style ?? {})
|
|
99
|
+
</script>
|
|
100
|
+
|
|
101
|
+
<SvModal bind:open onClose={onClose} title={t(`cf.title.${preset}`)} size="sm" width={440}>
|
|
102
|
+
<form class="sv-sheet-dialog cf" onsubmit={(e) => { e.preventDefault(); ok() }}>
|
|
103
|
+
<div class="where">{address}</div>
|
|
104
|
+
<div class="lead">{t(`cf.lead.${preset}`)}</div>
|
|
105
|
+
<div class="row">
|
|
106
|
+
{#if preset === 'between'}
|
|
107
|
+
<input bind:this={first} type="text" bind:value={value1} aria-label={t('cf.lowerValue')} spellcheck="false" />
|
|
108
|
+
<span>{t('cf.and')}</span>
|
|
109
|
+
<input type="text" bind:value={value2} aria-label={t('cf.upperValue')} spellcheck="false" />
|
|
110
|
+
{:else if needsValue}
|
|
111
|
+
<input bind:this={first} type="text" bind:value={value1} aria-label={t(preset === 'formula' ? 'cf.formula' : 'cf.value')} spellcheck="false" placeholder={preset === 'text' ? t('cf.textPlaceholder') : preset === 'formula' ? '=$B2>100' : t('cf.valuePlaceholder')} />
|
|
112
|
+
{:else if preset === 'duplicates'}
|
|
113
|
+
<select bind:this={first} bind:value={unique} aria-label={t('cf.duplicateOrUnique')}>
|
|
114
|
+
<option value={false}>{t('cf.duplicate')}</option>
|
|
115
|
+
<option value={true}>{t('cf.unique')}</option>
|
|
116
|
+
</select>
|
|
117
|
+
<span>{t('cf.values')}</span>
|
|
118
|
+
{:else if preset === 'top10' || preset === 'bottom10'}
|
|
119
|
+
<input bind:this={first} type="number" min="1" bind:value={rank} aria-label={t('cf.howMany')} />
|
|
120
|
+
<label class="check"><input type="checkbox" bind:checked={percent} /> {t('cf.percentOfRange')}</label>
|
|
121
|
+
{/if}
|
|
122
|
+
<span>{t('cf.with')}</span>
|
|
123
|
+
<select bind:value={styleId} aria-label={t('cf.formatStyle')}>
|
|
124
|
+
{#each CF_PRESET_STYLES as p (p.id)}<option value={p.id}>{t(`cf.style.${p.id}`)}</option>{/each}
|
|
125
|
+
</select>
|
|
126
|
+
</div>
|
|
127
|
+
{#if preset === 'formula'}
|
|
128
|
+
<p class="hint">{t('cf.formulaHint')}</p>
|
|
129
|
+
{/if}
|
|
130
|
+
<div class="sample" style:background={sample.fill ?? 'transparent'} style:color={sample.color ?? 'inherit'}>AaBbCcYyZz</div>
|
|
131
|
+
</form>
|
|
132
|
+
{#snippet footer()}
|
|
133
|
+
<div class="sv-sheet-dialog-buttons">
|
|
134
|
+
<button type="button" class="btn primary" onclick={ok} disabled={!valid}>{t('ok')}</button>
|
|
135
|
+
<button type="button" class="btn" onclick={close}>{t('cancel')}</button>
|
|
136
|
+
</div>
|
|
137
|
+
{/snippet}
|
|
138
|
+
</SvModal>
|
|
139
|
+
|
|
140
|
+
<style>
|
|
141
|
+
.where { color: var(--sg-muted, #616161); }
|
|
142
|
+
.lead { font-weight: 600; }
|
|
143
|
+
.row {
|
|
144
|
+
display: flex;
|
|
145
|
+
flex-wrap: wrap;
|
|
146
|
+
align-items: center;
|
|
147
|
+
gap: 8px;
|
|
148
|
+
}
|
|
149
|
+
.row input[type="text"] { flex: 1 1 110px; min-width: 90px; }
|
|
150
|
+
.row input[type="number"] { width: 64px; }
|
|
151
|
+
.row select { max-width: 240px; }
|
|
152
|
+
.sample {
|
|
153
|
+
width: 120px;
|
|
154
|
+
padding: 4px 10px;
|
|
155
|
+
border: 1px solid var(--sg-border, #d1d1d1);
|
|
156
|
+
border-radius: var(--sg-radius, 3px);
|
|
157
|
+
text-align: center;
|
|
158
|
+
}
|
|
159
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type CfPreset, type CfBody, type CfStyledRule } from './sheet/conditional-formats.js';
|
|
2
|
+
type Props = {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
preset: CfPreset;
|
|
5
|
+
/** The rule being edited, for Manage Rules > Edit. */
|
|
6
|
+
rule?: CfStyledRule | null;
|
|
7
|
+
/** The selection as A1, for the heading. */
|
|
8
|
+
address: string;
|
|
9
|
+
onApply: (body: CfBody) => void;
|
|
10
|
+
onClose?: () => void;
|
|
11
|
+
};
|
|
12
|
+
declare const SvSheetConditionalFormat: import("svelte").Component<Props, {}, "open">;
|
|
13
|
+
type SvSheetConditionalFormat = ReturnType<typeof SvSheetConditionalFormat>;
|
|
14
|
+
export default SvSheetConditionalFormat;
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Excel's Data Validation dialog, its three tabs: Settings (Allow, Data,
|
|
4
|
+
* the bounds or the source, Ignore blank, In-cell dropdown), Input
|
|
5
|
+
* Message (shown under the cell while it is selected) and Error Alert
|
|
6
|
+
* (Style, Title, Message). It opens on the rule
|
|
7
|
+
* at the active cell and, on OK, hands back one rule for the shell to put
|
|
8
|
+
* over the selection; Clear All removes the validation from the selection.
|
|
9
|
+
*/
|
|
10
|
+
import { useSheetText } from './sheet-text'
|
|
11
|
+
import { SvModal } from '@svgrid/grid'
|
|
12
|
+
import {
|
|
13
|
+
OPERATOR_LABELS,
|
|
14
|
+
type ValidationRule, type ValidationAllow, type ValidationOperator, type ValidationSpec,
|
|
15
|
+
} from './sheet/validation'
|
|
16
|
+
|
|
17
|
+
type Props = {
|
|
18
|
+
open?: boolean
|
|
19
|
+
/** The rule at the active cell, what the dialog opens on. */
|
|
20
|
+
rule: ValidationRule | undefined
|
|
21
|
+
/** The selection as A1, for the heading. */
|
|
22
|
+
address: string
|
|
23
|
+
onApply: (spec: ValidationSpec) => void
|
|
24
|
+
onClear: () => void
|
|
25
|
+
onClose?: () => void
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let { open = $bindable(false), rule, address, onApply, onClear, onClose }: Props = $props()
|
|
29
|
+
const t = useSheetText()
|
|
30
|
+
|
|
31
|
+
type Tab = 'settings' | 'input' | 'alert'
|
|
32
|
+
let tab = $state<Tab>('settings')
|
|
33
|
+
|
|
34
|
+
const ALLOWS: ReadonlyArray<{ id: ValidationAllow; label: string }> = [
|
|
35
|
+
{ id: 'any', label: 'validation.allow.any' },
|
|
36
|
+
{ id: 'whole', label: 'validation.allow.whole' },
|
|
37
|
+
{ id: 'decimal', label: 'validation.allow.decimal' },
|
|
38
|
+
{ id: 'list', label: 'validation.allow.list' },
|
|
39
|
+
{ id: 'date', label: 'validation.allow.date' },
|
|
40
|
+
{ id: 'textLength', label: 'validation.allow.textLength' },
|
|
41
|
+
{ id: 'custom', label: 'validation.allow.custom' },
|
|
42
|
+
]
|
|
43
|
+
const OPERATORS = Object.keys(OPERATOR_LABELS) as ValidationOperator[]
|
|
44
|
+
|
|
45
|
+
let allow = $state<ValidationAllow>('any')
|
|
46
|
+
let operator = $state<ValidationOperator>('between')
|
|
47
|
+
let value1 = $state('')
|
|
48
|
+
let value2 = $state('')
|
|
49
|
+
let ignoreBlank = $state(true)
|
|
50
|
+
let inCellDropdown = $state(true)
|
|
51
|
+
let style = $state<'stop' | 'warning'>('stop')
|
|
52
|
+
let title = $state('')
|
|
53
|
+
let message = $state('')
|
|
54
|
+
let showInput = $state(true)
|
|
55
|
+
let inputTitle = $state('')
|
|
56
|
+
let inputMessage = $state('')
|
|
57
|
+
let first = $state<HTMLSelectElement | null>(null)
|
|
58
|
+
|
|
59
|
+
$effect(() => {
|
|
60
|
+
if (!open) return
|
|
61
|
+
tab = 'settings'
|
|
62
|
+
allow = rule?.allow ?? 'any'
|
|
63
|
+
operator = rule?.operator ?? 'between'
|
|
64
|
+
value1 = rule?.value1 ?? ''
|
|
65
|
+
value2 = rule?.value2 ?? ''
|
|
66
|
+
ignoreBlank = rule?.ignoreBlank ?? true
|
|
67
|
+
inCellDropdown = rule?.inCellDropdown ?? true
|
|
68
|
+
style = rule?.alert.style ?? 'stop'
|
|
69
|
+
title = rule?.alert.title ?? ''
|
|
70
|
+
message = rule?.alert.message ?? ''
|
|
71
|
+
showInput = rule ? rule.input !== undefined : true
|
|
72
|
+
inputTitle = rule?.input?.title ?? ''
|
|
73
|
+
inputMessage = rule?.input?.message ?? ''
|
|
74
|
+
queueMicrotask(() => first?.focus())
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
const bounded = $derived(allow === 'whole' || allow === 'decimal' || allow === 'date' || allow === 'textLength')
|
|
78
|
+
const twoBounds = $derived(operator === 'between' || operator === 'notBetween')
|
|
79
|
+
const firstLabel = $derived(
|
|
80
|
+
allow === 'list' ? t('validation.source')
|
|
81
|
+
: allow === 'custom' ? t('validation.formula')
|
|
82
|
+
: twoBounds ? t(allow === 'date' ? 'validation.startDate' : 'validation.minimum')
|
|
83
|
+
: t(allow === 'date' ? 'validation.date' : allow === 'textLength' ? 'validation.length' : 'validation.value'),
|
|
84
|
+
)
|
|
85
|
+
const secondLabel = $derived(t(allow === 'date' ? 'validation.endDate' : 'validation.maximum'))
|
|
86
|
+
const valid = $derived(
|
|
87
|
+
allow === 'any'
|
|
88
|
+
|| (allow === 'list' && value1.trim() !== '')
|
|
89
|
+
|| (allow === 'custom' && value1.trim() !== '')
|
|
90
|
+
|| (bounded && value1.trim() !== '' && (!twoBounds || value2.trim() !== '')),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
function ok() {
|
|
94
|
+
if (!valid) return
|
|
95
|
+
const spec: ValidationSpec = {
|
|
96
|
+
allow,
|
|
97
|
+
ignoreBlank,
|
|
98
|
+
inCellDropdown: allow === 'list' ? inCellDropdown : false,
|
|
99
|
+
alert: { style, title: title.trim() || undefined, message: message.trim() || undefined },
|
|
100
|
+
}
|
|
101
|
+
// An input message exists when the box is on and there is text to show.
|
|
102
|
+
if (showInput && (inputTitle.trim() || inputMessage.trim())) {
|
|
103
|
+
spec.input = { title: inputTitle.trim() || undefined, message: inputMessage.trim() || undefined }
|
|
104
|
+
}
|
|
105
|
+
if (bounded) {
|
|
106
|
+
spec.operator = operator
|
|
107
|
+
spec.value1 = value1.trim()
|
|
108
|
+
if (twoBounds) spec.value2 = value2.trim()
|
|
109
|
+
} else if (allow === 'list' || allow === 'custom') {
|
|
110
|
+
spec.value1 = value1.trim()
|
|
111
|
+
}
|
|
112
|
+
onApply(spec)
|
|
113
|
+
open = false
|
|
114
|
+
onClose?.()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function clearAll() {
|
|
118
|
+
onClear()
|
|
119
|
+
open = false
|
|
120
|
+
onClose?.()
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function close() {
|
|
124
|
+
open = false
|
|
125
|
+
onClose?.()
|
|
126
|
+
}
|
|
127
|
+
</script>
|
|
128
|
+
|
|
129
|
+
<SvModal bind:open onClose={onClose} title={t('validation.title')} size="sm" width={400}>
|
|
130
|
+
<form class="sv-sheet-dialog validation" onsubmit={(e) => { e.preventDefault(); ok() }}>
|
|
131
|
+
<div class="where">{address}</div>
|
|
132
|
+
<div class="tabs" role="tablist" aria-label={t('validation.tabs')}>
|
|
133
|
+
{#each ['settings', 'input', 'alert'] as id (id)}
|
|
134
|
+
<button type="button" role="tab" class="tab" class:on={tab === id} aria-selected={tab === id} onclick={() => (tab = id as Tab)}>{t(`validation.tab.${id}`)}</button>
|
|
135
|
+
{/each}
|
|
136
|
+
</div>
|
|
137
|
+
<div class="panel" role="tabpanel">
|
|
138
|
+
{#if tab === 'settings'}
|
|
139
|
+
<div class="lead">{t('validation.criteria')}</div>
|
|
140
|
+
<label class="field">
|
|
141
|
+
<span>{t('validation.allow')}</span>
|
|
142
|
+
<select bind:this={first} bind:value={allow}>
|
|
143
|
+
{#each ALLOWS as a (a.id)}<option value={a.id}>{t(a.label)}</option>{/each}
|
|
144
|
+
</select>
|
|
145
|
+
</label>
|
|
146
|
+
{#if bounded}
|
|
147
|
+
<label class="field">
|
|
148
|
+
<span>{t('validation.data')}</span>
|
|
149
|
+
<select bind:value={operator}>
|
|
150
|
+
{#each OPERATORS as id (id)}<option value={id}>{t(`validation.operator.${id}`)}</option>{/each}
|
|
151
|
+
</select>
|
|
152
|
+
</label>
|
|
153
|
+
{/if}
|
|
154
|
+
{#if allow !== 'any'}
|
|
155
|
+
<label class="field">
|
|
156
|
+
<span>{firstLabel}</span>
|
|
157
|
+
<input type="text" bind:value={value1} spellcheck="false" placeholder={allow === 'list' ? t('validation.listPlaceholder') : allow === 'custom' ? '=B1<>""' : ''} />
|
|
158
|
+
</label>
|
|
159
|
+
{/if}
|
|
160
|
+
{#if bounded && twoBounds}
|
|
161
|
+
<label class="field">
|
|
162
|
+
<span>{secondLabel}</span>
|
|
163
|
+
<input type="text" bind:value={value2} spellcheck="false" />
|
|
164
|
+
</label>
|
|
165
|
+
{/if}
|
|
166
|
+
<div class="checks">
|
|
167
|
+
<label class="check"><input type="checkbox" bind:checked={ignoreBlank} /> {t('validation.ignoreBlank')}</label>
|
|
168
|
+
{#if allow === 'list'}
|
|
169
|
+
<label class="check"><input type="checkbox" bind:checked={inCellDropdown} /> {t('validation.inCellDropdown')}</label>
|
|
170
|
+
{/if}
|
|
171
|
+
</div>
|
|
172
|
+
{#if allow === 'custom'}
|
|
173
|
+
<p class="hint">{t('validation.customHint')}</p>
|
|
174
|
+
{:else if allow === 'list'}
|
|
175
|
+
<p class="hint">{t('validation.listHint')}</p>
|
|
176
|
+
{:else if allow !== 'any'}
|
|
177
|
+
<p class="hint">{t('validation.boundHint')}</p>
|
|
178
|
+
{/if}
|
|
179
|
+
{:else if tab === 'input'}
|
|
180
|
+
<label class="check"><input type="checkbox" bind:checked={showInput} /> {t('validation.showInput')}</label>
|
|
181
|
+
<div class="lead">{t('validation.inputLead')}</div>
|
|
182
|
+
<label class="field">
|
|
183
|
+
<span>{t('validation.inputTitle')}</span>
|
|
184
|
+
<input type="text" bind:value={inputTitle} disabled={!showInput} />
|
|
185
|
+
</label>
|
|
186
|
+
<label class="field message">
|
|
187
|
+
<span>{t('validation.inputMessage')}</span>
|
|
188
|
+
<textarea rows="4" bind:value={inputMessage} disabled={!showInput}></textarea>
|
|
189
|
+
</label>
|
|
190
|
+
{:else}
|
|
191
|
+
<div class="lead">{t('validation.alertLead')}</div>
|
|
192
|
+
<label class="field">
|
|
193
|
+
<span>{t('validation.style')}</span>
|
|
194
|
+
<select bind:value={style}>
|
|
195
|
+
<option value="stop">{t('validation.stop')}</option>
|
|
196
|
+
<option value="warning">{t('validation.warning')}</option>
|
|
197
|
+
</select>
|
|
198
|
+
</label>
|
|
199
|
+
<label class="field">
|
|
200
|
+
<span>{t('validation.errorTitle')}</span>
|
|
201
|
+
<input type="text" bind:value={title} />
|
|
202
|
+
</label>
|
|
203
|
+
<label class="field message">
|
|
204
|
+
<span>{t('validation.errorMessage')}</span>
|
|
205
|
+
<textarea rows="4" bind:value={message}></textarea>
|
|
206
|
+
</label>
|
|
207
|
+
<p class="hint">{t('validation.alertHint')}</p>
|
|
208
|
+
{/if}
|
|
209
|
+
</div>
|
|
210
|
+
</form>
|
|
211
|
+
{#snippet footer()}
|
|
212
|
+
<div class="sv-sheet-dialog-buttons">
|
|
213
|
+
<button type="button" class="btn" onclick={clearAll}>{t('validation.clearAll')}</button>
|
|
214
|
+
<span class="spacer"></span>
|
|
215
|
+
<button type="button" class="btn primary" onclick={ok} disabled={!valid}>{t('ok')}</button>
|
|
216
|
+
<button type="button" class="btn" onclick={close}>{t('cancel')}</button>
|
|
217
|
+
</div>
|
|
218
|
+
{/snippet}
|
|
219
|
+
</SvModal>
|
|
220
|
+
|
|
221
|
+
<style>
|
|
222
|
+
.where { color: var(--sg-muted, #616161); }
|
|
223
|
+
.tabs {
|
|
224
|
+
display: flex;
|
|
225
|
+
gap: 2px;
|
|
226
|
+
border-bottom: 1px solid var(--sg-border, #d1d1d1);
|
|
227
|
+
}
|
|
228
|
+
.tab {
|
|
229
|
+
padding: 5px 12px;
|
|
230
|
+
font: inherit;
|
|
231
|
+
font-size: 13px;
|
|
232
|
+
color: var(--sg-muted, #616161);
|
|
233
|
+
background: transparent;
|
|
234
|
+
border: 1px solid transparent;
|
|
235
|
+
border-bottom: 0;
|
|
236
|
+
border-radius: var(--sg-radius, 3px) var(--sg-radius, 3px) 0 0;
|
|
237
|
+
cursor: pointer;
|
|
238
|
+
}
|
|
239
|
+
.tab:hover { color: var(--sg-fg, #242424); }
|
|
240
|
+
.tab.on {
|
|
241
|
+
color: var(--sg-fg, #242424);
|
|
242
|
+
background: var(--sg-bg, #fff);
|
|
243
|
+
border-color: var(--sg-border, #d1d1d1);
|
|
244
|
+
margin-bottom: -1px;
|
|
245
|
+
}
|
|
246
|
+
.panel {
|
|
247
|
+
display: flex;
|
|
248
|
+
flex-direction: column;
|
|
249
|
+
gap: 10px;
|
|
250
|
+
min-height: 220px;
|
|
251
|
+
padding-top: 4px;
|
|
252
|
+
}
|
|
253
|
+
.lead { font-weight: 600; }
|
|
254
|
+
.hint { margin: 0; color: var(--sg-muted, #616161); }
|
|
255
|
+
.field.message { align-items: start; }
|
|
256
|
+
textarea {
|
|
257
|
+
width: 100%;
|
|
258
|
+
box-sizing: border-box;
|
|
259
|
+
padding: 4px 6px;
|
|
260
|
+
font: inherit;
|
|
261
|
+
color: inherit;
|
|
262
|
+
background: var(--sg-bg, #fff);
|
|
263
|
+
border: 1px solid var(--sg-border, #d1d1d1);
|
|
264
|
+
border-radius: var(--sg-radius, 3px);
|
|
265
|
+
resize: vertical;
|
|
266
|
+
}
|
|
267
|
+
textarea:focus {
|
|
268
|
+
outline: none;
|
|
269
|
+
border-color: var(--sg-accent, #217346);
|
|
270
|
+
box-shadow: 0 0 0 1px var(--sg-accent, #217346);
|
|
271
|
+
}
|
|
272
|
+
.spacer { flex: 1; }
|
|
273
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ValidationRule, type ValidationSpec } from './sheet/validation.js';
|
|
2
|
+
type Props = {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
/** The rule at the active cell, what the dialog opens on. */
|
|
5
|
+
rule: ValidationRule | undefined;
|
|
6
|
+
/** The selection as A1, for the heading. */
|
|
7
|
+
address: string;
|
|
8
|
+
onApply: (spec: ValidationSpec) => void;
|
|
9
|
+
onClear: () => void;
|
|
10
|
+
onClose?: () => void;
|
|
11
|
+
};
|
|
12
|
+
declare const SvSheetDataValidation: import("svelte").Component<Props, {}, "open">;
|
|
13
|
+
type SvSheetDataValidation = ReturnType<typeof SvSheetDataValidation>;
|
|
14
|
+
export default SvSheetDataValidation;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Excel's Allow Users to Edit Ranges: the blocks that take an edit while
|
|
4
|
+
* the sheet is protected, locked or not, each with a title. New adds
|
|
5
|
+
* one from a title and an A1 text (`B2:B10`, or several areas with
|
|
6
|
+
* commas), Modify edits one in place, Delete removes it; OK hands the
|
|
7
|
+
* list back as one change, and Protect Sheet... closes this and opens
|
|
8
|
+
* that dialog, as Excel's button does. No password per range.
|
|
9
|
+
*/
|
|
10
|
+
import { useSheetText } from './sheet-text'
|
|
11
|
+
import { SvModal } from '@svgrid/grid'
|
|
12
|
+
import { newEditRangeId, parseRangeText, rangeText, type EditRange } from './sheet/protection'
|
|
13
|
+
|
|
14
|
+
type Props = {
|
|
15
|
+
open?: boolean
|
|
16
|
+
/** The sheet's ranges as they stand. */
|
|
17
|
+
ranges: ReadonlyArray<EditRange>
|
|
18
|
+
/** The selection as A1 text, what a new range's cells open on. */
|
|
19
|
+
selection: string
|
|
20
|
+
onApply: (ranges: EditRange[]) => void
|
|
21
|
+
/** The Protect Sheet... button: the shell opens that dialog. */
|
|
22
|
+
onProtect: () => void
|
|
23
|
+
onClose?: () => void
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let { open = $bindable(false), ranges, selection, onApply, onProtect, onClose }: Props = $props()
|
|
27
|
+
const t = useSheetText()
|
|
28
|
+
|
|
29
|
+
let working = $state<EditRange[]>([])
|
|
30
|
+
let newTitle = $state('')
|
|
31
|
+
let newRefers = $state('')
|
|
32
|
+
let editing = $state<string | null>(null)
|
|
33
|
+
let editTitle = $state('')
|
|
34
|
+
let editRefers = $state('')
|
|
35
|
+
let problem = $state<string | null>(null)
|
|
36
|
+
let titleBox = $state<HTMLInputElement | null>(null)
|
|
37
|
+
|
|
38
|
+
$effect(() => {
|
|
39
|
+
if (!open) return
|
|
40
|
+
const copy = ranges.map((r) => ({ ...r, rects: r.rects.map(([r1, c1, r2, c2]) => [r1, c1, r2, c2] as const) }))
|
|
41
|
+
working = copy
|
|
42
|
+
newTitle = `Range${copy.length + 1}`
|
|
43
|
+
newRefers = selection
|
|
44
|
+
editing = null
|
|
45
|
+
problem = null
|
|
46
|
+
queueMicrotask(() => titleBox?.focus())
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
function add() {
|
|
50
|
+
const rects = parseRangeText(newRefers)
|
|
51
|
+
if (!rects) { problem = t('editRanges.invalidRef', { text: newRefers }); return }
|
|
52
|
+
const title = newTitle.trim() || `Range${working.length + 1}`
|
|
53
|
+
working = [...working, { id: newEditRangeId(), title, rects }]
|
|
54
|
+
newTitle = `Range${working.length + 1}`
|
|
55
|
+
newRefers = ''
|
|
56
|
+
problem = null
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function startEdit(range: EditRange) {
|
|
60
|
+
editing = range.id
|
|
61
|
+
editTitle = range.title
|
|
62
|
+
editRefers = rangeText(range.rects)
|
|
63
|
+
problem = null
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function saveEdit() {
|
|
67
|
+
const rects = parseRangeText(editRefers)
|
|
68
|
+
if (!rects) { problem = t('editRanges.invalidRef', { text: editRefers }); return }
|
|
69
|
+
working = working.map((r) => (r.id === editing ? { ...r, title: editTitle.trim() || r.title, rects } : r))
|
|
70
|
+
editing = null
|
|
71
|
+
problem = null
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function remove(id: string) {
|
|
75
|
+
working = working.filter((r) => r.id !== id)
|
|
76
|
+
if (editing === id) editing = null
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function ok() {
|
|
80
|
+
open = false
|
|
81
|
+
onApply(working)
|
|
82
|
+
onClose?.()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function protect() {
|
|
86
|
+
open = false
|
|
87
|
+
onApply(working)
|
|
88
|
+
onProtect()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function close() {
|
|
92
|
+
open = false
|
|
93
|
+
onClose?.()
|
|
94
|
+
}
|
|
95
|
+
</script>
|
|
96
|
+
|
|
97
|
+
<SvModal bind:open onClose={onClose} title={t('editRanges.title')} size="md">
|
|
98
|
+
<div class="sv-sheet-dialog ranges" role="group" aria-label={t('editRanges.title')}>
|
|
99
|
+
<div class="lead">{t('editRanges.lead')}</div>
|
|
100
|
+
<table class="list">
|
|
101
|
+
<thead>
|
|
102
|
+
<tr><th>{t('editRanges.name')}</th><th>{t('editRanges.refersTo')}</th><th></th></tr>
|
|
103
|
+
</thead>
|
|
104
|
+
<tbody>
|
|
105
|
+
{#each working as range (range.id)}
|
|
106
|
+
<tr>
|
|
107
|
+
{#if editing === range.id}
|
|
108
|
+
<td><input type="text" bind:value={editTitle} aria-label={t('editRanges.name')} spellcheck="false" /></td>
|
|
109
|
+
<td class="mono">
|
|
110
|
+
<input
|
|
111
|
+
type="text"
|
|
112
|
+
bind:value={editRefers}
|
|
113
|
+
aria-label={t('editRanges.refersTo')}
|
|
114
|
+
spellcheck="false"
|
|
115
|
+
onkeydown={(e) => { if (e.key === 'Enter') { e.preventDefault(); saveEdit() } if (e.key === 'Escape') { e.stopPropagation(); editing = null } }}
|
|
116
|
+
/>
|
|
117
|
+
</td>
|
|
118
|
+
<td class="actions">
|
|
119
|
+
<button type="button" class="link" onclick={saveEdit}>{t('save')}</button>
|
|
120
|
+
<button type="button" class="link" onclick={() => (editing = null)}>{t('cancel')}</button>
|
|
121
|
+
</td>
|
|
122
|
+
{:else}
|
|
123
|
+
<td>{range.title}</td>
|
|
124
|
+
<td class="mono">{rangeText(range.rects)}</td>
|
|
125
|
+
<td class="actions">
|
|
126
|
+
<button type="button" class="link" onclick={() => startEdit(range)}>{t('editRanges.modify')}</button>
|
|
127
|
+
<button type="button" class="link" onclick={() => remove(range.id)}>{t('delete')}</button>
|
|
128
|
+
</td>
|
|
129
|
+
{/if}
|
|
130
|
+
</tr>
|
|
131
|
+
{:else}
|
|
132
|
+
<tr><td colspan="3" class="empty">{t('editRanges.empty')}</td></tr>
|
|
133
|
+
{/each}
|
|
134
|
+
</tbody>
|
|
135
|
+
</table>
|
|
136
|
+
<form class="new" onsubmit={(e) => { e.preventDefault(); add() }}>
|
|
137
|
+
<label>
|
|
138
|
+
<span>{t('editRanges.titleField')}</span>
|
|
139
|
+
<input bind:this={titleBox} type="text" bind:value={newTitle} placeholder={t('editRanges.titlePlaceholder')} spellcheck="false" />
|
|
140
|
+
</label>
|
|
141
|
+
<label>
|
|
142
|
+
<span>{t('editRanges.refersField')}</span>
|
|
143
|
+
<input type="text" bind:value={newRefers} placeholder={t('editRanges.refersPlaceholder')} spellcheck="false" />
|
|
144
|
+
</label>
|
|
145
|
+
<button type="submit" class="btn">{t('editRanges.new')}</button>
|
|
146
|
+
</form>
|
|
147
|
+
{#if problem}<p class="status problem" role="alert">{problem}</p>{/if}
|
|
148
|
+
</div>
|
|
149
|
+
{#snippet footer()}
|
|
150
|
+
<div class="sv-sheet-dialog-buttons">
|
|
151
|
+
<button type="button" class="btn" onclick={protect}>{t('editRanges.protectSheet')}</button>
|
|
152
|
+
<span class="spacer"></span>
|
|
153
|
+
<button type="button" class="btn primary" onclick={ok}>{t('ok')}</button>
|
|
154
|
+
<button type="button" class="btn" onclick={close}>{t('cancel')}</button>
|
|
155
|
+
</div>
|
|
156
|
+
{/snippet}
|
|
157
|
+
</SvModal>
|
|
158
|
+
|
|
159
|
+
<style>
|
|
160
|
+
.ranges { min-width: 460px; }
|
|
161
|
+
.list {
|
|
162
|
+
width: 100%;
|
|
163
|
+
border-collapse: collapse;
|
|
164
|
+
font-size: 12px;
|
|
165
|
+
}
|
|
166
|
+
.list th {
|
|
167
|
+
padding: 4px 8px;
|
|
168
|
+
text-align: left;
|
|
169
|
+
font-weight: 600;
|
|
170
|
+
color: var(--sg-muted, #616161);
|
|
171
|
+
border-bottom: 1px solid var(--sg-border, #d1d1d1);
|
|
172
|
+
}
|
|
173
|
+
.list td {
|
|
174
|
+
padding: 4px 8px;
|
|
175
|
+
border-bottom: 1px solid var(--sg-border, #e5e5e5);
|
|
176
|
+
vertical-align: middle;
|
|
177
|
+
}
|
|
178
|
+
.list td input {
|
|
179
|
+
width: 100%;
|
|
180
|
+
box-sizing: border-box;
|
|
181
|
+
padding: 3px 6px;
|
|
182
|
+
font: inherit;
|
|
183
|
+
color: inherit;
|
|
184
|
+
background: var(--sg-bg, #fff);
|
|
185
|
+
border: 1px solid var(--sg-border, #d1d1d1);
|
|
186
|
+
border-radius: 3px;
|
|
187
|
+
}
|
|
188
|
+
.mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
|
|
189
|
+
.empty { color: var(--sg-muted, #616161); text-align: center; }
|
|
190
|
+
.actions { white-space: nowrap; text-align: right; }
|
|
191
|
+
.link {
|
|
192
|
+
padding: 0 4px;
|
|
193
|
+
font: inherit;
|
|
194
|
+
color: var(--sg-accent, #107c41);
|
|
195
|
+
background: none;
|
|
196
|
+
border: 0;
|
|
197
|
+
cursor: pointer;
|
|
198
|
+
}
|
|
199
|
+
.link:hover { text-decoration: underline; }
|
|
200
|
+
.new {
|
|
201
|
+
display: grid;
|
|
202
|
+
grid-template-columns: 1fr 2fr auto;
|
|
203
|
+
gap: 8px;
|
|
204
|
+
align-items: end;
|
|
205
|
+
margin-top: 6px;
|
|
206
|
+
}
|
|
207
|
+
.new label { display: flex; flex-direction: column; gap: 3px; font-size: 12px; }
|
|
208
|
+
.new input {
|
|
209
|
+
padding: 4px 8px;
|
|
210
|
+
font: inherit;
|
|
211
|
+
color: inherit;
|
|
212
|
+
background: var(--sg-bg, #fff);
|
|
213
|
+
border: 1px solid var(--sg-border, #d1d1d1);
|
|
214
|
+
border-radius: 3px;
|
|
215
|
+
}
|
|
216
|
+
.spacer { flex: 1; }
|
|
217
|
+
</style>
|