From 61fb99d737d346a24c7f8e14910a2fcb1ddd532c Mon Sep 17 00:00:00 2001 From: Jindrich Susen Date: Mon, 25 Sep 2023 21:02:38 +0200 Subject: [PATCH] Session expired exception was throw after reopening a screen exception occured in rowSates endpoint --- frontend-html/src/model/entities/DataSource.ts | 4 ++++ frontend-html/src/model/entities/FormScreen.ts | 7 ++++++- frontend-html/src/model/entities/RowState.ts | 15 +++++++++++++-- .../WorkbenchLifecycle/WorkbenchLifecycle.ts | 1 + .../src/model/entities/types/IDataSource.ts | 2 ++ .../src/model/entities/types/IFormScreen.ts | 2 ++ .../src/model/entities/types/IRowState.ts | 2 ++ 7 files changed, 30 insertions(+), 3 deletions(-) diff --git a/frontend-html/src/model/entities/DataSource.ts b/frontend-html/src/model/entities/DataSource.ts index 8867c80247..c9b5573231 100644 --- a/frontend-html/src/model/entities/DataSource.ts +++ b/frontend-html/src/model/entities/DataSource.ts @@ -51,4 +51,8 @@ export class DataSource implements IDataSource { getFieldByIndex(index: number): IDataSourceField | undefined { return this.fields.find(field => field.index === index); } + + dispose(){ + this.rowState.dispose(); + } } diff --git a/frontend-html/src/model/entities/FormScreen.ts b/frontend-html/src/model/entities/FormScreen.ts index 9249ce5cc5..ec4bfcaf81 100644 --- a/frontend-html/src/model/entities/FormScreen.ts +++ b/frontend-html/src/model/entities/FormScreen.ts @@ -251,8 +251,13 @@ export class FormScreen implements IFormScreen { console.log("End of View bindings"); console.log(""); } - /* eslint-enable no-console */ + + dispose(){ + for (let dataSource of this.dataSources) { + dataSource.dispose(); + } + } } export class FormScreenEnvelope implements IFormScreenEnvelope { diff --git a/frontend-html/src/model/entities/RowState.ts b/frontend-html/src/model/entities/RowState.ts index 8c9628e3ee..c2884e9ec0 100644 --- a/frontend-html/src/model/entities/RowState.ts +++ b/frontend-html/src/model/entities/RowState.ts @@ -40,12 +40,13 @@ export class RowState implements IRowState { $type_IRowState: 1 = 1; suppressWorkingStatus: boolean = false; visibleRowIds: string[] = []; + disposers: (()=> void)[] = []; constructor(debouncingDelayMilliseconds?: number) { this.triggerLoadDebounced = _.debounce( this.triggerLoadImm, debouncingDelayMilliseconds == undefined ? 0 : debouncingDelayMilliseconds); - visibleRowsChanged.subscribe((visibleRows) => { + const disposer = visibleRowsChanged.subscribe((visibleRows) => { const dataSource = getDataSource(this); if (!visibleRows || dataSource.identifier !== visibleRows.dataSourceId) { return; @@ -59,6 +60,7 @@ export class RowState implements IRowState { } this.triggerLoadDebounced(); }); + this.disposers.push(disposer); } monitor: FlowBusyMonitor = new FlowBusyMonitor(); @@ -119,8 +121,9 @@ export class RowState implements IRowState { } this.isSomethingLoading = true; const api = getApi(this); + const sessionId = getSessionId(this); const states = yield api.getRowStates({ - SessionFormIdentifier: getSessionId(this), + SessionFormIdentifier: sessionId, Entity: getEntity(this), Ids: Array.from(requestsToLoad.values()).map(request => request.rowId) }); @@ -153,6 +156,10 @@ export class RowState implements IRowState { triggerLoadDebounced: any; getValue(rowId: string) { + const sessionId = getSessionId(this); + if(sessionId === (window as any).debugSessionId){ + debugger; + } if (!this.requests.has(rowId)) { this.requests.set(rowId, new RowStateRequest(rowId)); } @@ -250,6 +257,10 @@ export class RowState implements IRowState { // TODO: Wait when something is currently loading. } + dispose(){ + this.disposers.forEach(x => x()); + } + parent?: any; } diff --git a/frontend-html/src/model/entities/WorkbenchLifecycle/WorkbenchLifecycle.ts b/frontend-html/src/model/entities/WorkbenchLifecycle/WorkbenchLifecycle.ts index 85beda0c56..c644654753 100644 --- a/frontend-html/src/model/entities/WorkbenchLifecycle/WorkbenchLifecycle.ts +++ b/frontend-html/src/model/entities/WorkbenchLifecycle/WorkbenchLifecycle.ts @@ -386,6 +386,7 @@ export class WorkbenchLifecycle implements IWorkbenchLifecycle { const api = getApi(this); if (openedScreen.content) { if (openedScreen.content.formScreen) { + openedScreen.content.formScreen.dispose(); yield api.destroyUI({FormSessionId: getSessionId(openedScreen.content.formScreen)}); } else if (openedScreen.content.preloadedSessionId) { yield api.destroyUI({FormSessionId: openedScreen.content.preloadedSessionId}); diff --git a/frontend-html/src/model/entities/types/IDataSource.ts b/frontend-html/src/model/entities/types/IDataSource.ts index d108458e76..956903e31a 100644 --- a/frontend-html/src/model/entities/types/IDataSource.ts +++ b/frontend-html/src/model/entities/types/IDataSource.ts @@ -37,6 +37,8 @@ export interface IDataSource extends IDataSourceData { getFieldByIndex(idex: number): IDataSourceField | undefined; parent?: any; + + dispose(): void; } export const isIDataSource = (o: any): o is IDataSource => o.$type_IDataSource; diff --git a/frontend-html/src/model/entities/types/IFormScreen.ts b/frontend-html/src/model/entities/types/IFormScreen.ts index 0f004a83d4..2ed0c9c8d8 100644 --- a/frontend-html/src/model/entities/types/IFormScreen.ts +++ b/frontend-html/src/model/entities/types/IFormScreen.ts @@ -184,6 +184,8 @@ export interface IFormScreen extends IFormScreenData { printMasterDetailTree(): void; parent?: any; + + dispose(): void; } export interface IScreenNotification { diff --git a/frontend-html/src/model/entities/types/IRowState.ts b/frontend-html/src/model/entities/types/IRowState.ts index e5ae039f40..de88c55034 100644 --- a/frontend-html/src/model/entities/types/IRowState.ts +++ b/frontend-html/src/model/entities/types/IRowState.ts @@ -41,6 +41,8 @@ export interface IRowState extends IRowStateData { reload(): void; parent?: any; + + dispose(): void; } export interface IRowStateItem {