Skip to content

Commit 608ac3d

Browse files
committed
feat: add attr check to widgets
1 parent e3dba3e commit 608ac3d

File tree

7 files changed

+59
-7
lines changed

7 files changed

+59
-7
lines changed

packages/pluggableWidgets/datagrid-date-filter-web/src/DatagridDateFilter.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { withAttributeGuard } from "@mendix/widget-plugin-filtering/helpers/withAttributeGuard";
12
import { withFilterAPI } from "@mendix/widget-plugin-filtering/helpers/withFilterAPI";
23
import { withPreloader } from "@mendix/widget-plugin-platform/hoc/withPreloader";
34
import { createElement, ReactElement } from "react";
@@ -11,7 +12,7 @@ const Container = withPreloader(DateFilterContainer, isLoadingDefaultValues);
1112

1213
const FilterAuto = withParentProvidedDateStore(Container);
1314

14-
const FilterLinked = withFilterAPI(withLinkedDateStore(Container));
15+
const FilterLinked = withAttributeGuard(withFilterAPI(withLinkedDateStore(Container)));
1516

1617
export default function DatagridDateFilter(props: DatagridDateFilterContainerProps): ReactElement | null {
1718
if (props.attrChoice === "auto") {

packages/pluggableWidgets/datagrid-dropdown-filter-web/src/components/AttrFilter.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { EnumFilterContainer } from "@mendix/widget-plugin-dropdown-filter/containers/EnumFilterContainer";
22
import { withFilterAPI } from "@mendix/widget-plugin-filtering/helpers/withFilterAPI";
33
import { ReactElement, createElement } from "react";
4+
import { withAttrGuard } from "src/hocs/withAttrGuard";
45
import { DatagridDropdownFilterContainerProps } from "../../typings/DatagridDropdownFilterProps";
56
import { withLinkedEnumStore } from "../hocs/withLinkedEnumStore";
67
import { withParentProvidedEnumStore } from "../hocs/withParentProvidedEnumStore";
@@ -16,7 +17,7 @@ export function AttrFilter(props: DatagridDropdownFilterContainerProps): ReactEl
1617

1718
const AutoAttrFilter = withParentProvidedEnumStore(Connector);
1819

19-
const LinkedAttrFilter = withFilterAPI(withLinkedEnumStore(Connector));
20+
const LinkedAttrFilter = withAttrGuard(withFilterAPI(withLinkedEnumStore(Connector)));
2021

2122
function Connector(props: DatagridDropdownFilterContainerProps & EnumFilterProps): ReactElement {
2223
return (

packages/pluggableWidgets/datagrid-dropdown-filter-web/src/components/RefFilter.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import { RefFilterContainer } from "@mendix/widget-plugin-dropdown-filter/containers/RefFilterContainer";
12
import { createElement, ReactElement } from "react";
3+
import { withAttrGuard } from "src/hocs/withAttrGuard";
4+
import { DatagridDropdownFilterContainerProps } from "../../typings/DatagridDropdownFilterProps";
25
import { withLinkedRefStore } from "../hocs/withLinkedRefStore";
3-
import { RefFilterContainer } from "@mendix/widget-plugin-dropdown-filter/containers/RefFilterContainer";
46
import { RefFilterProps } from "./typings";
5-
import { DatagridDropdownFilterContainerProps } from "../../typings/DatagridDropdownFilterProps";
67

78
function Connector(props: DatagridDropdownFilterContainerProps & RefFilterProps): ReactElement {
89
return (
@@ -19,4 +20,4 @@ function Connector(props: DatagridDropdownFilterContainerProps & RefFilterProps)
1920
);
2021
}
2122

22-
export const RefFilter = withLinkedRefStore(Connector);
23+
export const RefFilter = withAttrGuard(withLinkedRefStore(Connector));
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Alert } from "@mendix/widget-plugin-component-kit/Alert";
2+
import { FC, createElement } from "react";
3+
4+
export function withAttrGuard<P extends { attr: { filterable: boolean } } | { refEntity: { filterable: boolean } }>(
5+
Component: FC<P>
6+
): FC<P> {
7+
return function AttrGuard(props) {
8+
const meta = "attr" in props ? props.attr : props.refEntity;
9+
10+
if (!meta.filterable) {
11+
return (
12+
<Alert bootstrapStyle="danger">
13+
Only filterable attributes are allowed. The attributes in the current widget configuration is not
14+
filterable. Please change the widget configuration.
15+
</Alert>
16+
);
17+
}
18+
return <Component {...props} />;
19+
};
20+
}

packages/pluggableWidgets/datagrid-number-filter-web/src/DatagridNumberFilter.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { withAttributeGuard } from "@mendix/widget-plugin-filtering/helpers/withAttributeGuard";
12
import { withFilterAPI } from "@mendix/widget-plugin-filtering/helpers/withFilterAPI";
23
import { withPreloader } from "@mendix/widget-plugin-platform/hoc/withPreloader";
34
import { ReactElement, createElement } from "react";
@@ -11,7 +12,7 @@ const Container = withPreloader<DatagridNumberFilterContainerProps>(NumberFilter
1112

1213
const FilterAuto = withParentProvidedNumberStore(Container);
1314

14-
const FilterLinked = withFilterAPI(withLinkedNumberStore(Container));
15+
const FilterLinked = withAttributeGuard(withFilterAPI(withLinkedNumberStore(Container)));
1516

1617
export default function DatagridNumberFilter(props: DatagridNumberFilterContainerProps): ReactElement {
1718
if (props.attrChoice === "auto") {

packages/pluggableWidgets/datagrid-text-filter-web/src/DatagridTextFilter.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { withAttributeGuard } from "@mendix/widget-plugin-filtering/helpers/withAttributeGuard";
12
import { withFilterAPI } from "@mendix/widget-plugin-filtering/helpers/withFilterAPI";
23
import { withPreloader } from "@mendix/widget-plugin-platform/hoc/withPreloader";
34
import { createElement, ReactElement } from "react";
@@ -11,7 +12,7 @@ const Container = withPreloader<DatagridTextFilterContainerProps>(TextFilterCont
1112

1213
const FilterAuto = withParentProvidedStringStore(Container);
1314

14-
const FilterLinked = withFilterAPI(withLinkedStringStore(Container));
15+
const FilterLinked = withAttributeGuard(withFilterAPI(withLinkedStringStore(Container)));
1516

1617
export default function DatagridTextFilter(props: DatagridTextFilterContainerProps): ReactElement {
1718
if (props.attrChoice === "auto") {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Alert } from "@mendix/widget-plugin-component-kit/Alert";
2+
import { FC, createElement, useMemo } from "react";
3+
4+
interface RequiredProps {
5+
attributes: Array<{
6+
attribute: { filterable: boolean };
7+
}>;
8+
}
9+
10+
export function withAttributeGuard<P extends RequiredProps>(Component: FC<P>): FC<P> {
11+
return function AttributesGuard(props) {
12+
const isValid = useMemo(
13+
() => props.attributes.every(({ attribute }) => attribute.filterable),
14+
[props.attributes]
15+
);
16+
17+
if (!isValid) {
18+
return (
19+
<Alert bootstrapStyle="danger">
20+
Only filterable attributes are allowed. One of the attributes in the current widget configuration is
21+
not filterable. Please change the widget configuration.
22+
</Alert>
23+
);
24+
}
25+
return <Component {...props} />;
26+
};
27+
}

0 commit comments

Comments
 (0)