@a3s-lab/office 0.37.3 → 0.37.4

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/5416.js CHANGED
@@ -2756,6 +2756,33 @@ function workSpreadsheetAutoFilterManuallyHiddenRows(sheet) {
2756
2756
  }
2757
2757
  return manuallyHidden;
2758
2758
  }
2759
+ function workSpreadsheetAutoFilterOwnedRows(sheet) {
2760
+ return filterHiddenRows(sheet.filter);
2761
+ }
2762
+ function workSpreadsheetFilterHiddenRows(sheet, range, column, criteria, context = {
2763
+ now: new Date()
2764
+ }) {
2765
+ const normalizedCriteria = normalizeWorkSpreadsheetFilterCriteria(criteria);
2766
+ const normalizedRange = normalizedWorkSpreadsheetAutoFilterRange(range);
2767
+ if (!normalizedCriteria || !normalizedRange || !columnInRange(normalizedRange, column)) return null;
2768
+ return hiddenRowsForCriteria(sheet, normalizedRange, column, normalizedCriteria, context);
2769
+ }
2770
+ function workSpreadsheetSheetWithReappliedAutoFilterCriteria(sheet, criteriaSource, manuallyHiddenRows, context = {
2771
+ now: new Date()
2772
+ }) {
2773
+ const range = normalizedWorkSpreadsheetAutoFilterRange(sheet.filter_select);
2774
+ if (!range) return sheet;
2775
+ const entries = workSpreadsheetAutoFilterCriteriaEntries(criteriaSource);
2776
+ const filter = {};
2777
+ for (const entry of entries){
2778
+ const column = range.column[0] + entry.column;
2779
+ const criteria = normalizeWorkSpreadsheetFilterCriteria(entry.criteria);
2780
+ if (!criteria || !columnInRange(range, column)) continue;
2781
+ const rowhidden = hiddenRowsForCriteria(sheet, range, column, criteria, context);
2782
+ if (rowhidden) filter[String(entry.column)] = filterColumnState(range, column, criteria, rowhidden);
2783
+ }
2784
+ return sheetWithFilterState(sheet, filter, manuallyHiddenRows);
2785
+ }
2759
2786
  function workSpreadsheetSheetWithImportedAutoFilterCriteria(sheet, entries, context = {
2760
2787
  now: new Date()
2761
2788
  }) {
@@ -4047,4 +4074,4 @@ function normalizeStoredSpreadsheetSortCustomLists(input) {
4047
4074
  function spreadsheet_sort_custom_list_store_isRecord(value) {
4048
4075
  return Boolean(value && 'object' == typeof value && !Array.isArray(value));
4049
4076
  }
4050
- export { DEFAULT_SPREADSHEET_SORT_CUSTOM_LIST_STORAGE_KEY, LocalStorageSpreadsheetSortCustomListStore, SPREADSHEET_TABLE_TOTALS_FUNCTIONS, activeXlsxNativeFill, activeXlsxSemanticColorOrigin, applyImportedXlsxRichText, boundedSpreadsheetDataValidationText, coalesceXlsxRichTextRuns, createSpreadsheetSortCustomList, createWorkOfficeSpreadsheetCollaborationBinding as createOfficeSpreadsheetCollaborationBinding, createXlsxRichTextReadContext, deleteXlsxNativeFills, directXlsxAlignment, directXlsxFontStyle, fillSpreadsheetTableCalculatedColumns, hasXlsxDirectFontStyle, initializeWorkOfficeSpreadsheetCollaboration as initializeOfficeSpreadsheetCollaboration, isHighSurrogate, isLowSurrogate, isSpreadsheetTextOrientationId, isSpreadsheetUnderlineStyle, mergeSpreadsheetSortCustomLists, normalizeSpreadsheetDataValidationErrorStyle, normalizeSpreadsheetDateValidationBoundary, normalizeSpreadsheetTableCalculatedFormula, normalizeSpreadsheetTableTotalsFormula, normalizeSpreadsheetTableTotalsLabel, normalizeStoredSpreadsheetSortCustomLists, normalizeWorkSpreadsheetFilterCriteria, normalizeXlsxRichTextCell, normalizeXlsxRichTextColor, normalizeXlsxRichTextEditSource, normalizeXlsxRichTextRun, normalizedWorkSpreadsheetAutoFilterRange, parseSpreadsheetSortCustomList, patchSpreadsheetRichTextFontRuns, readWorkOfficeSpreadsheetCollaboration as readOfficeSpreadsheetCollaboration, readXlsxRichTextCells, reconcileSpreadsheetTableCalculatedColumns, reconcileSpreadsheetTableTotalsColumns, replaceWorkOfficeSpreadsheetCollaboration as replaceOfficeSpreadsheetCollaboration, sameXlsxRichTextRunStyle, sheetHasXlsxRichTextCells, spreadsheetCellValueWithDiagonalBorder, spreadsheetDateValidationFormula, spreadsheetDiagonalBorderFromCellValue, spreadsheetExplicitTextOrientationFromCell, spreadsheetSortCustomListMatchKey, spreadsheetSortCustomListsEqual, spreadsheetTableTotalsColumnPatch, spreadsheetTableTotalsFunctionFromOoxml, spreadsheetTableTotalsFunctionLabel, spreadsheetTableTotalsFunctionToOoxml, spreadsheetTableTotalsRowHasContent, spreadsheetTextOrientationCellStyle, spreadsheetTextOrientationChoiceFromCell, spreadsheetTextOrientationFromAngle, spreadsheetTextOrientationFromCell, spreadsheetTextOrientationFromChoice, spreadsheetTextOrientationFromXlsx, spreadsheetUnderlineCellValue, spreadsheetUnderlineCellValueFromSheetJs, spreadsheetUnderlineCellValueFromXlsx, spreadsheetUnderlineStyle, spreadsheetVisibleTextRotationFromCell, synchronizeSpreadsheetTableTotalsRow, validXlsxRichText, validateSpreadsheetSortCustomList, withDefaultSpreadsheetTableTotalsLabel, workSpreadsheetAutoFilterCriteria, workSpreadsheetAutoFilterCriteriaEntries, workSpreadsheetAutoFilterManuallyHiddenRows, workSpreadsheetCellIsDate, workSpreadsheetFilterTextCharacters, workSpreadsheetHasUnescapedWildcard, workSpreadsheetSheetWithAutoFilterCriteria, workSpreadsheetSheetWithImportedAutoFilterCriteria, workSpreadsheetSheetWithoutAutoFilterCriteria, writeXlsxRichTextCells, xlsxAlignmentMatches, xlsxBooleanAttribute, xlsxBorderLineMatches, xlsxColorMatches, xlsxNativeFillCellKeys, xlsxNativeFillKey, xlsxNativeFillSemanticColors, xlsxRichTextCellText, xlsxRichTextStyleOrigins, xlsxStyleCollectionIndex, xlsxToggleEnabled, xlsxUnderlineStyle };
4077
+ export { DEFAULT_SPREADSHEET_SORT_CUSTOM_LIST_STORAGE_KEY, LocalStorageSpreadsheetSortCustomListStore, SPREADSHEET_TABLE_TOTALS_FUNCTIONS, activeXlsxNativeFill, activeXlsxSemanticColorOrigin, applyImportedXlsxRichText, boundedSpreadsheetDataValidationText, coalesceXlsxRichTextRuns, createSpreadsheetSortCustomList, createWorkOfficeSpreadsheetCollaborationBinding as createOfficeSpreadsheetCollaborationBinding, createXlsxRichTextReadContext, deleteXlsxNativeFills, directXlsxAlignment, directXlsxFontStyle, fillSpreadsheetTableCalculatedColumns, hasXlsxDirectFontStyle, initializeWorkOfficeSpreadsheetCollaboration as initializeOfficeSpreadsheetCollaboration, isHighSurrogate, isLowSurrogate, isSpreadsheetTextOrientationId, isSpreadsheetUnderlineStyle, mergeSpreadsheetSortCustomLists, normalizeSpreadsheetDataValidationErrorStyle, normalizeSpreadsheetDateValidationBoundary, normalizeSpreadsheetTableCalculatedFormula, normalizeSpreadsheetTableTotalsFormula, normalizeSpreadsheetTableTotalsLabel, normalizeStoredSpreadsheetSortCustomLists, normalizeWorkSpreadsheetFilterCriteria, normalizeXlsxRichTextCell, normalizeXlsxRichTextColor, normalizeXlsxRichTextEditSource, normalizeXlsxRichTextRun, normalizedWorkSpreadsheetAutoFilterRange, parseSpreadsheetSortCustomList, patchSpreadsheetRichTextFontRuns, readWorkOfficeSpreadsheetCollaboration as readOfficeSpreadsheetCollaboration, readXlsxRichTextCells, reconcileSpreadsheetTableCalculatedColumns, reconcileSpreadsheetTableTotalsColumns, replaceWorkOfficeSpreadsheetCollaboration as replaceOfficeSpreadsheetCollaboration, sameXlsxRichTextRunStyle, sheetHasXlsxRichTextCells, spreadsheetCellValueWithDiagonalBorder, spreadsheetDateValidationFormula, spreadsheetDiagonalBorderFromCellValue, spreadsheetExplicitTextOrientationFromCell, spreadsheetSortCustomListMatchKey, spreadsheetSortCustomListsEqual, spreadsheetTableTotalsColumnPatch, spreadsheetTableTotalsFunctionFromOoxml, spreadsheetTableTotalsFunctionLabel, spreadsheetTableTotalsFunctionToOoxml, spreadsheetTableTotalsRowHasContent, spreadsheetTextOrientationCellStyle, spreadsheetTextOrientationChoiceFromCell, spreadsheetTextOrientationFromAngle, spreadsheetTextOrientationFromCell, spreadsheetTextOrientationFromChoice, spreadsheetTextOrientationFromXlsx, spreadsheetUnderlineCellValue, spreadsheetUnderlineCellValueFromSheetJs, spreadsheetUnderlineCellValueFromXlsx, spreadsheetUnderlineStyle, spreadsheetVisibleTextRotationFromCell, synchronizeSpreadsheetTableTotalsRow, validXlsxRichText, validateSpreadsheetSortCustomList, withDefaultSpreadsheetTableTotalsLabel, workSpreadsheetAutoFilterCriteria, workSpreadsheetAutoFilterCriteriaEntries, workSpreadsheetAutoFilterManuallyHiddenRows, workSpreadsheetAutoFilterOwnedRows, workSpreadsheetCellIsDate, workSpreadsheetFilterHiddenRows, workSpreadsheetFilterTextCharacters, workSpreadsheetHasUnescapedWildcard, workSpreadsheetSheetWithAutoFilterCriteria, workSpreadsheetSheetWithImportedAutoFilterCriteria, workSpreadsheetSheetWithReappliedAutoFilterCriteria, workSpreadsheetSheetWithoutAutoFilterCriteria, writeXlsxRichTextCells, xlsxAlignmentMatches, xlsxBooleanAttribute, xlsxBorderLineMatches, xlsxColorMatches, xlsxNativeFillCellKeys, xlsxNativeFillKey, xlsxNativeFillSemanticColors, xlsxRichTextCellText, xlsxRichTextStyleOrigins, xlsxStyleCollectionIndex, xlsxToggleEnabled, xlsxUnderlineStyle };
@@ -0,0 +1,6 @@
1
+ import type { Op } from '@fortune-sheet/core';
2
+ import type { WorkSpreadsheetContent, WorkSpreadsheetSheet } from '../work-types';
3
+ import type { SpreadsheetCellRange } from './spreadsheet-cell-range';
4
+ export declare function reconcileSpreadsheetFiltersAfterFortune(sheets: WorkSpreadsheetContent['sheets'], sourceSheets: WorkSpreadsheetContent['sheets'], operations?: readonly Op[]): WorkSpreadsheetContent['sheets'];
5
+ export declare function reconcileSpreadsheetFiltersAfterSort(sheet: WorkSpreadsheetSheet, source: WorkSpreadsheetSheet, range: SpreadsheetCellRange, sourceIndexes: readonly number[]): WorkSpreadsheetSheet | null;
6
+ export declare function spreadsheetFilterReconciliationIsBounded(sheet: WorkSpreadsheetSheet): boolean;
@@ -1,6 +1,7 @@
1
1
  import type { SpreadsheetSortOptions } from './spreadsheet-sort';
2
- export declare function SpreadsheetSortOptionsDialog({ value, restoreFocusTarget, onApply, onClose, }: {
2
+ export declare function SpreadsheetSortOptionsDialog({ value, orientationLocked, restoreFocusTarget, onApply, onClose, }: {
3
3
  value: SpreadsheetSortOptions;
4
+ orientationLocked?: boolean;
4
5
  restoreFocusTarget: () => HTMLElement | null;
5
6
  onApply: (value: SpreadsheetSortOptions) => void;
6
7
  onClose: () => void;
@@ -55,10 +55,24 @@ export interface SpreadsheetSortTarget {
55
55
  activeColumn: number;
56
56
  activeRow: number;
57
57
  range: SpreadsheetCellRange;
58
+ scope?: SpreadsheetSortOwnedScope;
59
+ }
60
+ export type SpreadsheetSortOwnedScope = {
61
+ hasHeader: true;
62
+ kind: 'auto-filter';
63
+ } | {
64
+ hasHeader: boolean;
65
+ kind: 'table';
66
+ tableId: string;
67
+ };
68
+ export interface SpreadsheetSortOwnedRange {
69
+ range: SpreadsheetCellRange;
70
+ scope: SpreadsheetSortOwnedScope;
58
71
  }
59
72
  export interface SpreadsheetSortRangeCandidate {
60
73
  available: boolean;
61
74
  range: SpreadsheetCellRange;
75
+ scope?: SpreadsheetSortOwnedScope;
62
76
  }
63
77
  export type SpreadsheetSortIntent = {
64
78
  type: 'custom';
@@ -83,15 +97,18 @@ export interface SpreadsheetSortRangeDialogSource {
83
97
  canSortExpandedRange: boolean;
84
98
  canSortSelection: boolean;
85
99
  expandedRangeReference: string;
100
+ ownedScope?: SpreadsheetSortOwnedScope;
86
101
  selectedRangeReference: string;
87
102
  sheetName: string;
88
103
  }
89
104
  export type SpreadsheetSortRequest = Omit<SpreadsheetSortDialogValue, keyof SpreadsheetSortTextOptions> & Partial<SpreadsheetSortTextOptions> & {
90
105
  range: SpreadsheetCellRange;
106
+ scope?: SpreadsheetSortOwnedScope;
91
107
  sheetId: string;
92
108
  };
93
109
  export interface SpreadsheetSortNormalizedRequest extends SpreadsheetSortDialogValue {
94
110
  range: SpreadsheetCellRange;
111
+ scope?: SpreadsheetSortOwnedScope;
95
112
  sheetId: string;
96
113
  }
97
114
  export interface SpreadsheetSortField {
@@ -106,11 +123,12 @@ export interface SpreadsheetSortDialogSource {
106
123
  range: SpreadsheetCellRange;
107
124
  rangeReference: string;
108
125
  rows: SpreadsheetSortField[];
126
+ scope?: SpreadsheetSortOwnedScope;
109
127
  sheetId: string;
110
128
  sheetName: string;
111
129
  value: SpreadsheetSortDialogValue;
112
130
  }
113
- export type SpreadsheetSortErrorCode = 'column-out-of-range' | 'duplicate-key' | 'formula-reference-out-of-range' | 'invalid-appearance' | 'invalid-case-sensitivity' | 'invalid-custom-list' | 'invalid-direction' | 'invalid-header' | 'invalid-matrix' | 'invalid-orientation' | 'invalid-range' | 'invalid-text-method' | 'missing-key' | 'not-enough-columns' | 'not-enough-rows' | 'range-too-large' | 'row-out-of-range' | 'too-many-keys' | 'unsupported-text-method' | 'unsupported-linked-cell';
131
+ export type SpreadsheetSortErrorCode = 'column-out-of-range' | 'duplicate-key' | 'formula-reference-out-of-range' | 'invalid-appearance' | 'invalid-case-sensitivity' | 'invalid-custom-list' | 'invalid-direction' | 'invalid-header' | 'invalid-matrix' | 'invalid-orientation' | 'invalid-range' | 'invalid-scope' | 'invalid-text-method' | 'missing-key' | 'not-enough-columns' | 'not-enough-rows' | 'range-too-large' | 'row-out-of-range' | 'too-many-keys' | 'unsupported-text-method' | 'unsupported-linked-cell';
114
132
  export type SpreadsheetSortValidationResult = {
115
133
  ok: true;
116
134
  request: SpreadsheetSortNormalizedRequest;
@@ -122,6 +140,7 @@ export type SpreadsheetSortValidationResult = {
122
140
  export type SpreadsheetSortResult = {
123
141
  ok: true;
124
142
  rows: (Cell | null)[][];
143
+ sourceIndexes: number[];
125
144
  } | {
126
145
  code: SpreadsheetSortErrorCode;
127
146
  message: string;
@@ -130,6 +149,9 @@ export type SpreadsheetSortResult = {
130
149
  export declare function createSpreadsheetSortRangePlan(sheet: WorkSpreadsheetSheet, selectedRange: SpreadsheetCellRange): SpreadsheetSortRangePlan | null;
131
150
  export declare function createSpreadsheetSortRangeDialogSource(sheetName: string, request: SpreadsheetSortOpenRequest): SpreadsheetSortRangeDialogSource | null;
132
151
  export declare function createSpreadsheetSortDialogSource(sheetId: string, sheetName: string, target: SpreadsheetSortTarget, rows: readonly (readonly (Cell | null)[])[], customLists?: readonly SpreadsheetSortCustomList[], appearanceRows?: SpreadsheetSortAppearanceRows): SpreadsheetSortDialogSource | null;
152
+ export declare function spreadsheetSortRowsMatchRange(rows: readonly (readonly (Cell | null)[])[], range: SpreadsheetCellRange): boolean;
153
+ export declare function spreadsheetSortRowsFromSheet(sheet: WorkSpreadsheetSheet, range: SpreadsheetCellRange): (Cell | null)[][] | null;
154
+ export declare function spreadsheetSortOwnedRangeForExactRange(sheet: WorkSpreadsheetSheet, range: SpreadsheetCellRange): SpreadsheetSortOwnedRange | null;
133
155
  export declare function validateSpreadsheetSortRequest(request: SpreadsheetSortRequest): SpreadsheetSortValidationResult;
134
156
  export declare function spreadsheetSortFailureMessage(result: SpreadsheetSortValidationResult | SpreadsheetSortResult): string | null;
135
157
  export declare function spreadsheetSortAppearanceRowsMatch(rows: readonly (readonly (Cell | null)[])[], appearances: SpreadsheetSortAppearanceRows): boolean;
@@ -10,5 +10,8 @@ export declare function workSpreadsheetAutoFilterCriteriaEntries(sheet: WorkSpre
10
10
  export declare function workSpreadsheetSheetWithAutoFilterCriteria(sheet: WorkSpreadsheetSheet, column: number, criteria: WorkSpreadsheetFilterCriteria, context?: WorkSpreadsheetDynamicFilterContext): WorkSpreadsheetSheet | null;
11
11
  export declare function workSpreadsheetSheetWithoutAutoFilterCriteria(sheet: WorkSpreadsheetSheet, column: number): WorkSpreadsheetSheet | null;
12
12
  export declare function workSpreadsheetAutoFilterManuallyHiddenRows(sheet: WorkSpreadsheetSheet): Set<string>;
13
+ export declare function workSpreadsheetAutoFilterOwnedRows(sheet: WorkSpreadsheetSheet): Set<string>;
14
+ export declare function workSpreadsheetFilterHiddenRows(sheet: WorkSpreadsheetSheet, range: WorkSpreadsheetAutoFilterRange, column: number, criteria: WorkSpreadsheetFilterCriteria, context?: WorkSpreadsheetDynamicFilterContext): Record<string, 0> | null;
15
+ export declare function workSpreadsheetSheetWithReappliedAutoFilterCriteria(sheet: WorkSpreadsheetSheet, criteriaSource: WorkSpreadsheetSheet, manuallyHiddenRows: ReadonlySet<string>, context?: WorkSpreadsheetDynamicFilterContext): WorkSpreadsheetSheet;
13
16
  export declare function workSpreadsheetSheetWithImportedAutoFilterCriteria(sheet: WorkSpreadsheetSheet, entries: readonly WorkSpreadsheetFilter[], context?: WorkSpreadsheetDynamicFilterContext): WorkSpreadsheetSheet;
14
17
  export declare function normalizeWorkSpreadsheetFilterCriteria(criteria: unknown): WorkSpreadsheetFilterCriteria | null;
Binary file
package/dist/styles.css CHANGED
@@ -18068,6 +18068,13 @@ sub [data-office-character-position-half-points], sup [data-office-character-pos
18068
18068
  font-weight: 700;
18069
18069
  }
18070
18070
 
18071
+ .work-spreadsheet-sort-options-lock-note {
18072
+ color: var(--a3s-muted);
18073
+ margin: 0 0 2px;
18074
+ font-size: 11px;
18075
+ line-height: 1.45;
18076
+ }
18077
+
18071
18078
  .work-spreadsheet-sort-options > label {
18072
18079
  border: 1px solid var(--a3s-line);
18073
18080
  cursor: pointer;
@@ -1498,13 +1498,30 @@ view, then uses one stable comparator for both orientations. Relative formula
1498
1498
  references are translated along the moved row or column axis with the same
1499
1499
  bounded reference engine used by Paste Special, while absolute references stay
1500
1500
  fixed.
1501
- One accepted operation crosses the Fortune boundary as one range write and one
1502
- controlled Undo record. Table, worksheet-AutoFilter, hyperlink-map,
1503
- imported-formula-metadata, and border-sidecar intersections fail closed because
1504
- those models still own coordinates outside the cell matrix. Moving large sorts,
1505
- large aggregate/rank scans, remaining advanced filter predicates, and
1506
- structural sidecar reconciliation into the Worker/WASM kernel remains Stage 3
1507
- work.
1501
+ An unfiltered accepted operation crosses the Fortune boundary as one range
1502
+ write and one controlled Undo record. A separate structural-owner planner
1503
+ recognizes the exact sortable range of one native table or worksheet AutoFilter
1504
+ from any contained selection. It excludes table totals, freezes the structural
1505
+ header, locks top-to-bottom movement, and carries the owner kind plus table ID
1506
+ when applicable. The command derives that fingerprint again at apply time;
1507
+ changed ownership fails before allocation or mutation.
1508
+
1509
+ Filter-active owned sorts use one controlled workbook replacement instead of a
1510
+ range write. The matrix engine returns its stable source-row permutation beside
1511
+ the translated cells. `spreadsheet-filter-reconciliation` evaluates typed
1512
+ worksheet and table criteria against the sorted dense/sparse sheet, remaps
1513
+ opaque Fortune value/color `rowhidden` ownership through that permutation, and
1514
+ rebuilds the combined hidden-row map while retaining independent manual rows.
1515
+ Fortune range reads that omit hidden rows fall back to the bounded controlled
1516
+ snapshot. Sort area and filter rescans have explicit one-million-cell budgets,
1517
+ and unrelated filters do not divert ordinary ranges from the native path.
1518
+
1519
+ Partial intersections that do not resolve to one exact structural owner, plus
1520
+ hyperlink-map, imported-formula-metadata, and border-sidecar intersections,
1521
+ still fail closed because those sidecars own coordinates outside the cell
1522
+ matrix. Moving large sorts, large aggregate/rank scans, remaining advanced
1523
+ filter predicates, and structural sidecar reconciliation into the Worker/WASM
1524
+ kernel remains Stage 3 work.
1508
1525
  Direct host focus of the native grid now enters the same bounded focus observer
1509
1526
  used by ribbon commands. If a controlled workbook update replaces the focused
1510
1527
  Fortune overlay, focus transfers to its connected replacement; deliberate
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a3s-lab/office",
3
- "version": "0.37.3",
3
+ "version": "0.37.4",
4
4
  "description": "Open-source collaborative browser editors for documents, Markdown, spreadsheets, presentations, and PDFs.",
5
5
  "keywords": [
6
6
  "office",
@@ -111,6 +111,7 @@
111
111
  "playground:visual:spreadsheet-row-sort": "playwright test visual-tests/spreadsheet-row-sort.functional.spec.ts --config playwright.config.ts",
112
112
  "playground:visual:spreadsheet-text-sort": "playwright test visual-tests/spreadsheet-text-sort.functional.spec.ts --config playwright.config.ts",
113
113
  "playground:visual:spreadsheet-sort-range": "playwright test visual-tests/spreadsheet-sort-range.functional.spec.ts --config playwright.config.ts",
114
+ "playground:visual:spreadsheet-owned-range-sort": "playwright test visual-tests/spreadsheet-owned-range-sort.functional.spec.ts --config playwright.config.ts",
114
115
  "playground:visual:spreadsheet-font-dialog-shortcuts": "playwright test visual-tests/spreadsheet-font-dialog-shortcuts.functional.spec.ts --config playwright.config.ts",
115
116
  "playground:visual:spreadsheet-diagonal-borders": "playwright test visual-tests/spreadsheet-diagonal-borders.functional.spec.ts --config playwright.config.ts",
116
117
  "playground:visual:spreadsheet-font-colors-shortcuts": "playwright test visual-tests/spreadsheet-font-colors-shortcuts.functional.spec.ts --config playwright.config.ts",
@@ -202,6 +203,8 @@
202
203
  "test:e2e:spreadsheet-text-sort:check": "a3s-test check tests/e2e/spreadsheet-text-sort.acl --json",
203
204
  "test:e2e:spreadsheet-sort-range": "A3S_TEST_SUITE=tests/e2e/spreadsheet-sort-range.acl bash scripts/run-a3s-test-web-gate.sh",
204
205
  "test:e2e:spreadsheet-sort-range:check": "a3s-test check tests/e2e/spreadsheet-sort-range.acl --json",
206
+ "test:e2e:spreadsheet-owned-range-sort": "A3S_TEST_SUITE=tests/e2e/spreadsheet-owned-range-sort.acl bash scripts/run-a3s-test-web-gate.sh",
207
+ "test:e2e:spreadsheet-owned-range-sort:check": "a3s-test check tests/e2e/spreadsheet-owned-range-sort.acl --json",
205
208
  "test:e2e:spreadsheet-cell-fill": "a3s-test run tests/e2e/spreadsheet-cell-fill.acl --json",
206
209
  "test:e2e:spreadsheet-cell-fill:check": "a3s-test check tests/e2e/spreadsheet-cell-fill.acl --json",
207
210
  "test:e2e:spreadsheet-auto-sum": "a3s-test run tests/e2e/spreadsheet-auto-sum.acl --json",