Skip to content

Commit 2a45a9d

Browse files
iobuhovsamuelreichert
authored andcommitted
refactor: change flags
1 parent 0e6dbc8 commit 2a45a9d

File tree

8 files changed

+57
-50
lines changed

8 files changed

+57
-50
lines changed

packages/pluggableWidgets/datagrid-web/src/Datagrid.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1+
import { useOnResetFiltersEvent } from "@mendix/widget-plugin-external-events/hooks";
2+
import { useClickActionHelper } from "@mendix/widget-plugin-grid/helpers/ClickActionHelper";
3+
import { useFocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/useFocusTargetController";
14
import { useSelectionHelper } from "@mendix/widget-plugin-grid/selection";
25
import { generateUUID } from "@mendix/widget-plugin-platform/framework/generate-uuid";
6+
import { observer } from "mobx-react-lite";
37
import { ReactElement, ReactNode, createElement, useCallback, useMemo } from "react";
48
import { DatagridContainerProps } from "../typings/DatagridProps";
59
import { Cell } from "./components/Cell";
610
import { Widget } from "./components/Widget";
711
import { WidgetHeaderContext } from "./components/WidgetHeaderContext";
8-
import { useSelectActionHelper } from "./helpers/SelectActionHelper";
9-
import { useClickActionHelper } from "@mendix/widget-plugin-grid/helpers/ClickActionHelper";
12+
import { ProgressStore } from "./features/data-export/ProgressStore";
13+
import { useDataExport } from "./features/data-export/useDataExport";
1014
import { useCellEventsController } from "./features/row-interaction/CellEventsController";
1115
import { useCheckboxEventsController } from "./features/row-interaction/CheckboxEventsController";
12-
import { useFocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/useFocusTargetController";
13-
import { useOnResetFiltersEvent } from "@mendix/widget-plugin-external-events/hooks";
16+
import { useSelectActionHelper } from "./helpers/SelectActionHelper";
1417
import { IColumnGroupStore } from "./helpers/state/ColumnGroupStore";
15-
import { observer } from "mobx-react-lite";
1618
import { RootGridStore } from "./helpers/state/RootGridStore";
1719
import { useRootStore } from "./helpers/state/useRootStore";
18-
import { useDataExport } from "./features/data-export/useDataExport";
19-
import { ProgressStore } from "./features/data-export/ProgressStore";
2020

2121
interface Props extends DatagridContainerProps {
2222
columnsStore: IColumnGroupStore;

packages/pluggableWidgets/datagrid-web/src/controllers/DerivedLoaderController.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import { computed, makeObservable } from "mobx";
22

33
type DerivedLoaderControllerSpec = {
4+
showSilentRefresh: boolean;
5+
refreshIndicator: boolean;
46
exp: { exporting: boolean };
57
cols: { loaded: boolean };
6-
query: { isFetchingNextBatch: boolean; isFirstLoad: boolean; isRefreshing: boolean; showRefreshIndicator: boolean };
8+
query: {
9+
isFetchingNextBatch: boolean;
10+
isFirstLoad: boolean;
11+
isRefreshing: boolean;
12+
isSilentRefresh: boolean;
13+
};
714
};
815

916
export class DerivedLoaderController {
@@ -33,10 +40,20 @@ export class DerivedLoaderController {
3340
}
3441

3542
get isRefreshing(): boolean {
36-
return this.spec.query.isRefreshing;
43+
const { isSilentRefresh, isRefreshing } = this.spec.query;
44+
45+
if (this.spec.showSilentRefresh) {
46+
return isSilentRefresh || isRefreshing;
47+
}
48+
49+
return !isSilentRefresh && isRefreshing;
3750
}
3851

3952
get showRefreshIndicator(): boolean {
40-
return this.spec.query.showRefreshIndicator;
53+
if (!this.spec.refreshIndicator) {
54+
return false;
55+
}
56+
57+
return this.isRefreshing;
4158
}
4259
}

packages/pluggableWidgets/datagrid-web/src/helpers/state/RootGridStore.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ export class RootGridStore extends BaseControllerHost {
7474
this.loaderCtrl = new DerivedLoaderController({
7575
exp: exportCtrl,
7676
cols: columns,
77+
showSilentRefresh: props.refreshInterval > 1,
78+
refreshIndicator: props.refreshIndicator,
7779
query
7880
});
7981
}

packages/shared/widget-plugin-grid/src/__tests__/DatasourceController.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ describe("DatasourceController loading states", () => {
3232

3333
it("refresh has no effect if ds is loading", () => {
3434
expect(provider.gate.props.datasource.status).toBe("loading");
35-
controller.refresh();
35+
controller.backgroundRefresh();
3636
expect(controller.isRefreshing).toBe(false);
3737
});
3838

3939
it("isRefreshing is true after refresh call", () => {
4040
provider.setProps({ datasource: list(0), refreshIndicator: false, refreshInterval: 0 });
4141
expect(provider.gate.props.datasource.status).toBe("available");
42-
controller.refresh();
42+
controller.backgroundRefresh();
4343
expect(controller.isRefreshing).toBe(true);
4444
provider.setProps({ datasource: list.loading(), refreshIndicator: false, refreshInterval: 0 });
4545
expect(provider.gate.props.datasource.status).toBe("loading");
@@ -67,7 +67,7 @@ describe("DatasourceController loading states", () => {
6767
});
6868

6969
it("triggers refresh when called", () => {
70-
controller.refresh();
70+
controller.backgroundRefresh();
7171
expect(datasource.reload).toHaveBeenCalled();
7272
});
7373

packages/shared/widget-plugin-grid/src/__tests__/RefreshController.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import { RefreshController } from "../query/RefreshController";
33

44
describe("RefreshController", () => {
55
let host: ReactiveControllerHost;
6-
let queryHelper: { refresh: jest.Mock };
7-
let atom: { get: () => { refresh: jest.Mock } };
6+
let queryHelper: { backgroundRefresh: jest.Mock };
7+
let atom: { get: () => { backgroundRefresh: jest.Mock } };
88
let addControllerMock: jest.Mock;
99

1010
beforeEach(() => {
@@ -13,7 +13,7 @@ describe("RefreshController", () => {
1313
addController: addControllerMock
1414
} as unknown as ReactiveControllerHost;
1515
queryHelper = {
16-
refresh: jest.fn()
16+
backgroundRefresh: jest.fn()
1717
};
1818
atom = { get: () => queryHelper };
1919
jest.useFakeTimers();
@@ -40,7 +40,7 @@ describe("RefreshController", () => {
4040
expect(dispose).toBeInstanceOf(Function);
4141

4242
jest.advanceTimersByTime(1000);
43-
expect(queryHelper.refresh).toHaveBeenCalledTimes(1);
43+
expect(queryHelper.backgroundRefresh).toHaveBeenCalledTimes(1);
4444
});
4545

4646
it("should clear the timer when dispose is called", () => {
@@ -50,6 +50,6 @@ describe("RefreshController", () => {
5050

5151
dispose!();
5252
jest.advanceTimersByTime(1000);
53-
expect(queryHelper.refresh).not.toHaveBeenCalled();
53+
expect(queryHelper.backgroundRefresh).not.toHaveBeenCalled();
5454
});
5555
});

packages/shared/widget-plugin-grid/src/query/DatasourceController.ts

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1+
import { disposeBatch } from "@mendix/widget-plugin-mobx-kit/disposeBatch";
12
import { DerivedPropsGate } from "@mendix/widget-plugin-mobx-kit/props-gate";
23
import { ReactiveController, ReactiveControllerHost } from "@mendix/widget-plugin-mobx-kit/reactive-controller";
34
import { ListValue, ValueStatus } from "mendix";
4-
import { action, autorun, computed, IComputedValue, makeAutoObservable, when } from "mobx";
5+
import { action, autorun, computed, IComputedValue, makeAutoObservable } from "mobx";
56
import { QueryController } from "./query-controller";
6-
import { disposeBatch } from "@mendix/widget-plugin-mobx-kit/disposeBatch";
77

8-
type Gate = DerivedPropsGate<{ datasource: ListValue; refreshIndicator: boolean; refreshInterval: number }>;
8+
type Gate = DerivedPropsGate<{ datasource: ListValue }>;
99

1010
type DatasourceControllerSpec = { gate: Gate };
1111

1212
export class DatasourceController implements ReactiveController, QueryController {
1313
private gate: Gate;
14-
private refreshing = false;
14+
private backgroundCheck = false;
1515
private fetching = false;
1616
private pageSize = Infinity;
17-
private isLoaded = false;
1817

1918
constructor(host: ReactiveControllerHost, spec: DatasourceControllerSpec) {
2019
host.addController(this);
@@ -39,31 +38,27 @@ export class DatasourceController implements ReactiveController, QueryController
3938
}
4039

4140
private resetFlags(): void {
42-
this.refreshing = false;
41+
this.backgroundCheck = false;
4342
this.fetching = false;
4443
}
4544

4645
private updateFlags(status: ValueStatus): void {
47-
if (this.refreshing) {
48-
this.setRefreshing(status === "loading");
46+
if (this.backgroundCheck) {
47+
this.setBackgroundCheck(status === "loading");
4948
}
5049
if (this.fetching) {
5150
this.setFetching(status === "loading");
5251
}
5352
}
5453

55-
private setRefreshing(value: boolean): void {
56-
this.refreshing = value;
54+
private setBackgroundCheck(value: boolean): void {
55+
this.backgroundCheck = value;
5756
}
5857

5958
private setFetching(value: boolean): void {
6059
this.fetching = value;
6160
}
6261

63-
private setIsLoaded(value: boolean): void {
64-
this.isLoaded = value;
65-
}
66-
6762
private resetLimit(): void {
6863
this.datasource.setLimit(this.pageSize);
6964
}
@@ -77,11 +72,15 @@ export class DatasourceController implements ReactiveController, QueryController
7772
}
7873

7974
get isFirstLoad(): boolean {
80-
return !this.isLoaded;
75+
return this.isDSLoading && this.datasource.items === undefined;
8176
}
8277

8378
get isRefreshing(): boolean {
84-
return this.refreshing;
79+
return this.isDSLoading && this.datasource.items !== undefined;
80+
}
81+
82+
get isSilentRefresh(): boolean {
83+
return this.backgroundCheck;
8584
}
8685

8786
get isFetchingNextBatch(): boolean {
@@ -114,20 +113,9 @@ export class DatasourceController implements ReactiveController, QueryController
114113
return computed(data);
115114
}
116115

117-
get showRefreshIndicator(): boolean {
118-
const { refreshIndicator, refreshInterval } = this.gate.props;
119-
return refreshIndicator && refreshInterval > 1 && this.isDSLoading && !this.isFirstLoad;
120-
}
121-
122116
setup(): () => void {
123117
const [add, disposeAll] = disposeBatch();
124118

125-
add(
126-
when(
127-
() => !this.isDSLoading,
128-
() => this.setIsLoaded(true)
129-
)
130-
);
131119
add(
132120
autorun(() => {
133121
// Always use actions to set flags to avoid subscribing to them
@@ -138,11 +126,11 @@ export class DatasourceController implements ReactiveController, QueryController
138126
return disposeAll;
139127
}
140128

141-
refresh(): void {
129+
backgroundRefresh(): void {
142130
if (this.isDSLoading) {
143131
return;
144132
}
145-
this.setRefreshing(true);
133+
this.setBackgroundCheck(true);
146134
this.datasource.reload();
147135
}
148136

packages/shared/widget-plugin-grid/src/query/RefreshController.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { autoEffect } from "@mendix/widget-plugin-mobx-kit/autoEffect";
22
import { ReactiveController, ReactiveControllerHost } from "@mendix/widget-plugin-mobx-kit/main";
33

44
interface QueryHelper {
5-
refresh(): void;
5+
backgroundRefresh(): void;
66
}
77

88
interface ObservableAtom {
@@ -34,7 +34,7 @@ export class RefreshController implements ReactiveController {
3434

3535
private scheduleRefresh(helper: QueryHelper, delay: number): () => void {
3636
const timerId = setTimeout(() => {
37-
helper.refresh();
37+
helper.backgroundRefresh();
3838
}, delay);
3939
return () => {
4040
clearTimeout(timerId);

packages/shared/widget-plugin-grid/src/query/query-controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ type Members =
1212
| "hasMoreItems";
1313

1414
export interface QueryController extends Pick<ListValue, Members> {
15-
refresh(): void;
15+
backgroundRefresh(): void;
1616
setPageSize(size: number): void;
1717
hasMoreItems: boolean;
1818
isFirstLoad: boolean;

0 commit comments

Comments
 (0)