Skip to content

Commit e3dba3e

Browse files
committed
feat: add attr check for datagrid columns
1 parent 3db100b commit e3dba3e

File tree

3 files changed

+49
-17
lines changed

3 files changed

+49
-17
lines changed

packages/pluggableWidgets/datagrid-web/src/helpers/state/column/ColumnFilterStore.tsx

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { FilterData } from "@mendix/filter-commons/typings/settings";
22
import { EnumFilterStore } from "@mendix/widget-plugin-dropdown-filter/stores/EnumFilterStore";
33
import { FilterAPI, getGlobalFilterContextObject } from "@mendix/widget-plugin-filtering/context";
4-
import { value } from "@mendix/widget-plugin-filtering/result-meta";
4+
import { APIError } from "@mendix/widget-plugin-filtering/errors";
5+
import { error, value } from "@mendix/widget-plugin-filtering/result-meta";
56
import { InputFilterStore, attrgroupFilterStore } from "@mendix/widget-plugin-filtering/stores/input/store-utils";
67
import { ObservableFilterHost } from "@mendix/widget-plugin-filtering/typings/ObservableFilterHost";
78
import { disposeBatch } from "@mendix/widget-plugin-mobx-kit/disposeBatch";
@@ -22,14 +23,24 @@ const { Provider } = getGlobalFilterContextObject();
2223

2324
export class ColumnFilterStore implements IColumnFilterStore {
2425
private _widget: ReactNode;
26+
private _error: APIError | null;
2527
private _filterStore: FilterStore | null = null;
2628
private _context: FilterAPI;
2729
private _observerBag: ObserverBag;
2830

2931
constructor(props: ColumnsType, info: StaticInfo, dsViewState: FilterCondition | null, observerBag: ObserverBag) {
3032
this._observerBag = observerBag;
3133
this._widget = props.filter;
32-
this._filterStore = this.createFilterStore(props, dsViewState);
34+
const storeResult = this.createFilterStore(props, dsViewState);
35+
if (storeResult === null) {
36+
this._error = this._filterStore = null;
37+
} else if (storeResult.hasError) {
38+
this._error = storeResult.error;
39+
this._filterStore = null;
40+
} else {
41+
this._error = null;
42+
this._filterStore = storeResult.value;
43+
}
3344
this._context = this.createContext(this._filterStore, info);
3445

3546
makeObservable<this>(this, {
@@ -45,9 +56,12 @@ export class ColumnFilterStore implements IColumnFilterStore {
4556
return disposeAll;
4657
}
4758

48-
private createFilterStore(props: ColumnsType, dsViewState: FilterCondition | null): FilterStore | null {
59+
private createFilterStore(
60+
props: ColumnsType,
61+
dsViewState: FilterCondition | null
62+
): ReturnType<typeof attrgroupFilterStore> | null {
4963
if (isListAttributeValue(props.attribute)) {
50-
return attrgroupFilterStore(props.attribute.type, [props.attribute], dsViewState);
64+
return attrgroupFilterStore(props.attribute.type, props.attribute, dsViewState);
5165
}
5266

5367
return null;
@@ -57,10 +71,12 @@ export class ColumnFilterStore implements IColumnFilterStore {
5771
return {
5872
version: 3,
5973
parentChannelName: info.filtersChannelName,
60-
provider: value({
61-
type: "direct",
62-
store
63-
}),
74+
provider: this._error
75+
? error(this._error)
76+
: value({
77+
type: "direct",
78+
store
79+
}),
6480
filterObserver: this._observerBag.customFilterHost,
6581
sharedInitFilter: this._observerBag.sharedInitFilter
6682
};

packages/shared/widget-plugin-filtering/src/errors.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ enum Code {
33
ENOCONTEXT = 1,
44
ESTORETYPE = 3,
55
EKEYMISSING = 7,
6-
OPTIONS_NOT_FILTERABLE = 8
6+
OPTIONS_NOT_FILTERABLE = 8,
7+
NOT_FILTERABLE = 9,
8+
UNSUPPORTED_ATTRIBUTE_TYPE = 10
79
}
810

911
export { Code as APIErrorCode };
@@ -41,3 +43,13 @@ export const OPTIONS_NOT_FILTERABLE: APIError = Object.freeze({
4143
message:
4244
"Drop-down options can't be filtered with current column configuration. To enable filtering, change 'Option caption type' to 'Attribute' in column settings."
4345
});
46+
47+
export const NOT_FILTERABLE: APIError = Object.freeze({
48+
code: Code.NOT_FILTERABLE,
49+
message: "The attribute is not filterable. Please choose a different attribute."
50+
});
51+
52+
export const UNSUPPORTED_ATTRIBUTE_TYPE: APIError = Object.freeze({
53+
code: Code.UNSUPPORTED_ATTRIBUTE_TYPE,
54+
message: "Unsupported attribute type for filtering. Please choose a different attribute."
55+
});

packages/shared/widget-plugin-filtering/src/stores/input/store-utils.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { EnumFilterStore } from "@mendix/widget-plugin-dropdown-filter/stores/EnumFilterStore";
22
import { ListAttributeValue } from "mendix";
33
import { FilterCondition } from "mendix/filters";
4+
import { APIError, NOT_FILTERABLE, UNSUPPORTED_ATTRIBUTE_TYPE } from "../../errors";
5+
import { error, Result, value } from "../../result-meta";
46
import {
57
Date_InputFilterInterface,
68
InputFilterInterface,
@@ -15,29 +17,31 @@ export type InputFilterStore = StringInputFilterStore | NumberInputFilterStore |
1517

1618
export function attrgroupFilterStore(
1719
type: ListAttributeValue["type"],
18-
attributes: ListAttributeValue[],
20+
attribute: ListAttributeValue,
1921
initCond: FilterCondition | null
20-
): InputFilterStore | EnumFilterStore | null {
22+
): Result<InputFilterStore | EnumFilterStore, APIError> {
23+
if (!attribute.filterable) {
24+
return error(NOT_FILTERABLE);
25+
}
2126
switch (type) {
2227
case "DateTime":
23-
return new DateInputFilterStore(attributes as Array<ListAttributeValue<Date>>, initCond);
28+
return value(new DateInputFilterStore([attribute] as Array<ListAttributeValue<Date>>, initCond));
2429

2530
case "AutoNumber":
2631
case "Decimal":
2732
case "Integer":
2833
case "Long":
29-
return new NumberInputFilterStore(attributes as Array<ListAttributeValue<Big>>, initCond);
34+
return value(new NumberInputFilterStore([attribute] as Array<ListAttributeValue<Big>>, initCond));
3035

3136
case "String":
3237
case "HashString":
33-
return new StringInputFilterStore(attributes as Array<ListAttributeValue<string>>, initCond);
38+
return value(new StringInputFilterStore([attribute] as Array<ListAttributeValue<string>>, initCond));
3439

3540
case "Boolean":
3641
case "Enum":
37-
return new EnumFilterStore(attributes, initCond);
42+
return value(new EnumFilterStore([attribute], initCond));
3843
default:
39-
console.error("attrgroupFilterStore: not supported type " + type, attributes);
40-
return null;
44+
return error(UNSUPPORTED_ATTRIBUTE_TYPE);
4145
}
4246
}
4347

0 commit comments

Comments
 (0)