Skip to content

Commit 3dfaca3

Browse files
committed
refactor: change to selection counter view model
1 parent c88352b commit 3dfaca3

File tree

13 files changed

+131
-136
lines changed

13 files changed

+131
-136
lines changed

packages/pluggableWidgets/datagrid-web/src/Datagrid.depsContainer.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import { FilterAPI, WidgetFilterAPI } from "@mendix/widget-plugin-filtering/context";
22
import { CombinedFilter, CombinedFilterConfig } from "@mendix/widget-plugin-filtering/stores/generic/CombinedFilter";
33
import { CustomFilterHost } from "@mendix/widget-plugin-filtering/stores/generic/CustomFilterHost";
4-
import { DatasourceService, QueryService, RefreshController } from "@mendix/widget-plugin-grid/main";
5-
6-
import { SelectionCountStore } from "@mendix/widget-plugin-grid/selection/stores/SelectionCountStore";
4+
import {
5+
DatasourceService,
6+
QueryService,
7+
RefreshController,
8+
SelectionCounterViewModel
9+
} from "@mendix/widget-plugin-grid/main";
710
import { ClosableGateProvider } from "@mendix/widget-plugin-mobx-kit/ClosableGateProvider";
811
import { GateProvider } from "@mendix/widget-plugin-mobx-kit/GateProvider";
912
import { DerivedPropsGate, SetupComponentHost } from "@mendix/widget-plugin-mobx-kit/main";
@@ -13,7 +16,7 @@ import { useSetup } from "@mendix/widget-plugin-mobx-kit/react/useSetup";
1316
import { generateUUID } from "@mendix/widget-plugin-platform/framework/generate-uuid";
1417
import { Container, injected, token } from "brandi";
1518
import { useEffect } from "react";
16-
import { DatagridContainerProps } from "../typings/DatagridProps";
19+
import { DatagridContainerProps, SelectionCounterPositionEnum } from "../typings/DatagridProps";
1720
import { DatasourceParamsController } from "./controllers/DatasourceParamsController";
1821
import { DerivedLoaderController, DerivedLoaderControllerConfig } from "./controllers/DerivedLoaderController";
1922
import { PaginationConfig, PaginationController } from "./controllers/PaginationController";
@@ -66,7 +69,8 @@ export const TOKENS = {
6669
query: token<QueryService>("QueryService"),
6770
refreshInterval: token<number>("refreshInterval"),
6871
refreshService: token<RefreshController>("DatagridRefreshService"),
69-
selectionCounter: token<SelectionCountStore>("SelectionCountStore"),
72+
selectionCounter: token<SelectionCounterViewModel>("SelectionCounterViewModel"),
73+
selectionCounterPosition: token<SelectionCounterPositionEnum>("SelectionCounterPositionEnum"),
7074
setupService: token<SetupComponentHost>("DatagridSetupHost"),
7175
staticInfo: token<StaticInfo>("StaticInfo")
7276
};
@@ -148,8 +152,8 @@ class DatagridContainer extends Container {
148152
);
149153

150154
// Selection counter view model
151-
this.bind(TOKENS.selectionCounter).toInstance(SelectionCountStore).inSingletonScope();
152-
injected(SelectionCountStore, TOKENS.mainGate);
155+
this.bind(TOKENS.selectionCounter).toInstance(SelectionCounterViewModel).inSingletonScope();
156+
injected(SelectionCounterViewModel, TOKENS.mainGate, TOKENS.selectionCounterPosition);
153157
}
154158
}
155159

@@ -192,6 +196,9 @@ export function useDatagridDepsContainer(props: DatagridContainerProps): Contain
192196
pageSize: props.pageSize
193197
});
194198

199+
// Bind selection counter position
200+
container.bind(TOKENS.selectionCounterPosition).toConstant(props.selectionCounterPosition);
201+
195202
// Make sure essential services are created upfront
196203
container.get(TOKENS.refreshService);
197204
container.get(TOKENS.paramsService);

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ const DatagridRoot = observer((props: DatagridContainerProps): ReactElement => {
113113
pageSize={props.pageSize}
114114
paginationType={props.pagination}
115115
loadMoreButtonCaption={props.loadMoreButtonCaption?.value}
116-
selectionCountPosition={props.selectionCountPosition}
117116
paging={paginationService.showPagination}
118117
pagingPosition={props.pagingPosition}
119118
showPagingButtons={props.showPagingButtons}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
<caption>Keep selection</caption>
5454
<description>If enabled, selected items will stay selected unless cleared by the user or a Nanoflow.</description>
5555
</property>
56-
<property key="selectionCountPosition" type="enumeration" defaultValue="bottom" required="true">
56+
<property key="selectionCounterPosition" type="enumeration" defaultValue="bottom" required="true">
5757
<caption>Show selection count</caption>
5858
<description />
5959
<enumerationValues>
Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,20 @@
1-
import { If } from "@mendix/widget-plugin-component-kit/If";
21
import { observer } from "mobx-react-lite";
3-
import { useSelectionCounter } from "../deps-hooks";
2+
import { Fragment } from "react";
3+
import { useSelectionCounterViewModel } from "../deps-hooks";
44
import { useLegacyContext } from "../helpers/root-context";
55

6-
type SelectionCounterLocation = "top" | "bottom" | undefined;
7-
8-
export const SelectionCounter = observer(function SelectionCounter({
9-
location
10-
}: {
11-
location?: SelectionCounterLocation;
12-
}) {
13-
const selectionCountStore = useSelectionCounter();
6+
export const SelectionCounter = observer(function SelectionCounter() {
7+
const selectionCountStore = useSelectionCounterViewModel();
148
const { selectActionHelper } = useLegacyContext();
159

16-
const containerClass = location === "top" ? "widget-datagrid-tb-start" : "widget-datagrid-pb-start";
17-
1810
return (
19-
<If condition={selectionCountStore.displayCount !== ""}>
20-
<div className={containerClass}>
21-
<span className="widget-datagrid-selection-count" aria-live="polite" aria-atomic="true">
22-
{selectionCountStore.displayCount}
23-
</span>
24-
&nbsp;|&nbsp;
25-
<button className="widget-datagrid-clear-selection" onClick={selectActionHelper.onClearSelection}>
26-
{selectionCountStore.clearButtonLabel}
27-
</button>
28-
</div>
29-
</If>
11+
<Fragment>
12+
<span className="widget-datagrid-selection-count" aria-live="polite" aria-atomic="true">
13+
{selectionCountStore.selectedCountText}
14+
</span>
15+
<button className="widget-datagrid-clear-selection" onClick={selectActionHelper.onClearSelection}>
16+
{selectionCountStore.clearButtonLabel}
17+
</button>
18+
</Fragment>
3019
);
3120
});

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

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@ import {
99
LoadingTypeEnum,
1010
PaginationEnum,
1111
PagingPositionEnum,
12-
SelectionCountPositionEnum,
1312
ShowPagingButtonsEnum
1413
} from "../../typings/DatagridProps";
15-
import { useBasicData, useSelectionCounter } from "../deps-hooks";
14+
import { useBasicData } from "../deps-hooks";
1615
import { SelectActionHelper } from "../helpers/SelectActionHelper";
1716
import { CellComponent, EventsController } from "../typings/CellComponent";
1817
import { ColumnId, GridColumn } from "../typings/GridColumn";
@@ -21,7 +20,6 @@ import { Grid } from "./Grid";
2120
import { GridBody } from "./GridBody";
2221
import { GridHeader } from "./GridHeader";
2322
import { RowsRenderer } from "./RowsRenderer";
24-
import { SelectionCounter } from "./SelectionCounter";
2523
import { WidgetContent } from "./WidgetContent";
2624
import { WidgetFooter } from "./WidgetFooter";
2725
import { WidgetHeader } from "./WidgetHeader";
@@ -50,7 +48,7 @@ export interface WidgetProps<C extends GridColumn, T extends ObjectItem = Object
5048
page: number;
5149
paginationType: PaginationEnum;
5250
loadMoreButtonCaption?: string;
53-
selectionCountPosition?: SelectionCountPositionEnum;
51+
5452
pageSize: number;
5553
paging: boolean;
5654
pagingPosition: PagingPositionEnum;
@@ -121,7 +119,6 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
121119
headerContent,
122120
headerTitle,
123121
loadMoreButtonCaption,
124-
selectionCountPosition,
125122
numberOfItems,
126123
page,
127124
pageSize,
@@ -135,9 +132,7 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
135132
visibleColumns
136133
} = props;
137134

138-
// const { basicData, selectionCountStore } = useLegacyContext();
139135
const basicData = useBasicData();
140-
const selectionCountVm = useSelectionCounter();
141136

142137
const showHeader = !!headerContent;
143138
const showTopBarPagination = paging && (pagingPosition === "top" || pagingPosition === "both");
@@ -158,17 +153,6 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
158153
/>
159154
) : null;
160155

161-
const selectionCount =
162-
selectionCountVm.selectedCount > 0 &&
163-
selectActionHelper.selectionType === "Multi" &&
164-
selectionCountPosition !== "off" &&
165-
selectionCountPosition ? (
166-
<SelectionCounter location={selectionCountPosition} />
167-
) : null;
168-
169-
const showTopbarSelectionCount = selectionCount && selectionCountPosition === "top";
170-
const showFooterSelectionCount = selectionCount && selectionCountPosition === "bottom";
171-
172156
const cssGridStyles = gridStyle(visibleColumns, {
173157
selectItemColumn: selectActionHelper.showCheckboxColumn,
174158
visibilitySelectorColumn: columnsHidable
@@ -178,10 +162,7 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
178162

179163
return (
180164
<Fragment>
181-
<WidgetTopBar
182-
pagination={showTopBarPagination ? pagination : undefined}
183-
selectionCount={showTopbarSelectionCount ? selectionCount : undefined}
184-
></WidgetTopBar>
165+
<WidgetTopBar pagination={showTopBarPagination ? pagination : undefined} />
185166
{showHeader && <WidgetHeader headerTitle={headerTitle}>{headerContent}</WidgetHeader>}
186167
<WidgetContent>
187168
<Grid
@@ -253,7 +234,6 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
253234
</WidgetContent>
254235
<WidgetFooter
255236
pagination={showFooterPagination ? pagination : undefined}
256-
selectionCount={showFooterSelectionCount ? selectionCount : undefined}
257237
paginationType={paginationType}
258238
loadMoreButtonCaption={loadMoreButtonCaption}
259239
hasMoreItems={hasMoreItems}

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,30 @@
1+
import { If } from "@mendix/widget-plugin-component-kit/If";
2+
import { observer } from "mobx-react-lite";
13
import { ComponentPropsWithoutRef, ReactElement, ReactNode } from "react";
24
import { PaginationEnum } from "../../typings/DatagridProps";
5+
import { useSelectionCounterViewModel } from "../deps-hooks";
6+
import { SelectionCounter } from "./SelectionCounter";
37

48
type WidgetFooterProps = {
59
pagination: ReactNode;
6-
selectionCount: ReactNode;
710
paginationType: PaginationEnum;
811
loadMoreButtonCaption?: string;
912
hasMoreItems: boolean;
1013
setPage?: (computePage: (prevPage: number) => number) => void;
1114
} & ComponentPropsWithoutRef<"div">;
1215

13-
export function WidgetFooter(props: WidgetFooterProps): ReactElement | null {
14-
const { pagination, selectionCount, paginationType, loadMoreButtonCaption, hasMoreItems, setPage, ...rest } = props;
16+
export const WidgetFooter = observer(function WidgetFooter(props: WidgetFooterProps): ReactElement | null {
17+
const { pagination, paginationType, loadMoreButtonCaption, hasMoreItems, setPage, ...rest } = props;
18+
const selectionCounterVM = useSelectionCounterViewModel();
1519

1620
return (
1721
<div {...rest} className="widget-datagrid-footer table-footer">
1822
<div className="widget-datagrid-paging-bottom">
19-
{selectionCount}
23+
<If condition={selectionCounterVM.isBottomCounterVisible}>
24+
<div className="widget-datagrid-pb-start">
25+
<SelectionCounter />
26+
</div>
27+
</If>
2028
<div className="widget-datagrid-pb-end">
2129
{pagination}
2230
{hasMoreItems && paginationType === "loadMore" && (
@@ -32,4 +40,4 @@ export function WidgetFooter(props: WidgetFooterProps): ReactElement | null {
3240
</div>
3341
</div>
3442
);
35-
}
43+
});
Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
1+
import { If } from "@mendix/widget-plugin-component-kit/If";
2+
import { observer } from "mobx-react-lite";
13
import { ComponentPropsWithoutRef, ReactElement, ReactNode } from "react";
4+
import { useSelectionCounterViewModel } from "../deps-hooks";
5+
import { SelectionCounter } from "./SelectionCounter";
26

37
type WidgetTopBarProps = {
48
pagination: ReactNode;
5-
selectionCount: ReactNode;
69
} & ComponentPropsWithoutRef<"div">;
710

8-
export function WidgetTopBar(props: WidgetTopBarProps): ReactElement {
9-
const { pagination, selectionCount, ...rest } = props;
11+
export const WidgetTopBar = observer(function WidgetTopBar(props: WidgetTopBarProps): ReactElement {
12+
const { pagination, ...rest } = props;
13+
const selectionCounter = useSelectionCounterViewModel();
1014

1115
return (
1216
<div {...rest} className="widget-datagrid-top-bar table-header">
1317
<div className="widget-datagrid-padding-top">
14-
{selectionCount}
15-
{pagination && <div className="widget-datagrid-tb-end">{pagination}</div>}
18+
<If condition={selectionCounter.isTopCounterVisible}>
19+
<div className="widget-datagrid-tb-start">
20+
<SelectionCounter />
21+
</div>
22+
</If>
23+
<If condition={!!pagination}>
24+
<div className="widget-datagrid-tb-end">{pagination}</div>
25+
</If>
1626
</div>
1727
</div>
1828
);
19-
}
29+
});

packages/pluggableWidgets/datagrid-web/src/deps-hooks.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { TOKENS } from "./Datagrid.depsContainer";
44
const [
55
useBasicData,
66
usePaginationService,
7-
useSelectionCounter,
7+
useSelectionCounterViewModel,
88
useLoaderViewModel,
99
useColumnsStore,
1010
useExportProgressService,
@@ -31,6 +31,6 @@ export {
3131
useLoaderViewModel,
3232
useMainGate,
3333
usePaginationService,
34-
useSelectionCounter,
34+
useSelectionCounterViewModel,
3535
useStaticInfo
3636
};

packages/pluggableWidgets/datagrid-web/typings/DatagridProps.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export type ItemSelectionMethodEnum = "checkbox" | "rowClick";
1111

1212
export type ItemSelectionModeEnum = "toggle" | "clear";
1313

14-
export type SelectionCountPositionEnum = "top" | "bottom" | "off";
14+
export type SelectionCounterPositionEnum = "top" | "bottom" | "off";
1515

1616
export type LoadingTypeEnum = "spinner" | "skeleton";
1717

@@ -98,7 +98,7 @@ export interface DatagridContainerProps {
9898
itemSelectionMode: ItemSelectionModeEnum;
9999
showSelectAllToggle: boolean;
100100
keepSelection: boolean;
101-
selectionCountPosition: SelectionCountPositionEnum;
101+
selectionCounterPosition: SelectionCounterPositionEnum;
102102
clearSelectionButtonLabel?: DynamicValue<string>;
103103
loadingType: LoadingTypeEnum;
104104
refreshIndicator: boolean;
@@ -152,7 +152,7 @@ export interface DatagridPreviewProps {
152152
itemSelectionMode: ItemSelectionModeEnum;
153153
showSelectAllToggle: boolean;
154154
keepSelection: boolean;
155-
selectionCountPosition: SelectionCountPositionEnum;
155+
selectionCounterPosition: SelectionCounterPositionEnum;
156156
clearSelectionButtonLabel: string;
157157
loadingType: LoadingTypeEnum;
158158
refreshIndicator: boolean;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export type { QueryService } from "./interfaces/QueryService";
22
export { DatasourceService } from "./services/DatasourceService";
33
export { RefreshController } from "./services/RefreshController";
4+
export { SelectionCounterViewModel } from "./view-models/SelectionCounterViewModel";

0 commit comments

Comments
 (0)