From 8f8e80d1051b2e4d8e8ef9c56a0c58fa8805d98b Mon Sep 17 00:00:00 2001 From: siam <31573022+siam-ese@users.noreply.github.com> Date: Tue, 14 May 2024 08:19:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(sheet):=20filterRenderController=20work=20a?= =?UTF-8?q?fter=20selectionRenderControll=E2=80=A6=20(#2229)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(sheet): filterRenderController work after selectionRenderController readied * chore(sheet): check usable --- .../sheets-filter-render.controller.ts | 27 ++++++++++--------- .../selection/selection-render.service.ts | 10 +++++++ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/packages/sheets-filter-ui/src/controllers/sheets-filter-render.controller.ts b/packages/sheets-filter-ui/src/controllers/sheets-filter-render.controller.ts index 4fd908bc9a..e54c76ffec 100644 --- a/packages/sheets-filter-ui/src/controllers/sheets-filter-render.controller.ts +++ b/packages/sheets-filter-ui/src/controllers/sheets-filter-render.controller.ts @@ -26,7 +26,7 @@ import { getCoordByCell, ISelectionRenderService, SelectionShape, SheetRenderCon import type { IDisposable } from '@wendellhu/redi'; import { Inject, Injector } from '@wendellhu/redi'; -import { filter, map, of, startWith, switchMap, takeUntil, throttleTime } from 'rxjs'; +import { combineLatest, filter, map, of, startWith, switchMap, takeUntil, throttleTime } from 'rxjs'; import type { ISheetsFilterButtonShapeProps } from '../views/widgets/filter-button.shape'; import { FILTER_ICON_PADDING, FILTER_ICON_SIZE, SheetsFilterButtonShape } from '../views/widgets/filter-button.shape'; @@ -91,17 +91,20 @@ export class SheetsFilterRenderController extends RxDisposable implements IRende skeleton: skeletonParams.skeleton, }); - return fromCallback(this._commandService.onCommandExecuted) - .pipe( - filter(([command]) => - command.type === CommandType.MUTATION - && (command.params as ISheetCommandSharedParams).unitId === workbook.getUnitId() - && FILTER_MUTATIONS.has(command.id) - ), - throttleTime(20, undefined, { leading: false, trailing: true }), - map(getParams), - startWith(getParams()) // must trigger once - ); + return combineLatest([ + this._selectionRenderService.usable$, + fromCallback(this._commandService.onCommandExecuted), + ]).pipe( + filter(([usable, [command]]) => + usable + && command.type === CommandType.MUTATION + && (command.params as ISheetCommandSharedParams).unitId === workbook.getUnitId() + && FILTER_MUTATIONS.has(command.id) + ), + throttleTime(20, undefined, { leading: false, trailing: true }), + map(getParams), + startWith(getParams()) // must trigger once + ); }), takeUntil(this.dispose$) ) diff --git a/packages/sheets-ui/src/services/selection/selection-render.service.ts b/packages/sheets-ui/src/services/selection/selection-render.service.ts index 73ec52a988..204cfc00a7 100644 --- a/packages/sheets-ui/src/services/selection/selection-render.service.ts +++ b/packages/sheets-ui/src/services/selection/selection-render.service.ts @@ -50,6 +50,7 @@ export interface ISelectionRenderService { readonly controlFillConfig$: Observable; readonly selectionMoving$: Observable; readonly selectionMoveStart$: Observable; + readonly usable$: Observable; enableHeaderHighlight(): void; disableHeaderHighlight(): void; @@ -194,6 +195,14 @@ export class SelectionRenderService implements ISelectionRenderService { private _activeViewport: Nullable; + /** + * This service relies on the scene and skeleton to work + * Use usable$ to check if this service works + */ + private readonly _usable$ = new Subject(); + + readonly usable$ = this._usable$.asObservable(); + constructor( @Inject(ThemeService) private readonly _themeService: ThemeService, @IShortcutService private readonly _shortcutService: IShortcutService, @@ -352,6 +361,7 @@ export class SelectionRenderService implements ISelectionRenderService { this._skeleton = skeleton; this._scene = scene; this._activeViewport = viewport || scene?.getViewports()[0]; + this._usable$.next(Boolean(skeleton && scene)); } getSelectionDataWithStyle(): ISelectionWithCoordAndStyle[] {