From 7bee2ab0fdc68d659f911e83939568da31e083ac Mon Sep 17 00:00:00 2001 From: wpxp123456 <2677556700@qq.com> Date: Tue, 31 Mar 2026 17:08:33 +0800 Subject: [PATCH] refactor(drawing): migrate some logic from sheets-drawing-ui to sheets-drawing package (#6750) --- examples/src/sheets/main.ts | 1 + packages/docs-ui/src/facade/f-univer.ts | 4 +- .../src/facade/f-enum.ts | 12 +- .../src/facade/f-range.ts | 8 +- .../src/facade/index.ts | 2 +- .../src/facade/f-event.ts | 110 +++ .../src/facade/f-univer.spec.ts | 23 +- .../src/facade/f-univer.ts | 126 +-- .../src/facade/index.ts | 2 + .../src/facade/f-event.ts | 108 +-- .../src/facade/f-range.ts | 8 +- .../src/facade/f-univer.ts | 42 +- .../src/facade/f-workbook.ts | 8 +- .../__tests__/transform-position.spec.ts | 162 ---- .../src/basics/transform-position.ts | 186 ---- .../__tests__/delete-drawings.command.spec.ts | 3 +- .../__tests__/drawing-commands.spec.ts | 109 +-- .../commands/delete-drawings.command.ts | 6 +- .../commands/flip-drawings.command.ts | 33 +- .../commands/move-drawings.command.ts | 23 +- .../sheet-drawing.render-controller.ts | 15 +- .../sheet-drawing-copy-paste.controller.ts | 128 +-- ...eet-drawing-group-copy-paste.controller.ts | 32 +- ...t-drawing-transform-affected.controller.ts | 823 ++++++++++++------ .../sheet-drawing-update.controller.ts | 148 +++- .../controllers/sheet-drawing.controller.ts | 14 +- .../sheets-drawing-ui/src/facade/f-event.ts | 340 +------- .../sheets-drawing-ui/src/facade/f-range.ts | 8 +- .../sheets-drawing-ui/src/facade/f-univer.ts | 300 +------ .../src/facade/f-worksheet.ts | 415 +-------- .../sheets-drawing-ui/src/facade/index.ts | 4 - packages/sheets-drawing-ui/src/index.ts | 6 - .../src/menu/drawing-popup-menu.controller.ts | 2 +- .../canvas-float-dom-manager.service.ts | 14 +- .../sheet-image-panel/SheetDrawingAnchor.tsx | 3 +- packages/sheets-drawing/package.json | 14 +- .../src/basics/transform-position.ts | 103 +++ .../commands/insert-sheet-drawing.command.ts | 29 +- .../commands/remove-sheet-drawing.command.ts | 39 +- .../commands/set-drawing-arrange.command.ts | 6 +- .../commands/set-sheet-drawing.command.ts | 37 +- .../mutations/set-drawing-apply.mutation.ts | 2 + .../controllers/sheet-drawing.controller.ts | 14 + .../src/facade/f-enum.ts | 8 +- packages/sheets-drawing/src/facade/f-event.ts | 452 ++++++++++ .../src/facade/f-over-grid-image.ts | 59 +- .../sheets-drawing/src/facade/f-univer.ts | 289 ++++++ .../sheets-drawing/src/facade/f-worksheet.ts | 328 +++++++ .../src/facade/index.ts} | 33 +- packages/sheets-drawing/src/index.ts | 5 + .../sheets-filter.render-controller.ts | 5 +- packages/sheets-filter/src/facade/f-enum.ts | 4 +- packages/sheets-filter/src/facade/f-event.ts | 199 +---- packages/sheets-filter/src/facade/f-range.ts | 8 +- packages/sheets-filter/src/facade/f-univer.ts | 135 +++ .../sheets-filter/src/facade/f-worksheet.ts | 8 +- packages/sheets-filter/src/facade/index.ts | 2 + .../sheet-find-replace.controller.ts | 2 +- .../src/facade/f-univer.ts | 8 +- .../__tests__/create-command-test-bed.ts | 3 +- .../__tests__/create-command-test-bed.ts | 3 +- .../formula-clipboard.controller.spec.ts | 2 +- .../formula-editor-show.controller.ts | 28 +- .../sheets-formula-ui/src/facade/f-univer.ts | 8 +- .../ref-selections.render-service.ts | 13 +- .../formula-editor/hooks/use-highlight.ts | 2 +- packages/sheets-formula/src/facade/f-enum.ts | 10 +- .../src/facade/f-workbook.ts | 5 +- .../sheets-hyper-link/src/facade/f-event.ts | 38 +- .../sheets-hyper-link/src/facade/f-range.ts | 8 +- .../sheets-hyper-link/src/facade/f-univer.ts | 12 +- .../src/facade/f-workbook.ts | 17 +- .../sheets-hyper-link/src/facade/index.ts | 2 +- packages/sheets-note/src/facade/f-event.ts | 72 +- packages/sheets-note/src/facade/f-range.ts | 8 +- packages/sheets-note/src/facade/f-univer.ts | 73 +- .../sheets-note/src/facade/f-worksheet.ts | 8 +- packages/sheets-numfmt/src/facade/f-range.ts | 4 +- .../sheets-numfmt/src/facade/f-workbook.ts | 8 +- packages/sheets-sort/src/facade/f-event.ts | 102 +-- packages/sheets-sort/src/facade/f-range.ts | 8 +- packages/sheets-sort/src/facade/f-univer.ts | 97 +++ .../sheets-sort/src/facade/f-worksheet.ts | 8 +- packages/sheets-sort/src/facade/index.ts | 2 + packages/sheets-table/src/facade/f-enum.ts | 8 +- .../sheets-table/src/facade/f-worksheet.ts | 8 +- .../src/facade/__tests__/f-workbook.spec.ts | 6 +- .../src/facade/f-event.ts | 105 +-- .../src/facade/f-range.ts | 8 +- .../src/facade/f-univer.ts | 177 ++-- .../src/facade/f-workbook.ts | 8 +- .../__tests__/auto-fill.controller.spec.ts | 2 + .../create-selection-command-test-bed.ts | 7 +- packages/sheets-ui/src/common/utils.ts | 3 +- .../__tests__/auto-height.controller.spec.ts | 8 +- .../src/controllers/auto-height.controller.ts | 23 +- .../cell-custom-render.controller.ts | 3 +- .../src/controllers/drag-render.controller.ts | 2 +- .../controllers/hover-render.controller.ts | 2 +- .../contextmenu.render-controller.ts | 4 +- .../header-move.render-controller.ts | 3 +- .../header-resize.render-controller.ts | 4 +- .../mobile-header-resize.render-controller.ts | 2 +- .../mobile/mobile-scroll.render-controller.ts | 4 +- .../scroll.render-controller.ts | 39 +- .../skeleton.render-controller.ts | 6 +- .../src/facade/__tests__/create-test-bed.ts | 2 + .../src/facade/__tests__/f-event.spec.ts | 71 -- .../__tests__/f-workbook-worksheet.spec.ts | 2 +- packages/sheets-ui/src/facade/f-enum.ts | 10 +- packages/sheets-ui/src/facade/f-event.ts | 574 ++++++------ packages/sheets-ui/src/facade/f-univer.ts | 289 +++--- packages/sheets-ui/src/facade/f-workbook.ts | 12 - packages/sheets-ui/src/facade/f-worksheet.ts | 10 +- packages/sheets-ui/src/index.ts | 3 - .../__tests__/editor-bridge.service.spec.ts | 4 + .../sheet-skeleton-manager.service.spec.ts | 216 ----- .../services/canvas-pop-manager.service.ts | 8 +- .../clipboard/__tests__/clipboard-test-bed.ts | 3 +- .../clipboard/html-to-usm/converter.ts | 2 +- .../src/services/drag-manager.service.ts | 1 - .../src/services/editor-bridge.service.ts | 59 +- .../src/services/hover-manager.service.ts | 3 +- .../mark-selection/mark-selection.service.ts | 7 +- .../services/selection/__tests__/util.spec.ts | 2 +- .../base-selection-render.service.ts | 23 +- .../mobile-selection-render.service.ts | 3 +- .../selection/selection-render.service.ts | 3 +- .../selection/selection-shape-extension.ts | 3 +- .../sheet-skeleton-manager.service.ts | 200 +---- .../__tests__/drawing-position-util.spec.ts | 108 --- packages/sheets/package.json | 2 +- .../__tests__/set-row-height.command.spec.ts | 6 +- .../set-worksheet-row-height.command.ts | 4 +- packages/sheets/src/facade/f-enum.ts | 22 +- packages/sheets/src/facade/f-event.ts | 198 ++--- packages/sheets/src/facade/f-univer.ts | 182 ++-- packages/sheets/src/index.ts | 8 +- .../sheet-interceptor.service.ts | 5 +- .../src/skeleton}/drawing-position-util.ts | 51 +- .../sheets/src/skeleton/skeleton.service.ts | 178 +++- .../selection => sheets/src/skeleton}/util.ts | 12 +- packages/ui/src/facade/f-enum.ts | 8 +- .../watermark/src/facade/f-univer.spec.ts | 4 +- packages/watermark/src/facade/f-univer.ts | 21 +- pnpm-lock.yaml | 9 +- 146 files changed, 3993 insertions(+), 4325 deletions(-) create mode 100644 packages/sheets-crosshair-highlight/src/facade/f-event.ts delete mode 100644 packages/sheets-drawing-ui/src/basics/__tests__/transform-position.spec.ts delete mode 100644 packages/sheets-drawing-ui/src/basics/transform-position.ts create mode 100644 packages/sheets-drawing/src/basics/transform-position.ts rename packages/{sheets-drawing-ui => sheets-drawing}/src/commands/commands/insert-sheet-drawing.command.ts (77%) rename packages/{sheets-drawing-ui => sheets-drawing}/src/commands/commands/remove-sheet-drawing.command.ts (76%) rename packages/{sheets-drawing-ui => sheets-drawing}/src/commands/commands/set-drawing-arrange.command.ts (94%) rename packages/{sheets-drawing-ui => sheets-drawing}/src/commands/commands/set-sheet-drawing.command.ts (67%) rename packages/{sheets-drawing-ui => sheets-drawing}/src/facade/f-enum.ts (87%) create mode 100644 packages/sheets-drawing/src/facade/f-event.ts rename packages/{sheets-drawing-ui => sheets-drawing}/src/facade/f-over-grid-image.ts (94%) create mode 100644 packages/sheets-drawing/src/facade/f-univer.ts create mode 100644 packages/sheets-drawing/src/facade/f-worksheet.ts rename packages/{sheets-drawing-ui/src/commands/commands/interfaces.ts => sheets-drawing/src/facade/index.ts} (51%) create mode 100644 packages/sheets-filter/src/facade/f-univer.ts create mode 100644 packages/sheets-sort/src/facade/f-univer.ts delete mode 100644 packages/sheets-ui/src/facade/__tests__/f-event.spec.ts delete mode 100644 packages/sheets-ui/src/services/__tests__/sheet-skeleton-manager.service.spec.ts delete mode 100644 packages/sheets-ui/src/services/utils/__tests__/drawing-position-util.spec.ts rename packages/{sheets-ui/src/services/utils => sheets/src/skeleton}/drawing-position-util.ts (66%) rename packages/{sheets-ui/src/services/selection => sheets/src/skeleton}/util.ts (93%) diff --git a/examples/src/sheets/main.ts b/examples/src/sheets/main.ts index 205617ae26..5e7185d660 100644 --- a/examples/src/sheets/main.ts +++ b/examples/src/sheets/main.ts @@ -70,6 +70,7 @@ import '@univerjs/sheets-hyper-link-ui/facade'; import '@univerjs/sheets-thread-comment/facade'; import '@univerjs/sheets-conditional-formatting/facade'; import '@univerjs/sheets-find-replace/facade'; +import '@univerjs/sheets-drawing/facade'; import '@univerjs/sheets-drawing-ui/facade'; import '@univerjs/sheets-zen-editor/facade'; import '@univerjs/sheets-crosshair-highlight/facade'; diff --git a/packages/docs-ui/src/facade/f-univer.ts b/packages/docs-ui/src/facade/f-univer.ts index 96e66896eb..0e6b30d202 100644 --- a/packages/docs-ui/src/facade/f-univer.ts +++ b/packages/docs-ui/src/facade/f-univer.ts @@ -45,7 +45,7 @@ export interface IFUniverDocsUIMixin { getActiveDocument(): FDocument | null; } -export class FUniverDocsMixin extends FUniver implements IFUniverDocsUIMixin { +export class FUniverDocsUIMixin extends FUniver implements IFUniverDocsUIMixin { override createUniverDoc(data: Partial): FDocument { const document = this._univerInstanceService.createUnit(UniverInstanceType.UNIVER_DOC, data); return this._injector.createInstance(FDocument, document); @@ -70,7 +70,7 @@ export class FUniverDocsMixin extends FUniver implements IFUniverDocsUIMixin { } } -FUniver.extend(FUniverDocsMixin); +FUniver.extend(FUniverDocsUIMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention interface FUniver extends IFUniverDocsUIMixin {} diff --git a/packages/sheets-conditional-formatting/src/facade/f-enum.ts b/packages/sheets-conditional-formatting/src/facade/f-enum.ts index 1780fe3063..9a5127e150 100644 --- a/packages/sheets-conditional-formatting/src/facade/f-enum.ts +++ b/packages/sheets-conditional-formatting/src/facade/f-enum.ts @@ -20,7 +20,7 @@ import { CFNumberOperator, CFTimePeriodOperator } from '@univerjs/sheets-conditi /** * @ignore */ -export interface IFSheetsConditionalFormattingEnum { +export interface IFSheetsConditionalFormattingEnumMixin { /** * Conditional formatting number operator */ @@ -32,19 +32,19 @@ export interface IFSheetsConditionalFormattingEnum { ConditionFormatTimePeriodOperatorEnum: typeof CFTimePeriodOperator; } -export class FSheetsConditionalFormattingEnum implements IFSheetsConditionalFormattingEnum { - get ConditionFormatNumberOperatorEnum(): typeof CFNumberOperator { +export class FSheetsConditionalFormattingEnumMixin extends FEnum implements IFSheetsConditionalFormattingEnumMixin { + override get ConditionFormatNumberOperatorEnum(): typeof CFNumberOperator { return CFNumberOperator; } - get ConditionFormatTimePeriodOperatorEnum(): typeof CFTimePeriodOperator { + override get ConditionFormatTimePeriodOperatorEnum(): typeof CFTimePeriodOperator { return CFTimePeriodOperator; } } -FEnum.extend(FSheetsConditionalFormattingEnum); +FEnum.extend(FSheetsConditionalFormattingEnumMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - export interface FEnum extends IFSheetsConditionalFormattingEnum { + export interface FEnum extends IFSheetsConditionalFormattingEnumMixin { } } diff --git a/packages/sheets-conditional-formatting/src/facade/f-range.ts b/packages/sheets-conditional-formatting/src/facade/f-range.ts index 200ddf47fc..94ea7fe34a 100644 --- a/packages/sheets-conditional-formatting/src/facade/f-range.ts +++ b/packages/sheets-conditional-formatting/src/facade/f-range.ts @@ -39,7 +39,7 @@ import { FConditionalFormattingBuilder } from './f-conditional-formatting-builde /** * @ignore */ -export interface IFRangeConditionalFormattingMixin { +export interface IFRangeSheetsConditionalFormattingMixin { /** * Gets all the conditional formatting for the current range. * @returns {IConditionFormattingRule[]} conditional formatting rules for the current range. @@ -146,7 +146,7 @@ export interface IFRangeConditionalFormattingMixin { clearConditionalFormatRules(): FRange; } -export class FRangeConditionalFormattingMixin extends FRange implements IFRangeConditionalFormattingMixin { +export class FRangeSheetsConditionalFormattingMixin extends FRange implements IFRangeSheetsConditionalFormattingMixin { private _getConditionalFormattingRuleModel(): ConditionalFormattingRuleModel { return this._injector.get(ConditionalFormattingRuleModel); } @@ -213,8 +213,8 @@ export class FRangeConditionalFormattingMixin extends FRange implements IFRangeC } } -FRange.extend(FRangeConditionalFormattingMixin); +FRange.extend(FRangeSheetsConditionalFormattingMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FRange extends IFRangeConditionalFormattingMixin { } + interface FRange extends IFRangeSheetsConditionalFormattingMixin { } } diff --git a/packages/sheets-conditional-formatting/src/facade/index.ts b/packages/sheets-conditional-formatting/src/facade/index.ts index 4e1a6c9d85..55db821ab1 100644 --- a/packages/sheets-conditional-formatting/src/facade/index.ts +++ b/packages/sheets-conditional-formatting/src/facade/index.ts @@ -19,5 +19,5 @@ import './f-worksheet'; import './f-enum'; export { FConditionalFormattingBuilder } from './f-conditional-formatting-builder'; -export type { IFRangeConditionalFormattingMixin } from './f-range'; +export type { IFRangeSheetsConditionalFormattingMixin } from './f-range'; export type { IFWorksheetConditionalFormattingMixin } from './f-worksheet'; diff --git a/packages/sheets-crosshair-highlight/src/facade/f-event.ts b/packages/sheets-crosshair-highlight/src/facade/f-event.ts new file mode 100644 index 0000000000..d2b9197d73 --- /dev/null +++ b/packages/sheets-crosshair-highlight/src/facade/f-event.ts @@ -0,0 +1,110 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { IEventBase } from '@univerjs/core/facade'; +import type { FWorkbook, FWorksheet } from '@univerjs/sheets/facade'; +import { FEventName } from '@univerjs/core/facade'; + +export interface IFSheetsCrosshairHighlightEventNameMixin { + /** + * Triggered when the crosshair highlight is enabled or disabled. + * @see {@link ICrosshairHighlightEnabledChangedEventParams} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.CrosshairHighlightEnabledChanged, (params) => { + * const { enabled, workbook, worksheet } = params; + * console.log(params); + * }); + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly CrosshairHighlightEnabledChanged: 'CrosshairHighlightEnabledChanged'; + + /** + * Triggered when the crosshair highlight color is changed. + * @see {@link ICrosshairHighlightColorChangedEventParams} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.CrosshairHighlightColorChanged, (params) => { + * const { color, workbook, worksheet } = params; + * console.log(params); + * }); + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly CrosshairHighlightColorChanged: 'CrosshairHighlightColorChanged'; +} + +/** + * @ignore + */ +export class FSheetsCrosshairHighlightEventNameMixin extends FEventName implements IFSheetsCrosshairHighlightEventNameMixin { + override get CrosshairHighlightEnabledChanged(): 'CrosshairHighlightEnabledChanged' { + return 'CrosshairHighlightEnabledChanged'; + } + + override get CrosshairHighlightColorChanged(): 'CrosshairHighlightColorChanged' { + return 'CrosshairHighlightColorChanged'; + } +} + +export interface ICrosshairHighlightEnabledChangedEventParams extends IEventBase { + /** + * Whether the crosshair highlight is enabled. + */ + enabled: boolean; + /** + * The workbook that the crosshair highlight is enabled in. + */ + workbook: FWorkbook; + /** + * The worksheet that the crosshair highlight is enabled in. + */ + worksheet: FWorksheet; +} + +export interface ICrosshairHighlightColorChangedEventParams extends IEventBase { + /** + * The color of the crosshair highlight. + */ + color: string; + /** + * The workbook that the crosshair highlight is enabled in. + */ + workbook: FWorkbook; + /** + * The worksheet that the crosshair highlight is enabled in. + */ + worksheet: FWorksheet; +} + +/** + * @ignore + */ +export interface ISheetsCrosshairHighlightEventParamConfig { + CrosshairHighlightEnabledChanged: ICrosshairHighlightEnabledChangedEventParams; + CrosshairHighlightColorChanged: ICrosshairHighlightColorChangedEventParams; +} + +FEventName.extend(FSheetsCrosshairHighlightEventNameMixin); +declare module '@univerjs/core/facade' { + // eslint-disable-next-line ts/naming-convention + interface FEventName extends IFSheetsCrosshairHighlightEventNameMixin { } + + interface IEventParamConfig extends ISheetsCrosshairHighlightEventParamConfig { } +} diff --git a/packages/sheets-crosshair-highlight/src/facade/f-univer.spec.ts b/packages/sheets-crosshair-highlight/src/facade/f-univer.spec.ts index 5de7cdaf60..6f8502cd70 100644 --- a/packages/sheets-crosshair-highlight/src/facade/f-univer.spec.ts +++ b/packages/sheets-crosshair-highlight/src/facade/f-univer.spec.ts @@ -51,10 +51,11 @@ vi.mock('@univerjs/sheets-crosshair-highlight', () => ({ describe('crosshair facade', () => { it('should register mixins and cover event wiring + APIs', async () => { - const module = await import('./f-univer'); + const module1 = await import('./f-univer'); + const module2 = await import('./f-event'); - expect(mocked.extendEvent).toHaveBeenCalledWith(module.FSheetCrosshairHighlightEventMixin); - expect(mocked.extendUniver).toHaveBeenCalledWith(module.FUniverCrosshairHighlightMixin); + expect(mocked.extendEvent).toHaveBeenCalledWith(module2.FSheetsCrosshairHighlightEventNameMixin); + expect(mocked.extendUniver).toHaveBeenCalledWith(module1.FUniverSheetsCrosshairHighlightMixin); const callbacks: Array<(commandInfo: { id: string }) => void> = []; const commandService = { @@ -90,7 +91,7 @@ describe('crosshair facade', () => { disposeWithMe: vi.fn(), }; - module.FUniverCrosshairHighlightMixin.prototype._initialize.call( + module1.FUniverSheetsCrosshairHighlightMixin.prototype._initialize.call( thisArg, { get: vi.fn(() => commandService) } as never ); @@ -108,22 +109,22 @@ describe('crosshair facade', () => { callbacks[0]({ id: mocked.enableId }); callbacks[1]({ id: mocked.setColorId }); - const enabledResult = module.FUniverCrosshairHighlightMixin.prototype.setCrosshairHighlightEnabled.call(thisArg, true); - const disabledResult = module.FUniverCrosshairHighlightMixin.prototype.setCrosshairHighlightEnabled.call(thisArg, false); + const enabledResult = module1.FUniverSheetsCrosshairHighlightMixin.prototype.setCrosshairHighlightEnabled.call(thisArg, true); + const disabledResult = module1.FUniverSheetsCrosshairHighlightMixin.prototype.setCrosshairHighlightEnabled.call(thisArg, false); expect(enabledResult).toBe(thisArg); expect(disabledResult).toBe(thisArg); expect(thisArg._commandService.syncExecuteCommand).toHaveBeenCalledWith(mocked.enableId); expect(thisArg._commandService.syncExecuteCommand).toHaveBeenCalledWith(mocked.disableId); - const colorResult = module.FUniverCrosshairHighlightMixin.prototype.setCrosshairHighlightColor.call(thisArg, '#ff0000'); + const colorResult = module1.FUniverSheetsCrosshairHighlightMixin.prototype.setCrosshairHighlightColor.call(thisArg, '#ff0000'); expect(colorResult).toBe(thisArg); expect(thisArg._commandService.syncExecuteCommand).toHaveBeenCalledWith(mocked.setColorId, { value: '#ff0000' }); - expect(module.FUniverCrosshairHighlightMixin.prototype.getCrosshairHighlightEnabled.call(thisArg)).toBe(true); - expect(module.FUniverCrosshairHighlightMixin.prototype.getCrosshairHighlightColor.call(thisArg)).toBe('rgba(1,2,3,0.2)'); - expect(module.FUniverCrosshairHighlightMixin.prototype.CROSSHAIR_HIGHLIGHT_COLORS).toBe(mocked.colors); + expect(module1.FUniverSheetsCrosshairHighlightMixin.prototype.getCrosshairHighlightEnabled.call(thisArg)).toBe(true); + expect(module1.FUniverSheetsCrosshairHighlightMixin.prototype.getCrosshairHighlightColor.call(thisArg)).toBe('rgba(1,2,3,0.2)'); + expect(module1.FUniverSheetsCrosshairHighlightMixin.prototype.CROSSHAIR_HIGHLIGHT_COLORS).toBe(mocked.colors); - const eventEnum = new module.FSheetCrosshairHighlightEventMixin(); + const eventEnum = new module2.FSheetsCrosshairHighlightEventNameMixin(); expect(eventEnum.CrosshairHighlightEnabledChanged).toBe('CrosshairHighlightEnabledChanged'); expect(eventEnum.CrosshairHighlightColorChanged).toBe('CrosshairHighlightColorChanged'); }); diff --git a/packages/sheets-crosshair-highlight/src/facade/f-univer.ts b/packages/sheets-crosshair-highlight/src/facade/f-univer.ts index 9dca266075..83b7ab65b4 100644 --- a/packages/sheets-crosshair-highlight/src/facade/f-univer.ts +++ b/packages/sheets-crosshair-highlight/src/facade/f-univer.ts @@ -15,103 +15,23 @@ */ import type { Injector } from '@univerjs/core'; -import type { IEventBase } from '@univerjs/core/facade'; import type { ISetCrosshairHighlightColorOperationParams } from '@univerjs/sheets-crosshair-highlight'; -import type { FWorkbook, FWorksheet } from '@univerjs/sheets/facade'; +import type { ICrosshairHighlightColorChangedEventParams, ICrosshairHighlightEnabledChangedEventParams } from './f-event'; import { ICommandService } from '@univerjs/core'; -import { FEventName, FUniver } from '@univerjs/core/facade'; -import { CROSSHAIR_HIGHLIGHT_COLORS, DisableCrosshairHighlightOperation, EnableCrosshairHighlightOperation, SetCrosshairHighlightColorOperation, SheetsCrosshairHighlightService, ToggleCrosshairHighlightOperation } from '@univerjs/sheets-crosshair-highlight'; +import { FUniver } from '@univerjs/core/facade'; +import { + CROSSHAIR_HIGHLIGHT_COLORS, + DisableCrosshairHighlightOperation, + EnableCrosshairHighlightOperation, + SetCrosshairHighlightColorOperation, + SheetsCrosshairHighlightService, + ToggleCrosshairHighlightOperation, +} from '@univerjs/sheets-crosshair-highlight'; /** * @ignore */ -export interface IFSheetCrosshairHighlightEventMixin { - /** - * Triggered when the crosshair highlight is enabled or disabled. - * @see {@link ICrosshairHighlightEnabledChangedEvent} - * @example - * ```ts - * const disposable = univerAPI.addEvent(univerAPI.Event.CrosshairHighlightEnabledChanged, (params) => { - * const { enabled, workbook, worksheet } = params; - * console.log(params); - * }); - * - * // Remove the event listener, use `disposable.dispose()` - * ``` - */ - readonly CrosshairHighlightEnabledChanged: 'CrosshairHighlightEnabledChanged'; - - /** - * Triggered when the crosshair highlight color is changed. - * @see {@link ICrosshairHighlightColorChangedEvent} - * @example - * ```ts - * const disposable = univerAPI.addEvent(univerAPI.Event.CrosshairHighlightColorChanged, (params) => { - * const { color, workbook, worksheet } = params; - * console.log(params); - * }); - * - * // Remove the event listener, use `disposable.dispose()` - * ``` - */ - readonly CrosshairHighlightColorChanged: 'CrosshairHighlightColorChanged'; -} - -export interface ICrosshairHighlightEnabledChangedEvent extends IEventBase { - /** - * Whether the crosshair highlight is enabled. - */ - enabled: boolean; - /** - * The workbook that the crosshair highlight is enabled in. - */ - workbook: FWorkbook; - /** - * The worksheet that the crosshair highlight is enabled in. - */ - worksheet: FWorksheet; -} - -export interface ICrosshairHighlightColorChangedEvent extends IEventBase { - /** - * The color of the crosshair highlight. - */ - color: string; - /** - * The workbook that the crosshair highlight is enabled in. - */ - workbook: FWorkbook; - /** - * The worksheet that the crosshair highlight is enabled in. - */ - worksheet: FWorksheet; -} - -/** - * @ignore - */ -export class FSheetCrosshairHighlightEventMixin implements IFSheetCrosshairHighlightEventMixin { - get CrosshairHighlightEnabledChanged(): 'CrosshairHighlightEnabledChanged' { - return 'CrosshairHighlightEnabledChanged'; - } - - get CrosshairHighlightColorChanged(): 'CrosshairHighlightColorChanged' { - return 'CrosshairHighlightColorChanged'; - } -} - -/** - * @ignore - */ -export interface ISheetCrosshairHighlightEventConfigs { - CrosshairHighlightEnabledChanged: ICrosshairHighlightEnabledChangedEvent; - CrosshairHighlightColorChanged: ICrosshairHighlightColorChangedEvent; -} - -/** - * @ignore - */ -export interface IFUniverCrosshairHighlightMixin { +export interface IFUniverSheetsCrosshairHighlightMixin { /** * Enable or disable crosshair highlight. * @param {boolean} enabled - Whether to enable the crosshair highlight @@ -165,7 +85,7 @@ export interface IFUniverCrosshairHighlightMixin { /** * @ignore */ -export class FUniverCrosshairHighlightMixin extends FUniver implements IFUniverCrosshairHighlightMixin { +export class FUniverSheetsCrosshairHighlightMixin extends FUniver implements IFUniverSheetsCrosshairHighlightMixin { /** * @ignore */ @@ -183,10 +103,11 @@ export class FUniverCrosshairHighlightMixin extends FUniver implements IFUniverC ) { const activeSheet = this.getActiveSheet(); if (!activeSheet) return; - this.fireEvent(this.Event.CrosshairHighlightEnabledChanged, { + const eventParams: ICrosshairHighlightEnabledChangedEventParams = { enabled: this.getCrosshairHighlightEnabled(), ...activeSheet, - }); + }; + this.fireEvent(this.Event.CrosshairHighlightEnabledChanged, eventParams); } }) ) @@ -199,10 +120,11 @@ export class FUniverCrosshairHighlightMixin extends FUniver implements IFUniverC if (commandInfo.id === SetCrosshairHighlightColorOperation.id) { const activeSheet = this.getActiveSheet(); if (!activeSheet) return; - this.fireEvent(this.Event.CrosshairHighlightColorChanged, { + const eventParams: ICrosshairHighlightColorChangedEventParams = { color: this.getCrosshairHighlightColor(), ...activeSheet, - }); + }; + this.fireEvent(this.Event.CrosshairHighlightColorChanged, eventParams); } }) ) @@ -241,16 +163,8 @@ export class FUniverCrosshairHighlightMixin extends FUniver implements IFUniverC } } -FEventName.extend(FSheetCrosshairHighlightEventMixin); -FUniver.extend(FUniverCrosshairHighlightMixin); - +FUniver.extend(FUniverSheetsCrosshairHighlightMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FUniver extends IFUniverCrosshairHighlightMixin {} - - // eslint-disable-next-line ts/naming-convention - interface FEventName extends IFSheetCrosshairHighlightEventMixin { - } - - interface IEventParamConfig extends ISheetCrosshairHighlightEventConfigs {} + interface FUniver extends IFUniverSheetsCrosshairHighlightMixin { } } diff --git a/packages/sheets-crosshair-highlight/src/facade/index.ts b/packages/sheets-crosshair-highlight/src/facade/index.ts index 08fc51ad79..1af138b07a 100644 --- a/packages/sheets-crosshair-highlight/src/facade/index.ts +++ b/packages/sheets-crosshair-highlight/src/facade/index.ts @@ -15,5 +15,7 @@ */ import './f-univer'; +import './f-event'; +export type * from './f-event'; export type * from './f-univer'; diff --git a/packages/sheets-data-validation/src/facade/f-event.ts b/packages/sheets-data-validation/src/facade/f-event.ts index ec0352bd81..1c230d3ed6 100644 --- a/packages/sheets-data-validation/src/facade/f-event.ts +++ b/packages/sheets-data-validation/src/facade/f-event.ts @@ -23,10 +23,10 @@ import { FEventName } from '@univerjs/core/facade'; /** * Event interface triggered when a data validation rule is changed - * @interface ISheetDataValidationChangedEvent + * @interface ISheetDataValidationChangedEventParams * @augments {IEventBase} */ -export interface ISheetDataValidationChangedEvent extends IEventBase { +export interface ISheetDataValidationChangedEventParams extends IEventBase { /** The source of the rule change */ origin: IRuleChange; /** The worksheet containing the validation rule */ @@ -43,10 +43,10 @@ export interface ISheetDataValidationChangedEvent extends IEventBase { /** * Event interface triggered when a data validation status changes - * @interface ISheetDataValidatorStatusChangedEvent + * @interface ISheetDataValidatorStatusChangedEventParams * @augments {IEventBase} */ -export interface ISheetDataValidatorStatusChangedEvent extends IEventBase { +export interface ISheetDataValidatorStatusChangedEventParams extends IEventBase { /** The worksheet containing the validation */ worksheet: FWorksheet; /** The workbook instance */ @@ -63,10 +63,10 @@ export interface ISheetDataValidatorStatusChangedEvent extends IEventBase { /** * Event interface triggered before adding a new data validation rule - * @interface IBeforeSheetDataValidationAddEvent + * @interface IBeforeSheetDataValidationAddEventParams * @augments {IEventBase} */ -export interface IBeforeSheetDataValidationAddEvent extends IEventBase { +export interface IBeforeSheetDataValidationAddEventParams extends IEventBase { /** The worksheet to add the validation to */ worksheet: FWorksheet; /** The workbook instance */ @@ -77,10 +77,10 @@ export interface IBeforeSheetDataValidationAddEvent extends IEventBase { /** * Event interface triggered before deleting a data validation rule - * @interface IBeforeSheetDataValidationDeleteEvent + * @interface IBeforeSheetDataValidationDeleteEventParams * @augments {IEventBase} */ -export interface IBeforeSheetDataValidationDeleteEvent extends IEventBase { +export interface IBeforeSheetDataValidationDeleteEventParams extends IEventBase { /** The worksheet containing the validation */ worksheet: FWorksheet; /** The workbook instance */ @@ -93,10 +93,10 @@ export interface IBeforeSheetDataValidationDeleteEvent extends IEventBase { /** * Event interface triggered before updating a data validation rule's criteria - * @interface IBeforeSheetDataValidationCriteriaUpdateEvent + * @interface IBeforeSheetDataValidationCriteriaUpdateEventParams * @augments {IEventBase} */ -export interface IBeforeSheetDataValidationCriteriaUpdateEvent extends IEventBase { +export interface IBeforeSheetDataValidationCriteriaUpdateEventParams extends IEventBase { /** The worksheet containing the validation */ worksheet: FWorksheet; /** The workbook instance */ @@ -111,10 +111,10 @@ export interface IBeforeSheetDataValidationCriteriaUpdateEvent extends IEventBas /** * Event interface triggered before updating a data validation rule's ranges - * @interface IBeforeSheetDataValidationRangeUpdateEvent + * @interface IBeforeSheetDataValidationRangeUpdateEventParams * @augments {IEventBase} */ -export interface IBeforeSheetDataValidationRangeUpdateEvent extends IEventBase { +export interface IBeforeSheetDataValidationRangeUpdateEventParams extends IEventBase { /** The worksheet containing the validation */ worksheet: FWorksheet; /** The workbook instance */ @@ -129,10 +129,10 @@ export interface IBeforeSheetDataValidationRangeUpdateEvent extends IEventBase { /** * Event interface triggered before updating a data validation rule's options - * @interface IBeforeSheetDataValidationOptionsUpdateEvent + * @interface IBeforeSheetDataValidationOptionsUpdateEventParams * @augments {IEventBase} */ -export interface IBeforeSheetDataValidationOptionsUpdateEvent extends IEventBase { +export interface IBeforeSheetDataValidationOptionsUpdateEventParams extends IEventBase { /** The worksheet containing the validation */ worksheet: FWorksheet; /** The workbook instance */ @@ -147,10 +147,10 @@ export interface IBeforeSheetDataValidationOptionsUpdateEvent extends IEventBase /** * Event interface triggered before deleting all data validation rules - * @interface IBeforeSheetDataValidationDeleteAllEvent + * @interface IBeforeSheetDataValidationDeleteAllEventParams * @augments {IEventBase} */ -export interface IBeforeSheetDataValidationDeleteAllEvent extends IEventBase { +export interface IBeforeSheetDataValidationDeleteAllEventParams extends IEventBase { /** The worksheet containing the validations */ worksheet: FWorksheet; /** The workbook instance */ @@ -163,23 +163,23 @@ export interface IBeforeSheetDataValidationDeleteAllEvent extends IEventBase { * @ignore */ export interface IDataValidationEventParamConfig { - SheetDataValidationChanged: ISheetDataValidationChangedEvent; - SheetDataValidatorStatusChanged: ISheetDataValidatorStatusChangedEvent; - BeforeSheetDataValidationAdd: IBeforeSheetDataValidationAddEvent; - BeforeSheetDataValidationDelete: IBeforeSheetDataValidationDeleteEvent; - BeforeSheetDataValidationDeleteAll: IBeforeSheetDataValidationDeleteAllEvent; - BeforeSheetDataValidationCriteriaUpdate: IBeforeSheetDataValidationCriteriaUpdateEvent; - BeforeSheetDataValidationRangeUpdate: IBeforeSheetDataValidationRangeUpdateEvent; - BeforeSheetDataValidationOptionsUpdate: IBeforeSheetDataValidationOptionsUpdateEvent; + SheetDataValidationChanged: ISheetDataValidationChangedEventParams; + SheetDataValidatorStatusChanged: ISheetDataValidatorStatusChangedEventParams; + BeforeSheetDataValidationAdd: IBeforeSheetDataValidationAddEventParams; + BeforeSheetDataValidationDelete: IBeforeSheetDataValidationDeleteEventParams; + BeforeSheetDataValidationDeleteAll: IBeforeSheetDataValidationDeleteAllEventParams; + BeforeSheetDataValidationCriteriaUpdate: IBeforeSheetDataValidationCriteriaUpdateEventParams; + BeforeSheetDataValidationRangeUpdate: IBeforeSheetDataValidationRangeUpdateEventParams; + BeforeSheetDataValidationOptionsUpdate: IBeforeSheetDataValidationOptionsUpdateEventParams; } /** * @ignore */ -interface IDataValidationEvent { +interface IFSheetsDataValidationEventNameMixin { /** * Event fired when a rule is added, deleted, or modified - * @see {@link ISheetDataValidationChangedEvent} + * @see {@link ISheetDataValidationChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SheetDataValidationChanged, (params) => { @@ -194,7 +194,7 @@ interface IDataValidationEvent { /** * Event fired when a cell validator status is changed - * @see {@link ISheetDataValidatorStatusChangedEvent} + * @see {@link ISheetDataValidatorStatusChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SheetDataValidatorStatusChanged, (params) => { @@ -209,7 +209,7 @@ interface IDataValidationEvent { /** * Event fired before a rule is added - * @see {@link IBeforeSheetDataValidationAddEvent} + * @see {@link IBeforeSheetDataValidationAddEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetDataValidationAdd, (params) => { @@ -227,7 +227,7 @@ interface IDataValidationEvent { /** * Event fired before a rule is deleted - * @see {@link IBeforeSheetDataValidationDeleteEvent} + * @see {@link IBeforeSheetDataValidationDeleteEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetDataValidationDelete, (params) => { @@ -245,7 +245,7 @@ interface IDataValidationEvent { /** * Event fired before all rules are deleted - * @see {@link IBeforeSheetDataValidationDeleteAllEvent} + * @see {@link IBeforeSheetDataValidationDeleteAllEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetDataValidationDeleteAll, (params) => { @@ -263,7 +263,7 @@ interface IDataValidationEvent { /** * Event fired before the criteria of a rule are updated - * @see {@link IBeforeSheetDataValidationCriteriaUpdateEvent} + * @see {@link IBeforeSheetDataValidationCriteriaUpdateEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetDataValidationCriteriaUpdate, (params) => { @@ -281,7 +281,7 @@ interface IDataValidationEvent { /** * Event fired before the range of a rule is updated - * @see {@link IBeforeSheetDataValidationRangeUpdateEvent} + * @see {@link IBeforeSheetDataValidationRangeUpdateEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetDataValidationRangeUpdate, (params) => { @@ -299,7 +299,7 @@ interface IDataValidationEvent { /** * Event fired before the options of a rule are updated - * @see {@link IBeforeSheetDataValidationOptionsUpdateEvent} + * @see {@link IBeforeSheetDataValidationOptionsUpdateEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetDataValidationOptionsUpdate, (params) => { @@ -319,36 +319,36 @@ interface IDataValidationEvent { /** * @ignore */ -export class FDataValidationEvent implements IDataValidationEvent { - get SheetDataValidationChanged(): 'SheetDataValidationChanged' { +export class FSheetsDataValidationEventNameMixin extends FEventName implements IFSheetsDataValidationEventNameMixin { + override get SheetDataValidationChanged(): 'SheetDataValidationChanged' { return 'SheetDataValidationChanged'; } - get SheetDataValidatorStatusChanged(): 'SheetDataValidatorStatusChanged' { + override get SheetDataValidatorStatusChanged(): 'SheetDataValidatorStatusChanged' { return 'SheetDataValidatorStatusChanged'; } - get BeforeSheetDataValidationAdd(): 'BeforeSheetDataValidationAdd' { + override get BeforeSheetDataValidationAdd(): 'BeforeSheetDataValidationAdd' { return 'BeforeSheetDataValidationAdd'; } - get BeforeSheetDataValidationDelete(): 'BeforeSheetDataValidationDelete' { + override get BeforeSheetDataValidationDelete(): 'BeforeSheetDataValidationDelete' { return 'BeforeSheetDataValidationDelete'; } - get BeforeSheetDataValidationDeleteAll(): 'BeforeSheetDataValidationDeleteAll' { + override get BeforeSheetDataValidationDeleteAll(): 'BeforeSheetDataValidationDeleteAll' { return 'BeforeSheetDataValidationDeleteAll'; } - get BeforeSheetDataValidationCriteriaUpdate(): 'BeforeSheetDataValidationCriteriaUpdate' { + override get BeforeSheetDataValidationCriteriaUpdate(): 'BeforeSheetDataValidationCriteriaUpdate' { return 'BeforeSheetDataValidationCriteriaUpdate'; } - get BeforeSheetDataValidationRangeUpdate(): 'BeforeSheetDataValidationRangeUpdate' { + override get BeforeSheetDataValidationRangeUpdate(): 'BeforeSheetDataValidationRangeUpdate' { return 'BeforeSheetDataValidationRangeUpdate'; } - get BeforeSheetDataValidationOptionsUpdate(): 'BeforeSheetDataValidationOptionsUpdate' { + override get BeforeSheetDataValidationOptionsUpdate(): 'BeforeSheetDataValidationOptionsUpdate' { return 'BeforeSheetDataValidationOptionsUpdate'; } } @@ -356,23 +356,23 @@ export class FDataValidationEvent implements IDataValidationEvent { /** * @ignore */ -export interface IDataValidationEventConfig { - SheetDataValidationChanged: ISheetDataValidationChangedEvent; - SheetDataValidatorStatusChanged: ISheetDataValidatorStatusChangedEvent; - BeforeSheetDataValidationAdd: IBeforeSheetDataValidationAddEvent; - BeforeSheetDataValidationDelete: IBeforeSheetDataValidationDeleteEvent; - BeforeSheetDataValidationDeleteAll: IBeforeSheetDataValidationDeleteAllEvent; - BeforeSheetDataValidationCriteriaUpdate: IBeforeSheetDataValidationCriteriaUpdateEvent; - BeforeSheetDataValidationRangeUpdate: IBeforeSheetDataValidationRangeUpdateEvent; - BeforeSheetDataValidationOptionsUpdate: IBeforeSheetDataValidationOptionsUpdateEvent; +export interface ISheetsDataValidationEventParamConfig { + SheetDataValidationChanged: ISheetDataValidationChangedEventParams; + SheetDataValidatorStatusChanged: ISheetDataValidatorStatusChangedEventParams; + BeforeSheetDataValidationAdd: IBeforeSheetDataValidationAddEventParams; + BeforeSheetDataValidationDelete: IBeforeSheetDataValidationDeleteEventParams; + BeforeSheetDataValidationDeleteAll: IBeforeSheetDataValidationDeleteAllEventParams; + BeforeSheetDataValidationCriteriaUpdate: IBeforeSheetDataValidationCriteriaUpdateEventParams; + BeforeSheetDataValidationRangeUpdate: IBeforeSheetDataValidationRangeUpdateEventParams; + BeforeSheetDataValidationOptionsUpdate: IBeforeSheetDataValidationOptionsUpdateEventParams; } -FEventName.extend(FDataValidationEvent); +FEventName.extend(FSheetsDataValidationEventNameMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FEventName extends IDataValidationEvent { + interface FEventName extends IFSheetsDataValidationEventNameMixin { } - interface IEventParamConfig extends IDataValidationEventParamConfig { + interface IEventParamConfig extends ISheetsDataValidationEventParamConfig { } } diff --git a/packages/sheets-data-validation/src/facade/f-range.ts b/packages/sheets-data-validation/src/facade/f-range.ts index 1628b866eb..c4c256d94b 100644 --- a/packages/sheets-data-validation/src/facade/f-range.ts +++ b/packages/sheets-data-validation/src/facade/f-range.ts @@ -25,7 +25,7 @@ import { FDataValidation } from './f-data-validation'; /** * @ignore */ -export interface IFRangeDataValidationMixin { +export interface IFRangeSheetsDataValidationMixin { /** * Set a data validation rule to current range. if rule is null, clear data validation rule. * @param {Nullable} rule data validation rule, build by `FUniver.newDataValidation` @@ -166,7 +166,7 @@ export interface IFRangeDataValidationMixin { /** * @ignore */ -export class FRangeDataValidationMixin extends FRange implements IFRangeDataValidationMixin { +export class FRangeSheetsDataValidationMixin extends FRange implements IFRangeSheetsDataValidationMixin { override setDataValidation(rule: Nullable): FRange { if (!rule) { this._commandService.syncExecuteCommand(ClearRangeDataValidationCommand.id, { @@ -298,8 +298,8 @@ export class FRangeDataValidationMixin extends FRange implements IFRangeDataVali } } -FRange.extend(FRangeDataValidationMixin); +FRange.extend(FRangeSheetsDataValidationMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FRange extends IFRangeDataValidationMixin { } + interface FRange extends IFRangeSheetsDataValidationMixin { } } diff --git a/packages/sheets-data-validation/src/facade/f-univer.ts b/packages/sheets-data-validation/src/facade/f-univer.ts index 2c3266dd21..5bf69dc4ba 100644 --- a/packages/sheets-data-validation/src/facade/f-univer.ts +++ b/packages/sheets-data-validation/src/facade/f-univer.ts @@ -23,7 +23,16 @@ import type { IUpdateSheetDataValidationRangeCommandParams, IUpdateSheetDataValidationSettingCommandParams, } from '@univerjs/sheets-data-validation'; -import type { IBeforeSheetDataValidationAddEvent, IBeforeSheetDataValidationCriteriaUpdateEvent, IBeforeSheetDataValidationDeleteAllEvent, IBeforeSheetDataValidationDeleteEvent, IBeforeSheetDataValidationOptionsUpdateEvent, IBeforeSheetDataValidationRangeUpdateEvent } from './f-event'; +import type { + IBeforeSheetDataValidationAddEventParams, + IBeforeSheetDataValidationCriteriaUpdateEventParams, + IBeforeSheetDataValidationDeleteAllEventParams, + IBeforeSheetDataValidationDeleteEventParams, + IBeforeSheetDataValidationOptionsUpdateEventParams, + IBeforeSheetDataValidationRangeUpdateEventParams, + ISheetDataValidationChangedEventParams, + ISheetDataValidatorStatusChangedEventParams, +} from './f-event'; import { CanceledError, ICommandService } from '@univerjs/core'; import { FUniver } from '@univerjs/core/facade'; import { @@ -41,7 +50,7 @@ import { FDataValidationBuilder } from './f-data-validation-builder'; /** * @ignore */ -export interface IFUnvierDataValidationMixin { +export interface IFUniverSheetsDataValidationMixin { /** * Creates a new instance of FDataValidationBuilder * @returns {FDataValidationBuilder} A new instance of the FDataValidationBuilder class @@ -66,7 +75,7 @@ export interface IFUnvierDataValidationMixin { newDataValidation(): FDataValidationBuilder; } -export class FUnvierDataValidationMixin extends FUniver implements IFUnvierDataValidationMixin { +export class FUniverSheetsDataValidationMixin extends FUniver implements IFUniverSheetsDataValidationMixin { /** * @deprecated use `univerAPI.newDataValidation()` as instead. * @returns {FDataValidationBuilder} A new instance of the FDataValidationBuilder class @@ -100,16 +109,16 @@ export class FUnvierDataValidationMixin extends FUniver implements IFUnvierDataV return; } const { workbook, worksheet } = target; - const fRule = new FDataValidation(rule, worksheet.getSheet(), this._injector); - this.fireEvent(this.Event.SheetDataValidationChanged, { + const eventParams: ISheetDataValidationChangedEventParams = { origin: ruleChange, worksheet, workbook, changeType: type, oldRule, rule: fRule, - }); + }; + this.fireEvent(this.Event.SheetDataValidationChanged, eventParams); }); } ) @@ -133,14 +142,15 @@ export class FUnvierDataValidationMixin extends FUniver implements IFUnvierDataV if (!rule) { return; } - this.fireEvent(this.Event.SheetDataValidatorStatusChanged, { + const eventParams: ISheetDataValidatorStatusChangedEventParams = { workbook, worksheet, row, column: col, rule, status, - }); + }; + this.fireEvent(this.Event.SheetDataValidatorStatusChanged, eventParams); }); } ) @@ -158,7 +168,7 @@ export class FUnvierDataValidationMixin extends FUniver implements IFUnvierDataV return; } const { workbook, worksheet } = target; - const eventParams: IBeforeSheetDataValidationAddEvent = { + const eventParams: IBeforeSheetDataValidationAddEventParams = { worksheet, workbook, rule: params.rule, @@ -187,7 +197,7 @@ export class FUnvierDataValidationMixin extends FUniver implements IFUnvierDataV if (!rule) { return; } - const eventParams: IBeforeSheetDataValidationCriteriaUpdateEvent = { + const eventParams: IBeforeSheetDataValidationCriteriaUpdateEventParams = { worksheet, workbook, rule, @@ -219,7 +229,7 @@ export class FUnvierDataValidationMixin extends FUniver implements IFUnvierDataV if (!rule) { return; } - const eventParams: IBeforeSheetDataValidationRangeUpdateEvent = { + const eventParams: IBeforeSheetDataValidationRangeUpdateEventParams = { worksheet, workbook, rule, @@ -250,7 +260,7 @@ export class FUnvierDataValidationMixin extends FUniver implements IFUnvierDataV if (!rule) { return; } - const eventParams: IBeforeSheetDataValidationOptionsUpdateEvent = { + const eventParams: IBeforeSheetDataValidationOptionsUpdateEventParams = { worksheet, workbook, rule, @@ -281,7 +291,7 @@ export class FUnvierDataValidationMixin extends FUniver implements IFUnvierDataV if (!rule) { return; } - const eventParams: IBeforeSheetDataValidationDeleteEvent = { + const eventParams: IBeforeSheetDataValidationDeleteEventParams = { worksheet, workbook, rule, @@ -307,7 +317,7 @@ export class FUnvierDataValidationMixin extends FUniver implements IFUnvierDataV return; } const { workbook, worksheet } = target; - const eventParams: IBeforeSheetDataValidationDeleteAllEvent = { + const eventParams: IBeforeSheetDataValidationDeleteAllEventParams = { worksheet, workbook, rules: worksheet.getDataValidations(), @@ -323,7 +333,7 @@ export class FUnvierDataValidationMixin extends FUniver implements IFUnvierDataV } } -FUniver.extend(FUnvierDataValidationMixin); +FUniver.extend(FUniverSheetsDataValidationMixin); declare module '@univerjs/core/facade' { /** * @ignore @@ -338,5 +348,5 @@ declare module '@univerjs/core/facade' { } // eslint-disable-next-line ts/naming-convention - interface FUniver extends IFUnvierDataValidationMixin {} + interface FUniver extends IFUniverSheetsDataValidationMixin {} } diff --git a/packages/sheets-data-validation/src/facade/f-workbook.ts b/packages/sheets-data-validation/src/facade/f-workbook.ts index 22dac205dd..3d20300804 100644 --- a/packages/sheets-data-validation/src/facade/f-workbook.ts +++ b/packages/sheets-data-validation/src/facade/f-workbook.ts @@ -61,7 +61,7 @@ export interface IDataValidationError { /** * @ignore */ -export interface IFWorkbookDataValidationMixin { +export interface IFWorkbookSheetsDataValidationMixin { /** * Get data validation validator status for current workbook. * @returns A promise that resolves to a matrix of validator status. @@ -152,7 +152,7 @@ export interface IFWorkbookDataValidationMixin { /** * @ignore */ -export class FWorkbookDataValidationMixin extends FWorkbook implements IFWorkbookDataValidationMixin { +export class FWorkbookSheetsDataValidationMixin extends FWorkbook implements IFWorkbookSheetsDataValidationMixin { declare _dataValidationModel: SheetDataValidationModel; override _initialize(): void { @@ -373,8 +373,8 @@ export class FWorkbookDataValidationMixin extends FWorkbook implements IFWorkboo } } -FWorkbook.extend(FWorkbookDataValidationMixin); +FWorkbook.extend(FWorkbookSheetsDataValidationMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FWorkbook extends IFWorkbookDataValidationMixin { } + interface FWorkbook extends IFWorkbookSheetsDataValidationMixin { } } diff --git a/packages/sheets-drawing-ui/src/basics/__tests__/transform-position.spec.ts b/packages/sheets-drawing-ui/src/basics/__tests__/transform-position.spec.ts deleted file mode 100644 index 27b1238b3a..0000000000 --- a/packages/sheets-drawing-ui/src/basics/__tests__/transform-position.spec.ts +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Copyright 2023-present DreamNum Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import type { ISheetSelectionRenderService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; -import { convertPositionSheetOverGridToAbsolute } from '@univerjs/sheets-ui'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { drawingPositionToTransform, transformToAxisAlignPosition, transformToDrawingPosition } from '../transform-position'; - -vi.mock('@univerjs/sheets-ui', () => ({ - convertPositionSheetOverGridToAbsolute: vi.fn(), -})); - -describe('transform-position', () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - it('clips drawing transforms to the current sheet bounds', () => { - vi.mocked(convertPositionSheetOverGridToAbsolute).mockReturnValue({ - unitId: 'unit-1', - subUnitId: 'sheet-1', - left: 90, - top: 75, - width: 20, - height: 30, - }); - - const sheetSkeletonManagerService = { - getCurrent: () => ({ unitId: 'unit-1', sheetId: 'sheet-1' }), - getCurrentSkeleton: () => ({ - rowHeaderWidth: 0, - columnHeaderHeight: 0, - columnTotalWidth: 100, - rowTotalHeight: 90, - }), - } as SheetSkeletonManagerService; - - const transform = drawingPositionToTransform({ - from: { column: 0, row: 0, columnOffset: 0, rowOffset: 0 }, - to: { column: 1, row: 1, columnOffset: 0, rowOffset: 0 }, - angle: 10, - flipX: true, - }, {} as ISheetSelectionRenderService, sheetSkeletonManagerService); - - expect(transform).toEqual({ - left: 80, - top: 60, - width: 20, - height: 30, - angle: 10, - flipX: true, - flipY: false, - skewX: 0, - skewY: 0, - }); - }); - - it('converts a transform back to sheet anchors', () => { - const selectionRenderService = { - getCellWithCoordByOffset: vi.fn() - .mockReturnValueOnce({ - actualColumn: 1, - actualRow: 2, - startX: 10, - startY: 20, - }) - .mockReturnValueOnce({ - actualColumn: 3, - actualRow: 4, - startX: 40, - startY: 60, - }), - } as unknown as ISheetSelectionRenderService; - - expect(transformToDrawingPosition({ - left: 15, - top: 25, - width: 40, - height: 50, - flipY: true, - angle: 25, - }, selectionRenderService)).toEqual({ - from: { - column: 1, - columnOffset: 5, - row: 2, - rowOffset: 5, - }, - to: { - column: 3, - columnOffset: 15, - row: 4, - rowOffset: 15, - }, - flipX: false, - flipY: true, - angle: 25, - skewX: 0, - skewY: 0, - }); - }); - - it('uses swapped bounds for axis-aligned positions when the angle rotates into a major-axis range', () => { - const selectionRenderService = { - getCellWithCoordByOffset: vi.fn() - .mockReturnValueOnce({ - actualColumn: 2, - actualRow: 3, - startX: 10, - startY: 40, - }) - .mockReturnValueOnce({ - actualColumn: 6, - actualRow: 7, - startX: 70, - startY: 80, - }), - } as unknown as ISheetSelectionRenderService; - - expect(transformToAxisAlignPosition({ - left: 20, - top: 30, - width: 40, - height: 60, - angle: 90, - }, selectionRenderService)).toEqual({ - from: { - column: 2, - columnOffset: 0, - row: 3, - rowOffset: 0, - }, - to: { - column: 6, - columnOffset: 0, - row: 7, - rowOffset: 0, - }, - flipX: false, - flipY: false, - angle: 90, - skewX: 0, - skewY: 0, - }); - - expect(selectionRenderService.getCellWithCoordByOffset).toHaveBeenNthCalledWith(1, 10, 40); - expect(selectionRenderService.getCellWithCoordByOffset).toHaveBeenNthCalledWith(2, 70, 80); - }); -}); diff --git a/packages/sheets-drawing-ui/src/basics/transform-position.ts b/packages/sheets-drawing-ui/src/basics/transform-position.ts deleted file mode 100644 index 87ecedbd0c..0000000000 --- a/packages/sheets-drawing-ui/src/basics/transform-position.ts +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Copyright 2023-present DreamNum Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import type { ITransformState, Nullable } from '@univerjs/core'; -import type { ISheetDrawingPosition } from '@univerjs/sheets-drawing'; -import type { ISheetSelectionRenderService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; -import { precisionTo } from '@univerjs/engine-render'; -import { convertPositionSheetOverGridToAbsolute } from '@univerjs/sheets-ui'; - -// eslint-disable-next-line max-lines-per-function -export function drawingPositionToTransform( - position: ISheetDrawingPosition, - selectionRenderService: ISheetSelectionRenderService, - sheetSkeletonManagerService: SheetSkeletonManagerService -): Nullable { - const { from, to, flipY = false, flipX = false, angle = 0, skewX = 0, skewY = 0 } = position; - const skeletonParam = sheetSkeletonManagerService.getCurrent(); - if (skeletonParam == null) { - return; - } - - const absolutePosition = convertPositionSheetOverGridToAbsolute( - skeletonParam.unitId, - skeletonParam.sheetId, - { from, to }, - sheetSkeletonManagerService - ); - - let { left, top, width, height } = absolutePosition; - - const skeleton = sheetSkeletonManagerService.getCurrentSkeleton()!; - - // const startSelectionCell = attachRangeWithCoord(skeleton, { - // startColumn: fromColumn, - // endColumn: fromColumn, - // startRow: fromRow, - // endRow: fromRow, - // }); - - // if (startSelectionCell == null) { - // return; - // } - - // const endSelectionCell = attachRangeWithCoord(skeleton, { - // startColumn: toColumn, - // endColumn: toColumn, - // startRow: toRow, - // endRow: toRow, - // }); - - // if (endSelectionCell == null) { - // return; - // } - - // const { startX: startSelectionX, startY: startSelectionY } = startSelectionCell; - - // const { startX: endSelectionX, startY: endSelectionY } = endSelectionCell; - - // let left = precisionTo(startSelectionX + fromColumnOffset, 1); - // let top = precisionTo(startSelectionY + fromRowOffset, 1); - - // let width = precisionTo(endSelectionX + toColumnOffset - left, 1); - // let height = precisionTo(endSelectionY + toRowOffset - top, 1); - - // if (startSelectionCell.startX === endSelectionCell.endX) { - // width = 0; - // } - - // if (startSelectionCell.startY === endSelectionCell.endY) { - // height = 0; - // } - - const sheetWidth = skeleton.rowHeaderWidth + skeleton.columnTotalWidth; - const sheetHeight = skeleton.columnHeaderHeight + skeleton.rowTotalHeight; - - if ((left + width) > sheetWidth) { - left = sheetWidth - width; - } - if ((top + height) > sheetHeight) { - top = sheetHeight - height; - } - - return { - flipY, - flipX, - angle, - skewX, - skewY, - left, - top, - width, - height, - }; -} - -// use transform and originSize convert to ISheetDrawingPosition -export function transformToDrawingPosition(transform: ITransformState, selectionRenderService: ISheetSelectionRenderService): Nullable { - const { left = 0, top = 0, width = 0, height = 0, flipY = false, flipX = false, angle = 0, skewX = 0, skewY = 0 } = transform; - - const startSelectionCell = selectionRenderService.getCellWithCoordByOffset(left, top); - - if (startSelectionCell == null) { - return; - } - - const from = { - column: startSelectionCell.actualColumn, - columnOffset: precisionTo(left - startSelectionCell.startX, 1), - row: startSelectionCell.actualRow, - rowOffset: precisionTo(top - startSelectionCell.startY, 1), - }; - - const endSelectionCell = selectionRenderService.getCellWithCoordByOffset(left + width, top + height); - - if (endSelectionCell == null) { - return; - } - - const to = { - column: endSelectionCell.actualColumn, - columnOffset: precisionTo(left + width - endSelectionCell.startX, 1), - row: endSelectionCell.actualRow, - rowOffset: precisionTo(top + height - endSelectionCell.startY, 1), - }; - - return { - flipY, - flipX, - angle, - skewX, - skewY, - from, - to, - }; -} - -/** - * In excel, the basic drawing with rotate bound use major axis switch, axis-aligned bound will bu used.That means the position bound of drawing element will save as nearly axis-aligned rectangle. - * Here is the rule to convert transform to axis-aligned position: - * [-45°, 45°): use the original bound - * [45°, 135°): rotate the bound 90° clockwise,and the left, top, bottom,right will use the rotated bound. - * [135°, 225°): use the original bound - * [225°, 315°): rotate the bound 90° counterclockwise, and the left, top, bottom, right will use the rotated bound. - * @param transform The transform state of the drawing element. - * @param selectionRenderService - * @return The axis-aligned position of the drawing element. - */ -export function transformToAxisAlignPosition( - transform: ITransformState, - selectionRenderService: ISheetSelectionRenderService -): Nullable { - const { left = 0, top = 0, width = 0, height = 0, angle = 0 } = transform; - - const norm = ((angle % 360) + 360) % 360; - - const useSwappedAxis = - (norm >= 45 && norm < 135) || - (norm >= 225 && norm < 315); - - if (!useSwappedAxis) { - return transformToDrawingPosition(transform, selectionRenderService); - } - - const rotatedTransform = { - ...transform, - left: left + width / 2 - height / 2, - top: top + height / 2 - width / 2, - width: height, - height: width, - }; - - return transformToDrawingPosition(rotatedTransform, selectionRenderService); -} diff --git a/packages/sheets-drawing-ui/src/commands/commands/__tests__/delete-drawings.command.spec.ts b/packages/sheets-drawing-ui/src/commands/commands/__tests__/delete-drawings.command.spec.ts index fb631917f3..688b998585 100644 --- a/packages/sheets-drawing-ui/src/commands/commands/__tests__/delete-drawings.command.spec.ts +++ b/packages/sheets-drawing-ui/src/commands/commands/__tests__/delete-drawings.command.spec.ts @@ -16,10 +16,9 @@ import type { IAccessor } from '@univerjs/core'; import { ICommandService } from '@univerjs/core'; -import { ISheetDrawingService } from '@univerjs/sheets-drawing'; +import { ISheetDrawingService, RemoveSheetDrawingCommand } from '@univerjs/sheets-drawing'; import { describe, expect, it, vi } from 'vitest'; import { DeleteDrawingsCommand } from '../delete-drawings.command'; -import { RemoveSheetDrawingCommand } from '../remove-sheet-drawing.command'; describe('DeleteDrawingsCommand', () => { it('forwards focused drawings to the remove command', async () => { diff --git a/packages/sheets-drawing-ui/src/commands/commands/__tests__/drawing-commands.spec.ts b/packages/sheets-drawing-ui/src/commands/commands/__tests__/drawing-commands.spec.ts index 104ce0662b..4130051cc0 100644 --- a/packages/sheets-drawing-ui/src/commands/commands/__tests__/drawing-commands.spec.ts +++ b/packages/sheets-drawing-ui/src/commands/commands/__tests__/drawing-commands.spec.ts @@ -15,19 +15,12 @@ */ import type { IAccessor } from '@univerjs/core'; -import { ArrangeTypeEnum, Direction, DrawingTypeEnum, ICommandService, IUndoRedoService } from '@univerjs/core'; +import { ArrangeTypeEnum, DrawingTypeEnum, ICommandService, IUndoRedoService } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; import { SheetInterceptorService } from '@univerjs/sheets'; -import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation } from '@univerjs/sheets-drawing'; +import { DrawingApplyType, InsertSheetDrawingCommand, ISheetDrawingService, RemoveSheetDrawingCommand, SetDrawingApplyMutation, SetDrawingArrangeCommand } from '@univerjs/sheets-drawing'; import { ISheetSelectionRenderService } from '@univerjs/sheets-ui'; import { describe, expect, it, vi } from 'vitest'; -import { ClearSheetDrawingTransformerOperation } from '../../operations/clear-drawing-transformer.operation'; -import { FlipSheetDrawingCommand } from '../flip-drawings.command'; -import { InsertSheetDrawingCommand } from '../insert-sheet-drawing.command'; -import { MoveDrawingsCommand } from '../move-drawings.command'; -import { RemoveSheetDrawingCommand } from '../remove-sheet-drawing.command'; -import { SetDrawingArrangeCommand } from '../set-drawing-arrange.command'; -import { SetSheetDrawingCommand } from '../set-sheet-drawing.command'; function createSelectionRenderService() { return { @@ -151,46 +144,13 @@ describe('sheet drawing commands', () => { type: DrawingApplyType.REMOVE, }, undefined); expect(pushUndoRedo).toHaveBeenCalledWith(expect.objectContaining({ - undoMutations: expect.arrayContaining([expect.objectContaining({ id: ClearSheetDrawingTransformerOperation.id })]), - redoMutations: expect.arrayContaining([expect.objectContaining({ id: ClearSheetDrawingTransformerOperation.id })]), + undoMutations: expect.arrayContaining([expect.objectContaining({ id: SetDrawingApplyMutation.id })]), + redoMutations: expect.arrayContaining([expect.objectContaining({ id: SetDrawingApplyMutation.id })]), })); }); - it('moves focused drawings, recalculates sheet anchors, and clears transformers', () => { - const { accessor, commandService, sheetDrawingService } = createAccessor(); - expect(MoveDrawingsCommand.handler(accessor, { direction: Direction.LEFT })).toBe(true); - expect(commandService.syncExecuteCommand).toHaveBeenNthCalledWith(1, SetSheetDrawingCommand.id, { - unitId: 'book-1', - drawings: [expect.objectContaining({ - transform: { left: 9, top: 20 }, - sheetTransform: { - from: { column: 0, columnOffset: 9, row: 2, rowOffset: 0 }, - to: { column: 0, columnOffset: 9, row: 2, rowOffset: 0 }, - flipX: false, - flipY: false, - angle: 0, - skewX: 0, - skewY: 0, - }, - axisAlignSheetTransform: { - from: { column: 0, columnOffset: 9, row: 2, rowOffset: 0 }, - to: { column: 0, columnOffset: 9, row: 2, rowOffset: 0 }, - flipX: false, - flipY: false, - angle: 0, - skewX: 0, - skewY: 0, - }, - })], - }); - expect(commandService.syncExecuteCommand).toHaveBeenNthCalledWith(2, ClearSheetDrawingTransformerOperation.id, ['book-1']); - - sheetDrawingService.getFocusDrawings.mockReturnValue([]); - expect(MoveDrawingsCommand.handler(accessor, { direction: Direction.RIGHT })).toBe(false); - }); - it('inserts drawings through sheet interceptors and records undo/redo mutations', () => { - const { accessor, commandService, pushUndoRedo, sheetInterceptorService } = createAccessor(); + const { accessor, commandService, sheetInterceptorService } = createAccessor(); const params = { drawings: [{ unitId: 'book-1', subUnitId: 'sheet-1', drawingId: 'shape-2' }], }; @@ -205,66 +165,7 @@ describe('sheet drawing commands', () => { objects: ['shape-2'], type: DrawingApplyType.INSERT, }, undefined); - expect(pushUndoRedo).toHaveBeenCalledWith(expect.objectContaining({ - unitID: 'book-1', - undoMutations: expect.arrayContaining([expect.objectContaining({ id: ClearSheetDrawingTransformerOperation.id, params: ['book-1'] })]), - redoMutations: expect.arrayContaining([expect.objectContaining({ id: ClearSheetDrawingTransformerOperation.id, params: ['book-1'] })]), - })); expect(InsertSheetDrawingCommand.handler(accessor, undefined)).toBe(false); }); - - it('flips drawing transforms, rebuilds anchors, and pushes transformer cleanup', () => { - const { accessor, commandService, pushUndoRedo, sheetDrawingService } = createAccessor(); - - expect(FlipSheetDrawingCommand.handler(accessor, { - unitId: 'book-1', - drawings: [{ unitId: 'book-1', subUnitId: 'sheet-1', drawingId: 'shape-1' }], - flipH: true, - flipV: true, - })).toBe(true); - expect(sheetDrawingService.getBatchUpdateOp).toHaveBeenCalledWith([ - expect.objectContaining({ - drawingId: 'shape-1', - drawingType: DrawingTypeEnum.DRAWING_SHAPE, - transform: expect.objectContaining({ left: 10, top: 20, flipX: true, flipY: true }), - sheetTransform: { - from: { column: 1, columnOffset: 0, row: 2, rowOffset: 0 }, - to: { column: 1, columnOffset: 0, row: 2, rowOffset: 0 }, - flipX: true, - flipY: true, - angle: 0, - skewX: 0, - skewY: 0, - }, - axisAlignSheetTransform: { - from: { column: 1, columnOffset: 0, row: 2, rowOffset: 0 }, - to: { column: 1, columnOffset: 0, row: 2, rowOffset: 0 }, - flipX: true, - flipY: true, - angle: 0, - skewX: 0, - skewY: 0, - }, - }), - ]); - expect(commandService.syncExecuteCommand).toHaveBeenCalledWith(SetDrawingApplyMutation.id, { - unitId: 'book-1', - subUnitId: 'sheet-1', - op: ['update-redo'], - objects: ['shape-1'], - type: DrawingApplyType.UPDATE, - }, undefined); - expect(pushUndoRedo).toHaveBeenCalledWith(expect.objectContaining({ - undoMutations: expect.arrayContaining([expect.objectContaining({ id: ClearSheetDrawingTransformerOperation.id, params: ['book-1'] })]), - redoMutations: expect.arrayContaining([expect.objectContaining({ id: ClearSheetDrawingTransformerOperation.id, params: ['book-1'] })]), - })); - - sheetDrawingService.getDrawingData.mockReturnValue({} as never); - expect(FlipSheetDrawingCommand.handler(accessor, { - unitId: 'book-1', - drawings: [{ unitId: 'book-1', subUnitId: 'sheet-1', drawingId: 'missing' }], - flipH: true, - })).toBe(false); - }); }); diff --git a/packages/sheets-drawing-ui/src/commands/commands/delete-drawings.command.ts b/packages/sheets-drawing-ui/src/commands/commands/delete-drawings.command.ts index de9fb9f945..a59dfe9bd6 100644 --- a/packages/sheets-drawing-ui/src/commands/commands/delete-drawings.command.ts +++ b/packages/sheets-drawing-ui/src/commands/commands/delete-drawings.command.ts @@ -15,11 +15,9 @@ */ import type { IAccessor, ICommand } from '@univerjs/core'; -import type { ISheetDrawing } from '@univerjs/sheets-drawing'; -import type { IDeleteDrawingCommandParams } from './interfaces'; +import type { IDeleteDrawingCommandParams, ISheetDrawing } from '@univerjs/sheets-drawing'; import { CommandType, ICommandService } from '@univerjs/core'; -import { ISheetDrawingService } from '@univerjs/sheets-drawing'; -import { RemoveSheetDrawingCommand } from './remove-sheet-drawing.command'; +import { ISheetDrawingService, RemoveSheetDrawingCommand } from '@univerjs/sheets-drawing'; export const DeleteDrawingsCommand: ICommand = { id: 'sheet.command.delete-drawing', diff --git a/packages/sheets-drawing-ui/src/commands/commands/flip-drawings.command.ts b/packages/sheets-drawing-ui/src/commands/commands/flip-drawings.command.ts index 7e5bd5dad4..68fbaa7511 100644 --- a/packages/sheets-drawing-ui/src/commands/commands/flip-drawings.command.ts +++ b/packages/sheets-drawing-ui/src/commands/commands/flip-drawings.command.ts @@ -27,9 +27,8 @@ import { } from '@univerjs/core'; import { getDrawingShapeKeyByDrawingSearch } from '@univerjs/drawing'; import { IRenderManagerService } from '@univerjs/engine-render'; -import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation } from '@univerjs/sheets-drawing'; -import { ISheetSelectionRenderService } from '@univerjs/sheets-ui'; -import { transformToAxisAlignPosition, transformToDrawingPosition } from '../../basics/transform-position'; +import { SheetSkeletonService } from '@univerjs/sheets'; +import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation, transformToAxisAlignPosition, transformToDrawingPosition } from '@univerjs/sheets-drawing'; import { ClearSheetDrawingTransformerOperation } from '../operations/clear-drawing-transformer.operation'; interface IFlipDrawingCommandParam { @@ -51,21 +50,18 @@ export const FlipSheetDrawingCommand: ICommand = { type: CommandType.COMMAND, // eslint-disable-next-line max-lines-per-function, complexity handler: (accessor: IAccessor, params?: IFlipSheetDrawingCommandParams) => { - const commandService = accessor.get(ICommandService); - const undoRedoService = accessor.get(IUndoRedoService); - - const sheetDrawingService = accessor.get(ISheetDrawingService); - const renderManagerService = accessor.get(IRenderManagerService); - if (!params) return false; - const { drawings } = params; + const commandService = accessor.get(ICommandService); + const undoRedoService = accessor.get(IUndoRedoService); + const sheetDrawingService = accessor.get(ISheetDrawingService); + const sheetSkeletonService = accessor.get(SheetSkeletonService); + const { drawings } = params; const flipH = params.flipH; const flipV = params.flipV; const unitIds: string[] = []; - const updateParams: any[] = []; for (const param of drawings) { @@ -78,6 +74,11 @@ export const FlipSheetDrawingCommand: ICommand = { continue; } + const skeleton = sheetSkeletonService.getSkeleton(unitId, subUnitId); + if (!skeleton) { + continue; + } + const transform = { ...existing.transform } as ITransformState; if (flipH) { @@ -87,14 +88,8 @@ export const FlipSheetDrawingCommand: ICommand = { transform.flipY = !transform.flipY; } - const render = renderManagerService.getRenderById(unitId); - const selectionRenderService = render?.with(ISheetSelectionRenderService); - if (!selectionRenderService) { - continue; - } - - const sheetTransform = transformToDrawingPosition(transform, selectionRenderService); - const axisAlignSheetTransform = transformToAxisAlignPosition(transform, selectionRenderService) as ISheetDrawingPosition; + const sheetTransform = transformToDrawingPosition(transform, skeleton); + const axisAlignSheetTransform = transformToAxisAlignPosition(transform, skeleton) as ISheetDrawingPosition; const updateParamItem: any = { unitId, diff --git a/packages/sheets-drawing-ui/src/commands/commands/move-drawings.command.ts b/packages/sheets-drawing-ui/src/commands/commands/move-drawings.command.ts index 1bbffa8f6a..a8b21aa485 100644 --- a/packages/sheets-drawing-ui/src/commands/commands/move-drawings.command.ts +++ b/packages/sheets-drawing-ui/src/commands/commands/move-drawings.command.ts @@ -15,15 +15,11 @@ */ import type { IAccessor, ICommand } from '@univerjs/core'; -import type { ISheetDrawing } from '@univerjs/sheets-drawing'; -import type { ISetDrawingCommandParams } from './interfaces'; +import type { ISetDrawingCommandParams, ISheetDrawing } from '@univerjs/sheets-drawing'; import { CommandType, Direction, ICommandService } from '@univerjs/core'; -import { ISheetDrawingService } from '@univerjs/sheets-drawing'; - -import { ISheetSelectionRenderService } from '@univerjs/sheets-ui'; -import { transformToAxisAlignPosition, transformToDrawingPosition } from '../../basics/transform-position'; +import { SheetSkeletonService } from '@univerjs/sheets'; +import { ISheetDrawingService, SetSheetDrawingCommand, transformToAxisAlignPosition, transformToDrawingPosition } from '@univerjs/sheets-drawing'; import { ClearSheetDrawingTransformerOperation } from '../operations/clear-drawing-transformer.operation'; -import { SetSheetDrawingCommand } from './set-sheet-drawing.command'; export interface IMoveDrawingsCommandParams { direction: Direction; @@ -35,7 +31,7 @@ export const MoveDrawingsCommand: ICommand = { handler: (accessor: IAccessor, params: IMoveDrawingsCommandParams) => { const commandService = accessor.get(ICommandService); const drawingManagerService = accessor.get(ISheetDrawingService); - const selectionRenderService = accessor.get(ISheetSelectionRenderService); + const sheetSkeletonService = accessor.get(SheetSkeletonService); const { direction } = params; @@ -48,12 +44,13 @@ export const MoveDrawingsCommand: ICommand = { const unitId = drawings[0].unitId; const newDrawings = drawings.map((drawing) => { - const { transform } = drawing as ISheetDrawing; - if (transform == null) { + const { transform, unitId, subUnitId } = drawing as ISheetDrawing; + const skeleton = sheetSkeletonService.getSkeleton(unitId, subUnitId); + if (!transform || !skeleton) { return null; } - const newTransform = { ...transform }; + const newTransform = { ...transform }; const { left = 0, top = 0 } = transform; if (direction === Direction.UP) { @@ -69,8 +66,8 @@ export const MoveDrawingsCommand: ICommand = { return { ...drawing, transform: newTransform, - sheetTransform: transformToDrawingPosition(newTransform, selectionRenderService), - axisAlignSheetTransform: transformToAxisAlignPosition(newTransform, selectionRenderService), + sheetTransform: transformToDrawingPosition(newTransform, skeleton), + axisAlignSheetTransform: transformToAxisAlignPosition(newTransform, skeleton), } as ISheetDrawing; }).filter((drawing) => drawing != null) as ISheetDrawing[]; diff --git a/packages/sheets-drawing-ui/src/controllers/render-controllers/sheet-drawing.render-controller.ts b/packages/sheets-drawing-ui/src/controllers/render-controllers/sheet-drawing.render-controller.ts index fe4db2abc2..28994425b9 100644 --- a/packages/sheets-drawing-ui/src/controllers/render-controllers/sheet-drawing.render-controller.ts +++ b/packages/sheets-drawing-ui/src/controllers/render-controllers/sheet-drawing.render-controller.ts @@ -17,17 +17,15 @@ import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; import { Disposable, Inject } from '@univerjs/core'; import { IDrawingManagerService } from '@univerjs/drawing'; -import { ISheetDrawingService } from '@univerjs/sheets-drawing'; -import { ISheetSelectionRenderService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; -import { drawingPositionToTransform } from '../../basics/transform-position'; +import { SheetSkeletonService } from '@univerjs/sheets'; +import { drawingPositionToTransform, ISheetDrawingService } from '@univerjs/sheets-drawing'; export class SheetsDrawingRenderController extends Disposable implements IRenderModule { constructor( private _context: IRenderContext, @ISheetDrawingService private readonly _sheetDrawingService: ISheetDrawingService, @IDrawingManagerService private readonly _drawingManagerService: IDrawingManagerService, - @Inject(ISheetSelectionRenderService) private _sheetSelectionRenderService: ISheetSelectionRenderService, - @Inject(SheetSkeletonManagerService) private _sheetSkeletonManagerService: SheetSkeletonManagerService + @Inject(SheetSkeletonService) private readonly _sheetSkeletonService: SheetSkeletonService ) { super(); @@ -46,8 +44,11 @@ export class SheetsDrawingRenderController extends Disposable implements IRender const subUnitData = data[subUnit]; for (const drawingId in subUnitData.data) { const drawingData = subUnitData.data[drawingId]; - if (drawingData.sheetTransform) { - drawingData.transform = drawingPositionToTransform(drawingData.sheetTransform, this._sheetSelectionRenderService, this._sheetSkeletonManagerService); + const { unitId, subUnitId } = drawingData; + const skeletonParam = this._sheetSkeletonService.getSkeletonParam(unitId, subUnitId); + + if (skeletonParam && drawingData.sheetTransform) { + drawingData.transform = drawingPositionToTransform(drawingData.sheetTransform, skeletonParam); } } } diff --git a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-copy-paste.controller.ts b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-copy-paste.controller.ts index 084e7c5ad9..dc8c4177b8 100644 --- a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-copy-paste.controller.ts +++ b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-copy-paste.controller.ts @@ -17,26 +17,21 @@ import type { IMutationInfo, IRange, Nullable } from '@univerjs/core'; import type { IDrawingJsonUndo1 } from '@univerjs/drawing'; import type { IDiscreteRange } from '@univerjs/sheets'; -import type { ISheetDrawing, ISheetImage } from '@univerjs/sheets-drawing'; +import type { IDeleteDrawingCommandParams, ISheetDrawing, ISheetImage } from '@univerjs/sheets-drawing'; import type { IPasteHookValueType, ISheetDiscreteRangeLocation } from '@univerjs/sheets-ui'; -import type { IDeleteDrawingCommandParams } from '../commands/commands/interfaces'; -import { Disposable, DrawingTypeEnum, generateRandomId, ICommandService } from '@univerjs/core'; +import { Disposable, DrawingTypeEnum, generateRandomId, ICommandService, Inject } from '@univerjs/core'; import { IDrawingManagerService, ImageSourceType } from '@univerjs/drawing'; import { IRenderManagerService } from '@univerjs/engine-render'; -import { discreteRangeToRange } from '@univerjs/sheets'; -import { DrawingApplyType, SetDrawingApplyMutation, SheetDrawingAnchorType } from '@univerjs/sheets-drawing'; +import { attachRangeWithCoord, discreteRangeToRange, SheetSkeletonService } from '@univerjs/sheets'; +import { DrawingApplyType, RemoveSheetDrawingCommand, SetDrawingApplyMutation, SheetDrawingAnchorType, transformToAxisAlignPosition, transformToDrawingPosition } from '@univerjs/sheets-drawing'; import { COPY_TYPE, ISheetClipboardService, - ISheetSelectionRenderService, PREDEFINED_HOOK_NAME_PASTE, - SheetSkeletonManagerService, virtualizeDiscreteRanges, } from '@univerjs/sheets-ui'; import { IClipboardInterfaceService } from '@univerjs/ui'; -import { transformToAxisAlignPosition, transformToDrawingPosition } from '../basics/transform-position'; import { InsertFloatImageCommand } from '../commands/commands/insert-image.command'; -import { RemoveSheetDrawingCommand } from '../commands/commands/remove-sheet-drawing.command'; const IMAGE_PNG_MIME_TYPE = 'image/png'; @@ -103,6 +98,7 @@ export class SheetsDrawingCopyPasteController extends Disposable { constructor( @ISheetClipboardService private _sheetClipboardService: ISheetClipboardService, @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, + @Inject(SheetSkeletonService) private readonly _sheetSkeletonService: SheetSkeletonService, @IDrawingManagerService private readonly _drawingService: IDrawingManagerService, @IClipboardInterfaceService private readonly _clipboardInterfaceService: IClipboardInterfaceService, @ICommandService private readonly _commandService: ICommandService @@ -173,11 +169,14 @@ export class SheetsDrawingCopyPasteController extends Disposable { } const { copyType = COPY_TYPE.COPY, pasteType } = payload; - const { range: copyRange } = pasteFrom || {}; - const { range: pasteRange, unitId, subUnitId } = pasteTo; + const { range: copyRange, unitId: fromUnitId, subUnitId: fromSubUnitId } = pasteFrom || {}; + const { range: pasteRange, unitId: toUnitId, subUnitId: toSubUnitId } = pasteTo; const mutations = this._copyInfo.copyRange - ? this._generateRangeDrawingsPasteMutations({ pasteType, unitId, subUnitId, pasteRange }, { copyRange, copyType }) + ? this._generateRangeDrawingsPasteMutations( + { unitId: toUnitId, subUnitId: toSubUnitId, pasteRange, pasteType }, + { unitId: fromUnitId, subUnitId: fromSubUnitId, copyType, copyRange } + ) : this._generateSingleDrawingPasteMutations({ pasteTo, pasteType }, COPY_TYPE.COPY); return mutations; @@ -220,13 +219,11 @@ export class SheetsDrawingCopyPasteController extends Disposable { } private _createDrawingsCopyInfoByRange(unitId: string, subUnitId: string, range: IRange) { - const skeletonManagerService = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService); - if (!skeletonManagerService) return; + const skeleton = this._sheetSkeletonService.getSkeleton(unitId, subUnitId); + if (!skeleton) return; - const selectionRect = skeletonManagerService.attachRangeWithCoord(range); - if (!selectionRect) { - return; - } + const selectionRect = attachRangeWithCoord(skeleton, range); + if (!selectionRect) return; const { startX, endX, startY, endY } = selectionRect; const drawings = this._drawingService.getDrawingData(unitId, subUnitId); @@ -279,18 +276,13 @@ export class SheetsDrawingCopyPasteController extends Disposable { } const { unitId, subUnitId, range } = pasteTo; - const render = this._renderManagerService.getRenderById(unitId); - const skeletonManagerService = render?.with(SheetSkeletonManagerService); - const selectionRenderService = render?.with(ISheetSelectionRenderService); - - const copyInfo = this._copyInfo!; - - if (!skeletonManagerService || !selectionRenderService) { + const pasteToSkeleton = this._sheetSkeletonService.getSkeleton(unitId, subUnitId); + if (!pasteToSkeleton) { return { redos: [], undos: [] }; } + const copyInfo = this._copyInfo!; const { drawings } = copyInfo; - const pasteRange = discreteRangeToRange(range); return this._generateMutations(drawings, { @@ -298,7 +290,7 @@ export class SheetsDrawingCopyPasteController extends Disposable { subUnitId, isCut: copyType === COPY_TYPE.CUT, getTransform: (transform, sheetTransform) => { - const pasteRect = skeletonManagerService.attachRangeWithCoord({ + const pasteRect = attachRangeWithCoord(pasteToSkeleton, { startRow: pasteRange.startRow, endRow: pasteRange.endRow, startColumn: pasteRange.startColumn, @@ -313,8 +305,8 @@ export class SheetsDrawingCopyPasteController extends Disposable { return { transform: newTransform, - sheetTransform: transformToDrawingPosition(newTransform, selectionRenderService) ?? sheetTransform, - axisAlignSheetTransform: transformToAxisAlignPosition(newTransform, selectionRenderService) ?? sheetTransform, + sheetTransform: transformToDrawingPosition(newTransform, pasteToSkeleton) ?? sheetTransform, + axisAlignSheetTransform: transformToAxisAlignPosition(newTransform, pasteToSkeleton) ?? sheetTransform, }; }, }); @@ -399,29 +391,25 @@ export class SheetsDrawingCopyPasteController extends Disposable { pasteType: IPasteHookValueType; }, copyContext: { - copyType: COPY_TYPE; + unitId?: string; + subUnitId?: string; copyRange?: IDiscreteRange; + copyType: COPY_TYPE; } ) { - const { - unitId, - subUnitId, - pasteType, - pasteRange, - } = pasteContext; + if (!this._copyInfo) { + return { redos: [], undos: [] }; + } - const { - copyRange, - copyType, - } = copyContext; + const { unitId: toUnitId, subUnitId: toSubUnitId, pasteRange, pasteType } = pasteContext; + const { unitId: fromUnitId, subUnitId: fromSubUnitId, copyRange, copyType } = copyContext; if (specialPastes.includes(pasteType)) { return { redos: [], undos: [] }; } - const skeletonManagerService = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService); - - if (!skeletonManagerService || !this._copyInfo) { + const toSkeleton = this._sheetSkeletonService.getSkeleton(toUnitId, toSubUnitId); + if (!toSkeleton) { return { redos: [], undos: [] }; } @@ -429,29 +417,34 @@ export class SheetsDrawingCopyPasteController extends Disposable { if (!copyRange) { return this._generateSingleDrawingPasteMutations({ - pasteTo: { unitId, subUnitId, range: discreteRangeToRange(pasteRange) as unknown as IDiscreteRange }, + pasteTo: { unitId: toUnitId, subUnitId: toSubUnitId, range: discreteRangeToRange(pasteRange) as unknown as IDiscreteRange }, pasteType, }, copyType); } + const fromSkeleton = this._sheetSkeletonService.getSkeleton(fromUnitId!, fromSubUnitId!); + if (!fromSkeleton) { + return { redos: [], undos: [] }; + } + const { ranges: [vCopyRange, vPastedRange], mapFunc } = virtualizeDiscreteRanges([copyRange, pasteRange]); const { row: copyRow, col: copyCol } = mapFunc(vCopyRange.startRow, vCopyRange.startColumn); const { row: pasteRow, col: pasteCol } = mapFunc(vPastedRange.startRow, vPastedRange.startColumn); - const copyRect = skeletonManagerService.attachRangeWithCoord({ + const copyRect = attachRangeWithCoord(fromSkeleton, { startRow: copyRow, endRow: copyRow, startColumn: copyCol, endColumn: copyCol, }); - const pasteRect = skeletonManagerService.attachRangeWithCoord({ + const pasteRect = attachRangeWithCoord(toSkeleton, { startRow: pasteRow, endRow: pasteRow, startColumn: pasteCol, endColumn: pasteCol, }); - if (!copyRect || !pasteRect || !this._copyInfo) { + if (!copyRect || !pasteRect) { return { redos: [], undos: [] }; } @@ -461,49 +454,14 @@ export class SheetsDrawingCopyPasteController extends Disposable { const columnOffset = pasteCol - copyCol; return this._generateMutations(drawings, { - unitId, - subUnitId, + unitId: toUnitId, + subUnitId: toSubUnitId, getTransform: (transform, sheetTransform) => { const newTransform = { ...transform, left: (transform?.left ?? 0) + leftOffset, top: (transform?.top ?? 0) + topOffset, }; - const render = this._renderManagerService.getRenderById(unitId); - const selectionRenderService = render?.with(ISheetSelectionRenderService); - - if (!selectionRenderService) { - // todo : if rotate has the angle, the axisAlignSheetTransform is not equal to sheetTransform, need to calculate the new axisAlignSheetTransform based on the new transform - return { - transform: newTransform, - sheetTransform: { - ...sheetTransform, - to: { - ...sheetTransform.to, - row: sheetTransform.to.row + rowOffset, - column: sheetTransform.to.column + columnOffset, - }, - from: { - ...sheetTransform.from, - row: sheetTransform.from.row + rowOffset, - column: sheetTransform.from.column + columnOffset, - }, - }, - axisAlignSheetTransform: { - ...sheetTransform, - to: { - ...sheetTransform.to, - row: sheetTransform.to.row + rowOffset, - column: sheetTransform.to.column + columnOffset, - }, - from: { - ...sheetTransform.from, - row: sheetTransform.from.row + rowOffset, - column: sheetTransform.from.column + columnOffset, - }, - }, - }; - } return { transform: newTransform, @@ -520,7 +478,7 @@ export class SheetsDrawingCopyPasteController extends Disposable { column: sheetTransform.from.column + columnOffset, }, }, - axisAlignSheetTransform: transformToAxisAlignPosition(newTransform, selectionRenderService) ?? sheetTransform, + axisAlignSheetTransform: transformToAxisAlignPosition(newTransform, toSkeleton) ?? sheetTransform, }; }, isCut: copyType === COPY_TYPE.CUT, diff --git a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-group-copy-paste.controller.ts b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-group-copy-paste.controller.ts index a85bba9eb4..e3be33381a 100644 --- a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-group-copy-paste.controller.ts +++ b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-group-copy-paste.controller.ts @@ -18,18 +18,12 @@ import type { IDrawingGroupNestedParam, IMutationInfo, Nullable } from '@univerj import type { IDrawingJsonUndo1 } from '@univerjs/drawing'; import type { ISheetDrawing } from '@univerjs/sheets-drawing'; import type { IPasteHookValueType, ISheetDiscreteRangeLocation } from '@univerjs/sheets-ui'; -import { Disposable, DrawingTypeEnum } from '@univerjs/core'; +import { Disposable, DrawingTypeEnum, Inject } from '@univerjs/core'; import { IDrawingManagerService } from '@univerjs/drawing'; import { IRenderManagerService } from '@univerjs/engine-render'; -import { discreteRangeToRange } from '@univerjs/sheets'; -import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation } from '@univerjs/sheets-drawing'; -import { - ISheetClipboardService, - ISheetSelectionRenderService, - PREDEFINED_HOOK_NAME_PASTE, - SheetSkeletonManagerService, -} from '@univerjs/sheets-ui'; -import { transformToAxisAlignPosition, transformToDrawingPosition } from '../basics/transform-position'; +import { attachRangeWithCoord, discreteRangeToRange, SheetSkeletonService } from '@univerjs/sheets'; +import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation, transformToAxisAlignPosition, transformToDrawingPosition } from '@univerjs/sheets-drawing'; +import { ISheetClipboardService, PREDEFINED_HOOK_NAME_PASTE } from '@univerjs/sheets-ui'; import { cloneGroupParams } from '../commands/commands/utils'; export interface IGroupFeaturePasteHookParams { @@ -68,6 +62,7 @@ export class SheetsDrawingGroupCopyPasteController extends Disposable { constructor( @ISheetClipboardService private readonly _sheetClipboardService: ISheetClipboardService, @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, + @Inject(SheetSkeletonService) private readonly _sheetSkeletonService: SheetSkeletonService, @ISheetDrawingService private readonly _sheetDrawingService: ISheetDrawingService, @IDrawingManagerService private readonly _drawingManagerService: IDrawingManagerService ) { @@ -139,12 +134,13 @@ export class SheetsDrawingGroupCopyPasteController extends Disposable { } private _generateGroupPasteMutations(pasteTo: ISheetDiscreteRangeLocation): { redos: IMutationInfo[]; undos: IMutationInfo[] } { - const { unitId, subUnitId, range } = pasteTo; - const render = this._renderManagerService.getRenderById(unitId); - const skeletonManagerService = render?.with(SheetSkeletonManagerService); - const selectionRenderService = render?.with(ISheetSelectionRenderService); + if (!this._copyInfo) { + return { redos: [], undos: [] }; + } - if (!skeletonManagerService || !selectionRenderService || !this._copyInfo) { + const { unitId, subUnitId, range } = pasteTo; + const pasteToSkeleton = this._sheetSkeletonService.getSkeleton(unitId, subUnitId); + if (!pasteToSkeleton) { return { redos: [], undos: [] }; } @@ -158,7 +154,7 @@ export class SheetsDrawingGroupCopyPasteController extends Disposable { // Resolve the paste destination rectangle. const pasteRange = discreteRangeToRange(range); - const pasteRect = skeletonManagerService.attachRangeWithCoord({ + const pasteRect = attachRangeWithCoord(pasteToSkeleton, { startRow: pasteRange.startRow, endRow: pasteRange.endRow, startColumn: pasteRange.startColumn, @@ -181,8 +177,8 @@ export class SheetsDrawingGroupCopyPasteController extends Disposable { unitId, subUnitId, transform: newTransform, - sheetTransform: transformToDrawingPosition(newTransform, selectionRenderService) ?? origRootGroup.sheetTransform, - axisAlignSheetTransform: transformToAxisAlignPosition(newTransform, selectionRenderService) ?? origRootGroup.sheetTransform, + sheetTransform: transformToDrawingPosition(newTransform, pasteToSkeleton) ?? origRootGroup.sheetTransform, + axisAlignSheetTransform: transformToAxisAlignPosition(newTransform, pasteToSkeleton) ?? origRootGroup.sheetTransform, } as ISheetDrawing; }), ]; diff --git a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-transform-affected.controller.ts b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-transform-affected.controller.ts index ad47abc3af..fb212a1ded 100644 --- a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-transform-affected.controller.ts +++ b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-transform-affected.controller.ts @@ -16,16 +16,77 @@ import type { ICommandInfo, IDrawingParam, IMutationInfo, IRange, ITransformState, Nullable, Workbook } from '@univerjs/core'; import type { IDrawingJsonUndo1 } from '@univerjs/drawing'; -import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; -import type { IInsertColCommandParams, IInsertRowCommandParams, IMoveColsCommandParams, IMoveRangeCommandParams, IMoveRowsCommandParams, IRemoveRowColCommandParams, ISetColHiddenMutationParams, ISetColVisibleMutationParams, ISetRowHiddenMutationParams, ISetRowVisibleMutationParams, ISetSpecificColsVisibleCommandParams, ISetSpecificRowsVisibleCommandParams, ISetWorksheetActiveOperationParams, ISetWorksheetColWidthMutationParams, ISetWorksheetRowAutoHeightMutationParams, ISetWorksheetRowHeightMutationParams, ISetWorksheetRowIsAutoHeightMutationParams } from '@univerjs/sheets'; +import type { IRenderContext, IRenderModule, SpreadsheetSkeleton } from '@univerjs/engine-render'; +import type { + IDeleteRangeMoveLeftCommandParams, + IDeleteRangeMoveUpCommandParams, + IDeltaColumnWidthCommandParams, + IDeltaRowHeightCommandParams, + IInsertColCommandParams, + IInsertRangeMoveDownCommandParams, + IInsertRangeMoveRightCommandParams, + IInsertRowCommandParams, + IMoveColsCommandParams, + IMoveRangeCommandParams, + IMoveRowsCommandParams, + IRemoveRowColCommandParams, + ISetColHiddenCommandParams, + ISetColHiddenMutationParams, + ISetColVisibleMutationParams, + ISetColWidthCommandParams, + ISetRowHeightCommandParams, + ISetRowHiddenCommandParams, + ISetRowHiddenMutationParams, + ISetRowVisibleMutationParams, + ISetSpecificColsVisibleCommandParams, + ISetSpecificRowsVisibleCommandParams, + ISetWorksheetActiveOperationParams, + ISetWorksheetColWidthMutationParams, + ISetWorksheetRowAutoHeightMutationParams, + ISetWorksheetRowHeightMutationParams, + ISetWorksheetRowIsAutoHeightMutationParams, + ISheetSkeletonManagerParam, +} from '@univerjs/sheets'; import type { ISheetDrawing, ISheetDrawingPosition } from '@univerjs/sheets-drawing'; -import { Disposable, ICommandService, Inject, IUniverInstanceService, Rectangle } from '@univerjs/core'; +import { Disposable, ICommandService, Inject, IUniverInstanceService, RANGE_TYPE, Rectangle } from '@univerjs/core'; import { IDrawingManagerService } from '@univerjs/drawing'; -import { IRenderManagerService } from '@univerjs/engine-render'; -import { DeleteRangeMoveLeftCommand, DeleteRangeMoveUpCommand, DeltaColumnWidthCommand, DeltaRowHeightCommand, getSheetCommandTarget, InsertColCommand, InsertRangeMoveDownCommand, InsertRangeMoveRightCommand, InsertRowCommand, MoveColsCommand, MoveRangeCommand, MoveRowsCommand, RemoveColCommand, RemoveRowCommand, SetColHiddenCommand, SetColHiddenMutation, SetColVisibleMutation, SetColWidthCommand, SetRowHeightCommand, SetRowHiddenCommand, SetRowHiddenMutation, SetRowVisibleMutation, SetSpecificColsVisibleCommand, SetSpecificRowsVisibleCommand, SetWorksheetActiveOperation, SetWorksheetColWidthMutation, SetWorksheetRowAutoHeightMutation, SetWorksheetRowHeightMutation, SetWorksheetRowIsAutoHeightMutation, SheetInterceptorService } from '@univerjs/sheets'; -import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation, SheetDrawingAnchorType } from '@univerjs/sheets-drawing'; -import { attachRangeWithCoord, ISheetSelectionRenderService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; -import { drawingPositionToTransform, transformToAxisAlignPosition, transformToDrawingPosition } from '../basics/transform-position'; +import { + attachRangeWithCoord, + DeleteRangeMoveLeftCommand, + DeleteRangeMoveUpCommand, + DeltaColumnWidthCommand, + DeltaRowHeightCommand, + getSheetCommandTarget, + InsertColCommand, + InsertRangeMoveDownCommand, + InsertRangeMoveRightCommand, + InsertRowCommand, + MoveColsCommand, + MoveRangeCommand, + MoveRowsCommand, + RemoveColCommand, + RemoveRowCommand, + SetColHiddenCommand, + SetColHiddenMutation, + SetColVisibleMutation, + SetColWidthCommand, + SetRowHeightCommand, + SetRowHiddenCommand, + SetRowHiddenMutation, + SetRowVisibleMutation, + SetSpecificColsVisibleCommand, + SetSpecificRowsVisibleCommand, + SetWorksheetActiveOperation, + SetWorksheetColWidthMutation, + SetWorksheetRowAutoHeightMutation, + SetWorksheetRowHeightMutation, + SetWorksheetRowIsAutoHeightMutation, + SheetInterceptorService, + SheetSkeletonService, + SheetsSelectionsService, +} from '@univerjs/sheets'; +import { DrawingApplyType, drawingPositionToTransform, ISheetDrawingService, SetDrawingApplyMutation, SheetDrawingAnchorType, transformToAxisAlignPosition, transformToDrawingPosition } from '@univerjs/sheets-drawing'; +import { ISheetSelectionRenderService } from '@univerjs/sheets-ui'; import { ClearSheetDrawingTransformerOperation } from '../commands/operations/clear-drawing-transformer.operation'; enum RangeMoveUndoType { @@ -74,11 +135,11 @@ const REFRESH_MUTATIONS = [ export class SheetDrawingTransformAffectedController extends Disposable implements IRenderModule { constructor( private readonly _context: IRenderContext, - @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, @ICommandService private readonly _commandService: ICommandService, + @Inject(SheetSkeletonService) private readonly _sheetSkeletonService: SheetSkeletonService, @ISheetSelectionRenderService private readonly _selectionRenderService: ISheetSelectionRenderService, - @Inject(SheetSkeletonManagerService) private readonly _skeletonManagerService: SheetSkeletonManagerService, @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService, + @Inject(SheetsSelectionsService) private readonly _selectionManagerService: SheetsSelectionsService, @ISheetDrawingService private readonly _sheetDrawingService: ISheetDrawingService, @IDrawingManagerService private readonly _drawingManagerService: IDrawingManagerService, @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService @@ -90,53 +151,132 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen this._sheetRefreshListener(); } + // eslint-disable-next-line max-lines-per-function private _sheetInterceptorListener() { this.disposeWithMe( this._sheetInterceptorService.interceptAfterCommand({ - /* eslint-disable-next-line complexity */ + // eslint-disable-next-line max-lines-per-function,complexity getMutations: (commandInfo) => { - if (!UPDATE_COMMANDS.includes(commandInfo.id)) { + const { id, params } = commandInfo; + + if (!UPDATE_COMMANDS.includes(id) || !params) { return { redos: [], undos: [] }; } - if (commandInfo.params == null) { - return { redos: [], undos: [] }; - } - const cId = commandInfo.id; - if (cId === InsertRowCommand.id) { - return this._moveRowInterceptor(commandInfo.params as IInsertRowCommandParams, 'insert'); - } else if ([MoveColsCommand.id, MoveRowsCommand.id, MoveRangeCommand.id].includes(cId)) { - return this._moveRangeInterceptor(commandInfo.params as IMoveRangeCommandParams); - } else if (cId === InsertColCommand.id) { - return this._moveColInterceptor(commandInfo.params as IInsertColCommandParams, 'insert'); - } else if (cId === RemoveRowCommand.id) { - return this._moveRowInterceptor(commandInfo.params as IRemoveRowColCommandParams, 'remove'); - } else if (cId === RemoveColCommand.id) { - return this._moveColInterceptor(commandInfo.params as IRemoveRowColCommandParams, 'remove'); - } else if (cId === DeleteRangeMoveLeftCommand.id) { - const { range } = commandInfo.params as IRemoveRowColCommandParams; + + if (id === InsertRowCommand.id) { + return this._moveRowInterceptor(params as IInsertRowCommandParams, 'insert'); + } else if ([MoveColsCommand.id, MoveRowsCommand.id, MoveRangeCommand.id].includes(id)) { + let target; + if (id === MoveRangeCommand.id) { + const _params = params as IMoveRangeCommandParams; + + // This is a cross-worksheet cut operation, not need handle drawing transform + if ( + (_params.toUnitId && _params.fromUnitId && _params.toUnitId !== _params.fromUnitId) || + (_params.toSubUnitId && _params.fromSubUnitId && _params.toSubUnitId !== _params.fromSubUnitId) + ) { + return { redos: [], undos: [] }; + } + + target = getSheetCommandTarget(this._univerInstanceService, { unitId: _params.toUnitId, subUnitId: _params.toSubUnitId }); + } else { + target = getSheetCommandTarget(this._univerInstanceService, params as IMoveColsCommandParams | IMoveRowsCommandParams); + } + + if (!target) { + return { redos: [], undos: [] }; + } + + const { unitId, subUnitId } = target; + const { fromRange, toRange } = params as IMoveRangeCommandParams | IMoveRowsCommandParams | IMoveColsCommandParams; + + return this._moveRangeInterceptor(unitId, subUnitId, fromRange, toRange); + } else if (id === InsertColCommand.id) { + return this._moveColInterceptor(params as IInsertColCommandParams, 'insert'); + } else if (id === RemoveRowCommand.id) { + return this._moveRowInterceptor(params as IRemoveRowColCommandParams, 'remove'); + } else if (id === RemoveColCommand.id) { + return this._moveColInterceptor(params as IRemoveRowColCommandParams, 'remove'); + } else if (id === DeleteRangeMoveLeftCommand.id) { + const { range } = params as IDeleteRangeMoveLeftCommandParams; return this._getRangeMoveUndo(range, RangeMoveUndoType.deleteLeft); - } else if (cId === DeleteRangeMoveUpCommand.id) { - const { range } = commandInfo.params as IRemoveRowColCommandParams; + } else if (id === DeleteRangeMoveUpCommand.id) { + const { range } = params as IDeleteRangeMoveUpCommandParams; return this._getRangeMoveUndo(range, RangeMoveUndoType.deleteUp); - } else if (cId === InsertRangeMoveDownCommand.id) { - const { range } = commandInfo.params as IRemoveRowColCommandParams; + } else if (id === InsertRangeMoveDownCommand.id) { + const { range } = params as IInsertRangeMoveDownCommandParams; return this._getRangeMoveUndo(range, RangeMoveUndoType.insertDown); - } else if (cId === InsertRangeMoveRightCommand.id) { - const { range } = commandInfo.params as IRemoveRowColCommandParams; + } else if (id === InsertRangeMoveRightCommand.id) { + const { range } = params as IInsertRangeMoveRightCommandParams; return this._getRangeMoveUndo(range, RangeMoveUndoType.insertRight); - } else if (cId === SetRowHiddenCommand.id || cId === SetSpecificRowsVisibleCommand.id) { - const params = commandInfo.params as ISetRowHiddenMutationParams | ISetSpecificRowsVisibleCommandParams; - const { unitId, subUnitId, ranges } = params; + } else if (id === SetRowHiddenCommand.id || id === SetSpecificRowsVisibleCommand.id) { + const _params = params as ISetRowHiddenCommandParams | ISetSpecificRowsVisibleCommandParams; + const target = getSheetCommandTarget(this._univerInstanceService, _params); + if (!target) { + return { redos: [], undos: [] }; + } + + const { unitId, subUnitId } = target; + const ranges = _params.ranges || this._selectionManagerService.getCurrentSelections()?.map((s) => s.range).filter((r) => r.rangeType === RANGE_TYPE.ROW); + if (!ranges || ranges.length === 0) { + return { redos: [], undos: [] }; + } + return this._getDrawingUndoForRowVisible(unitId, subUnitId, ranges); - } else if (cId === SetSpecificColsVisibleCommand.id || cId === SetColHiddenCommand.id) { - const params = commandInfo.params as ISetSpecificColsVisibleCommandParams | ISetColHiddenMutationParams; - const { unitId, subUnitId, ranges } = params; + } else if (id === SetColHiddenCommand.id || id === SetSpecificColsVisibleCommand.id) { + const _params = params as ISetColHiddenCommandParams | ISetSpecificColsVisibleCommandParams; + const target = getSheetCommandTarget(this._univerInstanceService, _params); + if (!target) { + return { redos: [], undos: [] }; + } + + const { unitId, subUnitId } = target; + const ranges = _params.ranges || this._selectionManagerService.getCurrentSelections()?.map((s) => s.range).filter((r) => r.rangeType === RANGE_TYPE.COLUMN); + if (!ranges || ranges.length === 0) { + return { redos: [], undos: [] }; + } + return this._getDrawingUndoForColVisible(unitId, subUnitId, ranges); - } else if (cId === DeltaRowHeightCommand.id || cId === SetRowHeightCommand.id || cId === DeltaColumnWidthCommand.id || cId === SetColWidthCommand.id) { - const params = commandInfo.params as ISetWorksheetRowHeightMutationParams | ISetWorksheetColWidthMutationParams; - const { unitId, subUnitId, ranges } = params; - const isRow = cId === DeltaRowHeightCommand.id || cId === SetRowHeightCommand.id; - return this._getDrawingUndoForRowAndColSize(unitId, subUnitId, ranges, isRow); + } else if (id === DeltaRowHeightCommand.id || id === DeltaColumnWidthCommand.id) { + const target = getSheetCommandTarget(this._univerInstanceService); + if (!target) { + return { redos: [], undos: [] }; + } + + const { unitId, subUnitId, worksheet } = target; + const ranges: IRange[] = []; + + if (id === DeltaRowHeightCommand.id) { + ranges.push({ + startRow: (params as IDeltaRowHeightCommandParams).anchorRow, + endRow: (params as IDeltaRowHeightCommandParams).anchorRow, + startColumn: 0, + endColumn: worksheet.getColumnCount() - 1, + }); + } else { + ranges.push({ + startRow: 0, + endRow: worksheet.getRowCount() - 1, + startColumn: (params as IDeltaColumnWidthCommandParams).anchorCol, + endColumn: (params as IDeltaColumnWidthCommandParams).anchorCol, + }); + } + + return this._getDrawingUndoForRowAndColSize(unitId, subUnitId, ranges); + } else if (id === SetRowHeightCommand.id || id === SetColWidthCommand.id) { + const _params = params as ISetRowHeightCommandParams | ISetColWidthCommandParams; + const target = getSheetCommandTarget(this._univerInstanceService, _params); + if (!target) { + return { redos: [], undos: [] }; + } + + const { unitId, subUnitId } = target; + const ranges = _params.ranges || this._selectionManagerService.getCurrentSelections()?.map((s) => s.range); + if (!ranges || ranges.length === 0) { + return { redos: [], undos: [] }; + } + + return this._getDrawingUndoForRowAndColSize(unitId, subUnitId, ranges); } return { redos: [], undos: [] }; @@ -146,19 +286,17 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen } private _getRangeMoveUndo(range: IRange, type: RangeMoveUndoType) { - const newParams = getSheetCommandTarget(this._univerInstanceService); - - if (newParams == null) { + const target = getSheetCommandTarget(this._univerInstanceService); + if (!target) { return { redos: [], undos: [] }; } - const unitId = newParams.unitId; - const subUnitId = newParams.subUnitId; + + const { unitId, subUnitId } = target; + const drawingData = this._sheetDrawingService.getDrawingData(unitId, subUnitId); const redos: IMutationInfo[] = []; const undos: IMutationInfo[] = []; - const drawingData = this._sheetDrawingService.getDrawingData(unitId, subUnitId); - const updateDrawings: Partial[] = []; const deleteDrawings: Partial[] = []; @@ -200,23 +338,26 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen }; } + // eslint-disable-next-line max-lines-per-function,complexity private _getUpdateOrDeleteDrawings(range: IRange, type: RangeMoveUndoType, drawing: ISheetDrawing) { const updateDrawings: Partial[] = []; const deleteDrawings: Partial[] = []; const { sheetTransform, anchorType = SheetDrawingAnchorType.Position, transform, unitId, subUnitId, drawingId } = drawing; - const { from, to } = sheetTransform; - const { row: fromRow, column: fromColumn } = from; - const { row: toRow, column: toColumn } = to; + const sheetSkeletonParam = this._sheetSkeletonService.getSkeletonParam(unitId, subUnitId); - if (sheetTransform == null || transform == null) { + if (!sheetTransform || !transform || !sheetSkeletonParam) { return { updateDrawings, deleteDrawings, }; } + const { from, to } = sheetTransform; + const { row: fromRow, column: fromColumn } = from; + const { row: toRow, column: toColumn } = to; const { startRow, endRow, startColumn, endColumn } = range; + let newSheetTransform: Nullable = null; let newTransform: Nullable = null; let axisAlignSheetTransform: ISheetDrawingPosition | undefined; @@ -227,7 +368,12 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen deleteDrawings.push({ unitId, subUnitId, drawingId }); } else { // move drawing left - const param = this._shrinkCol(sheetTransform, transform, startColumn, endColumn, anchorType); + const param = this._shrinkCol(startColumn, endColumn, { + sheetSkeletonParam, + sheetTransform, + transform, + anchorType, + }); newSheetTransform = param?.newSheetTransform; newTransform = param?.newTransform; axisAlignSheetTransform = param?.axisAlignSheetTransform ?? undefined; @@ -238,35 +384,50 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen deleteDrawings.push({ unitId, subUnitId, drawingId }); } else { // move drawing up - const param = this._shrinkRow(sheetTransform, transform, startRow, endRow, anchorType); + const param = this._shrinkRow(startRow, endRow, { + sheetSkeletonParam, + sheetTransform, + transform, + anchorType, + }); newSheetTransform = param?.newSheetTransform; newTransform = param?.newTransform; axisAlignSheetTransform = param?.axisAlignSheetTransform ?? undefined; } } else if (type === RangeMoveUndoType.insertDown) { - const param = this._expandRow(sheetTransform, transform, startRow, endRow, anchorType); + const param = this._expandRow(startRow, endRow, { + sheetSkeletonParam, + sheetTransform, + transform, + anchorType, + }); newSheetTransform = param?.newSheetTransform; newTransform = param?.newTransform; axisAlignSheetTransform = param?.axisAlignSheetTransform ?? undefined; } else if (type === RangeMoveUndoType.insertRight) { - const param = this._expandCol(sheetTransform, transform, startColumn, endColumn, anchorType); + const param = this._expandCol(startColumn, endColumn, { + sheetSkeletonParam, + sheetTransform, + transform, + anchorType, + }); newSheetTransform = param?.newSheetTransform; newTransform = param?.newTransform; axisAlignSheetTransform = param?.axisAlignSheetTransform ?? undefined; } - if (newSheetTransform != null && newTransform != null) { - const newTransform = drawingPositionToTransform(newSheetTransform, this._selectionRenderService, this._skeletonManagerService); + if (newSheetTransform && newTransform) { + const newTransform = drawingPositionToTransform(newSheetTransform, sheetSkeletonParam); updateDrawings.push({ ...drawing, sheetTransform: newSheetTransform, transform: newTransform, axisAlignSheetTransform }); } return { updateDrawings, deleteDrawings }; } - private _remainDrawingSize(transform: Nullable, updateDrawings: ISheetDrawing[], drawing: ISheetDrawing) { - const newSheetTransform = transformToDrawingPosition({ ...transform }, this._selectionRenderService); - if (newSheetTransform != null) { - const axisAlignSheetTransform = transformToAxisAlignPosition({ ...transform }, this._selectionRenderService) as ISheetDrawingPosition; + private _remainDrawingSize(transform: Nullable, updateDrawings: ISheetDrawing[], drawing: ISheetDrawing, skeleton: SpreadsheetSkeleton) { + const newSheetTransform = transformToDrawingPosition({ ...transform }, skeleton); + if (newSheetTransform) { + const axisAlignSheetTransform = transformToAxisAlignPosition({ ...transform }, skeleton) as ISheetDrawingPosition; updateDrawings.push({ ...drawing, sheetTransform: newSheetTransform, @@ -277,99 +438,124 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen // eslint-disable-next-line max-lines-per-function private _getDrawingUndoForColVisible(unitId: string, subUnitId: string, ranges: IRange[]) { + const skeleton = this._sheetSkeletonService.getSkeleton(unitId, subUnitId); + if (!skeleton) { + return { redos: [], undos: [] }; + } + const drawingData = this._drawingManagerService.getDrawingData(unitId, subUnitId); const updateDrawings: ISheetDrawing[] = []; const preUpdateDrawings: ISheetDrawing[] = []; + // eslint-disable-next-line complexity, max-lines-per-function Object.keys(drawingData).forEach((drawingId) => { const drawing = drawingData[drawingId] as ISheetDrawing; const { sheetTransform, transform, anchorType = SheetDrawingAnchorType.Position } = drawing; + if (anchorType === SheetDrawingAnchorType.None) { - this._remainDrawingSize(transform, updateDrawings, drawing); + this._remainDrawingSize(transform, updateDrawings, drawing, skeleton); } else { const { from, to } = sheetTransform; const { row: fromRow, column: fromColumn } = from; const { row: toRow, column: toColumn } = to; + for (let i = 0; i < ranges.length; i++) { const range = ranges[i]; - const { startRow, endRow, startColumn, endColumn } = range; + const { startColumn, endColumn } = range; + if (toColumn < startColumn) { continue; } + if (anchorType === SheetDrawingAnchorType.Position) { let newSheetTransform: Nullable = null; let newTransform: Nullable = null; + if (fromColumn >= startColumn && fromColumn <= endColumn) { - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn: fromColumn, endColumn, startRow: from.row, endRow: to.row }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn: fromColumn, + endColumn, + startRow: fromRow, + endRow: toRow, + }); newTransform = { ...transform, left: selectionCell.startX }; } - if (newTransform != null) { - newSheetTransform = transformToDrawingPosition(newTransform, this._selectionRenderService); - const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, this._selectionRenderService) as ISheetDrawingPosition; - if (newSheetTransform != null && newTransform != null) { + + if (newTransform) { + newSheetTransform = transformToDrawingPosition(newTransform, skeleton); + const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, skeleton) as ISheetDrawingPosition; + + if (newSheetTransform && newTransform) { updateDrawings.push({ ...drawing, sheetTransform: newSheetTransform, transform: newTransform, axisAlignSheetTransform }); break; } } - this._remainDrawingSize(transform, updateDrawings, drawing); + this._remainDrawingSize(transform, updateDrawings, drawing, skeleton); continue; } + if (fromColumn >= startColumn && toColumn <= endColumn) { continue; } + let newSheetTransform: Nullable = null; let newTransform: Nullable = null; if (fromColumn >= startColumn && fromColumn <= endColumn) { - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn: fromColumn, endColumn, startRow: from.row, endRow: to.row }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn: fromColumn, + endColumn, + startRow: fromRow, + endRow: toRow, + }); newTransform = { ...transform, left: (selectionCell?.startX || 0), width: (transform?.width || 0) - selectionCell.endX + selectionCell.startX, }; } else if (toColumn >= startColumn && toColumn <= endColumn) { - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn, endColumn: toColumn, startRow: from.row, endRow: to.row }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn, + endColumn: toColumn, + startRow: fromRow, + endRow: toRow, + }); newTransform = { ...transform, left: selectionCell.startX - (transform?.width || 0), }; } else { - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn, endColumn, startRow: from.row, endRow: to.row }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn, + endColumn, + startRow: fromRow, + endRow: toRow, + }); newTransform = { ...transform, width: (transform?.width || 0) - selectionCell.endX + selectionCell.startX, }; - newSheetTransform = transformToDrawingPosition(newTransform, this._selectionRenderService); - if (newSheetTransform != null && newTransform != null) { - const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, this._selectionRenderService) as ISheetDrawingPosition; + newSheetTransform = transformToDrawingPosition(newTransform, skeleton); + + if (newSheetTransform && newTransform) { + const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, skeleton) as ISheetDrawingPosition; preUpdateDrawings.push({ ...drawing, sheetTransform: newSheetTransform, transform: newTransform, axisAlignSheetTransform }); break; } } - if (newTransform != null) { - newSheetTransform = transformToDrawingPosition(newTransform, this._selectionRenderService); + if (newTransform) { + newSheetTransform = transformToDrawingPosition(newTransform, skeleton); } - if (newTransform != null && newSheetTransform != null) { - const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, this._selectionRenderService) as ISheetDrawingPosition; + + if (newTransform && newSheetTransform) { + const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, skeleton) as ISheetDrawingPosition; updateDrawings.push({ ...drawing, sheetTransform: newSheetTransform, transform: newTransform, axisAlignSheetTransform }); break; } else { - this._remainDrawingSize(transform, updateDrawings, drawing); + this._remainDrawingSize(transform, updateDrawings, drawing, skeleton); } } } @@ -418,100 +604,124 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen // eslint-disable-next-line max-lines-per-function private _getDrawingUndoForRowVisible(unitId: string, subUnitId: string, ranges: IRange[]) { - const drawingData = this._drawingManagerService.getDrawingData(unitId, subUnitId); + const skeleton = this._sheetSkeletonService.getSkeleton(unitId, subUnitId); + if (!skeleton) { + return { redos: [], undos: [] }; + } + const drawingData = this._drawingManagerService.getDrawingData(unitId, subUnitId); const updateDrawings: ISheetDrawing[] = []; const preUpdateDrawings: ISheetDrawing[] = []; + // eslint-disable-next-line complexity, max-lines-per-function Object.keys(drawingData).forEach((drawingId) => { const drawing = drawingData[drawingId] as ISheetDrawing; const { sheetTransform, transform, anchorType = SheetDrawingAnchorType.Position } = drawing; + if (anchorType === SheetDrawingAnchorType.None) { - this._remainDrawingSize(transform, updateDrawings, drawing); + this._remainDrawingSize(transform, updateDrawings, drawing, skeleton); } else { const { from, to } = sheetTransform; const { row: fromRow, column: fromColumn } = from; const { row: toRow, column: toColumn } = to; + for (let i = 0; i < ranges.length; i++) { const range = ranges[i]; - const { startRow, endRow, startColumn, endColumn } = range; + const { startRow, endRow } = range; + if (toRow < startRow) { continue; } + if (anchorType === SheetDrawingAnchorType.Position) { let newSheetTransform: Nullable = null; let newTransform: Nullable = null; + if (fromRow >= startRow && fromRow <= endRow) { - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn: from.column, endColumn: to.column, startRow: fromRow, endRow }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn: fromColumn, + endColumn: toColumn, + startRow: fromRow, + endRow, + }); newTransform = { ...transform, top: selectionCell.startY }; } - if (newTransform != null) { - newSheetTransform = transformToDrawingPosition(newTransform, this._selectionRenderService); - const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, this._selectionRenderService) as ISheetDrawingPosition; - if (newSheetTransform != null && newTransform != null) { + + if (newTransform) { + newSheetTransform = transformToDrawingPosition(newTransform, skeleton); + const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, skeleton) as ISheetDrawingPosition; + + if (newSheetTransform && newTransform) { updateDrawings.push({ ...drawing, sheetTransform: newSheetTransform, transform: newTransform, axisAlignSheetTransform }); break; } } - this._remainDrawingSize(transform, updateDrawings, drawing); + this._remainDrawingSize(transform, updateDrawings, drawing, skeleton); continue; } + if (fromRow >= startRow && toRow <= endRow) { continue; } + let newSheetTransform: Nullable = null; let newTransform: Nullable = null; if (fromRow >= startRow && fromRow <= endRow) { - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn: from.column, endColumn: to.column, startRow: fromRow, endRow }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn: fromColumn, + endColumn: toColumn, + startRow: fromRow, + endRow, + }); newTransform = { ...transform, top: (selectionCell?.startY || 0), height: (transform?.height || 0) - selectionCell.endY + selectionCell.startY, }; } else if (toRow >= startRow && toRow <= endRow) { - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn: from.column, endColumn: to.column, startRow, endRow: toRow }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn: fromColumn, + endColumn: toColumn, + startRow, + endRow: toRow, + }); newTransform = { ...transform, top: selectionCell.startY - (transform?.height || 0), }; } else { - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn: from.column, endColumn: to.column, startRow, endRow }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn: fromColumn, + endColumn: toColumn, + startRow, + endRow, + }); newTransform = { ...transform, height: (transform?.height || 0) - selectionCell.endY + selectionCell.startY, }; - newSheetTransform = transformToDrawingPosition(newTransform, this._selectionRenderService); - if (newSheetTransform != null && newTransform != null) { - const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, this._selectionRenderService) as ISheetDrawingPosition; + newSheetTransform = transformToDrawingPosition(newTransform, skeleton); + + if (newSheetTransform && newTransform) { + const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, skeleton) as ISheetDrawingPosition; preUpdateDrawings.push({ ...drawing, sheetTransform: newSheetTransform, transform: newTransform, axisAlignSheetTransform }); break; } } - if (newTransform != null) { - newSheetTransform = transformToDrawingPosition(newTransform, this._selectionRenderService); + if (newTransform) { + newSheetTransform = transformToDrawingPosition(newTransform, skeleton); } - if (newTransform != null && newSheetTransform != null) { - const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, this._selectionRenderService) as ISheetDrawingPosition; + + if (newTransform && newSheetTransform) { + const axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, skeleton) as ISheetDrawingPosition; updateDrawings.push({ ...drawing, sheetTransform: newSheetTransform, transform: newTransform, axisAlignSheetTransform }); break; } else { - this._remainDrawingSize(transform, updateDrawings, drawing); + this._remainDrawingSize(transform, updateDrawings, drawing, skeleton); } } } @@ -540,20 +750,27 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen }; } - private _getDrawingUndoForRowAndColSize(unitId: string, subUnitId: string, ranges: IRange[], isRow: boolean) { - const drawingData = this._drawingManagerService.getDrawingData(unitId, subUnitId); + private _getDrawingUndoForRowAndColSize(unitId: string, subUnitId: string, ranges: IRange[]) { + const sheetSkeletonParam = this._sheetSkeletonService.getSkeletonParam(unitId, subUnitId); + if (!sheetSkeletonParam) { + return { redos: [], undos: [] }; + } + const { skeleton } = sheetSkeletonParam; + const drawingData = this._drawingManagerService.getDrawingData(unitId, subUnitId); const updateDrawings: ISheetDrawing[] = []; Object.keys(drawingData).forEach((drawingId) => { const drawing = drawingData[drawingId] as ISheetDrawing; const { sheetTransform, transform, anchorType = SheetDrawingAnchorType.Position } = drawing; + if (anchorType === SheetDrawingAnchorType.None) { - this._remainDrawingSize(transform, updateDrawings, drawing); + this._remainDrawingSize(transform, updateDrawings, drawing, skeleton); } else { const { from, to } = sheetTransform; const { row: fromRow, column: fromColumn } = from; const { row: toRow, column: toColumn } = to; + for (let i = 0; i < ranges.length; i++) { const range = ranges[i]; const { startRow, endRow, startColumn, endColumn } = range; @@ -564,13 +781,14 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen if (anchorType === SheetDrawingAnchorType.Position) { if ((fromRow <= startRow && toRow >= endRow) || (fromColumn <= startColumn && toColumn >= endColumn)) { - this._remainDrawingSize(transform, updateDrawings, drawing); + this._remainDrawingSize(transform, updateDrawings, drawing, skeleton); continue; } } - const newTransform = drawingPositionToTransform({ ...sheetTransform }, this._selectionRenderService, this._skeletonManagerService); - if (newTransform != null) { + const newTransform = drawingPositionToTransform({ ...sheetTransform }, sheetSkeletonParam); + + if (newTransform) { updateDrawings.push({ ...drawing, transform: newTransform, @@ -589,37 +807,27 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen } private _getUnitIdAndSubUnitId(params: IInsertRowCommandParams | IRemoveRowColCommandParams, type: 'insert' | 'remove') { - let unitId: string; - let subUnitId: string; + let target; if (type === 'insert') { - unitId = (params as IInsertRowCommandParams).unitId; - subUnitId = (params as IInsertRowCommandParams).subUnitId; + target = getSheetCommandTarget(this._univerInstanceService, params as IInsertRowCommandParams); } else { - const newParams = getSheetCommandTarget(this._univerInstanceService); - if (newParams == null) { - return; - } - unitId = newParams.unitId; - subUnitId = newParams.subUnitId; + target = getSheetCommandTarget(this._univerInstanceService); } + if (!target) return; + + const { unitId, subUnitId } = target; + return { unitId, subUnitId }; } - private _moveRangeInterceptor(params: IMoveRangeCommandParams | IMoveRowsCommandParams | IMoveColsCommandParams) { - const { toRange, fromRange } = params; - const target = getSheetCommandTarget(this._univerInstanceService); - if (!target) { - return { redos: [], undos: [] }; - } - - const { unitId, subUnitId } = target; - - const skeleton = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService)?.getCurrentSkeleton(); - if (!skeleton) { + private _moveRangeInterceptor(unitId: string, subUnitId: string, fromRange: IRange, toRange: IRange) { + const sheetSkeletonParam = this._sheetSkeletonService.getSkeletonParam(unitId, subUnitId); + if (!sheetSkeletonParam) { return { redos: [], undos: [] }; } + const { skeleton } = sheetSkeletonParam; const selectionRect = attachRangeWithCoord(skeleton, fromRange); if (!selectionRect) { return { redos: [], undos: [] }; @@ -634,8 +842,8 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen if (drawing.anchorType !== SheetDrawingAnchorType.Both) { return; } - const { transform } = drawing; + const { transform } = drawing; if (!transform) { return; } @@ -664,7 +872,7 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen to: { ...oldSheetTransform.to, row: oldSheetTransform.to.row + rowOffset, column: oldSheetTransform.to.column + colOffset }, from: { ...oldSheetTransform.from, row: oldSheetTransform.from.row + rowOffset, column: oldSheetTransform.from.column + colOffset }, }; - const transform = drawingPositionToTransform(sheetTransform, this._selectionRenderService, this._skeletonManagerService); + const transform = drawingPositionToTransform(sheetTransform, sheetSkeletonParam); const params = { unitId, subUnitId, @@ -675,35 +883,31 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen return params; }); - if (updateDrawings.length) { - // redos.push({ id: SetDrawingApplyMutation.id, params: { unitId, subUnitId, op: redo, objects, type: DrawingApplyType.UPDATE } }); - // undos.push({ id: SetDrawingApplyMutation.id, params: { unitId, subUnitId, op: undo, objects, type: DrawingApplyType.UPDATE } }); - // const params = { unitId, subUnitId, drawingId, transform: newTransform, sheetTransform: newSheetTransform }; + if (updateDrawings.length) { const updateJsonOp = this._sheetDrawingService.getBatchUpdateOp(updateDrawings as ISheetDrawing[]) as IDrawingJsonUndo1; const { undo, redo, objects } = updateJsonOp; redos.push({ id: SetDrawingApplyMutation.id, params: { unitId, subUnitId, op: redo, objects, type: DrawingApplyType.UPDATE } }); undos.push({ id: SetDrawingApplyMutation.id, params: { unitId, subUnitId, op: undo, objects, type: DrawingApplyType.UPDATE } }); - // updateDrawings.push(params); - // this._copyInfo = { - // drawings: containedDrawings, - // unitId, - // subUnitId, - // }; } - // console.log(params, '_moveRangeInterceptor') return { redos, undos }; } + // eslint-disable-next-line max-lines-per-function private _moveRowInterceptor(params: IInsertRowCommandParams | IRemoveRowColCommandParams, type: 'insert' | 'remove') { - const ids = this._getUnitIdAndSubUnitId(params, type); - if (ids == null) { + const target = this._getUnitIdAndSubUnitId(params, type); + if (!target) { return { redos: [], undos: [] }; } - const { unitId, subUnitId } = ids; - const { range } = params; + const { unitId, subUnitId } = target; + const sheetSkeletonParam = this._sheetSkeletonService.getSkeletonParam(unitId, subUnitId); + if (!sheetSkeletonParam) { + return { redos: [], undos: [] }; + } + + const { range } = params; const rowStartIndex = range.startRow; const rowEndIndex = range.endRow; @@ -717,15 +921,21 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen Object.keys(data).forEach((drawingId) => { const drawing = data[drawingId]; const { sheetTransform, transform, anchorType = SheetDrawingAnchorType.Position } = drawing; - - if (sheetTransform == null || transform == null) { + if (!sheetTransform || !transform) { return; } + let newSheetTransform: Nullable; let newTransform: Nullable; let axisAlignSheetTransform: ISheetDrawingPosition | undefined; + if (type === 'insert') { - const param = this._expandRow(sheetTransform, transform, rowStartIndex, rowEndIndex, anchorType); + const param = this._expandRow(rowStartIndex, rowEndIndex, { + sheetSkeletonParam, + sheetTransform, + transform, + anchorType, + }); newSheetTransform = param?.newSheetTransform; newTransform = param?.newTransform; axisAlignSheetTransform = param?.axisAlignSheetTransform ?? undefined; @@ -733,19 +943,27 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen const { from, to } = sheetTransform; const { row: fromRow } = from; const { row: toRow } = to; + if (anchorType === SheetDrawingAnchorType.Both && fromRow >= rowStartIndex && toRow <= rowEndIndex) { // delete drawing deleteDrawings.push({ unitId, subUnitId, drawingId }); } else { - const param = this._shrinkRow(sheetTransform, transform, rowStartIndex, rowEndIndex, anchorType); + const param = this._shrinkRow(rowStartIndex, rowEndIndex, { + sheetSkeletonParam, + sheetTransform, + transform, + anchorType, + }); newSheetTransform = param?.newSheetTransform; newTransform = param?.newTransform; axisAlignSheetTransform = param?.axisAlignSheetTransform ?? undefined; } } + if (!newSheetTransform || !newTransform) { return; } + const params = { unitId, subUnitId, drawingId, transform: newTransform, sheetTransform: newSheetTransform, axisAlignSheetTransform }; updateDrawings.push(params); }); @@ -779,14 +997,20 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen }; } + // eslint-disable-next-line max-lines-per-function private _moveColInterceptor(params: IInsertColCommandParams | IRemoveRowColCommandParams, type: 'insert' | 'remove') { - const ids = this._getUnitIdAndSubUnitId(params, type); - if (ids == null) { + const target = this._getUnitIdAndSubUnitId(params, type); + if (!target) { return { redos: [], undos: [] }; } - const { unitId, subUnitId } = ids; - const { range } = params; + const { unitId, subUnitId } = target; + const sheetSkeletonParam = this._sheetSkeletonService.getSkeletonParam(unitId, subUnitId); + if (!sheetSkeletonParam) { + return { redos: [], undos: [] }; + } + + const { range } = params; const colStartIndex = range.startColumn; const colEndIndex = range.endColumn; @@ -801,14 +1025,21 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen const drawing = data[drawingId]; const { sheetTransform, transform, anchorType = SheetDrawingAnchorType.Position } = drawing; - if (sheetTransform == null || transform == null) { + if (!sheetTransform || !transform) { return; } + let newSheetTransform: Nullable; let newTransform: Nullable; let axisAlignSheetTransform: ISheetDrawingPosition | undefined; + if (type === 'insert') { - const param = this._expandCol(sheetTransform, transform, colStartIndex, colEndIndex, anchorType); + const param = this._expandCol(colStartIndex, colEndIndex, { + sheetSkeletonParam, + sheetTransform, + transform, + anchorType, + }); newSheetTransform = param?.newSheetTransform; newTransform = param?.newTransform; axisAlignSheetTransform = param?.axisAlignSheetTransform ?? undefined; @@ -820,7 +1051,12 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen // delete drawing deleteDrawings.push({ unitId, subUnitId, drawingId }); } else { - const param = this._shrinkCol(sheetTransform, transform, colStartIndex, colEndIndex, anchorType); + const param = this._shrinkCol(colStartIndex, colEndIndex, { + sheetSkeletonParam, + sheetTransform, + transform, + anchorType, + }); newSheetTransform = param?.newSheetTransform; newTransform = param?.newTransform; axisAlignSheetTransform = param?.axisAlignSheetTransform ?? undefined; @@ -861,19 +1097,28 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen return { redos, undos }; } - private _expandCol(sheetTransform: ISheetDrawingPosition, transform: ITransformState, colStartIndex: number, colEndIndex: number, anchorType = SheetDrawingAnchorType.Position) { + private _expandCol( + colStartIndex: number, + colEndIndex: number, + options: { + sheetSkeletonParam: ISheetSkeletonManagerParam; + sheetTransform: ISheetDrawingPosition; + transform: ITransformState; + anchorType: SheetDrawingAnchorType; + } + ) { + const { sheetSkeletonParam, sheetTransform, transform, anchorType = SheetDrawingAnchorType.Position } = options; + const { skeleton } = sheetSkeletonParam; const colCount = colEndIndex - colStartIndex + 1; - const { from, to } = sheetTransform; - const { column: fromColumn } = from; const { column: toColumn } = to; if (anchorType === SheetDrawingAnchorType.None) { return { - newSheetTransform: transformToDrawingPosition({ ...transform }, this._selectionRenderService), + newSheetTransform: transformToDrawingPosition({ ...transform }, skeleton), newTransform: transform, - axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, this._selectionRenderService) as ISheetDrawingPosition, + axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, skeleton) as ISheetDrawingPosition, }; } @@ -883,19 +1128,15 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen if (fromColumn >= colStartIndex) { // move start and end col right - // newSheetTransform = { - // from: { ...from, column: fromColumn + colCount }, - // to: { ...to, column: toColumn + colCount }, - // }; - // newTransform = drawingPositionToTransform(newSheetTransform, this._selectionRenderService); - - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn: colStartIndex, endColumn: colEndIndex, startRow: from.row, endRow: to.row }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn: colStartIndex, + endColumn: colEndIndex, + startRow: from.row, + endRow: to.row, + }); newTransform = { ...transform, left: (transform.left || 0) + selectionCell.endX - selectionCell.startX }; - newSheetTransform = transformToDrawingPosition(newTransform, this._selectionRenderService); - axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, this._selectionRenderService) as ISheetDrawingPosition; + newSheetTransform = transformToDrawingPosition(newTransform, skeleton); + axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, skeleton) as ISheetDrawingPosition; } else if (toColumn >= colEndIndex) { // move end right only if (anchorType === SheetDrawingAnchorType.Both) { @@ -903,17 +1144,17 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen from: { ...from }, to: { ...to, column: toColumn + colCount }, }; - newTransform = drawingPositionToTransform(newSheetTransform, this._selectionRenderService, this._skeletonManagerService); + newTransform = drawingPositionToTransform(newSheetTransform, sheetSkeletonParam); } else { return { - newSheetTransform: transformToDrawingPosition({ ...transform }, this._selectionRenderService), + newSheetTransform: transformToDrawingPosition({ ...transform }, skeleton), newTransform: transform, - axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, this._selectionRenderService) as ISheetDrawingPosition, + axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, skeleton) as ISheetDrawingPosition, }; } } - if (newSheetTransform != null && newTransform != null) { + if (newSheetTransform && newTransform) { return { newSheetTransform, newTransform, @@ -924,18 +1165,32 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen return null; } - private _shrinkCol(sheetTransform: ISheetDrawingPosition, transform: ITransformState, colStartIndex: number, colEndIndex: number, anchorType = SheetDrawingAnchorType.Position) { + // eslint-disable-next-line max-lines-per-function + private _shrinkCol( + colStartIndex: number, + colEndIndex: number, + options: { + sheetSkeletonParam: ISheetSkeletonManagerParam; + sheetTransform: ISheetDrawingPosition; + transform: ITransformState; + anchorType: SheetDrawingAnchorType; + } + ) { + const { sheetSkeletonParam, sheetTransform, transform, anchorType = SheetDrawingAnchorType.Position } = options; + const { skeleton } = sheetSkeletonParam; const colCount = colEndIndex - colStartIndex + 1; const { from, to } = sheetTransform; const { column: fromColumn } = from; const { column: toColumn } = to; + if (anchorType === SheetDrawingAnchorType.None) { return { - newSheetTransform: transformToDrawingPosition({ ...transform }, this._selectionRenderService), + newSheetTransform: transformToDrawingPosition({ ...transform }, skeleton), newTransform: transform, - axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, this._selectionRenderService) as ISheetDrawingPosition, + axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, skeleton) as ISheetDrawingPosition, }; } + let newSheetTransform: Nullable = null; let newTransform: Nullable = null; let axisAlignSheetTransform: Nullable = null; @@ -946,7 +1201,7 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen from: { ...from, column: fromColumn - colCount }, to: { ...to, column: toColumn - colCount }, }; - newTransform = drawingPositionToTransform(newSheetTransform, this._selectionRenderService, this._skeletonManagerService); + newTransform = drawingPositionToTransform(newSheetTransform, sheetSkeletonParam); } else if (fromColumn >= colStartIndex && toColumn <= colEndIndex) { // delete drawing return null; @@ -957,46 +1212,45 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen from: { ...from }, to: { ...to, column: toColumn - colCount }, }; - newTransform = drawingPositionToTransform(newSheetTransform, this._selectionRenderService, this._skeletonManagerService); + newTransform = drawingPositionToTransform(newSheetTransform, sheetSkeletonParam); } else { return { - newSheetTransform: transformToDrawingPosition({ ...transform }, this._selectionRenderService), + newSheetTransform: transformToDrawingPosition({ ...transform }, skeleton), newTransform: transform, - axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, this._selectionRenderService) as ISheetDrawingPosition, + axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, skeleton) as ISheetDrawingPosition, }; } } else if (fromColumn >= colStartIndex && fromColumn <= colEndIndex) { if (fromColumn === colStartIndex) { newTransform = { ...transform, left: (transform.left || 0) - sheetTransform.from.columnOffset }; } else { - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn: colStartIndex, endColumn: fromColumn - 1, startRow: from.row, endRow: to.row }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn: colStartIndex, + endColumn: fromColumn - 1, + startRow: from.row, + endRow: to.row, + }); newTransform = { ...transform, left: (transform.left || 0) - selectionCell.endX + selectionCell.startX - sheetTransform.from.columnOffset }; } - newSheetTransform = transformToDrawingPosition(newTransform, this._selectionRenderService); - axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, this._selectionRenderService) as ISheetDrawingPosition; + + newSheetTransform = transformToDrawingPosition(newTransform, skeleton); + axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, skeleton) as ISheetDrawingPosition; } else if (toColumn >= colStartIndex && toColumn <= colEndIndex && anchorType === SheetDrawingAnchorType.Both) { // shrink end col left, then set toColOffset to full cell width - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ + const selectionCell = attachRangeWithCoord(skeleton, { startColumn: colStartIndex - 1, endColumn: colStartIndex - 1, startRow: from.row, endRow: to.row, }); - - if (selectionCell == null) { - return; - } newSheetTransform = { from: { ...from }, to: { ...to, column: colStartIndex - 1, columnOffset: selectionCell.endX - selectionCell.startX }, }; - newTransform = drawingPositionToTransform(newSheetTransform, this._selectionRenderService, this._skeletonManagerService); + newTransform = drawingPositionToTransform(newSheetTransform, sheetSkeletonParam); } - if (newSheetTransform != null && newTransform != null) { + if (newSheetTransform && newTransform) { return { newSheetTransform, newTransform, @@ -1007,19 +1261,28 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen return null; } - private _expandRow(sheetTransform: ISheetDrawingPosition, transform: ITransformState, rowStartIndex: number, rowEndIndex: number, anchorType = SheetDrawingAnchorType.Position) { + private _expandRow( + rowStartIndex: number, + rowEndIndex: number, + options: { + sheetSkeletonParam: ISheetSkeletonManagerParam; + sheetTransform: ISheetDrawingPosition; + transform: ITransformState; + anchorType: SheetDrawingAnchorType; + } + ) { + const { sheetSkeletonParam, sheetTransform, transform, anchorType = SheetDrawingAnchorType.Position } = options; + const { skeleton } = sheetSkeletonParam; const rowCount = rowEndIndex - rowStartIndex + 1; - const { from, to } = sheetTransform; - const { row: fromRow } = from; const { row: toRow } = to; if (anchorType === SheetDrawingAnchorType.None) { return { - newSheetTransform: transformToDrawingPosition({ ...transform }, this._selectionRenderService), + newSheetTransform: transformToDrawingPosition({ ...transform }, skeleton), newTransform: transform, - axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, this._selectionRenderService) as ISheetDrawingPosition, + axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, skeleton) as ISheetDrawingPosition, }; } @@ -1029,13 +1292,15 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen if (fromRow >= rowStartIndex) { // move start and end row down - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startRow: rowStartIndex, endRow: rowEndIndex, startColumn: from.column, endColumn: to.column }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startRow: rowStartIndex, + endRow: rowEndIndex, + startColumn: from.column, + endColumn: to.column, + }); newTransform = { ...transform, top: (transform.top || 0) + selectionCell.endY - selectionCell.startY }; - newSheetTransform = transformToDrawingPosition(newTransform, this._selectionRenderService); - axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, this._selectionRenderService) as ISheetDrawingPosition; + newSheetTransform = transformToDrawingPosition(newTransform, skeleton); + axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, skeleton) as ISheetDrawingPosition; } else if (toRow >= rowEndIndex) { // move end down only if (anchorType === SheetDrawingAnchorType.Both) { @@ -1046,17 +1311,17 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen row: toRow + rowCount, }, }; - newTransform = drawingPositionToTransform(newSheetTransform, this._selectionRenderService, this._skeletonManagerService); + newTransform = drawingPositionToTransform(newSheetTransform, sheetSkeletonParam); } else { return { - newSheetTransform: transformToDrawingPosition({ ...transform }, this._selectionRenderService), + newSheetTransform: transformToDrawingPosition({ ...transform }, skeleton), newTransform: transform, - axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, this._selectionRenderService) as ISheetDrawingPosition, + axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, skeleton) as ISheetDrawingPosition, }; } } - if (newSheetTransform != null && newTransform != null) { + if (newSheetTransform && newTransform) { return { newSheetTransform, newTransform, @@ -1067,19 +1332,29 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen return null; } - private _shrinkRow(sheetTransform: ISheetDrawingPosition, transform: ITransformState, rowStartIndex: number, rowEndIndex: number, anchorType = SheetDrawingAnchorType.Position) { + // eslint-disable-next-line max-lines-per-function + private _shrinkRow( + rowStartIndex: number, + rowEndIndex: number, + options: { + sheetSkeletonParam: ISheetSkeletonManagerParam; + sheetTransform: ISheetDrawingPosition; + transform: ITransformState; + anchorType: SheetDrawingAnchorType; + } + ) { + const { sheetSkeletonParam, sheetTransform, transform, anchorType = SheetDrawingAnchorType.Position } = options; + const { skeleton } = sheetSkeletonParam; const rowCount = rowEndIndex - rowStartIndex + 1; - const { from, to } = sheetTransform; - const { row: fromRow } = from; const { row: toRow } = to; if (anchorType === SheetDrawingAnchorType.None) { return { - newSheetTransform: transformToDrawingPosition({ ...transform }, this._selectionRenderService), + newSheetTransform: transformToDrawingPosition({ ...transform }, skeleton), newTransform: transform, - axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, this._selectionRenderService) as ISheetDrawingPosition, + axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, skeleton) as ISheetDrawingPosition, }; } @@ -1093,7 +1368,7 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen from: { ...from, row: fromRow - rowCount }, to: { ...to, row: toRow - rowCount }, }; - newTransform = drawingPositionToTransform(newSheetTransform, this._selectionRenderService, this._skeletonManagerService); + newTransform = drawingPositionToTransform(newSheetTransform, sheetSkeletonParam); } else if (fromRow >= rowStartIndex && toRow <= rowEndIndex) { // delete drawing return null; @@ -1104,12 +1379,12 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen from: { ...from }, to: { ...to, row: toRow - rowCount }, }; - newTransform = drawingPositionToTransform(newSheetTransform, this._selectionRenderService, this._skeletonManagerService); + newTransform = drawingPositionToTransform(newSheetTransform, sheetSkeletonParam); } else { return { - newSheetTransform: transformToDrawingPosition({ ...transform }, this._selectionRenderService), + newSheetTransform: transformToDrawingPosition({ ...transform }, skeleton), newTransform: transform, - axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, this._selectionRenderService) as ISheetDrawingPosition, + axisAlignSheetTransform: transformToAxisAlignPosition({ ...transform }, skeleton) as ISheetDrawingPosition, }; } } else if (fromRow >= rowStartIndex && fromRow <= rowEndIndex) { @@ -1117,29 +1392,32 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen if (fromRow === rowStartIndex) { newTransform = { ...transform, top: (transform.top || 0) - sheetTransform.from.rowOffset }; } else { - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startRow: rowStartIndex, endRow: fromRow - 1, startColumn: from.column, endColumn: to.column }); - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startRow: rowStartIndex, + endRow: fromRow - 1, + startColumn: from.column, + endColumn: to.column, + }); newTransform = { ...transform, top: (transform.top || 0) - selectionCell.endY + selectionCell.startY - sheetTransform.from.rowOffset }; } - newSheetTransform = transformToDrawingPosition(newTransform, this._selectionRenderService); - axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, this._selectionRenderService) as ISheetDrawingPosition; + newSheetTransform = transformToDrawingPosition(newTransform, skeleton); + axisAlignSheetTransform = transformToAxisAlignPosition(newTransform, skeleton) as ISheetDrawingPosition; } else if (toRow >= rowStartIndex && toRow <= rowEndIndex && anchorType === SheetDrawingAnchorType.Both) { // shrink end row up, then set toRowOffset to full cell height - const selectionCell = this._skeletonManagerService.attachRangeWithCoord({ startColumn: from.column, endColumn: from.column, startRow: rowStartIndex - 1, endRow: rowStartIndex - 1 }); - - if (selectionCell == null) { - return; - } + const selectionCell = attachRangeWithCoord(skeleton, { + startColumn: from.column, + endColumn: from.column, + startRow: rowStartIndex - 1, + endRow: rowStartIndex - 1, + }); newSheetTransform = { from: { ...from }, to: { ...to, row: rowStartIndex - 1, rowOffset: selectionCell.endY - selectionCell.startY }, }; - newTransform = drawingPositionToTransform(newSheetTransform, this._selectionRenderService, this._skeletonManagerService); + newTransform = drawingPositionToTransform(newSheetTransform, sheetSkeletonParam); } - if (newSheetTransform != null && newTransform != null) { + if (newSheetTransform && newTransform) { return { newSheetTransform, newTransform, @@ -1185,15 +1463,9 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen // TODO@weird94: should add a iterating function Object.keys(drawingMap).forEach((unitId) => { const subUnitMap = drawingMap[unitId]; - if (subUnitMap == null) { - return; - } Object.keys(subUnitMap).forEach((subUnitId) => { const drawingData = subUnitMap[subUnitId].data; - if (drawingData == null) { - return; - } Object.keys(drawingData).forEach((drawingId) => { if (unitId === selfUnitId) { @@ -1211,25 +1483,22 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen private _updateDrawings(showUnitId: string, showSubunitId: string): void { // TODO@weird94: remove the setTimeout here setTimeout(() => { + const sheetSkeletonParam = this._sheetSkeletonService.getSkeletonParam(showUnitId, showSubunitId); const drawingMap = this._drawingManagerService.drawingManagerData; const insertDrawings: IDrawingParam[] = []; const removeDrawings: IDrawingParam[] = []; Object.keys(drawingMap).forEach((unitId) => { const subUnitMap = drawingMap[unitId]; - if (subUnitMap == null) { - return; - } + Object.keys(subUnitMap).forEach((subUnitId) => { const drawingData = subUnitMap[subUnitId].data; - if (drawingData == null) { - return; - } + Object.keys(drawingData).forEach((drawingId) => { if (unitId === showUnitId && subUnitId === showSubunitId) { const drawing = drawingData[drawingId] as ISheetDrawing; if (drawing.sheetTransform) { - drawing.transform = drawingPositionToTransform(drawing.sheetTransform, this._selectionRenderService, this._skeletonManagerService); + drawing.transform = drawingPositionToTransform(drawing.sheetTransform, sheetSkeletonParam); } insertDrawings.push(drawingData[drawingId]); } else { @@ -1287,8 +1556,8 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen } private _refreshDrawingTransform(unitId: string, subUnitId: string, ranges: IRange[]) { + const sheetSkeletonParam = this._sheetSkeletonService.getSkeletonParam(unitId, subUnitId); const drawingData = this._drawingManagerService.getDrawingData(unitId, subUnitId); - const updateDrawings: ISheetDrawing[] = []; Object.keys(drawingData).forEach((drawingId) => { @@ -1319,7 +1588,7 @@ export class SheetDrawingTransformAffectedController extends Disposable implemen } ) || fromRow > endRow || fromColumn > endColumn) { const isPositionAnchor = anchorType === SheetDrawingAnchorType.Position; - const newTransform = drawingPositionToTransform(sheetTransform, this._selectionRenderService, this._skeletonManagerService); + const newTransform = drawingPositionToTransform(sheetTransform, sheetSkeletonParam); updateDrawings.push({ ...drawing, transform: { diff --git a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-update.controller.ts b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-update.controller.ts index 86200c0623..a2bfbba0c6 100644 --- a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-update.controller.ts +++ b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-update.controller.ts @@ -16,26 +16,60 @@ import type { IAccessor, IDrawingParam, IRange, Nullable, Workbook } from '@univerjs/core'; import type { IImageData, IImageIoServiceParam } from '@univerjs/drawing'; -import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; +import type { IRenderContext, IRenderModule, SpreadsheetSkeleton } from '@univerjs/engine-render'; import type { ISheetLocationBase, WorkbookSelectionModel } from '@univerjs/sheets'; -import type { ISheetDrawing, ISheetDrawingPosition } from '@univerjs/sheets-drawing'; -import type { IInsertDrawingCommandParams, ISetDrawingCommandParams } from '../commands/commands/interfaces'; -import type { ISetDrawingArrangeCommandParams } from '../commands/commands/set-drawing-arrange.command'; -import { BooleanNumber, BuildTextUtils, createDocumentModelWithStyle, Disposable, DrawingTypeEnum, FOCUSING_COMMON_DRAWINGS, generateRandomId, ICommandService, IContextService, ImageSourceType, Inject, Injector, IURLImageService, LocaleService, ObjectRelativeFromH, ObjectRelativeFromV, PositionedObjectLayoutType, WrapTextType } from '@univerjs/core'; +import type { IDeleteDrawingCommandParams, IInsertDrawingCommandParams, ISetDrawingArrangeCommandParams, ISetDrawingCommandParams, ISheetDrawing, ISheetDrawingPosition } from '@univerjs/sheets-drawing'; +import { + BooleanNumber, + BuildTextUtils, + createDocumentModelWithStyle, + Disposable, + DrawingTypeEnum, + FOCUSING_COMMON_DRAWINGS, + generateRandomId, + ICommandService, + IContextService, + ImageSourceType, + Inject, + Injector, + IURLImageService, + LocaleService, + ObjectRelativeFromH, + ObjectRelativeFromV, + PositionedObjectLayoutType, + WrapTextType, +} from '@univerjs/core'; import { MessageType } from '@univerjs/design'; import { docDrawingPositionToTransform } from '@univerjs/docs-ui'; -import { DRAWING_IMAGE_ALLOW_IMAGE_LIST, DRAWING_IMAGE_ALLOW_SIZE, DRAWING_IMAGE_COUNT_LIMIT, DRAWING_IMAGE_HEIGHT_LIMIT, DRAWING_IMAGE_WIDTH_LIMIT, getImageSize, IDrawingManagerService, IImageIoService, ImageUploadStatusType, SetDrawingSelectedOperation } from '@univerjs/drawing'; +import { + DRAWING_IMAGE_ALLOW_IMAGE_LIST, + DRAWING_IMAGE_ALLOW_SIZE, + DRAWING_IMAGE_COUNT_LIMIT, + DRAWING_IMAGE_HEIGHT_LIMIT, + DRAWING_IMAGE_WIDTH_LIMIT, + getImageSize, + IDrawingManagerService, + IImageIoService, + ImageUploadStatusType, + SetDrawingSelectedOperation, +} from '@univerjs/drawing'; import { IRenderManagerService } from '@univerjs/engine-render'; -import { SetRangeValuesCommand, SheetsSelectionsService } from '@univerjs/sheets'; -import { ISheetDrawingService } from '@univerjs/sheets-drawing'; -import { attachRangeWithCoord, ISheetSelectionRenderService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { attachRangeWithCoord, SetRangeValuesCommand, SheetInterceptorService, SheetSkeletonService, SheetsSelectionsService } from '@univerjs/sheets'; +import { + drawingPositionToTransform, + InsertSheetDrawingCommand, + ISheetDrawingService, + RemoveSheetDrawingCommand, + SetDrawingArrangeCommand, + SetSheetDrawingCommand, + transformToAxisAlignPosition, + transformToDrawingPosition, +} from '@univerjs/sheets-drawing'; +import { ISheetSelectionRenderService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; import { ILocalFileService, IMessageService } from '@univerjs/ui'; -import { drawingPositionToTransform, transformToAxisAlignPosition, transformToDrawingPosition } from '../basics/transform-position'; import { GroupSheetDrawingCommand } from '../commands/commands/group-sheet-drawing.command'; -import { InsertSheetDrawingCommand } from '../commands/commands/insert-sheet-drawing.command'; -import { SetDrawingArrangeCommand } from '../commands/commands/set-drawing-arrange.command'; -import { SetSheetDrawingCommand } from '../commands/commands/set-sheet-drawing.command'; import { UngroupSheetDrawingCommand } from '../commands/commands/ungroup-sheet-drawing.command'; +import { ClearSheetDrawingTransformerOperation } from '../commands/operations/clear-drawing-transformer.operation'; /** * Calculate the bounding box after rotation @@ -97,8 +131,8 @@ export class SheetDrawingUpdateController extends Disposable implements IRenderM private readonly _workbookSelections: WorkbookSelectionModel; constructor( private readonly _context: IRenderContext, - @Inject(SheetSkeletonManagerService) private readonly _skeletonManagerService: SheetSkeletonManagerService, @ICommandService private readonly _commandService: ICommandService, + @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService, @ISheetSelectionRenderService private readonly _selectionRenderService: ISheetSelectionRenderService, @IImageIoService private readonly _imageIoService: IImageIoService, @ILocalFileService private readonly _fileOpenerService: ILocalFileService, @@ -108,6 +142,7 @@ export class SheetDrawingUpdateController extends Disposable implements IRenderM @IMessageService private readonly _messageService: IMessageService, @Inject(LocaleService) private readonly _localeService: LocaleService, @Inject(SheetsSelectionsService) selectionManagerService: SheetsSelectionsService, + @Inject(SheetSkeletonService) private readonly _sheetSkeletonService: SheetSkeletonService, @Inject(Injector) private readonly _injector: Injector, @IURLImageService private readonly _urlImageService: IURLImageService ) { @@ -115,6 +150,7 @@ export class SheetDrawingUpdateController extends Disposable implements IRenderM this._workbookSelections = selectionManagerService.getWorkbookSelections(this._context.unitId); + this._setDrawingListener(); this._updateDrawingListener(); this._updateOrderListener(); this._groupDrawingListener(); @@ -203,13 +239,16 @@ export class SheetDrawingUpdateController extends Disposable implements IRenderM scale = Math.max(scaleWidth, scaleHeight); } - const sheetTransform = this._getImagePosition(width * scale, height * scale, sceneWidth, sceneHeight); + const sheetSkeletonParam = this._sheetSkeletonService.getSkeletonParam(unitId, subUnitId); + if (!sheetSkeletonParam) return; - if (sheetTransform == null) { - return; - } + const { skeleton } = sheetSkeletonParam; + const sheetTransform = this._getImagePosition(width * scale, height * scale, sceneWidth, sceneHeight, skeleton); + if (!sheetTransform) return; + + const newTransform = drawingPositionToTransform(sheetTransform, sheetSkeletonParam); + if (!newTransform) return; - const newTransform = drawingPositionToTransform(sheetTransform, this._selectionRenderService, this._skeletonManagerService)!; const sheetDrawingParam: ISheetDrawing = { unitId, subUnitId, @@ -219,7 +258,7 @@ export class SheetDrawingUpdateController extends Disposable implements IRenderM source, transform: newTransform, sheetTransform, - axisAlignSheetTransform: transformToAxisAlignPosition(newTransform, this._selectionRenderService) ?? sheetTransform, + axisAlignSheetTransform: transformToAxisAlignPosition(newTransform, skeleton) ?? sheetTransform, }; return this._commandService.executeCommand(InsertSheetDrawingCommand.id, { @@ -461,7 +500,7 @@ export class SheetDrawingUpdateController extends Disposable implements IRenderM }; } - private _getImagePosition(imageWidth: number, imageHeight: number, sceneWidth: number, sceneHeight: number): Nullable { + private _getImagePosition(imageWidth: number, imageHeight: number, sceneWidth: number, sceneHeight: number, skeleton: SpreadsheetSkeleton): Nullable { const selections = this._workbookSelections.getCurrentSelections(); let range: IRange = { startRow: 0, @@ -473,7 +512,7 @@ export class SheetDrawingUpdateController extends Disposable implements IRenderM range = selections[selections.length - 1].range; } - const rangeWithCoord = attachRangeWithCoord(this._skeletonManagerService.getCurrent()!.skeleton, range); + const rangeWithCoord = attachRangeWithCoord(skeleton, range); if (rangeWithCoord == null) { return; } @@ -553,52 +592,68 @@ export class SheetDrawingUpdateController extends Disposable implements IRenderM })); } + private _setDrawingListener() { + this.disposeWithMe( + this._sheetInterceptorService.interceptCommand({ + getMutations: (commandInfo) => { + if (commandInfo.id === SetSheetDrawingCommand.id || InsertSheetDrawingCommand.id || commandInfo.id === RemoveSheetDrawingCommand.id) { + const params = commandInfo.params as ISetDrawingCommandParams | IInsertDrawingCommandParams | IDeleteDrawingCommandParams; + const { unitId } = params; + const redos = [ + { + id: ClearSheetDrawingTransformerOperation.id, + params: [unitId], + }, + ]; + const undos = [ + { + id: ClearSheetDrawingTransformerOperation.id, + params: [unitId], + }, + ]; + return { redos, undos }; + } + return { redos: [], undos: [] }; + }, + }) + ); + } + private _updateDrawingListener() { this.disposeWithMe(this._drawingManagerService.featurePluginUpdate$.subscribe((params) => { const drawings: Partial[] = []; - const groupChildParams: IDrawingParam[] = []; - if (params.length === 0) { return; } (params as IImageData[]).forEach((param) => { - const { unitId, subUnitId, drawingId, drawingType, transform } = param; - if (transform == null) { + const { unitId, subUnitId, drawingId, transform } = param; + const sheetSkeletonParam = this._sheetSkeletonService.getSkeletonParam(unitId, subUnitId); + if (!transform || !sheetSkeletonParam) { return; } + const { skeleton } = sheetSkeletonParam; const sheetDrawing = this._sheetDrawingService.getDrawingByParam({ unitId, subUnitId, drawingId }); - - // const imageDrawing = this._drawingManagerService.getDrawingByParam({ unitId, subUnitId, drawingId }); - if (sheetDrawing == null || sheetDrawing.unitId !== this._context.unitId) { return; } - const sheetTransform = transformToDrawingPosition({ ...sheetDrawing.transform, ...transform }, this._selectionRenderService); - const axisAlignSheetTransform = transformToAxisAlignPosition({ ...sheetDrawing.transform, ...transform }, this._selectionRenderService); + const sheetTransform = transformToDrawingPosition({ ...sheetDrawing.transform, ...transform }, skeleton); + const axisAlignSheetTransform = transformToAxisAlignPosition({ ...sheetDrawing.transform, ...transform }, skeleton); if (sheetTransform == null || axisAlignSheetTransform == null) { return; } - // const oldDrawing: Partial = { - // ...sheetDrawing, - // }; - const newDrawing: Partial = { ...param, - transform: { ...sheetDrawing.transform, ...transform, ...drawingPositionToTransform(sheetTransform, this._selectionRenderService, this._skeletonManagerService) }, + transform: { ...sheetDrawing.transform, ...transform, ...drawingPositionToTransform(sheetTransform, sheetSkeletonParam) }, sheetTransform: { ...sheetTransform }, axisAlignSheetTransform: { ...axisAlignSheetTransform }, }; - // if (newDrawing.drawingType === DrawingTypeEnum.DRAWING_GROUP) { - - // } - drawings.push(newDrawing); }); @@ -616,9 +671,11 @@ export class SheetDrawingUpdateController extends Disposable implements IRenderM axisAlignSheetTransform: ISheetDrawingPosition; }> { const { unitId, subUnitId, drawingId, transform } = param; - if (transform == null) { + const skeleton = this._sheetSkeletonService.getSkeleton(unitId, subUnitId); + if (!transform || !skeleton) { return null; } + const sheetDrawing = this._sheetDrawingService.getDrawingByParam({ unitId, subUnitId, drawingId }); let sheetDrawingTransform = sheetDrawing?.transform; @@ -626,16 +683,17 @@ export class SheetDrawingUpdateController extends Disposable implements IRenderM sheetDrawingTransform = {}; } - if (!isCreate && (sheetDrawing == null || sheetDrawing.unitId !== this._context.unitId)) { + if (!isCreate && (!sheetDrawing || sheetDrawing.unitId !== this._context.unitId)) { return null; } - const sheetTransform = transformToDrawingPosition({ ...sheetDrawingTransform, ...transform }, this._selectionRenderService); - const axisAlignSheetTransform = transformToAxisAlignPosition({ ...sheetDrawingTransform, ...transform }, this._selectionRenderService); + const sheetTransform = transformToDrawingPosition({ ...sheetDrawingTransform, ...transform }, skeleton); + const axisAlignSheetTransform = transformToAxisAlignPosition({ ...sheetDrawingTransform, ...transform }, skeleton); - if (sheetTransform == null || axisAlignSheetTransform == null) { + if (!sheetTransform || !axisAlignSheetTransform) { return null; } + return { sheetTransform, axisAlignSheetTransform }; } diff --git a/packages/sheets-drawing-ui/src/controllers/sheet-drawing.controller.ts b/packages/sheets-drawing-ui/src/controllers/sheet-drawing.controller.ts index 833b5aca38..f5977c0869 100644 --- a/packages/sheets-drawing-ui/src/controllers/sheet-drawing.controller.ts +++ b/packages/sheets-drawing-ui/src/controllers/sheet-drawing.controller.ts @@ -15,19 +15,13 @@ */ import { Disposable, ICommandService, Inject } from '@univerjs/core'; -import { IDrawingManagerService } from '@univerjs/drawing'; -import { SheetsSelectionsService } from '@univerjs/sheets'; import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; import { DeleteDrawingsCommand } from '../commands/commands/delete-drawings.command'; import { FlipSheetDrawingCommand } from '../commands/commands/flip-drawings.command'; import { GroupSheetDrawingCommand } from '../commands/commands/group-sheet-drawing.command'; import { InsertCellImageCommand, InsertFloatImageCommand } from '../commands/commands/insert-image.command'; -import { InsertSheetDrawingCommand } from '../commands/commands/insert-sheet-drawing.command'; import { MoveDrawingsCommand } from '../commands/commands/move-drawings.command'; -import { RemoveSheetDrawingCommand } from '../commands/commands/remove-sheet-drawing.command'; import { SaveCellImagesCommand } from '../commands/commands/save-cell-images.command'; -import { SetDrawingArrangeCommand } from '../commands/commands/set-drawing-arrange.command'; -import { SetSheetDrawingCommand } from '../commands/commands/set-sheet-drawing.command'; import { UngroupSheetDrawingCommand } from '../commands/commands/ungroup-sheet-drawing.command'; import { ClearSheetDrawingTransformerOperation } from '../commands/operations/clear-drawing-transformer.operation'; import { EditSheetDrawingOperation } from '../commands/operations/edit-sheet-drawing.operation'; @@ -43,9 +37,7 @@ export class SheetDrawingUIController extends Disposable { @Inject(ComponentManager) private readonly _componentManager: ComponentManager, @IMenuManagerService private readonly _menuManagerService: IMenuManagerService, @ICommandService private readonly _commandService: ICommandService, - @IShortcutService private readonly _shortcutService: IShortcutService, - @IDrawingManagerService private readonly _drawingManagerService: IDrawingManagerService, - @Inject(SheetsSelectionsService) private readonly _sheetsSelectionsService: SheetsSelectionsService + @IShortcutService private readonly _shortcutService: IShortcutService ) { super(); @@ -66,9 +58,6 @@ export class SheetDrawingUIController extends Disposable { [ InsertFloatImageCommand, InsertCellImageCommand, - InsertSheetDrawingCommand, - RemoveSheetDrawingCommand, - SetSheetDrawingCommand, SidebarSheetDrawingOperation, ClearSheetDrawingTransformerOperation, EditSheetDrawingOperation, @@ -76,7 +65,6 @@ export class SheetDrawingUIController extends Disposable { UngroupSheetDrawingCommand, MoveDrawingsCommand, DeleteDrawingsCommand, - SetDrawingArrangeCommand, SaveCellImagesCommand, FlipSheetDrawingCommand, ].forEach((command) => this.disposeWithMe(this._commandService.registerCommand(command))); diff --git a/packages/sheets-drawing-ui/src/facade/f-event.ts b/packages/sheets-drawing-ui/src/facade/f-event.ts index 9e8d8012ec..057352e96e 100644 --- a/packages/sheets-drawing-ui/src/facade/f-event.ts +++ b/packages/sheets-drawing-ui/src/facade/f-event.ts @@ -14,20 +14,18 @@ * limitations under the License. */ -import type { IDrawingSearch } from '@univerjs/core'; import type { IEventBase } from '@univerjs/core/facade'; -import type { ISheetFloatDom, ISheetImage } from '@univerjs/sheets-drawing'; +import type { ISheetFloatDom } from '@univerjs/sheets-drawing'; import type { FWorkbook } from '@univerjs/sheets/facade'; -import type { FOverGridImage } from './f-over-grid-image'; import { FEventName } from '@univerjs/core/facade'; /** * @ignore */ -interface IFDrawingEventNameMixin { +interface IFSheetsDrawingUIEventNameMixin { /** * Triggered before float dom insertion. - * @see {@link IBeforeFloatDomAddParam} + * @see {@link IBeforeFloatDomAddEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeFloatDomAdd, (params) => { @@ -45,7 +43,7 @@ interface IFDrawingEventNameMixin { /** * Triggered after float dom insertion. - * @see {@link IFloatDomAddedParam} + * @see {@link IFloatDomAddedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.FloatDomAdded, (params) => { @@ -61,7 +59,7 @@ interface IFDrawingEventNameMixin { /** * Triggered before float dom update. - * @see {@link IBeforeFloatDomUpdateParam} + * @see {@link IBeforeFloatDomUpdateEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeFloatDomUpdate, (params) => { @@ -79,7 +77,7 @@ interface IFDrawingEventNameMixin { /** * Triggered after float dom update. - * @see {@link IFloatDomUpdatedParam} + * @see {@link IFloatDomUpdatedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.FloatDomUpdated, (params) => { @@ -95,7 +93,7 @@ interface IFDrawingEventNameMixin { /** * Triggered before float dom deletion. - * @see {@link IBeforeFloatDomDeleteParam} + * @see {@link IBeforeFloatDomDeleteEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeFloatDomDelete, (params) => { @@ -113,7 +111,7 @@ interface IFDrawingEventNameMixin { /** * Triggered after float dom deletion. - * @see {@link IFloatDomDeletedParam} + * @see {@link IFloatDomDeletedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.FloatDomDeleted, (params) => { @@ -126,145 +124,9 @@ interface IFDrawingEventNameMixin { * ``` */ readonly FloatDomDeleted: 'FloatDomDeleted'; - - /** - * Triggered before floating image insertion. - * @see {@link IBeforeOverGridImageInsertParam} - * @example - * ```ts - * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeOverGridImageInsert, (params) => { - * console.log(params); - * // do something - * const { workbook, insertImageParams } = params; - * // Cancel the insertion operation - * params.cancel = true; - * }) - * - * // Remove the event listener, use `disposable.dispose()` - * ``` - */ - readonly BeforeOverGridImageInsert: 'BeforeOverGridImageInsert'; - - /** - * Triggered after floating image insertion. - * @see {@link IOverGridImageInsertedParam} - * @example - * ```ts - * const disposable = univerAPI.addEvent(univerAPI.Event.OverGridImageInserted, (params) => { - * console.log(params); - * // do something - * const { workbook, images } = params; - * }) - * - * // Remove the event listener, use `disposable.dispose()` - * ``` - */ - readonly OverGridImageInserted: 'OverGridImageInserted'; - - /** - * Triggered before floating image removal. - * @see {@link IBeforeOverGridImageRemoveParam} - * @example - * ```ts - * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeOverGridImageRemove, (params) => { - * console.log(params); - * // do something - * const { workbook, images } = params; - * // Cancel the removal operation - * params.cancel = true; - * }) - * - * // Remove the event listener, use `disposable.dispose()` - * ``` - */ - readonly BeforeOverGridImageRemove: 'BeforeOverGridImageRemove'; - - /** - * Triggered after floating image removal. - * @see {@link IOverGridImageRemovedParam} - * @example - * ```ts - * const disposable = univerAPI.addEvent(univerAPI.Event.OverGridImageRemoved, (params) => { - * console.log(params); - * // do something - * const { workbook, removeImageParams } = params; - * }) - * - * // Remove the event listener, use `disposable.dispose()` - * ``` - */ - readonly OverGridImageRemoved: 'OverGridImageRemoved'; - - /** - * Triggered before floating image change. - * @see {@link IBeforeOverGridImageChangeParam} - * @example - * ```ts - * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeOverGridImageChange, (params) => { - * console.log(params); - * // do something - * const { workbook, images } = params; - * // Cancel the image change - * params.cancel = true; - * }) - * - * // Remove the event listener, use `disposable.dispose()` - * ``` - */ - readonly BeforeOverGridImageChange: 'BeforeOverGridImageChange'; - - /** - * Triggered after floating image change. - * @see {@link IOverGridImageChangedParam} - * @example - * ```ts - * const disposable = univerAPI.addEvent(univerAPI.Event.OverGridImageChanged, (params) => { - * console.log(params); - * // do something - * const { workbook, images } = params; - * }) - * - * // Remove the event listener, use `disposable.dispose()` - * ``` - */ - readonly OverGridImageChanged: 'OverGridImageChanged'; - - /** - * Triggered before floating image selection. - * @see {@link IBeforeOverGridImageSelectParam} - * @example - * ```ts - * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeOverGridImageSelect, (params) => { - * console.log(params); - * // do something - * const { workbook, selectedImages, oldSelectedImages } = params; - * // cancel the selection operation - * params.cancel = true; - * }) - * - * // Remove the event listener, use `disposable.dispose()` - * ``` - */ - readonly BeforeOverGridImageSelect: 'BeforeOverGridImageSelect'; - - /** - * Triggered after floating image selection. - * @see {@link IOverGridImageSelectedParam} - * @example - * ```ts - * const disposable = univerAPI.addEvent(univerAPI.Event.OverGridImageSelected, (params) => { - * console.log(params); - * // do something - * const { workbook, selectedImages } = params; - * }) - * - * // Remove the event listener, use `disposable.dispose()` - * ``` - */ - readonly OverGridImageSelected: 'OverGridImageSelected'; } -export class FDrawingEventNameMixin extends FEventName implements IFDrawingEventNameMixin { +export class FSheetsDrawingUIEventNameMixin extends FEventName implements IFSheetsDrawingUIEventNameMixin { override get BeforeFloatDomAdd(): 'BeforeFloatDomAdd' { return 'BeforeFloatDomAdd' as const; } @@ -288,152 +150,12 @@ export class FDrawingEventNameMixin extends FEventName implements IFDrawingEvent override get FloatDomDeleted(): 'FloatDomDeleted' { return 'FloatDomDeleted' as const; } - - override get BeforeOverGridImageChange(): 'BeforeOverGridImageChange' { - return 'BeforeOverGridImageChange' as const; - } - - override get OverGridImageChanged(): 'OverGridImageChanged' { - return 'OverGridImageChanged' as const; - } - - override get BeforeOverGridImageInsert(): 'BeforeOverGridImageInsert' { - return 'BeforeOverGridImageInsert' as const; - } - - override get OverGridImageInserted(): 'OverGridImageInserted' { - return 'OverGridImageInserted' as const; - } - - override get BeforeOverGridImageRemove(): 'BeforeOverGridImageRemove' { - return 'BeforeOverGridImageRemove' as const; - } - - override get OverGridImageRemoved(): 'OverGridImageRemoved' { - return 'OverGridImageRemoved' as const; - } - - override get BeforeOverGridImageSelect(): 'BeforeOverGridImageSelect' { - return 'BeforeOverGridImageSelect' as const; - } - - override get OverGridImageSelected(): 'OverGridImageSelected' { - return 'OverGridImageSelected' as const; - } -} - -export interface IBeforeOverGridImageChangeParamObject { - /** - * Parameters of the image to be updated. {@link ISheetImage} - */ - changeParam: Partial; - - /** - * Instance of the image to be updated. {@link FOverGridImage} - */ - image: FOverGridImage; -} - -export interface IBeforeOverGridImageChangeParam extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - - /** - * Collection of parameters of the images to be updated, there may be multiple images to be updated. {@link IBeforeOverGridImageChangeParamObject} - */ - images: IBeforeOverGridImageChangeParamObject[]; -} - -export interface IOverGridImageChangedParam extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - - /** - * Instances of the images after the update. {@link FOverGridImage} - */ - images: FOverGridImage[]; -} - -export interface IBeforeOverGridImageInsertParam extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - - /** - * Collection of parameters of the images to be inserted. {@link ISheetImage} - */ - insertImageParams: ISheetImage[]; -} - -export interface IOverGridImageInsertedParam extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - - /** - * Collection of instances of the images after insertion. {@link FOverGridImage} - */ - images: FOverGridImage[]; -} - -export interface IBeforeOverGridImageRemoveParam extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - - /** - * Collection of instances of the images to be removed. {@link FOverGridImage} - */ - images: FOverGridImage[]; -} - -export interface IOverGridImageRemovedParam extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - - /** - * Collection of parameters of the images after removal. {@link ISheetImage} - */ - removeImageParams: IDrawingSearch[]; -} - -export interface IBeforeOverGridImageSelectParam extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - /** - * The images before selection. {@link FOverGridImage} - */ - oldSelectedImages: FOverGridImage[]; - - selectedImages: FOverGridImage[]; -} - -export interface IOverGridImageSelectedParam extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - /** - * The selected images. {@link FOverGridImage} - */ - selectedImages: FOverGridImage[]; } /** * @ignore */ -export interface IBeforeFloatDomAddParam extends IEventBase { +export interface IBeforeFloatDomAddEventParams extends IEventBase { /** * The workbook instance currently being operated on. {@link FWorkbook} */ @@ -445,7 +167,7 @@ export interface IBeforeFloatDomAddParam extends IEventBase { drawings: ISheetFloatDom[]; } -export interface IFloatDomAddedParam extends IEventBase { +export interface IFloatDomAddedEventParams extends IEventBase { /** * The workbook instance currently being operated on. {@link FWorkbook} */ @@ -457,7 +179,7 @@ export interface IFloatDomAddedParam extends IEventBase { drawings: ISheetFloatDom[]; } -export interface IBeforeFloatDomUpdateParam extends IEventBase { +export interface IBeforeFloatDomUpdateEventParams extends IEventBase { /** * The workbook instance currently being operated on. {@link FWorkbook} */ @@ -469,7 +191,7 @@ export interface IBeforeFloatDomUpdateParam extends IEventBase { drawings: ISheetFloatDom[]; } -export interface IFloatDomUpdatedParam extends IEventBase { +export interface IFloatDomUpdatedEventParams extends IEventBase { /** * The workbook instance currently being operated on. {@link FWorkbook} */ @@ -481,7 +203,7 @@ export interface IFloatDomUpdatedParam extends IEventBase { drawings: ISheetFloatDom[]; } -export interface IBeforeFloatDomDeleteParam extends IEventBase { +export interface IBeforeFloatDomDeleteEventParams extends IEventBase { /** * The workbook instance currently being operated on. {@link FWorkbook} */ @@ -493,7 +215,7 @@ export interface IBeforeFloatDomDeleteParam extends IEventBase { drawings: ISheetFloatDom[]; } -export interface IFloatDomDeletedParam extends IEventBase { +export interface IFloatDomDeletedEventParams extends IEventBase { /** * The workbook instance currently being operated on. {@link FWorkbook} */ @@ -505,32 +227,20 @@ export interface IFloatDomDeletedParam extends IEventBase { drawings: string[]; } -interface IFSheetsUIEventParamConfig { - BeforeOverGridImageChange: IBeforeOverGridImageChangeParam; - OverGridImageChanged: IOverGridImageChangedParam; +interface ISheetsDrawingUIEventParamConfig { + BeforeFloatDomAdd: IBeforeFloatDomAddEventParams; + FloatDomAdded: IFloatDomAddedEventParams; - BeforeOverGridImageInsert: IBeforeOverGridImageInsertParam; - OverGridImageInserted: IOverGridImageInsertedParam; + BeforeFloatDomUpdate: IBeforeFloatDomUpdateEventParams; + FloatDomUpdated: IFloatDomUpdatedEventParams; - BeforeOverGridImageRemove: IBeforeOverGridImageRemoveParam; - OverGridImageRemoved: IOverGridImageRemovedParam; - - BeforeOverGridImageSelect: IBeforeOverGridImageSelectParam; - OverGridImageSelected: IOverGridImageSelectedParam; - - BeforeFloatDomAdd: IBeforeFloatDomAddParam; - FloatDomAdded: IFloatDomAddedParam; - - BeforeFloatDomUpdate: IBeforeFloatDomUpdateParam; - FloatDomUpdated: IFloatDomUpdatedParam; - - BeforeFloatDomDelete: IBeforeFloatDomDeleteParam; - FloatDomDeleted: IFloatDomDeletedParam; + BeforeFloatDomDelete: IBeforeFloatDomDeleteEventParams; + FloatDomDeleted: IFloatDomDeletedEventParams; } -FEventName.extend(FDrawingEventNameMixin); +FEventName.extend(FSheetsDrawingUIEventNameMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FEventName extends IFDrawingEventNameMixin { } - interface IEventParamConfig extends IFSheetsUIEventParamConfig { } + interface FEventName extends IFSheetsDrawingUIEventNameMixin { } + interface IEventParamConfig extends ISheetsDrawingUIEventParamConfig { } } diff --git a/packages/sheets-drawing-ui/src/facade/f-range.ts b/packages/sheets-drawing-ui/src/facade/f-range.ts index 47e40c46e9..3f93e621d2 100644 --- a/packages/sheets-drawing-ui/src/facade/f-range.ts +++ b/packages/sheets-drawing-ui/src/facade/f-range.ts @@ -35,7 +35,7 @@ export interface ISaveCellImagesOptions { useColumnIndex?: number; } -export interface IFRangeSheetDrawingMixin { +export interface IFRangeSheetsDrawingUIMixin { /** * Inserts an image into the current cell. * @@ -81,7 +81,7 @@ export interface IFRangeSheetDrawingMixin { saveCellImagesAsync(options?: ISaveCellImagesOptions): Promise; } -export class FRangeSheetDrawingUI extends FRange implements IFRangeSheetDrawingMixin { +export class FRangeSheetsDrawingUIMixin extends FRange implements IFRangeSheetsDrawingUIMixin { override async insertCellImageAsync(file: File | string): Promise { const renderManagerService = this._injector.get(IRenderManagerService); const controller = getCurrentTypeOfRenderer(UniverInstanceType.UNIVER_SHEET, this._injector.get(IUniverInstanceService), renderManagerService) @@ -157,8 +157,8 @@ export class FRangeSheetDrawingUI extends FRange implements IFRangeSheetDrawingM } } -FRange.extend(FRangeSheetDrawingUI); +FRange.extend(FRangeSheetsDrawingUIMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FRange extends IFRangeSheetDrawingMixin { } + interface FRange extends IFRangeSheetsDrawingUIMixin { } } diff --git a/packages/sheets-drawing-ui/src/facade/f-univer.ts b/packages/sheets-drawing-ui/src/facade/f-univer.ts index bb7f28acdb..320dd32a4c 100644 --- a/packages/sheets-drawing-ui/src/facade/f-univer.ts +++ b/packages/sheets-drawing-ui/src/facade/f-univer.ts @@ -15,44 +15,14 @@ */ import type { IDisposable, IDrawingSearch, Injector } from '@univerjs/core'; -import type { IEventBase } from '@univerjs/core/facade'; -import type { ISheetFloatDom, ISheetImage } from '@univerjs/sheets-drawing'; -import type { IDeleteDrawingCommandParams, IInsertDrawingCommandParams, ISetDrawingCommandParams } from '@univerjs/sheets-drawing-ui'; -import type { FWorkbook } from '@univerjs/sheets/facade'; -import type { - IBeforeFloatDomAddParam, - IBeforeFloatDomDeleteParam, - IBeforeFloatDomUpdateParam, - IBeforeOverGridImageChangeParamObject, -} from './f-event'; +import type { IDeleteDrawingCommandParams, IInsertDrawingCommandParams, ISetDrawingCommandParams, ISheetFloatDom } from '@univerjs/sheets-drawing'; +import type { IBeforeFloatDomAddEventParams, IBeforeFloatDomDeleteEventParams, IBeforeFloatDomUpdateEventParams, IFloatDomAddedEventParams, IFloatDomDeletedEventParams, IFloatDomUpdatedEventParams } from './f-event'; import { CanceledError, DrawingTypeEnum, ICommandService, IURLImageService } from '@univerjs/core'; import { FUniver } from '@univerjs/core/facade'; -import { IDrawingManagerService, SetDrawingSelectedOperation } from '@univerjs/drawing'; -import { InsertSheetDrawingCommand, RemoveSheetDrawingCommand, SetSheetDrawingCommand } from '@univerjs/sheets-drawing-ui'; -import { FOverGridImage } from './f-over-grid-image'; +import { IDrawingManagerService } from '@univerjs/drawing'; +import { InsertSheetDrawingCommand, RemoveSheetDrawingCommand, SetSheetDrawingCommand } from '@univerjs/sheets-drawing'; -interface IBeforeOverGridImageInsertParam extends IEventBase { - workbook: FWorkbook; - insertImageParams: ISheetImage[]; -} - -interface IBeforeOverGridImageRemoveParam extends IEventBase { - workbook: FWorkbook; - images: FOverGridImage[]; -} - -interface IBeforeOverGridImageChangeParam extends IEventBase { - workbook: FWorkbook; - images: IBeforeOverGridImageChangeParamObject[]; -} - -interface IBeforeOverGridImageSelectParam extends IEventBase { - workbook: FWorkbook; - selectedImages: FOverGridImage[]; - oldSelectedImages: FOverGridImage[]; -} - -export interface IFUniverDrawingUIMixin { +export interface IFUniverSheetsDrawingUIMixin { /** * Register a custom image downloader for URL images * @param downloader The downloader function that takes a URL and returns a base64 string @@ -77,7 +47,7 @@ export interface IFUniverDrawingUIMixin { /** * @ignore */ -export class FUniverDrawingUIMixin extends FUniver implements IFUniverDrawingUIMixin { +export class FUniverSheetsDrawingUIMixin extends FUniver implements IFUniverSheetsDrawingUIMixin { /** * @ignore */ @@ -107,7 +77,7 @@ export class FUniverDrawingUIMixin extends FUniver implements IFUniverDrawingUIM return; } - const eventParams: IBeforeFloatDomAddParam = { + const eventParams: IBeforeFloatDomAddEventParams = { workbook, drawings: floatDomDrawings, }; @@ -142,113 +112,11 @@ export class FUniverDrawingUIMixin extends FUniver implements IFUniverDrawingUIM return; } - this.fireEvent(this.Event.FloatDomAdded, { + const eventParams: IFloatDomAddedEventParams = { workbook, drawings: floatDomDrawings, - }); - }) - ) - ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.BeforeOverGridImageInsert, - () => commandService.beforeCommandExecuted((commandInfo) => { - if (commandInfo.id !== InsertSheetDrawingCommand.id) return; - - const params = commandInfo.params as IInsertDrawingCommandParams; - const workbook = this.getActiveWorkbook(); - if (workbook == null || params == null) { - return; - } - - const { drawings } = params; - const eventParams: IBeforeOverGridImageInsertParam = { - workbook, - insertImageParams: drawings as ISheetImage[], }; - - this.fireEvent(this.Event.BeforeOverGridImageInsert, eventParams); - - if (eventParams.cancel) { - throw new CanceledError(); - } - }) - ) - ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.BeforeOverGridImageRemove, - () => commandService.beforeCommandExecuted((commandInfo) => { - if (commandInfo.id !== RemoveSheetDrawingCommand.id) return; - - const params = commandInfo.params as IDeleteDrawingCommandParams; - const workbook = this.getActiveWorkbook(); - if (workbook == null || params == null) { - return; - } - - const drawingManagerService = injector.get(IDrawingManagerService); - - const { drawings } = params; - const willRemoveDrawings = drawings.map((drawing) => { - return drawingManagerService.getDrawingByParam(drawing); - }) as ISheetImage[]; - - const eventParams: IBeforeOverGridImageRemoveParam = { - workbook, - images: this._createFOverGridImage(willRemoveDrawings), - }; - - this.fireEvent(this.Event.BeforeOverGridImageRemove, eventParams); - - if (eventParams.cancel) { - throw new CanceledError(); - } - }) - ) - ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.BeforeOverGridImageChange, - () => commandService.beforeCommandExecuted((commandInfo) => { - if (commandInfo.id !== SetSheetDrawingCommand.id) return; - - const params = commandInfo.params as ISetDrawingCommandParams; - const workbook = this.getActiveWorkbook(); - if (workbook == null || params == null) { - return; - } - - const { drawings } = params; - const drawingManagerService = injector.get(IDrawingManagerService); - - const images: IBeforeOverGridImageChangeParamObject[] = []; - drawings.forEach((drawing) => { - const image = drawingManagerService.getDrawingByParam(drawing as IDrawingSearch) as ISheetImage; - if (image == null) { - return; - } - - images.push({ - changeParam: drawing, - image: this._injector.createInstance(FOverGridImage, image), - }); - }); - - const eventParams: IBeforeOverGridImageChangeParam = { - workbook, - images, - }; - - this.fireEvent(this.Event.BeforeOverGridImageChange, eventParams); - - if (eventParams.cancel) { - drawingManagerService.updateNotification(drawings as IDrawingSearch[]); - throw new CanceledError(); - } + this.fireEvent(this.Event.FloatDomAdded, eventParams); }) ) ); @@ -281,7 +149,7 @@ export class FUniverDrawingUIMixin extends FUniver implements IFUniverDrawingUIM return; } - const eventParams: IBeforeFloatDomUpdateParam = { + const eventParams: IBeforeFloatDomUpdateEventParams = { workbook, drawings: floatDomDrawings, }; @@ -324,10 +192,11 @@ export class FUniverDrawingUIMixin extends FUniver implements IFUniverDrawingUIM return; } - this.fireEvent(this.Event.FloatDomUpdated, { + const eventParams: IFloatDomUpdatedEventParams = { workbook, drawings: floatDomDrawings, - }); + }; + this.fireEvent(this.Event.FloatDomUpdated, eventParams); }) ) ); @@ -358,7 +227,7 @@ export class FUniverDrawingUIMixin extends FUniver implements IFUniverDrawingUIM return; } - const eventParams: IBeforeFloatDomDeleteParam = { + const eventParams: IBeforeFloatDomDeleteEventParams = { workbook, drawings: floatDomDrawings, }; @@ -385,147 +254,14 @@ export class FUniverDrawingUIMixin extends FUniver implements IFUniverDrawingUIM } const { drawings } = params; - - this.fireEvent(this.Event.FloatDomDeleted, { + const eventParams: IFloatDomDeletedEventParams = { workbook, drawings: drawings.filter((i) => i.drawingType === DrawingTypeEnum.DRAWING_DOM).map((i) => i.drawingId), - }); - }) - ) - ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.BeforeOverGridImageSelect, - () => commandService.beforeCommandExecuted((commandInfo) => { - if (commandInfo.id !== SetDrawingSelectedOperation.id) return; - - const drawings = commandInfo.params as IDrawingSearch[]; - const workbook = this.getActiveWorkbook(); - if (workbook == null) { - return; - } - const drawingManagerService = injector.get(IDrawingManagerService); - - const oldSelectedDrawings = drawingManagerService.getFocusDrawings() as ISheetImage[]; - const selectedDrawings = drawings.map((drawing) => { - return drawingManagerService.getDrawingByParam(drawing); - }) as ISheetImage[]; - - const eventParams: IBeforeOverGridImageSelectParam = { - workbook, - selectedImages: this._createFOverGridImage(selectedDrawings), - oldSelectedImages: this._createFOverGridImage(oldSelectedDrawings), }; - - this.fireEvent(this.Event.BeforeOverGridImageSelect, eventParams); - - if (eventParams.cancel) { - throw new CanceledError(); - } + this.fireEvent(this.Event.FloatDomDeleted, eventParams); }) ) ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.OverGridImageInserted, - () => commandService.onCommandExecuted((commandInfo) => { - if (commandInfo.id !== InsertSheetDrawingCommand.id) return; - - const params = commandInfo.params as IInsertDrawingCommandParams; - const workbook = this.getActiveWorkbook(); - if (workbook == null || params == null) { - return; - } - - const { drawings } = params; - this.fireEvent(this.Event.OverGridImageInserted, { - workbook, - images: this._createFOverGridImage(drawings as ISheetImage[]), - }); - }) - ) - ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.OverGridImageRemoved, - () => commandService.onCommandExecuted((commandInfo) => { - if (commandInfo.id !== RemoveSheetDrawingCommand.id) return; - - const params = commandInfo.params as IDeleteDrawingCommandParams; - const workbook = this.getActiveWorkbook(); - if (workbook == null || params == null) { - return; - } - - const { drawings } = params; - this.fireEvent(this.Event.OverGridImageRemoved, { - workbook, - removeImageParams: drawings, - }); - }) - ) - ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.OverGridImageChanged, - () => commandService.onCommandExecuted((commandInfo) => { - if (commandInfo.id !== SetSheetDrawingCommand.id) return; - - const params = commandInfo.params as ISetDrawingCommandParams; - const workbook = this.getActiveWorkbook(); - if (workbook == null || params == null) { - return; - } - - const { drawings } = params; - const drawingManagerService = injector.get(IDrawingManagerService); - - const images = drawings.map((drawing) => { - return this._injector.createInstance(FOverGridImage, drawingManagerService.getDrawingByParam(drawing as IDrawingSearch) as ISheetImage); - }); - - this.fireEvent(this.Event.OverGridImageChanged, { - workbook, - images, - }); - }) - ) - ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.OverGridImageSelected, - () => commandService.onCommandExecuted((commandInfo) => { - if (commandInfo.id !== SetDrawingSelectedOperation.id) return; - - const drawings = commandInfo.params as IDrawingSearch[]; - const workbook = this.getActiveWorkbook(); - if (workbook == null) { - return; - } - const drawingManagerService = injector.get(IDrawingManagerService); - - const selectedDrawings = drawings.map((drawing) => { - return drawingManagerService.getDrawingByParam(drawing); - }) as ISheetImage[]; - - this.fireEvent(this.Event.OverGridImageSelected, { - workbook, - selectedImages: this._createFOverGridImage(selectedDrawings as ISheetImage[]), - }); - }) - ) - ); - } - - private _createFOverGridImage(drawings: ISheetImage[]): FOverGridImage[] { - return drawings.map((drawing) => { - return this._injector.createInstance(FOverGridImage, drawing); - }); } override registerURLImageDownloader(downloader: (url: string) => Promise): IDisposable { @@ -534,8 +270,8 @@ export class FUniverDrawingUIMixin extends FUniver implements IFUniverDrawingUIM } } -FUniver.extend(FUniverDrawingUIMixin); +FUniver.extend(FUniverSheetsDrawingUIMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FUniver extends IFUniverDrawingUIMixin { } + interface FUniver extends IFUniverSheetsDrawingUIMixin { } } diff --git a/packages/sheets-drawing-ui/src/facade/f-worksheet.ts b/packages/sheets-drawing-ui/src/facade/f-worksheet.ts index f0a83ec93b..69488334cf 100644 --- a/packages/sheets-drawing-ui/src/facade/f-worksheet.ts +++ b/packages/sheets-drawing-ui/src/facade/f-worksheet.ts @@ -14,22 +14,18 @@ * limitations under the License. */ -import type { IDisposable, ITransformState, Nullable } from '@univerjs/core'; -import type { IFBlobSource } from '@univerjs/core/facade'; -import type { ISheetFloatDom, ISheetImage } from '@univerjs/sheets-drawing'; +import type { ITransformState, Nullable } from '@univerjs/core'; +import type { ISheetFloatDom } from '@univerjs/sheets-drawing'; import type { ICanvasFloatDom, ICanvasFloatDomInfo, IDOMAnchor } from '@univerjs/sheets-drawing-ui'; import type { IFComponentKey } from '@univerjs/sheets-ui/facade'; import type { FRange } from '@univerjs/sheets/facade'; import type { ISaveCellImagesOptions } from './f-range'; -import { DrawingTypeEnum, ImageSourceType, toDisposable } from '@univerjs/core'; -import { IRenderManagerService } from '@univerjs/engine-render'; -import { ISheetDrawingService } from '@univerjs/sheets-drawing'; -import { FileNamePart, IBatchSaveImagesService, InsertSheetDrawingCommand, RemoveSheetDrawingCommand, SetSheetDrawingCommand, SheetCanvasFloatDomManagerService, transformToAxisAlignPosition, transformToDrawingPosition } from '@univerjs/sheets-drawing-ui'; -import { ISheetSelectionRenderService } from '@univerjs/sheets-ui'; +import { SheetSkeletonService } from '@univerjs/sheets'; +import { ISheetDrawingService, RemoveSheetDrawingCommand, SetSheetDrawingCommand, transformToAxisAlignPosition, transformToDrawingPosition } from '@univerjs/sheets-drawing'; +import { FileNamePart, IBatchSaveImagesService, SheetCanvasFloatDomManagerService } from '@univerjs/sheets-drawing-ui'; import { transformComponentKey } from '@univerjs/sheets-ui/facade'; import { FWorksheet } from '@univerjs/sheets/facade'; import { ComponentManager } from '@univerjs/ui'; -import { FOverGridImage, FOverGridImageBuilder } from './f-over-grid-image'; // why omit this key? if componentKey is missing, then which component should be used? export interface IFICanvasFloatDom extends Omit, IFComponentKey { } @@ -44,7 +40,7 @@ export interface IFCanvasFloatDomResult extends Omit void; }>; - /** - * Insert an image to the sheet - * @param {string} url - The image url - * @returns true if the image is inserted successfully - * @example - * ```ts - * // Insert an image to the sheet, default position is A1 - * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); - * const result = await fWorksheet.insertImage('https://avatars.githubusercontent.com/u/61444807?s=48&v=4'); - * console.log(result); - * ``` - */ - insertImage(url: string): Promise; - /** - * @param {string} url - The image url - * @param {number} column - The column index to insert the image - * @param {number} row - The row index to insert the image - * @returns True if the image is inserted successfully - * @example - * ```ts - * // Insert an image to the sheet, position is F6 - * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); - * const result = await fWorksheet.insertImage('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', 5, 5); - * console.log(result); - * ``` - */ - insertImage(url: string, column: number, row: number): Promise; - /** - * @param {string} url - The image url - * @param {number} column - The column index to insert the image - * @param {number} row - The row index to insert the image - * @param {number} offsetX - The column offset, pixel unit - * @param {number} offsetY - The row offset, pixel unit - * @returns True if the image is inserted successfully - * @example - * ```ts - * // Insert an image to the sheet, position is F6, offset is 10px - * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); - * const result = await fWorksheet.insertImage('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', 5, 5, 10, 10); - * console.log(result); - * ``` - */ - insertImage(url: string, column: number, row: number, offsetX: number, offsetY: number): Promise; - insertImage(url: IFBlobSource): Promise; - insertImage(url: IFBlobSource, column: number, row: number): Promise; - insertImage(url: IFBlobSource, column: number, row: number, offsetX: number, offsetY: number): Promise; - insertImage(url: IFBlobSource | string, column: number, row: number, offsetX: number, offsetY: number): Promise; - - /** - * Insert images to the sheet - * @param {ISheetImage[]} sheetImages - The images to insert - * @returns {FWorksheet} The FWorksheet instance for chaining - * @example - * ```ts - * // create a new image builder and set image source. - * // then build `ISheetImage` and insert it into the sheet, position is start from F6 cell, width is 500px, height is 300px - * const fWorkbook = univerAPI.getActiveWorkbook(); - * const fWorksheet = fWorkbook.getActiveSheet(); - * const image = await fWorksheet.newOverGridImage() - * .setSource('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', univerAPI.Enum.ImageSourceType.URL) - * .setColumn(5) - * .setRow(5) - * .setWidth(500) - * .setHeight(300) - * .buildAsync(); - * fWorksheet.insertImages([image]); - * - * // update the image width to 100px and height to 50px - * setTimeout(async () => { - * const imageBuilder = fWorksheet.getImageById(image.drawingId).toBuilder(); - * const newImage = await imageBuilder.setWidth(100).setHeight(50).buildAsync(); - * fWorksheet.updateImages([newImage]); - * }, 4000); - * ``` - */ - insertImages(sheetImages: ISheetImage[]): FWorksheet; - - /** - * Get all images of the sheet. - * @returns {FOverGridImage[]} The FOverGridImage instances - * @example - * ```ts - * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); - * const images = fWorksheet.getImages(); - * images.forEach((image) => { - * console.log(image, image.getId()); - * }); - * ``` - */ - getImages(): FOverGridImage[]; - - /** - * Get image by drawing id - * @param {string} id - The drawing id of the image - * @returns {FOverGridImage | null} The FOverGridImage instance - * @example - * ```ts - * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); - * const image = fWorksheet.getImageById('xxxx'); - * console.log(image); - * ``` - */ - getImageById(id: string): FOverGridImage | null; - - /** - * Delete images from the sheet - * @param {FOverGridImage[]} sheetImages - The images to delete - * @returns {FWorksheet} The FWorksheet instance for chaining - * @example - * ```ts - * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); - * const image = fWorksheet.getImages()[0]; - * - * // Delete the first image of the sheet - * fWorksheet.deleteImages([image]); - * ``` - */ - deleteImages(sheetImages: FOverGridImage[]): FWorksheet; - - /** - * Update images to the sheet - * @param {ISheetImage[]} sheetImages - The images to update - * @returns {FWorksheet} The FWorksheet instance for chaining - * @example - * ```ts - * // create a new image builder and set image source. - * // then build `ISheetImage` and insert it into the sheet, position is start from F6 cell, width is 500px, height is 300px - * const fWorkbook = univerAPI.getActiveWorkbook(); - * const fWorksheet = fWorkbook.getActiveSheet(); - * const image = await fWorksheet.newOverGridImage() - * .setSource('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', univerAPI.Enum.ImageSourceType.URL) - * .setColumn(5) - * .setRow(5) - * .setWidth(500) - * .setHeight(300) - * .buildAsync(); - * fWorksheet.insertImages([image]); - * - * // update the image width to 100px and height to 50px after 4 seconds - * setTimeout(async () => { - * const imageBuilder = fWorksheet.getImageById(image.drawingId).toBuilder(); - * const newImage = await imageBuilder.setWidth(100).setHeight(50).buildAsync(); - * fWorksheet.updateImages([newImage]); - * }, 4000); - * ``` - */ - updateImages(sheetImages: ISheetImage[]): FWorksheet; - - /** - * Get the current selected images. - * @returns {FOverGridImage[]} The FOverGridImage instances - * @example - * ```ts - * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); - * const images = fWorksheet.getActiveImages(); - * images.forEach((image) => { - * console.log(image, image.getId()); - * }); - * ``` - */ - getActiveImages(): FOverGridImage[]; - - /** - * Hook when a image is inserted. - * @param {function(FOverGridImage[]: void)} callback - The callback function when a image is inserted. - * @deprecated use `univerAPI.addEvent(univerAPI.Event.OverGridImageInserted, (params) => {})` as instead - */ - onImageInserted(callback: (images: FOverGridImage[]) => void): IDisposable; - - /** - * Hook when a image is deleted. - * @param {function(FOverGridImage[]: void)} callback - The callback function when a image is deleted. - * @deprecated use `univerAPI.addEvent(univerAPI.Event.OverGridImageRemoved, (params) => {})` as instead - */ - onImageDeleted(callback: (images: FOverGridImage[]) => void): IDisposable; - - /** - * Hook when a image is changed. - * @param {function(FOverGridImage[]: void)} callback - The callback function when a image is changed. - * @deprecated use `univerAPI.addEvent(univerAPI.Event.OverGridImageChanged, (params) => {})` as instead - */ - onImageChanged(callback: (images: FOverGridImage[]) => void): IDisposable; - - /** - * Create a new over grid image builder. - * @returns {FOverGridImageBuilder} The FOverGridImageBuilder instance - * @example - * ```ts - * // create a new image builder and set image source. - * // then build `ISheetImage` and insert it into the sheet, position is start from F6 cell, width is 500px, height is 300px - * const fWorkbook = univerAPI.getActiveWorkbook(); - * const fWorksheet = fWorkbook.getActiveSheet(); - * const image = await fWorksheet.newOverGridImage() - * .setSource('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', univerAPI.Enum.ImageSourceType.URL) - * .setColumn(5) - * .setRow(5) - * .setWidth(500) - * .setHeight(300) - * .buildAsync(); - * fWorksheet.insertImages([image]); - * ``` - */ - newOverGridImage(): FOverGridImageBuilder; - /** * Save all cell images from specified ranges to the file system. * This method will open a directory picker dialog and save all images to the selected directory. @@ -619,7 +411,7 @@ export interface IFWorksheetLegacy { saveCellImagesAsync(options?: ISaveCellImagesOptions, ranges?: FRange[]): Promise; } -export class FWorksheetLegacy extends FWorksheet implements IFWorksheetLegacy { +export class FWorksheetDrawingUIMixin extends FWorksheet implements IFWorksheetDrawingUIMixin { override getFloatDomById(id: string): Nullable { const floatDomService = this._injector.get(SheetCanvasFloatDomManagerService); const info = floatDomService.getFloatDomInfo(id); @@ -693,11 +485,14 @@ export class FWorksheetLegacy extends FWorksheet implements IFWorksheetLegacy { } override updateFloatDom(id: string, config: Partial>): this { + const sheetSkeletonService = this._injector.get(SheetSkeletonService); const floatDomService = this._injector.get(SheetCanvasFloatDomManagerService); const info = floatDomService.getFloatDomInfo(id); if (!info) return this; const { unitId, subUnitId } = info; + const skeleton = sheetSkeletonService.getSkeleton(unitId, subUnitId); + if (!skeleton) return this; const drawingParm = this._injector.get(ISheetDrawingService).getDrawingByParam({ unitId, @@ -705,50 +500,34 @@ export class FWorksheetLegacy extends FWorksheet implements IFWorksheetLegacy { drawingId: id, })! as ISheetFloatDom; - const renderManagerService = this._injector.get(IRenderManagerService); - const render = renderManagerService.getRenderById(unitId); - if (!render) return this; - - const skeleton = this.getSkeleton(); - if (!skeleton) return this; - - const selectionRenderService = renderManagerService.getRenderById(this.getWorkbook().getUnitId())?.with(ISheetSelectionRenderService); - if (!selectionRenderService) return this; - const newParam: ISheetFloatDom = { ...drawingParm, componentKey: config.componentKey || drawingParm.componentKey, allowTransform: config.allowTransform !== undefined ? config.allowTransform : drawingParm.allowTransform, data: config.data || drawingParm.data, sheetTransform: config.position - ? transformToDrawingPosition( - config.position, - selectionRenderService - ) ?? drawingParm.sheetTransform + ? transformToDrawingPosition(config.position, skeleton) ?? drawingParm.sheetTransform : drawingParm.sheetTransform, transform: { ...drawingParm.transform, ...config.position, // Merge with existing transform }, axisAlignSheetTransform: config.position - ? transformToAxisAlignPosition( - config.position, - selectionRenderService - ) ?? drawingParm.sheetTransform + ? transformToAxisAlignPosition(config.position, skeleton) ?? drawingParm.sheetTransform : drawingParm.sheetTransform, }; + const res = this._commandService.syncExecuteCommand(SetSheetDrawingCommand.id, { unitId, subUnitId, drawings: [newParam] }); if (!res) { throw new Error('updateFloatDom failed'); } - return this; } override batchUpdateFloatDoms(updates: Array<{ id: string; config: Partial> }>): this { const floatDomService = this._injector.get(SheetCanvasFloatDomManagerService); const drawingService = this._injector.get(ISheetDrawingService); - const renderManagerService = this._injector.get(IRenderManagerService); + const sheetSkeletonService = this._injector.get(SheetSkeletonService); const drawings: ISheetFloatDom[] = []; @@ -757,6 +536,9 @@ export class FWorksheetLegacy extends FWorksheet implements IFWorksheetLegacy { if (!info) continue; const { unitId, subUnitId } = info; + const skeleton = sheetSkeletonService.getSkeleton(unitId, subUnitId); + if (!skeleton) continue; + const drawingParm = drawingService.getDrawingByParam({ unitId, subUnitId, @@ -764,35 +546,20 @@ export class FWorksheetLegacy extends FWorksheet implements IFWorksheetLegacy { }) as ISheetFloatDom; if (!drawingParm) continue; - const render = renderManagerService.getRenderById(unitId); - if (!render) continue; - - const skeleton = this.getSkeleton(); - if (!skeleton) continue; - - const selectionRenderService = render.with(ISheetSelectionRenderService); - if (!selectionRenderService) return this; - const newParam: ISheetFloatDom = { ...drawingParm, componentKey: update.config.componentKey || drawingParm.componentKey, allowTransform: update.config.allowTransform !== undefined ? update.config.allowTransform : drawingParm.allowTransform, data: update.config.data || drawingParm.data, sheetTransform: update.config.position - ? transformToDrawingPosition( - update.config.position, - selectionRenderService - ) ?? drawingParm.sheetTransform + ? transformToDrawingPosition(update.config.position, skeleton) ?? drawingParm.sheetTransform : drawingParm.sheetTransform, transform: { ...drawingParm.transform, ...update.config.position, // Merge with existing transform }, axisAlignSheetTransform: update.config.position - ? transformToAxisAlignPosition( - update.config.position, - selectionRenderService - ) ?? drawingParm.sheetTransform + ? transformToAxisAlignPosition(update.config.position, skeleton) ?? drawingParm.sheetTransform : drawingParm.sheetTransform, }; @@ -913,146 +680,6 @@ export class FWorksheetLegacy extends FWorksheet implements IFWorksheetLegacy { return null; } - override async insertImage(url: IFBlobSource | string, column?: number, row?: number, offsetX?: number, offsetY?: number): Promise { - const imageBuilder = this.newOverGridImage(); - if (typeof url === 'string') { - imageBuilder.setSource(url); - } else { - const blobSource = url.getBlob(); - const base64 = await blobSource.getDataAsString(); - imageBuilder.setSource(base64, ImageSourceType.BASE64); - } - - if (column !== undefined) { - imageBuilder.setColumn(column); - } else { - imageBuilder.setColumn(0); - } - - if (row !== undefined) { - imageBuilder.setRow(row); - } else { - imageBuilder.setRow(0); - } - - if (offsetX !== undefined) { - imageBuilder.setColumnOffset(offsetX); - } else { - imageBuilder.setColumnOffset(0); - } - - if (offsetY !== undefined) { - imageBuilder.setRowOffset(offsetY); - } else { - imageBuilder.setRowOffset(0); - } - - const param = await imageBuilder.buildAsync(); - // param.drawingId - - return this._commandService.syncExecuteCommand(InsertSheetDrawingCommand.id, { unitId: this._fWorkbook.getId(), drawings: [param] }); - } - - override insertImages(sheetImages: ISheetImage[]): FWorksheet { - const param = sheetImages.map((image) => { - image.unitId = this._fWorkbook.getId(); - image.subUnitId = this.getSheetId(); - return image; - }); - - this._commandService.syncExecuteCommand(InsertSheetDrawingCommand.id, { unitId: this._fWorkbook.getId(), drawings: param }); - return this; - } - - override deleteImages(sheetImages: FOverGridImage[]): FWorksheet { - const drawings = sheetImages.map((image) => { - return { - unitId: this._fWorkbook.getId(), - drawingId: image.getId(), - subUnitId: this.getSheetId(), - drawingType: image.getType(), - }; - }); - this._commandService.syncExecuteCommand(RemoveSheetDrawingCommand.id, { unitId: this._fWorkbook.getId(), drawings }); - - return this; - } - - override getImages(): FOverGridImage[] { - const sheetDrawingService = this._injector.get(ISheetDrawingService); - const drawingData = sheetDrawingService.getDrawingData(this._fWorkbook.getId(), this.getSheetId()); - const images: FOverGridImage[] = []; - for (const drawingId in drawingData) { - const drawing = drawingData[drawingId]; - if (drawing.drawingType !== DrawingTypeEnum.DRAWING_IMAGE) { - continue; - } - images.push(this._injector.createInstance(FOverGridImage, drawing as ISheetImage)); - } - return images; - } - - override getImageById(id: string): FOverGridImage | null { - const sheetDrawingService = this._injector.get(ISheetDrawingService); - const drawing = sheetDrawingService.getDrawingByParam({ unitId: this._fWorkbook.getId(), subUnitId: this.getSheetId(), drawingId: id }); - if (drawing && drawing.drawingType === DrawingTypeEnum.DRAWING_IMAGE) { - return this._injector.createInstance(FOverGridImage, drawing as ISheetImage); - } - return null; - } - - override getActiveImages(): FOverGridImage[] { - const sheetDrawingService = this._injector.get(ISheetDrawingService); - const drawingData = sheetDrawingService.getFocusDrawings(); - const images: FOverGridImage[] = []; - for (const drawingId in drawingData) { - const drawing = drawingData[drawingId]; - images.push(this._injector.createInstance(FOverGridImage, drawing as ISheetImage)); - } - return images; - } - - override updateImages(sheetImages: ISheetImage[]): FWorksheet { - this._commandService.syncExecuteCommand(SetSheetDrawingCommand.id, { unitId: this._fWorkbook.getId(), drawings: sheetImages }); - return this; - } - - override onImageInserted(callback: (images: FOverGridImage[]) => void): IDisposable { - const sheetDrawingService = this._injector.get(ISheetDrawingService); - return toDisposable(sheetDrawingService.add$.subscribe((drawingSearches) => { - const drawings = drawingSearches.map( - (drawingSearch) => this._injector.createInstance(FOverGridImage, sheetDrawingService.getDrawingByParam(drawingSearch) as ISheetImage) - ); - callback(drawings); - })); - } - - override onImageDeleted(callback: (images: FOverGridImage[]) => void): IDisposable { - const sheetDrawingService = this._injector.get(ISheetDrawingService); - return toDisposable(sheetDrawingService.remove$.subscribe((drawingSearches) => { - const drawings = drawingSearches.map( - (drawingSearch) => this._injector.createInstance(FOverGridImage, sheetDrawingService.getDrawingByParam(drawingSearch) as ISheetImage) - ); - callback(drawings); - })); - } - - override onImageChanged(callback: (images: FOverGridImage[]) => void): IDisposable { - const sheetDrawingService = this._injector.get(ISheetDrawingService); - return toDisposable(sheetDrawingService.update$.subscribe((drawingSearches) => { - const drawings = drawingSearches.map( - (drawingSearch) => this._injector.createInstance(FOverGridImage, sheetDrawingService.getDrawingByParam(drawingSearch) as ISheetImage) - ); - callback(drawings); - })); - } - - override newOverGridImage(): FOverGridImageBuilder { - const unitId = this._fWorkbook.getId(); - const subUnitId = this.getSheetId(); - return this._injector.createInstance(FOverGridImageBuilder, unitId, subUnitId); - } - override async saveCellImagesAsync(options?: ISaveCellImagesOptions, ranges?: FRange[]): Promise { const batchSaveService = this._injector.get(IBatchSaveImagesService); const unitId = this._fWorkbook.getId(); @@ -1109,8 +736,8 @@ export class FWorksheetLegacy extends FWorksheet implements IFWorksheetLegacy { } } -FWorksheet.extend(FWorksheetLegacy); +FWorksheet.extend(FWorksheetDrawingUIMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FWorksheet extends IFWorksheetLegacy { } + interface FWorksheet extends IFWorksheetDrawingUIMixin { } } diff --git a/packages/sheets-drawing-ui/src/facade/index.ts b/packages/sheets-drawing-ui/src/facade/index.ts index babb95a9c2..9083004767 100644 --- a/packages/sheets-drawing-ui/src/facade/index.ts +++ b/packages/sheets-drawing-ui/src/facade/index.ts @@ -14,16 +14,12 @@ * limitations under the License. */ -import './f-over-grid-image'; import './f-worksheet'; -import './f-enum'; import './f-event'; import './f-univer'; import './f-range'; -export type * from './f-enum'; export type * from './f-event'; -export type * from './f-over-grid-image'; export type * from './f-range'; export type * from './f-univer'; export type * from './f-worksheet'; diff --git a/packages/sheets-drawing-ui/src/index.ts b/packages/sheets-drawing-ui/src/index.ts index bb81cdfca7..ecf8020f5f 100644 --- a/packages/sheets-drawing-ui/src/index.ts +++ b/packages/sheets-drawing-ui/src/index.ts @@ -16,17 +16,11 @@ import './global.css'; -export { drawingPositionToTransform, transformToAxisAlignPosition, transformToDrawingPosition } from './basics/transform-position'; export { DeleteDrawingsCommand } from './commands/commands/delete-drawings.command'; export { GroupSheetDrawingCommand } from './commands/commands/group-sheet-drawing.command'; export { type IInsertImageCommandParams, InsertFloatImageCommand } from './commands/commands/insert-image.command'; -export { InsertSheetDrawingCommand } from './commands/commands/insert-sheet-drawing.command'; -export type { IDeleteDrawingCommandParams, IInsertDrawingCommandParams, ISetDrawingCommandParams } from './commands/commands/interfaces'; export { MoveDrawingsCommand } from './commands/commands/move-drawings.command'; -export { RemoveSheetDrawingCommand } from './commands/commands/remove-sheet-drawing.command'; export { SaveCellImagesCommand } from './commands/commands/save-cell-images.command'; -export { SetDrawingArrangeCommand } from './commands/commands/set-drawing-arrange.command'; -export { SetSheetDrawingCommand } from './commands/commands/set-sheet-drawing.command'; export { UngroupSheetDrawingCommand } from './commands/commands/ungroup-sheet-drawing.command'; export { ClearSheetDrawingTransformerOperation } from './commands/operations/clear-drawing-transformer.operation'; export { EditSheetDrawingOperation } from './commands/operations/edit-sheet-drawing.operation'; diff --git a/packages/sheets-drawing-ui/src/menu/drawing-popup-menu.controller.ts b/packages/sheets-drawing-ui/src/menu/drawing-popup-menu.controller.ts index e6e80ce3ef..afa5f7ddef 100644 --- a/packages/sheets-drawing-ui/src/menu/drawing-popup-menu.controller.ts +++ b/packages/sheets-drawing-ui/src/menu/drawing-popup-menu.controller.ts @@ -23,10 +23,10 @@ import { MessageType } from '@univerjs/design'; import { IDrawingManagerService, SetDrawingSelectedOperation } from '@univerjs/drawing'; import { COMPONENT_IMAGE_POPUP_MENU, ImageCropperObject, ImageResetSizeOperation, OpenImageCropOperation } from '@univerjs/drawing-ui'; import { IRenderManagerService } from '@univerjs/engine-render'; +import { RemoveSheetDrawingCommand } from '@univerjs/sheets-drawing'; import { SheetCanvasPopManagerService } from '@univerjs/sheets-ui'; import { IMessageService } from '@univerjs/ui'; import { FlipSheetDrawingCommand } from '../commands/commands/flip-drawings.command'; -import { RemoveSheetDrawingCommand } from '../commands/commands/remove-sheet-drawing.command'; import { EditSheetDrawingOperation } from '../commands/operations/edit-sheet-drawing.operation'; export class DrawingPopupMenuController extends RxDisposable { diff --git a/packages/sheets-drawing-ui/src/services/canvas-float-dom-manager.service.ts b/packages/sheets-drawing-ui/src/services/canvas-float-dom-manager.service.ts index d60524f752..648b8a2e07 100644 --- a/packages/sheets-drawing-ui/src/services/canvas-float-dom-manager.service.ts +++ b/packages/sheets-drawing-ui/src/services/canvas-float-dom-manager.service.ts @@ -18,18 +18,16 @@ import type { IDisposable, IDrawingSearch, IPosition, IRange, ITransformState, N import type { IDrawingJsonUndo1 } from '@univerjs/drawing'; import type { BaseObject, IBoundRectNoAngle, IRectProps, IRender, Scene, SpreadsheetSkeleton } from '@univerjs/engine-render'; import type { ISetFrozenMutationParams, ISetSelectionsOperationParams, ISetWorksheetRowAutoHeightMutationParams } from '@univerjs/sheets'; -import type { IFloatDomData, ISheetDrawingPosition, ISheetFloatDom } from '@univerjs/sheets-drawing'; +import type { IFloatDomData, IInsertDrawingCommandParams, ISheetDrawingPosition, ISheetFloatDom } from '@univerjs/sheets-drawing'; import type { IFloatDom, IFloatDomLayout } from '@univerjs/ui'; -import type { IInsertDrawingCommandParams } from '../commands/commands/interfaces'; import { Disposable, DisposableCollection, DrawingTypeEnum, fromEventSubject, generateRandomId, ICommandService, Inject, IUniverInstanceService, LifecycleService, LifecycleStages, Tools, UniverInstanceType } from '@univerjs/core'; import { getDrawingShapeKeyByDrawingSearch, IDrawingManagerService } from '@univerjs/drawing'; import { DRAWING_OBJECT_LAYER_INDEX, IRenderManagerService, ObjectType, Rect, SHEET_VIEWPORT_KEY } from '@univerjs/engine-render'; import { COMMAND_LISTENER_SKELETON_CHANGE, getSheetCommandTarget, SetFrozenMutation, SetSelectionsOperation, SetWorksheetRowAutoHeightMutation } from '@univerjs/sheets'; -import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation } from '@univerjs/sheets-drawing'; +import { DrawingApplyType, InsertSheetDrawingCommand, ISheetDrawingService, SetDrawingApplyMutation } from '@univerjs/sheets-drawing'; import { ISheetSelectionRenderService, SetScrollOperation, SetZoomRatioOperation, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; import { CanvasFloatDomService } from '@univerjs/ui'; import { BehaviorSubject, filter, map, of, Subject, switchMap, take } from 'rxjs'; -import { InsertSheetDrawingCommand } from '../commands/commands/insert-sheet-drawing.command'; export interface ICanvasFloatDom { /** @@ -761,7 +759,7 @@ export class SheetCanvasFloatDomManagerService extends Disposable { if (!renderObject) return; const currentRender = this._renderManagerService.getRenderById(unitId); if (!currentRender) return; - const skeletonParam = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService).getWorksheetSkeleton(subUnitId); + const skeletonParam = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService).getSkeletonParam(subUnitId); if (!skeletonParam) return; const { componentKey, data, allowTransform = true } = config; @@ -815,7 +813,7 @@ export class SheetCanvasFloatDomManagerService extends Disposable { if (!skMangerService) { return; } - const skeletonParam = skMangerService.getWorksheetSkeleton(subUnitId); + const skeletonParam = skMangerService.getSkeletonParam(subUnitId); if (!skeletonParam) { return; } @@ -1011,7 +1009,7 @@ export class SheetCanvasFloatDomManagerService extends Disposable { if (!renderObject) return; const currentRender = this._renderManagerService.getRenderById(unitId); if (!currentRender) return; - const skeletonParam = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService).getWorksheetSkeleton(subUnitId); + const skeletonParam = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService).getSkeletonParam(subUnitId); if (!skeletonParam) return; const { componentKey, data, allowTransform = true } = config; @@ -1071,7 +1069,7 @@ export class SheetCanvasFloatDomManagerService extends Disposable { if (!skMangerService) { return; } - const skeleton = skMangerService.getWorksheetSkeleton(subUnitId); + const skeleton = skMangerService.getSkeletonParam(subUnitId); if (!skeleton) { return; } diff --git a/packages/sheets-drawing-ui/src/views/sheet-image-panel/SheetDrawingAnchor.tsx b/packages/sheets-drawing-ui/src/views/sheet-image-panel/SheetDrawingAnchor.tsx index e0c8eb645d..6b0d14cccb 100644 --- a/packages/sheets-drawing-ui/src/views/sheet-image-panel/SheetDrawingAnchor.tsx +++ b/packages/sheets-drawing-ui/src/views/sheet-image-panel/SheetDrawingAnchor.tsx @@ -21,10 +21,9 @@ import { ICommandService, LocaleService } from '@univerjs/core'; import { clsx, Radio, RadioGroup } from '@univerjs/design'; import { IDrawingManagerService } from '@univerjs/drawing'; import { IRenderManagerService } from '@univerjs/engine-render'; -import { SheetDrawingAnchorType } from '@univerjs/sheets-drawing'; +import { SetSheetDrawingCommand, SheetDrawingAnchorType } from '@univerjs/sheets-drawing'; import { useDependency } from '@univerjs/ui'; import { useEffect, useState } from 'react'; -import { SetSheetDrawingCommand } from '../../commands/commands/set-sheet-drawing.command'; export interface ISheetDrawingAnchorProps { drawings: IDrawingParam[]; diff --git a/packages/sheets-drawing/package.json b/packages/sheets-drawing/package.json index 87ac3b0ee2..88508a9df4 100644 --- a/packages/sheets-drawing/package.json +++ b/packages/sheets-drawing/package.json @@ -20,7 +20,8 @@ "keywords": [], "exports": { ".": "./src/index.ts", - "./*": "./src/*" + "./*": "./src/*", + "./facade": "./src/facade/index.ts" }, "main": "./src/index.ts", "types": "./lib/types/index.d.ts", @@ -39,6 +40,16 @@ "require": "./lib/cjs/*", "types": "./lib/types/index.d.ts" }, + "./facade": { + "import": "./lib/es/facade.js", + "require": "./lib/cjs/facade.js", + "types": "./lib/types/facade/index.d.ts" + }, + "./lib/facade": { + "import": "./lib/es/facade.js", + "require": "./lib/cjs/facade.js", + "types": "./lib/types/facade/index.d.ts" + }, "./lib/*": "./lib/*" } }, @@ -60,6 +71,7 @@ "dependencies": { "@univerjs/core": "workspace:*", "@univerjs/drawing": "workspace:*", + "@univerjs/engine-render": "workspace:*", "@univerjs/sheets": "workspace:*" }, "devDependencies": { diff --git a/packages/sheets-drawing/src/basics/transform-position.ts b/packages/sheets-drawing/src/basics/transform-position.ts new file mode 100644 index 0000000000..8fe5ef8e90 --- /dev/null +++ b/packages/sheets-drawing/src/basics/transform-position.ts @@ -0,0 +1,103 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ITransformState, Nullable } from '@univerjs/core'; +import type { SpreadsheetSkeleton } from '@univerjs/engine-render'; +import type { ISheetSkeletonManagerParam } from '@univerjs/sheets'; +import type { ISheetDrawingPosition } from '../services/sheet-drawing.service'; +import { convertPositionSheetOverGridToAbsolute } from '@univerjs/sheets'; + +export function drawingPositionToTransform(position: ISheetDrawingPosition, sheetSkeletonParam: Nullable): Nullable { + if (!sheetSkeletonParam) return; + + const { unitId, sheetId, skeleton } = sheetSkeletonParam; + const { from, to, flipY = false, flipX = false, angle = 0, skewX = 0, skewY = 0 } = position; + const absolutePosition = convertPositionSheetOverGridToAbsolute(unitId, sheetId, { from, to }, skeleton); + + let { left, top, width, height } = absolutePosition; + + const sheetWidth = skeleton.rowHeaderWidth + skeleton.columnTotalWidth; + const sheetHeight = skeleton.columnHeaderHeight + skeleton.rowTotalHeight; + + if ((left + width) > sheetWidth) { + left = sheetWidth - width; + } + if ((top + height) > sheetHeight) { + top = sheetHeight - height; + } + + return { + flipY, + flipX, + angle, + skewX, + skewY, + left, + top, + width, + height, + }; +} + +// use transform and originSize convert to ISheetDrawingPosition +export function transformToDrawingPosition(transform: ITransformState, skeleton: SpreadsheetSkeleton): ISheetDrawingPosition { + const { left = 0, top = 0, width = 0, height = 0, flipY = false, flipX = false, angle = 0, skewX = 0, skewY = 0 } = transform; + const startSelectionCell = skeleton.getOffsetRelativeToRowCol(left, top); + const endSelectionCell = skeleton.getOffsetRelativeToRowCol(left + width, top + height); + + return { + flipY, + flipX, + angle, + skewX, + skewY, + from: startSelectionCell, + to: endSelectionCell, + }; +} + +/** + * In excel, the basic drawing with rotate bound use major axis switch, axis-aligned bound will bu used.That means the position bound of drawing element will save as nearly axis-aligned rectangle. + * Here is the rule to convert transform to axis-aligned position: + * [-45°, 45°): use the original bound + * [45°, 135°): rotate the bound 90° clockwise,and the left, top, bottom,right will use the rotated bound. + * [135°, 225°): use the original bound + * [225°, 315°): rotate the bound 90° counterclockwise, and the left, top, bottom, right will use the rotated bound. + * @return The axis-aligned position of the drawing element. + */ +export function transformToAxisAlignPosition(transform: ITransformState, skeleton: SpreadsheetSkeleton): ISheetDrawingPosition { + const { left = 0, top = 0, width = 0, height = 0, angle = 0 } = transform; + + const norm = ((angle % 360) + 360) % 360; + + const useSwappedAxis = + (norm >= 45 && norm < 135) || + (norm >= 225 && norm < 315); + + if (!useSwappedAxis) { + return transformToDrawingPosition(transform, skeleton); + } + + const rotatedTransform = { + ...transform, + left: left + width / 2 - height / 2, + top: top + height / 2 - width / 2, + width: height, + height: width, + }; + + return transformToDrawingPosition(rotatedTransform, skeleton); +} diff --git a/packages/sheets-drawing-ui/src/commands/commands/insert-sheet-drawing.command.ts b/packages/sheets-drawing/src/commands/commands/insert-sheet-drawing.command.ts similarity index 77% rename from packages/sheets-drawing-ui/src/commands/commands/insert-sheet-drawing.command.ts rename to packages/sheets-drawing/src/commands/commands/insert-sheet-drawing.command.ts index 6a0148afb9..f2593dd067 100644 --- a/packages/sheets-drawing-ui/src/commands/commands/insert-sheet-drawing.command.ts +++ b/packages/sheets-drawing/src/commands/commands/insert-sheet-drawing.command.ts @@ -16,8 +16,7 @@ import type { IAccessor, ICommand } from '@univerjs/core'; import type { IDrawingJsonUndo1 } from '@univerjs/drawing'; - -import type { IInsertDrawingCommandParams } from './interfaces'; +import type { ISheetDrawing } from '../../services/sheet-drawing.service'; import { CommandType, ICommandService, @@ -25,33 +24,27 @@ import { sequenceExecute, } from '@univerjs/core'; import { SheetInterceptorService } from '@univerjs/sheets'; -import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation } from '@univerjs/sheets-drawing'; -import { ClearSheetDrawingTransformerOperation } from '../operations/clear-drawing-transformer.operation'; +import { ISheetDrawingService } from '../../services/sheet-drawing.service'; +import { DrawingApplyType, SetDrawingApplyMutation } from '../mutations/set-drawing-apply.mutation'; + +export interface IInsertDrawingCommandParams { + unitId: string; + drawings: ISheetDrawing[]; +} -/** - * The command to insert new defined name - */ export const InsertSheetDrawingCommand: ICommand = { id: 'sheet.command.insert-sheet-image', type: CommandType.COMMAND, handler: (accessor: IAccessor, params?: IInsertDrawingCommandParams) => { + if (!params) return false; + const commandService = accessor.get(ICommandService); const undoRedoService = accessor.get(IUndoRedoService); const sheetDrawingService = accessor.get(ISheetDrawingService); const sheetInterceptorService = accessor.get(SheetInterceptorService); - if (!params) return false; - - // const { drawingParam, imageParam } = params; - const drawings = params.drawings; - - // const sheetDrawingParams = drawings.map((param) => param.sheetDrawingParam); - const unitIds: string[] = drawings.map((param) => param.unitId); - - // execute do mutations and add undo mutations to undo stack if completed const jsonOp = sheetDrawingService.getBatchAddOp(drawings) as IDrawingJsonUndo1; - const { unitId, subUnitId, undo, redo, objects } = jsonOp; const intercepted = sheetInterceptorService.onCommandExecute({ id: InsertSheetDrawingCommand.id, params }); @@ -68,13 +61,11 @@ export const InsertSheetDrawingCommand: ICommand = { ...(intercepted.preUndos ?? []), undoInsertMutation, ...(intercepted.undos), - { id: ClearSheetDrawingTransformerOperation.id, params: unitIds }, ], redoMutations: [ ...(intercepted.preRedos ?? []), insertMutation, ...intercepted.redos, - { id: ClearSheetDrawingTransformerOperation.id, params: unitIds }, ], }); diff --git a/packages/sheets-drawing-ui/src/commands/commands/remove-sheet-drawing.command.ts b/packages/sheets-drawing/src/commands/commands/remove-sheet-drawing.command.ts similarity index 76% rename from packages/sheets-drawing-ui/src/commands/commands/remove-sheet-drawing.command.ts rename to packages/sheets-drawing/src/commands/commands/remove-sheet-drawing.command.ts index f50aea53df..849e152f37 100644 --- a/packages/sheets-drawing-ui/src/commands/commands/remove-sheet-drawing.command.ts +++ b/packages/sheets-drawing/src/commands/commands/remove-sheet-drawing.command.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import type { IAccessor, ICommand } from '@univerjs/core'; +import type { DrawingTypeEnum, IAccessor, ICommand } from '@univerjs/core'; import type { IDrawingJsonUndo1 } from '@univerjs/drawing'; -import type { IDeleteDrawingCommandParams } from './interfaces'; import { CommandType, ICommandService, @@ -24,40 +23,38 @@ import { sequenceExecute, } from '@univerjs/core'; import { SheetInterceptorService } from '@univerjs/sheets'; -import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation } from '@univerjs/sheets-drawing'; -import { ClearSheetDrawingTransformerOperation } from '../operations/clear-drawing-transformer.operation'; +import { ISheetDrawingService } from '../../services/sheet-drawing.service'; +import { DrawingApplyType, SetDrawingApplyMutation } from '../mutations/set-drawing-apply.mutation'; + +export interface IDeleteDrawingCommandParam { + unitId: string; + subUnitId: string; + drawingId: string; + drawingType: DrawingTypeEnum; +} + +export interface IDeleteDrawingCommandParams { + unitId: string; + drawings: IDeleteDrawingCommandParam[]; +} -/** - * The command to remove new sheet image - */ export const RemoveSheetDrawingCommand: ICommand = { id: 'sheet.command.remove-sheet-image', type: CommandType.COMMAND, handler: (accessor: IAccessor, params?: IDeleteDrawingCommandParams) => { + if (!params) return false; + const commandService = accessor.get(ICommandService); const undoRedoService = accessor.get(IUndoRedoService); const sheetInterceptorService = accessor.get(SheetInterceptorService); - const sheetDrawingService = accessor.get(ISheetDrawingService); - if (!params) return false; - const { drawings } = params; - - const unitIds: string[] = []; - - drawings.forEach((param) => { - const { unitId } = param; - unitIds.push(unitId); - }); - const jsonOp = sheetDrawingService.getBatchRemoveOp(drawings) as IDrawingJsonUndo1; - const { unitId, subUnitId, undo, redo, objects } = jsonOp; const intercepted = sheetInterceptorService.onCommandExecute({ id: RemoveSheetDrawingCommand.id, params }); - // execute do mutations and add undo mutations to undo stack if completed const removeMutation = { id: SetDrawingApplyMutation.id, params: { unitId, subUnitId, op: redo, objects, type: DrawingApplyType.REMOVE } }; const undoRemoveMutation = { id: SetDrawingApplyMutation.id, params: { unitId, subUnitId, op: undo, objects, type: DrawingApplyType.INSERT } }; @@ -70,13 +67,11 @@ export const RemoveSheetDrawingCommand: ICommand = { ...(intercepted.preUndos ?? []), undoRemoveMutation, ...intercepted.undos, - { id: ClearSheetDrawingTransformerOperation.id, params: unitIds }, ], redoMutations: [ ...(intercepted.preRedos ?? []), removeMutation, ...intercepted.redos, - { id: ClearSheetDrawingTransformerOperation.id, params: unitIds }, ], }); diff --git a/packages/sheets-drawing-ui/src/commands/commands/set-drawing-arrange.command.ts b/packages/sheets-drawing/src/commands/commands/set-drawing-arrange.command.ts similarity index 94% rename from packages/sheets-drawing-ui/src/commands/commands/set-drawing-arrange.command.ts rename to packages/sheets-drawing/src/commands/commands/set-drawing-arrange.command.ts index 8da3d3e6aa..fe81c8d5cd 100644 --- a/packages/sheets-drawing-ui/src/commands/commands/set-drawing-arrange.command.ts +++ b/packages/sheets-drawing/src/commands/commands/set-drawing-arrange.command.ts @@ -22,15 +22,13 @@ import { ICommandService, IUndoRedoService, } from '@univerjs/core'; -import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation } from '@univerjs/sheets-drawing'; +import { ISheetDrawingService } from '../../services/sheet-drawing.service'; +import { DrawingApplyType, SetDrawingApplyMutation } from '../mutations/set-drawing-apply.mutation'; export interface ISetDrawingArrangeCommandParams extends IDrawingOrderMapParam { arrangeType: ArrangeTypeEnum; } -/** - * The command to insert new defined name - */ export const SetDrawingArrangeCommand: ICommand = { id: 'sheet.command.set-drawing-arrange', type: CommandType.COMMAND, diff --git a/packages/sheets-drawing-ui/src/commands/commands/set-sheet-drawing.command.ts b/packages/sheets-drawing/src/commands/commands/set-sheet-drawing.command.ts similarity index 67% rename from packages/sheets-drawing-ui/src/commands/commands/set-sheet-drawing.command.ts rename to packages/sheets-drawing/src/commands/commands/set-sheet-drawing.command.ts index 414c29b234..8c6c10a7b7 100644 --- a/packages/sheets-drawing-ui/src/commands/commands/set-sheet-drawing.command.ts +++ b/packages/sheets-drawing/src/commands/commands/set-sheet-drawing.command.ts @@ -14,11 +14,9 @@ * limitations under the License. */ -import type { IAccessor, ICommand } from '@univerjs/core'; +import type { ICommand } from '@univerjs/core'; import type { IDrawingJsonUndo1 } from '@univerjs/drawing'; - -import type { ISheetDrawing } from '@univerjs/sheets-drawing'; -import type { ISetDrawingCommandParams } from './interfaces'; +import type { ISheetDrawing } from '../../services/sheet-drawing.service'; import { CommandType, ICommandService, @@ -26,30 +24,27 @@ import { sequenceExecute, } from '@univerjs/core'; import { SheetInterceptorService } from '@univerjs/sheets'; -import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation } from '@univerjs/sheets-drawing'; -import { ClearSheetDrawingTransformerOperation } from '../operations/clear-drawing-transformer.operation'; +import { ISheetDrawingService } from '../../services/sheet-drawing.service'; +import { DrawingApplyType, SetDrawingApplyMutation } from '../mutations/set-drawing-apply.mutation'; -/** - * The command to update defined name - */ -export const SetSheetDrawingCommand: ICommand = { +export interface ISetDrawingCommandParams { + unitId: string; + drawings: Partial[]; +} + +export const SetSheetDrawingCommand: ICommand = { id: 'sheet.command.set-sheet-image', type: CommandType.COMMAND, - handler: (accessor: IAccessor, params?: ISetDrawingCommandParams) => { + handler: (accessor, params) => { + if (!params) return false; + const commandService = accessor.get(ICommandService); const undoRedoService = accessor.get(IUndoRedoService); const sheetDrawingService = accessor.get(ISheetDrawingService); const sheetInterceptorService = accessor.get(SheetInterceptorService); - if (!params) return false; - const { drawings } = params; - - // const newSheetDrawingParams = drawings.map((param) => param.newDrawing); - // const oldSheetDrawingParams = drawings.map((param) => param.oldDrawing); - const jsonOp = sheetDrawingService.getBatchUpdateOp(drawings as ISheetDrawing[]) as IDrawingJsonUndo1; - const { unitId, subUnitId, undo, redo, objects } = jsonOp; const intercepted = sheetInterceptorService.onCommandExecute({ id: SetSheetDrawingCommand.id, params }); @@ -57,19 +52,13 @@ export const SetSheetDrawingCommand: ICommand = { ...(intercepted.preRedos ?? []), { id: SetDrawingApplyMutation.id, params: { unitId, subUnitId, op: redo, objects, type: DrawingApplyType.UPDATE } }, ...intercepted.redos, - { id: ClearSheetDrawingTransformerOperation.id, params: [unitId] }, ]; const undoMutations = [ ...(intercepted.preUndos ?? []), - { id: SetDrawingApplyMutation.id, params: { unitId, subUnitId, op: undo, objects, type: DrawingApplyType.UPDATE } }, ...intercepted.undos, - { id: ClearSheetDrawingTransformerOperation.id, params: [unitId] }, ]; - // execute do mutations and add undo mutations to undo stack if completed - // const result = commandService.syncExecuteCommand(SetDrawingApplyMutation.id, { unitId, subUnitId, op: redo, objects, type: DrawingApplyType.UPDATE }); - const result = sequenceExecute(redoMutations, commandService); if (result) { undoRedoService.pushUndoRedo({ diff --git a/packages/sheets-drawing/src/commands/mutations/set-drawing-apply.mutation.ts b/packages/sheets-drawing/src/commands/mutations/set-drawing-apply.mutation.ts index 6d56aebdbb..afaa805d7b 100644 --- a/packages/sheets-drawing/src/commands/mutations/set-drawing-apply.mutation.ts +++ b/packages/sheets-drawing/src/commands/mutations/set-drawing-apply.mutation.ts @@ -64,9 +64,11 @@ export const SetDrawingApplyMutation: IMutation break; case DrawingApplyType.GROUP: drawingManagerService.groupUpdateNotification(objects as IDrawingGroupUpdateParam[]); + sheetDrawingService.groupUpdateNotification(objects as IDrawingGroupUpdateParam[]); break; case DrawingApplyType.UNGROUP: drawingManagerService.ungroupUpdateNotification(objects as IDrawingGroupUpdateParam[]); + sheetDrawingService.ungroupUpdateNotification(objects as IDrawingGroupUpdateParam[]); break; } diff --git a/packages/sheets-drawing/src/controllers/sheet-drawing.controller.ts b/packages/sheets-drawing/src/controllers/sheet-drawing.controller.ts index 9627fca81d..4b7e4aa233 100644 --- a/packages/sheets-drawing/src/controllers/sheet-drawing.controller.ts +++ b/packages/sheets-drawing/src/controllers/sheet-drawing.controller.ts @@ -21,6 +21,10 @@ import type { ISheetDrawing } from '../services/sheet-drawing.service'; import { Disposable, DrawingTypeEnum, generateRandomId, ICommandService, Inject, IResourceManagerService, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { IDrawingManagerService } from '@univerjs/drawing'; import { CopySheetCommand, RemoveSheetCommand, SheetInterceptorService } from '@univerjs/sheets'; +import { InsertSheetDrawingCommand } from '../commands/commands/insert-sheet-drawing.command'; +import { RemoveSheetDrawingCommand } from '../commands/commands/remove-sheet-drawing.command'; +import { SetDrawingArrangeCommand } from '../commands/commands/set-drawing-arrange.command'; +import { SetSheetDrawingCommand } from '../commands/commands/set-sheet-drawing.command'; import { DrawingApplyType, SetDrawingApplyMutation } from '../commands/mutations/set-drawing-apply.mutation'; import { ISheetDrawingService } from '../services/sheet-drawing.service'; @@ -37,12 +41,22 @@ export class SheetsDrawingLoadController extends Disposable { ) { super(); + this._initCommands(); this._initSnapshot(); this._initSheetChange(); this.disposeWithMe(this._commandService.registerCommand(SetDrawingApplyMutation)); } + private _initCommands() { + [ + SetSheetDrawingCommand, + InsertSheetDrawingCommand, + RemoveSheetDrawingCommand, + SetDrawingArrangeCommand, + ].forEach((command) => this.disposeWithMe(this._commandService.registerCommand(command))); + } + private _initSnapshot() { const toJson = (unitId: string, model?: IDrawingSubunitMap) => { const map = model || this._sheetDrawingService.getDrawingDataForUnit(unitId); diff --git a/packages/sheets-drawing-ui/src/facade/f-enum.ts b/packages/sheets-drawing/src/facade/f-enum.ts similarity index 87% rename from packages/sheets-drawing-ui/src/facade/f-enum.ts rename to packages/sheets-drawing/src/facade/f-enum.ts index f4a3145c50..6358e40d74 100644 --- a/packages/sheets-drawing-ui/src/facade/f-enum.ts +++ b/packages/sheets-drawing/src/facade/f-enum.ts @@ -21,7 +21,7 @@ import { SheetDrawingAnchorType } from '@univerjs/sheets-drawing'; /** * @ignore */ -export interface IFDrawingEnumMixin { +export interface IFSheetsDrawingEnumMixin { /** Please refer to {@link DrawingTypeEnum}. */ DrawingType: typeof DrawingTypeEnum; @@ -32,7 +32,7 @@ export interface IFDrawingEnumMixin { SheetDrawingAnchorType: typeof SheetDrawingAnchorType; } -export class FDrawingEnumMixin extends FEnum implements IFDrawingEnumMixin { +export class FSheetsDrawingEnumMixin extends FEnum implements IFSheetsDrawingEnumMixin { override get DrawingType(): typeof DrawingTypeEnum { return DrawingTypeEnum; }; override get ImageSourceType(): Omit { return ImageSourceType; }; @@ -40,8 +40,8 @@ export class FDrawingEnumMixin extends FEnum implements IFDrawingEnumMixin { override get SheetDrawingAnchorType(): typeof SheetDrawingAnchorType { return SheetDrawingAnchorType; }; } -FEnum.extend(FDrawingEnumMixin); +FEnum.extend(FSheetsDrawingEnumMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FEnum extends IFDrawingEnumMixin { } + interface FEnum extends IFSheetsDrawingEnumMixin { } } diff --git a/packages/sheets-drawing/src/facade/f-event.ts b/packages/sheets-drawing/src/facade/f-event.ts new file mode 100644 index 0000000000..3ad9ce826d --- /dev/null +++ b/packages/sheets-drawing/src/facade/f-event.ts @@ -0,0 +1,452 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { IDrawingSearch } from '@univerjs/core'; +import type { IEventBase } from '@univerjs/core/facade'; +import type { ISheetImage } from '@univerjs/sheets-drawing'; +import type { FWorkbook } from '@univerjs/sheets/facade'; +import type { FOverGridImage } from './f-over-grid-image'; +import { FEventName } from '@univerjs/core/facade'; + +/** + * @ignore + */ +interface IFSheetsDrawingEventNameMixin { + /** + * Triggered before float dom insertion. + * @see {@link IBeforeFloatDomAddParam} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeFloatDomAdd, (params) => { + * console.log(params); + * // do something + * const { workbook, drawings } = params; + * // Cancel the insertion operation + * params.cancel = true; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly BeforeFloatDomAdd: 'BeforeFloatDomAdd'; + + /** + * Triggered after float dom insertion. + * @see {@link IFloatDomAddedParam} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.FloatDomAdded, (params) => { + * console.log(params); + * // do something + * const { workbook, drawings } = params; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly FloatDomAdded: 'FloatDomAdded'; + + /** + * Triggered before float dom update. + * @see {@link IBeforeFloatDomUpdateParam} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeFloatDomUpdate, (params) => { + * console.log(params); + * // do something + * const { workbook, drawings } = params; + * // Cancel the update operation + * params.cancel = true; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly BeforeFloatDomUpdate: 'BeforeFloatDomUpdate'; + + /** + * Triggered after float dom update. + * @see {@link IFloatDomUpdatedParam} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.FloatDomUpdated, (params) => { + * console.log(params); + * // do something + * const { workbook, drawings } = params; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly FloatDomUpdated: 'FloatDomUpdated'; + + /** + * Triggered before float dom deletion. + * @see {@link IBeforeFloatDomDeleteParam} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeFloatDomDelete, (params) => { + * console.log(params); + * // do something + * const { workbook, drawings } = params; + * // Cancel the deletion operation + * params.cancel = true; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly BeforeFloatDomDelete: 'BeforeFloatDomDelete'; + + /** + * Triggered after float dom deletion. + * @see {@link IFloatDomDeletedParam} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.FloatDomDeleted, (params) => { + * console.log(params); + * // do something + * const { workbook, drawings } = params; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly FloatDomDeleted: 'FloatDomDeleted'; + + /** + * Triggered before floating image insertion. + * @see {@link IBeforeOverGridImageInsertEventParams} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeOverGridImageInsert, (params) => { + * console.log(params); + * // do something + * const { workbook, insertImageParams } = params; + * // Cancel the insertion operation + * params.cancel = true; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly BeforeOverGridImageInsert: 'BeforeOverGridImageInsert'; + + /** + * Triggered after floating image insertion. + * @see {@link IOverGridImageInsertedEventParams} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.OverGridImageInserted, (params) => { + * console.log(params); + * // do something + * const { workbook, images } = params; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly OverGridImageInserted: 'OverGridImageInserted'; + + /** + * Triggered before floating image removal. + * @see {@link IBeforeOverGridImageRemoveEventParams} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeOverGridImageRemove, (params) => { + * console.log(params); + * // do something + * const { workbook, images } = params; + * // Cancel the removal operation + * params.cancel = true; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly BeforeOverGridImageRemove: 'BeforeOverGridImageRemove'; + + /** + * Triggered after floating image removal. + * @see {@link IOverGridImageRemovedEventParams} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.OverGridImageRemoved, (params) => { + * console.log(params); + * // do something + * const { workbook, removeImageParams } = params; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly OverGridImageRemoved: 'OverGridImageRemoved'; + + /** + * Triggered before floating image change. + * @see {@link IBeforeOverGridImageChangeEventParams} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeOverGridImageChange, (params) => { + * console.log(params); + * // do something + * const { workbook, images } = params; + * // Cancel the image change + * params.cancel = true; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly BeforeOverGridImageChange: 'BeforeOverGridImageChange'; + + /** + * Triggered after floating image change. + * @see {@link IOverGridImageChangedEventParams} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.OverGridImageChanged, (params) => { + * console.log(params); + * // do something + * const { workbook, images } = params; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly OverGridImageChanged: 'OverGridImageChanged'; + + /** + * Triggered before floating image selection. + * @see {@link IBeforeOverGridImageSelectEventParams} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeOverGridImageSelect, (params) => { + * console.log(params); + * // do something + * const { workbook, selectedImages, oldSelectedImages } = params; + * // cancel the selection operation + * params.cancel = true; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly BeforeOverGridImageSelect: 'BeforeOverGridImageSelect'; + + /** + * Triggered after floating image selection. + * @see {@link IOverGridImageSelectedEventParams} + * @example + * ```ts + * const disposable = univerAPI.addEvent(univerAPI.Event.OverGridImageSelected, (params) => { + * console.log(params); + * // do something + * const { workbook, selectedImages } = params; + * }) + * + * // Remove the event listener, use `disposable.dispose()` + * ``` + */ + readonly OverGridImageSelected: 'OverGridImageSelected'; +} + +export class FSheetsDrawingEventNameMixin extends FEventName implements IFSheetsDrawingEventNameMixin { + override get BeforeFloatDomAdd(): 'BeforeFloatDomAdd' { + return 'BeforeFloatDomAdd' as const; + } + + override get FloatDomAdded(): 'FloatDomAdded' { + return 'FloatDomAdded' as const; + } + + override get BeforeFloatDomUpdate(): 'BeforeFloatDomUpdate' { + return 'BeforeFloatDomUpdate' as const; + } + + override get FloatDomUpdated(): 'FloatDomUpdated' { + return 'FloatDomUpdated' as const; + } + + override get BeforeFloatDomDelete(): 'BeforeFloatDomDelete' { + return 'BeforeFloatDomDelete' as const; + } + + override get FloatDomDeleted(): 'FloatDomDeleted' { + return 'FloatDomDeleted' as const; + } + + override get BeforeOverGridImageChange(): 'BeforeOverGridImageChange' { + return 'BeforeOverGridImageChange' as const; + } + + override get OverGridImageChanged(): 'OverGridImageChanged' { + return 'OverGridImageChanged' as const; + } + + override get BeforeOverGridImageInsert(): 'BeforeOverGridImageInsert' { + return 'BeforeOverGridImageInsert' as const; + } + + override get OverGridImageInserted(): 'OverGridImageInserted' { + return 'OverGridImageInserted' as const; + } + + override get BeforeOverGridImageRemove(): 'BeforeOverGridImageRemove' { + return 'BeforeOverGridImageRemove' as const; + } + + override get OverGridImageRemoved(): 'OverGridImageRemoved' { + return 'OverGridImageRemoved' as const; + } + + override get BeforeOverGridImageSelect(): 'BeforeOverGridImageSelect' { + return 'BeforeOverGridImageSelect' as const; + } + + override get OverGridImageSelected(): 'OverGridImageSelected' { + return 'OverGridImageSelected' as const; + } +} + +export interface IBeforeOverGridImageChangeParamObject { + /** + * Parameters of the image to be updated. {@link ISheetImage} + */ + changeParam: Partial; + + /** + * Instance of the image to be updated. {@link FOverGridImage} + */ + image: FOverGridImage; +} + +export interface IBeforeOverGridImageChangeEventParams extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ + workbook: FWorkbook; + + /** + * Collection of parameters of the images to be updated, there may be multiple images to be updated. {@link IBeforeOverGridImageChangeParamObject} + */ + images: IBeforeOverGridImageChangeParamObject[]; +} + +export interface IOverGridImageChangedEventParams extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ + workbook: FWorkbook; + + /** + * Instances of the images after the update. {@link FOverGridImage} + */ + images: FOverGridImage[]; +} + +export interface IBeforeOverGridImageInsertEventParams extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ + workbook: FWorkbook; + + /** + * Collection of parameters of the images to be inserted. {@link ISheetImage} + */ + insertImageParams: ISheetImage[]; +} + +export interface IOverGridImageInsertedEventParams extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ + workbook: FWorkbook; + + /** + * Collection of instances of the images after insertion. {@link FOverGridImage} + */ + images: FOverGridImage[]; +} + +export interface IBeforeOverGridImageRemoveEventParams extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ + workbook: FWorkbook; + + /** + * Collection of instances of the images to be removed. {@link FOverGridImage} + */ + images: FOverGridImage[]; +} + +export interface IOverGridImageRemovedEventParams extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ + workbook: FWorkbook; + + /** + * Collection of parameters of the images after removal. {@link ISheetImage} + */ + removeImageParams: IDrawingSearch[]; +} + +export interface IBeforeOverGridImageSelectEventParams extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ + workbook: FWorkbook; + /** + * The images before selection. {@link FOverGridImage} + */ + oldSelectedImages: FOverGridImage[]; + + selectedImages: FOverGridImage[]; +} + +export interface IOverGridImageSelectedEventParams extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ + workbook: FWorkbook; + /** + * The selected images. {@link FOverGridImage} + */ + selectedImages: FOverGridImage[]; +} + +interface ISheetsDrawingEventParamConfig { + BeforeOverGridImageChange: IBeforeOverGridImageChangeEventParams; + OverGridImageChanged: IOverGridImageChangedEventParams; + + BeforeOverGridImageInsert: IBeforeOverGridImageInsertEventParams; + OverGridImageInserted: IOverGridImageInsertedEventParams; + + BeforeOverGridImageRemove: IBeforeOverGridImageRemoveEventParams; + OverGridImageRemoved: IOverGridImageRemovedEventParams; + + BeforeOverGridImageSelect: IBeforeOverGridImageSelectEventParams; + OverGridImageSelected: IOverGridImageSelectedEventParams; +} + +FEventName.extend(FSheetsDrawingEventNameMixin); +declare module '@univerjs/core/facade' { + // eslint-disable-next-line ts/naming-convention + interface FEventName extends IFSheetsDrawingEventNameMixin { } + interface IEventParamConfig extends ISheetsDrawingEventParamConfig { } +} diff --git a/packages/sheets-drawing-ui/src/facade/f-over-grid-image.ts b/packages/sheets-drawing/src/facade/f-over-grid-image.ts similarity index 94% rename from packages/sheets-drawing-ui/src/facade/f-over-grid-image.ts rename to packages/sheets-drawing/src/facade/f-over-grid-image.ts index 8105d66a61..1f16d541fd 100644 --- a/packages/sheets-drawing-ui/src/facade/f-over-grid-image.ts +++ b/packages/sheets-drawing/src/facade/f-over-grid-image.ts @@ -15,14 +15,14 @@ */ import type { IRotationSkewFlipTransform, ISize } from '@univerjs/core'; +import type { SpreadsheetSkeleton } from '@univerjs/engine-render'; import type { ICellOverGridPosition } from '@univerjs/sheets'; import type { ISheetImage, SheetDrawingAnchorType } from '@univerjs/sheets-drawing'; import { ArrangeTypeEnum, DrawingTypeEnum, generateRandomId, ICommandService, ImageSourceType, Inject, Injector } from '@univerjs/core'; import { FBase } from '@univerjs/core/facade'; import { getImageSize } from '@univerjs/drawing'; -import { IRenderManagerService } from '@univerjs/engine-render'; -import { RemoveSheetDrawingCommand, SetDrawingArrangeCommand, SetSheetDrawingCommand, transformToAxisAlignPosition } from '@univerjs/sheets-drawing-ui'; -import { convertPositionCellToSheetOverGrid, convertPositionSheetOverGridToAbsolute, ISheetSelectionRenderService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { convertPositionCellToSheetOverGrid, convertPositionSheetOverGridToAbsolute, SheetSkeletonService } from '@univerjs/sheets'; +import { RemoveSheetDrawingCommand, SetDrawingArrangeCommand, SetSheetDrawingCommand, transformToAxisAlignPosition } from '@univerjs/sheets-drawing'; export interface IFOverGridImage extends Omit, ICellOverGridPosition, IRotationSkewFlipTransform, Required { @@ -31,10 +31,10 @@ export interface IFOverGridImage extends Omit { - const renderManagerService = this._injector.get(IRenderManagerService); - const render = renderManagerService.getRenderById(this._image.unitId); - if (!render) { - throw new Error(`Render Unit with unitId ${this._image.unitId} not found`); - } - const selectionRenderService = render.with(ISheetSelectionRenderService); - const skeletonManagerService = render.with(SheetSkeletonManagerService); + const sheetSkeletonService = this._injector.get(SheetSkeletonService); if (this._image.width === 0 || this._image.height === 0) { const size = await getImageSize(this._image.source); @@ -644,7 +640,7 @@ export class FOverGridImageBuilder { } } - return convertFOverGridImageToSheetImage(this._image, selectionRenderService, skeletonManagerService); + return convertFOverGridImageToSheetImage(this._image, sheetSkeletonService); } } @@ -899,14 +895,13 @@ export class FOverGridImage extends FBase { this._image.sheetTransform.angle = angle; this._image.transform && (this._image.transform.angle = angle); if (this._image.transform) { - const renderManagerService = this._injector.get(IRenderManagerService); - const render = renderManagerService.getRenderById(this._image.unitId); - if (!render) { - throw new Error(`Render Unit with unitId ${this._image.unitId} not found`); + const sheetSkeletonService = this._injector.get(SheetSkeletonService); + const skeleton = sheetSkeletonService.getSkeleton(this._image.unitId, this._image.subUnitId); + if (!skeleton) { + throw new Error(`Skeleton for unitId ${this._image.unitId} and subUnitId ${this._image.subUnitId} not found`); } - const selectionRenderService = render.with(ISheetSelectionRenderService); - this._image.axisAlignSheetTransform && (this._image.axisAlignSheetTransform = transformToAxisAlignPosition(this._image.transform, selectionRenderService)!); + this._image.axisAlignSheetTransform && (this._image.axisAlignSheetTransform = transformToAxisAlignPosition(this._image.transform, skeleton)); } return this._commandService.syncExecuteCommand(SetSheetDrawingCommand.id, { unitId: this._image.unitId, drawings: [this._image] }); diff --git a/packages/sheets-drawing/src/facade/f-univer.ts b/packages/sheets-drawing/src/facade/f-univer.ts new file mode 100644 index 0000000000..706442c1b3 --- /dev/null +++ b/packages/sheets-drawing/src/facade/f-univer.ts @@ -0,0 +1,289 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { IDrawingSearch, Injector } from '@univerjs/core'; +import type { IDeleteDrawingCommandParams, IInsertDrawingCommandParams, ISetDrawingCommandParams, ISheetImage } from '@univerjs/sheets-drawing'; +import type { + IBeforeOverGridImageChangeEventParams, + IBeforeOverGridImageChangeParamObject, + IBeforeOverGridImageInsertEventParams, + IBeforeOverGridImageRemoveEventParams, + IBeforeOverGridImageSelectEventParams, + IOverGridImageChangedEventParams, + IOverGridImageInsertedEventParams, + IOverGridImageRemovedEventParams, + IOverGridImageSelectedEventParams, +} from './f-event'; +import { CanceledError, ICommandService } from '@univerjs/core'; +import { FUniver } from '@univerjs/core/facade'; +import { IDrawingManagerService, SetDrawingSelectedOperation } from '@univerjs/drawing'; +import { InsertSheetDrawingCommand, RemoveSheetDrawingCommand, SetSheetDrawingCommand } from '@univerjs/sheets-drawing'; +import { FOverGridImage } from './f-over-grid-image'; + +/** + * @ignore + */ +export class FUniverSheetsDrawingMixin extends FUniver { + /** + * @ignore + */ + // eslint-disable-next-line max-lines-per-function + override _initialize(injector: Injector): void { + const commandService = injector.get(ICommandService); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.BeforeOverGridImageInsert, + () => commandService.beforeCommandExecuted((commandInfo) => { + if (commandInfo.id !== InsertSheetDrawingCommand.id) return; + + const params = commandInfo.params as IInsertDrawingCommandParams; + const workbook = this.getActiveWorkbook(); + if (workbook == null || params == null) { + return; + } + + const { drawings } = params; + const eventParams: IBeforeOverGridImageInsertEventParams = { + workbook, + insertImageParams: drawings as ISheetImage[], + }; + + this.fireEvent(this.Event.BeforeOverGridImageInsert, eventParams); + + if (eventParams.cancel) { + throw new CanceledError(); + } + }) + ) + ); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.BeforeOverGridImageRemove, + () => commandService.beforeCommandExecuted((commandInfo) => { + if (commandInfo.id !== RemoveSheetDrawingCommand.id) return; + + const params = commandInfo.params as IDeleteDrawingCommandParams; + const workbook = this.getActiveWorkbook(); + if (workbook == null || params == null) { + return; + } + + const drawingManagerService = injector.get(IDrawingManagerService); + + const { drawings } = params; + const willRemoveDrawings = drawings.map((drawing) => { + return drawingManagerService.getDrawingByParam(drawing); + }) as ISheetImage[]; + + const eventParams: IBeforeOverGridImageRemoveEventParams = { + workbook, + images: this._createFOverGridImage(willRemoveDrawings), + }; + + this.fireEvent(this.Event.BeforeOverGridImageRemove, eventParams); + + if (eventParams.cancel) { + throw new CanceledError(); + } + }) + ) + ); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.BeforeOverGridImageChange, + () => commandService.beforeCommandExecuted((commandInfo) => { + if (commandInfo.id !== SetSheetDrawingCommand.id) return; + + const params = commandInfo.params as ISetDrawingCommandParams; + const workbook = this.getActiveWorkbook(); + if (workbook == null || params == null) { + return; + } + + const { drawings } = params; + const drawingManagerService = injector.get(IDrawingManagerService); + + const images: IBeforeOverGridImageChangeParamObject[] = []; + drawings.forEach((drawing) => { + const image = drawingManagerService.getDrawingByParam(drawing as IDrawingSearch) as ISheetImage; + if (image == null) { + return; + } + + images.push({ + changeParam: drawing, + image: this._injector.createInstance(FOverGridImage, image), + }); + }); + + const eventParams: IBeforeOverGridImageChangeEventParams = { + workbook, + images, + }; + + this.fireEvent(this.Event.BeforeOverGridImageChange, eventParams); + + if (eventParams.cancel) { + drawingManagerService.updateNotification(drawings as IDrawingSearch[]); + throw new CanceledError(); + } + }) + ) + ); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.BeforeOverGridImageSelect, + () => commandService.beforeCommandExecuted((commandInfo) => { + if (commandInfo.id !== SetDrawingSelectedOperation.id) return; + + const drawings = commandInfo.params as IDrawingSearch[]; + const workbook = this.getActiveWorkbook(); + if (workbook == null) { + return; + } + const drawingManagerService = injector.get(IDrawingManagerService); + + const oldSelectedDrawings = drawingManagerService.getFocusDrawings() as ISheetImage[]; + const selectedDrawings = drawings.map((drawing) => { + return drawingManagerService.getDrawingByParam(drawing); + }) as ISheetImage[]; + + const eventParams: IBeforeOverGridImageSelectEventParams = { + workbook, + selectedImages: this._createFOverGridImage(selectedDrawings), + oldSelectedImages: this._createFOverGridImage(oldSelectedDrawings), + }; + + this.fireEvent(this.Event.BeforeOverGridImageSelect, eventParams); + + if (eventParams.cancel) { + throw new CanceledError(); + } + }) + ) + ); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.OverGridImageInserted, + () => commandService.onCommandExecuted((commandInfo) => { + if (commandInfo.id !== InsertSheetDrawingCommand.id) return; + + const params = commandInfo.params as IInsertDrawingCommandParams; + const workbook = this.getActiveWorkbook(); + if (workbook == null || params == null) { + return; + } + + const { drawings } = params; + const eventParams: IOverGridImageInsertedEventParams = { + workbook, + images: this._createFOverGridImage(drawings as ISheetImage[]), + }; + this.fireEvent(this.Event.OverGridImageInserted, eventParams); + }) + ) + ); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.OverGridImageRemoved, + () => commandService.onCommandExecuted((commandInfo) => { + if (commandInfo.id !== RemoveSheetDrawingCommand.id) return; + + const params = commandInfo.params as IDeleteDrawingCommandParams; + const workbook = this.getActiveWorkbook(); + if (workbook == null || params == null) { + return; + } + + const { drawings } = params; + const eventParams: IOverGridImageRemovedEventParams = { + workbook, + removeImageParams: drawings, + }; + this.fireEvent(this.Event.OverGridImageRemoved, eventParams); + }) + ) + ); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.OverGridImageChanged, + () => commandService.onCommandExecuted((commandInfo) => { + if (commandInfo.id !== SetSheetDrawingCommand.id) return; + + const params = commandInfo.params as ISetDrawingCommandParams; + const workbook = this.getActiveWorkbook(); + if (workbook == null || params == null) { + return; + } + + const { drawings } = params; + const drawingManagerService = injector.get(IDrawingManagerService); + + const images = drawings.map((drawing) => { + return this._injector.createInstance(FOverGridImage, drawingManagerService.getDrawingByParam(drawing as IDrawingSearch) as ISheetImage); + }); + const eventParams: IOverGridImageChangedEventParams = { + workbook, + images, + }; + + this.fireEvent(this.Event.OverGridImageChanged, eventParams); + }) + ) + ); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.OverGridImageSelected, + () => commandService.onCommandExecuted((commandInfo) => { + if (commandInfo.id !== SetDrawingSelectedOperation.id) return; + + const drawings = commandInfo.params as IDrawingSearch[]; + const workbook = this.getActiveWorkbook(); + if (workbook == null) { + return; + } + const drawingManagerService = injector.get(IDrawingManagerService); + + const selectedDrawings = drawings.map((drawing) => { + return drawingManagerService.getDrawingByParam(drawing); + }) as ISheetImage[]; + const eventParams: IOverGridImageSelectedEventParams = { + workbook, + selectedImages: this._createFOverGridImage(selectedDrawings as ISheetImage[]), + }; + + this.fireEvent(this.Event.OverGridImageSelected, eventParams); + }) + ) + ); + } + + private _createFOverGridImage(drawings: ISheetImage[]): FOverGridImage[] { + return drawings.map((drawing) => { + return this._injector.createInstance(FOverGridImage, drawing); + }); + } +} + +FUniver.extend(FUniverSheetsDrawingMixin); diff --git a/packages/sheets-drawing/src/facade/f-worksheet.ts b/packages/sheets-drawing/src/facade/f-worksheet.ts new file mode 100644 index 0000000000..5b68b8df77 --- /dev/null +++ b/packages/sheets-drawing/src/facade/f-worksheet.ts @@ -0,0 +1,328 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { IFBlobSource } from '@univerjs/core/facade'; +import type { ISheetImage } from '@univerjs/sheets-drawing'; +import { DrawingTypeEnum, ImageSourceType } from '@univerjs/core'; +import { InsertSheetDrawingCommand, ISheetDrawingService, RemoveSheetDrawingCommand, SetSheetDrawingCommand } from '@univerjs/sheets-drawing'; +import { FWorksheet } from '@univerjs/sheets/facade'; +import { FOverGridImage, FOverGridImageBuilder } from './f-over-grid-image'; + +/** + * @ignore + */ +export interface IFWorksheetDrawingMixin { + /** + * Insert an image to the sheet + * @param {string} url - The image url + * @returns true if the image is inserted successfully + * @example + * ```ts + * // Insert an image to the sheet, default position is A1 + * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); + * const result = await fWorksheet.insertImage('https://avatars.githubusercontent.com/u/61444807?s=48&v=4'); + * console.log(result); + * ``` + */ + insertImage(url: string): Promise; + /** + * @param {string} url - The image url + * @param {number} column - The column index to insert the image + * @param {number} row - The row index to insert the image + * @returns True if the image is inserted successfully + * @example + * ```ts + * // Insert an image to the sheet, position is F6 + * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); + * const result = await fWorksheet.insertImage('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', 5, 5); + * console.log(result); + * ``` + */ + insertImage(url: string, column: number, row: number): Promise; + /** + * @param {string} url - The image url + * @param {number} column - The column index to insert the image + * @param {number} row - The row index to insert the image + * @param {number} offsetX - The column offset, pixel unit + * @param {number} offsetY - The row offset, pixel unit + * @returns True if the image is inserted successfully + * @example + * ```ts + * // Insert an image to the sheet, position is F6, offset is 10px + * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); + * const result = await fWorksheet.insertImage('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', 5, 5, 10, 10); + * console.log(result); + * ``` + */ + insertImage(url: string, column: number, row: number, offsetX: number, offsetY: number): Promise; + insertImage(url: IFBlobSource): Promise; + insertImage(url: IFBlobSource, column: number, row: number): Promise; + insertImage(url: IFBlobSource, column: number, row: number, offsetX: number, offsetY: number): Promise; + insertImage(url: IFBlobSource | string, column: number, row: number, offsetX: number, offsetY: number): Promise; + + /** + * Insert images to the sheet + * @param {ISheetImage[]} sheetImages - The images to insert + * @returns {FWorksheet} The FWorksheet instance for chaining + * @example + * ```ts + * // create a new image builder and set image source. + * // then build `ISheetImage` and insert it into the sheet, position is start from F6 cell, width is 500px, height is 300px + * const fWorkbook = univerAPI.getActiveWorkbook(); + * const fWorksheet = fWorkbook.getActiveSheet(); + * const image = await fWorksheet.newOverGridImage() + * .setSource('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', univerAPI.Enum.ImageSourceType.URL) + * .setColumn(5) + * .setRow(5) + * .setWidth(500) + * .setHeight(300) + * .buildAsync(); + * fWorksheet.insertImages([image]); + * + * // update the image width to 100px and height to 50px + * setTimeout(async () => { + * const imageBuilder = fWorksheet.getImageById(image.drawingId).toBuilder(); + * const newImage = await imageBuilder.setWidth(100).setHeight(50).buildAsync(); + * fWorksheet.updateImages([newImage]); + * }, 4000); + * ``` + */ + insertImages(sheetImages: ISheetImage[]): FWorksheet; + + /** + * Get all images of the sheet. + * @returns {FOverGridImage[]} The FOverGridImage instances + * @example + * ```ts + * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); + * const images = fWorksheet.getImages(); + * images.forEach((image) => { + * console.log(image, image.getId()); + * }); + * ``` + */ + getImages(): FOverGridImage[]; + + /** + * Get image by drawing id + * @param {string} id - The drawing id of the image + * @returns {FOverGridImage | null} The FOverGridImage instance + * @example + * ```ts + * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); + * const image = fWorksheet.getImageById('xxxx'); + * console.log(image); + * ``` + */ + getImageById(id: string): FOverGridImage | null; + + /** + * Delete images from the sheet + * @param {FOverGridImage[]} sheetImages - The images to delete + * @returns {FWorksheet} The FWorksheet instance for chaining + * @example + * ```ts + * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); + * const image = fWorksheet.getImages()[0]; + * + * // Delete the first image of the sheet + * fWorksheet.deleteImages([image]); + * ``` + */ + deleteImages(sheetImages: FOverGridImage[]): FWorksheet; + + /** + * Update images to the sheet + * @param {ISheetImage[]} sheetImages - The images to update + * @returns {FWorksheet} The FWorksheet instance for chaining + * @example + * ```ts + * // create a new image builder and set image source. + * // then build `ISheetImage` and insert it into the sheet, position is start from F6 cell, width is 500px, height is 300px + * const fWorkbook = univerAPI.getActiveWorkbook(); + * const fWorksheet = fWorkbook.getActiveSheet(); + * const image = await fWorksheet.newOverGridImage() + * .setSource('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', univerAPI.Enum.ImageSourceType.URL) + * .setColumn(5) + * .setRow(5) + * .setWidth(500) + * .setHeight(300) + * .buildAsync(); + * fWorksheet.insertImages([image]); + * + * // update the image width to 100px and height to 50px after 4 seconds + * setTimeout(async () => { + * const imageBuilder = fWorksheet.getImageById(image.drawingId).toBuilder(); + * const newImage = await imageBuilder.setWidth(100).setHeight(50).buildAsync(); + * fWorksheet.updateImages([newImage]); + * }, 4000); + * ``` + */ + updateImages(sheetImages: ISheetImage[]): FWorksheet; + + /** + * Get the current selected images. + * @returns {FOverGridImage[]} The FOverGridImage instances + * @example + * ```ts + * const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet(); + * const images = fWorksheet.getActiveImages(); + * images.forEach((image) => { + * console.log(image, image.getId()); + * }); + * ``` + */ + getActiveImages(): FOverGridImage[]; + + /** + * Create a new over grid image builder. + * @returns {FOverGridImageBuilder} The FOverGridImageBuilder instance + * @example + * ```ts + * // create a new image builder and set image source. + * // then build `ISheetImage` and insert it into the sheet, position is start from F6 cell, width is 500px, height is 300px + * const fWorkbook = univerAPI.getActiveWorkbook(); + * const fWorksheet = fWorkbook.getActiveSheet(); + * const image = await fWorksheet.newOverGridImage() + * .setSource('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', univerAPI.Enum.ImageSourceType.URL) + * .setColumn(5) + * .setRow(5) + * .setWidth(500) + * .setHeight(300) + * .buildAsync(); + * fWorksheet.insertImages([image]); + * ``` + */ + newOverGridImage(): FOverGridImageBuilder; +} + +export class FWorksheetDrawingMixin extends FWorksheet implements IFWorksheetDrawingMixin { + override async insertImage(url: IFBlobSource | string, column?: number, row?: number, offsetX?: number, offsetY?: number): Promise { + const imageBuilder = this.newOverGridImage(); + if (typeof url === 'string') { + imageBuilder.setSource(url); + } else { + const blobSource = url.getBlob(); + const base64 = await blobSource.getDataAsString(); + imageBuilder.setSource(base64, ImageSourceType.BASE64); + } + + if (column !== undefined) { + imageBuilder.setColumn(column); + } else { + imageBuilder.setColumn(0); + } + + if (row !== undefined) { + imageBuilder.setRow(row); + } else { + imageBuilder.setRow(0); + } + + if (offsetX !== undefined) { + imageBuilder.setColumnOffset(offsetX); + } else { + imageBuilder.setColumnOffset(0); + } + + if (offsetY !== undefined) { + imageBuilder.setRowOffset(offsetY); + } else { + imageBuilder.setRowOffset(0); + } + + const param = await imageBuilder.buildAsync(); + // param.drawingId + + return this._commandService.syncExecuteCommand(InsertSheetDrawingCommand.id, { unitId: this._fWorkbook.getId(), drawings: [param] }); + } + + override insertImages(sheetImages: ISheetImage[]): FWorksheet { + const param = sheetImages.map((image) => { + image.unitId = this._fWorkbook.getId(); + image.subUnitId = this.getSheetId(); + return image; + }); + + this._commandService.syncExecuteCommand(InsertSheetDrawingCommand.id, { unitId: this._fWorkbook.getId(), drawings: param }); + return this; + } + + override deleteImages(sheetImages: FOverGridImage[]): FWorksheet { + const drawings = sheetImages.map((image) => { + return { + unitId: this._fWorkbook.getId(), + drawingId: image.getId(), + subUnitId: this.getSheetId(), + drawingType: image.getType(), + }; + }); + this._commandService.syncExecuteCommand(RemoveSheetDrawingCommand.id, { unitId: this._fWorkbook.getId(), drawings }); + + return this; + } + + override getImages(): FOverGridImage[] { + const sheetDrawingService = this._injector.get(ISheetDrawingService); + const drawingData = sheetDrawingService.getDrawingData(this._fWorkbook.getId(), this.getSheetId()); + const images: FOverGridImage[] = []; + for (const drawingId in drawingData) { + const drawing = drawingData[drawingId]; + if (drawing.drawingType !== DrawingTypeEnum.DRAWING_IMAGE) { + continue; + } + images.push(this._injector.createInstance(FOverGridImage, drawing as ISheetImage)); + } + return images; + } + + override getImageById(id: string): FOverGridImage | null { + const sheetDrawingService = this._injector.get(ISheetDrawingService); + const drawing = sheetDrawingService.getDrawingByParam({ unitId: this._fWorkbook.getId(), subUnitId: this.getSheetId(), drawingId: id }); + if (drawing && drawing.drawingType === DrawingTypeEnum.DRAWING_IMAGE) { + return this._injector.createInstance(FOverGridImage, drawing as ISheetImage); + } + return null; + } + + override getActiveImages(): FOverGridImage[] { + const sheetDrawingService = this._injector.get(ISheetDrawingService); + const drawingData = sheetDrawingService.getFocusDrawings(); + const images: FOverGridImage[] = []; + for (const drawingId in drawingData) { + const drawing = drawingData[drawingId]; + images.push(this._injector.createInstance(FOverGridImage, drawing as ISheetImage)); + } + return images; + } + + override updateImages(sheetImages: ISheetImage[]): FWorksheet { + this._commandService.syncExecuteCommand(SetSheetDrawingCommand.id, { unitId: this._fWorkbook.getId(), drawings: sheetImages }); + return this; + } + + override newOverGridImage(): FOverGridImageBuilder { + const unitId = this._fWorkbook.getId(); + const subUnitId = this.getSheetId(); + return this._injector.createInstance(FOverGridImageBuilder, unitId, subUnitId); + } +} + +FWorksheet.extend(FWorksheetDrawingMixin); +declare module '@univerjs/sheets/facade' { + // eslint-disable-next-line ts/naming-convention + interface FWorksheet extends IFWorksheetDrawingMixin { } +} diff --git a/packages/sheets-drawing-ui/src/commands/commands/interfaces.ts b/packages/sheets-drawing/src/facade/index.ts similarity index 51% rename from packages/sheets-drawing-ui/src/commands/commands/interfaces.ts rename to packages/sheets-drawing/src/facade/index.ts index 826e4961ec..7591fe8dde 100644 --- a/packages/sheets-drawing-ui/src/commands/commands/interfaces.ts +++ b/packages/sheets-drawing/src/facade/index.ts @@ -14,27 +14,14 @@ * limitations under the License. */ -import type { DrawingTypeEnum } from '@univerjs/core'; -import type { ISheetDrawing } from '@univerjs/sheets-drawing'; +import './f-over-grid-image'; +import './f-worksheet'; +import './f-enum'; +import './f-event'; +import './f-univer'; -export interface IInsertDrawingCommandParams { - unitId: string; - drawings: ISheetDrawing[]; -} - -export interface IDeleteDrawingCommandParam { - unitId: string; - subUnitId: string; - drawingId: string; - drawingType: DrawingTypeEnum; -} - -export interface IDeleteDrawingCommandParams { - unitId: string; - drawings: IDeleteDrawingCommandParam[]; -} - -export interface ISetDrawingCommandParams { - unitId: string; - drawings: Partial[]; -} +export type * from './f-enum'; +export type * from './f-event'; +export type * from './f-over-grid-image'; +export type * from './f-univer'; +export type * from './f-worksheet'; diff --git a/packages/sheets-drawing/src/index.ts b/packages/sheets-drawing/src/index.ts index 7ade69e06f..0d6605a18c 100644 --- a/packages/sheets-drawing/src/index.ts +++ b/packages/sheets-drawing/src/index.ts @@ -14,6 +14,11 @@ * limitations under the License. */ +export { drawingPositionToTransform, transformToAxisAlignPosition, transformToDrawingPosition } from './basics/transform-position'; +export { type IInsertDrawingCommandParams, InsertSheetDrawingCommand } from './commands/commands/insert-sheet-drawing.command'; +export { type IDeleteDrawingCommandParam, type IDeleteDrawingCommandParams, RemoveSheetDrawingCommand } from './commands/commands/remove-sheet-drawing.command'; +export { type ISetDrawingArrangeCommandParams, SetDrawingArrangeCommand } from './commands/commands/set-drawing-arrange.command'; +export { type ISetDrawingCommandParams, SetSheetDrawingCommand } from './commands/commands/set-sheet-drawing.command'; export { DrawingApplyType, type ISetDrawingApplyMutationParams, SetDrawingApplyMutation } from './commands/mutations/set-drawing-apply.mutation'; export type { IUniverSheetsDrawingConfig } from './config/config'; export { SHEET_DRAWING_PLUGIN } from './controllers/sheet-drawing.controller'; diff --git a/packages/sheets-filter-ui/src/views/render-modules/sheets-filter.render-controller.ts b/packages/sheets-filter-ui/src/views/render-modules/sheets-filter.render-controller.ts index cf3e288543..2e01a8dc84 100644 --- a/packages/sheets-filter-ui/src/views/render-modules/sheets-filter.render-controller.ts +++ b/packages/sheets-filter-ui/src/views/render-modules/sheets-filter.render-controller.ts @@ -20,10 +20,9 @@ import type { ISheetCommandSharedParams } from '@univerjs/sheets'; import type { FilterModel } from '@univerjs/sheets-filter'; import type { ISheetsFilterButtonShapeProps } from '../widgets/filter-button.shape'; import { CommandType, fromCallback, ICommandService, Inject, Injector, InterceptorEffectEnum, RxDisposable, ThemeService, VerticalAlign } from '@univerjs/core'; -import { INTERCEPTOR_POINT, SetRangeValuesMutation, SheetInterceptorService } from '@univerjs/sheets'; +import { attachSelectionWithCoord, INTERCEPTOR_POINT, SetRangeValuesMutation, SheetInterceptorService } from '@univerjs/sheets'; import { FILTER_MUTATIONS, SheetsFilterService } from '@univerjs/sheets-filter'; - -import { attachSelectionWithCoord, getCoordByCell, ISheetSelectionRenderService, SelectionControl, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { getCoordByCell, ISheetSelectionRenderService, SelectionControl, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; import { filter, map, of, startWith, switchMap, takeUntil, throttleTime } from 'rxjs'; import { FILTER_ICON_PADDING, FILTER_ICON_SIZE, SheetsFilterButtonShape } from '../widgets/filter-button.shape'; diff --git a/packages/sheets-filter/src/facade/f-enum.ts b/packages/sheets-filter/src/facade/f-enum.ts index 744e680277..b038f30752 100644 --- a/packages/sheets-filter/src/facade/f-enum.ts +++ b/packages/sheets-filter/src/facade/f-enum.ts @@ -25,8 +25,8 @@ export interface IFSheetsFilterEnumMixin { CustomFilterOperator: typeof CustomFilterOperator; } -export class FSheetsFilterEnumMixin implements IFSheetsFilterEnumMixin { - get CustomFilterOperator(): typeof CustomFilterOperator { +export class FSheetsFilterEnumMixin extends FEnum implements IFSheetsFilterEnumMixin { + override get CustomFilterOperator(): typeof CustomFilterOperator { return CustomFilterOperator; }; } diff --git a/packages/sheets-filter/src/facade/f-event.ts b/packages/sheets-filter/src/facade/f-event.ts index 637984f184..46de683950 100644 --- a/packages/sheets-filter/src/facade/f-event.ts +++ b/packages/sheets-filter/src/facade/f-event.ts @@ -14,19 +14,47 @@ * limitations under the License. */ -import type { ICommandInfo, Injector } from '@univerjs/core'; import type { IEventBase } from '@univerjs/core/facade'; import type { ISetSheetsFilterCriteriaCommandParams } from '@univerjs/sheets-filter'; import type { FWorkbook, FWorksheet } from '@univerjs/sheets/facade'; -import { ICommandService } from '@univerjs/core'; -import { FEventName, FUniver } from '@univerjs/core/facade'; -import { ClearSheetsFilterCriteriaCommand, SetSheetsFilterCriteriaCommand } from '@univerjs/sheets-filter'; -import { FSheetEventName } from '@univerjs/sheets/facade'; +import { FEventName } from '@univerjs/core/facade'; + +/** + * The params of SheetRangeFiltered and SheetBeforeRangeFilter events. + * @param workbook - The corresponding workbook wrapped in {@link FWorkbook}. + * @param worksheet - The corresponding worksheet wrapped in {@link FWorksheet}. + * @param col - The column on which the filter criteria is changed. + * @param criteria - Raw filter criteria. + */ +export interface ISheetsRangeFilteredEventParams extends IEventBase, Pick { + workbook: FWorkbook; + worksheet: FWorksheet; +} + +/** + * The params of SheetRangeFilterCleared and SheetBeforeRangeFilterClear events. + * @param workbook - The corresponding workbook wrapped in {@link FWorkbook}. + * @param worksheet - The corresponding worksheet wrapped in {@link FWorksheet}. + */ +export interface ISheetsRangeFilterClearedEventParams extends IEventBase { + workbook: FWorkbook; + worksheet: FWorksheet; +} /** * @ignore */ -export interface IFSheetFilterEventMixin { +interface ISheetsFilterEventParamConfig { + SheetBeforeRangeFilter: ISheetsRangeFilteredEventParams; + SheetRangeFiltered: ISheetsRangeFilteredEventParams; + SheetBeforeRangeFilterClear: ISheetsRangeFilterClearedEventParams; + SheetRangeFilterCleared: ISheetsRangeFilterClearedEventParams; +} + +/** + * @ignore + */ +export interface IFSheetsFilterEventNameMixin { /** * This event will be emitted when the filter criteria on a column is changed. * @see {@link ISheetRangeFilteredParams} @@ -102,167 +130,16 @@ export interface IFSheetFilterEventMixin { readonly SheetBeforeRangeFilterClear: 'SheetBeforeRangeFilterClear'; } -export class FSheetFilterEventName extends FEventName implements IFSheetFilterEventMixin { +export class FSheetsFilterEventNameMixin extends FEventName implements IFSheetsFilterEventNameMixin { override get SheetBeforeRangeFilter(): 'SheetBeforeRangeFilter' { return 'SheetBeforeRangeFilter'; } override get SheetRangeFiltered(): 'SheetRangeFiltered' { return 'SheetRangeFiltered'; } override get SheetRangeFilterCleared(): 'SheetRangeFilterCleared' { return 'SheetRangeFilterCleared'; }; override get SheetBeforeRangeFilterClear(): 'SheetBeforeRangeFilterClear' { return 'SheetBeforeRangeFilterClear'; } } -FEventName.extend(FSheetFilterEventName); +FEventName.extend(FSheetsFilterEventNameMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FEventName extends IFSheetFilterEventMixin { } + interface FEventName extends IFSheetsFilterEventNameMixin { } + interface IEventParamConfig extends ISheetsFilterEventParamConfig { } } - -/** - * The params of SheetRangeFiltered and SheetBeforeRangeFilter events. - * @param workbook - The corresponding workbook wrapped in {@link FWorkbook}. - * @param worksheet - The corresponding worksheet wrapped in {@link FWorksheet}. - * @param col - The column on which the filter criteria is changed. - * @param criteria - Raw filter criteria. - */ -export interface ISheetRangeFilteredParams extends IEventBase, Pick { - workbook: FWorkbook; - worksheet: FWorksheet; -} - -/** - * The params of SheetRangeFilterCleared and SheetBeforeRangeFilterClear events. - * @param workbook - The corresponding workbook wrapped in {@link FWorkbook}. - * @param worksheet - The corresponding worksheet wrapped in {@link FWorksheet}. - */ -export interface ISheetRangeFilterClearedEventParams extends IEventBase { - workbook: FWorkbook; - worksheet: FWorksheet; -} - -/** - * @ignore - */ -interface ISheetRangeFilterEventParamConfig { - SheetBeforeRangeFilter: ISheetRangeFilteredParams; - SheetRangeFiltered: ISheetRangeFilteredParams; - SheetBeforeRangeFilterClear: ISheetRangeFilterClearedEventParams; - SheetRangeFilterCleared: ISheetRangeFilterClearedEventParams; -} - -FEventName.extend(FSheetEventName); -declare module '@univerjs/core/facade' { - // eslint-disable-next-line ts/naming-convention - interface FEventName extends IFSheetFilterEventMixin { } - interface IEventParamConfig extends ISheetRangeFilterEventParamConfig { } -} - -class FUniverSheetsFilterEventMixin extends FUniver { - /** - * @ignore - */ - override _initialize(injector: Injector): void { - const commandService = injector.get(ICommandService); - - // Register filter criteria set event handlers - this.disposeWithMe( - this.registerEventHandler( - this.Event.SheetBeforeRangeFilter, - () => commandService.beforeCommandExecuted((commandInfo) => { - if (commandInfo.id === SetSheetsFilterCriteriaCommand.id) { - this._beforeRangeFilter(commandInfo as Readonly>); - } - }) - ) - ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.SheetBeforeRangeFilterClear, - () => commandService.beforeCommandExecuted((commandInfo) => { - if (commandInfo.id === ClearSheetsFilterCriteriaCommand.id) { - this._beforeRangeFilterClear(); - } - }) - ) - ); - - // Register filter criteria execution event handlers - this.disposeWithMe( - this.registerEventHandler( - this.Event.SheetRangeFiltered, - () => commandService.onCommandExecuted((commandInfo) => { - if (commandInfo.id === SetSheetsFilterCriteriaCommand.id) { - this._onRangeFiltered(commandInfo as Readonly>); - } - }) - ) - ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.SheetRangeFilterCleared, - () => commandService.onCommandExecuted((commandInfo) => { - if (commandInfo.id === ClearSheetsFilterCriteriaCommand.id) { - this._onRangeFilterCleared(); - } - }) - ) - ); - } - - private _beforeRangeFilter(commandInfo: Readonly>): void { - const params = commandInfo.params!; - const fWorkbook = this.getUniverSheet(params.unitId)!; - const eventParams: ISheetRangeFilteredParams = { - workbook: fWorkbook, - worksheet: fWorkbook.getSheetBySheetId(params.subUnitId)!, - col: params.col, - criteria: params.criteria, - }; - - this.fireEvent(this.Event.SheetBeforeRangeFilter, eventParams); - if (eventParams.cancel) { - throw new Error('SetSheetsFilterCriteriaCommand canceled.'); - } - } - - private _onRangeFiltered(commandInfo: Readonly>): void { - const params = commandInfo.params!; - const fWorkbook = this.getUniverSheet(params.unitId)!; - const eventParams: ISheetRangeFilteredParams = { - workbook: fWorkbook, - worksheet: fWorkbook.getSheetBySheetId(params.subUnitId)!, - col: params.col, - criteria: params.criteria, - }; - - this.fireEvent(this.Event.SheetRangeFiltered, eventParams); - } - - private _beforeRangeFilterClear(): void { - const fWorkbook = this.getActiveWorkbook(); - if (!fWorkbook) return; - - const eventParams: ISheetRangeFilterClearedEventParams = { - workbook: fWorkbook, - worksheet: fWorkbook.getActiveSheet(), - }; - - this.fireEvent(this.Event.SheetBeforeRangeFilterClear, eventParams); - if (eventParams.cancel) { - throw new Error('SetSheetsFilterCriteriaCommand canceled.'); - } - } - - private _onRangeFilterCleared(): void { - const fWorkbook = this.getActiveWorkbook(); - if (!fWorkbook) return; - - const eventParams: ISheetRangeFilterClearedEventParams = { - workbook: fWorkbook, - worksheet: fWorkbook.getActiveSheet(), - }; - - this.fireEvent(this.Event.SheetRangeFilterCleared, eventParams); - } -} - -FUniver.extend(FUniverSheetsFilterEventMixin); diff --git a/packages/sheets-filter/src/facade/f-range.ts b/packages/sheets-filter/src/facade/f-range.ts index bb0687ca61..d7da079c25 100644 --- a/packages/sheets-filter/src/facade/f-range.ts +++ b/packages/sheets-filter/src/facade/f-range.ts @@ -25,7 +25,7 @@ import { FFilter } from './f-filter'; /** * @ignore */ -export interface IFRangeFilter { +export interface IFRangeSheetsFilterMixin { /** * Create a filter for the current range. If the worksheet already has a filter, this method would return `null`. * @returns {FFilter | null} The FFilter instance to handle the filter. @@ -67,7 +67,7 @@ export interface IFRangeFilter { getFilter(): FFilter | null; } -export class FRangeFilter extends FRange implements IFRangeFilter { +export class FRangeSheetsFilterMixin extends FRange implements IFRangeSheetsFilterMixin { override createFilter(): FFilter | null { if (this._getFilterModel()) return null; @@ -102,8 +102,8 @@ export class FRangeFilter extends FRange implements IFRangeFilter { } } -FRange.extend(FRangeFilter); +FRange.extend(FRangeSheetsFilterMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FRange extends IFRangeFilter { } + interface FRange extends IFRangeSheetsFilterMixin { } } diff --git a/packages/sheets-filter/src/facade/f-univer.ts b/packages/sheets-filter/src/facade/f-univer.ts new file mode 100644 index 0000000000..1ed8261d29 --- /dev/null +++ b/packages/sheets-filter/src/facade/f-univer.ts @@ -0,0 +1,135 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ICommandInfo, Injector } from '@univerjs/core'; +import type { ISetSheetsFilterCriteriaCommandParams } from '@univerjs/sheets-filter'; +import type { ISheetsRangeFilterClearedEventParams, ISheetsRangeFilteredEventParams } from './f-event'; +import { ICommandService } from '@univerjs/core'; +import { FUniver } from '@univerjs/core/facade'; +import { ClearSheetsFilterCriteriaCommand, SetSheetsFilterCriteriaCommand } from '@univerjs/sheets-filter'; + +export class FUniverSheetsFilterMixin extends FUniver { + /** + * @ignore + */ + override _initialize(injector: Injector): void { + const commandService = injector.get(ICommandService); + + // Register filter criteria set event handlers + this.disposeWithMe( + this.registerEventHandler( + this.Event.SheetBeforeRangeFilter, + () => commandService.beforeCommandExecuted((commandInfo) => { + if (commandInfo.id === SetSheetsFilterCriteriaCommand.id) { + this._beforeRangeFilter(commandInfo as Readonly>); + } + }) + ) + ); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.SheetBeforeRangeFilterClear, + () => commandService.beforeCommandExecuted((commandInfo) => { + if (commandInfo.id === ClearSheetsFilterCriteriaCommand.id) { + this._beforeRangeFilterClear(); + } + }) + ) + ); + + // Register filter criteria execution event handlers + this.disposeWithMe( + this.registerEventHandler( + this.Event.SheetRangeFiltered, + () => commandService.onCommandExecuted((commandInfo) => { + if (commandInfo.id === SetSheetsFilterCriteriaCommand.id) { + this._onRangeFiltered(commandInfo as Readonly>); + } + }) + ) + ); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.SheetRangeFilterCleared, + () => commandService.onCommandExecuted((commandInfo) => { + if (commandInfo.id === ClearSheetsFilterCriteriaCommand.id) { + this._onRangeFilterCleared(); + } + }) + ) + ); + } + + private _beforeRangeFilter(commandInfo: Readonly>): void { + const params = commandInfo.params!; + const fWorkbook = this.getUniverSheet(params.unitId)!; + const eventParams: ISheetsRangeFilteredEventParams = { + workbook: fWorkbook, + worksheet: fWorkbook.getSheetBySheetId(params.subUnitId)!, + col: params.col, + criteria: params.criteria, + }; + + this.fireEvent(this.Event.SheetBeforeRangeFilter, eventParams); + if (eventParams.cancel) { + throw new Error('SetSheetsFilterCriteriaCommand canceled.'); + } + } + + private _onRangeFiltered(commandInfo: Readonly>): void { + const params = commandInfo.params!; + const fWorkbook = this.getUniverSheet(params.unitId)!; + const eventParams: ISheetsRangeFilteredEventParams = { + workbook: fWorkbook, + worksheet: fWorkbook.getSheetBySheetId(params.subUnitId)!, + col: params.col, + criteria: params.criteria, + }; + + this.fireEvent(this.Event.SheetRangeFiltered, eventParams); + } + + private _beforeRangeFilterClear(): void { + const fWorkbook = this.getActiveWorkbook(); + if (!fWorkbook) return; + + const eventParams: ISheetsRangeFilterClearedEventParams = { + workbook: fWorkbook, + worksheet: fWorkbook.getActiveSheet(), + }; + + this.fireEvent(this.Event.SheetBeforeRangeFilterClear, eventParams); + if (eventParams.cancel) { + throw new Error('SetSheetsFilterCriteriaCommand canceled.'); + } + } + + private _onRangeFilterCleared(): void { + const fWorkbook = this.getActiveWorkbook(); + if (!fWorkbook) return; + + const eventParams: ISheetsRangeFilterClearedEventParams = { + workbook: fWorkbook, + worksheet: fWorkbook.getActiveSheet(), + }; + + this.fireEvent(this.Event.SheetRangeFilterCleared, eventParams); + } +} + +FUniver.extend(FUniverSheetsFilterMixin); diff --git a/packages/sheets-filter/src/facade/f-worksheet.ts b/packages/sheets-filter/src/facade/f-worksheet.ts index ec5d9844b4..8737a5b640 100644 --- a/packages/sheets-filter/src/facade/f-worksheet.ts +++ b/packages/sheets-filter/src/facade/f-worksheet.ts @@ -23,7 +23,7 @@ import { FFilter } from './f-filter'; /** * @ignore */ -export interface IFWorksheetFilter { +export interface IFWorksheetFilterMixin { /** * Get the filter for the current worksheet. * @returns {FFilter | null} The interface class to handle the filter. If the worksheet does not have a filter, @@ -39,7 +39,7 @@ export interface IFWorksheetFilter { getFilter(): FFilter | null; } -export class FWorksheetFilter extends FWorksheet implements IFWorksheetFilter { +export class FWorksheetFilterMixin extends FWorksheet implements IFWorksheetFilterMixin { override getFilter(): FFilter | null { const filterModel = this._getFilterModel(); if (!filterModel) return null; @@ -55,8 +55,8 @@ export class FWorksheetFilter extends FWorksheet implements IFWorksheetFilter { } } -FWorksheet.extend(FWorksheetFilter); +FWorksheet.extend(FWorksheetFilterMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FWorksheet extends IFWorksheetFilter { } + interface FWorksheet extends IFWorksheetFilterMixin { } } diff --git a/packages/sheets-filter/src/facade/index.ts b/packages/sheets-filter/src/facade/index.ts index 5a6153ebb6..ad1fff864d 100644 --- a/packages/sheets-filter/src/facade/index.ts +++ b/packages/sheets-filter/src/facade/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import './f-univer'; import './f-filter'; import './f-range'; import './f-worksheet'; @@ -25,4 +26,5 @@ export type * from './f-event'; export { FFilter } from './f-filter'; export type * from './f-filter'; export type * from './f-range'; +export type * from './f-univer'; export type * from './f-worksheet'; diff --git a/packages/sheets-find-replace/src/controllers/sheet-find-replace.controller.ts b/packages/sheets-find-replace/src/controllers/sheet-find-replace.controller.ts index 8cd79f5ac2..f0fc085f1d 100644 --- a/packages/sheets-find-replace/src/controllers/sheet-find-replace.controller.ts +++ b/packages/sheets-find-replace/src/controllers/sheet-find-replace.controller.ts @@ -506,7 +506,7 @@ export class SheetFindModel extends FindModel { private _updateFindHighlight(): void { this._disposeHighlights(); - const skeleton = this._sheetSkeletonManagerService.getCurrent()?.skeleton; + const skeleton = this._sheetSkeletonManagerService.getCurrentSkeleton(); if (!skeleton) { return; } diff --git a/packages/sheets-find-replace/src/facade/f-univer.ts b/packages/sheets-find-replace/src/facade/f-univer.ts index 69761da7f1..e084e63150 100644 --- a/packages/sheets-find-replace/src/facade/f-univer.ts +++ b/packages/sheets-find-replace/src/facade/f-univer.ts @@ -21,7 +21,7 @@ import { FTextFinder } from './f-text-finder'; /** * @ignore */ -export interface IFUniverFindReplaceMixin { +export interface IFUniverSheetsFindReplaceMixin { /** * Create a text-finder for the current univer. * @param {string} text - The text to find. @@ -60,7 +60,7 @@ export interface IFUniverFindReplaceMixin { createTextFinderAsync(text: string): Promise; } -export class FUniverFindReplaceMixin extends FUniver implements IFUniverFindReplaceMixin { +export class FUniverSheetsFindReplaceMixin extends FUniver implements IFUniverSheetsFindReplaceMixin { override async createTextFinderAsync(text: string): Promise { const state: Partial = { findString: text }; const textFinder = this._injector.createInstance(FTextFinder, state); @@ -69,8 +69,8 @@ export class FUniverFindReplaceMixin extends FUniver implements IFUniverFindRepl } } -FUniver.extend(FUniverFindReplaceMixin); +FUniver.extend(FUniverSheetsFindReplaceMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FUniver extends IFUniverFindReplaceMixin {} + interface FUniver extends IFUniverSheetsFindReplaceMixin {} } diff --git a/packages/sheets-formula-ui/src/commands/operations/__tests__/create-command-test-bed.ts b/packages/sheets-formula-ui/src/commands/operations/__tests__/create-command-test-bed.ts index aa1a40104d..7de2b9695f 100644 --- a/packages/sheets-formula-ui/src/commands/operations/__tests__/create-command-test-bed.ts +++ b/packages/sheets-formula-ui/src/commands/operations/__tests__/create-command-test-bed.ts @@ -20,7 +20,7 @@ import { DocSelectionManagerService } from '@univerjs/docs'; import { EditorService, IEditorService } from '@univerjs/docs-ui'; import { LexerTreeBuilder } from '@univerjs/engine-formula'; import { IRenderManagerService, RenderManagerService } from '@univerjs/engine-render'; -import { IRefSelectionsService, RangeProtectionRuleModel, RefSelectionsService, SheetInterceptorService, SheetsSelectionsService, WorkbookPermissionService, WorksheetPermissionService, WorksheetProtectionPointModel, WorksheetProtectionRuleModel } from '@univerjs/sheets'; +import { IRefSelectionsService, RangeProtectionRuleModel, RefSelectionsService, SheetInterceptorService, SheetSkeletonService, SheetsSelectionsService, WorkbookPermissionService, WorksheetPermissionService, WorksheetProtectionPointModel, WorksheetProtectionRuleModel } from '@univerjs/sheets'; import { EditorBridgeService, IEditorBridgeService, ISheetSelectionRenderService, SheetSelectionRenderService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; import { FormulaPromptService, IFormulaPromptService } from '../../../services/prompt.service'; @@ -79,6 +79,7 @@ export function createCommandTestBed(workbookData?: IWorkbookData, dependencies? const injector = this._injector; addDependency([ISheetSelectionRenderService, { useClass: SheetSelectionRenderService }]); addDependency([SheetsSelectionsService]); + addDependency([SheetSkeletonService]); addDependency([LexerTreeBuilder]); addDependency([DocSelectionManagerService]); addDependency([IFormulaPromptService, { useClass: FormulaPromptService }]); diff --git a/packages/sheets-formula-ui/src/controllers/__tests__/create-command-test-bed.ts b/packages/sheets-formula-ui/src/controllers/__tests__/create-command-test-bed.ts index 982bd4a9e2..bd22f8f1b4 100644 --- a/packages/sheets-formula-ui/src/controllers/__tests__/create-command-test-bed.ts +++ b/packages/sheets-formula-ui/src/controllers/__tests__/create-command-test-bed.ts @@ -20,7 +20,7 @@ import { DocSelectionManagerService } from '@univerjs/docs'; import { EditorService, IEditorService } from '@univerjs/docs-ui'; import { CalculateFormulaService, DefinedNamesService, FormulaCurrentConfigService, FormulaDataModel, FormulaRuntimeService, HyperlinkEngineFormulaService, ICalculateFormulaService, IDefinedNamesService, IFormulaCurrentConfigService, IFormulaRuntimeService, IHyperlinkEngineFormulaService, LexerTreeBuilder } from '@univerjs/engine-formula'; import { IRenderManagerService, RenderManagerService } from '@univerjs/engine-render'; -import { DefinedNameDataController, IRefSelectionsService, RangeProtectionRuleModel, SheetInterceptorService, SheetsSelectionsService, WorkbookPermissionService, WorksheetPermissionService, WorksheetProtectionPointModel, WorksheetProtectionRuleModel } from '@univerjs/sheets'; +import { DefinedNameDataController, IRefSelectionsService, RangeProtectionRuleModel, SheetInterceptorService, SheetSkeletonService, SheetsSelectionsService, WorkbookPermissionService, WorksheetPermissionService, WorksheetProtectionPointModel, WorksheetProtectionRuleModel } from '@univerjs/sheets'; import { EditorBridgeService, IEditorBridgeService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; const TEST_WORKBOOK_DATA_DEMO: IWorkbookData = { @@ -102,6 +102,7 @@ export function createCommandTestBed(workbookData?: IWorkbookData, dependencies? injector.add([WorksheetProtectionRuleModel]); injector.add([SheetsSelectionsService]); injector.add([SheetInterceptorService]); + injector.add([SheetSkeletonService]); injector.add([ICalculateFormulaService, { useClass: CalculateFormulaService }]); injector.add([FormulaDataModel]); injector.add([LexerTreeBuilder]); diff --git a/packages/sheets-formula-ui/src/controllers/__tests__/formula-clipboard.controller.spec.ts b/packages/sheets-formula-ui/src/controllers/__tests__/formula-clipboard.controller.spec.ts index 31ed9bf7c0..52daedd9b5 100644 --- a/packages/sheets-formula-ui/src/controllers/__tests__/formula-clipboard.controller.spec.ts +++ b/packages/sheets-formula-ui/src/controllers/__tests__/formula-clipboard.controller.spec.ts @@ -160,7 +160,7 @@ export function clipboardTestBed(workbookData?: IWorkbookData, dependencies?: De activated$: new BehaviorSubject(true), activate: () => {}, deactivate: () => {}, - }, injector, injector.get(SheetSkeletonService)); + }, injector.get(SheetSkeletonService)); injector.add([SheetSkeletonManagerService, { useValue: fakeSheetSkeletonManagerService }]); injector.get(IRenderManagerService).addRender('test', { diff --git a/packages/sheets-formula-ui/src/controllers/formula-editor-show.controller.ts b/packages/sheets-formula-ui/src/controllers/formula-editor-show.controller.ts index e9f196b14e..b2de377e02 100644 --- a/packages/sheets-formula-ui/src/controllers/formula-editor-show.controller.ts +++ b/packages/sheets-formula-ui/src/controllers/formula-editor-show.controller.ts @@ -34,9 +34,8 @@ import { SetFormulaCalculationResultMutation, } from '@univerjs/engine-formula'; import { IRenderManagerService } from '@univerjs/engine-render'; -import { BEFORE_CELL_EDIT, SetWorksheetRowAutoHeightMutation, SheetInterceptorService } from '@univerjs/sheets'; +import { attachSelectionWithCoord, BEFORE_CELL_EDIT, SetWorksheetRowAutoHeightMutation, SheetInterceptorService, SheetSkeletonService } from '@univerjs/sheets'; import { - attachSelectionWithCoord, SELECTION_SHAPE_DEPTH, SelectionControl, SheetSkeletonManagerService, @@ -52,6 +51,7 @@ export class FormulaEditorShowController extends Disposable implements IRenderMo constructor( private readonly _context: IRenderContext, @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService, + @Inject(SheetSkeletonService) private readonly _sheetSkeletonService: SheetSkeletonService, @Inject(FormulaDataModel) private readonly _formulaDataModel: FormulaDataModel, @Inject(ThemeService) private readonly _themeService: ThemeService, @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, @@ -181,7 +181,7 @@ export class FormulaEditorShowController extends Disposable implements IRenderMo } const { startRow, startColumn, endRow, endColumn } = range; if (rowIndex === row && columnIndex === col) { - this._createArrayFormulaRangeShape(range, unitId); + this._createArrayFormulaRangeShape(range, unitId, subUnitId); return false; } if (row >= startRow && row <= endRow && col >= startColumn && col <= endColumn) { @@ -198,7 +198,7 @@ export class FormulaEditorShowController extends Disposable implements IRenderMo }; } - this._createArrayFormulaRangeShape(range, unitId); + this._createArrayFormulaRangeShape(range, unitId, subUnitId); return false; } }); @@ -206,9 +206,9 @@ export class FormulaEditorShowController extends Disposable implements IRenderMo return cellInfo; } - private _createArrayFormulaRangeShape(arrayRange: IRange, unitId: string): void { + private _createArrayFormulaRangeShape(arrayRange: IRange, unitId: string, subUnitId: string): void { const renderUnit = this._renderManagerService.getRenderById(unitId); - const skeleton = this._sheetSkeletonManagerService.getCurrentSkeleton(); + const skeleton = this._sheetSkeletonService.getSkeleton(unitId, subUnitId); if (!renderUnit || !skeleton) return; const { scene } = renderUnit; @@ -244,12 +244,12 @@ export class FormulaEditorShowController extends Disposable implements IRenderMo this._previousShape = null; } - private _refreshArrayFormulaRangeShape(unitId: string, _range?: IRange): void { + private _refreshArrayFormulaRangeShape(unitId: string, subUnitId: string): void { if (this._previousShape) { const { startRow, endRow, startColumn, endColumn } = this._previousShape.getRange(); const range = { startRow, endRow, startColumn, endColumn }; this._removeArrayFormulaRangeShape(); - this._createArrayFormulaRangeShape(range, unitId); + this._createArrayFormulaRangeShape(range, unitId, subUnitId); } } @@ -270,7 +270,7 @@ export class FormulaEditorShowController extends Disposable implements IRenderMo private _updateArrayFormulaRangeShape(unitId: string, subUnitId: string): void { if (!this._checkCurrentSheet(unitId, subUnitId)) return; if (!this._previousShape) return; - this._refreshArrayFormulaRangeShape(unitId); + this._refreshArrayFormulaRangeShape(unitId, subUnitId); } private _refreshArrayFormulaRangeShapeByRow(unitId: string, subUnitId: string, rowAutoHeightInfo: IRowAutoHeightInfo[]): void { @@ -278,18 +278,12 @@ export class FormulaEditorShowController extends Disposable implements IRenderMo if (!this._previousShape) return; - const { startRow: shapeStartRow, endRow: shapeEndRow, startColumn: shapeStartColumn, endColumn: shapeEndColumn } = this._previousShape.getRange(); + const { startRow: shapeStartRow } = this._previousShape.getRange(); for (let i = 0; i < rowAutoHeightInfo.length; i++) { const { row } = rowAutoHeightInfo[i]; if (shapeStartRow >= row) { - const shapeRange = { - startRow: shapeStartRow, - endRow: shapeEndRow, - startColumn: shapeStartColumn, - endColumn: shapeEndColumn, - }; - this._refreshArrayFormulaRangeShape(unitId, shapeRange); + this._refreshArrayFormulaRangeShape(unitId, subUnitId); break; } } diff --git a/packages/sheets-formula-ui/src/facade/f-univer.ts b/packages/sheets-formula-ui/src/facade/f-univer.ts index 80738844fc..489df3f326 100644 --- a/packages/sheets-formula-ui/src/facade/f-univer.ts +++ b/packages/sheets-formula-ui/src/facade/f-univer.ts @@ -19,7 +19,7 @@ import type { IShowRangeSelectorDialogOptions } from '@univerjs/sheets-formula-u import { FUniver } from '@univerjs/core/facade'; import { GlobalRangeSelectorService } from '@univerjs/sheets-formula-ui'; -export interface ISheetsFormulaUIMixin { +export interface IFUniverSheetsFormulaUIMixin { /** * Shows the range selector dialog. * @@ -51,16 +51,16 @@ export interface ISheetsFormulaUIMixin { showRangeSelectorDialog(opts: IShowRangeSelectorDialogOptions): Promise; } -export class FSheetsFormulaUIUniver extends FUniver implements ISheetsFormulaUIMixin { +export class FUniverSheetsFormulaUIMixin extends FUniver implements IFUniverSheetsFormulaUIMixin { override showRangeSelectorDialog(opts: IShowRangeSelectorDialogOptions): Promise { const globalRangeSelectorService = this._injector.get(GlobalRangeSelectorService); return globalRangeSelectorService.showRangeSelectorDialog(opts); } } -FUniver.extend(FSheetsFormulaUIUniver); +FUniver.extend(FUniverSheetsFormulaUIMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FUniver extends ISheetsFormulaUIMixin { } + interface FUniver extends IFUniverSheetsFormulaUIMixin { } } diff --git a/packages/sheets-formula-ui/src/services/render-services/ref-selections.render-service.ts b/packages/sheets-formula-ui/src/services/render-services/ref-selections.render-service.ts index 7a2366f145..68e38195db 100644 --- a/packages/sheets-formula-ui/src/services/render-services/ref-selections.render-service.ts +++ b/packages/sheets-formula-ui/src/services/render-services/ref-selections.render-service.ts @@ -19,8 +19,8 @@ import type { IMouseEvent, IPointerEvent, IRenderContext, IRenderModule, Scene, import type { ISelectionStyle, ISelectionWithCoord, ISelectionWithStyle, SheetsSelectionsService, WorkbookSelectionModel } from '@univerjs/sheets'; import { DisposableCollection, IContextService, Inject, Injector, RANGE_TYPE, Rectangle, ThemeService, toDisposable } from '@univerjs/core'; import { ScrollTimerType, SHEET_VIEWPORT_KEY, Vector2 } from '@univerjs/engine-render'; -import { convertSelectionDataToRange, IRefSelectionsService, SelectionMoveType } from '@univerjs/sheets'; -import { attachSelectionWithCoord, BaseSelectionRenderService, checkInHeaderRanges, genNormalSelectionStyle, getAllSelection, getCoordByOffset, getSheetObject, SelectionControl, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { attachSelectionWithCoord, convertSelectionDataToRange, IRefSelectionsService, SelectionMoveType } from '@univerjs/sheets'; +import { BaseSelectionRenderService, checkInHeaderRanges, genNormalSelectionStyle, getAllSelection, getCoordByOffset, getSheetObject, SelectionControl, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; import { IShortcutService } from '@univerjs/ui'; /** @@ -127,7 +127,8 @@ export class RefSelectionsRenderService extends BaseSelectionRenderService imple listenerDisposables.add( spreadsheetRowHeader?.onPointerDown$.subscribeEvent((evt: IPointerEvent | IMouseEvent, state) => { if (!this.inRefSelectionMode()) return; - const skeleton = this._sheetSkeletonManagerService.getCurrent()!.skeleton; + const skeleton = this._sheetSkeletonManagerService.getCurrentSkeleton(); + if (!skeleton) return; const { row } = getCoordByOffset(evt.offsetX, evt.offsetY, scene, skeleton); const matchSelectionData = checkInHeaderRanges(this._workbookSelections.getCurrentSelections(), row, RANGE_TYPE.ROW); if (matchSelectionData) return; @@ -141,7 +142,8 @@ export class RefSelectionsRenderService extends BaseSelectionRenderService imple listenerDisposables.add(spreadsheetColumnHeader?.onPointerDown$.subscribeEvent((evt: IPointerEvent | IMouseEvent, state) => { if (!this.inRefSelectionMode()) return; - const skeleton = this._sheetSkeletonManagerService.getCurrent()!.skeleton; + const skeleton = this._sheetSkeletonManagerService.getCurrentSkeleton(); + if (!skeleton) return; const { column } = getCoordByOffset(evt.offsetX, evt.offsetY, scene, skeleton); const matchSelectionData = checkInHeaderRanges(this._workbookSelections.getCurrentSelections(), column, RANGE_TYPE.COLUMN); if (matchSelectionData) return; @@ -157,7 +159,8 @@ export class RefSelectionsRenderService extends BaseSelectionRenderService imple // remove all other selections this._reset(); if (!this.inRefSelectionMode()) return; - const skeleton = this._sheetSkeletonManagerService.getCurrent()!.skeleton; + const skeleton = this._sheetSkeletonManagerService.getCurrentSkeleton(); + if (!skeleton) return; const selectionWithStyle = getAllSelection(skeleton); this._addSelectionControlByModelData(selectionWithStyle); this._selectionMoveStart$.next(this.getSelectionDataWithStyle()); diff --git a/packages/sheets-formula-ui/src/views/formula-editor/hooks/use-highlight.ts b/packages/sheets-formula-ui/src/views/formula-editor/hooks/use-highlight.ts index 31195b8064..d66f1d64ed 100644 --- a/packages/sheets-formula-ui/src/views/formula-editor/hooks/use-highlight.ts +++ b/packages/sheets-formula-ui/src/views/formula-editor/hooks/use-highlight.ts @@ -76,7 +76,7 @@ export function calcHighlightRanges(opts: { const currentSheetId = worksheet.getSheetId(); const getSheetIdByName = (name: string) => workbook?.getSheetBySheetName(name)?.getSheetId(); - const skeleton = sheetSkeletonManagerService?.getWorksheetSkeleton(currentSheetId)?.skeleton; + const skeleton = sheetSkeletonManagerService?.getSkeleton(currentSheetId); if (!skeleton) return; const endIndexes: number[] = []; for (let i = 0, len = refSelections.length; i < len; i++) { diff --git a/packages/sheets-formula/src/facade/f-enum.ts b/packages/sheets-formula/src/facade/f-enum.ts index 7372fe8e82..021f700140 100644 --- a/packages/sheets-formula/src/facade/f-enum.ts +++ b/packages/sheets-formula/src/facade/f-enum.ts @@ -20,22 +20,22 @@ import { CalculationMode } from '@univerjs/sheets-formula'; /** * @ignore */ -export interface IFSheetsFormulaEnum { +export interface IFSheetsFormulaEnumMixin { /** * Define the calculation mode during initialization */ CalculationMode: typeof CalculationMode; } -export class FSheetsFormulaEnum implements IFSheetsFormulaEnum { - get CalculationMode(): typeof CalculationMode { +export class FSheetsFormulaEnumMixin extends FEnum implements IFSheetsFormulaEnumMixin { + override get CalculationMode(): typeof CalculationMode { return CalculationMode; } } -FEnum.extend(FSheetsFormulaEnum); +FEnum.extend(FSheetsFormulaEnumMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - export interface FEnum extends IFSheetsFormulaEnum { + export interface FEnum extends IFSheetsFormulaEnumMixin { } } diff --git a/packages/sheets-hyper-link-ui/src/facade/f-workbook.ts b/packages/sheets-hyper-link-ui/src/facade/f-workbook.ts index 1d74dd7ec1..ea2f1cc230 100644 --- a/packages/sheets-hyper-link-ui/src/facade/f-workbook.ts +++ b/packages/sheets-hyper-link-ui/src/facade/f-workbook.ts @@ -16,7 +16,6 @@ import { SheetsHyperLinkParserService } from '@univerjs/sheets-hyper-link'; import { SheetsHyperLinkResolverService } from '@univerjs/sheets-hyper-link-ui'; -import { FWorkbookHyperLinkMixin } from '@univerjs/sheets-hyper-link/facade'; import { FWorkbook } from '@univerjs/sheets/facade'; interface IFWorkbookHyperlinkUIMixin { @@ -47,7 +46,7 @@ interface IFWorkbookHyperlinkUIMixin { navigateToSheetHyperlink(this: FWorkbook, hyperlink: string): void; } -class FWorkbookHyperLinkUIMixin extends FWorkbookHyperLinkMixin implements IFWorkbookHyperlinkUIMixin { +class FWorkbookHyperlinkUIMixin extends FWorkbook implements IFWorkbookHyperlinkUIMixin { // TODO: this should be migrated back to hyperlink ui plugin override navigateToSheetHyperlink(hyperlink: string): void { const parserService = this._injector.get(SheetsHyperLinkParserService); @@ -57,7 +56,7 @@ class FWorkbookHyperLinkUIMixin extends FWorkbookHyperLinkMixin implements IFWor } } -FWorkbook.extend(FWorkbookHyperLinkUIMixin); +FWorkbook.extend(FWorkbookHyperlinkUIMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention interface FWorkbook extends IFWorkbookHyperlinkUIMixin {} diff --git a/packages/sheets-hyper-link/src/facade/f-event.ts b/packages/sheets-hyper-link/src/facade/f-event.ts index 3413cd6922..c9fc006801 100644 --- a/packages/sheets-hyper-link/src/facade/f-event.ts +++ b/packages/sheets-hyper-link/src/facade/f-event.ts @@ -22,10 +22,10 @@ import { FEventName } from '@univerjs/core/facade'; /** * @ignore */ -interface IFSheetLinkEvent { +interface IFSheetsHyperlinkEventNameMixin { /** * Event triggered before adding a link - * @see {@link IBeforeSheetLinkAddEvent} + * @see {@link IBeforeSheetLinkAddEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetLinkAdd, (params) => { @@ -43,7 +43,7 @@ interface IFSheetLinkEvent { /** * Event triggered before canceling a link - * @see {@link IBeforeSheetLinkCancelEvent} + * @see {@link IBeforeSheetLinkCancelEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetLinkCancel, (params) => { @@ -61,7 +61,7 @@ interface IFSheetLinkEvent { /** * Event triggered before updating a link - * @see {@link IBeforeSheetLinkUpdateEvent} + * @see {@link IBeforeSheetLinkUpdateEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetLinkUpdate, (params) => { @@ -78,21 +78,21 @@ interface IFSheetLinkEvent { readonly BeforeSheetLinkUpdate: 'BeforeSheetLinkUpdate'; } -export class FSheetLinkEvent implements IFSheetLinkEvent { - get BeforeSheetLinkAdd(): 'BeforeSheetLinkAdd' { +export class FSheetsHyperlinkEventNameMixin extends FEventName implements IFSheetsHyperlinkEventNameMixin { + override get BeforeSheetLinkAdd(): 'BeforeSheetLinkAdd' { return 'BeforeSheetLinkAdd' as const; } - get BeforeSheetLinkCancel(): 'BeforeSheetLinkCancel' { + override get BeforeSheetLinkCancel(): 'BeforeSheetLinkCancel' { return 'BeforeSheetLinkCancel' as const; } - get BeforeSheetLinkUpdate(): 'BeforeSheetLinkUpdate' { + override get BeforeSheetLinkUpdate(): 'BeforeSheetLinkUpdate' { return 'BeforeSheetLinkUpdate' as const; } } -export interface IBeforeSheetLinkAddEvent extends IEventBase { +export interface IBeforeSheetLinkAddEventParams extends IEventBase { /** The workbook instance */ workbook: FWorkbook; /** The worksheet where the link will be added */ @@ -105,7 +105,7 @@ export interface IBeforeSheetLinkAddEvent extends IEventBase { link: ISheetHyperLink; } -export interface IBeforeSheetLinkCancelEvent extends IEventBase { +export interface IBeforeSheetLinkCancelEventParams extends IEventBase { /** The workbook instance */ workbook: FWorkbook; /** The worksheet containing the link */ @@ -118,7 +118,7 @@ export interface IBeforeSheetLinkCancelEvent extends IEventBase { id: string; } -export interface IBeforeSheetLinkUpdateEvent extends IEventBase { +export interface IBeforeSheetLinkUpdateEventParams extends IEventBase { /** The workbook instance */ workbook: FWorkbook; /** The worksheet containing the link */ @@ -136,19 +136,17 @@ export interface IBeforeSheetLinkUpdateEvent extends IEventBase { /** * @ignore */ -export interface ISheetLinkEventConfig { - BeforeSheetLinkAdd: IBeforeSheetLinkAddEvent; - BeforeSheetLinkCancel: IBeforeSheetLinkCancelEvent; - BeforeSheetLinkUpdate: IBeforeSheetLinkUpdateEvent; +export interface ISheetsHyperlinkEventParamConfig { + BeforeSheetLinkAdd: IBeforeSheetLinkAddEventParams; + BeforeSheetLinkCancel: IBeforeSheetLinkCancelEventParams; + BeforeSheetLinkUpdate: IBeforeSheetLinkUpdateEventParams; } -FEventName.extend(FSheetLinkEvent); +FEventName.extend(FSheetsHyperlinkEventNameMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FEventName extends IFSheetLinkEvent { - } + interface FEventName extends IFSheetsHyperlinkEventNameMixin {} - interface IEventParamConfig extends ISheetLinkEventConfig { - } + interface IEventParamConfig extends ISheetsHyperlinkEventParamConfig { } } diff --git a/packages/sheets-hyper-link/src/facade/f-range.ts b/packages/sheets-hyper-link/src/facade/f-range.ts index 3c0457fc26..a99238c225 100644 --- a/packages/sheets-hyper-link/src/facade/f-range.ts +++ b/packages/sheets-hyper-link/src/facade/f-range.ts @@ -30,7 +30,7 @@ export interface ICellHyperLink { /** * @ignore */ -export interface IFRangeHyperlinkMixin { +export interface IFRangeSheetsHyperlinkMixin { /** * @deprecated use `range.setRichTextValueForCell(univerAPI.newRichText().insertLink(label, url))` instead * @example @@ -124,7 +124,7 @@ export interface IFRangeHyperlinkMixin { getUrl(): string; } -export class FRangeHyperlinkMixin extends FRange implements IFRangeHyperlinkMixin { +export class FRangeSheetsHyperlinkMixin extends FRange implements IFRangeSheetsHyperlinkMixin { // #region hyperlink override setHyperLink(url: string, label?: string): Promise { @@ -196,8 +196,8 @@ export class FRangeHyperlinkMixin extends FRange implements IFRangeHyperlinkMixi // #endregion } -FRange.extend(FRangeHyperlinkMixin); +FRange.extend(FRangeSheetsHyperlinkMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FRange extends IFRangeHyperlinkMixin {} + interface FRange extends IFRangeSheetsHyperlinkMixin {} } diff --git a/packages/sheets-hyper-link/src/facade/f-univer.ts b/packages/sheets-hyper-link/src/facade/f-univer.ts index 8af8802396..36def9fe4d 100644 --- a/packages/sheets-hyper-link/src/facade/f-univer.ts +++ b/packages/sheets-hyper-link/src/facade/f-univer.ts @@ -16,12 +16,12 @@ import type { Injector } from '@univerjs/core'; import type { IAddHyperLinkCommandParams, ICancelHyperLinkCommandParams, IUpdateHyperLinkCommandParams } from '@univerjs/sheets-hyper-link'; -import type { IBeforeSheetLinkAddEvent, IBeforeSheetLinkCancelEvent, IBeforeSheetLinkUpdateEvent } from './f-event'; +import type { IBeforeSheetLinkAddEventParams, IBeforeSheetLinkCancelEventParams, IBeforeSheetLinkUpdateEventParams } from './f-event'; import { CanceledError, ICommandService } from '@univerjs/core'; import { FUniver } from '@univerjs/core/facade'; import { AddHyperLinkCommand, CancelHyperLinkCommand, UpdateHyperLinkCommand } from '@univerjs/sheets-hyper-link'; -export class FSheetLinkUniver extends FUniver { +export class FUniverSheetsHyperlinkMixin extends FUniver { /** * @ignore */ @@ -38,7 +38,7 @@ export class FSheetLinkUniver extends FUniver { if (!eventTarget) return; const params = commandInfo.params as IAddHyperLinkCommandParams; - const eventParams: IBeforeSheetLinkAddEvent = { + const eventParams: IBeforeSheetLinkAddEventParams = { workbook: eventTarget.workbook, worksheet: eventTarget.worksheet, row: params.link.row, @@ -63,7 +63,7 @@ export class FSheetLinkUniver extends FUniver { if (!eventTarget) return; const params = commandInfo.params as IUpdateHyperLinkCommandParams; - const eventParams: IBeforeSheetLinkUpdateEvent = { + const eventParams: IBeforeSheetLinkUpdateEventParams = { workbook: eventTarget.workbook, worksheet: eventTarget.worksheet, row: params.row, @@ -89,7 +89,7 @@ export class FSheetLinkUniver extends FUniver { if (!eventTarget) return; const params = commandInfo.params as ICancelHyperLinkCommandParams; - const eventParams: IBeforeSheetLinkCancelEvent = { + const eventParams: IBeforeSheetLinkCancelEventParams = { workbook: eventTarget.workbook, worksheet: eventTarget.worksheet, row: params.row, @@ -106,4 +106,4 @@ export class FSheetLinkUniver extends FUniver { } } -FUniver.extend(FSheetLinkUniver); +FUniver.extend(FUniverSheetsHyperlinkMixin); diff --git a/packages/sheets-hyper-link/src/facade/f-workbook.ts b/packages/sheets-hyper-link/src/facade/f-workbook.ts index c4f9e0966f..7684f99c68 100644 --- a/packages/sheets-hyper-link/src/facade/f-workbook.ts +++ b/packages/sheets-hyper-link/src/facade/f-workbook.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import type { IRange } from '@univerjs/core'; import type { ISheetHyperLinkInfo } from '@univerjs/sheets-hyper-link'; import type { FRange } from '@univerjs/sheets/facade'; import { Inject } from '@univerjs/core'; @@ -40,11 +39,6 @@ export class SheetHyperLinkBuilder { * @ignore */ export interface IFWorkbookHyperlinkMixin { - /** - * @deprecated use `getUrl` method in `FRange` or `FWorksheet` instead. - */ - createSheetHyperlink(this: FWorkbook, sheetId: string, range?: string | IRange): string; - /** * Parse the hyperlink string to get the hyperlink info. * @param {string} hyperlink - The hyperlink string. @@ -65,12 +59,7 @@ export interface IFWorkbookHyperlinkMixin { parseSheetHyperlink(this: FWorkbook, hyperlink: string): ISheetHyperLinkInfo; } -export class FWorkbookHyperLinkMixin extends FWorkbook implements IFWorkbookHyperlinkMixin { - override createSheetHyperlink(sheetId: string, range?: string | IRange): string { - const parserService = this._injector.get(SheetsHyperLinkParserService); - return parserService.buildHyperLink(this.getId(), sheetId, range); - } - +export class FWorkbookHyperlinkMixin extends FWorkbook implements IFWorkbookHyperlinkMixin { /** * Parse the hyperlink string to get the hyperlink info. * @param {string} hyperlink the hyperlink string @@ -82,8 +71,8 @@ export class FWorkbookHyperLinkMixin extends FWorkbook implements IFWorkbookHype } } -FWorkbook.extend(FWorkbookHyperLinkMixin); +FWorkbook.extend(FWorkbookHyperlinkMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FWorkbook extends IFWorkbookHyperlinkMixin {} + interface FWorkbook extends IFWorkbookHyperlinkMixin { } } diff --git a/packages/sheets-hyper-link/src/facade/index.ts b/packages/sheets-hyper-link/src/facade/index.ts index 3551af33b7..96c7534444 100644 --- a/packages/sheets-hyper-link/src/facade/index.ts +++ b/packages/sheets-hyper-link/src/facade/index.ts @@ -23,6 +23,6 @@ import './f-univer'; export type * from './f-event'; export type * from './f-range'; export type * from './f-univer'; -export { FWorkbookHyperLinkMixin } from './f-workbook'; +export { FWorkbookHyperlinkMixin } from './f-workbook'; export type * from './f-workbook'; export type * from './f-worksheet'; diff --git a/packages/sheets-note/src/facade/f-event.ts b/packages/sheets-note/src/facade/f-event.ts index 8e724591d0..dc69b3cddb 100644 --- a/packages/sheets-note/src/facade/f-event.ts +++ b/packages/sheets-note/src/facade/f-event.ts @@ -82,7 +82,7 @@ export interface ISheetsNoteEventParamConfig { /** * @ignore */ -interface ISheetNoteEvent { +interface IFSheetsNoteEventNameMixin { /** * Event fired when a note is added * @see {@link ISheetNoteAddEventParams} @@ -96,7 +96,7 @@ interface ISheetNoteEvent { * // Remove the event listener, use `disposable.dispose()` * ``` */ - SheetNoteAdd: 'SheetNoteAdd'; + readonly SheetNoteAdd: 'SheetNoteAdd'; /** * Event fired when a note is deleted * @see {@link ISheetNoteDeleteEventParams} @@ -110,7 +110,7 @@ interface ISheetNoteEvent { * // Remove the event listener, use `disposable.dispose()` * ``` */ - SheetNoteDelete: 'SheetNoteDelete'; + readonly SheetNoteDelete: 'SheetNoteDelete'; /** * Event fired when a note is updated * @see {@link ISheetNoteUpdateEventParams} @@ -124,7 +124,7 @@ interface ISheetNoteEvent { * // Remove the event listener, use `disposable.dispose()` * ``` */ - SheetNoteUpdate: 'SheetNoteUpdate'; + readonly SheetNoteUpdate: 'SheetNoteUpdate'; /** * Event fired when a note is shown * @see {@link ISheetNoteShowEventParams} @@ -138,7 +138,7 @@ interface ISheetNoteEvent { * // Remove the event listener, use `disposable.dispose()` * ``` */ - SheetNoteShow: 'SheetNoteShow'; + readonly SheetNoteShow: 'SheetNoteShow'; /** * Event fired when a note is hidden * @see {@link ISheetNoteHideEventParams} @@ -152,7 +152,7 @@ interface ISheetNoteEvent { * // Remove the event listener, use `disposable.dispose()` * ``` */ - SheetNoteHide: 'SheetNoteHide'; + readonly SheetNoteHide: 'SheetNoteHide'; /** * Event fired before a note is added @@ -170,7 +170,7 @@ interface ISheetNoteEvent { * // Remove the event listener, use `disposable.dispose()` * ``` */ - BeforeSheetNoteAdd: 'BeforeSheetNoteAdd'; + readonly BeforeSheetNoteAdd: 'BeforeSheetNoteAdd'; /** * Event fired before a note is deleted * @see {@link ISheetNoteDeleteEventParams} @@ -187,7 +187,7 @@ interface ISheetNoteEvent { * // Remove the event listener, use `disposable.dispose()` * ``` */ - BeforeSheetNoteDelete: 'BeforeSheetNoteDelete'; + readonly BeforeSheetNoteDelete: 'BeforeSheetNoteDelete'; /** * Event fired before a note is updated * @see {@link ISheetNoteUpdateEventParams} @@ -204,7 +204,7 @@ interface ISheetNoteEvent { * // Remove the event listener, use `disposable.dispose()` * ``` */ - BeforeSheetNoteUpdate: 'BeforeSheetNoteUpdate'; + readonly BeforeSheetNoteUpdate: 'BeforeSheetNoteUpdate'; /** * Event fired before a note is shown * @see {@link ISheetNoteShowEventParams} @@ -221,7 +221,7 @@ interface ISheetNoteEvent { * // Remove the event listener, use `disposable.dispose()` * ``` */ - BeforeSheetNoteShow: 'BeforeSheetNoteShow'; + readonly BeforeSheetNoteShow: 'BeforeSheetNoteShow'; /** * Event fired before a note is hidden * @see {@link ISheetNoteHideEventParams} @@ -238,58 +238,58 @@ interface ISheetNoteEvent { * // Remove the event listener, use `disposable.dispose()` * ``` */ - BeforeSheetNoteHide: 'BeforeSheetNoteHide'; + readonly BeforeSheetNoteHide: 'BeforeSheetNoteHide'; } /** * @ignore */ -export class FSheetNoteEvent implements ISheetNoteEvent { - get SheetNoteAdd(): 'SheetNoteAdd' { - return 'SheetNoteAdd'; +export class FSheetsNoteEventNameMixin extends FEventName implements IFSheetsNoteEventNameMixin { + override get SheetNoteAdd(): 'SheetNoteAdd' { + return 'SheetNoteAdd' as const; } - get SheetNoteDelete(): 'SheetNoteDelete' { - return 'SheetNoteDelete'; + override get SheetNoteDelete(): 'SheetNoteDelete' { + return 'SheetNoteDelete' as const; } - get SheetNoteUpdate(): 'SheetNoteUpdate' { - return 'SheetNoteUpdate'; + override get SheetNoteUpdate(): 'SheetNoteUpdate' { + return 'SheetNoteUpdate' as const; } - get SheetNoteShow(): 'SheetNoteShow' { - return 'SheetNoteShow'; + override get SheetNoteShow(): 'SheetNoteShow' { + return 'SheetNoteShow' as const; } - get SheetNoteHide(): 'SheetNoteHide' { - return 'SheetNoteHide'; + override get SheetNoteHide(): 'SheetNoteHide' { + return 'SheetNoteHide' as const; } - get BeforeSheetNoteAdd(): 'BeforeSheetNoteAdd' { - return 'BeforeSheetNoteAdd'; + override get BeforeSheetNoteAdd(): 'BeforeSheetNoteAdd' { + return 'BeforeSheetNoteAdd' as const; } - get BeforeSheetNoteDelete(): 'BeforeSheetNoteDelete' { - return 'BeforeSheetNoteDelete'; + override get BeforeSheetNoteDelete(): 'BeforeSheetNoteDelete' { + return 'BeforeSheetNoteDelete' as const; } - get BeforeSheetNoteUpdate(): 'BeforeSheetNoteUpdate' { - return 'BeforeSheetNoteUpdate'; + override get BeforeSheetNoteUpdate(): 'BeforeSheetNoteUpdate' { + return 'BeforeSheetNoteUpdate' as const; } - get BeforeSheetNoteShow(): 'BeforeSheetNoteShow' { - return 'BeforeSheetNoteShow'; + override get BeforeSheetNoteShow(): 'BeforeSheetNoteShow' { + return 'BeforeSheetNoteShow' as const; } - get BeforeSheetNoteHide(): 'BeforeSheetNoteHide' { - return 'BeforeSheetNoteHide'; + override get BeforeSheetNoteHide(): 'BeforeSheetNoteHide' { + return 'BeforeSheetNoteHide' as const; } } /** * @ignore */ -export interface ISheetNoteEventConfig { +export interface ISheetsNoteEventParamConfig { SheetNoteAdd: ISheetNoteAddEventParams; SheetNoteDelete: ISheetNoteDeleteEventParams; SheetNoteUpdate: ISheetNoteUpdateEventParams; @@ -303,9 +303,9 @@ export interface ISheetNoteEventConfig { BeforeSheetNoteHide: ISheetNoteHideEventParams; } -FEventName.extend(FSheetNoteEvent); +FEventName.extend(FSheetsNoteEventNameMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FEventName extends ISheetNoteEvent {} - interface IEventParamConfig extends ISheetNoteEventConfig {} + interface FEventName extends IFSheetsNoteEventNameMixin {} + interface IEventParamConfig extends ISheetsNoteEventParamConfig {} } diff --git a/packages/sheets-note/src/facade/f-range.ts b/packages/sheets-note/src/facade/f-range.ts index ba540a6c49..2b757cf8e8 100644 --- a/packages/sheets-note/src/facade/f-range.ts +++ b/packages/sheets-note/src/facade/f-range.ts @@ -22,7 +22,7 @@ import { FRange } from '@univerjs/sheets/facade'; /** * @ignore */ -export interface IFSheetsNoteRange { +export interface IFRangeSheetsNoteMixin { /** * Get the annotation of the top-left cell in the range * @returns {Nullable} The annotation of the top-left cell in the range @@ -74,7 +74,7 @@ export interface IFSheetsNoteRange { deleteNote(): FRange; } -export class FSheetsNoteRangeMixin extends FRange implements IFSheetsNoteRange { +export class FRangeSheetsNoteMixin extends FRange implements IFRangeSheetsNoteMixin { override createOrUpdateNote(note: ISheetNote): FRange { this._commandService.syncExecuteCommand( UpdateNoteMutation.id, @@ -110,8 +110,8 @@ export class FSheetsNoteRangeMixin extends FRange implements IFSheetsNoteRange { } } -FRange.extend(FSheetsNoteRangeMixin); +FRange.extend(FRangeSheetsNoteMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FRange extends IFSheetsNoteRange { } + interface FRange extends IFRangeSheetsNoteMixin { } } diff --git a/packages/sheets-note/src/facade/f-univer.ts b/packages/sheets-note/src/facade/f-univer.ts index 614470e2da..b5be2a1c2c 100644 --- a/packages/sheets-note/src/facade/f-univer.ts +++ b/packages/sheets-note/src/facade/f-univer.ts @@ -16,19 +16,13 @@ import type { Injector } from '@univerjs/core'; import type { IRemoveNoteMutationParams, IUpdateNoteMutationParams } from '@univerjs/sheets-note'; +import type { ISheetNoteAddEventParams, ISheetNoteDeleteEventParams, ISheetNoteHideEventParams, ISheetNoteShowEventParams, ISheetNoteUpdateEventParams } from './f-event'; import { CanceledError, ICommandService, IUniverInstanceService } from '@univerjs/core'; import { FUniver } from '@univerjs/core/facade'; import { getSheetCommandTarget, SheetsSelectionsService } from '@univerjs/sheets'; import { SheetDeleteNoteCommand, SheetsNoteModel, SheetToggleNotePopupCommand, SheetUpdateNoteCommand } from '@univerjs/sheets-note'; -/** - * @ignore - */ -export interface IFUniverSheetNoteMixin { - // Add any note-specific methods here if needed -} - -export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteMixin { +export class FUniverSheetsNoteMixin extends FUniver { // eslint-disable-next-line max-lines-per-function override _initialize(injector: Injector): void { const commandService = injector.get(ICommandService); @@ -46,14 +40,14 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM return; } const { workbook, worksheet } = target; - - this.fireEvent(this.Event.SheetNoteAdd, { + const eventParams: ISheetNoteAddEventParams = { workbook, worksheet, row: newNote.row, col: newNote.col, note: newNote, - }); + }; + this.fireEvent(this.Event.SheetNoteAdd, eventParams); } }); } @@ -73,14 +67,14 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM return; } const { workbook, worksheet } = target; - - this.fireEvent(this.Event.SheetNoteDelete, { + const eventParams: ISheetNoteDeleteEventParams = { workbook, worksheet, row: oldNote.row, col: oldNote.col, oldNote, - }); + }; + this.fireEvent(this.Event.SheetNoteDelete, eventParams); } }); } @@ -100,15 +94,15 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM return; } const { workbook, worksheet } = target; - - this.fireEvent(this.Event.SheetNoteUpdate, { + const eventParams: ISheetNoteUpdateEventParams = { workbook, worksheet, row: newNote.row, col: newNote.col, note: newNote, oldNote, - }); + }; + this.fireEvent(this.Event.SheetNoteUpdate, eventParams); } }); } @@ -128,13 +122,13 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM return; } const { workbook, worksheet } = target; - - this.fireEvent(this.Event.SheetNoteShow, { + const eventParams: ISheetNoteShowEventParams = { workbook, worksheet, row: newNote.row, col: newNote.col, - }); + }; + this.fireEvent(this.Event.SheetNoteShow, eventParams); } }); } @@ -154,13 +148,13 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM return; } const { workbook, worksheet } = target; - - this.fireEvent(this.Event.SheetNoteHide, { + const eventParams: ISheetNoteHideEventParams = { workbook, worksheet, row: newNote.row, col: newNote.col, - }); + }; + this.fireEvent(this.Event.SheetNoteHide, eventParams); } }); } @@ -182,13 +176,14 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM if (oldNote) return; const { workbook, worksheet } = target; - const cancel = this.fireEvent(this.Event.BeforeSheetNoteAdd, { + const eventParams: ISheetNoteAddEventParams = { workbook, worksheet, row, col, note, - }); + }; + const cancel = this.fireEvent(this.Event.BeforeSheetNoteAdd, eventParams); if (cancel) { throw new CanceledError(); } @@ -211,13 +206,14 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM if (!oldNote) return; const { workbook, worksheet } = target; - const cancel = this.fireEvent(this.Event.BeforeSheetNoteDelete, { + const eventParams: ISheetNoteDeleteEventParams = { workbook, worksheet, row, col, oldNote, - }); + }; + const cancel = this.fireEvent(this.Event.BeforeSheetNoteDelete, eventParams); if (cancel) { throw new CanceledError(); @@ -242,14 +238,15 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM if (!oldNote) return; const { workbook, worksheet } = target; - const cancel = this.fireEvent(this.Event.BeforeSheetNoteUpdate, { + const eventParams: ISheetNoteUpdateEventParams = { workbook, worksheet, row, col, note, oldNote, - }); + }; + const cancel = this.fireEvent(this.Event.BeforeSheetNoteUpdate, eventParams); if (cancel) { throw new CanceledError(); } @@ -280,13 +277,13 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM const { actualColumn, actualRow } = selection.primary; const note = sheetsNoteModel.getNote(unitId, subUnitId, { row: actualRow, col: actualColumn }); if (!note || note.show) return; - - const cancel = this.fireEvent(this.Event.BeforeSheetNoteShow, { + const eventParams: ISheetNoteShowEventParams = { workbook, worksheet, row: actualRow, col: actualColumn, - }); + }; + const cancel = this.fireEvent(this.Event.BeforeSheetNoteShow, eventParams); if (cancel) { throw new CanceledError(); } @@ -317,13 +314,13 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM const { actualColumn, actualRow } = selection.primary; const note = sheetsNoteModel.getNote(unitId, subUnitId, { row: actualRow, col: actualColumn }); if (!note || !note.show) return; - - const cancel = this.fireEvent(this.Event.BeforeSheetNoteHide, { + const eventParams: ISheetNoteHideEventParams = { workbook, worksheet, row: actualRow, col: actualColumn, - }); + }; + const cancel = this.fireEvent(this.Event.BeforeSheetNoteHide, eventParams); if (cancel) { throw new CanceledError(); } @@ -334,8 +331,4 @@ export class FUniverSheetNoteMixin extends FUniver implements IFUniverSheetNoteM } } -FUniver.extend(FUniverSheetNoteMixin); -declare module '@univerjs/core/facade' { - // eslint-disable-next-line ts/naming-convention - interface FUniver extends IFUniverSheetNoteMixin {} -} +FUniver.extend(FUniverSheetsNoteMixin); diff --git a/packages/sheets-note/src/facade/f-worksheet.ts b/packages/sheets-note/src/facade/f-worksheet.ts index 1c3db23dde..012f9e46dd 100644 --- a/packages/sheets-note/src/facade/f-worksheet.ts +++ b/packages/sheets-note/src/facade/f-worksheet.ts @@ -21,7 +21,7 @@ import { FWorksheet } from '@univerjs/sheets/facade'; /** * @ignore */ -export interface IFSheetsNoteWorksheet { +export interface IFWorksheetNoteMixin { /** * Get all annotations in the worksheet * @returns {ISheetNote[]} An array of all annotations in the worksheet @@ -41,7 +41,7 @@ export interface IFSheetsNoteWorksheet { getNotes(): ISheetNote[]; } -export class FSheetsNoteWorksheet extends FWorksheet implements IFSheetsNoteWorksheet { +export class FWorksheetNoteMixin extends FWorksheet implements IFWorksheetNoteMixin { override getNotes(): ISheetNote[] { const model = this._injector.get(SheetsNoteModel); const notes = model.getSheetNotes(this.getWorkbook().getUnitId(), this.getSheetId()); @@ -52,8 +52,8 @@ export class FSheetsNoteWorksheet extends FWorksheet implements IFSheetsNoteWork } } -FWorksheet.extend(FSheetsNoteWorksheet); +FWorksheet.extend(FWorksheetNoteMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FWorksheet extends IFSheetsNoteWorksheet { } + interface FWorksheet extends IFWorksheetNoteMixin { } } diff --git a/packages/sheets-numfmt/src/facade/f-range.ts b/packages/sheets-numfmt/src/facade/f-range.ts index 3069df9163..e2428440d7 100644 --- a/packages/sheets-numfmt/src/facade/f-range.ts +++ b/packages/sheets-numfmt/src/facade/f-range.ts @@ -95,7 +95,7 @@ export interface IFRangeSheetsNumfmtMixin { getNumberFormats(): string[][]; } -export class FRangeLegacy extends FRange implements IFRangeSheetsNumfmtMixin { +export class FRangeSheetsNumfmtMixin extends FRange implements IFRangeSheetsNumfmtMixin { override setNumberFormat(pattern: string): FRange { // TODO@Gggpound: the API should support other types of parameters const values: ISetNumfmtCommandParams['values'] = []; @@ -149,7 +149,7 @@ export class FRangeLegacy extends FRange implements IFRangeSheetsNumfmtMixin { } } -FRange.extend(FRangeLegacy); +FRange.extend(FRangeSheetsNumfmtMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention interface FRange extends IFRangeSheetsNumfmtMixin { } diff --git a/packages/sheets-numfmt/src/facade/f-workbook.ts b/packages/sheets-numfmt/src/facade/f-workbook.ts index 5624b103f3..d51efab78d 100644 --- a/packages/sheets-numfmt/src/facade/f-workbook.ts +++ b/packages/sheets-numfmt/src/facade/f-workbook.ts @@ -18,7 +18,7 @@ import type { INumfmtLocaleTag } from '@univerjs/core'; import { SheetsNumfmtCellContentController } from '@univerjs/sheets-numfmt'; import { FWorkbook } from '@univerjs/sheets/facade'; -export interface IFWorkbookNumfmtMixin { +export interface IFWorkbookSheetsNumfmtMixin { /** * Set the locale for number formatting. * @param {INumfmtLocaleTag} locale zh_CN,zh_TW,zh_HK,ja,ko,th,cs,da,nl,en,en_AU,en_CA,en_GB,en_IE,fi,fr,fr_CA,fr_CH,de,de_CH,el,hu,is,id,it,it_CH,nb,no,pl,pt,pt_BR,ru,sk,es,es_AR,es_BO,es_CL,es_CO,es_EC,es_MX,es_PY,es_UY,es_VE,sv,tr,cy,az,be,bg,ca,fil,gu,he,hr,hy,ka,kk,kn,lt,lv,ml,mn,mr,my,pa,ro,sl,sr,ta,te,uk,vi,ar,bn,hi @@ -42,15 +42,15 @@ export interface IFWorkbookNumfmtMixin { */ setNumfmtLocal(locale: INumfmtLocaleTag): FWorkbook; } -export class FWorkbookLegacy extends FWorkbook implements IFWorkbookNumfmtMixin { +export class FWorkbookSheetsNumfmtMixin extends FWorkbook implements IFWorkbookSheetsNumfmtMixin { override setNumfmtLocal(locale: INumfmtLocaleTag): FWorkbook { const sheetsNumfmtCellContentController = this._injector.get(SheetsNumfmtCellContentController); sheetsNumfmtCellContentController.setNumfmtLocal(locale); return this; } } -FWorkbook.extend(FWorkbookLegacy); +FWorkbook.extend(FWorkbookSheetsNumfmtMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FWorkbook extends IFWorkbookNumfmtMixin { } + interface FWorkbook extends IFWorkbookSheetsNumfmtMixin { } } diff --git a/packages/sheets-sort/src/facade/f-event.ts b/packages/sheets-sort/src/facade/f-event.ts index c072c382ee..d81402b79b 100644 --- a/packages/sheets-sort/src/facade/f-event.ts +++ b/packages/sheets-sort/src/facade/f-event.ts @@ -14,19 +14,14 @@ * limitations under the License. */ -import type { ICommandInfo, Injector } from '@univerjs/core'; import type { IEventBase } from '@univerjs/core/facade'; -import type { ISortRangeCommandParams } from '@univerjs/sheets-sort'; import type { FRange, FWorkbook, FWorksheet } from '@univerjs/sheets/facade'; -import { ICommandService } from '@univerjs/core'; -import { FEventName, FUniver } from '@univerjs/core/facade'; -import { SortRangeCommand, SortType } from '@univerjs/sheets-sort'; -import { FSheetEventName } from '@univerjs/sheets/facade'; +import { FEventName } from '@univerjs/core/facade'; /** * @ignore */ -export interface IFSheetSortEventMixin { +export interface IFSheetsSortEventNameMixin { /** * This event will be emitted when a range on a worksheet is sorted. * @see {@link ISheetRangeSortParams} @@ -61,7 +56,7 @@ export interface IFSheetSortEventMixin { SheetBeforeRangeSort: 'SheetBeforeRangeSort'; } -export class FSheetSortEventName implements IFSheetSortEventMixin { +export class FSheetsSortEventNameMixin implements IFSheetsSortEventNameMixin { get SheetRangeSorted(): 'SheetRangeSorted' { return 'SheetRangeSorted' as const; } get SheetBeforeRangeSort(): 'SheetBeforeRangeSort' { return 'SheetBeforeRangeSort' as const; } } @@ -71,7 +66,7 @@ interface ISortColumn { ascending: boolean; } -export interface ISheetRangeSortParams extends IEventBase { +export interface ISheetsRangeSortEventParams extends IEventBase { workbook: FWorkbook; worksheet: FWorksheet; range: FRange; @@ -81,91 +76,14 @@ export interface ISheetRangeSortParams extends IEventBase { /** * @ignore */ -export interface ISheetRangeSortEventParamConfig { - SheetBeforeRangeSort: ISheetRangeSortParams; - SheetRangeSorted: ISheetRangeSortParams; +export interface ISheetsSortEventParamConfig { + SheetBeforeRangeSort: ISheetsRangeSortEventParams; + SheetRangeSorted: ISheetsRangeSortEventParams; } -FEventName.extend(FSheetEventName); - -class FUniverSheetsSortEventMixin extends FUniver { - /** - * @ignore - */ - override _initialize(injector: Injector): void { - const commandService = injector.get(ICommandService); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.SheetBeforeRangeSort, - () => commandService.beforeCommandExecuted((commandInfo) => { - if (commandInfo.id !== SortRangeCommand.id) return; - this._beforeRangeSort(commandInfo as Readonly>); - }) - ) - ); - - this.disposeWithMe( - this.registerEventHandler( - this.Event.SheetRangeSorted, - () => commandService.onCommandExecuted((commandInfo) => { - if (commandInfo.id !== SortRangeCommand.id) return; - this._onRangeSorted(commandInfo as Readonly>); - }) - ) - ); - } - - private _beforeRangeSort(commandInfo: Readonly>): void { - const params = commandInfo.params!; - const fWorkbook = this.getUniverSheet(params.unitId)!; - const fWorksheet = fWorkbook.getSheetBySheetId(params.subUnitId)!; - const { startColumn, endColumn, startRow, endRow } = params.range; - const fRange = fWorksheet.getRange(startRow, startColumn, endRow - startRow + 1, endColumn - startColumn + 1); - const eventParams: ISheetRangeSortParams = { - workbook: fWorkbook, - worksheet: fWorksheet, - range: fRange, - sortColumn: params.orderRules.map((rule) => ({ - column: rule.colIndex - startColumn, - ascending: rule.type === SortType.ASC, - })), - }; - - this.fireEvent(this.Event.SheetBeforeRangeSort, eventParams); - if (eventParams.cancel) { - throw new Error('SortRangeCommand canceled.'); - } - } - - private _onRangeSorted(commandInfo: Readonly>): void { - const params = commandInfo.params!; - const fWorkbook = this.getUniverSheet(params.unitId)!; - const fWorksheet = fWorkbook.getSheetBySheetId(params.subUnitId)!; - const { startColumn, endColumn, startRow, endRow } = params.range; - const fRange = fWorksheet.getRange(startRow, startColumn, endRow - startRow + 1, endColumn - startColumn + 1); - const eventParams: ISheetRangeSortParams = { - workbook: fWorkbook, - worksheet: fWorksheet, - range: fRange, - sortColumn: params.orderRules.map((rule) => ({ - column: rule.colIndex - startColumn, - ascending: rule.type === SortType.ASC, - })), - }; - - this.fireEvent(this.Event.SheetRangeSorted, eventParams); - if (eventParams.cancel) { - throw new Error('SortRangeCommand canceled.'); - } - } -} - -FUniver.extend(FUniverSheetsSortEventMixin); -FEventName.extend(FSheetSortEventName); - +FEventName.extend(FSheetsSortEventNameMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FEventName extends IFSheetSortEventMixin { } - interface IEventParamConfig extends ISheetRangeSortEventParamConfig { } + interface FEventName extends IFSheetsSortEventNameMixin { } + interface IEventParamConfig extends ISheetsSortEventParamConfig { } } diff --git a/packages/sheets-sort/src/facade/f-range.ts b/packages/sheets-sort/src/facade/f-range.ts index 707215d8b4..b3e4e7ae74 100644 --- a/packages/sheets-sort/src/facade/f-range.ts +++ b/packages/sheets-sort/src/facade/f-range.ts @@ -23,7 +23,7 @@ export type SortColumnSpec = { column: number; ascending: boolean } | number; /** * @ignore */ -export interface IFRangeSort { +export interface IFRangeSheetsSortMixin { /** * Sorts the cells in the given range, by column(s) and order specified. * @param {SortColumnSpec | SortColumnSpec[]} column The column index with order or an array of column indexes with order. The range first column index is 0. @@ -47,7 +47,7 @@ export interface IFRangeSort { sort(column: SortColumnSpec | SortColumnSpec[]): FRange; } -export class FRangeSort extends FRange implements IFRangeSort { +export class FRangeSheetsSortMixin extends FRange implements IFRangeSheetsSortMixin { override sort(column: SortColumnSpec | SortColumnSpec[]): FRange { const columnBase = this._range.startColumn; const columns = Array.isArray(column) ? column : [column]; @@ -72,8 +72,8 @@ export class FRangeSort extends FRange implements IFRangeSort { } } -FRange.extend(FRangeSort); +FRange.extend(FRangeSheetsSortMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FRange extends IFRangeSort {} + interface FRange extends IFRangeSheetsSortMixin {} } diff --git a/packages/sheets-sort/src/facade/f-univer.ts b/packages/sheets-sort/src/facade/f-univer.ts new file mode 100644 index 0000000000..e376c0290e --- /dev/null +++ b/packages/sheets-sort/src/facade/f-univer.ts @@ -0,0 +1,97 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ICommandInfo, Injector } from '@univerjs/core'; +import type { ISortRangeCommandParams } from '@univerjs/sheets-sort'; +import type { ISheetsRangeSortEventParams } from './f-event'; +import { ICommandService } from '@univerjs/core'; +import { FUniver } from '@univerjs/core/facade'; +import { SortRangeCommand, SortType } from '@univerjs/sheets-sort'; + +export class FUniverSheetsSortMixin extends FUniver { + /** + * @ignore + */ + override _initialize(injector: Injector): void { + const commandService = injector.get(ICommandService); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.SheetBeforeRangeSort, + () => commandService.beforeCommandExecuted((commandInfo) => { + if (commandInfo.id !== SortRangeCommand.id) return; + this._beforeRangeSort(commandInfo as Readonly>); + }) + ) + ); + + this.disposeWithMe( + this.registerEventHandler( + this.Event.SheetRangeSorted, + () => commandService.onCommandExecuted((commandInfo) => { + if (commandInfo.id !== SortRangeCommand.id) return; + this._onRangeSorted(commandInfo as Readonly>); + }) + ) + ); + } + + private _beforeRangeSort(commandInfo: Readonly>): void { + const params = commandInfo.params!; + const fWorkbook = this.getUniverSheet(params.unitId)!; + const fWorksheet = fWorkbook.getSheetBySheetId(params.subUnitId)!; + const { startColumn, endColumn, startRow, endRow } = params.range; + const fRange = fWorksheet.getRange(startRow, startColumn, endRow - startRow + 1, endColumn - startColumn + 1); + const eventParams: ISheetsRangeSortEventParams = { + workbook: fWorkbook, + worksheet: fWorksheet, + range: fRange, + sortColumn: params.orderRules.map((rule) => ({ + column: rule.colIndex - startColumn, + ascending: rule.type === SortType.ASC, + })), + }; + + this.fireEvent(this.Event.SheetBeforeRangeSort, eventParams); + if (eventParams.cancel) { + throw new Error('SortRangeCommand canceled.'); + } + } + + private _onRangeSorted(commandInfo: Readonly>): void { + const params = commandInfo.params!; + const fWorkbook = this.getUniverSheet(params.unitId)!; + const fWorksheet = fWorkbook.getSheetBySheetId(params.subUnitId)!; + const { startColumn, endColumn, startRow, endRow } = params.range; + const fRange = fWorksheet.getRange(startRow, startColumn, endRow - startRow + 1, endColumn - startColumn + 1); + const eventParams: ISheetsRangeSortEventParams = { + workbook: fWorkbook, + worksheet: fWorksheet, + range: fRange, + sortColumn: params.orderRules.map((rule) => ({ + column: rule.colIndex - startColumn, + ascending: rule.type === SortType.ASC, + })), + }; + + this.fireEvent(this.Event.SheetRangeSorted, eventParams); + if (eventParams.cancel) { + throw new Error('SortRangeCommand canceled.'); + } + } +} + +FUniver.extend(FUniverSheetsSortMixin); diff --git a/packages/sheets-sort/src/facade/f-worksheet.ts b/packages/sheets-sort/src/facade/f-worksheet.ts index b24c4a334a..0bf1ac1ca0 100644 --- a/packages/sheets-sort/src/facade/f-worksheet.ts +++ b/packages/sheets-sort/src/facade/f-worksheet.ts @@ -23,7 +23,7 @@ import { FWorksheet } from '@univerjs/sheets/facade'; /** * @ignore */ -export interface IFWorksheetSort { +export interface IFWorksheetSortMixin { /** * Sort the worksheet by the specified column. * @param {number} colIndex The column index to sort by. @@ -44,7 +44,7 @@ export interface IFWorksheetSort { sort(colIndex: number, asc?: boolean): FWorksheet; } -export class FWorksheetSort extends FWorksheet implements IFWorksheetSort { +export class FWorksheetSortMixin extends FWorksheet implements IFWorksheetSortMixin { override sort(colIndex: number, asc = true): FWorksheet { const orderRules: IOrderRule[] = [{ colIndex, @@ -69,8 +69,8 @@ export class FWorksheetSort extends FWorksheet implements IFWorksheetSort { } } -FWorksheet.extend(FWorksheetSort); +FWorksheet.extend(FWorksheetSortMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FWorksheet extends IFWorksheetSort {} + interface FWorksheet extends IFWorksheetSortMixin {} } diff --git a/packages/sheets-sort/src/facade/index.ts b/packages/sheets-sort/src/facade/index.ts index 7ba06b9cee..b282b761fd 100644 --- a/packages/sheets-sort/src/facade/index.ts +++ b/packages/sheets-sort/src/facade/index.ts @@ -14,10 +14,12 @@ * limitations under the License. */ +import './f-univer'; import './f-range'; import './f-worksheet'; import './f-event'; export type * from './f-event'; export type * from './f-range'; +export type * from './f-univer'; export type * from './f-worksheet'; diff --git a/packages/sheets-table/src/facade/f-enum.ts b/packages/sheets-table/src/facade/f-enum.ts index 22a25e0a5a..a5c56a2f15 100644 --- a/packages/sheets-table/src/facade/f-enum.ts +++ b/packages/sheets-table/src/facade/f-enum.ts @@ -20,7 +20,7 @@ import { TableColumnFilterTypeEnum, TableConditionTypeEnum, TableDateCompareType /** * @ignore */ -export interface ITableEnumMixin { +export interface IFSheetsTableEnumMixin { TableColumnFilterTypeEnum: typeof TableColumnFilterTypeEnum; TableConditionTypeEnum: typeof TableConditionTypeEnum; TableNumberCompareTypeEnum: typeof TableNumberCompareTypeEnum; @@ -28,7 +28,7 @@ export interface ITableEnumMixin { TableDateCompareTypeEnum: typeof TableDateCompareTypeEnum; } -export class TableEnum extends FEnum implements ITableEnumMixin { +export class FSheetsTableEnumMixin extends FEnum implements IFSheetsTableEnumMixin { override get TableColumnFilterTypeEnum(): typeof TableColumnFilterTypeEnum { return TableColumnFilterTypeEnum; }; @@ -50,8 +50,8 @@ export class TableEnum extends FEnum implements ITableEnumMixin { } } -FEnum.extend(TableEnum); +FEnum.extend(FSheetsTableEnumMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FEnum extends ITableEnumMixin { } + interface FEnum extends IFSheetsTableEnumMixin { } } diff --git a/packages/sheets-table/src/facade/f-worksheet.ts b/packages/sheets-table/src/facade/f-worksheet.ts index 6f7db2b8bc..da7406efd1 100644 --- a/packages/sheets-table/src/facade/f-worksheet.ts +++ b/packages/sheets-table/src/facade/f-worksheet.ts @@ -40,7 +40,7 @@ import { FWorksheet } from '@univerjs/sheets/facade'; /** * @ignore */ -export interface IFWorkSheetTableMixin { +export interface IFWorksheetTableMixin { /** * Add a table to the worksheet * @param {string} tableName The table name @@ -344,7 +344,7 @@ export interface IFWorkSheetTableMixin { addTableTheme(tableId: string, themeStyleJSON: IRangeThemeStyleJSON): Promise; } -export class FWorkSheetTableMixin extends FWorksheet implements IFWorkSheetTableMixin { +export class FWorksheetTableMixin extends FWorksheet implements IFWorksheetTableMixin { override addTable(tableName: string, rangeInfo: ITableRange, tableId?: string, options?: ITableOptions): Promise | boolean { const subUnitId = this.getSheetId(); const workbook = this.getWorkbook(); @@ -469,8 +469,8 @@ export class FWorkSheetTableMixin extends FWorksheet implements IFWorkSheetTable } } -FWorksheet.extend(FWorkSheetTableMixin); +FWorksheet.extend(FWorksheetTableMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FWorksheet extends IFWorkSheetTableMixin { } + interface FWorksheet extends IFWorksheetTableMixin { } } diff --git a/packages/sheets-thread-comment/src/facade/__tests__/f-workbook.spec.ts b/packages/sheets-thread-comment/src/facade/__tests__/f-workbook.spec.ts index 302c9d9c9f..f75c8e1b5f 100644 --- a/packages/sheets-thread-comment/src/facade/__tests__/f-workbook.spec.ts +++ b/packages/sheets-thread-comment/src/facade/__tests__/f-workbook.spec.ts @@ -15,9 +15,9 @@ */ import { describe, expect, it, vi } from 'vitest'; -import { FWorkbookThreadCommentMixin } from '../f-workbook'; +import { FWorkbookSheetsThreadCommentMixin } from '../f-workbook'; -describe('FWorkbookThreadCommentMixin', () => { +describe('FWorkbookSheetsThreadCommentMixin', () => { it('should lazily resolve the thread comment model and create workbook comment facades', async () => { const rootComment = { id: 'comment-1' }; const deleteAsync = vi.fn(async () => true); @@ -25,7 +25,7 @@ describe('FWorkbookThreadCommentMixin', () => { const createInstance = vi.fn(() => ({ deleteAsync })); const get = vi.fn(() => ({ getUnit })); - const instance = Object.create(FWorkbookThreadCommentMixin.prototype) as any; + const instance = Object.create(FWorkbookSheetsThreadCommentMixin.prototype) as any; instance._injector = { get, createInstance }; instance._workbook = { getUnitId: () => 'unit-1' }; diff --git a/packages/sheets-thread-comment/src/facade/f-event.ts b/packages/sheets-thread-comment/src/facade/f-event.ts index 76a87abd8f..33d1940a9a 100644 --- a/packages/sheets-thread-comment/src/facade/f-event.ts +++ b/packages/sheets-thread-comment/src/facade/f-event.ts @@ -23,10 +23,10 @@ import { FEventName } from '@univerjs/core/facade'; /** * @ignore */ -interface ICommentEventMixin { +interface IFSheetsThreadCommentEventNameMixin { /** * Event fired after comment added - * @see {@link ISheetCommentAddEvent} + * @see {@link ISheetCommentAddEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.CommentAdded, (params) => { @@ -41,7 +41,7 @@ interface ICommentEventMixin { /** * Event fired before comment added - * @see {@link IBeforeSheetCommentAddEvent} + * @see {@link IBeforeSheetCommentAddEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeCommentAdd, (params) => { @@ -59,7 +59,7 @@ interface ICommentEventMixin { /** * Event fired after comment updated - * @see {@link ISheetCommentUpdateEvent} + * @see {@link ISheetCommentUpdateEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.CommentUpdated, (params) => { @@ -74,7 +74,7 @@ interface ICommentEventMixin { /** * Event fired before comment update - * @see {@link IBeforeSheetCommentUpdateEvent} + * @see {@link IBeforeSheetCommentUpdateEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeCommentUpdate, (params) => { @@ -92,7 +92,7 @@ interface ICommentEventMixin { /** * Event fired after comment deleted - * @see {@link ISheetCommentDeleteEvent} + * @see {@link ISheetCommentDeleteEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.CommentDeleted, (params) => { @@ -107,7 +107,7 @@ interface ICommentEventMixin { /** * Event fired before comment delete - * @see {@link IBeforeSheetCommentDeleteEvent} + * @see {@link IBeforeSheetCommentDeleteEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeCommentDelete, (params) => { @@ -125,7 +125,7 @@ interface ICommentEventMixin { /** * Event fired after comment resolve - * @see {@link ISheetCommentResolveEvent} + * @see {@link ISheetCommentResolveEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.CommentResolved, (params) => { @@ -140,7 +140,7 @@ interface ICommentEventMixin { /** * Event fired before comment resolve - * @see {@link ISheetCommentResolveEvent} + * @see {@link ISheetCommentResolveEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeCommentResolve, (params) => { @@ -157,63 +157,49 @@ interface ICommentEventMixin { readonly BeforeCommentResolve: 'BeforeCommentResolve'; } -const CommentEvent: ICommentEventMixin = { - CommentAdded: 'CommentAdded', - BeforeCommentAdd: 'BeforeCommentAdd', - - CommentUpdated: 'CommentUpdated', - BeforeCommentUpdate: 'BeforeCommentUpdate', - - CommentDeleted: 'CommentDeleted', - BeforeCommentDelete: 'BeforeCommentDelete', - - CommentResolved: 'CommentResolved', - BeforeCommentResolve: 'BeforeCommentResolve', -} as const; - /** * @ignore */ -export class FCommentEvent extends FEventName { +export class FSheetsThreadCommentEventNameMixin extends FEventName implements IFSheetsThreadCommentEventNameMixin { override get CommentAdded(): 'CommentAdded' { - return CommentEvent.CommentAdded; + return 'CommentAdded' as const; } override get BeforeCommentAdd(): 'BeforeCommentAdd' { - return CommentEvent.BeforeCommentAdd; + return 'BeforeCommentAdd' as const; } override get CommentUpdated(): 'CommentUpdated' { - return CommentEvent.CommentUpdated; + return 'CommentUpdated' as const; } override get BeforeCommentUpdate(): 'BeforeCommentUpdate' { - return CommentEvent.BeforeCommentUpdate; + return 'BeforeCommentUpdate' as const; } override get CommentDeleted(): 'CommentDeleted' { - return CommentEvent.CommentDeleted; + return 'CommentDeleted' as const; } override get BeforeCommentDelete(): 'BeforeCommentDelete' { - return CommentEvent.BeforeCommentDelete; + return 'BeforeCommentDelete' as const; } override get CommentResolved(): 'CommentResolved' { - return CommentEvent.CommentResolved; + return 'CommentResolved' as const; } override get BeforeCommentResolve(): 'BeforeCommentResolve' { - return CommentEvent.BeforeCommentResolve; + return 'BeforeCommentResolve' as const; } } /** * Event interface triggered after a comment is added to a sheet - * @interface ISheetCommentAddEvent + * @interface ISheetCommentAddEventParams * @augments {IEventBase} */ -export interface ISheetCommentAddEvent extends IEventBase { +export interface ISheetCommentAddEventParams extends IEventBase { /** The workbook instance */ workbook: FWorkbook; /** The worksheet where the comment is added */ @@ -228,10 +214,10 @@ export interface ISheetCommentAddEvent extends IEventBase { /** * Event interface triggered before a comment is added to a sheet - * @interface IBeforeSheetCommentAddEvent + * @interface IBeforeSheetCommentAddEventParams * @augments {IEventBase} */ -export interface IBeforeSheetCommentAddEvent extends IEventBase { +export interface IBeforeSheetCommentAddEventParams extends IEventBase { /** The workbook instance */ workbook: FWorkbook; /** The worksheet where the comment will be added */ @@ -246,10 +232,10 @@ export interface IBeforeSheetCommentAddEvent extends IEventBase { /** * Event interface triggered after a comment is updated in a sheet - * @interface ISheetCommentUpdateEvent + * @interface ISheetCommentUpdateEventParams * @augments {IEventBase} */ -export interface ISheetCommentUpdateEvent extends IEventBase { +export interface ISheetCommentUpdateEventParams extends IEventBase { /** The workbook instance */ workbook: FWorkbook; /** The worksheet containing the updated comment */ @@ -264,10 +250,10 @@ export interface ISheetCommentUpdateEvent extends IEventBase { /** * Event interface triggered before a comment is updated in a sheet - * @interface IBeforeSheetCommentUpdateEvent + * @interface IBeforeSheetCommentUpdateEventParams * @augments {IEventBase} */ -export interface IBeforeSheetCommentUpdateEvent extends IEventBase { +export interface IBeforeSheetCommentUpdateEventParams extends IEventBase { /** The workbook instance */ workbook: FWorkbook; /** The worksheet containing the comment */ @@ -284,10 +270,10 @@ export interface IBeforeSheetCommentUpdateEvent extends IEventBase { /** * Event interface triggered before a comment is deleted from a sheet - * @interface IBeforeSheetCommentDeleteEvent + * @interface IBeforeSheetCommentDeleteEventParams * @augments {IEventBase} */ -export interface IBeforeSheetCommentDeleteEvent extends IEventBase { +export interface IBeforeSheetCommentDeleteEventParams extends IEventBase { /** The workbook instance */ workbook: FWorkbook; /** The worksheet containing the comment */ @@ -302,10 +288,10 @@ export interface IBeforeSheetCommentDeleteEvent extends IEventBase { /** * Event interface triggered after a comment is deleted from a sheet - * @interface ISheetCommentDeleteEvent + * @interface ISheetCommentDeleteEventParams * @augments {IEventBase} */ -export interface ISheetCommentDeleteEvent extends IEventBase { +export interface ISheetCommentDeleteEventParams extends IEventBase { /** The workbook instance */ workbook: FWorkbook; /** The worksheet that contained the comment */ @@ -316,10 +302,10 @@ export interface ISheetCommentDeleteEvent extends IEventBase { /** * Event interface triggered when a comment's resolve status changes - * @interface ISheetCommentResolveEvent + * @interface ISheetCommentResolveEventParams * @augments {IEventBase} */ -export interface ISheetCommentResolveEvent extends IEventBase { +export interface ISheetCommentResolveEventParams extends IEventBase { /** The workbook instance */ workbook: FWorkbook; /** The worksheet containing the comment */ @@ -334,30 +320,27 @@ export interface ISheetCommentResolveEvent extends IEventBase { resolved: boolean; } -FEventName.extend(FCommentEvent); - /** * @ignore */ -export interface ISheetCommentEventConfig { - BeforeCommentAdd: IBeforeSheetCommentAddEvent; - CommentAdded: ISheetCommentAddEvent; +export interface ISheetsThreadCommentEventParamConfig { + BeforeCommentAdd: IBeforeSheetCommentAddEventParams; + CommentAdded: ISheetCommentAddEventParams; - BeforeCommentUpdate: IBeforeSheetCommentUpdateEvent; - CommentUpdated: ISheetCommentUpdateEvent; + BeforeCommentUpdate: IBeforeSheetCommentUpdateEventParams; + CommentUpdated: ISheetCommentUpdateEventParams; - BeforeCommentDelete: IBeforeSheetCommentDeleteEvent; - CommentDeleted: ISheetCommentDeleteEvent; + BeforeCommentDelete: IBeforeSheetCommentDeleteEventParams; + CommentDeleted: ISheetCommentDeleteEventParams; - BeforeCommentResolve: ISheetCommentResolveEvent; - CommentResolved: ISheetCommentResolveEvent; + BeforeCommentResolve: ISheetCommentResolveEventParams; + CommentResolved: ISheetCommentResolveEventParams; } +FEventName.extend(FSheetsThreadCommentEventNameMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FEventName extends ICommentEventMixin { - } + interface FEventName extends IFSheetsThreadCommentEventNameMixin {} - interface IEventParamConfig extends ISheetCommentEventConfig { - } + interface IEventParamConfig extends ISheetsThreadCommentEventParamConfig { } } diff --git a/packages/sheets-thread-comment/src/facade/f-range.ts b/packages/sheets-thread-comment/src/facade/f-range.ts index 44990ee7d9..894abd1c6c 100644 --- a/packages/sheets-thread-comment/src/facade/f-range.ts +++ b/packages/sheets-thread-comment/src/facade/f-range.ts @@ -25,7 +25,7 @@ import { FTheadCommentBuilder, FThreadComment } from './f-thread-comment'; /** * @ignore */ -export interface IFRangeCommentMixin { +export interface IFRangeSheetsThreadCommentMixin { /** * Get the comment of the start cell in the current range. * @returns {FThreadComment | null} The comment of the start cell in the current range. If the cell does not have a comment, return `null`. @@ -115,7 +115,7 @@ export interface IFRangeCommentMixin { /** * @ignore */ -export class FRangeCommentMixin extends FRange implements IFRangeCommentMixin { +export class FRangeSheetsThreadCommentMixin extends FRange implements IFRangeSheetsThreadCommentMixin { override getComment(): Nullable { const injector = this._injector; const sheetsTheadCommentModel = injector.get(SheetsThreadCommentModel); @@ -221,8 +221,8 @@ export class FRangeCommentMixin extends FRange implements IFRangeCommentMixin { } } -FRange.extend(FRangeCommentMixin); +FRange.extend(FRangeSheetsThreadCommentMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FRange extends IFRangeCommentMixin {} + interface FRange extends IFRangeSheetsThreadCommentMixin { } } diff --git a/packages/sheets-thread-comment/src/facade/f-univer.ts b/packages/sheets-thread-comment/src/facade/f-univer.ts index 054df85eaa..ae8b26d09f 100644 --- a/packages/sheets-thread-comment/src/facade/f-univer.ts +++ b/packages/sheets-thread-comment/src/facade/f-univer.ts @@ -14,10 +14,18 @@ * limitations under the License. */ -import type { IDisposable, Injector } from '@univerjs/core'; +import type { Injector } from '@univerjs/core'; import type { FWorkbook, FWorksheet } from '@univerjs/sheets/facade'; import type { IAddCommentCommandParams, IDeleteCommentCommandParams, IResolveCommentCommandParams, IThreadComment, IUpdateCommentCommandParams } from '@univerjs/thread-comment'; -import type { IBeforeSheetCommentAddEvent, IBeforeSheetCommentDeleteEvent, IBeforeSheetCommentUpdateEvent, ISheetCommentAddEvent, ISheetCommentDeleteEvent, ISheetCommentResolveEvent, ISheetCommentUpdateEvent } from './f-event'; +import type { + IBeforeSheetCommentAddEventParams, + IBeforeSheetCommentDeleteEventParams, + IBeforeSheetCommentUpdateEventParams, + ISheetCommentAddEventParams, + ISheetCommentDeleteEventParams, + ISheetCommentResolveEventParams, + ISheetCommentUpdateEventParams, +} from './f-event'; import { CanceledError, ICommandService, RichTextValue } from '@univerjs/core'; import { FUniver } from '@univerjs/core/facade'; import { deserializeRangeWithSheet } from '@univerjs/engine-formula'; @@ -27,27 +35,7 @@ import { FTheadCommentBuilder, FTheadCommentItem } from './f-thread-comment'; /** * @ignore */ -export interface IFUniverCommentMixin { - /** - * @deprecated use `univerAPI.addEvent(univerAPI.Event.CommentAdded, (params) => {})` as instead - */ - onCommentAdded(callback: (event: ISheetCommentAddEvent) => void): IDisposable; - - /** - * @deprecated use `univerAPI.addEvent(univerAPI.Event.CommentUpdated, (params) => {})` as instead - */ - onCommentUpdated(callback: (event: ISheetCommentUpdateEvent) => void): IDisposable; - - /** - * @deprecated use `univerAPI.addEvent(univerAPI.Event.CommentDeleted, (params) => {})` as instead - */ - onCommentDeleted(callback: (event: ISheetCommentDeleteEvent) => void): IDisposable; - - /** - * @deprecated use `univerAPI.addEvent(univerAPI.Event.CommentResolved, (params) => {})` as instead - */ - onCommentResolved(callback: (event: ISheetCommentResolveEvent) => void): IDisposable; - +export interface IFUniverSheetsThreadCommentMixin { /** * Create a new thread comment * @returns {FTheadCommentBuilder} The thead comment builder @@ -76,7 +64,7 @@ export interface IFUniverCommentMixin { /** * @ignore */ -export class FUniverCommentMixin extends FUniver implements IFUniverCommentMixin { +export class FUniverSheetsThreadCommentMixin extends FUniver implements IFUniverSheetsThreadCommentMixin { private _getTargetSheet(params: { unitId?: string; subUnitId?: string } = {}): { workbook: FWorkbook; worksheet: FWorksheet; @@ -109,16 +97,16 @@ export class FUniverCommentMixin extends FUniver implements IFUniverCommentMixin const { workbook, worksheet } = target; const { comment } = commandInfo.params as IAddCommentCommandParams; const threadComment = worksheet.getCommentById(comment.id); + if (!threadComment) return; - if (threadComment) { - this.fireEvent(this.Event.CommentAdded, { - workbook, - worksheet, - row: threadComment.getRange()?.getRow() ?? 0, - col: threadComment.getRange()?.getColumn() ?? 0, - comment: threadComment, - }); - } + const eventParams: ISheetCommentAddEventParams = { + workbook, + worksheet, + row: threadComment.getRange()?.getRow() ?? 0, + col: threadComment.getRange()?.getColumn() ?? 0, + comment: threadComment, + }; + this.fireEvent(this.Event.CommentAdded, eventParams); }) ) ); @@ -135,16 +123,16 @@ export class FUniverCommentMixin extends FUniver implements IFUniverCommentMixin const { workbook, worksheet } = target; const { payload } = commandInfo.params as IUpdateCommentCommandParams; const threadComment = worksheet.getCommentById(payload.commentId); + if (!threadComment) return; - if (threadComment) { - this.fireEvent(this.Event.CommentUpdated, { - workbook, - worksheet, - row: threadComment.getRange()?.getRow() ?? 0, - col: threadComment.getRange()?.getColumn() ?? 0, - comment: threadComment, - }); - } + const eventParams: ISheetCommentUpdateEventParams = { + workbook, + worksheet, + row: threadComment.getRange()?.getRow() ?? 0, + col: threadComment.getRange()?.getColumn() ?? 0, + comment: threadComment, + }; + this.fireEvent(this.Event.CommentUpdated, eventParams); }) ) ); @@ -161,11 +149,12 @@ export class FUniverCommentMixin extends FUniver implements IFUniverCommentMixin const { workbook, worksheet } = target; const { commentId } = commandInfo.params as IDeleteCommentCommandParams; - this.fireEvent(this.Event.CommentDeleted, { + const eventParams: ISheetCommentDeleteEventParams = { workbook, worksheet, commentId, - }); + }; + this.fireEvent(this.Event.CommentDeleted, eventParams); }) ) ); @@ -182,17 +171,17 @@ export class FUniverCommentMixin extends FUniver implements IFUniverCommentMixin const { workbook, worksheet } = target; const { commentId, resolved } = commandInfo.params as IResolveCommentCommandParams; const threadComment = worksheet.getCommentById(commentId); + if (!threadComment) return; - if (threadComment) { - this.fireEvent(this.Event.CommentResolved, { - workbook, - worksheet, - row: threadComment.getRange()?.getRow() ?? 0, - col: threadComment.getRange()?.getColumn() ?? 0, - comment: threadComment, - resolved, - }); - } + const eventParams: ISheetCommentResolveEventParams = { + workbook, + worksheet, + row: threadComment.getRange()?.getRow() ?? 0, + col: threadComment.getRange()?.getColumn() ?? 0, + comment: threadComment, + resolved, + }; + this.fireEvent(this.Event.CommentResolved, eventParams); }) ) ); @@ -211,14 +200,13 @@ export class FUniverCommentMixin extends FUniver implements IFUniverCommentMixin const { comment } = commandInfo.params as IAddCommentCommandParams; const { range } = deserializeRangeWithSheet(comment.ref); - const eventParams: IBeforeSheetCommentAddEvent = { + const eventParams: IBeforeSheetCommentAddEventParams = { workbook, worksheet, row: range.startRow, col: range.startColumn, comment: FTheadCommentItem.create(comment), }; - this.fireEvent(this.Event.BeforeCommentAdd, eventParams); if (eventParams.cancel) { throw new CanceledError(); @@ -239,20 +227,19 @@ export class FUniverCommentMixin extends FUniver implements IFUniverCommentMixin const { workbook, worksheet } = target; const { payload } = commandInfo.params as IUpdateCommentCommandParams; const threadComment = worksheet.getCommentById(payload.commentId); + if (!threadComment) return; - if (threadComment) { - const eventParams: IBeforeSheetCommentUpdateEvent = { - workbook, - worksheet, - row: threadComment.getRange()?.getRow() ?? 0, - col: threadComment.getRange()?.getColumn() ?? 0, - comment: threadComment, - newContent: RichTextValue.createByBody(payload.text), - }; - this.fireEvent(this.Event.BeforeCommentUpdate, eventParams); - if (eventParams.cancel) { - throw new CanceledError(); - } + const eventParams: IBeforeSheetCommentUpdateEventParams = { + workbook, + worksheet, + row: threadComment.getRange()?.getRow() ?? 0, + col: threadComment.getRange()?.getColumn() ?? 0, + comment: threadComment, + newContent: RichTextValue.createByBody(payload.text), + }; + this.fireEvent(this.Event.BeforeCommentUpdate, eventParams); + if (eventParams.cancel) { + throw new CanceledError(); } }) ) @@ -270,19 +257,18 @@ export class FUniverCommentMixin extends FUniver implements IFUniverCommentMixin const { workbook, worksheet } = target; const { commentId } = commandInfo.params as IDeleteCommentCommandParams; const threadComment = worksheet.getCommentById(commentId); + if (!threadComment) return; - if (threadComment) { - const eventParams: IBeforeSheetCommentDeleteEvent = { - workbook, - worksheet, - row: threadComment.getRange()?.getRow() ?? 0, - col: threadComment.getRange()?.getColumn() ?? 0, - comment: threadComment, - }; - this.fireEvent(this.Event.BeforeCommentDelete, eventParams); - if (eventParams.cancel) { - throw new CanceledError(); - } + const eventParams: IBeforeSheetCommentDeleteEventParams = { + workbook, + worksheet, + row: threadComment.getRange()?.getRow() ?? 0, + col: threadComment.getRange()?.getColumn() ?? 0, + comment: threadComment, + }; + this.fireEvent(this.Event.BeforeCommentDelete, eventParams); + if (eventParams.cancel) { + throw new CanceledError(); } }) ) @@ -300,20 +286,19 @@ export class FUniverCommentMixin extends FUniver implements IFUniverCommentMixin const { workbook, worksheet } = target; const { commentId, resolved } = commandInfo.params as IResolveCommentCommandParams; const threadComment = worksheet.getCommentById(commentId); + if (!threadComment) return; - if (threadComment) { - const eventParams: ISheetCommentResolveEvent = { - workbook, - worksheet, - row: threadComment.getRange()!.getRow() ?? 0, - col: threadComment.getRange()!.getColumn() ?? 0, - comment: threadComment, - resolved, - }; - this.fireEvent(this.Event.BeforeCommentResolve, eventParams); - if (eventParams.cancel) { - throw new CanceledError(); - } + const eventParams: ISheetCommentResolveEventParams = { + workbook, + worksheet, + row: threadComment.getRange()!.getRow() ?? 0, + col: threadComment.getRange()!.getColumn() ?? 0, + comment: threadComment, + resolved, + }; + this.fireEvent(this.Event.BeforeCommentResolve, eventParams); + if (eventParams.cancel) { + throw new CanceledError(); } }) ) @@ -328,9 +313,9 @@ export class FUniverCommentMixin extends FUniver implements IFUniverCommentMixin } } -FUniver.extend(FUniverCommentMixin); +FUniver.extend(FUniverSheetsThreadCommentMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FUniver extends IFUniverCommentMixin {} + interface FUniver extends IFUniverSheetsThreadCommentMixin {} } diff --git a/packages/sheets-thread-comment/src/facade/f-workbook.ts b/packages/sheets-thread-comment/src/facade/f-workbook.ts index 637d2678c2..c0e8b8bc88 100644 --- a/packages/sheets-thread-comment/src/facade/f-workbook.ts +++ b/packages/sheets-thread-comment/src/facade/f-workbook.ts @@ -28,7 +28,7 @@ type IUpdateCommandParams = any; /** * @ignore */ -export interface IFWorkbookThreadCommentMixin { +export interface IFWorkbookSheetsThreadCommentMixin { /** * Get all comments in the current workbook * @returns {FThreadComment[]} All comments in the current workbook @@ -97,7 +97,7 @@ export interface IFWorkbookThreadCommentMixin { /** * @ignore */ -export class FWorkbookThreadCommentMixin extends FWorkbook implements IFWorkbookThreadCommentMixin { +export class FWorkbookSheetsThreadCommentMixin extends FWorkbook implements IFWorkbookSheetsThreadCommentMixin { declare _threadCommentModel: ThreadCommentModel; /** @@ -187,8 +187,8 @@ export class FWorkbookThreadCommentMixin extends FWorkbook implements IFWorkbook } } -FWorkbook.extend(FWorkbookThreadCommentMixin); +FWorkbook.extend(FWorkbookSheetsThreadCommentMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FWorkbook extends IFWorkbookThreadCommentMixin {} + interface FWorkbook extends IFWorkbookSheetsThreadCommentMixin {} } diff --git a/packages/sheets-ui/src/commands/commands/__tests__/auto-fill.controller.spec.ts b/packages/sheets-ui/src/commands/commands/__tests__/auto-fill.controller.spec.ts index d6152a5c31..d383a056da 100644 --- a/packages/sheets-ui/src/commands/commands/__tests__/auto-fill.controller.spec.ts +++ b/packages/sheets-ui/src/commands/commands/__tests__/auto-fill.controller.spec.ts @@ -41,6 +41,7 @@ import { RemoveWorksheetMergeMutation, SetRangeValuesMutation, SetSelectionsOperation, + SheetSkeletonService, SheetsSelectionsService, } from '@univerjs/sheets'; import { IPlatformService, IShortcutService, PlatformService, ShortcutService } from '@univerjs/ui'; @@ -287,6 +288,7 @@ describe('Test auto fill rules in controller', () => { const testBed = createCommandTestBed(TEST_WORKBOOK_DATA, [ [DocSelectionManagerService], [ISheetSelectionRenderService, { useClass: SheetSelectionRenderService }], + [SheetSkeletonService], [IAutoFillService, { useClass: AutoFillService }], [IShortcutService, { useClass: ShortcutService }], [IPlatformService, { useClass: PlatformService }], diff --git a/packages/sheets-ui/src/commands/commands/__tests__/create-selection-command-test-bed.ts b/packages/sheets-ui/src/commands/commands/__tests__/create-selection-command-test-bed.ts index ee0977c564..4dea97808c 100644 --- a/packages/sheets-ui/src/commands/commands/__tests__/create-selection-command-test-bed.ts +++ b/packages/sheets-ui/src/commands/commands/__tests__/create-selection-command-test-bed.ts @@ -15,10 +15,9 @@ */ import type { IWorkbookData } from '@univerjs/core'; -import { Disposable, DisposableCollection, ICommandService, LocaleType, UniverInstanceType } from '@univerjs/core'; +import { Disposable, DisposableCollection, ICommandService, IUniverInstanceService, LocaleType, UniverInstanceType } from '@univerjs/core'; import { IRenderManagerService, RenderManagerService } from '@univerjs/engine-render'; import { CancelFrozenCommand, SetFrozenMutation, SetSelectionsOperation, SheetSkeletonService } from '@univerjs/sheets'; - import { BehaviorSubject } from 'rxjs'; import { SheetScrollManagerService } from '../../../services/scroll-manager.service'; import { SelectAllService } from '../../../services/select-all/select-all.service'; @@ -198,7 +197,7 @@ export function createFrozenCommandTestBed(workbookData?: IWorkbookData) { const injector = univer.__getInjector(); injector.add([SheetSkeletonService]); // NOTE: this is a hack. Please refer to ./services/clipboard/__tests__/clipboard-test-bed.ts - const mockSheetSkService = new SheetSkeletonService(injector); + const mockSheetSkService = new SheetSkeletonService(injector, get(IUniverInstanceService)); const fakeSheetSkeletonManagerService = new SheetSkeletonManagerService({ unit: sheet, unitId, @@ -212,7 +211,7 @@ export function createFrozenCommandTestBed(workbookData?: IWorkbookData) { activated$: new BehaviorSubject(true), activate: () => {}, deactivate: () => {}, - }, injector, injector.get(SheetSkeletonService)); + }, injector.get(SheetSkeletonService)); injector.add([SheetSkeletonManagerService, { useValue: fakeSheetSkeletonManagerService }]); injector.get(IRenderManagerService).addRender(unitId, { diff --git a/packages/sheets-ui/src/common/utils.ts b/packages/sheets-ui/src/common/utils.ts index 72d6992d42..c1e44fbaa3 100644 --- a/packages/sheets-ui/src/common/utils.ts +++ b/packages/sheets-ui/src/common/utils.ts @@ -17,8 +17,7 @@ import type { IPosition, IRange, Workbook, Worksheet } from '@univerjs/core'; import type { IBoundRectNoAngle, IRender, Scene, SpreadsheetSkeleton } from '@univerjs/engine-render'; import type { ICollaborator } from '@univerjs/protocol'; -import type { ISheetLocation } from '@univerjs/sheets'; -import type { ISheetSkeletonManagerParam } from '../services/sheet-skeleton-manager.service'; +import type { ISheetLocation, ISheetSkeletonManagerParam } from '@univerjs/sheets'; import { SHEET_VIEWPORT_KEY, Vector2 } from '@univerjs/engine-render'; export function getUserListEqual(userList1: ICollaborator[], userList2: ICollaborator[]) { diff --git a/packages/sheets-ui/src/controllers/__tests__/auto-height.controller.spec.ts b/packages/sheets-ui/src/controllers/__tests__/auto-height.controller.spec.ts index b0cf7b294b..a4609dd0c6 100644 --- a/packages/sheets-ui/src/controllers/__tests__/auto-height.controller.spec.ts +++ b/packages/sheets-ui/src/controllers/__tests__/auto-height.controller.spec.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import type { IConfigService, IUniverInstanceService, Workbook } from '@univerjs/core'; +import type { IUniverInstanceService, Workbook } from '@univerjs/core'; import type { RenderManagerService } from '@univerjs/engine-render'; -import type { SheetInterceptorService, SheetsSelectionsService } from '@univerjs/sheets'; +import type { SheetInterceptorService } from '@univerjs/sheets'; import { CancelMarkDirtyRowAutoHeightMutation, MarkDirtyRowAutoHeightMutation, @@ -62,9 +62,7 @@ describe('AutoHeightController', () => { const controller = new AutoHeightController( renderManagerService, sheetInterceptorService, - { } as unknown as SheetsSelectionsService, - univerInstanceService, - {} as IConfigService + univerInstanceService ); expect(controller).toBeTruthy(); diff --git a/packages/sheets-ui/src/controllers/auto-height.controller.ts b/packages/sheets-ui/src/controllers/auto-height.controller.ts index b14bac4150..874fa31dd9 100644 --- a/packages/sheets-ui/src/controllers/auto-height.controller.ts +++ b/packages/sheets-ui/src/controllers/auto-height.controller.ts @@ -14,10 +14,9 @@ * limitations under the License. */ -import type { IRange, ObjectMatrix, Workbook } from '@univerjs/core'; -import type { RenderManagerService } from '@univerjs/engine-render'; +import type { IMutationInfo, IRange, ObjectMatrix, Workbook } from '@univerjs/core'; import type { ISetWorksheetRowAutoHeightMutationParams } from '@univerjs/sheets'; -import { Disposable, generateRandomId, IConfigService, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; +import { Disposable, generateRandomId, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; import { CancelMarkDirtyRowAutoHeightMutation, @@ -26,30 +25,20 @@ import { SetWorksheetRowAutoHeightMutation, SetWorksheetRowAutoHeightMutationFactory, SheetInterceptorService, - SheetsSelectionsService, } from '@univerjs/sheets'; import { SheetSkeletonManagerService } from '../services/sheet-skeleton-manager.service'; -interface IAutoHeightParams { - cellHeights?: ObjectMatrix; - autoHeightRanges?: IRange[]; - lazyAutoHeightRanges?: IRange[]; - ranges: IRange[]; -} - export class AutoHeightController extends Disposable { constructor( - @IRenderManagerService private readonly _renderManagerService: RenderManagerService, + @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService, - @Inject(SheetsSelectionsService) private readonly _selectionManagerService: SheetsSelectionsService, - @Inject(IUniverInstanceService) private readonly _univerInstanceService: IUniverInstanceService, - @IConfigService private readonly _configService: IConfigService + @Inject(IUniverInstanceService) private readonly _univerInstanceService: IUniverInstanceService ) { super(); this._initialize(); } - private _processLazyAutoHeight(redoUndoItem: { redos: any[]; undos: any[] }, unitId: string, subUnitId: string, lazyAutoHeightRanges?: IRange[]) { + private _processLazyAutoHeight(redoUndoItem: { redos: IMutationInfo[]; undos: IMutationInfo[] }, unitId: string, subUnitId: string, lazyAutoHeightRanges?: IRange[]) { if (lazyAutoHeightRanges?.length) { const redo = { id: MarkDirtyRowAutoHeightMutation.id, @@ -84,7 +73,7 @@ export class AutoHeightController extends Disposable { return redoUndoItem; } - getUndoRedoParamsOfAutoHeight(ranges: IRange[], subUnitIdParam?: string, currentCellHeights?: ObjectMatrix): { redos: any[]; undos: any[] } { + getUndoRedoParamsOfAutoHeight(ranges: IRange[], subUnitIdParam?: string, currentCellHeights?: ObjectMatrix): { redos: IMutationInfo[]; undos: IMutationInfo[] } { const { _univerInstanceService: univerInstanceService } = this; const workbook = univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET)!; diff --git a/packages/sheets-ui/src/controllers/cell-custom-render.controller.ts b/packages/sheets-ui/src/controllers/cell-custom-render.controller.ts index 495c218cda..db5101c7ff 100644 --- a/packages/sheets-ui/src/controllers/cell-custom-render.controller.ts +++ b/packages/sheets-ui/src/controllers/cell-custom-render.controller.ts @@ -16,8 +16,7 @@ import type { ICellCustomRender, ICellDataForSheetInterceptor, ICellRenderContext, Nullable, Workbook } from '@univerjs/core'; import type { IMouseEvent, IPointerEvent, IRenderContext, IRenderModule, RenderManagerService, Spreadsheet } from '@univerjs/engine-render'; -import type { ICellPermission } from '@univerjs/sheets'; -import type { ISheetSkeletonManagerParam } from '../services/sheet-skeleton-manager.service'; +import type { ICellPermission, ISheetSkeletonManagerParam } from '@univerjs/sheets'; import { Disposable, DisposableCollection, fromEventSubject, Inject, IPermissionService, sortRules } from '@univerjs/core'; import { IRenderManagerService, Vector2 } from '@univerjs/engine-render'; import { UnitAction, WorkbookEditablePermission, WorksheetEditPermission } from '@univerjs/sheets'; diff --git a/packages/sheets-ui/src/controllers/drag-render.controller.ts b/packages/sheets-ui/src/controllers/drag-render.controller.ts index da66994b88..1d8dd51bbd 100644 --- a/packages/sheets-ui/src/controllers/drag-render.controller.ts +++ b/packages/sheets-ui/src/controllers/drag-render.controller.ts @@ -16,7 +16,7 @@ import type { Nullable, Workbook } from '@univerjs/core'; import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; -import type { ISheetSkeletonManagerParam } from '../services/sheet-skeleton-manager.service'; +import type { ISheetSkeletonManagerParam } from '@univerjs/sheets'; import { Disposable, DisposableCollection, Inject } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; import { DragManagerService } from '../services/drag-manager.service'; diff --git a/packages/sheets-ui/src/controllers/hover-render.controller.ts b/packages/sheets-ui/src/controllers/hover-render.controller.ts index 265d8f1c5f..16f7bab2bb 100644 --- a/packages/sheets-ui/src/controllers/hover-render.controller.ts +++ b/packages/sheets-ui/src/controllers/hover-render.controller.ts @@ -16,7 +16,7 @@ import type { Nullable, Workbook } from '@univerjs/core'; import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; -import type { ISheetSkeletonManagerParam } from '../services/sheet-skeleton-manager.service'; +import type { ISheetSkeletonManagerParam } from '@univerjs/sheets'; import { Disposable, DisposableCollection, fromEventSubject, Inject } from '@univerjs/core'; import { SHEET_VIEW_KEY } from '../common/keys'; import { HoverManagerService } from '../services/hover-manager.service'; diff --git a/packages/sheets-ui/src/controllers/render-controllers/contextmenu.render-controller.ts b/packages/sheets-ui/src/controllers/render-controllers/contextmenu.render-controller.ts index 8e4b6fbf20..261d268892 100644 --- a/packages/sheets-ui/src/controllers/render-controllers/contextmenu.render-controller.ts +++ b/packages/sheets-ui/src/controllers/render-controllers/contextmenu.render-controller.ts @@ -21,12 +21,10 @@ import { Inject, RANGE_TYPE, } from '@univerjs/core'; -import { SheetsSelectionsService } from '@univerjs/sheets'; +import { attachSelectionWithCoord, SheetsSelectionsService } from '@univerjs/sheets'; import { ContextMenuPosition, IContextMenuService } from '@univerjs/ui'; - import { SHEET_VIEW_KEY } from '../../common/keys'; import { ISheetSelectionRenderService } from '../../services/selection/base-selection-render.service'; -import { attachSelectionWithCoord } from '../../services/selection/util'; /** * This controller subscribe to context menu events in sheet rendering views and invoke context menu at a correct diff --git a/packages/sheets-ui/src/controllers/render-controllers/header-move.render-controller.ts b/packages/sheets-ui/src/controllers/render-controllers/header-move.render-controller.ts index b366565f9a..c04a8c85c2 100644 --- a/packages/sheets-ui/src/controllers/render-controllers/header-move.render-controller.ts +++ b/packages/sheets-ui/src/controllers/render-controllers/header-move.render-controller.ts @@ -39,6 +39,7 @@ import { Vector2, } from '@univerjs/engine-render'; import { + attachRangeWithCoord, MoveColsCommand, MoveRowsCommand, SheetsSelectionsService, @@ -384,7 +385,7 @@ export class HeaderMoveRenderController extends Disposable implements IRenderMod const { startX: cellStartX, startY: cellStartY, endX: cellEndX, endY: cellEndY } = startCell; - const selectionWithCoord = this._sheetSkeletonManagerService.attachRangeWithCoord(matchSelectionData.range); + const selectionWithCoord = attachRangeWithCoord(skeleton, matchSelectionData.range); if (selectionWithCoord == null) { return; diff --git a/packages/sheets-ui/src/controllers/render-controllers/header-resize.render-controller.ts b/packages/sheets-ui/src/controllers/render-controllers/header-resize.render-controller.ts index e82cf09d00..a2fdb80639 100644 --- a/packages/sheets-ui/src/controllers/render-controllers/header-resize.render-controller.ts +++ b/packages/sheets-ui/src/controllers/render-controllers/header-resize.render-controller.ts @@ -21,7 +21,7 @@ import type { EventState, IRange, Nullable, Workbook } from '@univerjs/core'; import type { IMouseEvent, IPointerEvent, IRenderContext, IRenderModule, SpreadsheetColumnHeader, SpreadsheetHeader } from '@univerjs/engine-render'; import type { IDeltaColumnWidthCommandParams, - IDeltaRowHeightCommand, + IDeltaRowHeightCommandParams, ISetWorksheetRowIsAutoHeightCommandParams, } from '@univerjs/sheets'; import type { ISetWorksheetColIsAutoWidthCommandParams } from '../../commands/commands/set-worksheet-auto-col-width.command'; @@ -461,7 +461,7 @@ export class HeaderResizeRenderController extends Disposable implements IRenderM this._columnResizeRect?.hide(); if (initialType === HEADER_RESIZE_TYPE.ROW) { - this._commandService.executeCommand(DeltaRowHeightCommand.id, { + this._commandService.executeCommand(DeltaRowHeightCommand.id, { deltaY: moveChangeY, anchorRow: this._currentRow, }); diff --git a/packages/sheets-ui/src/controllers/render-controllers/mobile/mobile-header-resize.render-controller.ts b/packages/sheets-ui/src/controllers/render-controllers/mobile/mobile-header-resize.render-controller.ts index b34cbbcd35..80daf7cedd 100644 --- a/packages/sheets-ui/src/controllers/render-controllers/mobile/mobile-header-resize.render-controller.ts +++ b/packages/sheets-ui/src/controllers/render-controllers/mobile/mobile-header-resize.render-controller.ts @@ -30,6 +30,7 @@ import { } from '@univerjs/core'; import { Rect } from '@univerjs/engine-render'; import { + attachSelectionWithCoord, DeltaColumnWidthCommand, DeltaRowHeightCommand, SheetsSelectionsService, @@ -37,7 +38,6 @@ import { import { SHEET_COMPONENT_HEADER_LAYER_INDEX } from '../../../common/keys'; import { MOBILE_EXPANDING_SELECTION, MOBILE_PINCH_ZOOMING } from '../../../consts/mobile-context'; import { SheetScrollManagerService } from '../../../services/scroll-manager.service'; -import { attachSelectionWithCoord } from '../../../services/selection/util'; import { SheetSkeletonManagerService } from '../../../services/sheet-skeleton-manager.service'; import { HEADER_MENU_SHAPE_SIZE, diff --git a/packages/sheets-ui/src/controllers/render-controllers/mobile/mobile-scroll.render-controller.ts b/packages/sheets-ui/src/controllers/render-controllers/mobile/mobile-scroll.render-controller.ts index 255376b530..c4bba0b6ac 100644 --- a/packages/sheets-ui/src/controllers/render-controllers/mobile/mobile-scroll.render-controller.ts +++ b/packages/sheets-ui/src/controllers/render-controllers/mobile/mobile-scroll.render-controller.ts @@ -16,11 +16,9 @@ import type { IFreeze, IRange, IWorksheetData, Nullable, Workbook } from '@univerjs/core'; import type { IMouseEvent, IPoint, IPointerEvent, IRenderContext, IRenderModule, IScrollObserverParam } from '@univerjs/engine-render'; -import type { IScrollToCellOperationParams } from '@univerjs/sheets'; +import type { IScrollToCellOperationParams, ISheetSkeletonManagerParam } from '@univerjs/sheets'; import type { IExpandSelectionCommandParams } from '../../../commands/commands/set-selection.command'; import type { IScrollState, IScrollStateSearchParam, IViewportScrollState } from '../../../services/scroll-manager.service'; - -import type { ISheetSkeletonManagerParam } from '../../../services/sheet-skeleton-manager.service'; import { Direction, Disposable, diff --git a/packages/sheets-ui/src/controllers/render-controllers/scroll.render-controller.ts b/packages/sheets-ui/src/controllers/render-controllers/scroll.render-controller.ts index e6ddebcb69..f14e0b6c29 100644 --- a/packages/sheets-ui/src/controllers/render-controllers/scroll.render-controller.ts +++ b/packages/sheets-ui/src/controllers/render-controllers/scroll.render-controller.ts @@ -20,8 +20,6 @@ import type { IScrollToCellOperationParams, ISetSelectionsOperationParams, Sheet import type { IScrollCommandParams } from '../../commands/commands/set-scroll.command'; import type { IExpandSelectionCommandParams } from '../../commands/commands/set-selection.command'; import type { IScrollState, IScrollStateSearchParam, IViewportScrollState } from '../../services/scroll-manager.service'; - -import type { ISheetSkeletonManagerParam } from '../../services/sheet-skeleton-manager.service'; import { Direction, Disposable, @@ -37,13 +35,11 @@ import { import { IRenderManagerService, RENDER_CLASS_TYPE, SHEET_VIEWPORT_KEY } from '@univerjs/engine-render'; import { getSelectionsService, ScrollToCellOperation, SetSelectionsOperation } from '@univerjs/sheets'; import { ScrollCommand, SetScrollRelativeCommand } from '../../commands/commands/set-scroll.command'; -import { ExpandSelectionCommand, MoveSelectionCommand, MoveSelectionEnterAndTabCommand } from '../../commands/commands/set-selection.command'; +import { ExpandSelectionCommand } from '../../commands/commands/set-selection.command'; import { SheetScrollManagerService } from '../../services/scroll-manager.service'; import { SheetSkeletonManagerService } from '../../services/sheet-skeleton-manager.service'; import { getSheetObject } from '../utils/component-tools'; -const SHEET_NAVIGATION_COMMANDS = [MoveSelectionCommand.id, MoveSelectionEnterAndTabCommand.id]; - const MOUSE_WHEEL_SPEED_SMOOTHING_FACTOR = 3; /** * This controller handles scroll logic in sheet interaction. @@ -229,17 +225,14 @@ export class SheetsScrollRenderController extends Disposable implements IRenderM if (skeleton == null || sheetObject == null) { return; } + const { viewportScrollX = 0, viewportScrollY = 0 } = param; - - const freeze = this._getFreeze(); - const { row, column, rowOffset, columnOffset } = skeleton.getOffsetRelativeToRowCol( viewportScrollX, viewportScrollY ); // NOT same as SetScrollRelativeCommand. that was exec in sheetRenderController - // const freeze = this._getFreeze(); this._commandService.executeCommand(ScrollCommand.id, { sheetViewStartRow: row, sheetViewStartColumn: column, @@ -466,34 +459,6 @@ export class SheetsScrollRenderController extends Disposable implements IRenderM return snapshot.freeze; } - private _updateSceneSize(param: ISheetSkeletonManagerParam) { - if (param == null) { - return; - } - - const { unitId } = this._context; - const { skeleton } = param; - const scene = this._renderManagerService.getRenderById(unitId)?.scene; - - if (skeleton == null || scene == null) { - return; - } - - const { rowTotalHeight, columnTotalWidth, rowHeaderWidthAndMarginLeft, columnHeaderHeightAndMarginTop } = - skeleton; - const workbook = this._context.unit; - const worksheet = workbook.getActiveSheet(); - if (!worksheet) return; - - // @TODO lumixraku why handle zoom in scroll.render-controller ??? - // const zoomRatio = worksheet.getZoomRatio() || 1; - // scene?.setScaleValueOnly(zoomRatio, zoomRatio); - scene?.transformByState({ - width: rowHeaderWidthAndMarginLeft + columnTotalWidth, - height: columnHeaderHeightAndMarginTop + rowTotalHeight, - }); - } - private _getSheetObject() { return getSheetObject(this._context.unit, this._context); } diff --git a/packages/sheets-ui/src/controllers/render-controllers/skeleton.render-controller.ts b/packages/sheets-ui/src/controllers/render-controllers/skeleton.render-controller.ts index 56d369a32a..07f29ec317 100644 --- a/packages/sheets-ui/src/controllers/render-controllers/skeleton.render-controller.ts +++ b/packages/sheets-ui/src/controllers/render-controllers/skeleton.render-controller.ts @@ -16,7 +16,7 @@ import type { Nullable, Workbook } from '@univerjs/core'; import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; -import type { ISheetSkeletonManagerParam } from '../../services/sheet-skeleton-manager.service'; +import type { ISheetSkeletonManagerParam } from '@univerjs/sheets'; import { Disposable, Inject } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; import { SheetSkeletonManagerService } from '../../services/sheet-skeleton-manager.service'; @@ -29,10 +29,6 @@ export class SheetSkeletonRenderController extends Disposable implements IRender ) { super(); - this.disposeWithMe(this._context.unit.sheetDisposed$.subscribe((sheet) => { - this._sheetSkeletonManagerService.disposeSkeleton(sheet.getSheetId()); - })); - this._sheetSkeletonManagerService.currentSkeleton$.subscribe((param: Nullable) => { this._updateSceneSize(param); }); diff --git a/packages/sheets-ui/src/facade/__tests__/create-test-bed.ts b/packages/sheets-ui/src/facade/__tests__/create-test-bed.ts index 1af6ac05ba..98d6115114 100644 --- a/packages/sheets-ui/src/facade/__tests__/create-test-bed.ts +++ b/packages/sheets-ui/src/facade/__tests__/create-test-bed.ts @@ -35,6 +35,7 @@ import { Engine, IRenderingEngine, IRenderManagerService, RenderManagerService } import { SheetInterceptorService, + SheetSkeletonService, } from '@univerjs/sheets'; import '../f-sheet-hooks'; @@ -124,6 +125,7 @@ export function createFacadeTestBed(workbookData?: IWorkbookData, dependencies?: override onStarting(): void { const injector = this._injector; injector.add([SheetInterceptorService]); + injector.add([SheetSkeletonService]); injector.add([IRenderingEngine, { useFactory: () => new Engine() }]); injector.add([IRenderManagerService, { useClass: RenderManagerServiceTestBed }]); injector.add([LexerTreeBuilder]); diff --git a/packages/sheets-ui/src/facade/__tests__/f-event.spec.ts b/packages/sheets-ui/src/facade/__tests__/f-event.spec.ts deleted file mode 100644 index b930a4d5c9..0000000000 --- a/packages/sheets-ui/src/facade/__tests__/f-event.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright 2023-present DreamNum Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { FEventName } from '@univerjs/core/facade'; -import { describe, expect, it } from 'vitest'; -import { CellFEventName, FSheetsUIEventName } from '../f-event'; - -describe('FSheetsUIEventName', () => { - it('returns stable event keys for sheet-ui events', () => { - const events = new FSheetsUIEventName(); - - expect(events.BeforeClipboardChange).toBe('BeforeClipboardChange'); - expect(events.ClipboardChanged).toBe('ClipboardChanged'); - expect(events.BeforeClipboardPaste).toBe('BeforeClipboardPaste'); - expect(events.ClipboardPasted).toBe('ClipboardPasted'); - expect(events.BeforeSheetEditStart).toBe('BeforeSheetEditStart'); - expect(events.SheetEditStarted).toBe('SheetEditStarted'); - expect(events.SheetEditChanging).toBe('SheetEditChanging'); - expect(events.BeforeSheetEditEnd).toBe('BeforeSheetEditEnd'); - expect(events.SheetEditEnded).toBe('SheetEditEnded'); - - expect(events.CellClicked).toBe(CellFEventName.CellClicked); - expect(events.CellPointerDown).toBe(CellFEventName.CellPointerDown); - expect(events.CellPointerUp).toBe(CellFEventName.CellPointerUp); - expect(events.CellPointerMove).toBe(CellFEventName.CellPointerMove); - expect(events.CellHover).toBe(CellFEventName.CellHover); - - expect(events.RowHeaderClick).toBe('RowHeaderClick'); - expect(events.RowHeaderPointerDown).toBe('RowHeaderPointerDown'); - expect(events.RowHeaderPointerUp).toBe('RowHeaderPointerUp'); - expect(events.RowHeaderHover).toBe('RowHeaderHover'); - expect(events.ColumnHeaderClick).toBe('ColumnHeaderClick'); - expect(events.ColumnHeaderPointerDown).toBe('ColumnHeaderPointerDown'); - expect(events.ColumnHeaderPointerUp).toBe('ColumnHeaderPointerUp'); - expect(events.ColumnHeaderHover).toBe('ColumnHeaderHover'); - - expect(events.DragOver).toBe('DragOver'); - expect(events.Drop).toBe('Drop'); - expect(events.Scroll).toBe('Scroll'); - expect(events.SelectionMoveStart).toBe('SelectionMoveStart'); - expect(events.SelectionMoving).toBe('SelectionMoving'); - expect(events.SelectionMoveEnd).toBe('SelectionMoveEnd'); - expect(events.SelectionChanged).toBe('SelectionChanged'); - expect(events.BeforeSheetZoomChange).toBe('BeforeSheetZoomChange'); - expect(events.SheetZoomChanged).toBe('SheetZoomChanged'); - expect(events.SheetSkeletonChanged).toBe('SheetSkeletonChanged'); - }); - - it('extends core FEventName with sheet-ui event accessors', () => { - const mixed = new (FEventName as any)(); - - expect(mixed.BeforeClipboardChange).toBe('BeforeClipboardChange'); - expect(mixed.ClipboardChanged).toBe('ClipboardChanged'); - expect(mixed.CellClicked).toBe('CellClicked'); - expect(mixed.SelectionChanged).toBe('SelectionChanged'); - expect(mixed.SheetZoomChanged).toBe('SheetZoomChanged'); - }); -}); diff --git a/packages/sheets-ui/src/facade/__tests__/f-workbook-worksheet.spec.ts b/packages/sheets-ui/src/facade/__tests__/f-workbook-worksheet.spec.ts index 3301777f2a..1da34e28c5 100644 --- a/packages/sheets-ui/src/facade/__tests__/f-workbook-worksheet.spec.ts +++ b/packages/sheets-ui/src/facade/__tests__/f-workbook-worksheet.spec.ts @@ -94,9 +94,9 @@ describe('Test FWorkbook/FWorksheet UI mixin', () => { }; const worksheetSkeleton = { skeleton: { id: 'sheet-skeleton' } }; const skeletonManager = { + getSkeleton: vi.fn(() => worksheetSkeleton.skeleton), reCalculate: vi.fn(), getCurrentSkeleton: vi.fn(() => skeleton), - getWorksheetSkeleton: vi.fn(() => worksheetSkeleton), setColumnHeaderSize: vi.fn(), setRowHeaderSize: vi.fn(), }; diff --git a/packages/sheets-ui/src/facade/f-enum.ts b/packages/sheets-ui/src/facade/f-enum.ts index 28d32f2c32..26884e2611 100644 --- a/packages/sheets-ui/src/facade/f-enum.ts +++ b/packages/sheets-ui/src/facade/f-enum.ts @@ -20,7 +20,7 @@ import { SHEET_VIEWPORT_KEY } from '@univerjs/engine-render'; /** * @ignore */ -export interface IFSheetsUIEnum { +export interface IFSheetsUIEnumMixin { /** * Sheet value change command types. These commands affect the content or style of cells. * Includes operations like setting cell values, moving ranges, merging cells, and applying styles. @@ -28,15 +28,15 @@ export interface IFSheetsUIEnum { SHEET_VIEWPORT_KEY: typeof SHEET_VIEWPORT_KEY; } -export class FSheetsUIEnum implements IFSheetsUIEnum { - get SHEET_VIEWPORT_KEY(): typeof SHEET_VIEWPORT_KEY { +export class FSheetsUIEnumMixin extends FEnum implements IFSheetsUIEnumMixin { + override get SHEET_VIEWPORT_KEY(): typeof SHEET_VIEWPORT_KEY { return SHEET_VIEWPORT_KEY; } } -FEnum.extend(FSheetsUIEnum); +FEnum.extend(FSheetsUIEnumMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - export interface FEnum extends IFSheetsUIEnum { + export interface FEnum extends IFSheetsUIEnumMixin { } } diff --git a/packages/sheets-ui/src/facade/f-event.ts b/packages/sheets-ui/src/facade/f-event.ts index 828a3a7dac..5f318fae86 100644 --- a/packages/sheets-ui/src/facade/f-event.ts +++ b/packages/sheets-ui/src/facade/f-event.ts @@ -24,75 +24,69 @@ import type { KeyCode } from '@univerjs/ui'; import { FEventName } from '@univerjs/core/facade'; /** - * Event interface triggered when cell editing starts - * @interface ISheetEditStartedEventParams - * @augments {IEventBase} + * Event interface triggered before clipboard content changes */ -export interface ISheetEditStartedEventParams extends IEventBase { - /** The workbook instance */ +export interface IBeforeClipboardChangeEventParams extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ workbook: FWorkbook; - /** The worksheet being edited */ + /** + * The worksheet instance currently being operated on. {@link FWorksheet} + */ worksheet: FWorksheet; - /** Row index of the editing cell */ - row: number; - /** Column index of the editing cell */ - column: number; - /** Type of input device event that triggered the edit */ - eventType: DeviceInputEventType; - /** Optional keycode that triggered the edit */ - keycode?: KeyCode; - /** Whether the edit is happening in zen editor mode */ - isZenEditor: boolean; + /** + * Clipboard Text String + */ + text: string; + /** + * Clipboard HTML String + */ + html: string; + /** + * The sheet containing the content that was (copied/cut) + */ + fromSheet: FWorksheet; + /** + * The range containing the content that was (copied/cut) + */ + fromRange: FRange; } /** - * Event interface triggered when cell editing ends - * @interface ISheetEditEndedEventParams - * @augments {IEventBase} + * Event interface triggered after clipboard content changes */ -export interface ISheetEditEndedEventParams extends IEventBase { - /** The workbook instance */ +export interface IClipboardChangedEventParams extends IBeforeClipboardChangeEventParams { }; + +/** + * Event interface triggered before pasting content from clipboard + */ +export interface IBeforeClipboardPasteEventParams extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ workbook: FWorkbook; - /** The worksheet being edited */ + /** + * The worksheet instance currently being operated on. {@link FWorkbook} + */ worksheet: FWorksheet; - /** Row index of the edited cell */ - row: number; - /** Column index of the edited cell */ - column: number; - /** Type of input device event that triggered the edit end */ - eventType: DeviceInputEventType; - /** Optional keycode that triggered the edit end */ - keycode?: KeyCode; - /** Whether the edit happened in zen editor mode */ - isZenEditor: boolean; - /** Whether the edit was confirmed or cancelled */ - isConfirm: boolean; + /** + * Clipboard Text String + */ + text?: string; + /** + * Clipboard HTML String + */ + html?: string; } /** - * Event interface triggered while cell content is being changed - * @interface ISheetEditChangingEventParams - * @augments {IEventBase} + * Event interface triggered after pasting content from clipboard */ -export interface ISheetEditChangingEventParams extends IEventBase { - /** The workbook instance */ - workbook: FWorkbook; - /** The worksheet being edited */ - worksheet: FWorksheet; - /** Row index of the editing cell */ - row: number; - /** Column index of the editing cell */ - column: number; - /** Current value being edited */ - value: RichTextValue; - /** Whether the edit is happening in zen editor mode */ - isZenEditor: boolean; -} +export interface IClipboardPastedEventParams extends IBeforeClipboardPasteEventParams { }; /** * Event interface triggered before cell editing starts - * @interface IBeforeSheetEditStartEventParams - * @augments {IEventBase} */ export interface IBeforeSheetEditStartEventParams extends IEventBase { /** The workbook instance */ @@ -111,10 +105,46 @@ export interface IBeforeSheetEditStartEventParams extends IEventBase { isZenEditor: boolean; } +/** + * Event interface triggered when cell editing starts + */ +export interface ISheetEditStartedEventParams extends IEventBase { + /** The workbook instance */ + workbook: FWorkbook; + /** The worksheet being edited */ + worksheet: FWorksheet; + /** Row index of the editing cell */ + row: number; + /** Column index of the editing cell */ + column: number; + /** Type of input device event that triggered the edit */ + eventType: DeviceInputEventType; + /** Optional keycode that triggered the edit */ + keycode?: KeyCode; + /** Whether the edit is happening in zen editor mode */ + isZenEditor: boolean; +} + +/** + * Event interface triggered while cell content is being changed + */ +export interface ISheetEditChangingEventParams extends IEventBase { + /** The workbook instance */ + workbook: FWorkbook; + /** The worksheet being edited */ + worksheet: FWorksheet; + /** Row index of the editing cell */ + row: number; + /** Column index of the editing cell */ + column: number; + /** Current value being edited */ + value: RichTextValue; + /** Whether the edit is happening in zen editor mode */ + isZenEditor: boolean; +} + /** * Event interface triggered before cell editing ends - * @interface IBeforeSheetEditEndEventParams - * @augments {IEventBase} */ export interface IBeforeSheetEditEndEventParams extends IEventBase { /** The workbook instance */ @@ -137,20 +167,111 @@ export interface IBeforeSheetEditEndEventParams extends IEventBase { isConfirm: boolean; } -export const CellFEventName = { - CellClicked: 'CellClicked', - CellPointerDown: 'CellPointerDown', - CellPointerUp: 'CellPointerUp', - CellPointerMove: 'CellPointerMove', - CellHover: 'CellHover', - DragOver: 'DragOver', - Drop: 'Drop', - Scroll: 'Scroll', - SelectionMoveStart: 'SelectionMoveStart', - SelectionMoving: 'SelectionMoving', - SelectionMoveEnd: 'SelectionMoveEnd', - SelectionChanged: 'SelectionChanged', -} as const; +/** + * Event interface triggered when cell editing ends + */ +export interface ISheetEditEndedEventParams extends IEventBase { + /** The workbook instance */ + workbook: FWorkbook; + /** The worksheet being edited */ + worksheet: FWorksheet; + /** Row index of the edited cell */ + row: number; + /** Column index of the edited cell */ + column: number; + /** Type of input device event that triggered the edit end */ + eventType: DeviceInputEventType; + /** Optional keycode that triggered the edit end */ + keycode?: KeyCode; + /** Whether the edit happened in zen editor mode */ + isZenEditor: boolean; + /** Whether the edit was confirmed or cancelled */ + isConfirm: boolean; +} + +/** + * @ignore + */ +export interface ISheetUIEventBase extends IEventBase { + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ + workbook: FWorkbook; + /** + * The worksheet instance currently being operated on. {@link FWorksheet} + */ + worksheet: FWorksheet; +} + +/** + * Event interface for cell-related events such as click, pointer down/up, hover, etc. + */ +export interface ICellEventParams extends ISheetUIEventBase { + row: number; + column: number; +} + +/** + * Event interface for drag-related events such as drag over and drop on spreadsheet cells + */ +export interface IDragEventParams extends IDragCellPosition, ICellEventParams { +} + +/** + * Event interface for row header related events such as click, pointer down/up, hover, etc. + */ +export interface ISheetRowHeaderEventParams extends ISheetUIEventBase { + row: number; +} + +/** + * Event interface for column header related events such as click, pointer down/up, hover, etc. + */ +export interface ISheetColumnHeaderEventParams extends ISheetUIEventBase { + column: number; +} + +/** + * Event interface for scroll event on spreadsheet + */ +export interface IScrollEventParams extends ISheetUIEventBase { + scrollX: number; + scrollY: number; +} + +/** + * Event interface for selection change and selection move events on spreadsheet + */ +export interface ISelectionEventParams extends ISheetUIEventBase { + selections: IRange[]; +} + +/** + * Event interface for sheet zoom change event + */ +export interface ISheetZoomEventParams extends IEventBase { + /** + * Zoom ratio + */ + zoom: number; + /** + * The workbook instance currently being operated on. {@link FWorkbook} + */ + workbook: FWorkbook; + /** + * The worksheet instance currently being operated on. {@link FWorkbook} + */ + worksheet: FWorksheet; +} + +/** + * Event interface for sheet skeleton change event + */ +export interface ISheetSkeletonChangedEventParams extends ISheetUIEventBase { + skeleton: SpreadsheetSkeleton; + payload: CommandListenerSkeletonChange; + effectedRanges: FRange[]; +} /** * @ignore @@ -158,7 +279,7 @@ export const CellFEventName = { export interface IFSheetsUIEventNameMixin { /** * Trigger this event before the clipboard content changes. - * Type of the event parameter is {@link IBeforeClipboardChangeParam} + * Type of the event parameter is {@link IBeforeClipboardChangeEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeClipboardChange, (params) => { @@ -176,7 +297,7 @@ export interface IFSheetsUIEventNameMixin { /** * Trigger this event after the clipboard content changes. - * Type of the event parameter is {@link IClipboardChangedParam} + * Type of the event parameter is {@link IClipboardChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.ClipboardChanged, (params) => { @@ -191,7 +312,7 @@ export interface IFSheetsUIEventNameMixin { /** * Trigger this event before pasting. - * Type of the event parameter is {@link IBeforeClipboardPasteParam} + * Type of the event parameter is {@link IBeforeClipboardPasteEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeClipboardPaste, (params) => { @@ -209,7 +330,7 @@ export interface IFSheetsUIEventNameMixin { /** * Trigger this event after pasting. - * Type of the event parameter is {@link IClipboardPastedParam} + * Type of the event parameter is {@link IClipboardPastedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.ClipboardPasted, (params) => { @@ -305,7 +426,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when a cell is clicked - * @see {@link ICellEventParam} + * @see {@link ICellEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.CellClicked, (params) => { @@ -320,7 +441,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when a cell is pointer down - * @see {@link ICellEventParam} + * @see {@link ICellEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.CellPointerDown, (params) => { @@ -335,7 +456,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when a cell is pointer up - * @see {@link ICellEventParam} + * @see {@link ICellEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.CellPointerUp, (params) => { @@ -350,7 +471,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when a cell is hovered - * @see {@link ICellEventParam} + * @see {@link ICellEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.CellHover, (params) => { @@ -365,7 +486,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when move on spreadsheet cells - * @see {@link ICellEventParam} + * @see {@link ICellEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.CellPointerMove, (params) => { @@ -380,7 +501,7 @@ export interface IFSheetsUIEventNameMixin { /** * Triggered when a row header is clicked - * @see {@link ISheetRowHeaderEvent} + * @see {@link ISheetRowHeaderEventParams} * @example * ```typescript * const disposable = univerAPI.addEvent(univerAPI.Event.RowHeaderClick, (params) => { @@ -395,7 +516,7 @@ export interface IFSheetsUIEventNameMixin { /** * Triggered when pointer is pressed down on a row header - * @see {@link ISheetRowHeaderEvent} + * @see {@link ISheetRowHeaderEventParams} * @example * ```typescript * const disposable = univerAPI.addEvent(univerAPI.Event.RowHeaderPointerDown, (params) => { @@ -410,7 +531,7 @@ export interface IFSheetsUIEventNameMixin { /** * Triggered when pointer is released on a row header - * @see {@link ISheetRowHeaderEvent} + * @see {@link ISheetRowHeaderEventParams} * @example * ```typescript * const disposable = univerAPI.addEvent(univerAPI.Event.RowHeaderPointerUp, (params) => { @@ -425,7 +546,7 @@ export interface IFSheetsUIEventNameMixin { /** * Triggered when pointer hovers over a row header - * @see {@link ISheetRowHeaderEvent} + * @see {@link ISheetRowHeaderEventParams} * @example * ```typescript * const disposable = univerAPI.addEvent(univerAPI.Event.RowHeaderHover, (params) => { @@ -440,7 +561,7 @@ export interface IFSheetsUIEventNameMixin { /** * Triggered when a column header is clicked - * @see {@link ISheetColumnHeaderEvent} + * @see {@link ISheetColumnHeaderEventParams} * @example * ```typescript * const disposable = univerAPI.addEvent(univerAPI.Event.ColumnHeaderClick, (params) => { @@ -455,7 +576,7 @@ export interface IFSheetsUIEventNameMixin { /** * Triggered when pointer is pressed down on a column header - * @see {@link ISheetColumnHeaderEvent} + * @see {@link ISheetColumnHeaderEventParams} * @example * ```typescript * const disposable = univerAPI.addEvent(univerAPI.Event.ColumnHeaderPointerDown, (params) => { @@ -470,7 +591,7 @@ export interface IFSheetsUIEventNameMixin { /** * Triggered when pointer is released on a column header - * @see {@link ISheetColumnHeaderEvent} + * @see {@link ISheetColumnHeaderEventParams} * @example * ```typescript * const disposable = univerAPI.addEvent(univerAPI.Event.ColumnHeaderPointerUp, (params) => { @@ -485,7 +606,7 @@ export interface IFSheetsUIEventNameMixin { /** * Triggered when pointer hovers over a column header - * @see {@link ISheetColumnHeaderEvent} + * @see {@link ISheetColumnHeaderEventParams} * @example * ```typescript * const disposable = univerAPI.addEvent(univerAPI.Event.ColumnHeaderHover, (params) => { @@ -500,7 +621,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when the drag element passes over the spreadsheet cells - * @see {@link IDragEventParam} + * @see {@link IDragEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.DragOver, (params) => { @@ -515,7 +636,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when the drag element is dropped on the spreadsheet cells - * @see {@link IDragEventParam} + * @see {@link IDragEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.Drop, (params) => { @@ -530,7 +651,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when scroll spreadsheet. - * @see {@link IScrollEventParam} + * @see {@link IScrollEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.Scroll, (params) => { @@ -545,7 +666,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when selection changed. - * @see {@link ISelectionEventParam} + * @see {@link ISelectionEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SelectionChanged, (params)=> { @@ -560,7 +681,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when selection move start - * @see {@link ISelectionEventParam} + * @see {@link ISelectionEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SelectionMoveStart, (params)=> { @@ -575,7 +696,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when selection move end - * @see {@link ISelectionEventParam} + * @see {@link ISelectionEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SelectionMoving, (params)=> { @@ -590,7 +711,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when selection move end - * @see {@link ISelectionEventParam} + * @see {@link ISelectionEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SelectionMoveEnd, (params)=> { @@ -605,7 +726,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when zoom changed - * @see {@link ISheetZoomEvent} + * @see {@link ISheetZoomEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SheetZoomChanged, (params)=> { @@ -620,7 +741,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired before zoom changed - * @see {@link ISheetZoomEvent} + * @see {@link ISheetZoomEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetZoomChange, (params)=> { @@ -638,7 +759,7 @@ export interface IFSheetsUIEventNameMixin { /** * Event fired when sheet skeleton changed - * @see {@link ISheetSkeletonChangedEvent} + * @see {@link ISheetSkeletonChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SheetSkeletonChanged, (params)=> { @@ -652,132 +773,132 @@ export interface IFSheetsUIEventNameMixin { readonly SheetSkeletonChanged: 'SheetSkeletonChanged'; } -export class FSheetsUIEventName implements IFSheetsUIEventNameMixin { - get BeforeClipboardChange(): 'BeforeClipboardChange' { +export class FSheetsUIEventNameMixin extends FEventName implements IFSheetsUIEventNameMixin { + override get BeforeClipboardChange(): 'BeforeClipboardChange' { return 'BeforeClipboardChange' as const; } - get ClipboardChanged(): 'ClipboardChanged' { + override get ClipboardChanged(): 'ClipboardChanged' { return 'ClipboardChanged' as const; } - get BeforeClipboardPaste(): 'BeforeClipboardPaste' { + override get BeforeClipboardPaste(): 'BeforeClipboardPaste' { return 'BeforeClipboardPaste' as const; } - get ClipboardPasted(): 'ClipboardPasted' { + override get ClipboardPasted(): 'ClipboardPasted' { return 'ClipboardPasted' as const; } - get BeforeSheetEditStart(): 'BeforeSheetEditStart' { - return 'BeforeSheetEditStart'; + override get BeforeSheetEditStart(): 'BeforeSheetEditStart' { + return 'BeforeSheetEditStart' as const; } - get SheetEditStarted(): 'SheetEditStarted' { - return 'SheetEditStarted'; + override get SheetEditStarted(): 'SheetEditStarted' { + return 'SheetEditStarted' as const; } - get SheetEditChanging(): 'SheetEditChanging' { - return 'SheetEditChanging'; + override get SheetEditChanging(): 'SheetEditChanging' { + return 'SheetEditChanging' as const; } - get BeforeSheetEditEnd(): 'BeforeSheetEditEnd' { - return 'BeforeSheetEditEnd'; + override get BeforeSheetEditEnd(): 'BeforeSheetEditEnd' { + return 'BeforeSheetEditEnd' as const; } - get SheetEditEnded(): 'SheetEditEnded' { - return 'SheetEditEnded'; + override get SheetEditEnded(): 'SheetEditEnded' { + return 'SheetEditEnded' as const; } - get CellClicked(): 'CellClicked' { - return CellFEventName.CellClicked; + override get CellClicked(): 'CellClicked' { + return 'CellClicked' as const; } - get CellHover(): 'CellHover' { - return CellFEventName.CellHover; + override get CellHover(): 'CellHover' { + return 'CellHover' as const; } - get CellPointerDown(): 'CellPointerDown' { - return CellFEventName.CellPointerDown; + override get CellPointerDown(): 'CellPointerDown' { + return 'CellPointerDown' as const; } - get CellPointerUp(): 'CellPointerUp' { - return CellFEventName.CellPointerUp; + override get CellPointerUp(): 'CellPointerUp' { + return 'CellPointerUp' as const; } - get CellPointerMove(): 'CellPointerMove' { - return CellFEventName.CellPointerMove; + override get CellPointerMove(): 'CellPointerMove' { + return 'CellPointerMove' as const; } - get DragOver(): 'DragOver' { + override get DragOver(): 'DragOver' { return 'DragOver' as const; } - get Drop(): 'Drop' { + override get Drop(): 'Drop' { return 'Drop' as const; } - get Scroll(): 'Scroll' { + override get Scroll(): 'Scroll' { return 'Scroll' as const; } - get SelectionMoveStart(): 'SelectionMoveStart' { + override get SelectionMoveStart(): 'SelectionMoveStart' { return 'SelectionMoveStart' as const; } - get SelectionChanged(): 'SelectionChanged' { + override get SelectionChanged(): 'SelectionChanged' { return 'SelectionChanged' as const; } - get SelectionMoving(): 'SelectionMoving' { + override get SelectionMoving(): 'SelectionMoving' { return 'SelectionMoving' as const; } - get SelectionMoveEnd(): 'SelectionMoveEnd' { + override get SelectionMoveEnd(): 'SelectionMoveEnd' { return 'SelectionMoveEnd' as const; } - get RowHeaderClick(): 'RowHeaderClick' { + override get RowHeaderClick(): 'RowHeaderClick' { return 'RowHeaderClick' as const; } - get RowHeaderPointerDown(): 'RowHeaderPointerDown' { + override get RowHeaderPointerDown(): 'RowHeaderPointerDown' { return 'RowHeaderPointerDown' as const; } - get RowHeaderPointerUp(): 'RowHeaderPointerUp' { + override get RowHeaderPointerUp(): 'RowHeaderPointerUp' { return 'RowHeaderPointerUp' as const; } - get RowHeaderHover(): 'RowHeaderHover' { + override get RowHeaderHover(): 'RowHeaderHover' { return 'RowHeaderHover' as const; } - get ColumnHeaderClick(): 'ColumnHeaderClick' { + override get ColumnHeaderClick(): 'ColumnHeaderClick' { return 'ColumnHeaderClick' as const; } - get ColumnHeaderPointerDown(): 'ColumnHeaderPointerDown' { + override get ColumnHeaderPointerDown(): 'ColumnHeaderPointerDown' { return 'ColumnHeaderPointerDown' as const; } - get ColumnHeaderPointerUp(): 'ColumnHeaderPointerUp' { + override get ColumnHeaderPointerUp(): 'ColumnHeaderPointerUp' { return 'ColumnHeaderPointerUp' as const; } - get ColumnHeaderHover(): 'ColumnHeaderHover' { + override get ColumnHeaderHover(): 'ColumnHeaderHover' { return 'ColumnHeaderHover' as const; } - get SheetSkeletonChanged(): 'SheetSkeletonChanged' { + override get SheetSkeletonChanged(): 'SheetSkeletonChanged' { return 'SheetSkeletonChanged' as const; } - get BeforeSheetZoomChange(): 'BeforeSheetZoomChange' { + override get BeforeSheetZoomChange(): 'BeforeSheetZoomChange' { return 'BeforeSheetZoomChange' as const; } - get SheetZoomChanged(): 'SheetZoomChanged' { + override get SheetZoomChanged(): 'SheetZoomChanged' { return 'SheetZoomChanged' as const; } } @@ -785,157 +906,48 @@ export class FSheetsUIEventName implements IFSheetsUIEventNameMixin { /** * @ignore */ -export interface ISheetUIEventBase extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - /** - * The worksheet instance currently being operated on. {@link FWorksheet} - */ - worksheet: FWorksheet; -} -export interface IBeforeClipboardChangeParam extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - /** - * The worksheet instance currently being operated on. {@link FWorksheet} - */ - worksheet: FWorksheet; - /** - * Clipboard Text String - */ - text: string; - /** - * Clipboard HTML String - */ - html: string; - /** - * The sheet containing the content that was (copied/cut) - */ - fromSheet: FWorksheet; - /** - * The range containing the content that was (copied/cut) - */ - fromRange: FRange; -} - -export type IClipboardChangedParam = IBeforeClipboardChangeParam; - -export interface IBeforeClipboardPasteParam extends IEventBase { - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - /** - * The worksheet instance currently being operated on. {@link FWorkbook} - */ - worksheet: FWorksheet; - /** - * Clipboard Text String - */ - text?: string; - /** - * Clipboard HTML String - */ - html?: string; -} - -export type IClipboardPastedParam = IBeforeClipboardPasteParam; - -export interface ISheetZoomEvent extends IEventBase { - /** - * Zoom ratio - */ - zoom: number; - /** - * The workbook instance currently being operated on. {@link FWorkbook} - */ - workbook: FWorkbook; - /** - * The worksheet instance currently being operated on. {@link FWorkbook} - */ - worksheet: FWorksheet; -} - -export interface ICellEventParam extends ISheetUIEventBase { - row: number; - column: number; -} - -export interface IDragEventParam extends IDragCellPosition, ICellEventParam { -} - -export interface IScrollEventParam extends ISheetUIEventBase { - scrollX: number; - scrollY: number; -} - -export interface ISelectionEventParam extends ISheetUIEventBase { - selections: IRange[]; -} - -export interface ISheetRowHeaderEvent extends ISheetUIEventBase { - row: number; -} - -export interface ISheetColumnHeaderEvent extends ISheetUIEventBase { - column: number; -} - -export interface ISheetSkeletonChangedEvent extends ISheetUIEventBase { - skeleton: SpreadsheetSkeleton; - payload: CommandListenerSkeletonChange; - effectedRanges: FRange[]; -} - -/** - * @ignore - */ -export interface IFSheetsUIEventParamConfig { - BeforeClipboardChange: IBeforeClipboardChangeParam; - ClipboardChanged: IClipboardChangedParam; - BeforeClipboardPaste: IBeforeClipboardPasteParam; - ClipboardPasted: IClipboardPastedParam; +export interface ISheetsUIEventParamConfig { + BeforeClipboardChange: IBeforeClipboardChangeEventParams; + ClipboardChanged: IClipboardChangedEventParams; + BeforeClipboardPaste: IBeforeClipboardPasteEventParams; + ClipboardPasted: IClipboardPastedEventParams; BeforeSheetEditStart: IBeforeSheetEditStartEventParams; SheetEditStarted: ISheetEditStartedEventParams; SheetEditChanging: ISheetEditChangingEventParams; BeforeSheetEditEnd: IBeforeSheetEditEndEventParams; SheetEditEnded: ISheetEditEndedEventParams; - CellClicked: ICellEventParam; - CellHover: ICellEventParam; - CellPointerDown: ICellEventParam; - CellPointerUp: ICellEventParam; - CellPointerMove: ICellEventParam; - Drop: IDragEventParam; - DragOver: IDragEventParam; - RowHeaderClick: ISheetRowHeaderEvent; - // RowHeaderDbClick: ISheetRowHeaderEvent; - RowHeaderHover: ISheetRowHeaderEvent; - RowHeaderPointerDown: ISheetRowHeaderEvent; - RowHeaderPointerUp: ISheetRowHeaderEvent; - ColumnHeaderClick: ISheetColumnHeaderEvent; - // ColumnHeaderDbClick: ISheetColumnHeaderEvent; - ColumnHeaderHover: ISheetColumnHeaderEvent; - ColumnHeaderPointerDown: ISheetColumnHeaderEvent; - ColumnHeaderPointerUp: ISheetColumnHeaderEvent; - Scroll: IScrollEventParam; - // SelectionChanging: ISelectionEventParam; - SelectionMoveStart: ISelectionEventParam; - SelectionMoving: ISelectionEventParam; - SelectionMoveEnd: ISelectionEventParam; - SelectionChanged: ISelectionEventParam; - SheetZoomChanged: ISheetZoomEvent; - BeforeSheetZoomChange: ISheetZoomEvent; + CellClicked: ICellEventParams; + CellHover: ICellEventParams; + CellPointerDown: ICellEventParams; + CellPointerUp: ICellEventParams; + CellPointerMove: ICellEventParams; + Drop: IDragEventParams; + DragOver: IDragEventParams; + RowHeaderClick: ISheetRowHeaderEventParams; + // RowHeaderDbClick: ISheetRowHeaderEventParams; + RowHeaderHover: ISheetRowHeaderEventParams; + RowHeaderPointerDown: ISheetRowHeaderEventParams; + RowHeaderPointerUp: ISheetRowHeaderEventParams; + ColumnHeaderClick: ISheetColumnHeaderEventParams; + // ColumnHeaderDbClick: ISheetColumnHeaderEventParams; + ColumnHeaderHover: ISheetColumnHeaderEventParams; + ColumnHeaderPointerDown: ISheetColumnHeaderEventParams; + ColumnHeaderPointerUp: ISheetColumnHeaderEventParams; + Scroll: IScrollEventParams; + // SelectionChanging: ISelectionEventParams; + SelectionMoveStart: ISelectionEventParams; + SelectionMoving: ISelectionEventParams; + SelectionMoveEnd: ISelectionEventParams; + SelectionChanged: ISelectionEventParams; + SheetZoomChanged: ISheetZoomEventParams; + BeforeSheetZoomChange: ISheetZoomEventParams; - SheetSkeletonChanged: ISheetSkeletonChangedEvent; + SheetSkeletonChanged: ISheetSkeletonChangedEventParams; } -FEventName.extend(FSheetsUIEventName); +FEventName.extend(FSheetsUIEventNameMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention interface FEventName extends IFSheetsUIEventNameMixin { } - interface IEventParamConfig extends IFSheetsUIEventParamConfig { } + interface IEventParamConfig extends ISheetsUIEventParamConfig { } } diff --git a/packages/sheets-ui/src/facade/f-univer.ts b/packages/sheets-ui/src/facade/f-univer.ts index 8d100bb4a7..0657bcb4dc 100644 --- a/packages/sheets-ui/src/facade/f-univer.ts +++ b/packages/sheets-ui/src/facade/f-univer.ts @@ -30,13 +30,56 @@ import type { CommandListenerSkeletonChange } from '@univerjs/sheets'; import type { IEditorBridgeServiceVisibleParam, ISetZoomRatioCommandParams, ISheetPasteByShortKeyParams, IViewportScrollState } from '@univerjs/sheets-ui'; import type { FRange } from '@univerjs/sheets/facade'; import type { Observable } from 'rxjs'; -import type { IBeforeClipboardChangeParam, IBeforeClipboardPasteParam, IBeforeSheetEditEndEventParams, IBeforeSheetEditStartEventParams, ISheetEditChangingEventParams, ISheetEditEndedEventParams, ISheetEditStartedEventParams, ISheetZoomEvent } from './f-event'; -import { CanceledError, DisposableCollection, DOCS_NORMAL_EDITOR_UNIT_ID_KEY, ICommandService, ILogService, IPermissionService, IUniverInstanceService, LifecycleService, LifecycleStages, RichTextValue, toDisposable, UniverInstanceType } from '@univerjs/core'; +import type { + IBeforeClipboardChangeEventParams, + IBeforeClipboardPasteEventParams, + IBeforeSheetEditEndEventParams, + IBeforeSheetEditStartEventParams, + ICellEventParams, + IClipboardChangedEventParams, + IClipboardPastedEventParams, + IDragEventParams, + IScrollEventParams, + ISelectionEventParams, + ISheetColumnHeaderEventParams, + ISheetEditChangingEventParams, + ISheetEditEndedEventParams, + ISheetEditStartedEventParams, + ISheetRowHeaderEventParams, + ISheetSkeletonChangedEventParams, + ISheetZoomEventParams, +} from './f-event'; +import { + CanceledError, + DisposableCollection, + DOCS_NORMAL_EDITOR_UNIT_ID_KEY, + ICommandService, + ILogService, + IPermissionService, + IUniverInstanceService, + LifecycleService, + LifecycleStages, + RichTextValue, + toDisposable, + UniverInstanceType, +} from '@univerjs/core'; import { FUniver } from '@univerjs/core/facade'; import { RichTextEditingMutation } from '@univerjs/docs'; import { IRenderManagerService } from '@univerjs/engine-render'; import { COMMAND_LISTENER_SKELETON_CHANGE, getSkeletonChangedEffectedRange, SheetsSelectionsService } from '@univerjs/sheets'; -import { DragManagerService, HoverManagerService, IEditorBridgeService, ISheetClipboardService, SetCellEditVisibleOperation, SetZoomRatioCommand, SHEET_VIEW_KEY, SheetPasteShortKeyCommand, SheetPermissionRenderManagerService, SheetScrollManagerService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { + DragManagerService, + HoverManagerService, + IEditorBridgeService, + ISheetClipboardService, + SetCellEditVisibleOperation, + SetZoomRatioCommand, + SHEET_VIEW_KEY, + SheetPasteShortKeyCommand, + SheetPermissionRenderManagerService, + SheetScrollManagerService, + SheetSkeletonManagerService, +} from '@univerjs/sheets-ui'; import { FSheetHooks } from '@univerjs/sheets/facade'; import { CopyCommand, CutCommand, HTML_CLIPBOARD_MIME_TYPE, IClipboardInterfaceService, KeyCode, PasteCommand, PLAIN_TEXT_CLIPBOARD_MIME_TYPE, supportClipboardAPI } from '@univerjs/ui'; import { combineLatest, filter } from 'rxjs'; @@ -191,21 +234,20 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix const params = commandInfo.params as IEditorBridgeServiceVisibleParam; const { visible, keycode, eventType } = params; const loc = editorBridgeService.getEditLocation()!; + if (!visible) return; - if (visible) { - const eventParams: IBeforeSheetEditStartEventParams = { - row: loc.row, - column: loc.column, - eventType, - keycode, - workbook, - worksheet, - isZenEditor: false, - }; - this.fireEvent(this.Event.BeforeSheetEditStart, eventParams); - if (eventParams.cancel) { - throw new CanceledError(); - } + const eventParams: IBeforeSheetEditStartEventParams = { + row: loc.row, + column: loc.column, + eventType, + keycode, + workbook, + worksheet, + isZenEditor: false, + }; + this.fireEvent(this.Event.BeforeSheetEditStart, eventParams); + if (eventParams.cancel) { + throw new CanceledError(); } }) ) @@ -226,23 +268,22 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix const params = commandInfo.params as IEditorBridgeServiceVisibleParam; const { visible, keycode, eventType } = params; const loc = editorBridgeService.getEditLocation()!; + if (visible) return; - if (!visible) { - const eventParams: IBeforeSheetEditEndEventParams = { - row: loc.row, - column: loc.column, - eventType, - keycode, - workbook, - worksheet, - isZenEditor: false, - value: RichTextValue.create(univerInstanceService.getUnit(DOCS_NORMAL_EDITOR_UNIT_ID_KEY)!.getSnapshot()), - isConfirm: keycode !== KeyCode.ESC, - }; - this.fireEvent(this.Event.BeforeSheetEditEnd, eventParams); - if (eventParams.cancel) { - throw new CanceledError(); - } + const eventParams: IBeforeSheetEditEndEventParams = { + row: loc.row, + column: loc.column, + eventType, + keycode, + workbook, + worksheet, + isZenEditor: false, + value: RichTextValue.create(univerInstanceService.getUnit(DOCS_NORMAL_EDITOR_UNIT_ID_KEY)!.getSnapshot()), + isConfirm: keycode !== KeyCode.ESC, + }; + this.fireEvent(this.Event.BeforeSheetEditEnd, eventParams); + if (eventParams.cancel) { + throw new CanceledError(); } }) ) @@ -262,19 +303,18 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix const params = commandInfo.params as IEditorBridgeServiceVisibleParam; const { visible, keycode, eventType } = params; const loc = editorBridgeService.getEditLocation()!; + if (!visible) return; - if (visible) { - const eventParams: ISheetEditStartedEventParams = { - row: loc.row, - column: loc.column, - eventType, - keycode, - workbook, - worksheet, - isZenEditor: false, - }; - this.fireEvent(this.Event.SheetEditStarted, eventParams); - } + const eventParams: ISheetEditStartedEventParams = { + row: loc.row, + column: loc.column, + eventType, + keycode, + workbook, + worksheet, + isZenEditor: false, + }; + this.fireEvent(this.Event.SheetEditStarted, eventParams); }) ) ); @@ -293,20 +333,19 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix const params = commandInfo.params as IEditorBridgeServiceVisibleParam; const { visible, keycode, eventType } = params; const loc = editorBridgeService.getEditLocation()!; + if (visible) return; - if (!visible) { - const eventParams: ISheetEditEndedEventParams = { - row: loc.row, - column: loc.column, - eventType, - keycode, - workbook, - worksheet, - isZenEditor: false, - isConfirm: keycode !== KeyCode.ESC, - }; - this.fireEvent(this.Event.SheetEditEnded, eventParams); - } + const eventParams: ISheetEditEndedEventParams = { + row: loc.row, + column: loc.column, + eventType, + keycode, + workbook, + worksheet, + isZenEditor: false, + isConfirm: keycode !== KeyCode.ESC, + }; + this.fireEvent(this.Event.SheetEditEnded, eventParams); }) ) ); @@ -354,7 +393,7 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix if (!target) return; const { workbook, worksheet } = target; - const eventParams: ISheetZoomEvent = { + const eventParams: ISheetZoomEventParams = { zoom: (commandInfo.params as ISetZoomRatioCommandParams).zoomRatio, workbook, worksheet, @@ -377,11 +416,12 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix if (!target) return; const { workbook, worksheet } = target; - this.fireEvent(this.Event.SheetZoomChanged, { + const eventParams: ISheetZoomEventParams = { zoom: worksheet.getZoom(), workbook, worksheet, - }); + }; + this.fireEvent(this.Event.SheetZoomChanged, eventParams); }) ) ); @@ -412,12 +452,13 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((cell) => { const baseParams = this.getSheetTarget(cell.location.unitId, cell.location.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.CellClicked, { + const eventParams: ICellEventParams = { ...baseParams, ...cell, row: cell.location.row, column: cell.location.col, - }); + }; + this.fireEvent(this.Event.CellClicked, eventParams); }) ) ); @@ -430,12 +471,13 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((cell) => { const baseParams = this.getSheetTarget(cell.unitId, cell.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.CellHover, { + const eventParams: ICellEventParams = { ...baseParams, ...cell, row: cell.row, column: cell.col, - }); + }; + this.fireEvent(this.Event.CellHover, eventParams); }) ) ); @@ -448,12 +490,13 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((cell) => { const baseParams = this.getSheetTarget(cell.unitId, cell.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.CellPointerDown, { + const eventParams: ICellEventParams = { ...baseParams, ...cell, row: cell.row, column: cell.col, - }); + }; + this.fireEvent(this.Event.CellPointerDown, eventParams); }) ) ); @@ -466,12 +509,13 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((cell) => { const baseParams = this.getSheetTarget(cell.unitId, cell.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.CellPointerUp, { + const eventParams: ICellEventParams = { ...baseParams, ...cell, row: cell.row, column: cell.col, - }); + }; + this.fireEvent(this.Event.CellPointerUp, eventParams); }) ) ); @@ -484,12 +528,13 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((cell) => { const baseParams = this.getSheetTarget(cell.unitId, cell.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.CellPointerMove, { + const eventParams: ICellEventParams = { ...baseParams, ...cell, row: cell.row, column: cell.col, - }); + }; + this.fireEvent(this.Event.CellPointerMove, eventParams); }) ) ); @@ -503,12 +548,13 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((cell) => { const baseParams = this.getSheetTarget(cell.location.unitId, cell.location.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.DragOver, { + const eventParams: IDragEventParams = { ...baseParams, ...cell, row: cell.location.row, column: cell.location.col, - }); + }; + this.fireEvent(this.Event.DragOver, eventParams); }) ) ); @@ -521,12 +567,13 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((cell) => { const baseParams = this.getSheetTarget(cell.location.unitId, cell.location.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.Drop, { + const eventParams: IDragEventParams = { ...baseParams, ...cell, row: cell.location.row, column: cell.location.col, - }); + }; + this.fireEvent(this.Event.Drop, eventParams); }) ) ); @@ -540,10 +587,11 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((header) => { const baseParams = this.getSheetTarget(header.unitId, header.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.RowHeaderClick, { + const eventParams: ISheetRowHeaderEventParams = { ...baseParams, row: header.index, - }); + }; + this.fireEvent(this.Event.RowHeaderClick, eventParams); }) ) ); @@ -556,10 +604,11 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((header) => { const baseParams = this.getSheetTarget(header.unitId, header.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.RowHeaderPointerDown, { + const eventParams: ISheetRowHeaderEventParams = { ...baseParams, row: header.index, - }); + }; + this.fireEvent(this.Event.RowHeaderPointerDown, eventParams); }) ) ); @@ -572,10 +621,11 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((header) => { const baseParams = this.getSheetTarget(header.unitId, header.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.RowHeaderPointerUp, { + const eventParams: ISheetRowHeaderEventParams = { ...baseParams, row: header.index, - }); + }; + this.fireEvent(this.Event.RowHeaderPointerUp, eventParams); }) ) ); @@ -588,10 +638,11 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((header) => { const baseParams = this.getSheetTarget(header.unitId, header.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.RowHeaderHover, { + const eventParams: ISheetRowHeaderEventParams = { ...baseParams, row: header.index, - }); + }; + this.fireEvent(this.Event.RowHeaderHover, eventParams); }) ) ); @@ -605,10 +656,11 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((header) => { const baseParams = this.getSheetTarget(header.unitId, header.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.ColumnHeaderClick, { + const eventParams: ISheetColumnHeaderEventParams = { ...baseParams, column: header.index, - }); + }; + this.fireEvent(this.Event.ColumnHeaderClick, eventParams); }) ) ); @@ -621,10 +673,11 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((header) => { const baseParams = this.getSheetTarget(header.unitId, header.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.ColumnHeaderPointerDown, { + const eventParams: ISheetColumnHeaderEventParams = { ...baseParams, column: header.index, - }); + }; + this.fireEvent(this.Event.ColumnHeaderPointerDown, eventParams); }) ) ); @@ -637,10 +690,11 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((header) => { const baseParams = this.getSheetTarget(header.unitId, header.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.ColumnHeaderPointerUp, { + const eventParams: ISheetColumnHeaderEventParams = { ...baseParams, column: header.index, - }); + }; + this.fireEvent(this.Event.ColumnHeaderPointerUp, eventParams); }) ) ); @@ -653,10 +707,11 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .subscribe((header) => { const baseParams = this.getSheetTarget(header.unitId, header.subUnitId); if (!baseParams) return; - this.fireEvent(this.Event.ColumnHeaderHover, { + const eventParams: ISheetColumnHeaderEventParams = { ...baseParams, column: header.index, - }); + }; + this.fireEvent(this.Event.ColumnHeaderHover, eventParams); }) ) ); @@ -702,11 +757,12 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix this.Event.Scroll, () => scrollManagerService.validViewportScrollInfo$.subscribe((params: Nullable) => { if (!params) return; - this.fireEvent(this.Event.Scroll, { + const eventParams: IScrollEventParams = { workbook, worksheet: workbook.getActiveSheet(), ...params, - }); + }; + this.fireEvent(this.Event.Scroll, eventParams); }) ) ); @@ -716,11 +772,12 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix this.registerEventHandler( this.Event.SelectionMoveStart, () => selectionService.selectionMoveStart$.subscribe((selections) => { - this.fireEvent(this.Event.SelectionMoveStart, { + const eventParams: ISelectionEventParams = { workbook, worksheet: workbook.getActiveSheet(), selections: selections?.map((s) => s.range) ?? [], - }); + }; + this.fireEvent(this.Event.SelectionMoveStart, eventParams); }) ) ); @@ -729,11 +786,12 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix this.registerEventHandler( this.Event.SelectionMoving, () => selectionService.selectionMoving$.subscribe((selections) => { - this.fireEvent(this.Event.SelectionMoving, { + const eventParams: ISelectionEventParams = { workbook, worksheet: workbook.getActiveSheet(), selections: selections?.map((s) => s.range) ?? [], - }); + }; + this.fireEvent(this.Event.SelectionMoving, eventParams); }) ) ); @@ -742,11 +800,12 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix this.registerEventHandler( this.Event.SelectionMoveEnd, () => selectionService.selectionMoveEnd$.subscribe((selections) => { - this.fireEvent(this.Event.SelectionMoveEnd, { + const eventParams: ISelectionEventParams = { workbook, worksheet: workbook.getActiveSheet(), selections: selections?.map((s) => s.range) ?? [], - }); + }; + this.fireEvent(this.Event.SelectionMoveEnd, eventParams); }) ) ); @@ -755,11 +814,12 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix this.registerEventHandler( this.Event.SelectionChanged, () => selectionService.selectionChanged$.subscribe((selections) => { - this.fireEvent(this.Event.SelectionChanged, { + const eventParams: ISelectionEventParams = { workbook, worksheet: workbook.getActiveSheet(), selections: selections?.map((s) => s.range) ?? [], - }); + }; + this.fireEvent(this.Event.SelectionChanged, eventParams); }) ) ); @@ -851,20 +911,21 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix .filter(Boolean) as FRange[]; if (!ranges.length) return; - this.fireEvent(this.Event.SheetSkeletonChanged, { + const eventParams: ISheetSkeletonChangedEventParams = { workbook: sheet.workbook, worksheet: sheet.worksheet, payload: commandInfo as CommandListenerSkeletonChange, skeleton: sheet.worksheet.getSkeleton()!, effectedRanges: ranges, - }); + }; + this.fireEvent(this.Event.SheetSkeletonChanged, eventParams); } }) ) ); } - private _generateClipboardCopyParam(): IBeforeClipboardChangeParam | undefined { + private _generateClipboardCopyParam(): IBeforeClipboardChangeEventParams | IClipboardChangedEventParams | undefined { const workbook = this.getActiveWorkbook(); const worksheet = workbook?.getActiveSheet(); const range = workbook?.getActiveRange(); @@ -878,7 +939,7 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix return; } const { html, plain } = content; - const eventParams: IBeforeClipboardChangeParam = { + const eventParams: IBeforeClipboardChangeEventParams | IClipboardChangedEventParams = { workbook, worksheet, text: plain, @@ -890,7 +951,7 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix } private _beforeClipboardChange(): void { - const eventParams = this._generateClipboardCopyParam(); + const eventParams = this._generateClipboardCopyParam() as IBeforeClipboardChangeEventParams; if (!eventParams) return; this.fireEvent(this.Event.BeforeClipboardChange, eventParams); @@ -900,13 +961,13 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix } private _clipboardChanged(): void { - const eventParams = this._generateClipboardCopyParam(); + const eventParams = this._generateClipboardCopyParam() as IClipboardChangedEventParams; if (!eventParams) return; this.fireEvent(this.Event.ClipboardChanged, eventParams); } - private _generateClipboardPasteParam(params?: ISheetPasteByShortKeyParams): IBeforeClipboardPasteParam | undefined { + private _generateClipboardPasteParam(params?: ISheetPasteByShortKeyParams): IBeforeClipboardPasteEventParams | IClipboardPastedEventParams | undefined { if (!params) { return; } @@ -916,7 +977,7 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix if (!workbook || !worksheet) { return; } - const eventParams: IBeforeClipboardPasteParam = { + const eventParams: IBeforeClipboardPasteEventParams | IClipboardPastedEventParams = { workbook, worksheet, text: textContent, @@ -925,7 +986,7 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix return eventParams; } - private async _generateClipboardPasteParamAsync(): Promise { + private async _generateClipboardPasteParamAsync(): Promise { const workbook = this.getActiveWorkbook(); const worksheet = workbook?.getActiveSheet(); if (!workbook || !worksheet) { @@ -934,7 +995,7 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix const clipboardInterfaceService = this._injector.get(IClipboardInterfaceService); const clipboardItems = await clipboardInterfaceService.read(); const item = clipboardItems[0]; - let eventParams; + let eventParams: IBeforeClipboardPasteEventParams | undefined; if (item) { const types = item.types; const text = @@ -956,7 +1017,7 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix } private _beforeClipboardPaste(params?: ISheetPasteByShortKeyParams): void { - const eventParams = this._generateClipboardPasteParam(params); + const eventParams = this._generateClipboardPasteParam(params) as IBeforeClipboardPasteEventParams; if (!eventParams) return; this.fireEvent(this.Event.BeforeClipboardPaste, eventParams); if (eventParams.cancel) { @@ -965,7 +1026,7 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix } private _clipboardPaste(params?: ISheetPasteByShortKeyParams): void { - const eventParams = this._generateClipboardPasteParam(params); + const eventParams = this._generateClipboardPasteParam(params) as IClipboardPastedEventParams; if (!eventParams) return; this.fireEvent(this.Event.ClipboardPasted, eventParams); if (eventParams.cancel) { @@ -979,7 +1040,7 @@ export class FUniverSheetsUIMixin extends FUniver implements IFUniverSheetsUIMix logService.warn('[Facade]: The navigator object only supports the browser environment'); return; } - const eventParams = await this._generateClipboardPasteParamAsync(); + const eventParams = await this._generateClipboardPasteParamAsync() as IBeforeClipboardPasteEventParams; if (!eventParams) return; this.fireEvent(this.Event.BeforeClipboardPaste, eventParams); if (eventParams.cancel) { diff --git a/packages/sheets-ui/src/facade/f-workbook.ts b/packages/sheets-ui/src/facade/f-workbook.ts index 9d5fa971ef..43662cbeb4 100644 --- a/packages/sheets-ui/src/facade/f-workbook.ts +++ b/packages/sheets-ui/src/facade/f-workbook.ts @@ -18,8 +18,6 @@ import type { IDisposable, Nullable } from '@univerjs/core'; import type { IColumnsHeaderCfgParam, IMouseEvent, IPointerEvent, IRowsHeaderCfgParam, RenderComponentType, RenderManagerService, SpreadsheetColumnHeader, SpreadsheetRowHeader } from '@univerjs/engine-render'; import type { ICellPosWithEvent, IDragCellPosition, IEditorBridgeServiceVisibleParam, IHoverRichTextInfo, IHoverRichTextPosition, IScrollState, SheetSelectionRenderService } from '@univerjs/sheets-ui'; import type { IDialogPartMethodOptions, ISidebarMethodOptions } from '@univerjs/ui'; - -import type { ICellEventParam } from './f-event'; import { awaitTime, ICommandService, ILogService, toDisposable } from '@univerjs/core'; import { DeviceInputEventType, IRenderManagerService } from '@univerjs/engine-render'; import { DragManagerService, HoverManagerService, IEditorBridgeService, ISheetSelectionRenderService, SetCellEditVisibleOperation, SHEET_VIEW_KEY, SheetScrollManagerService } from '@univerjs/sheets-ui'; @@ -361,16 +359,6 @@ export class FWorkbookSheetsUIMixin extends FWorkbook implements IFWorkbookSheet logService.warn('[FWorkbook]', `${name} is deprecated. Please use the function of the same name on "FUniver".`); } - generateCellParams(cell: IHoverRichTextPosition | ICellPosWithEvent): ICellEventParam { - const worksheet = this.getActiveSheet(); - return { - row: cell.row, - column: cell.col, - workbook: this, - worksheet, - }; - } - override onCellClick(callback: (cell: IHoverRichTextInfo) => void): IDisposable { const hoverManagerService = this._injector.get(HoverManagerService); return toDisposable( diff --git a/packages/sheets-ui/src/facade/f-worksheet.ts b/packages/sheets-ui/src/facade/f-worksheet.ts index 3b677133cd..852c5b6177 100644 --- a/packages/sheets-ui/src/facade/f-worksheet.ts +++ b/packages/sheets-ui/src/facade/f-worksheet.ts @@ -29,7 +29,7 @@ import { FWorksheet } from '@univerjs/sheets/facade'; /** * @ignore */ -export interface IFWorksheetSkeletonMixin { +export interface IFWorksheetUIMixin { /** * Refresh the canvas. * @returns {FWorksheet} The FWorksheet instance for chaining. @@ -322,7 +322,7 @@ export interface IFWorksheetSkeletonMixin { onScroll(callback: (params: Nullable) => void): IDisposable; } -export class FWorksheetSkeletonMixin extends FWorksheet implements IFWorksheetSkeletonMixin { +export class FWorksheetUIMixin extends FWorksheet implements IFWorksheetUIMixin { override refreshCanvas(): FWorksheet { const renderManagerService = this._injector.get(IRenderManagerService); const unitId = this._fWorkbook.id; @@ -447,7 +447,7 @@ export class FWorksheetSkeletonMixin extends FWorksheet implements IFWorksheetSk override getSkeleton(): Nullable { const service = this._injector.get(IRenderManagerService).getRenderById(this._workbook.getUnitId())?.with(SheetSkeletonManagerService); - return service?.getWorksheetSkeleton(this._worksheet.getSheetId())?.skeleton; + return service?.getSkeleton(this._worksheet.getSheetId()); } override autoResizeColumn(columnPosition: number): FWorksheet { @@ -578,8 +578,8 @@ export class FWorksheetSkeletonMixin extends FWorksheet implements IFWorksheetSk } } -FWorksheet.extend(FWorksheetSkeletonMixin); +FWorksheet.extend(FWorksheetUIMixin); declare module '@univerjs/sheets/facade' { // eslint-disable-next-line ts/naming-convention - interface FWorksheet extends IFWorksheetSkeletonMixin { } + interface FWorksheet extends IFWorksheetUIMixin { } } diff --git a/packages/sheets-ui/src/index.ts b/packages/sheets-ui/src/index.ts index 344e5c7fc9..18504b87d2 100644 --- a/packages/sheets-ui/src/index.ts +++ b/packages/sheets-ui/src/index.ts @@ -153,13 +153,10 @@ export { SELECTION_SHAPE_DEPTH } from './services/selection/const'; export { SelectionControl, SelectionControl as SelectionShape } from './services/selection/selection-control'; export { SheetSelectionRenderService } from './services/selection/selection-render.service'; export { SelectionShapeExtension } from './services/selection/selection-shape-extension'; -export { attachPrimaryWithCoord, attachRangeWithCoord, attachSelectionWithCoord } from './services/selection/util'; export { SheetSkeletonManagerService } from './services/sheet-skeleton-manager.service'; -export type { ISheetSkeletonManagerParam } from './services/sheet-skeleton-manager.service'; export { SheetsRenderService } from './services/sheets-render.service'; export { IStatusBarService, StatusBarService } from './services/status-bar.service'; export { calculateDocSkeletonRects, getCustomRangePosition, getEditingCustomRangePosition } from './services/utils/doc-skeleton-util'; -export { convertPositionCellToSheetOverGrid, convertPositionSheetOverGridToAbsolute } from './services/utils/drawing-position-util'; export { useKeyEventConfig } from './views/editor-container'; export { FormulaBar } from './views/formula-bar/FormulaBar'; export { MobileSheetBar } from './views/mobile/sheet-bar/MobileSheetBar'; diff --git a/packages/sheets-ui/src/services/__tests__/editor-bridge.service.spec.ts b/packages/sheets-ui/src/services/__tests__/editor-bridge.service.spec.ts index 872e5014fa..9ff9099f48 100644 --- a/packages/sheets-ui/src/services/__tests__/editor-bridge.service.spec.ts +++ b/packages/sheets-ui/src/services/__tests__/editor-bridge.service.spec.ts @@ -33,6 +33,9 @@ function createService(options?: { hasFocusEditor?: boolean }) { fetchThroughInterceptors: vi.fn(() => (cell: unknown) => cell), }, }, + sheetSkeletonService: { + getSkeleton: vi.fn(() => null), + }, renderManagerService: { getRenderUnitById: vi.fn(() => null), }, @@ -54,6 +57,7 @@ function createService(options?: { hasFocusEditor?: boolean }) { const service = new EditorBridgeService( mocks.sheetInterceptorService as any, + mocks.sheetSkeletonService as any, mocks.renderManagerService as any, mocks.themeService as any, mocks.univerInstanceService as any, diff --git a/packages/sheets-ui/src/services/__tests__/sheet-skeleton-manager.service.spec.ts b/packages/sheets-ui/src/services/__tests__/sheet-skeleton-manager.service.spec.ts deleted file mode 100644 index 6488c10787..0000000000 --- a/packages/sheets-ui/src/services/__tests__/sheet-skeleton-manager.service.spec.ts +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Copyright 2023-present DreamNum Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Subject } from 'rxjs'; -import { describe, expect, it, vi } from 'vitest'; -import { SetColumnHeaderHeightCommand, SetRowHeaderWidthCommand } from '../../commands/commands/headersize-changed.command'; -import { ISheetSelectionRenderService } from '../selection/base-selection-render.service'; -import { SheetSkeletonManagerService } from '../sheet-skeleton-manager.service'; - -function createService() { - const sheetDisposed$ = new Subject(); - const worksheets = new Map(); - const workbook = { - sheetDisposed$, - getStyles: vi.fn(() => ({ styles: true })), - getSheetBySheetId: vi.fn((id: string) => worksheets.get(id) ?? null), - }; - - const mainViewport = { left: 46, top: 20 }; - const viewportMap = new Map(); - const getOrCreateViewport = (key: unknown) => { - if (!viewportMap.has(key)) { - viewportMap.set(key, { - setViewportSize: vi.fn(), - left: 12, - width: 46, - }); - } - return viewportMap.get(key); - }; - const scene = { - getViewports: vi.fn(() => [mainViewport]), - getViewport: vi.fn((key: unknown) => getOrCreateViewport(key)), - }; - - const injector = { - createInstance: vi.fn((_cls: unknown, worksheet: unknown, styles: unknown) => ({ - worksheet, - styles, - columnHeaderHeight: 20, - rowHeaderWidth: 46, - makeDirty: vi.fn(), - calculate: vi.fn(), - dispose: vi.fn(), - getNoMergeCellWithCoordByIndex: vi.fn((row: number, col: number) => ({ - startX: col * 10, - startY: row * 10, - endX: col * 10 + 10, - endY: row * 10 + 10, - })), - })), - }; - - const sheetSkService = { - setSkeleton: vi.fn(), - deleteSkeleton: vi.fn(), - }; - - const context = { - unitId: 'unit-1', - unit: workbook, - scene, - }; - - const service = new SheetSkeletonManagerService( - context as any, - injector as any, - sheetSkService as any - ); - - return { - service, - workbook, - worksheets, - scene, - viewportMap, - sheetSkService, - sheetDisposed$, - mainViewport, - }; -} - -describe('SheetSkeletonManagerService', () => { - it('creates/reuses skeleton and handles dirty/current lifecycle', () => { - const { service, worksheets, sheetSkService, workbook } = createService(); - const worksheet = { getSheetId: () => 'sheet-1' }; - worksheets.set('sheet-1', worksheet); - - const beforeValues: any[] = []; - const currentValues: any[] = []; - service.currentSkeletonBefore$.subscribe((value) => beforeValues.push(value)); - service.currentSkeleton$.subscribe((value) => currentValues.push(value)); - - expect(service.getCurrentSkeleton()).toBeUndefined(); - expect(service.getCurrent()).toBeUndefined(); - expect(service.getCurrentParam()).toBeUndefined(); - expect(service.getSkeleton('sheet-1')).toBeNull(); - expect(service.getWorksheetSkeleton('sheet-1')).toBeUndefined(); - - service.setCurrent({ sheetId: 'sheet-1' }); - const param = service.getCurrentParam(); - expect(param?.sheetId).toBe('sheet-1'); - expect(service.getCurrentSkeleton()).toBe(param?.skeleton); - expect(service.getUnitSkeleton('override-unit', 'sheet-1')?.unitId).toBe('override-unit'); - expect(beforeValues.at(-1)?.sheetId).toBe('sheet-1'); - expect(currentValues.at(-1)?.sheetId).toBe('sheet-1'); - expect(sheetSkService.setSkeleton).toHaveBeenCalled(); - - const skeleton = param!.skeleton as any; - service.makeDirty({ sheetId: 'sheet-1' }); - service.reCalculate(param); - expect(skeleton.makeDirty).toHaveBeenCalledWith(true); - expect(skeleton.calculate).toHaveBeenCalled(); - - const ensured = service.ensureSkeleton('sheet-1'); - expect(ensured).toBe(skeleton); - expect(service.getOrCreateSkeleton({ sheetId: 'sheet-1' })).toBe(skeleton); - - expect(service.ensureSkeleton('missing-sheet')).toBeUndefined(); - - const rangeWithCoord = service.attachRangeWithCoord({ - startRow: 1, - endRow: 1, - startColumn: 2, - endColumn: 2, - } as any); - expect(rangeWithCoord).toEqual({ - startRow: 1, - endRow: 1, - startColumn: 2, - endColumn: 2, - startX: 20, - startY: 10, - endX: 30, - endY: 20, - }); - - worksheets.clear(); - service.setCurrent({ sheetId: 'not-found' }); - expect(workbook.getSheetBySheetId).toHaveBeenCalledWith('not-found'); - }); - - it('updates header dimensions and publishes command ids', () => { - const { service, worksheets, scene, viewportMap, mainViewport } = createService(); - const worksheet = { getSheetId: () => 'sheet-1' }; - worksheets.set('sheet-1', worksheet); - service.setCurrent({ sheetId: 'sheet-1' }); - - const selectionService = { getCurrentSelections: vi.fn(() => [{ range: 1 }]) }; - const selectionRenderService = { resetSelectionsByModelData: vi.fn() }; - const render = { - unitId: 'unit-1', - scene, - with: vi.fn((token: unknown) => { - if (token === ISheetSelectionRenderService) { - return selectionRenderService; - } - return selectionService; - }), - }; - - service.setColumnHeaderSize(render as any, 'sheet-1', 32); - const skeleton = service.getSkeleton('sheet-1') as any; - expect(skeleton.columnHeaderHeight).toBe(32); - expect(mainViewport.top).toBe(32); - const viewportCalls = Array.from(viewportMap.values()).flatMap((v) => v.setViewportSize.mock.calls); - expect(viewportCalls.some((args) => args[0]?.height === 32)).toBe(true); - expect(viewportCalls.some((args) => args[0]?.top === 32)).toBe(true); - expect(selectionRenderService.resetSelectionsByModelData).toHaveBeenCalledWith([{ range: 1 }]); - expect(service.getSkeletonParam('sheet-1')?.commandId).toBe(SetColumnHeaderHeightCommand.id); - - service.setRowHeaderSize(render as any, 'sheet-1', 60); - expect(skeleton.rowHeaderWidth).toBe(60); - expect(mainViewport.left).toBe(60); - const viewportCallsAfter = Array.from(viewportMap.values()).flatMap((v) => v.setViewportSize.mock.calls); - expect(viewportCallsAfter.some((args) => args[0]?.width === 60)).toBe(true); - expect(viewportCallsAfter.some((args) => args[0]?.left === 26)).toBe(true); - expect(service.getCurrentParam()?.commandId).toBe(SetRowHeaderWidthCommand.id); - - service.setColumnHeaderSize(null as any, 'sheet-1', 20); - service.setRowHeaderSize(null as any, 'sheet-1', 20); - service.disposeSkeleton('sheet-missing'); - }); - - it('disposes skeleton on sheet disposal and service dispose', () => { - const { service, worksheets, sheetDisposed$, sheetSkService } = createService(); - const worksheet = { getSheetId: () => 'sheet-1' }; - worksheets.set('sheet-1', worksheet); - service.setCurrent({ sheetId: 'sheet-1' }); - - const skeleton = service.getSkeleton('sheet-1') as any; - expect(skeleton).toBeTruthy(); - - sheetDisposed$.next({ - getSheetId: () => 'sheet-1', - }); - expect(skeleton.dispose).toHaveBeenCalled(); - expect(sheetSkService.deleteSkeleton).toHaveBeenCalledWith(expect.any(String), 'sheet-1'); - expect(service.getSkeleton('sheet-1')).toBeNull(); - - service.dispose(); - }); -}); diff --git a/packages/sheets-ui/src/services/canvas-pop-manager.service.ts b/packages/sheets-ui/src/services/canvas-pop-manager.service.ts index 4b6c94cac6..7b278a3ba8 100644 --- a/packages/sheets-ui/src/services/canvas-pop-manager.service.ts +++ b/packages/sheets-ui/src/services/canvas-pop-manager.service.ts @@ -344,9 +344,7 @@ export class SheetCanvasPopManagerService extends Disposable { return; } - const skeleton = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService).getOrCreateSkeleton({ - sheetId: subUnitId, - }); + const skeleton = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService).ensureSkeleton(subUnitId); const currentRender = this._renderManagerService.getRenderById(unitId); if (!currentRender || !skeleton) { @@ -544,9 +542,7 @@ export class SheetCanvasPopManagerService extends Disposable { return null; } const currentRender = this._renderManagerService.getRenderById(unitId); - const skeleton = currentRender?.with(SheetSkeletonManagerService).getOrCreateSkeleton({ - sheetId: subUnitId, - }); + const skeleton = currentRender?.with(SheetSkeletonManagerService).ensureSkeleton(subUnitId); const sheetSelectionRenderService = currentRender?.with(ISheetSelectionRenderService); if (!currentRender || !skeleton || !sheetSelectionRenderService) { diff --git a/packages/sheets-ui/src/services/clipboard/__tests__/clipboard-test-bed.ts b/packages/sheets-ui/src/services/clipboard/__tests__/clipboard-test-bed.ts index c77b43ed49..1ba4944e74 100644 --- a/packages/sheets-ui/src/services/clipboard/__tests__/clipboard-test-bed.ts +++ b/packages/sheets-ui/src/services/clipboard/__tests__/clipboard-test-bed.ts @@ -21,7 +21,6 @@ import { DisposableCollection, ILogService, Inject, Injector, IUniverInstanceSer import { CalculateFormulaService, DefinedNamesService, FormulaCurrentConfigService, FormulaDataModel, FormulaRuntimeService, HyperlinkEngineFormulaService, ICalculateFormulaService, IDefinedNamesService, IFormulaCurrentConfigService, IFormulaRuntimeService, IHyperlinkEngineFormulaService, LexerTreeBuilder } from '@univerjs/engine-formula'; import { IRenderManagerService, RenderManagerService } from '@univerjs/engine-render'; import { SheetInterceptorService, SheetSkeletonService, SheetsSelectionsService } from '@univerjs/sheets'; - import { BrowserClipboardService, DesktopMessageService, @@ -609,7 +608,7 @@ export function clipboardTestBed(workbookData?: IWorkbookData, dependencies?: De activated$: new BehaviorSubject(true), activate: () => {}, deactivate: () => {}, - }, injector, injector.get(SheetSkeletonService)); + }, injector.get(SheetSkeletonService)); injector.add([SheetSkeletonManagerService, { useValue: fakeSheetSkeletonManagerService }]); injector.get(IRenderManagerService).addRender('test', { diff --git a/packages/sheets-ui/src/services/clipboard/html-to-usm/converter.ts b/packages/sheets-ui/src/services/clipboard/html-to-usm/converter.ts index 459cbf1b08..d14dce40be 100644 --- a/packages/sheets-ui/src/services/clipboard/html-to-usm/converter.ts +++ b/packages/sheets-ui/src/services/clipboard/html-to-usm/converter.ts @@ -18,7 +18,7 @@ import type { ICustomRange, IDocumentBody, IDocumentData, ITextRun, ITextStyle, Nullable } from '@univerjs/core'; import type { SpreadsheetSkeleton } from '@univerjs/engine-render'; -import type { ISheetSkeletonManagerParam } from '../../sheet-skeleton-manager.service'; +import type { ISheetSkeletonManagerParam } from '@univerjs/sheets'; import type { ICellDataWithSpanInfo, IClipboardPropertyItem, diff --git a/packages/sheets-ui/src/services/drag-manager.service.ts b/packages/sheets-ui/src/services/drag-manager.service.ts index d797947f50..be5b047469 100644 --- a/packages/sheets-ui/src/services/drag-manager.service.ts +++ b/packages/sheets-ui/src/services/drag-manager.service.ts @@ -74,7 +74,6 @@ export class DragManagerService extends Disposable { const worksheet = workbook.getActiveSheet(); if (!worksheet) return; - // const skeletonParam = this._sheetSkeletonManagerService.getCurrent(); const currentRender = this._renderManagerService.getRenderById(workbook.getUnitId()); if (!currentRender) return; diff --git a/packages/sheets-ui/src/services/editor-bridge.service.ts b/packages/sheets-ui/src/services/editor-bridge.service.ts index 2b9a43e3cf..1ad036b105 100644 --- a/packages/sheets-ui/src/services/editor-bridge.service.ts +++ b/packages/sheets-ui/src/services/editor-bridge.service.ts @@ -35,11 +35,9 @@ import { } from '@univerjs/core'; import { getCanvasOffsetByEngine, IEditorService } from '@univerjs/docs-ui'; import { convertTextRotation, convertTransformToOffsetX, convertTransformToOffsetY, DeviceInputEventType, IRenderManagerService } from '@univerjs/engine-render'; -import { BEFORE_CELL_EDIT, SheetInterceptorService } from '@univerjs/sheets'; +import { attachPrimaryWithCoord, BEFORE_CELL_EDIT, SheetInterceptorService, SheetSkeletonService } from '@univerjs/sheets'; import { BehaviorSubject, map, switchMap } from 'rxjs'; import { ISheetSelectionRenderService } from './selection/base-selection-render.service'; -import { attachPrimaryWithCoord } from './selection/util'; -import { SheetSkeletonManagerService } from './sheet-skeleton-manager.service'; export interface IEditorBridgeServiceVisibleParam { visible: boolean; @@ -146,6 +144,7 @@ export class EditorBridgeService extends Disposable implements IEditorBridgeServ constructor( @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService, + @Inject(SheetSkeletonService) private readonly _sheetSkeletonService: SheetSkeletonService, @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, @Inject(ThemeService) private readonly _themeService: ThemeService, @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, @@ -183,36 +182,30 @@ export class EditorBridgeService extends Disposable implements IEditorBridgeServ } refreshEditCellPosition(resetSizeOnly?: boolean) { - const currentEditCell = this._currentEditCell; - if (currentEditCell == null) { - return; - } + if (!this._currentEditCell || !this._currentEditCellState) return; - const currentSheet = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET); - if (!currentSheet) return; + const { unitId, sheetId, primary, scene, engine } = this._currentEditCell; + const workbook = this._univerInstanceService.getCurrentUnitOfType(UniverInstanceType.UNIVER_SHEET); + if (!workbook || workbook.getUnitId() !== unitId) return; - const ru = this._renderManagerService.getRenderUnitById(currentSheet.getUnitId()); - if (!ru) return; + const worksheet = workbook.getActiveSheet(); + if (!worksheet || worksheet.getSheetId() !== sheetId) return; - const skeleton = ru.with(SheetSkeletonManagerService).getSkeletonParam(currentEditCell.sheetId)?.skeleton; - const selectionRenderService = ru.with(ISheetSelectionRenderService); + const renderUnit = this._renderManagerService.getRenderUnitById(unitId); + if (!renderUnit) return; + + const skeleton = this._sheetSkeletonService.getSkeleton(unitId, sheetId); if (!skeleton) return; - if (!this._currentEditCellState) return; - const { primary, scene, engine } = currentEditCell; const primaryWithCoord = attachPrimaryWithCoord(skeleton, primary); - if (primaryWithCoord == null) { - return; - } - const actualRangeWithCoord = convertCellToRange(primaryWithCoord); const canvasOffset = getCanvasOffsetByEngine(engine); let { startX, startY, endX, endY } = actualRangeWithCoord; const { scaleX, scaleY } = scene.getAncestorScale(); + const scrollXY = scene.getViewportScrollXY(renderUnit.with(ISheetSelectionRenderService).getViewPort()); - const scrollXY = scene.getViewportScrollXY(selectionRenderService.getViewPort()); startX = convertTransformToOffsetX(startX, scaleX, scrollXY); startY = convertTransformToOffsetY(startY, scaleY, scrollXY); endX = convertTransformToOffsetX(endX, scaleX, scrollXY); @@ -306,40 +299,36 @@ export class EditorBridgeService extends Disposable implements IEditorBridgeServ // eslint-disable-next-line max-lines-per-function, complexity getLatestEditCellState() { - const currentEditCell = this._currentEditCell; - if (currentEditCell == null) return; + if (!this._currentEditCell) return; - const workbook = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET); - if (!workbook) return; + const { unitId, sheetId, primary, scene, engine } = this._currentEditCell; + const workbook = this._univerInstanceService.getCurrentUnitOfType(UniverInstanceType.UNIVER_SHEET); + if (!workbook || workbook.getUnitId() !== unitId) return; - const ru = this._renderManagerService.getRenderUnitById(workbook.getUnitId()); - if (!ru) return; + const worksheet = workbook.getActiveSheet(); + if (!worksheet || worksheet.getSheetId() !== sheetId) return; - const skeleton = ru.with(SheetSkeletonManagerService).getCurrentSkeleton(); - const selectionRenderService = ru.with(ISheetSelectionRenderService); + const renderUnit = this._renderManagerService.getRenderUnitById(unitId); + if (!renderUnit) return; + + const skeleton = this._sheetSkeletonService.getSkeleton(unitId, sheetId); if (!skeleton) return; - const { primary, unitId, sheetId, scene, engine } = currentEditCell; const { startRow, startColumn } = primary; const primaryWithCoord = attachPrimaryWithCoord(skeleton, primary); - if (primaryWithCoord == null) return; - const actualRangeWithCoord = convertCellToRange(primaryWithCoord); const canvasOffset = getCanvasOffsetByEngine(engine); let { startX, startY, endX, endY } = actualRangeWithCoord; const { scaleX, scaleY } = scene.getAncestorScale(); + const scrollXY = scene.getViewportScrollXY(renderUnit.with(ISheetSelectionRenderService).getViewPort()); - const scrollXY = scene.getViewportScrollXY(selectionRenderService.getViewPort()); startX = convertTransformToOffsetX(startX, scaleX, scrollXY); startY = convertTransformToOffsetY(startY, scaleY, scrollXY); endX = convertTransformToOffsetX(endX, scaleX, scrollXY); endY = convertTransformToOffsetY(endY, scaleY, scrollXY); - const worksheet = workbook.getActiveSheet(); - if (!worksheet) return; - const location = { workbook, worksheet, diff --git a/packages/sheets-ui/src/services/hover-manager.service.ts b/packages/sheets-ui/src/services/hover-manager.service.ts index 80d00f93db..41c65d668f 100644 --- a/packages/sheets-ui/src/services/hover-manager.service.ts +++ b/packages/sheets-ui/src/services/hover-manager.service.ts @@ -16,8 +16,7 @@ import type { ICustomRange, IParagraph, IPosition, Nullable, Workbook, Worksheet } from '@univerjs/core'; import type { IBoundRectNoAngle, IDocumentSkeletonDrawing, IMouseEvent, IPointerEvent, IRender } from '@univerjs/engine-render'; -import type { ISheetLocation, ISheetLocationBase } from '@univerjs/sheets'; -import type { ISheetSkeletonManagerParam } from './sheet-skeleton-manager.service'; +import type { ISheetLocation, ISheetLocationBase, ISheetSkeletonManagerParam } from '@univerjs/sheets'; import { Disposable, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { IRenderManagerService, SHEET_VIEWPORT_KEY, Vector2 } from '@univerjs/engine-render'; import { BehaviorSubject, distinctUntilChanged, map, of, Subject } from 'rxjs'; diff --git a/packages/sheets-ui/src/services/mark-selection/mark-selection.service.ts b/packages/sheets-ui/src/services/mark-selection/mark-selection.service.ts index eda3c1af66..dc33d160a7 100644 --- a/packages/sheets-ui/src/services/mark-selection/mark-selection.service.ts +++ b/packages/sheets-ui/src/services/mark-selection/mark-selection.service.ts @@ -19,11 +19,9 @@ import type { RenderUnit } from '@univerjs/engine-render'; import type { ISelectionWithStyle } from '@univerjs/sheets'; import { createIdentifier, Disposable, generateRandomId, Inject, IUniverInstanceService, ThemeService, UniverInstanceType } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; - +import { attachSelectionWithCoord, SheetSkeletonService } from '@univerjs/sheets'; import { SELECTION_SHAPE_DEPTH } from '../selection/const'; import { SelectionControl } from '../selection/selection-control'; -import { attachSelectionWithCoord } from '../selection/util'; -import { SheetSkeletonManagerService } from '../sheet-skeleton-manager.service'; export interface IMarkSelectionService { addShape(selection: ISelectionWithStyle, exits?: string[], zIndex?: number): string | null; @@ -56,6 +54,7 @@ export class MarkSelectionService extends Disposable implements IMarkSelectionSe constructor( @IUniverInstanceService private readonly _currentService: IUniverInstanceService, + @Inject(SheetSkeletonService) private readonly _sheetSkeletonService: SheetSkeletonService, @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, @Inject(ThemeService) private readonly _themeService: ThemeService ) { @@ -116,7 +115,7 @@ export class MarkSelectionService extends Disposable implements IMarkSelectionSe const renderUnit = this._renderManagerService.getRenderById(unitId) as RenderUnit; if (!renderUnit) return; - const skeleton = renderUnit.with(SheetSkeletonManagerService).getCurrentSkeleton(); + const skeleton = this._sheetSkeletonService.getSkeleton(unitId, subUnitId); if (!skeleton) return; const { scene } = renderUnit; diff --git a/packages/sheets-ui/src/services/selection/__tests__/util.spec.ts b/packages/sheets-ui/src/services/selection/__tests__/util.spec.ts index 4376c91065..7ddb0f8458 100644 --- a/packages/sheets-ui/src/services/selection/__tests__/util.spec.ts +++ b/packages/sheets-ui/src/services/selection/__tests__/util.spec.ts @@ -14,8 +14,8 @@ * limitations under the License. */ +import { attachPrimaryWithCoord, attachRangeWithCoord, attachSelectionWithCoord } from '@univerjs/sheets'; import { describe, expect, it } from 'vitest'; -import { attachPrimaryWithCoord, attachRangeWithCoord, attachSelectionWithCoord } from '../util'; describe('selection util', () => { it('should attach coordinates and normalize reversed ranges', () => { diff --git a/packages/sheets-ui/src/services/selection/base-selection-render.service.ts b/packages/sheets-ui/src/services/selection/base-selection-render.service.ts index 0382462b9e..8770499da2 100644 --- a/packages/sheets-ui/src/services/selection/base-selection-render.service.ts +++ b/packages/sheets-ui/src/services/selection/base-selection-render.service.ts @@ -15,7 +15,6 @@ */ import type { - ICellInfo, ICellWithCoord, IContextService, IDisposable, @@ -32,7 +31,6 @@ import type { Theme } from '@univerjs/themes'; import type { IShortcutService } from '@univerjs/ui'; import type { Observable, Subscription } from 'rxjs'; import type { SheetSkeletonManagerService } from '../sheet-skeleton-manager.service'; - import { convertCellToRange, createIdentifier, @@ -42,13 +40,12 @@ import { ThemeService, } from '@univerjs/core'; import { ScrollTimer, ScrollTimerType, SHEET_VIEWPORT_KEY, Vector2 } from '@univerjs/engine-render'; -import { convertPrimaryWithCoordToPrimary, REF_SELECTIONS_ENABLED, SELECTIONS_ENABLED } from '@univerjs/sheets'; +import { attachSelectionWithCoord, convertPrimaryWithCoordToPrimary, REF_SELECTIONS_ENABLED, SELECTIONS_ENABLED } from '@univerjs/sheets'; import { BehaviorSubject, Subject } from 'rxjs'; import { SHEET_COMPONENT_SELECTION_LAYER_INDEX } from '../../common/keys'; import { genNormalSelectionStyle, RANGE_FILL_PERMISSION_CHECK, RANGE_MOVE_PERMISSION_CHECK } from './const'; import { SelectionControl } from './selection-control'; import { SelectionLayer } from './selection-layer'; -import { attachPrimaryWithCoord, attachSelectionWithCoord } from './util'; export interface IControlFillConfig { oldRange: IRange; @@ -75,14 +72,6 @@ export interface ISheetSelectionRenderService { getSelectionControls(): SelectionControl[]; - // The following methods are used to get range locations in a worksheet. Though `attachRangeWithCoord` should not happens here. - // And `attachPrimaryWithCoord` is redundant. - - /** @deprecated Use the function `attachSelectionWithCoord` instead. */ - attachSelectionWithCoord(selectionWithStyle: ISelectionWithStyle): ISelectionWithCoord; - /** @deprecated Use the function `attachPrimaryWithCoord` instead`. */ - attachPrimaryWithCoord(primary: Nullable>): Nullable; - /** * @deprecated Please use `getCellWithCoordByOffset` instead. */ @@ -652,16 +641,6 @@ export class BaseSelectionRenderService extends Disposable implements ISheetSele // #endregion } - /** @deprecated Use the function `attachSelectionWithCoord` instead`. */ - attachSelectionWithCoord(selectionWithStyle: ISelectionWithStyle): ISelectionWithCoord { - return attachSelectionWithCoord(selectionWithStyle, this._skeleton); - } - - /** @deprecated Use the function `attachPrimaryWithCoord` instead`. */ - attachPrimaryWithCoord(primary: ICellInfo): ICellWithCoord { - return attachPrimaryWithCoord(this._skeleton, primary) as unknown as ICellWithCoord; - } - /** * @deprecated Please use `getCellWithCoordByOffset` instead. */ diff --git a/packages/sheets-ui/src/services/selection/mobile-selection-render.service.ts b/packages/sheets-ui/src/services/selection/mobile-selection-render.service.ts index 0b1685f566..19e15af264 100644 --- a/packages/sheets-ui/src/services/selection/mobile-selection-render.service.ts +++ b/packages/sheets-ui/src/services/selection/mobile-selection-render.service.ts @@ -40,7 +40,7 @@ import { toDisposable, } from '@univerjs/core'; import { ScrollTimer, ScrollTimerType, SHEET_VIEWPORT_KEY, Vector2 } from '@univerjs/engine-render'; -import { convertSelectionDataToRange, REF_SELECTIONS_ENABLED, SelectionMoveType, SetSelectionsOperation, SheetsSelectionsService } from '@univerjs/sheets'; +import { attachSelectionWithCoord, convertSelectionDataToRange, REF_SELECTIONS_ENABLED, SelectionMoveType, SetSelectionsOperation, SheetsSelectionsService } from '@univerjs/sheets'; import { IShortcutService } from '@univerjs/ui'; import { distinctUntilChanged, merge, startWith } from 'rxjs'; import { MOBILE_EXPANDING_SELECTION, MOBILE_PINCH_ZOOMING } from '../../consts/mobile-context'; @@ -50,7 +50,6 @@ import { SheetScrollManagerService } from '../scroll-manager.service'; import { SheetSkeletonManagerService } from '../sheet-skeleton-manager.service'; import { BaseSelectionRenderService, getTopLeftSelectionOfCurrSheet, selectionDataForSelectAll } from './base-selection-render.service'; import { MobileSelectionControl } from './mobile-selection-shape'; -import { attachSelectionWithCoord } from './util'; enum ExpandingControl { BOTTOM_RIGHT = 'bottom-right', diff --git a/packages/sheets-ui/src/services/selection/selection-render.service.ts b/packages/sheets-ui/src/services/selection/selection-render.service.ts index a4b57690f2..8102059871 100644 --- a/packages/sheets-ui/src/services/selection/selection-render.service.ts +++ b/packages/sheets-ui/src/services/selection/selection-render.service.ts @@ -21,7 +21,7 @@ import type { ISheetObjectParam } from '../../controllers/utils/component-tools' import type { SelectionControl } from './selection-control'; import { ICommandService, IContextService, ILogService, Inject, Injector, RANGE_TYPE, Rectangle, set, ThemeService, toDisposable } from '@univerjs/core'; import { ScrollTimerType, SHEET_VIEWPORT_KEY, Vector2 } from '@univerjs/engine-render'; -import { convertSelectionDataToRange, REF_SELECTIONS_ENABLED, SelectionMoveType, SELECTIONS_ENABLED, SetSelectionsOperation, SheetsSelectionsService } from '@univerjs/sheets'; +import { attachSelectionWithCoord, convertSelectionDataToRange, REF_SELECTIONS_ENABLED, SelectionMoveType, SELECTIONS_ENABLED, SetSelectionsOperation, SheetsSelectionsService } from '@univerjs/sheets'; import { IShortcutService } from '@univerjs/ui'; import { distinctUntilChanged, merge, startWith } from 'rxjs'; import { getCoordByOffset, getSheetObject } from '../../controllers/utils/component-tools'; @@ -30,7 +30,6 @@ import { isThisColSelected, isThisRowSelected } from '../../controllers/utils/se import { SheetSkeletonManagerService } from '../sheet-skeleton-manager.service'; import { BaseSelectionRenderService, getTopLeftSelectionOfCurrSheet, selectionDataForSelectAll } from './base-selection-render.service'; import { genNormalSelectionStyle } from './const'; -import { attachSelectionWithCoord } from './util'; /** * This services controls rendering of normal selections in a render unit. diff --git a/packages/sheets-ui/src/services/selection/selection-shape-extension.ts b/packages/sheets-ui/src/services/selection/selection-shape-extension.ts index 72db0965a0..b0b8313c1f 100644 --- a/packages/sheets-ui/src/services/selection/selection-shape-extension.ts +++ b/packages/sheets-ui/src/services/selection/selection-shape-extension.ts @@ -21,11 +21,10 @@ import type { Subscription } from 'rxjs'; import type { SelectionControl } from './selection-control'; import { ColorKit, IUniverInstanceService, Quantity, UniverInstanceType } from '@univerjs/core'; import { CURSOR_TYPE, IRenderManagerService, Rect, ScrollTimer, ScrollTimerType, SHEET_VIEWPORT_KEY, Vector2, withCurrentTypeOfRenderer } from '@univerjs/engine-render'; -import { SELECTION_CONTROL_BORDER_BUFFER_WIDTH } from '@univerjs/sheets'; +import { attachSelectionWithCoord, SELECTION_CONTROL_BORDER_BUFFER_WIDTH } from '@univerjs/sheets'; import { SheetSkeletonManagerService } from '../sheet-skeleton-manager.service'; import { ISheetSelectionRenderService } from './base-selection-render.service'; import { genNormalSelectionStyle, RANGE_FILL_PERMISSION_CHECK, RANGE_MOVE_PERMISSION_CHECK } from './const'; -import { attachSelectionWithCoord } from './util'; const HELPER_SELECTION_TEMP_NAME = '__SpreadsheetHelperSelectionTempRect'; diff --git a/packages/sheets-ui/src/services/sheet-skeleton-manager.service.ts b/packages/sheets-ui/src/services/sheet-skeleton-manager.service.ts index 11d2677f96..09c6f3f5f3 100644 --- a/packages/sheets-ui/src/services/sheet-skeleton-manager.service.ts +++ b/packages/sheets-ui/src/services/sheet-skeleton-manager.service.ts @@ -14,24 +14,15 @@ * limitations under the License. */ -import type { IRange, IRangeWithCoord, Nullable, Workbook, Worksheet } from '@univerjs/core'; -import type { IRender, IRenderContext, IRenderModule, Scene } from '@univerjs/engine-render'; -import { Disposable, Inject, Injector } from '@univerjs/core'; -import { SHEET_VIEWPORT_KEY, SpreadsheetSkeleton } from '@univerjs/engine-render'; +import type { Nullable, Workbook } from '@univerjs/core'; +import type { IRender, IRenderContext, IRenderModule, SpreadsheetSkeleton } from '@univerjs/engine-render'; +import type { ISheetSkeletonManagerParam } from '@univerjs/sheets'; +import { Disposable, Inject } from '@univerjs/core'; +import { SHEET_VIEWPORT_KEY } from '@univerjs/engine-render'; import { SheetSkeletonService, SheetsSelectionsService } from '@univerjs/sheets'; import { BehaviorSubject } from 'rxjs'; import { SetColumnHeaderHeightCommand, SetRowHeaderWidthCommand } from '../commands/commands/headersize-changed.command'; import { ISheetSelectionRenderService } from './selection/base-selection-render.service'; -import { attachRangeWithCoord } from './selection/util'; - - // Why need this SkParam? what is Param used for? Could unitId & sheetId & dirty in skeleton itself ? -export interface ISheetSkeletonManagerParam { - unitId: string; - sheetId: string; - skeleton: SpreadsheetSkeleton; - dirty: boolean; - commandId?: string; -} export interface ISheetSkeletonManagerSearch { sheetId: string; @@ -44,9 +35,6 @@ export interface ISheetSkeletonManagerSearch { export class SheetSkeletonManagerService extends Disposable implements IRenderModule { private _sheetId: string = ''; - // @TODO lumixraku, why need this? How about put dirty & sheetId & unitId in skeleton itself? - private _sheetSkeletonParamStore: Map = new Map(); - private readonly _currentSkeleton$ = new BehaviorSubject>(null); readonly currentSkeleton$ = this._currentSkeleton$.asObservable(); @@ -58,43 +46,24 @@ export class SheetSkeletonManagerService extends Disposable implements IRenderMo constructor( private readonly _context: IRenderContext, - @Inject(Injector) private readonly _injector: Injector, - @Inject(SheetSkeletonService) private readonly _sheetSkService: SheetSkeletonService + @Inject(SheetSkeletonService) private readonly _sheetSkeletonService: SheetSkeletonService ) { - // empty super(); - - this.disposeWithMe(() => { - this._currentSkeletonBefore$.complete(); - this._currentSkeleton$.complete(); - - this._sheetSkeletonParamStore.forEach((sk) => this.disposeSkeleton(sk.sheetId)); - this._sheetSkeletonParamStore.clear(); - }); - - this._initRemoveSheet(); } - private _initRemoveSheet() { - this.disposeWithMe(this._context.unit.sheetDisposed$.subscribe((sheet) => { - this.disposeSkeleton(sheet.getSheetId()); - })); + override dispose(): void { + super.dispose(); + + this._currentSkeletonBefore$.complete(); + this._currentSkeleton$.complete(); } getCurrentSkeleton(): Nullable { return this.getCurrentParam()?.skeleton; } - /** - * @deprecated use `getCurrentSkeleton` instead. - */ - getCurrent(): Nullable { - return this.getCurrentParam(); - } - /** * get ISheetSkeletonManagerParam from _currentSkeletonSearchParam - * @returns */ getCurrentParam(): Nullable { return this._getSkeletonParam(this._sheetId); @@ -102,7 +71,6 @@ export class SheetSkeletonManagerService extends Disposable implements IRenderMo /** * Get skeleton by sheetId - * @param sheetId */ getSkeleton(sheetId: string): Nullable { return this._getSkeleton(sheetId); @@ -110,83 +78,54 @@ export class SheetSkeletonManagerService extends Disposable implements IRenderMo /** * Get SkeletonParam by sheetId - * @param sheetId */ getSkeletonParam(sheetId: string): Nullable { return this._getSkeletonParam(sheetId); } - /** - * @deprecated use `getSkeleton` instead. - */ - getWorksheetSkeleton(sheetId: string): Nullable { - return this.getSkeletonParam(sheetId); - } - - // why ?? what does unitId for ??? no need unitId, this service is registered in render unit already. - getUnitSkeleton(unitId: string, sheetId: string): Nullable { - const param = this._getSkeletonParam(sheetId); - if (param != null) { - // unitId is never read? - param.unitId = unitId; - } - return param; - } - /** * Command in COMMAND_LISTENER_SKELETON_CHANGE would cause setCurrent, see @packages/sheets-ui/src/controllers/render-controllers/sheet.render-controller.ts - * @param searchParam */ - setCurrent(searchParam: ISheetSkeletonManagerSearch): Nullable { + setCurrent(searchParam: ISheetSkeletonManagerSearch) { this._setCurrent(searchParam.sheetId); } - setSkeletonParam(sheetId: string, skp: ISheetSkeletonManagerParam) { - this._sheetSkService.setSkeleton(skp.unitId, sheetId, skp.skeleton); - this._sheetSkeletonParamStore.set(sheetId, skp); - } - - private _setCurrent(sheetId: string): Nullable { + private _setCurrent(sheetId: string) { this._sheetId = sheetId; - const skParam = this._getSkeletonParam(sheetId); - const unitId = this._context.unitId; - if (skParam != null) { - this.reCalculate(skParam); - } else { + + let skeletonParam = this._getSkeletonParam(sheetId); + if (!skeletonParam) { const workbook = this._context.unit; const worksheet = workbook.getSheetBySheetId(sheetId); - if (worksheet == null) { + const unitId = this._context.unitId; + + if (!worksheet) { return; } - const scene = this._context.scene; - const skeleton = this._buildSkeleton(worksheet, scene); - this.setSkeletonParam(sheetId, { - unitId, - sheetId, - skeleton, - dirty: false, - }); + skeletonParam = this._sheetSkeletonService.newSkeletonParam(unitId, sheetId, worksheet, workbook.getStyles()); + } else { + this.reCalculate(skeletonParam); } - const sheetSkeletonManagerParam = this._getSkeletonParam(sheetId); - this._currentSkeletonBefore$.next(sheetSkeletonManagerParam); - this._currentSkeleton$.next(sheetSkeletonManagerParam); + this._currentSkeletonBefore$.next(skeletonParam); + this._currentSkeleton$.next(skeletonParam); } // @TODO why need this function? How about caller get skeleton and call sk.calculate()? reCalculate(param?: Nullable) { - if (!param) { - param = this.getCurrentParam(); - } - if (param == null) { + const skeletonParam = param || this.getCurrentParam(); + + if (!skeletonParam) { return; } - if (param.dirty) { - param.skeleton.makeDirty(true); - param.dirty = false; + + if (skeletonParam.dirty) { + skeletonParam.skeleton.makeDirty(true); + skeletonParam.dirty = false; } - param.skeleton.calculate(); + + skeletonParam.skeleton.calculate(); } /** @@ -202,77 +141,21 @@ export class SheetSkeletonManagerService extends Disposable implements IRenderMo param.dirty = state; } - /** - * @deprecated Use function `ensureSkeleton` instead. - * @param searchParam - */ - getOrCreateSkeleton(searchParam: ISheetSkeletonManagerSearch) { - return this.ensureSkeleton(searchParam.sheetId); - } - - ensureSkeleton(sheetId: string) { - const skeleton = this._getSkeletonParam(sheetId); - if (skeleton) { - return skeleton.skeleton; - } - - const workbook = this._context.unit; - const worksheet = workbook.getSheetBySheetId(sheetId); - if (!worksheet) { - return; - } - - const newSkeleton = this._buildSkeleton(worksheet); - this.setSkeletonParam(sheetId, { - unitId: this._context.unitId, - sheetId, - skeleton: newSkeleton, - dirty: false, - }); - - return newSkeleton; - } - - disposeSkeleton(sheetId: string) { - const skParam = this.getSkeletonParam(sheetId); - if (skParam) { - skParam.skeleton.dispose(); - this._sheetSkeletonParamStore.delete(sheetId); - this._sheetSkService.deleteSkeleton(skParam.unitId, sheetId); - } - } - - /** @deprecated Use function `attachRangeWithCoord` instead. */ - attachRangeWithCoord(range: IRange): Nullable { - const skeleton = this.getCurrentSkeleton(); - if (!skeleton) return null; - - return attachRangeWithCoord(skeleton, range); + ensureSkeleton(sheetId: string): SpreadsheetSkeleton | undefined { + return this._sheetSkeletonService.ensureSkeleton(this._context.unitId, sheetId); } private _getSkeletonParam(sheetId: string): Nullable { - const item = this._sheetSkeletonParamStore.get(sheetId); - return item; + return this._sheetSkeletonService.getSkeletonParam(this._context.unitId, sheetId); } private _getSkeleton(sheetId: string): Nullable { - const param = this._getSkeletonParam(sheetId); - return param ? param.skeleton : null; - } - - private _buildSkeleton(worksheet: Worksheet, _scene?: Nullable) { - const spreadsheetSkeleton = this._injector.createInstance( - SpreadsheetSkeleton, - worksheet, - this._context.unit.getStyles() - ); - - return spreadsheetSkeleton; + return this._sheetSkeletonService.getSkeleton(this._context.unitId, sheetId); } setColumnHeaderSize(render: Nullable, sheetId: string, size: number) { if (!render) return; - const skeleton = this.getWorksheetSkeleton(sheetId)?.skeleton; + const skeleton = this.getSkeleton(sheetId); if (!skeleton) return; skeleton.columnHeaderHeight = size; @@ -297,7 +180,7 @@ export class SheetSkeletonManagerService extends Disposable implements IRenderMo const currSelections = selectionService.getCurrentSelections(); selectionRenderService.resetSelectionsByModelData(currSelections); - const sheetSkeletonManagerParam = this.getUnitSkeleton(render.unitId, sheetId); + const sheetSkeletonManagerParam = this._sheetSkeletonService.getSkeletonParam(render.unitId, sheetId); if (sheetSkeletonManagerParam) { sheetSkeletonManagerParam.commandId = SetColumnHeaderHeightCommand.id; this._currentSkeleton$.next(sheetSkeletonManagerParam); @@ -305,9 +188,10 @@ export class SheetSkeletonManagerService extends Disposable implements IRenderMo } setRowHeaderSize(render: Nullable, sheetId: string, size: number) { - const skeleton = this.getWorksheetSkeleton(sheetId)?.skeleton; if (!render) return; + const skeleton = this.getSkeleton(sheetId); if (!skeleton) return; + skeleton.rowHeaderWidth = size; const originWidth = render.scene.getViewport(SHEET_VIEWPORT_KEY.VIEW_LEFT_TOP)!.width || 46; const deltaX = size - originWidth; @@ -336,7 +220,7 @@ export class SheetSkeletonManagerService extends Disposable implements IRenderMo const currSelections = selectionService.getCurrentSelections(); selectionRenderService.resetSelectionsByModelData(currSelections); - const sheetSkeletonManagerParam = this.getCurrent(); + const sheetSkeletonManagerParam = this._sheetSkeletonService.getSkeletonParam(render.unitId, sheetId); if (sheetSkeletonManagerParam) { sheetSkeletonManagerParam.commandId = SetRowHeaderWidthCommand.id; this._currentSkeleton$.next(sheetSkeletonManagerParam); diff --git a/packages/sheets-ui/src/services/utils/__tests__/drawing-position-util.spec.ts b/packages/sheets-ui/src/services/utils/__tests__/drawing-position-util.spec.ts deleted file mode 100644 index a2b4546e1e..0000000000 --- a/packages/sheets-ui/src/services/utils/__tests__/drawing-position-util.spec.ts +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Copyright 2023-present DreamNum Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { describe, expect, it } from 'vitest'; -import { convertPositionCellToSheetOverGrid, convertPositionSheetOverGridToAbsolute } from '../drawing-position-util'; - -describe('drawing-position-util', () => { - it('should convert sheet-over-grid position to absolute transform', () => { - const skeleton = { - getNoMergeCellWithCoordByIndex: (row: number, col: number) => { - if (row === 1 && col === 1) return { startX: 10, startY: 20, endX: 30, endY: 40 }; - if (row === 3 && col === 4) return { startX: 60, startY: 80, endX: 90, endY: 120 }; - return { startX: 0, startY: 0, endX: 0, endY: 0 }; - }, - }; - - const result = convertPositionSheetOverGridToAbsolute('u1', 's1', { - from: { row: 1, column: 1, rowOffset: 0.26, columnOffset: 0.24 }, - to: { row: 3, column: 4, rowOffset: 4.44, columnOffset: 5.55 }, - } as any, { - ensureSkeleton: () => skeleton, - } as any); - - expect(result).toEqual({ - unitId: 'u1', - subUnitId: 's1', - left: 10.2, - top: 20.3, - width: 55.4, - height: 64.1, - }); - }); - - it('should convert cell-over-grid position to sheet transform', () => { - const skeleton = { - getNoMergeCellWithCoordByIndex: (row: number, col: number) => { - if (row === 2 && col === 3) return { startX: 10, startY: 20, endX: 20, endY: 30 }; - return { startX: 0, startY: 0, endX: 0, endY: 0 }; - }, - }; - - const result = convertPositionCellToSheetOverGrid('u1', 's1', { - row: 2, - column: 3, - rowOffset: 0.3, - columnOffset: 0.2, - } as any, 50, 40, { - getCellWithCoordByOffset: () => ({ - actualColumn: 9, - actualRow: 8, - startX: 55.7, - startY: 58.9, - }), - } as any, { - ensureSkeleton: () => skeleton, - } as any); - - expect(result).toEqual({ - unitId: 'u1', - subUnitId: 's1', - sheetTransform: { - from: { row: 2, column: 3, rowOffset: 0.3, columnOffset: 0.2 }, - to: { row: 8, column: 9, rowOffset: 1.4, columnOffset: 4.5 }, - }, - transform: { - left: 10.2, - top: 20.3, - width: 50, - height: 40, - }, - }); - }); - - it('should throw when skeleton or end cell is missing', () => { - expect(() => convertPositionSheetOverGridToAbsolute('u1', 's1', { - from: { row: 0, column: 0, rowOffset: 0, columnOffset: 0 }, - to: { row: 0, column: 0, rowOffset: 0, columnOffset: 0 }, - } as any, { ensureSkeleton: () => null } as any)).toThrow(/No current skeleton/); - - const skeleton = { - getNoMergeCellWithCoordByIndex: () => ({ startX: 10, startY: 20, endX: 20, endY: 30 }), - }; - - expect(() => convertPositionCellToSheetOverGrid('u1', 's1', { - row: 1, - column: 1, - rowOffset: 0, - columnOffset: 0, - } as any, 10, 10, { - getCellWithCoordByOffset: () => null, - } as any, { - ensureSkeleton: () => skeleton, - } as any)).toThrow(/No end selection cell/); - }); -}); diff --git a/packages/sheets/package.json b/packages/sheets/package.json index 8fc56e40ff..36b0572444 100644 --- a/packages/sheets/package.json +++ b/packages/sheets/package.json @@ -82,12 +82,12 @@ "dependencies": { "@univerjs/core": "workspace:*", "@univerjs/engine-formula": "workspace:*", + "@univerjs/engine-render": "workspace:*", "@univerjs/protocol": "0.1.48", "@univerjs/rpc": "workspace:*" }, "devDependencies": { "@univerjs-infra/shared": "workspace:*", - "@univerjs/engine-render": "workspace:*", "@univerjs/network": "workspace:*", "rxjs": "^7.8.2", "typescript": "^6.0.2", diff --git a/packages/sheets/src/commands/commands/__tests__/set-row-height.command.spec.ts b/packages/sheets/src/commands/commands/__tests__/set-row-height.command.spec.ts index 09c7125684..2ba3ef360a 100644 --- a/packages/sheets/src/commands/commands/__tests__/set-row-height.command.spec.ts +++ b/packages/sheets/src/commands/commands/__tests__/set-row-height.command.spec.ts @@ -15,7 +15,7 @@ */ import type { Injector, Nullable, Univer, Workbook } from '@univerjs/core'; -import type { IDeltaRowHeightCommand, ISetRowHeightCommandParams } from '../set-worksheet-row-height.command'; +import type { IDeltaRowHeightCommandParams, ISetRowHeightCommandParams } from '../set-worksheet-row-height.command'; import { BooleanNumber, ICommandService, @@ -108,7 +108,7 @@ describe('Test set row height commands', () => { it('Should change all row selections when anchor row is selected', async () => { expect(getRowHeight(1)).toBe(24); - await commandService.executeCommand(DeltaRowHeightCommand.id, { + await commandService.executeCommand(DeltaRowHeightCommand.id, { deltaY: -5, anchorRow: 5, }); @@ -134,7 +134,7 @@ describe('Test set row height commands', () => { expect(getRowHeight(1)).toBe(24); expect(getRowHeight(7)).toBe(24); - await commandService.executeCommand(DeltaRowHeightCommand.id, { + await commandService.executeCommand(DeltaRowHeightCommand.id, { deltaY: -5, anchorRow: 7, }); diff --git a/packages/sheets/src/commands/commands/set-worksheet-row-height.command.ts b/packages/sheets/src/commands/commands/set-worksheet-row-height.command.ts index 934e152b4e..5a89843244 100644 --- a/packages/sheets/src/commands/commands/set-worksheet-row-height.command.ts +++ b/packages/sheets/src/commands/commands/set-worksheet-row-height.command.ts @@ -42,7 +42,7 @@ import { import { getSuitableRangesInView } from './util'; import { getSheetCommandTarget } from './utils/target-util'; -export interface IDeltaRowHeightCommand { +export interface IDeltaRowHeightCommandParams { anchorRow: number; deltaY: number; } @@ -51,7 +51,7 @@ export const DeltaRowHeightCommand: ICommand = { type: CommandType.COMMAND, id: 'sheet.command.delta-row-height', // eslint-disable-next-line max-lines-per-function - handler: async (accessor: IAccessor, params: IDeltaRowHeightCommand) => { + handler: async (accessor: IAccessor, params: IDeltaRowHeightCommandParams) => { const selectionManagerService = accessor.get(SheetsSelectionsService); const selections = selectionManagerService.getCurrentSelections(); const sheetInterceptorService = accessor.get(SheetInterceptorService); diff --git a/packages/sheets/src/facade/f-enum.ts b/packages/sheets/src/facade/f-enum.ts index a5623dc447..8b1357387c 100644 --- a/packages/sheets/src/facade/f-enum.ts +++ b/packages/sheets/src/facade/f-enum.ts @@ -21,7 +21,7 @@ import { RangePermissionPoint, UnitRole, WorkbookPermissionPoint, WorksheetPermi /** * @ignore */ -export interface IFSheetsEnum { +export interface IFSheetsEnumMixin { /** * Sheet value change command types. These commands affect the content or style of cells. * Includes operations like setting cell values, moving ranges, merging cells, and applying styles. @@ -60,39 +60,39 @@ export interface IFSheetsEnum { RangePermissionPoint: typeof RangePermissionPoint; } -export class FSheetsEnum implements IFSheetsEnum { - get SheetValueChangeType(): typeof SheetValueChangeType { +export class FSheetsEnumMixin extends FEnum implements IFSheetsEnumMixin { + override get SheetValueChangeType(): typeof SheetValueChangeType { return SheetValueChangeType; } - get SheetSkeletonChangeType(): typeof SheetSkeletonChangeType { + override get SheetSkeletonChangeType(): typeof SheetSkeletonChangeType { return SheetSkeletonChangeType; } - get SplitDelimiterType(): typeof SplitDelimiterEnum { + override get SplitDelimiterType(): typeof SplitDelimiterEnum { return SplitDelimiterEnum; } - get UnitRole(): typeof UnitRole { + override get UnitRole(): typeof UnitRole { return UnitRole; } - get WorkbookPermissionPoint(): typeof WorkbookPermissionPoint { + override get WorkbookPermissionPoint(): typeof WorkbookPermissionPoint { return WorkbookPermissionPoint; } - get WorksheetPermissionPoint(): typeof WorksheetPermissionPoint { + override get WorksheetPermissionPoint(): typeof WorksheetPermissionPoint { return WorksheetPermissionPoint; } - get RangePermissionPoint(): typeof RangePermissionPoint { + override get RangePermissionPoint(): typeof RangePermissionPoint { return RangePermissionPoint; } } -FEnum.extend(FSheetsEnum); +FEnum.extend(FSheetsEnumMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - export interface FEnum extends IFSheetsEnum { + export interface FEnum extends IFSheetsEnumMixin { } } diff --git a/packages/sheets/src/facade/f-event.ts b/packages/sheets/src/facade/f-event.ts index b0955dddf9..87dc82a38b 100644 --- a/packages/sheets/src/facade/f-event.ts +++ b/packages/sheets/src/facade/f-event.ts @@ -27,7 +27,7 @@ import { FEventName } from '@univerjs/core/facade'; * Provides event names for sheet creation, workbook creation, and gridline changes * @ignore */ -export interface IFSheetEventMixin { +export interface IFSheetsEventNameMixin { /** * Event fired after a sheet is created * @see {@link ISheetCreatedEventParams} @@ -41,7 +41,7 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get SheetCreated(): 'SheetCreated'; + readonly SheetCreated: 'SheetCreated'; /** * Event fired before a sheet is created @@ -59,11 +59,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get BeforeSheetCreate(): 'BeforeSheetCreate'; + readonly BeforeSheetCreate: 'BeforeSheetCreate'; /** * Event fired before the active sheet changes - * @see {@link IBeforeActiveSheetChangeEvent} + * @see {@link IBeforeActiveSheetChangeEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeActiveSheetChange, (params) => { @@ -77,11 +77,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get BeforeActiveSheetChange(): 'BeforeActiveSheetChange'; + readonly BeforeActiveSheetChange: 'BeforeActiveSheetChange'; /** * Event fired after the active sheet changes - * @see {@link IActiveSheetChangedEvent} + * @see {@link IActiveSheetChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.ActiveSheetChanged, (params) => { @@ -92,11 +92,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get ActiveSheetChanged(): 'ActiveSheetChanged'; + readonly ActiveSheetChanged: 'ActiveSheetChanged'; /** * Event fired after a sheet is deleted - * @see {@link ISheetDeletedEvent} + * @see {@link ISheetDeletedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SheetDeleted, (params) => { @@ -107,11 +107,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get SheetDeleted(): 'SheetDeleted'; + readonly SheetDeleted: 'SheetDeleted'; /** * Event fired before a sheet is deleted - * @see {@link IBeforeSheetDeleteEvent} + * @see {@link IBeforeSheetDeleteEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetDelete, (params) => { @@ -125,11 +125,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get BeforeSheetDelete(): 'BeforeSheetDelete'; + readonly BeforeSheetDelete: 'BeforeSheetDelete'; /** * Event fired after a sheet is moved - * @see {@link ISheetMovedEvent} + * @see {@link ISheetMovedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SheetMoved, (params) => { @@ -140,11 +140,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get SheetMoved(): 'SheetMoved'; + readonly SheetMoved: 'SheetMoved'; /** * Event fired before a sheet is moved - * @see {@link IBeforeSheetMoveEvent} + * @see {@link IBeforeSheetMoveEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetMove, (params) => { @@ -158,11 +158,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get BeforeSheetMove(): 'BeforeSheetMove'; + readonly BeforeSheetMove: 'BeforeSheetMove'; /** * Event fired after a sheet name is changed - * @see {@link ISheetNameChangedEvent} + * @see {@link ISheetNameChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SheetNameChanged, (params) => { @@ -173,11 +173,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get SheetNameChanged(): 'SheetNameChanged'; + readonly SheetNameChanged: 'SheetNameChanged'; /** * Event fired before a sheet name is changed - * @see {@link IBeforeSheetNameChangeEvent} + * @see {@link IBeforeSheetNameChangeEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetNameChange, (params) => { @@ -191,11 +191,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get BeforeSheetNameChange(): 'BeforeSheetNameChange'; + readonly BeforeSheetNameChange: 'BeforeSheetNameChange'; /** * Event fired after a sheet tab color is changed - * @see {@link ISheetTabColorChangedEvent} + * @see {@link ISheetTabColorChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SheetTabColorChanged, (params) => { @@ -206,11 +206,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get SheetTabColorChanged(): 'SheetTabColorChanged'; + readonly SheetTabColorChanged: 'SheetTabColorChanged'; /** * Event fired before a sheet tab color is changed - * @see {@link IBeforeSheetTabColorChangeEvent} + * @see {@link IBeforeSheetTabColorChangeEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetTabColorChange, (params) => { @@ -224,11 +224,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get BeforeSheetTabColorChange(): 'BeforeSheetTabColorChange'; + readonly BeforeSheetTabColorChange: 'BeforeSheetTabColorChange'; /** * Event fired after a sheet is hidden - * @see {@link ISheetHideChangedEvent} + * @see {@link ISheetHideChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SheetHideChanged, (params) => { @@ -239,11 +239,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get SheetHideChanged(): 'SheetHideChanged'; + readonly SheetHideChanged: 'SheetHideChanged'; /** * Event fired before a sheet is hidden - * @see {@link IBeforeSheetHideChangeEvent} + * @see {@link IBeforeSheetHideChangeEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetHideChange, (params) => { @@ -257,11 +257,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get BeforeSheetHideChange(): 'BeforeSheetHideChange'; + readonly BeforeSheetHideChange: 'BeforeSheetHideChange'; /** * Event fired after a workbook is created - * @see {@link IWorkbookCreateParam} + * @see {@link IWorkbookCreateEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.WorkbookCreated, (params) => { @@ -272,11 +272,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get WorkbookCreated(): 'WorkbookCreated'; + readonly WorkbookCreated: 'WorkbookCreated'; /** * Event fired after a workbook is disposed - * @see {@link IWorkbookDisposedEvent} + * @see {@link IWorkbookDisposedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.WorkbookDisposed, (params) => { @@ -287,11 +287,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get WorkbookDisposed(): 'WorkbookDisposed'; + readonly WorkbookDisposed: 'WorkbookDisposed'; /** * Event fired when gridline changed - * @see {@link IGridlineChangedEvent} + * @see {@link IGridlineChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.GridlineChanged, (params) => { @@ -302,11 +302,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get GridlineChanged(): 'GridlineChanged'; + readonly GridlineChanged: 'GridlineChanged'; /** * Event fired before gridline enable changed - * @see {@link IBeforeGridlineEnableChange} + * @see {@link IBeforeGridlineEnableChangeEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeGridlineEnableChange, (params) => { @@ -320,11 +320,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get BeforeGridlineEnableChange(): 'BeforeGridlineEnableChange'; + readonly BeforeGridlineEnableChange: 'BeforeGridlineEnableChange'; /** * Event fired before gridline color changed - * @see {@link IBeforeGridlineColorChanged} + * @see {@link IBeforeGridlineColorChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.BeforeGridlineColorChange, (params) => { @@ -338,11 +338,11 @@ export interface IFSheetEventMixin { * // Remove the event listener, use `disposable.dispose()` * ``` */ - get BeforeGridlineColorChange(): 'BeforeGridlineColorChange'; + readonly BeforeGridlineColorChange: 'BeforeGridlineColorChange'; /** * Event fired when sheet value changed - * @see {@link ISheetValueChangedEvent} + * @see {@link ISheetValueChangedEventParams} * @example * ```ts * const disposable = univerAPI.addEvent(univerAPI.Event.SheetValueChanged, (params)=> { @@ -360,7 +360,7 @@ export interface IFSheetEventMixin { * Interface for workbook creation parameters * Extends the base event interface and includes workbook initialization details */ -export interface IWorkbookCreateParam extends IEventBase { +export interface IWorkbookCreateEventParams extends IEventBase { /** Unique identifier for the workbook unit */ unitId: string; /** Type identifier specifying this is a sheet instance */ @@ -375,7 +375,7 @@ export interface IWorkbookCreateParam extends IEventBase { * Interface for workbook disposal event * Contains information about the disposed workbook including its snapshot data */ -export interface IWorkbookDisposedEvent extends IEventBase { +export interface IWorkbookDisposedEventParams extends IEventBase { /** Unique identifier of the disposed workbook unit */ unitId: string; /** Type identifier specifying this was a sheet instance */ @@ -388,7 +388,7 @@ export interface IWorkbookDisposedEvent extends IEventBase { * Interface for gridline change event * Triggered when gridline visibility or color changes in a worksheet */ -export interface IGridlineChangedEvent extends IEventBase { +export interface IGridlineChangedEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet where gridline changes occurred */ @@ -403,7 +403,7 @@ export interface IGridlineChangedEvent extends IEventBase { * Interface for event before gridline enable/disable * Triggered before changing the gridline visibility state */ -export interface IBeforeGridlineEnableChange extends IEventBase { +export interface IBeforeGridlineEnableChangeEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet where gridline state will change */ @@ -416,7 +416,7 @@ export interface IBeforeGridlineEnableChange extends IEventBase { * Interface for event before gridline color change * Triggered before changing the gridline color */ -export interface IBeforeGridlineColorChanged extends IEventBase { +export interface IBeforeGridlineColorChangedEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet where gridline color will change */ @@ -453,7 +453,7 @@ export interface ISheetCreatedEventParams extends IEventBase { * Interface for sheet active change event * Contains information about the sheet that will become active */ -export interface IBeforeActiveSheetChangeEvent extends IEventBase { +export interface IBeforeActiveSheetChangeEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet that will become active */ @@ -466,7 +466,7 @@ export interface IBeforeActiveSheetChangeEvent extends IEventBase { * Interface for sheet active changed event * Contains information about the newly activated sheet */ -export interface IActiveSheetChangedEvent extends IEventBase { +export interface IActiveSheetChangedEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet that has become active */ @@ -477,7 +477,7 @@ export interface IActiveSheetChangedEvent extends IEventBase { * Interface for sheet deletion event * Contains information about the sheet that was deleted */ -export interface ISheetDeletedEvent extends IEventBase { +export interface ISheetDeletedEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet that was deleted */ @@ -488,7 +488,7 @@ export interface ISheetDeletedEvent extends IEventBase { * Interface for before sheet deletion event * Contains information about the sheet that will be deleted */ -export interface IBeforeSheetDeleteEvent extends IEventBase { +export interface IBeforeSheetDeleteEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet that will be deleted */ @@ -499,7 +499,7 @@ export interface IBeforeSheetDeleteEvent extends IEventBase { * Interface for sheet moved event * Contains information about the sheet movement */ -export interface ISheetMovedEvent extends IEventBase { +export interface ISheetMovedEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet that was moved */ @@ -512,7 +512,7 @@ export interface ISheetMovedEvent extends IEventBase { * Interface for before sheet move event * Contains information about the planned sheet movement */ -export interface IBeforeSheetMoveEvent extends IEventBase { +export interface IBeforeSheetMoveEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet that will be moved */ @@ -527,7 +527,7 @@ export interface IBeforeSheetMoveEvent extends IEventBase { * Interface for sheet name change event * Contains information about the sheet name change */ -export interface ISheetNameChangedEvent extends IEventBase { +export interface ISheetNameChangedEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet whose name was changed */ @@ -540,7 +540,7 @@ export interface ISheetNameChangedEvent extends IEventBase { * Interface for before sheet name change event * Contains information about the planned sheet name change */ -export interface IBeforeSheetNameChangeEvent extends IEventBase { +export interface IBeforeSheetNameChangeEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet whose name will be changed */ @@ -555,7 +555,7 @@ export interface IBeforeSheetNameChangeEvent extends IEventBase { * Interface for sheet tab color change event * Contains information about the sheet tab color change */ -export interface ISheetTabColorChangedEvent extends IEventBase { +export interface ISheetTabColorChangedEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet whose tab color was changed */ @@ -568,7 +568,7 @@ export interface ISheetTabColorChangedEvent extends IEventBase { * Interface for before sheet tab color change event * Contains information about the planned sheet tab color change */ -export interface IBeforeSheetTabColorChangeEvent extends IEventBase { +export interface IBeforeSheetTabColorChangeEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet whose tab color will be changed */ @@ -583,7 +583,7 @@ export interface IBeforeSheetTabColorChangeEvent extends IEventBase { * Interface for sheet hide state change event * Contains information about the sheet visibility change */ -export interface ISheetHideChangedEvent extends IEventBase { +export interface ISheetHideChangedEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet whose visibility was changed */ @@ -596,7 +596,7 @@ export interface ISheetHideChangedEvent extends IEventBase { * Interface for before sheet hide state change event * Contains information about the planned sheet visibility change */ -export interface IBeforeSheetHideChangeEvent extends IEventBase { +export interface IBeforeSheetHideChangeEventParams extends IEventBase { /** The workbook instance containing the worksheet */ workbook: FWorkbook; /** The worksheet whose visibility will be changed */ @@ -609,7 +609,7 @@ export interface IBeforeSheetHideChangeEvent extends IEventBase { * Interface for sheet value changed event * Contains information about the sheet value change */ -export interface ISheetValueChangedEvent extends IEventBase { +export interface ISheetValueChangedEventParams extends IEventBase { /** The affected ranges of the sheet */ effectedRanges: FRange[]; /** The payload of the value change */ @@ -621,134 +621,134 @@ export interface ISheetValueChangedEvent extends IEventBase { * Provides event names and their corresponding event parameter interfaces * @ignore */ -export interface ISheetEventParamConfig { +export interface ISheetsEventParamConfig { /** Event fired after a worksheet is created */ SheetCreated: ISheetCreatedEventParams; /** Event fired before creating a worksheet */ BeforeSheetCreate: IBeforeSheetCreateEventParams; /** Event fired after a workbook is created */ - WorkbookCreated: IWorkbookCreateParam; + WorkbookCreated: IWorkbookCreateEventParams; /** Event fired when a workbook is disposed */ - WorkbookDisposed: IWorkbookDisposedEvent; + WorkbookDisposed: IWorkbookDisposedEventParams; /** Event fired when gridline changed */ - GridlineChanged: IGridlineChangedEvent; + GridlineChanged: IGridlineChangedEventParams; /** Event fired before gridline enable changed */ - BeforeGridlineEnableChange: IBeforeGridlineEnableChange; + BeforeGridlineEnableChange: IBeforeGridlineEnableChangeEventParams; /** Event fired before gridline color changed */ - BeforeGridlineColorChange: IBeforeGridlineColorChanged; + BeforeGridlineColorChange: IBeforeGridlineColorChangedEventParams; /** Event fired before active sheet changes */ - BeforeActiveSheetChange: IBeforeActiveSheetChangeEvent; + BeforeActiveSheetChange: IBeforeActiveSheetChangeEventParams; /** Event fired after active sheet changed */ - ActiveSheetChanged: IActiveSheetChangedEvent; + ActiveSheetChanged: IActiveSheetChangedEventParams; /** Event fired after a sheet is deleted */ - SheetDeleted: ISheetDeletedEvent; + SheetDeleted: ISheetDeletedEventParams; /** Event fired before a sheet is deleted */ - BeforeSheetDelete: IBeforeSheetDeleteEvent; + BeforeSheetDelete: IBeforeSheetDeleteEventParams; /** Event fired after a sheet is moved */ - SheetMoved: ISheetMovedEvent; + SheetMoved: ISheetMovedEventParams; /** Event fired before a sheet is moved */ - BeforeSheetMove: IBeforeSheetMoveEvent; + BeforeSheetMove: IBeforeSheetMoveEventParams; /** Event fired after a sheet name is changed */ - SheetNameChanged: ISheetNameChangedEvent; + SheetNameChanged: ISheetNameChangedEventParams; /** Event fired before a sheet name is changed */ - BeforeSheetNameChange: IBeforeSheetNameChangeEvent; + BeforeSheetNameChange: IBeforeSheetNameChangeEventParams; /** Event fired after a sheet tab color is changed */ - SheetTabColorChanged: ISheetTabColorChangedEvent; + SheetTabColorChanged: ISheetTabColorChangedEventParams; /** Event fired before a sheet tab color is changed */ - BeforeSheetTabColorChange: IBeforeSheetTabColorChangeEvent; + BeforeSheetTabColorChange: IBeforeSheetTabColorChangeEventParams; /** Event fired after a sheet visibility is changed */ - SheetHideChanged: ISheetHideChangedEvent; + SheetHideChanged: ISheetHideChangedEventParams; /** Event fired before a sheet visibility is changed */ - BeforeSheetHideChange: IBeforeSheetHideChangeEvent; + BeforeSheetHideChange: IBeforeSheetHideChangeEventParams; /** Event fired after a sheet value is changed */ - SheetValueChanged: ISheetValueChangedEvent; + SheetValueChanged: ISheetValueChangedEventParams; } -export class FSheetEventName implements IFSheetEventMixin { - get SheetCreated(): 'SheetCreated' { +export class FSheetsEventNameMixin extends FEventName implements IFSheetsEventNameMixin { + override get SheetCreated(): 'SheetCreated' { return 'SheetCreated' as const; } - get BeforeSheetCreate(): 'BeforeSheetCreate' { + override get BeforeSheetCreate(): 'BeforeSheetCreate' { return 'BeforeSheetCreate' as const; } - get WorkbookCreated(): 'WorkbookCreated' { + override get WorkbookCreated(): 'WorkbookCreated' { return 'WorkbookCreated' as const; } - get WorkbookDisposed(): 'WorkbookDisposed' { + override get WorkbookDisposed(): 'WorkbookDisposed' { return 'WorkbookDisposed' as const; } - get GridlineChanged(): 'GridlineChanged' { + override get GridlineChanged(): 'GridlineChanged' { return 'GridlineChanged' as const; } - get BeforeGridlineEnableChange(): 'BeforeGridlineEnableChange' { + override get BeforeGridlineEnableChange(): 'BeforeGridlineEnableChange' { return 'BeforeGridlineEnableChange' as const; } - get BeforeGridlineColorChange(): 'BeforeGridlineColorChange' { + override get BeforeGridlineColorChange(): 'BeforeGridlineColorChange' { return 'BeforeGridlineColorChange' as const; } - get BeforeActiveSheetChange(): 'BeforeActiveSheetChange' { + override get BeforeActiveSheetChange(): 'BeforeActiveSheetChange' { return 'BeforeActiveSheetChange' as const; } - get ActiveSheetChanged(): 'ActiveSheetChanged' { + override get ActiveSheetChanged(): 'ActiveSheetChanged' { return 'ActiveSheetChanged' as const; } - get SheetDeleted(): 'SheetDeleted' { + override get SheetDeleted(): 'SheetDeleted' { return 'SheetDeleted' as const; } - get BeforeSheetDelete(): 'BeforeSheetDelete' { + override get BeforeSheetDelete(): 'BeforeSheetDelete' { return 'BeforeSheetDelete' as const; } - get SheetMoved(): 'SheetMoved' { + override get SheetMoved(): 'SheetMoved' { return 'SheetMoved' as const; } - get BeforeSheetMove(): 'BeforeSheetMove' { + override get BeforeSheetMove(): 'BeforeSheetMove' { return 'BeforeSheetMove' as const; } - get SheetNameChanged(): 'SheetNameChanged' { + override get SheetNameChanged(): 'SheetNameChanged' { return 'SheetNameChanged' as const; } - get BeforeSheetNameChange(): 'BeforeSheetNameChange' { + override get BeforeSheetNameChange(): 'BeforeSheetNameChange' { return 'BeforeSheetNameChange' as const; } - get SheetTabColorChanged(): 'SheetTabColorChanged' { + override get SheetTabColorChanged(): 'SheetTabColorChanged' { return 'SheetTabColorChanged' as const; } - get BeforeSheetTabColorChange(): 'BeforeSheetTabColorChange' { + override get BeforeSheetTabColorChange(): 'BeforeSheetTabColorChange' { return 'BeforeSheetTabColorChange' as const; } - get SheetHideChanged(): 'SheetHideChanged' { + override get SheetHideChanged(): 'SheetHideChanged' { return 'SheetHideChanged' as const; } - get BeforeSheetHideChange(): 'BeforeSheetHideChange' { + override get BeforeSheetHideChange(): 'BeforeSheetHideChange' { return 'BeforeSheetHideChange' as const; } - get SheetValueChanged(): 'SheetValueChanged' { + override get SheetValueChanged(): 'SheetValueChanged' { return 'SheetValueChanged' as const; } } -FEventName.extend(FSheetEventName); +FEventName.extend(FSheetsEventNameMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention - interface FEventName extends IFSheetEventMixin { } - interface IEventParamConfig extends ISheetEventParamConfig { } + interface FEventName extends IFSheetsEventNameMixin { } + interface IEventParamConfig extends ISheetsEventParamConfig { } } diff --git a/packages/sheets/src/facade/f-univer.ts b/packages/sheets/src/facade/f-univer.ts index 7d725c44d6..d900f8acfa 100644 --- a/packages/sheets/src/facade/f-univer.ts +++ b/packages/sheets/src/facade/f-univer.ts @@ -15,13 +15,58 @@ */ import type { ICommandInfo, ICreateUnitOptions, IDisposable, Injector, IWorkbookData, Nullable, Workbook } from '@univerjs/core'; -import type { CommandListenerValueChange, IInsertSheetCommandParams, IRemoveSheetCommandParams, ISetGridlinesColorCommandParams, ISetTabColorMutationParams, ISetWorksheetActivateCommandParams, ISetWorksheetHideMutationParams, ISetWorksheetNameCommandParams, ISetWorksheetOrderMutationParams, IToggleGridlinesCommandParams } from '@univerjs/sheets'; -import type { IBeforeActiveSheetChangeEvent, IBeforeGridlineColorChanged, IBeforeGridlineEnableChange, IBeforeSheetCreateEventParams, IBeforeSheetDeleteEvent, IBeforeSheetHideChangeEvent, IBeforeSheetMoveEvent, IBeforeSheetNameChangeEvent, IBeforeSheetTabColorChangeEvent, ISheetCreatedEventParams } from './f-event'; +import type { + CommandListenerValueChange, + IInsertSheetCommandParams, + IRemoveSheetCommandParams, + ISetGridlinesColorCommandParams, + ISetTabColorMutationParams, + ISetWorksheetActivateCommandParams, + ISetWorksheetHideMutationParams, + ISetWorksheetNameCommandParams, + ISetWorksheetOrderMutationParams, + IToggleGridlinesCommandParams, +} from '@univerjs/sheets'; +import type { + IActiveSheetChangedEventParams, + IBeforeActiveSheetChangeEventParams, + IBeforeGridlineColorChangedEventParams, + IBeforeGridlineEnableChangeEventParams, + IBeforeSheetCreateEventParams, + IBeforeSheetDeleteEventParams, + IBeforeSheetHideChangeEventParams, + IBeforeSheetMoveEventParams, + IBeforeSheetNameChangeEventParams, + IBeforeSheetTabColorChangeEventParams, + IGridlineChangedEventParams, + ISheetCreatedEventParams, + ISheetDeletedEventParams, + ISheetHideChangedEventParams, + ISheetMovedEventParams, + ISheetNameChangedEventParams, + ISheetTabColorChangedEventParams, + ISheetValueChangedEventParams, + IWorkbookCreateEventParams, + IWorkbookDisposedEventParams, +} from './f-event'; import type { FRange } from './f-range'; import type { FWorksheet } from './f-worksheet'; import { CanceledError, ICommandService, IUniverInstanceService, toDisposable, UniverInstanceType } from '@univerjs/core'; import { FUniver } from '@univerjs/core/facade'; -import { COMMAND_LISTENER_VALUE_CHANGE, getValueChangedEffectedRange, InsertSheetCommand, RemoveSheetCommand, SetGridlinesColorCommand, SetTabColorMutation, SetWorksheetActiveOperation, SetWorksheetHideMutation, SetWorksheetNameCommand, SetWorksheetOrderMutation, SheetsFreezeSyncController, ToggleGridlinesCommand } from '@univerjs/sheets'; +import { + COMMAND_LISTENER_VALUE_CHANGE, + getValueChangedEffectedRange, + InsertSheetCommand, + RemoveSheetCommand, + SetGridlinesColorCommand, + SetTabColorMutation, + SetWorksheetActiveOperation, + SetWorksheetHideMutation, + SetWorksheetNameCommand, + SetWorksheetOrderMutation, + SheetsFreezeSyncController, + ToggleGridlinesCommand, +} from '@univerjs/sheets'; import { FDefinedNameBuilder } from './f-defined-name'; import { FPermission } from './f-permission'; import { FWorkbook } from './f-workbook'; @@ -214,11 +259,12 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { this.Event.WorkbookDisposed, () => univerInstanceService.unitDisposed$.subscribe((unit) => { if (unit.type === UniverInstanceType.UNIVER_SHEET) { - this.fireEvent(this.Event.WorkbookDisposed, { + const eventParams: IWorkbookDisposedEventParams = { unitId: unit.getUnitId(), unitType: unit.type, snapshot: unit.getSnapshot() as IWorkbookData, - }); + }; + this.fireEvent(this.Event.WorkbookDisposed, eventParams); } }) ) @@ -232,12 +278,13 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { if (unit.type === UniverInstanceType.UNIVER_SHEET) { const workbook = unit as Workbook; const workbookUnit = injector.createInstance(FWorkbook, workbook); - this.fireEvent(this.Event.WorkbookCreated, { + const eventParams: IWorkbookCreateEventParams = { unitId: unit.getUnitId(), type: unit.type, workbook: workbookUnit, unit: workbookUnit, - }); + }; + this.fireEvent(this.Event.WorkbookCreated, eventParams); } }) ) @@ -289,7 +336,7 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const activeSheet = workbook.getSheetBySheetId(sheetId); const oldActiveSheet = workbook.getActiveSheet(); if (!activeSheet || !oldActiveSheet) return; - const eventParams: IBeforeActiveSheetChangeEvent = { + const eventParams: IBeforeActiveSheetChangeEventParams = { workbook, activeSheet, oldActiveSheet, @@ -312,7 +359,7 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const target = this.getCommandSheetTarget(commandInfo); if (!target) return; const { workbook, worksheet } = target; - const eventParams: IBeforeSheetDeleteEvent = { + const eventParams: IBeforeSheetDeleteEventParams = { workbook, worksheet, }; @@ -334,7 +381,7 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const { fromOrder, toOrder } = commandInfo.params as ISetWorksheetOrderMutationParams; const target = this.getCommandSheetTarget(commandInfo); if (!target) return; - const eventParams: IBeforeSheetMoveEvent = { + const eventParams: IBeforeSheetMoveEventParams = { workbook: target.workbook, worksheet: target.worksheet, newIndex: toOrder, @@ -358,7 +405,7 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const { name } = commandInfo.params as ISetWorksheetNameCommandParams; const target = this.getCommandSheetTarget(commandInfo); if (!target) return; - const eventParams: IBeforeSheetNameChangeEvent = { + const eventParams: IBeforeSheetNameChangeEventParams = { workbook: target.workbook, worksheet: target.worksheet, newName: name, @@ -382,7 +429,7 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const { color } = commandInfo.params as ISetTabColorMutationParams; const target = this.getCommandSheetTarget(commandInfo); if (!target) return; - const eventParams: IBeforeSheetTabColorChangeEvent = { + const eventParams: IBeforeSheetTabColorChangeEventParams = { workbook: target.workbook, worksheet: target.worksheet, newColor: color, @@ -406,7 +453,7 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const { hidden } = commandInfo.params as ISetWorksheetHideMutationParams; const target = this.getCommandSheetTarget(commandInfo); if (!target) return; - const eventParams: IBeforeSheetHideChangeEvent = { + const eventParams: IBeforeSheetHideChangeEventParams = { workbook: target.workbook, worksheet: target.worksheet, hidden: Boolean(hidden), @@ -428,7 +475,7 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { if (commandInfo.id === SetGridlinesColorCommand.id) { const target = this.getCommandSheetTarget(commandInfo); if (!target) return; - const eventParams: IBeforeGridlineColorChanged = { + const eventParams: IBeforeGridlineColorChangedEventParams = { ...target, color: (commandInfo.params as ISetGridlinesColorCommandParams)?.color, }; @@ -450,7 +497,7 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const target = this.getCommandSheetTarget(commandInfo); if (!target) return; const showGridlines = (commandInfo.params as IToggleGridlinesCommandParams)?.showGridlines ?? !target.worksheet.hasHiddenGridLines(); - const eventParams: IBeforeGridlineEnableChange = { + const eventParams: IBeforeGridlineEnableChangeEventParams = { ...target, enabled: Boolean(showGridlines), }; @@ -479,10 +526,11 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { ) .filter(Boolean) as FRange[]; if (!ranges.length) return; - this.fireEvent(this.Event.SheetValueChanged, { + const eventParams: ISheetValueChangedEventParams = { payload: commandInfo as CommandListenerValueChange, effectedRanges: ranges, - }); + }; + this.fireEvent(this.Event.SheetValueChanged, eventParams); } }) ) @@ -507,10 +555,7 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { workbook, worksheet, }; - this.fireEvent( - this.Event.SheetCreated, - eventParams - ); + this.fireEvent(this.Event.SheetCreated, eventParams); } }) ) @@ -524,7 +569,11 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const target = this.getActiveSheet(); if (!target) return; const { workbook, worksheet: activeSheet } = target; - this._fireActiveSheetChanged(workbook, activeSheet); + const eventParams: IActiveSheetChangedEventParams = { + workbook, + activeSheet, + }; + this.fireEvent(this.Event.ActiveSheetChanged, eventParams); } }) ) @@ -538,7 +587,11 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const { subUnitId: sheetId, unitId } = commandInfo.params as IRemoveSheetCommandParams; const workbook = unitId ? this.getUniverSheet(unitId) : this.getActiveWorkbook?.(); if (!workbook || !sheetId) return; - this._fireSheetDeleted(workbook, sheetId); + const eventParams: ISheetDeletedEventParams = { + workbook, + sheetId, + }; + this.fireEvent(this.Event.SheetDeleted, eventParams); } }) ) @@ -552,7 +605,13 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const { toOrder: toIndex } = commandInfo.params as ISetWorksheetOrderMutationParams; const target = this.getCommandSheetTarget(commandInfo); if (!target) return; - this._fireSheetMoved(target.workbook, target.worksheet, toIndex); + const { workbook, worksheet } = target; + const eventParams: ISheetMovedEventParams = { + workbook, + worksheet, + newIndex: toIndex, + }; + this.fireEvent(this.Event.SheetMoved, eventParams); } }) ) @@ -566,7 +625,13 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const { name } = commandInfo.params as ISetWorksheetNameCommandParams; const target = this.getCommandSheetTarget(commandInfo); if (!target) return; - this._fireSheetNameChanged(target.workbook, target.worksheet, name); + const { workbook, worksheet } = target; + const eventParams: ISheetNameChangedEventParams = { + workbook, + worksheet, + newName: name, + }; + this.fireEvent(this.Event.SheetNameChanged, eventParams); } }) ) @@ -580,7 +645,13 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const { color } = commandInfo.params as ISetTabColorMutationParams; const target = this.getCommandSheetTarget(commandInfo); if (!target) return; - this._fireSheetTabColorChanged(target.workbook, target.worksheet, color); + const { workbook, worksheet } = target; + const eventParams: ISheetTabColorChangedEventParams = { + workbook, + worksheet, + newColor: color, + }; + this.fireEvent(this.Event.SheetTabColorChanged, eventParams); } }) ) @@ -594,7 +665,13 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const { hidden } = commandInfo.params as ISetWorksheetHideMutationParams; const target = this.getCommandSheetTarget(commandInfo); if (!target) return; - this._fireSheetHideChanged(target.workbook, target.worksheet, !!hidden); + const { workbook, worksheet } = target; + const eventParams: ISheetHideChangedEventParams = { + workbook, + worksheet, + hidden: Boolean(hidden), + }; + this.fireEvent(this.Event.SheetHideChanged, eventParams); } }) ) @@ -607,11 +684,12 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { if (commandInfo.id === SetGridlinesColorCommand.id || commandInfo.id === ToggleGridlinesCommand.id) { const target = this.getCommandSheetTarget(commandInfo); if (!target) return; - this.fireEvent(this.Event.GridlineChanged, { + const eventParams: IGridlineChangedEventParams = { ...target, enabled: !target.worksheet.hasHiddenGridLines(), color: target.worksheet.getGridLinesColor(), - }); + }; + this.fireEvent(this.Event.GridlineChanged, eventParams); } }) ) @@ -689,52 +767,6 @@ export class FUniverSheetsMixin extends FUniver implements IFUniverSheetsMixin { const controller = this._injector.get(SheetsFreezeSyncController); controller.setEnabled(enabled); } - - private _fireActiveSheetChanged(workbook: FWorkbook, newActiveSheet: FWorksheet): void { - this.fireEvent(this.Event.ActiveSheetChanged, { - workbook, - activeSheet: newActiveSheet, - }); - } - - private _fireSheetDeleted(workbook: FWorkbook, sheetId: string): void { - this.fireEvent(this.Event.SheetDeleted, { - workbook, - sheetId, - }); - } - - private _fireSheetMoved(workbook: FWorkbook, worksheet: FWorksheet, toIndex: number): void { - this.fireEvent(this.Event.SheetMoved, { - workbook, - worksheet, - newIndex: toIndex, - }); - } - - private _fireSheetNameChanged(workbook: FWorkbook, worksheet: FWorksheet, newName: string): void { - this.fireEvent(this.Event.SheetNameChanged, { - workbook, - worksheet, - newName, - }); - } - - private _fireSheetTabColorChanged(workbook: FWorkbook, worksheet: FWorksheet, newColor: string): void { - this.fireEvent(this.Event.SheetTabColorChanged, { - workbook, - worksheet, - newColor, - }); - } - - private _fireSheetHideChanged(workbook: FWorkbook, worksheet: FWorksheet, hidden: boolean): void { - this.fireEvent(this.Event.SheetHideChanged, { - workbook, - worksheet, - hidden, - }); - } } FUniver.extend(FUniverSheetsMixin); diff --git a/packages/sheets/src/index.ts b/packages/sheets/src/index.ts index 34fb8922a2..fec5b9cedc 100644 --- a/packages/sheets/src/index.ts +++ b/packages/sheets/src/index.ts @@ -131,6 +131,7 @@ export { } from './commands/commands/set-border-command'; export { type ISetColDataCommandParams, SetColDataCommand } from './commands/commands/set-col-data.command'; export { + type ISetColHiddenCommandParams, type ISetSpecificColsVisibleCommandParams, SetColHiddenCommand, SetSelectedColsVisibleCommand, @@ -145,6 +146,7 @@ export { type ISetRangeCustomMetadataCommandParams, SetRangeCustomMetadataComman export { type ISetRangeValuesCommandParams, SetRangeValuesCommand } from './commands/commands/set-range-values.command'; export { type ISetRowDataCommandParams, SetRowDataCommand } from './commands/commands/set-row-data.command'; export { + type ISetRowHiddenCommandParams, type ISetSpecificRowsVisibleCommandParams, SetRowHiddenCommand, SetSelectedRowsVisibleCommand, @@ -194,7 +196,7 @@ export { SetWorksheetProtectionCommand } from './commands/commands/set-worksheet export { SetWorksheetRightToLeftCommand } from './commands/commands/set-worksheet-right-to-left.command'; export { SetWorksheetRowCountCommand } from './commands/commands/set-worksheet-row-count.command'; export { DeltaRowHeightCommand, type ISetRowHeightCommandParams, SetRowHeightCommand, SetWorksheetRowIsAutoHeightCommand } from './commands/commands/set-worksheet-row-height.command'; -export type { IDeltaRowHeightCommand, ISetWorksheetRowIsAutoHeightCommandParams } from './commands/commands/set-worksheet-row-height.command'; +export type { IDeltaRowHeightCommandParams, ISetWorksheetRowIsAutoHeightCommandParams } from './commands/commands/set-worksheet-row-height.command'; export { SetWorksheetShowCommand } from './commands/commands/set-worksheet-show.command'; export type { ISetWorksheetShowCommandParams } from './commands/commands/set-worksheet-show.command'; export { SplitTextToColumnsCommand } from './commands/commands/split-text-to-columns.command'; @@ -467,5 +469,7 @@ export { getNextPrimaryCell } from './services/selections/move-active-cell-util' export { InterceptCellContentPriority, INTERCEPTOR_POINT } from './services/sheet-interceptor/interceptor-const'; export { AFTER_CELL_EDIT, BEFORE_CELL_EDIT, type IAutoHeightContext, SheetInterceptorService, VALIDATE_CELL } from './services/sheet-interceptor/sheet-interceptor.service'; export type { ISheetLocation, ISheetLocationBase, ISheetRowLocation } from './services/sheet-interceptor/utils/interceptor'; -export { SheetSkeletonService } from './skeleton/skeleton.service'; +export { convertPositionCellToSheetOverGrid, convertPositionSheetOverGridToAbsolute } from './skeleton/drawing-position-util'; +export { type ISheetSkeletonManagerParam, SheetSkeletonService } from './skeleton/skeleton.service'; +export { attachPrimaryWithCoord, attachRangeWithCoord, attachSelectionWithCoord } from './skeleton/util'; export { UnitAction, UnitObject } from '@univerjs/protocol'; diff --git a/packages/sheets/src/services/sheet-interceptor/sheet-interceptor.service.ts b/packages/sheets/src/services/sheet-interceptor/sheet-interceptor.service.ts index a2839c2da4..88b836d7cb 100644 --- a/packages/sheets/src/services/sheet-interceptor/sheet-interceptor.service.ts +++ b/packages/sheets/src/services/sheet-interceptor/sheet-interceptor.service.ts @@ -108,6 +108,7 @@ export class SheetInterceptorService extends Disposable { private _interceptorsDirty = false; private _composedInterceptorByKey: Map>> = new Map(); + private _composedInterceptorsLengthByKey: Map = new Map(); readonly writeCellInterceptor = new InterceptorManager({ BEFORE_CELL_EDIT, @@ -385,8 +386,9 @@ export class SheetInterceptorService extends Disposable { const byNamesKey = effect === undefined ? name as unknown as string : `${name as unknown as string}-${effect}`; const key = _key ?? byNamesKey; let composed = this._composedInterceptorByKey.get(key); + const composedInterceptorsLength = this._composedInterceptorsLengthByKey.get(key) || 0; - if (!composed || !this._interceptorsDirty) { + if (!composed || !this._interceptorsDirty || composedInterceptorsLength !== (this._interceptorsByName.get(byNamesKey)?.length || 0)) { let interceptors = this._interceptorsByName.get(byNamesKey) as unknown as Array> | undefined; if (interceptors && filter) { interceptors = interceptors.filter(filter); @@ -394,6 +396,7 @@ export class SheetInterceptorService extends Disposable { composed = composeInterceptors(interceptors || []); this._composedInterceptorByKey.set(key, composed); + this._composedInterceptorsLengthByKey.set(key, interceptors?.length || 0); } return composed; diff --git a/packages/sheets-ui/src/services/utils/drawing-position-util.ts b/packages/sheets/src/skeleton/drawing-position-util.ts similarity index 66% rename from packages/sheets-ui/src/services/utils/drawing-position-util.ts rename to packages/sheets/src/skeleton/drawing-position-util.ts index 7cdecdcdf7..61dff2e98e 100644 --- a/packages/sheets-ui/src/services/utils/drawing-position-util.ts +++ b/packages/sheets/src/skeleton/drawing-position-util.ts @@ -14,24 +14,21 @@ * limitations under the License. */ -import type { ICellOverGridPosition, ISheetOverGridPosition } from '@univerjs/sheets'; -import type { ISheetSelectionRenderService } from '../selection/base-selection-render.service'; -import type { SheetSkeletonManagerService } from '../sheet-skeleton-manager.service'; +import type { SpreadsheetSkeleton } from '@univerjs/engine-render'; +import type { ICellOverGridPosition, ISheetOverGridPosition } from '../basics'; import { precisionTo } from '@univerjs/engine-render'; -import { attachRangeWithCoord } from '../selection/util'; +import { attachRangeWithCoord } from './util'; -export function convertPositionSheetOverGridToAbsolute(unitId: string, subUnitId: string, sheetOverGridPosition: ISheetOverGridPosition, sheetSkeletonManagerService: SheetSkeletonManagerService) { +export function convertPositionSheetOverGridToAbsolute( + unitId: string, + subUnitId: string, + sheetOverGridPosition: ISheetOverGridPosition, + skeleton: SpreadsheetSkeleton +) { const { from, to } = sheetOverGridPosition; - const { column: fromColumn, columnOffset: fromColumnOffset, row: fromRow, rowOffset: fromRowOffset } = from; const { column: toColumn, columnOffset: toColumnOffset, row: toRow, rowOffset: toRowOffset } = to; - const skeleton = sheetSkeletonManagerService.ensureSkeleton(subUnitId); - - if (skeleton == null) { - throw new Error('No current skeleton'); - } - const startSelectionCell = attachRangeWithCoord(skeleton, { startColumn: fromColumn, endColumn: fromColumn, @@ -74,15 +71,16 @@ export function convertPositionSheetOverGridToAbsolute(unitId: string, subUnitId }; } -export function convertPositionCellToSheetOverGrid(unitId: string, subUnitId: string, cellOverGridPosition: ICellOverGridPosition, width: number, height: number, selectionRenderService: ISheetSelectionRenderService, sheetSkeletonManagerService: SheetSkeletonManagerService) { +export function convertPositionCellToSheetOverGrid( + unitId: string, + subUnitId: string, + cellOverGridPosition: ICellOverGridPosition, + width: number, + height: number, + skeleton: SpreadsheetSkeleton +) { const { column: fromColumn, columnOffset: fromColumnOffset, row: fromRow, rowOffset: fromRowOffset } = cellOverGridPosition; - const skeleton = sheetSkeletonManagerService.ensureSkeleton(subUnitId); - - if (skeleton == null) { - throw new Error('No current skeleton'); - } - const startSelectionCell = attachRangeWithCoord(skeleton, { startColumn: fromColumn, endColumn: fromColumn, @@ -95,18 +93,7 @@ export function convertPositionCellToSheetOverGrid(unitId: string, subUnitId: st const left = precisionTo(startSelectionX + fromColumnOffset, 1); const top = precisionTo(startSelectionY + fromRowOffset, 1); - const endSelectionCell = selectionRenderService.getCellWithCoordByOffset(left + width, top + height, skeleton); - - if (endSelectionCell == null) { - throw new Error('No end selection cell'); - } - - const to = { - column: endSelectionCell.actualColumn, - columnOffset: precisionTo(left + width - endSelectionCell.startX, 1), - row: endSelectionCell.actualRow, - rowOffset: precisionTo(top + height - endSelectionCell.startY, 1), - }; + const endSelectionCell = skeleton.getOffsetRelativeToRowCol(left + width, top + height); return { unitId, @@ -118,7 +105,7 @@ export function convertPositionCellToSheetOverGrid(unitId: string, subUnitId: st row: fromRow, rowOffset: fromRowOffset, }, - to, + to: endSelectionCell, }, transform: { left, diff --git a/packages/sheets/src/skeleton/skeleton.service.ts b/packages/sheets/src/skeleton/skeleton.service.ts index e1bd906c3c..c42a5b5763 100644 --- a/packages/sheets/src/skeleton/skeleton.service.ts +++ b/packages/sheets/src/skeleton/skeleton.service.ts @@ -14,41 +14,175 @@ * limitations under the License. */ -import type { Nullable, SheetSkeleton } from '@univerjs/core'; -import { Disposable, Inject, Injector } from '@univerjs/core'; +import type { Nullable, Styles, Workbook, Worksheet } from '@univerjs/core'; +import { Disposable, Inject, Injector, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; +import { SpreadsheetSkeleton } from '@univerjs/engine-render'; + +export interface ISheetSkeletonManagerParam { + unitId: string; + sheetId: string; + skeleton: SpreadsheetSkeleton; + dirty: boolean; + commandId?: string; +} export class SheetSkeletonService extends Disposable { - private _sheetSkeletonStore: Map> = new Map(); + private _sheetSkeletonParamStore: Map> = new Map(); constructor( - @Inject(Injector) readonly _injector: Injector + @Inject(Injector) readonly _injector: Injector, + @Inject(IUniverInstanceService) private readonly _univerInstanceService: IUniverInstanceService ) { // empty super(); - this.disposeWithMe(() => { - this._sheetSkeletonStore = new Map(); - }); + this._init(); } - getSkeleton(unitId: string, subUnitId: string): Nullable { - if (!this._sheetSkeletonStore.has(unitId)) { - return undefined; - } - return this._sheetSkeletonStore.get(unitId)!.get(subUnitId); + override dispose() { + super.dispose(); + + this._sheetSkeletonParamStore.forEach((subUnitMap) => subUnitMap.forEach((skeletonParam) => skeletonParam.skeleton.dispose())); + this._sheetSkeletonParamStore.clear(); } - setSkeleton(unitId: string, subUnitId: string, skeleton: SheetSkeleton) { - if (!this._sheetSkeletonStore.has(unitId)) { - this._sheetSkeletonStore.set(unitId, new Map()); - } - this._sheetSkeletonStore.get(unitId)!.set(subUnitId, skeleton); - } - - deleteSkeleton(unitId: string, subUnitId: string) { - if (!this._sheetSkeletonStore.has(unitId)) { + private _disposeByUnitId(unitId: string) { + const sheetSkeletonMap = this._sheetSkeletonParamStore.get(unitId); + if (!sheetSkeletonMap) { return; } - this._sheetSkeletonStore.get(unitId)!.delete(subUnitId); + + sheetSkeletonMap.forEach((skeletonParam) => skeletonParam.skeleton.dispose()); + this._sheetSkeletonParamStore.delete(unitId); + } + + private _init() { + this.disposeWithMe( + this._univerInstanceService.getTypeOfUnitAdded$(UniverInstanceType.UNIVER_SHEET).subscribe((workbook) => this._initWorkbookSkeleton(workbook)) + ); + + this.disposeWithMe( + this._univerInstanceService.getTypeOfUnitDisposed$(UniverInstanceType.UNIVER_SHEET).subscribe((workbook) => this._disposeByUnitId(workbook.getUnitId())) + ); + } + + private _initWorkbookSkeleton(workbook: Workbook) { + const unitId = workbook.getUnitId(); + + this._initSheetsSkeleton(workbook); + + this.disposeWithMe( + workbook.sheetCreated$.subscribe((worksheet) => { + const sheetSkeletonMap = this._sheetSkeletonParamStore.get(unitId); + if (!sheetSkeletonMap) { + return; + } + + const sheetId = worksheet.getSheetId(); + const skeleton = this._buildSkeleton(worksheet, workbook.getStyles()); + sheetSkeletonMap.set(sheetId, { + unitId, + sheetId, + skeleton, + dirty: false, + }); + }) + ); + + this.disposeWithMe( + workbook.sheetDisposed$.subscribe((worksheet) => { + const sheetSkeletonMap = this._sheetSkeletonParamStore.get(unitId); + if (!sheetSkeletonMap) { + return; + } + + const sheetId = worksheet.getSheetId(); + const skeletonParam = sheetSkeletonMap.get(sheetId); + if (skeletonParam) { + skeletonParam.skeleton.dispose(); + } + sheetSkeletonMap.delete(sheetId); + }) + ); + } + + private _initSheetsSkeleton(workbook: Workbook) { + const unitId = workbook.getUnitId(); + const sheetSkeletonMap = new Map(); + + workbook.getWorksheets().forEach((worksheet) => { + const sheetId = worksheet.getSheetId(); + const skeleton = this._buildSkeleton(worksheet, workbook.getStyles()); + sheetSkeletonMap.set(sheetId, { + unitId, + sheetId, + skeleton, + dirty: false, + }); + }); + + this._sheetSkeletonParamStore.set(unitId, sheetSkeletonMap); + } + + private _buildSkeleton(worksheet: Worksheet, styles: Styles) { + const spreadsheetSkeleton = this._injector.createInstance( + SpreadsheetSkeleton, + worksheet, + styles + ); + return spreadsheetSkeleton; + } + + getSkeleton(unitId: string, subUnitId: string): Nullable { + return this.getSkeletonParam(unitId, subUnitId)?.skeleton; + } + + getSkeletonParam(unitId: string, subUnitId: string): Nullable { + const sheetSkeletonMap = this._sheetSkeletonParamStore.get(unitId); + if (!sheetSkeletonMap) { + return; + } + + return sheetSkeletonMap.get(subUnitId); + } + + newSkeleton(unitId: string, subUnitId: string, worksheet: Worksheet, styles: Styles): SpreadsheetSkeleton { + return this.newSkeletonParam(unitId, subUnitId, worksheet, styles).skeleton; + } + + newSkeletonParam(unitId: string, subUnitId: string, worksheet: Worksheet, styles: Styles): ISheetSkeletonManagerParam { + const skeleton = this._buildSkeleton(worksheet, styles); + + let sheetSkeletonMap = this._sheetSkeletonParamStore.get(unitId); + if (!sheetSkeletonMap) { + sheetSkeletonMap = new Map(); + this._sheetSkeletonParamStore.set(unitId, sheetSkeletonMap); + } + + const skeletonParam: ISheetSkeletonManagerParam = { + unitId, + sheetId: subUnitId, + skeleton, + dirty: false, + }; + + sheetSkeletonMap.set(subUnitId, skeletonParam); + + return skeletonParam; + } + + ensureSkeleton(unitId: string, subUnitId: string): SpreadsheetSkeleton | undefined { + const skeleton = this.getSkeleton(unitId, subUnitId); + if (skeleton) { + return skeleton; + } + + const workbook = this._univerInstanceService.getUnit(unitId); + if (!workbook) return; + + const worksheet = workbook.getSheetBySheetId(subUnitId); + if (!worksheet) return; + + return this.newSkeleton(unitId, subUnitId, worksheet, workbook.getStyles()); } } diff --git a/packages/sheets-ui/src/services/selection/util.ts b/packages/sheets/src/skeleton/util.ts similarity index 93% rename from packages/sheets-ui/src/services/selection/util.ts rename to packages/sheets/src/skeleton/util.ts index d26ab2a501..fe05557727 100644 --- a/packages/sheets-ui/src/services/selection/util.ts +++ b/packages/sheets/src/skeleton/util.ts @@ -16,13 +16,11 @@ import type { ICellWithCoord, IRange, IRangeWithCoord, ISelectionCell } from '@univerjs/core'; import type { SpreadsheetSkeleton } from '@univerjs/engine-render'; -import type { ISelectionWithCoord, ISelectionWithStyle } from '@univerjs/sheets'; +import type { ISelectionWithCoord, ISelectionWithStyle } from '../basics'; /** * Add startXY endXY to range, XY are no merge cell position. - * @param skeleton - * @param range - * @returns {IRangeWithCoord} + * @returns {IRangeWithCoord} range with coord */ export function attachRangeWithCoord(skeleton: SpreadsheetSkeleton, range: IRange): IRangeWithCoord { const { startRow, startColumn, endRow, endColumn, rangeType } = range; @@ -54,8 +52,6 @@ export function attachRangeWithCoord(skeleton: SpreadsheetSkeleton, range: IRang /** * Return selection with coord and style from selection, which has range & primary & style. * coord are no merge cell position. - * @param selection - * @param skeleton * @returns {ISelectionWithCoord} selection with coord and style */ export function attachSelectionWithCoord(selection: ISelectionWithStyle, skeleton: SpreadsheetSkeleton): ISelectionWithCoord { @@ -69,6 +65,10 @@ export function attachSelectionWithCoord(selection: ISelectionWithStyle, skeleto } as ISelectionWithCoord; } +/** + * Add startXY endXY to primary, XY are no merge cell position. + * @returns {ICellWithCoord} primary with coord + */ export function attachPrimaryWithCoord(skeleton: SpreadsheetSkeleton, primary: ISelectionCell): ICellWithCoord { const { actualRow, actualColumn, isMerged, isMergedMainCell, startRow, startColumn, endRow, endColumn } = primary; const cellPosition = skeleton.getNoMergeCellWithCoordByIndex(actualRow, actualColumn); diff --git a/packages/ui/src/facade/f-enum.ts b/packages/ui/src/facade/f-enum.ts index 0aeefae6cc..a047e1c51d 100644 --- a/packages/ui/src/facade/f-enum.ts +++ b/packages/ui/src/facade/f-enum.ts @@ -24,18 +24,18 @@ interface IFUIEnumMixin { /** * Built-in UI parts. */ - get BuiltInUIPart(): typeof BuiltInUIPart; + BuiltInUIPart: typeof BuiltInUIPart; /** * Key codes. */ - get KeyCode(): typeof KeyCode; + KeyCode: typeof KeyCode; } /** * @ignore */ -export class FUIEnum extends FEnum implements IFUIEnumMixin { +export class FUIEnumMixin extends FEnum implements IFUIEnumMixin { override get BuiltInUIPart(): typeof BuiltInUIPart { return BuiltInUIPart; }; @@ -45,7 +45,7 @@ export class FUIEnum extends FEnum implements IFUIEnumMixin { } } -FEnum.extend(FUIEnum); +FEnum.extend(FUIEnumMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention diff --git a/packages/watermark/src/facade/f-univer.spec.ts b/packages/watermark/src/facade/f-univer.spec.ts index b781ea2bc0..c2a18be74c 100644 --- a/packages/watermark/src/facade/f-univer.spec.ts +++ b/packages/watermark/src/facade/f-univer.spec.ts @@ -56,7 +56,7 @@ describe('watermark facade', () => { const module = await import('./f-univer'); expect(mocked.extendUniver).toHaveBeenCalledWith(module.FUniverWatermarkMixin); - expect(mocked.extendEnum).toHaveBeenCalledWith(module.FWatermarkEnum); + expect(mocked.extendEnum).toHaveBeenCalledWith(module.FWatermarkEnumMixin); const updateWatermarkConfig = vi.fn(); const deleteWatermarkConfig = vi.fn(); @@ -95,7 +95,7 @@ describe('watermark facade', () => { expect(deleteResult).toBe(thisArg); expect(deleteWatermarkConfig).toHaveBeenCalledTimes(1); - const enumObj = new module.FWatermarkEnum(); + const enumObj = new module.FWatermarkEnumMixin(); expect(enumObj.IWatermarkTypeEnum).toBe(mocked.IWatermarkTypeEnum); }); diff --git a/packages/watermark/src/facade/f-univer.ts b/packages/watermark/src/facade/f-univer.ts index 9f90d652c0..6ede922495 100644 --- a/packages/watermark/src/facade/f-univer.ts +++ b/packages/watermark/src/facade/f-univer.ts @@ -19,6 +19,16 @@ import { FEnum, FUniver } from '@univerjs/core/facade'; import { IWatermarkTypeEnum } from '@univerjs/engine-render'; import { WatermarkImageBaseConfig, WatermarkService, WatermarkTextBaseConfig } from '@univerjs/watermark'; +interface IFWatermarkEnumMixin { + IWatermarkTypeEnum: typeof IWatermarkTypeEnum; +} + +export class FWatermarkEnumMixin extends FEnum implements IFWatermarkEnumMixin { + override get IWatermarkTypeEnum(): typeof IWatermarkTypeEnum { + return IWatermarkTypeEnum; + }; +} + /** * @ignore */ @@ -116,18 +126,13 @@ export class FUniverWatermarkMixin extends FUniver { } } -export class FWatermarkEnum { - get IWatermarkTypeEnum(): typeof IWatermarkTypeEnum { - return IWatermarkTypeEnum; - }; -} - FUniver.extend(FUniverWatermarkMixin); -FEnum.extend(FWatermarkEnum); +FEnum.extend(FWatermarkEnumMixin); declare module '@univerjs/core/facade' { // eslint-disable-next-line ts/naming-convention interface FUniver extends IFUniverWatermarkMixin { } // eslint-disable-next-line ts/naming-convention - interface FEnum extends FWatermarkEnum { } + export interface FEnum extends IFWatermarkEnumMixin { + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0ffd947ce..849e160ef9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1529,6 +1529,9 @@ importers: '@univerjs/engine-formula': specifier: workspace:* version: link:../engine-formula + '@univerjs/engine-render': + specifier: workspace:* + version: link:../engine-render '@univerjs/protocol': specifier: 0.1.48 version: 0.1.48 @@ -1539,9 +1542,6 @@ importers: '@univerjs-infra/shared': specifier: workspace:* version: link:../../common/shared - '@univerjs/engine-render': - specifier: workspace:* - version: link:../engine-render '@univerjs/network': specifier: workspace:* version: link:../network @@ -1793,6 +1793,9 @@ importers: '@univerjs/drawing': specifier: workspace:* version: link:../drawing + '@univerjs/engine-render': + specifier: workspace:* + version: link:../engine-render '@univerjs/sheets': specifier: workspace:* version: link:../sheets