import type { Cell, Selection, Sheet } from '@fortune-sheet/core'; import type { SpreadsheetGridSize } from '../spreadsheet-sparse'; import type { SpreadsheetTextOrientationId } from '../work-spreadsheet-text-orientation'; import type { WorkSpreadsheetContent } from '../work-types'; import { type OfficeEditorCanCommands, type OfficeEditorExtension } from './office-editor-extension'; import type { SpreadsheetAutoSumFunction } from './spreadsheet-auto-sum'; import type { SpreadsheetAutoFilterCriteriaRequest, SpreadsheetAutoFilterTarget } from './spreadsheet-auto-filter'; import type { SpreadsheetCellBorderFormat } from './spreadsheet-cell-border'; import { type SpreadsheetCellClearMode } from './spreadsheet-cell-clear'; import type { SpreadsheetCellFillDirection } from './spreadsheet-cell-fill'; import type { SpreadsheetCellFormatRequest } from './spreadsheet-cell-format'; import { type SpreadsheetCellMergeCommand } from './spreadsheet-cell-merge'; import type { SpreadsheetCellRange } from './spreadsheet-cell-range'; import type { SpreadsheetCellStyleChoice } from './spreadsheet-cell-style'; import type { SpreadsheetCopyFromAboveKind } from './spreadsheet-copy-from-above'; import type { SpreadsheetDataValidationRequest, SpreadsheetDataValidationTarget } from './spreadsheet-data-validation'; import { type SpreadsheetDateTimeKind } from './spreadsheet-date-time-command'; import { type SpreadsheetFontSizeDirection } from './spreadsheet-font-size-command'; import type { SpreadsheetFormatCellsOpenIntent } from './spreadsheet-format-cells-intent'; import type { SpreadsheetFormatPainterMode } from './spreadsheet-format-painter'; import { type SpreadsheetFreezePanePreset } from './spreadsheet-freeze-panes'; import type { SpreadsheetHyperlinkCell, SpreadsheetHyperlinkRequest } from './spreadsheet-hyperlink'; import type { SpreadsheetKeyboardSelection, SpreadsheetSelectionMove, SpreadsheetSelectionScope } from './spreadsheet-keyboard-navigation'; import { type SpreadsheetDecimalPlacesDirection } from './spreadsheet-number-format-command'; import type { SpreadsheetPasteContent } from './spreadsheet-paste-special'; import type { SpreadsheetRichTextToggleAttribute } from './spreadsheet-rich-text-selection-format'; import { type SpreadsheetSheetMoveDirection } from './spreadsheet-sheet-model'; import type { SpreadsheetSortDirection, SpreadsheetSortOpenRequest, SpreadsheetSortRequest } from './spreadsheet-sort'; import type { SpreadsheetTableDesignPatch, SpreadsheetTableRequest, SpreadsheetTableTarget } from './spreadsheet-table'; export interface SpreadsheetWorkbookCommandPort { autoFillCell: (copyRange: SpreadsheetCommandRange, applyRange: SpreadsheetCommandRange, direction: SpreadsheetCellFillDirection) => void; batchCallApis: (apiCalls: Array<{ name: string; args: unknown[]; }>) => void; getSelection: () => SpreadsheetCommandRange[] | undefined; getCellsByRange: (range: SpreadsheetCommandRange, options?: { id?: string; }) => (Cell | null)[][]; getSheet: (options?: { id?: string; }) => Sheet; insertRowOrColumn: (type: SpreadsheetStructureAxis, index: number, count: number, direction: 'lefttop' | 'rightbottom', options?: { id?: string; }) => void; hideRowOrColumn: (rowOrColumnInfo: string[], type: SpreadsheetStructureAxis) => void; showRowOrColumn: (rowOrColumnInfo: string[], type: SpreadsheetStructureAxis) => void; setCellValuesByRange: (values: unknown[][], range: SpreadsheetCommandRange, options?: { id?: string; }) => void; setCellFormatByRange: (attribute: keyof Cell, value: unknown, range: SpreadsheetCommandRange, options?: { id?: string; }) => void; setRowHeight: (rowInfo: Record, options?: { id?: string; }, custom?: boolean) => void; setColumnWidth: (columnInfo: Record, options?: { id?: string; }, custom?: boolean) => void; setSelection: (range: SpreadsheetCommandRange[], options?: { id?: string; }) => void; } export interface SpreadsheetCommandRange extends SpreadsheetKeyboardSelection { row: number[]; column: number[]; } export interface SpreadsheetCommandSelection { sheetId: string; selection: Selection; } /** * Synchronous selection state shared by commands and the Fortune Sheet bridge. * Fortune applies API calls through React state, so reading its imperative API * twice in the same task can otherwise return the previous selection. */ export interface SpreadsheetSelectionRef { current: SpreadsheetCommandSelection | null; requested: SpreadsheetCommandSelection | null; } export type SpreadsheetStructureAxis = 'row' | 'column'; export type SpreadsheetStructureInsertPosition = 'before' | 'after'; export type { SpreadsheetSortDirection } from './spreadsheet-sort'; export type SpreadsheetCalculationCommand = { scope: 'workbook'; } | { scope: 'selection'; sheetId: string; range: SpreadsheetCommandRange; }; export interface SpreadsheetCalculationCommandPort { recalculate: (request: SpreadsheetCalculationCommand) => void; } export interface SpreadsheetHistoryCommandPort { canRedo: boolean; canUndo: boolean; redo: () => boolean; undo: () => boolean; } export interface SpreadsheetClipboardCommandPort { canCopySelection: boolean; canCutSelection: boolean; canOpenPasteSpecial: boolean; canPasteSelection: boolean; canPasteSpecial: (content: SpreadsheetPasteContent) => boolean; copySelection: () => boolean; cutSelection: () => boolean; openPasteSpecial: () => boolean; pasteSelection: () => boolean; pasteSpecial: (content: SpreadsheetPasteContent) => boolean; } export interface SpreadsheetAutoFilterCommandPort { active: boolean; canOpenMenu: boolean; canToggle: boolean; openMenu: () => boolean; toggle: () => boolean; } export interface SpreadsheetFormatPainterCommandPort { active: boolean; canActivate: boolean; mode: SpreadsheetFormatPainterMode | null; activate: (mode: SpreadsheetFormatPainterMode) => boolean; applySelection: (target: SpreadsheetCommandSelection) => boolean; cancel: () => boolean; } export interface SpreadsheetFormatCellsOpenRequest { sheetId: string; range: SpreadsheetCellRange; activeCell: { row: number; column: number; }; cells: (Cell | null)[][]; intent: SpreadsheetFormatCellsOpenIntent; } export interface SpreadsheetFormatCellsCommandPort { canOpen: boolean; open: (request: SpreadsheetFormatCellsOpenRequest) => boolean; } export interface SpreadsheetDataValidationCommandPort { canOpen: boolean; open: (request: SpreadsheetDataValidationTarget) => boolean; } export interface SpreadsheetHyperlinkCommandPort { canOpen: boolean; open: (request: SpreadsheetHyperlinkCell) => boolean; } export interface SpreadsheetTableCommandPort { canOpen: boolean; open: (target: SpreadsheetTableTarget) => boolean; } export interface SpreadsheetSortCommandPort { canApply: (request: SpreadsheetSortRequest, liveRange: SpreadsheetCommandRange) => boolean; canOpen: boolean; open: (request: SpreadsheetSortOpenRequest) => boolean; } export interface SpreadsheetNavigationCommandPort { canOpenFind: boolean; canOpenGoTo: boolean; openFind: () => boolean; openGoTo: () => boolean; } export interface SpreadsheetFormulaBarCommandPort { setValue: (value: unknown) => void; } export interface SpreadsheetRichTextFormatCommandPort { apply: (attribute: keyof Cell, value: unknown) => boolean; canApply: (attribute: keyof Cell, value: unknown) => boolean; canToggle: (attribute: SpreadsheetRichTextToggleAttribute) => boolean; toggle: (attribute: SpreadsheetRichTextToggleAttribute) => boolean; } export interface SpreadsheetViewCommandPort { activateSheet: (sheetId: string) => boolean; } export interface SpreadsheetShowFormulasCommandPort { toggle: () => boolean; } export interface SpreadsheetEditorCommands { activateSheet: (sheetId: string) => boolean; activateFormatPainter: (mode: SpreadsheetFormatPainterMode) => boolean; addSheet: () => boolean; adjustDecimalPlaces: (direction: SpreadsheetDecimalPlacesDirection) => boolean; adjustFontSize: (direction: SpreadsheetFontSizeDirection) => boolean; applyCellStyle: (preset: SpreadsheetCellStyleChoice) => boolean; applyCellFormat: (request: SpreadsheetCellFormatRequest) => boolean; applyAutoFilterCriteria: (request: SpreadsheetAutoFilterCriteriaRequest) => boolean; applyDataValidation: (request: SpreadsheetDataValidationRequest) => boolean; applyAutoSum: (functionName: SpreadsheetAutoSumFunction) => boolean; applyFormatPainter: (target: SpreadsheetCommandSelection) => boolean; applyHyperlink: (request: SpreadsheetHyperlinkRequest) => boolean; applyTable: (request: SpreadsheetTableRequest) => boolean; applyCustomSort: (request: SpreadsheetSortRequest) => boolean; cancelFormatPainter: () => boolean; clearSelectedCells: (mode?: SpreadsheetCellClearMode) => boolean; clearAutoFilterCriteria: (target: SpreadsheetAutoFilterTarget) => boolean; copyCellFromAbove: (kind: SpreadsheetCopyFromAboveKind) => boolean; copySelection: () => boolean; cutSelection: () => boolean; deleteSelectedStructure: (axis: SpreadsheetStructureAxis) => boolean; deleteSheet: (sheetId: string) => boolean; duplicateSheet: (sheetId: string) => boolean; fillSelectedCells: (direction: SpreadsheetCellFillDirection) => boolean; hideSheet: (sheetId: string) => boolean; insertSelectedStructure: (axis: SpreadsheetStructureAxis, position: SpreadsheetStructureInsertPosition) => boolean; insertCurrentDateTime: (kind: SpreadsheetDateTimeKind) => boolean; mergeSelectedCells: (command: SpreadsheetCellMergeCommand) => boolean; moveSheet: (sheetId: string, direction: SpreadsheetSheetMoveDirection) => boolean; moveSelection: (move: SpreadsheetSelectionMove, extend: boolean) => boolean; openAutoFilterMenu: () => boolean; openDataValidation: () => boolean; openFind: () => boolean; openFormatCells: (intent?: SpreadsheetFormatCellsOpenIntent) => boolean; openGoTo: () => boolean; openHyperlink: () => boolean; openPasteSpecial: () => boolean; openCustomSort: () => boolean; openTable: () => boolean; pasteCells: (values: readonly (readonly unknown[])[]) => boolean; pasteSelection: () => boolean; pasteSpecial: (content: SpreadsheetPasteContent) => boolean; recalculateFormula: (scope: 'selection' | 'workbook') => boolean; removeHyperlink: (target: SpreadsheetHyperlinkCell) => boolean; removeDataValidation: (target: SpreadsheetDataValidationTarget) => boolean; renameSheet: (sheetId: string, name: string) => boolean; redo: () => boolean; setCellFormat: (attribute: keyof Cell, value: unknown) => boolean; toggleCellFormat: (attribute: SpreadsheetRichTextToggleAttribute) => boolean; setTextOrientation: (orientation: SpreadsheetTextOrientationId) => boolean; setSelectedCellBorders: (format: SpreadsheetCellBorderFormat) => boolean; setFreezePanes: (preset: SpreadsheetFreezePanePreset) => boolean; setGridLines: (visible: boolean) => boolean; selectCellRange: (scope: SpreadsheetSelectionScope) => boolean; setSheetColor: (sheetId: string, color: string | null) => boolean; setSelectedStructureHidden: (axis: SpreadsheetStructureAxis, hidden: boolean) => boolean; setSelectedStructureSize: (axis: SpreadsheetStructureAxis, size: number) => boolean; setSpreadsheetContent: (content: WorkSpreadsheetContent) => boolean; setZoom: (percent: number) => boolean; sortSelectedCells: (direction: SpreadsheetSortDirection) => boolean; toggleAutoFilter: () => boolean; updateTable: (sheetId: string, tableId: string, patch: SpreadsheetTableDesignPatch) => boolean; convertTableToRange: (sheetId: string, tableId: string) => boolean; undo: () => boolean; } export type SpreadsheetEditorCanCommands = OfficeEditorCanCommands; export interface SpreadsheetCommandContext { activeSheetId: string; autoFilter: SpreadsheetAutoFilterCommandPort; calculation: SpreadsheetCalculationCommandPort | null; clipboard: SpreadsheetClipboardCommandPort; content: WorkSpreadsheetContent; dataValidation: SpreadsheetDataValidationCommandPort; editable: boolean; fallbackRange: SpreadsheetCommandRange; formulaBar: SpreadsheetFormulaBarCommandPort | null; formatPainter: SpreadsheetFormatPainterCommandPort; formatCells: SpreadsheetFormatCellsCommandPort; hyperlink: SpreadsheetHyperlinkCommandPort; history: SpreadsheetHistoryCommandPort | null; navigation: SpreadsheetNavigationCommandPort; onChange: (content: WorkSpreadsheetContent) => void; richTextFormat?: SpreadsheetRichTextFormatCommandPort | null; selection: SpreadsheetCommandSelection | null; selectionRef?: SpreadsheetSelectionRef; showFormulas: SpreadsheetShowFormulasCommandPort | null; sort: SpreadsheetSortCommandPort; table: SpreadsheetTableCommandPort; targetSheetGridSize?: SpreadsheetGridSize | null; targetSheetId: string; toolbarCell: Cell | null; view: SpreadsheetViewCommandPort | null; workbook: SpreadsheetWorkbookCommandPort | null; } export declare function createSpreadsheetEditorExtensions(): readonly OfficeEditorExtension[];