@rowsncolumns/spreadsheet 10.6.4 → 10.7.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/dist/cjs/api/autocomplete.d.ts +42 -0
- package/dist/cjs/api/autocomplete.d.ts.map +1 -0
- package/dist/cjs/api/autocomplete.js +114 -0
- package/dist/cjs/api/banded-ranges.d.ts.map +1 -1
- package/dist/cjs/api/banded-ranges.js +51 -1
- package/dist/cjs/api/error-checking.d.ts +82 -0
- package/dist/cjs/api/error-checking.d.ts.map +1 -0
- package/dist/cjs/api/error-checking.js +207 -0
- package/dist/cjs/api/move-overwrite.d.ts +8 -2
- package/dist/cjs/api/move-overwrite.d.ts.map +1 -1
- package/dist/cjs/api/move-overwrite.js +19 -3
- package/dist/cjs/api/selections.d.ts +2 -2
- package/dist/cjs/api/validation.d.ts +39 -1
- package/dist/cjs/api/validation.d.ts.map +1 -1
- package/dist/cjs/api/validation.js +87 -1
- package/dist/cjs/atoms/cell-input-context.atom.d.ts +4 -1
- package/dist/cjs/atoms/cell-input-context.atom.d.ts.map +1 -1
- package/dist/cjs/atoms/enter-key-direction.atom.d.ts +11 -0
- package/dist/cjs/atoms/enter-key-direction.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/enter-key-direction.atom.js +13 -0
- package/dist/cjs/atoms/index.d.ts +1 -0
- package/dist/cjs/atoms/index.d.ts.map +1 -1
- package/dist/cjs/atoms/index.js +1 -0
- package/dist/cjs/atoms/paste-menu.atom.d.ts +22 -0
- package/dist/cjs/atoms/paste-menu.atom.d.ts.map +1 -1
- package/dist/cjs/atoms/paste-menu.atom.js +13 -1
- package/dist/cjs/atoms/pick-list.atom.d.ts +15 -0
- package/dist/cjs/atoms/pick-list.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/pick-list.atom.js +7 -0
- package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/cjs/components/canvas-grid/index.js +305 -70
- package/dist/cjs/components/canvas-grid/typings.d.ts +96 -11
- package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/cjs/components/cell/alignment.d.ts +25 -0
- package/dist/cjs/components/cell/alignment.d.ts.map +1 -1
- package/dist/cjs/components/cell/alignment.js +39 -1
- package/dist/cjs/components/cell/cell-background.d.ts +16 -0
- package/dist/cjs/components/cell/cell-background.d.ts.map +1 -1
- package/dist/cjs/components/cell/cell-background.js +141 -54
- package/dist/cjs/components/cell/cell-text-runs.d.ts +12 -5
- package/dist/cjs/components/cell/cell-text-runs.d.ts.map +1 -1
- package/dist/cjs/components/cell/cell-text-runs.js +18 -20
- package/dist/cjs/components/cell/index.d.ts.map +1 -1
- package/dist/cjs/components/cell/index.js +26 -21
- package/dist/cjs/components/cell/typings.d.ts +9 -0
- package/dist/cjs/components/cell/typings.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/helpers.d.ts +22 -2
- package/dist/cjs/components/cell-editor/helpers.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/helpers.js +32 -8
- package/dist/cjs/components/cell-editor/index.d.ts +7 -1
- package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/index.js +85 -13
- package/dist/cjs/components/cell-indicator/index.d.ts +41 -0
- package/dist/cjs/components/cell-indicator/index.d.ts.map +1 -0
- package/dist/cjs/components/cell-indicator/index.js +90 -0
- package/dist/cjs/components/cell-input/cell-input.d.ts +10 -2
- package/dist/cjs/components/cell-input/cell-input.d.ts.map +1 -1
- package/dist/cjs/components/cell-input/cell-input.js +5 -3
- package/dist/cjs/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
- package/dist/cjs/components/cell-input/formula-bar-cell-input.js +9 -2
- package/dist/cjs/components/cell-structured/sparkline-math.d.ts +27 -1
- package/dist/cjs/components/cell-structured/sparkline-math.d.ts.map +1 -1
- package/dist/cjs/components/cell-structured/sparkline-math.js +48 -1
- package/dist/cjs/components/cell-structured/sparkline.d.ts +1 -1
- package/dist/cjs/components/cell-structured/sparkline.d.ts.map +1 -1
- package/dist/cjs/components/cell-structured/sparkline.js +36 -92
- package/dist/cjs/components/cell-structured/types.d.ts +6 -0
- package/dist/cjs/components/cell-structured/types.d.ts.map +1 -1
- package/dist/cjs/components/data-table-dialog/index.d.ts +22 -0
- package/dist/cjs/components/data-table-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/data-table-dialog/index.js +93 -0
- package/dist/cjs/components/error-check-smart-tag/index.d.ts +27 -0
- package/dist/cjs/components/error-check-smart-tag/index.d.ts.map +1 -0
- package/dist/cjs/components/error-check-smart-tag/index.js +39 -0
- package/dist/cjs/components/forecast-sheet-dialog/index.d.ts +26 -0
- package/dist/cjs/components/forecast-sheet-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/forecast-sheet-dialog/index.js +92 -0
- package/dist/cjs/components/paste-special-dialog/index.d.ts +3 -3
- package/dist/cjs/components/paste-special-dialog/index.d.ts.map +1 -1
- package/dist/cjs/components/paste-special-dialog/index.js +61 -23
- package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts +57 -0
- package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts.map +1 -0
- package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.js +196 -0
- package/dist/cjs/components/protect-sheet-dialog/constants.d.ts +3 -0
- package/dist/cjs/components/protect-sheet-dialog/constants.d.ts.map +1 -0
- package/dist/cjs/components/protect-sheet-dialog/constants.js +5 -0
- package/dist/cjs/components/protect-sheet-dialog/index.d.ts +2 -2
- package/dist/cjs/components/protect-sheet-dialog/index.d.ts.map +1 -1
- package/dist/cjs/components/protect-sheet-dialog/index.js +5 -3
- package/dist/cjs/components/scenario-manager-dialog/index.d.ts +51 -0
- package/dist/cjs/components/scenario-manager-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/scenario-manager-dialog/index.js +257 -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 +9 -4
- package/dist/cjs/components/selection/paste-menu.d.ts +14 -1
- package/dist/cjs/components/selection/paste-menu.d.ts.map +1 -1
- package/dist/cjs/components/selection/paste-menu.js +78 -6
- package/dist/cjs/components/selection/paste-options.d.ts +28 -0
- package/dist/cjs/components/selection/paste-options.d.ts.map +1 -0
- package/dist/cjs/components/selection/paste-options.js +70 -0
- package/dist/cjs/components/selection/types.d.ts +12 -1
- package/dist/cjs/components/selection/types.d.ts.map +1 -1
- package/dist/cjs/components/selection-drop-menu/index.d.ts +18 -0
- package/dist/cjs/components/selection-drop-menu/index.d.ts.map +1 -0
- package/dist/cjs/components/selection-drop-menu/index.js +62 -0
- package/dist/cjs/components/solver-dialog/index.d.ts +57 -0
- package/dist/cjs/components/solver-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/solver-dialog/index.js +204 -0
- package/dist/cjs/components/toolbar/sparkline-actions.d.ts +3 -2
- package/dist/cjs/components/toolbar/sparkline-actions.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/sparkline-actions.js +6 -2
- package/dist/cjs/components/toolbar/table-style-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/table-style-selector.js +33 -2
- package/dist/cjs/config.d.ts +5 -4
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/config.js +13 -9
- package/dist/cjs/helpers.d.ts +5 -0
- package/dist/cjs/helpers.d.ts.map +1 -1
- package/dist/cjs/helpers.js +8 -4
- package/dist/cjs/hooks/use-cell-renderer.d.ts +12 -1
- package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
- package/dist/cjs/hooks/use-cell-renderer.js +6 -3
- package/dist/cjs/hooks/use-copy-paste-cut.d.ts +36 -2
- package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
- package/dist/cjs/hooks/use-copy-paste-cut.js +131 -5
- package/dist/cjs/hooks/use-editable.d.ts +6 -0
- package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editor-submit.d.ts +45 -3
- package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editor-submit.js +91 -7
- package/dist/cjs/hooks/use-keyboard-handler.d.ts +5 -1
- package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
- package/dist/cjs/hooks/use-keyboard-handler.js +10 -1
- package/dist/cjs/hooks/use-selection-drag-copy.d.ts +55 -0
- package/dist/cjs/hooks/use-selection-drag-copy.d.ts.map +1 -0
- package/dist/cjs/hooks/use-selection-drag-copy.js +274 -0
- package/dist/cjs/hooks/use-selection-renderer.d.ts +8 -1
- package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection-renderer.js +7 -2
- package/dist/cjs/hooks/use-selection.d.ts +59 -1
- package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection.js +270 -61
- package/dist/cjs/index.d.ts +6 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +5 -0
- package/dist/cjs/release-date.js +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/types.d.ts +50 -1
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/api/autocomplete.d.ts +42 -0
- package/dist/esm/api/autocomplete.d.ts.map +1 -0
- package/dist/esm/api/autocomplete.js +91 -0
- package/dist/esm/api/banded-ranges.d.ts.map +1 -1
- package/dist/esm/api/banded-ranges.js +52 -2
- package/dist/esm/api/error-checking.d.ts +82 -0
- package/dist/esm/api/error-checking.d.ts.map +1 -0
- package/dist/esm/api/error-checking.js +156 -0
- package/dist/esm/api/move-overwrite.d.ts +8 -2
- package/dist/esm/api/move-overwrite.d.ts.map +1 -1
- package/dist/esm/api/move-overwrite.js +17 -2
- package/dist/esm/api/selections.d.ts +2 -2
- package/dist/esm/api/validation.d.ts +39 -1
- package/dist/esm/api/validation.d.ts.map +1 -1
- package/dist/esm/api/validation.js +70 -0
- package/dist/esm/atoms/cell-input-context.atom.d.ts +4 -1
- package/dist/esm/atoms/cell-input-context.atom.d.ts.map +1 -1
- package/dist/esm/atoms/enter-key-direction.atom.d.ts +11 -0
- package/dist/esm/atoms/enter-key-direction.atom.d.ts.map +1 -0
- package/dist/esm/atoms/enter-key-direction.atom.js +8 -0
- package/dist/esm/atoms/index.d.ts +1 -0
- package/dist/esm/atoms/index.d.ts.map +1 -1
- package/dist/esm/atoms/index.js +1 -0
- package/dist/esm/atoms/paste-menu.atom.d.ts +22 -0
- package/dist/esm/atoms/paste-menu.atom.d.ts.map +1 -1
- package/dist/esm/atoms/paste-menu.atom.js +10 -1
- package/dist/esm/atoms/pick-list.atom.d.ts +15 -0
- package/dist/esm/atoms/pick-list.atom.d.ts.map +1 -0
- package/dist/esm/atoms/pick-list.atom.js +3 -0
- package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/esm/components/canvas-grid/index.js +239 -13
- package/dist/esm/components/canvas-grid/typings.d.ts +96 -11
- package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/esm/components/cell/alignment.d.ts +25 -0
- package/dist/esm/components/cell/alignment.d.ts.map +1 -1
- package/dist/esm/components/cell/alignment.js +33 -0
- package/dist/esm/components/cell/cell-background.d.ts +16 -0
- package/dist/esm/components/cell/cell-background.d.ts.map +1 -1
- package/dist/esm/components/cell/cell-background.js +106 -36
- package/dist/esm/components/cell/cell-text-runs.d.ts +12 -5
- package/dist/esm/components/cell/cell-text-runs.d.ts.map +1 -1
- package/dist/esm/components/cell/cell-text-runs.js +17 -22
- package/dist/esm/components/cell/index.d.ts.map +1 -1
- package/dist/esm/components/cell/index.js +25 -20
- package/dist/esm/components/cell/typings.d.ts +9 -0
- package/dist/esm/components/cell/typings.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/helpers.d.ts +22 -2
- package/dist/esm/components/cell-editor/helpers.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/helpers.js +25 -7
- package/dist/esm/components/cell-editor/index.d.ts +7 -1
- package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/index.js +80 -9
- package/dist/esm/components/cell-indicator/index.d.ts +41 -0
- package/dist/esm/components/cell-indicator/index.d.ts.map +1 -0
- package/dist/esm/components/cell-indicator/index.js +76 -0
- package/dist/esm/components/cell-input/cell-input.d.ts +10 -2
- package/dist/esm/components/cell-input/cell-input.d.ts.map +1 -1
- package/dist/esm/components/cell-input/cell-input.js +5 -3
- package/dist/esm/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
- package/dist/esm/components/cell-input/formula-bar-cell-input.js +9 -2
- package/dist/esm/components/cell-structured/sparkline-math.d.ts +27 -1
- package/dist/esm/components/cell-structured/sparkline-math.d.ts.map +1 -1
- package/dist/esm/components/cell-structured/sparkline-math.js +35 -0
- package/dist/esm/components/cell-structured/sparkline.d.ts +1 -1
- package/dist/esm/components/cell-structured/sparkline.d.ts.map +1 -1
- package/dist/esm/components/cell-structured/sparkline.js +34 -88
- package/dist/esm/components/cell-structured/types.d.ts +6 -0
- package/dist/esm/components/cell-structured/types.d.ts.map +1 -1
- package/dist/esm/components/data-table-dialog/index.d.ts +22 -0
- package/dist/esm/components/data-table-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/data-table-dialog/index.js +75 -0
- package/dist/esm/components/error-check-smart-tag/index.d.ts +27 -0
- package/dist/esm/components/error-check-smart-tag/index.d.ts.map +1 -0
- package/dist/esm/components/error-check-smart-tag/index.js +33 -0
- package/dist/esm/components/forecast-sheet-dialog/index.d.ts +26 -0
- package/dist/esm/components/forecast-sheet-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/forecast-sheet-dialog/index.js +83 -0
- package/dist/esm/components/paste-special-dialog/index.d.ts +3 -3
- package/dist/esm/components/paste-special-dialog/index.d.ts.map +1 -1
- package/dist/esm/components/paste-special-dialog/index.js +58 -23
- package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts +57 -0
- package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts.map +1 -0
- package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.js +177 -0
- package/dist/esm/components/protect-sheet-dialog/constants.d.ts +3 -0
- package/dist/esm/components/protect-sheet-dialog/constants.d.ts.map +1 -0
- package/dist/esm/components/protect-sheet-dialog/constants.js +2 -0
- package/dist/esm/components/protect-sheet-dialog/index.d.ts +2 -2
- package/dist/esm/components/protect-sheet-dialog/index.d.ts.map +1 -1
- package/dist/esm/components/protect-sheet-dialog/index.js +3 -2
- package/dist/esm/components/scenario-manager-dialog/index.d.ts +51 -0
- package/dist/esm/components/scenario-manager-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/scenario-manager-dialog/index.js +213 -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 +9 -4
- package/dist/esm/components/selection/paste-menu.d.ts +14 -1
- package/dist/esm/components/selection/paste-menu.d.ts.map +1 -1
- package/dist/esm/components/selection/paste-menu.js +76 -8
- package/dist/esm/components/selection/paste-options.d.ts +28 -0
- package/dist/esm/components/selection/paste-options.d.ts.map +1 -0
- package/dist/esm/components/selection/paste-options.js +62 -0
- package/dist/esm/components/selection/types.d.ts +12 -1
- package/dist/esm/components/selection/types.d.ts.map +1 -1
- package/dist/esm/components/selection-drop-menu/index.d.ts +18 -0
- package/dist/esm/components/selection-drop-menu/index.d.ts.map +1 -0
- package/dist/esm/components/selection-drop-menu/index.js +56 -0
- package/dist/esm/components/solver-dialog/index.d.ts +57 -0
- package/dist/esm/components/solver-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/solver-dialog/index.js +176 -0
- package/dist/esm/components/toolbar/sparkline-actions.d.ts +3 -2
- package/dist/esm/components/toolbar/sparkline-actions.d.ts.map +1 -1
- package/dist/esm/components/toolbar/sparkline-actions.js +6 -2
- package/dist/esm/components/toolbar/table-style-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/table-style-selector.js +29 -3
- package/dist/esm/config.d.ts +5 -4
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +12 -8
- package/dist/esm/helpers.d.ts +5 -0
- package/dist/esm/helpers.d.ts.map +1 -1
- package/dist/esm/helpers.js +8 -4
- package/dist/esm/hooks/use-cell-renderer.d.ts +12 -1
- package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
- package/dist/esm/hooks/use-cell-renderer.js +5 -2
- package/dist/esm/hooks/use-copy-paste-cut.d.ts +36 -2
- package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
- package/dist/esm/hooks/use-copy-paste-cut.js +117 -6
- package/dist/esm/hooks/use-editable.d.ts +6 -0
- package/dist/esm/hooks/use-editable.d.ts.map +1 -1
- package/dist/esm/hooks/use-editor-submit.d.ts +45 -3
- package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
- package/dist/esm/hooks/use-editor-submit.js +81 -6
- package/dist/esm/hooks/use-keyboard-handler.d.ts +5 -1
- package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
- package/dist/esm/hooks/use-keyboard-handler.js +10 -1
- package/dist/esm/hooks/use-selection-drag-copy.d.ts +55 -0
- package/dist/esm/hooks/use-selection-drag-copy.d.ts.map +1 -0
- package/dist/esm/hooks/use-selection-drag-copy.js +245 -0
- package/dist/esm/hooks/use-selection-renderer.d.ts +8 -1
- package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection-renderer.js +7 -2
- package/dist/esm/hooks/use-selection.d.ts +59 -1
- package/dist/esm/hooks/use-selection.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection.js +245 -52
- package/dist/esm/index.d.ts +6 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -0
- package/dist/esm/release-date.js +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/types.d.ts +50 -1
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/spreadsheet.min.css +1 -1
- package/package.json +6 -5
- package/dist/cjs/components/cell-error/index.d.ts +0 -14
- package/dist/cjs/components/cell-error/index.d.ts.map +0 -1
- package/dist/cjs/components/cell-error/index.js +0 -24
- package/dist/esm/components/cell-error/index.d.ts +0 -14
- package/dist/esm/components/cell-error/index.d.ts.map +0 -1
- package/dist/esm/components/cell-error/index.js +0 -18
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { Cross1Icon } from "@rowsncolumns/icons";
|
|
2
|
+
import { Button, Dialog, DialogBody, DialogCloseButton, DialogContent, DialogDescription, DialogTitle, Input, Separator, } from "@rowsncolumns/ui";
|
|
3
|
+
import { addressToCell, cellToAddress } from "@rowsncolumns/utils";
|
|
4
|
+
import React, { memo, useCallback, useEffect, useState } from "react";
|
|
5
|
+
/** Excel's cap on changing cells per scenario. */
|
|
6
|
+
export const MAX_SCENARIO_CHANGING_CELLS = 32;
|
|
7
|
+
/**
|
|
8
|
+
* `B1:B3, D5` → its cells in order (deduplicated), or `null` when a part is not a
|
|
9
|
+
* cell or range reference.
|
|
10
|
+
*/
|
|
11
|
+
export const parseCellList = (text) => {
|
|
12
|
+
const cells = [];
|
|
13
|
+
const parts = text
|
|
14
|
+
.split(/[,;]/)
|
|
15
|
+
.map((p) => p.trim().replace(/\$/g, ""))
|
|
16
|
+
.filter((p) => p !== "");
|
|
17
|
+
if (parts.length === 0)
|
|
18
|
+
return null;
|
|
19
|
+
for (const part of parts) {
|
|
20
|
+
const [a, b = a] = part.split(":");
|
|
21
|
+
if (!/^[A-Za-z]{1,3}\d+$/.test(a) || !/^[A-Za-z]{1,3}\d+$/.test(b))
|
|
22
|
+
return null;
|
|
23
|
+
const start = addressToCell(a);
|
|
24
|
+
const end = addressToCell(b);
|
|
25
|
+
if (!start || !end)
|
|
26
|
+
return null;
|
|
27
|
+
for (let r = Math.min(start.rowIndex, end.rowIndex); r <= Math.max(start.rowIndex, end.rowIndex); r++) {
|
|
28
|
+
for (let c = Math.min(start.columnIndex, end.columnIndex); c <= Math.max(start.columnIndex, end.columnIndex); c++) {
|
|
29
|
+
if (!cells.some((x) => x.rowIndex === r && x.columnIndex === c)) {
|
|
30
|
+
cells.push({ rowIndex: r, columnIndex: c });
|
|
31
|
+
}
|
|
32
|
+
if (cells.length > MAX_SCENARIO_CHANGING_CELLS)
|
|
33
|
+
return cells;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return cells;
|
|
38
|
+
};
|
|
39
|
+
const cellsText = (cells) => cells.map((c) => cellToAddress(c) ?? "").join(",");
|
|
40
|
+
/**
|
|
41
|
+
* Excel's Scenario Manager: the sheet's scenarios with Show / Add / Delete /
|
|
42
|
+
* Edit / Summary. Add and Edit ask for the name, changing cells and comment,
|
|
43
|
+
* then a value for each changing cell (Scenario Values). Merge is not offered.
|
|
44
|
+
*/
|
|
45
|
+
export const ScenarioManagerDialog = memo(({ open, onOpenChange, scenarios, defaultChangingCells, getCellValue, onAdd, onUpdate, onDelete, onShow, onSummary, }) => {
|
|
46
|
+
const [view, setView] = useState({ kind: "list" });
|
|
47
|
+
const [selected, setSelected] = useState(0);
|
|
48
|
+
const [name, setName] = useState("");
|
|
49
|
+
const [changing, setChanging] = useState("");
|
|
50
|
+
const [comment, setComment] = useState("");
|
|
51
|
+
const [locked, setLocked] = useState(true);
|
|
52
|
+
const [hidden, setHidden] = useState(false);
|
|
53
|
+
const [resultCells, setResultCells] = useState("");
|
|
54
|
+
const [error, setError] = useState(undefined);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (open) {
|
|
57
|
+
setView({ kind: "list" });
|
|
58
|
+
setSelected(0);
|
|
59
|
+
setError(undefined);
|
|
60
|
+
}
|
|
61
|
+
}, [open]);
|
|
62
|
+
const current = scenarios[Math.min(selected, scenarios.length - 1)];
|
|
63
|
+
const run = useCallback(async (action, after) => {
|
|
64
|
+
const refusal = await action();
|
|
65
|
+
if (refusal) {
|
|
66
|
+
setError(refusal);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
setError(undefined);
|
|
70
|
+
after?.();
|
|
71
|
+
}, []);
|
|
72
|
+
const startEdit = (scenario) => {
|
|
73
|
+
setName(scenario?.name ?? "");
|
|
74
|
+
setChanging(scenario ? cellsText(scenario.cells) : defaultChangingCells);
|
|
75
|
+
setComment(scenario?.comment ?? "");
|
|
76
|
+
setLocked(scenario?.locked ?? true);
|
|
77
|
+
setHidden(scenario?.hidden ?? false);
|
|
78
|
+
setError(undefined);
|
|
79
|
+
setView({ kind: "edit", editing: scenario?.name });
|
|
80
|
+
};
|
|
81
|
+
const toValues = (event) => {
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
if (view.kind !== "edit")
|
|
84
|
+
return;
|
|
85
|
+
if (name.trim() === "") {
|
|
86
|
+
setError("Type a scenario name.");
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const cells = parseCellList(changing);
|
|
90
|
+
if (!cells) {
|
|
91
|
+
setError("Changing cell reference is not valid.");
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (cells.length > MAX_SCENARIO_CHANGING_CELLS) {
|
|
95
|
+
setError("Too many changing cells. A scenario can have up to 32.");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const previous = scenarios.find((s) => s.name === view.editing);
|
|
99
|
+
setError(undefined);
|
|
100
|
+
setView({
|
|
101
|
+
kind: "values",
|
|
102
|
+
editing: view.editing,
|
|
103
|
+
draft: {
|
|
104
|
+
name: name.trim(),
|
|
105
|
+
comment: comment.trim() === "" ? undefined : comment,
|
|
106
|
+
locked,
|
|
107
|
+
hidden,
|
|
108
|
+
cells: cells.map((c) => ({
|
|
109
|
+
...c,
|
|
110
|
+
value: previous?.cells.find((p) => p.rowIndex === c.rowIndex && p.columnIndex === c.columnIndex)?.value ?? getCellValue(c.rowIndex, c.columnIndex),
|
|
111
|
+
})),
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
const saveValues = (event) => {
|
|
116
|
+
event.preventDefault();
|
|
117
|
+
if (view.kind !== "values")
|
|
118
|
+
return;
|
|
119
|
+
const { draft, editing } = view;
|
|
120
|
+
void run(() => (editing === undefined ? onAdd(draft) : onUpdate(editing, draft)), () => setView({ kind: "list" }));
|
|
121
|
+
};
|
|
122
|
+
const summary = (event) => {
|
|
123
|
+
event.preventDefault();
|
|
124
|
+
const cells = resultCells.trim() === "" ? [] : parseCellList(resultCells);
|
|
125
|
+
if (!cells) {
|
|
126
|
+
setError("Result cell reference is not valid.");
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
void run(() => onSummary(cells), () => onOpenChange(false));
|
|
130
|
+
};
|
|
131
|
+
const footer = (primary, back = true) => (React.createElement(React.Fragment, null,
|
|
132
|
+
error ? (React.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
|
|
133
|
+
React.createElement(Separator, null),
|
|
134
|
+
React.createElement("div", { className: "flex justify-end gap-2" },
|
|
135
|
+
back ? (React.createElement(Button, { type: "button", variant: "outline", size: "sm", onClick: () => {
|
|
136
|
+
setError(undefined);
|
|
137
|
+
setView({ kind: "list" });
|
|
138
|
+
} }, "Cancel")) : null,
|
|
139
|
+
React.createElement(Button, { type: "submit", size: "sm" }, primary))));
|
|
140
|
+
const title = view.kind === "list"
|
|
141
|
+
? "Scenario Manager"
|
|
142
|
+
: view.kind === "values"
|
|
143
|
+
? "Scenario Values"
|
|
144
|
+
: view.kind === "summary"
|
|
145
|
+
? "Scenario Summary"
|
|
146
|
+
: view.editing === undefined
|
|
147
|
+
? "Add Scenario"
|
|
148
|
+
: "Edit Scenario";
|
|
149
|
+
return (React.createElement(Dialog, { open: open, onOpenChange: onOpenChange },
|
|
150
|
+
React.createElement(DialogContent, { className: "w-[400px] max-w-[92vw] pointer-events-auto" },
|
|
151
|
+
React.createElement(DialogTitle, null, title),
|
|
152
|
+
React.createElement(DialogDescription, null, "Save and switch between sets of input values."),
|
|
153
|
+
React.createElement(DialogCloseButton, { onClick: () => onOpenChange(false) },
|
|
154
|
+
React.createElement(Cross1Icon, null)),
|
|
155
|
+
React.createElement(DialogBody, { className: "flex flex-col gap-3 font-system text-sm" },
|
|
156
|
+
view.kind === "list" ? (React.createElement("div", { className: "flex flex-col gap-3" },
|
|
157
|
+
scenarios.length === 0 ? (React.createElement("p", { className: "text-xs" }, "No Scenarios defined. Choose Add to add scenarios.")) : (React.createElement("ul", { "aria-label": "Scenarios", className: "max-h-40 overflow-auto rounded border border-rnc-border" }, scenarios.map((s, i) => (React.createElement("li", { key: s.name },
|
|
158
|
+
React.createElement("button", { type: "button", "aria-pressed": i === selected, className: `w-full px-2 py-1 text-left text-xs ${i === selected ? "bg-rnc-accent" : ""}`, onClick: () => setSelected(i) }, s.name)))))),
|
|
159
|
+
current ? (React.createElement("div", { className: "text-xs" },
|
|
160
|
+
React.createElement("div", null,
|
|
161
|
+
"Changing cells: ",
|
|
162
|
+
cellsText(current.cells)),
|
|
163
|
+
current.comment ? React.createElement("div", null,
|
|
164
|
+
"Comment: ",
|
|
165
|
+
current.comment) : null)) : null,
|
|
166
|
+
error ? (React.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
|
|
167
|
+
React.createElement(Separator, null),
|
|
168
|
+
React.createElement("div", { className: "flex flex-wrap justify-end gap-2" },
|
|
169
|
+
React.createElement(Button, { type: "button", size: "sm", variant: "outline", onClick: () => startEdit(undefined) }, "Add\u2026"),
|
|
170
|
+
React.createElement(Button, { type: "button", size: "sm", variant: "outline", disabled: !current, onClick: () => current && void run(() => onDelete(current.name)) }, "Delete"),
|
|
171
|
+
React.createElement(Button, { type: "button", size: "sm", variant: "outline", disabled: !current, onClick: () => startEdit(current) }, "Edit\u2026"),
|
|
172
|
+
React.createElement(Button, { type: "button", size: "sm", variant: "outline", disabled: !current, onClick: () => {
|
|
173
|
+
setResultCells("");
|
|
174
|
+
setError(undefined);
|
|
175
|
+
setView({ kind: "summary" });
|
|
176
|
+
} }, "Summary\u2026"),
|
|
177
|
+
React.createElement(Button, { type: "button", size: "sm", disabled: !current, onClick: () => current && void run(() => onShow(current.name)) }, "Show")))) : null,
|
|
178
|
+
view.kind === "edit" ? (React.createElement("form", { className: "flex flex-col gap-3", onSubmit: toValues },
|
|
179
|
+
React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
180
|
+
"Scenario name:",
|
|
181
|
+
React.createElement(Input, { autoFocus: true, "aria-label": "Scenario name", value: name, onChange: (e) => setName(e.target.value) })),
|
|
182
|
+
React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
183
|
+
"Changing cells:",
|
|
184
|
+
React.createElement(Input, { "aria-label": "Changing cells", value: changing, onChange: (e) => setChanging(e.target.value) })),
|
|
185
|
+
React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
186
|
+
"Comment:",
|
|
187
|
+
React.createElement(Input, { "aria-label": "Comment", value: comment, onChange: (e) => setComment(e.target.value) })),
|
|
188
|
+
React.createElement("label", { className: "flex items-center gap-2 text-xs" },
|
|
189
|
+
React.createElement("input", { type: "checkbox", checked: locked, onChange: (e) => setLocked(e.target.checked) }),
|
|
190
|
+
"Prevent changes"),
|
|
191
|
+
React.createElement("label", { className: "flex items-center gap-2 text-xs" },
|
|
192
|
+
React.createElement("input", { type: "checkbox", checked: hidden, onChange: (e) => setHidden(e.target.checked) }),
|
|
193
|
+
"Hide"),
|
|
194
|
+
footer("OK"))) : null,
|
|
195
|
+
view.kind === "values" ? (React.createElement("form", { className: "flex flex-col gap-2", onSubmit: saveValues },
|
|
196
|
+
React.createElement("p", { className: "text-xs" }, "Enter values for each of the changing cells."),
|
|
197
|
+
view.draft.cells.map((cell, i) => {
|
|
198
|
+
const address = cellToAddress(cell) ?? "";
|
|
199
|
+
return (React.createElement("label", { key: address, className: "flex items-center gap-2 text-xs" },
|
|
200
|
+
React.createElement("span", { className: "w-16" }, address),
|
|
201
|
+
React.createElement(Input, { "aria-label": address, value: cell.value, onChange: (e) => {
|
|
202
|
+
const cells = view.draft.cells.map((c, k) => k === i ? { ...c, value: e.target.value } : c);
|
|
203
|
+
setView({ ...view, draft: { ...view.draft, cells } });
|
|
204
|
+
} })));
|
|
205
|
+
}),
|
|
206
|
+
footer("OK"))) : null,
|
|
207
|
+
view.kind === "summary" ? (React.createElement("form", { className: "flex flex-col gap-3", onSubmit: summary },
|
|
208
|
+
React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
209
|
+
"Result cells:",
|
|
210
|
+
React.createElement(Input, { autoFocus: true, "aria-label": "Result cells", value: resultCells, onChange: (e) => setResultCells(e.target.value) })),
|
|
211
|
+
footer("OK"))) : null))));
|
|
212
|
+
});
|
|
213
|
+
ScenarioManagerDialog.displayName = "ScenarioManagerDialog";
|
|
@@ -5,5 +5,5 @@ import type { SelectionNewProps } from "./types";
|
|
|
5
5
|
* @param param0
|
|
6
6
|
* @returns
|
|
7
7
|
*/
|
|
8
|
-
export declare const Selection: React.MemoExoticComponent<({ x, y, width, height, fillHandleSize, showFillHandle, offset, stroke, strokeLeftColor, strokeTopColor, strokeRightColor, strokeBottomColor, strokeWidth, strokeTopWidth, strokeRightWidth, strokeBottomWidth, strokeLeftWidth, strokeStyle, fillOpacity, draggable, isDragging, borderCoverWidth, type, range, title, keepTitleWithinBounds, keepTitleWithinVerticalBounds, flipTitleToBottom, table, pivotTable, onMouseDownTitle, onMouseDownResizeHandle, onMouseDownMoveHandle, TitleComponent, onMouseDown, onRequestEditTable, onRequestEditPivotTable, onFlashEnd, zIndex, index, id, showResizeHandles, resizeHandleBorderColor, resizeHandleSize, fill, duration, selectionCount, enableMagicFill, sheetId, activeCell, selection, MagicFillComponent, metadata, readonly, showPasteMenu, onSplitTextToColumns, agentSuggestion, isHovered, MagicFillContent, QuickEdit, PasteMenu, FillOptionsMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, InsertOptionsSmartTag, insertOptions, onChooseInsertOption, tableAutoExpansion, onChooseTableAutoExpansionOption, calculatedColumnFill, onChooseCalculatedColumnOption, SuggestionAction, onRemoveQuickEdit, onAddQuickEdit, }: SelectionNewProps) => React.JSX.Element>;
|
|
8
|
+
export declare const Selection: React.MemoExoticComponent<({ x, y, width, height, fillHandleSize, showFillHandle, offset, stroke, strokeLeftColor, strokeTopColor, strokeRightColor, strokeBottomColor, strokeWidth, strokeTopWidth, strokeRightWidth, strokeBottomWidth, strokeLeftWidth, strokeStyle, fillOpacity, draggable, isDragging, borderCoverWidth, type, range, title, keepTitleWithinBounds, keepTitleWithinVerticalBounds, flipTitleToBottom, table, pivotTable, onMouseDownTitle, onMouseDownResizeHandle, onMouseDownMoveHandle, TitleComponent, onMouseDown, onRequestEditTable, onRequestEditPivotTable, onFlashEnd, zIndex, index, id, showResizeHandles, resizeHandleBorderColor, resizeHandleSize, fill, duration, selectionCount, enableMagicFill, sheetId, activeCell, selection, MagicFillComponent, metadata, readonly, showPasteMenu, onSplitTextToColumns, onChoosePasteOption, agentSuggestion, isHovered, MagicFillContent, QuickEdit, PasteMenu, FillOptionsMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, InsertOptionsSmartTag, insertOptions, onChooseInsertOption, tableAutoExpansion, onChooseTableAutoExpansionOption, calculatedColumnFill, onChooseCalculatedColumnOption, errorCheck, errorCheckMenuOpen, onErrorCheckMenuOpenChange, onChooseErrorCheckOption, SuggestionAction, onRemoveQuickEdit, onAddQuickEdit, }: SelectionNewProps) => React.JSX.Element>;
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/selection/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/selection/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAkBpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,SAAS,kyCAmFjB,iBAAiB,uBA2WrB,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React, { memo } from "react";
|
|
2
|
+
import { CalculatedColumnSmartTag } from "../calculated-column-smart-tag";
|
|
3
|
+
import { ErrorCheckSmartTag } from "../error-check-smart-tag";
|
|
2
4
|
import { InsertOptionsSmartTag as DefaultInsertOptionsSmartTag } from "../insert-options-smart-tag";
|
|
3
5
|
import { TableAutoExpansionSmartTag } from "../table-auto-expansion-smart-tag";
|
|
4
|
-
import { CalculatedColumnSmartTag } from "../calculated-column-smart-tag";
|
|
5
6
|
import { FillOptionsMenu as DefaultFillOptionsMenu } from "./fill-options-menu";
|
|
6
7
|
import { MagicFill } from "./magic-fill";
|
|
7
8
|
import { PasteMenu as DefaultPasteMenu } from "./paste-menu";
|
|
@@ -14,7 +15,7 @@ import { SelectionTitle } from "./title";
|
|
|
14
15
|
* @param param0
|
|
15
16
|
* @returns
|
|
16
17
|
*/
|
|
17
|
-
export const Selection = memo(({ x = 0, y = 0, width = 0, height = 0, fillHandleSize = 8, showFillHandle, offset = 0, stroke, strokeLeftColor = stroke, strokeTopColor = stroke, strokeRightColor = stroke, strokeBottomColor = stroke, strokeWidth = 0, strokeTopWidth = strokeWidth, strokeRightWidth = strokeWidth, strokeBottomWidth = strokeWidth, strokeLeftWidth = strokeWidth, strokeStyle = "solid", fillOpacity = 1, draggable, isDragging, borderCoverWidth = 5, type, range, title, keepTitleWithinBounds, keepTitleWithinVerticalBounds, flipTitleToBottom, table, pivotTable, onMouseDownTitle, onMouseDownResizeHandle, onMouseDownMoveHandle, TitleComponent = SelectionTitle, onMouseDown, onRequestEditTable, onRequestEditPivotTable, onFlashEnd, zIndex, index, id, showResizeHandles, resizeHandleBorderColor, resizeHandleSize = 6, fill, duration, selectionCount, enableMagicFill, sheetId, activeCell, selection, MagicFillComponent = MagicFill, metadata, readonly, showPasteMenu, onSplitTextToColumns, agentSuggestion, isHovered, MagicFillContent, QuickEdit = DefaultQuickEdit, PasteMenu = DefaultPasteMenu, FillOptionsMenu = DefaultFillOptionsMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, InsertOptionsSmartTag = DefaultInsertOptionsSmartTag, insertOptions, onChooseInsertOption, tableAutoExpansion, onChooseTableAutoExpansionOption, calculatedColumnFill, onChooseCalculatedColumnOption, SuggestionAction = DefaultSuggestionAction, onRemoveQuickEdit, onAddQuickEdit, }) => {
|
|
18
|
+
export const Selection = memo(({ x = 0, y = 0, width = 0, height = 0, fillHandleSize = 8, showFillHandle, offset = 0, stroke, strokeLeftColor = stroke, strokeTopColor = stroke, strokeRightColor = stroke, strokeBottomColor = stroke, strokeWidth = 0, strokeTopWidth = strokeWidth, strokeRightWidth = strokeWidth, strokeBottomWidth = strokeWidth, strokeLeftWidth = strokeWidth, strokeStyle = "solid", fillOpacity = 1, draggable, isDragging, borderCoverWidth = 5, type, range, title, keepTitleWithinBounds, keepTitleWithinVerticalBounds, flipTitleToBottom, table, pivotTable, onMouseDownTitle, onMouseDownResizeHandle, onMouseDownMoveHandle, TitleComponent = SelectionTitle, onMouseDown, onRequestEditTable, onRequestEditPivotTable, onFlashEnd, zIndex, index, id, showResizeHandles, resizeHandleBorderColor, resizeHandleSize = 6, fill, duration, selectionCount, enableMagicFill, sheetId, activeCell, selection, MagicFillComponent = MagicFill, metadata, readonly, showPasteMenu, onSplitTextToColumns, onChoosePasteOption, agentSuggestion, isHovered, MagicFillContent, QuickEdit = DefaultQuickEdit, PasteMenu = DefaultPasteMenu, FillOptionsMenu = DefaultFillOptionsMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, InsertOptionsSmartTag = DefaultInsertOptionsSmartTag, insertOptions, onChooseInsertOption, tableAutoExpansion, onChooseTableAutoExpansionOption, calculatedColumnFill, onChooseCalculatedColumnOption, errorCheck, errorCheckMenuOpen = false, onErrorCheckMenuOpenChange, onChooseErrorCheckOption, SuggestionAction = DefaultSuggestionAction, onRemoveQuickEdit, onAddQuickEdit, }) => {
|
|
18
19
|
// Show paste menu
|
|
19
20
|
const finalShowPasteMenu = !showPasteMenu
|
|
20
21
|
? false
|
|
@@ -191,10 +192,14 @@ export const Selection = memo(({ x = 0, y = 0, width = 0, height = 0, fillHandle
|
|
|
191
192
|
(type === "selection" ||
|
|
192
193
|
(type === "activeCell" && selectionCount === 0)) ? (React.createElement(MagicFillComponent, { sheetId: sheetId, x: x, y: y, height: height, width: width, type: type, activeCell: activeCell, selection: selection, isHovered: isHovered, MagicFillContent: MagicFillContent, onAddQuickEdit: onAddQuickEdit, backgroundColor: stroke })) : null,
|
|
193
194
|
type === "quickedit" ? (React.createElement(QuickEdit, { x: x, y: y, width: width, height: height, range: range, sheetId: sheetId, onRemoveQuickEdit: onRemoveQuickEdit })) : null,
|
|
194
|
-
finalShowPasteMenu && (React.createElement(PasteMenu, { x: x + fillHandleSize / 2, y: y + fillHandleSize / 2, width: width, height: height, onSplitTextToColumns: onSplitTextToColumns })),
|
|
195
|
+
finalShowPasteMenu && (React.createElement(PasteMenu, { x: x + fillHandleSize / 2, y: y + fillHandleSize / 2, width: width, height: height, onSplitTextToColumns: onSplitTextToColumns, onChoosePasteOption: onChoosePasteOption })),
|
|
195
196
|
fillOptions && type === "selection" && onChooseFillType ? (React.createElement(FillOptionsMenu, { x: x + fillHandleSize / 2, y: y + fillHandleSize / 2, width: width, height: height, mode: fillOptions.mode, fillType: fillOptions.fillType, hasDates: fillOptions.hasDates, onChooseFillType: onChooseFillType, onOpenSeriesDialog: onOpenFillSeriesDialog, onClose: onCloseFillOptions })) : null,
|
|
196
197
|
insertOptions && onChooseInsertOption ? (React.createElement(InsertOptionsSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, axis: insertOptions.axis, option: insertOptions.option, onChooseOption: onChooseInsertOption })) : null,
|
|
197
198
|
tableAutoExpansion && onChooseTableAutoExpansionOption ? (React.createElement(TableAutoExpansionSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, canStop: tableAutoExpansion.canStop, onChooseOption: onChooseTableAutoExpansionOption })) : null,
|
|
198
|
-
calculatedColumnFill && onChooseCalculatedColumnOption ? (React.createElement(CalculatedColumnSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, kind: calculatedColumnFill.kind, canStop: calculatedColumnFill.canStop, onChooseOption: onChooseCalculatedColumnOption })) : null
|
|
199
|
+
calculatedColumnFill && onChooseCalculatedColumnOption ? (React.createElement(CalculatedColumnSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, kind: calculatedColumnFill.kind, canStop: calculatedColumnFill.canStop, onChooseOption: onChooseCalculatedColumnOption })) : null,
|
|
200
|
+
errorCheck &&
|
|
201
|
+
type === "activeCell" &&
|
|
202
|
+
onChooseErrorCheckOption &&
|
|
203
|
+
onErrorCheckMenuOpenChange ? (React.createElement(ErrorCheckSmartTag, { x: x, y: y, width: width, height: height, kind: errorCheck.kind, errorName: errorCheck.errorName, open: errorCheckMenuOpen, onOpenChange: onErrorCheckMenuOpenChange, onChooseOption: onChooseErrorCheckOption })) : null));
|
|
199
204
|
});
|
|
200
205
|
Selection.displayName = "Selection";
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
import { type PasteOptionId } from "./paste-options";
|
|
2
3
|
export type PasteMenuProps = {
|
|
3
4
|
x: number;
|
|
4
5
|
y: number;
|
|
5
6
|
width: number;
|
|
6
7
|
height: number;
|
|
7
8
|
onSplitTextToColumns?: (delimiter?: string) => void;
|
|
9
|
+
/**
|
|
10
|
+
* Re-apply the last paste as this gallery entry (Excel's Paste Options).
|
|
11
|
+
* Without it the button offers only Split text to columns.
|
|
12
|
+
*/
|
|
13
|
+
onChoosePasteOption?: (option: PasteOptionId) => void;
|
|
8
14
|
};
|
|
9
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Excel's Paste Options button, shown at the bottom-right of a pasted range.
|
|
17
|
+
* Its gallery re-applies the last paste as Paste, Formulas, Values, Transpose
|
|
18
|
+
* and the other entries (replacing the previous result, one undo step), opens
|
|
19
|
+
* on a click or on Ctrl pressed alone after the paste, and picks an entry with
|
|
20
|
+
* its letter. "Split text to columns" stays as Excel's Text Import option.
|
|
21
|
+
*/
|
|
22
|
+
export declare const PasteMenu: ({ x, y, width, height, onSplitTextToColumns, onChoosePasteOption, }: PasteMenuProps) => React.JSX.Element;
|
|
10
23
|
//# sourceMappingURL=paste-menu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paste-menu.d.ts","sourceRoot":"","sources":["../../../../components/selection/paste-menu.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"paste-menu.d.ts","sourceRoot":"","sources":["../../../../components/selection/paste-menu.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAG3C,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CACvD,CAAC;AAwCF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,qEAOvB,cAAc,sBA2HhB,CAAC"}
|
|
@@ -1,20 +1,88 @@
|
|
|
1
|
-
import { ChevronRightIcon, MdOutlineArrowDropDown, MdPaste, } from "@rowsncolumns/icons";
|
|
2
|
-
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, DropdownRightSlot, IconButton, } from "@rowsncolumns/ui";
|
|
3
|
-
import React from "react";
|
|
4
|
-
|
|
1
|
+
import { CheckIcon, ChevronRightIcon, ExpandIcon, MdBorderClear, MdBrush, MdOutlineArrowDropDown, MdPaste, PaintBrush, } from "@rowsncolumns/icons";
|
|
2
|
+
import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIndicator, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, DropdownRightSlot, IconButton, } from "@rowsncolumns/ui";
|
|
3
|
+
import React, { useCallback } from "react";
|
|
4
|
+
import { usePasteMenuState } from "../../atoms/paste-menu.atom";
|
|
5
|
+
import { PASTE_OPTION_GROUPS, PASTE_OPTIONS, } from "./paste-options";
|
|
6
|
+
/** A small text glyph for the entries the icon set has no picture for. */
|
|
7
|
+
const Glyph = ({ text }) => (React.createElement("span", { "aria-hidden": true, className: "inline-flex min-w-[1.5em] justify-center font-mono text-[10px] leading-none" }, text));
|
|
8
|
+
const ICONS = {
|
|
9
|
+
paste: React.createElement(MdPaste, { "aria-hidden": true }),
|
|
10
|
+
formulas: React.createElement(Glyph, { text: "fx" }),
|
|
11
|
+
formulasAndNumberFormats: React.createElement(Glyph, { text: "%fx" }),
|
|
12
|
+
keepSourceFormatting: React.createElement(MdBrush, { "aria-hidden": true }),
|
|
13
|
+
noBorders: React.createElement(MdBorderClear, { "aria-hidden": true }),
|
|
14
|
+
keepSourceColumnWidths: React.createElement(ExpandIcon, { "aria-hidden": true }),
|
|
15
|
+
transpose: React.createElement(Glyph, { text: "\u2921" }),
|
|
16
|
+
values: React.createElement(Glyph, { text: "123" }),
|
|
17
|
+
valuesAndNumberFormats: React.createElement(Glyph, { text: "%123" }),
|
|
18
|
+
valuesAndSourceFormatting: React.createElement(Glyph, { text: "123\u270E" }),
|
|
19
|
+
formatting: React.createElement(PaintBrush, { "aria-hidden": true }),
|
|
20
|
+
pasteLink: React.createElement(Glyph, { text: "=A1" }),
|
|
21
|
+
};
|
|
22
|
+
/** The label with its accelerator letter underlined, as Excel draws it. */
|
|
23
|
+
const AcceleratorLabel = ({ option }) => {
|
|
24
|
+
const index = option.label.toLowerCase().indexOf(option.key);
|
|
25
|
+
if (index < 0)
|
|
26
|
+
return React.createElement(React.Fragment, null, option.label);
|
|
27
|
+
return (React.createElement(React.Fragment, null,
|
|
28
|
+
option.label.slice(0, index),
|
|
29
|
+
React.createElement("span", { className: "underline" }, option.label.slice(index, index + 1)),
|
|
30
|
+
option.label.slice(index + 1)));
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Excel's Paste Options button, shown at the bottom-right of a pasted range.
|
|
34
|
+
* Its gallery re-applies the last paste as Paste, Formulas, Values, Transpose
|
|
35
|
+
* and the other entries (replacing the previous result, one undo step), opens
|
|
36
|
+
* on a click or on Ctrl pressed alone after the paste, and picks an entry with
|
|
37
|
+
* its letter. "Split text to columns" stays as Excel's Text Import option.
|
|
38
|
+
*/
|
|
39
|
+
export const PasteMenu = ({ x, y, width, height, onSplitTextToColumns, onChoosePasteOption, }) => {
|
|
40
|
+
const [state, setState] = usePasteMenuState();
|
|
41
|
+
const showGallery = Boolean(onChoosePasteOption) && state.canReapply;
|
|
42
|
+
const isEnabled = useCallback((option) => option.id !== "pasteLink" || state.canLink, [state.canLink]);
|
|
43
|
+
const choose = useCallback((option) => {
|
|
44
|
+
setState((prev) => ({ ...prev, open: false }));
|
|
45
|
+
onChoosePasteOption?.(option.id);
|
|
46
|
+
}, [onChoosePasteOption, setState]);
|
|
47
|
+
const handleKeyDown = useCallback((e) => {
|
|
48
|
+
if (!showGallery || e.ctrlKey || e.metaKey || e.altKey)
|
|
49
|
+
return;
|
|
50
|
+
if (e.key.length !== 1)
|
|
51
|
+
return;
|
|
52
|
+
const option = PASTE_OPTIONS.find((entry) => entry.key === e.key.toLowerCase());
|
|
53
|
+
if (!option || !isEnabled(option))
|
|
54
|
+
return;
|
|
55
|
+
e.preventDefault();
|
|
56
|
+
e.stopPropagation();
|
|
57
|
+
choose(option);
|
|
58
|
+
}, [showGallery, isEnabled, choose]);
|
|
5
59
|
return (React.createElement("div", { className: "absolute pointer-events-auto shadow-sm bg-rnc-background border-rnc-border border border-solid rounded-md flex items-start justify-start", style: {
|
|
6
60
|
left: x + width,
|
|
7
61
|
top: y + height,
|
|
8
|
-
}, onMouseDown: (e) => e.stopPropagation() },
|
|
9
|
-
React.createElement(DropdownMenu,
|
|
62
|
+
}, onMouseDown: (e) => e.stopPropagation(), "data-testid": "paste-options" },
|
|
63
|
+
React.createElement(DropdownMenu, { modal: false, open: state.open, onOpenChange: (open) => setState((prev) => ({ ...prev, open })) },
|
|
10
64
|
React.createElement(DropdownMenuTrigger, { asChild: true },
|
|
11
|
-
React.createElement(IconButton, { tooltip: "Paste
|
|
65
|
+
React.createElement(IconButton, { tooltip: "Paste Options (Ctrl)", "aria-label": "Paste Options" },
|
|
12
66
|
React.createElement(MdPaste, null),
|
|
13
67
|
React.createElement(MdOutlineArrowDropDown, null))),
|
|
14
68
|
React.createElement(DropdownMenuPortal, null,
|
|
15
|
-
React.createElement(DropdownMenuContent, { align: "start", onCloseAutoFocus: (event) => {
|
|
69
|
+
React.createElement(DropdownMenuContent, { align: "start", "aria-label": "Paste Options", onKeyDown: handleKeyDown, onCloseAutoFocus: (event) => {
|
|
16
70
|
event.preventDefault();
|
|
17
71
|
} },
|
|
72
|
+
showGallery
|
|
73
|
+
? PASTE_OPTION_GROUPS.map((group) => (React.createElement(React.Fragment, { key: group },
|
|
74
|
+
React.createElement(DropdownMenuLabel, null, group),
|
|
75
|
+
PASTE_OPTIONS.filter((option) => option.group === group).map((option) => (React.createElement(DropdownMenuCheckboxItem, { key: option.id, checked: state.active === option.id, disabled: !isEnabled(option), "aria-keyshortcuts": option.key.toUpperCase(), "data-paste-option": option.id, onSelect: () => choose(option) },
|
|
76
|
+
React.createElement(DropdownMenuItemIndicator, null,
|
|
77
|
+
React.createElement(CheckIcon, null)),
|
|
78
|
+
React.createElement("span", { className: "mr-2 inline-flex w-5 justify-center" }, ICONS[option.id]),
|
|
79
|
+
React.createElement(AcceleratorLabel, { option: option }),
|
|
80
|
+
React.createElement(DropdownRightSlot, null,
|
|
81
|
+
"(",
|
|
82
|
+
option.key.toUpperCase(),
|
|
83
|
+
")")))))))
|
|
84
|
+
: null,
|
|
85
|
+
showGallery ? React.createElement(DropdownMenuSeparator, null) : null,
|
|
18
86
|
React.createElement(DropdownMenuSub, null,
|
|
19
87
|
React.createElement(DropdownMenuSubTrigger, null,
|
|
20
88
|
"Split text to columns",
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { PasteSpecialOptions } from "../../hooks/use-copy-paste-cut";
|
|
2
|
+
/**
|
|
3
|
+
* Excel's Paste Options button gallery (the button that appears after a
|
|
4
|
+
* paste, opened by clicking it or pressing Ctrl alone), in Excel's groups and
|
|
5
|
+
* order with its accelerator letters (support.microsoft.com "Paste options").
|
|
6
|
+
* Picture and Linked Picture are left out: a grid paste never produces a
|
|
7
|
+
* picture of cells.
|
|
8
|
+
*/
|
|
9
|
+
export type PasteOptionId = "paste" | "formulas" | "formulasAndNumberFormats" | "keepSourceFormatting" | "noBorders" | "keepSourceColumnWidths" | "transpose" | "values" | "valuesAndNumberFormats" | "valuesAndSourceFormatting" | "formatting" | "pasteLink";
|
|
10
|
+
export type PasteOptionGroup = "Paste" | "Paste Values" | "Other Paste Options";
|
|
11
|
+
export type PasteOption = {
|
|
12
|
+
id: PasteOptionId;
|
|
13
|
+
label: string;
|
|
14
|
+
/** Accelerator letter, picked with the letter key while the gallery is open. */
|
|
15
|
+
key: string;
|
|
16
|
+
group: PasteOptionGroup;
|
|
17
|
+
/** The paste this option re-applies. */
|
|
18
|
+
request: PasteSpecialOptions;
|
|
19
|
+
};
|
|
20
|
+
export declare const PASTE_OPTIONS: PasteOption[];
|
|
21
|
+
export declare const PASTE_OPTION_GROUPS: PasteOptionGroup[];
|
|
22
|
+
/**
|
|
23
|
+
* The gallery entry a paste request corresponds to, so the button shows which
|
|
24
|
+
* option is applied (a plain Ctrl+V is "Paste"). `undefined` for a Paste
|
|
25
|
+
* Special combination the gallery has no entry for (Operation, Skip blanks…).
|
|
26
|
+
*/
|
|
27
|
+
export declare const pasteOptionForRequest: (request?: PasteSpecialOptions) => PasteOptionId | undefined;
|
|
28
|
+
//# sourceMappingURL=paste-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paste-options.d.ts","sourceRoot":"","sources":["../../../../components/selection/paste-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,UAAU,GACV,0BAA0B,GAC1B,sBAAsB,GACtB,WAAW,GACX,wBAAwB,GACxB,WAAW,GACX,QAAQ,GACR,wBAAwB,GACxB,2BAA2B,GAC3B,YAAY,GACZ,WAAW,CAAC;AAEhB,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,cAAc,GAAG,qBAAqB,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,gBAAgB,CAAC;IACxB,wCAAwC;IACxC,OAAO,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAAW,EA2CtC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,EAAqD,CAAC;AAExG;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,mBAAmB,KAAG,aAAa,GAAG,SAYrF,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export const PASTE_OPTIONS = [
|
|
2
|
+
{ id: "paste", label: "Paste", key: "p", group: "Paste", request: { paste: "all" } },
|
|
3
|
+
{ id: "formulas", label: "Formulas", key: "f", group: "Paste", request: { paste: "formulas" } },
|
|
4
|
+
{
|
|
5
|
+
id: "formulasAndNumberFormats",
|
|
6
|
+
label: "Formulas & Number Formatting",
|
|
7
|
+
key: "o",
|
|
8
|
+
group: "Paste",
|
|
9
|
+
request: { paste: "formulasAndNumberFormats" },
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: "keepSourceFormatting",
|
|
13
|
+
label: "Keep Source Formatting",
|
|
14
|
+
key: "k",
|
|
15
|
+
group: "Paste",
|
|
16
|
+
request: { paste: "allUsingSourceTheme" },
|
|
17
|
+
},
|
|
18
|
+
{ id: "noBorders", label: "No Borders", key: "b", group: "Paste", request: { paste: "allExceptBorders" } },
|
|
19
|
+
{
|
|
20
|
+
id: "keepSourceColumnWidths",
|
|
21
|
+
label: "Keep Source Column Widths",
|
|
22
|
+
key: "w",
|
|
23
|
+
group: "Paste",
|
|
24
|
+
request: { paste: "all", keepSourceColumnWidths: true },
|
|
25
|
+
},
|
|
26
|
+
{ id: "transpose", label: "Transpose", key: "t", group: "Paste", request: { paste: "all", transpose: true } },
|
|
27
|
+
{ id: "values", label: "Values", key: "v", group: "Paste Values", request: { paste: "values" } },
|
|
28
|
+
{
|
|
29
|
+
id: "valuesAndNumberFormats",
|
|
30
|
+
label: "Values & Number Formatting",
|
|
31
|
+
key: "a",
|
|
32
|
+
group: "Paste Values",
|
|
33
|
+
request: { paste: "valuesAndNumberFormats" },
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: "valuesAndSourceFormatting",
|
|
37
|
+
label: "Values & Source Formatting",
|
|
38
|
+
key: "e",
|
|
39
|
+
group: "Paste Values",
|
|
40
|
+
request: { paste: "valuesAndSourceFormatting" },
|
|
41
|
+
},
|
|
42
|
+
{ id: "formatting", label: "Formatting", key: "r", group: "Other Paste Options", request: { paste: "formats" } },
|
|
43
|
+
{ id: "pasteLink", label: "Paste Link", key: "n", group: "Other Paste Options", request: { link: true } },
|
|
44
|
+
];
|
|
45
|
+
export const PASTE_OPTION_GROUPS = ["Paste", "Paste Values", "Other Paste Options"];
|
|
46
|
+
/**
|
|
47
|
+
* The gallery entry a paste request corresponds to, so the button shows which
|
|
48
|
+
* option is applied (a plain Ctrl+V is "Paste"). `undefined` for a Paste
|
|
49
|
+
* Special combination the gallery has no entry for (Operation, Skip blanks…).
|
|
50
|
+
*/
|
|
51
|
+
export const pasteOptionForRequest = (request) => {
|
|
52
|
+
if (!request)
|
|
53
|
+
return "paste";
|
|
54
|
+
const extra = request.operation || request.skipBlanks;
|
|
55
|
+
if (extra)
|
|
56
|
+
return undefined;
|
|
57
|
+
const paste = request.paste ?? "all";
|
|
58
|
+
return PASTE_OPTIONS.find((option) => (option.request.paste ?? "all") === paste &&
|
|
59
|
+
Boolean(option.request.transpose) === Boolean(request.transpose) &&
|
|
60
|
+
Boolean(option.request.keepSourceColumnWidths) === Boolean(request.keepSourceColumnWidths) &&
|
|
61
|
+
Boolean(option.request.link) === Boolean(request.link))?.id;
|
|
62
|
+
};
|
|
@@ -3,10 +3,11 @@ import type { SelectionProps } from "@rowsncolumns/grid";
|
|
|
3
3
|
import type { ElementType } from "react";
|
|
4
4
|
import type { Maybe, PivotTable, SheetRange } from "../../types";
|
|
5
5
|
import type { AutoFillType, TableView } from "../../types";
|
|
6
|
+
import type { CalculatedColumnSmartTagProps } from "../calculated-column-smart-tag";
|
|
6
7
|
import type { SelectionAttributes } from "../canvas-grid/typings";
|
|
8
|
+
import type { ErrorCheckSmartTagProps } from "../error-check-smart-tag";
|
|
7
9
|
import type { InsertOptionsSmartTagProps } from "../insert-options-smart-tag";
|
|
8
10
|
import type { TableAutoExpansionSmartTagProps } from "../table-auto-expansion-smart-tag";
|
|
9
|
-
import type { CalculatedColumnSmartTagProps } from "../calculated-column-smart-tag";
|
|
10
11
|
import type { FillOptionsMenuProps } from "./fill-options-menu";
|
|
11
12
|
import type { MagicFillContentProps, MagicFillProps } from "./magic-fill";
|
|
12
13
|
import type { PasteMenuProps } from "./paste-menu";
|
|
@@ -64,8 +65,18 @@ export type SelectionNewProps = SelectionProps<SelectionAttributes> & {
|
|
|
64
65
|
*/
|
|
65
66
|
calculatedColumnFill?: Pick<CalculatedColumnSmartTagProps, "kind" | "canStop">;
|
|
66
67
|
onChooseCalculatedColumnOption?: CalculatedColumnSmartTagProps["onChooseOption"];
|
|
68
|
+
/**
|
|
69
|
+
* Excel's error-checking smart tag for THIS selection (present only on the active cell, when it
|
|
70
|
+
* carries the green ◤).
|
|
71
|
+
*/
|
|
72
|
+
errorCheck?: Pick<ErrorCheckSmartTagProps, "kind" | "errorName">;
|
|
73
|
+
errorCheckMenuOpen?: boolean;
|
|
74
|
+
onErrorCheckMenuOpenChange?: ErrorCheckSmartTagProps["onOpenChange"];
|
|
75
|
+
onChooseErrorCheckOption?: ErrorCheckSmartTagProps["onChooseOption"];
|
|
67
76
|
SuggestionAction?: React.ComponentType<SuggestionActionProps>;
|
|
68
77
|
readonly?: boolean;
|
|
78
|
+
/** Paste Options gallery choice (re-applies the last paste). */
|
|
79
|
+
onChoosePasteOption?: PasteMenuProps["onChoosePasteOption"];
|
|
69
80
|
showPasteMenu?: boolean;
|
|
70
81
|
sheetId: number;
|
|
71
82
|
onSplitTextToColumns: (delimiter?: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../components/selection/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../components/selection/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { SelectionDropAction } from "../../hooks/use-selection-drag-copy";
|
|
3
|
+
export declare const SELECTION_DROP_ACTION_LABELS: Record<SelectionDropAction, string>;
|
|
4
|
+
export type SelectionDropMenuProps = {
|
|
5
|
+
/** Release point, relative to the grid container. */
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
actions: SelectionDropAction[];
|
|
9
|
+
onSelectAction(action: SelectionDropAction): void;
|
|
10
|
+
/** Cancel, Esc or a click away — nothing changes. */
|
|
11
|
+
onCancel(): void;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* The menu a right-button drag of the selection border opens at the release point
|
|
15
|
+
* (Excel: Move Here, Copy Here, … Cancel). Opens immediately; any dismissal cancels.
|
|
16
|
+
*/
|
|
17
|
+
export declare const SelectionDropMenu: ({ x, y, actions, onSelectAction, onCancel, }: SelectionDropMenuProps) => React.JSX.Element;
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/selection-drop-menu/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAU5E,CAAC;AAUF,MAAM,MAAM,sBAAsB,GAAG;IACnC,qDAAqD;IACrD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClD,qDAAqD;IACrD,QAAQ,IAAI,IAAI,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,8CAM/B,sBAAsB,sBA2DxB,CAAC"}
|