@rowsncolumns/spreadsheet 10.2.76 → 10.3.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.
Files changed (180) hide show
  1. package/dist/cjs/api/insert-options.d.ts +67 -0
  2. package/dist/cjs/api/insert-options.d.ts.map +1 -0
  3. package/dist/cjs/api/insert-options.js +104 -0
  4. package/dist/cjs/api/move-overwrite.d.ts +14 -0
  5. package/dist/cjs/api/move-overwrite.d.ts.map +1 -0
  6. package/dist/cjs/api/move-overwrite.js +29 -0
  7. package/dist/cjs/api/multi-selection.d.ts +59 -0
  8. package/dist/cjs/api/multi-selection.d.ts.map +1 -0
  9. package/dist/cjs/api/multi-selection.js +166 -0
  10. package/dist/cjs/atoms/index.d.ts +3 -0
  11. package/dist/cjs/atoms/index.d.ts.map +1 -1
  12. package/dist/cjs/atoms/index.js +3 -0
  13. package/dist/cjs/atoms/insert-cells-dialog.atom.d.ts +36 -0
  14. package/dist/cjs/atoms/insert-cells-dialog.atom.d.ts.map +1 -0
  15. package/dist/cjs/atoms/insert-cells-dialog.atom.js +34 -0
  16. package/dist/cjs/atoms/insert-options.atom.d.ts +21 -0
  17. package/dist/cjs/atoms/insert-options.atom.d.ts.map +1 -0
  18. package/dist/cjs/atoms/insert-options.atom.js +11 -0
  19. package/dist/cjs/atoms/move-overwrite-confirm.atom.d.ts +24 -0
  20. package/dist/cjs/atoms/move-overwrite-confirm.atom.d.ts.map +1 -0
  21. package/dist/cjs/atoms/move-overwrite-confirm.atom.js +42 -0
  22. package/dist/cjs/atoms/sheet-context.atom.d.ts +2 -0
  23. package/dist/cjs/atoms/sheet-context.atom.d.ts.map +1 -1
  24. package/dist/cjs/atoms/sheet-context.atom.js +15 -2
  25. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  26. package/dist/cjs/components/canvas-grid/index.js +284 -63
  27. package/dist/cjs/components/canvas-grid/typings.d.ts +47 -5
  28. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  29. package/dist/cjs/components/cell-editor/formula-result-preview.d.ts +4 -1
  30. package/dist/cjs/components/cell-editor/formula-result-preview.d.ts.map +1 -1
  31. package/dist/cjs/components/cell-editor/formula-result-preview.js +2 -2
  32. package/dist/cjs/components/cell-editor/index.d.ts +7 -1
  33. package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
  34. package/dist/cjs/components/cell-editor/index.js +3 -3
  35. package/dist/cjs/components/cell-input/cell-input.d.ts +13 -0
  36. package/dist/cjs/components/cell-input/cell-input.d.ts.map +1 -1
  37. package/dist/cjs/components/cell-input/cell-input.js +8 -3
  38. package/dist/cjs/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  39. package/dist/cjs/components/cell-input/formula-bar-cell-input.js +3 -1
  40. package/dist/cjs/components/context-menu/index.d.ts +16 -1
  41. package/dist/cjs/components/context-menu/index.d.ts.map +1 -1
  42. package/dist/cjs/components/context-menu/index.js +245 -24
  43. package/dist/cjs/components/floating-cell-editor/index.d.ts.map +1 -1
  44. package/dist/cjs/components/floating-cell-editor/index.js +13 -5
  45. package/dist/cjs/components/insert-cells-dialog/index.d.ts +35 -0
  46. package/dist/cjs/components/insert-cells-dialog/index.d.ts.map +1 -0
  47. package/dist/cjs/components/insert-cells-dialog/index.js +84 -0
  48. package/dist/cjs/components/insert-options-smart-tag/index.d.ts +25 -0
  49. package/dist/cjs/components/insert-options-smart-tag/index.d.ts.map +1 -0
  50. package/dist/cjs/components/insert-options-smart-tag/index.js +41 -0
  51. package/dist/cjs/components/move-overwrite-confirm-dialog/index.d.ts +8 -0
  52. package/dist/cjs/components/move-overwrite-confirm-dialog/index.d.ts.map +1 -0
  53. package/dist/cjs/components/move-overwrite-confirm-dialog/index.js +34 -0
  54. package/dist/cjs/components/selection/index.d.ts +1 -1
  55. package/dist/cjs/components/selection/index.d.ts.map +1 -1
  56. package/dist/cjs/components/selection/index.js +4 -2
  57. package/dist/cjs/components/selection/types.d.ts +8 -0
  58. package/dist/cjs/components/selection/types.d.ts.map +1 -1
  59. package/dist/cjs/config.d.ts +6 -0
  60. package/dist/cjs/config.d.ts.map +1 -1
  61. package/dist/cjs/config.js +7 -1
  62. package/dist/cjs/hooks/use-cell-renderer.d.ts +7 -1
  63. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  64. package/dist/cjs/hooks/use-cell-renderer.js +8 -3
  65. package/dist/cjs/hooks/use-context-setter.d.ts.map +1 -1
  66. package/dist/cjs/hooks/use-context-setter.js +5 -1
  67. package/dist/cjs/hooks/use-copy-paste-cut.d.ts +5 -0
  68. package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
  69. package/dist/cjs/hooks/use-copy-paste-cut.js +19 -0
  70. package/dist/cjs/hooks/use-editor-change.d.ts +4 -1
  71. package/dist/cjs/hooks/use-editor-change.d.ts.map +1 -1
  72. package/dist/cjs/hooks/use-editor-change.js +4 -3
  73. package/dist/cjs/hooks/use-editor-submit.d.ts +8 -1
  74. package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
  75. package/dist/cjs/hooks/use-editor-submit.js +9 -1
  76. package/dist/cjs/hooks/use-move-columns-rows.d.ts.map +1 -1
  77. package/dist/cjs/hooks/use-move-columns-rows.js +6 -0
  78. package/dist/cjs/hooks/use-selection-renderer.d.ts +9 -1
  79. package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
  80. package/dist/cjs/hooks/use-selection-renderer.js +26 -2
  81. package/dist/cjs/hooks/use-selection.d.ts +13 -5
  82. package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
  83. package/dist/cjs/hooks/use-selection.js +48 -6
  84. package/dist/cjs/index.d.ts +7 -0
  85. package/dist/cjs/index.d.ts.map +1 -1
  86. package/dist/cjs/index.js +7 -0
  87. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  88. package/dist/cjs/types.d.ts +8 -0
  89. package/dist/cjs/types.d.ts.map +1 -1
  90. package/dist/esm/api/insert-options.d.ts +67 -0
  91. package/dist/esm/api/insert-options.d.ts.map +1 -0
  92. package/dist/esm/api/insert-options.js +91 -0
  93. package/dist/esm/api/move-overwrite.d.ts +14 -0
  94. package/dist/esm/api/move-overwrite.d.ts.map +1 -0
  95. package/dist/esm/api/move-overwrite.js +25 -0
  96. package/dist/esm/api/multi-selection.d.ts +59 -0
  97. package/dist/esm/api/multi-selection.d.ts.map +1 -0
  98. package/dist/esm/api/multi-selection.js +92 -0
  99. package/dist/esm/atoms/index.d.ts +3 -0
  100. package/dist/esm/atoms/index.d.ts.map +1 -1
  101. package/dist/esm/atoms/index.js +3 -0
  102. package/dist/esm/atoms/insert-cells-dialog.atom.d.ts +36 -0
  103. package/dist/esm/atoms/insert-cells-dialog.atom.d.ts.map +1 -0
  104. package/dist/esm/atoms/insert-cells-dialog.atom.js +25 -0
  105. package/dist/esm/atoms/insert-options.atom.d.ts +21 -0
  106. package/dist/esm/atoms/insert-options.atom.d.ts.map +1 -0
  107. package/dist/esm/atoms/insert-options.atom.js +5 -0
  108. package/dist/esm/atoms/move-overwrite-confirm.atom.d.ts +24 -0
  109. package/dist/esm/atoms/move-overwrite-confirm.atom.d.ts.map +1 -0
  110. package/dist/esm/atoms/move-overwrite-confirm.atom.js +29 -0
  111. package/dist/esm/atoms/sheet-context.atom.d.ts +2 -0
  112. package/dist/esm/atoms/sheet-context.atom.d.ts.map +1 -1
  113. package/dist/esm/atoms/sheet-context.atom.js +10 -0
  114. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  115. package/dist/esm/components/canvas-grid/index.js +236 -19
  116. package/dist/esm/components/canvas-grid/typings.d.ts +47 -5
  117. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  118. package/dist/esm/components/cell-editor/formula-result-preview.d.ts +4 -1
  119. package/dist/esm/components/cell-editor/formula-result-preview.d.ts.map +1 -1
  120. package/dist/esm/components/cell-editor/formula-result-preview.js +3 -3
  121. package/dist/esm/components/cell-editor/index.d.ts +7 -1
  122. package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
  123. package/dist/esm/components/cell-editor/index.js +3 -3
  124. package/dist/esm/components/cell-input/cell-input.d.ts +13 -0
  125. package/dist/esm/components/cell-input/cell-input.d.ts.map +1 -1
  126. package/dist/esm/components/cell-input/cell-input.js +10 -5
  127. package/dist/esm/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  128. package/dist/esm/components/cell-input/formula-bar-cell-input.js +3 -1
  129. package/dist/esm/components/context-menu/index.d.ts +16 -1
  130. package/dist/esm/components/context-menu/index.d.ts.map +1 -1
  131. package/dist/esm/components/context-menu/index.js +193 -16
  132. package/dist/esm/components/floating-cell-editor/index.d.ts.map +1 -1
  133. package/dist/esm/components/floating-cell-editor/index.js +12 -6
  134. package/dist/esm/components/insert-cells-dialog/index.d.ts +35 -0
  135. package/dist/esm/components/insert-cells-dialog/index.d.ts.map +1 -0
  136. package/dist/esm/components/insert-cells-dialog/index.js +79 -0
  137. package/dist/esm/components/insert-options-smart-tag/index.d.ts +25 -0
  138. package/dist/esm/components/insert-options-smart-tag/index.d.ts.map +1 -0
  139. package/dist/esm/components/insert-options-smart-tag/index.js +35 -0
  140. package/dist/esm/components/move-overwrite-confirm-dialog/index.d.ts +8 -0
  141. package/dist/esm/components/move-overwrite-confirm-dialog/index.d.ts.map +1 -0
  142. package/dist/esm/components/move-overwrite-confirm-dialog/index.js +30 -0
  143. package/dist/esm/components/selection/index.d.ts +1 -1
  144. package/dist/esm/components/selection/index.d.ts.map +1 -1
  145. package/dist/esm/components/selection/index.js +4 -2
  146. package/dist/esm/components/selection/types.d.ts +8 -0
  147. package/dist/esm/components/selection/types.d.ts.map +1 -1
  148. package/dist/esm/config.d.ts +6 -0
  149. package/dist/esm/config.d.ts.map +1 -1
  150. package/dist/esm/config.js +6 -0
  151. package/dist/esm/hooks/use-cell-renderer.d.ts +7 -1
  152. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  153. package/dist/esm/hooks/use-cell-renderer.js +9 -4
  154. package/dist/esm/hooks/use-context-setter.d.ts.map +1 -1
  155. package/dist/esm/hooks/use-context-setter.js +5 -1
  156. package/dist/esm/hooks/use-copy-paste-cut.d.ts +5 -0
  157. package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
  158. package/dist/esm/hooks/use-copy-paste-cut.js +19 -0
  159. package/dist/esm/hooks/use-editor-change.d.ts +4 -1
  160. package/dist/esm/hooks/use-editor-change.d.ts.map +1 -1
  161. package/dist/esm/hooks/use-editor-change.js +5 -4
  162. package/dist/esm/hooks/use-editor-submit.d.ts +8 -1
  163. package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
  164. package/dist/esm/hooks/use-editor-submit.js +10 -2
  165. package/dist/esm/hooks/use-move-columns-rows.d.ts.map +1 -1
  166. package/dist/esm/hooks/use-move-columns-rows.js +6 -0
  167. package/dist/esm/hooks/use-selection-renderer.d.ts +9 -1
  168. package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
  169. package/dist/esm/hooks/use-selection-renderer.js +26 -2
  170. package/dist/esm/hooks/use-selection.d.ts +13 -5
  171. package/dist/esm/hooks/use-selection.d.ts.map +1 -1
  172. package/dist/esm/hooks/use-selection.js +39 -3
  173. package/dist/esm/index.d.ts +7 -0
  174. package/dist/esm/index.d.ts.map +1 -1
  175. package/dist/esm/index.js +7 -0
  176. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  177. package/dist/esm/types.d.ts +8 -0
  178. package/dist/esm/types.d.ts.map +1 -1
  179. package/dist/spreadsheet.min.css +1 -1
  180. package/package.json +8 -7
@@ -7,28 +7,245 @@ var icons_1 = require("@rowsncolumns/icons");
7
7
  var ui_1 = require("@rowsncolumns/ui");
8
8
  var utils_1 = require("@rowsncolumns/utils");
9
9
  var react_1 = tslib_1.__importStar(require("react"));
10
+ var multi_selection_1 = require("../../api/multi-selection");
10
11
  var validation_1 = require("../../api/validation");
11
12
  var atoms_1 = require("../../atoms");
12
13
  var advanced_filter_dialog_atom_1 = require("../../atoms/advanced-filter-dialog.atom");
13
14
  var goal_seek_dialog_atom_1 = require("../../atoms/goal-seek-dialog.atom");
15
+ var insert_cells_dialog_atom_1 = require("../../atoms/insert-cells-dialog.atom");
14
16
  var remove_duplicates_dialog_atom_1 = require("../../atoms/remove-duplicates-dialog.atom");
15
17
  var subtotal_dialog_atom_1 = require("../../atoms/subtotal-dialog.atom");
16
18
  var text_to_columns_dialog_atom_1 = require("../../atoms/text-to-columns-dialog.atom");
19
+ var validation_alert_atom_1 = require("../../atoms/validation-alert.atom");
17
20
  var config_1 = require("../../config");
18
21
  var helpers_1 = require("../../helpers");
19
22
  var total_row_functions_1 = require("./total-row-functions");
20
23
  var ContextMenu = function (_a) {
21
- var _b;
22
- var isRowHeader = _a.isRowHeader, isColumnHeader = _a.isColumnHeader, activeCell = _a.activeCell, selections = _a.selections, basicFilter = _a.basicFilter, isTableHeader = _a.isTableHeader, onClearContents = _a.onClearContents, onHideColumn = _a.onHideColumn, onHideRow = _a.onHideRow, onGroupRows = _a.onGroupRows, onUngroupRows = _a.onUngroupRows, onGroupColumns = _a.onGroupColumns, onUngroupColumns = _a.onUngroupColumns, onDeleteRow = _a.onDeleteRow, onDeleteColumn = _a.onDeleteColumn, onInsertColumn = _a.onInsertColumn, onInsertRow = _a.onInsertRow, onInsertCellsShiftDown = _a.onInsertCellsShiftDown, onInsertCellsShiftRight = _a.onInsertCellsShiftRight, onDeleteCellsShiftLeft = _a.onDeleteCellsShiftLeft, onDeleteCellsShiftUp = _a.onDeleteCellsShiftUp, onFreezeRow = _a.onFreezeRow, onFreezeColumn = _a.onFreezeColumn, onCopy = _a.onCopy, onCut = _a.onCut, onPaste = _a.onPaste, onRequestPasteSpecial = _a.onRequestPasteSpecial, onRequestEvaluateFormula = _a.onRequestEvaluateFormula, onRequestAddWatch = _a.onRequestAddWatch, isActiveCellFormula = _a.isActiveCellFormula, onInsertNote = _a.onInsertNote, onProtectRange = _a.onProtectRange, onUnProtectRange = _a.onUnProtectRange, onSortRange = _a.onSortRange, onSortColumn = _a.onSortColumn, onRequestDefineNamedRange = _a.onRequestDefineNamedRange, onRequestResize = _a.onRequestResize, onRequestEditTable = _a.onRequestEditTable, onRequestEditPivotTable = _a.onRequestEditPivotTable, onRequestDeletePivotTable = _a.onRequestDeletePivotTable, onPivotDrillDown = _a.onPivotDrillDown, onRequestFormatCells = _a.onRequestFormatCells, onRequestConditionalFormat = _a.onRequestConditionalFormat, onRequestDataValidation = _a.onRequestDataValidation, onRemoveTable = _a.onRemoveTable, onClearFormatting = _a.onClearFormatting, onCreateTable = _a.onCreateTable, onCreateBasicFilter = _a.onCreateBasicFilter, onFilterTable = _a.onFilterTable, onSortTable = _a.onSortTable, getFormattedValuesFromRange = _a.getFormattedValuesFromRange, focusSheet = _a.focusSheet, isSheetFocused = _a.isSheetFocused, getFormattedValue = _a.getFormattedValue, onInsertTableColumn = _a.onInsertTableColumn, onDeleteTableColumn = _a.onDeleteTableColumn, onInsertTableRow = _a.onInsertTableRow, onDeleteTableRow = _a.onDeleteTableRow, onSplitTextToColumns = _a.onSplitTextToColumns, onRemoveDuplicates = _a.onRemoveDuplicates, onGoalSeek = _a.onGoalSeek, onSubtotal = _a.onSubtotal, onAdvancedFilter = _a.onAdvancedFilter, onChange = _a.onChange, getCellData = _a.getCellData, isHiddenColumn = _a.isHiddenColumn, isHiddenRow = _a.isHiddenRow, onShowColumn = _a.onShowColumn, onShowRow = _a.onShowRow, tables = _a.tables, pivotTables = _a.pivotTables, protectedRanges = _a.protectedRanges, sheetId = _a.sheetId, frozenRows = _a.frozenRows, frozenColumns = _a.frozenColumns, selectedRowHeadersIds = _a.selectedRowHeadersIds, selectedColumnHeadersIds = _a.selectedColumnHeadersIds, _c = _a.readonly, readonly = _c === void 0 ? false : _c, onAddQuickEdit = _a.onAddQuickEdit, enableMagicFill = _a.enableMagicFill;
24
+ var _b, _c, _d;
25
+ var isRowHeader = _a.isRowHeader, isColumnHeader = _a.isColumnHeader, activeCell = _a.activeCell, selections = _a.selections, basicFilter = _a.basicFilter, isTableHeader = _a.isTableHeader, onClearContents = _a.onClearContents, onHideColumn = _a.onHideColumn, onHideRow = _a.onHideRow, onGroupRows = _a.onGroupRows, onUngroupRows = _a.onUngroupRows, onGroupColumns = _a.onGroupColumns, onUngroupColumns = _a.onUngroupColumns, onDeleteRow = _a.onDeleteRow, onDeleteColumn = _a.onDeleteColumn, onInsertColumn = _a.onInsertColumn, onInsertRow = _a.onInsertRow, onInsertCellsShiftDown = _a.onInsertCellsShiftDown, onInsertCellsShiftRight = _a.onInsertCellsShiftRight, onDeleteCellsShiftLeft = _a.onDeleteCellsShiftLeft, onDeleteCellsShiftUp = _a.onDeleteCellsShiftUp, onFreezeRow = _a.onFreezeRow, onFreezeColumn = _a.onFreezeColumn, onCopy = _a.onCopy, onCut = _a.onCut, hasCutSelection = _a.hasCutSelection, onInsertCutCells = _a.onInsertCutCells, onPaste = _a.onPaste, onRequestPasteSpecial = _a.onRequestPasteSpecial, onRequestEvaluateFormula = _a.onRequestEvaluateFormula, onRequestAddWatch = _a.onRequestAddWatch, isActiveCellFormula = _a.isActiveCellFormula, onInsertNote = _a.onInsertNote, onProtectRange = _a.onProtectRange, onUnProtectRange = _a.onUnProtectRange, onSortRange = _a.onSortRange, onSortColumn = _a.onSortColumn, onRequestDefineNamedRange = _a.onRequestDefineNamedRange, onRequestResize = _a.onRequestResize, onRequestEditTable = _a.onRequestEditTable, onRequestEditPivotTable = _a.onRequestEditPivotTable, onRequestDeletePivotTable = _a.onRequestDeletePivotTable, onPivotDrillDown = _a.onPivotDrillDown, onRequestFormatCells = _a.onRequestFormatCells, onRequestConditionalFormat = _a.onRequestConditionalFormat, onRequestDataValidation = _a.onRequestDataValidation, onRemoveTable = _a.onRemoveTable, onClearFormatting = _a.onClearFormatting, onCreateTable = _a.onCreateTable, onCreateBasicFilter = _a.onCreateBasicFilter, onFilterTable = _a.onFilterTable, onSortTable = _a.onSortTable, getFormattedValuesFromRange = _a.getFormattedValuesFromRange, focusSheet = _a.focusSheet, isSheetFocused = _a.isSheetFocused, getFormattedValue = _a.getFormattedValue, onInsertTableColumn = _a.onInsertTableColumn, onDeleteTableColumn = _a.onDeleteTableColumn, onInsertTableRow = _a.onInsertTableRow, onDeleteTableRow = _a.onDeleteTableRow, onSplitTextToColumns = _a.onSplitTextToColumns, onRemoveDuplicates = _a.onRemoveDuplicates, onGoalSeek = _a.onGoalSeek, onSubtotal = _a.onSubtotal, onAdvancedFilter = _a.onAdvancedFilter, onChange = _a.onChange, getCellData = _a.getCellData, isHiddenColumn = _a.isHiddenColumn, isHiddenRow = _a.isHiddenRow, onShowColumn = _a.onShowColumn, onShowRow = _a.onShowRow, tables = _a.tables, pivotTables = _a.pivotTables, protectedRanges = _a.protectedRanges, sheetId = _a.sheetId, frozenRows = _a.frozenRows, frozenColumns = _a.frozenColumns, selectedRowHeadersIds = _a.selectedRowHeadersIds, selectedColumnHeadersIds = _a.selectedColumnHeadersIds, rowCount = _a.rowCount, columnCount = _a.columnCount, _e = _a.readonly, readonly = _e === void 0 ? false : _e, onAddQuickEdit = _a.onAddQuickEdit, enableMagicFill = _a.enableMagicFill;
23
26
  var isHeader = isColumnHeader || isRowHeader;
24
27
  var shouldFocusSheetRef = (0, react_1.useRef)(true);
25
28
  var multiColumnTitle = (0, helpers_1.generateMultiDimTitle)(selectedColumnHeadersIds, "y");
26
- var selection = selections.length
27
- ? selections[0]
28
- : (0, grid_1.selectionFromActiveCell)(activeCell)[0];
29
+ var selectionAreas = selections.length
30
+ ? selections
31
+ : (0, grid_1.selectionFromActiveCell)(activeCell);
32
+ var selection = selectionAreas[0];
29
33
  var multiRowTitle = (0, helpers_1.generateMultiDimTitle)(selectedRowHeadersIds, "x");
30
- var selectedRowIndexes = (0, helpers_1.createArrayRange)(selection.range.startRowIndex, selection.range.endRowIndex);
31
- var selectedColumnIndexes = (0, helpers_1.createArrayRange)(selection.range.startColumnIndex, selection.range.endColumnIndex);
34
+ // Every Ctrl-click area counts, not just the first (Excel INS-08 / UI-07).
35
+ var selectedRowIndexes = (0, multi_selection_1.indexesForAreas)(selectionAreas, "row");
36
+ var selectedColumnIndexes = (0, multi_selection_1.indexesForAreas)(selectionAreas, "column");
37
+ var isWholeRow = columnCount != null
38
+ ? (0, multi_selection_1.wholeRowPredicate)(columnCount)
39
+ : (0, multi_selection_1.wholeRowPredicateFromHeaderIds)(selectedRowHeadersIds);
40
+ var isWholeColumn = rowCount != null
41
+ ? (0, multi_selection_1.wholeColumnPredicate)(rowCount)
42
+ : (0, multi_selection_1.wholeColumnPredicateFromHeaderIds)(selectedColumnHeadersIds);
43
+ var multiSelectionKind = (0, multi_selection_1.classifyMultiSelection)(selectionAreas, {
44
+ isWholeRow: isWholeRow,
45
+ isWholeColumn: isWholeColumn,
46
+ });
47
+ var showValidationAlert = (0, validation_alert_atom_1.useShowValidationAlert)();
48
+ var isInsertCellsDialogMounted = (0, insert_cells_dialog_atom_1.useIsInsertCellsDialogMounted)();
49
+ var openInsertCellsDialog = (0, insert_cells_dialog_atom_1.useOpenInsertCellsDialog)();
50
+ /** Excel: "That command cannot be used on multiple selections." */
51
+ var refuseMultipleSelections = function (title) {
52
+ shouldFocusSheetRef.current = false;
53
+ void showValidationAlert({
54
+ style: "stop",
55
+ title: title,
56
+ message: config_1.MULTIPLE_SELECTIONS_ERROR,
57
+ confirm: false,
58
+ }).then(function () { return focusSheet(); });
59
+ };
60
+ /**
61
+ * The entire-row bands a row insert / delete acts on — one per selected
62
+ * area, bottom-up, so inserting above each band never shifts a band still
63
+ * to be processed (Excel INS-08). Falls back to the header bookkeeping, then
64
+ * to the active row, when no area is a whole row.
65
+ */
66
+ var rowBands = function () {
67
+ var areas = selectionAreas.filter(function (_a) {
68
+ var range = _a.range;
69
+ return isWholeRow(range);
70
+ });
71
+ var bands = areas.length
72
+ ? (0, multi_selection_1.bandsForAreas)(areas, "row")
73
+ : (0, multi_selection_1.bandsFromIndexes)(selectedRowHeadersIds);
74
+ return bands.length
75
+ ? bands
76
+ : [{ start: activeCell.rowIndex, end: activeCell.rowIndex }];
77
+ };
78
+ var columnBands = function () {
79
+ var areas = selectionAreas.filter(function (_a) {
80
+ var range = _a.range;
81
+ return isWholeColumn(range);
82
+ });
83
+ var bands = areas.length
84
+ ? (0, multi_selection_1.bandsForAreas)(areas, "column")
85
+ : (0, multi_selection_1.bandsFromIndexes)(selectedColumnHeadersIds);
86
+ return bands.length
87
+ ? bands
88
+ : [{ start: activeCell.columnIndex, end: activeCell.columnIndex }];
89
+ };
90
+ var bandSize = function (band) { return band.end - band.start + 1; };
91
+ var insertRowsAbove = function () {
92
+ var e_1, _a;
93
+ try {
94
+ for (var _b = tslib_1.__values(rowBands()), _c = _b.next(); !_c.done; _c = _b.next()) {
95
+ var band = _c.value;
96
+ onInsertRow === null || onInsertRow === void 0 ? void 0 : onInsertRow(sheetId, band.start, bandSize(band));
97
+ }
98
+ }
99
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
100
+ finally {
101
+ try {
102
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
103
+ }
104
+ finally { if (e_1) throw e_1.error; }
105
+ }
106
+ };
107
+ var insertRowsBelow = function () {
108
+ var e_2, _a;
109
+ try {
110
+ for (var _b = tslib_1.__values(rowBands()), _c = _b.next(); !_c.done; _c = _b.next()) {
111
+ var band = _c.value;
112
+ onInsertRow === null || onInsertRow === void 0 ? void 0 : onInsertRow(sheetId, band.end + 1, bandSize(band));
113
+ }
114
+ }
115
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
116
+ finally {
117
+ try {
118
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
119
+ }
120
+ finally { if (e_2) throw e_2.error; }
121
+ }
122
+ };
123
+ var insertColumnsLeft = function () {
124
+ var e_3, _a;
125
+ try {
126
+ for (var _b = tslib_1.__values(columnBands()), _c = _b.next(); !_c.done; _c = _b.next()) {
127
+ var band = _c.value;
128
+ onInsertColumn === null || onInsertColumn === void 0 ? void 0 : onInsertColumn(sheetId, band.start, bandSize(band));
129
+ }
130
+ }
131
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
132
+ finally {
133
+ try {
134
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
135
+ }
136
+ finally { if (e_3) throw e_3.error; }
137
+ }
138
+ };
139
+ var insertColumnsRight = function () {
140
+ var e_4, _a;
141
+ try {
142
+ for (var _b = tslib_1.__values(columnBands()), _c = _b.next(); !_c.done; _c = _b.next()) {
143
+ var band = _c.value;
144
+ onInsertColumn === null || onInsertColumn === void 0 ? void 0 : onInsertColumn(sheetId, band.end + 1, bandSize(band));
145
+ }
146
+ }
147
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
148
+ finally {
149
+ try {
150
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
151
+ }
152
+ finally { if (e_4) throw e_4.error; }
153
+ }
154
+ };
155
+ var isSingleWholeRow = multiSelectionKind === "single" && isWholeRow(selection.range);
156
+ var isSingleWholeColumn = multiSelectionKind === "single" && isWholeColumn(selection.range);
157
+ /**
158
+ * Excel's cell-menu Insert: entire rows / columns insert directly, a
159
+ * multi-area selection inserts per area or is refused, and a plain cell
160
+ * range opens the Insert dialog (UI-06 / UI-07). The direct submenu remains
161
+ * only while no `InsertCellsDialogHost` is mounted.
162
+ */
163
+ var usesDirectInsertSubmenu = multiSelectionKind === "single" &&
164
+ !isSingleWholeRow &&
165
+ !isSingleWholeColumn &&
166
+ !isInsertCellsDialogMounted;
167
+ var handleInsertCells = function () {
168
+ if (multiSelectionKind === "mixed") {
169
+ refuseMultipleSelections("Insert");
170
+ return;
171
+ }
172
+ if (multiSelectionKind === "all-rows" || isSingleWholeRow) {
173
+ insertRowsAbove();
174
+ return;
175
+ }
176
+ if (multiSelectionKind === "all-columns" || isSingleWholeColumn) {
177
+ insertColumnsLeft();
178
+ return;
179
+ }
180
+ shouldFocusSheetRef.current = false;
181
+ openInsertCellsDialog({
182
+ mode: "insert",
183
+ defaultChoice: (0, multi_selection_1.defaultInsertCellsChoice)(selection.range),
184
+ onApply: function (choice) {
185
+ switch (choice) {
186
+ case "shift-right":
187
+ onInsertCellsShiftRight === null || onInsertCellsShiftRight === void 0 ? void 0 : onInsertCellsShiftRight(sheetId, activeCell, selections);
188
+ break;
189
+ case "shift-down":
190
+ onInsertCellsShiftDown === null || onInsertCellsShiftDown === void 0 ? void 0 : onInsertCellsShiftDown(sheetId, activeCell, selections);
191
+ break;
192
+ case "entire-row":
193
+ onInsertRow === null || onInsertRow === void 0 ? void 0 : onInsertRow(sheetId, selection.range.startRowIndex, selectedRowIndexes.length);
194
+ break;
195
+ case "entire-column":
196
+ onInsertColumn === null || onInsertColumn === void 0 ? void 0 : onInsertColumn(sheetId, selection.range.startColumnIndex, selectedColumnIndexes.length);
197
+ break;
198
+ }
199
+ focusSheet();
200
+ },
201
+ });
202
+ };
203
+ var handleDeleteCells = function () {
204
+ if (multiSelectionKind === "mixed") {
205
+ refuseMultipleSelections("Delete");
206
+ return;
207
+ }
208
+ if (multiSelectionKind === "all-rows" || isSingleWholeRow) {
209
+ onDeleteRow === null || onDeleteRow === void 0 ? void 0 : onDeleteRow(sheetId, selectedRowIndexes);
210
+ return;
211
+ }
212
+ if (multiSelectionKind === "all-columns" || isSingleWholeColumn) {
213
+ onDeleteColumn === null || onDeleteColumn === void 0 ? void 0 : onDeleteColumn(sheetId, selectedColumnIndexes);
214
+ return;
215
+ }
216
+ shouldFocusSheetRef.current = false;
217
+ openInsertCellsDialog({
218
+ mode: "delete",
219
+ defaultChoice: (0, multi_selection_1.defaultDeleteCellsChoice)(selection.range),
220
+ onApply: function (choice) {
221
+ switch (choice) {
222
+ case "shift-left":
223
+ onDeleteCellsShiftLeft === null || onDeleteCellsShiftLeft === void 0 ? void 0 : onDeleteCellsShiftLeft(sheetId, activeCell, selections);
224
+ break;
225
+ case "shift-up":
226
+ onDeleteCellsShiftUp === null || onDeleteCellsShiftUp === void 0 ? void 0 : onDeleteCellsShiftUp(sheetId, activeCell, selections);
227
+ break;
228
+ case "entire-row":
229
+ onDeleteRow === null || onDeleteRow === void 0 ? void 0 : onDeleteRow(sheetId, selectedRowIndexes);
230
+ break;
231
+ case "entire-column":
232
+ onDeleteColumn === null || onDeleteColumn === void 0 ? void 0 : onDeleteColumn(sheetId, selectedColumnIndexes);
233
+ break;
234
+ }
235
+ focusSheet();
236
+ },
237
+ });
238
+ };
239
+ var insertCellsLabel = multiSelectionKind === "all-rows" || isSingleWholeRow
240
+ ? "Insert ".concat(selectedRowIndexes.length, " row above")
241
+ : multiSelectionKind === "all-columns" || isSingleWholeColumn
242
+ ? "Insert ".concat(selectedColumnIndexes.length, " column left")
243
+ : "Insert…";
244
+ var deleteCellsLabel = multiSelectionKind === "all-rows" || isSingleWholeRow
245
+ ? "Delete row ".concat((_b = (0, helpers_1.generateMultiDimTitle)(selectedRowIndexes, "x")) !== null && _b !== void 0 ? _b : "")
246
+ : multiSelectionKind === "all-columns" || isSingleWholeColumn
247
+ ? "Delete column ".concat((_c = (0, helpers_1.generateMultiDimTitle)(selectedColumnIndexes, "y")) !== null && _c !== void 0 ? _c : "")
248
+ : "Delete…";
32
249
  var hiddenColumns = selectedColumnIndexes.filter(function (index) {
33
250
  return isHiddenColumn(index);
34
251
  });
@@ -349,6 +566,12 @@ var ContextMenu = function (_a) {
349
566
  react_1.default.createElement(icons_1.ClipboardIcon, null)),
350
567
  "Paste ",
351
568
  react_1.default.createElement(ui_1.DropdownRightSlot, null, "\u2318V")),
569
+ onInsertCutCells ? (react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
570
+ return onInsertCutCells(isRowHeader ? "rows" : isColumnHeader ? "columns" : "cells");
571
+ }, disabled: readonly || !hasCutSelection },
572
+ react_1.default.createElement(ui_1.DropdownLeftSlot, null,
573
+ react_1.default.createElement(icons_1.ClipboardIcon, null)),
574
+ "Insert Cut Cells")) : null,
352
575
  react_1.default.createElement(ui_1.DropdownMenuSub, null,
353
576
  react_1.default.createElement(ui_1.DropdownMenuSubTrigger, { disabled: readonly },
354
577
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
@@ -394,17 +617,13 @@ var ContextMenu = function (_a) {
394
617
  react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () { return onClearContents === null || onClearContents === void 0 ? void 0 : onClearContents(sheetId, activeCell, selections); }, disabled: readonly }, "Clear contents"))),
395
618
  react_1.default.createElement(ui_1.DropdownMenuSeparator, null),
396
619
  isColumnHeader ? (react_1.default.createElement(react_1.default.Fragment, null,
397
- react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
398
- return onInsertColumn === null || onInsertColumn === void 0 ? void 0 : onInsertColumn(sheetId, activeCell.columnIndex, selectedColumnHeadersIds.length);
399
- }, disabled: readonly },
620
+ react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: insertColumnsLeft, disabled: readonly },
400
621
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
401
622
  react_1.default.createElement(icons_1.PlusIcon, null)),
402
623
  "Insert ",
403
624
  selectedColumnHeadersIds.length,
404
625
  " column left"),
405
- react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
406
- return onInsertColumn === null || onInsertColumn === void 0 ? void 0 : onInsertColumn(sheetId, activeCell.columnIndex + selectedColumnHeadersIds.length, selectedColumnHeadersIds.length);
407
- }, disabled: readonly },
626
+ react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: insertColumnsRight, disabled: readonly },
408
627
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
409
628
  react_1.default.createElement(icons_1.PlusIcon, null)),
410
629
  "Insert ",
@@ -470,17 +689,13 @@ var ContextMenu = function (_a) {
470
689
  react_1.default.createElement(icons_1.SortUpIcon, null)),
471
690
  "Sort sheet Z to A"))) : null,
472
691
  isRowHeader ? (react_1.default.createElement(react_1.default.Fragment, null,
473
- react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
474
- return onInsertRow === null || onInsertRow === void 0 ? void 0 : onInsertRow(sheetId, activeCell.rowIndex, selectedRowHeadersIds.length);
475
- }, disabled: readonly },
692
+ react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: insertRowsAbove, disabled: readonly },
476
693
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
477
694
  react_1.default.createElement(icons_1.PlusIcon, null)),
478
695
  "Insert ",
479
696
  selectedRowHeadersIds.length,
480
697
  " row above"),
481
- react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
482
- return onInsertRow === null || onInsertRow === void 0 ? void 0 : onInsertRow(sheetId, activeCell.rowIndex + selectedRowHeadersIds.length, selectedRowHeadersIds.length);
483
- }, disabled: readonly },
698
+ react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: insertRowsBelow, disabled: readonly },
484
699
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
485
700
  react_1.default.createElement(icons_1.PlusIcon, null)),
486
701
  "Insert ",
@@ -555,7 +770,7 @@ var ContextMenu = function (_a) {
555
770
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
556
771
  react_1.default.createElement(icons_1.MdOutlineFactCheck, null)),
557
772
  "Data validation")) : null)) : (react_1.default.createElement(react_1.default.Fragment, null,
558
- react_1.default.createElement(ui_1.DropdownMenuSub, null,
773
+ activeTable || usesDirectInsertSubmenu ? (react_1.default.createElement(ui_1.DropdownMenuSub, null,
559
774
  react_1.default.createElement(ui_1.DropdownMenuSubTrigger, { disabled: readonly },
560
775
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
561
776
  react_1.default.createElement(icons_1.PlusIcon, null)),
@@ -611,8 +826,11 @@ var ContextMenu = function (_a) {
611
826
  }, disabled: readonly },
612
827
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
613
828
  react_1.default.createElement(icons_1.PlusIcon, null)),
614
- "Insert cells and shift cells down"))))),
615
- react_1.default.createElement(ui_1.DropdownMenuSub, null,
829
+ "Insert cells and shift cells down")))))) : (react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: handleInsertCells, disabled: readonly },
830
+ react_1.default.createElement(ui_1.DropdownLeftSlot, null,
831
+ react_1.default.createElement(icons_1.PlusIcon, null)),
832
+ insertCellsLabel)),
833
+ activeTable || usesDirectInsertSubmenu ? (react_1.default.createElement(ui_1.DropdownMenuSub, null,
616
834
  react_1.default.createElement(ui_1.DropdownMenuSubTrigger, { disabled: readonly },
617
835
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
618
836
  react_1.default.createElement(icons_1.TrashIcon, null)),
@@ -658,7 +876,10 @@ var ContextMenu = function (_a) {
658
876
  }, disabled: readonly },
659
877
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
660
878
  react_1.default.createElement(icons_1.TrashIcon, null)),
661
- "Delete cells and shift cells up"))))),
879
+ "Delete cells and shift cells up")))))) : (react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: handleDeleteCells, disabled: readonly },
880
+ react_1.default.createElement(ui_1.DropdownLeftSlot, null,
881
+ react_1.default.createElement(icons_1.TrashIcon, null)),
882
+ deleteCellsLabel)),
662
883
  react_1.default.createElement(ui_1.DropdownMenuSeparator, null),
663
884
  react_1.default.createElement(ui_1.DropdownMenuSub, null,
664
885
  react_1.default.createElement(ui_1.DropdownMenuSubTrigger, { disabled: readonly },
@@ -671,7 +892,7 @@ var ContextMenu = function (_a) {
671
892
  react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
672
893
  onFilterTableOrFilterView(sheetId, activeCell.rowIndex, activeCell.columnIndex);
673
894
  }, disabled: readonly },
674
- "Cell value \"", (_b = getFormattedValue(sheetId, activeCell.rowIndex, activeCell.columnIndex)) !== null && _b !== void 0 ? _b : config_1.BLANK_LABEL,
895
+ "Cell value \"", (_d = getFormattedValue(sheetId, activeCell.rowIndex, activeCell.columnIndex)) !== null && _d !== void 0 ? _d : config_1.BLANK_LABEL,
675
896
  "\""))),
676
897
  react_1.default.createElement(ui_1.DropdownMenuSub, null,
677
898
  react_1.default.createElement(ui_1.DropdownMenuSubTrigger, { disabled: readonly },
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/floating-cell-editor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGvE,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAU3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAgBrD,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,qBAAqB,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC/C;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,UAAU,EAAE,aAAa,CAAC;IAC1B;;OAEG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAClD;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,oBAAoB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC5C;;;;;OAKG;IACH,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACtC;;OAEG;IACH,kBAAkB,CAAC,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC3D;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;IAC7C;;OAEG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAEnD;;OAEG;IACH,+BAA+B,CAAC,EAAE,eAAe,CAAC,iCAAiC,CAAC,CAAC;IACrF;;OAEG;IACH,6BAA6B,CAAC,EAAE,eAAe,CAAC,+BAA+B,CAAC,CAAC;IACjF;;OAEG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,kBAAkB,mRAkB1B,uBAAuB,uBAgW3B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/floating-cell-editor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGvE,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAU3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAgBrD,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,qBAAqB,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC/C;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,UAAU,EAAE,aAAa,CAAC;IAC1B;;OAEG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAClD;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,oBAAoB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC5C;;;;;OAKG;IACH,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACtC;;OAEG;IACH,kBAAkB,CAAC,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC3D;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;IAC7C;;OAEG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAEnD;;OAEG;IACH,+BAA+B,CAAC,EAAE,eAAe,CAAC,iCAAiC,CAAC,CAAC;IACrF;;OAEG;IACH,6BAA6B,CAAC,EAAE,eAAe,CAAC,+BAA+B,CAAC,CAAC;IACjF;;OAEG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,kBAAkB,mRAkB1B,uBAAuB,uBAwW3B,CAAC"}
@@ -5,6 +5,7 @@ var tslib_1 = require("tslib");
5
5
  var grid_1 = require("@rowsncolumns/grid");
6
6
  var icons_1 = require("@rowsncolumns/icons");
7
7
  var ui_1 = require("@rowsncolumns/ui");
8
+ var utils_1 = require("@rowsncolumns/utils");
8
9
  var use_selection_aware_formatting_1 = require("../../hooks/use-selection-aware-formatting");
9
10
  var react_1 = require("react");
10
11
  var react_2 = tslib_1.__importDefault(require("react"));
@@ -17,7 +18,12 @@ exports.FloatingCellEditor = (0, react_1.memo)(function (_a) {
17
18
  var _b, _c, _d, _e, _f, _g, _h;
18
19
  var initialValue = _a.initialValue, initialTextFormatRuns = _a.initialTextFormatRuns, className = _a.className, activeCell = _a.activeCell, sheetId = _a.sheetId, cellFormat = _a.cellFormat, theme = _a.theme, isDarkMode = _a.isDarkMode, functionDescriptions = _a.functionDescriptions, _j = _a.selections, selections = _j === void 0 ? config_1.DEFAULT_ARRAY : _j, onChange = _a.onChange, onChangeFormattingProp = _a.onChangeFormatting, onInsertRow = _a.onInsertRow, onInsertColumn = _a.onInsertColumn, ColorSelector = _a.ColorSelector, props = tslib_1.__rest(_a, ["initialValue", "initialTextFormatRuns", "className", "activeCell", "sheetId", "cellFormat", "theme", "isDarkMode", "functionDescriptions", "selections", "onChange", "onChangeFormatting", "onInsertRow", "onInsertColumn", "ColorSelector"]);
19
20
  var formulaInputRef = (0, react_1.useRef)(null);
20
- var _k = tslib_1.__read((0, react_1.useState)(initialValue !== null && initialValue !== void 0 ? initialValue : ""), 2), value = _k[0], setValue = _k[1];
21
+ // The stored (canonical) entry is shown and edited in the grid's formula locale; the commit
22
+ // below hands the canonical text back to the host.
23
+ var formulaLocale = (0, atoms_1.useFormulaLocale)();
24
+ var _k = tslib_1.__read((0, react_1.useState)(function () {
25
+ return (0, utils_1.localizeCellInput)(initialValue !== null && initialValue !== void 0 ? initialValue : "", formulaLocale);
26
+ }), 2), value = _k[0], setValue = _k[1];
21
27
  var _l = tslib_1.__read((0, react_1.useState)(initialTextFormatRuns), 2), textFormatRuns = _l[0], setTextFormatRuns = _l[1];
22
28
  var setFormulaMode = (0, atoms_1.useSetFormulaMode)();
23
29
  var formulaMode = (0, atoms_1.useFormulaModeValue)();
@@ -60,15 +66,16 @@ exports.FloatingCellEditor = (0, react_1.memo)(function (_a) {
60
66
  // Set value when not editing, or when editing but not in formula mode
61
67
  if (!isEditing || !formulaMode) {
62
68
  var currentValue = (_a = formulaInputRef.current) === null || _a === void 0 ? void 0 : _a.getValue();
63
- var newValue = initialValue !== null && initialValue !== void 0 ? initialValue : "";
69
+ var newValue = (0, utils_1.localizeCellInput)(initialValue !== null && initialValue !== void 0 ? initialValue : "", formulaLocale);
64
70
  if (currentValue !== newValue && (currentValue || newValue)) {
65
71
  setValue(newValue);
66
72
  }
67
73
  }
68
- }, [initialValue, isEditing, formulaMode]);
74
+ }, [initialValue, isEditing, formulaMode, formulaLocale]);
69
75
  var handleSubmit = (0, react_1.useCallback)(function (value, textFormatRuns) {
70
76
  if (editingCellCoordinate) {
71
- onChange === null || onChange === void 0 ? void 0 : onChange(editingCellCoordinate.sheetId, editingCellCoordinate, value, textFormatRuns, initialValue, initialValue !== value, initialTextFormatRuns);
77
+ var canonicalValue = (0, utils_1.canonicalizeCellInput)(value, formulaLocale);
78
+ onChange === null || onChange === void 0 ? void 0 : onChange(editingCellCoordinate.sheetId, editingCellCoordinate, canonicalValue, textFormatRuns, initialValue, initialValue !== canonicalValue, initialTextFormatRuns);
72
79
  if (!(0, grid_1.isEqualCells)(editingCellCoordinate, activeCell)) {
73
80
  setActiveCell === null || setActiveCell === void 0 ? void 0 : setActiveCell(editingCellCoordinate.sheetId, editingCellCoordinate, false);
74
81
  }
@@ -82,6 +89,7 @@ exports.FloatingCellEditor = (0, react_1.memo)(function (_a) {
82
89
  stopEditing,
83
90
  focusSheet,
84
91
  onChange,
92
+ formulaLocale,
85
93
  ]);
86
94
  var onFocus = (0, react_1.useCallback)(function () {
87
95
  if (!isEditing) {
@@ -103,7 +111,7 @@ exports.FloatingCellEditor = (0, react_1.memo)(function (_a) {
103
111
  lineHeight: "normal",
104
112
  fontSize: "1rem",
105
113
  minHeight: 44,
106
- }, functionDescriptions: functionDescriptions, getMentions: getMentions }, props))),
114
+ }, functionDescriptions: functionDescriptions, getMentions: getMentions, formulaLocale: formulaLocale }, props))),
107
115
  isEditing ? (react_2.default.createElement(react_2.default.Fragment, null,
108
116
  react_2.default.createElement(ui_1.IconButton, { tooltip: "Save", variant: "primary", type: "submit", className: "min-w-8 min-h-8" },
109
117
  react_2.default.createElement(icons_1.CheckIcon, null)),
@@ -0,0 +1,35 @@
1
+ import React from "react";
2
+ import type { DeleteCellsChoice, InsertCellsChoice } from "../../api/multi-selection";
3
+ export type InsertCellsDialogProps = {
4
+ mode: "insert";
5
+ /** Controls visibility. */
6
+ open: boolean;
7
+ onOpenChange(open: boolean): void;
8
+ /** Pre-selected entry — Excel derives it from the selection shape (UI-06). */
9
+ defaultChoice: InsertCellsChoice;
10
+ onApply(choice: InsertCellsChoice): void;
11
+ } | {
12
+ mode: "delete";
13
+ open: boolean;
14
+ onOpenChange(open: boolean): void;
15
+ defaultChoice: DeleteCellsChoice;
16
+ onApply(choice: DeleteCellsChoice): void;
17
+ };
18
+ /**
19
+ * Excel's Insert / Delete cells dialog (right-click a cell → "Insert…" /
20
+ * "Delete…"): Shift cells right|down (left|up for Delete), Entire row, Entire
21
+ * column. UI-only — the opener turns the choice into the matching structural
22
+ * command. Header menus never show it: entire rows / columns insert directly.
23
+ */
24
+ export declare const InsertCellsDialog: React.MemoExoticComponent<(props: InsertCellsDialogProps) => React.JSX.Element>;
25
+ /**
26
+ * Host-mounted, atom-driven wrapper around {@link InsertCellsDialog}. Mount it
27
+ * once in the host alongside the other editor dialogs; the grid opens it from
28
+ * the cell context menu. Remounted per request so each opening starts from the
29
+ * request's default.
30
+ */
31
+ export declare const InsertCellsDialogHost: {
32
+ (): React.JSX.Element | null;
33
+ displayName: string;
34
+ };
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/insert-cells-dialog/index.tsx"],"names":[],"mappings":"AASA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAEtE,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAoBnC,MAAM,MAAM,sBAAsB,GAC9B;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,2BAA2B;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,8EAA8E;IAC9E,aAAa,EAAE,iBAAiB,CAAC;IACjC,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC1C,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,iBAAiB,CAAC;IACjC,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC1C,CAAC;AAEN;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,oCAAgB,sBAAsB,uBA0ElE,CAAC;AAIH;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;;;CAyBjC,CAAC"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InsertCellsDialogHost = exports.InsertCellsDialog = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var ui_1 = require("@rowsncolumns/ui");
6
+ var react_1 = tslib_1.__importStar(require("react"));
7
+ var insert_cells_dialog_atom_1 = require("../../atoms/insert-cells-dialog.atom");
8
+ var INSERT_CHOICES = [
9
+ { value: "shift-right", label: "Shift cells right" },
10
+ { value: "shift-down", label: "Shift cells down" },
11
+ { value: "entire-row", label: "Entire row" },
12
+ { value: "entire-column", label: "Entire column" },
13
+ ];
14
+ var DELETE_CHOICES = [
15
+ { value: "shift-left", label: "Shift cells left" },
16
+ { value: "shift-up", label: "Shift cells up" },
17
+ { value: "entire-row", label: "Entire row" },
18
+ { value: "entire-column", label: "Entire column" },
19
+ ];
20
+ /**
21
+ * Excel's Insert / Delete cells dialog (right-click a cell → "Insert…" /
22
+ * "Delete…"): Shift cells right|down (left|up for Delete), Entire row, Entire
23
+ * column. UI-only — the opener turns the choice into the matching structural
24
+ * command. Header menus never show it: entire rows / columns insert directly.
25
+ */
26
+ exports.InsertCellsDialog = (0, react_1.memo)(function (props) {
27
+ var mode = props.mode, open = props.open, onOpenChange = props.onOpenChange, defaultChoice = props.defaultChoice;
28
+ var _a = tslib_1.__read((0, react_1.useState)(defaultChoice), 2), choice = _a[0], setChoice = _a[1];
29
+ // Re-seed on every open (the request decides the default).
30
+ (0, react_1.useEffect)(function () {
31
+ if (open)
32
+ setChoice(defaultChoice);
33
+ }, [open, defaultChoice]);
34
+ var commit = (0, react_1.useCallback)(function () {
35
+ if (props.mode === "insert") {
36
+ props.onApply(choice);
37
+ }
38
+ else {
39
+ props.onApply(choice);
40
+ }
41
+ onOpenChange(false);
42
+ }, [props, choice, onOpenChange]);
43
+ var title = mode === "insert" ? "Insert" : "Delete";
44
+ var choices = mode === "insert" ? INSERT_CHOICES : DELETE_CHOICES;
45
+ return (react_1.default.createElement(ui_1.Dialog, { open: open, onOpenChange: onOpenChange, modal: true },
46
+ react_1.default.createElement(ui_1.DialogContent, { className: "w-[300px] max-w-[92vw] pointer-events-auto" },
47
+ react_1.default.createElement(ui_1.DialogTitle, null, title),
48
+ react_1.default.createElement(ui_1.DialogCloseButton, null),
49
+ react_1.default.createElement(ui_1.DialogBody, { className: "flex flex-col gap-4" },
50
+ react_1.default.createElement("form", { className: "flex flex-col gap-4", onSubmit: function (e) {
51
+ e.preventDefault();
52
+ commit();
53
+ } },
54
+ react_1.default.createElement("fieldset", { className: "flex flex-col gap-1 min-w-0 border-0 p-0 m-0" },
55
+ react_1.default.createElement("legend", { className: "text-xs font-medium mb-1" }, title),
56
+ choices.map(function (entry) { return (react_1.default.createElement("label", { key: entry.value, className: "flex items-center gap-2 text-xs py-0.5 cursor-pointer" },
57
+ react_1.default.createElement("input", { type: "radio", name: "".concat(mode, "-cells-choice"), value: entry.value, checked: choice === entry.value, onChange: function () { return setChoice(entry.value); } }),
58
+ entry.label)); })),
59
+ react_1.default.createElement(ui_1.Separator, null),
60
+ react_1.default.createElement("div", { className: "flex justify-end gap-2" },
61
+ react_1.default.createElement(ui_1.Button, { type: "button", variant: "outline", size: "sm", onClick: function () { return onOpenChange(false); } }, "Cancel"),
62
+ react_1.default.createElement(ui_1.Button, { type: "submit", size: "sm", autoFocus: true }, "OK")))))));
63
+ });
64
+ exports.InsertCellsDialog.displayName = "InsertCellsDialog";
65
+ /**
66
+ * Host-mounted, atom-driven wrapper around {@link InsertCellsDialog}. Mount it
67
+ * once in the host alongside the other editor dialogs; the grid opens it from
68
+ * the cell context menu. Remounted per request so each opening starts from the
69
+ * request's default.
70
+ */
71
+ var InsertCellsDialogHost = function () {
72
+ (0, insert_cells_dialog_atom_1.useRegisterInsertCellsDialogHost)();
73
+ var _a = tslib_1.__read((0, insert_cells_dialog_atom_1.useInsertCellsDialogState)(), 2), request = _a[0], setRequest = _a[1];
74
+ var close = (0, react_1.useCallback)(function () { return setRequest(null); }, [setRequest]);
75
+ if (!request)
76
+ return null;
77
+ var onOpenChange = function (open) {
78
+ if (!open)
79
+ close();
80
+ };
81
+ return request.mode === "insert" ? (react_1.default.createElement(exports.InsertCellsDialog, { mode: "insert", open: true, onOpenChange: onOpenChange, defaultChoice: request.defaultChoice, onApply: request.onApply })) : (react_1.default.createElement(exports.InsertCellsDialog, { mode: "delete", open: true, onOpenChange: onOpenChange, defaultChoice: request.defaultChoice, onApply: request.onApply }));
82
+ };
83
+ exports.InsertCellsDialogHost = InsertCellsDialogHost;
84
+ exports.InsertCellsDialogHost.displayName = "InsertCellsDialogHost";
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ import type { InsertFormatOption, InsertOptionsAxis } from "../../api/insert-options";
3
+ export type InsertOptionsSmartTagProps = {
4
+ /** Position/size of the selection the tag is anchored to (bottom-left). */
5
+ x: number;
6
+ y: number;
7
+ width: number;
8
+ height: number;
9
+ axis: InsertOptionsAxis;
10
+ /** The entry currently applied to the inserted band. */
11
+ option: InsertFormatOption;
12
+ onChooseOption(option: InsertFormatOption): void;
13
+ };
14
+ /**
15
+ * Excel's Insert Options smart tag: the small paintbrush button that appears at
16
+ * the inserted rows / columns right after an insert and offers "Format Same As
17
+ * Above / Below / Clear Formatting" (Left / Right for columns). The insert
18
+ * already applied "Same As Above / Left"; picking another entry re-formats the
19
+ * band. Same skin as the Auto Fill Options tag.
20
+ */
21
+ export declare const InsertOptionsSmartTag: {
22
+ ({ x, y, width: _width, height, axis, option, onChooseOption, }: InsertOptionsSmartTagProps): React.JSX.Element;
23
+ displayName: string;
24
+ };
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/insert-options-smart-tag/index.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,0BAA0B,GAAG;IACvC,2EAA2E;IAC3E,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,iBAAiB,CAAC;IACxB,wDAAwD;IACxD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAClD,CAAC;AAgBF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB;qEAQ/B,0BAA0B;;CA0C5B,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InsertOptionsSmartTag = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var icons_1 = require("@rowsncolumns/icons");
6
+ var ui_1 = require("@rowsncolumns/ui");
7
+ var react_1 = tslib_1.__importStar(require("react"));
8
+ var ROW_ENTRIES = [
9
+ { option: "before", label: "Format Same As Above" },
10
+ { option: "after", label: "Format Same As Below" },
11
+ { option: "clear", label: "Clear Formatting" },
12
+ ];
13
+ var COLUMN_ENTRIES = [
14
+ { option: "before", label: "Format Same As Left" },
15
+ { option: "after", label: "Format Same As Right" },
16
+ { option: "clear", label: "Clear Formatting" },
17
+ ];
18
+ /**
19
+ * Excel's Insert Options smart tag: the small paintbrush button that appears at
20
+ * the inserted rows / columns right after an insert and offers "Format Same As
21
+ * Above / Below / Clear Formatting" (Left / Right for columns). The insert
22
+ * already applied "Same As Above / Left"; picking another entry re-formats the
23
+ * band. Same skin as the Auto Fill Options tag.
24
+ */
25
+ var InsertOptionsSmartTag = function (_a) {
26
+ var x = _a.x, y = _a.y, _width = _a.width, height = _a.height, axis = _a.axis, option = _a.option, onChooseOption = _a.onChooseOption;
27
+ var _b = tslib_1.__read((0, react_1.useState)(false), 2), open = _b[0], setOpen = _b[1];
28
+ var entries = axis === "row" ? ROW_ENTRIES : COLUMN_ENTRIES;
29
+ return (react_1.default.createElement("div", { className: "absolute pointer-events-auto flex items-start justify-start", style: { left: x, top: y + height }, onMouseDown: function (e) { return e.stopPropagation(); }, "data-testid": "insert-options" },
30
+ react_1.default.createElement(ui_1.DropdownMenu, { modal: false, open: open, onOpenChange: setOpen },
31
+ react_1.default.createElement(ui_1.DropdownMenuTrigger, { asChild: true },
32
+ react_1.default.createElement(ui_1.IconButton, { tooltip: "Insert Options", "aria-label": "Insert Options", className: "shadow-sm bg-rnc-background border-rnc-border border border-solid rounded-md" },
33
+ react_1.default.createElement(icons_1.PaintBrush, null))),
34
+ react_1.default.createElement(ui_1.DropdownMenuPortal, null,
35
+ react_1.default.createElement(ui_1.DropdownMenuContent, { align: "start", onCloseAutoFocus: function (event) { return event.preventDefault(); } }, entries.map(function (entry) { return (react_1.default.createElement(ui_1.DropdownMenuCheckboxItem, { key: entry.option, checked: option === entry.option, onSelect: function () { return onChooseOption(entry.option); } },
36
+ react_1.default.createElement(ui_1.DropdownMenuItemIndicator, null,
37
+ react_1.default.createElement(icons_1.CheckIcon, null)),
38
+ entry.label)); }))))));
39
+ };
40
+ exports.InsertOptionsSmartTag = InsertOptionsSmartTag;
41
+ exports.InsertOptionsSmartTag.displayName = "InsertOptionsSmartTag";
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ /**
3
+ * Excel's drag-move overwrite prompt ("There's already data here. Do you want to
4
+ * replace it?"). Mount once next to the grid; while mounted, a plain drag-move
5
+ * onto non-empty cells waits for OK / Cancel here instead of `window.confirm`.
6
+ */
7
+ export declare const MoveOverwriteConfirmDialogHost: React.MemoExoticComponent<() => React.JSX.Element>;
8
+ //# sourceMappingURL=index.d.ts.map