@a3s-lab/office 0.13.1 → 0.15.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 (50) hide show
  1. package/README.md +40 -5
  2. package/dist/0~7048.js +14 -4
  3. package/dist/0~spreadsheet-editor.js +14748 -8939
  4. package/dist/0~work-office-diagnostics.js +1 -1
  5. package/dist/{4476.js → 2180.js} +34 -1
  6. package/dist/4104.js +41 -19
  7. package/dist/core.js +1 -1
  8. package/dist/index.js +1 -1
  9. package/dist/internal/features/work/editors/office-checkbox.d.ts +3 -2
  10. package/dist/internal/features/work/editors/spreadsheet-auto-sum-command.d.ts +3 -0
  11. package/dist/internal/features/work/editors/spreadsheet-auto-sum.d.ts +19 -0
  12. package/dist/internal/features/work/editors/spreadsheet-cell-format-command.d.ts +3 -0
  13. package/dist/internal/features/work/editors/spreadsheet-cell-format.d.ts +36 -0
  14. package/dist/internal/features/work/editors/spreadsheet-cell-mutation-guard.d.ts +4 -0
  15. package/dist/internal/features/work/editors/spreadsheet-clipboard-shortcuts.d.ts +1 -0
  16. package/dist/internal/features/work/editors/spreadsheet-clipboard.d.ts +13 -0
  17. package/dist/internal/features/work/editors/spreadsheet-command-catalog.d.ts +142 -0
  18. package/dist/internal/features/work/editors/spreadsheet-command-controller.d.ts +56 -0
  19. package/dist/internal/features/work/editors/spreadsheet-context-menu.d.ts +5 -15
  20. package/dist/internal/features/work/editors/spreadsheet-data-validation-command.d.ts +3 -0
  21. package/dist/internal/features/work/editors/spreadsheet-data-validation-dialog.d.ts +9 -0
  22. package/dist/internal/features/work/editors/spreadsheet-data-validation.d.ts +50 -0
  23. package/dist/internal/features/work/editors/spreadsheet-editor-ribbon.d.ts +1 -2
  24. package/dist/internal/features/work/editors/spreadsheet-editor-support.d.ts +1 -0
  25. package/dist/internal/features/work/editors/spreadsheet-format-cells-dialog-model.d.ts +86 -0
  26. package/dist/internal/features/work/editors/spreadsheet-format-cells-dialog-panels.d.ts +15 -0
  27. package/dist/internal/features/work/editors/spreadsheet-format-cells-dialog.d.ts +8 -0
  28. package/dist/internal/features/work/editors/spreadsheet-go-to.d.ts +24 -0
  29. package/dist/internal/features/work/editors/spreadsheet-hyperlink-command.d.ts +3 -0
  30. package/dist/internal/features/work/editors/spreadsheet-hyperlink-dialog.d.ts +9 -0
  31. package/dist/internal/features/work/editors/spreadsheet-hyperlink.d.ts +44 -0
  32. package/dist/internal/features/work/editors/spreadsheet-keyboard-navigation.d.ts +4 -0
  33. package/dist/internal/features/work/editors/spreadsheet-navigation-command.d.ts +3 -0
  34. package/dist/internal/features/work/editors/spreadsheet-number-format-command.d.ts +24 -0
  35. package/dist/internal/features/work/editors/spreadsheet-paste-special-cell.d.ts +17 -0
  36. package/dist/internal/features/work/editors/spreadsheet-paste-special-dialog.d.ts +9 -0
  37. package/dist/internal/features/work/editors/spreadsheet-paste-special-mode.d.ts +11 -0
  38. package/dist/internal/features/work/editors/spreadsheet-paste-special-plan.d.ts +4 -0
  39. package/dist/internal/features/work/editors/spreadsheet-paste-special-sheet.d.ts +23 -0
  40. package/dist/internal/features/work/editors/spreadsheet-paste-special-snapshot.d.ts +10 -0
  41. package/dist/internal/features/work/editors/spreadsheet-paste-special-types.d.ts +127 -0
  42. package/dist/internal/features/work/editors/spreadsheet-paste-special.d.ts +7 -0
  43. package/dist/internal/features/work/editors/use-spreadsheet-clipboard.d.ts +36 -0
  44. package/dist/internal/features/work/editors/use-spreadsheet-data-validation.d.ts +23 -0
  45. package/dist/internal/features/work/editors/use-spreadsheet-hyperlink.d.ts +24 -0
  46. package/dist/internal/features/work/work-spreadsheet-data-validation.d.ts +2 -0
  47. package/dist/office-kernel.wasm +0 -0
  48. package/dist/styles.css +845 -1
  49. package/docs/latest/en/browser-editor-architecture.md +12 -1
  50. package/package.json +15 -3
@@ -2,14 +2,21 @@ import type { Cell, Selection, Sheet } from '@fortune-sheet/core';
2
2
  import { type SpreadsheetGridSize } from '../spreadsheet-sparse';
3
3
  import type { WorkSpreadsheetContent } from '../work-types';
4
4
  import { type OfficeEditorCanCommands, type OfficeEditorExtension } from './office-editor-extension';
5
+ import type { SpreadsheetAutoSumFunction } from './spreadsheet-auto-sum';
5
6
  import { type SpreadsheetCellClearMode } from './spreadsheet-cell-clear';
6
7
  import type { SpreadsheetCellBorderFormat } from './spreadsheet-cell-border';
8
+ import type { SpreadsheetCellFormatRequest } from './spreadsheet-cell-format';
9
+ import type { SpreadsheetCellRange } from './spreadsheet-cell-range';
7
10
  import type { SpreadsheetCellStyleChoice } from './spreadsheet-cell-style';
8
11
  import type { SpreadsheetCellFillDirection } from './spreadsheet-cell-fill';
12
+ import type { SpreadsheetDataValidationRequest, SpreadsheetDataValidationTarget } from './spreadsheet-data-validation';
9
13
  import { type SpreadsheetCellMergeCommand } from './spreadsheet-cell-merge';
10
14
  import type { SpreadsheetFormatPainterMode } from './spreadsheet-format-painter';
15
+ import type { SpreadsheetHyperlinkCell, SpreadsheetHyperlinkRequest } from './spreadsheet-hyperlink';
11
16
  import { type SpreadsheetFreezePanePreset } from './spreadsheet-freeze-panes';
12
17
  import { type SpreadsheetKeyboardSelection, type SpreadsheetSelectionMove, type SpreadsheetSelectionScope } from './spreadsheet-keyboard-navigation';
18
+ import type { SpreadsheetPasteContent } from './spreadsheet-paste-special';
19
+ import { type SpreadsheetDecimalPlacesDirection } from './spreadsheet-number-format-command';
13
20
  import { type SpreadsheetSheetMoveDirection } from './spreadsheet-sheet-model';
14
21
  export interface SpreadsheetWorkbookCommandPort {
15
22
  autoFillCell: (copyRange: SpreadsheetCommandRange, applyRange: SpreadsheetCommandRange, direction: SpreadsheetCellFillDirection) => void;
@@ -75,10 +82,14 @@ export interface SpreadsheetHistoryCommandPort {
75
82
  export interface SpreadsheetClipboardCommandPort {
76
83
  canCopySelection: boolean;
77
84
  canCutSelection: boolean;
85
+ canOpenPasteSpecial: boolean;
78
86
  canPasteSelection: boolean;
87
+ canPasteSpecial: (content: SpreadsheetPasteContent) => boolean;
79
88
  copySelection: () => boolean;
80
89
  cutSelection: () => boolean;
90
+ openPasteSpecial: () => boolean;
81
91
  pasteSelection: () => boolean;
92
+ pasteSpecial: (content: SpreadsheetPasteContent) => boolean;
82
93
  }
83
94
  export interface SpreadsheetAutoFilterCommandPort {
84
95
  active: boolean;
@@ -95,6 +106,33 @@ export interface SpreadsheetFormatPainterCommandPort {
95
106
  applySelection: (target: SpreadsheetCommandSelection) => boolean;
96
107
  cancel: () => boolean;
97
108
  }
109
+ export interface SpreadsheetFormatCellsOpenRequest {
110
+ sheetId: string;
111
+ range: SpreadsheetCellRange;
112
+ activeCell: {
113
+ row: number;
114
+ column: number;
115
+ };
116
+ cells: (Cell | null)[][];
117
+ }
118
+ export interface SpreadsheetFormatCellsCommandPort {
119
+ canOpen: boolean;
120
+ open: (request: SpreadsheetFormatCellsOpenRequest) => boolean;
121
+ }
122
+ export interface SpreadsheetDataValidationCommandPort {
123
+ canOpen: boolean;
124
+ open: (request: SpreadsheetDataValidationTarget) => boolean;
125
+ }
126
+ export interface SpreadsheetHyperlinkCommandPort {
127
+ canOpen: boolean;
128
+ open: (request: SpreadsheetHyperlinkCell) => boolean;
129
+ }
130
+ export interface SpreadsheetNavigationCommandPort {
131
+ canOpenFind: boolean;
132
+ canOpenGoTo: boolean;
133
+ openFind: () => boolean;
134
+ openGoTo: () => boolean;
135
+ }
98
136
  export interface SpreadsheetFormulaBarCommandPort {
99
137
  setValue: (value: unknown) => void;
100
138
  }
@@ -105,8 +143,13 @@ export interface SpreadsheetEditorCommands {
105
143
  activateSheet: (sheetId: string) => boolean;
106
144
  activateFormatPainter: (mode: SpreadsheetFormatPainterMode) => boolean;
107
145
  addSheet: () => boolean;
146
+ adjustDecimalPlaces: (direction: SpreadsheetDecimalPlacesDirection) => boolean;
108
147
  applyCellStyle: (preset: SpreadsheetCellStyleChoice) => boolean;
148
+ applyCellFormat: (request: SpreadsheetCellFormatRequest) => boolean;
149
+ applyDataValidation: (request: SpreadsheetDataValidationRequest) => boolean;
150
+ applyAutoSum: (functionName: SpreadsheetAutoSumFunction) => boolean;
109
151
  applyFormatPainter: (target: SpreadsheetCommandSelection) => boolean;
152
+ applyHyperlink: (request: SpreadsheetHyperlinkRequest) => boolean;
110
153
  cancelFormatPainter: () => boolean;
111
154
  clearSelectedCells: (mode?: SpreadsheetCellClearMode) => boolean;
112
155
  copySelection: () => boolean;
@@ -121,9 +164,18 @@ export interface SpreadsheetEditorCommands {
121
164
  moveSheet: (sheetId: string, direction: SpreadsheetSheetMoveDirection) => boolean;
122
165
  moveSelection: (move: SpreadsheetSelectionMove, extend: boolean) => boolean;
123
166
  openAutoFilterMenu: () => boolean;
167
+ openDataValidation: () => boolean;
168
+ openFind: () => boolean;
169
+ openFormatCells: () => boolean;
170
+ openGoTo: () => boolean;
171
+ openHyperlink: () => boolean;
172
+ openPasteSpecial: () => boolean;
124
173
  pasteCells: (values: readonly (readonly unknown[])[]) => boolean;
125
174
  pasteSelection: () => boolean;
175
+ pasteSpecial: (content: SpreadsheetPasteContent) => boolean;
126
176
  recalculateFormula: (scope: 'selection' | 'workbook') => boolean;
177
+ removeHyperlink: (target: SpreadsheetHyperlinkCell) => boolean;
178
+ removeDataValidation: (target: SpreadsheetDataValidationTarget) => boolean;
127
179
  renameSheet: (sheetId: string, name: string) => boolean;
128
180
  redo: () => boolean;
129
181
  setCellFormat: (attribute: keyof Cell, value: unknown) => boolean;
@@ -147,11 +199,15 @@ export interface SpreadsheetCommandContext {
147
199
  calculation: SpreadsheetCalculationCommandPort | null;
148
200
  clipboard: SpreadsheetClipboardCommandPort;
149
201
  content: WorkSpreadsheetContent;
202
+ dataValidation: SpreadsheetDataValidationCommandPort;
150
203
  editable: boolean;
151
204
  fallbackRange: SpreadsheetCommandRange;
152
205
  formulaBar: SpreadsheetFormulaBarCommandPort | null;
153
206
  formatPainter: SpreadsheetFormatPainterCommandPort;
207
+ formatCells: SpreadsheetFormatCellsCommandPort;
208
+ hyperlink: SpreadsheetHyperlinkCommandPort;
154
209
  history: SpreadsheetHistoryCommandPort | null;
210
+ navigation: SpreadsheetNavigationCommandPort;
155
211
  onChange: (content: WorkSpreadsheetContent) => void;
156
212
  selection: SpreadsheetCommandSelection | null;
157
213
  targetSheetGridSize?: SpreadsheetGridSize | null;
@@ -1,19 +1,14 @@
1
1
  import type { WorkspaceContextMenuItem } from '../../workspace/components/workspace-context-menu';
2
2
  import type { WorkSpreadsheetAgentSelection } from '../work-spreadsheet-agent-context';
3
3
  import type { SpreadsheetEditorCanCommands, SpreadsheetEditorCommands, SpreadsheetStructureAxis } from './spreadsheet-command-controller';
4
- type SpreadsheetContextCan = Pick<SpreadsheetEditorCanCommands, 'clearSelectedCells' | 'pasteCells'>;
5
- type SpreadsheetContextCommands = Pick<SpreadsheetEditorCommands, 'clearSelectedCells' | 'pasteCells'>;
4
+ type SpreadsheetContextCan = Pick<SpreadsheetEditorCanCommands, 'clearSelectedCells' | 'copySelection' | 'cutSelection' | 'openPasteSpecial' | 'pasteSelection'>;
5
+ type SpreadsheetContextCommands = Pick<SpreadsheetEditorCommands, 'clearSelectedCells' | 'copySelection' | 'cutSelection' | 'openPasteSpecial' | 'pasteSelection'>;
6
6
  type SpreadsheetStructureCan = Pick<SpreadsheetEditorCanCommands, 'deleteSelectedStructure' | 'insertSelectedStructure' | 'setSelectedStructureHidden' | 'setSelectedStructureSize' | 'sortSelectedCells'>;
7
7
  type SpreadsheetStructureCommands = Pick<SpreadsheetEditorCommands, 'deleteSelectedStructure' | 'insertSelectedStructure' | 'setSelectedStructureHidden' | 'setSelectedStructureSize' | 'sortSelectedCells'>;
8
8
  type SpreadsheetSortCan = Pick<SpreadsheetEditorCanCommands, 'sortSelectedCells'>;
9
9
  type SpreadsheetSortCommands = Pick<SpreadsheetEditorCommands, 'sortSelectedCells'>;
10
- export interface SpreadsheetClipboardPort {
11
- readText(): Promise<string>;
12
- writeText(value: string): Promise<void>;
13
- }
14
- export declare function spreadsheetCoreContextMenuItems({ can, clipboard, commands, selection, }: {
10
+ export declare function spreadsheetCoreContextMenuItems({ can, commands, selection, }: {
15
11
  can: SpreadsheetContextCan;
16
- clipboard?: SpreadsheetClipboardPort;
17
12
  commands: SpreadsheetContextCommands;
18
13
  selection: Pick<WorkSpreadsheetAgentSelection, 'clipboard' | 'reference'>;
19
14
  }): WorkspaceContextMenuItem[];
@@ -29,10 +24,5 @@ export declare function spreadsheetSortContextMenuItems({ can, commands, idSuffi
29
24
  idSuffix?: string;
30
25
  separatorBefore?: boolean;
31
26
  }): WorkspaceContextMenuItem[];
32
- export declare function parseSpreadsheetClipboardText(value: string): string[][];
33
- export declare const browserSpreadsheetClipboard: SpreadsheetClipboardPort;
34
- export declare function readSpreadsheetClipboardText(readSystem: (() => Promise<string>) | undefined, readLocal: () => string, timeoutMs?: number, canReadSystem?: () => boolean | Promise<boolean>): Promise<string>;
35
- export declare function writeSpreadsheetClipboardText(value: string, writeSystem: ((value: string) => Promise<void>) | undefined, writeLocal: (value: string) => void, timeoutMs?: number): Promise<void>;
36
- export declare function copySpreadsheetSelection(clipboard: SpreadsheetClipboardPort, value: string, cut: boolean): Promise<boolean>;
37
- export declare function pasteSpreadsheetSelection(clipboard: SpreadsheetClipboardPort, paste: SpreadsheetContextCommands['pasteCells']): Promise<void>;
38
- export {};
27
+ export { browserSpreadsheetClipboard, copySpreadsheetSelection, parseSpreadsheetClipboardText, readSpreadsheetClipboardText, writeSpreadsheetClipboardText, } from './spreadsheet-clipboard';
28
+ export type { SpreadsheetClipboardPort } from './spreadsheet-clipboard';
@@ -0,0 +1,3 @@
1
+ import type { SpreadsheetCommandContext, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
2
+ import { type OfficeEditorExtension } from './office-editor-extension';
3
+ export declare function createSpreadsheetDataValidationExtension(): OfficeEditorExtension<SpreadsheetCommandContext, SpreadsheetEditorCommands>;
@@ -0,0 +1,9 @@
1
+ import { type SpreadsheetDataValidationDialogSource, type SpreadsheetDataValidationDialogValue } from './spreadsheet-data-validation';
2
+ export declare function SpreadsheetDataValidationDialog({ source, restoreFocusTarget, onApply, onClose, onRemove, onValidate, }: {
3
+ source: SpreadsheetDataValidationDialogSource;
4
+ restoreFocusTarget: () => HTMLElement | null;
5
+ onApply: (value: SpreadsheetDataValidationDialogValue) => boolean;
6
+ onClose: () => void;
7
+ onRemove: () => boolean;
8
+ onValidate: (value: SpreadsheetDataValidationDialogValue) => string | null;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,50 @@
1
+ import type { WorkSpreadsheetContent, WorkSpreadsheetDataValidationItem, WorkSpreadsheetSheet } from '../work-types';
2
+ import { type SpreadsheetCellRange } from './spreadsheet-cell-range';
3
+ export declare const MAX_SPREADSHEET_DATA_VALIDATION_CELLS = 10000;
4
+ export type SpreadsheetDataValidationType = 'date' | 'dropdown' | 'number' | 'number_integer' | 'text_length';
5
+ export type SpreadsheetDataValidationOperator = 'between' | 'equal' | 'greaterOrEqualTo' | 'lessThan' | 'lessThanOrEqualTo' | 'moreThanThe' | 'noEarlierThan' | 'noLaterThan' | 'notBetween' | 'notEqualTo' | 'earlierThan' | 'laterThan';
6
+ export interface SpreadsheetDataValidationDialogValue {
7
+ hintShow: boolean;
8
+ hintValue: string;
9
+ prohibitInput: boolean;
10
+ type: SpreadsheetDataValidationType;
11
+ type2: SpreadsheetDataValidationOperator | '';
12
+ value1: string;
13
+ value2: string;
14
+ }
15
+ export interface SpreadsheetDataValidationTarget {
16
+ activeCell: {
17
+ row: number;
18
+ column: number;
19
+ };
20
+ ranges: readonly SpreadsheetCellRange[];
21
+ sheetId: string;
22
+ }
23
+ export interface SpreadsheetDataValidationRequest extends SpreadsheetDataValidationTarget {
24
+ value: SpreadsheetDataValidationDialogValue;
25
+ }
26
+ export interface SpreadsheetDataValidationDialogSource extends SpreadsheetDataValidationTarget {
27
+ hasValidation: boolean;
28
+ mixed: boolean;
29
+ rangeReference: string;
30
+ sheetName: string;
31
+ value: SpreadsheetDataValidationDialogValue;
32
+ }
33
+ export type SpreadsheetDataValidationResult = {
34
+ item: WorkSpreadsheetDataValidationItem;
35
+ ok: true;
36
+ ranges: SpreadsheetCellRange[];
37
+ sheet: WorkSpreadsheetSheet;
38
+ } | {
39
+ code: SpreadsheetDataValidationErrorCode;
40
+ message: string;
41
+ ok: false;
42
+ };
43
+ export type SpreadsheetDataValidationErrorCode = 'invalid-date' | 'invalid-list-source' | 'invalid-number' | 'invalid-operator' | 'invalid-range' | 'invalid-text-length' | 'missing-value' | 'multiple-list-columns' | 'out-of-bounds' | 'protected-range' | 'range-too-large' | 'sheet-not-found' | 'value-order';
44
+ export declare function spreadsheetDataValidationOperators(type: SpreadsheetDataValidationType): readonly SpreadsheetDataValidationOperator[];
45
+ export declare function createSpreadsheetDataValidationDialogSource(content: WorkSpreadsheetContent, target: SpreadsheetDataValidationTarget): SpreadsheetDataValidationDialogSource | null;
46
+ export declare function validateSpreadsheetDataValidationRequest(content: WorkSpreadsheetContent, request: SpreadsheetDataValidationRequest): SpreadsheetDataValidationResult;
47
+ export declare function applySpreadsheetDataValidation(content: WorkSpreadsheetContent, request: SpreadsheetDataValidationRequest): WorkSpreadsheetContent | null;
48
+ export declare function removeSpreadsheetDataValidation(content: WorkSpreadsheetContent, target: SpreadsheetDataValidationTarget): WorkSpreadsheetContent | null;
49
+ export declare function canRemoveSpreadsheetDataValidation(content: WorkSpreadsheetContent, target: SpreadsheetDataValidationTarget): boolean;
50
+ export declare function spreadsheetDataValidationFailureMessage(content: WorkSpreadsheetContent, request: SpreadsheetDataValidationRequest): string | null;
@@ -7,7 +7,7 @@ import type { SpreadsheetFormatPainterMode } from './spreadsheet-format-painter'
7
7
  import type { SpreadsheetWorkbookPanelView } from './spreadsheet-workbook-panel';
8
8
  import { type WorkOfficeFileAction } from './work-office-chrome';
9
9
  export type { SpreadsheetRibbonTabId } from './spreadsheet-command-catalog';
10
- export declare function SpreadsheetEditorRibbon({ activeTab, autoFilterActive, can, commands, content, fileActions, findOpen, formatPainterMode, freezePanesActive, freezePanesSelection, gridLinesVisible, panelId, onOpenFind, onTabChange, onTogglePanel, panel, toolbarCell, toolbarCellBorders, }: {
10
+ export declare function SpreadsheetEditorRibbon({ activeTab, autoFilterActive, can, commands, content, fileActions, findOpen, formatPainterMode, freezePanesActive, freezePanesSelection, gridLinesVisible, panelId, onTabChange, onTogglePanel, panel, toolbarCell, toolbarCellBorders, }: {
11
11
  activeTab: SpreadsheetRibbonTabId;
12
12
  autoFilterActive?: boolean;
13
13
  can: SpreadsheetEditorCanCommands;
@@ -20,7 +20,6 @@ export declare function SpreadsheetEditorRibbon({ activeTab, autoFilterActive, c
20
20
  freezePanesSelection?: Selection;
21
21
  gridLinesVisible: boolean;
22
22
  panelId: string;
23
- onOpenFind: () => void;
24
23
  onTabChange: (tab: SpreadsheetRibbonTabId) => void;
25
24
  onTogglePanel: (panel: SpreadsheetWorkbookPanelView, trigger: HTMLButtonElement) => void;
26
25
  panel: SpreadsheetWorkbookPanelView | null;
@@ -32,6 +32,7 @@ export declare function sameSpreadsheetWorkbookState(changed: WorkSpreadsheetCon
32
32
  export declare function sameSpreadsheetWorkbookStateAfterOperations(changed: WorkSpreadsheetContent['sheets'], rendered: WorkSpreadsheetContent['sheets'], operations: readonly Op[]): boolean | null;
33
33
  export declare function sameSpreadsheetHistoryContent(left: WorkSpreadsheetContent, right: WorkSpreadsheetContent): boolean;
34
34
  export declare function spreadsheetContentWithSelection(content: WorkSpreadsheetContent, sheetId: string, selection: Selection | null | undefined): WorkSpreadsheetContent;
35
+ export declare function spreadsheetContentWithSelections(content: WorkSpreadsheetContent, sheetId: string, selections: readonly Selection[]): WorkSpreadsheetContent;
35
36
  export declare function isSpreadsheetNativeTextUndoTarget(target: EventTarget | null): boolean;
36
37
  export declare function isSpreadsheetCellEditingTarget(target: EventTarget | null): boolean;
37
38
  export declare function spreadsheetFormulaBarSelectAllTarget(event: KeyboardEvent): HTMLElement | null;
@@ -0,0 +1,86 @@
1
+ import type { Cell } from '@fortune-sheet/core';
2
+ import type { WorkSpreadsheetContent } from '../work-types';
3
+ import { type SpreadsheetCellBorderFormat, type SpreadsheetCellBorderStyle } from './spreadsheet-cell-border';
4
+ import { type SpreadsheetCellFormatPatch, type SpreadsheetHorizontalAlignment, type SpreadsheetVerticalAlignment } from './spreadsheet-cell-format';
5
+ import { type SpreadsheetCellRange } from './spreadsheet-cell-range';
6
+ export declare const spreadsheetFormatCellsTabs: readonly [{
7
+ readonly id: "number";
8
+ readonly label: "数字";
9
+ }, {
10
+ readonly id: "alignment";
11
+ readonly label: "对齐";
12
+ }, {
13
+ readonly id: "font";
14
+ readonly label: "字体";
15
+ }, {
16
+ readonly id: "border";
17
+ readonly label: "边框";
18
+ }, {
19
+ readonly id: "fill";
20
+ readonly label: "填充";
21
+ }, {
22
+ readonly id: "protection";
23
+ readonly label: "保护";
24
+ }];
25
+ export type SpreadsheetFormatCellsTabId = (typeof spreadsheetFormatCellsTabs)[number]['id'];
26
+ export interface SpreadsheetFormatCellsField<T> {
27
+ value: T;
28
+ mixed: boolean;
29
+ }
30
+ export interface SpreadsheetFormatCellsFields {
31
+ numberFormat: SpreadsheetFormatCellsField<string>;
32
+ horizontalAlignment: SpreadsheetFormatCellsField<SpreadsheetHorizontalAlignment>;
33
+ verticalAlignment: SpreadsheetFormatCellsField<SpreadsheetVerticalAlignment>;
34
+ wrapText: SpreadsheetFormatCellsField<boolean>;
35
+ rotation: SpreadsheetFormatCellsField<number>;
36
+ fontFamily: SpreadsheetFormatCellsField<string>;
37
+ fontSize: SpreadsheetFormatCellsField<number>;
38
+ fontColor: SpreadsheetFormatCellsField<string>;
39
+ bold: SpreadsheetFormatCellsField<boolean>;
40
+ italic: SpreadsheetFormatCellsField<boolean>;
41
+ underline: SpreadsheetFormatCellsField<boolean>;
42
+ strike: SpreadsheetFormatCellsField<boolean>;
43
+ fillColor: SpreadsheetFormatCellsField<string | null>;
44
+ borders: SpreadsheetFormatCellsField<readonly SpreadsheetCellBorderFormat[]>;
45
+ locked: SpreadsheetFormatCellsField<boolean>;
46
+ hidden: SpreadsheetFormatCellsField<boolean>;
47
+ }
48
+ export interface SpreadsheetFormatCellsDialogSource {
49
+ sheetId: string;
50
+ range: SpreadsheetCellRange;
51
+ activeCell: Cell | null;
52
+ fields: SpreadsheetFormatCellsFields;
53
+ }
54
+ export interface SpreadsheetFormatCellsDraft {
55
+ numberFormat: string;
56
+ horizontalAlignment: SpreadsheetHorizontalAlignment;
57
+ verticalAlignment: SpreadsheetVerticalAlignment;
58
+ wrapText: boolean;
59
+ rotation: number;
60
+ fontFamily: string;
61
+ fontSize: number;
62
+ fontColor: string;
63
+ bold: boolean;
64
+ italic: boolean;
65
+ underline: boolean;
66
+ strike: boolean;
67
+ fillColor: string | null;
68
+ borders: SpreadsheetCellBorderFormat[];
69
+ borderColor: string;
70
+ borderStyle: SpreadsheetCellBorderStyle;
71
+ locked: boolean;
72
+ hidden: boolean;
73
+ }
74
+ export type SpreadsheetFormatCellsTouched = Partial<Record<keyof SpreadsheetCellFormatPatch, true>>;
75
+ export interface SpreadsheetFormatCellsDraftErrors {
76
+ numberFormat?: string;
77
+ fontSize?: string;
78
+ rotation?: string;
79
+ }
80
+ export declare function createSpreadsheetFormatCellsDialogSource(content: WorkSpreadsheetContent, sheetId: string, rangeInput: SpreadsheetCellRange, cells: readonly (readonly (Cell | null)[])[], requestedActiveCell: {
81
+ row: number;
82
+ column: number;
83
+ }): SpreadsheetFormatCellsDialogSource | null;
84
+ export declare function createSpreadsheetFormatCellsDraft(source: SpreadsheetFormatCellsDialogSource): SpreadsheetFormatCellsDraft;
85
+ export declare function spreadsheetFormatCellsPatch(source: SpreadsheetFormatCellsDialogSource, draft: SpreadsheetFormatCellsDraft, touched: SpreadsheetFormatCellsTouched): SpreadsheetCellFormatPatch;
86
+ export declare function spreadsheetFormatCellsDraftErrors(draft: SpreadsheetFormatCellsDraft): SpreadsheetFormatCellsDraftErrors;
@@ -0,0 +1,15 @@
1
+ import type { Dispatch, SetStateAction } from 'react';
2
+ import type { SpreadsheetCellFormatPatch } from './spreadsheet-cell-format';
3
+ import type { SpreadsheetFormatCellsDialogSource, SpreadsheetFormatCellsDraft, SpreadsheetFormatCellsDraftErrors, SpreadsheetFormatCellsTabId, SpreadsheetFormatCellsTouched } from './spreadsheet-format-cells-dialog-model';
4
+ interface PanelProps {
5
+ activeTab: SpreadsheetFormatCellsTabId;
6
+ idBase: string;
7
+ source: SpreadsheetFormatCellsDialogSource;
8
+ draft: SpreadsheetFormatCellsDraft;
9
+ errors: SpreadsheetFormatCellsDraftErrors;
10
+ touched: SpreadsheetFormatCellsTouched;
11
+ setDraft: Dispatch<SetStateAction<SpreadsheetFormatCellsDraft>>;
12
+ touch: (field: keyof SpreadsheetCellFormatPatch) => void;
13
+ }
14
+ export declare function SpreadsheetFormatCellsPanel(props: PanelProps): import("react").JSX.Element;
15
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { SpreadsheetCellFormatPatch } from './spreadsheet-cell-format';
2
+ import { type SpreadsheetFormatCellsDialogSource } from './spreadsheet-format-cells-dialog-model';
3
+ export declare function SpreadsheetFormatCellsDialog({ source, restoreFocusTarget, onApply, onClose, }: {
4
+ source: SpreadsheetFormatCellsDialogSource;
5
+ restoreFocusTarget: () => HTMLElement | null;
6
+ onApply: (patch: SpreadsheetCellFormatPatch) => boolean;
7
+ onClose: () => void;
8
+ }): import("react").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import type { WorkSpreadsheetContent } from '../work-types';
2
+ import type { SpreadsheetCellRange } from './spreadsheet-cell-range';
3
+ export type SpreadsheetGoToErrorCode = 'ambiguous-name' | 'empty' | 'hidden-sheet' | 'invalid-reference' | 'multiple-ranges' | 'out-of-bounds' | 'sheet-not-found' | 'unsupported-name';
4
+ export interface SpreadsheetGoToTarget {
5
+ displayReference: string;
6
+ name?: string;
7
+ range: SpreadsheetCellRange;
8
+ selection: SpreadsheetCellRange & {
9
+ row_focus: number;
10
+ column_focus: number;
11
+ };
12
+ sheetId: string;
13
+ source: 'named-range' | 'reference';
14
+ }
15
+ export type SpreadsheetGoToResolution = {
16
+ ok: true;
17
+ target: SpreadsheetGoToTarget;
18
+ } | {
19
+ ok: false;
20
+ code: SpreadsheetGoToErrorCode;
21
+ message: string;
22
+ };
23
+ export declare function resolveSpreadsheetGoToTarget(content: WorkSpreadsheetContent, activeSheetId: string, input: string): SpreadsheetGoToResolution;
24
+ export declare function spreadsheetGoToValidationMessage(content: WorkSpreadsheetContent, activeSheetId: string, input: string): string | null;
@@ -0,0 +1,3 @@
1
+ import type { SpreadsheetCommandContext, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
2
+ import { type OfficeEditorExtension } from './office-editor-extension';
3
+ export declare function createSpreadsheetHyperlinkExtension(): OfficeEditorExtension<SpreadsheetCommandContext, SpreadsheetEditorCommands>;
@@ -0,0 +1,9 @@
1
+ import type { SpreadsheetHyperlinkDialogSource, SpreadsheetHyperlinkDialogValue } from './spreadsheet-hyperlink';
2
+ export declare function SpreadsheetHyperlinkDialog({ source, restoreFocusTarget, onApply, onClose, onRemove, onValidate, }: {
3
+ source: SpreadsheetHyperlinkDialogSource;
4
+ restoreFocusTarget: () => HTMLElement | null;
5
+ onApply: (value: SpreadsheetHyperlinkDialogValue) => boolean;
6
+ onClose: () => void;
7
+ onRemove: () => boolean;
8
+ onValidate: (value: SpreadsheetHyperlinkDialogValue) => string | null;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,44 @@
1
+ import type { WorkSpreadsheetContent } from '../work-types';
2
+ export type SpreadsheetHyperlinkType = 'webpage' | 'cellrange' | 'sheet';
3
+ export interface SpreadsheetHyperlinkTarget {
4
+ linkType: SpreadsheetHyperlinkType;
5
+ linkAddress: string;
6
+ }
7
+ export interface SpreadsheetHyperlinkCell {
8
+ sheetId: string;
9
+ row: number;
10
+ column: number;
11
+ }
12
+ export interface SpreadsheetHyperlinkRequest extends SpreadsheetHyperlinkCell {
13
+ linkType: SpreadsheetHyperlinkType;
14
+ linkAddress: string;
15
+ displayText?: string;
16
+ }
17
+ export type SpreadsheetHyperlinkDialogValue = Pick<SpreadsheetHyperlinkRequest, 'linkType' | 'linkAddress' | 'displayText'>;
18
+ export type SpreadsheetHyperlinkErrorCode = 'empty-address' | 'formula-display-text' | 'invalid-cell-range' | 'invalid-display-text' | 'invalid-web-address' | 'pivot-cell' | 'protected-cell' | 'source-out-of-bounds' | 'source-sheet-not-found' | 'target-out-of-bounds' | 'target-sheet-hidden' | 'target-sheet-not-found' | 'unsupported-link-type';
19
+ export type SpreadsheetHyperlinkValidation = {
20
+ ok: true;
21
+ target: SpreadsheetHyperlinkTarget;
22
+ displayText?: string;
23
+ } | {
24
+ ok: false;
25
+ code: SpreadsheetHyperlinkErrorCode;
26
+ message: string;
27
+ };
28
+ export interface SpreadsheetHyperlinkDialogSource extends SpreadsheetHyperlinkCell {
29
+ sheetName: string;
30
+ cellReference: string;
31
+ displayText: string;
32
+ displayTextEditable: boolean;
33
+ hasHyperlink: boolean;
34
+ link: SpreadsheetHyperlinkTarget | null;
35
+ sheetOptions: Array<{
36
+ id: string;
37
+ name: string;
38
+ }>;
39
+ }
40
+ export declare function validateSpreadsheetHyperlinkRequest(content: WorkSpreadsheetContent, request: SpreadsheetHyperlinkRequest): SpreadsheetHyperlinkValidation;
41
+ export declare function applySpreadsheetHyperlink(content: WorkSpreadsheetContent, request: SpreadsheetHyperlinkRequest): WorkSpreadsheetContent | null;
42
+ export declare function removeSpreadsheetHyperlink(content: WorkSpreadsheetContent, target: SpreadsheetHyperlinkCell): WorkSpreadsheetContent | null;
43
+ export declare function canRemoveSpreadsheetHyperlink(content: WorkSpreadsheetContent, target: SpreadsheetHyperlinkCell): boolean;
44
+ export declare function createSpreadsheetHyperlinkDialogSource(content: WorkSpreadsheetContent, target: SpreadsheetHyperlinkCell): SpreadsheetHyperlinkDialogSource | null;
@@ -16,3 +16,7 @@ export declare function spreadsheetSelectionContainsFocus(selection: Spreadsheet
16
16
  column: number;
17
17
  row: number;
18
18
  }): boolean;
19
+ export declare function spreadsheetSheetBounds(sheet: WorkSpreadsheetSheet): {
20
+ lastColumn: number;
21
+ lastRow: number;
22
+ };
@@ -0,0 +1,3 @@
1
+ import type { SpreadsheetCommandContext, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
2
+ import { type OfficeEditorExtension } from './office-editor-extension';
3
+ export declare function createSpreadsheetNavigationExtension(): OfficeEditorExtension<SpreadsheetCommandContext, SpreadsheetEditorCommands>;
@@ -0,0 +1,24 @@
1
+ import type { Cell } from '@fortune-sheet/core';
2
+ import type { WorkSpreadsheetContent } from '../work-types';
3
+ import { type SpreadsheetCellRange, type SpreadsheetCellRangeInput } from './spreadsheet-cell-range';
4
+ import type { SpreadsheetCommandContext, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
5
+ import { type OfficeEditorExtension } from './office-editor-extension';
6
+ export type SpreadsheetDecimalPlacesDirection = 'decrease' | 'increase';
7
+ export declare const MAX_SPREADSHEET_DECIMAL_FORMAT_CELLS = 10000;
8
+ export interface SpreadsheetDecimalFormatApiCall {
9
+ name: 'setCellFormatByRange';
10
+ args: [
11
+ 'ct',
12
+ NonNullable<Cell['ct']> & {
13
+ fa: string;
14
+ t: string;
15
+ },
16
+ SpreadsheetCellRange,
17
+ {
18
+ id: string;
19
+ }
20
+ ];
21
+ }
22
+ export declare function createSpreadsheetNumberFormatExtension(): OfficeEditorExtension<SpreadsheetCommandContext, SpreadsheetEditorCommands>;
23
+ export declare function canAdjustSpreadsheetDecimalPlaces(content: WorkSpreadsheetContent, sheetId: string, range: SpreadsheetCellRangeInput, direction: SpreadsheetDecimalPlacesDirection): boolean;
24
+ export declare function spreadsheetDecimalFormatApiCalls(cells: readonly (readonly (Cell | null)[])[], range: SpreadsheetCellRangeInput, sheetId: string, direction: SpreadsheetDecimalPlacesDirection): SpreadsheetDecimalFormatApiCall[];
@@ -0,0 +1,17 @@
1
+ import type { Cell } from '@fortune-sheet/core';
2
+ import type { SpreadsheetClipboardCell, SpreadsheetPasteContent, SpreadsheetPasteOperation } from './spreadsheet-paste-special-types';
3
+ export declare const spreadsheetPasteCellInvalid: unique symbol;
4
+ export type SpreadsheetPasteCellResult = Cell | null | typeof spreadsheetPasteCellInvalid;
5
+ export declare function pasteSpreadsheetSpecialCell({ source, destination, content, operation, rowOffset, columnOffset, }: {
6
+ source: SpreadsheetClipboardCell;
7
+ destination: Cell | null | undefined;
8
+ content: SpreadsheetPasteContent;
9
+ operation: SpreadsheetPasteOperation;
10
+ rowOffset: number;
11
+ columnOffset: number;
12
+ }): SpreadsheetPasteCellResult;
13
+ export declare function spreadsheetClipboardCellIsBlank(source: SpreadsheetClipboardCell, content: SpreadsheetPasteContent): boolean;
14
+ export declare function spreadsheetPasteContentSupportsOperation(content: SpreadsheetPasteContent): boolean;
15
+ export declare function numericSpreadsheetCellValue(cell: Cell | null | undefined): number | null;
16
+ export declare function spreadsheetCellHasContent(cell: Cell | null | undefined): boolean;
17
+ export declare function translateSpreadsheetFormula(formula: string, rowOffset: number, columnOffset: number): string | null;
@@ -0,0 +1,9 @@
1
+ import { type SpreadsheetPasteSpecialOptions } from './spreadsheet-paste-special';
2
+ import type { SpreadsheetPasteSpecialDialogSource } from './use-spreadsheet-clipboard';
3
+ export declare function SpreadsheetPasteSpecialDialog({ source, restoreFocusTarget, onApply, onClose, onValidate, }: {
4
+ source: SpreadsheetPasteSpecialDialogSource;
5
+ restoreFocusTarget: () => HTMLElement | null;
6
+ onApply: (options: SpreadsheetPasteSpecialOptions) => boolean;
7
+ onClose: () => void;
8
+ onValidate: (options: SpreadsheetPasteSpecialOptions) => string | null;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import type { WorkSpreadsheetSheet } from '../work-types';
2
+ import type { SpreadsheetPasteContent } from './spreadsheet-paste-special-types';
3
+ export declare function pasteContentCopiesFormulas(content: SpreadsheetPasteContent): boolean;
4
+ export declare function pasteContentCopiesBorders(content: SpreadsheetPasteContent): boolean;
5
+ export declare function pasteContentCopiesMerges(content: SpreadsheetPasteContent): boolean;
6
+ export declare function pasteContentCopiesValidation(content: SpreadsheetPasteContent): boolean;
7
+ export declare function pasteContentCopiesHyperlinks(content: SpreadsheetPasteContent): boolean;
8
+ export declare function pasteContentCopiesProtection(content: SpreadsheetPasteContent): boolean;
9
+ export declare function columnsContainReadOnlyState(sheet: WorkSpreadsheetSheet, range: {
10
+ column: [number, number];
11
+ }): boolean;
@@ -0,0 +1,4 @@
1
+ import type { SpreadsheetCellRange } from './spreadsheet-cell-range';
2
+ import { type SpreadsheetClipboardSnapshot, type SpreadsheetPastePlan, type SpreadsheetPasteSource } from './spreadsheet-paste-special-types';
3
+ export declare function planSpreadsheetPaste(snapshot: SpreadsheetClipboardSnapshot, selection: SpreadsheetCellRange, transpose: boolean): SpreadsheetPastePlan | null;
4
+ export declare function spreadsheetPasteSourceAt(snapshot: SpreadsheetClipboardSnapshot, plan: SpreadsheetPastePlan, row: number, column: number, transpose: boolean): SpreadsheetPasteSource;
@@ -0,0 +1,23 @@
1
+ import type { WorkSpreadsheetContent, WorkSpreadsheetSheet } from '../work-types';
2
+ import { type SpreadsheetCellRange } from './spreadsheet-cell-range';
3
+ import type { SpreadsheetCellWriter, SpreadsheetClipboardSnapshot, SpreadsheetPastePlan, SpreadsheetPasteSpecialOptions } from './spreadsheet-paste-special-types';
4
+ type NativeMerge = {
5
+ r: number;
6
+ c: number;
7
+ rs: number;
8
+ cs: number;
9
+ };
10
+ export declare function applySpreadsheetPasteSheetMetadata(sheet: WorkSpreadsheetSheet, snapshot: SpreadsheetClipboardSnapshot, plan: SpreadsheetPastePlan, processed: Array<{
11
+ row: number;
12
+ column: number;
13
+ }>, options: SpreadsheetPasteSpecialOptions): WorkSpreadsheetSheet;
14
+ export declare function applySpreadsheetPasteBorders(content: WorkSpreadsheetContent, sheetId: string, snapshot: SpreadsheetClipboardSnapshot, plan: SpreadsheetPastePlan, processed: Array<{
15
+ row: number;
16
+ column: number;
17
+ }>, transpose: boolean): WorkSpreadsheetContent;
18
+ export declare function applySpreadsheetPasteMerges(writer: SpreadsheetCellWriter, snapshot: SpreadsheetClipboardSnapshot, plan: SpreadsheetPastePlan, transpose: boolean): Record<string, NativeMerge>;
19
+ export declare function withSpreadsheetPasteMerges(sheet: WorkSpreadsheetSheet, merges: Record<string, NativeMerge>): WorkSpreadsheetSheet;
20
+ export declare function pasteSpreadsheetColumnWidths(sheet: WorkSpreadsheetSheet, snapshot: SpreadsheetClipboardSnapshot, plan: SpreadsheetPastePlan): WorkSpreadsheetSheet;
21
+ export declare function createSpreadsheetCellWriter(source: WorkSpreadsheetSheet): SpreadsheetCellWriter;
22
+ export declare function withSpreadsheetPasteSelection(sheet: WorkSpreadsheetSheet, range: SpreadsheetCellRange): WorkSpreadsheetSheet;
23
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { Cell } from '@fortune-sheet/core';
2
+ import type { WorkSpreadsheetContent, WorkSpreadsheetSheet } from '../work-types';
3
+ import { type SpreadsheetCellRangeInput } from './spreadsheet-cell-range';
4
+ import { type SpreadsheetClipboardSnapshot, type SpreadsheetPasteContent } from './spreadsheet-paste-special-types';
5
+ export declare function captureSpreadsheetClipboardSnapshot(content: WorkSpreadsheetContent, sheetId: string, selection: SpreadsheetCellRangeInput, plainText: string): SpreadsheetClipboardSnapshot | null;
6
+ export declare function createSpreadsheetTextClipboardSnapshot(plainText: string): SpreadsheetClipboardSnapshot | null;
7
+ export declare function spreadsheetPasteSpecialModeAvailable(snapshot: SpreadsheetClipboardSnapshot, content: SpreadsheetPasteContent): boolean;
8
+ export declare function validSpreadsheetClipboardSnapshot(snapshot: SpreadsheetClipboardSnapshot): boolean;
9
+ export declare function createSpreadsheetCellReader(sheet: WorkSpreadsheetSheet): (row: number, column: number) => Cell | null | undefined;
10
+ export declare function normalizeSpreadsheetClipboardText(value: string): string;