Skip to content

Commit a3d0c05

Browse files
feat(widget-plugin-grid): move showRefreshIndicator to DatasourceController
1 parent b9cfe0c commit a3d0c05

File tree

7 files changed

+22
-20
lines changed

7 files changed

+22
-20
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,7 @@ export function preview(props: DatagridPreviewProps): ReactElement {
146146
isFetchingNextBatch={false}
147147
loadingType="spinner"
148148
columnsLoading={false}
149-
refreshIndicator={props.refreshIndicator}
150-
refreshInterval={props.refreshInterval ?? 0}
149+
showRefreshIndicator={false}
151150
/>
152151
);
153152
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,7 @@ const Container = observer((props: Props): ReactElement => {
123123
isLoading={props.datasource.status === "loading"}
124124
loadingType={props.loadingType}
125125
columnsLoading={!columnsStore.loaded}
126-
refreshIndicator={props.refreshIndicator}
127-
refreshInterval={props.refreshInterval}
126+
showRefreshIndicator={rootStore.loaderCtrl.showRefreshIndicator}
128127
/>
129128
);
130129
});

packages/pluggableWidgets/datagrid-web/src/components/Widget.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,7 @@ export interface WidgetProps<C extends GridColumn, T extends ObjectItem = Object
7171
isFetchingNextBatch: boolean;
7272
loadingType: LoadingTypeEnum;
7373
columnsLoading: boolean;
74-
refreshIndicator: boolean;
75-
refreshInterval: number;
74+
showRefreshIndicator: boolean;
7675

7776
// Helpers
7877
cellEventsController: EventsController;
@@ -135,8 +134,7 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
135134
paging,
136135
pagingPosition,
137136
preview,
138-
refreshIndicator,
139-
refreshInterval,
137+
showRefreshIndicator,
140138
selectActionHelper,
141139
setPage,
142140
visibleColumns
@@ -167,8 +165,6 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
167165

168166
const selectionEnabled = selectActionHelper.selectionType !== "None";
169167

170-
const showRefreshIndicator = refreshIndicator && refreshInterval > 1 && props.isLoading && !props.isFirstLoad;
171-
172168
return (
173169
<Fragment>
174170
{showTopBar && <WidgetTopBar>{pagination}</WidgetTopBar>}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { computed, makeObservable } from "mobx";
33
type DerivedLoaderControllerSpec = {
44
exp: { exporting: boolean };
55
cols: { loaded: boolean };
6-
query: { isFetchingNextBatch: boolean; isFirstLoad: boolean; isRefreshing: boolean };
6+
query: { isFetchingNextBatch: boolean; isFirstLoad: boolean; isRefreshing: boolean; showRefreshIndicator: boolean };
77
};
88

99
export class DerivedLoaderController {
@@ -35,4 +35,8 @@ export class DerivedLoaderController {
3535
get isRefreshing(): boolean {
3636
return this.spec.query.isRefreshing;
3737
}
38+
39+
get showRefreshIndicator(): boolean {
40+
return this.spec.query.showRefreshIndicator;
41+
}
3842
}

packages/pluggableWidgets/datagrid-web/src/utils/test-utils.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ export function mockWidgetProps(): WidgetProps<GridColumn, ObjectItem> {
110110
isFetchingNextBatch: false,
111111
loadingType: "spinner",
112112
columnsLoading: false,
113-
refreshIndicator: false,
114-
refreshInterval: 0,
113+
showRefreshIndicator: false,
115114
focusController: new FocusTargetController(
116115
new PositionController(),
117116
new VirtualGridLayout(1, columns.length, 10)

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ class TestControllerHost extends BaseControllerHost {}
1010
describe("DatasourceController loading states", () => {
1111
let controller: DatasourceController;
1212
let datasource: ListValue;
13-
let provider: GateProvider<{ datasource: ListValue }>;
13+
let provider: GateProvider<{ datasource: ListValue; refreshIndicator: boolean; refreshInterval: number }>;
1414

1515
beforeEach(() => {
1616
const host = new TestControllerHost();
17-
provider = new GateProvider({ datasource: list.loading() });
17+
provider = new GateProvider({ datasource: list.loading(), refreshIndicator: false, refreshInterval: 0 });
1818
host.setup();
1919
controller = new DatasourceController(host, { gate: provider.gate });
2020
controller.setup();
@@ -23,7 +23,7 @@ describe("DatasourceController loading states", () => {
2323
describe("when datasource is loading", () => {
2424
beforeEach(() => {
2525
datasource = list.loading();
26-
provider.setProps({ datasource });
26+
provider.setProps({ datasource, refreshIndicator: false, refreshInterval: 0 });
2727
});
2828

2929
it("isFirstLoad returns true by default", () => {
@@ -37,11 +37,11 @@ describe("DatasourceController loading states", () => {
3737
});
3838

3939
it("isRefreshing is true after refresh call", () => {
40-
provider.setProps({ datasource: list(0) });
40+
provider.setProps({ datasource: list(0), refreshIndicator: false, refreshInterval: 0 });
4141
expect(provider.gate.props.datasource.status).toBe("available");
4242
controller.refresh();
4343
expect(controller.isRefreshing).toBe(true);
44-
provider.setProps({ datasource: list.loading() });
44+
provider.setProps({ datasource: list.loading(), refreshIndicator: false, refreshInterval: 0 });
4545
expect(provider.gate.props.datasource.status).toBe("loading");
4646
expect(controller.isRefreshing).toBe(true);
4747
expect(controller.isFirstLoad).toBe(false);
@@ -57,7 +57,7 @@ describe("DatasourceController loading states", () => {
5757
describe("when datasource is not loading", () => {
5858
beforeEach(() => {
5959
datasource = list(0);
60-
provider.setProps({ datasource });
60+
provider.setProps({ datasource, refreshIndicator: false, refreshInterval: 0 });
6161
});
6262

6363
it("All loading states return false", () => {

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { action, autorun, computed, IComputedValue, makeAutoObservable, when } f
55
import { QueryController } from "./query-controller";
66
import { disposeBatch } from "@mendix/widget-plugin-mobx-kit/disposeBatch";
77

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

1010
type DatasourceControllerSpec = { gate: Gate };
1111

@@ -114,6 +114,11 @@ export class DatasourceController implements ReactiveController, QueryController
114114
return computed(data);
115115
}
116116

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

0 commit comments

Comments
 (0)