@rowsncolumns/spreadsheet 10.2.74 → 10.2.76
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/dist/cjs/api/excel-validation-kinds.d.ts +71 -0
- package/dist/cjs/api/excel-validation-kinds.d.ts.map +1 -0
- package/dist/cjs/api/excel-validation-kinds.js +304 -0
- package/dist/cjs/api/fill-series.d.ts +38 -0
- package/dist/cjs/api/fill-series.d.ts.map +1 -0
- package/dist/cjs/api/fill-series.js +89 -0
- package/dist/cjs/api/go-to-special.d.ts +32 -0
- package/dist/cjs/api/go-to-special.d.ts.map +1 -0
- package/dist/cjs/api/go-to-special.js +111 -0
- package/dist/cjs/api/spreadsheet-api.d.ts +6 -2
- package/dist/cjs/api/spreadsheet-api.d.ts.map +1 -1
- package/dist/cjs/api/spreadsheet-api.js +9 -3
- package/dist/cjs/api/validation-tooltip.d.ts +17 -0
- package/dist/cjs/api/validation-tooltip.d.ts.map +1 -0
- package/dist/cjs/api/validation-tooltip.js +42 -0
- package/dist/cjs/atoms/advanced-filter-dialog.atom.d.ts +28 -0
- package/dist/cjs/atoms/advanced-filter-dialog.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/advanced-filter-dialog.atom.js +32 -0
- package/dist/cjs/atoms/fill-options.atom.d.ts +36 -0
- package/dist/cjs/atoms/fill-options.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/fill-options.atom.js +11 -0
- package/dist/cjs/atoms/fill-series-dialog.atom.d.ts +26 -0
- package/dist/cjs/atoms/fill-series-dialog.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/fill-series-dialog.atom.js +14 -0
- package/dist/cjs/atoms/go-to-dialog.atom.d.ts +11 -1
- package/dist/cjs/atoms/go-to-dialog.atom.d.ts.map +1 -1
- package/dist/cjs/atoms/goal-seek-dialog.atom.d.ts +29 -0
- package/dist/cjs/atoms/goal-seek-dialog.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/goal-seek-dialog.atom.js +30 -0
- package/dist/cjs/atoms/index.d.ts +3 -0
- package/dist/cjs/atoms/index.d.ts.map +1 -1
- package/dist/cjs/atoms/index.js +3 -0
- package/dist/cjs/atoms/subtotal-dialog.atom.d.ts +39 -0
- package/dist/cjs/atoms/subtotal-dialog.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/subtotal-dialog.atom.js +30 -0
- package/dist/cjs/atoms/text-to-columns-dialog.atom.d.ts +34 -0
- package/dist/cjs/atoms/text-to-columns-dialog.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/text-to-columns-dialog.atom.js +36 -0
- package/dist/cjs/atoms/watch-window.atom.d.ts +37 -0
- package/dist/cjs/atoms/watch-window.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/watch-window.atom.js +61 -0
- package/dist/cjs/components/advanced-filter-dialog/index.d.ts +28 -0
- package/dist/cjs/components/advanced-filter-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/advanced-filter-dialog/index.js +134 -0
- package/dist/cjs/components/calculation-options-dialog/index.d.ts +33 -0
- package/dist/cjs/components/calculation-options-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/calculation-options-dialog/index.js +69 -0
- package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/cjs/components/canvas-grid/index.js +328 -71
- package/dist/cjs/components/canvas-grid/typings.d.ts +31 -5
- package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/cjs/components/cell/alignment.d.ts +30 -0
- package/dist/cjs/components/cell/alignment.d.ts.map +1 -1
- package/dist/cjs/components/cell/alignment.js +56 -1
- package/dist/cjs/components/cell/index.d.ts.map +1 -1
- package/dist/cjs/components/cell/index.js +15 -7
- package/dist/cjs/components/cell-diff/index.d.ts +3 -2
- package/dist/cjs/components/cell-diff/index.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/helpers.d.ts +9 -0
- package/dist/cjs/components/cell-editor/helpers.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/helpers.js +8 -1
- package/dist/cjs/components/cell-editor/helpers.spec.js +14 -0
- package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/index.js +7 -3
- package/dist/cjs/components/context-menu/index.d.ts +6 -1
- package/dist/cjs/components/context-menu/index.d.ts.map +1 -1
- package/dist/cjs/components/context-menu/index.js +146 -3
- package/dist/cjs/components/embeds/embed-component.d.ts.map +1 -1
- package/dist/cjs/components/embeds/embed-component.js +16 -1
- package/dist/cjs/components/fill-series-dialog/index.d.ts +29 -0
- package/dist/cjs/components/fill-series-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/fill-series-dialog/index.js +156 -0
- package/dist/cjs/components/go-to-dialog/index.d.ts +11 -1
- package/dist/cjs/components/go-to-dialog/index.d.ts.map +1 -1
- package/dist/cjs/components/go-to-dialog/index.js +67 -24
- package/dist/cjs/components/goal-seek-dialog/index.d.ts +32 -0
- package/dist/cjs/components/goal-seek-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/goal-seek-dialog/index.js +149 -0
- package/dist/cjs/components/selection/fill-options-menu.d.ts +32 -0
- package/dist/cjs/components/selection/fill-options-menu.d.ts.map +1 -0
- package/dist/cjs/components/selection/fill-options-menu.js +65 -0
- package/dist/cjs/components/selection/index.d.ts +1 -1
- package/dist/cjs/components/selection/index.d.ts.map +1 -1
- package/dist/cjs/components/selection/index.js +4 -2
- package/dist/cjs/components/selection/types.d.ts +11 -1
- package/dist/cjs/components/selection/types.d.ts.map +1 -1
- package/dist/cjs/components/subtotal-dialog/index.d.ts +30 -0
- package/dist/cjs/components/subtotal-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/subtotal-dialog/index.js +126 -0
- package/dist/cjs/components/text-to-columns-dialog/index.d.ts +37 -0
- package/dist/cjs/components/text-to-columns-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/text-to-columns-dialog/index.js +166 -0
- package/dist/cjs/components/toolbar/background-color-selector.d.ts +13 -1
- package/dist/cjs/components/toolbar/background-color-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/background-color-selector.js +57 -11
- package/dist/cjs/components/toolbar/cell-style-selector.d.ts +15 -2
- package/dist/cjs/components/toolbar/cell-style-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/cell-style-selector.js +56 -3
- package/dist/cjs/components/toolbar/fill-selectors.d.ts +49 -0
- package/dist/cjs/components/toolbar/fill-selectors.d.ts.map +1 -0
- package/dist/cjs/components/toolbar/fill-selectors.js +196 -0
- package/dist/cjs/components/toolbar/index.d.ts +1 -0
- package/dist/cjs/components/toolbar/index.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/index.js +1 -0
- package/dist/cjs/components/toolbar/text-format-selector.d.ts +9 -0
- package/dist/cjs/components/toolbar/text-format-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/text-format-selector.js +15 -3
- package/dist/cjs/components/toolbar/text-horizontal-align-selector.d.ts +8 -0
- package/dist/cjs/components/toolbar/text-horizontal-align-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/text-horizontal-align-selector.js +23 -4
- package/dist/cjs/components/watch-window/index.d.ts +25 -0
- package/dist/cjs/components/watch-window/index.d.ts.map +1 -0
- package/dist/cjs/components/watch-window/index.js +63 -0
- package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
- package/dist/cjs/hooks/use-cell-renderer.js +17 -6
- package/dist/cjs/hooks/use-editable.d.ts +11 -2
- package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editable.js +8 -0
- package/dist/cjs/hooks/use-editor-submit.d.ts +32 -3
- package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editor-submit.js +111 -2
- package/dist/cjs/hooks/use-get-tooltip.d.ts.map +1 -1
- package/dist/cjs/hooks/use-get-tooltip.js +7 -2
- package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
- package/dist/cjs/hooks/use-keyboard-handler.js +27 -14
- package/dist/cjs/hooks/use-selection-renderer.d.ts +13 -2
- package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection-renderer.js +21 -4
- package/dist/cjs/hooks/use-selection.d.ts +54 -4
- package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection.js +232 -37
- package/dist/cjs/index.d.ts +12 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +11 -0
- package/dist/cjs/release-date.js +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/types.d.ts +156 -5
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/types.js +19 -1
- package/dist/esm/api/excel-validation-kinds.d.ts +71 -0
- package/dist/esm/api/excel-validation-kinds.d.ts.map +1 -0
- package/dist/esm/api/excel-validation-kinds.js +287 -0
- package/dist/esm/api/fill-series.d.ts +38 -0
- package/dist/esm/api/fill-series.d.ts.map +1 -0
- package/dist/esm/api/fill-series.js +78 -0
- package/dist/esm/api/go-to-special.d.ts +32 -0
- package/dist/esm/api/go-to-special.d.ts.map +1 -0
- package/dist/esm/api/go-to-special.js +96 -0
- package/dist/esm/api/spreadsheet-api.d.ts +6 -2
- package/dist/esm/api/spreadsheet-api.d.ts.map +1 -1
- package/dist/esm/api/spreadsheet-api.js +8 -3
- package/dist/esm/api/validation-tooltip.d.ts +17 -0
- package/dist/esm/api/validation-tooltip.d.ts.map +1 -0
- package/dist/esm/api/validation-tooltip.js +34 -0
- package/dist/esm/atoms/advanced-filter-dialog.atom.d.ts +28 -0
- package/dist/esm/atoms/advanced-filter-dialog.atom.d.ts.map +1 -0
- package/dist/esm/atoms/advanced-filter-dialog.atom.js +21 -0
- package/dist/esm/atoms/fill-options.atom.d.ts +36 -0
- package/dist/esm/atoms/fill-options.atom.d.ts.map +1 -0
- package/dist/esm/atoms/fill-options.atom.js +5 -0
- package/dist/esm/atoms/fill-series-dialog.atom.d.ts +26 -0
- package/dist/esm/atoms/fill-series-dialog.atom.d.ts.map +1 -0
- package/dist/esm/atoms/fill-series-dialog.atom.js +9 -0
- package/dist/esm/atoms/go-to-dialog.atom.d.ts +11 -1
- package/dist/esm/atoms/go-to-dialog.atom.d.ts.map +1 -1
- package/dist/esm/atoms/goal-seek-dialog.atom.d.ts +29 -0
- package/dist/esm/atoms/goal-seek-dialog.atom.d.ts.map +1 -0
- package/dist/esm/atoms/goal-seek-dialog.atom.js +21 -0
- package/dist/esm/atoms/index.d.ts +3 -0
- package/dist/esm/atoms/index.d.ts.map +1 -1
- package/dist/esm/atoms/index.js +3 -0
- package/dist/esm/atoms/subtotal-dialog.atom.d.ts +39 -0
- package/dist/esm/atoms/subtotal-dialog.atom.d.ts.map +1 -0
- package/dist/esm/atoms/subtotal-dialog.atom.js +21 -0
- package/dist/esm/atoms/text-to-columns-dialog.atom.d.ts +34 -0
- package/dist/esm/atoms/text-to-columns-dialog.atom.d.ts.map +1 -0
- package/dist/esm/atoms/text-to-columns-dialog.atom.js +25 -0
- package/dist/esm/atoms/watch-window.atom.d.ts +37 -0
- package/dist/esm/atoms/watch-window.atom.d.ts.map +1 -0
- package/dist/esm/atoms/watch-window.atom.js +37 -0
- package/dist/esm/components/advanced-filter-dialog/index.d.ts +28 -0
- package/dist/esm/components/advanced-filter-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/advanced-filter-dialog/index.js +125 -0
- package/dist/esm/components/calculation-options-dialog/index.d.ts +33 -0
- package/dist/esm/components/calculation-options-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/calculation-options-dialog/index.js +61 -0
- package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/esm/components/canvas-grid/index.js +266 -26
- package/dist/esm/components/canvas-grid/typings.d.ts +31 -5
- package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/esm/components/cell/alignment.d.ts +30 -0
- package/dist/esm/components/cell/alignment.d.ts.map +1 -1
- package/dist/esm/components/cell/alignment.js +51 -0
- package/dist/esm/components/cell/index.d.ts.map +1 -1
- package/dist/esm/components/cell/index.js +16 -8
- package/dist/esm/components/cell-diff/index.d.ts +3 -2
- package/dist/esm/components/cell-diff/index.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/helpers.d.ts +9 -0
- package/dist/esm/components/cell-editor/helpers.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/helpers.js +6 -0
- package/dist/esm/components/cell-editor/helpers.spec.js +15 -1
- package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/index.js +8 -4
- package/dist/esm/components/context-menu/index.d.ts +6 -1
- package/dist/esm/components/context-menu/index.d.ts.map +1 -1
- package/dist/esm/components/context-menu/index.js +139 -4
- package/dist/esm/components/embeds/embed-component.d.ts.map +1 -1
- package/dist/esm/components/embeds/embed-component.js +17 -1
- package/dist/esm/components/fill-series-dialog/index.d.ts +29 -0
- package/dist/esm/components/fill-series-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/fill-series-dialog/index.js +151 -0
- package/dist/esm/components/go-to-dialog/index.d.ts +11 -1
- package/dist/esm/components/go-to-dialog/index.d.ts.map +1 -1
- package/dist/esm/components/go-to-dialog/index.js +63 -23
- package/dist/esm/components/goal-seek-dialog/index.d.ts +32 -0
- package/dist/esm/components/goal-seek-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/goal-seek-dialog/index.js +125 -0
- package/dist/esm/components/selection/fill-options-menu.d.ts +32 -0
- package/dist/esm/components/selection/fill-options-menu.d.ts.map +1 -0
- package/dist/esm/components/selection/fill-options-menu.js +63 -0
- package/dist/esm/components/selection/index.d.ts +1 -1
- package/dist/esm/components/selection/index.d.ts.map +1 -1
- package/dist/esm/components/selection/index.js +4 -2
- package/dist/esm/components/selection/types.d.ts +11 -1
- package/dist/esm/components/selection/types.d.ts.map +1 -1
- package/dist/esm/components/subtotal-dialog/index.d.ts +30 -0
- package/dist/esm/components/subtotal-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/subtotal-dialog/index.js +115 -0
- package/dist/esm/components/text-to-columns-dialog/index.d.ts +37 -0
- package/dist/esm/components/text-to-columns-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/text-to-columns-dialog/index.js +147 -0
- package/dist/esm/components/toolbar/background-color-selector.d.ts +13 -1
- package/dist/esm/components/toolbar/background-color-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/background-color-selector.js +61 -11
- package/dist/esm/components/toolbar/cell-style-selector.d.ts +15 -2
- package/dist/esm/components/toolbar/cell-style-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/cell-style-selector.js +46 -2
- package/dist/esm/components/toolbar/fill-selectors.d.ts +49 -0
- package/dist/esm/components/toolbar/fill-selectors.d.ts.map +1 -0
- package/dist/esm/components/toolbar/fill-selectors.js +162 -0
- package/dist/esm/components/toolbar/index.d.ts +1 -0
- package/dist/esm/components/toolbar/index.d.ts.map +1 -1
- package/dist/esm/components/toolbar/index.js +1 -0
- package/dist/esm/components/toolbar/text-format-selector.d.ts +9 -0
- package/dist/esm/components/toolbar/text-format-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/text-format-selector.js +14 -2
- package/dist/esm/components/toolbar/text-horizontal-align-selector.d.ts +8 -0
- package/dist/esm/components/toolbar/text-horizontal-align-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/text-horizontal-align-selector.js +21 -5
- package/dist/esm/components/watch-window/index.d.ts +25 -0
- package/dist/esm/components/watch-window/index.d.ts.map +1 -0
- package/dist/esm/components/watch-window/index.js +54 -0
- package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
- package/dist/esm/hooks/use-cell-renderer.js +17 -6
- package/dist/esm/hooks/use-editable.d.ts +11 -2
- package/dist/esm/hooks/use-editable.d.ts.map +1 -1
- package/dist/esm/hooks/use-editable.js +8 -0
- package/dist/esm/hooks/use-editor-submit.d.ts +32 -3
- package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
- package/dist/esm/hooks/use-editor-submit.js +82 -3
- package/dist/esm/hooks/use-get-tooltip.d.ts.map +1 -1
- package/dist/esm/hooks/use-get-tooltip.js +7 -2
- package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
- package/dist/esm/hooks/use-keyboard-handler.js +27 -14
- package/dist/esm/hooks/use-selection-renderer.d.ts +13 -2
- package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection-renderer.js +22 -5
- package/dist/esm/hooks/use-selection.d.ts +54 -4
- package/dist/esm/hooks/use-selection.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection.js +220 -36
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +11 -0
- package/dist/esm/release-date.js +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/types.d.ts +156 -5
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +18 -0
- package/dist/spreadsheet.min.css +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useOpenTextToColumnsDialog = exports.useRegisterTextToColumnsDialogHost = exports.useIsTextToColumnsDialogMounted = exports.textToColumnsDialogHostCountAtom = exports.useTextToColumnsDialogState = exports.textToColumnsDialogAtom = void 0;
|
|
4
|
+
var jotai_1 = require("jotai");
|
|
5
|
+
var react_1 = require("react");
|
|
6
|
+
exports.textToColumnsDialogAtom = (0, jotai_1.atom)(null);
|
|
7
|
+
var useTextToColumnsDialogState = function () {
|
|
8
|
+
return (0, jotai_1.useAtom)(exports.textToColumnsDialogAtom);
|
|
9
|
+
};
|
|
10
|
+
exports.useTextToColumnsDialogState = useTextToColumnsDialogState;
|
|
11
|
+
/**
|
|
12
|
+
* Number of mounted `TextToColumnsDialogHost`s. The context menu only offers
|
|
13
|
+
* "Fixed width…" while a host is mounted, so a host that has not adopted the
|
|
14
|
+
* dialog keeps its one-click delimiter items and no dead entry.
|
|
15
|
+
*/
|
|
16
|
+
exports.textToColumnsDialogHostCountAtom = (0, jotai_1.atom)(0);
|
|
17
|
+
/** True when at least one `TextToColumnsDialogHost` is mounted. */
|
|
18
|
+
var useIsTextToColumnsDialogMounted = function () {
|
|
19
|
+
return (0, jotai_1.useAtomValue)(exports.textToColumnsDialogHostCountAtom) > 0;
|
|
20
|
+
};
|
|
21
|
+
exports.useIsTextToColumnsDialogMounted = useIsTextToColumnsDialogMounted;
|
|
22
|
+
/** Registers the calling component as a dialog host for its lifetime. */
|
|
23
|
+
var useRegisterTextToColumnsDialogHost = function () {
|
|
24
|
+
var setCount = (0, jotai_1.useSetAtom)(exports.textToColumnsDialogHostCountAtom);
|
|
25
|
+
(0, react_1.useEffect)(function () {
|
|
26
|
+
setCount(function (count) { return count + 1; });
|
|
27
|
+
return function () { return setCount(function (count) { return count - 1; }); };
|
|
28
|
+
}, [setCount]);
|
|
29
|
+
};
|
|
30
|
+
exports.useRegisterTextToColumnsDialogHost = useRegisterTextToColumnsDialogHost;
|
|
31
|
+
/** Returns a function that opens the host-mounted Text to Columns dialog. */
|
|
32
|
+
var useOpenTextToColumnsDialog = function () {
|
|
33
|
+
var setRequest = (0, jotai_1.useSetAtom)(exports.textToColumnsDialogAtom);
|
|
34
|
+
return (0, react_1.useCallback)(function (request) { return setRequest(request); }, [setRequest]);
|
|
35
|
+
};
|
|
36
|
+
exports.useOpenTextToColumnsDialog = useOpenTextToColumnsDialog;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { SheetCoordinate } from "../types";
|
|
2
|
+
/** A watched cell (Excel's Watch Window row). */
|
|
3
|
+
export type WatchWindowEntry = SheetCoordinate;
|
|
4
|
+
/**
|
|
5
|
+
* What the grid publishes so the host-mounted panel can show live values
|
|
6
|
+
* and jump to a cell. Republished on every grid render while a host is
|
|
7
|
+
* mounted, so values track recalculation.
|
|
8
|
+
*/
|
|
9
|
+
export type WatchWindowContext = {
|
|
10
|
+
getSheetName?: (sheetId: number) => string | undefined;
|
|
11
|
+
getFormattedValue: (sheetId: number, rowIndex: number, columnIndex: number) => string | undefined;
|
|
12
|
+
getFormula: (sheetId: number, rowIndex: number, columnIndex: number) => string | undefined | null;
|
|
13
|
+
onNavigate: (cell: SheetCoordinate) => void;
|
|
14
|
+
};
|
|
15
|
+
export declare const watchWindowEntriesAtom: import("jotai").PrimitiveAtom<SheetCoordinate[]> & {
|
|
16
|
+
init: SheetCoordinate[];
|
|
17
|
+
};
|
|
18
|
+
export declare const watchWindowOpenAtom: import("jotai").PrimitiveAtom<boolean> & {
|
|
19
|
+
init: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare const watchWindowContextAtom: import("jotai").PrimitiveAtom<WatchWindowContext | null> & {
|
|
22
|
+
init: WatchWindowContext | null;
|
|
23
|
+
};
|
|
24
|
+
/** Number of mounted `WatchWindowHost`s — the grid offers "Add watch" only then. */
|
|
25
|
+
export declare const watchWindowHostCountAtom: import("jotai").PrimitiveAtom<number> & {
|
|
26
|
+
init: number;
|
|
27
|
+
};
|
|
28
|
+
export declare const useIsWatchWindowMounted: () => boolean;
|
|
29
|
+
export declare const useRegisterWatchWindowHost: () => void;
|
|
30
|
+
export declare const useWatchWindowEntries: () => [SheetCoordinate[], (args_0: SheetCoordinate[] | ((prev: SheetCoordinate[]) => SheetCoordinate[])) => void];
|
|
31
|
+
export declare const useWatchWindowOpen: () => [boolean, (args_0: boolean | ((prev: boolean) => boolean)) => void];
|
|
32
|
+
export declare const useWatchWindowContext: () => WatchWindowContext | null;
|
|
33
|
+
export declare const useSetWatchWindowContext: () => (args_0: WatchWindowContext | ((prev: WatchWindowContext | null) => WatchWindowContext | null) | null) => void;
|
|
34
|
+
/** Adds a cell (once) and opens the panel. */
|
|
35
|
+
export declare const useAddWatch: () => (cell: SheetCoordinate) => void;
|
|
36
|
+
export declare const useRemoveWatch: () => (cell: SheetCoordinate) => void;
|
|
37
|
+
//# sourceMappingURL=watch-window.atom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-window.atom.d.ts","sourceRoot":"","sources":["../../../atoms/watch-window.atom.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,iDAAiD;AACjD,MAAM,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAE/C;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACvD,iBAAiB,EAAE,CACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,MAAM,GAAG,SAAS,CAAC;IACxB,UAAU,EAAE,CACV,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,sBAAsB;;CAA+B,CAAC;AACnE,eAAO,MAAM,mBAAmB;;CAAc,CAAC;AAC/C,eAAO,MAAM,sBAAsB;;CAAwC,CAAC;AAE5E,oFAAoF;AACpF,eAAO,MAAM,wBAAwB;;CAAU,CAAC;AAEhD,eAAO,MAAM,uBAAuB,eACQ,CAAC;AAE7C,eAAO,MAAM,0BAA0B,YAMtC,CAAC;AAEF,eAAO,MAAM,qBAAqB,mHAAwC,CAAC;AAC3E,eAAO,MAAM,kBAAkB,2EAAqC,CAAC;AACrE,eAAO,MAAM,qBAAqB,iCAA6C,CAAC;AAChF,eAAO,MAAM,wBAAwB,sHACD,CAAC;AAOrC,8CAA8C;AAC9C,eAAO,MAAM,WAAW,eAIb,eAAe,SAUzB,CAAC;AAEF,eAAO,MAAM,cAAc,eAGhB,eAAe,SAMzB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useRemoveWatch = exports.useAddWatch = exports.useSetWatchWindowContext = exports.useWatchWindowContext = exports.useWatchWindowOpen = exports.useWatchWindowEntries = exports.useRegisterWatchWindowHost = exports.useIsWatchWindowMounted = exports.watchWindowHostCountAtom = exports.watchWindowContextAtom = exports.watchWindowOpenAtom = exports.watchWindowEntriesAtom = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var jotai_1 = require("jotai");
|
|
6
|
+
var react_1 = require("react");
|
|
7
|
+
exports.watchWindowEntriesAtom = (0, jotai_1.atom)([]);
|
|
8
|
+
exports.watchWindowOpenAtom = (0, jotai_1.atom)(false);
|
|
9
|
+
exports.watchWindowContextAtom = (0, jotai_1.atom)(null);
|
|
10
|
+
/** Number of mounted `WatchWindowHost`s — the grid offers "Add watch" only then. */
|
|
11
|
+
exports.watchWindowHostCountAtom = (0, jotai_1.atom)(0);
|
|
12
|
+
var useIsWatchWindowMounted = function () {
|
|
13
|
+
return (0, jotai_1.useAtomValue)(exports.watchWindowHostCountAtom) > 0;
|
|
14
|
+
};
|
|
15
|
+
exports.useIsWatchWindowMounted = useIsWatchWindowMounted;
|
|
16
|
+
var useRegisterWatchWindowHost = function () {
|
|
17
|
+
var setCount = (0, jotai_1.useSetAtom)(exports.watchWindowHostCountAtom);
|
|
18
|
+
(0, react_1.useEffect)(function () {
|
|
19
|
+
setCount(function (count) { return count + 1; });
|
|
20
|
+
return function () { return setCount(function (count) { return count - 1; }); };
|
|
21
|
+
}, [setCount]);
|
|
22
|
+
};
|
|
23
|
+
exports.useRegisterWatchWindowHost = useRegisterWatchWindowHost;
|
|
24
|
+
var useWatchWindowEntries = function () { return (0, jotai_1.useAtom)(exports.watchWindowEntriesAtom); };
|
|
25
|
+
exports.useWatchWindowEntries = useWatchWindowEntries;
|
|
26
|
+
var useWatchWindowOpen = function () { return (0, jotai_1.useAtom)(exports.watchWindowOpenAtom); };
|
|
27
|
+
exports.useWatchWindowOpen = useWatchWindowOpen;
|
|
28
|
+
var useWatchWindowContext = function () { return (0, jotai_1.useAtomValue)(exports.watchWindowContextAtom); };
|
|
29
|
+
exports.useWatchWindowContext = useWatchWindowContext;
|
|
30
|
+
var useSetWatchWindowContext = function () {
|
|
31
|
+
return (0, jotai_1.useSetAtom)(exports.watchWindowContextAtom);
|
|
32
|
+
};
|
|
33
|
+
exports.useSetWatchWindowContext = useSetWatchWindowContext;
|
|
34
|
+
var sameCell = function (a, b) {
|
|
35
|
+
return a.sheetId === b.sheetId &&
|
|
36
|
+
a.rowIndex === b.rowIndex &&
|
|
37
|
+
a.columnIndex === b.columnIndex;
|
|
38
|
+
};
|
|
39
|
+
/** Adds a cell (once) and opens the panel. */
|
|
40
|
+
var useAddWatch = function () {
|
|
41
|
+
var setEntries = (0, jotai_1.useSetAtom)(exports.watchWindowEntriesAtom);
|
|
42
|
+
var setOpen = (0, jotai_1.useSetAtom)(exports.watchWindowOpenAtom);
|
|
43
|
+
return (0, react_1.useCallback)(function (cell) {
|
|
44
|
+
setEntries(function (entries) {
|
|
45
|
+
return entries.some(function (entry) { return sameCell(entry, cell); })
|
|
46
|
+
? entries
|
|
47
|
+
: tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(entries), false), [cell], false);
|
|
48
|
+
});
|
|
49
|
+
setOpen(true);
|
|
50
|
+
}, [setEntries, setOpen]);
|
|
51
|
+
};
|
|
52
|
+
exports.useAddWatch = useAddWatch;
|
|
53
|
+
var useRemoveWatch = function () {
|
|
54
|
+
var setEntries = (0, jotai_1.useSetAtom)(exports.watchWindowEntriesAtom);
|
|
55
|
+
return (0, react_1.useCallback)(function (cell) {
|
|
56
|
+
return setEntries(function (entries) {
|
|
57
|
+
return entries.filter(function (entry) { return !sameCell(entry, cell); });
|
|
58
|
+
});
|
|
59
|
+
}, [setEntries]);
|
|
60
|
+
};
|
|
61
|
+
exports.useRemoveWatch = useRemoveWatch;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { AdvancedFilterOptions } from "../../types";
|
|
3
|
+
export type AdvancedFilterDialogProps = {
|
|
4
|
+
/** Controls visibility. */
|
|
5
|
+
open: boolean;
|
|
6
|
+
onOpenChange(open: boolean): void;
|
|
7
|
+
/** Default "List range" (A1 reference of the data block around the active cell). */
|
|
8
|
+
initialListRange: string;
|
|
9
|
+
/** Emits the resolved options; the host routes them to `onAdvancedFilter`. */
|
|
10
|
+
onApply(options: AdvancedFilterOptions): void;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Excel's Advanced Filter dialog: filter in place or copy to another
|
|
14
|
+
* location, a list range, a criteria range (header row + criteria rows),
|
|
15
|
+
* the copy destination and "Unique records only".
|
|
16
|
+
*/
|
|
17
|
+
export declare const AdvancedFilterDialog: React.MemoExoticComponent<({ open, onOpenChange, initialListRange, onApply }: AdvancedFilterDialogProps) => React.JSX.Element>;
|
|
18
|
+
/**
|
|
19
|
+
* Host-mounted, atom-driven wrapper around {@link AdvancedFilterDialog}.
|
|
20
|
+
* Mount once in the host; the context menu opens it via
|
|
21
|
+
* `useOpenAdvancedFilterDialog` and only offers the item while a host is
|
|
22
|
+
* mounted.
|
|
23
|
+
*/
|
|
24
|
+
export declare const AdvancedFilterDialogHost: {
|
|
25
|
+
(): React.JSX.Element;
|
|
26
|
+
displayName: string;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/advanced-filter-dialog/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAMtE,OAAO,KAAK,EAAwB,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE/E,MAAM,MAAM,yBAAyB,GAAG;IACtC,2BAA2B;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,oFAAoF;IACpF,gBAAgB,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC/C,CAAC;AAQF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gFACqB,yBAAyB,uBAsK9E,CAAC;AAIF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;CAcpC,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdvancedFilterDialogHost = exports.AdvancedFilterDialog = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var icons_1 = require("@rowsncolumns/icons");
|
|
6
|
+
var ui_1 = require("@rowsncolumns/ui");
|
|
7
|
+
var utils_1 = require("@rowsncolumns/utils");
|
|
8
|
+
var react_1 = tslib_1.__importStar(require("react"));
|
|
9
|
+
var advanced_filter_dialog_atom_1 = require("../../atoms/advanced-filter-dialog.atom");
|
|
10
|
+
var parseRange = function (text) {
|
|
11
|
+
var _a;
|
|
12
|
+
var trimmed = text.trim().replace(/^[^!]*!/, "");
|
|
13
|
+
if (!/^\$?[A-Za-z]{1,3}\$?\d+(:\$?[A-Za-z]{1,3}\$?\d+)?$/.test(trimmed))
|
|
14
|
+
return undefined;
|
|
15
|
+
return (_a = (0, utils_1.addressToSelection)(trimmed)) === null || _a === void 0 ? void 0 : _a.range;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Excel's Advanced Filter dialog: filter in place or copy to another
|
|
19
|
+
* location, a list range, a criteria range (header row + criteria rows),
|
|
20
|
+
* the copy destination and "Unique records only".
|
|
21
|
+
*/
|
|
22
|
+
exports.AdvancedFilterDialog = (0, react_1.memo)(function (_a) {
|
|
23
|
+
var open = _a.open, onOpenChange = _a.onOpenChange, initialListRange = _a.initialListRange, onApply = _a.onApply;
|
|
24
|
+
var _b = tslib_1.__read((0, react_1.useState)("filter"), 2), action = _b[0], setAction = _b[1];
|
|
25
|
+
var _c = tslib_1.__read((0, react_1.useState)(initialListRange), 2), listRange = _c[0], setListRange = _c[1];
|
|
26
|
+
var _d = tslib_1.__read((0, react_1.useState)(""), 2), criteriaRange = _d[0], setCriteriaRange = _d[1];
|
|
27
|
+
var _e = tslib_1.__read((0, react_1.useState)(""), 2), copyTo = _e[0], setCopyTo = _e[1];
|
|
28
|
+
var _f = tslib_1.__read((0, react_1.useState)(false), 2), uniqueOnly = _f[0], setUniqueOnly = _f[1];
|
|
29
|
+
var _g = tslib_1.__read((0, react_1.useState)(undefined), 2), error = _g[0], setError = _g[1];
|
|
30
|
+
(0, react_1.useEffect)(function () {
|
|
31
|
+
if (open) {
|
|
32
|
+
setAction("filter");
|
|
33
|
+
setListRange(initialListRange);
|
|
34
|
+
setCriteriaRange("");
|
|
35
|
+
setCopyTo("");
|
|
36
|
+
setUniqueOnly(false);
|
|
37
|
+
setError(undefined);
|
|
38
|
+
}
|
|
39
|
+
// Only reset on open transitions.
|
|
40
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
41
|
+
}, [open]);
|
|
42
|
+
var submit = (0, react_1.useCallback)(function (event) {
|
|
43
|
+
var _a;
|
|
44
|
+
event.preventDefault();
|
|
45
|
+
var list = parseRange(listRange);
|
|
46
|
+
if (!list) {
|
|
47
|
+
setError("List range must be a range reference, e.g. A1:C20.");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
var criteria = parseRange(criteriaRange);
|
|
51
|
+
if (!criteria) {
|
|
52
|
+
setError("Criteria range must be a range reference, e.g. E1:F3.");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
var destination;
|
|
56
|
+
if (action === "copy") {
|
|
57
|
+
var cell = (0, utils_1.addressToCell)((_a = copyTo.trim().replace(/^[^!]*!/, "").split(":")[0]) !== null && _a !== void 0 ? _a : "");
|
|
58
|
+
if (!copyTo.trim() || !cell) {
|
|
59
|
+
setError("Copy to must be a cell reference, e.g. H1.");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
destination = cell;
|
|
63
|
+
}
|
|
64
|
+
setError(undefined);
|
|
65
|
+
onApply({
|
|
66
|
+
listRange: list,
|
|
67
|
+
criteriaRange: criteria,
|
|
68
|
+
action: action,
|
|
69
|
+
copyTo: destination,
|
|
70
|
+
uniqueOnly: uniqueOnly,
|
|
71
|
+
});
|
|
72
|
+
onOpenChange(false);
|
|
73
|
+
}, [action, listRange, criteriaRange, copyTo, uniqueOnly, onApply, onOpenChange]);
|
|
74
|
+
return (react_1.default.createElement(ui_1.Dialog, { open: open, onOpenChange: onOpenChange },
|
|
75
|
+
react_1.default.createElement(ui_1.DialogContent, { className: "w-[400px] max-w-[92vw] pointer-events-auto" },
|
|
76
|
+
react_1.default.createElement(ui_1.DialogTitle, null, "Advanced filter"),
|
|
77
|
+
react_1.default.createElement(ui_1.DialogDescription, null, "Filter a list with a criteria range: conditions in one row AND together, rows OR together."),
|
|
78
|
+
react_1.default.createElement(ui_1.DialogCloseButton, { onClick: function () { return onOpenChange(false); } },
|
|
79
|
+
react_1.default.createElement(icons_1.Cross1Icon, null)),
|
|
80
|
+
react_1.default.createElement(ui_1.DialogBody, { className: "flex flex-col gap-3 font-system text-sm" },
|
|
81
|
+
react_1.default.createElement("form", { className: "flex flex-col gap-3", onSubmit: submit },
|
|
82
|
+
react_1.default.createElement("div", { className: "flex flex-col gap-1", role: "radiogroup", "aria-label": "Action" },
|
|
83
|
+
react_1.default.createElement("label", { className: "flex items-center gap-1" },
|
|
84
|
+
react_1.default.createElement("input", { type: "radio", name: "advanced-filter-action", value: "filter", checked: action === "filter", onChange: function () { return setAction("filter"); } }),
|
|
85
|
+
"Filter the list, in-place"),
|
|
86
|
+
react_1.default.createElement("label", { className: "flex items-center gap-1" },
|
|
87
|
+
react_1.default.createElement("input", { type: "radio", name: "advanced-filter-action", value: "copy", checked: action === "copy", onChange: function () { return setAction("copy"); } }),
|
|
88
|
+
"Copy to another location")),
|
|
89
|
+
react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
90
|
+
"List range:",
|
|
91
|
+
react_1.default.createElement(ui_1.Input, { value: listRange, "aria-label": "List range", onChange: function (e) {
|
|
92
|
+
setListRange(e.target.value);
|
|
93
|
+
setError(undefined);
|
|
94
|
+
} })),
|
|
95
|
+
react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
96
|
+
"Criteria range:",
|
|
97
|
+
react_1.default.createElement(ui_1.Input, { autoFocus: true, value: criteriaRange, "aria-label": "Criteria range", placeholder: "e.g. E1:F3", onChange: function (e) {
|
|
98
|
+
setCriteriaRange(e.target.value);
|
|
99
|
+
setError(undefined);
|
|
100
|
+
} })),
|
|
101
|
+
action === "copy" ? (react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
102
|
+
"Copy to:",
|
|
103
|
+
react_1.default.createElement(ui_1.Input, { value: copyTo, "aria-label": "Copy to", placeholder: "e.g. H1", onChange: function (e) {
|
|
104
|
+
setCopyTo(e.target.value);
|
|
105
|
+
setError(undefined);
|
|
106
|
+
} }))) : null,
|
|
107
|
+
react_1.default.createElement("label", { className: "flex items-center gap-1" },
|
|
108
|
+
react_1.default.createElement("input", { type: "checkbox", name: "uniqueOnly", checked: uniqueOnly, onChange: function (e) { return setUniqueOnly(e.target.checked); } }),
|
|
109
|
+
"Unique records only"),
|
|
110
|
+
error ? (react_1.default.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
|
|
111
|
+
react_1.default.createElement(ui_1.Separator, null),
|
|
112
|
+
react_1.default.createElement("div", { className: "flex justify-end gap-2" },
|
|
113
|
+
react_1.default.createElement(ui_1.Button, { type: "button", variant: "outline", size: "sm", onClick: function () { return onOpenChange(false); } }, "Cancel"),
|
|
114
|
+
react_1.default.createElement(ui_1.Button, { type: "submit", size: "sm" }, "OK")))))));
|
|
115
|
+
});
|
|
116
|
+
exports.AdvancedFilterDialog.displayName = "AdvancedFilterDialog";
|
|
117
|
+
/**
|
|
118
|
+
* Host-mounted, atom-driven wrapper around {@link AdvancedFilterDialog}.
|
|
119
|
+
* Mount once in the host; the context menu opens it via
|
|
120
|
+
* `useOpenAdvancedFilterDialog` and only offers the item while a host is
|
|
121
|
+
* mounted.
|
|
122
|
+
*/
|
|
123
|
+
var AdvancedFilterDialogHost = function () {
|
|
124
|
+
var _a;
|
|
125
|
+
(0, advanced_filter_dialog_atom_1.useRegisterAdvancedFilterDialogHost)();
|
|
126
|
+
var _b = tslib_1.__read((0, advanced_filter_dialog_atom_1.useAdvancedFilterDialogState)(), 2), request = _b[0], setRequest = _b[1];
|
|
127
|
+
var close = (0, react_1.useCallback)(function () { return setRequest(null); }, [setRequest]);
|
|
128
|
+
return (react_1.default.createElement(exports.AdvancedFilterDialog, { open: request != null, onOpenChange: function (open) {
|
|
129
|
+
if (!open)
|
|
130
|
+
close();
|
|
131
|
+
}, initialListRange: (_a = request === null || request === void 0 ? void 0 : request.listRange) !== null && _a !== void 0 ? _a : "", onApply: function (options) { return request === null || request === void 0 ? void 0 : request.onApply(options); } }));
|
|
132
|
+
};
|
|
133
|
+
exports.AdvancedFilterDialogHost = AdvancedFilterDialogHost;
|
|
134
|
+
exports.AdvancedFilterDialogHost.displayName = "AdvancedFilterDialogHost";
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { IterativeCalculationOptions } from "../../types";
|
|
3
|
+
/** Excel's defaults (File → Options → Formulas → Calculation options). */
|
|
4
|
+
export declare const DEFAULT_ITERATIVE_CALCULATION: Required<IterativeCalculationOptions>;
|
|
5
|
+
/**
|
|
6
|
+
* Normalise a form draft the way Excel does: iterations are a whole number
|
|
7
|
+
* 1…32767, maximum change is a non-negative number; anything else falls
|
|
8
|
+
* back to the current value.
|
|
9
|
+
*/
|
|
10
|
+
export declare const normalizeIterativeCalculation: (draft: {
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
maxIterations: string;
|
|
13
|
+
maxChange: string;
|
|
14
|
+
}, current: IterativeCalculationOptions | undefined) => IterativeCalculationOptions;
|
|
15
|
+
export type CalculationOptionsDialogProps = {
|
|
16
|
+
open: boolean;
|
|
17
|
+
onOpenChange(open: boolean): void;
|
|
18
|
+
/** The workbook's current policy (host state / engine setting). */
|
|
19
|
+
value?: IterativeCalculationOptions | null;
|
|
20
|
+
/**
|
|
21
|
+
* Receives the new policy on OK. Legacy engine: feed it back into the
|
|
22
|
+
* `iterativeCalculation` prop of `useSpreadsheetState`; rnc engine: the
|
|
23
|
+
* `set-iterative-calculation` command.
|
|
24
|
+
*/
|
|
25
|
+
onChange(next: IterativeCalculationOptions): void;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Excel's iterative-calculation options (enable / maximum iterations /
|
|
29
|
+
* maximum change) as a dialog. Purely presentational — the host owns the
|
|
30
|
+
* setting and applies it through `onChange`.
|
|
31
|
+
*/
|
|
32
|
+
export declare const CalculationOptionsDialog: React.MemoExoticComponent<({ open, onOpenChange, value, onChange }: CalculationOptionsDialogProps) => React.JSX.Element>;
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/calculation-options-dialog/index.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAyB,MAAM,OAAO,CAAC;AAE9C,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE/D,0EAA0E;AAC1E,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,2BAA2B,CAK7E,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GACxC,OAAO;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACrE,SAAS,2BAA2B,GAAG,SAAS,KAC/C,2BAeF,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,mEAAmE;IACnE,KAAK,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAAC;CACnD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,sEACO,6BAA6B,uBAgFxE,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CalculationOptionsDialog = exports.normalizeIterativeCalculation = exports.DEFAULT_ITERATIVE_CALCULATION = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var ui_1 = require("@rowsncolumns/ui");
|
|
6
|
+
var react_1 = tslib_1.__importStar(require("react"));
|
|
7
|
+
/** Excel's defaults (File → Options → Formulas → Calculation options). */
|
|
8
|
+
exports.DEFAULT_ITERATIVE_CALCULATION = {
|
|
9
|
+
enabled: false,
|
|
10
|
+
maxIterations: 100,
|
|
11
|
+
maxChange: 0.001,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Normalise a form draft the way Excel does: iterations are a whole number
|
|
15
|
+
* 1…32767, maximum change is a non-negative number; anything else falls
|
|
16
|
+
* back to the current value.
|
|
17
|
+
*/
|
|
18
|
+
var normalizeIterativeCalculation = function (draft, current) {
|
|
19
|
+
var _a, _b;
|
|
20
|
+
var parse = function (text) { return (text.trim() === "" ? NaN : Number(text)); };
|
|
21
|
+
var iterations = parse(draft.maxIterations);
|
|
22
|
+
var change = parse(draft.maxChange);
|
|
23
|
+
return {
|
|
24
|
+
enabled: draft.enabled,
|
|
25
|
+
maxIterations: Number.isFinite(iterations) && iterations >= 1
|
|
26
|
+
? Math.min(32767, Math.floor(iterations))
|
|
27
|
+
: (_a = current === null || current === void 0 ? void 0 : current.maxIterations) !== null && _a !== void 0 ? _a : exports.DEFAULT_ITERATIVE_CALCULATION.maxIterations,
|
|
28
|
+
maxChange: Number.isFinite(change) && change >= 0
|
|
29
|
+
? change
|
|
30
|
+
: (_b = current === null || current === void 0 ? void 0 : current.maxChange) !== null && _b !== void 0 ? _b : exports.DEFAULT_ITERATIVE_CALCULATION.maxChange,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
exports.normalizeIterativeCalculation = normalizeIterativeCalculation;
|
|
34
|
+
/**
|
|
35
|
+
* Excel's iterative-calculation options (enable / maximum iterations /
|
|
36
|
+
* maximum change) as a dialog. Purely presentational — the host owns the
|
|
37
|
+
* setting and applies it through `onChange`.
|
|
38
|
+
*/
|
|
39
|
+
exports.CalculationOptionsDialog = (0, react_1.memo)(function (_a) {
|
|
40
|
+
var _b, _c, _d;
|
|
41
|
+
var open = _a.open, onOpenChange = _a.onOpenChange, value = _a.value, onChange = _a.onChange;
|
|
42
|
+
var _e = tslib_1.__read((0, react_1.useState)((_b = value === null || value === void 0 ? void 0 : value.enabled) !== null && _b !== void 0 ? _b : false), 2), enabled = _e[0], setEnabled = _e[1];
|
|
43
|
+
var _f = tslib_1.__read((0, react_1.useState)(String((_c = value === null || value === void 0 ? void 0 : value.maxIterations) !== null && _c !== void 0 ? _c : exports.DEFAULT_ITERATIVE_CALCULATION.maxIterations)), 2), maxIterations = _f[0], setMaxIterations = _f[1];
|
|
44
|
+
var _g = tslib_1.__read((0, react_1.useState)(String((_d = value === null || value === void 0 ? void 0 : value.maxChange) !== null && _d !== void 0 ? _d : exports.DEFAULT_ITERATIVE_CALCULATION.maxChange)), 2), maxChange = _g[0], setMaxChange = _g[1];
|
|
45
|
+
return (react_1.default.createElement(ui_1.Dialog, { open: open, onOpenChange: onOpenChange, modal: true },
|
|
46
|
+
react_1.default.createElement(ui_1.DialogContent, { className: "w-[360px] max-w-[92vw] pointer-events-auto" },
|
|
47
|
+
react_1.default.createElement(ui_1.DialogTitle, null, "Calculation options"),
|
|
48
|
+
react_1.default.createElement(ui_1.DialogCloseButton, null),
|
|
49
|
+
react_1.default.createElement(ui_1.DialogBody, { className: "flex flex-col gap-3" },
|
|
50
|
+
react_1.default.createElement("form", { className: "flex flex-col gap-3", onSubmit: function (e) {
|
|
51
|
+
e.preventDefault();
|
|
52
|
+
onChange((0, exports.normalizeIterativeCalculation)({ enabled: enabled, maxIterations: maxIterations, maxChange: maxChange }, value !== null && value !== void 0 ? value : undefined));
|
|
53
|
+
onOpenChange(false);
|
|
54
|
+
} },
|
|
55
|
+
react_1.default.createElement("label", { className: "flex items-center gap-2 text-xs font-medium" },
|
|
56
|
+
react_1.default.createElement("input", { type: "checkbox", checked: enabled, onChange: function (e) { return setEnabled(e.target.checked); } }),
|
|
57
|
+
"Enable iterative calculation"),
|
|
58
|
+
react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
59
|
+
"Maximum iterations:",
|
|
60
|
+
react_1.default.createElement(ui_1.Input, { type: "number", min: 1, max: 32767, step: 1, value: maxIterations, disabled: !enabled, onChange: function (e) { return setMaxIterations(e.target.value); } })),
|
|
61
|
+
react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
62
|
+
"Maximum change:",
|
|
63
|
+
react_1.default.createElement(ui_1.Input, { type: "number", min: 0, step: "any", value: maxChange, disabled: !enabled, onChange: function (e) { return setMaxChange(e.target.value); } })),
|
|
64
|
+
react_1.default.createElement(ui_1.Separator, null),
|
|
65
|
+
react_1.default.createElement("div", { className: "flex justify-end gap-2" },
|
|
66
|
+
react_1.default.createElement(ui_1.Button, { type: "button", variant: "outline", size: "sm", onClick: function () { return onOpenChange(false); } }, "Cancel"),
|
|
67
|
+
react_1.default.createElement(ui_1.Button, { type: "submit", size: "sm" }, "OK")))))));
|
|
68
|
+
});
|
|
69
|
+
exports.CalculationOptionsDialog.displayName = "CalculationOptionsDialog";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/canvas-grid/index.tsx"],"names":[],"mappings":"AA2CA,OAAO,KASN,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/canvas-grid/index.tsx"],"names":[],"mappings":"AA2CA,OAAO,KASN,MAAM,OAAO,CAAC;AA4Lf,OAAO,KAAK,EAGV,QAAQ,EAUT,MAAM,aAAa,CAAC;AAcrB,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EAEhB,MAAM,WAAW,CAAC;AAmkKnB,eAAO,MAAM,UAAU,EAA4C,CACjE,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC,EAEvB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GACvB,wBAAwB,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAAE,KAChE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC"}
|