Skip to content

Commit b387a47

Browse files
committed
refactor: rewrite grid style to atom
1 parent 5fa01c4 commit b387a47

File tree

7 files changed

+72
-53
lines changed

7 files changed

+72
-53
lines changed
Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
import classNames from "classnames";
2-
import { ComponentPropsWithoutRef, ReactElement } from "react";
3-
4-
type P = Omit<ComponentPropsWithoutRef<"div">, "role">;
5-
6-
export interface GridProps extends P {
7-
className?: string;
8-
}
9-
10-
export function Grid(props: GridProps): ReactElement {
11-
const { className, style, children, ...rest } = props;
1+
import { observer } from "mobx-react-lite";
2+
import { PropsWithChildren, ReactElement } from "react";
3+
import { useDatagridConfig, useGridStyle } from "../model/hooks/injection-hooks";
124

5+
export const Grid = observer(function Grid(props: PropsWithChildren): ReactElement {
6+
const config = useDatagridConfig();
7+
const style = useGridStyle().get();
138
return (
14-
<div className={classNames("widget-datagrid-grid table", className)} role="grid" style={style} {...rest}>
15-
{children}
9+
<div
10+
aria-multiselectable={config.multiselectable}
11+
className={"widget-datagrid-grid table"}
12+
role="grid"
13+
style={style}
14+
>
15+
{props.children}
1616
</div>
1717
);
18-
}
18+
});

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

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -111,22 +111,12 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
111111

112112
const basicData = useBasicData();
113113

114-
const cssGridStyles = gridStyle(visibleColumns, {
115-
selectItemColumn: selectActionHelper.showCheckboxColumn,
116-
visibilitySelectorColumn: columnsHidable
117-
});
118-
119-
const selectionEnabled = selectActionHelper.selectionType !== "None";
120-
121114
return (
122115
<Fragment>
123116
<WidgetTopBar />
124117
<WidgetHeader headerTitle={headerTitle} headerContent={headerContent} />
125118
<WidgetContent>
126-
<Grid
127-
aria-multiselectable={selectionEnabled ? selectActionHelper.selectionType === "Multi" : undefined}
128-
style={cssGridStyles}
129-
>
119+
<Grid>
130120
<GridHeader
131121
availableColumns={props.availableColumns}
132122
columns={visibleColumns}
@@ -174,28 +164,3 @@ const Main = observer(<C extends GridColumn>(props: WidgetProps<C>): ReactElemen
174164
</Fragment>
175165
);
176166
});
177-
178-
function gridStyle(columns: GridColumn[], optional: OptionalColumns): CSSProperties {
179-
const columnSizes = columns.map(c => c.getCssWidth());
180-
181-
const sizes: string[] = [];
182-
183-
if (optional.selectItemColumn) {
184-
sizes.push("48px");
185-
}
186-
187-
sizes.push(...columnSizes);
188-
189-
if (optional.visibilitySelectorColumn) {
190-
sizes.push("54px");
191-
}
192-
193-
return {
194-
gridTemplateColumns: sizes.join(" ")
195-
};
196-
}
197-
198-
type OptionalColumns = {
199-
selectItemColumn?: boolean;
200-
visibilitySelectorColumn?: boolean;
201-
};

packages/pluggableWidgets/datagrid-web/src/model/configs/Datagrid.config.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface DatagridConfig {
1515
enableSelectAll: boolean;
1616
keepSelection: boolean;
1717
pagingPosition: PagingPositionEnum;
18+
multiselectable: true | undefined;
1819
}
1920

2021
export function datagridConfig(props: DatagridContainerProps): DatagridConfig {
@@ -32,12 +33,18 @@ export function datagridConfig(props: DatagridContainerProps): DatagridConfig {
3233
settingsStorageEnabled: isSettingsStorageEnabled(props),
3334
enableSelectAll: props.enableSelectAll,
3435
keepSelection: props.keepSelection,
35-
pagingPosition: props.pagingPosition
36+
pagingPosition: props.pagingPosition,
37+
multiselectable: isMultiselectable(props)
3638
};
3739

3840
return Object.freeze(config);
3941
}
4042

43+
function isMultiselectable(props: DatagridContainerProps): true | undefined {
44+
const type = props.itemSelection?.type;
45+
return type === "Multi" ? true : undefined;
46+
}
47+
4148
function isSelectionEnabled(props: DatagridContainerProps): boolean {
4249
return props.itemSelection !== undefined;
4350
}

packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore";
1414
import { GridBasicData } from "../../helpers/state/GridBasicData";
1515
import { GridPersonalizationStore } from "../../helpers/state/GridPersonalizationStore";
1616
import { DatagridConfig } from "../configs/Datagrid.config";
17+
import { gridStyleAtom } from "../models/grid.model";
1718
import { DatasourceParamsController } from "../services/DatasourceParamsController";
1819
import { DerivedLoaderController } from "../services/DerivedLoaderController";
1920
import { PaginationController } from "../services/PaginationController";
@@ -33,6 +34,7 @@ injected(WidgetFilterAPI, DG.parentChannelName, DG.filterHost);
3334
injected(emptyStateWidgetsAtom, CORE.mainGate, CORE.atoms.itemCount);
3435
injected(SelectionGate, CORE.mainGate);
3536
injected(createSelectionHelper, CORE.setupService, DG.selectionGate, CORE.config.optional);
37+
injected(gridStyleAtom, CORE.columnsStore, CORE.config);
3638

3739
injected(
3840
SelectionCounterViewModel,
@@ -72,6 +74,8 @@ export class DatagridContainer extends Container {
7274
// Empty placeholder
7375
this.bind(DG.emptyPlaceholderVM).toInstance(EmptyPlaceholderViewModel).inSingletonScope();
7476
this.bind(DG.emptyPlaceholderWidgets).toInstance(emptyStateWidgetsAtom).inTransientScope();
77+
// Grid columns style
78+
this.bind(DG.gridColumnsStyle).toInstance(gridStyleAtom).inTransientScope();
7579

7680
// Selection gate
7781
this.bind(DG.selectionGate).toInstance(SelectionGate).inTransientScope();

packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ export const [useLoaderViewModel] = createInjectionHooks(DG.loaderVM);
1010
export const [useMainGate] = createInjectionHooks(CORE.mainGate);
1111
export const [usePaginationService] = createInjectionHooks(DG.paginationService);
1212
export const [useSelectionHelper] = createInjectionHooks(DG.selectionHelper);
13+
export const [useGridStyle] = createInjectionHooks(DG.gridColumnsStyle);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { ComputedAtom } from "@mendix/widget-plugin-mobx-kit/main";
2+
import { computed } from "mobx";
3+
import { CSSProperties } from "react";
4+
import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore";
5+
import { DatagridConfig } from "../configs/Datagrid.config";
6+
7+
export function gridStyleAtom(columns: ColumnGroupStore, config: DatagridConfig): ComputedAtom<CSSProperties> {
8+
return computed(() => {
9+
return gridStyle(columns.visibleColumns, {
10+
checkboxColumn: config.checkboxColumnEnabled,
11+
selectorColumn: config.selectorColumnEnabled
12+
});
13+
});
14+
}
15+
16+
function gridStyle(
17+
columns: Array<{ getCssWidth(): string }>,
18+
optional: {
19+
checkboxColumn?: boolean;
20+
selectorColumn?: boolean;
21+
}
22+
): CSSProperties {
23+
const columnSizes = columns.map(c => c.getCssWidth());
24+
25+
const sizes: string[] = [];
26+
27+
if (optional.checkboxColumn) {
28+
sizes.push("48px");
29+
}
30+
31+
sizes.push(...columnSizes);
32+
33+
if (optional.selectorColumn) {
34+
sizes.push("54px");
35+
}
36+
37+
return {
38+
gridTemplateColumns: sizes.join(" ")
39+
};
40+
}

packages/pluggableWidgets/datagrid-web/src/model/tokens.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { SelectionCounterViewModel } from "@mendix/widget-plugin-grid/selection-
1818
import { ComputedAtom, DerivedPropsGate, Emitter } from "@mendix/widget-plugin-mobx-kit/main";
1919
import { token } from "brandi";
2020
import { ListValue } from "mendix";
21-
import { ReactNode } from "react";
21+
import { CSSProperties, ReactNode } from "react";
2222
import { MainGateProps } from "../../typings/MainGateProps";
2323
import { EmptyPlaceholderViewModel } from "../features/empty-message/EmptyPlaceholder.viewModel";
2424
import { SelectAllBarViewModel } from "../features/select-all/SelectAllBar.viewModel";
@@ -98,7 +98,9 @@ export const DG_TOKENS = {
9898
selectionCounterVM: token<SelectionCounterViewModel>("SelectionCounterViewModel"),
9999

100100
selectionGate: token<DerivedPropsGate<SelectionDynamicProps>>("@gate:GateForSelectionHelper"),
101-
selectionHelper: token<SelectionHelperService | undefined>("SelectionHelperService")
101+
selectionHelper: token<SelectionHelperService | undefined>("SelectionHelperService"),
102+
103+
gridColumnsStyle: token<ComputedAtom<CSSProperties>>("@computed:GridColumnsStyle")
102104
};
103105

104106
/** "Select all" module tokens. */

0 commit comments

Comments
 (0)