Skip to content

Commit 8c4fd31

Browse files
committed
feat: add store injector to date filter
1 parent a59ae1b commit 8c4fd31

File tree

5 files changed

+88
-4
lines changed

5 files changed

+88
-4
lines changed

Diff for: packages/pluggableWidgets/datagrid-date-filter-web/src/DatagridDateFilter.editorConfig.ts

+5
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ export function getProperties(values: DatagridDateFilterPreviewProps, defaultPro
3535
if (!values.adjustable) {
3636
hidePropertyIn(defaultProperties, values, "screenReaderButtonCaption");
3737
}
38+
39+
if (values.attrChoice === "auto") {
40+
hidePropertyIn(defaultProperties, values, "attributes");
41+
}
42+
3843
if (values.defaultFilter !== "between") {
3944
hidePropertiesIn(defaultProperties, values, [
4045
"defaultStartDate",

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

+10-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,18 @@ import { DatagridDateFilterContainerProps } from "../typings/DatagridDateFilterP
44
import { Container } from "./components/DateFilterContainer";
55
import { withDateFilterAPI } from "./hocs/withDateFilterAPI";
66
import { isLoadingDefaultValues } from "./utils/widget-utils";
7+
import { withDateLinkedAttributes } from "./hocs/withDateLinkedAttributes";
78

89
const container = withPreloader(Container, isLoadingDefaultValues);
9-
const Widget = withDateFilterAPI(container);
10+
const FilterAuto = withDateFilterAPI(container);
11+
const FilterLinked = withDateLinkedAttributes(container);
1012

1113
export default function DatagridDateFilter(props: DatagridDateFilterContainerProps): ReactElement | null {
12-
return <Widget {...props} />;
14+
const isAuto = props.attrChoice === "auto";
15+
16+
if (isAuto) {
17+
return <FilterAuto {...props} />;
18+
}
19+
20+
return <FilterLinked {...props} />;
1321
}

Diff for: packages/pluggableWidgets/datagrid-date-filter-web/src/DatagridDateFilter.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<caption>Attribute</caption>
3030
<description />
3131
<attributeTypes>
32-
<attributeType name="String" />
32+
<attributeType name="DateTime" />
3333
</attributeTypes>
3434
</property>
3535
</propertyGroup>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { createElement } from "react";
2+
import { AttributeMetaData } from "mendix";
3+
import { useFilterAPI } from "@mendix/widget-plugin-filtering/context";
4+
import { APIError } from "@mendix/widget-plugin-filtering/errors";
5+
import { error, value, Result } from "@mendix/widget-plugin-filtering/result-meta";
6+
import { Date_InputFilterInterface } from "@mendix/widget-plugin-filtering/typings/InputFilterInterface";
7+
import { Alert } from "@mendix/widget-plugin-component-kit/Alert";
8+
import { useConst } from "@mendix/widget-plugin-mobx-kit/react/useConst";
9+
import { useSetup } from "@mendix/widget-plugin-mobx-kit/react/useSetup";
10+
import { DateStoreProvider } from "@mendix/widget-plugin-filtering/custom-filter-api/DateStoreProvider";
11+
import { ISetupable } from "@mendix/widget-plugin-mobx-kit/setupable";
12+
13+
interface RequiredProps {
14+
attributes: Array<{
15+
attribute: AttributeMetaData<Date>;
16+
}>;
17+
name: string;
18+
}
19+
20+
interface StoreProvider extends ISetupable {
21+
store: Date_InputFilterInterface;
22+
}
23+
24+
type Component<P extends object> = (props: P) => React.ReactElement;
25+
26+
export function withDateLinkedAttributes<P extends RequiredProps>(
27+
component: Component<P & InjectableFilterAPI>
28+
): Component<P> {
29+
const StoreInjector = withInjectedStore(component);
30+
31+
return function FilterAPIProvider(props) {
32+
const api = useStoreProvider(props);
33+
34+
if (api.hasError) {
35+
return <Alert bootstrapStyle="danger">{api.error.message}</Alert>;
36+
}
37+
38+
return <StoreInjector {...props} {...api.value} />;
39+
};
40+
}
41+
42+
function withInjectedStore<P extends object>(
43+
Component: Component<P & InjectableFilterAPI>
44+
): Component<P & { provider: StoreProvider; channel: string }> {
45+
return function StoreInjector(props) {
46+
const provider = useSetup(() => props.provider);
47+
return <Component {...props} filterStore={provider.store} parentChannelName={props.channel} />;
48+
};
49+
}
50+
51+
interface InjectableFilterAPI {
52+
filterStore: Date_InputFilterInterface;
53+
parentChannelName?: string;
54+
}
55+
56+
function useStoreProvider(props: RequiredProps): Result<{ provider: StoreProvider; channel: string }, APIError> {
57+
const filterAPI = useFilterAPI();
58+
return useConst(() => {
59+
if (filterAPI.hasError) {
60+
return error(filterAPI.error);
61+
}
62+
63+
return value({
64+
provider: new DateStoreProvider(filterAPI.value, {
65+
attributes: props.attributes.map(obj => obj.attribute),
66+
dataKey: props.name
67+
}),
68+
channel: filterAPI.value.parentChannelName
69+
});
70+
});
71+
}

Diff for: packages/pluggableWidgets/datagrid-date-filter-web/typings/DatagridDateFilterProps.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { ActionValue, AttributeMetaData, DynamicValue, EditableValue } from "men
99
export type AttrChoiceEnum = "auto" | "linked";
1010

1111
export interface AttributesType {
12-
attribute: AttributeMetaData<string>;
12+
attribute: AttributeMetaData<Date>;
1313
}
1414

1515
export type DefaultFilterEnum = "between" | "greater" | "greaterEqual" | "equal" | "notEqual" | "smaller" | "smallerEqual" | "empty" | "notEmpty";

0 commit comments

Comments
 (0)