@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,125 @@
|
|
|
1
|
+
import { Cross1Icon } from "@rowsncolumns/icons";
|
|
2
|
+
import { Button, Dialog, DialogBody, DialogCloseButton, DialogContent, DialogDescription, DialogTitle, Input, Separator, } from "@rowsncolumns/ui";
|
|
3
|
+
import { addressToCell, addressToSelection } from "@rowsncolumns/utils";
|
|
4
|
+
import React, { memo, useCallback, useEffect, useState } from "react";
|
|
5
|
+
import { useAdvancedFilterDialogState, useRegisterAdvancedFilterDialogHost, } from "../../atoms/advanced-filter-dialog.atom";
|
|
6
|
+
const parseRange = (text) => {
|
|
7
|
+
const trimmed = text.trim().replace(/^[^!]*!/, "");
|
|
8
|
+
if (!/^\$?[A-Za-z]{1,3}\$?\d+(:\$?[A-Za-z]{1,3}\$?\d+)?$/.test(trimmed))
|
|
9
|
+
return undefined;
|
|
10
|
+
return addressToSelection(trimmed)?.range;
|
|
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 const AdvancedFilterDialog = memo(({ open, onOpenChange, initialListRange, onApply }) => {
|
|
18
|
+
const [action, setAction] = useState("filter");
|
|
19
|
+
const [listRange, setListRange] = useState(initialListRange);
|
|
20
|
+
const [criteriaRange, setCriteriaRange] = useState("");
|
|
21
|
+
const [copyTo, setCopyTo] = useState("");
|
|
22
|
+
const [uniqueOnly, setUniqueOnly] = useState(false);
|
|
23
|
+
const [error, setError] = useState(undefined);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (open) {
|
|
26
|
+
setAction("filter");
|
|
27
|
+
setListRange(initialListRange);
|
|
28
|
+
setCriteriaRange("");
|
|
29
|
+
setCopyTo("");
|
|
30
|
+
setUniqueOnly(false);
|
|
31
|
+
setError(undefined);
|
|
32
|
+
}
|
|
33
|
+
// Only reset on open transitions.
|
|
34
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
35
|
+
}, [open]);
|
|
36
|
+
const submit = useCallback((event) => {
|
|
37
|
+
event.preventDefault();
|
|
38
|
+
const list = parseRange(listRange);
|
|
39
|
+
if (!list) {
|
|
40
|
+
setError("List range must be a range reference, e.g. A1:C20.");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const criteria = parseRange(criteriaRange);
|
|
44
|
+
if (!criteria) {
|
|
45
|
+
setError("Criteria range must be a range reference, e.g. E1:F3.");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
let destination;
|
|
49
|
+
if (action === "copy") {
|
|
50
|
+
const cell = addressToCell(copyTo.trim().replace(/^[^!]*!/, "").split(":")[0] ?? "");
|
|
51
|
+
if (!copyTo.trim() || !cell) {
|
|
52
|
+
setError("Copy to must be a cell reference, e.g. H1.");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
destination = cell;
|
|
56
|
+
}
|
|
57
|
+
setError(undefined);
|
|
58
|
+
onApply({
|
|
59
|
+
listRange: list,
|
|
60
|
+
criteriaRange: criteria,
|
|
61
|
+
action,
|
|
62
|
+
copyTo: destination,
|
|
63
|
+
uniqueOnly,
|
|
64
|
+
});
|
|
65
|
+
onOpenChange(false);
|
|
66
|
+
}, [action, listRange, criteriaRange, copyTo, uniqueOnly, onApply, onOpenChange]);
|
|
67
|
+
return (React.createElement(Dialog, { open: open, onOpenChange: onOpenChange },
|
|
68
|
+
React.createElement(DialogContent, { className: "w-[400px] max-w-[92vw] pointer-events-auto" },
|
|
69
|
+
React.createElement(DialogTitle, null, "Advanced filter"),
|
|
70
|
+
React.createElement(DialogDescription, null, "Filter a list with a criteria range: conditions in one row AND together, rows OR together."),
|
|
71
|
+
React.createElement(DialogCloseButton, { onClick: () => onOpenChange(false) },
|
|
72
|
+
React.createElement(Cross1Icon, null)),
|
|
73
|
+
React.createElement(DialogBody, { className: "flex flex-col gap-3 font-system text-sm" },
|
|
74
|
+
React.createElement("form", { className: "flex flex-col gap-3", onSubmit: submit },
|
|
75
|
+
React.createElement("div", { className: "flex flex-col gap-1", role: "radiogroup", "aria-label": "Action" },
|
|
76
|
+
React.createElement("label", { className: "flex items-center gap-1" },
|
|
77
|
+
React.createElement("input", { type: "radio", name: "advanced-filter-action", value: "filter", checked: action === "filter", onChange: () => setAction("filter") }),
|
|
78
|
+
"Filter the list, in-place"),
|
|
79
|
+
React.createElement("label", { className: "flex items-center gap-1" },
|
|
80
|
+
React.createElement("input", { type: "radio", name: "advanced-filter-action", value: "copy", checked: action === "copy", onChange: () => setAction("copy") }),
|
|
81
|
+
"Copy to another location")),
|
|
82
|
+
React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
83
|
+
"List range:",
|
|
84
|
+
React.createElement(Input, { value: listRange, "aria-label": "List range", onChange: (e) => {
|
|
85
|
+
setListRange(e.target.value);
|
|
86
|
+
setError(undefined);
|
|
87
|
+
} })),
|
|
88
|
+
React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
89
|
+
"Criteria range:",
|
|
90
|
+
React.createElement(Input, { autoFocus: true, value: criteriaRange, "aria-label": "Criteria range", placeholder: "e.g. E1:F3", onChange: (e) => {
|
|
91
|
+
setCriteriaRange(e.target.value);
|
|
92
|
+
setError(undefined);
|
|
93
|
+
} })),
|
|
94
|
+
action === "copy" ? (React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
95
|
+
"Copy to:",
|
|
96
|
+
React.createElement(Input, { value: copyTo, "aria-label": "Copy to", placeholder: "e.g. H1", onChange: (e) => {
|
|
97
|
+
setCopyTo(e.target.value);
|
|
98
|
+
setError(undefined);
|
|
99
|
+
} }))) : null,
|
|
100
|
+
React.createElement("label", { className: "flex items-center gap-1" },
|
|
101
|
+
React.createElement("input", { type: "checkbox", name: "uniqueOnly", checked: uniqueOnly, onChange: (e) => setUniqueOnly(e.target.checked) }),
|
|
102
|
+
"Unique records only"),
|
|
103
|
+
error ? (React.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
|
|
104
|
+
React.createElement(Separator, null),
|
|
105
|
+
React.createElement("div", { className: "flex justify-end gap-2" },
|
|
106
|
+
React.createElement(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onOpenChange(false) }, "Cancel"),
|
|
107
|
+
React.createElement(Button, { type: "submit", size: "sm" }, "OK")))))));
|
|
108
|
+
});
|
|
109
|
+
AdvancedFilterDialog.displayName = "AdvancedFilterDialog";
|
|
110
|
+
/**
|
|
111
|
+
* Host-mounted, atom-driven wrapper around {@link AdvancedFilterDialog}.
|
|
112
|
+
* Mount once in the host; the context menu opens it via
|
|
113
|
+
* `useOpenAdvancedFilterDialog` and only offers the item while a host is
|
|
114
|
+
* mounted.
|
|
115
|
+
*/
|
|
116
|
+
export const AdvancedFilterDialogHost = () => {
|
|
117
|
+
useRegisterAdvancedFilterDialogHost();
|
|
118
|
+
const [request, setRequest] = useAdvancedFilterDialogState();
|
|
119
|
+
const close = useCallback(() => setRequest(null), [setRequest]);
|
|
120
|
+
return (React.createElement(AdvancedFilterDialog, { open: request != null, onOpenChange: (open) => {
|
|
121
|
+
if (!open)
|
|
122
|
+
close();
|
|
123
|
+
}, initialListRange: request?.listRange ?? "", onApply: (options) => request?.onApply(options) }));
|
|
124
|
+
};
|
|
125
|
+
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,61 @@
|
|
|
1
|
+
import { Button, Dialog, DialogBody, DialogCloseButton, DialogContent, DialogTitle, Input, Separator, } from "@rowsncolumns/ui";
|
|
2
|
+
import React, { memo, useState } from "react";
|
|
3
|
+
/** Excel's defaults (File → Options → Formulas → Calculation options). */
|
|
4
|
+
export const DEFAULT_ITERATIVE_CALCULATION = {
|
|
5
|
+
enabled: false,
|
|
6
|
+
maxIterations: 100,
|
|
7
|
+
maxChange: 0.001,
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Normalise a form draft the way Excel does: iterations are a whole number
|
|
11
|
+
* 1…32767, maximum change is a non-negative number; anything else falls
|
|
12
|
+
* back to the current value.
|
|
13
|
+
*/
|
|
14
|
+
export const normalizeIterativeCalculation = (draft, current) => {
|
|
15
|
+
const parse = (text) => (text.trim() === "" ? NaN : Number(text));
|
|
16
|
+
const iterations = parse(draft.maxIterations);
|
|
17
|
+
const change = parse(draft.maxChange);
|
|
18
|
+
return {
|
|
19
|
+
enabled: draft.enabled,
|
|
20
|
+
maxIterations: Number.isFinite(iterations) && iterations >= 1
|
|
21
|
+
? Math.min(32767, Math.floor(iterations))
|
|
22
|
+
: current?.maxIterations ?? DEFAULT_ITERATIVE_CALCULATION.maxIterations,
|
|
23
|
+
maxChange: Number.isFinite(change) && change >= 0
|
|
24
|
+
? change
|
|
25
|
+
: current?.maxChange ?? DEFAULT_ITERATIVE_CALCULATION.maxChange,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Excel's iterative-calculation options (enable / maximum iterations /
|
|
30
|
+
* maximum change) as a dialog. Purely presentational — the host owns the
|
|
31
|
+
* setting and applies it through `onChange`.
|
|
32
|
+
*/
|
|
33
|
+
export const CalculationOptionsDialog = memo(({ open, onOpenChange, value, onChange }) => {
|
|
34
|
+
const [enabled, setEnabled] = useState(value?.enabled ?? false);
|
|
35
|
+
const [maxIterations, setMaxIterations] = useState(String(value?.maxIterations ?? DEFAULT_ITERATIVE_CALCULATION.maxIterations));
|
|
36
|
+
const [maxChange, setMaxChange] = useState(String(value?.maxChange ?? DEFAULT_ITERATIVE_CALCULATION.maxChange));
|
|
37
|
+
return (React.createElement(Dialog, { open: open, onOpenChange: onOpenChange, modal: true },
|
|
38
|
+
React.createElement(DialogContent, { className: "w-[360px] max-w-[92vw] pointer-events-auto" },
|
|
39
|
+
React.createElement(DialogTitle, null, "Calculation options"),
|
|
40
|
+
React.createElement(DialogCloseButton, null),
|
|
41
|
+
React.createElement(DialogBody, { className: "flex flex-col gap-3" },
|
|
42
|
+
React.createElement("form", { className: "flex flex-col gap-3", onSubmit: (e) => {
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
onChange(normalizeIterativeCalculation({ enabled, maxIterations, maxChange }, value ?? undefined));
|
|
45
|
+
onOpenChange(false);
|
|
46
|
+
} },
|
|
47
|
+
React.createElement("label", { className: "flex items-center gap-2 text-xs font-medium" },
|
|
48
|
+
React.createElement("input", { type: "checkbox", checked: enabled, onChange: (e) => setEnabled(e.target.checked) }),
|
|
49
|
+
"Enable iterative calculation"),
|
|
50
|
+
React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
51
|
+
"Maximum iterations:",
|
|
52
|
+
React.createElement(Input, { type: "number", min: 1, max: 32767, step: 1, value: maxIterations, disabled: !enabled, onChange: (e) => setMaxIterations(e.target.value) })),
|
|
53
|
+
React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
54
|
+
"Maximum change:",
|
|
55
|
+
React.createElement(Input, { type: "number", min: 0, step: "any", value: maxChange, disabled: !enabled, onChange: (e) => setMaxChange(e.target.value) })),
|
|
56
|
+
React.createElement(Separator, null),
|
|
57
|
+
React.createElement("div", { className: "flex justify-end gap-2" },
|
|
58
|
+
React.createElement(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onOpenChange(false) }, "Cancel"),
|
|
59
|
+
React.createElement(Button, { type: "submit", size: "sm" }, "OK")))))));
|
|
60
|
+
});
|
|
61
|
+
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"}
|