fix(editor): view recorded in storage may not exist (#9788)

fix: BS-2415
This commit is contained in:
zzj3720
2025-01-20 05:36:42 +00:00
parent 1a18aeb22e
commit 66b6fd8b74
5 changed files with 25 additions and 13 deletions

View File

@@ -473,7 +473,7 @@ export class DatabaseBlockDataSource extends DataSourceBase {
return duplicateView(this._model, id); return duplicateView(this._model, id);
} }
viewDataGet(viewId: string): DataViewDataType { viewDataGet(viewId: string): DataViewDataType | undefined {
return this.viewDataList$.value.find(data => data.id === viewId)!; return this.viewDataList$.value.find(data => data.id === viewId)!;
} }
@@ -499,8 +499,11 @@ export class DatabaseBlockDataSource extends DataSourceBase {
return view; return view;
} }
viewMetaGetById(viewId: string): ViewMeta { viewMetaGetById(viewId: string): ViewMeta | undefined {
const view = this.viewDataGet(viewId); const view = this.viewDataGet(viewId);
if (!view) {
return;
}
return this.viewMetaGet(view.mode); return this.viewMetaGet(view.mode);
} }
} }

View File

@@ -333,7 +333,12 @@ export class DatabaseBlockComponent extends CaptionedBlockComponent<DatabaseBloc
this._dataSource = new DatabaseBlockDataSource(this.model); this._dataSource = new DatabaseBlockDataSource(this.model);
this._dataSource.contextSet(HostContextKey, this.host); this._dataSource.contextSet(HostContextKey, this.host);
const id = currentViewStorage.getCurrentView(this.model.id); const id = currentViewStorage.getCurrentView(this.model.id);
if (id) { if (id && this.dataSource.viewManager.viewGet(id)) {
console.log(
'set current view',
id,
this._dataSource.viewManager.viewGet(id)
);
this.dataSource.viewManager.setCurrentView(id); this.dataSource.viewManager.setCurrentView(id);
} }
} }

View File

@@ -84,7 +84,7 @@ export interface DataSource {
viewMetaGet(type: string): ViewMeta; viewMetaGet(type: string): ViewMeta;
viewMetaGet$(type: string): ReadonlySignal<ViewMeta | undefined>; viewMetaGet$(type: string): ReadonlySignal<ViewMeta | undefined>;
viewMetaGetById(viewId: string): ViewMeta; viewMetaGetById(viewId: string): ViewMeta | undefined;
viewMetaGetById$(viewId: string): ReadonlySignal<ViewMeta | undefined>; viewMetaGetById$(viewId: string): ReadonlySignal<ViewMeta | undefined>;
} }
@@ -217,7 +217,7 @@ export abstract class DataSourceBase implements DataSource {
abstract viewDataDuplicate(id: string): string; abstract viewDataDuplicate(id: string): string;
abstract viewDataGet(viewId: string): DataViewDataType; abstract viewDataGet(viewId: string): DataViewDataType | undefined;
viewDataGet$(viewId: string): ReadonlySignal<DataViewDataType | undefined> { viewDataGet$(viewId: string): ReadonlySignal<DataViewDataType | undefined> {
return computed(() => this.viewDataGet(viewId)); return computed(() => this.viewDataGet(viewId));
@@ -236,7 +236,7 @@ export abstract class DataSourceBase implements DataSource {
return computed(() => this.viewMetaGet(type)); return computed(() => this.viewMetaGet(type));
} }
abstract viewMetaGetById(viewId: string): ViewMeta; abstract viewMetaGetById(viewId: string): ViewMeta | undefined;
viewMetaGetById$(viewId: string): ReadonlySignal<ViewMeta | undefined> { viewMetaGetById$(viewId: string): ReadonlySignal<ViewMeta | undefined> {
return computed(() => this.viewMetaGetById(viewId)); return computed(() => this.viewMetaGetById(viewId));

View File

@@ -22,7 +22,7 @@ export interface ViewManager {
views$: ReadonlySignal<string[]>; views$: ReadonlySignal<string[]>;
viewGet(id: string): SingleView; viewGet(id: string): SingleView | undefined;
viewAdd(type: DataViewMode): string; viewAdd(type: DataViewMode): string;
@@ -86,7 +86,7 @@ export class ViewManagerBase implements ViewManager {
} }
viewChangeType(id: string, type: string): void { viewChangeType(id: string, type: string): void {
const from = this.viewGet(id).type; const from = this.viewGet(id)?.type;
const meta = this.dataSource.viewMetaGet(type); const meta = this.dataSource.viewMetaGet(type);
this.dataSource.viewDataUpdate(id, old => { this.dataSource.viewDataUpdate(id, old => {
let data = { let data = {
@@ -122,8 +122,9 @@ export class ViewManagerBase implements ViewManager {
this.setCurrentView(newId); this.setCurrentView(newId);
} }
viewGet(id: string): SingleView { viewGet(id: string): SingleView | undefined {
const meta = this.dataSource.viewMetaGetById(id); const meta = this.dataSource.viewMetaGetById(id);
if (!meta) return;
return new meta.model.dataViewManager(this, id); return new meta.model.dataViewManager(this, id);
} }
} }

View File

@@ -96,7 +96,7 @@ export class DataViewHeaderViews extends WidgetBase {
popupTargetFromElement(event.currentTarget as HTMLElement), popupTargetFromElement(event.currentTarget as HTMLElement),
[ [
menu.group({ menu.group({
items: views.map(id => { items: views.flatMap(id => {
const openViewOption = (event: MouseEvent) => { const openViewOption = (event: MouseEvent) => {
event.stopPropagation(); event.stopPropagation();
this.openViewOption( this.openViewOption(
@@ -105,9 +105,12 @@ export class DataViewHeaderViews extends WidgetBase {
); );
}; };
const view = this.viewManager.viewGet(id); const view = this.viewManager.viewGet(id);
if (!view) {
return [];
}
return menu.action({ return menu.action({
prefix: html`<uni-lit prefix: html`<uni-lit
.uni=${this.getRenderer(id).icon} .uni=${this.getRenderer(id)?.icon}
></uni-lit>`, ></uni-lit>`,
name: view.name$.value ?? '', name: view.name$.value ?? '',
label: () => html`${view.name$.value}`, label: () => html`${view.name$.value}`,
@@ -262,7 +265,7 @@ export class DataViewHeaderViews extends WidgetBase {
style="margin-right: 4px;" style="margin-right: 4px;"
@click="${(event: MouseEvent) => this._clickView(event, id)}" @click="${(event: MouseEvent) => this._clickView(event, id)}"
> >
<uni-lit class="icon" .uni="${this.getRenderer(id).icon}"></uni-lit> <uni-lit class="icon" .uni="${this.getRenderer(id)?.icon}"></uni-lit>
<div class="name">${view?.name}</div> <div class="name">${view?.name}</div>
</div> </div>
`; `;
@@ -274,7 +277,7 @@ export class DataViewHeaderViews extends WidgetBase {
} }
private getRenderer(viewId: string) { private getRenderer(viewId: string) {
return this.dataSource.viewMetaGetById(viewId).renderer; return this.dataSource.viewMetaGetById(viewId)?.renderer;
} }
_clickView(event: MouseEvent, id: string) { _clickView(event: MouseEvent, id: string) {