From f5e97b186bddef29025ef4ed64ce214ed7edcdd7 Mon Sep 17 00:00:00 2001 From: Wenzhao Hu Date: Thu, 10 Oct 2024 19:22:32 +0800 Subject: [PATCH] refactor!: remove runOnLifecycle and add smoking tests (#3672) Co-authored-by: GitHub Actions --- common/storybook/.storybook/preview.tsx | 10 +- e2e/disposing/disposing.spec.ts | 1 - e2e/smoking/README.md | 6 ++ e2e/smoking/mobile-s/mobile-s-smoking.spec.ts | 31 ++++++ .../sheets-multi/sheets-multi-smoking.spec.ts | 31 ++++++ .../smoking/uni/uni-smoking.spec.ts | 21 ++-- e2e/visual-comparison/README.md | 4 +- .../docs/docs-visual-comparison.spec.ts | 8 ++ .../default-sheet-ci-chromium-linux.png | Bin 33293 -> 0 bytes .../demo-sheet-ci-chromium-linux.png | Bin 155789 -> 0 bytes ...f-demo-sheet-content-1-chromium-darwin.png | Bin 148594 -> 0 bytes .../sheets-visual-comparison.spec.ts | 8 ++ .../default-sheet-chromium-linux.png | Bin .../default-sheet-ci-chromium-linux.png | Bin 0 -> 33174 bytes .../demo-sheet-chromium-linux.png | Bin .../demo-sheet-ci-chromium-linux.png | Bin 0 -> 95498 bytes examples/src/mobile-s/main.ts | 6 +- examples/src/sheets-multi/main.tsx | 4 +- examples/src/sheets/main.ts | 2 +- examples/src/uni/main.ts | 11 +- .../src/controllers/debugger.controller.ts | 8 +- .../performance-monitor.controller.ts | 7 +- .../debugger/src/debugger-plugin.ts | 8 ++ .../controllers/uni-docs-ui.controller.tsx | 3 +- .../doc-formula-input.controller.ts | 11 +- .../slide-formula-input.controller.ts | 7 +- .../controllers/uni-formula-ui.controller.ts | 5 +- .../src/uni-formula-ui.plugin.ts | 12 ++- .../controllers/uni-sheets-ui.controller.tsx | 3 +- .../controllers/uni-slides-ui.controller.tsx | 5 +- .../src/controllers/uniui-flow.controller.tsx | 7 +- .../uniui-leftsidebar.controller.tsx | 3 +- .../controllers/uniui-toolbar.controller.tsx | 5 +- packages-experimental/uniui/src/plugin.ts | 20 ++-- .../src/services/flow/flow-manager.service.ts | 7 +- packages/core/src/index.ts | 3 +- .../src/services/command/command.service.ts | 4 +- .../__tests__/lifecycle.service.spec.ts | 33 +----- .../services/lifecycle/lifecycle.service.ts | 33 +----- .../core/src/services/lifecycle/lifecycle.ts | 58 ---------- .../services/permission/permission.service.ts | 2 +- packages/core/src/services/permission/type.ts | 8 +- .../src/services/plugin/plugin.service.ts | 13 +-- .../core/src/services/resource-loader/type.ts | 6 +- .../user-manager/user-manager.service.ts | 3 +- packages/core/src/univer.ts | 37 ++++--- .../src/controllers/dv-resource.controller.ts | 3 +- packages/data-validation/src/plugin.ts | 8 +- .../doc-drawing-notification.controller.ts | 9 +- ...c-drawing-transformer-update.controller.ts | 12 +-- .../src/controllers/doc-drawing.controller.ts | 31 +++--- .../drawing-popup-menu.controller.ts | 9 +- .../doc-drawing-update.render-controller.ts | 12 +-- packages/docs-drawing-ui/src/plugin.ts | 26 +++-- .../src/controllers/doc-drawing.controller.ts | 14 +-- packages/docs-drawing/src/plugin.ts | 9 +- .../doc-hyper-link-selection.controller.ts | 3 +- .../src/controllers/ui.controller.ts | 10 +- packages/docs-hyper-link-ui/src/plugin.ts | 11 +- .../src/controllers/resource.controller.ts | 3 +- packages/docs-hyper-link/src/plugin.ts | 15 ++- .../doc-mention-trigger.controller.ts | 5 +- .../controllers/doc-mention-ui.controller.ts | 5 +- packages/docs-mention-ui/src/plugin.ts | 25 +++-- .../src/services/doc-mention-popup.service.ts | 3 +- ...doc-thread-comment-selection.controller.ts | 9 +- .../doc-thread-comment-ui.controller.ts | 9 +- .../render-controllers/render.controller.ts | 5 +- packages/docs-thread-comment-ui/src/plugin.ts | 16 +-- .../__tests__/create-command-test-bed.ts | 10 +- .../__tests__/inline-format.command.spec.ts | 3 +- .../controllers/doc-auto-format.controller.ts | 5 +- .../controllers/doc-move-cursor.controller.ts | 29 +++-- .../doc-paragraph-setting.controller.ts | 3 +- .../src/controllers/doc-table.controller.ts | 6 +- .../src/controllers/doc-ui.controller.ts | 8 +- packages/docs-ui/src/docs-ui-plugin.ts | 25 +++-- .../doc-state-change-manager.service.ts | 5 +- .../src/services/docs-render.service.ts | 5 +- .../controllers/custom-range.controller.ts | 5 +- packages/docs/src/doc-plugin.ts | 20 ++-- .../doc-interceptor.service.ts | 3 +- .../src/controllers/drawing-ui.controller.ts | 11 +- .../controllers/drawing-update.controller.ts | 11 +- .../controllers/image-cropper.controller.ts | 9 +- .../controllers/image-update.controller.ts | 11 +- packages/drawing-ui/src/plugin.ts | 18 ++-- .../services/drawing-manager-impl.service.ts | 8 +- .../src/controller/calculate.controller.ts | 6 +- .../src/controller/formula.controller.ts | 11 +- .../controller/set-defined-name.controller.ts | 5 +- .../controller/set-dependency.controller.ts | 13 ++- .../set-feature-calculation.controller.ts | 7 +- .../set-other-formula.controller.ts | 9 +- .../controller/set-super-table.controller.ts | 5 +- .../engine/dependency/formula-dependency.ts | 26 +++-- packages/engine-formula/src/plugin.ts | 33 ++++-- .../src/services/calculate-formula.service.ts | 23 ++-- .../src/apis/__tests__/create-test-bed.ts | 9 ++ .../apis/docs/__tests__/create-test-bed.ts | 5 + .../src/apis/sheets/__tests__/f-range.spec.ts | 4 +- packages/facade/src/apis/sheets/f-formula.ts | 15 +++ .../controllers/find-replace.controller.ts | 5 +- packages/find-replace/src/plugin.ts | 16 +-- .../data-sync/data-sync-primary.controller.ts | 6 +- .../data-sync/data-sync-replica.controller.ts | 4 +- packages/rpc/src/plugin.ts | 20 ++-- .../controllers/cf.auto-fill.controller.ts | 12 +-- .../src/controllers/cf.clear.controller.ts | 5 +- .../controllers/cf.copy-paste.controller.ts | 9 +- .../src/controllers/cf.editor.controller.ts | 3 - .../src/controllers/cf.i18n.controller.ts | 4 +- .../src/controllers/cf.menu.controller.ts | 3 +- .../src/controllers/cf.painter.controller.ts | 9 +- .../src/controllers/cf.panel.controller.ts | 6 +- .../controllers/cf.permission.controller.ts | 6 +- .../controllers/cf.ref-range.controller.ts | 5 +- .../src/controllers/cf.render.controller.ts | 7 +- .../src/plugin.ts | 24 ++++- .../src/plugin.ts | 21 ++-- .../conditional-formatting-formula.service.ts | 8 +- .../conditional-formatting.service.ts | 4 +- .../src/controllers/dv-alert.controller.ts | 3 +- .../controllers/dv-auto-fill.controller.ts | 3 +- .../controllers/dv-copy-paste.controller.ts | 3 +- .../controllers/dv-permission.controller.ts | 3 +- .../controllers/dv-reject-input.controller.ts | 3 +- .../src/controllers/dv-render.controller.ts | 4 +- .../src/controllers/dv-ui.controller.ts | 3 +- .../sheets-data-validation-ui/src/index.ts | 1 + .../src/mobile-plugin.ts | 99 ++++++++++++++++++ .../sheets-data-validation-ui/src/plugin.ts | 15 +++ .../src/controllers/dv-formula.controller.ts | 5 +- .../controllers/dv-ref-range.controller.ts | 3 +- .../src/controllers/dv-sheet.controller.ts | 3 +- .../src/controllers/dv.controller.ts | 3 +- .../src/models/sheet-data-validation-model.ts | 3 +- packages/sheets-data-validation/src/plugin.ts | 11 ++ .../drawing-popup-menu.controller.ts | 7 +- .../sheet-drawing.render-controller.ts | 27 +++-- .../sheet-drawing-copy-paste.controller.ts | 7 +- .../sheet-drawing-permission.controller.ts | 3 +- .../sheet-drawing-printing.controller.ts | 3 +- .../controllers/sheet-drawing.controller.ts | 27 +++-- packages/sheets-drawing-ui/src/plugin.ts | 35 +++++-- .../canvas-float-dom-manager.service.ts | 3 +- .../controllers/sheet-drawing.controller.ts | 3 +- packages/sheets-drawing/src/plugin.ts | 6 +- .../__tests__/sheets-filter.command.spec.ts | 17 +-- .../__tests__/sheets-filter.operation.spec.ts | 12 +-- .../__tests__/sheets-filter.menu.spec.ts | 8 +- .../sheets-filter-panel.service.spec.ts | 22 ++-- .../sheet-find-replace.controller.ts | 17 ++- packages/sheets-find-replace/src/plugin.ts | 10 +- .../__tests__/create-command-test-bed.ts | 4 + .../__tests__/create-command-test-bed.ts | 4 + .../formula-auto-fill.controller.spec.ts | 5 + .../update-formula.controller.spec.ts | 10 +- .../formula-auto-fill.controller.ts | 7 -- .../formula-clipboard.controller.ts | 3 - .../controllers/formula-render.controller.ts | 7 +- .../src/controllers/formula-ui.controller.ts | 3 +- .../src/controllers/prompt.controller.ts | 3 - .../src/sheets-formula-ui.plugin.ts | 12 +++ .../controllers/active-dirty.controller.ts | 48 ++------- ...ray-formula-cell-interceptor.controller.ts | 3 +- .../controllers/defined-name.controller.ts | 4 +- .../controllers/update-formula.controller.ts | 4 - packages/sheets-formula/src/index.ts | 3 +- .../src/sheets-formula.plugin.ts | 40 ++----- .../src/controllers/auto-fill.controller.ts | 5 +- .../src/controllers/copy-paste.controller.ts | 7 +- .../hyper-link-permission.controller.ts | 5 +- .../src/controllers/popup.controller.ts | 9 +- .../controllers/remove-sheet.controller.ts | 3 +- .../render-controllers/render.controller.ts | 3 +- .../rich-text-ref-range.controller.ts | 5 +- .../src/controllers/set-range.controller.ts | 7 +- .../src/controllers/ui.controller.ts | 15 ++- .../src/controllers/url.controller.ts | 3 +- packages/sheets-hyper-link-ui/src/plugin.ts | 16 ++- .../src/controllers/ref-range.controller.ts | 7 +- .../sheet-hyper-link-resource.controller.ts | 5 +- .../sheet-hyper-link.controller.ts | 5 +- packages/sheets-hyper-link/src/plugin.ts | 14 ++- .../src/controllers/__tests__/test.util.ts | 4 + .../numfmt.cell-content.controller.ts | 17 ++- .../src/controllers/numfmt.controller.ts | 15 ++- .../controllers/numfmt.currency.controller.ts | 12 +-- .../controllers/numfmt.editor.controller.ts | 17 ++- .../src/controllers/numfmt.menu.controller.ts | 5 +- .../sheets-numfmt/src/controllers/type.ts | 5 +- packages/sheets-numfmt/src/numfmt-plugin.ts | 18 ++-- .../controllers/sheets-sort-ui.controller.ts | 15 ++- packages/sheets-sort-ui/src/plugin.ts | 13 ++- .../src/services/sheets-sort-ui.service.tsx | 11 +- .../__tests__/create-command-test-bed.ts | 8 +- .../__tests__/sheets-reorder.command.spec.ts | 4 +- .../src/controllers/sheets-sort.controller.ts | 5 +- packages/sheets-sort/src/plugin.ts | 10 +- .../src/services/sheets-sort.service.ts | 10 +- ...ets-thread-comment-ref-range.controller.ts | 9 +- .../sheets-thread-comment-base/src/plugin.ts | 2 + .../render-controllers/render.controller.ts | 3 +- ...ts-thread-comment-copy-paste.controller.ts | 7 +- .../sheets-thread-comment-hover.controller.ts | 3 +- .../sheets-thread-comment-popup.controller.ts | 3 +- ...sheets-thread-comment-remove.controller.ts | 5 +- .../sheets-thread-comment.controller.ts | 7 +- packages/sheets-thread-comment/src/plugin.ts | 17 ++- .../active-worksheet.controller.ts | 3 +- .../src/controllers/auto-fill.controller.ts | 3 - .../src/controllers/auto-height.controller.ts | 8 +- .../src/controllers/cell-alert.controller.ts | 9 +- .../cell-custom-render.controller.ts | 12 +-- .../clipboard/clipboard.controller.ts | 61 +++++------ .../defined-name/defined-name.controller.ts | 5 +- .../editor/formula-editor.controller.ts | 15 ++- .../force-string-alert-render.controller.ts | 6 +- .../force-string-render.controller.ts | 11 +- .../format-painter.controller.ts | 11 +- .../menu/__tests__/create-menu-test-bed.ts | 4 + .../mobile/mobile-sheet-ui.controller.ts | 19 ++-- .../sheet-permission-init.controller.ts | 11 +- ...-permission-interceptor-base.controller.ts | 11 +- ...on-interceptor-canvas-render.controller.ts | 4 +- ...ission-interceptor-clipboard.controller.ts | 5 +- ...n-interceptor-formula-render.controller.ts | 7 +- .../sheet-permission-render.controller.ts | 32 +++--- .../skeleton.render-controller.ts | 11 +- .../zoom.render-controller.ts | 12 ++- .../src/controllers/sheet-ui.controller.ts | 3 +- .../src/controllers/status-bar.controller.ts | 23 ++-- .../sheets-ui/src/mobile-sheets-ui-plugin.ts | 50 ++++----- .../services/auto-fill/auto-fill.service.ts | 17 ++- .../sheet-permission-panel.model.ts | 4 +- .../src/services/sheets-render.service.ts | 4 - packages/sheets-ui/src/sheets-ui-plugin.ts | 19 ++++ .../controllers/zen-editor-ui.controller.ts | 4 +- .../src/controllers/zen-editor.controller.ts | 3 - packages/sheets-zen-editor/src/plugin.ts | 8 ++ .../__tests__/create-command-test-bed.ts | 12 ++- .../set-range-values.command.spec.ts | 5 +- .../controllers/basic-worksheet.controller.ts | 49 ++++----- .../calculate-result-apply.controller.ts | 3 +- .../defined-name-data.controller.ts | 5 +- .../src/controllers/number-cell.controller.ts | 3 +- .../model/range-protection-render.model.ts | 11 +- .../src/model/range-protection-rule.model.ts | 3 +- packages/sheets/src/services/numfmt/type.ts | 6 +- .../range-protection.ref-range.ts | 3 +- .../workbook-permission.service.ts | 6 +- .../worksheet-permission-point.model.ts | 4 +- .../worksheet-permission-rule.model.ts | 4 +- .../worksheet-permission.service.ts | 11 +- .../services/ref-range/ref-range.service.ts | 15 ++- packages/sheets/src/sheets-plugin.ts | 19 ++++ .../slides-ui/src/controllers/canvas-view.ts | 8 +- .../src/controllers/popup-menu.controller.ts | 15 +-- .../src/controllers/slide-ui.controller.ts | 15 ++- .../src/services/slide-render.service.ts | 3 - packages/slides-ui/src/slides-ui-plugin.ts | 28 +++-- .../src/controllers/tc-resource.controller.ts | 7 +- packages/thread-comment/src/plugin.ts | 14 +-- .../src/controllers/error/error.controller.ts | 19 ++-- .../controllers/shared-shortcut.controller.ts | 7 +- .../shortcut-panel.controller.ts | 12 +-- .../controllers/ui/ui-desktop.controller.tsx | 47 +++++---- .../ui/src/controllers/ui/ui.controller.ts | 3 +- packages/ui/src/mobile-ui-plugin.ts | 7 +- .../src/services/confirm/confirm.service.ts | 6 +- .../ui/src/services/layout/layout.service.ts | 5 +- packages/ui/src/ui-plugin.ts | 21 ++-- .../src/controllers/uniscript.controller.ts | 3 +- packages/uniscript/src/plugin.ts | 11 +- 275 files changed, 1458 insertions(+), 1442 deletions(-) create mode 100644 e2e/smoking/README.md create mode 100644 e2e/smoking/mobile-s/mobile-s-smoking.spec.ts create mode 100644 e2e/smoking/sheets-multi/sheets-multi-smoking.spec.ts rename packages/sheets-numfmt/src/controllers/numfmt.i18n.controller.ts => e2e/smoking/uni/uni-smoking.spec.ts (61%) delete mode 100644 e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/default-sheet-ci-chromium-linux.png delete mode 100644 e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/demo-sheet-ci-chromium-linux.png delete mode 100644 e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/diff-demo-sheet-content-1-chromium-darwin.png rename e2e/visual-comparison/{sheet => sheets}/sheets-visual-comparison.spec.ts (89%) rename e2e/visual-comparison/{sheet => sheets}/sheets-visual-comparison.spec.ts-snapshots/default-sheet-chromium-linux.png (100%) create mode 100644 e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-ci-chromium-linux.png rename e2e/visual-comparison/{sheet => sheets}/sheets-visual-comparison.spec.ts-snapshots/demo-sheet-chromium-linux.png (100%) create mode 100644 e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/demo-sheet-ci-chromium-linux.png create mode 100644 packages/sheets-data-validation-ui/src/mobile-plugin.ts diff --git a/common/storybook/.storybook/preview.tsx b/common/storybook/.storybook/preview.tsx index ff50f01a1e3..fdc691b7843 100644 --- a/common/storybook/.storybook/preview.tsx +++ b/common/storybook/.storybook/preview.tsx @@ -14,11 +14,7 @@ * limitations under the License. */ -import React from 'react'; import type { Preview } from '@storybook/react'; -import { ConfigProvider, defaultTheme, greenTheme, themeInstance } from '@univerjs/design'; -import zhCN from '@univerjs/design/locale/zh-CN'; -import enUS from '@univerjs/design/locale/en-US'; import { CommandService, ConfigService, @@ -35,7 +31,6 @@ import { IResourceManagerService, IUndoRedoService, IUniverInstanceService, - LifecycleInitializerService, LifecycleService, LocaleService, LocaleType, @@ -46,7 +41,11 @@ import { ThemeService, UniverInstanceService, } from '@univerjs/core'; +import { ConfigProvider, defaultTheme, greenTheme, themeInstance } from '@univerjs/design'; +import enUS from '@univerjs/design/locale/en-US'; +import zhCN from '@univerjs/design/locale/zh-CN'; import { DesktopLocalStorageService } from '@univerjs/ui'; +import React from 'react'; export const themes: Record> = { default: defaultTheme, @@ -94,7 +93,6 @@ const preview: Preview = { [LocaleService], [ThemeService], [LifecycleService], - [LifecycleInitializerService], [ILogService, { useClass: DesktopLogService, lazy: true }], [ICommandService, { useClass: CommandService, lazy: true }], [IUndoRedoService, { useClass: LocalUndoRedoService, lazy: true }], diff --git a/e2e/disposing/disposing.spec.ts b/e2e/disposing/disposing.spec.ts index 885b494e664..9525fd4f378 100644 --- a/e2e/disposing/disposing.spec.ts +++ b/e2e/disposing/disposing.spec.ts @@ -65,7 +65,6 @@ test('no error on constructing and disposing sheet unit', async ({ page }) => { }); test('no error when dispose a unit', async ({ page }) => { - // test.setTimeout(40 * 1000); let errored = false; page.on('pageerror', (error) => { diff --git a/e2e/smoking/README.md b/e2e/smoking/README.md new file mode 100644 index 00000000000..8d6677ade8f --- /dev/null +++ b/e2e/smoking/README.md @@ -0,0 +1,6 @@ +# Notes on Smoking + +These tests make sure that all the demo pages can be loaded without any errors. Some demos are implemented in visual comparison tests, so they are not included in this suite. + +- docs +- sheets diff --git a/e2e/smoking/mobile-s/mobile-s-smoking.spec.ts b/e2e/smoking/mobile-s/mobile-s-smoking.spec.ts new file mode 100644 index 00000000000..b5705575a0e --- /dev/null +++ b/e2e/smoking/mobile-s/mobile-s-smoking.spec.ts @@ -0,0 +1,31 @@ +/** + * Copyright 2023-present DreamNum Inc. + * + * 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 { expect, test } from '@playwright/test'; + +test('ensure mobile-s boots up without errors', async ({ page }) => { + let errored = false; + + page.on('pageerror', (error) => { + console.error('Page error:', error); + errored = true; + }); + + await page.goto('http://localhost:3000/mobile-s/'); + await page.waitForTimeout(10000); + + expect(errored).toBeFalsy(); +}); diff --git a/e2e/smoking/sheets-multi/sheets-multi-smoking.spec.ts b/e2e/smoking/sheets-multi/sheets-multi-smoking.spec.ts new file mode 100644 index 00000000000..b11e397e031 --- /dev/null +++ b/e2e/smoking/sheets-multi/sheets-multi-smoking.spec.ts @@ -0,0 +1,31 @@ +/** + * Copyright 2023-present DreamNum Inc. + * + * 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 { expect, test } from '@playwright/test'; + +test('ensure sheets-multi boots up without errors', async ({ page }) => { + let errored = false; + + page.on('pageerror', (error) => { + console.error('Page error:', error); + errored = true; + }); + + await page.goto('http://localhost:3000/sheets-multi/'); + await page.waitForTimeout(10000); + + expect(errored).toBeFalsy(); +}); diff --git a/packages/sheets-numfmt/src/controllers/numfmt.i18n.controller.ts b/e2e/smoking/uni/uni-smoking.spec.ts similarity index 61% rename from packages/sheets-numfmt/src/controllers/numfmt.i18n.controller.ts rename to e2e/smoking/uni/uni-smoking.spec.ts index 7a8c9b52591..9789789fc26 100644 --- a/packages/sheets-numfmt/src/controllers/numfmt.i18n.controller.ts +++ b/e2e/smoking/uni/uni-smoking.spec.ts @@ -14,11 +14,18 @@ * limitations under the License. */ -import { Disposable, Inject, LifecycleStages, LocaleService, OnLifecycle } from '@univerjs/core'; +import { expect, test } from '@playwright/test'; -@OnLifecycle(LifecycleStages.Rendered, NumfmtI18nController) -export class NumfmtI18nController extends Disposable { - constructor(@Inject(LocaleService) private _localeService: LocaleService) { - super(); - } -} +test('ensure uni boots up without errors', async ({ page }) => { + let errored = false; + + page.on('pageerror', (error) => { + console.error('Page error:', error); + errored = true; + }); + + await page.goto('http://localhost:3000/uni/'); + await page.waitForTimeout(10000); + + expect(errored).toBeFalsy(); +}); diff --git a/e2e/visual-comparison/README.md b/e2e/visual-comparison/README.md index 40d5133f76b..d3b0d40f3e4 100644 --- a/e2e/visual-comparison/README.md +++ b/e2e/visual-comparison/README.md @@ -1,4 +1,6 @@ -# Notes on visual comparison +# Notes on Visual Comparison You should set `maxDiffPixels` on a minimum value. The cursor may be different in snapshots because it is blinking, especially in rich-text editors. + +For more instructions, please read related part in [CONTRIBUTING.md](../../CONTRIBUTING.md). diff --git a/e2e/visual-comparison/docs/docs-visual-comparison.spec.ts b/e2e/visual-comparison/docs/docs-visual-comparison.spec.ts index 8e3a9822107..39b0d9fc70b 100644 --- a/e2e/visual-comparison/docs/docs-visual-comparison.spec.ts +++ b/e2e/visual-comparison/docs/docs-visual-comparison.spec.ts @@ -18,6 +18,13 @@ import { expect, test } from '@playwright/test'; import { generateSnapshotName } from '../const'; test('diff default doc content', async ({ page }) => { + let errored = false; + + page.on('pageerror', (error) => { + console.error('Page error:', error); + errored = true; + }); + await page.goto('http://localhost:3000/docs/'); await page.waitForTimeout(2000); @@ -25,4 +32,5 @@ test('diff default doc content', async ({ page }) => { await page.waitForTimeout(5000); await expect(page).toHaveScreenshot(generateSnapshotName('default-doc'), { maxDiffPixels: 30 }); + expect(errored).toBeFalsy(); }); diff --git a/e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/default-sheet-ci-chromium-linux.png b/e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/default-sheet-ci-chromium-linux.png deleted file mode 100644 index 85e8c788d06ccee24e31a7edb5a45881c1ec73be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33293 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 diff --git a/e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/demo-sheet-ci-chromium-linux.png b/e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/demo-sheet-ci-chromium-linux.png deleted file mode 100644 index 6bfb595ffade878c60658613f8796c9ec33434f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155789 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 z 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 diff --git a/e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/diff-demo-sheet-content-1-chromium-darwin.png b/e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/diff-demo-sheet-content-1-chromium-darwin.png deleted file mode 100644 index d1c05430c14f8d7d25bb954bf64171c2adf974d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148594 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%0D&l){C8@oT{}R^Mp_n%> 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 M07*qoM6N<$g3Ky4{Qv*} diff --git a/e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts similarity index 89% rename from e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts rename to e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts index dab25a44abe..ca76b196d67 100644 --- a/e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts +++ b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts @@ -28,6 +28,13 @@ test('diff default sheet content', async ({ page }) => { }); test('diff demo sheet content', async ({ page }) => { + let errored = false; + + page.on('pageerror', (error) => { + console.error('Page error:', error); + errored = true; + }); + await page.goto('http://localhost:3000/sheets/'); await page.waitForTimeout(2000); @@ -35,4 +42,5 @@ test('diff demo sheet content', async ({ page }) => { await page.waitForTimeout(5000); await expect(page).toHaveScreenshot(generateSnapshotName('demo-sheet'), { maxDiffPixels: 5 }); + expect(errored).toBeFalsy(); }); diff --git a/e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/default-sheet-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-chromium-linux.png similarity index 100% rename from e2e/visual-comparison/sheet/sheets-visual-comparison.spec.ts-snapshots/default-sheet-chromium-linux.png rename to e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-chromium-linux.png diff --git a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-ci-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..97828dd477f2af6ec6b1db4547dc5508f9969156 GIT binary patch literal 33174 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 literal 0 HcmV?d00001 diff --git a/examples/src/mobile-s/main.ts b/examples/src/mobile-s/main.ts index d0d930c1419..73d90b86c2f 100644 --- a/examples/src/mobile-s/main.ts +++ b/examples/src/mobile-s/main.ts @@ -27,9 +27,10 @@ import { UniverRPCMainThreadPlugin } from '@univerjs/rpc'; import { UniverSheetsPlugin } from '@univerjs/sheets'; import { UniverSheetsConditionalFormattingMobileUIPlugin } from '@univerjs/sheets-conditional-formatting-ui'; import { UniverSheetsDataValidationPlugin } from '@univerjs/sheets-data-validation'; +import { UniverSheetsDataValidationMobileUIPlugin } from '@univerjs/sheets-data-validation-ui'; import { UniverSheetsFilterPlugin } from '@univerjs/sheets-filter'; import { UniverSheetsFilterMobileUIPlugin } from '@univerjs/sheets-filter-ui'; -import { UniverSheetsFormulaMobilePlugin } from '@univerjs/sheets-formula'; +import { UniverSheetsFormulaPlugin } from '@univerjs/sheets-formula'; import { UniverSheetsNumfmtPlugin } from '@univerjs/sheets-numfmt'; import { UniverSheetsMobileUIPlugin } from '@univerjs/sheets-ui'; import { UniverMobileUIPlugin } from '@univerjs/ui'; @@ -65,9 +66,10 @@ univer.registerPlugin(UniverSheetsMobileUIPlugin); univer.registerPlugin(UniverSheetsFilterPlugin); univer.registerPlugin(UniverSheetsFilterMobileUIPlugin); univer.registerPlugin(UniverSheetsNumfmtPlugin); -univer.registerPlugin(UniverSheetsFormulaMobilePlugin); +univer.registerPlugin(UniverSheetsFormulaPlugin); univer.registerPlugin(UniverSheetsConditionalFormattingMobileUIPlugin); univer.registerPlugin(UniverSheetsDataValidationPlugin); +univer.registerPlugin(UniverSheetsDataValidationMobileUIPlugin); const mockUser = { userID: 'Owner_qxVnhPbQ', diff --git a/examples/src/sheets-multi/main.tsx b/examples/src/sheets-multi/main.tsx index 5e0460e016c..31f59ddbb13 100644 --- a/examples/src/sheets-multi/main.tsx +++ b/examples/src/sheets-multi/main.tsx @@ -19,6 +19,7 @@ import { defaultTheme } from '@univerjs/design'; import { UniverDocsPlugin } from '@univerjs/docs'; import { UniverDocsUIPlugin } from '@univerjs/docs-ui'; +import { UniverFormulaEnginePlugin } from '@univerjs/engine-formula'; import { UniverRenderEnginePlugin } from '@univerjs/engine-render'; import { DEFAULT_WORKBOOK_DATA_DEMO } from '@univerjs/mockdata'; import { UniverSheetsPlugin } from '@univerjs/sheets'; @@ -29,8 +30,8 @@ import { UniverUIPlugin } from '@univerjs/ui'; import React, { useEffect } from 'react'; import { createRoot } from 'react-dom/client'; import { Mosaic, MosaicWindow } from 'react-mosaic-component'; -import { enUS, ruRU, zhCN } from '../locales'; +import { enUS, ruRU, zhCN } from '../locales'; import 'react-mosaic-component/react-mosaic-component.css'; import './index.css'; @@ -47,6 +48,7 @@ function factory(id: string) { logLevel: LogLevel.VERBOSE, }); + univer.registerPlugin(UniverFormulaEnginePlugin); univer.registerPlugin(UniverRenderEnginePlugin); univer.registerPlugin(UniverUIPlugin, { container: id, diff --git a/examples/src/sheets/main.ts b/examples/src/sheets/main.ts index 7cc34cbe245..4a42c1edc21 100644 --- a/examples/src/sheets/main.ts +++ b/examples/src/sheets/main.ts @@ -25,8 +25,8 @@ import { UniverDocsUIPlugin } from '@univerjs/docs-ui'; import { UniverFormulaEnginePlugin } from '@univerjs/engine-formula'; import { UniverRenderEnginePlugin } from '@univerjs/engine-render'; import { FUniver } from '@univerjs/facade'; -import { DEFAULT_WORKBOOK_DATA_DEMO } from '@univerjs/mockdata'; +import { DEFAULT_WORKBOOK_DATA_DEMO } from '@univerjs/mockdata'; import { UniverRPCMainThreadPlugin } from '@univerjs/rpc'; import { UniverSheetsPlugin } from '@univerjs/sheets'; import { UniverSheetsConditionalFormattingPlugin } from '@univerjs/sheets-conditional-formatting'; diff --git a/examples/src/uni/main.ts b/examples/src/uni/main.ts index 47b59c450bd..e0baf08defa 100644 --- a/examples/src/uni/main.ts +++ b/examples/src/uni/main.ts @@ -48,9 +48,6 @@ import { UniSlidesUIController } from '@univerjs/uni-slides-ui'; import { UniverUniUIPlugin } from '@univerjs/uniui'; import { enUS } from '../locales'; -/* eslint-disable-next-line node/prefer-global/process */ -const IS_E2E: boolean = !!process.env.IS_E2E; - const LOAD_LAZY_PLUGINS_TIMEOUT = 4_000; // univer @@ -99,11 +96,9 @@ class CustomMentionDataService implements IThreadCommentMentionDataService { } // create univer instances -if (!IS_E2E) { - univer.createUnit(UniverInstanceType.UNIVER_SHEET, DEFAULT_WORKBOOK_DATA_DEMO); - univer.createUnit(UniverInstanceType.UNIVER_DOC, DEFAULT_DOCUMENT_DATA_EN); - univer.createUnit(UniverInstanceType.UNIVER_SHEET, DEFAULT_WORKBOOK_DATA_DEMO1); -} +univer.createUnit(UniverInstanceType.UNIVER_SHEET, DEFAULT_WORKBOOK_DATA_DEMO); +univer.createUnit(UniverInstanceType.UNIVER_DOC, DEFAULT_DOCUMENT_DATA_EN); +univer.createUnit(UniverInstanceType.UNIVER_SHEET, DEFAULT_WORKBOOK_DATA_DEMO1); // debugger plugin univer.registerPlugin(UniverDebuggerPlugin); diff --git a/packages-experimental/debugger/src/controllers/debugger.controller.ts b/packages-experimental/debugger/src/controllers/debugger.controller.ts index 4e4b48efb17..c8fa8825d4d 100644 --- a/packages-experimental/debugger/src/controllers/debugger.controller.ts +++ b/packages-experimental/debugger/src/controllers/debugger.controller.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService, Inject, Injector } from '@univerjs/core'; import { ComponentManager, IMenuManagerService } from '@univerjs/ui'; - import { CreateFloatDomCommand } from '../commands/commands/float-dom.command'; import { CreateEmptySheetCommand, DisposeCurrentUnitCommand, DisposeUniverCommand, LoadSheetSnapshotCommand } from '../commands/commands/unit.command'; import { ShowCellContentOperation } from '../commands/operations/cell.operation'; @@ -28,19 +27,18 @@ import { MessageOperation } from '../commands/operations/message.operation'; import { NotificationOperation } from '../commands/operations/notification.operation'; import { SaveSnapshotOptions } from '../commands/operations/save-snapshot.operations'; import { SetEditable } from '../commands/operations/set.editable.operation'; - import { SidebarOperation } from '../commands/operations/sidebar.operation'; - import { ThemeOperation } from '../commands/operations/theme.operation'; import { ImageDemo } from '../components/Image'; + // @ts-ignore import VueI18nIcon from '../components/VueI18nIcon.vue'; + import { TEST_EDITOR_CONTAINER_COMPONENT } from '../views/test-editor/component-name'; import { TestEditorContainer } from '../views/test-editor/TestTextEditor'; import { RecordController } from './local-save/record.controller'; import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Ready, DebuggerController) export class DebuggerController extends Disposable { constructor( @Inject(Injector) private readonly _injector: Injector, diff --git a/packages-experimental/debugger/src/controllers/performance-monitor.controller.ts b/packages-experimental/debugger/src/controllers/performance-monitor.controller.ts index 9818724bcff..8543a5645f9 100644 --- a/packages-experimental/debugger/src/controllers/performance-monitor.controller.ts +++ b/packages-experimental/debugger/src/controllers/performance-monitor.controller.ts @@ -14,13 +14,12 @@ * limitations under the License. */ -import { Inject, IUniverInstanceService, LifecycleService, LifecycleStages, OnLifecycle, RxDisposable } from '@univerjs/core'; -import { IRenderManagerService } from '@univerjs/engine-render'; -import { distinctUntilChanged, filter, take, takeUntil } from 'rxjs'; import type { Nullable } from '@univerjs/core'; import type { Subscription } from 'rxjs'; +import { Inject, IUniverInstanceService, LifecycleService, LifecycleStages, RxDisposable } from '@univerjs/core'; +import { IRenderManagerService } from '@univerjs/engine-render'; +import { distinctUntilChanged, filter, take, takeUntil } from 'rxjs'; -@OnLifecycle(LifecycleStages.Rendered, PerformanceMonitorController) export class PerformanceMonitorController extends RxDisposable { private _initListener = false; private _containerElement!: HTMLDivElement; diff --git a/packages-experimental/debugger/src/debugger-plugin.ts b/packages-experimental/debugger/src/debugger-plugin.ts index b8ec344cb3a..3447db5d8bb 100644 --- a/packages-experimental/debugger/src/debugger-plugin.ts +++ b/packages-experimental/debugger/src/debugger-plugin.ts @@ -52,6 +52,14 @@ export class UniverDebuggerPlugin extends Plugin { this._injector.get(E2EController); } + override onReady(): void { + this._injector.get(DebuggerController); + } + + override onRendered(): void { + this._injector.get(PerformanceMonitorController); + } + getDebuggerController() { this._debuggerController = this._injector.get(DebuggerController); return this._debuggerController; diff --git a/packages-experimental/uni-docs-ui/src/controllers/uni-docs-ui.controller.tsx b/packages-experimental/uni-docs-ui/src/controllers/uni-docs-ui.controller.tsx index 177bb10d44a..3fe264b7f8c 100644 --- a/packages-experimental/uni-docs-ui/src/controllers/uni-docs-ui.controller.tsx +++ b/packages-experimental/uni-docs-ui/src/controllers/uni-docs-ui.controller.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { ICommandService, IConfigService, Inject, Injector, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import { ICommandService, IConfigService, Inject, Injector, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { IMAGE_MENU_ID as DocsImageMenuId } from '@univerjs/docs-drawing-ui'; import { BulletListCommand, DocCreateTableOperation, DocUIController, OrderListCommand, SetInlineFormatBoldCommand, SetInlineFormatFontFamilyCommand, SetInlineFormatFontSizeCommand, SetInlineFormatItalicCommand, SetInlineFormatStrikethroughCommand, SetInlineFormatTextBackgroundColorCommand, SetInlineFormatTextColorCommand, SetInlineFormatUnderlineCommand } from '@univerjs/docs-ui'; import { ComponentManager, ILayoutService, IMenuManagerService, IShortcutService, IUIPartsService } from '@univerjs/ui'; @@ -22,7 +22,6 @@ import { BuiltinUniToolbarItemId, generateCloneMutation, UniToolbarService } fro import { DOC_BOLD_MUTATION_ID, DOC_ITALIC_MUTATION_ID, DOC_STRIKE_MUTATION_ID, DOC_TABLE_MUTATION_ID, DOC_UNDERLINE_MUTATION_ID } from './menu'; import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Ready, UniDocsUIController) export class UniDocsUIController extends DocUIController { constructor( @Inject(Injector) injector: Injector, diff --git a/packages-experimental/uni-formula-ui/src/controllers/doc-formula-input.controller.ts b/packages-experimental/uni-formula-ui/src/controllers/doc-formula-input.controller.ts index aefdb0e997b..19159824855 100644 --- a/packages-experimental/uni-formula-ui/src/controllers/doc-formula-input.controller.ts +++ b/packages-experimental/uni-formula-ui/src/controllers/doc-formula-input.controller.ts @@ -14,23 +14,22 @@ * limitations under the License. */ -import { CustomRangeType, Disposable, ICommandService, ILogService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import type { DocumentDataModel } from '@univerjs/core'; +import type { IInsertCommandParams } from '@univerjs/docs-ui'; +import type { IShowFormulaPopupOperationParams } from '../commands/operations/operation'; +import { CustomRangeType, Disposable, ICommandService, ILogService, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { DocSelectionManagerService } from '@univerjs/docs'; + import { DeleteLeftCommand, DocEventManagerService, IEditorService, InsertCommand, MoveCursorOperation } from '@univerjs/docs-ui'; import { IRenderManagerService } from '@univerjs/engine-render'; import { filter, map, mergeMap } from 'rxjs'; - -import type { DocumentDataModel } from '@univerjs/core'; -import type { IInsertCommandParams } from '@univerjs/docs-ui'; import { AddDocUniFormulaCommand, RemoveDocUniFormulaCommand, UpdateDocUniFormulaCommand } from '../commands/commands/doc.command'; import { CloseFormulaPopupOperation, ShowFormulaPopupOperation } from '../commands/operations/operation'; import { UniFormulaPopupService } from '../services/formula-popup.service'; import { UNI_FORMULA_EDITOR_ID } from '../views/components/DocFormulaPopup'; -import type { IShowFormulaPopupOperationParams } from '../commands/operations/operation'; const FORMULA_INPUT_TRIGGER_CHAR = '='; -@OnLifecycle(LifecycleStages.Steady, DocUniFormulaInputController) export class DocUniFormulaInputController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages-experimental/uni-formula-ui/src/controllers/slide-formula-input.controller.ts b/packages-experimental/uni-formula-ui/src/controllers/slide-formula-input.controller.ts index d0a52cedd2c..9e698dd22dc 100644 --- a/packages-experimental/uni-formula-ui/src/controllers/slide-formula-input.controller.ts +++ b/packages-experimental/uni-formula-ui/src/controllers/slide-formula-input.controller.ts @@ -14,20 +14,19 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, Injector, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import type { IInsertCommandParams } from '@univerjs/docs-ui'; +import type { IShowFormulaPopupOperationParams, ISlidePopupPosition } from '../commands/operations/operation'; +import { Disposable, ICommandService, Inject, Injector, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { DocSelectionManagerService } from '@univerjs/docs'; import { IEditorService, InsertCommand } from '@univerjs/docs-ui'; import { ISlideEditorBridgeService } from '@univerjs/slides-ui'; -import type { IInsertCommandParams } from '@univerjs/docs-ui'; import { AddSlideUniFormulaCommand } from '../commands/commands/slide.command'; import { CloseFormulaPopupOperation, ShowFormulaPopupOperation } from '../commands/operations/operation'; import { UniFormulaPopupService } from '../services/formula-popup.service'; import { UNI_FORMULA_EDITOR_ID } from '../views/components/DocFormulaPopup'; -import type { IShowFormulaPopupOperationParams, ISlidePopupPosition } from '../commands/operations/operation'; const FORMULA_INPUT_TRIGGER_CHAR = '='; -@OnLifecycle(LifecycleStages.Steady, SlideUniFormulaInputController) export class SlideUniFormulaInputController extends Disposable { constructor( @Inject(Injector) private readonly _injector: Injector, diff --git a/packages-experimental/uni-formula-ui/src/controllers/uni-formula-ui.controller.ts b/packages-experimental/uni-formula-ui/src/controllers/uni-formula-ui.controller.ts index e4534887235..4ebc32f4e69 100644 --- a/packages-experimental/uni-formula-ui/src/controllers/uni-formula-ui.controller.ts +++ b/packages-experimental/uni-formula-ui/src/controllers/uni-formula-ui.controller.ts @@ -14,12 +14,11 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { ComponentManager } from '@univerjs/ui'; -import { UniFormulaPopup } from '../views/components/DocFormulaPopup'; import { CloseFormulaPopupOperation, ConfirmFormulaPopupCommand, ShowFormulaPopupOperation } from '../commands/operations/operation'; +import { UniFormulaPopup } from '../views/components/DocFormulaPopup'; -@OnLifecycle(LifecycleStages.Steady, UniFormulaUniController) export class UniFormulaUniController extends Disposable { constructor( @ICommandService private readonly _commandSrv: ICommandService, diff --git a/packages-experimental/uni-formula-ui/src/uni-formula-ui.plugin.ts b/packages-experimental/uni-formula-ui/src/uni-formula-ui.plugin.ts index 1938bbaef09..0d5b48606a8 100644 --- a/packages-experimental/uni-formula-ui/src/uni-formula-ui.plugin.ts +++ b/packages-experimental/uni-formula-ui/src/uni-formula-ui.plugin.ts @@ -19,12 +19,12 @@ import { DependentOn, Inject, Injector, Plugin, UniverInstanceType } from '@univ import { IUniFormulaService, UniverDocUniFormulaPlugin } from '@univerjs/uni-formula'; import { DOC_FORMULA_UI_PLUGIN_NAME } from './const'; -import { UniFormulaPopupService } from './services/formula-popup.service'; import { DocUniFormulaInputController } from './controllers/doc-formula-input.controller'; -import { UniFormulaService } from './services/uni-formula.service'; -import { UniFormulaUniController } from './controllers/uni-formula-ui.controller'; import { SlideUniFormulaInputController } from './controllers/slide-formula-input.controller'; +import { UniFormulaUniController } from './controllers/uni-formula-ui.controller'; +import { UniFormulaPopupService } from './services/formula-popup.service'; import { SlideUIFormulaCacheService } from './services/slide-ui-formula-cache.service'; +import { UniFormulaService } from './services/uni-formula.service'; @DependentOn(UniverDocUniFormulaPlugin) export class UniverDocUniFormulaUIPlugin extends Plugin { @@ -52,4 +52,10 @@ export class UniverDocUniFormulaUIPlugin extends Plugin { override onReady(): void { this._injector.get(IUniFormulaService); } + + override onSteady(): void { + this._injector.get(UniFormulaUniController); + this._injector.get(DocUniFormulaInputController); + this._injector.get(SlideUniFormulaInputController); + } } diff --git a/packages-experimental/uni-sheets-ui/src/controllers/uni-sheets-ui.controller.tsx b/packages-experimental/uni-sheets-ui/src/controllers/uni-sheets-ui.controller.tsx index 8c380a137e6..460ebd0c598 100644 --- a/packages-experimental/uni-sheets-ui/src/controllers/uni-sheets-ui.controller.tsx +++ b/packages-experimental/uni-sheets-ui/src/controllers/uni-sheets-ui.controller.tsx @@ -15,7 +15,7 @@ */ import type { Workbook } from '@univerjs/core'; -import { connectInjector, ICommandService, IConfigService, Inject, Injector, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType, useDependency } from '@univerjs/core'; +import { connectInjector, ICommandService, IConfigService, Inject, Injector, IUniverInstanceService, UniverInstanceType, useDependency } from '@univerjs/core'; import { SetBackgroundColorCommand } from '@univerjs/sheets'; import { IMAGE_MENU_ID as SheetsImageMenuId } from '@univerjs/sheets-drawing-ui'; import { RenderSheetContent, SetRangeBoldCommand, SetRangeFontFamilyCommand, SetRangeFontSizeCommand, SetRangeItalicCommand, SetRangeStrickThroughCommand, SetRangeTextColorCommand, SetRangeUnderlineCommand, SheetUIController } from '@univerjs/sheets-ui'; @@ -26,7 +26,6 @@ import { UniSheetBar } from '../views/uni-sheet-bar/UniSheetBar'; import { SHEET_BOLD_MUTATION_ID, SHEET_ITALIC_MUTATION_ID, SHEET_STRIKE_MUTATION_ID, SHEET_UNDERLINE_MUTATION_ID } from './menu'; import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Ready, SheetUIController) export class UniSheetsUIController extends SheetUIController { constructor( @Inject(Injector) injector: Injector, diff --git a/packages-experimental/uni-slides-ui/src/controllers/uni-slides-ui.controller.tsx b/packages-experimental/uni-slides-ui/src/controllers/uni-slides-ui.controller.tsx index e767af28958..0dda109d482 100644 --- a/packages-experimental/uni-slides-ui/src/controllers/uni-slides-ui.controller.tsx +++ b/packages-experimental/uni-slides-ui/src/controllers/uni-slides-ui.controller.tsx @@ -14,16 +14,15 @@ * limitations under the License. */ -import React from 'react'; import type { SlideDataModel } from '@univerjs/core'; -import { connectInjector, ICommandService, Inject, Injector, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType, useDependency } from '@univerjs/core'; +import { connectInjector, ICommandService, Inject, Injector, IUniverInstanceService, UniverInstanceType, useDependency } from '@univerjs/core'; import { IMAGE_MENU_ID, SHAPE_MENU_ID, SlideAddTextCommand, SlideEditorContainer, SlidesUIController } from '@univerjs/slides-ui'; import { BuiltInUIPart, ComponentManager, IMenuManagerService, IShortcutService, IUIPartsService, useObservable } from '@univerjs/ui'; import { BuiltinUniToolbarItemId, UniToolbarService, UniUIPart } from '@univerjs/uniui'; +import React from 'react'; import { UniSlideSideBar } from '../views/UniSlideSideBar'; import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Ready, UniSlidesUIController) export class UniSlidesUIController extends SlidesUIController { constructor( @Inject(Injector) _injector: Injector, diff --git a/packages-experimental/uniui/src/controllers/uniui-flow.controller.tsx b/packages-experimental/uniui/src/controllers/uniui-flow.controller.tsx index 6a42f9a69ab..51cbb536fb9 100644 --- a/packages-experimental/uniui/src/controllers/uniui-flow.controller.tsx +++ b/packages-experimental/uniui/src/controllers/uniui-flow.controller.tsx @@ -14,14 +14,13 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import type { IFlowViewport } from '../services/flow/flow-manager.service'; +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { auditTime, throttleTime } from 'rxjs'; import { SetFlowViewportOperation } from '../commands/operations/set-flow-viewport.operation'; -import type { IFlowViewport } from '../services/flow/flow-manager.service'; -import { FlowManagerService } from '../services/flow/flow-manager.service'; import { UniFocusUnitOperation } from '../commands/operations/uni-focus-unit.operation'; +import { FlowManagerService } from '../services/flow/flow-manager.service'; -@OnLifecycle(LifecycleStages.Ready, UniuiFlowController) export class UniuiFlowController extends Disposable { constructor( @ICommandService protected readonly _commandService: ICommandService, diff --git a/packages-experimental/uniui/src/controllers/uniui-leftsidebar.controller.tsx b/packages-experimental/uniui/src/controllers/uniui-leftsidebar.controller.tsx index 8e28622070e..d076f8c3650 100644 --- a/packages-experimental/uniui/src/controllers/uniui-leftsidebar.controller.tsx +++ b/packages-experimental/uniui/src/controllers/uniui-leftsidebar.controller.tsx @@ -14,15 +14,14 @@ * limitations under the License. */ -import { Disposable, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; import type { ISidebarService } from '@univerjs/ui'; +import { Disposable, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { ComponentManager, ILeftSidebarService } from '@univerjs/ui'; import { distinctUntilChanged, map } from 'rxjs'; import { Outline } from '../views/outline/Outline'; const OUTLINE_COMPONENT = 'OUTLINE_COMPONENT'; -@OnLifecycle(LifecycleStages.Ready, UniuiLeftSidebarController) export class UniuiLeftSidebarController extends Disposable { constructor( @Inject(ComponentManager) private readonly _componentManager: ComponentManager, diff --git a/packages-experimental/uniui/src/controllers/uniui-toolbar.controller.tsx b/packages-experimental/uniui/src/controllers/uniui-toolbar.controller.tsx index 73e98eaf99f..f837db83a48 100644 --- a/packages-experimental/uniui/src/controllers/uniui-toolbar.controller.tsx +++ b/packages-experimental/uniui/src/controllers/uniui-toolbar.controller.tsx @@ -14,9 +14,9 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; -import { DeleteSingle, DownloadSingle, LockSingle, PivotTableSingle, PrintSingle, ShareSingle, ZenSingle } from '@univerjs/icons'; import type { MenuConfig } from '@univerjs/ui'; +import { Disposable, ICommandService, Inject, Injector } from '@univerjs/core'; +import { DeleteSingle, DownloadSingle, LockSingle, PivotTableSingle, PrintSingle, ShareSingle, ZenSingle } from '@univerjs/icons'; import { ComponentManager, IMenuManagerService } from '@univerjs/ui'; import { DisposeUnitOperation } from '../commands/operations/uni.operation'; import { UniToolbarService } from '../services/toolbar/uni-toolbar-service'; @@ -28,7 +28,6 @@ export interface IUniuiToolbarConfig { export const DefaultUniuiToolbarConfig = {}; -@OnLifecycle(LifecycleStages.Ready, UniuiToolbarController) export class UniuiToolbarController extends Disposable { constructor( @IMenuManagerService protected readonly _menuManagerService: IMenuManagerService, diff --git a/packages-experimental/uniui/src/plugin.ts b/packages-experimental/uniui/src/plugin.ts index 7dae6cfd0a7..a16e0f5c51a 100644 --- a/packages-experimental/uniui/src/plugin.ts +++ b/packages-experimental/uniui/src/plugin.ts @@ -14,8 +14,9 @@ * limitations under the License. */ +import type { Dependency } from '@univerjs/core'; +import type { IUniverUIConfig } from '@univerjs/ui'; import { DependentOn, IContextService, ILocalStorageService, Inject, Injector, mergeOverrideWithDependencies, Plugin, Tools } from '@univerjs/core'; -import { EditorService, IEditorService, IRangeSelectorService, RangeSelectorService } from '@univerjs/docs-ui'; import { UniverRenderEnginePlugin } from '@univerjs/engine-render'; import { BrowserClipboardService, @@ -28,6 +29,7 @@ import { DesktopDialogService, DesktopGlobalZoneService, DesktopLayoutService, + DesktopLocalFileService, DesktopLocalStorageService, DesktopMessageService, DesktopNotificationService, @@ -44,6 +46,7 @@ import { IGlobalZoneService, ILayoutService, ILeftSidebarService, + ILocalFileService, IMenuManagerService, IMenuService, IMessageService, @@ -67,8 +70,6 @@ import { UNIVER_UI_PLUGIN_NAME, ZIndexManager, } from '@univerjs/ui'; -import type { Dependency } from '@univerjs/core'; -import type { IUniverUIConfig } from '@univerjs/ui'; import { UniverUniUIController } from './controllers/uniui-desktop.controller'; import { UniuiFlowController } from './controllers/uniui-flow.controller'; import { UniuiLeftSidebarController } from './controllers/uniui-leftsidebar.controller'; @@ -77,8 +78,6 @@ import { FlowManagerService } from './services/flow/flow-manager.service'; import { UniToolbarService } from './services/toolbar/uni-toolbar-service'; import { IUnitGridService, UnitGridService } from './services/unit-grid/unit-grid.service'; -const UI_BOOTSTRAP_DELAY = 16; - /** * This plugin enables the Uni Mode of Univer. It should replace * `UniverUIPlugin` when registered. @@ -126,8 +125,7 @@ export class UniverUniUIPlugin extends Plugin { [IMessageService, { useClass: DesktopMessageService, lazy: true }], [ILocalStorageService, { useClass: DesktopLocalStorageService, lazy: true }], [IBeforeCloseService, { useClass: DesktopBeforeCloseService }], - [IEditorService, { useClass: EditorService }], - [IRangeSelectorService, { useClass: RangeSelectorService }], + [ILocalFileService, { useClass: DesktopLocalFileService }], [ICanvasPopupService, { useClass: CanvasPopupService }], [IProgressService, { useClass: ProgressService }], [CanvasFloatDomService], @@ -142,5 +140,13 @@ export class UniverUniUIPlugin extends Plugin { [UniuiFlowController], ], this._config.override); dependencies.forEach((dependency) => this._injector.add(dependency)); + + this._injector.get(IUIController); + } + + override onReady(): void { + this._injector.get(UniuiFlowController); + this._injector.get(UniuiLeftSidebarController); + this._injector.get(UniuiToolbarController); } } diff --git a/packages-experimental/uniui/src/services/flow/flow-manager.service.ts b/packages-experimental/uniui/src/services/flow/flow-manager.service.ts index 23ccb00fe7d..9d01b210ff2 100644 --- a/packages-experimental/uniui/src/services/flow/flow-manager.service.ts +++ b/packages-experimental/uniui/src/services/flow/flow-manager.service.ts @@ -14,10 +14,8 @@ * limitations under the License. */ -import { Disposable, LifecycleStages, OnLifecycle } from '@univerjs/core'; -import type { - ReactFlowInstance, -} from '@xyflow/react'; +import type { ReactFlowInstance } from '@xyflow/react'; +import { Disposable } from '@univerjs/core'; import { BehaviorSubject } from 'rxjs'; @@ -27,7 +25,6 @@ export interface IFlowViewport { y: number; } -@OnLifecycle(LifecycleStages.Ready, FlowManagerService) export class FlowManagerService extends Disposable { private readonly _viewportChanged$ = new BehaviorSubject(null); readonly viewportChanged$ = this._viewportChanged$.asObservable(); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index b3f9e95f336..719e266c152 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -93,9 +93,8 @@ export { ContextService, IContextService } from './services/context/context.serv export { ErrorService, type IError } from './services/error/error.service'; export { IUniverInstanceService } from './services/instance/instance.service'; export { UniverInstanceService } from './services/instance/instance.service'; -export { LifecycleStages, OnLifecycle, runOnLifecycle } from './services/lifecycle/lifecycle'; +export { LifecycleStages } from './services/lifecycle/lifecycle'; export { LifecycleService } from './services/lifecycle/lifecycle.service'; -export { LifecycleInitializerService } from './services/lifecycle/lifecycle.service'; export { ILocalStorageService } from './services/local-storage/local-storage.service'; export { LocaleService } from './services/locale/locale.service'; export { DesktopLogService, ILogService, LogLevel } from './services/log/log.service'; diff --git a/packages/core/src/services/command/command.service.ts b/packages/core/src/services/command/command.service.ts index c7c20462214..120c2c86f93 100644 --- a/packages/core/src/services/command/command.service.ts +++ b/packages/core/src/services/command/command.service.ts @@ -370,13 +370,15 @@ export class CommandService extends Disposable implements ICommandService { return result; } + throw new Error(`[CommandService]: command "${id}" is not registered.`); } catch (error) { + this._logService.error(error); + if (error instanceof CustomCommandExecutionError) { // If need custom logic, can add it here return false as R; } else { - this._logService.error(error); throw error; } } diff --git a/packages/core/src/services/lifecycle/__tests__/lifecycle.service.spec.ts b/packages/core/src/services/lifecycle/__tests__/lifecycle.service.spec.ts index 65c76118c71..ad71241f20d 100644 --- a/packages/core/src/services/lifecycle/__tests__/lifecycle.service.spec.ts +++ b/packages/core/src/services/lifecycle/__tests__/lifecycle.service.spec.ts @@ -19,13 +19,12 @@ import { Injector } from '../../../common/di'; import { DesktopLogService, ILogService } from '../../log/log.service'; import { LifecycleStages } from '../lifecycle'; -import { LifecycleInitializerService, LifecycleService } from '../lifecycle.service'; +import { LifecycleService } from '../lifecycle.service'; function createLifecycleTestBed() { const injector = new Injector(); injector.add([ILogService, { useClass: DesktopLogService }]); - injector.add([LifecycleInitializerService]); injector.add([LifecycleService]); return { @@ -117,34 +116,4 @@ describe('Test LifecycleService', () => { expect(lifecycleStages4).toEqual(steadyStages); expect(lifecycleStages5).toEqual(steadyStages); }); - - // describe('Test automatically instantiate modules on lifecycle stages', () => { - // let initializer: LifecycleInitializerService; - - // it('Should instantiate modules on lifecycle stages', () => { - // injector = createLifecycleTestBed().injector; - // initializer = injector.get(LifecycleInitializerService); - // lifecycleService = injector.get(LifecycleService); - - // initializer.start(); - // initializer.start(); // For just test coverage. - - // const initModules: string[] = []; - - // @OnLifecycle(LifecycleStages.Rendered, TestModule1) - // class TestModule1 { - // constructor() { - // initModules.push('test1'); - // } - // } - // injector.add([TestModule1]); - - // lifecycleService.stage = LifecycleStages.Starting; - // lifecycleService.stage = LifecycleStages.Ready; - // expect(initModules).toEqual([]); - - // lifecycleService.stage = LifecycleStages.Rendered; - // expect(initModules).toEqual(['test1']); - // }); - // }); }); diff --git a/packages/core/src/services/lifecycle/lifecycle.service.ts b/packages/core/src/services/lifecycle/lifecycle.service.ts index 0fc1ff55646..f7a8b28d8fa 100644 --- a/packages/core/src/services/lifecycle/lifecycle.service.ts +++ b/packages/core/src/services/lifecycle/lifecycle.service.ts @@ -16,13 +16,11 @@ import type { Observable } from 'rxjs'; import { BehaviorSubject, merge, of, skip } from 'rxjs'; -import type { DependencyIdentifier } from '../../common/di'; -import { Inject, Injector } from '../../common/di'; import { Disposable } from '../../shared/lifecycle'; -import { ILogService } from '../log/log.service'; import { takeAfter } from '../../shared/rxjs'; -import { LifecycleNameMap, LifecycleStages, LifecycleToModules } from './lifecycle'; +import { ILogService } from '../log/log.service'; +import { LifecycleNameMap, LifecycleStages } from './lifecycle'; /** * This service controls the lifecycle of a Univer instance. Other modules can @@ -76,33 +74,6 @@ export class LifecycleService extends Disposable { } } -/** - * This service is used to initialize modules on a certain lifecycle stage. - * Refer to `runOnLifecycle` and `OnLifecycle` for more details. - * - * @internal - */ -export class LifecycleInitializerService extends Disposable { - private _seenTokens = new Set>(); - - constructor( - @Inject(Injector) private readonly _injector: Injector - ) { - super(); - } - - initModulesOnStage(stage: LifecycleStages): void { - LifecycleToModules.get(stage)?.forEach((m) => { - if (this._injector.has(m) && !this._seenTokens.has(m)) { - this._injector.get(m); - - // swap these two lines and they will be fixed - this._seenTokens.add(m); - } - }); - } -} - export function getLifecycleStagesAndBefore(lifecycleStage: LifecycleStages): Observable { switch (lifecycleStage) { case LifecycleStages.Starting: diff --git a/packages/core/src/services/lifecycle/lifecycle.ts b/packages/core/src/services/lifecycle/lifecycle.ts index a7278bc2e24..ec29f529282 100644 --- a/packages/core/src/services/lifecycle/lifecycle.ts +++ b/packages/core/src/services/lifecycle/lifecycle.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import type { Ctor, DependencyIdentifier } from '../../common/di'; - /** * This enum defines multiple lifecycle stages in Univer SDK. */ @@ -48,59 +46,3 @@ export const LifecycleNameMap = { [LifecycleStages.Rendered]: 'Rendered', [LifecycleStages.Steady]: 'Steady', }; - -export const LifecycleToModules = new Map>>(); - -/** - * Register the decorated class to be automatically instantiated when Univer progresses to the certain lifecycle stage. - * - * @param lifecycleStage The lifecycle stage to instantiate this class. - * @param identifier The dependency identifier of the class. Usually, it is the class itself unless you bind this class - * with another injection identifier. - * - * @deprecated This API does not work as expected and will be removed in future versions. Please call - * `this._injector.get(YourDependency)` in plugins' lifecycle hooks instead. - * - * @example - * // Ignore the `\` below. This is JSDoc's bug. - * \@OnLifecycle(LifecycleStages.Ready, MyService) - * class MyService { - * } - * - * @example - * // Ignore the `\` below. This is JSDoc's bug. - * \@OnLifecycle(LifecycleStages.Rendered, IMyService) - * class MyService implements IMyService { - * } - */ -export function OnLifecycle(lifecycleStage: LifecycleStages, identifier: DependencyIdentifier) { - const decorator = function decorator(_: Ctor) { - runOnLifecycle(lifecycleStage, identifier); - }; - - return decorator; -} - -/** - * Register a dependency to be automatically instantiated when Univer progresses to the certain lifecycle stage. - * - * @param lifecycleStage The lifecycle stage to instantiate this dependency. - * @param identifier The dependencies' identifier. **Beware** that if the dependency (e.g. a class) is bound to an - * identifier, you should register the identifier instead of the dependency itself. - * - * @deprecated This API does not work as expected and will be removed in future versions. Please call - * `this._injector.get(YourDependency)` in plugins' lifecycle hooks instead. - * - * @example - * runOnLifecycle(LifecycleStages.Ready, MyService); - * - * @example - * runOnLifecycle(LifecycleStages.Rendered, IMyService); - */ -export function runOnLifecycle(lifecycleStage: LifecycleStages, identifier: DependencyIdentifier) { - if (!LifecycleToModules.has(lifecycleStage)) { - LifecycleToModules.set(lifecycleStage, []); - } - - LifecycleToModules.get(lifecycleStage)!.push(identifier); -} diff --git a/packages/core/src/services/permission/permission.service.ts b/packages/core/src/services/permission/permission.service.ts index 0e167790362..2ed94cf1012 100644 --- a/packages/core/src/services/permission/permission.service.ts +++ b/packages/core/src/services/permission/permission.service.ts @@ -15,10 +15,10 @@ */ import type { Observable } from 'rxjs'; +import type { IPermissionPoint, IPermissionService } from './type'; import { BehaviorSubject, combineLatest, Subject } from 'rxjs'; import { map } from 'rxjs/operators'; import { Disposable } from '../../shared'; -import type { IPermissionPoint, IPermissionService } from './type'; import { PermissionStatus } from './type'; export class PermissionService extends Disposable implements IPermissionService { diff --git a/packages/core/src/services/permission/type.ts b/packages/core/src/services/permission/type.ts index 140696562d7..1c543e22d93 100644 --- a/packages/core/src/services/permission/type.ts +++ b/packages/core/src/services/permission/type.ts @@ -14,12 +14,11 @@ * limitations under the License. */ -import type { BehaviorSubject, Observable } from 'rxjs'; import type { UnitAction, UnitObject } from '@univerjs/protocol'; -import { createIdentifier } from '../../common/di'; -import { LifecycleStages, runOnLifecycle } from '../lifecycle/lifecycle'; -import type { IRange } from '../../sheets/typedef'; +import type { BehaviorSubject, Observable } from 'rxjs'; import type { Nullable } from '../../shared/types'; +import type { IRange } from '../../sheets/typedef'; +import { createIdentifier } from '../../common/di'; export enum PermissionStatus { INIT = 'init', @@ -66,4 +65,3 @@ export interface IPermissionService { } export const IPermissionService = createIdentifier('univer.permission-service'); -runOnLifecycle(LifecycleStages.Starting, IPermissionService); diff --git a/packages/core/src/services/plugin/plugin.service.ts b/packages/core/src/services/plugin/plugin.service.ts index d5aac0aac15..e5a22eafb81 100644 --- a/packages/core/src/services/plugin/plugin.service.ts +++ b/packages/core/src/services/plugin/plugin.service.ts @@ -14,14 +14,13 @@ * limitations under the License. */ -import { skip } from 'rxjs'; import type { Ctor, IDisposable } from '../../common/di'; +import { skip } from 'rxjs'; import { Inject, Injector } from '../../common/di'; - -import { Disposable } from '../../shared/lifecycle'; import { type UnitType, UniverInstanceType } from '../../common/unit'; +import { Disposable } from '../../shared/lifecycle'; import { LifecycleStages } from '../lifecycle/lifecycle'; -import { getLifecycleStagesAndBefore, LifecycleInitializerService, LifecycleService } from '../lifecycle/lifecycle.service'; +import { getLifecycleStagesAndBefore, LifecycleService } from '../lifecycle/lifecycle.service'; import { ILogService } from '../log/log.service'; import { DependentOnSymbol, Plugin, type PluginCtor, PluginRegistry, PluginStore } from './plugin'; @@ -189,8 +188,7 @@ export class PluginHolder extends Disposable { private _registerPlugin: (plugin: T, config?: ConstructorParameters[0]) => void, @ILogService protected readonly _logService: ILogService, @Inject(Injector) protected readonly _injector: Injector, - @Inject(LifecycleService) protected readonly _lifecycleService: LifecycleService, - @Inject(LifecycleInitializerService) protected readonly _lifecycleInitializerService: LifecycleInitializerService + @Inject(LifecycleService) protected readonly _lifecycleService: LifecycleService ) { super(); @@ -310,8 +308,5 @@ export class PluginHolder extends Disposable { break; } }); - - // Plugins run first, and then we should run the modules. - this._lifecycleInitializerService.initModulesOnStage(stage); } } diff --git a/packages/core/src/services/resource-loader/type.ts b/packages/core/src/services/resource-loader/type.ts index 612906b94e6..e449888f30d 100644 --- a/packages/core/src/services/resource-loader/type.ts +++ b/packages/core/src/services/resource-loader/type.ts @@ -14,12 +14,10 @@ * limitations under the License. */ -import { createIdentifier } from '../../common/di'; -import { LifecycleStages, runOnLifecycle } from '../lifecycle/lifecycle'; import type { IResources } from '../resource-manager/type'; +import { createIdentifier } from '../../common/di'; +export const IResourceLoaderService = createIdentifier('resource-loader-service'); export interface IResourceLoaderService { saveUnit(unitId: string): T & { resources: IResources } | null; } -export const IResourceLoaderService = createIdentifier('resource-loader-service'); -runOnLifecycle(LifecycleStages.Ready, IResourceLoaderService); diff --git a/packages/core/src/services/user-manager/user-manager.service.ts b/packages/core/src/services/user-manager/user-manager.service.ts index de54ec20dc2..01f12884c89 100644 --- a/packages/core/src/services/user-manager/user-manager.service.ts +++ b/packages/core/src/services/user-manager/user-manager.service.ts @@ -15,13 +15,12 @@ */ import { BehaviorSubject, Subject } from 'rxjs'; -import { LifecycleStages, OnLifecycle } from '../lifecycle/lifecycle'; import { createDefaultUser } from './const'; export interface IUser { userID: string; name: string; avatar?: string; }; -@OnLifecycle(LifecycleStages.Starting, UserManagerService) + export class UserManagerService { private _model = new Map(); private _userChange$ = new Subject<{ type: 'add' | 'delete'; user: IUser } | { type: 'clear' }>(); diff --git a/packages/core/src/univer.ts b/packages/core/src/univer.ts index 50c0b4c412d..a95d5098f7f 100644 --- a/packages/core/src/univer.ts +++ b/packages/core/src/univer.ts @@ -14,23 +14,33 @@ * limitations under the License. */ +import type { Dependency } from './common/di'; +import type { UnitModel, UnitType } from './common/unit'; + +import type { LogLevel } from './services/log/log.service'; +import type { Plugin, PluginCtor } from './services/plugin/plugin'; +import type { DependencyOverride } from './services/plugin/plugin-override'; +import type { IStyleSheet } from './services/theme/theme.service'; +import type { ILocales } from './shared'; +import type { IWorkbookData } from './sheets/typedef'; +import type { LocaleType } from './types/enum/locale-type'; +import type { IDocumentData, ISlideData } from './types/interfaces'; import { Injector } from './common/di'; import { UniverInstanceType } from './common/unit'; - import { DocumentDataModel } from './docs/data-model/document-data-model'; import { AuthzIoLocalService } from './services/authz-io/authz-io-local.service'; import { IAuthzIoService } from './services/authz-io/type'; + import { CommandService, ICommandService } from './services/command/command.service'; import { ConfigService, IConfigService } from './services/config/config.service'; import { ContextService, IContextService } from './services/context/context.service'; import { ErrorService } from './services/error/error.service'; import { IUniverInstanceService, UniverInstanceService } from './services/instance/instance.service'; import { LifecycleStages } from './services/lifecycle/lifecycle'; -import { LifecycleInitializerService, LifecycleService } from './services/lifecycle/lifecycle.service'; +import { LifecycleService } from './services/lifecycle/lifecycle.service'; import { LocaleService } from './services/locale/locale.service'; import { DesktopLogService, ILogService } from './services/log/log.service'; import { PermissionService } from './services/permission/permission.service'; - import { IPermissionService } from './services/permission/type'; import { PluginService } from './services/plugin/plugin.service'; import { mergeOverrideWithDependencies } from './services/plugin/plugin-override'; @@ -43,16 +53,6 @@ import { IUndoRedoService, LocalUndoRedoService } from './services/undoredo/undo import { UserManagerService } from './services/user-manager/user-manager.service'; import { Workbook } from './sheets/workbook'; import { SlideDataModel } from './slides/slide-model'; -import type { Dependency } from './common/di'; -import type { UnitModel, UnitType } from './common/unit'; -import type { LogLevel } from './services/log/log.service'; -import type { Plugin, PluginCtor } from './services/plugin/plugin'; -import type { DependencyOverride } from './services/plugin/plugin-override'; -import type { IStyleSheet } from './services/theme/theme.service'; -import type { ILocales } from './shared'; -import type { IWorkbookData } from './sheets/typedef'; -import type { LocaleType } from './types/enum/locale-type'; -import type { IDocumentData, ISlideData } from './types/interfaces'; export interface IUniverConfig { theme: IStyleSheet; @@ -180,7 +180,6 @@ function createUniverInjector(parentInjector?: Injector, override?: DependencyOv [LocaleService], [ThemeService], [LifecycleService], - [LifecycleInitializerService], [PluginService], [UserManagerService], @@ -197,5 +196,13 @@ function createUniverInjector(parentInjector?: Injector, override?: DependencyOv [IAuthzIoService, { useClass: AuthzIoLocalService, lazy: true }], ], override); - return parentInjector ? parentInjector.createChild(dependencies) : new Injector(dependencies); + const injector = parentInjector ? parentInjector.createChild(dependencies) : new Injector(dependencies); + inintialzeStaringModules(injector); + + return injector; +} + +function inintialzeStaringModules(injector: Injector): void { + injector.get(UserManagerService); + injector.get(IResourceLoaderService); } diff --git a/packages/data-validation/src/controllers/dv-resource.controller.ts b/packages/data-validation/src/controllers/dv-resource.controller.ts index eac8d95a6fc..b41e7c774e3 100644 --- a/packages/data-validation/src/controllers/dv-resource.controller.ts +++ b/packages/data-validation/src/controllers/dv-resource.controller.ts @@ -14,15 +14,14 @@ * limitations under the License. */ -import { Disposable, Inject, IResourceManagerService, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; import type { ISheetDataValidationRule } from '@univerjs/core'; +import { Disposable, Inject, IResourceManagerService, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { DataValidationModel } from '../models/data-validation-model'; type DataValidationJSON = Record; const DATA_VALIDATION_PLUGIN_NAME = 'SHEET_DATA_VALIDATION_PLUGIN'; -@OnLifecycle(LifecycleStages.Ready, DataValidationResourceController) export class DataValidationResourceController extends Disposable { constructor( @IResourceManagerService private readonly _resourceManagerService: IResourceManagerService, diff --git a/packages/data-validation/src/plugin.ts b/packages/data-validation/src/plugin.ts index 8421eda6bc6..e40f37f2855 100644 --- a/packages/data-validation/src/plugin.ts +++ b/packages/data-validation/src/plugin.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import { ICommandService, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; +import type { IUniverDataValidationConfig } from './controllers/config.schema'; +import { ICommandService, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { AddDataValidationCommand, RemoveAllDataValidationCommand, RemoveDataValidationCommand, UpdateDataValidationOptionsCommand, UpdateDataValidationSettingCommand } from './commands/commands/data-validation.command'; import { AddDataValidationMutation, RemoveDataValidationMutation, UpdateDataValidationMutation } from './commands/mutations/data-validation.mutation'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { DataValidationResourceController } from './controllers/dv-resource.controller'; import { DataValidationModel } from './models/data-validation-model'; import { DataValidatorRegistryService } from './services/data-validator-registry.service'; -import type { IUniverDataValidationConfig } from './controllers/config.schema'; const PLUGIN_NAME = 'UNIVER_DATA_VALIDATION_PLUGIN'; @@ -66,4 +66,8 @@ export class UniverDataValidationPlugin extends Plugin { this._commandService.registerCommand(command); }); } + + override onReady(): void { + this._injector.get(DataValidationResourceController); + } } diff --git a/packages/docs-drawing-ui/src/controllers/doc-drawing-notification.controller.ts b/packages/docs-drawing-ui/src/controllers/doc-drawing-notification.controller.ts index cd7899a9f58..3af604ea6ba 100644 --- a/packages/docs-drawing-ui/src/controllers/doc-drawing-notification.controller.ts +++ b/packages/docs-drawing-ui/src/controllers/doc-drawing-notification.controller.ts @@ -17,21 +17,19 @@ /* eslint-disable ts/no-explicit-any */ import type { ICommandInfo, JSONXActions, Nullable } from '@univerjs/core'; +import type { IRichTextEditingMutationParams } from '@univerjs/docs'; +import type { IDocDrawing } from '@univerjs/docs-drawing'; +import type { IDrawingJsonUndo1, IDrawingOrderMapParam, IDrawingSearch } from '@univerjs/drawing'; import { Disposable, ICommandService, IUniverInstanceService, JSONX, - LifecycleStages, - OnLifecycle, RedoCommand, UndoCommand, } from '@univerjs/core'; -import type { IRichTextEditingMutationParams } from '@univerjs/docs'; import { RichTextEditingMutation } from '@univerjs/docs'; -import type { IDocDrawing } from '@univerjs/docs-drawing'; import { IDocDrawingService } from '@univerjs/docs-drawing'; -import type { IDrawingJsonUndo1, IDrawingOrderMapParam, IDrawingSearch } from '@univerjs/drawing'; import { IDrawingManagerService } from '@univerjs/drawing'; import { IRenderManagerService } from '@univerjs/engine-render'; @@ -117,7 +115,6 @@ function getReOrderedDrawings(actions: JSONXActions): number[] { return drawingIndexes; } -@OnLifecycle(LifecycleStages.Ready, DocDrawingAddRemoveController) export class DocDrawingAddRemoveController extends Disposable { constructor( @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, diff --git a/packages/docs-drawing-ui/src/controllers/doc-drawing-transformer-update.controller.ts b/packages/docs-drawing-ui/src/controllers/doc-drawing-transformer-update.controller.ts index ae4276f1df6..9605cf72ef4 100644 --- a/packages/docs-drawing-ui/src/controllers/doc-drawing-transformer-update.controller.ts +++ b/packages/docs-drawing-ui/src/controllers/doc-drawing-transformer-update.controller.ts @@ -14,20 +14,20 @@ * limitations under the License. */ +import type { IDocDrawingBase, IDocDrawingPosition, Nullable } from '@univerjs/core'; +import type { BaseObject, Documents, IDocumentSkeletonGlyph, IDocumentSkeletonPage, Image, INodeSearch, IPoint, Viewport } from '@univerjs/engine-render'; +import type { IDrawingDocTransform } from '../commands/commands/update-doc-drawing.command'; import { BooleanNumber, COLORS, - Disposable, ICommandService, IUniverInstanceService, LifecycleStages, ObjectRelativeFromH, ObjectRelativeFromV, - OnLifecycle, PositionedObjectLayoutType, throttle, toDisposable, Tools, + Disposable, ICommandService, IUniverInstanceService, ObjectRelativeFromH, ObjectRelativeFromV, + PositionedObjectLayoutType, throttle, toDisposable, Tools, } from '@univerjs/core'; import { DocSkeletonManagerService } from '@univerjs/docs'; import { DocSelectionRenderService, getAnchorBounding, getDocObject, getOneTextSelectionRange, NodePositionConvertToCursor, TEXT_RANGE_LAYER_INDEX } from '@univerjs/docs-ui'; import { IDrawingManagerService } from '@univerjs/drawing'; import { DocumentSkeletonPageType, getColor, IRenderManagerService, Liquid, PageLayoutType, Rect, Vector2 } from '@univerjs/engine-render'; -import type { IDocDrawingBase, IDocDrawingPosition, Nullable } from '@univerjs/core'; -import type { BaseObject, Documents, IDocumentSkeletonGlyph, IDocumentSkeletonPage, Image, INodeSearch, IPoint, Viewport } from '@univerjs/engine-render'; import { IMoveInlineDrawingCommand, ITransformNonInlineDrawingCommand, UpdateDrawingDocTransformCommand } from '../commands/commands/update-doc-drawing.command'; -import type { IDrawingDocTransform } from '../commands/commands/update-doc-drawing.command'; const INLINE_DRAWING_ANCHOR_KEY_PREFIX = '__InlineDrawingAnchor__'; @@ -55,8 +55,6 @@ function isInTableCell(nodePosition: INodeSearch) { } // Listen doc drawing transformer change, and update drawing data. - -@OnLifecycle(LifecycleStages.Rendered, DocDrawingTransformerController) export class DocDrawingTransformerController extends Disposable { private _liquid = new Liquid(); private _listenerOnImageMap = new Set(); diff --git a/packages/docs-drawing-ui/src/controllers/doc-drawing.controller.ts b/packages/docs-drawing-ui/src/controllers/doc-drawing.controller.ts index 6133d13303a..3e19932101b 100644 --- a/packages/docs-drawing-ui/src/controllers/doc-drawing.controller.ts +++ b/packages/docs-drawing-ui/src/controllers/doc-drawing.controller.ts @@ -14,30 +14,29 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; -import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; - +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { AddImageSingle } from '@univerjs/icons'; -import { ImageUploadIcon } from '../views/menu/image.menu'; -import { COMPONENT_DOC_DRAWING_PANEL } from '../views/doc-image-panel/component-name'; -import { DocDrawingPanel } from '../views/doc-image-panel/DocDrawingPanel'; -import { ClearDocDrawingTransformerOperation } from '../commands/operations/clear-drawing-transformer.operation'; -import { EditDocDrawingOperation } from '../commands/operations/edit-doc-drawing.operation'; -import { SidebarDocDrawingOperation } from '../commands/operations/open-drawing-panel.operation'; -import { MoveDocDrawingsCommand } from '../commands/commands/move-drawings.command'; +import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; import { DeleteDocDrawingsCommand } from '../commands/commands/delete-doc-drawing.command'; -import { SetDocDrawingArrangeCommand } from '../commands/commands/set-drawing-arrange.command'; -import { RemoveDocDrawingCommand } from '../commands/commands/remove-doc-drawing.command'; -import { UngroupDocDrawingCommand } from '../commands/commands/ungroup-doc-drawing.command'; import { GroupDocDrawingCommand } from '../commands/commands/group-doc-drawing.command'; import { InsertDocDrawingCommand } from '../commands/commands/insert-doc-drawing.command'; -import { IMoveInlineDrawingCommand, ITransformNonInlineDrawingCommand, UpdateDocDrawingDistanceCommand, UpdateDocDrawingWrappingStyleCommand, UpdateDocDrawingWrapTextCommand, UpdateDrawingDocTransformCommand } from '../commands/commands/update-doc-drawing.command'; + import { InsertDocImageCommand } from '../commands/commands/insert-image.command'; -import { DeleteDrawingsShortcutItem, MoveDrawingDownShortcutItem, MoveDrawingLeftShortcutItem, MoveDrawingRightShortcutItem, MoveDrawingUpShortcutItem } from './shortcuts/drawing.shortcut'; +import { MoveDocDrawingsCommand } from '../commands/commands/move-drawings.command'; +import { RemoveDocDrawingCommand } from '../commands/commands/remove-doc-drawing.command'; +import { SetDocDrawingArrangeCommand } from '../commands/commands/set-drawing-arrange.command'; +import { UngroupDocDrawingCommand } from '../commands/commands/ungroup-doc-drawing.command'; +import { IMoveInlineDrawingCommand, ITransformNonInlineDrawingCommand, UpdateDocDrawingDistanceCommand, UpdateDocDrawingWrappingStyleCommand, UpdateDocDrawingWrapTextCommand, UpdateDrawingDocTransformCommand } from '../commands/commands/update-doc-drawing.command'; +import { ClearDocDrawingTransformerOperation } from '../commands/operations/clear-drawing-transformer.operation'; +import { EditDocDrawingOperation } from '../commands/operations/edit-doc-drawing.operation'; +import { SidebarDocDrawingOperation } from '../commands/operations/open-drawing-panel.operation'; +import { COMPONENT_DOC_DRAWING_PANEL } from '../views/doc-image-panel/component-name'; +import { DocDrawingPanel } from '../views/doc-image-panel/DocDrawingPanel'; +import { ImageUploadIcon } from '../views/menu/image.menu'; import { menuSchema } from './menu.schema'; +import { DeleteDrawingsShortcutItem, MoveDrawingDownShortcutItem, MoveDrawingLeftShortcutItem, MoveDrawingRightShortcutItem, MoveDrawingUpShortcutItem } from './shortcuts/drawing.shortcut'; -@OnLifecycle(LifecycleStages.Ready, DocDrawingUIController) export class DocDrawingUIController extends Disposable { constructor( @Inject(ComponentManager) private readonly _componentManager: ComponentManager, diff --git a/packages/docs-drawing-ui/src/controllers/drawing-popup-menu.controller.ts b/packages/docs-drawing-ui/src/controllers/drawing-popup-menu.controller.ts index 65ffa69e7f6..fd75aed4693 100644 --- a/packages/docs-drawing-ui/src/controllers/drawing-popup-menu.controller.ts +++ b/packages/docs-drawing-ui/src/controllers/drawing-popup-menu.controller.ts @@ -15,17 +15,16 @@ */ import type { DocumentDataModel, IDisposable, Nullable } from '@univerjs/core'; -import { FOCUSING_COMMON_DRAWINGS, IContextService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, RxDisposable, toDisposable, UniverInstanceType } from '@univerjs/core'; import type { BaseObject, Scene } from '@univerjs/engine-render'; -import { IRenderManagerService } from '@univerjs/engine-render'; -import { COMPONENT_IMAGE_POPUP_MENU, ImageCropperObject, ImageResetSizeOperation, OpenImageCropOperation } from '@univerjs/drawing-ui'; -import { takeUntil } from 'rxjs'; +import { FOCUSING_COMMON_DRAWINGS, IContextService, Inject, IUniverInstanceService, RxDisposable, toDisposable, UniverInstanceType } from '@univerjs/core'; import { DocCanvasPopManagerService } from '@univerjs/docs-ui'; import { IDrawingManagerService } from '@univerjs/drawing'; +import { COMPONENT_IMAGE_POPUP_MENU, ImageCropperObject, ImageResetSizeOperation, OpenImageCropOperation } from '@univerjs/drawing-ui'; +import { IRenderManagerService } from '@univerjs/engine-render'; +import { takeUntil } from 'rxjs'; import { RemoveDocDrawingCommand } from '../commands/commands/remove-doc-drawing.command'; import { EditDocDrawingOperation } from '../commands/operations/edit-doc-drawing.operation'; -@OnLifecycle(LifecycleStages.Rendered, DocDrawingPopupMenuController) export class DocDrawingPopupMenuController extends RxDisposable { private _initImagePopupMenu = new Set(); diff --git a/packages/docs-drawing-ui/src/controllers/render-controllers/doc-drawing-update.render-controller.ts b/packages/docs-drawing-ui/src/controllers/render-controllers/doc-drawing-update.render-controller.ts index 38dedeaccb0..33c255c03c0 100644 --- a/packages/docs-drawing-ui/src/controllers/render-controllers/doc-drawing-update.render-controller.ts +++ b/packages/docs-drawing-ui/src/controllers/render-controllers/doc-drawing-update.render-controller.ts @@ -14,6 +14,11 @@ * limitations under the License. */ +import type { DocumentDataModel, ICommandInfo, IDocDrawingPosition, Nullable } from '@univerjs/core'; +import type { IDocDrawing } from '@univerjs/docs-drawing'; +import type { IImageIoServiceParam } from '@univerjs/drawing'; +import type { Documents, Image, IRenderContext, IRenderModule } from '@univerjs/engine-render'; +import type { IInsertDrawingCommandParams } from '../../commands/commands/interfaces'; import { BooleanNumber, Disposable, FOCUSING_COMMON_DRAWINGS, ICommandService, IContextService, Inject, LocaleService, ObjectRelativeFromH, ObjectRelativeFromV, PositionedObjectLayoutType, WrapTextType } from '@univerjs/core'; import { MessageType } from '@univerjs/design'; import { DocSelectionManagerService, DocSkeletonManagerService, RichTextEditingMutation } from '@univerjs/docs'; @@ -21,18 +26,13 @@ import { IDocDrawingService } from '@univerjs/docs-drawing'; import { docDrawingPositionToTransform, DocSelectionRenderService } 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, DrawingTypeEnum, getDrawingShapeKeyByDrawingSearch, getImageSize, IDrawingManagerService, IImageIoService, ImageUploadStatusType } from '@univerjs/drawing'; import { DocumentEditArea, IRenderManagerService } from '@univerjs/engine-render'; -import { ILocalFileService, IMessageService } from '@univerjs/ui'; -import type { DocumentDataModel, ICommandInfo, IDocDrawingPosition, Nullable } from '@univerjs/core'; -import type { IDocDrawing } from '@univerjs/docs-drawing'; -import type { IImageIoServiceParam } from '@univerjs/drawing'; -import type { Documents, Image, IRenderContext, IRenderModule } from '@univerjs/engine-render'; +import { ILocalFileService, IMessageService } from '@univerjs/ui'; import { GroupDocDrawingCommand } from '../../commands/commands/group-doc-drawing.command'; import { InsertDocDrawingCommand } from '../../commands/commands/insert-doc-drawing.command'; import { type ISetDrawingArrangeCommandParams, SetDocDrawingArrangeCommand } from '../../commands/commands/set-drawing-arrange.command'; import { UngroupDocDrawingCommand } from '../../commands/commands/ungroup-doc-drawing.command'; import { DocRefreshDrawingsService } from '../../services/doc-refresh-drawings.service'; -import type { IInsertDrawingCommandParams } from '../../commands/commands/interfaces'; export class DocDrawingUpdateRenderController extends Disposable implements IRenderModule { constructor( diff --git a/packages/docs-drawing-ui/src/plugin.ts b/packages/docs-drawing-ui/src/plugin.ts index 60de399b9c5..a024d34fa83 100644 --- a/packages/docs-drawing-ui/src/plugin.ts +++ b/packages/docs-drawing-ui/src/plugin.ts @@ -14,25 +14,26 @@ * limitations under the License. */ -import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; -import { UniverDrawingUIPlugin } from '@univerjs/drawing-ui'; -import { UniverDrawingPlugin } from '@univerjs/drawing'; +import type { IUniverDocsDrawingUIConfig } from './controllers/config.schema'; +import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { UniverDocsDrawingPlugin } from '@univerjs/docs-drawing'; +import { UniverDrawingPlugin } from '@univerjs/drawing'; +import { UniverDrawingUIPlugin } from '@univerjs/drawing-ui'; import { IRenderManagerService } from '@univerjs/engine-render'; -import { DocDrawingPopupMenuController } from './controllers/drawing-popup-menu.controller'; +import { UniverUIPlugin } from '@univerjs/ui'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { DocDrawingUIController } from './controllers/doc-drawing.controller'; -import { DocDrawingUpdateRenderController } from './controllers/render-controllers/doc-drawing-update.render-controller'; -import { DocDrawingTransformUpdateController } from './controllers/render-controllers/doc-drawing-transform-update.controller'; import { DocDrawingAddRemoveController } from './controllers/doc-drawing-notification.controller'; import { DocDrawingTransformerController } from './controllers/doc-drawing-transformer-update.controller'; +import { DocDrawingPopupMenuController } from './controllers/drawing-popup-menu.controller'; +import { DocDrawingTransformUpdateController } from './controllers/render-controllers/doc-drawing-transform-update.controller'; +import { DocDrawingUpdateRenderController } from './controllers/render-controllers/doc-drawing-update.render-controller'; import { DocRefreshDrawingsService } from './services/doc-refresh-drawings.service'; -import type { IUniverDocsDrawingUIConfig } from './controllers/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; const PLUGIN_NAME = 'DOC_DRAWING_UI_PLUGIN'; -@DependentOn(UniverDrawingUIPlugin, UniverDrawingPlugin, UniverDocsDrawingPlugin) +@DependentOn(UniverDrawingUIPlugin, UniverDrawingPlugin, UniverDocsDrawingPlugin, UniverUIPlugin) export class UniverDocsDrawingUIPlugin extends Plugin { static override type = UniverInstanceType.UNIVER_DOC; static override pluginName = PLUGIN_NAME; @@ -67,5 +68,12 @@ export class UniverDocsDrawingUIPlugin extends Plugin { [DocDrawingUpdateRenderController], [DocDrawingTransformUpdateController], ] as Dependency[]).forEach((m) => this._renderManagerSrv.registerRenderModule(UniverInstanceType.UNIVER_DOC, m)); + + this._injector.get(DocDrawingAddRemoveController); + this._injector.get(DocDrawingUIController); + } + + override onRendered(): void { + this._injector.get(DocDrawingPopupMenuController); } } diff --git a/packages/docs-drawing/src/controllers/doc-drawing.controller.ts b/packages/docs-drawing/src/controllers/doc-drawing.controller.ts index 224a1776abb..0b910a578fd 100644 --- a/packages/docs-drawing/src/controllers/doc-drawing.controller.ts +++ b/packages/docs-drawing/src/controllers/doc-drawing.controller.ts @@ -14,25 +14,15 @@ * limitations under the License. */ -import { Disposable, ICommandService, IResourceManagerService, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; -import { IDrawingManagerService } from '@univerjs/drawing'; import type { DocumentDataModel, IDocumentData } from '@univerjs/core'; import type { IDrawingMapItem, IDrawingMapItemData } from '@univerjs/drawing'; +import { Disposable, IResourceManagerService, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; +import { IDrawingManagerService } from '@univerjs/drawing'; import { type IDocDrawing, IDocDrawingService } from '../services/doc-drawing.service'; export const DOCS_DRAWING_PLUGIN = 'DOC_DRAWING_PLUGIN'; export interface IDocDrawingModel { drawings?: IDocumentData['drawings']; drawingsOrder?: IDocumentData['drawingsOrder'] }; -@OnLifecycle(LifecycleStages.Starting, DocDrawingLoadController) -export class DocDrawingLoadController extends Disposable { - constructor( - @ICommandService private readonly _commandService: ICommandService - ) { - super(); - } -} - -@OnLifecycle(LifecycleStages.Starting, DocDrawingController) export class DocDrawingController extends Disposable { constructor( @IDocDrawingService private readonly _docDrawingService: IDocDrawingService, diff --git a/packages/docs-drawing/src/plugin.ts b/packages/docs-drawing/src/plugin.ts index cd445296368..0b75f743e5a 100644 --- a/packages/docs-drawing/src/plugin.ts +++ b/packages/docs-drawing/src/plugin.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; -import { DocDrawingController, DocDrawingLoadController, DOCS_DRAWING_PLUGIN } from './controllers/doc-drawing.controller'; -import { DocDrawingService, IDocDrawingService } from './services/doc-drawing.service'; import type { IUniverDocsDrawingConfig } from './controllers/config.schema'; +import { IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; +import { DocDrawingController, DOCS_DRAWING_PLUGIN } from './controllers/doc-drawing.controller'; +import { DocDrawingService, IDocDrawingService } from './services/doc-drawing.service'; export class UniverDocsDrawingPlugin extends Plugin { static override pluginName = DOCS_DRAWING_PLUGIN; @@ -39,12 +39,13 @@ export class UniverDocsDrawingPlugin extends Plugin { override onStarting(): void { ([ - [DocDrawingLoadController], [DocDrawingController], [DocDrawingService], [IDocDrawingService, { useClass: DocDrawingService }], ] as Dependency[ ]).forEach((dependency) => this._injector.add(dependency)); + + this._injector.get(DocDrawingController); } } diff --git a/packages/docs-hyper-link-ui/src/controllers/doc-hyper-link-selection.controller.ts b/packages/docs-hyper-link-ui/src/controllers/doc-hyper-link-selection.controller.ts index 426843130a0..c0e02abdd2f 100644 --- a/packages/docs-hyper-link-ui/src/controllers/doc-hyper-link-selection.controller.ts +++ b/packages/docs-hyper-link-ui/src/controllers/doc-hyper-link-selection.controller.ts @@ -15,12 +15,11 @@ */ import type { DocumentDataModel } from '@univerjs/core'; -import { Disposable, ICommandService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; import type { ISetTextSelectionsOperationParams } from '@univerjs/docs'; +import { Disposable, ICommandService, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { SetTextSelectionsOperation } from '@univerjs/docs'; import { DocHyperLinkPopupService } from '../services/hyper-link-popup.service'; -@OnLifecycle(LifecycleStages.Ready, DocHyperLinkSelectionController) export class DocHyperLinkSelectionController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/docs-hyper-link-ui/src/controllers/ui.controller.ts b/packages/docs-hyper-link-ui/src/controllers/ui.controller.ts index ca2e182ff62..62d69fccd1b 100644 --- a/packages/docs-hyper-link-ui/src/controllers/ui.controller.ts +++ b/packages/docs-hyper-link-ui/src/controllers/ui.controller.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; import type { MenuConfig } from '@univerjs/ui'; -import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { LinkSingle } from '@univerjs/icons'; -import { DocHyperLinkEdit } from '../views/hyper-link-edit'; +import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; import { AddDocHyperLinkCommand } from '../commands/commands/add-link.command'; -import { UpdateDocHyperLinkCommand } from '../commands/commands/update-link.command'; import { DeleteDocHyperLinkCommand } from '../commands/commands/delete-link.command'; +import { UpdateDocHyperLinkCommand } from '../commands/commands/update-link.command'; import { ClickDocHyperLinkOperation, ShowDocHyperLinkEditPopupOperation, ToggleDocHyperLinkInfoPopupOperation } from '../commands/operations/popup.operation'; +import { DocHyperLinkEdit } from '../views/hyper-link-edit'; import { DocLinkPopup } from '../views/hyper-link-popup'; import { addLinkShortcut, DOC_LINK_ICON } from './menu'; import { menuSchema } from './menu.schema'; @@ -31,13 +31,11 @@ export interface IDocHyperLinkUIConfig { menu: MenuConfig; } -@OnLifecycle(LifecycleStages.Starting, DocHyperLinkUIController) export class DocHyperLinkUIController extends Disposable { constructor( @Inject(ComponentManager) private readonly _componentManager: ComponentManager, @ICommandService private readonly _commandService: ICommandService, @IMenuManagerService private readonly _menuManagerService: IMenuManagerService, - @Inject(Injector) private readonly _injector: Injector, @IShortcutService private readonly _shortcutService: IShortcutService ) { super(); diff --git a/packages/docs-hyper-link-ui/src/plugin.ts b/packages/docs-hyper-link-ui/src/plugin.ts index 73c9c43019e..9ec442f4c38 100644 --- a/packages/docs-hyper-link-ui/src/plugin.ts +++ b/packages/docs-hyper-link-ui/src/plugin.ts @@ -14,10 +14,11 @@ * limitations under the License. */ +import type { Dependency } from '@univerjs/core'; +import type { IUniverDocsHyperLinkUIConfig } from './controllers/config.schema'; import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { UniverDocsHyperLinkPlugin } from '@univerjs/docs-hyper-link'; import { IRenderManagerService } from '@univerjs/engine-render'; -import type { Dependency } from '@univerjs/core'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { DocHyperLinkSelectionController } from './controllers/doc-hyper-link-selection.controller'; import { DocHyperLinkEventRenderController } from './controllers/render-controllers/hyper-link-event.render-controller'; @@ -25,7 +26,6 @@ import { DocHyperLinkRenderController } from './controllers/render-controllers/r import { DocHyperLinkUIController } from './controllers/ui.controller'; import { DocHyperLinkPopupService } from './services/hyper-link-popup.service'; import { DOC_HYPER_LINK_UI_PLUGIN } from './types/const'; -import type { IUniverDocsHyperLinkUIConfig } from './controllers/config.schema'; @DependentOn(UniverDocsHyperLinkPlugin) export class UniverDocsHyperLinkUIPlugin extends Plugin { @@ -54,10 +54,15 @@ export class UniverDocsHyperLinkUIPlugin extends Plugin { [DocHyperLinkUIController], [DocHyperLinkSelectionController], ]; - deps.forEach((dep) => { this._injector.add(dep); }); + + this._injector.get(DocHyperLinkUIController); + } + + override onReady(): void { + this._injector.get(DocHyperLinkSelectionController); } override onRendered(): void { diff --git a/packages/docs-hyper-link/src/controllers/resource.controller.ts b/packages/docs-hyper-link/src/controllers/resource.controller.ts index 6cd0c362b68..67094736fb3 100644 --- a/packages/docs-hyper-link/src/controllers/resource.controller.ts +++ b/packages/docs-hyper-link/src/controllers/resource.controller.ts @@ -15,7 +15,7 @@ */ import type { DocumentDataModel, ICustomRange } from '@univerjs/core'; -import { CustomRangeType, Disposable, Inject, IResourceManagerService, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import { CustomRangeType, Disposable, Inject, IResourceManagerService, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; export const DOC_HYPER_LINK_PLUGIN = 'DOC_HYPER_LINK_PLUGIN'; @@ -23,7 +23,6 @@ interface IDocHyperLinkJSON { links: { id: string; payload: string }[]; } -@OnLifecycle(LifecycleStages.Starting, DocHyperLinkResourceController) export class DocHyperLinkResourceController extends Disposable { constructor( @Inject(IResourceManagerService) private readonly _resourceManagerService: IResourceManagerService, diff --git a/packages/docs-hyper-link/src/plugin.ts b/packages/docs-hyper-link/src/plugin.ts index 1c5d957947a..5428c85daf3 100644 --- a/packages/docs-hyper-link/src/plugin.ts +++ b/packages/docs-hyper-link/src/plugin.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { ICommandService, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; +import type { IUniverDocsHyperLinkConfig } from './controllers/config.schema'; +import { ICommandService, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { AddHyperLinkMuatation, DeleteHyperLinkMuatation, UpdateHyperLinkMuatation } from './commands/mutations/hyper-link.mutation'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { DOC_HYPER_LINK_PLUGIN, DocHyperLinkResourceController } from './controllers/resource.controller'; -import type { IUniverDocsHyperLinkConfig } from './controllers/config.schema'; export class UniverDocsHyperLinkPlugin extends Plugin { static override pluginName = DOC_HYPER_LINK_PLUGIN; @@ -39,16 +39,13 @@ export class UniverDocsHyperLinkPlugin extends Plugin { } override onStarting(): void { - const deps: Dependency[] = [ - [DocHyperLinkResourceController], - ]; - - deps.forEach((dep) => { - this._injector.add(dep); - }); + const deps: Dependency[] = [[DocHyperLinkResourceController]]; + deps.forEach((dep) => this._injector.add(dep)); [AddHyperLinkMuatation, DeleteHyperLinkMuatation, UpdateHyperLinkMuatation].forEach((mutation) => { this.disposeWithMe(this._commandService.registerCommand(mutation)); }); + + this._injector.get(DocHyperLinkResourceController); } } diff --git a/packages/docs-mention-ui/src/controllers/doc-mention-trigger.controller.ts b/packages/docs-mention-ui/src/controllers/doc-mention-trigger.controller.ts index e0cb6fbb16e..0b681f593aa 100644 --- a/packages/docs-mention-ui/src/controllers/doc-mention-trigger.controller.ts +++ b/packages/docs-mention-ui/src/controllers/doc-mention-trigger.controller.ts @@ -14,15 +14,14 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle, Tools } from '@univerjs/core'; +import type { IInsertCommandParams } from '@univerjs/docs-ui'; +import { Disposable, ICommandService, Inject, Tools } from '@univerjs/core'; import { DocSelectionManagerService } from '@univerjs/docs'; import { DeleteLeftCommand, InsertCommand, MoveCursorOperation } from '@univerjs/docs-ui'; -import type { IInsertCommandParams } from '@univerjs/docs-ui'; import { CloseMentionEditPopupOperation, ShowMentionEditPopupOperation } from '../commands/operations/mention-popup.operation'; import { DocMentionService } from '../services/doc-mention.service'; import { DocMentionPopupService } from '../services/doc-mention-popup.service'; -@OnLifecycle(LifecycleStages.Rendered, DocMentionTriggerController) export class DocMentionTriggerController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/docs-mention-ui/src/controllers/doc-mention-ui.controller.ts b/packages/docs-mention-ui/src/controllers/doc-mention-ui.controller.ts index ddeea690c8a..4b694b69356 100644 --- a/packages/docs-mention-ui/src/controllers/doc-mention-ui.controller.ts +++ b/packages/docs-mention-ui/src/controllers/doc-mention-ui.controller.ts @@ -14,13 +14,12 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { ComponentManager } from '@univerjs/ui'; +import { AddDocMentionCommand, DeleteDocMentionCommand } from '../commands/commands/doc-mention.command'; import { CloseMentionEditPopupOperation, CloseMentionInfoPopupOperation, ShowMentionEditPopupOperation, ShowMentionInfoPopupOperation } from '../commands/operations/mention-popup.operation'; import { MentionEditPopup } from '../views/mention-edit-popup'; -import { AddDocMentionCommand, DeleteDocMentionCommand } from '../commands/commands/doc-mention.command'; -@OnLifecycle(LifecycleStages.Starting, DocMentionUIController) export class DocMentionUIController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/docs-mention-ui/src/plugin.ts b/packages/docs-mention-ui/src/plugin.ts index 2f7fb144a9a..9858b096478 100644 --- a/packages/docs-mention-ui/src/plugin.ts +++ b/packages/docs-mention-ui/src/plugin.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import { IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; -import { DOC_MENTION_UI_PLUGIN } from './types/const/const'; -import { DocMentionPopupService } from './services/doc-mention-popup.service'; -import { DocMentionUIController } from './controllers/doc-mention-ui.controller'; -import { DocMentionTriggerController } from './controllers/doc-mention-trigger.controller'; -import { DocMentionService } from './services/doc-mention.service'; import type { IUniverDocsMentionUIConfig } from './controllers/config.schema'; +import { IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; +import { DocMentionTriggerController } from './controllers/doc-mention-trigger.controller'; +import { DocMentionUIController } from './controllers/doc-mention-ui.controller'; +import { DocMentionService } from './services/doc-mention.service'; +import { DocMentionPopupService } from './services/doc-mention-popup.service'; +import { DOC_MENTION_UI_PLUGIN } from './types/const/const'; export class UniverDocsMentionUIPlugin extends Plugin { static override pluginName = DOC_MENTION_UI_PLUGIN; @@ -44,15 +44,20 @@ export class UniverDocsMentionUIPlugin extends Plugin { } override onStarting(): void { - const deps: Dependency[] = [ + ([ [DocMentionService], [DocMentionPopupService], [DocMentionUIController], [DocMentionTriggerController], - ]; - - deps.forEach((dep) => { + ] as Dependency[]).forEach((dep) => { this._injector.add(dep); }); + + this._injector.get(DocMentionUIController); + } + + override onRendered(): void { + this._injector.get(DocMentionTriggerController); + this._injector.get(DocMentionPopupService); } } diff --git a/packages/docs-mention-ui/src/services/doc-mention-popup.service.ts b/packages/docs-mention-ui/src/services/doc-mention-popup.service.ts index ceb7fb21b6c..9e3c5024d85 100644 --- a/packages/docs-mention-ui/src/services/doc-mention-popup.service.ts +++ b/packages/docs-mention-ui/src/services/doc-mention-popup.service.ts @@ -15,13 +15,12 @@ */ import type { IDisposable, Nullable } from '@univerjs/core'; -import { Disposable, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, Inject } from '@univerjs/core'; import { DocCanvasPopManagerService } from '@univerjs/docs-ui'; import { BehaviorSubject } from 'rxjs'; import { MentionEditPopup } from '../views/mention-edit-popup'; import { DocMentionService } from './doc-mention.service'; -@OnLifecycle(LifecycleStages.Rendered, DocMentionPopupService) export class DocMentionPopupService extends Disposable { private readonly _infoPopup$ = new BehaviorSubject(undefined); readonly infoPopup$ = this._infoPopup$.asObservable(); diff --git a/packages/docs-thread-comment-ui/src/controllers/doc-thread-comment-selection.controller.ts b/packages/docs-thread-comment-ui/src/controllers/doc-thread-comment-selection.controller.ts index 7688d7ba383..496f1fc7b8c 100644 --- a/packages/docs-thread-comment-ui/src/controllers/doc-thread-comment-selection.controller.ts +++ b/packages/docs-thread-comment-ui/src/controllers/doc-thread-comment-selection.controller.ts @@ -14,20 +14,19 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import type { DocumentDataModel, ITextRange } from '@univerjs/core'; +import type { ISetTextSelectionsOperationParams } from '@univerjs/docs'; +import type { ITextRangeWithStyle } from '@univerjs/engine-render'; +import { Disposable, ICommandService, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { SetTextSelectionsOperation } from '@univerjs/docs'; import { DocBackScrollRenderController } from '@univerjs/docs-ui'; import { IRenderManagerService } from '@univerjs/engine-render'; import { ThreadCommentModel } from '@univerjs/thread-comment'; import { SetActiveCommentOperation, ThreadCommentPanelService } from '@univerjs/thread-comment-ui'; -import type { DocumentDataModel, ITextRange } from '@univerjs/core'; -import type { ISetTextSelectionsOperationParams } from '@univerjs/docs'; -import type { ITextRangeWithStyle } from '@univerjs/engine-render'; import { ShowCommentPanelOperation } from '../commands/operations/show-comment-panel.operation'; import { DEFAULT_DOC_SUBUNIT_ID } from '../common/const'; import { DocThreadCommentService } from '../services/doc-thread-comment.service'; -@OnLifecycle(LifecycleStages.Rendered, DocThreadCommentSelectionController) export class DocThreadCommentSelectionController extends Disposable { constructor( @Inject(ThreadCommentPanelService) private readonly _threadCommentPanelService: ThreadCommentPanelService, diff --git a/packages/docs-thread-comment-ui/src/controllers/doc-thread-comment-ui.controller.ts b/packages/docs-thread-comment-ui/src/controllers/doc-thread-comment-ui.controller.ts index 2dfec8805de..80c20f79e3d 100644 --- a/packages/docs-thread-comment-ui/src/controllers/doc-thread-comment-ui.controller.ts +++ b/packages/docs-thread-comment-ui/src/controllers/doc-thread-comment-ui.controller.ts @@ -14,16 +14,15 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; -import { ComponentManager, IMenuManagerService } from '@univerjs/ui'; +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { CommentSingle } from '@univerjs/icons'; +import { ComponentManager, IMenuManagerService } from '@univerjs/ui'; import { AddDocCommentComment } from '../commands/commands/add-doc-comment.command'; -import { DocThreadCommentPanel } from '../views/doc-thread-comment-panel'; -import { ShowCommentPanelOperation, StartAddCommentOperation, ToggleCommentPanelOperation } from '../commands/operations/show-comment-panel.operation'; import { DeleteDocCommentComment } from '../commands/commands/delete-doc-comment.command'; +import { ShowCommentPanelOperation, StartAddCommentOperation, ToggleCommentPanelOperation } from '../commands/operations/show-comment-panel.operation'; +import { DocThreadCommentPanel } from '../views/doc-thread-comment-panel'; import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Rendered, DocThreadCommentUIController) export class DocThreadCommentUIController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/docs-thread-comment-ui/src/controllers/render-controllers/render.controller.ts b/packages/docs-thread-comment-ui/src/controllers/render-controllers/render.controller.ts index 39f0e6cc091..ff56b3f00f3 100644 --- a/packages/docs-thread-comment-ui/src/controllers/render-controllers/render.controller.ts +++ b/packages/docs-thread-comment-ui/src/controllers/render-controllers/render.controller.ts @@ -15,15 +15,14 @@ */ import type { DocumentDataModel } from '@univerjs/core'; -import { Disposable, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; +import { Disposable, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { DOC_INTERCEPTOR_POINT, DocInterceptorService } from '@univerjs/docs'; import { DocRenderController } from '@univerjs/docs-ui'; -import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; import { ThreadCommentModel } from '@univerjs/thread-comment'; import { ThreadCommentPanelService } from '@univerjs/thread-comment-ui'; import { DEFAULT_DOC_SUBUNIT_ID } from '../../common/const'; -@OnLifecycle(LifecycleStages.Starting, DocThreadCommentRenderController) export class DocThreadCommentRenderController extends Disposable implements IRenderModule { constructor( private readonly _context: IRenderContext, diff --git a/packages/docs-thread-comment-ui/src/plugin.ts b/packages/docs-thread-comment-ui/src/plugin.ts index 862d5566101..7302124c060 100644 --- a/packages/docs-thread-comment-ui/src/plugin.ts +++ b/packages/docs-thread-comment-ui/src/plugin.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; -import { UniverThreadCommentUIPlugin } from '@univerjs/thread-comment-ui'; +import type { IUniverDocsThreadCommentUIConfig } from './controllers/config.schema'; +import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; +import { UniverThreadCommentUIPlugin } from '@univerjs/thread-comment-ui'; import { PLUGIN_NAME } from './common/const'; -import { DocThreadCommentUIController } from './controllers/doc-thread-comment-ui.controller'; -import { DocThreadCommentService } from './services/doc-thread-comment.service'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { DocThreadCommentSelectionController } from './controllers/doc-thread-comment-selection.controller'; +import { DocThreadCommentUIController } from './controllers/doc-thread-comment-ui.controller'; import { DocThreadCommentRenderController } from './controllers/render-controllers/render.controller'; -import type { IUniverDocsThreadCommentUIConfig } from './controllers/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; +import { DocThreadCommentService } from './services/doc-thread-comment.service'; @DependentOn(UniverThreadCommentUIPlugin) export class UniverDocsThreadCommentUIPlugin extends Plugin { @@ -51,7 +51,6 @@ export class UniverDocsThreadCommentUIPlugin extends Plugin { ([ [DocThreadCommentUIController], [DocThreadCommentSelectionController], - [DocThreadCommentService], ] as Dependency[]).forEach((dep) => { this._injector.add(dep); @@ -60,6 +59,9 @@ export class UniverDocsThreadCommentUIPlugin extends Plugin { override onRendered(): void { this._initRenderModule(); + + this._injector.get(DocThreadCommentSelectionController); + this._injector.get(DocThreadCommentUIController); } private _initRenderModule() { diff --git a/packages/docs-ui/src/commands/commands/__tests__/create-command-test-bed.ts b/packages/docs-ui/src/commands/commands/__tests__/create-command-test-bed.ts index 61d556a2d05..753d70db1f6 100644 --- a/packages/docs-ui/src/commands/commands/__tests__/create-command-test-bed.ts +++ b/packages/docs-ui/src/commands/commands/__tests__/create-command-test-bed.ts @@ -16,6 +16,8 @@ /* eslint-disable ts/no-explicit-any */ +import type { Ctor, Dependency, DependencyIdentifier, DocumentDataModel, IDocumentData, Nullable } from '@univerjs/core'; +import type { DocumentSkeleton, IRender, IRenderContext, IRenderModule } from '@univerjs/engine-render'; import { BooleanNumber, DOCS_NORMAL_EDITOR_UNIT_ID_KEY, @@ -31,11 +33,9 @@ import { UniverInstanceType, } from '@univerjs/core'; import { DocSelectionManagerService, DocSkeletonManagerService, DocStateEmitService } from '@univerjs/docs'; + import { DocumentViewModel, IRenderManagerService } from '@univerjs/engine-render'; import { BehaviorSubject, takeUntil } from 'rxjs'; - -import type { Ctor, Dependency, DependencyIdentifier, DocumentDataModel, IDocumentData, Nullable } from '@univerjs/core'; -import type { DocumentSkeleton, IRender, IRenderContext, IRenderModule } from '@univerjs/engine-render'; import { DocIMEInputManagerService } from '../../../services/doc-ime-input-manager.service'; import { DocStateChangeManagerService } from '../../../services/doc-state-change-manager.service'; import { DocSelectionRenderService } from '../../../services/selection/doc-selection-render.service'; @@ -124,6 +124,10 @@ export function createCommandTestBed(docData?: IDocumentData, dependencies?: Dep dependencies?.forEach((d) => injector.add(d)); } + + override onReady(): void { + this._injector.get(DocStateChangeManagerService); + } } univer.registerPlugin(TestPlugin); diff --git a/packages/docs-ui/src/commands/commands/__tests__/inline-format.command.spec.ts b/packages/docs-ui/src/commands/commands/__tests__/inline-format.command.spec.ts index 4081ef278b9..48e8308b9fe 100644 --- a/packages/docs-ui/src/commands/commands/__tests__/inline-format.command.spec.ts +++ b/packages/docs-ui/src/commands/commands/__tests__/inline-format.command.spec.ts @@ -14,11 +14,10 @@ * limitations under the License. */ +import type { DocumentDataModel, ICommand, Injector, IStyleBase, Univer } from '@univerjs/core'; import { BooleanNumber, ICommandService, IUniverInstanceService, RedoCommand, UndoCommand, UniverInstanceType } from '@univerjs/core'; import { DocSelectionManagerService, RichTextEditingMutation, SetTextSelectionsOperation } from '@univerjs/docs'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; - -import type { DocumentDataModel, ICommand, Injector, IStyleBase, Univer } from '@univerjs/core'; import { SetInlineFormatBoldCommand, SetInlineFormatCommand, diff --git a/packages/docs-ui/src/controllers/doc-auto-format.controller.ts b/packages/docs-ui/src/controllers/doc-auto-format.controller.ts index da2577c04fd..0a90a8bdd23 100644 --- a/packages/docs-ui/src/controllers/doc-auto-format.controller.ts +++ b/packages/docs-ui/src/controllers/doc-auto-format.controller.ts @@ -14,17 +14,16 @@ * limitations under the License. */ -import { Disposable, Inject, LifecycleStages, OnLifecycle, QuickListTypeMap } from '@univerjs/core'; import type { Nullable } from 'vitest'; +import type { ITabCommandParams } from '../commands/commands/auto-format.command'; +import { Disposable, Inject, QuickListTypeMap } from '@univerjs/core'; import { AfterSpaceCommand, EnterCommand, TabCommand } from '../commands/commands/auto-format.command'; import { BreakLineCommand } from '../commands/commands/break-line.command'; import { ChangeListNestingLevelCommand, ChangeListNestingLevelType, ListOperationCommand, QuickListCommand } from '../commands/commands/list.command'; import { DocTableTabCommand } from '../commands/commands/table/doc-table-tab.command'; import { DocAutoFormatService } from '../services/doc-auto-format.service'; import { isInSameTableCell } from '../services/selection/convert-rect-range'; -import type { ITabCommandParams } from '../commands/commands/auto-format.command'; -@OnLifecycle(LifecycleStages.Rendered, DocAutoFormatController) export class DocAutoFormatController extends Disposable { constructor( @Inject(DocAutoFormatService) private readonly _docAutoFormatService: DocAutoFormatService diff --git a/packages/docs-ui/src/controllers/doc-move-cursor.controller.ts b/packages/docs-ui/src/controllers/doc-move-cursor.controller.ts index 14aa5bd127d..eccfc2c16e6 100644 --- a/packages/docs-ui/src/controllers/doc-move-cursor.controller.ts +++ b/packages/docs-ui/src/controllers/doc-move-cursor.controller.ts @@ -14,19 +14,6 @@ * limitations under the License. */ -import { - DataStreamTreeTokenType, - Direction, - Disposable, - ICommandService, - Inject, - IUniverInstanceService, - LifecycleStages, - OnLifecycle, - RANGE_DIRECTION, -} from '@univerjs/core'; -import { DocSelectionManagerService, DocSkeletonManagerService } from '@univerjs/docs'; -import { DocumentSkeletonPageType, IRenderManagerService } from '@univerjs/engine-render'; import type { ICommandInfo, Nullable } from '@univerjs/core'; import type { DocumentSkeleton, @@ -38,16 +25,26 @@ import type { INodePosition, INodeSearch, } from '@univerjs/engine-render'; - import type { Subscription } from 'rxjs'; +import type { IMoveCursorOperationParams } from '../commands/operations/doc-cursor.operation'; +import { + DataStreamTreeTokenType, + Direction, + Disposable, + ICommandService, + Inject, + IUniverInstanceService, + RANGE_DIRECTION, +} from '@univerjs/core'; + +import { DocSelectionManagerService, DocSkeletonManagerService } from '@univerjs/docs'; +import { DocumentSkeletonPageType, IRenderManagerService } from '@univerjs/engine-render'; import { getDocObject } from '../basics/component-tools'; import { findAboveCell, findBellowCell, findLineBeforeAndAfterTable, findTableAfterLine, findTableBeforeLine, firstLineInCell, firstLineInTable, lastLineInCell, lastLineInTable } from '../basics/table'; import { MoveCursorOperation, MoveSelectionOperation } from '../commands/operations/doc-cursor.operation'; import { NodePositionConvertToCursor } from '../services/selection/convert-text-range'; import { DocBackScrollRenderController } from './render-controllers/back-scroll.render-controller'; -import type { IMoveCursorOperationParams } from '../commands/operations/doc-cursor.operation'; -@OnLifecycle(LifecycleStages.Rendered, DocMoveCursorController) export class DocMoveCursorController extends Disposable { private _onInputSubscription: Nullable; diff --git a/packages/docs-ui/src/controllers/doc-paragraph-setting.controller.ts b/packages/docs-ui/src/controllers/doc-paragraph-setting.controller.ts index c46ff717cb6..ba1b807dbeb 100644 --- a/packages/docs-ui/src/controllers/doc-paragraph-setting.controller.ts +++ b/packages/docs-ui/src/controllers/doc-paragraph-setting.controller.ts @@ -14,13 +14,12 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { ComponentManager, ISidebarService } from '@univerjs/ui'; import { ParagraphSettingIndex } from '../views/paragraph-setting/index'; const paragraphSettingIndexKey = 'doc_ui_paragraph-setting-panel'; -@OnLifecycle(LifecycleStages.Rendered, DocParagraphSettingController) export class DocParagraphSettingController extends Disposable { private _id: 'DocParagraphSetting'; diff --git a/packages/docs-ui/src/controllers/doc-table.controller.ts b/packages/docs-ui/src/controllers/doc-table.controller.ts index 971906f385c..7b2d1a1ea1c 100644 --- a/packages/docs-ui/src/controllers/doc-table.controller.ts +++ b/packages/docs-ui/src/controllers/doc-table.controller.ts @@ -14,14 +14,12 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; - +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { ComponentManager } from '@univerjs/ui'; +import { DocCreateTableOperation } from '../commands/operations/doc-create-table.operation'; import { COMPONENT_DOC_CREATE_TABLE_CONFIRM } from '../views/table/create/component-name'; import { DocCreateTableConfirm } from '../views/table/create/TableCreate'; -import { DocCreateTableOperation } from '../commands/operations/doc-create-table.operation'; -@OnLifecycle(LifecycleStages.Rendered, DocTableController) export class DocTableController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/docs-ui/src/controllers/doc-ui.controller.ts b/packages/docs-ui/src/controllers/doc-ui.controller.ts index e8e64c1f411..7d9252dad8d 100644 --- a/packages/docs-ui/src/controllers/doc-ui.controller.ts +++ b/packages/docs-ui/src/controllers/doc-ui.controller.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import type { IUniverDocsUIConfig } from './config.schema'; import { connectInjector, Disposable, @@ -22,12 +23,10 @@ import { Inject, Injector, IUniverInstanceService, - LifecycleStages, - OnLifecycle, UniverInstanceType, } from '@univerjs/core'; -import { IRenderManagerService } from '@univerjs/engine-render'; +import { IRenderManagerService } from '@univerjs/engine-render'; import { TodoList } from '@univerjs/icons'; import { BuiltInUIPart, ComponentManager, ILayoutService, IMenuManagerService, IShortcutService, IUIPartsService } from '@univerjs/ui'; import { CoreHeaderFooterCommand, OpenHeaderFooterPanelCommand } from '../commands/commands/doc-header-footer.command'; @@ -60,10 +59,7 @@ import { import { DocFooter } from '../views/doc-footer'; import { PLUGIN_CONFIG_KEY } from './config.schema'; import { menuSchema } from './menu.schema'; -import type { IUniverDocsUIConfig } from './config.schema'; -// FIXME: LifecycleStages.Rendered must be used, otherwise the menu cannot be added to the DOM, but the sheet ui plug-in can be added in LifecycleStages.Ready -@OnLifecycle(LifecycleStages.Rendered, DocUIController) export class DocUIController extends Disposable { constructor( @Inject(Injector) protected readonly _injector: Injector, diff --git a/packages/docs-ui/src/docs-ui-plugin.ts b/packages/docs-ui/src/docs-ui-plugin.ts index c8de6c00f37..c5dc0745b54 100644 --- a/packages/docs-ui/src/docs-ui-plugin.ts +++ b/packages/docs-ui/src/docs-ui-plugin.ts @@ -115,6 +115,7 @@ export class UniverDocsUIPlugin extends Plugin { this._configService.setConfig('menu', menu, { merge: true }); } this._configService.setConfig(PLUGIN_CONFIG_KEY, rest); + this._initDependencies(_injector); this._initializeShortcut(); this._initCommand(); @@ -123,11 +124,23 @@ export class UniverDocsUIPlugin extends Plugin { override onReady(): void { this._initRenderBasics(); this._markDocAsFocused(); + + this._injector.get(DocStateChangeManagerService); + this._injector.get(DocsRenderService); } override onRendered(): void { this._initUI(); this._initRenderModules(); + + this._injector.get(DocAutoFormatController); + this._injector.get(DocMoveCursorController); + this._injector.get(DocParagraphSettingController); + this._injector.get(DocTableController); + + // FIXME: LifecycleStages.Rendered must be used, otherwise the menu cannot be added to the DOM, but the sheet ui + // plugin can be added in LifecycleStages.Ready + this._injector.get(DocUIController); } private _initCommand() { @@ -220,18 +233,15 @@ export class UniverDocsUIPlugin extends Plugin { } private _initDependencies(injector: Injector) { - const dependencies: Dependency[] = [ + const dependencies = mergeOverrideWithDependencies([ [DocClipboardController], [DocEditorBridgeController], - // Controller [DocUIController], [DocAutoFormatController], [DocTableController], [DocMoveCursorController], [AppUIController], [DocParagraphSettingController], - - // Services [IEditorService, { useClass: EditorService }], [IRangeSelectorService, { useClass: RangeSelectorService }], [IDocClipboardService, { useClass: DocClipboardService }], @@ -239,11 +249,8 @@ export class UniverDocsUIPlugin extends Plugin { [DocsRenderService], [DocStateChangeManagerService], [DocAutoFormatService], - ]; - - const dependency = mergeOverrideWithDependencies(dependencies, this._config.override); - - dependency.forEach((d) => injector.add(d)); + ], this._config.override); + dependencies.forEach((d) => injector.add(d)); } private _markDocAsFocused() { diff --git a/packages/docs-ui/src/services/doc-state-change-manager.service.ts b/packages/docs-ui/src/services/doc-state-change-manager.service.ts index 7ca314e4516..9dc023de7b1 100644 --- a/packages/docs-ui/src/services/doc-state-change-manager.service.ts +++ b/packages/docs-ui/src/services/doc-state-change-manager.service.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { ICommandService, Inject, IUndoRedoService, IUniverInstanceService, JSONX, LifecycleStages, OnLifecycle, RedoCommandId, RxDisposable, UndoCommandId } from '@univerjs/core'; +import type { JSONXActions, Nullable } from '@univerjs/core'; +import { ICommandService, Inject, IUndoRedoService, IUniverInstanceService, JSONX, RedoCommandId, RxDisposable, UndoCommandId } from '@univerjs/core'; import { DocStateEmitService, type IDocStateChangeParams, type IRichTextEditingMutationParams } from '@univerjs/docs'; import { IRenderManagerService } from '@univerjs/engine-render'; import { BehaviorSubject, takeUntil } from 'rxjs'; -import type { JSONXActions, Nullable } from '@univerjs/core'; import { DocIMEInputManagerService } from './doc-ime-input-manager.service'; type ChangeStateCacheType = 'history' | 'collaboration'; @@ -28,7 +28,6 @@ const DEBOUNCE_DELAY = 300; // This class sends out state-changing events, what is the state, the data model, // and the cursor & selection, and this class mainly serves the History(undo/redo) module and // the collaboration module. -@OnLifecycle(LifecycleStages.Ready, DocStateChangeManagerService) export class DocStateChangeManagerService extends RxDisposable { private readonly _docStateChange$ = new BehaviorSubject>(null); readonly docStateChange$ = this._docStateChange$.asObservable(); diff --git a/packages/docs-ui/src/services/docs-render.service.ts b/packages/docs-ui/src/services/docs-render.service.ts index de45162ad5a..90712b3ef02 100644 --- a/packages/docs-ui/src/services/docs-render.service.ts +++ b/packages/docs-ui/src/services/docs-render.service.ts @@ -14,12 +14,11 @@ * limitations under the License. */ -import { IUniverInstanceService, LifecycleStages, OnLifecycle, RxDisposable, UniverInstanceType } from '@univerjs/core'; +import type { DocumentDataModel } from '@univerjs/core'; +import { IUniverInstanceService, RxDisposable, UniverInstanceType } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; import { takeUntil } from 'rxjs'; -import type { DocumentDataModel } from '@univerjs/core'; -@OnLifecycle(LifecycleStages.Ready, DocsRenderService) export class DocsRenderService extends RxDisposable { constructor( @IUniverInstanceService private readonly _instanceSrv: IUniverInstanceService, diff --git a/packages/docs/src/controllers/custom-range.controller.ts b/packages/docs/src/controllers/custom-range.controller.ts index e0030a09919..7bebc96397b 100644 --- a/packages/docs/src/controllers/custom-range.controller.ts +++ b/packages/docs/src/controllers/custom-range.controller.ts @@ -14,14 +14,13 @@ * limitations under the License. */ -import { BuildTextUtils, Disposable, ICommandService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle } from '@univerjs/core'; import type { DocumentDataModel } from '@univerjs/core'; import type { ITextRangeWithStyle } from '@univerjs/engine-render'; +import type { ISetTextSelectionsOperationParams } from '../commands/operations/text-selection.operation'; +import { BuildTextUtils, Disposable, ICommandService, Inject, IUniverInstanceService } from '@univerjs/core'; import { SetTextSelectionsOperation } from '../commands/operations/text-selection.operation'; import { DocSelectionManagerService } from '../services/doc-selection-manager.service'; -import type { ISetTextSelectionsOperationParams } from '../commands/operations/text-selection.operation'; -@OnLifecycle(LifecycleStages.Ready, DocCustomRangeController) export class DocCustomRangeController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/docs/src/doc-plugin.ts b/packages/docs/src/doc-plugin.ts index a5767ef3ff5..39de1870522 100644 --- a/packages/docs/src/doc-plugin.ts +++ b/packages/docs/src/doc-plugin.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import type { Dependency, ICommand } from '@univerjs/core'; +import type { IUniverDocsConfig } from './controllers/config.schema'; import { ICommandService, IConfigService, @@ -21,7 +23,6 @@ import { Injector, Plugin, } from '@univerjs/core'; -import type { Dependency, ICommand } from '@univerjs/core'; import { RichTextEditingMutation } from './commands/mutations/core-editing.mutation'; import { DocsRenameMutation } from './commands/mutations/docs-rename.mutation'; import { SetTextSelectionsOperation } from './commands/operations/text-selection.operation'; @@ -29,7 +30,6 @@ import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.sch import { DocCustomRangeController } from './controllers/custom-range.controller'; import { DocSelectionManagerService } from './services/doc-selection-manager.service'; import { DocStateEmitService } from './services/doc-state-emit.service'; -import type { IUniverDocsConfig } from './controllers/config.schema'; const PLUGIN_NAME = 'DOCS_PLUGIN'; @@ -47,9 +47,10 @@ export class UniverDocsPlugin extends Plugin { // Manage the plugin configuration. const { ...rest } = this._config; this._configService.setConfig(PLUGIN_CONFIG_KEY, rest); + } - this._initializeDependencies(_injector); - + override onStarting(): void { + this._initializeDependencies(); this._initializeCommands(); } @@ -65,16 +66,17 @@ export class UniverDocsPlugin extends Plugin { }); } - private _initializeDependencies(docInjector: Injector) { + private _initializeDependencies() { ( [ - // services [DocSelectionManagerService], [DocStateEmitService], - // controllers [DocCustomRangeController], - ] as Dependency[] - ).forEach((d) => docInjector.add(d)); + ).forEach((d) => this._injector.add(d)); + } + + override onReady(): void { + this._injector.get(DocCustomRangeController); } } diff --git a/packages/docs/src/services/doc-interceptor/doc-interceptor.service.ts b/packages/docs/src/services/doc-interceptor/doc-interceptor.service.ts index fb75289e3dd..73926e49e0d 100644 --- a/packages/docs/src/services/doc-interceptor/doc-interceptor.service.ts +++ b/packages/docs/src/services/doc-interceptor/doc-interceptor.service.ts @@ -15,12 +15,11 @@ */ import type { DocumentDataModel, ICustomDecorationForInterceptor, ICustomRangeForInterceptor, IInterceptor, Nullable } from '@univerjs/core'; -import { composeInterceptors, Disposable, DisposableCollection, DOCS_FORMULA_BAR_EDITOR_UNIT_ID_KEY, DOCS_NORMAL_EDITOR_UNIT_ID_KEY, Inject, LifecycleStages, OnLifecycle, remove, toDisposable } from '@univerjs/core'; import type { DocumentViewModel, IRenderContext, IRenderModule } from '@univerjs/engine-render'; +import { composeInterceptors, Disposable, DisposableCollection, DOCS_FORMULA_BAR_EDITOR_UNIT_ID_KEY, DOCS_NORMAL_EDITOR_UNIT_ID_KEY, Inject, remove, toDisposable } from '@univerjs/core'; import { DocSkeletonManagerService } from '../doc-skeleton-manager.service'; import { DOC_INTERCEPTOR_POINT } from './interceptor-const'; -@OnLifecycle(LifecycleStages.Starting, DocInterceptorService) export class DocInterceptorService extends Disposable implements IRenderModule { private _interceptorsByName: Map>> = new Map(); diff --git a/packages/drawing-ui/src/controllers/drawing-ui.controller.ts b/packages/drawing-ui/src/controllers/drawing-ui.controller.ts index 577e77e2bfe..e3982dd352a 100644 --- a/packages/drawing-ui/src/controllers/drawing-ui.controller.ts +++ b/packages/drawing-ui/src/controllers/drawing-ui.controller.ts @@ -14,17 +14,16 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { ComponentManager } from '@univerjs/ui'; +import { SetDrawingAlignOperation } from '../commands/operations/drawing-align.operation'; +import { AutoImageCropOperation, CloseImageCropOperation, OpenImageCropOperation } from '../commands/operations/image-crop.operation'; +import { ImageResetSizeOperation } from '../commands/operations/image-reset-size.operation'; import { COMPONENT_IMAGE_POPUP_MENU } from '../views/image-popup-menu/component-name'; import { ImagePopupMenu } from '../views/image-popup-menu/ImagePopupMenu'; -import { AutoImageCropOperation, CloseImageCropOperation, OpenImageCropOperation } from '../commands/operations/image-crop.operation'; -import { ImageViewer } from '../views/image-viewer/ImageViewer'; import { COMPONENT_IMAGE_VIEWER } from '../views/image-viewer/component-name'; -import { ImageResetSizeOperation } from '../commands/operations/image-reset-size.operation'; -import { SetDrawingAlignOperation } from '../commands/operations/drawing-align.operation'; +import { ImageViewer } from '../views/image-viewer/ImageViewer'; -@OnLifecycle(LifecycleStages.Rendered, DrawingUIController) export class DrawingUIController extends Disposable { constructor( @Inject(ComponentManager) private readonly _componentManager: ComponentManager, diff --git a/packages/drawing-ui/src/controllers/drawing-update.controller.ts b/packages/drawing-ui/src/controllers/drawing-update.controller.ts index 3feb8700778..f1b01c34da4 100644 --- a/packages/drawing-ui/src/controllers/drawing-update.controller.ts +++ b/packages/drawing-ui/src/controllers/drawing-update.controller.ts @@ -18,20 +18,18 @@ import type { ICommandInfo, Nullable, } from '@univerjs/core'; +import type { DrawingTypeEnum, IDrawingGroupUpdateParam, IDrawingOrderMapParam, IDrawingParam, IDrawingSearch, ITransformState } from '@univerjs/drawing'; +import type { BaseObject, Image, IShapeProps, Scene, Shape } from '@univerjs/engine-render'; +import type { ISetDrawingAlignOperationParams } from '../commands/operations/drawing-align.operation'; import { checkIfMove, Disposable, ICommandService, IUniverInstanceService, - LifecycleStages, - OnLifecycle, toDisposable, } from '@univerjs/core'; -import type { BaseObject, Image, IShapeProps, Scene, Shape } from '@univerjs/engine-render'; -import { DRAWING_OBJECT_LAYER_INDEX, Group, IRenderManagerService, RENDER_CLASS_TYPE } from '@univerjs/engine-render'; -import type { DrawingTypeEnum, IDrawingGroupUpdateParam, IDrawingOrderMapParam, IDrawingParam, IDrawingSearch, ITransformState } from '@univerjs/drawing'; import { getDrawingShapeKeyByDrawingSearch, IDrawingManagerService } from '@univerjs/drawing'; -import type { ISetDrawingAlignOperationParams } from '../commands/operations/drawing-align.operation'; +import { DRAWING_OBJECT_LAYER_INDEX, Group, IRenderManagerService, RENDER_CLASS_TYPE } from '@univerjs/engine-render'; import { AlignType, SetDrawingAlignOperation } from '../commands/operations/drawing-align.operation'; import { CloseImageCropOperation } from '../commands/operations/image-crop.operation'; import { getUpdateParams } from '../utils/get-update-params'; @@ -45,7 +43,6 @@ interface IDrawingTransformCache { transform: ITransformState; } -@OnLifecycle(LifecycleStages.Rendered, DrawingUpdateController) export class DrawingUpdateController extends Disposable { constructor( @IUniverInstanceService private readonly _currentUniverService: IUniverInstanceService, diff --git a/packages/drawing-ui/src/controllers/image-cropper.controller.ts b/packages/drawing-ui/src/controllers/image-cropper.controller.ts index bbf79075cfa..9e446f39ea6 100644 --- a/packages/drawing-ui/src/controllers/image-cropper.controller.ts +++ b/packages/drawing-ui/src/controllers/image-cropper.controller.ts @@ -15,19 +15,18 @@ */ import type { ICommandInfo, ISrcRect, Nullable, Workbook } from '@univerjs/core'; -import { checkIfMove, Disposable, ICommandService, Inject, IUniverInstanceService, LifecycleStages, LocaleService, OnLifecycle, UniverInstanceType } from '@univerjs/core'; -import { MessageType } from '@univerjs/design'; import type { IDrawingSearch, IImageData, ITransformState } from '@univerjs/drawing'; -import { getDrawingShapeKeyByDrawingSearch, IDrawingManagerService } from '@univerjs/drawing'; import type { BaseObject, Scene } from '@univerjs/engine-render'; +import type { IOpenImageCropOperationBySrcRectParams } from '../commands/operations/image-crop.operation'; +import { checkIfMove, Disposable, ICommandService, Inject, IUniverInstanceService, LocaleService, UniverInstanceType } from '@univerjs/core'; +import { MessageType } from '@univerjs/design'; +import { getDrawingShapeKeyByDrawingSearch, IDrawingManagerService } from '@univerjs/drawing'; import { CURSOR_TYPE, degToRad, Image, IRenderManagerService, precisionTo, Vector2 } from '@univerjs/engine-render'; import { IMessageService } from '@univerjs/ui'; import { filter, switchMap } from 'rxjs'; -import type { IOpenImageCropOperationBySrcRectParams } from '../commands/operations/image-crop.operation'; import { AutoImageCropOperation, CloseImageCropOperation, CropType, OpenImageCropOperation } from '../commands/operations/image-crop.operation'; import { ImageCropperObject } from '../views/crop/image-cropper-object'; -@OnLifecycle(LifecycleStages.Rendered, ImageCropperController) export class ImageCropperController extends Disposable { private _sceneListenerOnImageMap: WeakSet = new WeakSet(); diff --git a/packages/drawing-ui/src/controllers/image-update.controller.ts b/packages/drawing-ui/src/controllers/image-update.controller.ts index 8bb26b02f84..a06ea07477b 100644 --- a/packages/drawing-ui/src/controllers/image-update.controller.ts +++ b/packages/drawing-ui/src/controllers/image-update.controller.ts @@ -15,28 +15,25 @@ */ import type { ICommandInfo, Nullable } from '@univerjs/core'; +import type { IDrawingSearch, IImageData } from '@univerjs/drawing'; +import type { Image, Scene } from '@univerjs/engine-render'; import { Disposable, ICommandService, Inject, IUniverInstanceService, - LifecycleStages, - OnLifecycle, toDisposable, } from '@univerjs/core'; -import type { Image, Scene } from '@univerjs/engine-render'; -import { CURSOR_TYPE, IRenderManagerService } from '@univerjs/engine-render'; -import type { IDrawingSearch, IImageData } from '@univerjs/drawing'; import { DrawingTypeEnum, getDrawingShapeKeyByDrawingSearch, IDrawingManagerService, IImageIoService } from '@univerjs/drawing'; +import { CURSOR_TYPE, IRenderManagerService } from '@univerjs/engine-render'; import { IDialogService } from '@univerjs/ui'; -import { COMPONENT_IMAGE_VIEWER } from '../views/image-viewer/component-name'; import { ImageResetSizeOperation } from '../commands/operations/image-reset-size.operation'; import { DrawingRenderService } from '../services/drawing-render.service'; +import { COMPONENT_IMAGE_VIEWER } from '../views/image-viewer/component-name'; import { getCurrentUnitInfo } from './utils'; const IMAGE_VIEWER_DROPDOWN_PADDING = 50; -@OnLifecycle(LifecycleStages.Rendered, ImageUpdateController) export class ImageUpdateController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/drawing-ui/src/plugin.ts b/packages/drawing-ui/src/plugin.ts index 139ddd9b80b..7e569eeef6b 100644 --- a/packages/drawing-ui/src/plugin.ts +++ b/packages/drawing-ui/src/plugin.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import { IConfigService, Inject, Injector, Plugin } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; -import { DrawingUpdateController } from './controllers/drawing-update.controller'; +import type { IUniverDrawingUIConfig } from './controllers/config.schema'; +import { IConfigService, Inject, Injector, Plugin } from '@univerjs/core'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { DrawingUIController } from './controllers/drawing-ui.controller'; +import { DrawingUpdateController } from './controllers/drawing-update.controller'; import { ImageCropperController } from './controllers/image-cropper.controller'; import { ImageUpdateController } from './controllers/image-update.controller'; import { DrawingRenderService } from './services/drawing-render.service'; -import type { IUniverDrawingUIConfig } from './controllers/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; const PLUGIN_NAME = 'UNIVER_DRAWING_UI_PLUGIN'; @@ -48,12 +48,16 @@ export class UniverDrawingUIPlugin extends Plugin { this._initDependencies(); } + override onRendered(): void { + this._injector.get(DrawingUIController); + this._injector.get(DrawingUpdateController); + this._injector.get(ImageCropperController); + this._injector.get(ImageUpdateController); + } + private _initDependencies(): void { const dependencies: Dependency[] = [ - - // services [DrawingRenderService], - // controllers [DrawingUpdateController], [DrawingUIController], [ImageCropperController], diff --git a/packages/drawing/src/services/drawing-manager-impl.service.ts b/packages/drawing/src/services/drawing-manager-impl.service.ts index 872c1e8a0b9..5c55724d39a 100644 --- a/packages/drawing/src/services/drawing-manager-impl.service.ts +++ b/packages/drawing/src/services/drawing-manager-impl.service.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { type Observable, Subject } from 'rxjs'; import type { Nullable } from '@univerjs/core'; -import { sortRules, sortRulesByDesc } from '@univerjs/core'; import type { JSONOp, JSONOpList } from 'ot-json1'; -import * as json1 from 'ot-json1'; import type { IDrawingGroupUpdateParam, IDrawingMap, IDrawingMapItemData, IDrawingOrderMapParam, IDrawingOrderUpdateParam, IDrawingParam, IDrawingSearch, IDrawingSubunitMap, IDrawingVisibleParam, IUnitDrawingService } from './drawing-manager.service'; +import { sortRules, sortRulesByDesc } from '@univerjs/core'; +import * as json1 from 'ot-json1'; +import { type Observable, Subject } from 'rxjs'; export interface IDrawingJsonUndo1 { undo: JSONOp; @@ -137,7 +137,7 @@ export class UnitDrawingService implements IUnitDrawing } getDrawingDataForUnit(unitId: string) { - return this.drawingManagerData[unitId]; + return this.drawingManagerData[unitId] || {}; } removeDrawingDataForUnit(unitId: string) { diff --git a/packages/engine-formula/src/controller/calculate.controller.ts b/packages/engine-formula/src/controller/calculate.controller.ts index a006cfbda5d..949561c202f 100644 --- a/packages/engine-formula/src/controller/calculate.controller.ts +++ b/packages/engine-formula/src/controller/calculate.controller.ts @@ -21,7 +21,7 @@ import type { ISetArrayFormulaDataMutationParams } from '../commands/mutations/s import type { ISetFormulaCalculationStartMutation } from '../commands/mutations/set-formula-calculation.mutation'; import type { ISetFormulaDataMutationParams } from '../commands/mutations/set-formula-data.mutation'; import type { IAllRuntimeData } from '../services/runtime.service'; -import { Disposable, ICommandService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { convertRuntimeToUnitData } from '../basics/runtime'; import { SetArrayFormulaDataMutation } from '../commands/mutations/set-array-formula-data.mutation'; import { @@ -35,12 +35,10 @@ import { FormulaDataModel } from '../models/formula-data.model'; import { CalculateFormulaService } from '../services/calculate-formula.service'; import { FormulaExecutedStateType } from '../services/runtime.service'; -@OnLifecycle(LifecycleStages.Ready, CalculateController) export class CalculateController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, @Inject(CalculateFormulaService) private readonly _calculateFormulaService: CalculateFormulaService, - @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, @Inject(FormulaDataModel) private readonly _formulaDataModel: FormulaDataModel ) { super(); @@ -57,7 +55,7 @@ export class CalculateController extends Disposable { private _commandExecutedListener() { this.disposeWithMe( - this._commandService.onCommandExecuted((command: ICommandInfo, options) => { + this._commandService.onCommandExecuted((command: ICommandInfo) => { if (command.id === SetFormulaCalculationStopMutation.id) { this._calculateFormulaService.stopFormulaExecution(); } else if (command.id === SetFormulaDataMutation.id) { diff --git a/packages/engine-formula/src/controller/formula.controller.ts b/packages/engine-formula/src/controller/formula.controller.ts index cdea2e4cd0b..8dd2071e0d1 100644 --- a/packages/engine-formula/src/controller/formula.controller.ts +++ b/packages/engine-formula/src/controller/formula.controller.ts @@ -14,11 +14,13 @@ * limitations under the License. */ -import { Disposable, ICommandService, IConfigService, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import type { IFunctionNames } from '../basics/function'; +import type { BaseFunction } from '../functions/base-function'; +import type { IUniverEngineFormulaConfig } from './config.schema'; + +import { Disposable, ICommandService, IConfigService } from '@univerjs/core'; import { type Ctor, Optional } from '@univerjs/core'; import { DataSyncPrimaryController } from '@univerjs/rpc'; - -import type { IFunctionNames } from '../basics/function'; import { RegisterFunctionMutation } from '../commands/mutations/register-function.mutation'; import { SetArrayFormulaDataMutation } from '../commands/mutations/set-array-formula-data.mutation'; import { RemoveDefinedNameMutation, SetDefinedNameMutation } from '../commands/mutations/set-defined-name.mutation'; @@ -40,7 +42,6 @@ import { SetSuperTableOptionMutation, } from '../commands/mutations/set-super-table.mutation'; import { functionArray } from '../functions/array/function-map'; -import type { BaseFunction } from '../functions/base-function'; import { functionCompatibility } from '../functions/compatibility/function-map'; import { functionCube } from '../functions/cube/function-map'; import { functionDatabase } from '../functions/database/function-map'; @@ -57,10 +58,8 @@ import { functionText } from '../functions/text/function-map'; import { functionUniver } from '../functions/univer/function-map'; import { functionWeb } from '../functions/web/function-map'; import { IFunctionService } from '../services/function.service'; -import type { IUniverEngineFormulaConfig } from './config.schema'; import { PLUGIN_CONFIG_KEY } from './config.schema'; -@OnLifecycle(LifecycleStages.Ready, FormulaController) export class FormulaController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/engine-formula/src/controller/set-defined-name.controller.ts b/packages/engine-formula/src/controller/set-defined-name.controller.ts index b0ba87d270c..9ce75b9a1bf 100644 --- a/packages/engine-formula/src/controller/set-defined-name.controller.ts +++ b/packages/engine-formula/src/controller/set-defined-name.controller.ts @@ -15,16 +15,15 @@ */ import type { ICommandInfo } from '@univerjs/core'; -import { Disposable, ICommandService, LifecycleStages, OnLifecycle } from '@univerjs/core'; - import type { ISetDefinedNameMutationParam, ISetDefinedNameMutationSearchParam, } from '../commands/mutations/set-defined-name.mutation'; + +import { Disposable, ICommandService } from '@univerjs/core'; import { RemoveDefinedNameMutation, SetDefinedNameMutation } from '../commands/mutations/set-defined-name.mutation'; import { IDefinedNamesService } from '../services/defined-names.service'; -@OnLifecycle(LifecycleStages.Ready, SetDefinedNameController) export class SetDefinedNameController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/engine-formula/src/controller/set-dependency.controller.ts b/packages/engine-formula/src/controller/set-dependency.controller.ts index 48ce25d8949..2217b5f747b 100644 --- a/packages/engine-formula/src/controller/set-dependency.controller.ts +++ b/packages/engine-formula/src/controller/set-dependency.controller.ts @@ -14,9 +14,14 @@ * limitations under the License. */ -import { Disposable, ICommandService, LifecycleStages, ObjectMatrix, OnLifecycle } from '@univerjs/core'; import type { ICommandInfo } from '@univerjs/core'; +import type { + IRemoveFeatureCalculationMutationParam, + ISetFeatureCalculationMutation } from '../commands/mutations/set-feature-calculation.mutation'; +import type { ISetFormulaDataMutationParams } from '../commands/mutations/set-formula-data.mutation'; +import type { IRemoveOtherFormulaMutationParams, ISetOtherFormulaMutationParams } from '../commands/mutations/set-other-formula.mutation'; +import { Disposable, ICommandService, ObjectMatrix } from '@univerjs/core'; import { RemoveFeatureCalculationMutation, SetFeatureCalculationMutation, @@ -25,13 +30,7 @@ import { SetFormulaDataMutation } from '../commands/mutations/set-formula-data.m import { RemoveOtherFormulaMutation, SetOtherFormulaMutation } from '../commands/mutations/set-other-formula.mutation'; import { IDependencyManagerService } from '../services/dependency-manager.service'; import { IFeatureCalculationManagerService } from '../services/feature-calculation-manager.service'; -import type { - IRemoveFeatureCalculationMutationParam, - ISetFeatureCalculationMutation } from '../commands/mutations/set-feature-calculation.mutation'; -import type { ISetFormulaDataMutationParams } from '../commands/mutations/set-formula-data.mutation'; -import type { IRemoveOtherFormulaMutationParams, ISetOtherFormulaMutationParams } from '../commands/mutations/set-other-formula.mutation'; -@OnLifecycle(LifecycleStages.Ready, SetDependencyController) export class SetDependencyController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/engine-formula/src/controller/set-feature-calculation.controller.ts b/packages/engine-formula/src/controller/set-feature-calculation.controller.ts index 4fb88aa2273..a15a33c328f 100644 --- a/packages/engine-formula/src/controller/set-feature-calculation.controller.ts +++ b/packages/engine-formula/src/controller/set-feature-calculation.controller.ts @@ -15,18 +15,17 @@ */ import type { ICommandInfo } from '@univerjs/core'; -import { Disposable, ICommandService, LifecycleStages, OnLifecycle } from '@univerjs/core'; - import type { IRemoveFeatureCalculationMutationParam, - ISetFeatureCalculationMutation } from '../commands/mutations/set-feature-calculation.mutation'; + ISetFeatureCalculationMutation, +} from '../commands/mutations/set-feature-calculation.mutation'; +import { Disposable, ICommandService } from '@univerjs/core'; import { RemoveFeatureCalculationMutation, SetFeatureCalculationMutation, } from '../commands/mutations/set-feature-calculation.mutation'; import { IFeatureCalculationManagerService } from '../services/feature-calculation-manager.service'; -@OnLifecycle(LifecycleStages.Ready, SetFeatureCalculationController) export class SetFeatureCalculationController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/engine-formula/src/controller/set-other-formula.controller.ts b/packages/engine-formula/src/controller/set-other-formula.controller.ts index 009b488c204..9f1bf54c203 100644 --- a/packages/engine-formula/src/controller/set-other-formula.controller.ts +++ b/packages/engine-formula/src/controller/set-other-formula.controller.ts @@ -15,16 +15,15 @@ */ import type { ICommandInfo } from '@univerjs/core'; -import { Disposable, ICommandService, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import type { IRemoveOtherFormulaMutationParams, ISetOtherFormulaMutationParams } from '../commands/mutations/set-other-formula.mutation'; +import { Disposable, ICommandService } from '@univerjs/core'; +import { RemoveOtherFormulaMutation, SetOtherFormulaMutation } from '../commands/mutations/set-other-formula.mutation'; +import { IDependencyManagerService } from '../services/dependency-manager.service'; import { IOtherFormulaManagerService, } from '../services/other-formula-manager.service'; -import { RemoveOtherFormulaMutation, SetOtherFormulaMutation } from '../commands/mutations/set-other-formula.mutation'; -import type { IRemoveOtherFormulaMutationParams, ISetOtherFormulaMutationParams } from '../commands/mutations/set-other-formula.mutation'; -import { IDependencyManagerService } from '../services/dependency-manager.service'; -@OnLifecycle(LifecycleStages.Ready, SetOtherFormulaController) export class SetOtherFormulaController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/engine-formula/src/controller/set-super-table.controller.ts b/packages/engine-formula/src/controller/set-super-table.controller.ts index b5d5d1c1817..f790977ab1f 100644 --- a/packages/engine-formula/src/controller/set-super-table.controller.ts +++ b/packages/engine-formula/src/controller/set-super-table.controller.ts @@ -15,18 +15,17 @@ */ import type { ICommandInfo } from '@univerjs/core'; -import { Disposable, ICommandService, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import type { ISuperTableOptionParam } from '../services/super-table.service'; +import { Disposable, ICommandService } from '@univerjs/core'; import { RemoveDefinedNameMutation, SetDefinedNameMutation } from '../commands/mutations/set-defined-name.mutation'; import { type ISetSuperTableMutationParam, type ISetSuperTableMutationSearchParam, SetSuperTableOptionMutation, } from '../commands/mutations/set-super-table.mutation'; -import type { ISuperTableOptionParam } from '../services/super-table.service'; import { ISuperTableService } from '../services/super-table.service'; -@OnLifecycle(LifecycleStages.Ready, SetSuperTableController) export class SetSuperTableController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/engine-formula/src/engine/dependency/formula-dependency.ts b/packages/engine-formula/src/engine/dependency/formula-dependency.ts index 9202515ea14..40acac8944c 100644 --- a/packages/engine-formula/src/engine/dependency/formula-dependency.ts +++ b/packages/engine-formula/src/engine/dependency/formula-dependency.ts @@ -15,33 +15,32 @@ */ import type { IRange, Nullable } from '@univerjs/core'; -import { Disposable, Inject, LifecycleStages, ObjectMatrix, OnLifecycle } from '@univerjs/core'; - -import { FormulaAstLRU } from '../../basics/cache-lru'; import type { IDirtyUnitSheetNameMap, IFeatureDirtyRangeType, IFormulaData, IOtherFormulaData, IUnitData } from '../../basics/common'; import type { ErrorType } from '../../basics/error-type'; +import type { IFormulaDirtyData } from '../../services/current-data.service'; +import type { IFeatureCalculationManagerParam } from '../../services/feature-calculation-manager.service'; +import type { IAllRuntimeData } from '../../services/runtime.service'; +import type { LexerNode } from '../analysis/lexer-node'; +import type { AstRootNode, FunctionNode, PrefixNode, SuffixNode } from '../ast-node'; +import type { BaseAstNode } from '../ast-node/base-ast-node'; +import type { BaseReferenceObject } from '../reference-object/base-reference-object'; +import type { PreCalculateNodeType } from '../utils/node-type'; +import type { IUnitRangeWithToken } from './dependency-tree'; +import { Disposable, Inject, ObjectMatrix } from '@univerjs/core'; +import { FormulaAstLRU } from '../../basics/cache-lru'; import { ERROR_TYPE_SET } from '../../basics/error-type'; import { prefixToken, suffixToken } from '../../basics/token'; -import type { IFormulaDirtyData } from '../../services/current-data.service'; import { IFormulaCurrentConfigService } from '../../services/current-data.service'; -import type { IFeatureCalculationManagerParam } from '../../services/feature-calculation-manager.service'; +import { IDependencyManagerService } from '../../services/dependency-manager.service'; import { IFeatureCalculationManagerService } from '../../services/feature-calculation-manager.service'; import { IOtherFormulaManagerService } from '../../services/other-formula-manager.service'; -import type { IAllRuntimeData } from '../../services/runtime.service'; import { IFormulaRuntimeService } from '../../services/runtime.service'; import { Lexer } from '../analysis/lexer'; -import type { LexerNode } from '../analysis/lexer-node'; import { AstTreeBuilder } from '../analysis/parser'; -import type { AstRootNode, FunctionNode, PrefixNode, SuffixNode } from '../ast-node'; -import type { BaseAstNode } from '../ast-node/base-ast-node'; import { ErrorNode } from '../ast-node/base-ast-node'; import { NodeType } from '../ast-node/node-type'; import { Interpreter } from '../interpreter/interpreter'; -import type { BaseReferenceObject } from '../reference-object/base-reference-object'; -import type { PreCalculateNodeType } from '../utils/node-type'; import { serializeRangeToRefString } from '../utils/reference'; -import { IDependencyManagerService } from '../../services/dependency-manager.service'; -import type { IUnitRangeWithToken } from './dependency-tree'; import { FormulaDependencyTree, FormulaDependencyTreeCache } from './dependency-tree'; const FORMULA_CACHE_LRU_COUNT = 100000; @@ -52,7 +51,6 @@ interface IFeatureFormulaParam { featureId: string; } -@OnLifecycle(LifecycleStages.Rendered, FormulaDependencyGenerator) export class FormulaDependencyGenerator extends Disposable { private _updateRangeFlattenCache = new Map>(); diff --git a/packages/engine-formula/src/plugin.ts b/packages/engine-formula/src/plugin.ts index bb194eb4215..3a8dffd91ef 100644 --- a/packages/engine-formula/src/plugin.ts +++ b/packages/engine-formula/src/plugin.ts @@ -14,12 +14,14 @@ * limitations under the License. */ -import { IConfigService, Inject, Injector, Plugin } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; - +import type { IUniverEngineFormulaConfig } from './controller/config.schema'; +import { IConfigService, Inject, Injector, Plugin } from '@univerjs/core'; import { CalculateController } from './controller/calculate.controller'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controller/config.schema'; import { FormulaController } from './controller/formula.controller'; import { SetDefinedNameController } from './controller/set-defined-name.controller'; +import { SetDependencyController } from './controller/set-dependency.controller'; import { SetFeatureCalculationController } from './controller/set-feature-calculation.controller'; import { SetOtherFormulaController } from './controller/set-other-formula.controller'; import { SetSuperTableController } from './controller/set-super-table.controller'; @@ -39,9 +41,11 @@ import { ValueNodeFactory } from './engine/ast-node/value-node'; import { FormulaDependencyGenerator } from './engine/dependency/formula-dependency'; import { Interpreter } from './engine/interpreter/interpreter'; import { FormulaDataModel } from './models/formula-data.model'; +import { ActiveDirtyManagerService, IActiveDirtyManagerService } from './services/active-dirty-manager.service'; import { CalculateFormulaService } from './services/calculate-formula.service'; import { FormulaCurrentConfigService, IFormulaCurrentConfigService } from './services/current-data.service'; import { DefinedNamesService, IDefinedNamesService } from './services/defined-names.service'; +import { DependencyManagerService, IDependencyManagerService } from './services/dependency-manager.service'; import { FeatureCalculationManagerService, IFeatureCalculationManagerService, @@ -50,11 +54,6 @@ import { FunctionService, IFunctionService } from './services/function.service'; import { IOtherFormulaManagerService, OtherFormulaManagerService } from './services/other-formula-manager.service'; import { FormulaRuntimeService, IFormulaRuntimeService } from './services/runtime.service'; import { ISuperTableService, SuperTableService } from './services/super-table.service'; -import { ActiveDirtyManagerService, IActiveDirtyManagerService } from './services/active-dirty-manager.service'; -import { DependencyManagerService, IDependencyManagerService } from './services/dependency-manager.service'; -import { SetDependencyController } from './controller/set-dependency.controller'; -import type { IUniverEngineFormulaConfig } from './controller/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controller/config.schema'; const PLUGIN_NAME = 'UNIVER_ENGINE_FORMULA_PLUGIN'; @@ -77,6 +76,26 @@ export class UniverFormulaEnginePlugin extends Plugin { this._initialize(); } + override onReady(): void { + this._injector.get(FormulaController); + this._injector.get(SetDefinedNameController); + this._injector.get(SetSuperTableController); + + if (!this._config?.notExecuteFormula) { + this._injector.get(SetOtherFormulaController); + this._injector.get(SetFeatureCalculationController); + this._injector.get(SetDependencyController); + this._injector.get(CalculateController); + } + } + + override onRendered(): void { + if (!this._config?.notExecuteFormula) { + this._injector.get(CalculateFormulaService); + this._injector.get(FormulaDependencyGenerator); + } + } + private _initialize() { // worker and main thread const dependencies: Dependency[] = [ diff --git a/packages/engine-formula/src/services/calculate-formula.service.ts b/packages/engine-formula/src/services/calculate-formula.service.ts index 274ec30cfe9..cc1d4a7c8c1 100644 --- a/packages/engine-formula/src/services/calculate-formula.service.ts +++ b/packages/engine-formula/src/services/calculate-formula.service.ts @@ -15,35 +15,33 @@ */ import type { IUnitRange } from '@univerjs/core'; +import type { + IArrayFormulaRangeType, + IFeatureDirtyRangeType, + IFormulaDatasetConfig, + IRuntimeUnitDataType, + IUnitExcludedCell, +} from '../basics/common'; +import type { LexerNode } from '../engine/analysis/lexer-node'; + +import type { IAllRuntimeData, IExecutionInProgressParams } from './runtime.service'; import { Disposable, IConfigService, Inject, - LifecycleStages, ObjectMatrix, - OnLifecycle, requestImmediateMacroTask, } from '@univerjs/core'; import { Subject } from 'rxjs'; - -import type { - IArrayFormulaRangeType, - IFeatureDirtyRangeType, - IFormulaDatasetConfig, - IRuntimeUnitDataType, - IUnitExcludedCell, -} from '../basics/common'; import { ErrorType } from '../basics/error-type'; import { CELL_INVERTED_INDEX_CACHE } from '../basics/inverted-index-cache'; import { Lexer } from '../engine/analysis/lexer'; -import type { LexerNode } from '../engine/analysis/lexer-node'; import { AstTreeBuilder } from '../engine/analysis/parser'; import { ErrorNode } from '../engine/ast-node/base-ast-node'; import { FormulaDependencyGenerator } from '../engine/dependency/formula-dependency'; import { Interpreter } from '../engine/interpreter/interpreter'; import { FORMULA_REF_TO_ARRAY_CACHE, type FunctionVariantType } from '../engine/reference-object/base-reference-object'; import { IFormulaCurrentConfigService } from './current-data.service'; -import type { IAllRuntimeData, IExecutionInProgressParams } from './runtime.service'; import { FormulaExecuteStageType, IFormulaRuntimeService } from './runtime.service'; export const DEFAULT_CYCLE_REFERENCE_COUNT = 1; @@ -52,7 +50,6 @@ export const CYCLE_REFERENCE_COUNT = 'cycleReferenceCount'; export const EVERY_N_FUNCTION_EXECUTION_PAUSE = 100; -@OnLifecycle(LifecycleStages.Rendered, CalculateFormulaService) export class CalculateFormulaService extends Disposable { private readonly _executionStartListener$ = new Subject(); diff --git a/packages/facade/src/apis/__tests__/create-test-bed.ts b/packages/facade/src/apis/__tests__/create-test-bed.ts index 500128a1263..bae3cf55938 100644 --- a/packages/facade/src/apis/__tests__/create-test-bed.ts +++ b/packages/facade/src/apis/__tests__/create-test-bed.ts @@ -204,6 +204,15 @@ export function createFacadeTestBed(workbookData?: IWorkbookData, dependencies?: }); dependencies?.forEach((d) => injector.add(d)); + + this._injector.get(SheetInterceptorService); + this._injector.get(WorkbookPermissionService); + this._injector.get(WorksheetPermissionService); + this._injector.get(ConditionalFormattingService); + } + + override onReady(): void { + this._injector.get(SheetsRenderService); } } diff --git a/packages/facade/src/apis/docs/__tests__/create-test-bed.ts b/packages/facade/src/apis/docs/__tests__/create-test-bed.ts index 6eea2c57643..a897760bc62 100644 --- a/packages/facade/src/apis/docs/__tests__/create-test-bed.ts +++ b/packages/facade/src/apis/docs/__tests__/create-test-bed.ts @@ -88,6 +88,11 @@ export function createTestBed(documentConfig?: IDocumentData, dependencies?: Dep renderManagerService.registerRenderModule(UniverInstanceType.UNIVER_DOC, [DocSkeletonManagerService] as Dependency); renderManagerService.registerRenderModule(UniverInstanceType.UNIVER_DOC, [DocIMEInputManagerService] as Dependency); } + + override onReady(): void { + this._injector.get(DocStateChangeManagerService); + this._injector.get(DocsRenderService); + } } injector.get(LocaleService).load({ zhCN, enUS }); diff --git a/packages/facade/src/apis/sheets/__tests__/f-range.spec.ts b/packages/facade/src/apis/sheets/__tests__/f-range.spec.ts index 6cf24ff8593..cec1b0e523d 100644 --- a/packages/facade/src/apis/sheets/__tests__/f-range.spec.ts +++ b/packages/facade/src/apis/sheets/__tests__/f-range.spec.ts @@ -16,14 +16,14 @@ /* eslint-disable ts/no-non-null-asserted-optional-chain */ +import type { ICellData, Injector, IRange, IStyleData, Nullable } from '@univerjs/core'; import { DataValidationType, HorizontalAlign, ICommandService, IUniverInstanceService, VerticalAlign, WrapStrategy } from '@univerjs/core'; import { FormulaDataModel } from '@univerjs/engine-formula'; import { AddWorksheetMergeCommand, SetHorizontalTextAlignCommand, SetRangeValuesCommand, SetRangeValuesMutation, SetStyleCommand, SetTextWrapCommand, SetVerticalTextAlignCommand } from '@univerjs/sheets'; -import { AddSheetDataValidationCommand } from '@univerjs/sheets-data-validation'; +import { AddSheetDataValidationCommand } from '@univerjs/sheets-data-validation'; import { ClearSheetsFilterCriteriaCommand, RemoveSheetFilterCommand, SetSheetFilterRangeCommand, SetSheetsFilterCriteriaCommand } from '@univerjs/sheets-filter-ui'; import { beforeEach, describe, expect, it } from 'vitest'; -import type { ICellData, Injector, IRange, IStyleData, Nullable } from '@univerjs/core'; import { createFacadeTestBed } from '../../__tests__/create-test-bed'; import { FUniver } from '../../facade'; diff --git a/packages/facade/src/apis/sheets/f-formula.ts b/packages/facade/src/apis/sheets/f-formula.ts index b93ad22aa82..246b7efd603 100644 --- a/packages/facade/src/apis/sheets/f-formula.ts +++ b/packages/facade/src/apis/sheets/f-formula.ts @@ -80,6 +80,21 @@ export class FFormula { }); } + onCalculationEnd(): Promise { + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + reject(new Error('Calculation end timeout')); + }, 30_000); + + const disposable = this.calculationEnd(() => { + clearTimeout(timer); + disposable.dispose(); + + resolve(); + }); + }); + } + /** * Listening calculation processing. */ diff --git a/packages/find-replace/src/controllers/find-replace.controller.ts b/packages/find-replace/src/controllers/find-replace.controller.ts index fefa2fe755e..008ea6bced1 100644 --- a/packages/find-replace/src/controllers/find-replace.controller.ts +++ b/packages/find-replace/src/controllers/find-replace.controller.ts @@ -22,9 +22,7 @@ import { Inject, Injector, IUniverInstanceService, - LifecycleStages, LocaleService, - OnLifecycle, RxDisposable, toDisposable, } from '@univerjs/core'; @@ -37,6 +35,7 @@ import { ComponentManager, } from '@univerjs/ui'; import { takeUntil } from 'rxjs'; +import { ReplaceAllMatchesCommand, ReplaceCurrentMatchCommand } from '../commands/commands/replace.command'; import { GoToNextMatchOperation, GoToPreviousMatchOperation, @@ -45,7 +44,6 @@ import { } from '../commands/operations/find-replace.operation'; import { IFindReplaceService } from '../services/find-replace.service'; import { FindReplaceDialog } from '../views/dialog/FindReplaceDialog'; -import { ReplaceAllMatchesCommand, ReplaceCurrentMatchCommand } from '../commands/commands/replace.command'; import { GoToNextFindMatchShortcutItem, GoToPreviousFindMatchShortcutItem, @@ -61,7 +59,6 @@ const FIND_REPLACE_PANEL_WIDTH = 350; const FIND_REPLACE_PANEL_RIGHT_PADDING = 20; const FIND_REPLACE_PANEL_TOP_PADDING = -90; -@OnLifecycle(LifecycleStages.Rendered, FindReplaceController) export class FindReplaceController extends RxDisposable { constructor( @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, diff --git a/packages/find-replace/src/plugin.ts b/packages/find-replace/src/plugin.ts index cd995c07fbc..6c74ffc5631 100644 --- a/packages/find-replace/src/plugin.ts +++ b/packages/find-replace/src/plugin.ts @@ -14,13 +14,13 @@ * limitations under the License. */ +import type { IUniverFindReplaceConfig } from './controllers/config.schema'; import { IConfigService, Plugin } from '@univerjs/core'; -import { type Dependency, Inject, Injector } from '@univerjs/core'; +import { type Dependency, Inject, Injector } from '@univerjs/core'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { FindReplaceController } from './controllers/find-replace.controller'; import { FindReplaceService, IFindReplaceService } from './services/find-replace.service'; -import type { IUniverFindReplaceConfig } from './controllers/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; const PLUGIN_NAME = 'UNIVER_FIND_REPLACE_PLUGIN'; @@ -43,10 +43,10 @@ export class UniverFindReplacePlugin extends Plugin { ([ [FindReplaceController], [IFindReplaceService, { useClass: FindReplaceService }], - ] as Dependency[]).forEach( - (d) => { - this._injector.add(d); - } - ); + ] as Dependency[]).forEach((d) => this._injector.add(d)); + } + + override onRendered(): void { + this._injector.get(FindReplaceController); } } diff --git a/packages/rpc/src/controllers/data-sync/data-sync-primary.controller.ts b/packages/rpc/src/controllers/data-sync/data-sync-primary.controller.ts index 5853c97e338..3a150cd3e7d 100644 --- a/packages/rpc/src/controllers/data-sync/data-sync-primary.controller.ts +++ b/packages/rpc/src/controllers/data-sync/data-sync-primary.controller.ts @@ -15,21 +15,18 @@ */ import type { IDisposable, IMutation, IMutationInfo, Workbook } from '@univerjs/core'; +import type { IRemoteSyncMutationOptions } from '../../services/remote-instance/remote-instance.service'; import { CommandType, ICommandService, Inject, Injector, IUniverInstanceService, - LifecycleStages, - OnLifecycle, RxDisposable, toDisposable, UniverInstanceType, } from '@univerjs/core'; import { takeUntil } from 'rxjs/operators'; - -import type { IRemoteSyncMutationOptions } from '../../services/remote-instance/remote-instance.service'; import { IRemoteInstanceService, IRemoteSyncService, @@ -45,7 +42,6 @@ import { fromModule, toModule } from '../../services/rpc/rpc.service'; * * Note that only spreadsheets will be synced to the remote calculation instance by default. */ -@OnLifecycle(LifecycleStages.Starting, DataSyncPrimaryController) export class DataSyncPrimaryController extends RxDisposable { private _remoteInstanceService!: IRemoteInstanceService; diff --git a/packages/rpc/src/controllers/data-sync/data-sync-replica.controller.ts b/packages/rpc/src/controllers/data-sync/data-sync-replica.controller.ts index 3f0816b8fd0..9bccd8d6529 100644 --- a/packages/rpc/src/controllers/data-sync/data-sync-replica.controller.ts +++ b/packages/rpc/src/controllers/data-sync/data-sync-replica.controller.ts @@ -15,9 +15,8 @@ */ import type { IMutationInfo } from '@univerjs/core'; -import { CommandType, Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; - import type { IRemoteSyncMutationOptions } from '../../services/remote-instance/remote-instance.service'; +import { CommandType, Disposable, ICommandService, Inject, Injector } from '@univerjs/core'; import { IRemoteInstanceService, IRemoteSyncService, @@ -31,7 +30,6 @@ import { fromModule, toModule } from '../../services/rpc/rpc.service'; * This controller is responsible for syncing data from the worker thread to * the primary thread. */ -@OnLifecycle(LifecycleStages.Starting, DataSyncReplicaController) export class DataSyncReplicaController extends Disposable { private _remoteSyncService!: IRemoteSyncService; diff --git a/packages/rpc/src/plugin.ts b/packages/rpc/src/plugin.ts index 41969d4d1f0..43ec115ac88 100644 --- a/packages/rpc/src/plugin.ts +++ b/packages/rpc/src/plugin.ts @@ -14,9 +14,17 @@ * limitations under the License. */ -import { IConfigService, Inject, Injector, Plugin } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; - +import type { + IUniverRPCMainThreadConfig, + IUniverRPCWorkerThreadConfig, +} from './controllers/config.schema'; +import { IConfigService, Inject, Injector, Plugin } from '@univerjs/core'; +import { + defaultPluginMainThreadConfig, + defaultPluginWorkerThreadConfig, + PLUGIN_CONFIG_KEY_MAIN_THREAD, PLUGIN_CONFIG_KEY_WORKER_THREAD, +} from './controllers/config.schema'; import { DataSyncPrimaryController } from './controllers/data-sync/data-sync-primary.controller'; import { DataSyncReplicaController } from './controllers/data-sync/data-sync-replica.controller'; import { @@ -30,14 +38,6 @@ import { createWebWorkerMessagePortOnMain, createWebWorkerMessagePortOnWorker, } from './services/rpc/implementations/web-worker-rpc.service'; -import type { - IUniverRPCMainThreadConfig, - IUniverRPCWorkerThreadConfig } from './controllers/config.schema'; -import { - defaultPluginMainThreadConfig, - defaultPluginWorkerThreadConfig, - PLUGIN_CONFIG_KEY_MAIN_THREAD, PLUGIN_CONFIG_KEY_WORKER_THREAD, -} from './controllers/config.schema'; /** * This plugin is used to register the RPC services on the main thread. It diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.auto-fill.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.auto-fill.controller.ts index 91b9ef0efa3..e8094b43691 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.auto-fill.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.auto-fill.controller.ts @@ -15,24 +15,20 @@ */ import type { IMutationInfo, IRange, Workbook } from '@univerjs/core'; -import { Disposable, Inject, Injector, IUniverInstanceService, LifecycleStages, ObjectMatrix, OnLifecycle, Range, Rectangle, UniverInstanceType } from '@univerjs/core'; -import { createTopMatrixFromMatrix, findAllRectangle } from '@univerjs/sheets'; - +import type { IDeleteConditionalRuleMutationParams, ISetConditionalRuleMutationParams } from '@univerjs/sheets-conditional-formatting'; import type { IDiscreteRange, ISheetAutoFillHook } from '@univerjs/sheets-ui'; -import { APPLY_TYPE, getAutoFillRepeatRange, IAutoFillService, virtualizeDiscreteRanges } from '@univerjs/sheets-ui'; +import { Disposable, Inject, Injector, IUniverInstanceService, ObjectMatrix, Range, Rectangle, UniverInstanceType } from '@univerjs/core'; +import { createTopMatrixFromMatrix, findAllRectangle } from '@univerjs/sheets'; import { ConditionalFormattingRuleModel, ConditionalFormattingViewModel, DeleteConditionalRuleMutation, DeleteConditionalRuleMutationUndoFactory, SetConditionalRuleMutation, setConditionalRuleMutationUndoFactory, SHEET_CONDITIONAL_FORMATTING_PLUGIN } from '@univerjs/sheets-conditional-formatting'; -import type { IDeleteConditionalRuleMutationParams, ISetConditionalRuleMutationParams } from '@univerjs/sheets-conditional-formatting'; +import { APPLY_TYPE, getAutoFillRepeatRange, IAutoFillService, virtualizeDiscreteRanges } from '@univerjs/sheets-ui'; -@OnLifecycle(LifecycleStages.Rendered, ConditionalFormattingAutoFillController) export class ConditionalFormattingAutoFillController extends Disposable { constructor( @Inject(Injector) private _injector: Injector, @Inject(IUniverInstanceService) private _univerInstanceService: IUniverInstanceService, @Inject(IAutoFillService) private _autoFillService: IAutoFillService, @Inject(ConditionalFormattingRuleModel) private _conditionalFormattingRuleModel: ConditionalFormattingRuleModel, - @Inject(ConditionalFormattingViewModel) private _conditionalFormattingViewModel: ConditionalFormattingViewModel - ) { super(); diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.clear.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.clear.controller.ts index 050bfa32b62..47019f0e828 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.clear.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.clear.controller.ts @@ -14,13 +14,12 @@ * limitations under the License. */ -import { Disposable, Inject, Injector, IUniverInstanceService, LifecycleStages, OnLifecycle, Rectangle, UniverInstanceType } from '@univerjs/core'; import type { IMutationInfo, IRange, Workbook } from '@univerjs/core'; +import type { IConditionalFormattingRuleConfig, IConditionFormattingRule, IDeleteConditionalRuleMutationParams, ISetConditionalRuleMutationParams } from '@univerjs/sheets-conditional-formatting'; +import { Disposable, Inject, Injector, IUniverInstanceService, Rectangle, UniverInstanceType } from '@univerjs/core'; import { ClearSelectionAllCommand, ClearSelectionFormatCommand, RangeMergeUtil, SheetInterceptorService, SheetsSelectionsService } from '@univerjs/sheets'; import { ConditionalFormattingRuleModel, DeleteConditionalRuleMutation, DeleteConditionalRuleMutationUndoFactory, SetConditionalRuleMutation, setConditionalRuleMutationUndoFactory } from '@univerjs/sheets-conditional-formatting'; -import type { IConditionalFormattingRuleConfig, IConditionFormattingRule, IDeleteConditionalRuleMutationParams, ISetConditionalRuleMutationParams } from '@univerjs/sheets-conditional-formatting'; -@OnLifecycle(LifecycleStages.Rendered, ConditionalFormattingClearController) export class ConditionalFormattingClearController extends Disposable { constructor( @Inject(Injector) private _injector: Injector, diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.copy-paste.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.copy-paste.controller.ts index a5129ce6a00..693f6c001bf 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.copy-paste.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.copy-paste.controller.ts @@ -15,14 +15,14 @@ */ import type { IRange, Nullable, Workbook } from '@univerjs/core'; +import type { IAddConditionalRuleMutationParams, IConditionalFormattingRuleConfig, IConditionFormattingRule, IDeleteConditionalRuleMutationParams, ISetConditionalRuleMutationParams } from '@univerjs/sheets-conditional-formatting'; +import type { IDiscreteRange } from '@univerjs/sheets-ui'; import { Disposable, Inject, Injector, IUniverInstanceService, - LifecycleStages, ObjectMatrix, - OnLifecycle, Range, Rectangle, Tools, @@ -31,12 +31,9 @@ import { import { createTopMatrixFromMatrix, findAllRectangle, } from '@univerjs/sheets'; -import type { IDiscreteRange } from '@univerjs/sheets-ui'; -import { COPY_TYPE, getRepeatRange, ISheetClipboardService, PREDEFINED_HOOK_NAME, rangeToDiscreteRange, virtualizeDiscreteRanges } from '@univerjs/sheets-ui'; import { AddConditionalRuleMutation, AddConditionalRuleMutationUndoFactory, ConditionalFormattingRuleModel, ConditionalFormattingViewModel, DeleteConditionalRuleMutation, DeleteConditionalRuleMutationUndoFactory, SetConditionalRuleMutation, setConditionalRuleMutationUndoFactory, SHEET_CONDITIONAL_FORMATTING_PLUGIN } from '@univerjs/sheets-conditional-formatting'; -import type { IAddConditionalRuleMutationParams, IConditionalFormattingRuleConfig, IConditionFormattingRule, IDeleteConditionalRuleMutationParams, ISetConditionalRuleMutationParams } from '@univerjs/sheets-conditional-formatting'; +import { COPY_TYPE, getRepeatRange, ISheetClipboardService, PREDEFINED_HOOK_NAME, rangeToDiscreteRange, virtualizeDiscreteRanges } from '@univerjs/sheets-ui'; -@OnLifecycle(LifecycleStages.Rendered, ConditionalFormattingCopyPasteController) export class ConditionalFormattingCopyPasteController extends Disposable { private _copyInfo: Nullable<{ matrix: ObjectMatrix; diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.editor.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.editor.controller.ts index 8626b9f06ca..c70d9576129 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.editor.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.editor.controller.ts @@ -18,15 +18,12 @@ import { BuildTextUtils, Disposable, Inject, - LifecycleStages, - OnLifecycle, toDisposable, } from '@univerjs/core'; import { ConditionalFormattingService } from '@univerjs/sheets-conditional-formatting'; import { IEditorBridgeService } from '@univerjs/sheets-ui'; -@OnLifecycle(LifecycleStages.Rendered, ConditionalFormattingEditorController) export class ConditionalFormattingEditorController extends Disposable { constructor( @Inject(IEditorBridgeService) private _editorBridgeService: IEditorBridgeService, diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.i18n.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.i18n.controller.ts index 4200fbfaeec..3e26c8358a2 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.i18n.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.i18n.controller.ts @@ -14,11 +14,9 @@ * limitations under the License. */ -import { Disposable, Inject, LifecycleStages, LocaleService, OnLifecycle } from '@univerjs/core'; - import type { ReactNode } from 'react'; +import { Disposable, Inject, LocaleService } from '@univerjs/core'; -@OnLifecycle(LifecycleStages.Rendered, ConditionalFormattingI18nController) export class ConditionalFormattingI18nController extends Disposable { constructor(@Inject(LocaleService) private _localeService: LocaleService) { super(); diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.menu.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.menu.controller.ts index db33d926d27..544b04c6c0b 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.menu.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.menu.controller.ts @@ -15,11 +15,10 @@ */ import type { IDisposable } from '@univerjs/core'; -import { Disposable, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, Inject, Injector } from '@univerjs/core'; import { IMenuManagerService } from '@univerjs/ui'; import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Ready, ConditionalFormattingMenuController) export class ConditionalFormattingMenuController extends Disposable { private _sidebarDisposable: IDisposable | null = null; diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.painter.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.painter.controller.ts index 57045fb29b7..0a098c37a26 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.painter.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.painter.controller.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { Disposable, Inject, Injector, IUniverInstanceService, LifecycleStages, ObjectMatrix, OnLifecycle, Range, Rectangle, Tools, UniverInstanceType } from '@univerjs/core'; -import { createTopMatrixFromMatrix, findAllRectangle, SheetsSelectionsService } from '@univerjs/sheets'; -import { AddConditionalRuleMutation, AddConditionalRuleMutationUndoFactory, ConditionalFormattingRuleModel, ConditionalFormattingViewModel, DeleteConditionalRuleMutation, DeleteConditionalRuleMutationUndoFactory, SetConditionalRuleMutation, setConditionalRuleMutationUndoFactory, SHEET_CONDITIONAL_FORMATTING_PLUGIN } from '@univerjs/sheets-conditional-formatting'; -import { FormatPainterStatus, IFormatPainterService } from '@univerjs/sheets-ui'; import type { IMutationInfo, IRange, Nullable, Workbook } from '@univerjs/core'; import type { IAddConditionalRuleMutationParams, IDeleteConditionalRuleMutationParams, ISetConditionalRuleMutationParams } from '@univerjs/sheets-conditional-formatting'; import type { IFormatPainterHook } from '@univerjs/sheets-ui'; +import { Disposable, Inject, Injector, IUniverInstanceService, ObjectMatrix, Range, Rectangle, Tools, UniverInstanceType } from '@univerjs/core'; +import { createTopMatrixFromMatrix, findAllRectangle, SheetsSelectionsService } from '@univerjs/sheets'; +import { AddConditionalRuleMutation, AddConditionalRuleMutationUndoFactory, ConditionalFormattingRuleModel, ConditionalFormattingViewModel, DeleteConditionalRuleMutation, DeleteConditionalRuleMutationUndoFactory, SetConditionalRuleMutation, setConditionalRuleMutationUndoFactory, SHEET_CONDITIONAL_FORMATTING_PLUGIN } from '@univerjs/sheets-conditional-formatting'; +import { FormatPainterStatus, IFormatPainterService } from '@univerjs/sheets-ui'; const repeatByRange = (sourceRange: IRange, targetRange: IRange) => { const getRowLength = (range: IRange) => range.endRow - range.startRow + 1; @@ -73,7 +73,6 @@ const repeatByRange = (sourceRange: IRange, targetRange: IRange) => { return repeatList; }; -@OnLifecycle(LifecycleStages.Rendered, ConditionalFormattingPainterController) export class ConditionalFormattingPainterController extends Disposable { private _painterConfig: Nullable<{ unitId: string; subUnitId: string; range: IRange }> = null; constructor( diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.panel.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.panel.controller.ts index 40a9b479d96..9d671e93d6d 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.panel.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.panel.controller.ts @@ -15,13 +15,13 @@ */ import type { IDisposable } from '@univerjs/core'; -import { Disposable, generateRandomId, Inject, Injector, IUniverInstanceService, LifecycleStages, LocaleService, OnLifecycle, UniverInstanceType } from '@univerjs/core'; -import { ComponentManager, ISidebarService } from '@univerjs/ui'; import type { IConditionFormattingRule } from '@univerjs/sheets-conditional-formatting'; +import { Disposable, generateRandomId, Inject, Injector, IUniverInstanceService, LocaleService, UniverInstanceType } from '@univerjs/core'; +import { ComponentManager, ISidebarService } from '@univerjs/ui'; import { ConditionFormattingPanel } from '../components/panel'; const CF_PANEL_KEY = 'sheet.conditional.formatting.panel'; -@OnLifecycle(LifecycleStages.Ready, ConditionalFormattingPanelController) + export class ConditionalFormattingPanelController extends Disposable { private _sidebarDisposable: IDisposable | null = null; diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.permission.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.permission.controller.ts index 05e042db09b..9f75c5367b0 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.permission.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.permission.controller.ts @@ -15,14 +15,12 @@ */ import type { ICommandInfo } from '@univerjs/core'; -import { Disposable, ICommandService, Inject, LifecycleStages, LocaleService, OnLifecycle } from '@univerjs/core'; +import type { IAddCfCommandParams } from '../commands/commands/add-cf.command'; +import { Disposable, ICommandService, Inject, LocaleService } from '@univerjs/core'; import { RangeProtectionPermissionEditPoint, WorkbookEditablePermission, WorksheetEditPermission, WorksheetSetCellStylePermission } from '@univerjs/sheets'; - import { SheetPermissionInterceptorBaseController } from '@univerjs/sheets-ui'; -import type { IAddCfCommandParams } from '../commands/commands/add-cf.command'; import { AddCfCommand } from '../commands/commands/add-cf.command'; -@OnLifecycle(LifecycleStages.Rendered, ConditionalFormattingPermissionController) export class ConditionalFormattingPermissionController extends Disposable { constructor( @Inject(LocaleService) private _localeService: LocaleService, diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.ref-range.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.ref-range.controller.ts index 78c5b6ffc85..783235b26f3 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.ref-range.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.ref-range.controller.ts @@ -15,13 +15,12 @@ */ import type { IRange, Workbook } from '@univerjs/core'; -import { Disposable, Inject, Injector, IUniverInstanceService, LifecycleStages, OnLifecycle, toDisposable, UniverInstanceType } from '@univerjs/core'; import type { EffectRefRangeParams } from '@univerjs/sheets'; +import type { IConditionFormattingRule, IDeleteConditionalRuleMutationParams, ISetConditionalRuleMutationParams } from '@univerjs/sheets-conditional-formatting'; +import { Disposable, Inject, Injector, IUniverInstanceService, toDisposable, UniverInstanceType } from '@univerjs/core'; import { handleDefaultRangeChangeWithEffectRefCommands, RefRangeService } from '@univerjs/sheets'; import { ConditionalFormattingRuleModel, DeleteConditionalRuleMutation, DeleteConditionalRuleMutationUndoFactory, isRangesEqual, SetConditionalRuleMutation, setConditionalRuleMutationUndoFactory } from '@univerjs/sheets-conditional-formatting'; -import type { IConditionFormattingRule, IDeleteConditionalRuleMutationParams, ISetConditionalRuleMutationParams } from '@univerjs/sheets-conditional-formatting'; -@OnLifecycle(LifecycleStages.Rendered, SheetsCfRefRangeController) export class SheetsCfRefRangeController extends Disposable { constructor( @Inject(ConditionalFormattingRuleModel) private _conditionalFormattingRuleModel: ConditionalFormattingRuleModel, diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/cf.render.controller.ts b/packages/sheets-conditional-formatting-ui/src/controllers/cf.render.controller.ts index bac47256f73..69a0073fbfb 100644 --- a/packages/sheets-conditional-formatting-ui/src/controllers/cf.render.controller.ts +++ b/packages/sheets-conditional-formatting-ui/src/controllers/cf.render.controller.ts @@ -14,16 +14,15 @@ * limitations under the License. */ -import { Disposable, Inject, InterceptorEffectEnum, IUniverInstanceService, LifecycleStages, OnLifecycle, Range, UniverInstanceType } from '@univerjs/core'; +import type { ICellDataForSheetInterceptor, Workbook } from '@univerjs/core'; +import type { IConditionalFormattingCellData, IConditionFormattingRule } from '@univerjs/sheets-conditional-formatting'; +import { Disposable, Inject, InterceptorEffectEnum, IUniverInstanceService, Range, UniverInstanceType } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; import { INTERCEPTOR_POINT, SheetInterceptorService } from '@univerjs/sheets'; import { ConditionalFormattingRuleModel, ConditionalFormattingService, ConditionalFormattingViewModel, DEFAULT_PADDING, DEFAULT_WIDTH } from '@univerjs/sheets-conditional-formatting'; import { SheetSkeletonManagerService } from '@univerjs/sheets-ui'; import { bufferTime, filter } from 'rxjs/operators'; -import type { ICellDataForSheetInterceptor, Workbook } from '@univerjs/core'; -import type { IConditionalFormattingCellData, IConditionFormattingRule } from '@univerjs/sheets-conditional-formatting'; -@OnLifecycle(LifecycleStages.Starting, SheetsCfRenderController) export class SheetsCfRenderController extends Disposable { /** * When a set operation is triggered multiple times over a short period of time, it may result in some callbacks not being disposed,and caused a render cache exception. diff --git a/packages/sheets-conditional-formatting-ui/src/plugin.ts b/packages/sheets-conditional-formatting-ui/src/plugin.ts index 39e350bb271..2af214f4513 100644 --- a/packages/sheets-conditional-formatting-ui/src/plugin.ts +++ b/packages/sheets-conditional-formatting-ui/src/plugin.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import type { IUniverSheetsConditionalFormattingUIConfig } from './controllers/config.schema'; import { DependentOn, ICommandService, @@ -39,8 +40,8 @@ import { ClearWorksheetCfCommand } from './commands/commands/clear-worksheet-cf. import { DeleteCfCommand } from './commands/commands/delete-cf.command'; import { MoveCfCommand } from './commands/commands/move-cf.command'; import { SetCfCommand } from './commands/commands/set-cf.command'; -import { OpenConditionalFormattingOperator } from './commands/operations/open-conditional-formatting-panel'; +import { OpenConditionalFormattingOperator } from './commands/operations/open-conditional-formatting-panel'; import { ConditionalFormattingAutoFillController } from './controllers/cf.auto-fill.controller'; import { ConditionalFormattingClearController } from './controllers/cf.clear.controller'; import { ConditionalFormattingCopyPasteController } from './controllers/cf.copy-paste.controller'; @@ -53,7 +54,6 @@ import { ConditionalFormattingPermissionController } from './controllers/cf.perm import { SheetsCfRefRangeController } from './controllers/cf.ref-range.controller'; import { SheetsCfRenderController } from './controllers/cf.render.controller'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; -import type { IUniverSheetsConditionalFormattingUIConfig } from './controllers/config.schema'; @DependentOn(UniverSheetsConditionalFormattingPlugin) export class UniverSheetsConditionalFormattingUIPlugin extends Plugin { @@ -90,6 +90,26 @@ export class UniverSheetsConditionalFormattingUIPlugin extends Plugin { this._injector.add([ConditionalFormattingPainterController]); } + override onStarting(): void { + this._injector.get(SheetsCfRenderController); + } + + override onReady(): void { + this._injector.get(ConditionalFormattingMenuController); + this._injector.get(ConditionalFormattingPanelController); + } + + override onRendered(): void { + this._injector.get(ConditionalFormattingAutoFillController); + this._injector.get(ConditionalFormattingClearController); + this._injector.get(ConditionalFormattingCopyPasteController); + this._injector.get(ConditionalFormattingEditorController); + this._injector.get(ConditionalFormattingI18nController); + this._injector.get(ConditionalFormattingPainterController); + this._injector.get(ConditionalFormattingPermissionController); + this._injector.get(SheetsCfRefRangeController); + } + private _initCommand() { [ AddAverageCfCommand, diff --git a/packages/sheets-conditional-formatting/src/plugin.ts b/packages/sheets-conditional-formatting/src/plugin.ts index 2c203a3fce0..18a4187b2c5 100644 --- a/packages/sheets-conditional-formatting/src/plugin.ts +++ b/packages/sheets-conditional-formatting/src/plugin.ts @@ -14,24 +14,23 @@ * limitations under the License. */ -import { ICommandService, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; +import type { IUniverSheetsConditionalFormattingConfig } from './controllers/config.schema'; +import { ICommandService, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { SHEET_CONDITIONAL_FORMATTING_PLUGIN } from './base/const'; -import { ConditionalFormattingService } from './services/conditional-formatting.service'; -import { ConditionalFormattingRuleModel } from './models/conditional-formatting-rule-model'; -import { ConditionalFormattingViewModel } from './models/conditional-formatting-view-model'; import { AddConditionalRuleMutation } from './commands/mutations/add-conditional-rule.mutation'; import { DeleteConditionalRuleMutation } from './commands/mutations/delete-conditional-rule.mutation'; -import { SetConditionalRuleMutation } from './commands/mutations/set-conditional-rule.mutation'; - -import { MoveConditionalRuleMutation } from './commands/mutations/move-conditional-rule.mutation'; -import { ConditionalFormattingFormulaService } from './services/conditional-formatting-formula.service'; import { ConditionalFormattingFormulaMarkDirty } from './commands/mutations/formula-mark-dirty.mutation'; -import type { IUniverSheetsConditionalFormattingConfig } from './controllers/config.schema'; +import { MoveConditionalRuleMutation } from './commands/mutations/move-conditional-rule.mutation'; +import { SetConditionalRuleMutation } from './commands/mutations/set-conditional-rule.mutation'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY, } from './controllers/config.schema'; +import { ConditionalFormattingRuleModel } from './models/conditional-formatting-rule-model'; +import { ConditionalFormattingViewModel } from './models/conditional-formatting-view-model'; +import { ConditionalFormattingService } from './services/conditional-formatting.service'; +import { ConditionalFormattingFormulaService } from './services/conditional-formatting-formula.service'; export class UniverSheetsConditionalFormattingPlugin extends Plugin { static override pluginName = SHEET_CONDITIONAL_FORMATTING_PLUGIN; @@ -68,4 +67,8 @@ export class UniverSheetsConditionalFormattingPlugin extends Plugin { this._commandService.registerCommand(m); }); } + + override onStarting(): void { + this._injector.get(ConditionalFormattingService); + } } diff --git a/packages/sheets-conditional-formatting/src/services/conditional-formatting-formula.service.ts b/packages/sheets-conditional-formatting/src/services/conditional-formatting-formula.service.ts index bb7cffc81ed..3800b394823 100644 --- a/packages/sheets-conditional-formatting/src/services/conditional-formatting-formula.service.ts +++ b/packages/sheets-conditional-formatting/src/services/conditional-formatting-formula.service.ts @@ -15,21 +15,21 @@ */ import type { ICellData, Nullable, ObjectMatrix } from '@univerjs/core'; -import { BooleanNumber, CellValueType, Disposable, ICommandService, Inject, Injector, RefAlias, toDisposable, Tools } from '@univerjs/core'; import type { IRemoveOtherFormulaMutationParams, ISetFormulaCalculationResultMutation, ISetOtherFormulaMutationParams } from '@univerjs/engine-formula'; +import type { IConditionalFormattingFormulaMarkDirtyParams } from '../commands/mutations/formula-mark-dirty.mutation'; +import { BooleanNumber, CellValueType, Disposable, ICommandService, Inject, Injector, RefAlias, toDisposable, Tools } from '@univerjs/core'; + import { IActiveDirtyManagerService, RemoveOtherFormulaMutation, SetFormulaCalculationResultMutation, SetOtherFormulaMutation, } from '@univerjs/engine-formula'; - import { Subject } from 'rxjs'; import { bufferTime, filter, map } from 'rxjs/operators'; -import type { IConditionalFormattingFormulaMarkDirtyParams } from '../commands/mutations/formula-mark-dirty.mutation'; import { ConditionalFormattingFormulaMarkDirty } from '../commands/mutations/formula-mark-dirty.mutation'; -import { ConditionalFormattingViewModel } from '../models/conditional-formatting-view-model'; import { ConditionalFormattingRuleModel } from '../models/conditional-formatting-rule-model'; +import { ConditionalFormattingViewModel } from '../models/conditional-formatting-view-model'; import { ConditionalFormattingService } from './conditional-formatting.service'; // eslint-disable-next-line ts/consistent-type-definitions diff --git a/packages/sheets-conditional-formatting/src/services/conditional-formatting.service.ts b/packages/sheets-conditional-formatting/src/services/conditional-formatting.service.ts index b5cba6c2de3..8208aac0735 100644 --- a/packages/sheets-conditional-formatting/src/services/conditional-formatting.service.ts +++ b/packages/sheets-conditional-formatting/src/services/conditional-formatting.service.ts @@ -20,7 +20,7 @@ import type { IDeleteConditionalRuleMutationParams } from '../commands/mutations import type { IConditionFormattingRule, IHighlightCell, IRuleModelJson } from '../models/type'; import type { IDataBarCellData, IDataBarRenderParams, IIconSetCellData, IIconSetRenderParams } from '../render/type'; import type { ICalculateUnit, IContext } from './calculate-unit/type'; -import { createInterceptorKey, Disposable, ICommandService, Inject, Injector, InterceptorManager, IResourceManagerService, IUniverInstanceService, LifecycleStages, ObjectMatrix, OnLifecycle, Rectangle, Tools, UniverInstanceType } from '@univerjs/core'; +import { createInterceptorKey, Disposable, ICommandService, Inject, Injector, InterceptorManager, IResourceManagerService, IUniverInstanceService, ObjectMatrix, Rectangle, Tools, UniverInstanceType } from '@univerjs/core'; import { InsertColMutation, InsertRowMutation, MoveColsMutation, MoveRangeMutation, MoveRowsMutation, RemoveColMutation, RemoveRowMutation, RemoveSheetCommand, ReorderRangeMutation, SetRangeValuesMutation, SheetInterceptorService } from '@univerjs/sheets'; import { Subject } from 'rxjs'; import { bufferTime, filter, map } from 'rxjs/operators'; @@ -39,7 +39,7 @@ type ComputeStatus = 'computing' | 'end' | 'error'; interface IComputeCache { status: ComputeStatus }; const beforeUpdateRuleResult = createInterceptorKey<{ subUnitId: string; unitId: string; cfId: string }, undefined>('conditional-formatting-before-update-rule-result'); -@OnLifecycle(LifecycleStages.Starting, ConditionalFormattingService) + export class ConditionalFormattingService extends Disposable { // >> private _ruleCacheMap: Map>> = new Map(); diff --git a/packages/sheets-data-validation-ui/src/controllers/dv-alert.controller.ts b/packages/sheets-data-validation-ui/src/controllers/dv-alert.controller.ts index ab8a51bd7b2..bf07a91249e 100644 --- a/packages/sheets-data-validation-ui/src/controllers/dv-alert.controller.ts +++ b/packages/sheets-data-validation-ui/src/controllers/dv-alert.controller.ts @@ -16,14 +16,13 @@ import type { Workbook } from '@univerjs/core'; import type { BaseDataValidator } from '@univerjs/data-validation'; -import { DataValidationStatus, Disposable, Inject, IUniverInstanceService, LifecycleStages, LocaleService, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import { DataValidationStatus, Disposable, Inject, IUniverInstanceService, LocaleService, UniverInstanceType } from '@univerjs/core'; import { CellAlertManagerService, CellAlertType, HoverManagerService } from '@univerjs/sheets-ui'; import { IZenZoneService } from '@univerjs/ui'; import { debounceTime } from 'rxjs'; const ALERT_KEY = 'SHEET_DATA_VALIDATION_ALERT'; -@OnLifecycle(LifecycleStages.Rendered, DataValidationAlertController) export class DataValidationAlertController extends Disposable { constructor( @Inject(HoverManagerService) private readonly _hoverManagerService: HoverManagerService, diff --git a/packages/sheets-data-validation-ui/src/controllers/dv-auto-fill.controller.ts b/packages/sheets-data-validation-ui/src/controllers/dv-auto-fill.controller.ts index e8bd1081975..0535e65f8a7 100644 --- a/packages/sheets-data-validation-ui/src/controllers/dv-auto-fill.controller.ts +++ b/packages/sheets-data-validation-ui/src/controllers/dv-auto-fill.controller.ts @@ -15,13 +15,12 @@ */ import type { IAutoFillLocation, ISheetAutoFillHook } from '@univerjs/sheets-ui'; -import { DataValidationType, Disposable, Inject, Injector, LifecycleStages, ObjectMatrix, OnLifecycle, queryObjectMatrix, Range, Rectangle } from '@univerjs/core'; +import { DataValidationType, Disposable, Inject, Injector, ObjectMatrix, queryObjectMatrix, Range, Rectangle } from '@univerjs/core'; import { DATA_VALIDATION_PLUGIN_NAME, getDataValidationDiffMutations, SheetDataValidationModel } from '@univerjs/sheets-data-validation'; import { APPLY_TYPE, getAutoFillRepeatRange, IAutoFillService, virtualizeDiscreteRanges } from '@univerjs/sheets-ui'; // TODO: adjust imports -@OnLifecycle(LifecycleStages.Ready, DataValidationAutoFillController) export class DataValidationAutoFillController extends Disposable { constructor( @IAutoFillService private readonly _autoFillService: IAutoFillService, diff --git a/packages/sheets-data-validation-ui/src/controllers/dv-copy-paste.controller.ts b/packages/sheets-data-validation-ui/src/controllers/dv-copy-paste.controller.ts index cedf33ca2bb..7a461f1c750 100644 --- a/packages/sheets-data-validation-ui/src/controllers/dv-copy-paste.controller.ts +++ b/packages/sheets-data-validation-ui/src/controllers/dv-copy-paste.controller.ts @@ -16,11 +16,10 @@ import type { IRange, ISheetDataValidationRule, Nullable } from '@univerjs/core'; import type { IDiscreteRange } from '@univerjs/sheets-ui'; -import { Disposable, Inject, Injector, LifecycleStages, ObjectMatrix, OnLifecycle, queryObjectMatrix, Rectangle } from '@univerjs/core'; +import { Disposable, Inject, Injector, ObjectMatrix, queryObjectMatrix, Rectangle } from '@univerjs/core'; import { DATA_VALIDATION_PLUGIN_NAME, getDataValidationDiffMutations, SheetDataValidationModel } from '@univerjs/sheets-data-validation'; import { COPY_TYPE, getRepeatRange, ISheetClipboardService, PREDEFINED_HOOK_NAME, rangeToDiscreteRange, virtualizeDiscreteRanges } from '@univerjs/sheets-ui'; -@OnLifecycle(LifecycleStages.Ready, DataValidationCopyPasteController) export class DataValidationCopyPasteController extends Disposable { private _copyInfo: Nullable<{ matrix: ObjectMatrix; diff --git a/packages/sheets-data-validation-ui/src/controllers/dv-permission.controller.ts b/packages/sheets-data-validation-ui/src/controllers/dv-permission.controller.ts index 20d33a3022a..d53cb9fde61 100644 --- a/packages/sheets-data-validation-ui/src/controllers/dv-permission.controller.ts +++ b/packages/sheets-data-validation-ui/src/controllers/dv-permission.controller.ts @@ -16,12 +16,11 @@ import type { ICommandInfo } from '@univerjs/core'; import type { IUpdateSheetDataValidationRangeCommandParams } from '@univerjs/sheets-data-validation'; -import { Disposable, ICommandService, Inject, LifecycleStages, LocaleService, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService, Inject, LocaleService } from '@univerjs/core'; import { RangeProtectionPermissionEditPoint, WorkbookEditablePermission, WorksheetEditPermission, WorksheetSetCellStylePermission } from '@univerjs/sheets'; import { AddSheetDataValidationCommand, UpdateSheetDataValidationRangeCommand } from '@univerjs/sheets-data-validation'; import { SheetPermissionInterceptorBaseController } from '@univerjs/sheets-ui'; -@OnLifecycle(LifecycleStages.Ready, DataValidationPermissionController) export class DataValidationPermissionController extends Disposable { constructor( @Inject(LocaleService) private _localeService: LocaleService, diff --git a/packages/sheets-data-validation-ui/src/controllers/dv-reject-input.controller.ts b/packages/sheets-data-validation-ui/src/controllers/dv-reject-input.controller.ts index 93f97d7051e..e5ac5f27a9c 100644 --- a/packages/sheets-data-validation-ui/src/controllers/dv-reject-input.controller.ts +++ b/packages/sheets-data-validation-ui/src/controllers/dv-reject-input.controller.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { DataValidationErrorStyle, Disposable, Inject, LifecycleStages, LocaleService, OnLifecycle } from '@univerjs/core'; +import { DataValidationErrorStyle, Disposable, Inject, LocaleService } from '@univerjs/core'; import { DataValidatorRegistryService } from '@univerjs/data-validation'; import { Button } from '@univerjs/design'; import { getCellValueOrigin, SheetDataValidationModel } from '@univerjs/sheets-data-validation'; @@ -22,7 +22,6 @@ import { IEditorBridgeService } from '@univerjs/sheets-ui'; import { IDialogService } from '@univerjs/ui'; import React from 'react'; -@OnLifecycle(LifecycleStages.Ready, DataValidationRejectInputController) export class DataValidationRejectInputController extends Disposable { constructor( @IEditorBridgeService private readonly _editorBridgeService: IEditorBridgeService, diff --git a/packages/sheets-data-validation-ui/src/controllers/dv-render.controller.ts b/packages/sheets-data-validation-ui/src/controllers/dv-render.controller.ts index 2c988d3a037..88f2169901e 100644 --- a/packages/sheets-data-validation-ui/src/controllers/dv-render.controller.ts +++ b/packages/sheets-data-validation-ui/src/controllers/dv-render.controller.ts @@ -15,7 +15,7 @@ */ import type { CellValue, ICellRenderContext, IRange, Nullable } from '@univerjs/core'; -import { DataValidationStatus, DataValidationType, ICommandService, Inject, InterceptorEffectEnum, IUniverInstanceService, LifecycleStages, OnLifecycle, Optional, RxDisposable, sequenceExecute } from '@univerjs/core'; +import { DataValidationStatus, DataValidationType, ICommandService, Inject, InterceptorEffectEnum, IUniverInstanceService, Optional, RxDisposable, sequenceExecute } from '@univerjs/core'; import { DataValidatorRegistryService } from '@univerjs/data-validation'; import { IRenderManagerService } from '@univerjs/engine-render'; import { InterceptCellContentPriority, INTERCEPTOR_POINT, SheetInterceptorService } from '@univerjs/sheets'; @@ -33,7 +33,6 @@ const INVALID_MARK = { }, }; -@OnLifecycle(LifecycleStages.Rendered, SheetsDataValidationRenderController) export class SheetsDataValidationRenderController extends RxDisposable { constructor( @ICommandService private readonly _commandService: ICommandService, @@ -258,7 +257,6 @@ export class SheetsDataValidationRenderController extends RxDisposable { } // The mobile version does not provide the ability to change data validation model. -@OnLifecycle(LifecycleStages.Rendered, SheetsDataValidationMobileRenderController) export class SheetsDataValidationMobileRenderController extends RxDisposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/sheets-data-validation-ui/src/controllers/dv-ui.controller.ts b/packages/sheets-data-validation-ui/src/controllers/dv-ui.controller.ts index f6960a47569..4a337ab7ad1 100644 --- a/packages/sheets-data-validation-ui/src/controllers/dv-ui.controller.ts +++ b/packages/sheets-data-validation-ui/src/controllers/dv-ui.controller.ts @@ -16,7 +16,7 @@ import type { Ctor } from '@univerjs/core'; import type { BaseSheetDataValidatorView } from '../views/validator-views/sheet-validator-view'; -import { Inject, Injector, LifecycleStages, OnLifecycle, RxDisposable } from '@univerjs/core'; +import { Inject, Injector, RxDisposable } from '@univerjs/core'; import { DataValidatorRegistryService } from '@univerjs/data-validation'; import { DataValidationSingle } from '@univerjs/icons'; import { ComponentManager } from '@univerjs/ui'; @@ -36,7 +36,6 @@ import { TextLengthValidatorView } from '../views/validator-views/text-length-va import { WholeValidatorView } from '../views/validator-views/whole-validator-view'; import { DataValidationIcon } from './dv.menu'; -@OnLifecycle(LifecycleStages.Rendered, SheetsDataValidationUIController) export class SheetsDataValidationUIController extends RxDisposable { constructor( @Inject(Injector) private readonly _injector: Injector, diff --git a/packages/sheets-data-validation-ui/src/index.ts b/packages/sheets-data-validation-ui/src/index.ts index 43c875ed236..a436bbaddcb 100644 --- a/packages/sheets-data-validation-ui/src/index.ts +++ b/packages/sheets-data-validation-ui/src/index.ts @@ -16,3 +16,4 @@ export { DATE_DROPDOWN_KEY, LIST_DROPDOWN_KEY } from './views/components'; export { UniverSheetsDataValidationUIPlugin } from './plugin'; +export { UniverSheetsDataValidationMobileUIPlugin } from './mobile-plugin'; diff --git a/packages/sheets-data-validation-ui/src/mobile-plugin.ts b/packages/sheets-data-validation-ui/src/mobile-plugin.ts new file mode 100644 index 00000000000..a3a20df719d --- /dev/null +++ b/packages/sheets-data-validation-ui/src/mobile-plugin.ts @@ -0,0 +1,99 @@ +/** + * Copyright 2023-present DreamNum Inc. + * + * 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 { Dependency } from '@univerjs/core'; +import type { IUniverSheetsDataValidationConfig } from './controllers/config.schema'; +import { ICommandService, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; +import { AddSheetDataValidationAndOpenCommand } from './commands/commands/data-validation-ui.command'; +import { + CloseValidationPanelOperation, + HideDataValidationDropdown, + OpenValidationPanelOperation, + ShowDataValidationDropdown, + ToggleValidationPanelOperation, +} from './commands/operations/data-validation.operation'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; +import { DataValidationAlertController } from './controllers/dv-alert.controller'; +import { DataValidationAutoFillController } from './controllers/dv-auto-fill.controller'; +import { DataValidationCopyPasteController } from './controllers/dv-copy-paste.controller'; +import { DataValidationPermissionController } from './controllers/dv-permission.controller'; +import { SheetsDataValidationRenderController } from './controllers/dv-render.controller'; +import { SheetsDataValidationUIController } from './controllers/dv-ui.controller'; +import { DataValidationPanelService } from './services/data-validation-panel.service'; +import { DataValidationDropdownManagerService } from './services/dropdown-manager.service'; + +const PLUGIN_NAME = 'SHEET_DATA_VALIDATION_UI_PLUGIN'; + +export class UniverSheetsDataValidationMobileUIPlugin extends Plugin { + static override pluginName: string = PLUGIN_NAME; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + private readonly _config: Partial = defaultPluginConfig, + @Inject(Injector) protected readonly _injector: Injector, + @ICommandService private readonly _commandService: ICommandService, + @IConfigService private readonly _configService: IConfigService + ) { + super(); + + // Manage the plugin configuration.. + const { menu, ...rest } = this._config; + if (menu) { + this._configService.setConfig('menu', menu, { merge: true }); + } + this._configService.setConfig(PLUGIN_CONFIG_KEY, rest); + } + + override onStarting(): void { + ([ + [DataValidationPanelService], + [DataValidationDropdownManagerService], + [DataValidationAlertController], + [DataValidationAutoFillController], + [SheetsDataValidationRenderController], + [DataValidationPermissionController], + [DataValidationCopyPasteController], + [SheetsDataValidationUIController], + ] as Dependency[]).forEach((dep) => { + this._injector.add(dep); + }); + + [ + AddSheetDataValidationAndOpenCommand, + ShowDataValidationDropdown, + HideDataValidationDropdown, + CloseValidationPanelOperation, + OpenValidationPanelOperation, + ToggleValidationPanelOperation, + ].forEach((command) => { + this._commandService.registerCommand(command); + }); + } + + override onReady(): void { + this._injector.get(DataValidationCopyPasteController); + this._injector.get(DataValidationPermissionController); + } + + override onRendered(): void { + this._injector.get(SheetsDataValidationUIController); + this._injector.get(SheetsDataValidationRenderController); + } + + override onSteady(): void { + this._injector.get(DataValidationAutoFillController); + } +} diff --git a/packages/sheets-data-validation-ui/src/plugin.ts b/packages/sheets-data-validation-ui/src/plugin.ts index 3cbe6650444..7f04226fef8 100644 --- a/packages/sheets-data-validation-ui/src/plugin.ts +++ b/packages/sheets-data-validation-ui/src/plugin.ts @@ -84,4 +84,19 @@ export class UniverSheetsDataValidationUIPlugin extends Plugin { this._commandService.registerCommand(command); }); } + + override onReady(): void { + this._injector.get(DataValidationCopyPasteController); + this._injector.get(DataValidationPermissionController); + this._injector.get(DataValidationRejectInputController); + } + + override onRendered(): void { + this._injector.get(SheetsDataValidationUIController); + this._injector.get(SheetsDataValidationRenderController); + } + + override onSteady(): void { + this._injector.get(DataValidationAutoFillController); + } } diff --git a/packages/sheets-data-validation/src/controllers/dv-formula.controller.ts b/packages/sheets-data-validation/src/controllers/dv-formula.controller.ts index a52abee8202..f779935e38f 100644 --- a/packages/sheets-data-validation/src/controllers/dv-formula.controller.ts +++ b/packages/sheets-data-validation/src/controllers/dv-formula.controller.ts @@ -15,12 +15,11 @@ */ import type { ICellDataForSheetInterceptor, Nullable, Workbook, Worksheet } from '@univerjs/core'; -import { Disposable, Inject, IPermissionService, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import { Disposable, Inject, IPermissionService, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { deserializeRangeWithSheet, LexerTreeBuilder } from '@univerjs/engine-formula'; -import { type ICellPermission, WorksheetViewPermission } from '@univerjs/sheets'; import { UnitAction } from '@univerjs/protocol'; +import { type ICellPermission, WorksheetViewPermission } from '@univerjs/sheets'; -@OnLifecycle(LifecycleStages.Rendered, DataValidationFormulaController) export class DataValidationFormulaController extends Disposable { constructor( @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, diff --git a/packages/sheets-data-validation/src/controllers/dv-ref-range.controller.ts b/packages/sheets-data-validation/src/controllers/dv-ref-range.controller.ts index 0d92021a527..652613e648d 100644 --- a/packages/sheets-data-validation/src/controllers/dv-ref-range.controller.ts +++ b/packages/sheets-data-validation/src/controllers/dv-ref-range.controller.ts @@ -17,7 +17,7 @@ import type { ISheetDataValidationRule } from '@univerjs/core'; import type { IRemoveDataValidationMutationParams, IUpdateDataValidationMutationParams } from '@univerjs/data-validation'; import type { EffectRefRangeParams } from '@univerjs/sheets'; -import { DataValidationType, Disposable, Inject, Injector, isRangesEqual, LifecycleStages, OnLifecycle, toDisposable } from '@univerjs/core'; +import { DataValidationType, Disposable, Inject, Injector, isRangesEqual, toDisposable } from '@univerjs/core'; import { RemoveDataValidationMutation, UpdateDataValidationMutation, UpdateRuleType } from '@univerjs/data-validation'; import { handleCommonDefaultRangeChangeWithEffectRefCommands, RefRangeService } from '@univerjs/sheets'; import { FormulaRefRangeService } from '@univerjs/sheets-formula'; @@ -26,7 +26,6 @@ import { SheetDataValidationModel } from '../models/sheet-data-validation-model' import { DataValidationCustomFormulaService } from '../services/dv-custom-formula.service'; import { DataValidationFormulaService } from '../services/dv-formula.service'; -@OnLifecycle(LifecycleStages.Starting, DataValidationRefRangeController) export class DataValidationRefRangeController extends Disposable { private _disposableMap: Map void>> = new Map(); diff --git a/packages/sheets-data-validation/src/controllers/dv-sheet.controller.ts b/packages/sheets-data-validation/src/controllers/dv-sheet.controller.ts index 39ca7858f28..8d48287c484 100644 --- a/packages/sheets-data-validation/src/controllers/dv-sheet.controller.ts +++ b/packages/sheets-data-validation/src/controllers/dv-sheet.controller.ts @@ -17,12 +17,11 @@ import type { Workbook } from '@univerjs/core'; import type { IAddDataValidationMutationParams, IRemoveDataValidationMutationParams } from '@univerjs/data-validation'; import type { IRemoveSheetCommandParams } from '@univerjs/sheets'; -import { Disposable, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import { Disposable, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { AddDataValidationMutation, RemoveDataValidationMutation } from '@univerjs/data-validation'; import { RemoveSheetCommand, SheetInterceptorService } from '@univerjs/sheets'; import { SheetDataValidationModel } from '../models/sheet-data-validation-model'; -@OnLifecycle(LifecycleStages.Ready, SheetDataValidationSheetController) export class SheetDataValidationSheetController extends Disposable { constructor( @Inject(SheetInterceptorService) private _sheetInterceptorService: SheetInterceptorService, diff --git a/packages/sheets-data-validation/src/controllers/dv.controller.ts b/packages/sheets-data-validation/src/controllers/dv.controller.ts index a9331f562ac..82973554318 100644 --- a/packages/sheets-data-validation/src/controllers/dv.controller.ts +++ b/packages/sheets-data-validation/src/controllers/dv.controller.ts @@ -15,7 +15,7 @@ */ import type { Workbook } from '@univerjs/core'; -import { Inject, Injector, IUniverInstanceService, LifecycleStages, OnLifecycle, RxDisposable, toDisposable, UniverInstanceType } from '@univerjs/core'; +import { Inject, Injector, IUniverInstanceService, RxDisposable, toDisposable, UniverInstanceType } from '@univerjs/core'; import { DataValidatorRegistryService } from '@univerjs/data-validation'; import { ClearSelectionAllCommand, SheetInterceptorService, SheetsSelectionsService } from '@univerjs/sheets'; import { getDataValidationDiffMutations } from '../commands/commands/data-validation.command'; @@ -25,7 +25,6 @@ import { CustomFormulaValidator } from '../validators/custom-validator'; import { ListMultipleValidator } from '../validators/list-multiple-validator'; import { WholeValidator } from '../validators/whole-validator'; -@OnLifecycle(LifecycleStages.Rendered, DataValidationController) export class DataValidationController extends RxDisposable { constructor( @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, diff --git a/packages/sheets-data-validation/src/models/sheet-data-validation-model.ts b/packages/sheets-data-validation/src/models/sheet-data-validation-model.ts index b44ef3952ff..da0164f1f87 100644 --- a/packages/sheets-data-validation/src/models/sheet-data-validation-model.ts +++ b/packages/sheets-data-validation/src/models/sheet-data-validation-model.ts @@ -17,7 +17,7 @@ import type { DataValidationType, ICellDataForSheetInterceptor, ISheetDataValidationRule, Nullable } from '@univerjs/core'; import type { IRuleChange, IUpdateRulePayload, IValidStatusChange } from '@univerjs/data-validation'; import type { IRemoveSheetMutationParams, ISheetLocation } from '@univerjs/sheets'; -import { DataValidationStatus, Disposable, ICommandService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { DataValidationStatus, Disposable, ICommandService, Inject, IUniverInstanceService } from '@univerjs/core'; import { DataValidationModel, DataValidatorRegistryService, UpdateRuleType } from '@univerjs/data-validation'; import { RemoveSheetMutation } from '@univerjs/sheets'; import { Subject } from 'rxjs'; @@ -27,7 +27,6 @@ import { DataValidationFormulaService } from '../services/dv-formula.service'; import { getCellValueOrigin } from '../utils/get-cell-data-origin'; import { RuleMatrix } from './rule-matrix'; -@OnLifecycle(LifecycleStages.Starting, SheetDataValidationModel) export class SheetDataValidationModel extends Disposable { private readonly _ruleMatrixMap = new Map>(); private readonly _validStatusChange$ = new Subject(); diff --git a/packages/sheets-data-validation/src/plugin.ts b/packages/sheets-data-validation/src/plugin.ts index ee572b71fbe..f2bcc45f229 100644 --- a/packages/sheets-data-validation/src/plugin.ts +++ b/packages/sheets-data-validation/src/plugin.ts @@ -82,5 +82,16 @@ export class UniverSheetsDataValidationPlugin extends Plugin { ].forEach((command) => { this._commandService.registerCommand(command); }); + + this._injector.get(DataValidationRefRangeController); + } + + override onReady(): void { + this._injector.get(SheetDataValidationSheetController); + } + + override onRendered(): void { + this._injector.get(DataValidationController); + this._injector.get(DataValidationFormulaController); } } diff --git a/packages/sheets-drawing-ui/src/controllers/drawing-popup-menu.controller.ts b/packages/sheets-drawing-ui/src/controllers/drawing-popup-menu.controller.ts index 0baf7456769..6c8c61b52b4 100644 --- a/packages/sheets-drawing-ui/src/controllers/drawing-popup-menu.controller.ts +++ b/packages/sheets-drawing-ui/src/controllers/drawing-popup-menu.controller.ts @@ -14,21 +14,20 @@ * limitations under the License. */ -import { connectInjector, FOCUSING_COMMON_DRAWINGS, IContextService, Inject, Injector, IUniverInstanceService, LifecycleStages, OnLifecycle, RxDisposable, toDisposable, UniverInstanceType } from '@univerjs/core'; +import type { IDisposable, Nullable, Workbook } from '@univerjs/core'; +import type { BaseObject, Scene } from '@univerjs/engine-render'; +import { connectInjector, FOCUSING_COMMON_DRAWINGS, IContextService, Inject, Injector, IUniverInstanceService, RxDisposable, toDisposable, UniverInstanceType } from '@univerjs/core'; import { DrawingTypeEnum, IDrawingManagerService } from '@univerjs/drawing'; import { COMPONENT_IMAGE_POPUP_MENU, ImageCropperObject, ImageResetSizeOperation, OpenImageCropOperation } from '@univerjs/drawing-ui'; import { IRenderManagerService } from '@univerjs/engine-render'; import { SheetCanvasPopManagerService } from '@univerjs/sheets-ui'; import { BuiltInUIPart, IUIPartsService } from '@univerjs/ui'; import { takeUntil } from 'rxjs'; -import type { IDisposable, Nullable, Workbook } from '@univerjs/core'; -import type { BaseObject, Scene } from '@univerjs/engine-render'; import { RemoveSheetDrawingCommand } from '../commands/commands/remove-sheet-drawing.command'; import { EditSheetDrawingOperation } from '../commands/operations/edit-sheet-drawing.operation'; import { UploadLoading } from '../views/upload-loading/UploadLoading'; -@OnLifecycle(LifecycleStages.Steady, DrawingPopupMenuController) export class DrawingPopupMenuController extends RxDisposable { private _initImagePopupMenu = new Set(); 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 ef593255359..fa483d97f2d 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 @@ -14,9 +14,9 @@ * limitations under the License. */ -import { Disposable, Inject, LifecycleService, UniverInstanceType } from '@univerjs/core'; -import { IDrawingManagerService } from '@univerjs/drawing'; 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'; @@ -26,7 +26,6 @@ export class SheetsDrawingRenderController extends Disposable implements IRender private _context: IRenderContext, @ISheetDrawingService private readonly _sheetDrawingService: ISheetDrawingService, @IDrawingManagerService private readonly _drawingManagerService: IDrawingManagerService, - @Inject(LifecycleService) private _lifecycleService: LifecycleService, @Inject(ISheetSelectionRenderService) private _sheetSelectionRenderService: ISheetSelectionRenderService, @Inject(SheetSkeletonManagerService) private _sheetSkeletonManagerService: SheetSkeletonManagerService ) { @@ -41,19 +40,17 @@ export class SheetsDrawingRenderController extends Disposable implements IRender private _drawingInitializeListener() { // initialize drawing data and add to sheet canvas - if (this._context.type === UniverInstanceType.UNIVER_SHEET) { - this._sheetDrawingService.initializeNotification(this._context.unitId); - const data = this._sheetDrawingService.getDrawingDataForUnit(this._context.unitId); - for (const subUnit in data) { - const subUnitData = data[subUnit]; - for (const drawingId in subUnitData.data) { - const drawingData = subUnitData.data[drawingId]; - drawingData.transform = drawingPositionToTransform(drawingData.sheetTransform, this._sheetSelectionRenderService, this._sheetSkeletonManagerService); - } + this._sheetDrawingService.initializeNotification(this._context.unitId); + const data = this._sheetDrawingService.getDrawingDataForUnit(this._context.unitId); + for (const subUnit in data) { + const subUnitData = data[subUnit]; + for (const drawingId in subUnitData.data) { + const drawingData = subUnitData.data[drawingId]; + drawingData.transform = drawingPositionToTransform(drawingData.sheetTransform, this._sheetSelectionRenderService, this._sheetSkeletonManagerService); } - - this._drawingManagerService.registerDrawingData(this._context.unitId, this._sheetDrawingService.getDrawingDataForUnit(this._context.unitId)); - this._drawingManagerService.initializeNotification(this._context.unitId); } + + this._drawingManagerService.registerDrawingData(this._context.unitId, this._sheetDrawingService.getDrawingDataForUnit(this._context.unitId)); + this._drawingManagerService.initializeNotification(this._context.unitId); } } 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 2eb5abc3f2f..86b44198e21 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 @@ -15,15 +15,14 @@ */ import type { IMutationInfo, IRange, Nullable } from '@univerjs/core'; -import { Disposable, LifecycleStages, OnLifecycle, Tools } from '@univerjs/core'; import type { IDrawingJsonUndo1 } from '@univerjs/drawing'; -import { IRenderManagerService } from '@univerjs/engine-render'; import type { ISheetDrawing } from '@univerjs/sheets-drawing'; -import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation, SheetDrawingAnchorType } from '@univerjs/sheets-drawing'; import type { IDiscreteRange, ISheetDiscreteRangeLocation } from '@univerjs/sheets-ui'; +import { Disposable, Tools } from '@univerjs/core'; +import { IRenderManagerService } from '@univerjs/engine-render'; +import { DrawingApplyType, ISheetDrawingService, SetDrawingApplyMutation, SheetDrawingAnchorType } from '@univerjs/sheets-drawing'; import { COPY_TYPE, ISheetClipboardService, PREDEFINED_HOOK_NAME, SheetSkeletonManagerService, virtualizeDiscreteRanges } from '@univerjs/sheets-ui'; -@OnLifecycle(LifecycleStages.Ready, SheetsDrawingCopyPasteController) export class SheetsDrawingCopyPasteController extends Disposable { private _copyInfo: Nullable<{ drawings: ISheetDrawing[]; diff --git a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-permission.controller.ts b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-permission.controller.ts index c6b94a5de60..d492bc73b08 100644 --- a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-permission.controller.ts +++ b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-permission.controller.ts @@ -15,13 +15,12 @@ */ import type { Workbook } from '@univerjs/core'; -import { Disposable, Inject, IPermissionService, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType, UserManagerService } from '@univerjs/core'; +import { Disposable, Inject, IPermissionService, IUniverInstanceService, UniverInstanceType, UserManagerService } from '@univerjs/core'; import { IDrawingManagerService } from '@univerjs/drawing'; import { IRenderManagerService, RENDER_CLASS_TYPE } from '@univerjs/engine-render'; import { WorkbookEditablePermission, WorkbookViewPermission, WorksheetEditPermission, WorksheetViewPermission } from '@univerjs/sheets'; import { combineLatest, distinctUntilChanged, filter, map } from 'rxjs'; -@OnLifecycle(LifecycleStages.Rendered, SheetDrawingPermissionController) export class SheetDrawingPermissionController extends Disposable { constructor( @IDrawingManagerService private readonly _drawingManagerService: IDrawingManagerService, diff --git a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-printing.controller.ts b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-printing.controller.ts index be95e9f8324..e095aa50916 100644 --- a/packages/sheets-drawing-ui/src/controllers/sheet-drawing-printing.controller.ts +++ b/packages/sheets-drawing-ui/src/controllers/sheet-drawing-printing.controller.ts @@ -15,13 +15,12 @@ */ import type { IRange } from '@univerjs/core'; -import { Disposable, Inject, LifecycleStages, OnLifecycle, Tools } from '@univerjs/core'; +import { Disposable, Inject, Tools } from '@univerjs/core'; import { DrawingTypeEnum, IDrawingManagerService } from '@univerjs/drawing'; import { DrawingRenderService } from '@univerjs/drawing-ui'; import { IRenderManagerService } from '@univerjs/engine-render'; import { SheetPrintInterceptorService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; -@OnLifecycle(LifecycleStages.Rendered, SheetDrawingPrintingController) export class SheetDrawingPrintingController extends Disposable { constructor( @Inject(SheetPrintInterceptorService) private readonly _sheetPrintInterceptorService: SheetPrintInterceptorService, 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 9f30128d8f6..057700a6b89 100644 --- a/packages/sheets-drawing-ui/src/controllers/sheet-drawing.controller.ts +++ b/packages/sheets-drawing-ui/src/controllers/sheet-drawing.controller.ts @@ -14,33 +14,30 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; -import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; - +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { AddImageSingle } from '@univerjs/icons'; -import { IMAGE_UPLOAD_ICON } from '../views/menu/image.menu'; + +import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; +import { DeleteDrawingsCommand } from '../commands/commands/delete-drawings.command'; +import { GroupSheetDrawingCommand } from '../commands/commands/group-sheet-drawing.command'; import { 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 { SetDrawingArrangeCommand } from '../commands/commands/set-drawing-arrange.command'; import { SetSheetDrawingCommand } from '../commands/commands/set-sheet-drawing.command'; -import { COMPONENT_SHEET_DRAWING_PANEL } from '../views/sheet-image-panel/component-name'; -import { SheetDrawingPanel } from '../views/sheet-image-panel/SheetDrawingPanel'; - +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'; -import { GroupSheetDrawingCommand } from '../commands/commands/group-sheet-drawing.command'; -import { UngroupSheetDrawingCommand } from '../commands/commands/ungroup-sheet-drawing.command'; import { SidebarSheetDrawingOperation } from '../commands/operations/open-drawing-panel.operation'; -import { MoveDrawingsCommand } from '../commands/commands/move-drawings.command'; -import { DeleteDrawingsCommand } from '../commands/commands/delete-drawings.command'; -import { SetDrawingArrangeCommand } from '../commands/commands/set-drawing-arrange.command'; -import { DeleteDrawingsShortcutItem, MoveDrawingDownShortcutItem, MoveDrawingLeftShortcutItem, MoveDrawingRightShortcutItem, MoveDrawingUpShortcutItem } from './shortcuts/drawing.shortcut'; +import { IMAGE_UPLOAD_ICON } from '../views/menu/image.menu'; +import { COMPONENT_SHEET_DRAWING_PANEL } from '../views/sheet-image-panel/component-name'; +import { SheetDrawingPanel } from '../views/sheet-image-panel/SheetDrawingPanel'; import { menuSchema } from './menu.schema'; +import { DeleteDrawingsShortcutItem, MoveDrawingDownShortcutItem, MoveDrawingLeftShortcutItem, MoveDrawingRightShortcutItem, MoveDrawingUpShortcutItem } from './shortcuts/drawing.shortcut'; -@OnLifecycle(LifecycleStages.Rendered, SheetDrawingUIController) export class SheetDrawingUIController extends Disposable { constructor( - @Inject(Injector) private readonly _injector: Injector, @Inject(ComponentManager) private readonly _componentManager: ComponentManager, @IMenuManagerService private readonly _menuManagerService: IMenuManagerService, @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/sheets-drawing-ui/src/plugin.ts b/packages/sheets-drawing-ui/src/plugin.ts index 535b3d1132b..6786acf40e1 100644 --- a/packages/sheets-drawing-ui/src/plugin.ts +++ b/packages/sheets-drawing-ui/src/plugin.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import type { Dependency } from '@univerjs/core'; +import type { IUniverSheetsDrawingUIConfig } from './controllers/config.schema'; import { DependentOn, IConfigService, @@ -22,22 +24,20 @@ import { Plugin, UniverInstanceType, } from '@univerjs/core'; -import type { Dependency } from '@univerjs/core'; -import { UniverDrawingUIPlugin } from '@univerjs/drawing-ui'; -import { UniverSheetsDrawingPlugin } from '@univerjs/sheets-drawing'; import { UniverDrawingPlugin } from '@univerjs/drawing'; +import { UniverDrawingUIPlugin } from '@univerjs/drawing-ui'; import { IRenderManagerService } from '@univerjs/engine-render'; +import { UniverSheetsDrawingPlugin } from '@univerjs/sheets-drawing'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { DrawingPopupMenuController } from './controllers/drawing-popup-menu.controller'; -import { SheetDrawingUpdateController } from './controllers/sheet-drawing-update.controller'; +import { SheetsDrawingRenderController } from './controllers/render-controllers/sheet-drawing.render-controller'; import { SheetDrawingUIController } from './controllers/sheet-drawing.controller'; +import { SheetsDrawingCopyPasteController } from './controllers/sheet-drawing-copy-paste.controller'; +import { SheetDrawingPermissionController } from './controllers/sheet-drawing-permission.controller'; +import { SheetDrawingPrintingController } from './controllers/sheet-drawing-printing.controller'; import { SheetDrawingTransformAffectedController } from './controllers/sheet-drawing-transform-affected.controller'; +import { SheetDrawingUpdateController } from './controllers/sheet-drawing-update.controller'; import { SheetCanvasFloatDomManagerService } from './services/canvas-float-dom-manager.service'; -import { SheetDrawingPrintingController } from './controllers/sheet-drawing-printing.controller'; -import { SheetDrawingPermissionController } from './controllers/sheet-drawing-permission.controller'; -import { SheetsDrawingCopyPasteController } from './controllers/sheet-drawing-copy-paste.controller'; -import { SheetsDrawingRenderController } from './controllers/render-controllers/sheet-drawing.render-controller'; -import type { IUniverSheetsDrawingUIConfig } from './controllers/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; const PLUGIN_NAME = 'SHEET_IMAGE_UI_PLUGIN'; @@ -64,10 +64,24 @@ export class UniverSheetsDrawingUIPlugin extends Plugin { override onStarting(): void { this._initDependencies(); + + this._injector.get(SheetCanvasFloatDomManagerService); + } + + override onReady(): void { + this._injector.get(SheetsDrawingCopyPasteController); } override onRendered(): void { this._registerRenderModules(); + + this._injector.get(SheetDrawingPermissionController); + this._injector.get(SheetDrawingPrintingController); + this._injector.get(SheetDrawingUIController); + } + + override onSteady(): void { + this._injector.get(DrawingPopupMenuController); } private _initDependencies(): void { @@ -79,6 +93,7 @@ export class UniverSheetsDrawingUIPlugin extends Plugin { [SheetDrawingPermissionController], [SheetsDrawingCopyPasteController], ]; + dependencies.forEach((dependency) => this._injector.add(dependency)); } 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 dea9d5f9b2a..bcd8b3c8fb7 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 @@ -21,7 +21,7 @@ import type { ISetFrozenMutationParams } from '@univerjs/sheets'; import type { IFloatDomData, ISheetDrawingPosition, ISheetFloatDom } from '@univerjs/sheets-drawing'; import type { IFloatDomLayout } from '@univerjs/ui'; import type { IInsertDrawingCommandParams } from '../commands/commands/interfaces'; -import { Disposable, DisposableCollection, DrawingTypeEnum, generateRandomId, ICommandService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, DisposableCollection, DrawingTypeEnum, generateRandomId, ICommandService, Inject, IUniverInstanceService } from '@univerjs/core'; import { getDrawingShapeKeyByDrawingSearch, IDrawingManagerService } from '@univerjs/drawing'; import { DRAWING_OBJECT_LAYER_INDEX, IRenderManagerService, Rect, SHEET_VIEWPORT_KEY } from '@univerjs/engine-render'; import { getSheetCommandTarget, SetFrozenMutation } from '@univerjs/sheets'; @@ -174,7 +174,6 @@ export interface ISheetCanvasFloatDomHook { onGetFloatDomProps: (id: string) => Record; } -@OnLifecycle(LifecycleStages.Starting, SheetCanvasFloatDomManagerService) export class SheetCanvasFloatDomManagerService extends Disposable { private _domLayerMap: Map>> = new Map(); private _domLayerInfoMap: Map = new Map(); diff --git a/packages/sheets-drawing/src/controllers/sheet-drawing.controller.ts b/packages/sheets-drawing/src/controllers/sheet-drawing.controller.ts index 75bb1689232..5701f54afd1 100644 --- a/packages/sheets-drawing/src/controllers/sheet-drawing.controller.ts +++ b/packages/sheets-drawing/src/controllers/sheet-drawing.controller.ts @@ -16,14 +16,13 @@ import type { IDrawingSubunitMap } from '@univerjs/drawing'; import type { ISheetDrawing } from '../services/sheet-drawing.service'; -import { Disposable, ICommandService, IResourceManagerService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import { Disposable, ICommandService, IResourceManagerService, UniverInstanceType } from '@univerjs/core'; import { IDrawingManagerService } from '@univerjs/drawing'; import { SetDrawingApplyMutation } from '../commands/mutations/set-drawing-apply.mutation'; import { ISheetDrawingService } from '../services/sheet-drawing.service'; export const SHEET_DRAWING_PLUGIN = 'SHEET_DRAWING_PLUGIN'; -@OnLifecycle(LifecycleStages.Starting, SheetsDrawingLoadController) export class SheetsDrawingLoadController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/sheets-drawing/src/plugin.ts b/packages/sheets-drawing/src/plugin.ts index 29b795d15e8..102fb9044e1 100644 --- a/packages/sheets-drawing/src/plugin.ts +++ b/packages/sheets-drawing/src/plugin.ts @@ -14,13 +14,13 @@ * limitations under the License. */ +import type { Dependency } from '@univerjs/core'; +import type { IUniverSheetsDrawingConfig } from './controllers/config.schema'; import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { UniverDrawingPlugin } from '@univerjs/drawing'; -import type { Dependency } from '@univerjs/core'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { SHEET_DRAWING_PLUGIN, SheetsDrawingLoadController } from './controllers/sheet-drawing.controller'; import { ISheetDrawingService, SheetDrawingService } from './services/sheet-drawing.service'; -import type { IUniverSheetsDrawingConfig } from './controllers/config.schema'; @DependentOn(UniverDrawingPlugin) export class UniverSheetsDrawingPlugin extends Plugin { @@ -44,5 +44,7 @@ export class UniverSheetsDrawingPlugin extends Plugin { [SheetsDrawingLoadController], [ISheetDrawingService, { useClass: SheetDrawingService }], ] as Dependency[]).forEach((dependency) => this._injector.add(dependency)); + + this._injector.get(SheetsDrawingLoadController); } } diff --git a/packages/sheets-filter-ui/src/commands/commands/__tests__/sheets-filter.command.spec.ts b/packages/sheets-filter-ui/src/commands/commands/__tests__/sheets-filter.command.spec.ts index e7bbdc07ce0..9e93c0d5ad8 100644 --- a/packages/sheets-filter-ui/src/commands/commands/__tests__/sheets-filter.command.spec.ts +++ b/packages/sheets-filter-ui/src/commands/commands/__tests__/sheets-filter.command.spec.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import type { Dependency, IRange, IWorkbookData } from '@univerjs/core'; -import { AuthzIoLocalService, IAuthzIoService, ICommandService, Inject, Injector, IUniverInstanceService, LocaleType, Plugin, RANGE_TYPE, RedoCommand, UndoCommand, Univer, UniverInstanceType } from '@univerjs/core'; +import type { Dependency, IRange, IWorkbookData, Workbook } from '@univerjs/core'; import type { ISetRangeValuesCommandParams } from '@univerjs/sheets'; -import { RangeProtectionRuleModel, RefRangeService, SetRangeValuesCommand, SetRangeValuesMutation, SheetInterceptorService, SheetsSelectionsService, WorkbookPermissionService, WorksheetPermissionService, WorksheetProtectionPointModel, WorksheetProtectionRuleModel } from '@univerjs/sheets'; import type { FilterModel, ISetSheetsFilterRangeMutationParams } from '@univerjs/sheets-filter'; +import type { ISetSheetsFilterCriteriaCommandParams } from '../sheets-filter.command'; +import { AuthzIoLocalService, IAuthzIoService, ICommandService, Inject, Injector, IUniverInstanceService, LocaleType, Plugin, RANGE_TYPE, RedoCommand, UndoCommand, Univer, UniverInstanceType } from '@univerjs/core'; +import { RangeProtectionRuleModel, RefRangeService, SetRangeValuesCommand, SetRangeValuesMutation, SheetInterceptorService, SheetsSelectionsService, WorkbookPermissionService, WorksheetPermissionService, WorksheetProtectionPointModel, WorksheetProtectionRuleModel } from '@univerjs/sheets'; import { SetSheetsFilterRangeMutation, SheetsFilterService, UniverSheetsFilterPlugin } from '@univerjs/sheets-filter'; -import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { IMessageService } from '@univerjs/ui'; import { MockMessageService } from '@univerjs/ui/services/message/__testing__/mock-message.service.js'; -import type { ISetSheetsFilterCriteriaCommandParams } from '../sheets-filter.command'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { ClearSheetsFilterCriteriaCommand, ReCalcSheetsFilterCommand, RemoveSheetFilterCommand, SetSheetFilterRangeCommand, SetSheetsFilterCriteriaCommand, SmartToggleSheetsFilterCommand } from '../sheets-filter.command'; function testWorkbookDataFactory(): IWorkbookData { @@ -83,6 +83,7 @@ function createFilterCommandTestBed() { class SheetsFilterCommandTestPlugin extends Plugin { static override pluginName = 'sheets-filter-command-test'; static override type = UniverInstanceType.UNIVER_SHEET; + constructor(_config: unknown, @Inject(Injector) protected readonly _injector: Injector) { super(); } @@ -100,13 +101,17 @@ function createFilterCommandTestBed() { [RangeProtectionRuleModel], [IMessageService, { useClass: MockMessageService }], ] as Dependency[]).forEach((d) => this._injector.add(d)); + + this._injector.get(SheetInterceptorService); + this._injector.get(WorkbookPermissionService); + this._injector.get(WorksheetPermissionService); } } univer.registerPlugin(UniverSheetsFilterPlugin); univer.registerPlugin(SheetsFilterCommandTestPlugin); - univer.createUniverSheet(testWorkbookDataFactory()); + univer.createUnit(UniverInstanceType.UNIVER_SHEET, testWorkbookDataFactory()); const commandService = get(ICommandService); [ diff --git a/packages/sheets-filter-ui/src/commands/operations/__tests__/sheets-filter.operation.spec.ts b/packages/sheets-filter-ui/src/commands/operations/__tests__/sheets-filter.operation.spec.ts index 163c8c8a803..5774226ef02 100644 --- a/packages/sheets-filter-ui/src/commands/operations/__tests__/sheets-filter.operation.spec.ts +++ b/packages/sheets-filter-ui/src/commands/operations/__tests__/sheets-filter.operation.spec.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import type { Dependency, IOperation, IWorkbookData } from '@univerjs/core'; -import { CommandType, ICommandService, IContextService, Inject, Injector, LocaleService, LocaleType, Plugin, Univer, UniverInstanceType } from '@univerjs/core'; +import type { Dependency, IOperation, IWorkbookData, Workbook } from '@univerjs/core'; import type { ISetSheetsFilterRangeMutationParams } from '@univerjs/sheets-filter'; +import type { IEditorBridgeServiceVisibleParam } from '@univerjs/sheets-ui'; +import { CommandType, ICommandService, IContextService, Inject, Injector, LocaleService, LocaleType, Plugin, Univer, UniverInstanceType } from '@univerjs/core'; +import { RefRangeService, SheetInterceptorService, SheetsSelectionsService } from '@univerjs/sheets'; import { SetSheetsFilterRangeMutation, UniverSheetsFilterPlugin } from '@univerjs/sheets-filter'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { RefRangeService, SheetInterceptorService, SheetsSelectionsService } from '@univerjs/sheets'; -import type { IEditorBridgeServiceVisibleParam } from '@univerjs/sheets-ui'; -import { CloseFilterPanelOperation, FILTER_PANEL_OPENED_KEY, OpenFilterPanelOperation } from '../sheets-filter.operation'; import { SheetsFilterPanelService } from '../../../services/sheets-filter-panel.service'; +import { CloseFilterPanelOperation, FILTER_PANEL_OPENED_KEY, OpenFilterPanelOperation } from '../sheets-filter.operation'; const SetCellEditVisibleOperation: IOperation = { id: 'sheet.operation.set-cell-edit-visible', @@ -85,7 +85,7 @@ function createFilterOperationTestBed() { univer.registerPlugin(UniverSheetsFilterPlugin); univer.registerPlugin(SheetsFilterOperationTestPlugin); - univer.createUniverSheet(testWorkbookDataFactory()); + univer.createUnit(UniverInstanceType.UNIVER_SHEET, testWorkbookDataFactory()); get(LocaleService).load({}); diff --git a/packages/sheets-filter-ui/src/controllers/__tests__/sheets-filter.menu.spec.ts b/packages/sheets-filter-ui/src/controllers/__tests__/sheets-filter.menu.spec.ts index a814387b3ff..075be0b5787 100644 --- a/packages/sheets-filter-ui/src/controllers/__tests__/sheets-filter.menu.spec.ts +++ b/packages/sheets-filter-ui/src/controllers/__tests__/sheets-filter.menu.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import type { IWorkbookData } from '@univerjs/core'; +import type { IWorkbookData, Workbook } from '@univerjs/core'; import type { ISetSheetsFilterCriteriaMutationParams, ISetSheetsFilterRangeMutationParams } from '@univerjs/sheets-filter'; import { AuthzIoLocalService, DisposableCollection, IAuthzIoService, ICommandService, Inject, Injector, LocaleType, Plugin, Univer, UniverInstanceType } from '@univerjs/core'; import { ExclusiveRangeService, IExclusiveRangeService, RangeProtectionRuleModel, RefRangeService, SetWorksheetActiveOperation, SheetInterceptorService, SheetsSelectionsService, WorkbookPermissionService, WorksheetPermissionService, WorksheetProtectionPointModel, WorksheetProtectionRuleModel } from '@univerjs/sheets'; @@ -86,13 +86,17 @@ function createSheetsFilterMenuTestBed() { OpenFilterPanelOperation, CloseFilterPanelOperation, ].forEach((command) => commandService.registerCommand(command)); + + this._injector.get(SheetInterceptorService); + this._injector.get(WorkbookPermissionService); + this._injector.get(WorksheetPermissionService); } } univer.registerPlugin(TestPlugin); univer.registerPlugin(UniverSheetsFilterPlugin); - const sheet = univer.createUniverSheet(TEST_WORKBOOK_DATA_DEMO); + const sheet = univer.createUnit(UniverInstanceType.UNIVER_SHEET, TEST_WORKBOOK_DATA_DEMO); return { univer, get, sheet }; } diff --git a/packages/sheets-filter-ui/src/services/__tests__/sheets-filter-panel.service.spec.ts b/packages/sheets-filter-ui/src/services/__tests__/sheets-filter-panel.service.spec.ts index f53791d631d..252d8567eef 100644 --- a/packages/sheets-filter-ui/src/services/__tests__/sheets-filter-panel.service.spec.ts +++ b/packages/sheets-filter-ui/src/services/__tests__/sheets-filter-panel.service.spec.ts @@ -14,20 +14,20 @@ * limitations under the License. */ -import type { Dependency, IOperation, IWorkbookData } from '@univerjs/core'; +import type { Dependency, IOperation, IWorkbookData, Workbook } from '@univerjs/core'; +import type { IEditorBridgeServiceVisibleParam } from '@univerjs/sheets-ui'; +import type { IOpenFilterPanelOperationParams } from '../../commands/operations/sheets-filter.operation'; +import type { IFilterConditionFormParams } from '../../models/conditions'; import { CommandType, ICommandService, Inject, Injector, LocaleService, Plugin, Univer, UniverInstanceType } from '@univerjs/core'; import { RefRangeService, SheetInterceptorService, SheetsSelectionsService } from '@univerjs/sheets'; -import { afterEach, beforeEach, describe, expect, it, vitest } from 'vitest'; import { CustomFilterOperator, SheetsFilterService, UniverSheetsFilterPlugin } from '@univerjs/sheets-filter'; -import type { IEditorBridgeServiceVisibleParam } from '@univerjs/sheets-ui'; -import { ByConditionsModel, ByValuesModel, FilterBy, SheetsFilterPanelService } from '../sheets-filter-panel.service'; -import type { IOpenFilterPanelOperationParams } from '../../commands/operations/sheets-filter.operation'; -import { CloseFilterPanelOperation, OpenFilterPanelOperation } from '../../commands/operations/sheets-filter.operation'; +import { afterEach, beforeEach, describe, expect, it, vitest } from 'vitest'; import { E_ITEMS, ITEMS, WithCustomFilterModelFactory, WithMergedCellFilterFactory, WithMultiEmptyCellsModelFactory, WithTwoFilterColumnsFactory, WithValuesAndEmptyFilterModelFactory, WithValuesFilterModelFactory } from '../../__testing__/data'; -import type { IFilterConditionFormParams } from '../../models/conditions'; +import { SetSheetsFilterCriteriaCommand } from '../../commands/commands/sheets-filter.command'; +import { CloseFilterPanelOperation, OpenFilterPanelOperation } from '../../commands/operations/sheets-filter.operation'; import { FilterConditionItems } from '../../models/conditions'; import { ExtendCustomFilterOperator } from '../../models/extended-operators'; -import { SetSheetsFilterCriteriaCommand } from '../../commands/commands/sheets-filter.command'; +import { ByConditionsModel, ByValuesModel, FilterBy, SheetsFilterPanelService } from '../sheets-filter-panel.service'; const SetCellEditVisibleOperation: IOperation = { id: 'sheet.operation.set-cell-edit-visible', @@ -65,11 +65,7 @@ function createSheetsFilterPanelServiceTestBed(workbookData: IWorkbookData) { univer.registerPlugin(UniverSheetsFilterPlugin); univer.registerPlugin(SheetsFilterPanelTestPlugin); - univer.createUniverSheet(workbookData); - - // It should be registered later in avoid of time sequence problem. - // injector.add([ISnapshotPersistenceService, { useClass: LocalSnapshotService }]); - // injector.get(ISnapshotPersistenceService); + univer.createUnit(UniverInstanceType.UNIVER_SHEET, workbookData); const commandService = get(ICommandService); 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 b81951ea8d3..d4eb802f8c1 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 @@ -15,23 +15,22 @@ */ import type { ICellData, IDisposable, IObjectMatrixPrimitiveType, IRange, Nullable, Workbook, Worksheet } from '@univerjs/core'; -import { ColorKit, CommandType, Disposable, EDITOR_ACTIVATED, fromCallback, groupBy, ICommandService, IContextService, Inject, Injector, IUniverInstanceService, LifecycleStages, ObjectMatrix, OnLifecycle, replaceInDocumentBody, rotate, ThemeService, Tools, UniverInstanceType } from '@univerjs/core'; -import { IRenderManagerService, RENDER_RAW_FORMULA_KEY } from '@univerjs/engine-render'; import type { IFindComplete, IFindMatch, IFindMoveParams, IFindQuery, IFindReplaceProvider, IReplaceAllResult } from '@univerjs/find-replace'; -import { FindBy, FindDirection, FindModel, FindReplaceController, FindScope, IFindReplaceService } from '@univerjs/find-replace'; import type { ISelectionWithStyle, ISetRangeValuesCommandParams, ISetSelectionsOperationParams, ISetWorksheetActivateCommandParams, ISheetCommandSharedParams, WorkbookSelections } from '@univerjs/sheets'; -import { SetRangeValuesCommand, SetSelectionsOperation, SetWorksheetActivateCommand, SetWorksheetActiveOperation, SheetsSelectionsService } from '@univerjs/sheets'; import type { IScrollToCellCommandParams } from '@univerjs/sheets-ui'; +import type { ISheetReplaceCommandParams, ISheetReplacement } from '../commands/commands/sheet-replace.command'; +import type { ISheetFindReplaceHighlightShapeProps } from '../views/shapes/find-replace-highlight.shape'; +import { ColorKit, CommandType, Disposable, EDITOR_ACTIVATED, fromCallback, groupBy, ICommandService, IContextService, Inject, Injector, IUniverInstanceService, ObjectMatrix, replaceInDocumentBody, rotate, ThemeService, Tools, UniverInstanceType } from '@univerjs/core'; +import { IRenderManagerService, RENDER_RAW_FORMULA_KEY } from '@univerjs/engine-render'; +import { FindBy, FindDirection, FindModel, FindReplaceController, FindScope, IFindReplaceService } from '@univerjs/find-replace'; +import { SetRangeValuesCommand, SetSelectionsOperation, SetWorksheetActivateCommand, SetWorksheetActiveOperation, SheetsSelectionsService } from '@univerjs/sheets'; + import { getCoordByCell, getSheetObject, ScrollToCellCommand, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; import { debounceTime, filter, merge, skip, Subject, throttleTime } from 'rxjs'; - -import type { ISheetFindReplaceHighlightShapeProps } from '../views/shapes/find-replace-highlight.shape'; -import { SheetFindReplaceHighlightShape } from '../views/shapes/find-replace-highlight.shape'; -import type { ISheetReplaceCommandParams, ISheetReplacement } from '../commands/commands/sheet-replace.command'; import { SheetReplaceCommand } from '../commands/commands/sheet-replace.command'; +import { SheetFindReplaceHighlightShape } from '../views/shapes/find-replace-highlight.shape'; import { isBeforePositionWithColumnPriority, isBeforePositionWithRowPriority, isBehindPositionWithColumnPriority, isBehindPositionWithRowPriority, isSamePosition, isSelectionSingleCell } from './utils'; -@OnLifecycle(LifecycleStages.Steady, SheetsFindReplaceController) export class SheetsFindReplaceController extends Disposable implements IDisposable { private _provider!: SheetsFindReplaceProvider; diff --git a/packages/sheets-find-replace/src/plugin.ts b/packages/sheets-find-replace/src/plugin.ts index 2de442c915c..999e6ec74fa 100644 --- a/packages/sheets-find-replace/src/plugin.ts +++ b/packages/sheets-find-replace/src/plugin.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; +import type { IUniverSheetsFindReplaceConfig } from './controllers/config.schema'; +import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { UniverFindReplacePlugin } from '@univerjs/find-replace'; import { UniverSheetsPlugin } from '@univerjs/sheets'; -import { SheetsFindReplaceController } from './controllers/sheet-find-replace.controller'; -import type { IUniverSheetsFindReplaceConfig } from './controllers/config.schema'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; +import { SheetsFindReplaceController } from './controllers/sheet-find-replace.controller'; const NAME = 'SHEET_FIND_REPLACE_PLUGIN'; @@ -44,4 +44,8 @@ export class UniverSheetsFindReplacePlugin extends Plugin { override onStarting(): void { ([[SheetsFindReplaceController]] as Dependency[]).forEach((d) => this._injector.add(d)); } + + override onSteady(): void { + this._injector.get(SheetsFindReplaceController); + } } 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 47c3be71a7f..ed786513519 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 @@ -84,6 +84,10 @@ export function createCommandTestBed(workbookData?: IWorkbookData, dependencies? injector.add([WorksheetProtectionRuleModel]); dependencies?.forEach((d) => injector.add(d)); + + this._injector.get(SheetInterceptorService); + this._injector.get(WorkbookPermissionService); + this._injector.get(WorksheetPermissionService); } } 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 ae6b9bae2c2..2ada7c73181 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 @@ -99,6 +99,10 @@ export function createCommandTestBed(workbookData?: IWorkbookData, dependencies? injector.add([IRefSelectionsService, { useClass: SheetsSelectionsService }]); dependencies?.forEach((d) => injector.add(d)); + + this._injector.get(SheetInterceptorService); + this._injector.get(WorkbookPermissionService); + this._injector.get(WorksheetPermissionService); } override onReady(): void { diff --git a/packages/sheets-formula-ui/src/controllers/__tests__/formula-auto-fill.controller.spec.ts b/packages/sheets-formula-ui/src/controllers/__tests__/formula-auto-fill.controller.spec.ts index d8405f6d189..16bf6dfc8c8 100644 --- a/packages/sheets-formula-ui/src/controllers/__tests__/formula-auto-fill.controller.spec.ts +++ b/packages/sheets-formula-ui/src/controllers/__tests__/formula-auto-fill.controller.spec.ts @@ -81,18 +81,23 @@ describe('Test auto fill with formula', () => { [RangeProtectionRenderModel], [SheetsRenderService, { useClass: mockSheetsRenderService }], ]); + univer = testBed.univer; get = testBed.get; + commandService = get(ICommandService); themeService = get(ThemeService); themeService.setTheme(theme); autoFillController = get(AutoFillController); + commandService.registerCommand(SetRangeValuesMutation); commandService.registerCommand(SetSelectionsOperation); commandService.registerCommand(AddWorksheetMergeMutation); commandService.registerCommand(RemoveWorksheetMergeMutation); commandService.registerCommand(AutoFillCommand); + get(FormulaAutoFillController); + getValues = ( startRow: number, startColumn: number, diff --git a/packages/sheets-formula-ui/src/controllers/__tests__/update-formula.controller.spec.ts b/packages/sheets-formula-ui/src/controllers/__tests__/update-formula.controller.spec.ts index 9549e681139..e84fd4658df 100644 --- a/packages/sheets-formula-ui/src/controllers/__tests__/update-formula.controller.spec.ts +++ b/packages/sheets-formula-ui/src/controllers/__tests__/update-formula.controller.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import type { ICellData, Injector, IObjectMatrixPrimitiveType, IWorkbookData, Nullable, Univer } from '@univerjs/core'; +import type { ICellData, Injector, IWorkbookData, Nullable, Univer, Workbook } from '@univerjs/core'; import type { IDeleteRangeMoveLeftCommandParams, IDeleteRangeMoveUpCommandParams, IInsertColCommandParams, IInsertRowCommandParams, IMoveColsCommandParams, IMoveRangeCommandParams, IMoveRowsCommandParams, InsertRangeMoveDownCommandParams, InsertRangeMoveRightCommandParams, IRemoveRowColCommandParams, IRemoveSheetCommandParams, ISetRangeValuesCommandParams, ISetWorksheetNameCommandParams } from '@univerjs/sheets'; import { CellValueType, Direction, ICommandService, IUniverInstanceService, LocaleType, RANGE_TYPE, RedoCommand, UndoCommand } from '@univerjs/core'; import { SetArrayFormulaDataMutation, SetFormulaDataMutation } from '@univerjs/engine-formula'; @@ -280,12 +280,12 @@ describe('Test insert function operation', () => { endRow: number, endColumn: number ) => Array>> | undefined; - let getCellData: () => IObjectMatrixPrimitiveType> | undefined; beforeEach(() => { const testBed = createCommandTestBed(TEST_WORKBOOK_DATA_DEMO(), [ [UpdateFormulaController], ]); + univer = testBed.univer; get = testBed.get; @@ -334,14 +334,12 @@ describe('Test insert function operation', () => { endColumn: number ): Array>> | undefined => get(IUniverInstanceService) - .getUniverSheetInstance('test') + .getUnit('test') ?.getSheetBySheetId('sheet1') ?.getRange(startRow, startColumn, endRow, endColumn) .getValues(); - getCellData = () => { - return get(IUniverInstanceService).getUniverSheetInstance('test')?.getSheetBySheetId('sheet1')?.getCellMatrix().clone(); - }; + get(UpdateFormulaController); }); afterEach(() => { diff --git a/packages/sheets-formula-ui/src/controllers/formula-auto-fill.controller.ts b/packages/sheets-formula-ui/src/controllers/formula-auto-fill.controller.ts index 099332d3c89..7add9024715 100644 --- a/packages/sheets-formula-ui/src/controllers/formula-auto-fill.controller.ts +++ b/packages/sheets-formula-ui/src/controllers/formula-auto-fill.controller.ts @@ -22,14 +22,11 @@ import { Inject, isFormulaId, isFormulaString, - LifecycleStages, - OnLifecycle, Tools, } from '@univerjs/core'; import { LexerTreeBuilder } from '@univerjs/engine-formula'; import { APPLY_TYPE, DATA_TYPE, IAutoFillService } from '@univerjs/sheets-ui'; -@OnLifecycle(LifecycleStages.Ready, FormulaAutoFillController) export class FormulaAutoFillController extends Disposable { constructor( @IAutoFillService private readonly _autoFillService: AutoFillService, @@ -37,10 +34,6 @@ export class FormulaAutoFillController extends Disposable { ) { super(); - this._initialize(); - } - - private _initialize(): void { this._registerAutoFill(); } diff --git a/packages/sheets-formula-ui/src/controllers/formula-clipboard.controller.ts b/packages/sheets-formula-ui/src/controllers/formula-clipboard.controller.ts index 2828539a816..785c6fe3eaf 100644 --- a/packages/sheets-formula-ui/src/controllers/formula-clipboard.controller.ts +++ b/packages/sheets-formula-ui/src/controllers/formula-clipboard.controller.ts @@ -25,9 +25,7 @@ import { isFormulaId, isFormulaString, IUniverInstanceService, - LifecycleStages, ObjectMatrix, - OnLifecycle, Tools, UniverInstanceType, } from '@univerjs/core'; @@ -37,7 +35,6 @@ import { COPY_TYPE, ISheetClipboardService, PREDEFINED_HOOK_NAME } from '@univer export const DEFAULT_PASTE_FORMULA = 'default-paste-formula'; -@OnLifecycle(LifecycleStages.Ready, FormulaClipboardController) export class FormulaClipboardController extends Disposable { constructor( @IUniverInstanceService private readonly _currentUniverSheet: IUniverInstanceService, diff --git a/packages/sheets-formula-ui/src/controllers/formula-render.controller.ts b/packages/sheets-formula-ui/src/controllers/formula-render.controller.ts index 472e31344b9..56c019da0b6 100644 --- a/packages/sheets-formula-ui/src/controllers/formula-render.controller.ts +++ b/packages/sheets-formula-ui/src/controllers/formula-render.controller.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Inject, InterceptorEffectEnum, LifecycleStages, OnLifecycle, RxDisposable } from '@univerjs/core'; +import { Inject, InterceptorEffectEnum, RxDisposable } from '@univerjs/core'; import { INTERCEPTOR_POINT, SheetInterceptorService } from '@univerjs/sheets'; import { extractFormulaError } from './utils/utils'; @@ -25,17 +25,12 @@ const FORMULA_ERROR_MARK = { }, }; -@OnLifecycle(LifecycleStages.Rendered, FormulaRenderManagerController) export class FormulaRenderManagerController extends RxDisposable { constructor( @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService ) { super(); - this._init(); - } - - private _init() { this.disposeWithMe(this._sheetInterceptorService.intercept( INTERCEPTOR_POINT.CELL_CONTENT, { diff --git a/packages/sheets-formula-ui/src/controllers/formula-ui.controller.ts b/packages/sheets-formula-ui/src/controllers/formula-ui.controller.ts index e3047b140a2..0737f4f844b 100644 --- a/packages/sheets-formula-ui/src/controllers/formula-ui.controller.ts +++ b/packages/sheets-formula-ui/src/controllers/formula-ui.controller.ts @@ -15,7 +15,7 @@ */ import type { Dependency } from '@univerjs/core'; -import { connectInjector, Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import { connectInjector, Disposable, ICommandService, Inject, Injector, UniverInstanceType } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; import { BuiltInUIPart, ComponentManager, IMenuManagerService, IShortcutService, IUIPartsService } from '@univerjs/ui'; @@ -40,7 +40,6 @@ import { singleEditorPromptSelectionShortcutItem, } from './shortcuts/prompt.shortcut'; -@OnLifecycle(LifecycleStages.Ready, FormulaUIController) export class FormulaUIController extends Disposable { constructor( @Inject(Injector) private readonly _injector: Injector, diff --git a/packages/sheets-formula-ui/src/controllers/prompt.controller.ts b/packages/sheets-formula-ui/src/controllers/prompt.controller.ts index d9f7803cc6a..aadfd1da178 100644 --- a/packages/sheets-formula-ui/src/controllers/prompt.controller.ts +++ b/packages/sheets-formula-ui/src/controllers/prompt.controller.ts @@ -47,8 +47,6 @@ import { Inject, isFormulaString, IUniverInstanceService, - LifecycleStages, - OnLifecycle, RANGE_TYPE, Rectangle, ThemeService, @@ -131,7 +129,6 @@ enum InputPanelState { const sheetEditorUnitIds = [DOCS_FORMULA_BAR_EDITOR_UNIT_ID_KEY, DOCS_NORMAL_EDITOR_UNIT_ID_KEY]; -@OnLifecycle(LifecycleStages.Steady, PromptController) export class PromptController extends Disposable { private _listenInputCache: Set = new Set(); private _formulaRefColors: string[] = []; diff --git a/packages/sheets-formula-ui/src/sheets-formula-ui.plugin.ts b/packages/sheets-formula-ui/src/sheets-formula-ui.plugin.ts index 70f398f270d..1c16866912e 100644 --- a/packages/sheets-formula-ui/src/sheets-formula-ui.plugin.ts +++ b/packages/sheets-formula-ui/src/sheets-formula-ui.plugin.ts @@ -74,6 +74,10 @@ export class UniverSheetsFormulaUIPlugin extends Plugin { dependencies.forEach((dependency) => j.add(dependency)); } + override onReady(): void { + this._injector.get(FormulaUIController); + } + override onRendered(): void { ([ [RefSelectionsRenderService], @@ -81,5 +85,13 @@ export class UniverSheetsFormulaUIPlugin extends Plugin { ] as Dependency[]).forEach((dep) => { this.disposeWithMe(this._renderManagerService.registerRenderModule(UniverInstanceType.UNIVER_SHEET, dep)); }); + + this._injector.get(FormulaClipboardController); + this._injector.get(FormulaRenderManagerController); + } + + override onSteady(): void { + this._injector.get(FormulaAutoFillController); + this._injector.get(PromptController); } } diff --git a/packages/sheets-formula/src/controllers/active-dirty.controller.ts b/packages/sheets-formula/src/controllers/active-dirty.controller.ts index 7515f428d6f..36b02bdeb46 100644 --- a/packages/sheets-formula/src/controllers/active-dirty.controller.ts +++ b/packages/sheets-formula/src/controllers/active-dirty.controller.ts @@ -15,17 +15,7 @@ */ import type { ICellData, ICommandInfo, IObjectMatrixPrimitiveType, IRange, IUnitRange, Nullable } from '@univerjs/core'; -import { - Dimension, - Disposable, - Inject, - IUniverInstanceService, - LifecycleStages, - ObjectMatrix, - OnLifecycle, -} from '@univerjs/core'; import type { IDirtyUnitSheetDefinedNameMap, IDirtyUnitSheetNameMap, ISetDefinedNameMutationParam } from '@univerjs/engine-formula'; -import { FormulaDataModel, IActiveDirtyManagerService, IDefinedNamesService, RemoveDefinedNameMutation, SetDefinedNameMutation } from '@univerjs/engine-formula'; import type { IDeleteRangeMutationParams, IInsertSheetMutationParams, @@ -39,6 +29,14 @@ import type { ISetDefinedNameCommandParams, ISetRangeValuesMutationParams, } from '@univerjs/sheets'; +import { + Dimension, + Disposable, + Inject, + IUniverInstanceService, + ObjectMatrix, +} from '@univerjs/core'; +import { FormulaDataModel, IActiveDirtyManagerService, RemoveDefinedNameMutation, SetDefinedNameMutation } from '@univerjs/engine-formula'; import { InsertSheetMutation, MoveColsMutation, @@ -53,14 +51,11 @@ import { SetStyleCommand, } from '@univerjs/sheets'; -@OnLifecycle(LifecycleStages.Ready, ActiveDirtyController) export class ActiveDirtyController extends Disposable { constructor( @IActiveDirtyManagerService private readonly _activeDirtyManagerService: IActiveDirtyManagerService, @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, - @Inject(FormulaDataModel) private readonly _formulaDataModel: FormulaDataModel, - @IDefinedNamesService private readonly _definedNamesService: IDefinedNamesService - + @Inject(FormulaDataModel) private readonly _formulaDataModel: FormulaDataModel ) { super(); @@ -72,20 +67,6 @@ export class ActiveDirtyController extends Disposable { } private _initialConversion() { - // const updateCommandList = [ - // SetRangeValuesMutation.id, - // MoveRangeMutation.id, - // MoveRowsMutation.id, - // MoveColsMutation.id, - // DeleteRangeMutation.id, - // InsertRangeMutation.id, - // RemoveRowMutation.id, - // RemoveColMutation.id, - // RemoveSheetMutation.id, - // InsertSheetMutation.id, - // // SetWorksheetNameMutation.id, - // ]; - this._activeDirtyManagerService.register(SetRangeValuesMutation.id, { commandId: SetRangeValuesMutation.id, getDirtyData: (command: ICommandInfo) => { @@ -111,17 +92,6 @@ export class ActiveDirtyController extends Disposable { this._initialSheet(); this._initialDefinedName(); - - /** - * Changing the name of a sheet triggers an adjustment of the formula references, but does not trigger formula calculation; therefore, this logic has been removed. - */ - // this._activeDirtyManagerService.register(SetWorksheetNameMutation.id, { - // commandId: SetWorksheetNameMutation.id, - // getDirtyData: (command: ICommandInfo) => { - // const params = command.params as ISetWorksheetNameMutationParams; - // return { dirtyNameMap: this._getRemoveSheetMutation(params, params.name) }; - // }, - // }); } private _initialMove() { diff --git a/packages/sheets-formula/src/controllers/array-formula-cell-interceptor.controller.ts b/packages/sheets-formula/src/controllers/array-formula-cell-interceptor.controller.ts index 569de3209d0..d4918722877 100644 --- a/packages/sheets-formula/src/controllers/array-formula-cell-interceptor.controller.ts +++ b/packages/sheets-formula/src/controllers/array-formula-cell-interceptor.controller.ts @@ -16,11 +16,10 @@ import type { ICommandInfo } from '@univerjs/core'; import type { ISetArrayFormulaDataMutationParams } from '@univerjs/engine-formula'; -import { CellValueType, Disposable, ICommandService, Inject, InterceptorEffectEnum, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { CellValueType, Disposable, ICommandService, Inject, InterceptorEffectEnum } from '@univerjs/core'; import { FormulaDataModel, SetArrayFormulaDataMutation, stripErrorMargin } from '@univerjs/engine-formula'; import { INTERCEPTOR_POINT, SheetInterceptorService } from '@univerjs/sheets'; -@OnLifecycle(LifecycleStages.Ready, ArrayFormulaCellInterceptorController) export class ArrayFormulaCellInterceptorController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/sheets-formula/src/controllers/defined-name.controller.ts b/packages/sheets-formula/src/controllers/defined-name.controller.ts index 5bc028374a9..66108b381df 100644 --- a/packages/sheets-formula/src/controllers/defined-name.controller.ts +++ b/packages/sheets-formula/src/controllers/defined-name.controller.ts @@ -21,8 +21,6 @@ import { Disposable, ICommandService, IUniverInstanceService, - LifecycleStages, - OnLifecycle, toDisposable, UniverInstanceType, } from '@univerjs/core'; @@ -31,11 +29,11 @@ import { InsertDefinedNameCommand, RemoveDefinedNameCommand, SetDefinedNameComma import { IDescriptionService } from '../services/description.service'; export const SCOPE_WORKBOOK_VALUE = 'AllDefaultWorkbook'; + /** * header highlight * column menu: show, hover and mousedown event */ -@OnLifecycle(LifecycleStages.Rendered, DefinedNameController) export class DefinedNameController extends Disposable { private _preUnitId: Nullable = null; diff --git a/packages/sheets-formula/src/controllers/update-formula.controller.ts b/packages/sheets-formula/src/controllers/update-formula.controller.ts index 5c1a6c08322..d202632266b 100644 --- a/packages/sheets-formula/src/controllers/update-formula.controller.ts +++ b/packages/sheets-formula/src/controllers/update-formula.controller.ts @@ -47,12 +47,9 @@ import { Inject, Injector, IUniverInstanceService, - LifecycleStages, ObjectMatrix, - OnLifecycle, RANGE_TYPE, Rectangle, - Tools, UniverInstanceType, } from '@univerjs/core'; @@ -159,7 +156,6 @@ enum OriginRangeEdgeType { * * 3. onCommandExecuted, before formula calculation, use the setRangeValues information to delete the old formulaData, ArrayFormula and ArrayFormulaCellData, and send the worker (complementary setRangeValues after collaborative conflicts, normal operation triggers formula update, undo/redo are captured and processed here) */ -@OnLifecycle(LifecycleStages.Ready, UpdateFormulaController) export class UpdateFormulaController extends Disposable { constructor( @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, diff --git a/packages/sheets-formula/src/index.ts b/packages/sheets-formula/src/index.ts index b1e85fdec59..34496ed79d4 100644 --- a/packages/sheets-formula/src/index.ts +++ b/packages/sheets-formula/src/index.ts @@ -16,6 +16,7 @@ export { type IInsertFunction, type IInsertFunctionCommandParams, InsertFunctionCommand } from './commands/commands/insert-function.command'; export { OtherFormulaMarkDirty } from './commands/mutations/formula.mutation'; + // #region - all commands export { UpdateFormulaController } from './controllers/update-formula.controller'; @@ -27,6 +28,6 @@ export { RegisterFunctionService } from './services/register-function.service'; export { IRegisterFunctionService } from './services/register-function.service'; export { RegisterOtherFormulaService } from './services/register-other-formula.service'; export { IRemoteRegisterFunctionService, RemoteRegisterFunctionService } from './services/remote/remote-register-function.service'; -export { UniverRemoteSheetsFormulaPlugin, UniverSheetsFormulaMobilePlugin, UniverSheetsFormulaPlugin } from './sheets-formula.plugin'; +export { UniverRemoteSheetsFormulaPlugin, UniverSheetsFormulaPlugin } from './sheets-formula.plugin'; // #endregion diff --git a/packages/sheets-formula/src/sheets-formula.plugin.ts b/packages/sheets-formula/src/sheets-formula.plugin.ts index 295ec176741..b87d5e0108d 100644 --- a/packages/sheets-formula/src/sheets-formula.plugin.ts +++ b/packages/sheets-formula/src/sheets-formula.plugin.ts @@ -114,42 +114,14 @@ export class UniverSheetsFormulaPlugin extends Plugin { } override onReady(): void { - this._injector.get(TriggerCalculationController); this._injector.get(FormulaController); - } -} - -// TODO@wzhudev: after I separate the sheets-formula-ui plugin, -// I found out that `UniverSheetsFormulaPlugin` provides the same services as `UniverSheetsFormulaMobilePlugin`. -// The the later on can be removed. - -export class UniverSheetsFormulaMobilePlugin extends Plugin { - static override pluginName = SHEETS_FORMULA_PLUGIN_NAME; - static override type = UniverInstanceType.UNIVER_SHEET; - - constructor( - private readonly _config: undefined, - @Inject(Injector) override readonly _injector: Injector - ) { - super(); - } - - override onStarting(): void { - const dependencies: Dependency[] = [ - [IRegisterFunctionService, { useClass: RegisterFunctionService }], - [FormulaRefRangeService], - [RegisterOtherFormulaService], - [ArrayFormulaCellInterceptorController], - [TriggerCalculationController], - [UpdateFormulaController], - [ActiveDirtyController], - [DefinedNameController], - ]; - - dependencies.forEach((dependency) => this._injector.add(dependency)); + this._injector.get(TriggerCalculationController); + this._injector.get(ActiveDirtyController); + this._injector.get(ArrayFormulaCellInterceptorController); + this._injector.get(UpdateFormulaController); } - override onReady(): void { - ([TriggerCalculationController]).forEach((module) => this._injector.get(module)); + override onRendered(): void { + this._injector.get(DefinedNameController); } } diff --git a/packages/sheets-hyper-link-ui/src/controllers/auto-fill.controller.ts b/packages/sheets-hyper-link-ui/src/controllers/auto-fill.controller.ts index 3c2d31d78c5..2d7297e43c4 100644 --- a/packages/sheets-hyper-link-ui/src/controllers/auto-fill.controller.ts +++ b/packages/sheets-hyper-link-ui/src/controllers/auto-fill.controller.ts @@ -15,13 +15,12 @@ */ import type { IMutationInfo } from '@univerjs/core'; -import { Disposable, Inject, LifecycleStages, OnLifecycle, Range, Rectangle, Tools } from '@univerjs/core'; -import { AddHyperLinkMutation, HyperLinkModel, RemoveHyperLinkMutation } from '@univerjs/sheets-hyper-link'; import type { IAutoFillLocation, ISheetAutoFillHook } from '@univerjs/sheets-ui'; +import { Disposable, Inject, Range, Rectangle, Tools } from '@univerjs/core'; +import { AddHyperLinkMutation, HyperLinkModel, RemoveHyperLinkMutation } from '@univerjs/sheets-hyper-link'; import { APPLY_TYPE, getAutoFillRepeatRange, IAutoFillService, virtualizeDiscreteRanges } from '@univerjs/sheets-ui'; import { SHEET_HYPER_LINK_UI_PLUGIN } from '../types/const'; -@OnLifecycle(LifecycleStages.Ready, SheetsHyperLinkAutoFillController) export class SheetsHyperLinkAutoFillController extends Disposable { constructor( @IAutoFillService private readonly _autoFillService: IAutoFillService, diff --git a/packages/sheets-hyper-link-ui/src/controllers/copy-paste.controller.ts b/packages/sheets-hyper-link-ui/src/controllers/copy-paste.controller.ts index f8d77bb6051..c780a8a9c79 100644 --- a/packages/sheets-hyper-link-ui/src/controllers/copy-paste.controller.ts +++ b/packages/sheets-hyper-link-ui/src/controllers/copy-paste.controller.ts @@ -15,15 +15,14 @@ */ import type { IMutationInfo, IRange, Nullable } from '@univerjs/core'; -import { Disposable, Inject, Injector, LifecycleStages, ObjectMatrix, OnLifecycle, Range, Rectangle, Tools } from '@univerjs/core'; -import { AddHyperLinkMutation, HyperLinkModel, RemoveHyperLinkMutation } from '@univerjs/sheets-hyper-link'; import type { IDiscreteRange, ISheetDiscreteRangeLocation } from '@univerjs/sheets-ui'; +import { Disposable, Inject, Injector, ObjectMatrix, Range, Rectangle, Tools } from '@univerjs/core'; +import { AddHyperLinkMutation, HyperLinkModel, RemoveHyperLinkMutation } from '@univerjs/sheets-hyper-link'; import { COPY_TYPE, getRepeatRange, ISheetClipboardService, PREDEFINED_HOOK_NAME, rangeToDiscreteRange, virtualizeDiscreteRanges } from '@univerjs/sheets-ui'; -import { SHEET_HYPER_LINK_UI_PLUGIN } from '../types/const'; import { isLegalLink } from '../common/util'; import { SheetsHyperLinkResolverService } from '../services/resolver.service'; +import { SHEET_HYPER_LINK_UI_PLUGIN } from '../types/const'; -@OnLifecycle(LifecycleStages.Ready, SheetsHyperLinkCopyPasteController) export class SheetsHyperLinkCopyPasteController extends Disposable { private _plainTextFilter = new Set<(text: string) => boolean>(); diff --git a/packages/sheets-hyper-link-ui/src/controllers/hyper-link-permission.controller.ts b/packages/sheets-hyper-link-ui/src/controllers/hyper-link-permission.controller.ts index e41436319e3..bd4cc09b21d 100644 --- a/packages/sheets-hyper-link-ui/src/controllers/hyper-link-permission.controller.ts +++ b/packages/sheets-hyper-link-ui/src/controllers/hyper-link-permission.controller.ts @@ -15,12 +15,11 @@ */ import type { ICommandInfo } from '@univerjs/core'; -import { Disposable, ICommandService, Inject, LifecycleStages, LocaleService, OnLifecycle } from '@univerjs/core'; -import { SheetPermissionInterceptorBaseController } from '@univerjs/sheets-ui'; +import { Disposable, ICommandService, Inject, LocaleService } from '@univerjs/core'; import { RangeProtectionPermissionEditPoint, WorkbookEditablePermission, WorksheetEditPermission, WorksheetInsertHyperlinkPermission, WorksheetSetCellValuePermission } from '@univerjs/sheets'; +import { SheetPermissionInterceptorBaseController } from '@univerjs/sheets-ui'; import { InsertLinkShortcut } from './menu'; -@OnLifecycle(LifecycleStages.Rendered, SheetsHyperLinkPermissionController) export class SheetsHyperLinkPermissionController extends Disposable { constructor( @Inject(LocaleService) private _localeService: LocaleService, diff --git a/packages/sheets-hyper-link-ui/src/controllers/popup.controller.ts b/packages/sheets-hyper-link-ui/src/controllers/popup.controller.ts index 8ffeacbc764..13bf1ddad7d 100644 --- a/packages/sheets-hyper-link-ui/src/controllers/popup.controller.ts +++ b/packages/sheets-hyper-link-ui/src/controllers/popup.controller.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -import { CustomRangeType, Disposable, DOCS_NORMAL_EDITOR_UNIT_ID_KEY, DOCS_ZEN_EDITOR_UNIT_ID_KEY, ICommandService, Inject, IPermissionService, IUniverInstanceService, LifecycleStages, OnLifecycle, Rectangle, UniverInstanceType } from '@univerjs/core'; +import type { Nullable, Workbook } from '@univerjs/core'; +import type { ISheetLocationBase } from '@univerjs/sheets'; +import type { Subscription } from 'rxjs'; +import { CustomRangeType, Disposable, DOCS_NORMAL_EDITOR_UNIT_ID_KEY, DOCS_ZEN_EDITOR_UNIT_ID_KEY, ICommandService, Inject, IPermissionService, IUniverInstanceService, Rectangle, UniverInstanceType } from '@univerjs/core'; import { DocSelectionManagerService } from '@univerjs/docs'; import { DocEventManagerService } from '@univerjs/docs-ui'; import { IRenderManagerService } from '@univerjs/engine-render'; @@ -35,13 +38,9 @@ import { import { HoverManagerService, HoverRenderController, IEditorBridgeService, SheetPermissionInterceptorBaseController, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; import { IZenZoneService } from '@univerjs/ui'; import { debounceTime, map, mergeMap, Observable } from 'rxjs'; -import type { Nullable, Workbook } from '@univerjs/core'; -import type { ISheetLocationBase } from '@univerjs/sheets'; -import type { Subscription } from 'rxjs'; import { SheetsHyperLinkPopupService } from '../services/popup.service'; import { HyperLinkEditSourceType } from '../types/enums/edit-source'; -@OnLifecycle(LifecycleStages.Rendered, SheetsHyperLinkPopupController) export class SheetsHyperLinkPopupController extends Disposable { constructor( @Inject(HoverManagerService) private readonly _hoverManagerService: HoverManagerService, diff --git a/packages/sheets-hyper-link-ui/src/controllers/remove-sheet.controller.ts b/packages/sheets-hyper-link-ui/src/controllers/remove-sheet.controller.ts index 6db71892e39..38741065076 100644 --- a/packages/sheets-hyper-link-ui/src/controllers/remove-sheet.controller.ts +++ b/packages/sheets-hyper-link-ui/src/controllers/remove-sheet.controller.ts @@ -15,12 +15,11 @@ */ import type { Workbook } from '@univerjs/core'; -import { Disposable, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; import type { IRemoveSheetCommandParams } from '@univerjs/sheets'; +import { Disposable, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { RemoveSheetCommand, SheetInterceptorService } from '@univerjs/sheets'; import { AddHyperLinkMutation, HyperLinkModel, RemoveHyperLinkMutation } from '@univerjs/sheets-hyper-link'; -@OnLifecycle(LifecycleStages.Ready, SheetsHyperLinkRemoveSheetController) export class SheetsHyperLinkRemoveSheetController extends Disposable { constructor( @Inject(SheetInterceptorService) private _sheetInterceptorService: SheetInterceptorService, diff --git a/packages/sheets-hyper-link-ui/src/controllers/render-controllers/render.controller.ts b/packages/sheets-hyper-link-ui/src/controllers/render-controllers/render.controller.ts index 40c2c151000..1a90f757b9c 100644 --- a/packages/sheets-hyper-link-ui/src/controllers/render-controllers/render.controller.ts +++ b/packages/sheets-hyper-link-ui/src/controllers/render-controllers/render.controller.ts @@ -16,7 +16,7 @@ import type { Workbook } from '@univerjs/core'; import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; -import { Disposable, Inject, InterceptorEffectEnum, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, Inject, InterceptorEffectEnum } from '@univerjs/core'; import { INTERCEPTOR_POINT, SheetInterceptorService } from '@univerjs/sheets'; import { HyperLinkModel } from '@univerjs/sheets-hyper-link'; import { debounceTime } from 'rxjs'; @@ -41,7 +41,6 @@ export class SheetsHyperLinkRenderController extends Disposable implements IRend } } -@OnLifecycle(LifecycleStages.Starting, SheetsHyperLinkRenderManagerController) export class SheetsHyperLinkRenderManagerController extends Disposable { constructor( @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService, diff --git a/packages/sheets-hyper-link-ui/src/controllers/rich-text-ref-range.controller.ts b/packages/sheets-hyper-link-ui/src/controllers/rich-text-ref-range.controller.ts index a9772ff9771..67a02fc4770 100644 --- a/packages/sheets-hyper-link-ui/src/controllers/rich-text-ref-range.controller.ts +++ b/packages/sheets-hyper-link-ui/src/controllers/rich-text-ref-range.controller.ts @@ -15,13 +15,12 @@ */ import type { IDisposable, IDocumentData, IRange, Nullable, Workbook } from '@univerjs/core'; -import { CustomRangeType, Disposable, DisposableCollection, ICommandService, Inject, isValidRange, IUniverInstanceService, LifecycleStages, ObjectMatrix, OnLifecycle, Tools, UniverInstanceType } from '@univerjs/core'; -import { deserializeRangeWithSheet, serializeRange } from '@univerjs/engine-formula'; import type { EffectRefRangeParams, ISetRangeValuesMutationParams } from '@univerjs/sheets'; +import { CustomRangeType, Disposable, DisposableCollection, ICommandService, Inject, isValidRange, IUniverInstanceService, ObjectMatrix, Tools, UniverInstanceType } from '@univerjs/core'; +import { deserializeRangeWithSheet, serializeRange } from '@univerjs/engine-formula'; import { handleDefaultRangeChangeWithEffectRefCommands, RefRangeService, SetRangeValuesMutation } from '@univerjs/sheets'; import { ERROR_RANGE } from '@univerjs/sheets-hyper-link'; -@OnLifecycle(LifecycleStages.Starting, SheetsHyperLinkRichTextRefRangeController) export class SheetsHyperLinkRichTextRefRangeController extends Disposable { private _refRangeMap: Map>> = new Map(); constructor( diff --git a/packages/sheets-hyper-link-ui/src/controllers/set-range.controller.ts b/packages/sheets-hyper-link-ui/src/controllers/set-range.controller.ts index 623d37ad6ce..f8ce3c9dd9d 100644 --- a/packages/sheets-hyper-link-ui/src/controllers/set-range.controller.ts +++ b/packages/sheets-hyper-link-ui/src/controllers/set-range.controller.ts @@ -14,15 +14,14 @@ * limitations under the License. */ -import { BuildTextUtils, CustomRangeType, DataStreamTreeTokenType, Disposable, DOCS_NORMAL_EDITOR_UNIT_ID_KEY, generateRandomId, Inject, IUniverInstanceService, LifecycleStages, ObjectMatrix, OnLifecycle, Range, TextX, Tools } from '@univerjs/core'; +import type { IMutationInfo } from '@univerjs/core'; +import type { ISetRangeValuesMutationParams } from '@univerjs/sheets'; +import { BuildTextUtils, CustomRangeType, DataStreamTreeTokenType, Disposable, DOCS_NORMAL_EDITOR_UNIT_ID_KEY, generateRandomId, Inject, IUniverInstanceService, ObjectMatrix, Range, TextX, Tools } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; import { ClearSelectionAllCommand, ClearSelectionContentCommand, ClearSelectionFormatCommand, getSheetCommandTarget, SetRangeValuesCommand, SheetInterceptorService, SheetsSelectionsService } from '@univerjs/sheets'; import { AddHyperLinkMutation, HyperLinkModel, RemoveHyperLinkMutation } from '@univerjs/sheets-hyper-link'; import { IEditorBridgeService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; -import type { IMutationInfo } from '@univerjs/core'; -import type { ISetRangeValuesMutationParams } from '@univerjs/sheets'; -@OnLifecycle(LifecycleStages.Starting, SheetHyperLinkSetRangeController) export class SheetHyperLinkSetRangeController extends Disposable { constructor( @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService, diff --git a/packages/sheets-hyper-link-ui/src/controllers/ui.controller.ts b/packages/sheets-hyper-link-ui/src/controllers/ui.controller.ts index 1dd7de6d0b8..45b61450eb0 100644 --- a/packages/sheets-hyper-link-ui/src/controllers/ui.controller.ts +++ b/packages/sheets-hyper-link-ui/src/controllers/ui.controller.ts @@ -14,19 +14,18 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; -import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; +import { Disposable, ICommandService, Inject, Injector } from '@univerjs/core'; import { LinkSingle } from '@univerjs/icons'; -import { CellLinkPopup } from '../views/CellLinkPopup'; -import { CellLinkEdit } from '../views/CellLinkEdit'; -import { CloseHyperLinkPopupOperation, InsertHyperLinkOperation, InsertHyperLinkToolbarOperation, OpenHyperLinkEditPanelOperation } from '../commands/operations/popup.operations'; +import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; import { AddHyperLinkCommand, AddRichHyperLinkCommand } from '../commands/commands/add-hyper-link.command'; -import { UpdateHyperLinkCommand, UpdateRichHyperLinkCommand } from '../commands/commands/update-hyper-link.command'; import { CancelHyperLinkCommand, CancelRichHyperLinkCommand } from '../commands/commands/remove-hyper-link.command'; -import { menuSchema } from './menu.schema'; +import { UpdateHyperLinkCommand, UpdateRichHyperLinkCommand } from '../commands/commands/update-hyper-link.command'; +import { CloseHyperLinkPopupOperation, InsertHyperLinkOperation, InsertHyperLinkToolbarOperation, OpenHyperLinkEditPanelOperation } from '../commands/operations/popup.operations'; +import { CellLinkEdit } from '../views/CellLinkEdit'; +import { CellLinkPopup } from '../views/CellLinkPopup'; import { InsertLinkShortcut } from './menu'; +import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Ready, SheetsHyperLinkUIController) export class SheetsHyperLinkUIController extends Disposable { constructor( @Inject(ComponentManager) private _componentManager: ComponentManager, diff --git a/packages/sheets-hyper-link-ui/src/controllers/url.controller.ts b/packages/sheets-hyper-link-ui/src/controllers/url.controller.ts index 41f65c3a39c..fd1dcc5361f 100644 --- a/packages/sheets-hyper-link-ui/src/controllers/url.controller.ts +++ b/packages/sheets-hyper-link-ui/src/controllers/url.controller.ts @@ -14,10 +14,9 @@ * limitations under the License. */ -import { Disposable, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, Inject } from '@univerjs/core'; import { SheetsHyperLinkResolverService } from '../services/resolver.service'; -@OnLifecycle(LifecycleStages.Rendered, SheetHyperLinkUrlController) export class SheetHyperLinkUrlController extends Disposable { constructor( @Inject(SheetsHyperLinkResolverService) private _resolverService: SheetsHyperLinkResolverService diff --git a/packages/sheets-hyper-link-ui/src/plugin.ts b/packages/sheets-hyper-link-ui/src/plugin.ts index 3c9fdb7eddb..d782786677e 100644 --- a/packages/sheets-hyper-link-ui/src/plugin.ts +++ b/packages/sheets-hyper-link-ui/src/plugin.ts @@ -73,12 +73,26 @@ export class UniverSheetsHyperLinkUIPlugin extends Plugin { [SheetHyperLinkUrlController], [SheetsHyperLinkRichTextRefRangeController], ]; - dependencies.forEach((dep) => this._injector.add(dep)); + + this._injector.get(SheetsHyperLinkRenderManagerController); + this._injector.get(SheetsHyperLinkRichTextRefRangeController); + this._injector.get(SheetHyperLinkSetRangeController); } override onReady(): void { const renderManager = this._injector.get(IRenderManagerService); renderManager.registerRenderModule(UniverInstanceType.UNIVER_SHEET, [SheetsHyperLinkRenderController] as Dependency); + + this._injector.get(SheetsHyperLinkAutoFillController); + this._injector.get(SheetsHyperLinkCopyPasteController); + this._injector.get(SheetsHyperLinkRemoveSheetController); + this._injector.get(SheetsHyperLinkUIController); + } + + override onRendered(): void { + this._injector.get(SheetsHyperLinkPermissionController); + this._injector.get(SheetHyperLinkUrlController); + this._injector.get(SheetsHyperLinkPopupController); } } diff --git a/packages/sheets-hyper-link/src/controllers/ref-range.controller.ts b/packages/sheets-hyper-link/src/controllers/ref-range.controller.ts index e2a72544b08..99816474018 100644 --- a/packages/sheets-hyper-link/src/controllers/ref-range.controller.ts +++ b/packages/sheets-hyper-link/src/controllers/ref-range.controller.ts @@ -15,15 +15,14 @@ */ import type { IDisposable, IRange, Nullable } from '@univerjs/core'; -import { Disposable, ICommandService, Inject, isValidRange, LifecycleStages, OnLifecycle, sequenceExecuteAsync, toDisposable } from '@univerjs/core'; import type { EffectRefRangeParams } from '@univerjs/sheets'; -import { handleCommonRangeChangeWithEffectRefCommandsSkipNoInterests, handleDefaultRangeChangeWithEffectRefCommandsSkipNoInterests, RefRangeService, SheetsSelectionsService } from '@univerjs/sheets'; import type { IAddHyperLinkMutationParams, ICellHyperLink, IRemoveHyperLinkMutationParams, IUpdateHyperLinkMutationParams, IUpdateHyperLinkRefMutationParams } from '@univerjs/sheets-hyper-link'; -import { AddHyperLinkMutation, HyperLinkModel, RemoveHyperLinkMutation, UpdateHyperLinkMutation, UpdateHyperLinkRefMutation } from '@univerjs/sheets-hyper-link'; +import { Disposable, ICommandService, Inject, isValidRange, sequenceExecuteAsync, toDisposable } from '@univerjs/core'; import { deserializeRangeWithSheet, serializeRange } from '@univerjs/engine-formula'; +import { handleCommonRangeChangeWithEffectRefCommandsSkipNoInterests, handleDefaultRangeChangeWithEffectRefCommandsSkipNoInterests, RefRangeService, SheetsSelectionsService } from '@univerjs/sheets'; +import { AddHyperLinkMutation, HyperLinkModel, RemoveHyperLinkMutation, UpdateHyperLinkMutation, UpdateHyperLinkRefMutation } from '@univerjs/sheets-hyper-link'; import { ERROR_RANGE } from '../types/const'; -@OnLifecycle(LifecycleStages.Starting, SheetsHyperLinkRefRangeController) export class SheetsHyperLinkRefRangeController extends Disposable { private _disposableMap = new Map(); private _watchDisposableMap = new Map(); diff --git a/packages/sheets-hyper-link/src/controllers/sheet-hyper-link-resource.controller.ts b/packages/sheets-hyper-link/src/controllers/sheet-hyper-link-resource.controller.ts index 0ba555216b9..54499c6e873 100644 --- a/packages/sheets-hyper-link/src/controllers/sheet-hyper-link-resource.controller.ts +++ b/packages/sheets-hyper-link/src/controllers/sheet-hyper-link-resource.controller.ts @@ -14,15 +14,14 @@ * limitations under the License. */ -import { Disposable, Inject, IResourceManagerService, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import type { ICellHyperLink } from '../types/interfaces/i-hyper-link'; +import { Disposable, Inject, IResourceManagerService } from '@univerjs/core'; import { UniverType } from '@univerjs/protocol'; import { HyperLinkModel } from '../models/hyper-link.model'; -import type { ICellHyperLink } from '../types/interfaces/i-hyper-link'; import { SHEET_HYPER_LINK_PLUGIN } from '../types/const'; type UnitHyperLinkJSON = Record; -@OnLifecycle(LifecycleStages.Starting, SheetsHyperLinkResourceController) export class SheetsHyperLinkResourceController extends Disposable { constructor( @IResourceManagerService private readonly _resourceManagerService: IResourceManagerService, diff --git a/packages/sheets-hyper-link/src/controllers/sheet-hyper-link.controller.ts b/packages/sheets-hyper-link/src/controllers/sheet-hyper-link.controller.ts index fe10106ba6d..45c728b95ad 100644 --- a/packages/sheets-hyper-link/src/controllers/sheet-hyper-link.controller.ts +++ b/packages/sheets-hyper-link/src/controllers/sheet-hyper-link.controller.ts @@ -14,12 +14,11 @@ * limitations under the License. */ -import { Disposable, ICommandService, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService } from '@univerjs/core'; import { AddHyperLinkMutation } from '../commands/mutations/add-hyper-link.mutation'; -import { UpdateHyperLinkMutation, UpdateHyperLinkRefMutation } from '../commands/mutations/update-hyper-link.mutation'; import { RemoveHyperLinkMutation } from '../commands/mutations/remove-hyper-link.mutation'; +import { UpdateHyperLinkMutation, UpdateHyperLinkRefMutation } from '../commands/mutations/update-hyper-link.mutation'; -@OnLifecycle(LifecycleStages.Starting, SheetsHyperLinkController) export class SheetsHyperLinkController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService diff --git a/packages/sheets-hyper-link/src/plugin.ts b/packages/sheets-hyper-link/src/plugin.ts index e3d6ec1607e..cb518001538 100644 --- a/packages/sheets-hyper-link/src/plugin.ts +++ b/packages/sheets-hyper-link/src/plugin.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; +import type { IUniverSheetsHyperLinkConfig } from './controllers/config.schema'; +import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { UniverSheetsPlugin } from '@univerjs/sheets'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; +import { SheetsHyperLinkRefRangeController } from './controllers/ref-range.controller'; import { SheetsHyperLinkController } from './controllers/sheet-hyper-link.controller'; +import { SheetsHyperLinkResourceController } from './controllers/sheet-hyper-link-resource.controller'; import { HyperLinkModel } from './models/hyper-link.model'; import { SHEET_HYPER_LINK_PLUGIN } from './types/const'; -import { SheetsHyperLinkResourceController } from './controllers/sheet-hyper-link-resource.controller'; -import { SheetsHyperLinkRefRangeController } from './controllers/ref-range.controller'; -import type { IUniverSheetsHyperLinkConfig } from './controllers/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; @DependentOn(UniverSheetsPlugin) export class UniverSheetsHyperLinkPlugin extends Plugin { @@ -51,5 +51,9 @@ export class UniverSheetsHyperLinkPlugin extends Plugin { ] as Dependency[]).forEach((dep) => { this._injector.add(dep); }); + + this._injector.get(SheetsHyperLinkRefRangeController); + this._injector.get(SheetsHyperLinkResourceController); + this._injector.get(SheetsHyperLinkController); } } diff --git a/packages/sheets-numfmt/src/controllers/__tests__/test.util.ts b/packages/sheets-numfmt/src/controllers/__tests__/test.util.ts index ff68f8097aa..e27b5cf949a 100644 --- a/packages/sheets-numfmt/src/controllers/__tests__/test.util.ts +++ b/packages/sheets-numfmt/src/controllers/__tests__/test.util.ts @@ -73,6 +73,10 @@ export const createTestBed = (dependencies?: Dependency[]) => { injector.get(SheetInterceptorService); } + + override onRendered(): void { + this._injector.get(INumfmtService); + } } univer.registerPlugin(TestPlugin); diff --git a/packages/sheets-numfmt/src/controllers/numfmt.cell-content.controller.ts b/packages/sheets-numfmt/src/controllers/numfmt.cell-content.controller.ts index 418bdedb3df..66d112967f4 100644 --- a/packages/sheets-numfmt/src/controllers/numfmt.cell-content.controller.ts +++ b/packages/sheets-numfmt/src/controllers/numfmt.cell-content.controller.ts @@ -14,6 +14,12 @@ * limitations under the License. */ +import type { + ICellData, + ICellDataForSheetInterceptor, + Workbook, +} from '@univerjs/core'; +import type { ISetNumfmtMutationParams, ISetRangeValuesMutationParams } from '@univerjs/sheets'; import { CellValueType, Disposable, @@ -21,26 +27,17 @@ import { Inject, InterceptorEffectEnum, IUniverInstanceService, - LifecycleStages, LocaleService, ObjectMatrix, - OnLifecycle, Range, ThemeService, UniverInstanceType, } from '@univerjs/core'; import { InterceptCellContentPriority, INTERCEPTOR_POINT, INumfmtService, SetNumfmtMutation, SetRangeValuesMutation, SheetInterceptorService } from '@univerjs/sheets'; -import { of, skip, switchMap } from 'rxjs'; -import type { - ICellData, - ICellDataForSheetInterceptor, - Workbook, -} from '@univerjs/core'; -import type { ISetNumfmtMutationParams, ISetRangeValuesMutationParams } from '@univerjs/sheets'; +import { of, skip, switchMap } from 'rxjs'; import { getPatternPreviewIgnoreGeneral } from '../utils/pattern'; -@OnLifecycle(LifecycleStages.Rendered, SheetsNumfmtCellContentController) export class SheetsNumfmtCellContentController extends Disposable { constructor( @IUniverInstanceService private readonly _instanceService: IUniverInstanceService, diff --git a/packages/sheets-numfmt/src/controllers/numfmt.controller.ts b/packages/sheets-numfmt/src/controllers/numfmt.controller.ts index 4da6949d256..d0598d4668e 100644 --- a/packages/sheets-numfmt/src/controllers/numfmt.controller.ts +++ b/packages/sheets-numfmt/src/controllers/numfmt.controller.ts @@ -14,6 +14,11 @@ * limitations under the License. */ +import type { IDisposable, IRange, Workbook } from '@univerjs/core'; +import type { ISetNumfmtMutationParams } from '@univerjs/sheets'; +import type { ISetNumfmtCommandParams } from '../commands/commands/set-numfmt.command'; +import type { ISheetNumfmtPanelProps } from '../components/index'; +import type { INumfmtController } from './type'; import { CellValueType, Disposable, @@ -22,9 +27,7 @@ import { Inject, InterceptorEffectEnum, IUniverInstanceService, - LifecycleStages, LocaleService, - OnLifecycle, Range, ThemeService, toDisposable, @@ -39,13 +42,11 @@ import { SheetInterceptorService, SheetsSelectionsService, } from '@univerjs/sheets'; + import { SheetSkeletonManagerService } from '@univerjs/sheets-ui'; import { ComponentManager, ISidebarService } from '@univerjs/ui'; import { combineLatest, Observable } from 'rxjs'; import { debounceTime, map, switchMap, tap } from 'rxjs/operators'; -import type { IDisposable, IRange, Workbook } from '@univerjs/core'; - -import type { ISetNumfmtMutationParams } from '@univerjs/sheets'; import { SHEET_NUMFMT_PLUGIN } from '../base/const/PLUGIN_NAME'; import { AddDecimalCommand } from '../commands/commands/add-decimal.command'; import { SetCurrencyCommand } from '../commands/commands/set-currency.command'; @@ -56,11 +57,7 @@ import { CloseNumfmtPanelOperator } from '../commands/operations/close.numfmt.pa import { OpenNumfmtPanelOperator } from '../commands/operations/open.numfmt.panel.operation'; import { SheetNumfmtPanel } from '../components/index'; import { getPatternPreviewIgnoreGeneral, getPatternType } from '../utils/pattern'; -import type { ISetNumfmtCommandParams } from '../commands/commands/set-numfmt.command'; -import type { ISheetNumfmtPanelProps } from '../components/index'; -import type { INumfmtController } from './type'; -@OnLifecycle(LifecycleStages.Rendered, NumfmtController) export class NumfmtController extends Disposable implements INumfmtController { /** * If _previewPattern is null ,the realTimeRenderingInterceptor will skip and if it is '',realTimeRenderingInterceptor will clear numfmt. diff --git a/packages/sheets-numfmt/src/controllers/numfmt.currency.controller.ts b/packages/sheets-numfmt/src/controllers/numfmt.currency.controller.ts index fde35b6afd3..87db5833127 100644 --- a/packages/sheets-numfmt/src/controllers/numfmt.currency.controller.ts +++ b/packages/sheets-numfmt/src/controllers/numfmt.currency.controller.ts @@ -14,22 +14,14 @@ * limitations under the License. */ -import { Disposable, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; - -import { BehaviorSubject } from 'rxjs'; import type { countryCurrencyMap } from '../base/const/CURRENCY-SYMBOLS'; +import { Disposable } from '@univerjs/core'; +import { BehaviorSubject } from 'rxjs'; -@OnLifecycle(LifecycleStages.Rendered, NumfmtCurrencyController) export class NumfmtCurrencyController extends Disposable { private _currencySymbol$ = new BehaviorSubject('US'); public readonly currencySymbol$ = this._currencySymbol$.asObservable(); - constructor( - @Inject(Injector) private _injector: Injector - ) { - super(); - } - /** * Set the currency symbol by setting the country code. */ diff --git a/packages/sheets-numfmt/src/controllers/numfmt.editor.controller.ts b/packages/sheets-numfmt/src/controllers/numfmt.editor.controller.ts index 78ebb9b33ad..79917180be4 100644 --- a/packages/sheets-numfmt/src/controllers/numfmt.editor.controller.ts +++ b/packages/sheets-numfmt/src/controllers/numfmt.editor.controller.ts @@ -15,25 +15,23 @@ */ import type { IRange, Nullable, Workbook } from '@univerjs/core'; +import type { + INumfmtItemWithCache, + IRemoveNumfmtMutationParams, + ISetCellsNumfmt, + ISetNumfmtMutationParams, +} from '@univerjs/sheets'; import { CellValueType, Disposable, Inject, Injector, IUniverInstanceService, - LifecycleStages, numfmt, - OnLifecycle, Optional, toDisposable, UniverInstanceType, } from '@univerjs/core'; -import type { - INumfmtItemWithCache, - IRemoveNumfmtMutationParams, - ISetCellsNumfmt, - ISetNumfmtMutationParams, -} from '@univerjs/sheets'; import { factoryRemoveNumfmtUndoMutation, factorySetNumfmtUndoMutation, @@ -69,7 +67,7 @@ const createCollectEffectMutation = () => { clean, }; }; -@OnLifecycle(LifecycleStages.Rendered, NumfmtEditorController) + export class NumfmtEditorController extends Disposable { // collect effect mutations when edit end and push this to commands stack in next commands progress private _collectEffectMutation = createCollectEffectMutation(); @@ -160,7 +158,6 @@ export class NumfmtEditorController extends Disposable { ); const currentNumfmtType = (currentNumfmtValue && getPatternType(currentNumfmtValue.pattern)) ?? ''; const clean = () => { - // eslint-disable-next-line ts/no-unused-expressions currentNumfmtValue && this._collectEffectMutation.add( context.unitId, diff --git a/packages/sheets-numfmt/src/controllers/numfmt.menu.controller.ts b/packages/sheets-numfmt/src/controllers/numfmt.menu.controller.ts index 0f1a95947c5..f0dc57e11af 100644 --- a/packages/sheets-numfmt/src/controllers/numfmt.menu.controller.ts +++ b/packages/sheets-numfmt/src/controllers/numfmt.menu.controller.ts @@ -14,20 +14,19 @@ * limitations under the License. */ -import { Disposable, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, Inject } from '@univerjs/core'; import { ComponentManager, IMenuManagerService } from '@univerjs/ui'; import { MORE_NUMFMT_TYPE_KEY, MoreNumfmtType, Options, OPTIONS_KEY } from '../components/more-numfmt-type/MoreNumfmtType'; import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Rendered, NumfmtMenuController) export class NumfmtMenuController extends Disposable { constructor( - @Inject(Injector) private _injector: Injector, @Inject(ComponentManager) private _componentManager: ComponentManager, @IMenuManagerService private readonly _menuManagerService: IMenuManagerService ) { super(); + this._initMenu(); } diff --git a/packages/sheets-numfmt/src/controllers/type.ts b/packages/sheets-numfmt/src/controllers/type.ts index 6efe9b9d881..181217519c0 100644 --- a/packages/sheets-numfmt/src/controllers/type.ts +++ b/packages/sheets-numfmt/src/controllers/type.ts @@ -14,10 +14,9 @@ * limitations under the License. */ -import { createIdentifier, LifecycleStages, runOnLifecycle } from '@univerjs/core'; +import { createIdentifier } from '@univerjs/core'; +export const INumfmtController = createIdentifier('INumfmtController'); export interface INumfmtController { openPanel(): void; } -export const INumfmtController = createIdentifier('INumfmtController'); -runOnLifecycle(LifecycleStages.Rendered, INumfmtController); diff --git a/packages/sheets-numfmt/src/numfmt-plugin.ts b/packages/sheets-numfmt/src/numfmt-plugin.ts index b9b1ed98aa6..be84aa63fee 100644 --- a/packages/sheets-numfmt/src/numfmt-plugin.ts +++ b/packages/sheets-numfmt/src/numfmt-plugin.ts @@ -14,22 +14,21 @@ * limitations under the License. */ -import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; +import type { IUniverSheetsNumfmtConfig } from './controllers/config.schema'; +import { DependentOn, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { UniverSheetsPlugin } from '@univerjs/sheets'; import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; import { SHEET_NUMFMT_PLUGIN } from './base/const/PLUGIN_NAME'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { SheetsNumfmtCellContentController } from './controllers/numfmt.cell-content.controller'; import { NumfmtController } from './controllers/numfmt.controller'; +import { NumfmtCurrencyController } from './controllers/numfmt.currency.controller'; import { NumfmtEditorController } from './controllers/numfmt.editor.controller'; -import { NumfmtI18nController } from './controllers/numfmt.i18n.controller'; import { NumfmtMenuController } from './controllers/numfmt.menu.controller'; -import { NumfmtCurrencyController } from './controllers/numfmt.currency.controller'; import { INumfmtController } from './controllers/type'; import { UserHabitController } from './controllers/user-habit.controller'; import { MenuCurrencyService } from './service/menu.currency.service'; -import type { IUniverSheetsNumfmtConfig } from './controllers/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; @DependentOn(UniverSheetsPlugin, UniverSheetsUIPlugin) export class UniverSheetsNumfmtPlugin extends Plugin { @@ -56,9 +55,16 @@ export class UniverSheetsNumfmtPlugin extends Plugin { this._injector.add([NumfmtEditorController]); this._injector.add([UserHabitController]); this._injector.add([SheetsNumfmtCellContentController]); - this._injector.add([NumfmtI18nController]); this._injector.add([MenuCurrencyService]); this._injector.add([NumfmtCurrencyController]); this._injector.add([NumfmtMenuController]); } + + override onRendered(): void { + this._injector.get(INumfmtController); + this._injector.get(SheetsNumfmtCellContentController); + this._injector.get(NumfmtCurrencyController); + this._injector.get(NumfmtEditorController); + this._injector.get(NumfmtMenuController); + } } diff --git a/packages/sheets-sort-ui/src/controllers/sheets-sort-ui.controller.ts b/packages/sheets-sort-ui/src/controllers/sheets-sort-ui.controller.ts index 25477bc7057..72c4413a412 100644 --- a/packages/sheets-sort-ui/src/controllers/sheets-sort-ui.controller.ts +++ b/packages/sheets-sort-ui/src/controllers/sheets-sort-ui.controller.ts @@ -14,19 +14,19 @@ * limitations under the License. */ -import { connectInjector, ICommandService, Inject, Injector, LifecycleStages, LocaleService, OnLifecycle, RxDisposable } from '@univerjs/core'; - import type { UIPartsService } from '@univerjs/ui'; -import { ComponentManager, IDialogService, ILayoutService, IMenuManagerService, IUIPartsService } from '@univerjs/ui'; -import { takeUntil } from 'rxjs'; + +import type { ISheetSortLocation } from '../services/sheets-sort-ui.service'; +import { connectInjector, ICommandService, Inject, Injector, LocaleService, RxDisposable } from '@univerjs/core'; import { serializeRange } from '@univerjs/engine-formula'; import { AscendingSingle, CustomSortSingle, DescendingSingle, ExpandAscendingSingle, ExpandDescendingSingle } from '@univerjs/icons'; -import { SheetsRenderService, SheetsUIPart } from '@univerjs/sheets-ui'; import { SortRangeCommand } from '@univerjs/sheets-sort'; +import { SheetsRenderService, SheetsUIPart } from '@univerjs/sheets-ui'; +import { ComponentManager, IDialogService, ILayoutService, IMenuManagerService, IUIPartsService } from '@univerjs/ui'; +import { takeUntil } from 'rxjs'; import { SortRangeAscCommand, SortRangeAscExtCommand, SortRangeAscExtInCtxMenuCommand, SortRangeAscInCtxMenuCommand, SortRangeCustomCommand, SortRangeCustomInCtxMenuCommand, SortRangeDescCommand, SortRangeDescExtCommand, SortRangeDescExtInCtxMenuCommand, SortRangeDescInCtxMenuCommand } from '../commands/commands/sheets-sort.command'; -import { CustomSortPanel } from '../views/CustomSortPanel'; -import type { ISheetSortLocation } from '../services/sheets-sort-ui.service'; import { SheetsSortUIService } from '../services/sheets-sort-ui.service'; +import { CustomSortPanel } from '../views/CustomSortPanel'; import EmbedSortBtn from '../views/EmbedSortBtn'; import { menuSchema } from './menu.schema'; import { SHEETS_SORT_ASC_EXT_ICON, SHEETS_SORT_ASC_ICON, SHEETS_SORT_CUSTOM_ICON, SHEETS_SORT_DESC_EXT_ICON, SHEETS_SORT_DESC_ICON } from './sheets-sort.menu'; @@ -34,7 +34,6 @@ import { SHEETS_SORT_ASC_EXT_ICON, SHEETS_SORT_ASC_ICON, SHEETS_SORT_CUSTOM_ICON const CUSTOM_SORT_DIALOG_ID = 'custom-sort-dialog'; const CUSTOM_SORT_PANEL_WIDTH = 560; -@OnLifecycle(LifecycleStages.Ready, SheetsSortUIController) export class SheetsSortUIController extends RxDisposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/sheets-sort-ui/src/plugin.ts b/packages/sheets-sort-ui/src/plugin.ts index 16eb7f7e90d..3764cc57612 100644 --- a/packages/sheets-sort-ui/src/plugin.ts +++ b/packages/sheets-sort-ui/src/plugin.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import type { Dependency } from '@univerjs/core'; +import type { IUniverSheetsSortUIConfig } from './controllers/config.schema'; import { DependentOn, IConfigService, @@ -22,13 +24,10 @@ import { Plugin, UniverInstanceType, } from '@univerjs/core'; -import type { Dependency } from '@univerjs/core'; - import { UniverSheetsSortPlugin } from '@univerjs/sheets-sort'; -import { SheetsSortUIService } from './services/sheets-sort-ui.service'; -import { SheetsSortUIController } from './controllers/sheets-sort-ui.controller'; -import type { IUniverSheetsSortUIConfig } from './controllers/config.schema'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; +import { SheetsSortUIController } from './controllers/sheets-sort-ui.controller'; +import { SheetsSortUIService } from './services/sheets-sort-ui.service'; const NAME = 'SHEET_SORT_UI_PLUGIN'; @@ -55,4 +54,8 @@ export class UniverSheetsSortUIPlugin extends Plugin { [SheetsSortUIController], ] as Dependency[]).forEach((d) => this._injector.add(d)); } + + override onRendered(): void { + this._injector.get(SheetsSortUIController); + } } diff --git a/packages/sheets-sort-ui/src/services/sheets-sort-ui.service.tsx b/packages/sheets-sort-ui/src/services/sheets-sort-ui.service.tsx index 9e274177621..3d11d4d432e 100644 --- a/packages/sheets-sort-ui/src/services/sheets-sort-ui.service.tsx +++ b/packages/sheets-sort-ui/src/services/sheets-sort-ui.service.tsx @@ -15,27 +15,25 @@ */ import type { IRange, Nullable, Workbook, Worksheet } from '@univerjs/core'; +import type { ISheetRangeLocation } from '@univerjs/sheets'; + +import type { ISortOption } from '@univerjs/sheets-sort'; import { Disposable, ICommandService, ILogService, Inject, IUniverInstanceService, - LifecycleStages, LocaleService, LocaleType, - OnLifecycle, Tools, UniverInstanceType, } from '@univerjs/core'; import { expandToContinuousRange, getPrimaryForRange, SetSelectionsOperation, SheetsSelectionsService } from '@univerjs/sheets'; -import type { ISheetRangeLocation } from '@univerjs/sheets'; - -import type { ISortOption } from '@univerjs/sheets-sort'; import { SheetsSortService, SortType } from '@univerjs/sheets-sort'; -import React from 'react'; import { IConfirmService } from '@univerjs/ui'; +import React from 'react'; import { BehaviorSubject } from 'rxjs'; import { ExtendConfirm } from '../views/ExtendConfirm'; @@ -61,7 +59,6 @@ const SORT_ERROR_MESSAGE = { FORMULA_ARRAY: 'sheets-sort.error.formula-array', }; -@OnLifecycle(LifecycleStages.Ready, SheetsSortService) export class SheetsSortUIService extends Disposable { private readonly _customSortState$ = new BehaviorSubject>(null); readonly customSortState$ = this._customSortState$.asObservable(); diff --git a/packages/sheets-sort/src/commands/commands/__tests__/create-command-test-bed.ts b/packages/sheets-sort/src/commands/commands/__tests__/create-command-test-bed.ts index 399d485b056..6599cf63bfd 100644 --- a/packages/sheets-sort/src/commands/commands/__tests__/create-command-test-bed.ts +++ b/packages/sheets-sort/src/commands/commands/__tests__/create-command-test-bed.ts @@ -16,11 +16,11 @@ import type { Dependency, IWorkbookData, Workbook } from '@univerjs/core'; import { BooleanNumber, ILogService, Inject, Injector, IUniverInstanceService, LocaleService, LocaleType, LogLevel, Plugin, Tools, Univer, UniverInstanceType } from '@univerjs/core'; -import { SheetInterceptorService, SheetsSelectionsService } from '@univerjs/sheets'; import { FormulaDataModel } from '@univerjs/engine-formula'; +import { SheetInterceptorService, SheetsSelectionsService } from '@univerjs/sheets'; +import { SheetsSortController } from '../../../controllers/sheets-sort.controller'; import enUS from '../../../locale/en-US'; import { SheetsSortService } from '../../../services/sheets-sort.service'; -import { SheetsSortController } from '../../../controllers/sheets-sort.controller'; const TEST_WORKBOOK_DATA_DEMO: IWorkbookData = { id: 'test', @@ -147,6 +147,10 @@ export function createCommandTestBed(workbookData?: IWorkbookData, dependencies? dependencies?.forEach((d) => injector.add(d)); } + + override onReady(): void { + this._injector.get(SheetsSortController); + } } univer.registerPlugin(TestPlugin); diff --git a/packages/sheets-sort/src/commands/commands/__tests__/sheets-reorder.command.spec.ts b/packages/sheets-sort/src/commands/commands/__tests__/sheets-reorder.command.spec.ts index 50aad32359b..9a6e4cbdf23 100644 --- a/packages/sheets-sort/src/commands/commands/__tests__/sheets-reorder.command.spec.ts +++ b/packages/sheets-sort/src/commands/commands/__tests__/sheets-reorder.command.spec.ts @@ -15,10 +15,10 @@ */ import type { ICellData, Injector, Nullable, Univer, Workbook } from '@univerjs/core'; +import type { ISortRangeCommandParams } from '../sheets-sort.command'; import { ICommandService, IUniverInstanceService } from '@univerjs/core'; -import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { ReorderRangeCommand, ReorderRangeMutation, SetSelectionsOperation } from '@univerjs/sheets'; -import type { ISortRangeCommandParams } from '../sheets-sort.command'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { SortRangeCommand } from '../sheets-sort.command'; import { createCommandTestBed } from './create-command-test-bed'; diff --git a/packages/sheets-sort/src/controllers/sheets-sort.controller.ts b/packages/sheets-sort/src/controllers/sheets-sort.controller.ts index 3f967a3c402..ac2ab1ec247 100644 --- a/packages/sheets-sort/src/controllers/sheets-sort.controller.ts +++ b/packages/sheets-sort/src/controllers/sheets-sort.controller.ts @@ -15,16 +15,15 @@ */ import type { ICellData, Nullable } from '@univerjs/core'; -import { CellValueType, Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; - import type { ICellValueCompareFn } from '../commands/commands/sheets-sort.command'; + +import { CellValueType, Disposable, ICommandService, Inject } from '@univerjs/core'; import { SortRangeCommand } from '../commands/commands/sheets-sort.command'; import { SheetsSortService } from '../services/sheets-sort.service'; import { compareNull, compareNumber, compareString, isNullValue } from './utils'; export type ICommonComparableCellValue = number | string | null; -@OnLifecycle(LifecycleStages.Ready, SheetsSortController) export class SheetsSortController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/sheets-sort/src/plugin.ts b/packages/sheets-sort/src/plugin.ts index f965788d572..981b4baad94 100644 --- a/packages/sheets-sort/src/plugin.ts +++ b/packages/sheets-sort/src/plugin.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; +import type { IUniverSheetsSortConfig } from './controllers/config.schema'; +import { IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { SheetsSortController } from './controllers/sheets-sort.controller'; import { SheetsSortService } from './services/sheets-sort.service'; -import type { IUniverSheetsSortConfig } from './controllers/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; const NAME = 'SHEET_SORT_PLUGIN'; @@ -46,4 +46,8 @@ export class UniverSheetsSortPlugin extends Plugin { [SheetsSortService], ] as Dependency[]).forEach((d) => this._injector.add(d)); } + + override onReady(): void { + this._injector.get(SheetsSortController); + } } diff --git a/packages/sheets-sort/src/services/sheets-sort.service.ts b/packages/sheets-sort/src/services/sheets-sort.service.ts index 4a13f2701fc..ab49a7e70c8 100644 --- a/packages/sheets-sort/src/services/sheets-sort.service.ts +++ b/packages/sheets-sort/src/services/sheets-sort.service.ts @@ -15,24 +15,20 @@ */ import type { IRange, Workbook } from '@univerjs/core'; +import type { ISheetRangeLocation } from '@univerjs/sheets'; +import type { ISortOption } from './interface'; import { Disposable, ICommandService, Inject, IUniverInstanceService, - LifecycleStages, - OnLifecycle, Rectangle, } from '@univerjs/core'; - -import type { ISheetRangeLocation } from '@univerjs/sheets'; -import { getSheetCommandTarget } from '@univerjs/sheets'; import { FormulaDataModel } from '@univerjs/engine-formula'; +import { getSheetCommandTarget } from '@univerjs/sheets'; import { type ICellValueCompareFn, SortRangeCommand } from '../commands/commands/sheets-sort.command'; import { isNullValue } from '../controllers/utils'; -import type { ISortOption } from './interface'; -@OnLifecycle(LifecycleStages.Ready, SheetsSortService) export class SheetsSortService extends Disposable { private _compareFns: ICellValueCompareFn[] = []; diff --git a/packages/sheets-thread-comment-base/src/controllers/sheets-thread-comment-ref-range.controller.ts b/packages/sheets-thread-comment-base/src/controllers/sheets-thread-comment-ref-range.controller.ts index d28e9bd5ab8..5abc2859d7c 100644 --- a/packages/sheets-thread-comment-base/src/controllers/sheets-thread-comment-ref-range.controller.ts +++ b/packages/sheets-thread-comment-base/src/controllers/sheets-thread-comment-ref-range.controller.ts @@ -15,16 +15,15 @@ */ import type { IDisposable, IRange, Nullable } from '@univerjs/core'; -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle, sequenceExecuteAsync, toDisposable } from '@univerjs/core'; import type { EffectRefRangeParams } from '@univerjs/sheets'; -import { handleCommonRangeChangeWithEffectRefCommandsSkipNoInterests, RefRangeService, SheetsSelectionsService } from '@univerjs/sheets'; import type { IAddCommentMutationParams, IUpdateCommentRefMutationParams } from '@univerjs/thread-comment'; -import { AddCommentMutation, DeleteCommentMutation, ThreadCommentModel, UpdateCommentRefMutation } from '@univerjs/thread-comment'; -import { serializeRange, singleReferenceToGrid } from '@univerjs/engine-formula'; import type { ISheetThreadComment } from '../types/interfaces/i-sheet-thread-comment'; +import { Disposable, ICommandService, Inject, sequenceExecuteAsync, toDisposable } from '@univerjs/core'; +import { serializeRange, singleReferenceToGrid } from '@univerjs/engine-formula'; +import { handleCommonRangeChangeWithEffectRefCommandsSkipNoInterests, RefRangeService, SheetsSelectionsService } from '@univerjs/sheets'; +import { AddCommentMutation, DeleteCommentMutation, ThreadCommentModel, UpdateCommentRefMutation } from '@univerjs/thread-comment'; import { SheetsThreadCommentModel } from '../models/sheets-thread-comment.model'; -@OnLifecycle(LifecycleStages.Starting, SheetsThreadCommentRefRangeController) export class SheetsThreadCommentRefRangeController extends Disposable { private _disposableMap = new Map(); private _watcherMap = new Map(); diff --git a/packages/sheets-thread-comment-base/src/plugin.ts b/packages/sheets-thread-comment-base/src/plugin.ts index 1dc14f914ab..6098d735e3f 100644 --- a/packages/sheets-thread-comment-base/src/plugin.ts +++ b/packages/sheets-thread-comment-base/src/plugin.ts @@ -41,5 +41,7 @@ export class UniverSheetsThreadCommentBasePlugin extends Plugin { ] as Dependency[]).forEach((dep) => { this._injector.add(dep); }); + + this._injector.get(SheetsThreadCommentRefRangeController); } } diff --git a/packages/sheets-thread-comment/src/controllers/render-controllers/render.controller.ts b/packages/sheets-thread-comment/src/controllers/render-controllers/render.controller.ts index baa3a491396..81674184761 100644 --- a/packages/sheets-thread-comment/src/controllers/render-controllers/render.controller.ts +++ b/packages/sheets-thread-comment/src/controllers/render-controllers/render.controller.ts @@ -15,13 +15,12 @@ */ import type { Workbook } from '@univerjs/core'; -import { Disposable, Inject, InterceptorEffectEnum, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import { Disposable, Inject, InterceptorEffectEnum, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; import { INTERCEPTOR_POINT, SheetInterceptorService } from '@univerjs/sheets'; import { SheetsThreadCommentModel } from '@univerjs/sheets-thread-comment-base'; import { debounceTime } from 'rxjs'; -@OnLifecycle(LifecycleStages.Ready, SheetsThreadCommentRenderController) export class SheetsThreadCommentRenderController extends Disposable { constructor( @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService, diff --git a/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-copy-paste.controller.ts b/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-copy-paste.controller.ts index b33bdf85334..30a9eae91c2 100644 --- a/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-copy-paste.controller.ts +++ b/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-copy-paste.controller.ts @@ -15,11 +15,11 @@ */ import type { IMutationInfo, IRange, Nullable } from '@univerjs/core'; -import { Disposable, Inject, LifecycleStages, OnLifecycle, Range } from '@univerjs/core'; -import { COPY_TYPE, ISheetClipboardService } from '@univerjs/sheets-ui'; -import { AddCommentMutation, DeleteCommentMutation, type IThreadComment, IThreadCommentDataSourceService } from '@univerjs/thread-comment'; +import { Disposable, Inject, Range } from '@univerjs/core'; import { serializeRange, singleReferenceToGrid } from '@univerjs/engine-formula'; import { SheetsThreadCommentModel } from '@univerjs/sheets-thread-comment-base'; +import { COPY_TYPE, ISheetClipboardService } from '@univerjs/sheets-ui'; +import { AddCommentMutation, DeleteCommentMutation, type IThreadComment, IThreadCommentDataSourceService } from '@univerjs/thread-comment'; import { SHEETS_THREAD_COMMENT } from '../types/const'; const transformRef = (ref: string, source: { row: number; column: number }, target: { row: number; column: number }) => { @@ -35,7 +35,6 @@ const transformRef = (ref: string, source: { row: number; column: number }, targ return serializeRange(targetRange); }; -@OnLifecycle(LifecycleStages.Rendered, SheetsThreadCommentCopyPasteController) export class SheetsThreadCommentCopyPasteController extends Disposable { private _copyInfo: Nullable<{ unitId: string; diff --git a/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-hover.controller.ts b/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-hover.controller.ts index 7e3df587660..3777d53b1a7 100644 --- a/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-hover.controller.ts +++ b/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-hover.controller.ts @@ -14,14 +14,13 @@ * limitations under the License. */ -import { Disposable, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, Inject } from '@univerjs/core'; import { RangeProtectionPermissionViewPoint, WorkbookCommentPermission, WorksheetViewPermission } from '@univerjs/sheets'; import { SheetsThreadCommentModel } from '@univerjs/sheets-thread-comment-base'; import { HoverManagerService, SheetPermissionInterceptorBaseController } from '@univerjs/sheets-ui'; import { debounceTime } from 'rxjs'; import { SheetsThreadCommentPopupService } from '../services/sheets-thread-comment-popup.service'; -@OnLifecycle(LifecycleStages.Rendered, SheetsThreadCommentHoverController) export class SheetsThreadCommentHoverController extends Disposable { constructor( @Inject(HoverManagerService) private readonly _hoverManagerService: HoverManagerService, diff --git a/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-popup.controller.ts b/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-popup.controller.ts index 8c04c1660ac..5f5558d6451 100644 --- a/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-popup.controller.ts +++ b/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-popup.controller.ts @@ -17,7 +17,7 @@ import type { Nullable, Workbook } from '@univerjs/core'; import type { ISelectionWithStyle } from '@univerjs/sheets'; import type { IDeleteCommentMutationParams } from '@univerjs/thread-comment'; -import { Disposable, ICommandService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, RANGE_TYPE, UniverInstanceType } from '@univerjs/core'; +import { Disposable, ICommandService, Inject, IUniverInstanceService, RANGE_TYPE, UniverInstanceType } from '@univerjs/core'; import { singleReferenceToGrid } from '@univerjs/engine-formula'; import { RangeProtectionPermissionViewPoint, SetWorksheetActiveOperation, SheetsSelectionsService, WorkbookCommentPermission, WorksheetViewPermission } from '@univerjs/sheets'; import { SheetsThreadCommentModel } from '@univerjs/sheets-thread-comment-base'; @@ -34,7 +34,6 @@ interface ISelectionShapeInfo { commentId: string; } -@OnLifecycle(LifecycleStages.Rendered, SheetsThreadCommentPopupController) export class SheetsThreadCommentPopupController extends Disposable { private _isSwitchToCommenting = false; private _selectionShapeInfo: Nullable = null; diff --git a/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-remove.controller.ts b/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-remove.controller.ts index 9e9c9a90875..d4da29a38d1 100644 --- a/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-remove.controller.ts +++ b/packages/sheets-thread-comment/src/controllers/sheets-thread-comment-remove.controller.ts @@ -15,13 +15,12 @@ */ import type { Workbook } from '@univerjs/core'; -import { Disposable, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; import type { IRemoveSheetCommandParams } from '@univerjs/sheets'; -import { RemoveSheetCommand, SheetInterceptorService } from '@univerjs/sheets'; import type { IDeleteCommentMutationParams } from '@univerjs/thread-comment'; +import { Disposable, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; +import { RemoveSheetCommand, SheetInterceptorService } from '@univerjs/sheets'; import { AddCommentMutation, DeleteCommentMutation, IThreadCommentDataSourceService, ThreadCommentModel } from '@univerjs/thread-comment'; -@OnLifecycle(LifecycleStages.Ready, ThreadCommentRemoveSheetsController) export class ThreadCommentRemoveSheetsController extends Disposable { constructor( @Inject(SheetInterceptorService) private _sheetInterceptorService: SheetInterceptorService, diff --git a/packages/sheets-thread-comment/src/controllers/sheets-thread-comment.controller.ts b/packages/sheets-thread-comment/src/controllers/sheets-thread-comment.controller.ts index 76b87568219..202e408dbdf 100644 --- a/packages/sheets-thread-comment/src/controllers/sheets-thread-comment.controller.ts +++ b/packages/sheets-thread-comment/src/controllers/sheets-thread-comment.controller.ts @@ -14,17 +14,16 @@ * limitations under the License. */ -import { Disposable, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; -import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; +import { Disposable, Inject } from '@univerjs/core'; import { CommentSingle } from '@univerjs/icons'; import { THREAD_COMMENT_PANEL } from '@univerjs/thread-comment-ui'; -import { SheetsThreadCommentCell } from '../views/sheets-thread-comment-cell'; +import { ComponentManager, IMenuManagerService, IShortcutService } from '@univerjs/ui'; import { COMMENT_SINGLE_ICON, SHEETS_THREAD_COMMENT_MODAL } from '../types/const'; +import { SheetsThreadCommentCell } from '../views/sheets-thread-comment-cell'; import { SheetsThreadCommentPanel } from '../views/sheets-thread-comment-panel'; import { AddCommentShortcut } from './menu'; import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Starting, SheetsThreadCommentController) export class SheetsThreadCommentController extends Disposable { constructor( @IMenuManagerService private readonly _menuManagerService: IMenuManagerService, diff --git a/packages/sheets-thread-comment/src/plugin.ts b/packages/sheets-thread-comment/src/plugin.ts index f51bbee3411..3d401b2e0e8 100644 --- a/packages/sheets-thread-comment/src/plugin.ts +++ b/packages/sheets-thread-comment/src/plugin.ts @@ -14,10 +14,11 @@ * limitations under the License. */ +import type { Dependency } from '@univerjs/core'; +import type { IUniverSheetsThreadCommentConfig } from './controllers/config.schema'; import { DependentOn, ICommandService, IConfigService, Inject, Injector, Plugin, UniverInstanceType } from '@univerjs/core'; import { UniverSheetsThreadCommentBasePlugin } from '@univerjs/sheets-thread-comment-base'; import { UniverThreadCommentUIPlugin } from '@univerjs/thread-comment-ui'; -import type { Dependency } from '@univerjs/core'; import { ShowAddSheetCommentModalOperation } from './commands/operations/comment.operation'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { SheetsThreadCommentRenderController } from './controllers/render-controllers/render.controller'; @@ -28,7 +29,6 @@ import { SheetsThreadCommentPopupController } from './controllers/sheets-thread- import { ThreadCommentRemoveSheetsController } from './controllers/sheets-thread-comment-remove.controller'; import { SheetsThreadCommentPopupService } from './services/sheets-thread-comment-popup.service'; import { SHEETS_THREAD_COMMENT } from './types/const'; -import type { IUniverSheetsThreadCommentConfig } from './controllers/config.schema'; @DependentOn(UniverThreadCommentUIPlugin, UniverSheetsThreadCommentBasePlugin) export class UniverSheetsThreadCommentPlugin extends Plugin { @@ -67,5 +67,18 @@ export class UniverSheetsThreadCommentPlugin extends Plugin { [ShowAddSheetCommentModalOperation].forEach((command) => { this._commandService.registerCommand(command); }); + + this._injector.get(SheetsThreadCommentController); + } + + override onReady(): void { + this._injector.get(SheetsThreadCommentRenderController); + this._injector.get(ThreadCommentRemoveSheetsController); + } + + override onRendered(): void { + this._injector.get(SheetsThreadCommentCopyPasteController); + this._injector.get(SheetsThreadCommentHoverController); + this._injector.get(SheetsThreadCommentPopupController); } } diff --git a/packages/sheets-ui/src/controllers/active-worksheet/active-worksheet.controller.ts b/packages/sheets-ui/src/controllers/active-worksheet/active-worksheet.controller.ts index f948f775570..f0b40eda7cc 100644 --- a/packages/sheets-ui/src/controllers/active-worksheet/active-worksheet.controller.ts +++ b/packages/sheets-ui/src/controllers/active-worksheet/active-worksheet.controller.ts @@ -22,7 +22,7 @@ import type { ISetWorksheetActiveOperationParams, ISetWorksheetHideMutationParams, } from '@univerjs/sheets'; -import { Disposable, ICommandService, IUniverInstanceService, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService, IUniverInstanceService } from '@univerjs/core'; import { InsertSheetMutation, RemoveSheetMutation, @@ -36,7 +36,6 @@ import { * worksheet tab related mutations executes. We cannot write this logic in * commands because it does not take collaborative editing into consideration. */ -@OnLifecycle(LifecycleStages.Ready, ActiveWorksheetController) export class ActiveWorksheetController extends Disposable { private _previousSheetIndex = -1; diff --git a/packages/sheets-ui/src/controllers/auto-fill.controller.ts b/packages/sheets-ui/src/controllers/auto-fill.controller.ts index b1beecd7c24..f5e61b2b3cd 100644 --- a/packages/sheets-ui/src/controllers/auto-fill.controller.ts +++ b/packages/sheets-ui/src/controllers/auto-fill.controller.ts @@ -38,9 +38,7 @@ import { Inject, Injector, IUniverInstanceService, - LifecycleStages, ObjectMatrix, - OnLifecycle, Rectangle, toDisposable, Tools, @@ -82,7 +80,6 @@ import { ISheetSelectionRenderService } from '../services/selection/base-selecti import { SheetsRenderService } from '../services/sheets-render.service'; import { discreteRangeToRange, generateNullCellValueRowCol, rangeToDiscreteRange } from './utils/range-tools'; -@OnLifecycle(LifecycleStages.Steady, AutoFillController) export class AutoFillController extends Disposable { private _beforeApplyData: Array>> = []; private _currentLocation: Nullable = null; diff --git a/packages/sheets-ui/src/controllers/auto-height.controller.ts b/packages/sheets-ui/src/controllers/auto-height.controller.ts index 7bf98c11eeb..c8a058a10cd 100644 --- a/packages/sheets-ui/src/controllers/auto-height.controller.ts +++ b/packages/sheets-ui/src/controllers/auto-height.controller.ts @@ -15,13 +15,15 @@ */ import type { IRange, Workbook } from '@univerjs/core'; -import { Disposable, Inject, Injector, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import type { RenderManagerService } from '@univerjs/engine-render'; import type { ISetRangeValuesRangeMutationParams, ISetStyleCommandParams, ISetWorksheetRowAutoHeightMutationParams, ISetWorksheetRowIsAutoHeightMutationParams, } from '@univerjs/sheets'; +import { Disposable, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; +import { IRenderManagerService } from '@univerjs/engine-render'; import { SetRangeValuesCommand, SetStyleCommand, @@ -31,17 +33,13 @@ import { SheetInterceptorService, SheetsSelectionsService, } from '@univerjs/sheets'; -import type { RenderManagerService } from '@univerjs/engine-render'; -import { IRenderManagerService } from '@univerjs/engine-render'; import { SheetSkeletonManagerService } from '../services/sheet-skeleton-manager.service'; export const AFFECT_LAYOUT_STYLES = ['ff', 'fs', 'tr', 'tb']; -@OnLifecycle(LifecycleStages.Ready, AutoHeightController) export class AutoHeightController extends Disposable { constructor( @IRenderManagerService private readonly _renderManagerService: RenderManagerService, - @Inject(Injector) private readonly _injector: Injector, @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService, @Inject(SheetsSelectionsService) private readonly _selectionManagerService: SheetsSelectionsService, @Inject(IUniverInstanceService) private readonly _univerInstanceService: IUniverInstanceService diff --git a/packages/sheets-ui/src/controllers/cell-alert.controller.ts b/packages/sheets-ui/src/controllers/cell-alert.controller.ts index 713e64395ad..47099f6b258 100644 --- a/packages/sheets-ui/src/controllers/cell-alert.controller.ts +++ b/packages/sheets-ui/src/controllers/cell-alert.controller.ts @@ -15,13 +15,14 @@ */ import type { Workbook } from '@univerjs/core'; -import { Disposable, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; -import { ComponentManager } from '@univerjs/ui'; import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; -import { CellAlert } from '../views/cell-alert/CellAlertPopup'; +import { Disposable, Inject } from '@univerjs/core'; +import { ComponentManager } from '@univerjs/ui'; import { CELL_ALERT_KEY } from '../views/cell-alert'; +import { CellAlert } from '../views/cell-alert/CellAlertPopup'; + +// FIXME@weird94: this should not be render module -@OnLifecycle(LifecycleStages.Starting, CellAlertRenderController) export class CellAlertRenderController extends Disposable implements IRenderModule { constructor( private readonly _context: IRenderContext, 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 f801aaf93d7..32385b4c9ab 100644 --- a/packages/sheets-ui/src/controllers/cell-custom-render.controller.ts +++ b/packages/sheets-ui/src/controllers/cell-custom-render.controller.ts @@ -14,16 +14,15 @@ * limitations under the License. */ -import { Disposable, DisposableCollection, Inject, IPermissionService, IUniverInstanceService, LifecycleStages, OnLifecycle, sortRules } from '@univerjs/core'; -import { IRenderManagerService, Vector2 } from '@univerjs/engine-render'; -import { UnitAction, WorkbookEditablePermission, WorksheetEditPermission } from '@univerjs/sheets'; -import type { ICellCustomRender, ICellDataForSheetInterceptor, ICellRenderContext, Nullable, UniverInstanceService, Workbook } from '@univerjs/core'; +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 { SheetSkeletonManagerService } from '../services/sheet-skeleton-manager.service'; import type { ISheetSkeletonManagerParam } from '../services/sheet-skeleton-manager.service'; +import { Disposable, DisposableCollection, Inject, IPermissionService, sortRules } from '@univerjs/core'; +import { IRenderManagerService, Vector2 } from '@univerjs/engine-render'; +import { UnitAction, WorkbookEditablePermission, WorksheetEditPermission } from '@univerjs/sheets'; +import { SheetSkeletonManagerService } from '../services/sheet-skeleton-manager.service'; -@OnLifecycle(LifecycleStages.Rendered, CellCustomRenderController) export class CellCustomRenderController extends Disposable implements IRenderModule { private _enterActiveRender: Nullable<{ render: ICellCustomRender; @@ -34,7 +33,6 @@ export class CellCustomRenderController extends Disposable implements IRenderMod private readonly _context: IRenderContext, @Inject(SheetSkeletonManagerService) private readonly _sheetSkeletonManagerService: SheetSkeletonManagerService, @IRenderManagerService private readonly _renderManagerService: RenderManagerService, - @IUniverInstanceService private readonly _univerInstanceService: UniverInstanceService, @IPermissionService private readonly _permissionService: IPermissionService ) { super(); diff --git a/packages/sheets-ui/src/controllers/clipboard/clipboard.controller.ts b/packages/sheets-ui/src/controllers/clipboard/clipboard.controller.ts index d652e62536b..a6d997c3619 100644 --- a/packages/sheets-ui/src/controllers/clipboard/clipboard.controller.ts +++ b/packages/sheets-ui/src/controllers/clipboard/clipboard.controller.ts @@ -14,6 +14,33 @@ * limitations under the License. */ +import type { + ICellData, + ICommandInfo, + IDocumentData, + IMutationInfo, + IObjectArrayPrimitiveType, + IObjectMatrixPrimitiveType, + IRange, + IRowData, + Nullable, + Workbook, + Worksheet, +} from '@univerjs/core'; +import type { + IInsertColMutationParams, + IInsertRowMutationParams, + ISetRangeValuesMutationParams, + ISetWorksheetColWidthMutationParams, + ISetWorksheetRowHeightMutationParams, +} from '@univerjs/sheets'; +import type { + ICellDataWithSpanInfo, + IClipboardPropertyItem, + ICopyPastePayload, + ISheetClipboardHook, + ISheetDiscreteRangeLocation, +} from '../../services/clipboard/type'; import { BooleanNumber, convertBodyToHtml, @@ -30,15 +57,15 @@ import { Injector, isFormulaString, IUniverInstanceService, - LifecycleStages, LocaleService, ObjectMatrix, - OnLifecycle, RxDisposable, Tools, UniverInstanceType, } from '@univerjs/core'; + import { MessageType } from '@univerjs/design'; + import { DocSelectionRenderService } from '@univerjs/docs-ui'; import { IRenderManagerService } from '@univerjs/engine-render'; @@ -53,30 +80,8 @@ import { SetWorksheetColWidthMutation, SetWorksheetRowHeightMutation, } from '@univerjs/sheets'; - import { IMessageService } from '@univerjs/ui'; import { takeUntil } from 'rxjs'; - -import type { - ICellData, - ICommandInfo, - IDocumentData, - IMutationInfo, - IObjectArrayPrimitiveType, - IObjectMatrixPrimitiveType, - IRange, - IRowData, - Nullable, - Workbook, - Worksheet, -} from '@univerjs/core'; -import type { - IInsertColMutationParams, - IInsertRowMutationParams, - ISetRangeValuesMutationParams, - ISetWorksheetColWidthMutationParams, - ISetWorksheetRowHeightMutationParams, -} from '@univerjs/sheets'; import { AddWorksheetMergeCommand } from '../../commands/commands/add-worksheet-merge.command'; import { SheetCopyCommand, @@ -99,19 +104,11 @@ import { getSetCellStyleMutations, getSetCellValueMutations, } from './utils'; -import type { - ICellDataWithSpanInfo, - IClipboardPropertyItem, - ICopyPastePayload, - ISheetClipboardHook, - ISheetDiscreteRangeLocation, -} from '../../services/clipboard/type'; /** * This controller add basic clipboard logic for basic features such as text color / BISU / row widths to the clipboard * service. You can create a similar clipboard controller to add logic for your own features. */ -@OnLifecycle(LifecycleStages.Rendered, SheetClipboardController) export class SheetClipboardController extends RxDisposable { constructor( @Inject(Injector) private readonly _injector: Injector, diff --git a/packages/sheets-ui/src/controllers/defined-name/defined-name.controller.ts b/packages/sheets-ui/src/controllers/defined-name/defined-name.controller.ts index 5b7adb96b33..93ad3c2dd3c 100644 --- a/packages/sheets-ui/src/controllers/defined-name/defined-name.controller.ts +++ b/packages/sheets-ui/src/controllers/defined-name/defined-name.controller.ts @@ -15,13 +15,12 @@ */ import type { Workbook } from '@univerjs/core'; -import { Disposable, ICommandService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, ThemeService, UniverInstanceType } from '@univerjs/core'; -import { deserializeRangeWithSheet, IDefinedNamesService, isReferenceStrings, operatorToken } from '@univerjs/engine-formula'; import type { ISelectionWithStyle } from '@univerjs/sheets'; +import { Disposable, ICommandService, Inject, IUniverInstanceService, ThemeService, UniverInstanceType } from '@univerjs/core'; +import { deserializeRangeWithSheet, IDefinedNamesService, isReferenceStrings, operatorToken } from '@univerjs/engine-formula'; import { getNormalSelectionStyle, getPrimaryForRange, ScrollToCellOperation, SetWorksheetActivateCommand, SheetsSelectionsService } from '@univerjs/sheets'; import { filter, merge } from 'rxjs'; -@OnLifecycle(LifecycleStages.Rendered, SheetsDefinedNameController) export class SheetsDefinedNameController extends Disposable { constructor( @Inject(SheetsSelectionsService) private readonly _selectionManagerService: SheetsSelectionsService, diff --git a/packages/sheets-ui/src/controllers/editor/formula-editor.controller.ts b/packages/sheets-ui/src/controllers/editor/formula-editor.controller.ts index a5762388677..1ce9d0945fa 100644 --- a/packages/sheets-ui/src/controllers/editor/formula-editor.controller.ts +++ b/packages/sheets-ui/src/controllers/editor/formula-editor.controller.ts @@ -14,6 +14,11 @@ * limitations under the License. */ +import type { DocumentDataModel, ICommandInfo, ICustomRange, IParagraph, ITextRun, JSONXActions, Nullable } from '@univerjs/core'; +import type { IRichTextEditingMutationParams } from '@univerjs/docs'; +import type { DocumentViewModel, RenderComponentType } from '@univerjs/engine-render'; +import type { IMoveRangeMutationParams, ISetRangeValuesMutationParams } from '@univerjs/sheets'; +import type { IEditorBridgeServiceParam } from '../../services/editor-bridge.service'; import { BooleanNumber, DOCS_FORMULA_BAR_EDITOR_UNIT_ID_KEY, @@ -27,8 +32,6 @@ import { Inject, IUndoRedoService, IUniverInstanceService, - LifecycleStages, - OnLifecycle, RxDisposable, Tools, UniverInstanceType, @@ -40,20 +43,14 @@ import { } from '@univerjs/docs'; import { CoverContentCommand, VIEWPORT_KEY as DOC_VIEWPORT_KEY } from '@univerjs/docs-ui'; import { DeviceInputEventType, IRenderManagerService, ScrollBar } from '@univerjs/engine-render'; + import { MoveRangeMutation, RangeProtectionRuleModel, SetRangeValuesMutation, WorksheetProtectionRuleModel } from '@univerjs/sheets'; import { SetEditorResizeOperation } from '@univerjs/ui'; import { takeUntil } from 'rxjs'; -import type { DocumentDataModel, ICommandInfo, ICustomRange, IParagraph, ITextRun, JSONXActions, Nullable } from '@univerjs/core'; -import type { IRichTextEditingMutationParams } from '@univerjs/docs'; - -import type { DocumentViewModel, RenderComponentType } from '@univerjs/engine-render'; -import type { IMoveRangeMutationParams, ISetRangeValuesMutationParams } from '@univerjs/sheets'; import { getEditorObject } from '../../basics/editor/get-editor-object'; import { IFormulaEditorManagerService } from '../../services/editor/formula-editor-manager.service'; import { IEditorBridgeService } from '../../services/editor-bridge.service'; -import type { IEditorBridgeServiceParam } from '../../services/editor-bridge.service'; -@OnLifecycle(LifecycleStages.Rendered, FormulaEditorController) export class FormulaEditorController extends RxDisposable { private _loadedMap = new WeakSet(); diff --git a/packages/sheets-ui/src/controllers/force-string-alert-render.controller.ts b/packages/sheets-ui/src/controllers/force-string-alert-render.controller.ts index 686c52d951c..6aaa9483b0b 100644 --- a/packages/sheets-ui/src/controllers/force-string-alert-render.controller.ts +++ b/packages/sheets-ui/src/controllers/force-string-alert-render.controller.ts @@ -15,15 +15,13 @@ */ import type { Workbook } from '@univerjs/core'; -import { CellValueType, Disposable, Inject, isRealNum, LifecycleStages, LocaleService, OnLifecycle } from '@univerjs/core'; - import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; -import { HoverManagerService } from '../services/hover-manager.service'; +import { CellValueType, Disposable, Inject, isRealNum, LocaleService } from '@univerjs/core'; import { CellAlertManagerService, CellAlertType } from '../services/cell-alert-manager.service'; +import { HoverManagerService } from '../services/hover-manager.service'; const ALERT_KEY = 'SHEET_FORCE_STRING_ALERT'; -@OnLifecycle(LifecycleStages.Rendered, ForceStringAlertRenderController) export class ForceStringAlertRenderController extends Disposable implements IRenderModule { constructor( private readonly _context: IRenderContext, diff --git a/packages/sheets-ui/src/controllers/force-string-render.controller.ts b/packages/sheets-ui/src/controllers/force-string-render.controller.ts index 2e67c15d661..793cd599fae 100644 --- a/packages/sheets-ui/src/controllers/force-string-render.controller.ts +++ b/packages/sheets-ui/src/controllers/force-string-render.controller.ts @@ -14,23 +14,20 @@ * limitations under the License. */ -import { CellValueType, Inject, InterceptorEffectEnum, isRealNum, LifecycleStages, OnLifecycle, RxDisposable } from '@univerjs/core'; -import { INTERCEPTOR_POINT, SheetInterceptorService } from '@univerjs/sheets'; import type { Workbook } from '@univerjs/core'; import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; +import { CellValueType, Inject, InterceptorEffectEnum, isRealNum, RxDisposable } from '@univerjs/core'; +import { INTERCEPTOR_POINT, SheetInterceptorService } from '@univerjs/sheets'; import { SheetSkeletonManagerService } from '../services/sheet-skeleton-manager.service'; -@OnLifecycle(LifecycleStages.Rendered, ForceStringRenderController) export class ForceStringRenderController extends RxDisposable implements IRenderModule { constructor( private readonly _context: IRenderContext, @Inject(SheetSkeletonManagerService) private readonly _sheetSkeletonManagerService: SheetSkeletonManagerService, - @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService) { + @Inject(SheetInterceptorService) private readonly _sheetInterceptorService: SheetInterceptorService + ) { super(); - this._init(); - } - private _init() { this._initViewModelIntercept(); } diff --git a/packages/sheets-ui/src/controllers/format-painter/format-painter.controller.ts b/packages/sheets-ui/src/controllers/format-painter/format-painter.controller.ts index 71fdea61798..34d00434aeb 100644 --- a/packages/sheets-ui/src/controllers/format-painter/format-painter.controller.ts +++ b/packages/sheets-ui/src/controllers/format-painter/format-painter.controller.ts @@ -14,23 +14,22 @@ * limitations under the License. */ +import type { ICellData, IMutationInfo, IRange, IStyleData, Workbook } from '@univerjs/core'; +import type { IAddWorksheetMergeMutationParams, IRemoveWorksheetMergeMutationParams, ISetRangeValuesMutationParams } from '@univerjs/sheets'; + +import type { IFormatPainterHook, ISelectionFormatInfo } from '../../services/format-painter/format-painter.service'; import { Disposable, ICommandService, Inject, Injector, IUniverInstanceService, - LifecycleStages, ObjectMatrix, - OnLifecycle, Tools, UniverInstanceType, } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; - import { AddMergeUndoMutationFactory, AddWorksheetMergeMutation, getAddMergeMutationRangeByType, RemoveMergeUndoMutationFactory, RemoveWorksheetMergeMutation, SetRangeValuesCommand, SetRangeValuesMutation, SetRangeValuesUndoMutationFactory, SheetInterceptorService, SheetsSelectionsService } from '@univerjs/sheets'; -import type { ICellData, IMutationInfo, IRange, IStyleData, Workbook } from '@univerjs/core'; -import type { IAddWorksheetMergeMutationParams, IRemoveWorksheetMergeMutationParams, ISetRangeValuesMutationParams } from '@univerjs/sheets'; import { ApplyFormatPainterCommand, SetOnceFormatPainterCommand, @@ -38,9 +37,7 @@ import { import { checkCellContentInRanges, getClearContentMutationParamsForRanges } from '../../common/utils'; import { FormatPainterStatus, IFormatPainterService } from '../../services/format-painter/format-painter.service'; import { ISheetSelectionRenderService } from '../../services/selection/base-selection-render.service'; -import type { IFormatPainterHook, ISelectionFormatInfo } from '../../services/format-painter/format-painter.service'; -@OnLifecycle(LifecycleStages.Steady, FormatPainterController) export class FormatPainterController extends Disposable { constructor( @ICommandService private readonly _commandService: ICommandService, diff --git a/packages/sheets-ui/src/controllers/menu/__tests__/create-menu-test-bed.ts b/packages/sheets-ui/src/controllers/menu/__tests__/create-menu-test-bed.ts index 356de1129e0..30f6a2928a9 100644 --- a/packages/sheets-ui/src/controllers/menu/__tests__/create-menu-test-bed.ts +++ b/packages/sheets-ui/src/controllers/menu/__tests__/create-menu-test-bed.ts @@ -80,6 +80,10 @@ export function createMenuTestBed() { injector.add([RangeProtectionCache]); injector.add([RangeProtectionRuleModel]); injector.add([RangeProtectionService]); + + this._injector.get(SheetInterceptorService); + this._injector.get(WorkbookPermissionService); + this._injector.get(WorksheetPermissionService); } } diff --git a/packages/sheets-ui/src/controllers/mobile/mobile-sheet-ui.controller.ts b/packages/sheets-ui/src/controllers/mobile/mobile-sheet-ui.controller.ts index fb71584d81d..1d6346a615f 100644 --- a/packages/sheets-ui/src/controllers/mobile/mobile-sheet-ui.controller.ts +++ b/packages/sheets-ui/src/controllers/mobile/mobile-sheet-ui.controller.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { connectInjector, Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import { connectInjector, Disposable, ICommandService, Inject, Injector, UniverInstanceType } from '@univerjs/core'; import { SetBoldCommand, SetFontFamilyCommand, @@ -31,6 +31,7 @@ import { AddWorksheetMergeHorizontalCommand, AddWorksheetMergeVerticalCommand, } from '../../commands/commands/add-worksheet-merge.command'; +import { AutoClearContentCommand, AutoFillCommand } from '../../commands/commands/auto-fill.command'; import { DeleteRangeMoveLeftConfirmCommand } from '../../commands/commands/delete-range-move-left-confirm.command'; import { DeleteRangeMoveUpConfirmCommand } from '../../commands/commands/delete-range-move-up-confirm.command'; import { HideColConfirmCommand, HideRowConfirmCommand } from '../../commands/commands/hide-row-col-confirm.command'; @@ -47,6 +48,7 @@ import { } from '../../commands/commands/inline-format.command'; import { InsertRangeMoveDownConfirmCommand } from '../../commands/commands/insert-range-move-down-confirm.command'; import { InsertRangeMoveRightConfirmCommand } from '../../commands/commands/insert-range-move-right-confirm.command'; +import { AddRangeProtectionFromContextMenuCommand, AddRangeProtectionFromSheetBarCommand, AddRangeProtectionFromToolbarCommand, DeleteRangeProtectionFromContextMenuCommand, SetProtectionCommand, SetRangeProtectionFromContextMenuCommand, ViewSheetPermissionFromContextMenuCommand, ViewSheetPermissionFromSheetBarCommand } from '../../commands/commands/range-protection.command'; import { RefillCommand } from '../../commands/commands/refill.command'; import { RemoveColConfirmCommand, RemoveRowConfirmCommand } from '../../commands/commands/remove-row-col-confirm.command'; import { RemoveSheetConfirmCommand } from '../../commands/commands/remove-sheet-confirm.command'; @@ -70,6 +72,7 @@ import { } from '../../commands/commands/set-selection.command'; import { ChangeZoomRatioCommand, SetZoomRatioCommand } from '../../commands/commands/set-zoom-ratio.command'; import { ShowMenuListCommand } from '../../commands/commands/unhide.command'; +import { AddWorksheetProtectionCommand, ChangeSheetProtectionFromSheetBarCommand, DeleteWorksheetProtectionCommand, DeleteWorksheetProtectionFormSheetBarCommand, SetWorksheetProtectionCommand } from '../../commands/commands/worksheet-protection.command'; import { SetActivateCellEditOperation } from '../../commands/operations/activate-cell-edit.operation'; import { SetCellEditVisibleArrowOperation, @@ -80,6 +83,9 @@ import { RenameSheetOperation } from '../../commands/operations/rename-sheet.ope import { SetScrollOperation } from '../../commands/operations/scroll.operation'; import { SetFormatPainterOperation } from '../../commands/operations/set-format-painter.operation'; import { SetZoomRatioOperation } from '../../commands/operations/set-zoom-ratio.operation'; +import { SheetPermissionOpenDialogOperation } from '../../commands/operations/sheet-permission-open-dialog.operation'; +import { SheetPermissionOpenPanelOperation } from '../../commands/operations/sheet-permission-open-panel.operation'; +import { SidebarDefinedNameOperation } from '../../commands/operations/sidebar-defined-name.operation'; import { BorderPanel } from '../../components/border-panel/BorderPanel'; import { BORDER_PANEL_COMPONENT } from '../../components/border-panel/interface'; import { COLOR_PICKER_COMPONENT, ColorPicker } from '../../components/color-picker'; @@ -89,18 +95,13 @@ import { FontFamily, FontFamilyItem, } from '../../components/font-family'; + import { FONT_SIZE_COMPONENT, FontSize } from '../../components/font-size'; import { MENU_ITEM_INPUT_COMPONENT, MenuItemInput } from '../../components/menu-item-input'; import { DEFINED_NAME_CONTAINER } from '../../views/defined-name/component-name'; import { DefinedNameContainer } from '../../views/defined-name/DefinedNameContainer'; -import { SidebarDefinedNameOperation } from '../../commands/operations/sidebar-defined-name.operation'; -import { AutoClearContentCommand, AutoFillCommand } from '../../commands/commands/auto-fill.command'; - -import { SheetPermissionOpenPanelOperation } from '../../commands/operations/sheet-permission-open-panel.operation'; -import { SheetPermissionOpenDialogOperation } from '../../commands/operations/sheet-permission-open-dialog.operation'; -import { AddRangeProtectionFromContextMenuCommand, AddRangeProtectionFromSheetBarCommand, AddRangeProtectionFromToolbarCommand, DeleteRangeProtectionFromContextMenuCommand, SetProtectionCommand, SetRangeProtectionFromContextMenuCommand, ViewSheetPermissionFromContextMenuCommand, ViewSheetPermissionFromSheetBarCommand } from '../../commands/commands/range-protection.command'; -import { AddWorksheetProtectionCommand, ChangeSheetProtectionFromSheetBarCommand, DeleteWorksheetProtectionCommand, DeleteWorksheetProtectionFormSheetBarCommand, SetWorksheetProtectionCommand } from '../../commands/commands/worksheet-protection.command'; +import { MobileSheetBar } from '../../views/mobile/sheet-bar/MobileSheetBar'; import { EditorBreakLineShortcut, EditorCursorEnterShortcut, @@ -151,10 +152,8 @@ import { ZoomInShortcutItem, ZoomOutShortcutItem, } from '../shortcuts/view.shortcut'; -import { MobileSheetBar } from '../../views/mobile/sheet-bar/MobileSheetBar'; import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Ready, SheetUIMobileController) export class SheetUIMobileController extends Disposable { constructor( @Inject(Injector) private readonly _injector: Injector, diff --git a/packages/sheets-ui/src/controllers/permission/sheet-permission-init.controller.ts b/packages/sheets-ui/src/controllers/permission/sheet-permission-init.controller.ts index 286adcf8504..d42e524314a 100644 --- a/packages/sheets-ui/src/controllers/permission/sheet-permission-init.controller.ts +++ b/packages/sheets-ui/src/controllers/permission/sheet-permission-init.controller.ts @@ -16,19 +16,13 @@ import type { Workbook } from '@univerjs/core'; import type { IAddRangeProtectionMutationParams, IAddWorksheetProtectionParams, ISetWorksheetPermissionPointsMutationParams, IWorksheetProtectionRenderCellData } from '@univerjs/sheets'; - -import { Disposable, IAuthzIoService, ICommandService, Inject, InterceptorEffectEnum, IPermissionService, IUndoRedoService, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType, UserManagerService } from '@univerjs/core'; +import { Disposable, IAuthzIoService, ICommandService, Inject, InterceptorEffectEnum, IPermissionService, IUndoRedoService, IUniverInstanceService, UniverInstanceType, UserManagerService } from '@univerjs/core'; import { UnitAction, UnitObject } from '@univerjs/protocol'; +import { AddRangeProtectionMutation, AddWorksheetProtectionMutation, defaultWorkbookPermissionPoints, defaultWorksheetPermissionPoint, getAllRangePermissionPoint, getAllWorkbookPermissionPoint, getAllWorksheetPermissionPoint, getAllWorksheetPermissionPointByPointPanel, INTERCEPTOR_POINT, RangeProtectionCache, RangeProtectionRuleModel, SetWorksheetPermissionPointsMutation, SheetInterceptorService, WorksheetEditPermission, WorksheetProtectionPointModel, WorksheetProtectionRuleModel, WorksheetViewPermission } from '@univerjs/sheets'; -import { AddRangeProtectionMutation, AddWorksheetProtectionMutation, defaultWorkbookPermissionPoints, defaultWorksheetPermissionPoint, getAllRangePermissionPoint, getAllWorkbookPermissionPoint, getAllWorksheetPermissionPoint, getAllWorksheetPermissionPointByPointPanel, INTERCEPTOR_POINT, RangeProtectionCache, RangeProtectionRenderModel, RangeProtectionRuleModel, SetWorksheetPermissionPointsMutation, SheetInterceptorService, WorksheetEditPermission, WorksheetProtectionPointModel, WorksheetProtectionRuleModel, WorksheetViewPermission } from '@univerjs/sheets'; - -import { IDialogService } from '@univerjs/ui'; - -@OnLifecycle(LifecycleStages.Rendered, SheetPermissionInitController) export class SheetPermissionInitController extends Disposable { constructor( @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, - @IDialogService private readonly _dialogService: IDialogService, @IPermissionService private _permissionService: IPermissionService, @IAuthzIoService private _authzIoService: IAuthzIoService, @Inject(RangeProtectionRuleModel) private _rangeProtectionRuleModel: RangeProtectionRuleModel, @@ -36,7 +30,6 @@ export class SheetPermissionInitController extends Disposable { @Inject(UserManagerService) private _userManagerService: UserManagerService, @Inject(WorksheetProtectionPointModel) private _worksheetProtectionPointRuleModel: WorksheetProtectionPointModel, @Inject(SheetInterceptorService) private _sheetInterceptorService: SheetInterceptorService, - @Inject(RangeProtectionRenderModel) private _selectionProtectionRenderModel: RangeProtectionRenderModel, @Inject(IUndoRedoService) private _undoRedoService: IUndoRedoService, @Inject(ICommandService) private _commandService: ICommandService, @Inject(RangeProtectionCache) private _rangeProtectionCache: RangeProtectionCache diff --git a/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-base.controller.ts b/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-base.controller.ts index d0734e54cfe..7b7fa631d00 100644 --- a/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-base.controller.ts +++ b/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-base.controller.ts @@ -17,14 +17,16 @@ /* eslint-disable complexity */ /* eslint-disable max-lines-per-function */ -import { CustomCommandExecutionError, Disposable, DisposableCollection, FOCUSING_EDITOR_STANDALONE, ICommandService, IContextService, Inject, IPermissionService, isICellData, IUniverInstanceService, LifecycleStages, LocaleService, ObjectMatrix, OnLifecycle, Rectangle, Tools, UniverInstanceType } from '@univerjs/core'; +import type { ICellData, ICellDataForSheetInterceptor, ICommandInfo, IObjectMatrixPrimitiveType, IPermissionTypes, IRange, Nullable, Workbook, WorkbookPermissionPointConstructor, Worksheet } from '@univerjs/core'; +import type { IMoveColsCommandParams, IMoveRangeCommandParams, IMoveRowsCommandParams, ISetRangeValuesCommandParams, ISetSpecificColsVisibleCommandParams, ISetSpecificRowsVisibleCommandParams, ISetWorksheetNameMutationParams, ISetWorksheetShowCommandParams } from '@univerjs/sheets'; +import type { ISheetPasteParams } from '../../commands/commands/clipboard.command'; +import type { IEditorBridgeServiceVisibleParam } from '../../services/editor-bridge.service'; +import { CustomCommandExecutionError, Disposable, DisposableCollection, FOCUSING_EDITOR_STANDALONE, ICommandService, IContextService, Inject, IPermissionService, isICellData, IUniverInstanceService, LocaleService, ObjectMatrix, Rectangle, Tools, UniverInstanceType } from '@univerjs/core'; import { IMEInputCommand, InsertCommand } from '@univerjs/docs-ui'; import { deserializeRangeWithSheet, IDefinedNamesService, LexerTreeBuilder, operatorToken, sequenceNodeType } from '@univerjs/engine-formula'; import { UnitAction } from '@univerjs/protocol'; import { ClearSelectionContentCommand, DeleteRangeMoveLeftCommand, DeleteRangeMoveUpCommand, DeltaColumnWidthCommand, DeltaRowHeightCommand, getSheetCommandTarget, InsertRangeMoveDownCommand, InsertRangeMoveRightCommand, MoveColsCommand, MoveRangeCommand, MoveRowsCommand, RangeProtectionPermissionEditPoint, RangeProtectionPermissionViewPoint, RangeProtectionRuleModel, SetBackgroundColorCommand, SetColWidthCommand, SetRangeValuesCommand, SetRowHeightCommand, SetSelectedColsVisibleCommand, SetSelectedRowsVisibleCommand, SetSpecificColsVisibleCommand, SetSpecificRowsVisibleCommand, SetWorksheetNameCommand, SetWorksheetNameMutation, SetWorksheetOrderCommand, SetWorksheetRowIsAutoHeightCommand, SetWorksheetShowCommand, SheetsSelectionsService, WorkbookCopyPermission, WorkbookEditablePermission, WorkbookHideSheetPermission, WorkbookManageCollaboratorPermission, WorkbookMoveSheetPermission, WorkbookRenameSheetPermission, WorksheetCopyPermission, WorksheetEditPermission, WorksheetProtectionRuleModel, WorksheetSetCellStylePermission, WorksheetSetCellValuePermission, WorksheetSetColumnStylePermission, WorksheetSetRowStylePermission, WorksheetViewPermission } from '@univerjs/sheets'; import { IDialogService } from '@univerjs/ui'; -import type { ICellData, ICellDataForSheetInterceptor, ICommandInfo, IObjectMatrixPrimitiveType, IPermissionTypes, IRange, Nullable, Workbook, WorkbookPermissionPointConstructor, Worksheet } from '@univerjs/core'; -import type { IMoveColsCommandParams, IMoveRangeCommandParams, IMoveRowsCommandParams, ISetRangeValuesCommandParams, ISetSpecificColsVisibleCommandParams, ISetSpecificRowsVisibleCommandParams, ISetWorksheetNameMutationParams, ISetWorksheetShowCommandParams } from '@univerjs/sheets'; import { AutoFillCommand } from '../../commands/commands/auto-fill.command'; import { SheetCopyCommand, SheetCutCommand, SheetPasteColWidthCommand, SheetPasteShortKeyCommand } from '../../commands/commands/clipboard.command'; import { SetRangeBoldCommand, SetRangeItalicCommand, SetRangeStrickThroughCommand, SetRangeUnderlineCommand } from '../../commands/commands/inline-format.command'; @@ -33,15 +35,12 @@ import { SetCellEditVisibleOperation } from '../../commands/operations/cell-edit import { IAutoFillService } from '../../services/auto-fill/auto-fill.service'; import { PREDEFINED_HOOK_NAME } from '../../services/clipboard/clipboard.service'; import { UNIVER_SHEET_PERMISSION_ALERT_DIALOG, UNIVER_SHEET_PERMISSION_ALERT_DIALOG_ID } from '../../views/permission/error-msg-dialog/interface'; -import type { ISheetPasteParams } from '../../commands/commands/clipboard.command'; -import type { IEditorBridgeServiceVisibleParam } from '../../services/editor-bridge.service'; type ICellPermission = Record & { ruleId?: string; ranges?: IRange[] }; type ICheckPermissionCommandParams = IEditorBridgeServiceVisibleParam | IMoveRowsCommandParams | IMoveColsCommandParams | IMoveRangeCommandParams | ISetRangeValuesCommandParams | ISheetPasteParams | ISetSpecificRowsVisibleCommandParams; export const SHEET_PERMISSION_PASTE_PLUGIN = 'SHEET_PERMISSION_PASTE_PLUGIN'; -@OnLifecycle(LifecycleStages.Ready, SheetPermissionInterceptorBaseController) export class SheetPermissionInterceptorBaseController extends Disposable { disposableCollection = new DisposableCollection(); diff --git a/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-canvas-render.controller.ts b/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-canvas-render.controller.ts index 54ff9792806..088a196545d 100644 --- a/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-canvas-render.controller.ts +++ b/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-canvas-render.controller.ts @@ -16,7 +16,7 @@ import type { ICellDataForSheetInterceptor, IRange, Nullable, Workbook } from '@univerjs/core'; import type { IRenderContext, IRenderModule, Scene, SpreadsheetSkeleton } from '@univerjs/engine-render'; -import { DisposableCollection, Inject, IPermissionService, IUniverInstanceService, LifecycleStages, OnLifecycle, Optional, RANGE_TYPE, Rectangle, RxDisposable, UniverInstanceType } from '@univerjs/core'; +import { DisposableCollection, Inject, IPermissionService, IUniverInstanceService, Optional, RANGE_TYPE, Rectangle, RxDisposable, UniverInstanceType } from '@univerjs/core'; import { UnitAction } from '@univerjs/protocol'; import { getSheetCommandTarget, RangeProtectionCache, RangeProtectionRuleModel, SheetsSelectionsService, WorkbookEditablePermission, WorksheetEditPermission, WorksheetSetCellStylePermission, WorksheetSetCellValuePermission, WorksheetSetColumnStylePermission, WorksheetSetRowStylePermission } from '@univerjs/sheets'; @@ -30,7 +30,6 @@ type ICellPermission = Record & { ruleId?: string; ranges?: export const SHEET_PERMISSION_PASTE_PLUGIN = 'SHEET_PERMISSION_PASTE_PLUGIN'; -@OnLifecycle(LifecycleStages.Steady, SheetPermissionInterceptorCanvasRenderController) export class SheetPermissionInterceptorCanvasRenderController extends RxDisposable implements IRenderModule { disposableCollection = new DisposableCollection(); @@ -51,7 +50,6 @@ export class SheetPermissionInterceptorCanvasRenderController extends RxDisposab this._initHeaderResizePermissionInterceptor(); this._initRangeFillPermissionInterceptor(); this._initRangeMovePermissionInterceptor(); - // this._initFreezePermissionInterceptor(); } private _initHeaderMovePermissionInterceptor() { diff --git a/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-clipboard.controller.ts b/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-clipboard.controller.ts index b1da1efb9f6..e5fc5b4fc06 100644 --- a/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-clipboard.controller.ts +++ b/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-clipboard.controller.ts @@ -15,9 +15,9 @@ */ import type { ICellDataForSheetInterceptor, IRange, Workbook } from '@univerjs/core'; -import { Disposable, DisposableCollection, Inject, IUniverInstanceService, LifecycleStages, LocaleService, OnLifecycle, UniverInstanceType } from '@univerjs/core'; -import { SheetsSelectionsService } from '@univerjs/sheets'; +import { Disposable, DisposableCollection, Inject, IUniverInstanceService, LocaleService, UniverInstanceType } from '@univerjs/core'; import { UnitAction } from '@univerjs/protocol'; +import { SheetsSelectionsService } from '@univerjs/sheets'; import { ISheetClipboardService } from '../../services/clipboard/clipboard.service'; import { virtualizeDiscreteRanges } from '../utils/range-tools'; import { SheetPermissionInterceptorBaseController } from './sheet-permission-interceptor-base.controller'; @@ -25,7 +25,6 @@ import { SheetPermissionInterceptorBaseController } from './sheet-permission-int type ICellPermission = Record & { ruleId?: string; ranges?: IRange[] }; export const SHEET_PERMISSION_PASTE_PLUGIN = 'SHEET_PERMISSION_PASTE_PLUGIN'; -@OnLifecycle(LifecycleStages.Steady, SheetPermissionInterceptorClipboardController) export class SheetPermissionInterceptorClipboardController extends Disposable { disposableCollection = new DisposableCollection(); diff --git a/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-formula-render.controller.ts b/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-formula-render.controller.ts index d0cbc1d655c..b4ecacb8d2c 100644 --- a/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-formula-render.controller.ts +++ b/packages/sheets-ui/src/controllers/permission/sheet-permission-interceptor-formula-render.controller.ts @@ -16,25 +16,22 @@ import type { Workbook } from '@univerjs/core'; import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; -import { DisposableCollection, Inject, Injector, IPermissionService, IUniverInstanceService, LifecycleStages, OnLifecycle, RxDisposable } from '@univerjs/core'; +import { DisposableCollection, Inject, IPermissionService, IUniverInstanceService, RxDisposable } from '@univerjs/core'; import { NullValueObject } from '@univerjs/engine-formula'; import { UnitAction } from '@univerjs/protocol'; -import { getSheetCommandTarget, RangeProtectionCache, RangeProtectionRenderModel, WorksheetViewPermission } from '@univerjs/sheets'; +import { getSheetCommandTarget, RangeProtectionCache, WorksheetViewPermission } from '@univerjs/sheets'; import { StatusBarController } from '../status-bar.controller'; export const SHEET_PERMISSION_PASTE_PLUGIN = 'SHEET_PERMISSION_PASTE_PLUGIN'; -@OnLifecycle(LifecycleStages.Steady, SheetPermissionInterceptorFormulaRenderController) export class SheetPermissionInterceptorFormulaRenderController extends RxDisposable implements IRenderModule { disposableCollection = new DisposableCollection(); constructor( private readonly _context: IRenderContext, - @Inject(Injector) private readonly _injector: Injector, @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, @IPermissionService private readonly _permissionService: IPermissionService, @Inject(StatusBarController) private readonly _statusBarController: StatusBarController, - @Inject(RangeProtectionRenderModel) private _rangeProtectionRenderModel: RangeProtectionRenderModel, @Inject(RangeProtectionCache) private _rangeProtectionCache: RangeProtectionCache ) { super(); diff --git a/packages/sheets-ui/src/controllers/permission/sheet-permission-render.controller.ts b/packages/sheets-ui/src/controllers/permission/sheet-permission-render.controller.ts index 7b82b7dd19d..75979136607 100644 --- a/packages/sheets-ui/src/controllers/permission/sheet-permission-render.controller.ts +++ b/packages/sheets-ui/src/controllers/permission/sheet-permission-render.controller.ts @@ -14,19 +14,19 @@ * limitations under the License. */ -import { Disposable, Inject, IPermissionService, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; +import type { IRenderContext, IRenderModule, Spreadsheet } from '@univerjs/engine-render'; import type { MenuConfig } from '@univerjs/ui'; -import { ComponentManager } from '@univerjs/ui'; +import { Disposable, Inject, IPermissionService, IUniverInstanceService } from '@univerjs/core'; +import { IRenderManagerService } from '@univerjs/engine-render'; import { CheckMarkSingle, DeleteSingle, LockSingle, ProtectSingle, WriteSingle } from '@univerjs/icons'; import { RangeProtectionRuleModel, WorksheetProtectionRuleModel } from '@univerjs/sheets'; -import type { IRenderContext, IRenderModule, Spreadsheet } from '@univerjs/engine-render'; -import { IRenderManagerService } from '@univerjs/engine-render'; +import { ComponentManager } from '@univerjs/ui'; import { merge, throttleTime } from 'rxjs'; import { permissionCheckIconKey, permissionDeleteIconKey, permissionEditIconKey, permissionLockIconKey, permissionMenuIconKey, UNIVER_SHEET_PERMISSION_DIALOG, UNIVER_SHEET_PERMISSION_PANEL, UNIVER_SHEET_PERMISSION_PANEL_FOOTER, UNIVER_SHEET_PERMISSION_USER_DIALOG } from '../../consts/permission'; +import { SheetSkeletonManagerService } from '../../services/sheet-skeleton-manager.service'; import { SheetPermissionDialog, SheetPermissionPanel, SheetPermissionPanelFooter, SheetPermissionUserDialog } from '../../views/permission'; -import { UNIVER_SHEET_PERMISSION_ALERT_DIALOG } from '../../views/permission/error-msg-dialog/interface'; import { AlertDialog } from '../../views/permission/error-msg-dialog'; -import { SheetSkeletonManagerService } from '../../services/sheet-skeleton-manager.service'; +import { UNIVER_SHEET_PERMISSION_ALERT_DIALOG } from '../../views/permission/error-msg-dialog/interface'; import { RANGE_PROTECTION_CAN_NOT_VIEW_RENDER_EXTENSION_KEY, RANGE_PROTECTION_CAN_VIEW_RENDER_EXTENSION_KEY, RangeProtectionCanNotViewRenderExtension, RangeProtectionCanViewRenderExtension } from '../../views/permission/extensions/range-protection.render'; import { worksheetProtectionKey, WorksheetProtectionRenderExtension } from '../../views/permission/extensions/worksheet-permission.render'; @@ -132,21 +132,13 @@ export class WorksheetProtectionRenderController extends Disposable implements I } private _initRender() { - const register = (renderId: string) => { - const render = renderId && this._renderManagerService.getRenderById(renderId); - const spreadsheetRender = render && render.mainComponent as Spreadsheet; - if (spreadsheetRender) { - if (!spreadsheetRender.getExtensionByKey(worksheetProtectionKey)) { - spreadsheetRender.register(this._worksheetProtectionRenderExtension); - } + const renderId = this._context.unitId; + const render = renderId && this._renderManagerService.getRenderById(renderId); + const spreadsheetRender = render && render.mainComponent as Spreadsheet; + if (spreadsheetRender) { + if (!spreadsheetRender.getExtensionByKey(worksheetProtectionKey)) { + spreadsheetRender.register(this._worksheetProtectionRenderExtension); } - }; - this.disposeWithMe(this._renderManagerService.currentRender$.subscribe((renderId) => { - renderId && register(renderId); - })); - const workbook = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET)!; - if (workbook) { - register(workbook.getUnitId()); } } 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 50da73fd7eb..abbdeff9fa1 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 @@ -15,22 +15,17 @@ */ import type { Workbook } from '@univerjs/core'; -import { Disposable, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; -import type { IRenderContext } from '@univerjs/engine-render'; +import type { IRenderContext, IRenderModule } from '@univerjs/engine-render'; +import { Disposable, Inject } from '@univerjs/core'; import { SheetSkeletonManagerService } from '../../services/sheet-skeleton-manager.service'; -@OnLifecycle(LifecycleStages.Ready, SheetSkeletonRenderController) -export class SheetSkeletonRenderController extends Disposable { +export class SheetSkeletonRenderController extends Disposable implements IRenderModule { constructor( private readonly _context: IRenderContext, @Inject(SheetSkeletonManagerService) private readonly _sheetSkeletonManagerService: SheetSkeletonManagerService ) { super(); - this._initRemoveSheet(); - } - - private _initRemoveSheet() { this.disposeWithMe(this._context.unit.sheetDisposed$.subscribe((sheet) => { this._sheetSkeletonManagerService.disposeSkeleton({ sheetId: sheet.getSheetId(), diff --git a/packages/sheets-ui/src/controllers/render-controllers/zoom.render-controller.ts b/packages/sheets-ui/src/controllers/render-controllers/zoom.render-controller.ts index 33f5d8bdaf4..7ca1bead4dc 100644 --- a/packages/sheets-ui/src/controllers/render-controllers/zoom.render-controller.ts +++ b/packages/sheets-ui/src/controllers/render-controllers/zoom.render-controller.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { Disposable, DOCS_FORMULA_BAR_EDITOR_UNIT_ID_KEY, FOCUSING_SHEET, ICommandService, IContextService, Inject } from '@univerjs/core'; import type { Workbook } from '@univerjs/core'; import type { IRenderContext, IRenderModule, IWheelEvent } from '@univerjs/engine-render'; +import { Disposable, DOCS_FORMULA_BAR_EDITOR_UNIT_ID_KEY, FOCUSING_SHEET, ICommandService, IContextService, Inject, Optional } from '@univerjs/core'; import { SetZoomRatioCommand } from '../../commands/commands/set-zoom-ratio.command'; import { IEditorBridgeService } from '../../services/editor-bridge.service'; import { SheetSkeletonManagerService } from '../../services/sheet-skeleton-manager.service'; @@ -28,7 +28,7 @@ export class SheetsZoomRenderController extends Disposable implements IRenderMod @Inject(SheetSkeletonManagerService) private readonly _sheetSkeletonManagerService: SheetSkeletonManagerService, @ICommandService private readonly _commandService: ICommandService, @IContextService private readonly _contextService: IContextService, - @IEditorBridgeService private readonly _editorBridgeService: IEditorBridgeService + @Optional(IEditorBridgeService) private readonly _editorBridgeService?: IEditorBridgeService ) { super(); @@ -57,9 +57,11 @@ export class SheetsZoomRenderController extends Disposable implements IRenderMod return; } - const state = this._editorBridgeService.isVisible(); - if ((state.unitId === this._context.unitId || state.unitId === DOCS_FORMULA_BAR_EDITOR_UNIT_ID_KEY) && state.visible) { - return; + if (this._editorBridgeService) { + const state = this._editorBridgeService.isVisible(); + if ((state.unitId === this._context.unitId || state.unitId === DOCS_FORMULA_BAR_EDITOR_UNIT_ID_KEY) && state.visible) { + return; + } } const deltaFactor = Math.abs(e.deltaX); diff --git a/packages/sheets-ui/src/controllers/sheet-ui.controller.ts b/packages/sheets-ui/src/controllers/sheet-ui.controller.ts index 6a11be131de..2500b5f064f 100644 --- a/packages/sheets-ui/src/controllers/sheet-ui.controller.ts +++ b/packages/sheets-ui/src/controllers/sheet-ui.controller.ts @@ -15,7 +15,7 @@ */ import type { IUniverSheetsUIConfig } from './config.schema'; -import { connectInjector, Disposable, ICommandService, IConfigService, Inject, Injector, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; +import { connectInjector, Disposable, ICommandService, IConfigService, Inject, Injector, UniverInstanceType } from '@univerjs/core'; import { DocSelectionRenderService } from '@univerjs/docs-ui'; import { IRenderManagerService } from '@univerjs/engine-render'; @@ -158,7 +158,6 @@ import { ZoomOutShortcutItem, } from './shortcuts/view.shortcut'; -@OnLifecycle(LifecycleStages.Ready, SheetUIController) export class SheetUIController extends Disposable { constructor( @Inject(Injector) protected readonly _injector: Injector, diff --git a/packages/sheets-ui/src/controllers/status-bar.controller.ts b/packages/sheets-ui/src/controllers/status-bar.controller.ts index 5e3170ea763..333155080b9 100644 --- a/packages/sheets-ui/src/controllers/status-bar.controller.ts +++ b/packages/sheets-ui/src/controllers/status-bar.controller.ts @@ -14,6 +14,12 @@ * limitations under the License. */ +import type { ICellData, ICommandInfo, IRange, ISelectionCell, Nullable, Workbook, Worksheet } from '@univerjs/core'; +import type { ArrayValueObject, ISheetData } from '@univerjs/engine-formula'; +import type { + ISelectionWithStyle, +} from '@univerjs/sheets'; +import type { IStatusBarServiceStatus } from '../services/status-bar.service'; import { CellValueType, createInterceptorKey, @@ -23,33 +29,23 @@ import { Inject, InterceptorManager, IUniverInstanceService, - LifecycleStages, ObjectMatrix, - OnLifecycle, RANGE_TYPE, splitIntoGrid, toDisposable, UniverInstanceType, } from '@univerjs/core'; + import { - FormulaDataModel, FUNCTION_NAMES_MATH, FUNCTION_NAMES_STATISTICAL, - IFunctionService, } from '@univerjs/engine-formula'; import { INumfmtService, SetRangeValuesMutation, SheetsSelectionsService, } from '@univerjs/sheets'; -import type { ICellData, ICommandInfo, IRange, ISelectionCell, Nullable, Workbook, Worksheet } from '@univerjs/core'; -import type { ArrayValueObject, ISheetData } from '@univerjs/engine-formula'; - -import type { - ISelectionWithStyle, -} from '@univerjs/sheets'; import { IStatusBarService } from '../services/status-bar.service'; -import type { IStatusBarServiceStatus } from '../services/status-bar.service'; export const STATUS_BAR_PERMISSION_CORRECT = createInterceptorKey('statusBarPermissionCorrect'); @@ -115,19 +111,14 @@ function calculateValues(valueSet: CalculateValueSet) { ]; } -@OnLifecycle(LifecycleStages.Ready, StatusBarController) export class StatusBarController extends Disposable { - private _calculateTimeout: number | NodeJS.Timeout = -1; - public interceptor = new InterceptorManager({ STATUS_BAR_PERMISSION_CORRECT }); constructor( @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, @Inject(SheetsSelectionsService) private readonly _selectionManagerService: SheetsSelectionsService, - @IFunctionService private readonly _functionService: IFunctionService, @IStatusBarService private readonly _statusBarService: IStatusBarService, @ICommandService private readonly _commandService: ICommandService, - @Inject(FormulaDataModel) private readonly _formulaDataModel: FormulaDataModel, @Inject(INumfmtService) private _numfmtService: INumfmtService ) { super(); diff --git a/packages/sheets-ui/src/mobile-sheets-ui-plugin.ts b/packages/sheets-ui/src/mobile-sheets-ui-plugin.ts index a23828157c5..4dad681b6a3 100644 --- a/packages/sheets-ui/src/mobile-sheets-ui-plugin.ts +++ b/packages/sheets-ui/src/mobile-sheets-ui-plugin.ts @@ -15,60 +15,60 @@ */ import type { Dependency, Workbook } from '@univerjs/core'; +import type { IUniverSheetsUIConfig } from './controllers/config.schema'; import { DependentOn, Inject, Injector, IUniverInstanceService, Plugin, UniverInstanceType } from '@univerjs/core'; -import { filter } from 'rxjs/operators'; import { IRenderManagerService } from '@univerjs/engine-render'; import { UniverSheetsPlugin } from '@univerjs/sheets'; import { UniverMobileUIPlugin } from '@univerjs/ui'; +import { filter } from 'rxjs/operators'; import { ActiveWorksheetController } from './controllers/active-worksheet/active-worksheet.controller'; import { AutoHeightController } from './controllers/auto-height.controller'; +import { CellAlertRenderController } from './controllers/cell-alert.controller'; +import { CellCustomRenderController } from './controllers/cell-custom-render.controller'; import { SheetClipboardController } from './controllers/clipboard/clipboard.controller'; +import { defaultPluginConfig } from './controllers/config.schema'; +import { ForceStringAlertRenderController } from './controllers/force-string-alert-render.controller'; +import { ForceStringRenderController } from './controllers/force-string-render.controller'; +import { HoverRenderController } from './controllers/hover-render.controller'; +import { MarkSelectionRenderController } from './controllers/mark-selection.controller'; import { FormatPainterRenderController } from './controllers/render-controllers/format-painter.render-controller'; import { HeaderFreezeRenderController } from './controllers/render-controllers/freeze.render-controller'; import { HeaderMoveRenderController } from './controllers/render-controllers/header-move.render-controller'; -import { MarkSelectionRenderController } from './controllers/mark-selection.controller'; -import { SheetsRenderService } from './services/sheets-render.service'; +import { MobileSheetsScrollRenderController } from './controllers/render-controllers/mobile/mobile-scroll.render-controller'; +import { SheetsZoomRenderController } from './controllers/render-controllers/zoom.render-controller'; import { StatusBarController } from './controllers/status-bar.controller'; import { AutoFillService, IAutoFillService } from './services/auto-fill/auto-fill.service'; +import { SheetCanvasPopManagerService } from './services/canvas-pop-manager.service'; +import { CellAlertManagerService } from './services/cell-alert-manager.service'; import { ISheetClipboardService, SheetClipboardService } from './services/clipboard/clipboard.service'; import { FormatPainterService, IFormatPainterService } from './services/format-painter/format-painter.service'; +import { HoverManagerService } from './services/hover-manager.service'; import { IMarkSelectionService, MarkSelectionService } from './services/mark-selection/mark-selection.service'; import { SheetScrollManagerService } from './services/scroll-manager.service'; import { ISheetBarService, SheetBarService } from './services/sheet-bar/sheet-bar.service'; import { SheetSkeletonManagerService } from './services/sheet-skeleton-manager.service'; +import { SheetsRenderService } from './services/sheets-render.service'; import { ShortcutExperienceService } from './services/shortcut-experience.service'; import { IStatusBarService, StatusBarService } from './services/status-bar.service'; -import { HoverRenderController } from './controllers/hover-render.controller'; -import { HoverManagerService } from './services/hover-manager.service'; -import { CellAlertManagerService } from './services/cell-alert-manager.service'; -import { CellAlertRenderController } from './controllers/cell-alert.controller'; -import { CellCustomRenderController } from './controllers/cell-custom-render.controller'; -import { SheetCanvasPopManagerService } from './services/canvas-pop-manager.service'; -import { ForceStringRenderController } from './controllers/force-string-render.controller'; -import { ForceStringAlertRenderController } from './controllers/force-string-alert-render.controller'; -import { SheetsZoomRenderController } from './controllers/render-controllers/zoom.render-controller'; -import { MobileSheetsScrollRenderController } from './controllers/render-controllers/mobile/mobile-scroll.render-controller'; // import { SheetContextMenuRenderController } from './controllers/render-controllers/contextmenu.render-controller'; import { DragRenderController } from './controllers/drag-render.controller'; -import { DragManagerService } from './services/drag-manager.service'; -import { SheetPermissionInterceptorClipboardController } from './controllers/permission/sheet-permission-interceptor-clipboard.controller'; -import { SheetPermissionInterceptorBaseController } from './controllers/permission/sheet-permission-interceptor-base.controller'; +import { SheetUIMobileController } from './controllers/mobile/mobile-sheet-ui.controller'; import { SheetPermissionInitController } from './controllers/permission/sheet-permission-init.controller'; -import { SheetPermissionRenderController, SheetPermissionRenderManagerController, WorksheetProtectionRenderController } from './controllers/permission/sheet-permission-render.controller'; +import { SheetPermissionInterceptorBaseController } from './controllers/permission/sheet-permission-interceptor-base.controller'; import { SheetPermissionInterceptorCanvasRenderController } from './controllers/permission/sheet-permission-interceptor-canvas-render.controller'; +import { SheetPermissionInterceptorClipboardController } from './controllers/permission/sheet-permission-interceptor-clipboard.controller'; import { SheetPermissionInterceptorFormulaRenderController } from './controllers/permission/sheet-permission-interceptor-formula-render.controller'; +import { SheetPermissionRenderController, SheetPermissionRenderManagerController, WorksheetProtectionRenderController } from './controllers/permission/sheet-permission-render.controller'; +import { SheetContextMenuMobileRenderController } from './controllers/render-controllers/mobile/mobile-contextmenu.render-controller'; +import { SheetRenderController } from './controllers/render-controllers/sheet.render-controller'; +import { DragManagerService } from './services/drag-manager.service'; import { SheetPermissionPanelModel } from './services/permission/sheet-permission-panel.model'; import { SheetPermissionUserManagerService } from './services/permission/sheet-permission-user-list.service'; import { SheetPrintInterceptorService } from './services/print-interceptor.service'; -import { SheetUIMobileController } from './controllers/mobile/mobile-sheet-ui.controller'; -import { SheetContextMenuMobileRenderController } from './controllers/render-controllers/mobile/mobile-contextmenu.render-controller'; -import { SheetRenderController } from './controllers/render-controllers/sheet.render-controller'; -import { MobileSheetsSelectionRenderService } from './services/selection/mobile-selection-render.service'; -import { ISheetSelectionRenderService } from './services/selection/base-selection-render.service'; import { SelectAllService } from './services/select-all/select-all.service'; -import type { IUniverSheetsUIConfig } from './controllers/config.schema'; -import { defaultPluginConfig } from './controllers/config.schema'; +import { ISheetSelectionRenderService } from './services/selection/base-selection-render.service'; +import { MobileSheetsSelectionRenderService } from './services/selection/mobile-selection-render.service'; /** * @ignore @@ -127,6 +127,8 @@ export class UniverSheetsMobileUIPlugin extends Plugin { override onReady(): void { this._markSheetAsFocused(); this._registerRenderBasics(); + + this._injector.get(SheetUIMobileController); } override onRendered(): void { diff --git a/packages/sheets-ui/src/services/auto-fill/auto-fill.service.ts b/packages/sheets-ui/src/services/auto-fill/auto-fill.service.ts index c977ab405cf..63347d6c544 100644 --- a/packages/sheets-ui/src/services/auto-fill/auto-fill.service.ts +++ b/packages/sheets-ui/src/services/auto-fill/auto-fill.service.ts @@ -15,6 +15,10 @@ */ import type { IDisposable, IMutationInfo, IRange, Nullable, Workbook } from '@univerjs/core'; +import type { RenderManagerService } from '@univerjs/engine-render'; +import type { ISetRangeValuesMutationParams, ISetWorksheetRowAutoHeightMutationParams } from '@univerjs/sheets'; +import type { Observable } from 'rxjs'; +import type { IAutoFillLocation, IAutoFillRule, ISheetAutoFillHook } from './type'; import { createIdentifier, Direction, Disposable, ICommandService, @@ -22,23 +26,18 @@ import { createIdentifier, Direction, Injector, IUndoRedoService, IUniverInstanceService, - LifecycleStages, ObjectMatrix, - OnLifecycle, RANGE_TYPE, Rectangle, toDisposable, UniverInstanceType, } from '@univerjs/core'; -import type { ISetRangeValuesMutationParams, ISetWorksheetRowAutoHeightMutationParams } from '@univerjs/sheets'; -import { SetRangeValuesMutation, SetSelectionsOperation, SetWorksheetRowAutoHeightMutation, SetWorksheetRowAutoHeightMutationFactory, SheetsSelectionsService } from '@univerjs/sheets'; -import type { Observable } from 'rxjs'; -import { BehaviorSubject } from 'rxjs'; -import type { RenderManagerService } from '@univerjs/engine-render'; import { IRenderManagerService } from '@univerjs/engine-render'; -import { discreteRangeToRange } from '../../controllers/utils/range-tools'; +import { SetRangeValuesMutation, SetSelectionsOperation, SetWorksheetRowAutoHeightMutation, SetWorksheetRowAutoHeightMutationFactory, SheetsSelectionsService } from '@univerjs/sheets'; +import { BehaviorSubject } from 'rxjs'; import { AFFECT_LAYOUT_STYLES } from '../../controllers/auto-height.controller'; +import { discreteRangeToRange } from '../../controllers/utils/range-tools'; import { SheetSkeletonManagerService } from '../sheet-skeleton-manager.service'; import { chnNumberRule, @@ -50,7 +49,6 @@ import { numberRule, otherRule, } from './rules'; -import type { IAutoFillLocation, IAutoFillRule, ISheetAutoFillHook } from './type'; import { APPLY_TYPE, AutoFillHookType } from './type'; export interface IAutoFillService { @@ -90,7 +88,6 @@ export interface IApplyMenuItem { disable: boolean; } -@OnLifecycle(LifecycleStages.Rendered, AutoFillService) export class AutoFillService extends Disposable implements IAutoFillService { private _rules: IAutoFillRule[] = []; private _hooks: ISheetAutoFillHook[] = []; diff --git a/packages/sheets-ui/src/services/permission/sheet-permission-panel.model.ts b/packages/sheets-ui/src/services/permission/sheet-permission-panel.model.ts index 060f6fe96a8..41bfe4fe1eb 100644 --- a/packages/sheets-ui/src/services/permission/sheet-permission-panel.model.ts +++ b/packages/sheets-ui/src/services/permission/sheet-permission-panel.model.ts @@ -15,9 +15,8 @@ */ import type { IRange, Nullable } from '@univerjs/core'; -import { LifecycleStages, OnLifecycle } from '@univerjs/core'; -import { UnitObject } from '@univerjs/protocol'; import type { IRangeProtectionRule, IWorksheetProtectionRule } from '@univerjs/sheets'; +import { UnitObject } from '@univerjs/protocol'; import { BehaviorSubject } from 'rxjs'; const DEFAULT_RANGE_RULE: IRangeProtectionRule = { @@ -44,7 +43,6 @@ type IPermissionPanelBaseRule = IRangeProtectionRule | IWorksheetProtectionRule; export type IPermissionPanelRule = IPermissionPanelBaseRule & { viewStatus?: viewState; editStatus?: editState; ranges: IRange[] }; -@OnLifecycle(LifecycleStages.Starting, SheetPermissionPanelModel) export class SheetPermissionPanelModel { private _rule: IPermissionPanelRule = DEFAULT_RANGE_RULE; private _rule$ = new BehaviorSubject(this._rule); diff --git a/packages/sheets-ui/src/services/sheets-render.service.ts b/packages/sheets-ui/src/services/sheets-render.service.ts index bd14644f9ab..6edf254f9ca 100644 --- a/packages/sheets-ui/src/services/sheets-render.service.ts +++ b/packages/sheets-ui/src/services/sheets-render.service.ts @@ -18,8 +18,6 @@ import type { IDisposable, Workbook } from '@univerjs/core'; import { IContextService, IUniverInstanceService, - LifecycleStages, - OnLifecycle, RxDisposable, toDisposable, UniverInstanceType, @@ -30,7 +28,6 @@ import { distinctUntilChanged, takeUntil } from 'rxjs'; /** * This controller is responsible for managing units of a specific kind to be rendered on the canvas. */ -@OnLifecycle(LifecycleStages.Ready, SheetsRenderService) export class SheetsRenderService extends RxDisposable { private _skeletonChangeMutations = new Set(); @@ -76,7 +73,6 @@ export class SheetsRenderService extends RxDisposable { // TODO when does this function get called? this._createRenderer(workbook); }); - this._instanceSrv.getAllUnitsForType(UniverInstanceType.UNIVER_SHEET) .forEach((workbook) => this._createRenderer(workbook)); diff --git a/packages/sheets-ui/src/sheets-ui-plugin.ts b/packages/sheets-ui/src/sheets-ui-plugin.ts index fccc9d94404..6304633042c 100644 --- a/packages/sheets-ui/src/sheets-ui-plugin.ts +++ b/packages/sheets-ui/src/sheets-ui-plugin.ts @@ -150,6 +150,8 @@ export class UniverSheetsUIPlugin extends Plugin { [SheetPermissionInitController], [SheetPermissionRenderManagerController], ] as Dependency[], this._config.override).forEach((d) => this._injector.add(d)); + + this._injector.get(SheetPermissionPanelModel); } override onReady(): void { @@ -158,12 +160,29 @@ export class UniverSheetsUIPlugin extends Plugin { } this._registerRenderBasics(); + + this._injector.get(SheetUIController); + this._injector.get(SheetsRenderService); + this._injector.get(ActiveWorksheetController); + this._injector.get(SheetPermissionInterceptorBaseController); } override onRendered(): void { this._registerRenderModules(); + this._injector.get(SheetPermissionInitController); this._injector.get(SheetPermissionRenderManagerController); + this._injector.get(SheetClipboardController); + this._injector.get(FormulaEditorController); + this._injector.get(SheetsDefinedNameController); + this._injector.get(StatusBarController); + this._injector.get(AutoHeightController); + } + + override onSteady(): void { + this._injector.get(FormatPainterController); + this._injector.get(AutoFillController); + this._injector.get(SheetPermissionInterceptorClipboardController); } private _registerRenderBasics(): void { diff --git a/packages/sheets-zen-editor/src/controllers/zen-editor-ui.controller.ts b/packages/sheets-zen-editor/src/controllers/zen-editor-ui.controller.ts index f2d4044459b..61141efb661 100644 --- a/packages/sheets-zen-editor/src/controllers/zen-editor-ui.controller.ts +++ b/packages/sheets-zen-editor/src/controllers/zen-editor-ui.controller.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService } from '@univerjs/core'; import { IMenuManagerService, IShortcutService, IZenZoneService } from '@univerjs/ui'; import { CancelZenEditCommand, ConfirmZenEditCommand, OpenZenEditorCommand } from '../commands/commands/zen-editor.command'; @@ -22,10 +22,8 @@ import { ZEN_EDITOR_COMPONENT, ZenEditor } from '../views/zen-editor'; import { menuSchema } from './menu.schema'; import { ZenEditorCancelShortcut, ZenEditorConfirmShortcut } from './shortcuts/zen-editor.shortcut'; -@OnLifecycle(LifecycleStages.Rendered, ZenEditorUIController) export class ZenEditorUIController extends Disposable { constructor( - @Inject(Injector) private readonly _injector: Injector, @IZenZoneService private readonly _zenZoneService: IZenZoneService, @ICommandService private readonly _commandService: ICommandService, @IMenuManagerService private readonly _menuManagerService: IMenuManagerService, diff --git a/packages/sheets-zen-editor/src/controllers/zen-editor.controller.ts b/packages/sheets-zen-editor/src/controllers/zen-editor.controller.ts index 9a8d0d16cf2..f7cfe12e445 100644 --- a/packages/sheets-zen-editor/src/controllers/zen-editor.controller.ts +++ b/packages/sheets-zen-editor/src/controllers/zen-editor.controller.ts @@ -19,8 +19,6 @@ import type { IDocObjectParam } from '@univerjs/docs-ui'; import type { Viewport } from '@univerjs/engine-render'; import { DOCS_ZEN_EDITOR_UNIT_ID_KEY, - LifecycleStages, - OnLifecycle, RxDisposable, } from '@univerjs/core'; import { VIEWPORT_KEY as DOC_VIEWPORT_KEY, DocBackScrollRenderController } from '@univerjs/docs-ui'; @@ -30,7 +28,6 @@ import { getEditorObject } from '@univerjs/sheets-ui'; import { takeUntil } from 'rxjs'; import { IZenEditorManagerService } from '../services/zen-editor.service'; -@OnLifecycle(LifecycleStages.Steady, ZenEditorController) export class ZenEditorController extends RxDisposable { constructor( @IZenEditorManagerService private readonly _zenEditorManagerService: IZenEditorManagerService, diff --git a/packages/sheets-zen-editor/src/plugin.ts b/packages/sheets-zen-editor/src/plugin.ts index a616da95136..eff01e7bf08 100644 --- a/packages/sheets-zen-editor/src/plugin.ts +++ b/packages/sheets-zen-editor/src/plugin.ts @@ -53,4 +53,12 @@ export class UniverSheetsZenEditorPlugin extends Plugin { dependencies.forEach((dependency) => injector.add(dependency)); } + + override onReady(): void { + this._injector.get(ZenEditorUIController); + } + + override onSteady(): void { + this._injector.get(ZenEditorController); + } } diff --git a/packages/sheets/src/commands/commands/__tests__/create-command-test-bed.ts b/packages/sheets/src/commands/commands/__tests__/create-command-test-bed.ts index 18cb9e930a6..56c0623024b 100644 --- a/packages/sheets/src/commands/commands/__tests__/create-command-test-bed.ts +++ b/packages/sheets/src/commands/commands/__tests__/create-command-test-bed.ts @@ -29,14 +29,14 @@ import { Univer, UniverInstanceType, } from '@univerjs/core'; -import { WorkbookPermissionService } from '../../../services/permission/workbook-permission/workbook-permission.service'; -import { WorksheetPermissionService } from '../../../services/permission/worksheet-permission/worksheet-permission.service'; import enUS from '../../../locale/en-US'; +import { RangeProtectionRuleModel } from '../../../model/range-protection-rule.model'; import { BorderStyleManagerService } from '../../../services/border-style-manager.service'; +import { WorkbookPermissionService } from '../../../services/permission/workbook-permission/workbook-permission.service'; +import { WorksheetProtectionPointModel, WorksheetProtectionRuleModel } from '../../../services/permission/worksheet-permission'; +import { WorksheetPermissionService } from '../../../services/permission/worksheet-permission/worksheet-permission.service'; import { SheetsSelectionsService } from '../../../services/selections/selection-manager.service'; import { SheetInterceptorService } from '../../../services/sheet-interceptor/sheet-interceptor.service'; -import { WorksheetProtectionPointModel, WorksheetProtectionRuleModel } from '../../../services/permission/worksheet-permission'; -import { RangeProtectionRuleModel } from '../../../model/range-protection-rule.model'; const TEST_WORKBOOK_DATA_DEMO: IWorkbookData = { id: 'test', @@ -106,6 +106,10 @@ export function createCommandTestBed(workbookData?: IWorkbookData, dependencies? injector.add([SheetInterceptorService]); dependencies?.forEach((d) => injector.add(d)); + + this._injector.get(SheetInterceptorService); + this._injector.get(WorkbookPermissionService); + this._injector.get(WorksheetPermissionService); } } diff --git a/packages/sheets/src/commands/commands/__tests__/set-range-values.command.spec.ts b/packages/sheets/src/commands/commands/__tests__/set-range-values.command.spec.ts index df96216d3c5..3fc9b53e61c 100644 --- a/packages/sheets/src/commands/commands/__tests__/set-range-values.command.spec.ts +++ b/packages/sheets/src/commands/commands/__tests__/set-range-values.command.spec.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import type { ICellData, IDocumentData, Injector, IStyleData, IWorkbookData, Nullable, Univer, Workbook } from '@univerjs/core'; +import type { ISetRangeValuesCommandParams } from '../set-range-values.command'; import { BooleanNumber, CellValueType, @@ -28,13 +30,10 @@ import { } from '@univerjs/core'; import { DEFAULT_TEXT_FORMAT } from '@univerjs/engine-numfmt'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; - -import type { ICellData, IDocumentData, Injector, IStyleData, IWorkbookData, Nullable, Univer, Workbook } from '@univerjs/core'; import { SheetsSelectionsService } from '../../../services/selections/selection-manager.service'; import { SetRangeValuesMutation } from '../../mutations/set-range-values.mutation'; import { SetRangeValuesCommand } from '../set-range-values.command'; import { createCommandTestBed } from './create-command-test-bed'; -import type { ISetRangeValuesCommandParams } from '../set-range-values.command'; const getTestWorkbookDataDemo = (): IWorkbookData => ({ id: 'test', diff --git a/packages/sheets/src/controllers/basic-worksheet.controller.ts b/packages/sheets/src/controllers/basic-worksheet.controller.ts index b5db318e434..f6d14a4b2ec 100644 --- a/packages/sheets/src/controllers/basic-worksheet.controller.ts +++ b/packages/sheets/src/controllers/basic-worksheet.controller.ts @@ -15,15 +15,18 @@ */ import type { IDisposable, IMutation, IStyleData } from '@univerjs/core'; -import { Disposable, ICommandService, IConfigService, LifecycleStages, OnLifecycle, Optional } from '@univerjs/core'; +import { Disposable, ICommandService, IConfigService, Optional } from '@univerjs/core'; import { DataSyncPrimaryController } from '@univerjs/rpc'; +import { AddRangeProtectionCommand } from '../commands/commands/add-range-protection.command'; import { ClearSelectionAllCommand } from '../commands/commands/clear-selection-all.command'; import { ClearSelectionContentCommand } from '../commands/commands/clear-selection-content.command'; import { ClearSelectionFormatCommand } from '../commands/commands/clear-selection-format.command'; import { CopySheetCommand } from '../commands/commands/copy-worksheet.command'; import { DeleteRangeMoveLeftCommand } from '../commands/commands/delete-range-move-left.command'; import { DeleteRangeMoveUpCommand } from '../commands/commands/delete-range-move-up.command'; +import { DeleteRangeProtectionCommand } from '../commands/commands/delete-range-protection.command'; +import { InsertDefinedNameCommand } from '../commands/commands/insert-defined-name.command'; import { InsertRangeMoveDownCommand } from '../commands/commands/insert-range-move-down.command'; import { InsertRangeMoveRightCommand } from '../commands/commands/insert-range-move-right.command'; import { @@ -37,9 +40,11 @@ import { import { InsertSheetCommand } from '../commands/commands/insert-sheet.command'; import { MoveRangeCommand } from '../commands/commands/move-range.command'; import { MoveColsCommand, MoveRowsCommand } from '../commands/commands/move-rows-cols.command'; +import { RemoveDefinedNameCommand } from '../commands/commands/remove-defined-name.command'; import { RemoveColCommand, RemoveRowCommand } from '../commands/commands/remove-row-col.command'; import { RemoveSheetCommand } from '../commands/commands/remove-sheet.command'; import { RemoveWorksheetMergeCommand } from '../commands/commands/remove-worksheet-merge.command'; +import { ReorderRangeCommand } from '../commands/commands/reorder-range.command'; import { SetBorderBasicCommand, SetBorderColorCommand, @@ -52,8 +57,10 @@ import { SetSelectedColsVisibleCommand, SetSpecificColsVisibleCommand, } from '../commands/commands/set-col-visible.command'; +import { SetDefinedNameCommand } from '../commands/commands/set-defined-name.command'; import { SetFrozenCommand } from '../commands/commands/set-frozen.command'; import { SetFrozenCancelCommand } from '../commands/commands/set-frozen-cancel.command'; +import { SetRangeProtectionCommand } from '../commands/commands/set-range-protection.command'; import { SetRangeValuesCommand } from '../commands/commands/set-range-values.command'; import { SetRowHiddenCommand, @@ -72,17 +79,25 @@ import { SetVerticalTextAlignCommand, } from '../commands/commands/set-style.command'; import { SetTabColorCommand } from '../commands/commands/set-tab-color.command'; +import { SetWorkbookNameCommand } from '../commands/commands/set-workbook-name.command'; import { SetWorksheetActivateCommand } from '../commands/commands/set-worksheet-activate.command'; import { DeltaColumnWidthCommand, SetColWidthCommand } from '../commands/commands/set-worksheet-col-width.command'; import { SetWorksheetHideCommand } from '../commands/commands/set-worksheet-hide.command'; import { SetWorksheetNameCommand } from '../commands/commands/set-worksheet-name.command'; import { SetWorksheetOrderCommand } from '../commands/commands/set-worksheet-order.command'; +import { SetWorksheetPermissionPointsCommand } from '../commands/commands/set-worksheet-permission-points.command'; import { DeltaRowHeightCommand, SetRowHeightCommand, SetWorksheetRowIsAutoHeightCommand, } from '../commands/commands/set-worksheet-row-height.command'; import { SetWorksheetShowCommand } from '../commands/commands/set-worksheet-show.command'; +import { AddRangeProtectionMutation } from '../commands/mutations/add-range-protection.mutation'; +import { AddWorksheetMergeMutation } from '../commands/mutations/add-worksheet-merge.mutation'; +import { AddWorksheetProtectionMutation } from '../commands/mutations/add-worksheet-protection.mutation'; +import { DeleteRangeProtectionMutation } from '../commands/mutations/delete-range-protection.mutation'; +import { DeleteWorksheetProtectionMutation } from '../commands/mutations/delete-worksheet-protection.mutation'; +import { EmptyMutation } from '../commands/mutations/empty.mutation'; import { InsertColMutation, InsertRowMutation } from '../commands/mutations/insert-row-col.mutation'; import { InsertSheetMutation } from '../commands/mutations/insert-sheet.mutation'; import { MoveRangeMutation } from '../commands/mutations/move-range.mutation'; @@ -91,47 +106,30 @@ import { RemoveNumfmtMutation, SetNumfmtMutation } from '../commands/mutations/n import { RemoveColMutation, RemoveRowMutation } from '../commands/mutations/remove-row-col.mutation'; import { RemoveSheetMutation } from '../commands/mutations/remove-sheet.mutation'; import { RemoveWorksheetMergeMutation } from '../commands/mutations/remove-worksheet-merge.mutation'; +import { ReorderRangeMutation } from '../commands/mutations/reorder-range.mutation'; import { SetColHiddenMutation, SetColVisibleMutation } from '../commands/mutations/set-col-visible.mutation'; import { SetFrozenMutation } from '../commands/mutations/set-frozen.mutation'; +import { SetRangeProtectionMutation } from '../commands/mutations/set-range-protection.mutation'; import { SetRangeValuesMutation } from '../commands/mutations/set-range-values.mutation'; import { SetRowHiddenMutation, SetRowVisibleMutation } from '../commands/mutations/set-row-visible.mutation'; import { SetTabColorMutation } from '../commands/mutations/set-tab-color.mutation'; +import { SetWorkbookNameMutation } from '../commands/mutations/set-workbook-name.mutation'; import { SetWorksheetColWidthMutation } from '../commands/mutations/set-worksheet-col-width.mutation'; import { SetWorksheetHideMutation } from '../commands/mutations/set-worksheet-hide.mutation'; import { SetWorksheetNameMutation } from '../commands/mutations/set-worksheet-name.mutation'; import { SetWorksheetOrderMutation } from '../commands/mutations/set-worksheet-order.mutation'; +import { SetWorksheetPermissionPointsMutation } from '../commands/mutations/set-worksheet-permission-points.mutation'; +import { SetWorksheetProtectionMutation } from '../commands/mutations/set-worksheet-protection.mutation'; import { SetWorksheetRowAutoHeightMutation, SetWorksheetRowHeightMutation, SetWorksheetRowIsAutoHeightMutation, } from '../commands/mutations/set-worksheet-row-height.mutation'; +import { ScrollToCellOperation } from '../commands/operations/scroll-to-cell.operation'; import { SetSelectionsOperation } from '../commands/operations/selection.operation'; import { SetWorksheetActiveOperation } from '../commands/operations/set-worksheet-active.operation'; -import { EmptyMutation } from '../commands/mutations/empty.mutation'; -import { InsertDefinedNameCommand } from '../commands/commands/insert-defined-name.command'; -import { RemoveDefinedNameCommand } from '../commands/commands/remove-defined-name.command'; -import { SetDefinedNameCommand } from '../commands/commands/set-defined-name.command'; -import { ScrollToCellOperation } from '../commands/operations/scroll-to-cell.operation'; -import { SetWorkbookNameCommand } from '../commands/commands/set-workbook-name.command'; -import { SetWorkbookNameMutation } from '../commands/mutations/set-workbook-name.mutation'; -import { AddWorksheetProtectionMutation } from '../commands/mutations/add-worksheet-protection.mutation'; -import { SetWorksheetProtectionMutation } from '../commands/mutations/set-worksheet-protection.mutation'; -import { DeleteWorksheetProtectionMutation } from '../commands/mutations/delete-worksheet-protection.mutation'; -import { SetWorksheetPermissionPointsMutation } from '../commands/mutations/set-worksheet-permission-points.mutation'; -import { SetWorksheetPermissionPointsCommand } from '../commands/commands/set-worksheet-permission-points.command'; - -import { AddRangeProtectionCommand } from '../commands/commands/add-range-protection.command'; -import { DeleteRangeProtectionCommand } from '../commands/commands/delete-range-protection.command'; -import { SetRangeProtectionCommand } from '../commands/commands/set-range-protection.command'; - -import { AddRangeProtectionMutation } from '../commands/mutations/add-range-protection.mutation'; -import { DeleteRangeProtectionMutation } from '../commands/mutations/delete-range-protection.mutation'; -import { SetRangeProtectionMutation } from '../commands/mutations/set-range-protection.mutation'; -import { AddWorksheetMergeMutation } from '../commands/mutations/add-worksheet-merge.mutation'; -import { ReorderRangeCommand } from '../commands/commands/reorder-range.command'; -import { ReorderRangeMutation } from '../commands/mutations/reorder-range.mutation'; -import { MAX_CELL_PER_SHEET_DEFAULT, MAX_CELL_PER_SHEET_KEY } from './config/config'; import { ONLY_REGISTER_FORMULA_RELATED_MUTATIONS_KEY } from './config'; +import { MAX_CELL_PER_SHEET_DEFAULT, MAX_CELL_PER_SHEET_KEY } from './config/config'; export interface IStyleTypeValue { type: keyof IStyleData; @@ -141,7 +139,6 @@ export interface IStyleTypeValue { /** * The controller to provide the most basic sheet CRUD methods to other modules of sheet modules. */ -@OnLifecycle(LifecycleStages.Starting, BasicWorksheetController) export class BasicWorksheetController extends Disposable implements IDisposable { // eslint-disable-next-line max-lines-per-function constructor( diff --git a/packages/sheets/src/controllers/calculate-result-apply.controller.ts b/packages/sheets/src/controllers/calculate-result-apply.controller.ts index e261a4a657b..5411e70797e 100644 --- a/packages/sheets/src/controllers/calculate-result-apply.controller.ts +++ b/packages/sheets/src/controllers/calculate-result-apply.controller.ts @@ -16,12 +16,11 @@ import type { ICellData, ICommandInfo, IObjectMatrixPrimitiveType, Nullable } from '@univerjs/core'; import type { ISetFormulaCalculationResultMutation } from '@univerjs/engine-formula'; -import { Disposable, ICommandService, Inject, IUniverInstanceService, LifecycleStages, ObjectMatrix, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService, Inject, IUniverInstanceService, ObjectMatrix } from '@univerjs/core'; import { handleNumfmtInCell, SetFormulaCalculationResultMutation } from '@univerjs/engine-formula'; import { SetRangeValuesMutation } from '../commands/mutations/set-range-values.mutation'; -@OnLifecycle(LifecycleStages.Ready, CalculateResultApplyController) export class CalculateResultApplyController extends Disposable { constructor( @Inject(IUniverInstanceService) private _univerInstanceService: IUniverInstanceService, diff --git a/packages/sheets/src/controllers/defined-name-data.controller.ts b/packages/sheets/src/controllers/defined-name-data.controller.ts index e94690a54a1..59a9bbcd789 100644 --- a/packages/sheets/src/controllers/defined-name-data.controller.ts +++ b/packages/sheets/src/controllers/defined-name-data.controller.ts @@ -14,19 +14,16 @@ * limitations under the License. */ +import type { IDefinedNameMapItem } from '@univerjs/engine-formula'; import { Disposable, IResourceManagerService, - LifecycleStages, - OnLifecycle, UniverInstanceType, } from '@univerjs/core'; -import type { IDefinedNameMapItem } from '@univerjs/engine-formula'; import { IDefinedNamesService } from '@univerjs/engine-formula'; const SHEET_DEFINED_NAME_PLUGIN = 'SHEET_DEFINED_NAME_PLUGIN'; -@OnLifecycle(LifecycleStages.Ready, DefinedNameDataController) export class DefinedNameDataController extends Disposable { constructor( @IDefinedNamesService private readonly _definedNamesService: IDefinedNamesService, diff --git a/packages/sheets/src/controllers/number-cell.controller.ts b/packages/sheets/src/controllers/number-cell.controller.ts index 4a07ef8b905..dd98180d097 100644 --- a/packages/sheets/src/controllers/number-cell.controller.ts +++ b/packages/sheets/src/controllers/number-cell.controller.ts @@ -14,12 +14,11 @@ * limitations under the License. */ -import { CellValueType, Disposable, Inject, InterceptorEffectEnum, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { CellValueType, Disposable, Inject, InterceptorEffectEnum } from '@univerjs/core'; import { stripErrorMargin } from '@univerjs/engine-formula'; import { INTERCEPTOR_POINT } from '../services/sheet-interceptor/interceptor-const'; import { SheetInterceptorService } from '../services/sheet-interceptor/sheet-interceptor.service'; -@OnLifecycle(LifecycleStages.Ready, NumberCellDisplayController) export class NumberCellDisplayController extends Disposable { constructor( @Inject(SheetInterceptorService) private _sheetInterceptorService: SheetInterceptorService) { diff --git a/packages/sheets/src/model/range-protection-render.model.ts b/packages/sheets/src/model/range-protection-render.model.ts index 371693c9bc9..e6c810c0e69 100644 --- a/packages/sheets/src/model/range-protection-render.model.ts +++ b/packages/sheets/src/model/range-protection-render.model.ts @@ -14,20 +14,17 @@ * limitations under the License. */ -import { Inject, IPermissionService, LifecycleStages, LRUMap, OnLifecycle, Range } from '@univerjs/core'; -import { UnitObject } from '@univerjs/protocol'; -import { filter, map } from 'rxjs/operators'; import type { IRange } from '@univerjs/core'; - import type { UnitAction } from '@univerjs/protocol'; +import type { getDefaultRangePermission, IRangePermissionPoint } from '../services/permission/range-permission/util'; +import { Inject, IPermissionService, LRUMap, Range } from '@univerjs/core'; +import { UnitObject } from '@univerjs/protocol'; +import { filter, map } from 'rxjs/operators'; import { getAllRangePermissionPoint } from '../services/permission/range-permission/util'; import { RangeProtectionRuleModel } from './range-protection-rule.model'; -import type { getDefaultRangePermission, IRangePermissionPoint } from '../services/permission/range-permission/util'; - export type ICellPermission = Record & { ruleId?: string; ranges?: IRange[] }; -@OnLifecycle(LifecycleStages.Ready, RangeProtectionRenderModel) export class RangeProtectionRenderModel { private _cache = new LRUMap(10000); constructor( diff --git a/packages/sheets/src/model/range-protection-rule.model.ts b/packages/sheets/src/model/range-protection-rule.model.ts index a75f4a95d9b..d9302d3fdb8 100644 --- a/packages/sheets/src/model/range-protection-rule.model.ts +++ b/packages/sheets/src/model/range-protection-rule.model.ts @@ -16,7 +16,7 @@ import type { IRange } from '@univerjs/core'; import type { UnitObject } from '@univerjs/protocol'; -import { LifecycleStages, OnLifecycle, Tools } from '@univerjs/core'; +import { Tools } from '@univerjs/core'; import { BehaviorSubject, Subject } from 'rxjs'; @@ -43,7 +43,6 @@ export interface IRuleChange { } type IRuleChangeType = 'add' | 'set' | 'delete'; -@OnLifecycle(LifecycleStages.Starting, RangeProtectionRuleModel) export class RangeProtectionRuleModel { /** diff --git a/packages/sheets/src/services/numfmt/type.ts b/packages/sheets/src/services/numfmt/type.ts index 39719b696b6..cfb0fbd4474 100644 --- a/packages/sheets/src/services/numfmt/type.ts +++ b/packages/sheets/src/services/numfmt/type.ts @@ -15,7 +15,7 @@ */ import type { ICellData, IRange, Nullable, ObjectMatrix } from '@univerjs/core'; -import { createIdentifier, LifecycleStages, runOnLifecycle } from '@univerjs/core'; +import { createIdentifier } from '@univerjs/core'; // eslint-disable-next-line ts/consistent-type-definitions export type INumfmtItem = { @@ -46,6 +46,7 @@ export interface INumfmtItemWithCache { pattern: string; } +export const INumfmtService = createIdentifier('INumfmtService'); export interface INumfmtService { getValue( unitId: string, @@ -61,6 +62,3 @@ export interface INumfmtService { ): void; deleteValues(unitId: string, subUnitId: string, values: IRange[]): void; } - -export const INumfmtService = createIdentifier('INumfmtService'); -runOnLifecycle(LifecycleStages.Ready, INumfmtService); diff --git a/packages/sheets/src/services/permission/range-permission/range-protection.ref-range.ts b/packages/sheets/src/services/permission/range-permission/range-protection.ref-range.ts index 424ba85b562..c05a15d047b 100644 --- a/packages/sheets/src/services/permission/range-permission/range-protection.ref-range.ts +++ b/packages/sheets/src/services/permission/range-permission/range-protection.ref-range.ts @@ -30,7 +30,7 @@ import type { IDeleteSelectionProtectionMutationParams } from '../../../commands import type { ISetRangeProtectionMutationParams } from '../../../commands/mutations/set-range-protection.mutation'; import type { IRangeProtectionRule } from '../../../model/range-protection-rule.model'; import type { EffectRefRangeParams } from '../../../services/ref-range/type'; -import { Disposable, DisposableCollection, ICommandService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, Rectangle, Tools, UniverInstanceType } from '@univerjs/core'; +import { Disposable, DisposableCollection, ICommandService, Inject, IUniverInstanceService, Rectangle, Tools, UniverInstanceType } from '@univerjs/core'; import { InsertColCommand, InsertRowCommand } from '../../../commands/commands/insert-row-col.command'; import { MoveColsCommand, @@ -59,7 +59,6 @@ const mutationIdArrByMove = [MoveRowsMutation.id, MoveColsMutation.id]; type IMoveRowsOrColsMutationParams = IMoveRowsMutationParams; -@OnLifecycle(LifecycleStages.Ready, RangeProtectionRefRangeService) export class RangeProtectionRefRangeService extends Disposable { disposableCollection = new DisposableCollection(); diff --git a/packages/sheets/src/services/permission/workbook-permission/workbook-permission.service.ts b/packages/sheets/src/services/permission/workbook-permission/workbook-permission.service.ts index c84d22b3047..f42b569d180 100644 --- a/packages/sheets/src/services/permission/workbook-permission/workbook-permission.service.ts +++ b/packages/sheets/src/services/permission/workbook-permission/workbook-permission.service.ts @@ -14,15 +14,13 @@ * limitations under the License. */ -import { Disposable, Inject, IPermissionService, IUniverInstanceService, LifecycleStages, OnLifecycle, UniverInstanceType } from '@univerjs/core'; import type { Workbook } from '@univerjs/core'; - -import { getAllWorksheetPermissionPoint, getAllWorksheetPermissionPointByPointPanel } from '../worksheet-permission/utils'; +import { Disposable, Inject, IPermissionService, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; import { RangeProtectionRuleModel } from '../../../model/range-protection-rule.model'; import { RangeProtectionPermissionEditPoint, RangeProtectionPermissionViewPoint } from '../permission-point'; +import { getAllWorksheetPermissionPoint, getAllWorksheetPermissionPointByPointPanel } from '../worksheet-permission/utils'; import { getAllWorkbookPermissionPoint } from './util'; -@OnLifecycle(LifecycleStages.Starting, WorkbookPermissionService) export class WorkbookPermissionService extends Disposable { constructor( @Inject(IPermissionService) private _permissionService: IPermissionService, diff --git a/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission-point.model.ts b/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission-point.model.ts index eea0481d4b0..cee54ab442d 100644 --- a/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission-point.model.ts +++ b/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission-point.model.ts @@ -14,11 +14,9 @@ * limitations under the License. */ -import { Subject } from 'rxjs'; -import { LifecycleStages, OnLifecycle } from '@univerjs/core'; import type { IObjectPointModel, IPointRuleModel, IWorksheetProtectionPointRule } from '../type'; +import { Subject } from 'rxjs'; -@OnLifecycle(LifecycleStages.Starting, WorksheetProtectionPointModel) export class WorksheetProtectionPointModel { private _model: IPointRuleModel = new Map(); diff --git a/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission-rule.model.ts b/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission-rule.model.ts index d097e0e2cec..af794a00ac3 100644 --- a/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission-rule.model.ts +++ b/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission-rule.model.ts @@ -14,13 +14,11 @@ * limitations under the License. */ -import { BehaviorSubject, Subject } from 'rxjs'; -import { LifecycleStages, OnLifecycle } from '@univerjs/core'; import type { IModel, IObjectModel, IWorksheetProtectionRule } from '../type'; +import { BehaviorSubject, Subject } from 'rxjs'; type IRuleChangeType = 'add' | 'set' | 'delete'; -@OnLifecycle(LifecycleStages.Starting, WorksheetProtectionRuleModel) export class WorksheetProtectionRuleModel { /** * diff --git a/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission.service.ts b/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission.service.ts index c0a42b38b01..32619b1cbf5 100644 --- a/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission.service.ts +++ b/packages/sheets/src/services/permission/worksheet-permission/worksheet-permission.service.ts @@ -15,21 +15,20 @@ */ import type { Workbook, Worksheet } from '@univerjs/core'; -import { Inject, Injector, IPermissionService, IResourceManagerService, IUniverInstanceService, LifecycleStages, OnLifecycle, RxDisposable, UniverInstanceType } from '@univerjs/core'; -import { takeUntil } from 'rxjs/operators'; +import type { IObjectModel, IObjectPointModel } from '../type'; +import { Inject, Injector, IPermissionService, IResourceManagerService, IUniverInstanceService, RxDisposable, UniverInstanceType } from '@univerjs/core'; import { UniverType } from '@univerjs/protocol'; -import type { IObjectModel, IObjectPointModel } from '../type'; -import { RangeProtectionPermissionEditPoint, RangeProtectionPermissionViewPoint } from '../permission-point'; +import { takeUntil } from 'rxjs/operators'; import { RangeProtectionRuleModel } from '../../../model/range-protection-rule.model'; -import { WorksheetProtectionRuleModel } from './worksheet-permission-rule.model'; +import { RangeProtectionPermissionEditPoint, RangeProtectionPermissionViewPoint } from '../permission-point'; import { getAllWorksheetPermissionPoint, getAllWorksheetPermissionPointByPointPanel } from './utils'; import { WorksheetProtectionPointModel } from './worksheet-permission-point.model'; +import { WorksheetProtectionRuleModel } from './worksheet-permission-rule.model'; export const RULE_MODEL_PLUGIN_NAME = 'SHEET_WORKSHEET_PROTECTION_PLUGIN'; export const POINT_MODEL_PLUGIN_NAME = 'SHEET_WORKSHEET_PROTECTION_POINT_PLUGIN'; -@OnLifecycle(LifecycleStages.Starting, WorksheetPermissionService) export class WorksheetPermissionService extends RxDisposable { constructor( @Inject(IPermissionService) private _permissionService: IPermissionService, diff --git a/packages/sheets/src/services/ref-range/ref-range.service.ts b/packages/sheets/src/services/ref-range/ref-range.service.ts index 0caeb5499da..a9715a182ae 100644 --- a/packages/sheets/src/services/ref-range/ref-range.service.ts +++ b/packages/sheets/src/services/ref-range/ref-range.service.ts @@ -15,6 +15,10 @@ */ import type { IDisposable, IMutationInfo, IRange, Nullable, Workbook } from '@univerjs/core'; +import type { IMoveRangeMutationParams } from '../../commands/mutations/move-range.mutation'; + +import type { ISheetCommandSharedParams } from '../../commands/utils/interface'; +import type { EffectRefRangeParams } from './type'; import { CommandType, createInterceptorKey, @@ -23,21 +27,15 @@ import { Inject, InterceptorManager, IUniverInstanceService, - LifecycleStages, - OnLifecycle, RANGE_TYPE, Rectangle, toDisposable, UniverInstanceType, } from '@univerjs/core'; - -import { SheetsSelectionsService } from '../selections/selection-manager.service'; -import { SheetInterceptorService } from '../sheet-interceptor/sheet-interceptor.service'; -import type { ISheetCommandSharedParams } from '../../commands/utils/interface'; -import type { IMoveRangeMutationParams } from '../../commands/mutations/move-range.mutation'; import { MoveRangeMutation } from '../../commands/mutations/move-range.mutation'; import { RemoveSheetMutation } from '../../commands/mutations/remove-sheet.mutation'; -import type { EffectRefRangeParams } from './type'; +import { SheetsSelectionsService } from '../selections/selection-manager.service'; +import { SheetInterceptorService } from '../sheet-interceptor/sheet-interceptor.service'; import { EffectRefRangId } from './type'; import { adjustRangeOnMutation, getEffectedRangesOnMutation } from './util'; @@ -108,7 +106,6 @@ class WatchRange extends Disposable { /** * Collect side effects caused by ref range change */ -@OnLifecycle(LifecycleStages.Ready, RefRangeService) export class RefRangeService extends Disposable { interceptor = new InterceptorManager({ MERGE_REDO, MERGE_UNDO }); diff --git a/packages/sheets/src/sheets-plugin.ts b/packages/sheets/src/sheets-plugin.ts index 0a320426ca2..360863a0aa1 100644 --- a/packages/sheets/src/sheets-plugin.ts +++ b/packages/sheets/src/sheets-plugin.ts @@ -116,6 +116,25 @@ export class UniverSheetsPlugin extends Plugin { } override onStarting(): void { + this._injector.get(BasicWorksheetController); this._injector.get(MergeCellController); + this._injector.get(WorkbookPermissionService); + this._injector.get(WorksheetPermissionService); + } + + override onRendered(): void { + this._injector.get(INumfmtService); + } + + override onReady(): void { + if (!this._config?.notExecuteFormula) { + this._injector.get(CalculateResultApplyController); + } + + this._injector.get(DefinedNameDataController); + this._injector.get(NumberCellDisplayController); + this._injector.get(RangeProtectionRenderModel); + this._injector.get(RangeProtectionRefRangeService); + this._injector.get(RefRangeService); } } diff --git a/packages/slides-ui/src/controllers/canvas-view.ts b/packages/slides-ui/src/controllers/canvas-view.ts index 3cb89c936fa..7047fff6aa4 100644 --- a/packages/slides-ui/src/controllers/canvas-view.ts +++ b/packages/slides-ui/src/controllers/canvas-view.ts @@ -15,20 +15,18 @@ */ import type { IPageElement, Nullable } from '@univerjs/core'; -import { LifecycleStages, OnLifecycle, RxDisposable } from '@univerjs/core'; import type { BaseObject, IRenderModule, } from '@univerjs/engine-render'; +import type { PageID } from '../type'; +import { RxDisposable } from '@univerjs/core'; + import { IRenderManagerService, } from '@univerjs/engine-render'; - -import type { PageID } from '../type'; import { SlideRenderController } from './slide.render-controller'; -// export const ICanvasView = createIdentifier('univer.slide.canvas-view'); -@OnLifecycle(LifecycleStages.Ready, CanvasView) export class CanvasView extends RxDisposable implements IRenderModule { constructor( // this controller needs by commands. root injector. T diff --git a/packages/slides-ui/src/controllers/popup-menu.controller.ts b/packages/slides-ui/src/controllers/popup-menu.controller.ts index 37ad96eba1c..b7bb93faa1d 100644 --- a/packages/slides-ui/src/controllers/popup-menu.controller.ts +++ b/packages/slides-ui/src/controllers/popup-menu.controller.ts @@ -15,19 +15,17 @@ */ import type { IDisposable, Nullable, SlideDataModel } from '@univerjs/core'; -import { FOCUSING_COMMON_DRAWINGS, ICommandService, IContextService, Inject, IUniverInstanceService, LifecycleStages, OnLifecycle, RxDisposable, toDisposable, UniverInstanceType } from '@univerjs/core'; import type { BaseObject, ObjectType, Scene } from '@univerjs/engine-render'; +import { FOCUSING_COMMON_DRAWINGS, ICommandService, IContextService, Inject, IUniverInstanceService, RxDisposable, toDisposable, UniverInstanceType } from '@univerjs/core'; import { IRenderManagerService } from '@univerjs/engine-render'; import { ISidebarService } from '@univerjs/ui'; - -import { SlideCanvasPopMangerService } from '../services/slide-popup-manager.service'; -import { COMPONENT_SLIDE_IMAGE_POPUP_MENU } from '../components/image-popup-menu/component-name'; import { DeleteSlideElementOperation } from '../commands/operations/delete-element.operation'; import { ToggleSlideEditSidebarOperation } from '../commands/operations/insert-shape.operation'; import { UpdateSlideElementOperation } from '../commands/operations/update-element.operation'; +import { COMPONENT_SLIDE_IMAGE_POPUP_MENU } from '../components/image-popup-menu/component-name'; +import { SlideCanvasPopMangerService } from '../services/slide-popup-manager.service'; import { CanvasView } from './canvas-view'; -@OnLifecycle(LifecycleStages.Steady, SlidePopupMenuController) export class SlidePopupMenuController extends RxDisposable { private _initImagePopupMenu = new Set(); @@ -46,16 +44,9 @@ export class SlidePopupMenuController extends RxDisposable { } private _init(): void { - // this._univerInstanceService.getCurrentTypeOfUnit$(UniverInstanceType.UNIVER_SHEET).pipe(takeUntil(this.dispose$)).subscribe((workbook) => this._create(workbook)); - // this._univerInstanceService.getTypeOfUnitDisposed$(UniverInstanceType.UNIVER_SHEET).pipe(takeUntil(this.dispose$)).subscribe((workbook) => this._dispose(workbook)); this._univerInstanceService.getAllUnitsForType(UniverInstanceType.UNIVER_SLIDE).forEach((slide) => this._create(slide)); } - private _dispose(workbook: SlideDataModel) { - // const unitId = workbook.getUnitId(); - // this._renderManagerService.removeRender(unitId); - } - private _create(slide: Nullable) { if (!slide) { return; diff --git a/packages/slides-ui/src/controllers/slide-ui.controller.ts b/packages/slides-ui/src/controllers/slide-ui.controller.ts index 912ea4caea6..7700a153b5d 100644 --- a/packages/slides-ui/src/controllers/slide-ui.controller.ts +++ b/packages/slides-ui/src/controllers/slide-ui.controller.ts @@ -14,33 +14,32 @@ * limitations under the License. */ -import { connectInjector, Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { connectInjector, Disposable, ICommandService, Inject, Injector } from '@univerjs/core'; import { AddImageSingle, GraphSingle, TextSingle } from '@univerjs/icons'; import { BuiltInUIPart, ComponentManager, IMenuManagerService, IShortcutService, IUIPartsService } from '@univerjs/ui'; import { ActivateSlidePageOperation } from '../commands/operations/activate.operation'; +import { AppendSlideOperation } from '../commands/operations/append-slide.operation'; import { DeleteSlideElementOperation } from '../commands/operations/delete-element.operation'; import { InsertSlideFloatImageCommand } from '../commands/operations/insert-image.operation'; import { InsertSlideShapeRectangleCommand, InsertSlideShapeRectangleOperation, ToggleSlideEditSidebarOperation } from '../commands/operations/insert-shape.operation'; import { SlideAddTextCommand, SlideAddTextOperation } from '../commands/operations/insert-text.operation'; import { SetSlidePageThumbOperation } from '../commands/operations/set-thumb.operation'; import { SetTextEditArrowOperation } from '../commands/operations/text-edit.operation'; -import { SlideImagePopupMenu } from '../components/image-popup-menu/ImagePopupMenu'; +import { UpdateSlideElementOperation } from '../commands/operations/update-element.operation'; import { COMPONENT_SLIDE_IMAGE_POPUP_MENU } from '../components/image-popup-menu/component-name'; -import { SlideEditorContainer } from '../views/editor-container'; -import { SlideSideBar } from '../components/slide-bar/SlideBar'; +import { SlideImagePopupMenu } from '../components/image-popup-menu/ImagePopupMenu'; import Sidebar, { COMPONENT_SLIDE_SIDEBAR } from '../components/sidebar/Sidebar'; -import { AppendSlideOperation } from '../commands/operations/append-slide.operation'; -import { UpdateSlideElementOperation } from '../commands/operations/update-element.operation'; +import { SlideSideBar } from '../components/slide-bar/SlideBar'; +import { SlideEditorContainer } from '../views/editor-container'; import { IMAGE_UPLOAD_ICON } from './image.menu'; +import { menuSchema } from './menu.schema'; import { GRAPH_SINGLE_ICON } from './shape.menu'; import { EditorDeleteLeftShortcut, generateArrowSelectionShortCutItem } from './shortcuts/editor.shortcuts'; import { TEXT_ICON_ID } from './text.menu'; -import { menuSchema } from './menu.schema'; /** * This controller registers UI parts of slide workbench to the base-ui workbench. */ -@OnLifecycle(LifecycleStages.Ready, SlidesUIController) export class SlidesUIController extends Disposable { constructor( @Inject(Injector) protected readonly _injector: Injector, diff --git a/packages/slides-ui/src/services/slide-render.service.ts b/packages/slides-ui/src/services/slide-render.service.ts index 2105f94333f..78bdd1aec1f 100644 --- a/packages/slides-ui/src/services/slide-render.service.ts +++ b/packages/slides-ui/src/services/slide-render.service.ts @@ -18,8 +18,6 @@ import type { SlideDataModel, Workbook } from '@univerjs/core'; import { IContextService, IUniverInstanceService, - LifecycleStages, - OnLifecycle, RxDisposable, UniverInstanceType, } from '@univerjs/core'; @@ -29,7 +27,6 @@ import { takeUntil } from 'rxjs'; /** * This controller is responsible for managing units of a specific kind to be rendered on the canvas. */ -@OnLifecycle(LifecycleStages.Ready, SlideRenderService) export class SlideRenderService extends RxDisposable { // private _skeletonChangeMutations = new Set(); diff --git a/packages/slides-ui/src/slides-ui-plugin.ts b/packages/slides-ui/src/slides-ui-plugin.ts index a795d6984dd..6d1ad6ccb10 100644 --- a/packages/slides-ui/src/slides-ui-plugin.ts +++ b/packages/slides-ui/src/slides-ui-plugin.ts @@ -15,22 +15,20 @@ */ import type { Dependency, SlideDataModel } from '@univerjs/core'; +import type { IUniverSlidesUIConfig } from './controllers/config.schema'; import { IConfigService, Inject, Injector, IUniverInstanceService, mergeOverrideWithDependencies, Plugin, UniverInstanceType } from '@univerjs/core'; - import { IRenderManagerService } from '@univerjs/engine-render'; - -import { SlidesUIController } from './controllers/slide-ui.controller'; -import { SlideRenderController } from './controllers/slide.render-controller'; +import { CanvasView } from './controllers/canvas-view'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { SlidePopupMenuController } from './controllers/popup-menu.controller'; -import { SlideCanvasPopMangerService } from './services/slide-popup-manager.service'; -import { ISlideEditorBridgeService, SlideEditorBridgeService } from './services/slide-editor-bridge.service'; +import { SlideRenderController } from './controllers/slide.render-controller'; +import { SlideEditingRenderController } from './controllers/slide-editing.render-controller'; import { SlideEditorBridgeRenderController } from './controllers/slide-editor-bridge.render-controller'; +import { SlidesUIController } from './controllers/slide-ui.controller'; +import { ISlideEditorBridgeService, SlideEditorBridgeService } from './services/slide-editor-bridge.service'; import { ISlideEditorManagerService, SlideEditorManagerService } from './services/slide-editor-manager.service'; -import { SlideEditingRenderController } from './controllers/slide-editing.render-controller'; +import { SlideCanvasPopMangerService } from './services/slide-popup-manager.service'; import { SlideRenderService } from './services/slide-render.service'; -import { CanvasView } from './controllers/canvas-view'; -import type { IUniverSlidesUIConfig } from './controllers/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; export const SLIDE_UI_PLUGIN_NAME = 'SLIDE_UI'; @@ -74,6 +72,7 @@ export class UniverSlidesUIPlugin extends Plugin { ] as Dependency[]).forEach((m) => { this.disposeWithMe(this._renderManagerService.registerRenderModule(UniverInstanceType.UNIVER_SLIDE, m)); }); + mergeOverrideWithDependencies([ [CanvasView], // cannot register in _renderManagerService now. @@ -89,7 +88,9 @@ export class UniverSlidesUIPlugin extends Plugin { ] as Dependency[], this._config.override).forEach((m) => { this._injector.add(m); }); + this._injector.get(CanvasView); + this._injector.get(SlideRenderService); } override onRendered(): void { @@ -98,13 +99,18 @@ export class UniverSlidesUIPlugin extends Plugin { // need TextSelectionRenderService which init by EditorContainer [SlideEditorBridgeRenderController], [SlideEditingRenderController], - ] as Dependency[]).forEach((m) => { // find all renderMap and register module to each item in renderMap this.disposeWithMe(this._renderManagerService.registerRenderModule(UniverInstanceType.UNIVER_SLIDE, m)); }); this._markSlideAsFocused(); + + this._injector.get(SlidesUIController); + } + + override onSteady(): void { + this._injector.get(SlidePopupMenuController); } private _markSlideAsFocused() { diff --git a/packages/thread-comment/src/controllers/tc-resource.controller.ts b/packages/thread-comment/src/controllers/tc-resource.controller.ts index 470d4a872cc..bf8204e5ec4 100644 --- a/packages/thread-comment/src/controllers/tc-resource.controller.ts +++ b/packages/thread-comment/src/controllers/tc-resource.controller.ts @@ -14,16 +14,15 @@ * limitations under the License. */ -import { Disposable, Inject, IResourceManagerService, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import type { IThreadComment } from '../types/interfaces/i-thread-comment'; +import { Disposable, Inject, IResourceManagerService } from '@univerjs/core'; import { UniverType } from '@univerjs/protocol'; import { ThreadCommentModel } from '../models/thread-comment.model'; -import { TC_PLUGIN_NAME } from '../types/const'; -import type { IThreadComment } from '../types/interfaces/i-thread-comment'; import { IThreadCommentDataSourceService } from '../services/tc-datasource.service'; +import { TC_PLUGIN_NAME } from '../types/const'; export type UnitThreadCommentJSON = Record; -@OnLifecycle(LifecycleStages.Starting, ThreadCommentResourceController) export class ThreadCommentResourceController extends Disposable { constructor( @IResourceManagerService private readonly _resourceManagerService: IResourceManagerService, diff --git a/packages/thread-comment/src/plugin.ts b/packages/thread-comment/src/plugin.ts index 1be7104d4c9..8952d655222 100644 --- a/packages/thread-comment/src/plugin.ts +++ b/packages/thread-comment/src/plugin.ts @@ -15,15 +15,15 @@ */ import type { Dependency } from '@univerjs/core'; +import type { IUniverThreadCommentConfig } from './controllers/config.schema'; import { ICommandService, IConfigService, Inject, Injector, mergeOverrideWithDependencies, Plugin, UniverInstanceType } from '@univerjs/core'; -import { ThreadCommentModel } from './models/thread-comment.model'; -import { ThreadCommentResourceController } from './controllers/tc-resource.controller'; -import { TC_PLUGIN_NAME } from './types/const'; -import { AddCommentMutation, DeleteCommentMutation, ResolveCommentMutation, UpdateCommentMutation, UpdateCommentRefMutation } from './commands/mutations/comment.mutation'; import { AddCommentCommand, DeleteCommentCommand, DeleteCommentTreeCommand, ResolveCommentCommand, UpdateCommentCommand } from './commands/commands/comment.command'; -import { IThreadCommentDataSourceService, ThreadCommentDataSourceService } from './services/tc-datasource.service'; -import type { IUniverThreadCommentConfig } from './controllers/config.schema'; +import { AddCommentMutation, DeleteCommentMutation, ResolveCommentMutation, UpdateCommentMutation, UpdateCommentRefMutation } from './commands/mutations/comment.mutation'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; +import { ThreadCommentResourceController } from './controllers/tc-resource.controller'; +import { ThreadCommentModel } from './models/thread-comment.model'; +import { IThreadCommentDataSourceService, ThreadCommentDataSourceService } from './services/tc-datasource.service'; +import { TC_PLUGIN_NAME } from './types/const'; export class UniverThreadCommentPlugin extends Plugin { static override pluginName = TC_PLUGIN_NAME; @@ -68,5 +68,7 @@ export class UniverThreadCommentPlugin extends Plugin { ].forEach((command) => { this._commandService.registerCommand(command); }); + + this._injector.get(ThreadCommentResourceController); } } diff --git a/packages/ui/src/controllers/error/error.controller.ts b/packages/ui/src/controllers/error/error.controller.ts index 12b628e84ef..3c745ec48d8 100644 --- a/packages/ui/src/controllers/error/error.controller.ts +++ b/packages/ui/src/controllers/error/error.controller.ts @@ -14,12 +14,11 @@ * limitations under the License. */ -import { Disposable, ErrorService, Inject, LifecycleStages, OnLifecycle, toDisposable } from '@univerjs/core'; +import { Disposable, ErrorService, Inject } from '@univerjs/core'; import { MessageType } from '@univerjs/design'; import { IMessageService } from '../../services/message/message.service'; -@OnLifecycle(LifecycleStages.Starting, ErrorController) export class ErrorController extends Disposable { constructor( @Inject(ErrorService) private readonly _errorService: ErrorService, @@ -27,15 +26,11 @@ export class ErrorController extends Disposable { ) { super(); - this.disposeWithMe( - toDisposable( - this._errorService.error$.subscribe((error) => { - this._messageService.show({ - content: error.errorKey, - type: MessageType.Error, - }); - }) - ) - ); + this.disposeWithMe(this._errorService.error$.subscribe((error) => { + this._messageService.show({ + content: error.errorKey, + type: MessageType.Error, + }); + })); } } diff --git a/packages/ui/src/controllers/shared-shortcut.controller.ts b/packages/ui/src/controllers/shared-shortcut.controller.ts index 2c19c495700..043f8041f48 100644 --- a/packages/ui/src/controllers/shared-shortcut.controller.ts +++ b/packages/ui/src/controllers/shared-shortcut.controller.ts @@ -15,13 +15,13 @@ */ import type { IContextService } from '@univerjs/core'; -import { Disposable, FOCUSING_UNIVER_EDITOR, ICommandService, LifecycleStages, OnLifecycle, RedoCommand, UndoCommand } from '@univerjs/core'; +import type { IShortcutItem } from '../services/shortcut/shortcut.service'; +import { Disposable, FOCUSING_UNIVER_EDITOR, ICommandService, RedoCommand, UndoCommand } from '@univerjs/core'; +import { SetEditorResizeOperation } from '../commands/operations/editor/set-editor-resize.operation'; import { CopyCommand, CutCommand, PasteCommand } from '../services/clipboard/clipboard.command'; import { KeyCode, MetaKeys } from '../services/shortcut/keycode'; -import type { IShortcutItem } from '../services/shortcut/shortcut.service'; import { IShortcutService } from '../services/shortcut/shortcut.service'; -import { SetEditorResizeOperation } from '../commands/operations/editor/set-editor-resize.operation'; // Not that the clipboard shortcut items would only be invoked when the browser fully supports clipboard API. // If not, the corresponding shortcut would not be triggered and we will perform clipboard operations @@ -87,7 +87,6 @@ export const RedoShortcutItem: IShortcutItem = { /** * Define shared UI behavior across Univer business. Including undo / redo and clipboard operations. */ -@OnLifecycle(LifecycleStages.Ready, SharedController) export class SharedController extends Disposable { constructor( @IShortcutService private readonly _shortcutService: IShortcutService, diff --git a/packages/ui/src/controllers/shortcut-display/shortcut-panel.controller.ts b/packages/ui/src/controllers/shortcut-display/shortcut-panel.controller.ts index cae861c4917..b8ce3c75799 100644 --- a/packages/ui/src/controllers/shortcut-display/shortcut-panel.controller.ts +++ b/packages/ui/src/controllers/shortcut-display/shortcut-panel.controller.ts @@ -14,18 +14,17 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, Injector, LifecycleStages, OnLifecycle } from '@univerjs/core'; - +import type { IShortcutItem } from '../../services/shortcut/shortcut.service'; +import { Disposable, ICommandService, Inject, Injector } from '@univerjs/core'; import { ShortcutPanelComponentName, ToggleShortcutPanelOperation, } from '../../commands/operations/toggle-shortcut-panel.operation'; import { ComponentManager } from '../../common/component-manager'; -import { ShortcutPanel } from '../../views/components/shortcut-panel/ShortcutPanel'; -import type { IShortcutItem } from '../../services/shortcut/shortcut.service'; -import { IShortcutService } from '../../services/shortcut/shortcut.service'; -import { KeyCode, MetaKeys } from '../../services/shortcut/keycode'; import { IMenuManagerService } from '../../services/menu/menu-manager.service'; +import { KeyCode, MetaKeys } from '../../services/shortcut/keycode'; +import { IShortcutService } from '../../services/shortcut/shortcut.service'; +import { ShortcutPanel } from '../../views/components/shortcut-panel/ShortcutPanel'; const ToggleShortcutPanelShortcut: IShortcutItem = { id: ToggleShortcutPanelOperation.id, @@ -37,7 +36,6 @@ const ToggleShortcutPanelShortcut: IShortcutItem = { /** * This controller add a side panel to the application to display the shortcuts. */ -@OnLifecycle(LifecycleStages.Steady, ShortcutPanelController) export class ShortcutPanelController extends Disposable { constructor( @Inject(Injector) injector: Injector, diff --git a/packages/ui/src/controllers/ui/ui-desktop.controller.tsx b/packages/ui/src/controllers/ui/ui-desktop.controller.tsx index f7aaa6caf96..6dda7128b92 100644 --- a/packages/ui/src/controllers/ui/ui-desktop.controller.tsx +++ b/packages/ui/src/controllers/ui/ui-desktop.controller.tsx @@ -14,13 +14,16 @@ * limitations under the License. */ -import { connectInjector, Disposable, Inject, Injector, isInternalEditorID, IUniverInstanceService, LifecycleService, LifecycleStages, OnLifecycle, Optional, toDisposable } from '@univerjs/core'; -import { IRenderManagerService } from '@univerjs/engine-render'; -import { render as createRoot, unmount } from 'rc-util/lib/React/render'; -import React from 'react'; import type { IDisposable, UnitModel } from '@univerjs/core'; import type { RenderUnit } from '@univerjs/engine-render'; +import type { IUniverUIConfig } from '../config.schema'; +import type { IWorkbenchOptions } from './ui.controller'; +import { connectInjector, Disposable, Inject, Injector, isInternalEditorID, IUniverInstanceService, LifecycleService, LifecycleStages, Optional, toDisposable } from '@univerjs/core'; +import { IRenderManagerService } from '@univerjs/engine-render'; +import { render as createRoot, unmount } from 'rc-util/lib/React/render'; +import React from 'react'; +import { filter, take } from 'rxjs'; import { ILayoutService } from '../../services/layout/layout.service'; import { IMenuManagerService } from '../../services/menu/menu-manager.service'; import { BuiltInUIPart, IUIPartsService } from '../../services/parts/parts.service'; @@ -28,15 +31,13 @@ import { FloatDom } from '../../views/components/dom/FloatDom'; import { CanvasPopup } from '../../views/components/popup/CanvasPopup'; import { DesktopWorkbench } from '../../views/workbench/Workbench'; import { menuSchema } from '../menus/menu.schema'; -import type { IUniverUIConfig } from '../config.schema'; -import type { IWorkbenchOptions } from './ui.controller'; const STEADY_TIMEOUT = 3000; -@OnLifecycle(LifecycleStages.Ready, DesktopUIController) export class DesktopUIController extends Disposable { private _steadyTimeout: NodeJS.Timeout; private _renderTimeout: NodeJS.Timeout; + constructor( private readonly _config: IUniverUIConfig, @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, @@ -51,8 +52,7 @@ export class DesktopUIController extends Disposable { this._initBuiltinComponents(); this._initMenus(); - - Promise.resolve().then(() => this._bootstrapWorkbench()); + this._bootstrapWorkbench(); } private _initMenus(): void { @@ -61,7 +61,6 @@ export class DesktopUIController extends Disposable { private _bootstrapWorkbench(): void { this.disposeWithMe(this._instanceSrv.unitDisposed$.subscribe((_unit: UnitModel) => { - clearTimeout(this._renderTimeout); clearTimeout(this._steadyTimeout); })); @@ -82,19 +81,21 @@ export class DesktopUIController extends Disposable { } }); - this._renderTimeout = setTimeout(() => { - const allRenders = this._renderManagerService.getRenderAll(); - - for (const [key, render] of allRenders) { - if (isInternalEditorID(key) || !((render) as RenderUnit).isRenderUnit) continue; - render.engine.setContainer(contentElement); - } - - this._lifecycleService.stage = LifecycleStages.Rendered; - this._steadyTimeout = setTimeout(() => { - this._lifecycleService.stage = LifecycleStages.Steady; - }, STEADY_TIMEOUT); - }, 300); + this.disposeWithMe(this._lifecycleService.lifecycle$.pipe(filter((stage) => stage === LifecycleStages.Ready), take(1)).subscribe(() => { + this._renderTimeout = setTimeout(() => { + const allRenders = this._renderManagerService.getRenderAll(); + + for (const [key, render] of allRenders) { + if (isInternalEditorID(key) || !((render) as RenderUnit).isRenderUnit) continue; + render.engine.setContainer(contentElement); + } + + this._lifecycleService.stage = LifecycleStages.Rendered; + this._steadyTimeout = setTimeout(() => { + this._lifecycleService.stage = LifecycleStages.Steady; + }, STEADY_TIMEOUT); + }, 300); + })); }) ); } diff --git a/packages/ui/src/controllers/ui/ui.controller.ts b/packages/ui/src/controllers/ui/ui.controller.ts index 6a8ca4c9d63..276aea23578 100644 --- a/packages/ui/src/controllers/ui/ui.controller.ts +++ b/packages/ui/src/controllers/ui/ui.controller.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { createIdentifier, LifecycleStages, runOnLifecycle } from '@univerjs/core'; +import { createIdentifier } from '@univerjs/core'; export interface IWorkbenchOptions { container?: string | HTMLElement; @@ -27,4 +27,3 @@ export interface IWorkbenchOptions { export interface IUIController {} export const IUIController = createIdentifier('univer.ui.ui-controller'); -runOnLifecycle(LifecycleStages.Ready, IUIController); diff --git a/packages/ui/src/mobile-ui-plugin.ts b/packages/ui/src/mobile-ui-plugin.ts index 61b8ba53c5c..0c0fc1f49cb 100644 --- a/packages/ui/src/mobile-ui-plugin.ts +++ b/packages/ui/src/mobile-ui-plugin.ts @@ -14,9 +14,10 @@ * limitations under the License. */ +import type { Dependency } from '@univerjs/core'; +import type { IUniverUIConfig } from './controllers/config.schema'; import { DependentOn, ILocalStorageService, Inject, Injector, mergeOverrideWithDependencies, Plugin } from '@univerjs/core'; import { UniverRenderEnginePlugin } from '@univerjs/engine-render'; -import type { Dependency } from '@univerjs/core'; import { ComponentManager } from './common/component-manager'; import { ZIndexManager } from './common/z-index-manager'; import { ErrorController } from './controllers/error/error.controller'; @@ -51,7 +52,6 @@ import { DesktopSidebarService } from './services/sidebar/desktop-sidebar.servic import { ISidebarService } from './services/sidebar/sidebar.service'; import { DesktopZenZoneService } from './services/zen-zone/desktop-zen-zone.service'; import { IZenZoneService } from './services/zen-zone/zen-zone.service'; -import type { IUniverUIConfig } from './controllers/config.schema'; export const UNIVER_MOBILE_UI_PLUGIN_NAME = 'UNIVER_MOBILE_UI_PLUGIN'; @@ -109,5 +109,8 @@ export class UniverMobileUIPlugin extends Plugin { ], this._config.override); dependencies.forEach((dependency) => this._injector.add(dependency)); + + this._injector.get(IUIController); + this._injector.get(ErrorController); } } diff --git a/packages/ui/src/services/confirm/confirm.service.ts b/packages/ui/src/services/confirm/confirm.service.ts index ce0173f5353..d1236bea8e3 100644 --- a/packages/ui/src/services/confirm/confirm.service.ts +++ b/packages/ui/src/services/confirm/confirm.service.ts @@ -15,14 +15,12 @@ */ import type { IDisposable } from '@univerjs/core'; -import { createIdentifier, LifecycleStages, runOnLifecycle } from '@univerjs/core'; import type { Subject } from 'rxjs'; - import type { IConfirmPartMethodOptions } from '../../views/components/confirm-part/interface'; -export const IConfirmService = createIdentifier('univer.confirm-service'); +import { createIdentifier } from '@univerjs/core'; -runOnLifecycle(LifecycleStages.Rendered, IConfirmService); +export const IConfirmService = createIdentifier('univer.confirm-service'); export interface IConfirmService { readonly confirmOptions$: Subject; diff --git a/packages/ui/src/services/layout/layout.service.ts b/packages/ui/src/services/layout/layout.service.ts index 0ec1c642903..88de2c34c5f 100644 --- a/packages/ui/src/services/layout/layout.service.ts +++ b/packages/ui/src/services/layout/layout.service.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { createIdentifier, Disposable, DocumentDataModel, FOCUSING_UNIVER_EDITOR, IContextService, IUniverInstanceService, LifecycleStages, OnLifecycle, remove, SlideDataModel, toDisposable, UniverInstanceType, Workbook } from '@univerjs/core'; -import { fromEvent } from 'rxjs'; import type { ContextService, IDisposable, Nullable } from '@univerjs/core'; +import { createIdentifier, Disposable, DocumentDataModel, FOCUSING_UNIVER_EDITOR, IContextService, IUniverInstanceService, remove, SlideDataModel, toDisposable, UniverInstanceType, Workbook } from '@univerjs/core'; +import { fromEvent } from 'rxjs'; type FocusHandlerFn = (unitId: string) => void; @@ -58,7 +58,6 @@ export const ILayoutService = createIdentifier('ui.layout-servic * This service is responsible for storing layout information of the current * Univer application instance. */ -@OnLifecycle(LifecycleStages.Ready, ILayoutService) export class DesktopLayoutService extends Disposable implements ILayoutService { private _rootContainerElement: Nullable = null; private _isFocused = false; diff --git a/packages/ui/src/ui-plugin.ts b/packages/ui/src/ui-plugin.ts index 98f17736d27..7bde95ecd69 100644 --- a/packages/ui/src/ui-plugin.ts +++ b/packages/ui/src/ui-plugin.ts @@ -14,10 +14,11 @@ * limitations under the License. */ -import { DependentOn, IConfigService, IContextService, ILocalStorageService, Inject, Injector, mergeOverrideWithDependencies, Plugin } from '@univerjs/core'; -import { UniverRenderEnginePlugin } from '@univerjs/engine-render'; import type { Dependency } from '@univerjs/core'; +import type { IUniverUIConfig } from './controllers/config.schema'; +import { DependentOn, IConfigService, IContextService, ILocalStorageService, Inject, Injector, mergeOverrideWithDependencies, Plugin } from '@univerjs/core'; +import { UniverRenderEnginePlugin } from '@univerjs/engine-render'; import { ComponentManager } from './common/component-manager'; import { ZIndexManager } from './common/z-index-manager'; import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; @@ -56,7 +57,6 @@ import { DesktopSidebarService } from './services/sidebar/desktop-sidebar.servic import { ISidebarService } from './services/sidebar/sidebar.service'; import { DesktopZenZoneService } from './services/zen-zone/desktop-zen-zone.service'; import { IZenZoneService } from './services/zen-zone/zen-zone.service'; -import type { IUniverUIConfig } from './controllers/config.schema'; export const UNIVER_UI_PLUGIN_NAME = 'UNIVER_UI_PLUGIN'; @@ -92,7 +92,6 @@ export class UniverUIPlugin extends Plugin { const dependencies: Dependency[] = mergeOverrideWithDependencies([ [ComponentManager], [ZIndexManager], - [ShortcutPanelService], [IUIPartsService, { useClass: UIPartsService }], [ILayoutService, { useClass: DesktopLayoutService }], @@ -118,12 +117,22 @@ export class UniverUIPlugin extends Plugin { [IUIController, { useFactory: (injector: Injector) => injector.createInstance(DesktopUIController, this._config), deps: [Injector], - }, - ], + }], [SharedController], [ErrorController], [ShortcutPanelController], ], this._config.override); dependencies.forEach((dependency) => this._injector.add(dependency)); + + this._injector.get(IUIController); + this._injector.get(ErrorController); + } + + override onReady(): void { + this._injector.get(SharedController); + } + + override onSteady(): void { + this._injector.get(ShortcutPanelController); } } diff --git a/packages/uniscript/src/controllers/uniscript.controller.ts b/packages/uniscript/src/controllers/uniscript.controller.ts index ef991549885..68eff132e2a 100644 --- a/packages/uniscript/src/controllers/uniscript.controller.ts +++ b/packages/uniscript/src/controllers/uniscript.controller.ts @@ -14,14 +14,13 @@ * limitations under the License. */ -import { Disposable, ICommandService, Inject, LifecycleStages, OnLifecycle } from '@univerjs/core'; +import { Disposable, ICommandService, Inject } from '@univerjs/core'; import { ComponentManager, IMenuManagerService } from '@univerjs/ui'; import { ScriptPanelComponentName, ToggleScriptPanelOperation } from '../commands/operations/panel.operation'; import { ScriptEditorPanel } from '../views/components/ScriptEditorPanel'; import { menuSchema } from './menu.schema'; -@OnLifecycle(LifecycleStages.Steady, UniscriptController) export class UniscriptController extends Disposable { constructor( @IMenuManagerService private readonly _menuManagerService: IMenuManagerService, diff --git a/packages/uniscript/src/plugin.ts b/packages/uniscript/src/plugin.ts index 0816d477c46..3093eb0a787 100644 --- a/packages/uniscript/src/plugin.ts +++ b/packages/uniscript/src/plugin.ts @@ -14,15 +14,14 @@ * limitations under the License. */ -import { IConfigService, Inject, Injector, Plugin } from '@univerjs/core'; import type { Dependency } from '@univerjs/core'; - +import type { IUniverUniscriptConfig } from './controllers/config.schema'; +import { IConfigService, Inject, Injector, Plugin } from '@univerjs/core'; +import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; import { UniscriptController } from './controllers/uniscript.controller'; import { ScriptEditorService } from './services/script-editor.service'; import { IUniscriptExecutionService, UniscriptExecutionService } from './services/script-execution.service'; import { ScriptPanelService } from './services/script-panel.service'; -import type { IUniverUniscriptConfig } from './controllers/config.schema'; -import { defaultPluginConfig, PLUGIN_CONFIG_KEY } from './controllers/config.schema'; const PLUGIN_NAME = 'UNIVER_UNISCRIPT_PLUGIN'; @@ -57,6 +56,10 @@ export class UniverUniscriptPlugin extends Plugin { this.registerExecution(); } + override onSteady(): void { + this._injector.get(UniscriptController); + } + /** * Allows being overridden, replacing with a new UniscriptExecutionService. */