@svgrid/enterprise 3.0.2 → 3.1.0
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 +94 -20
- package/dist/SvFormulaBar.svelte.d.ts +7 -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 +198 -40
- package/dist/SvPivotDesigner.svelte.d.ts +27 -20
- package/dist/SvSheet.svelte +4043 -243
- package/dist/SvSheet.svelte.d.ts +76 -3
- package/dist/SvSheetChartSetup.svelte +151 -0
- package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
- package/dist/SvSheetComment.svelte +216 -31
- package/dist/SvSheetComment.svelte.d.ts +11 -11
- package/dist/SvSheetConditionalFormat.svelte +28 -31
- package/dist/SvSheetDataValidation.svelte +66 -42
- 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 +137 -34
- package/dist/SvSheetFilterMenu.svelte.d.ts +5 -0
- package/dist/SvSheetFindReplace.svelte +19 -19
- package/dist/SvSheetFormatCells.svelte +125 -81
- package/dist/SvSheetGoalSeek.svelte +17 -16
- package/dist/SvSheetInsertFunction.svelte +15 -13
- 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 +4 -2
- package/dist/SvSheetListPicker.svelte.d.ts +0 -6
- package/dist/SvSheetManageRules.svelte +20 -18
- package/dist/SvSheetNameManager.svelte +17 -15
- package/dist/SvSheetPageSetup.svelte +159 -0
- package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
- package/dist/SvSheetPasteSpecial.svelte +22 -20
- 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 +13 -10
- package/dist/SvSheetRibbon.svelte +104 -51
- package/dist/SvSheetSizeDialog.svelte +4 -2
- 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 +161 -31
- package/dist/SvSheetTabs.svelte.d.ts +22 -8
- package/dist/SvSheetTextToColumns.svelte +20 -20
- package/dist/SvSheetValidationAlert.svelte +8 -6
- 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 +39827 -16429
- package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
- package/dist/designer/assets/{SvChartMenu-D9hEeHar.js → SvChartMenu-BDoeqGz6.js} +1 -1
- package/dist/designer/assets/{SvDateTimePicker-DARvKUL2.js → SvDateTimePicker-DCPg7WGN.js} +1 -1
- package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
- package/dist/designer/assets/{SvGridChart-B8j1SSy3.js → SvGridChart-Cy1ATrWh.js} +2 -2
- package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
- package/dist/designer/assets/{SvGridChartPanel-pT6ITc2P.js → SvGridChartPanel-CATdVc9X.js} +3 -3
- package/dist/designer/assets/{SvGridChartView-bg281UA1.js → SvGridChartView-CmsZtCED.js} +1 -1
- package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
- package/dist/designer/assets/{SvTabs-UFCMTHXS.js → SvTabs-2mHC6oaz.js} +1 -1
- package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
- package/dist/designer/assets/{chart-cIPUsbM5.js → chart-Cn7MnNqA.js} +1 -1
- package/dist/designer/assets/{chart-panel-messages-DtTxpBUU.js → chart-panel-messages-Dz7PTIqT.js} +1 -1
- package/dist/designer/assets/{chart-summary-Czu_5epb.js → chart-summary-BD1qYB2R.js} +1 -1
- package/dist/designer/assets/{chart-trend-D5I5VEe8.js → chart-trend-B8xr5LuD.js} +1 -1
- package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
- package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
- package/dist/designer/assets/{focus-trap-CAreAhlU.js → focus-trap-V2-6Fy9I.js} +1 -1
- package/dist/designer/assets/{index-DwU7CAMm.js → index-BSjv6Qec.js} +317 -315
- package/dist/designer/assets/index-_JVFxt02.css +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-DUQ4xE3x.js +58 -0
- package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
- package/dist/designer/index.html +17 -16
- package/dist/export-pdf.d.ts +75 -0
- package/dist/export-pdf.js +216 -15
- package/dist/export.js +10 -2
- 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 +34 -7
- package/dist/index.js +44 -7
- package/dist/install.js +8 -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 +140 -8
- 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/ast.d.ts +45 -1
- package/dist/sheet/ast.js +14 -0
- package/dist/sheet/auto-filter.d.ts +58 -4
- package/dist/sheet/auto-filter.js +159 -11
- package/dist/sheet/autocomplete.d.ts +9 -0
- package/dist/sheet/autocomplete.js +90 -4
- 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 +40 -0
- package/dist/sheet/coerce.js +170 -3
- package/dist/sheet/comments.d.ts +43 -9
- package/dist/sheet/comments.js +85 -27
- package/dist/sheet/conditional-formats.d.ts +29 -6
- package/dist/sheet/conditional-formats.js +37 -12
- 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 +45 -1
- package/dist/sheet/deps.js +77 -2
- package/dist/sheet/document.d.ts +106 -4
- package/dist/sheet/document.js +204 -3
- package/dist/sheet/engine.d.ts +67 -0
- package/dist/sheet/engine.js +19 -0
- package/dist/sheet/entry.d.ts +8 -4
- package/dist/sheet/entry.js +171 -21
- 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 +67 -0
- package/dist/sheet/evaluate.js +725 -13
- package/dist/sheet/filter-files.d.ts +37 -0
- package/dist/sheet/filter-files.js +465 -0
- package/dist/sheet/format-store.d.ts +15 -0
- package/dist/sheet/format-store.js +11 -1
- package/dist/sheet/from-rows.d.ts +14 -0
- package/dist/sheet/from-rows.js +50 -0
- package/dist/sheet/function-catalog.d.ts +1 -1
- package/dist/sheet/function-catalog.js +296 -5
- package/dist/sheet/functions.js +363 -91
- package/dist/sheet/index.d.ts +35 -8
- package/dist/sheet/index.js +35 -8
- package/dist/sheet/links.d.ts +57 -0
- package/dist/sheet/links.js +174 -0
- package/dist/sheet/messages.d.ts +778 -0
- package/dist/sheet/messages.js +806 -0
- package/dist/sheet/number-format.d.ts +52 -5
- package/dist/sheet/number-format.js +465 -68
- 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/parse.js +42 -10
- package/dist/sheet/paste-special.d.ts +22 -0
- package/dist/sheet/paste-special.js +14 -5
- 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 +55 -1
- package/dist/sheet/protection.js +55 -2
- package/dist/sheet/rects.d.ts +1 -1
- package/dist/sheet/refs.d.ts +48 -0
- package/dist/sheet/refs.js +155 -8
- package/dist/sheet/ribbon-icons.d.ts +1 -1
- package/dist/sheet/ribbon-icons.js +186 -0
- package/dist/sheet/ribbon.d.ts +1 -1
- package/dist/sheet/ribbon.js +324 -23
- package/dist/sheet/sheet-kinds.d.ts +74 -0
- package/dist/sheet/sheet-kinds.js +91 -0
- package/dist/sheet/shortcuts.d.ts +13 -3
- package/dist/sheet/shortcuts.js +63 -12
- 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/table-styles.d.ts +74 -0
- package/dist/sheet/table-styles.js +152 -0
- package/dist/sheet/tables.d.ts +19 -0
- package/dist/sheet/tables.js +31 -0
- package/dist/sheet/tokenize.d.ts +18 -1
- package/dist/sheet/tokenize.js +60 -9
- package/dist/sheet/validation.d.ts +16 -0
- package/dist/sheet/validation.js +37 -0
- package/dist/sheet/workbook.d.ts +148 -3
- package/dist/sheet/workbook.js +742 -31
- 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.js +6 -7
- 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 +107 -2
- 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 +30 -5
- package/dist/designer/assets/GridMenus-BlsvL_aU.js +0 -8
- package/dist/designer/assets/SvGridCellEditor-C7uQXYds.js +0 -4
- package/dist/designer/assets/SvGridChartBuilder-kvyIU_Rl.js +0 -1
- package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
- package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
- package/dist/designer/assets/index-CMFgAoVV.css +0 -1
- package/dist/designer/assets/row-resize-DLktcqUK.js +0 -1
- package/dist/designer/assets/src-EdI3Xqds.js +0 -58
- package/dist/designer/assets/validate-h-aslRV9.js +0 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Workbook } from './sheet/workbook.js';
|
|
2
|
+
import type { SortKey } from './sheet/sort.js';
|
|
3
|
+
type Block = {
|
|
4
|
+
top: number;
|
|
5
|
+
left: number;
|
|
6
|
+
bottom: number;
|
|
7
|
+
right: number;
|
|
8
|
+
};
|
|
9
|
+
type Props = {
|
|
10
|
+
open?: boolean;
|
|
11
|
+
workbook: Workbook;
|
|
12
|
+
/** The block to sort, and whether its first row looks like headers. */
|
|
13
|
+
block: Block;
|
|
14
|
+
headerGuess: boolean;
|
|
15
|
+
/** The column the dialog opens on: the active cell's. */
|
|
16
|
+
activeCol: number;
|
|
17
|
+
/**
|
|
18
|
+
* A cell's fill or font colour, for a level that sorts on one. Without
|
|
19
|
+
* it the Sort On list offers values only, since there would be no
|
|
20
|
+
* colours to offer.
|
|
21
|
+
*/
|
|
22
|
+
colourAt?: (row: number, col: number, on: 'fill' | 'color') => string | null;
|
|
23
|
+
onApply: (keys: SortKey[], hasHeaders: boolean) => void;
|
|
24
|
+
onClose?: () => void;
|
|
25
|
+
};
|
|
26
|
+
declare const SvSheetSort: import("svelte").Component<Props, {}, "open">;
|
|
27
|
+
type SvSheetSort = ReturnType<typeof SvSheetSort>;
|
|
28
|
+
export default SvSheetSort;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Excel's Create Sparklines dialog, and its Sparkline Design tab folded
|
|
4
|
+
* into the same box: the kind, the two ranges, the colours, one scale for
|
|
5
|
+
* the group or one each. Opened by Insert > Sparklines, and again by a
|
|
6
|
+
* double-click on a cell that holds one, which is how a group is edited.
|
|
7
|
+
*/
|
|
8
|
+
import { SvModal } from '@svgrid/grid'
|
|
9
|
+
import { useSheetText } from './sheet-text'
|
|
10
|
+
import { parseRangeText, rangeText } from './sheet/protection'
|
|
11
|
+
import { SPARKLINE_TYPES, type SheetSparklineType, type SparklineGroup } from './sheet/sparklines'
|
|
12
|
+
import type { Rect } from './sheet/format-store'
|
|
13
|
+
|
|
14
|
+
type Props = {
|
|
15
|
+
open?: boolean
|
|
16
|
+
/** The group as it stands, new or being edited. */
|
|
17
|
+
group: SparklineGroup
|
|
18
|
+
/** True when the group is already on the sheet, which offers Delete. */
|
|
19
|
+
existing?: boolean
|
|
20
|
+
onApply: (group: SparklineGroup) => void
|
|
21
|
+
onDelete?: () => void
|
|
22
|
+
onClose?: () => void
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let { open = $bindable(false), group, existing = false, onApply, onDelete, onClose }: Props = $props()
|
|
26
|
+
const t = useSheetText()
|
|
27
|
+
|
|
28
|
+
let type = $state<SheetSparklineType>('line')
|
|
29
|
+
let data = $state('')
|
|
30
|
+
let location = $state('')
|
|
31
|
+
let colour = $state('')
|
|
32
|
+
let negative = $state('')
|
|
33
|
+
let sameScale = $state(false)
|
|
34
|
+
let markers = $state(false)
|
|
35
|
+
let error = $state('')
|
|
36
|
+
let first = $state<HTMLSelectElement | null>(null)
|
|
37
|
+
|
|
38
|
+
$effect(() => {
|
|
39
|
+
if (!open) return
|
|
40
|
+
type = group.type
|
|
41
|
+
data = rangeText([group.data])
|
|
42
|
+
location = rangeText([group.location])
|
|
43
|
+
colour = group.color ?? ''
|
|
44
|
+
negative = group.negativeColor ?? ''
|
|
45
|
+
sameScale = Boolean(group.sameScale)
|
|
46
|
+
markers = Boolean(group.markers)
|
|
47
|
+
error = ''
|
|
48
|
+
queueMicrotask(() => first?.focus())
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
/** One rectangle, or null: these two fields take a range, not a list. */
|
|
52
|
+
function oneRect(text: string): Rect | null {
|
|
53
|
+
const rects = parseRangeText(text)
|
|
54
|
+
return rects && rects.length === 1 ? rects[0]! : null
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** The location has to hold one cell per line of the data. */
|
|
58
|
+
function shapesAgree(d: Rect, l: Rect): boolean {
|
|
59
|
+
const lines = l[2] - l[0] >= l[3] - l[1] ? d[2] - d[0] : d[3] - d[1]
|
|
60
|
+
const cells = Math.max(l[2] - l[0], l[3] - l[1])
|
|
61
|
+
return lines === cells
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function ok() {
|
|
65
|
+
const d = oneRect(data)
|
|
66
|
+
const l = oneRect(location)
|
|
67
|
+
if (!d || !l) { error = t('sparklines.badRange'); return }
|
|
68
|
+
if (!shapesAgree(d, l)) { error = t('sparklines.mismatch'); return }
|
|
69
|
+
const next: SparklineGroup = { ...group, type, data: d, location: l, sameScale, markers }
|
|
70
|
+
if (colour.trim()) next.color = colour.trim()
|
|
71
|
+
else delete next.color
|
|
72
|
+
if (negative.trim()) next.negativeColor = negative.trim()
|
|
73
|
+
else delete next.negativeColor
|
|
74
|
+
open = false
|
|
75
|
+
onApply(next)
|
|
76
|
+
onClose?.()
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function close() {
|
|
80
|
+
open = false
|
|
81
|
+
onClose?.()
|
|
82
|
+
}
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<SvModal bind:open onClose={onClose} title={t('sparklines.title')} size="sm">
|
|
86
|
+
<form class="sv-sheet-dialog" onsubmit={(e) => { e.preventDefault(); ok() }}>
|
|
87
|
+
<label class="field">
|
|
88
|
+
<span>{t('sparklines.type')}</span>
|
|
89
|
+
<select bind:this={first} bind:value={type}>
|
|
90
|
+
{#each SPARKLINE_TYPES as kind (kind)}<option value={kind}>{t(`sparklines.type.${kind}`)}</option>{/each}
|
|
91
|
+
</select>
|
|
92
|
+
</label>
|
|
93
|
+
<label class="field">
|
|
94
|
+
<span>{t('sparklines.data')}</span>
|
|
95
|
+
<input type="text" bind:value={data} spellcheck="false" placeholder={t('sparklines.dataPlaceholder')} />
|
|
96
|
+
</label>
|
|
97
|
+
<label class="field">
|
|
98
|
+
<span>{t('sparklines.location')}</span>
|
|
99
|
+
<input type="text" bind:value={location} spellcheck="false" placeholder={t('sparklines.locationPlaceholder')} />
|
|
100
|
+
</label>
|
|
101
|
+
<label class="field">
|
|
102
|
+
<span>{t('sparklines.colour')}</span>
|
|
103
|
+
<input type="color" value={colour || '#107c41'} oninput={(e) => (colour = e.currentTarget.value)} />
|
|
104
|
+
</label>
|
|
105
|
+
{#if type !== 'line'}
|
|
106
|
+
<label class="field">
|
|
107
|
+
<span>{t('sparklines.negativeColour')}</span>
|
|
108
|
+
<input type="color" value={negative || '#c42b1c'} oninput={(e) => (negative = e.currentTarget.value)} />
|
|
109
|
+
</label>
|
|
110
|
+
{/if}
|
|
111
|
+
<div class="checks">
|
|
112
|
+
<label class="check"><input type="checkbox" bind:checked={sameScale} /> {t('sparklines.sameScale')}</label>
|
|
113
|
+
{#if type === 'line'}
|
|
114
|
+
<label class="check"><input type="checkbox" bind:checked={markers} /> {t('sparklines.markers')}</label>
|
|
115
|
+
{/if}
|
|
116
|
+
</div>
|
|
117
|
+
{#if error}<p class="error">{error}</p>{/if}
|
|
118
|
+
<p class="hint">{t('sparklines.hint')}</p>
|
|
119
|
+
</form>
|
|
120
|
+
{#snippet footer()}
|
|
121
|
+
<div class="sv-sheet-dialog-buttons">
|
|
122
|
+
{#if existing && onDelete}
|
|
123
|
+
<button type="button" class="btn" onclick={() => { open = false; onDelete?.() }}>{t('delete')}</button>
|
|
124
|
+
{/if}
|
|
125
|
+
<span class="spacer"></span>
|
|
126
|
+
<button type="button" class="btn primary" onclick={ok}>{t('ok')}</button>
|
|
127
|
+
<button type="button" class="btn" onclick={close}>{t('cancel')}</button>
|
|
128
|
+
</div>
|
|
129
|
+
{/snippet}
|
|
130
|
+
</SvModal>
|
|
131
|
+
|
|
132
|
+
<style>
|
|
133
|
+
.spacer { flex: 1; }
|
|
134
|
+
.error { margin: 4px 0 0; color: var(--sg-danger, #c42b1c); font-size: 12px; }
|
|
135
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type SparklineGroup } from './sheet/sparklines.js';
|
|
2
|
+
type Props = {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
/** The group as it stands, new or being edited. */
|
|
5
|
+
group: SparklineGroup;
|
|
6
|
+
/** True when the group is already on the sheet, which offers Delete. */
|
|
7
|
+
existing?: boolean;
|
|
8
|
+
onApply: (group: SparklineGroup) => void;
|
|
9
|
+
onDelete?: () => void;
|
|
10
|
+
onClose?: () => void;
|
|
11
|
+
};
|
|
12
|
+
declare const SvSheetSparklines: import("svelte").Component<Props, {}, "open">;
|
|
13
|
+
type SvSheetSparklines = ReturnType<typeof SvSheetSparklines>;
|
|
14
|
+
export default SvSheetSparklines;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Excel's Create Table dialog: the cells, whether the first row is the
|
|
4
|
+
* header, the name the columns will be read by, and a totals row.
|
|
5
|
+
* Opened by Insert > Table or Ctrl+T, and again on a cell inside one,
|
|
6
|
+
* which is how a table is renamed or resized.
|
|
7
|
+
*/
|
|
8
|
+
import { SvModal } from '@svgrid/grid'
|
|
9
|
+
import { useSheetText } from './sheet-text'
|
|
10
|
+
import { parseRangeText, rangeText } from './sheet/protection'
|
|
11
|
+
import { isValidTableName } from './sheet/tables'
|
|
12
|
+
import {
|
|
13
|
+
TABLE_STYLES, DEFAULT_TABLE_STYLE, NO_TABLE_STYLE,
|
|
14
|
+
tableStyleColours, tableStyleLabel,
|
|
15
|
+
} from './sheet/table-styles'
|
|
16
|
+
import type { Rect } from './sheet/format-store'
|
|
17
|
+
|
|
18
|
+
type Props = {
|
|
19
|
+
open?: boolean
|
|
20
|
+
/** The block the table covers, header row included. */
|
|
21
|
+
range: Rect
|
|
22
|
+
name: string
|
|
23
|
+
headers?: boolean
|
|
24
|
+
totals?: boolean
|
|
25
|
+
existing?: boolean
|
|
26
|
+
/** The look, by Excel's name for it, or `'None'`. */
|
|
27
|
+
style?: string
|
|
28
|
+
onApply: (table: { range: Rect; name: string; headers: boolean; totals: boolean; style: string }) => void
|
|
29
|
+
onRemove?: () => void
|
|
30
|
+
onClose?: () => void
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let {
|
|
34
|
+
open = $bindable(false), range, name, headers = true, totals = false, existing = false,
|
|
35
|
+
style = DEFAULT_TABLE_STYLE, onApply, onRemove, onClose,
|
|
36
|
+
}: Props = $props()
|
|
37
|
+
const t = useSheetText()
|
|
38
|
+
|
|
39
|
+
let where = $state('')
|
|
40
|
+
let label = $state('')
|
|
41
|
+
let hasHeaders = $state(true)
|
|
42
|
+
let hasTotals = $state(false)
|
|
43
|
+
let look = $state(DEFAULT_TABLE_STYLE)
|
|
44
|
+
let error = $state('')
|
|
45
|
+
let first = $state<HTMLInputElement | null>(null)
|
|
46
|
+
|
|
47
|
+
$effect(() => {
|
|
48
|
+
if (!open) return
|
|
49
|
+
where = rangeText([range])
|
|
50
|
+
label = name
|
|
51
|
+
hasHeaders = headers
|
|
52
|
+
hasTotals = totals
|
|
53
|
+
look = style
|
|
54
|
+
error = ''
|
|
55
|
+
queueMicrotask(() => first?.focus())
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
function ok() {
|
|
59
|
+
const rects = parseRangeText(where)
|
|
60
|
+
const block = rects && rects.length === 1 ? rects[0]! : null
|
|
61
|
+
if (!block) { error = t('table.badRange'); return }
|
|
62
|
+
if (!isValidTableName(label.trim())) { error = t('table.badName'); return }
|
|
63
|
+
open = false
|
|
64
|
+
onApply({ range: block as Rect, name: label.trim(), headers: hasHeaders, totals: hasTotals, style: look })
|
|
65
|
+
onClose?.()
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function close() {
|
|
69
|
+
open = false
|
|
70
|
+
onClose?.()
|
|
71
|
+
}
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<!-- Opened from inside a table it edits that table, so it does not say
|
|
75
|
+
Create: the name, the range and the style are the ones it has. -->
|
|
76
|
+
<SvModal bind:open onClose={onClose} title={t(existing ? 'table.editTitle' : 'table.title')} size="sm">
|
|
77
|
+
<form class="sv-sheet-dialog" onsubmit={(e) => { e.preventDefault(); ok() }}>
|
|
78
|
+
<label class="field">
|
|
79
|
+
<span>{t('table.range')}</span>
|
|
80
|
+
<input type="text" bind:this={first} bind:value={where} spellcheck="false" placeholder={t('table.rangePlaceholder')} />
|
|
81
|
+
</label>
|
|
82
|
+
<label class="field">
|
|
83
|
+
<span>{t('table.name')}</span>
|
|
84
|
+
<input type="text" bind:value={label} spellcheck="false" placeholder={t('table.namePlaceholder')} />
|
|
85
|
+
</label>
|
|
86
|
+
<div class="checks">
|
|
87
|
+
<label class="check"><input type="checkbox" bind:checked={hasHeaders} /> {t('table.headers')}</label>
|
|
88
|
+
<label class="check"><input type="checkbox" bind:checked={hasTotals} /> {t('table.totals')}</label>
|
|
89
|
+
</div>
|
|
90
|
+
<fieldset class="styles">
|
|
91
|
+
<legend>{t('table.style')}</legend>
|
|
92
|
+
<div class="gallery" role="radiogroup" aria-label={t('table.style')}>
|
|
93
|
+
<button
|
|
94
|
+
type="button"
|
|
95
|
+
class="swatch none"
|
|
96
|
+
class:chosen={look === NO_TABLE_STYLE}
|
|
97
|
+
role="radio"
|
|
98
|
+
aria-checked={look === NO_TABLE_STYLE}
|
|
99
|
+
title={t('table.styleNone')}
|
|
100
|
+
aria-label={t('table.styleNone')}
|
|
101
|
+
onclick={() => { look = NO_TABLE_STYLE }}
|
|
102
|
+
><span class="row head"></span><span class="row"></span><span class="row"></span></button>
|
|
103
|
+
{#each TABLE_STYLES as preset (preset.id)}
|
|
104
|
+
{@const colours = tableStyleColours(preset)}
|
|
105
|
+
<button
|
|
106
|
+
type="button"
|
|
107
|
+
class="swatch"
|
|
108
|
+
class:chosen={look === preset.id}
|
|
109
|
+
role="radio"
|
|
110
|
+
aria-checked={look === preset.id}
|
|
111
|
+
title={tableStyleLabel(preset)}
|
|
112
|
+
aria-label={tableStyleLabel(preset)}
|
|
113
|
+
onclick={() => { look = preset.id }}
|
|
114
|
+
>
|
|
115
|
+
<span class="row head" style={`background:${colours?.header}`}></span>
|
|
116
|
+
<span class="row" style={`background:${colours?.band}`}></span>
|
|
117
|
+
<span class="row"></span>
|
|
118
|
+
</button>
|
|
119
|
+
{/each}
|
|
120
|
+
</div>
|
|
121
|
+
</fieldset>
|
|
122
|
+
{#if error}<p class="error">{error}</p>{/if}
|
|
123
|
+
<p class="hint">{t('table.hint')}</p>
|
|
124
|
+
</form>
|
|
125
|
+
{#snippet footer()}
|
|
126
|
+
<div class="sv-sheet-dialog-buttons">
|
|
127
|
+
{#if existing && onRemove}
|
|
128
|
+
<button type="button" class="btn" onclick={() => { open = false; onRemove?.() }}>{t('delete')}</button>
|
|
129
|
+
{/if}
|
|
130
|
+
<span class="spacer"></span>
|
|
131
|
+
<button type="button" class="btn primary" onclick={ok}>{t('ok')}</button>
|
|
132
|
+
<button type="button" class="btn" onclick={close}>{t('cancel')}</button>
|
|
133
|
+
</div>
|
|
134
|
+
{/snippet}
|
|
135
|
+
</SvModal>
|
|
136
|
+
|
|
137
|
+
<style>
|
|
138
|
+
.spacer { flex: 1; }
|
|
139
|
+
/* The gallery: each swatch is a header band over two body rows, which is
|
|
140
|
+
the smallest drawing that still says what the style will look like. */
|
|
141
|
+
.styles { margin: 8px 0 0; padding: 0; border: 0; }
|
|
142
|
+
.styles legend { padding: 0 0 4px; color: var(--sg-muted, #64748b); font-size: 12px; }
|
|
143
|
+
.gallery { display: grid; grid-template-columns: repeat(6, 1fr); gap: 6px; }
|
|
144
|
+
.swatch {
|
|
145
|
+
display: flex;
|
|
146
|
+
flex-direction: column;
|
|
147
|
+
gap: 1px;
|
|
148
|
+
padding: 2px;
|
|
149
|
+
border: 1px solid var(--sg-border, #d4d4d8);
|
|
150
|
+
border-radius: 3px;
|
|
151
|
+
background: var(--sg-surface, #fff);
|
|
152
|
+
cursor: pointer;
|
|
153
|
+
}
|
|
154
|
+
.swatch .row { display: block; height: 5px; background: var(--sg-surface-2, #f1f5f9); }
|
|
155
|
+
.swatch .row.head { height: 7px; }
|
|
156
|
+
.swatch.none .row.head { background: var(--sg-border, #d4d4d8); }
|
|
157
|
+
.swatch.chosen { outline: 2px solid var(--sg-accent, #107c41); outline-offset: 1px; }
|
|
158
|
+
.swatch:focus-visible { outline: 2px solid var(--sg-accent, #107c41); outline-offset: 1px; }
|
|
159
|
+
.error { margin: 4px 0 0; color: var(--sg-danger, #c42b1c); font-size: 12px; }
|
|
160
|
+
</style>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Rect } from './sheet/format-store.js';
|
|
2
|
+
type Props = {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
/** The block the table covers, header row included. */
|
|
5
|
+
range: Rect;
|
|
6
|
+
name: string;
|
|
7
|
+
headers?: boolean;
|
|
8
|
+
totals?: boolean;
|
|
9
|
+
existing?: boolean;
|
|
10
|
+
/** The look, by Excel's name for it, or `'None'`. */
|
|
11
|
+
style?: string;
|
|
12
|
+
onApply: (table: {
|
|
13
|
+
range: Rect;
|
|
14
|
+
name: string;
|
|
15
|
+
headers: boolean;
|
|
16
|
+
totals: boolean;
|
|
17
|
+
style: string;
|
|
18
|
+
}) => void;
|
|
19
|
+
onRemove?: () => void;
|
|
20
|
+
onClose?: () => void;
|
|
21
|
+
};
|
|
22
|
+
declare const SvSheetTable: import("svelte").Component<Props, {}, "open">;
|
|
23
|
+
type SvSheetTable = ReturnType<typeof SvSheetTable>;
|
|
24
|
+
export default SvSheetTable;
|