Skip to content

Commit 871c045

Browse files
committed
feat: add selection count visibility to config
1 parent 7cde6c8 commit 871c045

File tree

7 files changed

+79
-34
lines changed

7 files changed

+79
-34
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ const Container = observer((props: Props): ReactElement => {
118118
paginationType={props.pagination}
119119
loadMoreButtonCaption={props.loadMoreButtonCaption?.value}
120120
clearSelectionButtonLabel={props.clearSelectionButtonLabel?.value}
121+
selectionCountVisibility={props.selectionCountVisibility}
121122
paging={paginationCtrl.showPagination}
122123
pagingPosition={props.pagingPosition}
123124
showPagingButtons={props.showPagingButtons}

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,6 @@
6565
<caption>Show refresh indicator</caption>
6666
<description>Show a refresh indicator when the data is being loaded.</description>
6767
</property>
68-
<property key="clearSelectionButtonLabel" type="textTemplate" required="false">
69-
<caption>Clear selection</caption>
70-
<description>Customize the label of the 'Clear section' button</description>
71-
<translations>
72-
<translation lang="en_US">Clear selection</translation>
73-
</translations>
74-
</property>
7568
</propertyGroup>
7669
<propertyGroup caption="Columns">
7770
<property key="columns" type="object" isList="true">
@@ -251,6 +244,22 @@
251244
<enumerationValue key="both">Both</enumerationValue>
252245
</enumerationValues>
253246
</property>
247+
<property key="selectionCountVisibility" type="enumeration" defaultValue="bottom" required="true">
248+
<caption>Show selection count</caption>
249+
<description />
250+
<enumerationValues>
251+
<enumerationValue key="top">Top</enumerationValue>
252+
<enumerationValue key="bottom">Bottom</enumerationValue>
253+
<enumerationValue key="off">Off</enumerationValue>
254+
</enumerationValues>
255+
</property>
256+
<property key="clearSelectionButtonLabel" type="textTemplate" required="false">
257+
<caption>Clear selection label</caption>
258+
<description>Customize the label of the 'Clear section' button</description>
259+
<translations>
260+
<translation lang="en_US">Clear selection</translation>
261+
</translations>
262+
</property>
254263
<property key="loadMoreButtonCaption" type="textTemplate" required="false">
255264
<caption>Load more caption</caption>
256265
<description />
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { If } from "@mendix/widget-plugin-component-kit/If";
2+
import { observer } from "mobx-react-lite";
3+
import { createElement } from "react";
4+
import { useDatagridRootScope } from "../helpers/root-context";
5+
6+
export const SelectionCounter = observer(function SelectionCounter({
7+
clearSelectionButtonLabel
8+
}: {
9+
clearSelectionButtonLabel?: string;
10+
}) {
11+
const { selectionCountStore, selectActionHelper } = useDatagridRootScope();
12+
13+
return (
14+
<If condition={selectionCountStore.displayCount !== ""}>
15+
<span className="widget-datagrid-selection-count">{selectionCountStore.displayCount}</span>&nbsp;|&nbsp;
16+
<button className="widget-datagrid-clear-selection" onClick={selectActionHelper.onClearSelection}>
17+
{clearSelectionButtonLabel || "Clear selection"}
18+
</button>
19+
</If>
20+
);
21+
});

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
LoadingTypeEnum,
1010
PaginationEnum,
1111
PagingPositionEnum,
12-
ShowPagingButtonsEnum
12+
ShowPagingButtonsEnum,
13+
SelectionCountVisibilityEnum
1314
} from "../../typings/DatagridProps";
1415
import { SelectActionHelper } from "../helpers/SelectActionHelper";
1516
import { useDatagridRootScope } from "../helpers/root-context";
@@ -49,6 +50,7 @@ export interface WidgetProps<C extends GridColumn, T extends ObjectItem = Object
4950
paginationType: PaginationEnum;
5051
loadMoreButtonCaption?: string;
5152
clearSelectionButtonLabel?: string;
53+
selectionCountVisibility?: SelectionCountVisibilityEnum;
5254
pageSize: number;
5355
paging: boolean;
5456
pagingPosition: PagingPositionEnum;
@@ -120,6 +122,7 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
120122
headerTitle,
121123
loadMoreButtonCaption,
122124
clearSelectionButtonLabel,
125+
selectionCountVisibility,
123126
numberOfItems,
124127
page,
125128
pageSize,
@@ -162,7 +165,14 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
162165

163166
return (
164167
<Fragment>
165-
{showTopBar && <WidgetTopBar>{pagination}</WidgetTopBar>}
168+
{showTopBar && (
169+
<WidgetTopBar
170+
selectionCountVisibility={selectionCountVisibility}
171+
clearSelectionButtonLabel={clearSelectionButtonLabel}
172+
>
173+
{pagination}
174+
</WidgetTopBar>
175+
)}
166176
{showHeader && <WidgetHeader headerTitle={headerTitle}>{headerContent}</WidgetHeader>}
167177
<WidgetContent>
168178
<Grid
@@ -238,6 +248,7 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
238248
paginationType={paginationType}
239249
loadMoreButtonCaption={loadMoreButtonCaption}
240250
clearSelectionButtonLabel={clearSelectionButtonLabel}
251+
selectionCountVisibility={selectionCountVisibility}
241252
hasMoreItems={hasMoreItems}
242253
setPage={setPage}
243254
/>
Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
import { If } from "@mendix/widget-plugin-component-kit/If";
2-
import { observer } from "mobx-react-lite";
31
import { createElement, ReactElement, ReactNode } from "react";
4-
import { PaginationEnum, PagingPositionEnum } from "../../typings/DatagridProps";
5-
import { useDatagridRootScope } from "../helpers/root-context";
2+
import { PaginationEnum, PagingPositionEnum, SelectionCountVisibilityEnum } from "../../typings/DatagridProps";
3+
import { SelectionCounter } from "./SelectionCounter";
64

75
type WidgetFooterProps = {
86
pagingPosition: PagingPositionEnum;
97
pagination: ReactNode;
108
paginationType: PaginationEnum;
119
loadMoreButtonCaption?: string;
1210
clearSelectionButtonLabel?: string;
11+
selectionCountVisibility?: SelectionCountVisibilityEnum;
1312
hasMoreItems: boolean;
1413
setPage?: (computePage: (prevPage: number) => number) => void;
1514
} & JSX.IntrinsicElements["div"];
@@ -21,6 +20,7 @@ export function WidgetFooter(props: WidgetFooterProps): ReactElement | null {
2120
paginationType,
2221
loadMoreButtonCaption,
2322
clearSelectionButtonLabel,
23+
selectionCountVisibility,
2424
hasMoreItems,
2525
setPage,
2626
...rest
@@ -30,7 +30,9 @@ export function WidgetFooter(props: WidgetFooterProps): ReactElement | null {
3030
<div {...rest} className="widget-datagrid-footer table-footer">
3131
<div className="widget-datagrid-paging-bottom">
3232
<div className="widget-datagrid-pb-start">
33-
<SelectionCounter clearSelectionButtonLabel={clearSelectionButtonLabel} />
33+
{selectionCountVisibility === "bottom" && (
34+
<SelectionCounter clearSelectionButtonLabel={clearSelectionButtonLabel} />
35+
)}
3436
</div>
3537
{hasMoreItems && paginationType === "loadMore" && (
3638
<div className="widget-datagrid-pb-middle">
@@ -50,20 +52,3 @@ export function WidgetFooter(props: WidgetFooterProps): ReactElement | null {
5052
</div>
5153
);
5254
}
53-
54-
const SelectionCounter = observer(function SelectionCounter({
55-
clearSelectionButtonLabel
56-
}: {
57-
clearSelectionButtonLabel?: string;
58-
}) {
59-
const { selectionCountStore, selectActionHelper } = useDatagridRootScope();
60-
61-
return (
62-
<If condition={selectionCountStore.displayCount !== ""}>
63-
<span className="widget-datagrid-selection-count">{selectionCountStore.displayCount}</span>&nbsp;|&nbsp;
64-
<button className="widget-datagrid-clear-selection" onClick={selectActionHelper.onClearSelection}>
65-
{clearSelectionButtonLabel || "Clear selection"}
66-
</button>
67-
</If>
68-
);
69-
});

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,22 @@
11
import { createElement, ReactElement } from "react";
2+
import { SelectionCountVisibilityEnum } from "../../typings/DatagridProps";
3+
import { SelectionCounter } from "./SelectionCounter";
4+
5+
type WidgetTopBarProps = {
6+
selectionCountVisibility?: SelectionCountVisibilityEnum;
7+
clearSelectionButtonLabel?: string;
8+
} & JSX.IntrinsicElements["div"];
9+
10+
export function WidgetTopBar(props: WidgetTopBarProps): ReactElement {
11+
const { selectionCountVisibility, clearSelectionButtonLabel } = props;
12+
13+
console.warn(selectionCountVisibility);
214

3-
export function WidgetTopBar(props: JSX.IntrinsicElements["div"]): ReactElement {
415
return (
516
<div {...props} className="widget-datagrid-top-bar table-header">
17+
{selectionCountVisibility === "top" && (
18+
<SelectionCounter clearSelectionButtonLabel={clearSelectionButtonLabel} />
19+
)}
620
{props.children}
721
</div>
822
);

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ export type ShowPagingButtonsEnum = "always" | "auto";
5353

5454
export type PagingPositionEnum = "bottom" | "top" | "both";
5555

56+
export type SelectionCountVisibilityEnum = "top" | "bottom" | "off";
57+
5658
export type ShowEmptyPlaceholderEnum = "none" | "custom";
5759

5860
export type OnClickTriggerEnum = "single" | "double";
@@ -98,14 +100,15 @@ export interface DatagridContainerProps {
98100
keepSelection: boolean;
99101
loadingType: LoadingTypeEnum;
100102
refreshIndicator: boolean;
101-
clearSelectionButtonLabel?: DynamicValue<string>;
102103
columns: ColumnsType[];
103104
columnsFilterable: boolean;
104105
pageSize: number;
105106
pagination: PaginationEnum;
106107
showPagingButtons: ShowPagingButtonsEnum;
107108
showNumberOfRows: boolean;
108109
pagingPosition: PagingPositionEnum;
110+
selectionCountVisibility: SelectionCountVisibilityEnum;
111+
clearSelectionButtonLabel?: DynamicValue<string>;
109112
loadMoreButtonCaption?: DynamicValue<string>;
110113
showEmptyPlaceholder: ShowEmptyPlaceholderEnum;
111114
emptyPlaceholder?: ReactNode;
@@ -151,14 +154,15 @@ export interface DatagridPreviewProps {
151154
keepSelection: boolean;
152155
loadingType: LoadingTypeEnum;
153156
refreshIndicator: boolean;
154-
clearSelectionButtonLabel: string;
155157
columns: ColumnsPreviewType[];
156158
columnsFilterable: boolean;
157159
pageSize: number | null;
158160
pagination: PaginationEnum;
159161
showPagingButtons: ShowPagingButtonsEnum;
160162
showNumberOfRows: boolean;
161163
pagingPosition: PagingPositionEnum;
164+
selectionCountVisibility: SelectionCountVisibilityEnum;
165+
clearSelectionButtonLabel: string;
162166
loadMoreButtonCaption: string;
163167
showEmptyPlaceholder: ShowEmptyPlaceholderEnum;
164168
emptyPlaceholder: { widgetCount: number; renderer: ComponentType<{ children: ReactNode; caption?: string }> };

0 commit comments

Comments
 (0)