1
2
3
4
5
6
7
8
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
import { FILTER_COLUMNS, OPERATORS } from '@/lib/constants';
import { safeDecodeURIComponent } from '@/lib/url';
import { useFields } from './useFields';
import { useMessages } from './useMessages';
import { useNavigation } from './useNavigation';
export function useFilters() {
const { formatMessage, labels } = useMessages();
const { query } = useNavigation();
const { fields } = useFields();
const operators = [
{ name: 'eq', type: 'string', label: formatMessage(labels.is) },
{ name: 'neq', type: 'string', label: formatMessage(labels.isNot) },
{ name: 'c', type: 'string', label: formatMessage(labels.contains) },
{ name: 'dnc', type: 'string', label: formatMessage(labels.doesNotContain) },
{ name: 'i', type: 'array', label: formatMessage(labels.includes) },
{ name: 'dni', type: 'array', label: formatMessage(labels.doesNotInclude) },
{ name: 't', type: 'boolean', label: formatMessage(labels.isTrue) },
{ name: 'f', type: 'boolean', label: formatMessage(labels.isFalse) },
{ name: 'eq', type: 'number', label: formatMessage(labels.is) },
{ name: 'neq', type: 'number', label: formatMessage(labels.isNot) },
{ name: 'gt', type: 'number', label: formatMessage(labels.greaterThan) },
{ name: 'lt', type: 'number', label: formatMessage(labels.lessThan) },
{ name: 'gte', type: 'number', label: formatMessage(labels.greaterThanEquals) },
{ name: 'lte', type: 'number', label: formatMessage(labels.lessThanEquals) },
{ name: 'bf', type: 'date', label: formatMessage(labels.before) },
{ name: 'af', type: 'date', label: formatMessage(labels.after) },
{ name: 'eq', type: 'uuid', label: formatMessage(labels.is) },
];
const operatorLabels = {
[OPERATORS.equals]: formatMessage(labels.is),
[OPERATORS.notEquals]: formatMessage(labels.isNot),
[OPERATORS.set]: formatMessage(labels.isSet),
[OPERATORS.notSet]: formatMessage(labels.isNotSet),
[OPERATORS.contains]: formatMessage(labels.contains),
[OPERATORS.doesNotContain]: formatMessage(labels.doesNotContain),
[OPERATORS.true]: formatMessage(labels.true),
[OPERATORS.false]: formatMessage(labels.false),
[OPERATORS.greaterThan]: formatMessage(labels.greaterThan),
[OPERATORS.lessThan]: formatMessage(labels.lessThan),
[OPERATORS.greaterThanEquals]: formatMessage(labels.greaterThanEquals),
[OPERATORS.lessThanEquals]: formatMessage(labels.lessThanEquals),
[OPERATORS.before]: formatMessage(labels.before),
[OPERATORS.after]: formatMessage(labels.after),
};
const typeFilters = {
string: [OPERATORS.equals, OPERATORS.notEquals, OPERATORS.contains, OPERATORS.doesNotContain],
array: [OPERATORS.contains, OPERATORS.doesNotContain],
boolean: [OPERATORS.true, OPERATORS.false],
number: [
OPERATORS.equals,
OPERATORS.notEquals,
OPERATORS.greaterThan,
OPERATORS.lessThan,
OPERATORS.greaterThanEquals,
OPERATORS.lessThanEquals,
],
date: [OPERATORS.before, OPERATORS.after],
uuid: [OPERATORS.equals],
};
const filters = Object.keys(query).reduce((arr, key) => {
if (FILTER_COLUMNS[key]) {
let operator = 'eq';
let value = safeDecodeURIComponent(query[key]);
const label = fields.find(({ name }) => name === key)?.label;
const match = value.match(/^([a-z]+)\.(.*)/);
if (match) {
operator = match[1];
value = match[2];
}
return arr.concat({
name: key,
operator,
value,
label,
});
}
return arr;
}, []);
const getFilters = (type: string) => {
return (
typeFilters[type]?.map((key: string | number) => ({
type,
value: key,
label: operatorLabels[key],
})) ?? []
);
};
return { fields, operators, filters, operatorLabels, typeFilters, getFilters };
}
|