@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,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Objects on a sheet: the things that float over the cells rather than
|
|
3
|
+
* living in them. A chart drawn from a range, and a picture.
|
|
4
|
+
*
|
|
5
|
+
* Excel anchors an object to a cell and an offset inside it, and that is
|
|
6
|
+
* what this keeps: the object moves when rows or columns are inserted
|
|
7
|
+
* above or to the left of it, and goes when the cell it hangs from is
|
|
8
|
+
* deleted. Its size is in pixels rather than a second anchor cell, so
|
|
9
|
+
* resizing a column under a chart moves it without reshaping it, which is
|
|
10
|
+
* Excel's "move but don't size with cells".
|
|
11
|
+
*
|
|
12
|
+
* A chart holds the range it reads rather than a copy of the numbers, so
|
|
13
|
+
* editing a cell redraws it. `chartSpecOf` turns the range into the spec
|
|
14
|
+
* `<SvChart>` takes, reading through whatever the caller supplies, which
|
|
15
|
+
* is how the same function serves the shell and a test.
|
|
16
|
+
*/
|
|
17
|
+
import type { ChartSpec } from '@svgrid/grid';
|
|
18
|
+
import type { Rect } from './format-store.js';
|
|
19
|
+
import type { StructuralEdit } from './refs.js';
|
|
20
|
+
import type { CellValue } from './ast.js';
|
|
21
|
+
/** Where an object hangs: a cell, an offset inside it, and a size in pixels. */
|
|
22
|
+
export type ObjectAnchor = {
|
|
23
|
+
row: number;
|
|
24
|
+
col: number;
|
|
25
|
+
/** Offset from the cell's top-left corner, in pixels. */
|
|
26
|
+
dx: number;
|
|
27
|
+
dy: number;
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
};
|
|
31
|
+
/** The chart kinds the sheet offers, a subset of what `<SvChart>` draws. */
|
|
32
|
+
export declare const SHEET_CHART_TYPES: readonly ["bar", "line", "area", "pie", "scatter"];
|
|
33
|
+
export type SheetChartType = (typeof SHEET_CHART_TYPES)[number];
|
|
34
|
+
export type SheetChartObject = {
|
|
35
|
+
id: string;
|
|
36
|
+
kind: 'chart';
|
|
37
|
+
anchor: ObjectAnchor;
|
|
38
|
+
/** The cells the chart reads, on the sheet it sits on. */
|
|
39
|
+
range: Rect;
|
|
40
|
+
type: SheetChartType;
|
|
41
|
+
/** The range's first row holds the series labels, its first column the categories. */
|
|
42
|
+
headers: boolean;
|
|
43
|
+
/** Each column of the range is a series (Excel's default), or each row. */
|
|
44
|
+
series: 'columns' | 'rows';
|
|
45
|
+
title?: string;
|
|
46
|
+
stacked?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* A trend line over every series: Excel's Add Trendline, in the two
|
|
49
|
+
* shapes people actually pick. Drawn by the chart's own overlay, so it
|
|
50
|
+
* follows the data rather than being a second set of numbers.
|
|
51
|
+
*/
|
|
52
|
+
trend?: SheetChartTrend;
|
|
53
|
+
/**
|
|
54
|
+
* The series plotted against a second value axis on the right, by its
|
|
55
|
+
* label. Excel's "Plot series on secondary axis", which is what makes a
|
|
56
|
+
* revenue-and-margin chart readable when the two are orders of magnitude
|
|
57
|
+
* apart. Unknown labels are ignored.
|
|
58
|
+
*/
|
|
59
|
+
secondary?: string;
|
|
60
|
+
};
|
|
61
|
+
/** The trend lines the sheet offers: a straight fit, or a moving average. */
|
|
62
|
+
export declare const SHEET_CHART_TRENDS: readonly ["linear", "sma3"];
|
|
63
|
+
export type SheetChartTrend = (typeof SHEET_CHART_TRENDS)[number];
|
|
64
|
+
export type SheetImageObject = {
|
|
65
|
+
id: string;
|
|
66
|
+
kind: 'image';
|
|
67
|
+
anchor: ObjectAnchor;
|
|
68
|
+
/** A `data:` or `http(s):` URL. The document carries it as it is. */
|
|
69
|
+
src: string;
|
|
70
|
+
alt?: string;
|
|
71
|
+
};
|
|
72
|
+
export type SheetObject = SheetChartObject | SheetImageObject;
|
|
73
|
+
/** An id no other object of this session carries. */
|
|
74
|
+
export declare const objectId: () => string;
|
|
75
|
+
/** A copy safe to hand out or save. */
|
|
76
|
+
export declare function copyObject(object: SheetObject): SheetObject;
|
|
77
|
+
/**
|
|
78
|
+
* The object after an insert or delete: its anchor cell moves with its
|
|
79
|
+
* line and a chart's range moves with its cells. Null when the edit
|
|
80
|
+
* deleted the cell it hangs from, or every cell a chart read.
|
|
81
|
+
*/
|
|
82
|
+
export declare function shiftObject(object: SheetObject, edit: StructuralEdit): SheetObject | null;
|
|
83
|
+
/** The objects of a sheet after an insert or delete, the gone ones dropped. */
|
|
84
|
+
export declare function shiftObjects(objects: ReadonlyArray<SheetObject>, edit: StructuralEdit): SheetObject[];
|
|
85
|
+
/** The object at a point, topmost first: what a click on the layer hits. */
|
|
86
|
+
export declare function objectAt(objects: ReadonlyArray<SheetObject>, point: {
|
|
87
|
+
x: number;
|
|
88
|
+
y: number;
|
|
89
|
+
}, boxOf: (object: SheetObject) => {
|
|
90
|
+
left: number;
|
|
91
|
+
top: number;
|
|
92
|
+
width: number;
|
|
93
|
+
height: number;
|
|
94
|
+
} | null): SheetObject | null;
|
|
95
|
+
/**
|
|
96
|
+
* The chart's spec, read from its range through `valueAt` (the computed
|
|
97
|
+
* value) and `textAt` (what the cell shows, for the labels). A chart of a
|
|
98
|
+
* range with no numbers in it draws nothing rather than throwing.
|
|
99
|
+
*/
|
|
100
|
+
export declare function chartSpecOf(object: SheetChartObject, valueAt: (row: number, col: number) => CellValue, textAt: (row: number, col: number) => string): ChartSpec;
|
|
101
|
+
/**
|
|
102
|
+
* A chart over a selected block, the way Insert > Chart guesses it: a
|
|
103
|
+
* header row when the first row is text over numbers, series down the
|
|
104
|
+
* columns, anchored just below the block.
|
|
105
|
+
*/
|
|
106
|
+
export declare function chartFromRange(range: Rect, valueAt: (row: number, col: number) => CellValue, anchor?: Partial<ObjectAnchor>): SheetChartObject;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { shiftRect, lineShift } from './rects.js';
|
|
2
|
+
import { colToLetters } from './address.js';
|
|
3
|
+
/** The chart kinds the sheet offers, a subset of what `<SvChart>` draws. */
|
|
4
|
+
export const SHEET_CHART_TYPES = ['bar', 'line', 'area', 'pie', 'scatter'];
|
|
5
|
+
/** The trend lines the sheet offers: a straight fit, or a moving average. */
|
|
6
|
+
export const SHEET_CHART_TRENDS = ['linear', 'sma3'];
|
|
7
|
+
let nextObjectId = 1;
|
|
8
|
+
/** An id no other object of this session carries. */
|
|
9
|
+
export const objectId = () => `obj-${Date.now().toString(36)}-${(nextObjectId += 1).toString(36)}`;
|
|
10
|
+
/** A copy safe to hand out or save. */
|
|
11
|
+
export function copyObject(object) {
|
|
12
|
+
return object.kind === 'chart'
|
|
13
|
+
? { ...object, anchor: { ...object.anchor }, range: [...object.range] }
|
|
14
|
+
: { ...object, anchor: { ...object.anchor } };
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The object after an insert or delete: its anchor cell moves with its
|
|
18
|
+
* line and a chart's range moves with its cells. Null when the edit
|
|
19
|
+
* deleted the cell it hangs from, or every cell a chart read.
|
|
20
|
+
*/
|
|
21
|
+
export function shiftObject(object, edit) {
|
|
22
|
+
const shift = lineShift(edit);
|
|
23
|
+
const rows = edit.kind === 'insertRows' || edit.kind === 'deleteRows';
|
|
24
|
+
const at = rows ? shift(object.anchor.row) : shift(object.anchor.col);
|
|
25
|
+
if (at === null)
|
|
26
|
+
return null;
|
|
27
|
+
const out = copyObject(object);
|
|
28
|
+
out.anchor = { ...out.anchor, ...(rows ? { row: at } : { col: at }) };
|
|
29
|
+
if (out.kind === 'chart') {
|
|
30
|
+
const range = shiftRect(out.range, edit);
|
|
31
|
+
if (!range)
|
|
32
|
+
return null;
|
|
33
|
+
out.range = range;
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
/** The objects of a sheet after an insert or delete, the gone ones dropped. */
|
|
38
|
+
export function shiftObjects(objects, edit) {
|
|
39
|
+
return objects.map((o) => shiftObject(o, edit)).filter((o) => o !== null);
|
|
40
|
+
}
|
|
41
|
+
/** The object at a point, topmost first: what a click on the layer hits. */
|
|
42
|
+
export function objectAt(objects, point, boxOf) {
|
|
43
|
+
for (let i = objects.length - 1; i >= 0; i -= 1) {
|
|
44
|
+
const box = boxOf(objects[i]);
|
|
45
|
+
if (!box)
|
|
46
|
+
continue;
|
|
47
|
+
if (point.x >= box.left && point.x <= box.left + box.width && point.y >= box.top && point.y <= box.top + box.height)
|
|
48
|
+
return objects[i];
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/** A cell's value as a number, or null when it is not one. */
|
|
53
|
+
function numberOf(value) {
|
|
54
|
+
if (typeof value === 'number')
|
|
55
|
+
return Number.isFinite(value) ? value : null;
|
|
56
|
+
if (typeof value === 'boolean')
|
|
57
|
+
return value ? 1 : 0;
|
|
58
|
+
if (typeof value === 'string' && value.trim() !== '') {
|
|
59
|
+
const n = Number(value);
|
|
60
|
+
return Number.isFinite(n) ? n : null;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The chart's spec, read from its range through `valueAt` (the computed
|
|
66
|
+
* value) and `textAt` (what the cell shows, for the labels). A chart of a
|
|
67
|
+
* range with no numbers in it draws nothing rather than throwing.
|
|
68
|
+
*/
|
|
69
|
+
export function chartSpecOf(object, valueAt, textAt) {
|
|
70
|
+
const [r1, c1, r2, c2] = object.range;
|
|
71
|
+
const byColumns = object.series === 'columns';
|
|
72
|
+
// Along the series, and across each one.
|
|
73
|
+
const seriesFrom = byColumns ? c1 : r1;
|
|
74
|
+
const seriesTo = byColumns ? c2 : r2;
|
|
75
|
+
const pointFrom = byColumns ? r1 : c1;
|
|
76
|
+
const pointTo = byColumns ? r2 : c2;
|
|
77
|
+
// With headers, the first line across is the labels and the first line
|
|
78
|
+
// along is the categories.
|
|
79
|
+
const firstSeries = object.headers ? seriesFrom + 1 : seriesFrom;
|
|
80
|
+
const firstPoint = object.headers ? pointFrom + 1 : pointFrom;
|
|
81
|
+
const cellAt = (s, p) => (byColumns ? { row: p, col: s } : { row: s, col: p });
|
|
82
|
+
const categories = [];
|
|
83
|
+
for (let p = firstPoint; p <= pointTo; p += 1) {
|
|
84
|
+
const at = cellAt(seriesFrom, p);
|
|
85
|
+
const label = object.headers ? textAt(at.row, at.col) : '';
|
|
86
|
+
categories.push(label.trim() === '' ? (byColumns ? String(p + 1) : colToLetters(p)) : label);
|
|
87
|
+
}
|
|
88
|
+
const series = [];
|
|
89
|
+
for (let s = firstSeries; s <= seriesTo; s += 1) {
|
|
90
|
+
const head = cellAt(s, pointFrom);
|
|
91
|
+
const label = object.headers ? textAt(head.row, head.col) : '';
|
|
92
|
+
const values = [];
|
|
93
|
+
let numeric = false;
|
|
94
|
+
for (let p = firstPoint; p <= pointTo; p += 1) {
|
|
95
|
+
const at = cellAt(s, p);
|
|
96
|
+
const n = numberOf(valueAt(at.row, at.col));
|
|
97
|
+
if (n !== null)
|
|
98
|
+
numeric = true;
|
|
99
|
+
values.push(n ?? 0);
|
|
100
|
+
}
|
|
101
|
+
if (!numeric)
|
|
102
|
+
continue;
|
|
103
|
+
const name = label.trim() === '' ? (byColumns ? colToLetters(s) : String(s + 1)) : label;
|
|
104
|
+
series.push({
|
|
105
|
+
label: name,
|
|
106
|
+
values,
|
|
107
|
+
// The trend line and the second axis are per series in the chart, and
|
|
108
|
+
// a sheet says them once: over everything, and for one series.
|
|
109
|
+
...(object.trend ? { overlay: object.trend === 'sma3' ? 'sma:3' : 'linear' } : {}),
|
|
110
|
+
...(object.secondary && object.secondary === name ? { axis: 'right' } : {}),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
type: object.type,
|
|
115
|
+
categories,
|
|
116
|
+
series,
|
|
117
|
+
...(object.stacked ? { stacked: true } : {}),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* A chart over a selected block, the way Insert > Chart guesses it: a
|
|
122
|
+
* header row when the first row is text over numbers, series down the
|
|
123
|
+
* columns, anchored just below the block.
|
|
124
|
+
*/
|
|
125
|
+
export function chartFromRange(range, valueAt, anchor) {
|
|
126
|
+
const [r1, c1, r2, c2] = range;
|
|
127
|
+
// A header row: the first row is text and the second has a number under it.
|
|
128
|
+
let headers = false;
|
|
129
|
+
if (r2 > r1) {
|
|
130
|
+
let text = 0;
|
|
131
|
+
let numbers = 0;
|
|
132
|
+
for (let c = c1; c <= c2; c += 1) {
|
|
133
|
+
if (typeof valueAt(r1, c) === 'string' && String(valueAt(r1, c)).trim() !== '')
|
|
134
|
+
text += 1;
|
|
135
|
+
if (numberOf(valueAt(r1 + 1, c)) !== null)
|
|
136
|
+
numbers += 1;
|
|
137
|
+
}
|
|
138
|
+
headers = text > 0 && numbers > 0;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
id: objectId(),
|
|
142
|
+
kind: 'chart',
|
|
143
|
+
anchor: { row: r2 + 1, col: c1, dx: 8, dy: 8, width: 420, height: 260, ...anchor },
|
|
144
|
+
range: [r1, c1, r2, c2],
|
|
145
|
+
type: 'bar',
|
|
146
|
+
headers,
|
|
147
|
+
series: 'columns',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type TableRefToken } from './tokenize.js';
|
|
2
|
+
import type { SheetDocument, SheetState } from './document.js';
|
|
3
|
+
import { type ZipCtor } from './xlsx-document.js';
|
|
4
|
+
/** A length as CSS writes it (`1.9445in`, `2.54cm`, `12pt`) in pixels. */
|
|
5
|
+
export declare function odfLength(text: string | null): number | null;
|
|
6
|
+
/**
|
|
7
|
+
* An ODF formula as A1.
|
|
8
|
+
*
|
|
9
|
+
* `of:=SUM([.A1:.A3])` is `=SUM(A1:A3)`; a reference into another sheet is
|
|
10
|
+
* `[$Sheet2.A1]` or `[$'Price list'.A1]`; arguments are separated by `;`.
|
|
11
|
+
* The newer functions carry a vendor prefix, which is the same function
|
|
12
|
+
* under a longer name.
|
|
13
|
+
*/
|
|
14
|
+
export declare function formulaFromOdf(text: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* What a structured reference points at, for a writer that has a workbook:
|
|
17
|
+
* ODF has no `Orders[Amount]`, so one has to become the rectangle it names
|
|
18
|
+
* or the formula cannot be written at all.
|
|
19
|
+
*/
|
|
20
|
+
export type TableResolver = (token: TableRefToken) => {
|
|
21
|
+
sheet: string | null;
|
|
22
|
+
r1: number;
|
|
23
|
+
c1: number;
|
|
24
|
+
r2: number;
|
|
25
|
+
c2: number;
|
|
26
|
+
} | null;
|
|
27
|
+
/**
|
|
28
|
+
* An A1 formula as ODF writes one: every reference in brackets, `;` between
|
|
29
|
+
* arguments. Rebuilt from the tokens rather than by substitution, so a comma
|
|
30
|
+
* inside a string stays a comma and `A1` inside one is not a reference.
|
|
31
|
+
*
|
|
32
|
+
* Returns null when the formula cannot be spelled in ODF - a structured
|
|
33
|
+
* reference with no workbook to resolve it - so the caller can write the
|
|
34
|
+
* cell's value on its own rather than a formula the reader would refuse.
|
|
35
|
+
*/
|
|
36
|
+
export declare function formulaToOdf(text: string, resolve?: TableResolver): string | null;
|
|
37
|
+
/** The document an .ods holds, from its unzipped parts. */
|
|
38
|
+
export declare function sheetStateFromOds(parts: Record<string, string>): SheetState;
|
|
39
|
+
/** The document an .ods file holds, as a saved state. */
|
|
40
|
+
export declare function documentFromOds(file: Blob | ArrayBuffer | Uint8Array, JSZip?: ZipCtor): Promise<SheetState>;
|
|
41
|
+
/** The parts of an .ods package, as text. */
|
|
42
|
+
export declare function documentToOdsParts(doc: SheetDocument): Record<string, string>;
|
|
43
|
+
/** The document as an .ods Blob: what File > Save As writes for LibreOffice. */
|
|
44
|
+
export declare function documentToOds(doc: SheetDocument, JSZip?: ZipCtor): Promise<Blob>;
|