Skip to content

Commit 5e920fc

Browse files
committed
feat: first implementation of linked dd filter
1 parent 604a22a commit 5e920fc

File tree

7 files changed

+62
-60
lines changed

7 files changed

+62
-60
lines changed

packages/pluggableWidgets/datagrid-dropdown-filter-web/src/DatagridDropdownFilter.editorPreview.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { enableStaticRendering } from "mobx-react-lite";
2-
enableStaticRendering(true);
3-
42
import { createElement, ReactElement } from "react";
53
import { DatagridDropdownFilterPreviewProps } from "../typings/DatagridDropdownFilterProps";
64
import { parseStyle } from "@mendix/widget-plugin-platform/preview/parse-style";
7-
import { Select } from "@mendix/widget-plugin-filtering/controls/select/Select";
5+
import { Select } from "@mendix/widget-plugin-dropdown-filter/controls/select/Select";
6+
7+
enableStaticRendering(true);
88

99
function Preview(props: DatagridDropdownFilterPreviewProps): ReactElement {
1010
return (

packages/pluggableWidgets/datagrid-dropdown-filter-web/src/DatagridDropdownFilter.tsx

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,7 @@ import { createElement, ReactElement } from "react";
22
import { withPreloader } from "@mendix/widget-plugin-platform/hoc/withPreloader";
33
import { DatagridDropdownFilterContainerProps } from "../typings/DatagridDropdownFilterProps";
44
import { AttrFilter } from "./components/AttrFilter";
5-
6-
// function Container(props: DatagridDropdownFilterContainerProps & Select_FilterAPIv2): React.ReactElement {
7-
// const commonProps = {
8-
// ariaLabel: props.ariaLabel?.value,
9-
// className: props.class,
10-
// tabIndex: props.tabIndex,
11-
// styles: props.style,
12-
// onChange: props.onChange,
13-
// valueAttribute: props.valueAttribute,
14-
// parentChannelName: props.parentChannelName,
15-
// name: props.name,
16-
// multiselect: props.multiSelect,
17-
// emptyCaption: props.emptyOptionCaption?.value,
18-
// defaultValue: props.defaultValue?.value,
19-
// filterable: props.filterable,
20-
// selectionMethod: props.selectionMethod,
21-
// selectedItemsStyle: props.selectedItemsStyle,
22-
// clearable: props.clearable
23-
// };
24-
25-
// if (props.filterStore.storeType === "refselect") {
26-
// return <RefFilterContainer {...commonProps} filterStore={props.filterStore} />;
27-
// }
28-
29-
// return (
30-
// <StaticFilterContainer {...commonProps} filterStore={props.filterStore} filterOptions={props.filterOptions} />
31-
// );
32-
// }
33-
34-
const DatagridDropdownFilter = withPreloader(Container, props => props.defaultValue?.status === "loading");
35-
36-
export default DatagridDropdownFilter;
5+
import { RefFilter } from "./components/RefFilter";
376

387
function Container(props: DatagridDropdownFilterContainerProps): ReactElement {
398
if (props.baseType === "attr") {
@@ -43,6 +12,6 @@ function Container(props: DatagridDropdownFilterContainerProps): ReactElement {
4312
return <RefFilter {...props} />;
4413
}
4514

46-
function RefFilter(props: DatagridDropdownFilterContainerProps): ReactElement {
47-
return <div key={props.name} />;
48-
}
15+
const DatagridDropdownFilter = withPreloader(Container, props => props.defaultValue?.status === "loading");
16+
17+
export default DatagridDropdownFilter;

packages/pluggableWidgets/datagrid-dropdown-filter-web/src/DatagridDropdownFilter.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
<!-- end: Attr type -->
6363

6464
<!-- start: Ref type -->
65-
<property key="ref" type="association" selectableObjects="refOptions" required="false" dataSource="linkedDs" isMetaData="true">
65+
<property key="ref" type="association" selectableObjects="refOptions" required="true" dataSource="linkedDs" isMetaData="true">
6666
<caption>Entity</caption>
6767
<description>Set the entity to enable filtering over association.</description>
6868
<associationTypes>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { createElement, ReactElement } from "react";
2+
import { withLinkedRefStore } from "../hocs/withLinkedRefStore";
3+
import { RefFilterContainer } from "@mendix/widget-plugin-dropdown-filter/containers/RefFilterContainer";
4+
import { RefFilterAPI } from "./typings";
5+
import { DatagridDropdownFilterContainerProps } from "../../typings/DatagridDropdownFilterProps";
6+
7+
function Connector(props: DatagridDropdownFilterContainerProps & RefFilterAPI): ReactElement {
8+
return (
9+
<RefFilterContainer
10+
{...props}
11+
multiselect={props.multiSelect}
12+
ariaLabel={props.ariaLabel?.value}
13+
className={props.class}
14+
styles={props.style}
15+
emptyCaption={props.emptyOptionCaption?.value}
16+
defaultValue={props.defaultValue?.value}
17+
parentChannelName={props.parentChannelName}
18+
/>
19+
);
20+
}
21+
22+
export const RefFilter = withLinkedRefStore(Connector);

packages/pluggableWidgets/datagrid-dropdown-filter-web/src/hocs/withLinkedRefStore.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,24 @@ import { BaseStoreProvider } from "@mendix/widget-plugin-filtering/custom-filter
66
import { DerivedPropsGate } from "@mendix/widget-plugin-mobx-kit/props-gate";
77
import { GateProvider } from "@mendix/widget-plugin-mobx-kit/GateProvider";
88
import { useConst } from "@mendix/widget-plugin-mobx-kit/react/useConst";
9-
import { ListReferenceValue, ListReferenceSetValue, ListValue, ListAttributeValue } from "mendix";
9+
import { ListValue, ListAttributeValue, AssociationMetaData } from "mendix";
1010
import { DatagridDropdownFilterContainerProps } from "../../typings/DatagridDropdownFilterProps";
1111
import { useSetup } from "@mendix/widget-plugin-mobx-kit/react/useSetup";
12+
import { RefFilterAPI } from "../components/typings";
1213

1314
type WidgetProps = Pick<DatagridDropdownFilterContainerProps, "name" | "ref" | "refOptions" | "refCaption">;
1415

1516
export interface RequiredProps {
1617
name: string;
17-
ref: ListReferenceValue | ListReferenceSetValue;
18+
ref: AssociationMetaData;
1819
refOptions: ListValue;
1920
refCaption: ListAttributeValue<string>;
2021
searchAttrId: ListAttributeValue["id"];
2122
}
2223

2324
type Component<P extends object> = (props: P) => React.ReactElement;
2425

25-
export function withLinkedRefStore<P extends WidgetProps>(
26-
Cmp: Component<P & { filterStore: RefFilterStore; parentChannelName: string }>
27-
): Component<P> {
26+
export function withLinkedRefStore<P extends WidgetProps>(Cmp: Component<P & RefFilterAPI>): Component<P> {
2827
function StoreProvider(props: P & { filterAPI: FilterAPI }): React.ReactElement {
2928
const gate = useGate(props);
3029
const provider = useSetup(() => new RefStoreProvider(props.filterAPI, gate));

packages/pluggableWidgets/datagrid-dropdown-filter-web/typings/DatagridDropdownFilterProps.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export interface DatagridDropdownFilterContainerProps {
3434
attr: AttributeMetaData<string | boolean>;
3535
auto: boolean;
3636
filterOptions: FilterOptionsType[];
37-
ref?: AssociationMetaData;
37+
ref: AssociationMetaData;
3838
refOptions?: ListValue;
3939
refCaption?: ListAttributeValue<string>;
4040
fetchOptionsLazy: boolean;
Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
1-
import { RefSelectController } from "@mendix/widget-plugin-dropdown-filter/controllers/RefSelectController";
2-
import { RefComboboxController } from "@mendix/widget-plugin-dropdown-filter/controllers/RefComboboxController";
3-
import { RefTagPickerController } from "@mendix/widget-plugin-dropdown-filter/controllers/RefTagPickerController";
4-
import { Select } from "@mendix/widget-plugin-filtering/controls/select/Select";
5-
import { Combobox } from "@mendix/widget-plugin-filtering/controls/combobox/Combobox";
6-
import { TagPicker } from "@mendix/widget-plugin-filtering/controls/tag-picker/TagPicker";
7-
import { usePickerJSActions } from "@mendix/widget-plugin-filtering/helpers/usePickerJSActions";
8-
import { RefFilterStore } from "@mendix/widget-plugin-filtering/stores/picker/RefFilterStore";
1+
import { RefSelectController } from "../controllers/RefSelectController";
2+
import { RefComboboxController } from "../controllers/RefComboboxController";
3+
import { RefTagPickerController } from "../controllers/RefTagPickerController";
4+
import { Select } from "../controls/select/Select";
5+
import { Combobox } from "../controls/combobox/Combobox";
6+
import { TagPicker } from "../controls/tag-picker/TagPicker";
7+
import { usePickerJSActions } from "../helpers/usePickerJSActions";
8+
import { RefFilterStore } from "../stores/RefFilterStore";
99
import { ActionValue, EditableValue } from "mendix";
1010
import { observer } from "mobx-react-lite";
11-
import { createElement, CSSProperties } from "react";
12-
import { useSetupUpdate } from "@mendix/widget-plugin-filtering/helpers/useSetupUpdate";
13-
import { useFrontendType } from "../hooks/useFrontendType";
14-
import { SelectedItemsStyleEnum, SelectionMethodEnum } from "../../typings/DatagridDropdownFilterProps";
11+
import { createElement, CSSProperties, useEffect } from "react";
12+
13+
import { useFrontendType } from "../helpers/useFrontendType";
1514
import { useOnScrollBottom } from "@mendix/widget-plugin-hooks/useOnScrollBottom";
15+
import { SelectedItemsStyleEnum, SelectionMethodEnum } from "../typings/widget";
16+
import { useConst } from "@mendix/widget-plugin-mobx-kit/react/useConst";
17+
import { GateProvider } from "@mendix/widget-plugin-mobx-kit/GateProvider";
18+
import { DerivedPropsGate } from "@mendix/widget-plugin-mobx-kit/props-gate";
1619

1720
export interface RefFilterContainerProps {
1821
ariaLabel?: string;
@@ -48,7 +51,8 @@ function Container(props: RefFilterContainerProps): React.ReactElement {
4851
}
4952

5053
const SelectWidget = observer(function SelectWidget(props: RefFilterContainerProps): React.ReactElement {
51-
const ctrl1 = useSetupUpdate(() => new RefSelectController(props), props);
54+
const gate = useGate(props);
55+
const ctrl1 = useConst(() => new RefSelectController({ gate }));
5256
const handleMenuScroll = useOnScrollBottom(ctrl1.handleMenuScrollEnd, { triggerZoneHeight: 100 });
5357

5458
usePickerJSActions(ctrl1, props);
@@ -71,7 +75,8 @@ const SelectWidget = observer(function SelectWidget(props: RefFilterContainerPro
7175
});
7276

7377
const ComboboxWidget = observer(function ComboboxWidget(props: RefFilterContainerProps): React.ReactElement {
74-
const ctrl2 = useSetupUpdate(() => new RefComboboxController(props), props);
78+
const gate = useGate(props);
79+
const ctrl2 = useConst(() => new RefComboboxController({ gate }));
7580
const handleMenuScroll = useOnScrollBottom(ctrl2.handleMenuScrollEnd, { triggerZoneHeight: 100 });
7681

7782
usePickerJSActions(ctrl2, props);
@@ -93,7 +98,8 @@ const ComboboxWidget = observer(function ComboboxWidget(props: RefFilterContaine
9398
});
9499

95100
const TagPickerWidget = observer(function TagPickerWidget(props: RefFilterContainerProps): React.ReactElement {
96-
const ctrl3 = useSetupUpdate(() => new RefTagPickerController(props), props);
101+
const gate = useGate(props);
102+
const ctrl3 = useConst(() => new RefTagPickerController({ gate }));
97103
const handleMenuScroll = useOnScrollBottom(ctrl3.handleMenuScrollEnd, { triggerZoneHeight: 100 });
98104

99105
usePickerJSActions(ctrl3, props);
@@ -119,3 +125,9 @@ const TagPickerWidget = observer(function TagPickerWidget(props: RefFilterContai
119125
});
120126

121127
export const RefFilterContainer = Container;
128+
129+
function useGate(props: RefFilterContainerProps): DerivedPropsGate<RefFilterContainerProps> {
130+
const gp = useConst(() => new GateProvider(props));
131+
useEffect(() => gp.setProps(props));
132+
return gp.gate;
133+
}

0 commit comments

Comments
 (0)