@oneuptime/common 10.0.69 → 10.0.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/KubernetesCluster.ts +5 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776865086264-MigrationName.ts +11 -8
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776881254913-DedupeKubernetesClustersAndAddUniqueIndex.ts +134 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Services/DatabaseService.ts +10 -27
- package/Server/Services/KubernetesResourceService.ts +33 -10
- package/Server/Types/Database/QueryHelper.ts +127 -0
- package/Server/Types/Database/QueryUtil.ts +244 -0
- package/Types/BaseDatabase/EndsWith.ts +41 -0
- package/Types/BaseDatabase/IncludesAll.ts +45 -0
- package/Types/BaseDatabase/IncludesNone.ts +48 -0
- package/Types/BaseDatabase/NotContains.ts +41 -0
- package/Types/BaseDatabase/StartsWith.ts +41 -0
- package/Types/JSON.ts +20 -0
- package/Types/SerializableObjectDictionary.ts +10 -0
- package/UI/Components/Filters/BooleanFilter.tsx +1 -0
- package/UI/Components/Filters/DateFilter.tsx +212 -25
- package/UI/Components/Filters/DropdownFilter.tsx +1 -0
- package/UI/Components/Filters/EntityFilter.tsx +214 -41
- package/UI/Components/Filters/FilterViewer.tsx +228 -146
- package/UI/Components/Filters/FilterViewerItem.tsx +1 -11
- package/UI/Components/Filters/FiltersForm.tsx +148 -97
- package/UI/Components/Filters/NumberFilter.tsx +219 -34
- package/UI/Components/Filters/OperatorSelector.tsx +91 -0
- package/UI/Components/Filters/TextFilter.tsx +182 -71
- package/UI/Components/Filters/Types/FilterOperator.ts +73 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +8 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +7 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776865086264-MigrationName.js +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776865086264-MigrationName.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776881254913-DedupeKubernetesClustersAndAddUniqueIndex.js +123 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776881254913-DedupeKubernetesClustersAndAddUniqueIndex.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +9 -6
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesResourceService.js +4 -2
- package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +110 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +180 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Types/BaseDatabase/EndsWith.js +31 -0
- package/build/dist/Types/BaseDatabase/EndsWith.js.map +1 -0
- package/build/dist/Types/BaseDatabase/IncludesAll.js +34 -0
- package/build/dist/Types/BaseDatabase/IncludesAll.js.map +1 -0
- package/build/dist/Types/BaseDatabase/IncludesNone.js +34 -0
- package/build/dist/Types/BaseDatabase/IncludesNone.js.map +1 -0
- package/build/dist/Types/BaseDatabase/NotContains.js +31 -0
- package/build/dist/Types/BaseDatabase/NotContains.js.map +1 -0
- package/build/dist/Types/BaseDatabase/StartsWith.js +31 -0
- package/build/dist/Types/BaseDatabase/StartsWith.js.map +1 -0
- package/build/dist/Types/JSON.js +5 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/SerializableObjectDictionary.js +10 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/UI/Components/Filters/BooleanFilter.js +1 -1
- package/build/dist/UI/Components/Filters/BooleanFilter.js.map +1 -1
- package/build/dist/UI/Components/Filters/DateFilter.js +158 -14
- package/build/dist/UI/Components/Filters/DateFilter.js.map +1 -1
- package/build/dist/UI/Components/Filters/DropdownFilter.js +1 -1
- package/build/dist/UI/Components/Filters/DropdownFilter.js.map +1 -1
- package/build/dist/UI/Components/Filters/EntityFilter.js +174 -30
- package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
- package/build/dist/UI/Components/Filters/FilterViewer.js +188 -97
- package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
- package/build/dist/UI/Components/Filters/FilterViewerItem.js +1 -6
- package/build/dist/UI/Components/Filters/FilterViewerItem.js.map +1 -1
- package/build/dist/UI/Components/Filters/FiltersForm.js +46 -38
- package/build/dist/UI/Components/Filters/FiltersForm.js.map +1 -1
- package/build/dist/UI/Components/Filters/NumberFilter.js +165 -23
- package/build/dist/UI/Components/Filters/NumberFilter.js.map +1 -1
- package/build/dist/UI/Components/Filters/OperatorSelector.js +41 -0
- package/build/dist/UI/Components/Filters/OperatorSelector.js.map +1 -0
- package/build/dist/UI/Components/Filters/TextFilter.js +130 -53
- package/build/dist/UI/Components/Filters/TextFilter.js.map +1 -1
- package/build/dist/UI/Components/Filters/Types/FilterOperator.js +63 -0
- package/build/dist/UI/Components/Filters/Types/FilterOperator.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +7 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,29 +1,171 @@
|
|
|
1
|
-
import Input, { InputType } from "../Input/Input";
|
|
2
1
|
import FieldType from "../Types/FieldType";
|
|
3
|
-
import
|
|
2
|
+
import FilterOperator from "./Types/FilterOperator";
|
|
3
|
+
import OperatorSelector from "./OperatorSelector";
|
|
4
|
+
import EqualTo from "../../../Types/BaseDatabase/EqualTo";
|
|
5
|
+
import NotEqual from "../../../Types/BaseDatabase/NotEqual";
|
|
6
|
+
import GreaterThan from "../../../Types/BaseDatabase/GreaterThan";
|
|
7
|
+
import LessThan from "../../../Types/BaseDatabase/LessThan";
|
|
8
|
+
import GreaterThanOrEqual from "../../../Types/BaseDatabase/GreaterThanOrEqual";
|
|
9
|
+
import LessThanOrEqual from "../../../Types/BaseDatabase/LessThanOrEqual";
|
|
10
|
+
import InBetween from "../../../Types/BaseDatabase/InBetween";
|
|
11
|
+
import IsNull from "../../../Types/BaseDatabase/IsNull";
|
|
12
|
+
import NotNull from "../../../Types/BaseDatabase/NotNull";
|
|
13
|
+
import React, { useEffect, useState } from "react";
|
|
14
|
+
const NUMBER_OPERATORS = [
|
|
15
|
+
FilterOperator.EqualTo,
|
|
16
|
+
FilterOperator.NotEqualTo,
|
|
17
|
+
FilterOperator.GreaterThan,
|
|
18
|
+
FilterOperator.LessThan,
|
|
19
|
+
FilterOperator.GreaterThanOrEqualTo,
|
|
20
|
+
FilterOperator.LessThanOrEqualTo,
|
|
21
|
+
FilterOperator.Between,
|
|
22
|
+
FilterOperator.IsEmpty,
|
|
23
|
+
FilterOperator.IsNotEmpty,
|
|
24
|
+
];
|
|
25
|
+
const detectState = (rawValue) => {
|
|
26
|
+
var _a, _b;
|
|
27
|
+
if (rawValue instanceof InBetween) {
|
|
28
|
+
return {
|
|
29
|
+
operator: FilterOperator.Between,
|
|
30
|
+
value: ((_a = rawValue.startValue) !== null && _a !== void 0 ? _a : "").toString(),
|
|
31
|
+
endValue: ((_b = rawValue.endValue) !== null && _b !== void 0 ? _b : "").toString(),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (rawValue instanceof EqualTo) {
|
|
35
|
+
return {
|
|
36
|
+
operator: FilterOperator.EqualTo,
|
|
37
|
+
value: rawValue.toString(),
|
|
38
|
+
endValue: "",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (rawValue instanceof NotEqual) {
|
|
42
|
+
return {
|
|
43
|
+
operator: FilterOperator.NotEqualTo,
|
|
44
|
+
value: rawValue.toString(),
|
|
45
|
+
endValue: "",
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (rawValue instanceof GreaterThan) {
|
|
49
|
+
return {
|
|
50
|
+
operator: FilterOperator.GreaterThan,
|
|
51
|
+
value: rawValue.toString(),
|
|
52
|
+
endValue: "",
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (rawValue instanceof LessThan) {
|
|
56
|
+
return {
|
|
57
|
+
operator: FilterOperator.LessThan,
|
|
58
|
+
value: rawValue.toString(),
|
|
59
|
+
endValue: "",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (rawValue instanceof GreaterThanOrEqual) {
|
|
63
|
+
return {
|
|
64
|
+
operator: FilterOperator.GreaterThanOrEqualTo,
|
|
65
|
+
value: rawValue.toString(),
|
|
66
|
+
endValue: "",
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (rawValue instanceof LessThanOrEqual) {
|
|
70
|
+
return {
|
|
71
|
+
operator: FilterOperator.LessThanOrEqualTo,
|
|
72
|
+
value: rawValue.toString(),
|
|
73
|
+
endValue: "",
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (rawValue instanceof IsNull) {
|
|
77
|
+
return { operator: FilterOperator.IsEmpty, value: "", endValue: "" };
|
|
78
|
+
}
|
|
79
|
+
if (rawValue instanceof NotNull) {
|
|
80
|
+
return { operator: FilterOperator.IsNotEmpty, value: "", endValue: "" };
|
|
81
|
+
}
|
|
82
|
+
if (typeof rawValue === "number") {
|
|
83
|
+
return {
|
|
84
|
+
operator: FilterOperator.EqualTo,
|
|
85
|
+
value: rawValue.toString(),
|
|
86
|
+
endValue: "",
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return { operator: FilterOperator.EqualTo, value: "", endValue: "" };
|
|
90
|
+
};
|
|
91
|
+
const buildValue = (state) => {
|
|
92
|
+
const startNum = parseFloat(state.value);
|
|
93
|
+
const endNum = parseFloat(state.endValue);
|
|
94
|
+
const hasStart = !Number.isNaN(startNum) && state.value !== "";
|
|
95
|
+
const hasEnd = !Number.isNaN(endNum) && state.endValue !== "";
|
|
96
|
+
switch (state.operator) {
|
|
97
|
+
case FilterOperator.EqualTo:
|
|
98
|
+
return hasStart ? new EqualTo(startNum) : undefined;
|
|
99
|
+
case FilterOperator.NotEqualTo:
|
|
100
|
+
return hasStart ? new NotEqual(startNum) : undefined;
|
|
101
|
+
case FilterOperator.GreaterThan:
|
|
102
|
+
return hasStart ? new GreaterThan(startNum) : undefined;
|
|
103
|
+
case FilterOperator.LessThan:
|
|
104
|
+
return hasStart ? new LessThan(startNum) : undefined;
|
|
105
|
+
case FilterOperator.GreaterThanOrEqualTo:
|
|
106
|
+
return hasStart ? new GreaterThanOrEqual(startNum) : undefined;
|
|
107
|
+
case FilterOperator.LessThanOrEqualTo:
|
|
108
|
+
return hasStart ? new LessThanOrEqual(startNum) : undefined;
|
|
109
|
+
case FilterOperator.Between:
|
|
110
|
+
return hasStart && hasEnd ? new InBetween(startNum, endNum) : undefined;
|
|
111
|
+
case FilterOperator.IsEmpty:
|
|
112
|
+
return new IsNull();
|
|
113
|
+
case FilterOperator.IsNotEmpty:
|
|
114
|
+
return new NotNull();
|
|
115
|
+
default:
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
4
119
|
const NumberFilter = (props) => {
|
|
5
120
|
const filter = props.filter;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
121
|
+
if (filter.filterDropdownOptions) {
|
|
122
|
+
return React.createElement(React.Fragment, null);
|
|
123
|
+
}
|
|
124
|
+
if (filter.type !== FieldType.Number) {
|
|
125
|
+
return React.createElement(React.Fragment, null);
|
|
126
|
+
}
|
|
127
|
+
const detected = detectState(props.filterData[filter.key]);
|
|
128
|
+
const [localOperator, setLocalOperator] = useState(detected.operator);
|
|
129
|
+
useEffect(() => {
|
|
130
|
+
const raw = props.filterData[filter.key];
|
|
131
|
+
if (raw !== undefined && raw !== null) {
|
|
132
|
+
setLocalOperator(detected.operator);
|
|
133
|
+
}
|
|
134
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
135
|
+
}, [props.filterData[filter.key]]);
|
|
136
|
+
const state = Object.assign(Object.assign({}, detected), { operator: localOperator });
|
|
137
|
+
const valuelessOperator = state.operator === FilterOperator.IsEmpty ||
|
|
138
|
+
state.operator === FilterOperator.IsNotEmpty;
|
|
139
|
+
const isBetween = state.operator === FilterOperator.Between;
|
|
140
|
+
const apply = (nextState) => {
|
|
141
|
+
var _a;
|
|
142
|
+
if (!filter.key) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
setLocalOperator(nextState.operator);
|
|
146
|
+
const next = Object.assign({}, props.filterData);
|
|
147
|
+
const built = buildValue(nextState);
|
|
148
|
+
if (built === undefined) {
|
|
149
|
+
delete next[filter.key];
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
next[filter.key] = built;
|
|
153
|
+
}
|
|
154
|
+
(_a = props.onFilterChanged) === null || _a === void 0 ? void 0 : _a.call(props, next);
|
|
155
|
+
};
|
|
156
|
+
return (React.createElement("div", { className: "flex gap-2 items-start" },
|
|
157
|
+
React.createElement(OperatorSelector, { value: state.operator, options: NUMBER_OPERATORS, onChange: (nextOperator) => {
|
|
158
|
+
apply(Object.assign(Object.assign({}, state), { operator: nextOperator }));
|
|
159
|
+
} }),
|
|
160
|
+
!valuelessOperator && (React.createElement("div", { className: isBetween ? "flex-1 flex gap-2 min-w-0" : "flex-1 min-w-0" },
|
|
161
|
+
React.createElement("div", { className: "flex-1 min-w-0" },
|
|
162
|
+
React.createElement("input", { type: "number", value: state.value, onChange: (e) => {
|
|
163
|
+
apply(Object.assign(Object.assign({}, state), { value: e.target.value }));
|
|
164
|
+
}, placeholder: isBetween ? "From" : `Filter by ${filter.title}`, className: "block w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-3 text-sm placeholder-gray-500 focus:border-indigo-500 focus:text-gray-900 focus:placeholder-gray-400 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm" })),
|
|
165
|
+
isBetween && (React.createElement("div", { className: "flex-1 min-w-0" },
|
|
166
|
+
React.createElement("input", { type: "number", value: state.endValue, onChange: (e) => {
|
|
167
|
+
apply(Object.assign(Object.assign({}, state), { endValue: e.target.value }));
|
|
168
|
+
}, placeholder: "To", className: "block w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-3 text-sm placeholder-gray-500 focus:border-indigo-500 focus:text-gray-900 focus:placeholder-gray-400 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm" })))))));
|
|
27
169
|
};
|
|
28
170
|
export default NumberFilter;
|
|
29
171
|
//# sourceMappingURL=NumberFilter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberFilter.js","sourceRoot":"","sources":["../../../../../UI/Components/Filters/NumberFilter.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"NumberFilter.js","sourceRoot":"","sources":["../../../../../UI/Components/Filters/NumberFilter.tsx"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAG3C,OAAO,cAAc,MAAM,wBAAwB,CAAC;AACpD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,OAAO,MAAM,qCAAqC,CAAC;AAC1D,OAAO,QAAQ,MAAM,sCAAsC,CAAC;AAC5D,OAAO,WAAW,MAAM,yCAAyC,CAAC;AAClE,OAAO,QAAQ,MAAM,sCAAsC,CAAC;AAC5D,OAAO,kBAAkB,MAAM,gDAAgD,CAAC;AAChF,OAAO,eAAe,MAAM,6CAA6C,CAAC;AAC1E,OAAO,SAAS,MAAM,uCAAuC,CAAC;AAC9D,OAAO,MAAM,MAAM,oCAAoC,CAAC;AACxD,OAAO,OAAO,MAAM,qCAAqC,CAAC;AAE1D,OAAO,KAAK,EAAE,EAAgB,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAYjE,MAAM,gBAAgB,GAA0B;IAC9C,cAAc,CAAC,OAAO;IACtB,cAAc,CAAC,UAAU;IACzB,cAAc,CAAC,WAAW;IAC1B,cAAc,CAAC,QAAQ;IACvB,cAAc,CAAC,oBAAoB;IACnC,cAAc,CAAC,iBAAiB;IAChC,cAAc,CAAC,OAAO;IACtB,cAAc,CAAC,OAAO;IACtB,cAAc,CAAC,UAAU;CAC1B,CAAC;AAUF,MAAM,WAAW,GAAwB,CAAC,QAAiB,EAAe,EAAE;;IAC1E,IAAI,QAAQ,YAAY,SAAS,EAAE,CAAC;QAClC,OAAO;YACL,QAAQ,EAAE,cAAc,CAAC,OAAO;YAChC,KAAK,EAAE,CAAC,MAAA,QAAQ,CAAC,UAAU,mCAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;YAC7C,QAAQ,EAAE,CAAC,MAAA,QAAQ,CAAC,QAAQ,mCAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;SAC/C,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,YAAY,OAAO,EAAE,CAAC;QAChC,OAAO;YACL,QAAQ,EAAE,cAAc,CAAC,OAAO;YAChC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAC1B,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,YAAY,QAAQ,EAAE,CAAC;QACjC,OAAO;YACL,QAAQ,EAAE,cAAc,CAAC,UAAU;YACnC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAC1B,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,YAAY,WAAW,EAAE,CAAC;QACpC,OAAO;YACL,QAAQ,EAAE,cAAc,CAAC,WAAW;YACpC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAC1B,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,YAAY,QAAQ,EAAE,CAAC;QACjC,OAAO;YACL,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAC1B,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,YAAY,kBAAkB,EAAE,CAAC;QAC3C,OAAO;YACL,QAAQ,EAAE,cAAc,CAAC,oBAAoB;YAC7C,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAC1B,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,YAAY,eAAe,EAAE,CAAC;QACxC,OAAO;YACL,QAAQ,EAAE,cAAc,CAAC,iBAAiB;YAC1C,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAC1B,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,YAAY,MAAM,EAAE,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACvE,CAAC;IACD,IAAI,QAAQ,YAAY,OAAO,EAAE,CAAC;QAChC,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1E,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO;YACL,QAAQ,EAAE,cAAc,CAAC,OAAO;YAChC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAC1B,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACvE,CAAC,CAAC;AAIF,MAAM,UAAU,GAAuB,CAAC,KAAkB,EAAW,EAAE;IACrE,MAAM,QAAQ,GAAW,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,MAAM,GAAW,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAY,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;IACxE,MAAM,MAAM,GAAY,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE,CAAC;IAEvE,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,KAAK,cAAc,CAAC,OAAO;YACzB,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,QAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,KAAK,cAAc,CAAC,UAAU;YAC5B,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,QAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,KAAK,cAAc,CAAC,WAAW;YAC7B,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,KAAK,cAAc,CAAC,QAAQ;YAC1B,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvD,KAAK,cAAc,CAAC,oBAAoB;YACtC,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE,KAAK,cAAc,CAAC,iBAAiB;YACnC,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,KAAK,cAAc,CAAC,OAAO;YACzB,OAAO,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,KAAK,cAAc,CAAC,OAAO;YACzB,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,KAAK,cAAc,CAAC,UAAU;YAC5B,OAAO,IAAI,OAAO,EAAE,CAAC;QACvB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,YAAY,GAAyB,CACzC,KAAwB,EACV,EAAE;IAChB,MAAM,MAAM,GAAc,KAAK,CAAC,MAAM,CAAC;IAEvC,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjC,OAAO,yCAAK,CAAC;IACf,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;QACrC,OAAO,yCAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAgB,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAExE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,QAAQ,CAAC,QAAQ,CAClB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAY,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,uDAAuD;IACzD,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEnC,MAAM,KAAK,mCAAqB,QAAQ,KAAE,QAAQ,EAAE,aAAa,GAAE,CAAC;IAEpE,MAAM,iBAAiB,GACrB,KAAK,CAAC,QAAQ,KAAK,cAAc,CAAC,OAAO;QACzC,KAAK,CAAC,QAAQ,KAAK,cAAc,CAAC,UAAU,CAAC;IAC/C,MAAM,SAAS,GAAY,KAAK,CAAC,QAAQ,KAAK,cAAc,CAAC,OAAO,CAAC;IAIrE,MAAM,KAAK,GAAkB,CAAC,SAAsB,EAAQ,EAAE;;QAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAErC,MAAM,IAAI,qBAAuB,KAAK,CAAC,UAAU,CAAE,CAAC;QACpD,MAAM,KAAK,GAAY,UAAU,CAAC,SAAS,CAAC,CAAC;QAE7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAY,CAAC;QAClC,CAAC;QAED,MAAA,KAAK,CAAC,eAAe,sDAAG,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAC,wBAAwB;QACrC,oBAAC,gBAAgB,IACf,KAAK,EAAE,KAAK,CAAC,QAAQ,EACrB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,CAAC,YAA4B,EAAE,EAAE;gBACzC,KAAK,iCAAM,KAAK,KAAE,QAAQ,EAAE,YAAY,IAAG,CAAC;YAC9C,CAAC,GACD;QACD,CAAC,iBAAiB,IAAI,CACrB,6BAAK,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,gBAAgB;YACxE,6BAAK,SAAS,EAAC,gBAAgB;gBAC7B,+BACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,CAAsC,EAAE,EAAE;wBACnD,KAAK,iCAAM,KAAK,KAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,IAAG,CAAC;oBAC7C,CAAC,EACD,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,KAAK,EAAE,EAC7D,SAAS,EAAC,6OAA6O,GACvP,CACE;YACL,SAAS,IAAI,CACZ,6BAAK,SAAS,EAAC,gBAAgB;gBAC7B,+BACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,KAAK,CAAC,QAAQ,EACrB,QAAQ,EAAE,CAAC,CAAsC,EAAE,EAAE;wBACnD,KAAK,iCAAM,KAAK,KAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,IAAG,CAAC;oBAChD,CAAC,EACD,WAAW,EAAC,IAAI,EAChB,SAAS,EAAC,6OAA6O,GACvP,CACE,CACP,CACG,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import IconProp from "../../../Types/Icon/IconProp";
|
|
2
|
+
import Icon, { SizeProp } from "../Icon/Icon";
|
|
3
|
+
import { FilterOperatorLabel } from "./Types/FilterOperator";
|
|
4
|
+
import React, { useEffect, useRef, useState } from "react";
|
|
5
|
+
const OperatorSelector = (props) => {
|
|
6
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
7
|
+
const containerRef = useRef(null);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
const handleClickOutside = (event) => {
|
|
10
|
+
if (containerRef.current &&
|
|
11
|
+
!containerRef.current.contains(event.target)) {
|
|
12
|
+
setIsOpen(false);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
16
|
+
return () => {
|
|
17
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
18
|
+
};
|
|
19
|
+
}, []);
|
|
20
|
+
return (React.createElement("div", { className: "relative inline-block shrink-0", ref: containerRef },
|
|
21
|
+
React.createElement("button", { type: "button", onClick: () => {
|
|
22
|
+
setIsOpen((prev) => {
|
|
23
|
+
return !prev;
|
|
24
|
+
});
|
|
25
|
+
}, className: "inline-flex items-center justify-between gap-1.5 h-9 px-3 text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 border border-gray-300 rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 min-w-[130px]" },
|
|
26
|
+
React.createElement("span", { className: "truncate" }, FilterOperatorLabel[props.value]),
|
|
27
|
+
React.createElement(Icon, { icon: IconProp.ChevronDown, size: SizeProp.Smaller, className: "text-gray-400 shrink-0" })),
|
|
28
|
+
isOpen && (React.createElement("div", { className: "absolute z-20 mt-1 w-56 bg-white rounded-md shadow-lg border border-gray-200 py-1 max-h-60 overflow-auto" }, props.options.map((option) => {
|
|
29
|
+
const isSelected = option === props.value;
|
|
30
|
+
return (React.createElement("button", { key: option, type: "button", onClick: () => {
|
|
31
|
+
props.onChange(option);
|
|
32
|
+
setIsOpen(false);
|
|
33
|
+
}, className: isSelected
|
|
34
|
+
? "w-full text-left px-3 py-2 text-sm text-indigo-700 bg-indigo-50 hover:bg-indigo-100 flex items-center justify-between"
|
|
35
|
+
: "w-full text-left px-3 py-2 text-sm text-gray-700 hover:bg-gray-50 flex items-center justify-between" },
|
|
36
|
+
React.createElement("span", null, FilterOperatorLabel[option]),
|
|
37
|
+
isSelected && (React.createElement(Icon, { icon: IconProp.Check, size: SizeProp.Smaller, className: "text-indigo-600" }))));
|
|
38
|
+
})))));
|
|
39
|
+
};
|
|
40
|
+
export default OperatorSelector;
|
|
41
|
+
//# sourceMappingURL=OperatorSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperatorSelector.js","sourceRoot":"","sources":["../../../../../UI/Components/Filters/OperatorSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,8BAA8B,CAAC;AACpD,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAuB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,EAAgB,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQzE,MAAM,gBAAgB,GAA4C,CAChE,KAAqB,EACP,EAAE;IAChB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IACrD,MAAM,YAAY,GAChB,MAAM,CAAwB,IAAI,CAAC,CAAC;IAEtC,SAAS,CAAC,GAAG,EAAE;QAEb,MAAM,kBAAkB,GAA+B,CACrD,KAAiB,EACX,EAAE;YACR,IACE,YAAY,CAAC,OAAO;gBACpB,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EACpD,CAAC;gBACD,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,6BAAK,SAAS,EAAC,gCAAgC,EAAC,GAAG,EAAE,YAAY;QAC/D,gCACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;gBACZ,SAAS,CAAC,CAAC,IAAa,EAAE,EAAE;oBAC1B,OAAO,CAAC,IAAI,CAAC;gBACf,CAAC,CAAC,CAAC;YACL,CAAC,EACD,SAAS,EAAC,uQAAuQ;YAEjR,8BAAM,SAAS,EAAC,UAAU,IAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAQ;YACpE,oBAAC,IAAI,IACH,IAAI,EAAE,QAAQ,CAAC,WAAW,EAC1B,IAAI,EAAE,QAAQ,CAAC,OAAO,EACtB,SAAS,EAAC,wBAAwB,GAClC,CACK;QACR,MAAM,IAAI,CACT,6BAAK,SAAS,EAAC,0GAA0G,IACtH,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAsB,EAAE,EAAE;YAC5C,MAAM,UAAU,GAAY,MAAM,KAAK,KAAK,CAAC,KAAK,CAAC;YACnD,OAAO,CACL,gCACE,GAAG,EAAE,MAAM,EACX,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACvB,SAAS,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC,EACD,SAAS,EACP,UAAU;oBACR,CAAC,CAAC,uHAAuH;oBACzH,CAAC,CAAC,qGAAqG;gBAG3G,kCAAO,mBAAmB,CAAC,MAAM,CAAC,CAAQ;gBACzC,UAAU,IAAI,CACb,oBAAC,IAAI,IACH,IAAI,EAAE,QAAQ,CAAC,KAAK,EACpB,IAAI,EAAE,QAAQ,CAAC,OAAO,EACtB,SAAS,EAAC,iBAAiB,GAC3B,CACH,CACM,CACV,CAAC;QACJ,CAAC,CAAC,CACE,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,60 +1,137 @@
|
|
|
1
|
-
import Input, { InputType } from "../Input/Input";
|
|
2
1
|
import FieldType from "../Types/FieldType";
|
|
2
|
+
import FilterOperator from "./Types/FilterOperator";
|
|
3
|
+
import OperatorSelector from "./OperatorSelector";
|
|
3
4
|
import Search from "../../../Types/BaseDatabase/Search";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
5
|
+
import EqualTo from "../../../Types/BaseDatabase/EqualTo";
|
|
6
|
+
import NotEqual from "../../../Types/BaseDatabase/NotEqual";
|
|
7
|
+
import StartsWith from "../../../Types/BaseDatabase/StartsWith";
|
|
8
|
+
import EndsWith from "../../../Types/BaseDatabase/EndsWith";
|
|
9
|
+
import NotContains from "../../../Types/BaseDatabase/NotContains";
|
|
10
|
+
import IsNull from "../../../Types/BaseDatabase/IsNull";
|
|
11
|
+
import NotNull from "../../../Types/BaseDatabase/NotNull";
|
|
12
|
+
import React, { useEffect, useState } from "react";
|
|
13
|
+
const TEXT_FIELD_TYPES = [
|
|
14
|
+
FieldType.Text,
|
|
15
|
+
FieldType.LongText,
|
|
16
|
+
FieldType.Email,
|
|
17
|
+
FieldType.Phone,
|
|
18
|
+
FieldType.Name,
|
|
19
|
+
FieldType.Port,
|
|
20
|
+
FieldType.URL,
|
|
21
|
+
FieldType.Hostname,
|
|
22
|
+
FieldType.ObjectID,
|
|
23
|
+
];
|
|
24
|
+
const TEXT_OPERATORS = [
|
|
25
|
+
FilterOperator.Contains,
|
|
26
|
+
FilterOperator.DoesNotContain,
|
|
27
|
+
FilterOperator.EqualTo,
|
|
28
|
+
FilterOperator.NotEqualTo,
|
|
29
|
+
FilterOperator.StartsWith,
|
|
30
|
+
FilterOperator.EndsWith,
|
|
31
|
+
FilterOperator.IsEmpty,
|
|
32
|
+
FilterOperator.IsNotEmpty,
|
|
33
|
+
];
|
|
34
|
+
const detectCurrentState = (rawValue) => {
|
|
35
|
+
if (rawValue instanceof Search) {
|
|
36
|
+
return { operator: FilterOperator.Contains, value: rawValue.value };
|
|
37
|
+
}
|
|
38
|
+
if (rawValue instanceof NotContains) {
|
|
39
|
+
return { operator: FilterOperator.DoesNotContain, value: rawValue.value };
|
|
40
|
+
}
|
|
41
|
+
if (rawValue instanceof StartsWith) {
|
|
42
|
+
return { operator: FilterOperator.StartsWith, value: rawValue.value };
|
|
43
|
+
}
|
|
44
|
+
if (rawValue instanceof EndsWith) {
|
|
45
|
+
return { operator: FilterOperator.EndsWith, value: rawValue.value };
|
|
46
|
+
}
|
|
47
|
+
if (rawValue instanceof EqualTo) {
|
|
48
|
+
return { operator: FilterOperator.EqualTo, value: rawValue.toString() };
|
|
49
|
+
}
|
|
50
|
+
if (rawValue instanceof NotEqual) {
|
|
51
|
+
return { operator: FilterOperator.NotEqualTo, value: rawValue.toString() };
|
|
52
|
+
}
|
|
53
|
+
if (rawValue instanceof IsNull) {
|
|
54
|
+
return { operator: FilterOperator.IsEmpty, value: "" };
|
|
55
|
+
}
|
|
56
|
+
if (rawValue instanceof NotNull) {
|
|
57
|
+
return { operator: FilterOperator.IsNotEmpty, value: "" };
|
|
58
|
+
}
|
|
59
|
+
if (typeof rawValue === "string" && rawValue.length > 0) {
|
|
60
|
+
// Backward compatibility for plain string values.
|
|
61
|
+
return { operator: FilterOperator.Contains, value: rawValue };
|
|
62
|
+
}
|
|
63
|
+
return { operator: FilterOperator.Contains, value: "" };
|
|
64
|
+
};
|
|
65
|
+
const buildQueryValue = (operator, value) => {
|
|
66
|
+
switch (operator) {
|
|
67
|
+
case FilterOperator.Contains:
|
|
68
|
+
return value ? new Search(value) : undefined;
|
|
69
|
+
case FilterOperator.DoesNotContain:
|
|
70
|
+
return value ? new NotContains(value) : undefined;
|
|
71
|
+
case FilterOperator.StartsWith:
|
|
72
|
+
return value ? new StartsWith(value) : undefined;
|
|
73
|
+
case FilterOperator.EndsWith:
|
|
74
|
+
return value ? new EndsWith(value) : undefined;
|
|
75
|
+
case FilterOperator.EqualTo:
|
|
76
|
+
return value ? new EqualTo(value) : undefined;
|
|
77
|
+
case FilterOperator.NotEqualTo:
|
|
78
|
+
return value ? new NotEqual(value) : undefined;
|
|
79
|
+
case FilterOperator.IsEmpty:
|
|
80
|
+
return new IsNull();
|
|
81
|
+
case FilterOperator.IsNotEmpty:
|
|
82
|
+
return new NotNull();
|
|
83
|
+
default:
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
7
87
|
const TextFilter = (props) => {
|
|
8
88
|
const filter = props.filter;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}, initialValue: (filterData[filter.key] || "").toString(), placeholder: `Filter by ${filter.title}`, type: inputType }));
|
|
56
|
-
}
|
|
57
|
-
return React.createElement(React.Fragment, null);
|
|
89
|
+
if (filter.filterDropdownOptions) {
|
|
90
|
+
return React.createElement(React.Fragment, null);
|
|
91
|
+
}
|
|
92
|
+
if (!TEXT_FIELD_TYPES.includes(filter.type)) {
|
|
93
|
+
return React.createElement(React.Fragment, null);
|
|
94
|
+
}
|
|
95
|
+
const detected = detectCurrentState(props.filterData[filter.key]);
|
|
96
|
+
// Keep the operator locally so the user's choice persists even when no
|
|
97
|
+
// value has been typed yet (otherwise buildQueryValue returns undefined,
|
|
98
|
+
// the filter is deleted, and the operator resets on re-render).
|
|
99
|
+
const [localOperator, setLocalOperator] = useState(detected.operator);
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
const raw = props.filterData[filter.key];
|
|
102
|
+
if (raw !== undefined && raw !== null) {
|
|
103
|
+
setLocalOperator(detected.operator);
|
|
104
|
+
}
|
|
105
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
106
|
+
}, [props.filterData[filter.key]]);
|
|
107
|
+
const operator = localOperator;
|
|
108
|
+
const value = detected.value;
|
|
109
|
+
const valuelessOperator = operator === FilterOperator.IsEmpty ||
|
|
110
|
+
operator === FilterOperator.IsNotEmpty;
|
|
111
|
+
const apply = (data) => {
|
|
112
|
+
var _a;
|
|
113
|
+
if (!filter.key) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
setLocalOperator(data.operator);
|
|
117
|
+
const next = Object.assign({}, props.filterData);
|
|
118
|
+
const built = buildQueryValue(data.operator, data.value);
|
|
119
|
+
if (built === undefined) {
|
|
120
|
+
delete next[filter.key];
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
next[filter.key] = built;
|
|
124
|
+
}
|
|
125
|
+
(_a = props.onFilterChanged) === null || _a === void 0 ? void 0 : _a.call(props, next);
|
|
126
|
+
};
|
|
127
|
+
return (React.createElement("div", { className: "flex gap-2 items-start" },
|
|
128
|
+
React.createElement(OperatorSelector, { value: operator, options: TEXT_OPERATORS, onChange: (nextOperator) => {
|
|
129
|
+
apply({ operator: nextOperator, value });
|
|
130
|
+
} }),
|
|
131
|
+
!valuelessOperator && (React.createElement("div", { className: "flex-1 min-w-0" },
|
|
132
|
+
React.createElement("input", { type: "text", value: value, onChange: (e) => {
|
|
133
|
+
apply({ operator, value: e.target.value });
|
|
134
|
+
}, placeholder: `Filter by ${filter.title}`, className: "block w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-3 text-sm placeholder-gray-500 focus:border-indigo-500 focus:text-gray-900 focus:placeholder-gray-400 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm" })))));
|
|
58
135
|
};
|
|
59
136
|
export default TextFilter;
|
|
60
137
|
//# sourceMappingURL=TextFilter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextFilter.js","sourceRoot":"","sources":["../../../../../UI/Components/Filters/TextFilter.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"TextFilter.js","sourceRoot":"","sources":["../../../../../UI/Components/Filters/TextFilter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operators that a user can pick in the filter UI. Not every operator is
|
|
3
|
+
* valid for every field type — use `getOperatorsForFieldType` to get the list
|
|
4
|
+
* that applies to a given field.
|
|
5
|
+
*/
|
|
6
|
+
var FilterOperator;
|
|
7
|
+
(function (FilterOperator) {
|
|
8
|
+
// Text
|
|
9
|
+
FilterOperator["Contains"] = "contains";
|
|
10
|
+
FilterOperator["DoesNotContain"] = "does_not_contain";
|
|
11
|
+
FilterOperator["StartsWith"] = "starts_with";
|
|
12
|
+
FilterOperator["EndsWith"] = "ends_with";
|
|
13
|
+
// Comparison (shared across text / number / date)
|
|
14
|
+
FilterOperator["EqualTo"] = "equal_to";
|
|
15
|
+
FilterOperator["NotEqualTo"] = "not_equal_to";
|
|
16
|
+
FilterOperator["GreaterThan"] = "greater_than";
|
|
17
|
+
FilterOperator["LessThan"] = "less_than";
|
|
18
|
+
FilterOperator["GreaterThanOrEqualTo"] = "greater_than_or_equal_to";
|
|
19
|
+
FilterOperator["LessThanOrEqualTo"] = "less_than_or_equal_to";
|
|
20
|
+
FilterOperator["Between"] = "between";
|
|
21
|
+
// Date-specific aliases for comparison
|
|
22
|
+
FilterOperator["Before"] = "before";
|
|
23
|
+
FilterOperator["After"] = "after";
|
|
24
|
+
// Entity / single-value selection
|
|
25
|
+
FilterOperator["Is"] = "is";
|
|
26
|
+
FilterOperator["IsNot"] = "is_not";
|
|
27
|
+
// Entity array selection
|
|
28
|
+
FilterOperator["HasAnyOf"] = "has_any_of";
|
|
29
|
+
FilterOperator["HasAllOf"] = "has_all_of";
|
|
30
|
+
FilterOperator["HasNoneOf"] = "has_none_of";
|
|
31
|
+
// Presence
|
|
32
|
+
FilterOperator["IsEmpty"] = "is_empty";
|
|
33
|
+
FilterOperator["IsNotEmpty"] = "is_not_empty";
|
|
34
|
+
// Boolean
|
|
35
|
+
FilterOperator["IsTrue"] = "is_true";
|
|
36
|
+
FilterOperator["IsFalse"] = "is_false";
|
|
37
|
+
})(FilterOperator || (FilterOperator = {}));
|
|
38
|
+
export default FilterOperator;
|
|
39
|
+
export const FilterOperatorLabel = {
|
|
40
|
+
[FilterOperator.Contains]: "contains",
|
|
41
|
+
[FilterOperator.DoesNotContain]: "does not contain",
|
|
42
|
+
[FilterOperator.StartsWith]: "starts with",
|
|
43
|
+
[FilterOperator.EndsWith]: "ends with",
|
|
44
|
+
[FilterOperator.EqualTo]: "equals",
|
|
45
|
+
[FilterOperator.NotEqualTo]: "does not equal",
|
|
46
|
+
[FilterOperator.GreaterThan]: "is greater than",
|
|
47
|
+
[FilterOperator.LessThan]: "is less than",
|
|
48
|
+
[FilterOperator.GreaterThanOrEqualTo]: "is greater than or equal to",
|
|
49
|
+
[FilterOperator.LessThanOrEqualTo]: "is less than or equal to",
|
|
50
|
+
[FilterOperator.Between]: "is between",
|
|
51
|
+
[FilterOperator.Before]: "is before",
|
|
52
|
+
[FilterOperator.After]: "is after",
|
|
53
|
+
[FilterOperator.Is]: "is",
|
|
54
|
+
[FilterOperator.IsNot]: "is not",
|
|
55
|
+
[FilterOperator.HasAnyOf]: "has any of",
|
|
56
|
+
[FilterOperator.HasAllOf]: "has all of",
|
|
57
|
+
[FilterOperator.HasNoneOf]: "has none of",
|
|
58
|
+
[FilterOperator.IsEmpty]: "is empty",
|
|
59
|
+
[FilterOperator.IsNotEmpty]: "is not empty",
|
|
60
|
+
[FilterOperator.IsTrue]: "is true",
|
|
61
|
+
[FilterOperator.IsFalse]: "is false",
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=FilterOperator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterOperator.js","sourceRoot":"","sources":["../../../../../../UI/Components/Filters/Types/FilterOperator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,IAAK,cAoCJ;AApCD,WAAK,cAAc;IACjB,OAAO;IACP,uCAAqB,CAAA;IACrB,qDAAmC,CAAA;IACnC,4CAA0B,CAAA;IAC1B,wCAAsB,CAAA;IAEtB,kDAAkD;IAClD,sCAAoB,CAAA;IACpB,6CAA2B,CAAA;IAC3B,8CAA4B,CAAA;IAC5B,wCAAsB,CAAA;IACtB,mEAAiD,CAAA;IACjD,6DAA2C,CAAA;IAC3C,qCAAmB,CAAA;IAEnB,uCAAuC;IACvC,mCAAiB,CAAA;IACjB,iCAAe,CAAA;IAEf,kCAAkC;IAClC,2BAAS,CAAA;IACT,kCAAgB,CAAA;IAEhB,yBAAyB;IACzB,yCAAuB,CAAA;IACvB,yCAAuB,CAAA;IACvB,2CAAyB,CAAA;IAEzB,WAAW;IACX,sCAAoB,CAAA;IACpB,6CAA2B,CAAA;IAE3B,UAAU;IACV,oCAAkB,CAAA;IAClB,sCAAoB,CAAA;AACtB,CAAC,EApCI,cAAc,KAAd,cAAc,QAoClB;AAED,eAAe,cAAc,CAAC;AAM9B,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,UAAU;IACrC,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,kBAAkB;IACnD,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,aAAa;IAC1C,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,WAAW;IACtC,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,QAAQ;IAClC,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,gBAAgB;IAC7C,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,iBAAiB;IAC/C,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,cAAc;IACzC,CAAC,cAAc,CAAC,oBAAoB,CAAC,EAAE,6BAA6B;IACpE,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,0BAA0B;IAC9D,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,YAAY;IACtC,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW;IACpC,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU;IAClC,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,IAAI;IACzB,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,QAAQ;IAChC,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,YAAY;IACvC,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,YAAY;IACvC,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,aAAa;IACzC,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,UAAU;IACpC,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,cAAc;IAC3C,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS;IAClC,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,UAAU;CACrC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Includes from "../../../Types/BaseDatabase/Includes";
|
|
2
|
+
import QueryOperator from "../../../Types/BaseDatabase/QueryOperator";
|
|
2
3
|
import { API_DOCS_URL, BILLING_ENABLED, getAllEnvVars } from "../../Config";
|
|
3
4
|
import API from "../../Utils/API/API";
|
|
4
5
|
import { Logger } from "../../Utils/Logger";
|
|
@@ -902,6 +903,12 @@ const BaseModelTable = (props) => {
|
|
|
902
903
|
if (Array.isArray(filterData[key])) {
|
|
903
904
|
newQuery[key] = new Includes(filterData[key]);
|
|
904
905
|
}
|
|
906
|
+
// Pass any QueryOperator instance (IncludesAll, IncludesNone, StartsWith,
|
|
907
|
+
// EndsWith, NotContains, EqualTo, NotEqual, GreaterThan, LessThan,
|
|
908
|
+
// InBetween, IsNull, NotNull, ...) through to the query as-is.
|
|
909
|
+
if (filterData[key] instanceof QueryOperator) {
|
|
910
|
+
newQuery[key] = filterData[key];
|
|
911
|
+
}
|
|
905
912
|
}
|
|
906
913
|
setQuery(Object.assign({}, newQuery));
|
|
907
914
|
};
|