Skip to content

Commit

Permalink
CB-4885 fix: table data loading behaviour
Browse files Browse the repository at this point in the history
  • Loading branch information
Wroud committed Jun 28, 2024
1 parent 3a648ab commit 5b3b1b5
Show file tree
Hide file tree
Showing 21 changed files with 219 additions and 213 deletions.
4 changes: 4 additions & 0 deletions webapp/packages/core-authentication/src/AuthInfoService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ export class AuthInfoService {
return this.userInfoResource.data;
}

get isAnonymous(): boolean {
return !this.userInfoResource.data;
}

constructor(
private readonly userInfoResource: UserInfoResource,
private readonly authProvidersResource: AuthProvidersResource,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@

.menuBarItemGroup {
& .menuBarItem {
& .menuBarItemBox {
gap: 0;
}
& .menuBarItemLabel {
font-size: 14px;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { AdministrationScreenService } from '@cloudbeaver/core-administration';
import {
AppAuthService,
AUTH_PROVIDER_LOCAL_ID,
AuthInfoService,
AuthProviderContext,
AuthProviderService,
AuthProvidersResource,
Expand Down Expand Up @@ -49,6 +50,7 @@ export class AuthenticationService extends Bootstrap {
private readonly appAuthService: AppAuthService,
private readonly authDialogService: AuthDialogService,
private readonly userInfoResource: UserInfoResource,
private readonly authInfoService: AuthInfoService,
private readonly notificationService: NotificationService,
private readonly administrationScreenService: AdministrationScreenService,
private readonly authProviderService: AuthProviderService,
Expand All @@ -65,6 +67,7 @@ export class AuthenticationService extends Bootstrap {
this.onLogin = new Executor();

this.onLogout.before(this.navigationService.navigationTask);
this.onLogin.before(this.navigationService.navigationTask, undefined, () => authInfoService.isAnonymous);

this.authPromise = null;
this.configureAuthProvider = null;
Expand Down
11 changes: 10 additions & 1 deletion webapp/packages/plugin-connections/src/ConnectionAuthService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import { AuthProviderService } from '@cloudbeaver/core-authentication';
import { AuthInfoService, AuthProviderService } from '@cloudbeaver/core-authentication';
import { importLazyComponent } from '@cloudbeaver/core-blocks';
import {
Connection,
Expand All @@ -28,12 +28,21 @@ export class ConnectionAuthService extends Dependency {
private readonly connectionInfoResource: ConnectionInfoResource,
private readonly commonDialogService: CommonDialogService,
private readonly authProviderService: AuthProviderService,
private readonly authInfoService: AuthInfoService,
private readonly connectionsManagerService: ConnectionsManagerService,
private readonly authenticationService: AuthenticationService,
) {
super();

connectionsManagerService.connectionExecutor.addHandler(this.connectionDialog.bind(this));
this.authenticationService.onLogin.before(
connectionsManagerService.onDisconnect,
state => ({
connections: connectionInfoResource.values.filter(connection => connection.connected).map(createConnectionParam),
state,
}),
() => authInfoService.isAnonymous,
);
this.authenticationService.onLogout.before(connectionsManagerService.onDisconnect, state => ({
connections: connectionInfoResource.values.filter(connection => connection.connected).map(createConnectionParam),
state,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,8 @@ export class DataGridContextMenuFilterService {
throw new Error(`Failed to get result column info for the following column index: "${column.index}"`);
}

await model.requestDataAction(async () => {
await model.request(() => {
constraints.setFilter(resultColumn.position, operator, filterValue);
await model.request(true);
});
}

Expand Down Expand Up @@ -150,9 +149,8 @@ export class DataGridContextMenuFilterService {
const { model, resultIndex } = context.data;
const constraints = model.source.getAction(resultIndex, DatabaseDataConstraintAction);

await model.requestDataAction(async () => {
await model.request(() => {
constraints.deleteData();
await model.request(true);
});
},
});
Expand Down Expand Up @@ -362,9 +360,8 @@ export class DataGridContextMenuFilterService {
throw new Error(`Failed to get result column info for the following column index: "${key.column.index}"`);
}

await model.requestDataAction(async () => {
await model.request(() => {
constraints.deleteFilter(resultColumn.position);
await model.request(true);
});
},
});
Expand All @@ -386,9 +383,8 @@ export class DataGridContextMenuFilterService {
const { model, resultIndex } = context.data;
const constraints = model.source.getAction(resultIndex, DatabaseDataConstraintAction);

await model.requestDataAction(async () => {
await model.request(() => {
constraints.deleteDataFilters();
await model.request(true);
});
},
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,8 @@ export class DataGridContextMenuOrderService {
throw new Error(`Failed to get result column info for the following column index: "${column.index}"`);
}

await model.requestDataAction(async () => {
await model.request(() => {
constraints.setOrder(resultColumn.position, order, true);
await model.request(true);
});
}

Expand Down Expand Up @@ -130,9 +129,8 @@ export class DataGridContextMenuOrderService {
isDisabled: context => context.data.model.isLoading(),
onClick: async context => {
const constraints = context.data.model.source.getAction(context.data.resultIndex, DatabaseDataConstraintAction);
await context.data.model.requestDataAction(async () => {
await context.data.model.request(() => {
constraints.deleteOrders();
await context.data.model.request(true);
});
},
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,8 @@ export const OrderButton = observer<Props>(function OrderButton({ model, resultI

const handleSort = async (e: React.MouseEvent<HTMLButtonElement>) => {
const nextOrder = getNextOrder(currentOrder);
await model.requestDataAction(async () => {
await model.request(() => {
constraints.setOrder(attributePosition, nextOrder, e.ctrlKey || e.metaKey);
await model.request(true);
});
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ import { ConfirmationDialog } from '@cloudbeaver/core-blocks';
import { injectable } from '@cloudbeaver/core-di';
import { CommonDialogService, DialogueStateResult } from '@cloudbeaver/core-dialogs';
import { NotificationService } from '@cloudbeaver/core-events';
import { ExecutorInterrupter, IExecutionContextProvider } from '@cloudbeaver/core-executor';
import { executorHandlerFilter, ExecutorInterrupter, IExecutionContextProvider } from '@cloudbeaver/core-executor';

import { DatabaseEditAction } from './DatabaseDataModel/Actions/DatabaseEditAction';
import type { IRequestEventData } from './DatabaseDataModel/IDatabaseDataModel';
import { DatabaseDataSourceOperation } from './DatabaseDataModel/IDatabaseDataSource';
import { TableViewerStorageService } from './TableViewer/TableViewerStorageService';

@injectable()
Expand All @@ -29,12 +30,12 @@ export class DataViewerDataChangeConfirmationService {
const model = this.dataViewerTableService.get(modelId);

if (model && !model.onRequest.hasHandler(this.checkUnsavedData)) {
model.onRequest.addHandler(this.checkUnsavedData);
model.onRequest.addHandler(executorHandlerFilter(({ operation }) => operation !== DatabaseDataSourceOperation.Save, this.checkUnsavedData));
}
}

private async checkUnsavedData({ type, model }: IRequestEventData<any, any>, contexts: IExecutionContextProvider<IRequestEventData<any, any>>) {
if (type === 'before') {
private async checkUnsavedData({ stage, model }: IRequestEventData<any, any>, contexts: IExecutionContextProvider<IRequestEventData<any, any>>) {
if (stage === 'before') {
const confirmationContext = contexts.getContext(SaveConfirmedContext);

if (confirmationContext.confirmed === false) {
Expand Down
43 changes: 26 additions & 17 deletions webapp/packages/plugin-data-viewer/src/DataViewerTabService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import { importLazyComponent } from '@cloudbeaver/core-blocks';
import { ConnectionInfoResource, ConnectionsManagerService, IConnectionExecutorData } from '@cloudbeaver/core-connections';
import { injectable } from '@cloudbeaver/core-di';
import { NotificationService } from '@cloudbeaver/core-events';
Expand All @@ -14,11 +15,12 @@ import { resourceKeyList } from '@cloudbeaver/core-resource';
import { ITab, NavigationTabsService } from '@cloudbeaver/plugin-navigation-tabs';
import { DBObjectPageService, IObjectViewerTabState, isObjectViewerTab, ObjectPage, ObjectViewerTabService } from '@cloudbeaver/plugin-object-viewer';

import { DataViewerPanel } from './DataViewerPage/DataViewerPanel';
import { DataViewerTab } from './DataViewerPage/DataViewerTab';
import type { IDataViewerPageState } from './IDataViewerPageState';
import { TableViewerStorageService } from './TableViewer/TableViewerStorageService';

const DataViewerTab = importLazyComponent(() => import('./DataViewerPage/DataViewerTab').then(module => module.DataViewerTab));
const DataViewerPanel = importLazyComponent(() => import('./DataViewerPage/DataViewerPanel').then(module => module.DataViewerPanel));

@injectable()
export class DataViewerTabService {
readonly page: ObjectPage<IDataViewerPageState>;
Expand All @@ -40,6 +42,7 @@ export class DataViewerTabService {
getTabComponent: () => DataViewerTab,
getPanelComponent: () => DataViewerPanel,
onRestore: this.handleTabRestore.bind(this),
onUnload: this.handleTabClose.bind(this),
canClose: this.handleTabCanClose.bind(this),
onClose: this.handleTabClose.bind(this),
});
Expand All @@ -55,25 +58,27 @@ export class DataViewerTabService {

private async disconnectHandler(data: IConnectionExecutorData, contexts: IExecutionContextProvider<IConnectionExecutorData>) {
const connectionsKey = resourceKeyList(data.connections);
if (data.state === 'before') {
const tabs = Array.from(
this.navigationTabsService.findTabs(
isObjectViewerTab(tab => {
if (!tab.handlerState.connectionKey) {
return false;
}
return this.connectionInfoResource.isIntersect(connectionsKey, tab.handlerState.connectionKey);
}),
),
);

for (const tab of tabs) {
const tabs = Array.from(
this.navigationTabsService.findTabs(
isObjectViewerTab(tab => {
if (!tab.handlerState.connectionKey) {
return false;
}
return this.connectionInfoResource.isIntersect(connectionsKey, tab.handlerState.connectionKey);
}),
),
);

for (const tab of tabs) {
if (data.state === 'before') {
const canDisconnect = await this.handleTabCanClose(tab);

if (!canDisconnect) {
ExecutorInterrupter.interrupt(contexts);
return;
}
} else if (isObjectViewerTab(tab) && tab.handlerState.tableId) {
await this.disposeTableModel(tab.handlerState.tableId);
}
}
}
Expand Down Expand Up @@ -108,7 +113,7 @@ export class DataViewerTabService {
if (model) {
let canClose = false;
try {
await model.requestDataAction(() => {
await model.source.runTask(async () => {
canClose = true;
});
} catch {}
Expand All @@ -120,8 +125,12 @@ export class DataViewerTabService {
}

private async handleTabClose(tab: ITab<IObjectViewerTabState>) {
const tableId = tab.handlerState.tableId;
if (tab.handlerState.tableId) {
await this.disposeTableModel(tab.handlerState.tableId);
}
}

private async disposeTableModel(tableId: string) {
if (tableId) {
const model = this.tableViewerStorageService.get(tableId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import { makeObservable, observable } from 'mobx';
import { observable } from 'mobx';

import type { ResultDataFormat } from '@cloudbeaver/core-sdk';

Expand Down Expand Up @@ -79,18 +79,20 @@ export class DatabaseRefreshAction<TResult extends IDatabaseDataResult> extends

private startTimer(): void {
if (this.timer) {
return;
this.stopTimer();
}
this.resume();
this.timer = setInterval(this.refresh.bind(this), this.state.interval);
this.timer = setTimeout(this.refresh.bind(this), this.state.interval);
}

private async refresh(): Promise<void> {
if (this.state.paused) {
this.startTimer();
return;
}
try {
await this.source.refreshData();
this.startTimer();
} catch (exception) {
if (this.state.stopOnError) {
this.stopTimer();
Expand Down
Loading

0 comments on commit 5b3b1b5

Please sign in to comment.