diff --git a/blocksuite/affine/block-database/src/data-source.ts b/blocksuite/affine/block-database/src/data-source.ts index 5b5f308df1..82c2b1c275 100644 --- a/blocksuite/affine/block-database/src/data-source.ts +++ b/blocksuite/affine/block-database/src/data-source.ts @@ -473,7 +473,7 @@ export class DatabaseBlockDataSource extends DataSourceBase { return duplicateView(this._model, id); } - viewDataGet(viewId: string): DataViewDataType { + viewDataGet(viewId: string): DataViewDataType | undefined { return this.viewDataList$.value.find(data => data.id === viewId)!; } @@ -499,8 +499,11 @@ export class DatabaseBlockDataSource extends DataSourceBase { return view; } - viewMetaGetById(viewId: string): ViewMeta { + viewMetaGetById(viewId: string): ViewMeta | undefined { const view = this.viewDataGet(viewId); + if (!view) { + return; + } return this.viewMetaGet(view.mode); } } diff --git a/blocksuite/affine/block-database/src/database-block.ts b/blocksuite/affine/block-database/src/database-block.ts index 82a4e75478..f14c0c5c93 100644 --- a/blocksuite/affine/block-database/src/database-block.ts +++ b/blocksuite/affine/block-database/src/database-block.ts @@ -333,7 +333,12 @@ export class DatabaseBlockComponent extends CaptionedBlockComponent; - viewMetaGetById(viewId: string): ViewMeta; + viewMetaGetById(viewId: string): ViewMeta | undefined; viewMetaGetById$(viewId: string): ReadonlySignal; } @@ -217,7 +217,7 @@ export abstract class DataSourceBase implements DataSource { abstract viewDataDuplicate(id: string): string; - abstract viewDataGet(viewId: string): DataViewDataType; + abstract viewDataGet(viewId: string): DataViewDataType | undefined; viewDataGet$(viewId: string): ReadonlySignal { return computed(() => this.viewDataGet(viewId)); @@ -236,7 +236,7 @@ export abstract class DataSourceBase implements DataSource { return computed(() => this.viewMetaGet(type)); } - abstract viewMetaGetById(viewId: string): ViewMeta; + abstract viewMetaGetById(viewId: string): ViewMeta | undefined; viewMetaGetById$(viewId: string): ReadonlySignal { return computed(() => this.viewMetaGetById(viewId)); diff --git a/blocksuite/affine/data-view/src/core/view-manager/view-manager.ts b/blocksuite/affine/data-view/src/core/view-manager/view-manager.ts index 0be42c4828..471b1adbd3 100644 --- a/blocksuite/affine/data-view/src/core/view-manager/view-manager.ts +++ b/blocksuite/affine/data-view/src/core/view-manager/view-manager.ts @@ -22,7 +22,7 @@ export interface ViewManager { views$: ReadonlySignal; - viewGet(id: string): SingleView; + viewGet(id: string): SingleView | undefined; viewAdd(type: DataViewMode): string; @@ -86,7 +86,7 @@ export class ViewManagerBase implements ViewManager { } viewChangeType(id: string, type: string): void { - const from = this.viewGet(id).type; + const from = this.viewGet(id)?.type; const meta = this.dataSource.viewMetaGet(type); this.dataSource.viewDataUpdate(id, old => { let data = { @@ -122,8 +122,9 @@ export class ViewManagerBase implements ViewManager { this.setCurrentView(newId); } - viewGet(id: string): SingleView { + viewGet(id: string): SingleView | undefined { const meta = this.dataSource.viewMetaGetById(id); + if (!meta) return; return new meta.model.dataViewManager(this, id); } } diff --git a/blocksuite/affine/data-view/src/widget-presets/views-bar/views-view.ts b/blocksuite/affine/data-view/src/widget-presets/views-bar/views-view.ts index b92e690bd2..98e4df0447 100644 --- a/blocksuite/affine/data-view/src/widget-presets/views-bar/views-view.ts +++ b/blocksuite/affine/data-view/src/widget-presets/views-bar/views-view.ts @@ -96,7 +96,7 @@ export class DataViewHeaderViews extends WidgetBase { popupTargetFromElement(event.currentTarget as HTMLElement), [ menu.group({ - items: views.map(id => { + items: views.flatMap(id => { const openViewOption = (event: MouseEvent) => { event.stopPropagation(); this.openViewOption( @@ -105,9 +105,12 @@ export class DataViewHeaderViews extends WidgetBase { ); }; const view = this.viewManager.viewGet(id); + if (!view) { + return []; + } return menu.action({ prefix: html``, name: view.name$.value ?? '', label: () => html`${view.name$.value}`, @@ -262,7 +265,7 @@ export class DataViewHeaderViews extends WidgetBase { style="margin-right: 4px;" @click="${(event: MouseEvent) => this._clickView(event, id)}" > - +
${view?.name}
`; @@ -274,7 +277,7 @@ export class DataViewHeaderViews extends WidgetBase { } private getRenderer(viewId: string) { - return this.dataSource.viewMetaGetById(viewId).renderer; + return this.dataSource.viewMetaGetById(viewId)?.renderer; } _clickView(event: MouseEvent, id: string) {