@rowsncolumns/spreadsheet-state 28.0.72 → 28.0.74
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/advanced-filter.d.ts +72 -0
- package/dist/cjs/api/advanced-filter.d.ts.map +1 -0
- package/dist/cjs/api/advanced-filter.js +0 -0
- package/dist/cjs/api/goal-seek.d.ts +29 -0
- package/dist/cjs/api/goal-seek.d.ts.map +1 -0
- package/dist/cjs/api/goal-seek.js +131 -0
- package/dist/cjs/api/immer-utils.d.ts.map +1 -1
- package/dist/cjs/api/immer-utils.js +2 -0
- package/dist/cjs/api/paint-format.d.ts +41 -0
- package/dist/cjs/api/paint-format.d.ts.map +1 -0
- package/dist/cjs/api/paint-format.js +115 -0
- package/dist/cjs/api/paste-special.d.ts +48 -0
- package/dist/cjs/api/paste-special.d.ts.map +1 -0
- package/dist/cjs/api/paste-special.js +229 -0
- package/dist/cjs/api/split-text.d.ts +12 -0
- package/dist/cjs/api/split-text.d.ts.map +1 -1
- package/dist/cjs/api/split-text.js +41 -0
- package/dist/cjs/api/subtotal.d.ts +85 -0
- package/dist/cjs/api/subtotal.d.ts.map +1 -0
- package/dist/cjs/api/subtotal.js +250 -0
- package/dist/cjs/commands.d.ts +13 -0
- package/dist/cjs/commands.d.ts.map +1 -1
- package/dist/cjs/components/editors/data-validation-rule-editor.d.ts.map +1 -1
- package/dist/cjs/components/editors/data-validation-rule-editor.js +83 -16
- package/dist/cjs/components/editors/table-editor.js +7 -2
- package/dist/cjs/hooks/use-calculation-worker.d.ts.map +1 -1
- package/dist/cjs/hooks/use-calculation-worker.js +39 -8
- package/dist/cjs/hooks/use-calculation.d.ts +12 -2
- package/dist/cjs/hooks/use-calculation.d.ts.map +1 -1
- package/dist/cjs/hooks/use-calculation.js +71 -35
- package/dist/cjs/hooks/use-on-advanced-filter.d.ts +21 -0
- package/dist/cjs/hooks/use-on-advanced-filter.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-advanced-filter.js +42 -0
- package/dist/cjs/hooks/use-on-goal-seek.d.ts +30 -0
- package/dist/cjs/hooks/use-on-goal-seek.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-goal-seek.js +140 -0
- package/dist/cjs/hooks/use-on-import-excel.d.ts +10 -1
- package/dist/cjs/hooks/use-on-import-excel.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-import-excel.js +8 -4
- package/dist/cjs/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-merge-unmerge-cells.js +53 -34
- package/dist/cjs/hooks/use-on-paste.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-paste.js +82 -52
- package/dist/cjs/hooks/use-on-remove-duplicates.d.ts +2 -1
- package/dist/cjs/hooks/use-on-remove-duplicates.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-remove-duplicates.js +5 -3
- package/dist/cjs/hooks/use-on-show-column.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-show-column.js +2 -0
- package/dist/cjs/hooks/use-on-show-row.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-show-row.js +2 -0
- package/dist/cjs/hooks/use-on-subtotal.d.ts +26 -0
- package/dist/cjs/hooks/use-on-subtotal.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-subtotal.js +53 -0
- package/dist/cjs/hooks/use-paint-format.d.ts +19 -3
- package/dist/cjs/hooks/use-paint-format.d.ts.map +1 -1
- package/dist/cjs/hooks/use-paint-format.js +85 -31
- package/dist/cjs/hooks/use-sheet-properties.d.ts +3 -0
- package/dist/cjs/hooks/use-sheet-properties.d.ts.map +1 -1
- package/dist/cjs/hooks/use-sheet-properties.js +8 -0
- package/dist/cjs/hooks/use-split-text-to-columns.d.ts +2 -1
- package/dist/cjs/hooks/use-split-text-to-columns.d.ts.map +1 -1
- package/dist/cjs/hooks/use-split-text-to-columns.js +3 -2
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts +50 -36
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/cjs/hooks/use-spreadsheet-state.js +98 -18
- package/dist/cjs/index.d.ts +9 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +9 -0
- package/dist/cjs/interface/calculation-interface.d.ts.map +1 -1
- package/dist/cjs/interface/calculation-interface.js +5 -0
- package/dist/cjs/interface/change-batch-stream.d.ts.map +1 -1
- package/dist/cjs/interface/change-batch-stream.js +12 -6
- package/dist/cjs/interface/change-batch.d.ts.map +1 -1
- package/dist/cjs/interface/change-batch.js +17 -9
- package/dist/cjs/interface/change-formatting.d.ts.map +1 -1
- package/dist/cjs/interface/change-formatting.js +30 -11
- package/dist/cjs/interface/hide-column.d.ts.map +1 -1
- package/dist/cjs/interface/hide-column.js +4 -0
- package/dist/cjs/interface/hide-row.d.ts.map +1 -1
- package/dist/cjs/interface/hide-row.js +4 -0
- package/dist/cjs/interface/remove-duplicates.d.ts +3 -2
- package/dist/cjs/interface/remove-duplicates.d.ts.map +1 -1
- package/dist/cjs/interface/remove-duplicates.js +41 -7
- package/dist/cjs/interface/split-text.d.ts +2 -1
- package/dist/cjs/interface/split-text.d.ts.map +1 -1
- package/dist/cjs/interface/split-text.js +7 -3
- package/dist/cjs/interface/spreadsheet-interface.d.ts +2 -1
- package/dist/cjs/interface/spreadsheet-interface.d.ts.map +1 -1
- package/dist/cjs/interface/spreadsheet-interface.js +5 -5
- package/dist/cjs/sheet-cell.d.ts.map +1 -1
- package/dist/cjs/sheet-cell.js +7 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/api/advanced-filter.d.ts +72 -0
- package/dist/esm/api/advanced-filter.d.ts.map +1 -0
- package/dist/esm/api/advanced-filter.js +0 -0
- package/dist/esm/api/goal-seek.d.ts +29 -0
- package/dist/esm/api/goal-seek.d.ts.map +1 -0
- package/dist/esm/api/goal-seek.js +108 -0
- package/dist/esm/api/immer-utils.d.ts.map +1 -1
- package/dist/esm/api/immer-utils.js +2 -0
- package/dist/esm/api/paint-format.d.ts +41 -0
- package/dist/esm/api/paint-format.d.ts.map +1 -0
- package/dist/esm/api/paint-format.js +77 -0
- package/dist/esm/api/paste-special.d.ts +48 -0
- package/dist/esm/api/paste-special.d.ts.map +1 -0
- package/dist/esm/api/paste-special.js +220 -0
- package/dist/esm/api/split-text.d.ts +12 -0
- package/dist/esm/api/split-text.d.ts.map +1 -1
- package/dist/esm/api/split-text.js +28 -0
- package/dist/esm/api/subtotal.d.ts +85 -0
- package/dist/esm/api/subtotal.d.ts.map +1 -0
- package/dist/esm/api/subtotal.js +181 -0
- package/dist/esm/commands.d.ts +13 -0
- package/dist/esm/commands.d.ts.map +1 -1
- package/dist/esm/components/editors/data-validation-rule-editor.d.ts.map +1 -1
- package/dist/esm/components/editors/data-validation-rule-editor.js +52 -4
- package/dist/esm/components/editors/table-editor.js +7 -4
- package/dist/esm/hooks/use-calculation-worker.d.ts.map +1 -1
- package/dist/esm/hooks/use-calculation-worker.js +20 -2
- package/dist/esm/hooks/use-calculation.d.ts +12 -2
- package/dist/esm/hooks/use-calculation.d.ts.map +1 -1
- package/dist/esm/hooks/use-calculation.js +38 -7
- package/dist/esm/hooks/use-on-advanced-filter.d.ts +21 -0
- package/dist/esm/hooks/use-on-advanced-filter.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-advanced-filter.js +41 -0
- package/dist/esm/hooks/use-on-goal-seek.d.ts +30 -0
- package/dist/esm/hooks/use-on-goal-seek.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-goal-seek.js +82 -0
- package/dist/esm/hooks/use-on-import-excel.d.ts +10 -1
- package/dist/esm/hooks/use-on-import-excel.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-import-excel.js +8 -4
- package/dist/esm/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-merge-unmerge-cells.js +13 -13
- package/dist/esm/hooks/use-on-paste.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-paste.js +49 -14
- package/dist/esm/hooks/use-on-remove-duplicates.d.ts +2 -1
- package/dist/esm/hooks/use-on-remove-duplicates.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-remove-duplicates.js +5 -3
- package/dist/esm/hooks/use-on-show-column.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-show-column.js +2 -0
- package/dist/esm/hooks/use-on-show-row.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-show-row.js +2 -0
- package/dist/esm/hooks/use-on-subtotal.d.ts +26 -0
- package/dist/esm/hooks/use-on-subtotal.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-subtotal.js +48 -0
- package/dist/esm/hooks/use-paint-format.d.ts +19 -3
- package/dist/esm/hooks/use-paint-format.d.ts.map +1 -1
- package/dist/esm/hooks/use-paint-format.js +71 -29
- package/dist/esm/hooks/use-sheet-properties.d.ts +3 -0
- package/dist/esm/hooks/use-sheet-properties.d.ts.map +1 -1
- package/dist/esm/hooks/use-sheet-properties.js +8 -0
- package/dist/esm/hooks/use-split-text-to-columns.d.ts +2 -1
- package/dist/esm/hooks/use-split-text-to-columns.d.ts.map +1 -1
- package/dist/esm/hooks/use-split-text-to-columns.js +3 -2
- package/dist/esm/hooks/use-spreadsheet-state.d.ts +50 -36
- package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/esm/hooks/use-spreadsheet-state.js +89 -16
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +9 -0
- package/dist/esm/interface/calculation-interface.d.ts.map +1 -1
- package/dist/esm/interface/calculation-interface.js +3 -0
- package/dist/esm/interface/change-batch-stream.d.ts.map +1 -1
- package/dist/esm/interface/change-batch-stream.js +12 -6
- package/dist/esm/interface/change-batch.d.ts.map +1 -1
- package/dist/esm/interface/change-batch.js +15 -9
- package/dist/esm/interface/change-formatting.d.ts.map +1 -1
- package/dist/esm/interface/change-formatting.js +28 -11
- package/dist/esm/interface/hide-column.d.ts.map +1 -1
- package/dist/esm/interface/hide-column.js +4 -0
- package/dist/esm/interface/hide-row.d.ts.map +1 -1
- package/dist/esm/interface/hide-row.js +4 -0
- package/dist/esm/interface/remove-duplicates.d.ts +3 -2
- package/dist/esm/interface/remove-duplicates.d.ts.map +1 -1
- package/dist/esm/interface/remove-duplicates.js +37 -6
- package/dist/esm/interface/split-text.d.ts +2 -1
- package/dist/esm/interface/split-text.d.ts.map +1 -1
- package/dist/esm/interface/split-text.js +6 -3
- package/dist/esm/interface/spreadsheet-interface.d.ts +2 -1
- package/dist/esm/interface/spreadsheet-interface.d.ts.map +1 -1
- package/dist/esm/interface/spreadsheet-interface.js +5 -5
- package/dist/esm/sheet-cell.d.ts.map +1 -1
- package/dist/esm/sheet-cell.js +7 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +18 -18
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useCallback } from "react";
|
|
2
|
-
import { removeDuplicates } from "../interface/remove-duplicates";
|
|
2
|
+
import { removeDuplicates, } from "../interface/remove-duplicates";
|
|
3
3
|
import { useCanEditCellRange } from "./use-can-edit-cellrange";
|
|
4
4
|
export const useOnRemoveDuplicates = ({ locale, cellXfsRegistry, sharedStringRegistry, getFormattedValue, onChangeSheetData, enqueueCalculation, createHistory, onCommand, }) => {
|
|
5
5
|
const canEditCellRange = useCanEditCellRange();
|
|
6
|
-
return useCallback((sheetId, activeCell, selections) => {
|
|
6
|
+
return useCallback((sheetId, activeCell, selections, options) => {
|
|
7
7
|
if (!canEditCellRange(sheetId, activeCell)) {
|
|
8
8
|
console.debug("This range is protected, users cannot edit this cell range.");
|
|
9
9
|
return;
|
|
@@ -16,13 +16,15 @@ export const useOnRemoveDuplicates = ({ locale, cellXfsRegistry, sharedStringReg
|
|
|
16
16
|
onChangeSheetData,
|
|
17
17
|
enqueueCalculation,
|
|
18
18
|
createHistory,
|
|
19
|
-
})(sheetId, activeCell, selections);
|
|
19
|
+
})(sheetId, activeCell, selections, options);
|
|
20
20
|
// Stream the semantic command so an engine consumer recomputes from the deduped cells.
|
|
21
21
|
onCommand?.({
|
|
22
22
|
command: "remove-duplicates",
|
|
23
23
|
sheetId,
|
|
24
24
|
activeCell,
|
|
25
25
|
selections: selections ?? [],
|
|
26
|
+
columnIndices: options?.columnIndices,
|
|
27
|
+
hasHeader: options?.hasHeader,
|
|
26
28
|
});
|
|
27
29
|
return result;
|
|
28
30
|
}, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-on-show-column.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-show-column.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,EACV,QAAQ,EAER,mBAAmB,EACnB,KAAK,EACN,MAAM,2BAA2B,CAAC;AAMnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,KAAK,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC/D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/D,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,GAC/C,IAAI,CAAC;IACR,aAAa,IAAI,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,iGAOlE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,eAMf,MAAM,iBAAiB,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"use-on-show-column.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-show-column.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,EACV,QAAQ,EAER,mBAAmB,EACnB,KAAK,EACN,MAAM,2BAA2B,CAAC;AAMnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,KAAK,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC/D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/D,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,GAC/C,IAAI,CAAC;IACR,aAAa,IAAI,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,iGAOlE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,eAMf,MAAM,iBAAiB,MAAM,EAAE,SAyF5C,CAAC"}
|
|
@@ -21,6 +21,8 @@ export const useOnShowColumn = ({ createHistory, onChangeActiveCell, onChangeSel
|
|
|
21
21
|
});
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
|
+
if (columnIndexes.length === 0)
|
|
25
|
+
return;
|
|
24
26
|
const saveHistory = createHistory();
|
|
25
27
|
const firstColumnIndex = columnIndexes[0];
|
|
26
28
|
const newActiveCell = getNextFocusableCell?.(sheetId, { rowIndex: 0, columnIndex: firstColumnIndex }, Direction.Down, false) ?? { rowIndex: 1, columnIndex: firstColumnIndex };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-on-show-row.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-show-row.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,EACV,QAAQ,EAER,mBAAmB,EACnB,KAAK,EACN,MAAM,2BAA2B,CAAC;AASnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,KAAK,iBAAiB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC5D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/D,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,GAC/C,IAAI,CAAC;IACR,aAAa,IAAI,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,2HAQ/D,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,eAMZ,MAAM,cAAc,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"use-on-show-row.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-show-row.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,EACV,QAAQ,EAER,mBAAmB,EACnB,KAAK,EACN,MAAM,2BAA2B,CAAC;AASnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,KAAK,iBAAiB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC5D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/D,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,GAC/C,IAAI,CAAC;IACR,aAAa,IAAI,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,2HAQ/D,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,eAMZ,MAAM,cAAc,MAAM,EAAE,SA6FzC,CAAC"}
|
|
@@ -21,6 +21,8 @@ export const useOnShowRow = ({ createHistory, onChangeActiveCell, onChangeSelect
|
|
|
21
21
|
});
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
|
+
if (rowIndexes.length === 0)
|
|
25
|
+
return;
|
|
24
26
|
const saveHistory = createHistory();
|
|
25
27
|
const firstRowIndex = rowIndexes[0];
|
|
26
28
|
const newActiveCell = getNextFocusableCell?.(sheetId, { rowIndex: firstRowIndex, columnIndex: 0 }, Direction.Right, false) ?? { rowIndex: firstRowIndex, columnIndex: 1 };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { GridRange } from "@rowsncolumns/common-types";
|
|
2
|
+
import { type SubtotalOptions, type SubtotalPlan, type SubtotalPlanExecutor } from "../api/subtotal";
|
|
3
|
+
import type { useSheetProperties } from "./use-sheet-properties";
|
|
4
|
+
export type { SubtotalOptions, SubtotalPlan };
|
|
5
|
+
export type UseOnSubtotalProps = {
|
|
6
|
+
getEffectiveValue: ReturnType<typeof useSheetProperties>["getEffectiveValue"];
|
|
7
|
+
getFormattedValue: ReturnType<typeof useSheetProperties>["getFormattedValue"];
|
|
8
|
+
getFormulaValue: ReturnType<typeof useSheetProperties>["getFormulaValue"];
|
|
9
|
+
getRowOutlineLevel: ReturnType<typeof useSheetProperties>["getRowOutlineLevel"];
|
|
10
|
+
onDeleteRow: SubtotalPlanExecutor["onDeleteRow"];
|
|
11
|
+
onInsertRow: SubtotalPlanExecutor["onInsertRow"];
|
|
12
|
+
onChangeBatch: (sheetId: number, ranges: GridRange, values: (string | null)[][]) => void;
|
|
13
|
+
onGroupRows: SubtotalPlanExecutor["onGroupRows"];
|
|
14
|
+
onUngroupRows: SubtotalPlanExecutor["onUngroupRows"];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Excel's Data → Outline → Subtotal, composed over the existing row
|
|
18
|
+
* insert / batch write / row grouping callbacks so both engines execute it
|
|
19
|
+
* through the same streamed commands (see `planSubtotals` for the layout).
|
|
20
|
+
* Groups on the DISPLAYED value of the group column (Excel compares what the
|
|
21
|
+
* cells show). "Replace current subtotals" also resets the range's outline
|
|
22
|
+
* before regrouping, so re-applying keeps Excel's three levels. Returns the
|
|
23
|
+
* applied plan, or `undefined` when the range is protected or has no data rows.
|
|
24
|
+
*/
|
|
25
|
+
export declare const useOnSubtotal: ({ getEffectiveValue, getFormattedValue, getFormulaValue, getRowOutlineLevel, onDeleteRow, onInsertRow, onChangeBatch, onGroupRows, onUngroupRows, }: UseOnSubtotalProps) => (sheetId: number, options: SubtotalOptions) => SubtotalPlan | undefined;
|
|
26
|
+
//# sourceMappingURL=use-on-subtotal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-on-subtotal.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-subtotal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;AAE9C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC9E,iBAAiB,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC9E,eAAe,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC1E,kBAAkB,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAChF,WAAW,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACjD,WAAW,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACjD,aAAa,EAAE,CACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,KACxB,IAAI,CAAC;IACV,WAAW,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACjD,aAAa,EAAE,oBAAoB,CAAC,eAAe,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAI,qJAU3B,kBAAkB,eAIP,MAAM,WAAW,eAAe,KAAG,YAAY,GAAG,SAoC/D,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import { applySubtotalPlan, planSubtotals, } from "../api/subtotal";
|
|
3
|
+
import { useCanEditCellRange } from "./use-can-edit-cellrange";
|
|
4
|
+
/**
|
|
5
|
+
* Excel's Data → Outline → Subtotal, composed over the existing row
|
|
6
|
+
* insert / batch write / row grouping callbacks so both engines execute it
|
|
7
|
+
* through the same streamed commands (see `planSubtotals` for the layout).
|
|
8
|
+
* Groups on the DISPLAYED value of the group column (Excel compares what the
|
|
9
|
+
* cells show). "Replace current subtotals" also resets the range's outline
|
|
10
|
+
* before regrouping, so re-applying keeps Excel's three levels. Returns the
|
|
11
|
+
* applied plan, or `undefined` when the range is protected or has no data rows.
|
|
12
|
+
*/
|
|
13
|
+
export const useOnSubtotal = ({ getEffectiveValue, getFormattedValue, getFormulaValue, getRowOutlineLevel, onDeleteRow, onInsertRow, onChangeBatch, onGroupRows, onUngroupRows, }) => {
|
|
14
|
+
const canEditCellRange = useCanEditCellRange();
|
|
15
|
+
return useCallback((sheetId, options) => {
|
|
16
|
+
if (!canEditCellRange(sheetId, options.range)) {
|
|
17
|
+
console.debug("This range is protected, users cannot edit this cell range.");
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const plan = planSubtotals(options, {
|
|
21
|
+
getValue: (rowIndex, columnIndex) => getFormattedValue(sheetId, rowIndex, columnIndex) ??
|
|
22
|
+
getEffectiveValue(sheetId, rowIndex, columnIndex),
|
|
23
|
+
getFormula: (rowIndex, columnIndex) => getFormulaValue(sheetId, rowIndex, columnIndex),
|
|
24
|
+
getOutlineLevel: (rowIndex) => getRowOutlineLevel(sheetId, rowIndex),
|
|
25
|
+
});
|
|
26
|
+
if (!plan)
|
|
27
|
+
return undefined;
|
|
28
|
+
applySubtotalPlan(sheetId, plan, {
|
|
29
|
+
onDeleteRow,
|
|
30
|
+
onInsertRow,
|
|
31
|
+
onChangeBatch,
|
|
32
|
+
onGroupRows,
|
|
33
|
+
onUngroupRows,
|
|
34
|
+
});
|
|
35
|
+
return plan;
|
|
36
|
+
}, [
|
|
37
|
+
canEditCellRange,
|
|
38
|
+
getEffectiveValue,
|
|
39
|
+
getFormattedValue,
|
|
40
|
+
getFormulaValue,
|
|
41
|
+
getRowOutlineLevel,
|
|
42
|
+
onDeleteRow,
|
|
43
|
+
onInsertRow,
|
|
44
|
+
onChangeBatch,
|
|
45
|
+
onGroupRows,
|
|
46
|
+
onUngroupRows,
|
|
47
|
+
]);
|
|
48
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { CellInterface, SelectionArea } from "@rowsncolumns/common-types";
|
|
2
|
-
import type { SelectionAttributes, SheetRange } from "@rowsncolumns/spreadsheet";
|
|
1
|
+
import type { CellInterface, GridRange, SelectionArea } from "@rowsncolumns/common-types";
|
|
2
|
+
import type { CellFormat, SelectionAttributes, SheetRange } from "@rowsncolumns/spreadsheet";
|
|
3
3
|
import type { useOnChangeFormatting } from "./use-on-change-formatting";
|
|
4
4
|
import type { useSheetProperties } from "./use-sheet-properties";
|
|
5
5
|
import type { useSheetState } from "./use-sheet-state";
|
|
@@ -7,8 +7,24 @@ export type UsePaintFormatProps = {
|
|
|
7
7
|
onChangeSelections: ReturnType<typeof useSheetState>["onChangeSelections"];
|
|
8
8
|
onChangeFormatting: ReturnType<typeof useOnChangeFormatting>["onChangeFormatting"];
|
|
9
9
|
getEffectiveFormat: ReturnType<typeof useSheetProperties>["getEffectiveFormat"];
|
|
10
|
+
/**
|
|
11
|
+
* The merges of a sheet (absolute ranges). When provided, the painter carries the merges that
|
|
12
|
+
* lie fully inside the source block and tiles them onto the target (Sheets / Excel parity).
|
|
13
|
+
*/
|
|
14
|
+
getMerges?: (sheetId: number) => GridRange[] | null | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Replace the merges inside `targetRange` with `merges` (already tiled, absolute). The
|
|
17
|
+
* spreadsheet-state wiring unmerges the target then merges each range in one step.
|
|
18
|
+
*/
|
|
19
|
+
onPaintMerges?: (sheetId: number, activeCell: CellInterface, targetRange: GridRange, merges: GridRange[]) => void;
|
|
20
|
+
/**
|
|
21
|
+
* The table-banding / alternating-colour formats the grid paints on a sheet (keyed by
|
|
22
|
+
* `cellIdentifier`). When provided, the captured pattern carries the visible stripe colours as
|
|
23
|
+
* static fills, like Sheets.
|
|
24
|
+
*/
|
|
25
|
+
getBandedCells?: (sheetId: number) => Map<string, CellFormat> | undefined;
|
|
10
26
|
};
|
|
11
|
-
export declare const usePaintFormat: ({ getEffectiveFormat, onChangeFormatting, onChangeSelections, }: UsePaintFormatProps) => {
|
|
27
|
+
export declare const usePaintFormat: ({ getEffectiveFormat, onChangeFormatting, onChangeSelections, getMerges, onPaintMerges, getBandedCells, }: UsePaintFormatProps) => {
|
|
12
28
|
isPaintFormatActive: boolean;
|
|
13
29
|
onSavePaintFormat: (sheetId: number, activeCell: CellInterface, selections: SelectionArea<SelectionAttributes>[]) => void;
|
|
14
30
|
onApplyPaintFormat: (sheetId: number, activeCell: CellInterface, selections?: SelectionArea<SelectionAttributes>[]) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-paint-format.d.ts","sourceRoot":"","sources":["../../../hooks/use-paint-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"use-paint-format.d.ts","sourceRoot":"","sources":["../../../hooks/use-paint-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EACd,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EACnB,UAAU,EACX,MAAM,2BAA2B,CAAC;AAUnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAAG;IAChC,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC3E,kBAAkB,EAAE,UAAU,CAC5B,OAAO,qBAAqB,CAC7B,CAAC,oBAAoB,CAAC,CAAC;IACxB,kBAAkB,EAAE,UAAU,CAC5B,OAAO,kBAAkB,CAC1B,CAAC,oBAAoB,CAAC,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE;;;OAGG;IACH,aAAa,CAAC,EAAE,CACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,EACzB,WAAW,EAAE,SAAS,EACtB,MAAM,EAAE,SAAS,EAAE,KAChB,IAAI,CAAC;IACV;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC;CAC3E,CAAC;AAaF,eAAO,MAAM,cAAc,GAAI,2GAO5B,mBAAmB;;iCA4EP,MAAM,cACH,aAAa,cACb,aAAa,CAAC,mBAAmB,CAAC,EAAE;kCAkBvC,MAAM,cACH,aAAa,eACZ,aAAa,CAAC,mBAAmB,CAAC,EAAE;oCAkF/B,UAAU,oBAIV,UAAU;CAmCjC,CAAC"}
|
|
@@ -1,26 +1,64 @@
|
|
|
1
1
|
import { selectionFromActiveCell } from "@rowsncolumns/grid";
|
|
2
2
|
import { useCallback, useState } from "react";
|
|
3
|
+
import { collectPaintMerges, getBandedCellFormat, layerBandedFormat, tilePaintMerges, } from "../api/paint-format";
|
|
3
4
|
// A paint-format target spanning at least this many rows/cols is a header-click
|
|
4
5
|
// full-column/row selection, not an intentional drag — bound it to the pattern.
|
|
5
6
|
const UNBOUNDED_PAINT_SPAN = 10_000;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
const EMPTY_PATTERN = {
|
|
8
|
+
formats: [],
|
|
9
|
+
merges: [],
|
|
10
|
+
rows: 0,
|
|
11
|
+
cols: 0,
|
|
12
|
+
};
|
|
13
|
+
export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChangeSelections, getMerges, onPaintMerges, getBandedCells, }) => {
|
|
14
|
+
const [pattern, setPattern] = useState(EMPTY_PATTERN);
|
|
15
|
+
const paintFormats = pattern.formats;
|
|
16
|
+
/**
|
|
17
|
+
* Capture the visible look of `range`: the effective format of every cell layered over the
|
|
18
|
+
* table stripe the grid paints beneath it, plus the merges fully inside the range.
|
|
19
|
+
*/
|
|
20
|
+
const capturePattern = useCallback((sheetId, ranges) => {
|
|
21
|
+
const bandedCells = getBandedCells?.(sheetId);
|
|
22
|
+
const formats = [];
|
|
23
|
+
for (const range of ranges) {
|
|
24
|
+
for (let rowIndex = range.startRowIndex; rowIndex <= range.endRowIndex; rowIndex++) {
|
|
15
25
|
const rowFormats = [];
|
|
16
|
-
for (let columnIndex =
|
|
17
|
-
rowFormats.push(getEffectiveFormat(sheetId, rowIndex, columnIndex));
|
|
26
|
+
for (let columnIndex = range.startColumnIndex; columnIndex <= range.endColumnIndex; columnIndex++) {
|
|
27
|
+
rowFormats.push(layerBandedFormat(getEffectiveFormat(sheetId, rowIndex, columnIndex), getBandedCellFormat(bandedCells, rowIndex, columnIndex)));
|
|
18
28
|
}
|
|
19
|
-
|
|
29
|
+
formats.push(rowFormats);
|
|
20
30
|
}
|
|
21
31
|
}
|
|
22
|
-
|
|
23
|
-
|
|
32
|
+
// Merges travel with a single-block source only; a multi-area capture has no single
|
|
33
|
+
// tiling origin (the format rows are stacked, as before).
|
|
34
|
+
const source = ranges.length === 1 ? ranges[0] : undefined;
|
|
35
|
+
const merges = source
|
|
36
|
+
? collectPaintMerges(getMerges?.(sheetId), source)
|
|
37
|
+
: [];
|
|
38
|
+
return {
|
|
39
|
+
formats,
|
|
40
|
+
merges,
|
|
41
|
+
rows: formats.length,
|
|
42
|
+
cols: formats[0]?.length ?? 0,
|
|
43
|
+
};
|
|
44
|
+
}, [getEffectiveFormat, getBandedCells, getMerges]);
|
|
45
|
+
/**
|
|
46
|
+
* Replace the target's merges with the pattern's, tiled with the pattern's period.
|
|
47
|
+
*/
|
|
48
|
+
const applyPatternMerges = useCallback((sheetId, activeCell, current, targets) => {
|
|
49
|
+
if (!current.merges.length || !onPaintMerges)
|
|
50
|
+
return;
|
|
51
|
+
for (const target of targets) {
|
|
52
|
+
const tiled = tilePaintMerges(current.merges, current.rows, current.cols, target);
|
|
53
|
+
onPaintMerges(sheetId, activeCell, target, tiled);
|
|
54
|
+
}
|
|
55
|
+
}, [onPaintMerges]);
|
|
56
|
+
const onSavePaintFormat = useCallback((sheetId, activeCell, selections) => {
|
|
57
|
+
const finalSelections = selections.length
|
|
58
|
+
? selections
|
|
59
|
+
: selectionFromActiveCell(activeCell);
|
|
60
|
+
setPattern(capturePattern(sheetId, finalSelections.map((sel) => sel.range)));
|
|
61
|
+
}, [capturePattern]);
|
|
24
62
|
// Applies a saved paintFormat
|
|
25
63
|
const onApplyPaintFormat = useCallback((sheetId, activeCell, selections) => {
|
|
26
64
|
/**
|
|
@@ -32,9 +70,7 @@ export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChang
|
|
|
32
70
|
// `changeFormatting` repeats the grid via its rolling indices). Only
|
|
33
71
|
// header-click full-column/row targets are bounded to the pattern so a paint
|
|
34
72
|
// never enumerates an entire 1M-row column.
|
|
35
|
-
const clampEnd = (start, end, span) => end - start >= UNBOUNDED_PAINT_SPAN
|
|
36
|
-
? Math.min(end, start + span)
|
|
37
|
-
: end;
|
|
73
|
+
const clampEnd = (start, end, span) => end - start >= UNBOUNDED_PAINT_SPAN ? Math.min(end, start + span) : end;
|
|
38
74
|
const newSelections = selections?.length
|
|
39
75
|
? selections.map((sel) => ({
|
|
40
76
|
...sel,
|
|
@@ -58,6 +94,8 @@ export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChang
|
|
|
58
94
|
onChangeFormatting(sheetId, activeCell, newSelections, paintFormats, {
|
|
59
95
|
replace: true,
|
|
60
96
|
});
|
|
97
|
+
// Merges tile with the same period as the formats.
|
|
98
|
+
applyPatternMerges(sheetId, activeCell, pattern, newSelections.map((sel) => sel.range));
|
|
61
99
|
/**
|
|
62
100
|
* User has made selections. lets preserve it
|
|
63
101
|
*/
|
|
@@ -65,8 +103,14 @@ export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChang
|
|
|
65
103
|
onChangeSelections?.(sheetId, newSelections);
|
|
66
104
|
}
|
|
67
105
|
// Reset paintformats
|
|
68
|
-
|
|
69
|
-
}, [
|
|
106
|
+
setPattern(EMPTY_PATTERN);
|
|
107
|
+
}, [
|
|
108
|
+
pattern,
|
|
109
|
+
paintFormats,
|
|
110
|
+
onChangeSelections,
|
|
111
|
+
onChangeFormatting,
|
|
112
|
+
applyPatternMerges,
|
|
113
|
+
]);
|
|
70
114
|
/**
|
|
71
115
|
* Copy formatting from a source range to target range
|
|
72
116
|
*/
|
|
@@ -79,24 +123,22 @@ export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChang
|
|
|
79
123
|
* Sheet range to paste to
|
|
80
124
|
*/
|
|
81
125
|
targetSheetRange) => {
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
for (let columnIndex = sourceSheetRange.startColumnIndex; columnIndex <= sourceSheetRange.endColumnIndex; columnIndex++) {
|
|
86
|
-
rowFormats.push(getEffectiveFormat(sourceSheetRange.sheetId, rowIndex, columnIndex));
|
|
87
|
-
}
|
|
88
|
-
paintFormats.push(rowFormats);
|
|
89
|
-
}
|
|
126
|
+
const captured = capturePattern(sourceSheetRange.sheetId, [
|
|
127
|
+
sourceSheetRange,
|
|
128
|
+
]);
|
|
90
129
|
// Apply
|
|
91
130
|
const activeCell = {
|
|
92
131
|
rowIndex: targetSheetRange.startRowIndex,
|
|
93
132
|
columnIndex: targetSheetRange.startColumnIndex,
|
|
94
133
|
};
|
|
95
134
|
// Copy formatting
|
|
96
|
-
onChangeFormatting(targetSheetRange.sheetId, activeCell, [{ range: targetSheetRange }],
|
|
135
|
+
onChangeFormatting(targetSheetRange.sheetId, activeCell, [{ range: targetSheetRange }], captured.formats, {
|
|
97
136
|
replace: true,
|
|
98
137
|
});
|
|
99
|
-
|
|
138
|
+
applyPatternMerges(targetSheetRange.sheetId, activeCell, captured, [
|
|
139
|
+
targetSheetRange,
|
|
140
|
+
]);
|
|
141
|
+
}, [onChangeFormatting, capturePattern, applyPatternMerges]);
|
|
100
142
|
return {
|
|
101
143
|
isPaintFormatActive: paintFormats.length > 0,
|
|
102
144
|
onSavePaintFormat,
|
|
@@ -49,6 +49,7 @@ export type UseSheetPropertiesProps<T extends CellData, S extends Sheet> = {
|
|
|
49
49
|
getPrecedents?: (cell: FormulaPosition) => FormulaPrecedents;
|
|
50
50
|
};
|
|
51
51
|
export declare const useSheetProperties: <T extends CellData = CellData, S extends Sheet = Sheet>({ conditionalFormats, sheetData, sheets, activeSheetId, dataValidations, protectFormulas, getEffectiveStructuredValue, cellXfs, cellXfsRegistry, cellStyles, sharedStrings, locale, use1904, lenientGrouping, getPrecedents, }: UseSheetPropertiesProps<T, S>) => {
|
|
52
|
+
getFormulaValue: (sheetId: number, rowIndex: number, columnIndex: number) => string | undefined;
|
|
52
53
|
getDataRowCount: (sheetId?: number) => number | undefined;
|
|
53
54
|
getNonEmptyRowCount: (sheetId: number) => number | undefined;
|
|
54
55
|
getNonEmptyColumnCount: (sheetId: number, rowIndex: number) => number | undefined;
|
|
@@ -56,6 +57,7 @@ export declare const useSheetProperties: <T extends CellData = CellData, S exten
|
|
|
56
57
|
getSheetName: (sheetId: number) => string;
|
|
57
58
|
getSheetCount: () => number;
|
|
58
59
|
getSheetIndex: (sheetName?: string) => number | undefined;
|
|
60
|
+
getSheetNames: () => string[];
|
|
59
61
|
getSheetProperties: (sheetId: number) => SheetProperty | undefined;
|
|
60
62
|
getCellData: (sheetId: number, rowIndex: number, columnIndex: number) => T | null | undefined;
|
|
61
63
|
getMentionsFromCell: (sheetId: number, rowIndex: number, columnIndex: number) => {
|
|
@@ -86,6 +88,7 @@ export declare const useSheetProperties: <T extends CellData = CellData, S exten
|
|
|
86
88
|
getFormulasFromRange: (sheetRange: SheetRange, hiddenDimensionStategy?: HIDDEN_DIMENSION_STRATEGY) => (string | undefined)[];
|
|
87
89
|
isHiddenRow: (sheetId: number, rowIndex: number) => boolean;
|
|
88
90
|
isHiddenByFilterRow: (sheetId: number, rowIndex: number) => boolean;
|
|
91
|
+
getRowOutlineLevel: (sheetId: number, rowIndex: number) => number;
|
|
89
92
|
getSheetRowCount: (sheetId: number) => number;
|
|
90
93
|
getSheetColumnCount: (sheetId: number) => number;
|
|
91
94
|
getColumnWidth: (sheetId: number, columnIndex: number) => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-sheet-properties.d.ts","sourceRoot":"","sources":["../../../hooks/use-sheet-properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGjE,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,KAAK,EACL,UAAU,EAEX,MAAM,2BAA2B,CAAC;AA+BnC,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAe7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,UAAU,CAAC;AAElB,KAAK,iBAAiB,GAAG,CAAC,QAAQ,GAAG,aAAa,GAAG,UAAU,CAAC,EAAE,CAAC;AAEnE,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IACzE,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC7C,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC7C,eAAe,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACrD,2BAA2B,EAAE,mBAAmB,CAC9C,CAAC,EACD,CAAC,CACF,CAAC,6BAA6B,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/C,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;OAIG;IACH,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,iBAAiB,CAAC;CAC9D,CAAC;AAoEF,eAAO,MAAM,kBAAkB,GAC7B,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAC7B,CAAC,SAAS,KAAK,GAAG,KAAK,EACvB,gOAgBC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC;;
|
|
1
|
+
{"version":3,"file":"use-sheet-properties.d.ts","sourceRoot":"","sources":["../../../hooks/use-sheet-properties.ts"],"names":[],"mappings":"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"}
|
|
@@ -226,6 +226,8 @@ export const useSheetProperties = ({ conditionalFormats, sheetData, sheets, acti
|
|
|
226
226
|
const metaData = sheetMetaDataById.get(sheetId)?.rowMetadata?.[rowIndex];
|
|
227
227
|
return Boolean(metaData?.hiddenByUser || metaData?.hiddenByFilter);
|
|
228
228
|
}, [sheetMetaDataById]);
|
|
229
|
+
// Outline (row grouping) level, 0 when the row is not grouped
|
|
230
|
+
const getRowOutlineLevel = useCallback((sheetId, rowIndex) => sheetMetaDataById.get(sheetId)?.rowMetadata?.[rowIndex]?.outlineLevel ?? 0, [sheetMetaDataById]);
|
|
229
231
|
// Hidden by filter row
|
|
230
232
|
const isHiddenByFilterRow = useCallback((sheetId, rowIndex) => {
|
|
231
233
|
const metaData = sheetMetaDataById.get(sheetId)?.rowMetadata?.[rowIndex];
|
|
@@ -253,6 +255,9 @@ export const useSheetProperties = ({ conditionalFormats, sheetData, sheets, acti
|
|
|
253
255
|
});
|
|
254
256
|
return map;
|
|
255
257
|
}, [sheets]);
|
|
258
|
+
// Sheet names in tab order — resolves 3-D references (`Sheet1:Sheet3!A1`)
|
|
259
|
+
const orderedSheetNames = useMemo(() => sortSheetsByIndex(sheets, true).map((sheet) => sheet.title), [sheets]);
|
|
260
|
+
const getSheetNames = useCallbackRef(useCallback(() => orderedSheetNames, [orderedSheetNames]));
|
|
256
261
|
// For calculator
|
|
257
262
|
const getSheetIndex = useCallbackRef(useCallback((sheetName) => {
|
|
258
263
|
const resolvedName = sheetName ?? sheetnameBySheetId.get(activeSheetId);
|
|
@@ -864,6 +869,7 @@ export const useSheetProperties = ({ conditionalFormats, sheetData, sheets, acti
|
|
|
864
869
|
return columnarData;
|
|
865
870
|
}, [getEffectiveValue, getFormattedValue]));
|
|
866
871
|
return {
|
|
872
|
+
getFormulaValue,
|
|
867
873
|
getDataRowCount,
|
|
868
874
|
getNonEmptyRowCount,
|
|
869
875
|
getNonEmptyColumnCount,
|
|
@@ -871,6 +877,7 @@ export const useSheetProperties = ({ conditionalFormats, sheetData, sheets, acti
|
|
|
871
877
|
getSheetName,
|
|
872
878
|
getSheetCount,
|
|
873
879
|
getSheetIndex,
|
|
880
|
+
getSheetNames,
|
|
874
881
|
getSheetProperties,
|
|
875
882
|
getCellData,
|
|
876
883
|
getMentionsFromCell,
|
|
@@ -894,6 +901,7 @@ export const useSheetProperties = ({ conditionalFormats, sheetData, sheets, acti
|
|
|
894
901
|
getFormulasFromRange,
|
|
895
902
|
isHiddenRow,
|
|
896
903
|
isHiddenByFilterRow,
|
|
904
|
+
getRowOutlineLevel,
|
|
897
905
|
getSheetRowCount,
|
|
898
906
|
getSheetColumnCount,
|
|
899
907
|
getColumnWidth,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CellInterface, SelectionArea } from "@rowsncolumns/common-types";
|
|
2
2
|
import type { CellData, SelectionAttributes, Sheet } from "@rowsncolumns/spreadsheet";
|
|
3
|
+
import type { SplitTextOptions } from "../api/split-text";
|
|
3
4
|
import type { useCalculation } from "./use-calculation";
|
|
4
5
|
import type { useSheetProperties } from "./use-sheet-properties";
|
|
5
6
|
import type { useSheetState } from "./use-sheet-state";
|
|
@@ -15,5 +16,5 @@ export type UseSplitTextToColumnsProps<T extends CellData, S extends Sheet> = {
|
|
|
15
16
|
onChangeSelections: ReturnType<typeof useSheetState>["onChangeSelections"];
|
|
16
17
|
onCommand?: OnCommand;
|
|
17
18
|
};
|
|
18
|
-
export declare const useSplitTextToColumns: <T extends CellData, S extends Sheet>({ locale, getFormattedValue, onChangeSheetData, enqueueCalculation, createHistory, onChangeSelections, onCommand, }: UseSplitTextToColumnsProps<T, S>) => (sheetId: number, activeCell: CellInterface, selections?: SelectionArea<SelectionAttributes>[], delimiter?: string) => void;
|
|
19
|
+
export declare const useSplitTextToColumns: <T extends CellData, S extends Sheet>({ locale, getFormattedValue, onChangeSheetData, enqueueCalculation, createHistory, onChangeSelections, onCommand, }: UseSplitTextToColumnsProps<T, S>) => (sheetId: number, activeCell: CellInterface, selections?: SelectionArea<SelectionAttributes>[], delimiter?: string, options?: SplitTextOptions) => void;
|
|
19
20
|
//# sourceMappingURL=use-split-text-to-columns.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-split-text-to-columns.d.ts","sourceRoot":"","sources":["../../../hooks/use-split-text-to-columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EACV,QAAQ,EACR,mBAAmB,EACnB,KAAK,EACN,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"use-split-text-to-columns.d.ts","sourceRoot":"","sources":["../../../hooks/use-split-text-to-columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EACV,QAAQ,EACR,mBAAmB,EACnB,KAAK,EACN,MAAM,2BAA2B,CAAC;AAGnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC9E,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5E,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAClE,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC3E,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,qHAQxE,0BAA0B,CAAC,CAAC,EAAE,CAAC,CAAC,eAGpB,MAAM,cACH,aAAa,eACZ,aAAa,CAAC,mBAAmB,CAAC,EAAE,gCAEvC,gBAAgB,SA+B/B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useCallback } from "react";
|
|
2
2
|
import { splitText } from "../interface/split-text";
|
|
3
3
|
export const useSplitTextToColumns = ({ locale, getFormattedValue, onChangeSheetData, enqueueCalculation, createHistory, onChangeSelections, onCommand, }) => {
|
|
4
|
-
return useCallback((sheetId, activeCell, selections, delimiter = ",") => {
|
|
4
|
+
return useCallback((sheetId, activeCell, selections, delimiter = ",", options) => {
|
|
5
5
|
splitText({
|
|
6
6
|
locale,
|
|
7
7
|
getFormattedValue,
|
|
@@ -9,7 +9,7 @@ export const useSplitTextToColumns = ({ locale, getFormattedValue, onChangeSheet
|
|
|
9
9
|
onChangeSheetData,
|
|
10
10
|
createHistory,
|
|
11
11
|
onChangeSelections,
|
|
12
|
-
})(sheetId, activeCell, selections, delimiter);
|
|
12
|
+
})(sheetId, activeCell, selections, delimiter, options);
|
|
13
13
|
// Stream the semantic command so an engine consumer re-splits + recomputes.
|
|
14
14
|
onCommand?.({
|
|
15
15
|
command: "split-text-to-columns",
|
|
@@ -17,6 +17,7 @@ export const useSplitTextToColumns = ({ locale, getFormattedValue, onChangeSheet
|
|
|
17
17
|
activeCell,
|
|
18
18
|
selections: selections ?? [],
|
|
19
19
|
delimiter,
|
|
20
|
+
columnBreaks: options?.columnBreaks,
|
|
20
21
|
});
|
|
21
22
|
}, [
|
|
22
23
|
locale,
|