@leav/ui 1.14.0-2fd28db5 → 1.14.0-3c4d7f0f

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.
@@ -14,7 +14,10 @@ const _getDateRequestFilters = ({ field, condition, value }) => {
14
14
  {
15
15
  field,
16
16
  condition,
17
- value: JSON.stringify({ from, to }),
17
+ value: JSON.stringify({
18
+ from,
19
+ to,
20
+ }),
18
21
  },
19
22
  ];
20
23
  case RecordFilterCondition.NOT_EQUAL:
@@ -34,20 +37,26 @@ const _getDateRequestFilters = ({ field, condition, value }) => {
34
37
  },
35
38
  ];
36
39
  default:
37
- return [{ field, condition, value }];
40
+ return [
41
+ {
42
+ field,
43
+ condition,
44
+ value,
45
+ },
46
+ ];
38
47
  }
39
48
  };
40
- const _getBooleanRequestFilters = ({ field, condition, value }) => {
41
- if (value === 'false') {
49
+ const _getBooleanRequestFilters = (filter) => {
50
+ if (filter.value === 'false') {
42
51
  return [
43
52
  {
44
- field,
53
+ field: filter.field,
45
54
  condition: AttributeConditionFilter.NOT_EQUAL,
46
55
  value: 'true',
47
56
  },
48
57
  ];
49
58
  }
50
- return [{ field, condition, value }];
59
+ return [{ field: filter.field, condition: filter.condition, value: filter.value }];
51
60
  };
52
61
  const _addValuesListForFilters = (valuesList) => [
53
62
  { operator: RecordFilterOperator.OPEN_BRACKET },
@@ -61,35 +70,48 @@ const _addValuesListForFilters = (valuesList) => [
61
70
  { operator: RecordFilterOperator.CLOSE_BRACKET },
62
71
  ];
63
72
  const _generateConditionsFromMultipleValues = (filter) => {
64
- const { value, condition } = filter;
73
+ const value = filter.value;
65
74
  const nodes = isUIFilterTree(filter) ? filter.nodes : undefined;
66
- if (!value?.length) {
75
+ if (!value || value.length === 0) {
67
76
  return [];
68
77
  }
69
- const multiValueOperator = condition === RecordFilterCondition.NOT_EQUAL ? RecordFilterOperator.AND : RecordFilterOperator.OR;
70
- const conditions = value.map((recordId, idx) => ({
71
- value: recordId,
72
- condition,
73
- field: nodes?.length
74
- ? `${filter.attribute.id}.${nodes[0].libraryId}.id`
75
- : Array.isArray(filter.field)
76
- ? filter.field[idx]
77
- : filter.field,
78
- }));
79
- if (conditions.length === 1) {
80
- return conditions;
81
- }
82
- return [
83
- { operator: RecordFilterOperator.OPEN_BRACKET },
84
- ...interleaveElement({ operator: multiValueOperator }, conditions.map(c => [c])),
85
- { operator: RecordFilterOperator.CLOSE_BRACKET },
86
- ];
78
+ const filtersWithOperators = [];
79
+ value.forEach((recordId, idx) => {
80
+ if (idx === 0 && value.length > 1) {
81
+ filtersWithOperators.push({ operator: RecordFilterOperator.OPEN_BRACKET });
82
+ }
83
+ if (nodes?.length > 0) {
84
+ filtersWithOperators.push({
85
+ value: recordId,
86
+ condition: filter.condition,
87
+ field: `${filter.attribute.id}.${nodes[0].libraryId}.id`,
88
+ });
89
+ }
90
+ else {
91
+ filtersWithOperators.push({
92
+ value: recordId,
93
+ condition: filter.condition,
94
+ field: Array.isArray(filter.field) ? filter.field[idx] : filter.field,
95
+ });
96
+ }
97
+ if (idx < value.length - 1) {
98
+ filtersWithOperators.push({
99
+ operator: filter.condition === RecordFilterCondition.NOT_EQUAL
100
+ ? RecordFilterOperator.AND
101
+ : RecordFilterOperator.OR,
102
+ });
103
+ }
104
+ if (value.length > 1 && idx >= value.length - 1) {
105
+ filtersWithOperators.push({ operator: RecordFilterOperator.CLOSE_BRACKET });
106
+ }
107
+ });
108
+ return filtersWithOperators;
87
109
  };
88
110
  const _addEmptyCondition = (baseConditions, filter) => {
89
111
  const hasValue = filter.value !== null &&
90
112
  filter.value !== undefined &&
91
113
  (!Array.isArray(filter.value) || filter.value.length > 0);
92
- // field can contain multiple entries or be absent — fall back to attribute id
114
+ // patch because field contains multiple informations & can be empty
93
115
  const field = (Array.isArray(filter.field) ? filter.field[0] : filter.field) || filter.attribute.id;
94
116
  const emptyCondition = {
95
117
  field,
@@ -99,103 +121,114 @@ const _addEmptyCondition = (baseConditions, filter) => {
99
121
  if (!hasValue) {
100
122
  return [emptyCondition];
101
123
  }
102
- return [
103
- { operator: RecordFilterOperator.OPEN_BRACKET },
104
- ...baseConditions,
105
- { operator: RecordFilterOperator.OR },
106
- emptyCondition,
107
- { operator: RecordFilterOperator.CLOSE_BRACKET },
108
- ];
109
- };
110
- const _applyEmptyValues = (baseConditions, filter) => filter.withEmptyValues ? _addEmptyCondition(baseConditions, filter) : baseConditions;
111
- const _filterIsActive = (filter) => {
112
- if (filter.withEmptyValues) {
113
- return true;
114
- }
115
- if (isUIFilterTree(filter)) {
116
- // Skip if: (Toggle ON + no user selection) OR (No user selection + no initial value)
117
- const noUserSelectionNoInitialValue = filter.userNodes == null && (!filter.value || filter.value.length === 0);
118
- const toggleOnNoUserSelection = filter.includeHiddenOptions && filter.userNodes == null;
119
- return !(noUserSelectionNoInitialValue || toggleOnNoUserSelection);
120
- }
121
- if (isUIFilterWithSmartFilter(filter)) {
122
- return ((filter.value !== null && filter.value.length > 0) ||
123
- !!(filter.condition && nullValueConditions.includes(filter.condition)));
124
- }
125
- if (isUIFilterThrough(filter)) {
126
- return !!(filter.subField &&
127
- filter.subCondition &&
128
- (filter.value !== null || nullValueConditions.includes(filter.subCondition)));
129
- }
130
- if (isUIFilterValueList(filter)) {
131
- return !!((filter.condition && filter.value?.length) ||
132
- (filter.condition && nullValueConditions.includes(filter.condition)));
124
+ else {
125
+ return [
126
+ { operator: RecordFilterOperator.OPEN_BRACKET },
127
+ ...baseConditions,
128
+ { operator: RecordFilterOperator.OR },
129
+ emptyCondition,
130
+ { operator: RecordFilterOperator.CLOSE_BRACKET },
131
+ ];
133
132
  }
134
- return filter.value !== null || !!(filter.condition && nullValueConditions.includes(filter.condition));
135
133
  };
136
- const _filterToRecordInputs = (filter) => {
137
- if (isUIFilterValueList(filter) || isUIFilterTree(filter) || isUIFilterWithSmartFilter(filter)) {
138
- const field = (Array.isArray(filter.field) ? filter.field[0] : filter.field) || filter.attribute.id;
139
- if (filter.condition && nullValueConditions.includes(filter.condition)) {
140
- const baseConditions = [
141
- {
142
- field,
143
- condition: filter.condition,
144
- value: null,
145
- },
146
- ];
147
- return _applyEmptyValues(baseConditions, filter);
134
+ export const prepareFiltersForRequest = (filters, filtersOperator, valuesList) => {
135
+ const interleaveFilter = interleaveElement({ operator: filtersOperator === 'OR' ? RecordFilterOperator.OR : RecordFilterOperator.AND }, filters
136
+ .filter(filter => {
137
+ if (filter.withEmptyValues) {
138
+ return true;
148
139
  }
149
140
  if (isUIFilterTree(filter)) {
150
- // No user selection (null or undefined): add IS_EMPTY to filters
151
- // TODO : include IS_EMPTY to permissions
152
- if (filter.userNodes == null) {
153
- if (filter.withEmptyValues) {
154
- return [{ field, condition: RecordFilterCondition.IS_EMPTY, value: null }];
141
+ // Skip if: (Toggle ON + no user selection) OR (No user selection + no initial value)
142
+ const noUserSelectionNoInitialValue = filter.userNodes == null && (!filter.value || filter.value.length === 0);
143
+ const toggleOnNoUserSelection = filter.includeHiddenOptions && filter.userNodes == null;
144
+ return !(noUserSelectionNoInitialValue || toggleOnNoUserSelection);
145
+ }
146
+ if (isUIFilterWithSmartFilter(filter)) {
147
+ return ((filter.value !== null && filter.value.length > 0) ||
148
+ (filter.condition && nullValueConditions.includes(filter.condition)));
149
+ }
150
+ if (isUIFilterThrough(filter)) {
151
+ return (filter.subField &&
152
+ filter.subCondition &&
153
+ (filter.value !== null || nullValueConditions.includes(filter.subCondition)));
154
+ }
155
+ if (isUIFilterValueList(filter)) {
156
+ return ((!!filter.condition && filter.value?.length) ||
157
+ (filter.condition && nullValueConditions.includes(filter.condition)));
158
+ }
159
+ return filter.value !== null || (filter.condition && nullValueConditions.includes(filter.condition));
160
+ })
161
+ .map(filter => {
162
+ if (isUIFilterTree(filter)) {
163
+ return filter;
164
+ }
165
+ const condition = filter.condition === AttributeConditionFilter.THROUGH ? filter.subCondition : filter.condition;
166
+ let field = filter.condition === AttributeConditionFilter.THROUGH
167
+ ? `${filter.field}.${filter.subField}`
168
+ : filter.field;
169
+ // When a link attribute has a values list, we must filter on the linked record id
170
+ if (isUIFilterLinkWithValueList(filter) && typeof field === 'string' && !field.endsWith('.id')) {
171
+ field = `${field}.id`;
172
+ }
173
+ return { ...filter, condition, field };
174
+ })
175
+ .map(filter => {
176
+ //@ts-ignore typscript does not recognize filter as a UIFilter
177
+ if (isUIFilterValueList(filter) || isUIFilterTree(filter) || isUIFilterWithSmartFilter(filter)) {
178
+ const field = (Array.isArray(filter.field) ? filter.field[0] : filter.field) || filter.attribute.id;
179
+ if (filter.condition && nullValueConditions.includes(filter.condition)) {
180
+ const baseConditions = [
181
+ {
182
+ field,
183
+ condition: filter.condition,
184
+ value: null,
185
+ },
186
+ ];
187
+ return !filter.withEmptyValues
188
+ ? baseConditions
189
+ : _addEmptyCondition(baseConditions, filter);
190
+ }
191
+ if (isUIFilterTree(filter)) {
192
+ // No user selection (null or undefined): add IS_EMPTY to filters
193
+ // TODO : include IS_EMPTY to permissions
194
+ if (filter.userNodes == null) {
195
+ if (filter.withEmptyValues) {
196
+ return [{ field, condition: RecordFilterCondition.IS_EMPTY, value: null }];
197
+ }
198
+ const baseConditions = _generateConditionsFromMultipleValues(filter);
199
+ return _addEmptyCondition(baseConditions, filter);
155
200
  }
156
- const baseConditions = _generateConditionsFromMultipleValues(filter);
157
- return _addEmptyCondition(baseConditions, filter);
158
201
  }
202
+ const baseConditions = _generateConditionsFromMultipleValues(filter);
203
+ return !filter.withEmptyValues
204
+ ? baseConditions
205
+ : _addEmptyCondition(baseConditions, filter);
159
206
  }
160
- const baseConditions = _generateConditionsFromMultipleValues(filter);
161
- return _applyEmptyValues(baseConditions, filter);
162
- }
163
- // Normalize condition and field for THROUGH and link-with-value-list filters
164
- const condition = filter.condition === AttributeConditionFilter.THROUGH
165
- ? filter.subCondition
166
- : filter.condition;
167
- let field = filter.condition === AttributeConditionFilter.THROUGH
168
- ? `${filter.field}.${filter.subField}`
169
- : filter.field;
170
- // When a link attribute has a values list, we must filter on the linked record id
171
- if (isUIFilterLinkWithValueList(filter) && typeof field === 'string' && !field.endsWith('.id')) {
172
- field = `${field}.id`;
173
- }
174
- if (isUIFilterStandard(filter)) {
175
- switch (filter.attribute.format) {
176
- case AttributeFormat.date:
177
- return _getDateRequestFilters({ ...filter, condition, field });
178
- case AttributeFormat.boolean:
179
- return _getBooleanRequestFilters({ ...filter, condition, field });
180
- default:
181
- break;
207
+ if (isUIFilterStandard(filter)) {
208
+ switch (filter.attribute.format) {
209
+ case AttributeFormat.date:
210
+ return _getDateRequestFilters(filter);
211
+ case AttributeFormat.boolean:
212
+ return _getBooleanRequestFilters(filter);
213
+ default:
214
+ break;
215
+ }
182
216
  }
183
- }
184
- const baseConditions = [
185
- {
186
- field: field,
187
- condition: condition,
188
- value: filter.value,
189
- },
190
- ];
191
- return _applyEmptyValues(baseConditions, filter);
192
- };
193
- export const prepareFiltersForRequest = (filters, filtersOperator, valuesList) => {
194
- const operator = filtersOperator === 'OR' ? RecordFilterOperator.OR : RecordFilterOperator.AND;
195
- const recordFilters = interleaveElement({ operator }, filters.filter(_filterIsActive).map(_filterToRecordInputs));
217
+ const filterWithStringValue = filter;
218
+ const baseConditions = [
219
+ {
220
+ field: filterWithStringValue.field,
221
+ condition: filterWithStringValue.condition,
222
+ value: filterWithStringValue.value,
223
+ },
224
+ ];
225
+ return !filter.withEmptyValues
226
+ ? baseConditions
227
+ : _addEmptyCondition(baseConditions, filter);
228
+ }));
196
229
  return [
197
- ...recordFilters,
198
- ...(recordFilters.length > 0 && valuesList ? [{ operator: RecordFilterOperator.AND }] : []),
230
+ ...interleaveFilter,
231
+ ...(interleaveFilter.length > 0 && valuesList ? [{ operator: RecordFilterOperator.AND }] : []),
199
232
  ...(valuesList ? _addValuesListForFilters(valuesList) : []),
200
233
  ];
201
234
  };
@@ -1 +1 @@
1
- {"version":3,"file":"prepareFiltersForRequest.js","sourceRoot":"","sources":["../../../src/components/Filters/prepareFiltersForRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import dayjs from 'dayjs';\nimport {AttributeFormat, RecordFilterCondition, type RecordFilterInput, RecordFilterOperator} from '_ui/_gqlTypes';\nimport {interleaveElement} from '_ui/_utils/interleaveElement';\nimport {AttributeConditionFilter} from '_ui/types';\nimport {\n type UIFilter,\n type IUIFilterLink,\n type IUIFilterStandard,\n type IUIFilterThrough,\n type IUIFilterTree,\n isUIFilterStandard,\n isUIFilterThrough,\n isUIFilterTree,\n isUIFilterValueList,\n type IUIFilterValueList,\n type FiltersOperator,\n isUIFilterLinkWithValueList,\n isUIFilterWithSmartFilter,\n type IUIFilterSmartFiler,\n} from './_types';\nimport {nullValueConditions} from './conditionsHelper';\n\nexport const dateValuesSeparator = '\\n';\n\nconst _getDateAtNoon = (date: number): string => dayjs.unix(Number(date)).add(12, 'hour').unix().toString();\n\nconst _getDateRequestFilters = ({field, condition, value}: IUIFilterStandard): RecordFilterInput[] => {\n switch (condition) {\n case RecordFilterCondition.BETWEEN:\n const [from, to] = value!.split(dateValuesSeparator);\n return [\n {\n field,\n condition,\n value: JSON.stringify({from, to}),\n },\n ];\n case RecordFilterCondition.NOT_EQUAL:\n return [\n {\n field,\n condition: RecordFilterCondition.NOT_EQUAL,\n value: _getDateAtNoon(Number(value)),\n },\n ];\n case RecordFilterCondition.EQUAL:\n return [\n {\n field,\n condition,\n value: _getDateAtNoon(Number(value)),\n },\n ];\n default:\n return [{field, condition, value}];\n }\n};\n\nconst _getBooleanRequestFilters = ({field, condition, value}: IUIFilterStandard): RecordFilterInput[] => {\n if (value === 'false') {\n return [\n {\n field,\n condition: AttributeConditionFilter.NOT_EQUAL,\n value: 'true',\n },\n ];\n }\n return [{field, condition, value}];\n};\n\nconst _addValuesListForFilters = (valuesList: string[]): RecordFilterInput[] => [\n {operator: RecordFilterOperator.OPEN_BRACKET},\n ...(interleaveElement(\n {operator: RecordFilterOperator.OR},\n valuesList.map(value => [\n {\n field: 'id',\n condition: AttributeConditionFilter.EQUAL,\n value,\n },\n ]),\n ) as RecordFilterInput[]),\n {operator: RecordFilterOperator.CLOSE_BRACKET},\n];\n\nconst _generateConditionsFromMultipleValues = (\n filter: IUIFilterTree | IUIFilterValueList | IUIFilterSmartFiler,\n): RecordFilterInput[] => {\n const {value, condition} = filter;\n const nodes = isUIFilterTree(filter) ? filter.nodes : undefined;\n\n if (!value?.length) {\n return [];\n }\n\n const multiValueOperator =\n condition === RecordFilterCondition.NOT_EQUAL ? RecordFilterOperator.AND : RecordFilterOperator.OR;\n\n const conditions: RecordFilterInput[] = value.map((recordId, idx) => ({\n value: recordId,\n condition,\n field: nodes?.length\n ? `${filter.attribute.id}.${nodes[0].libraryId}.id`\n : Array.isArray(filter.field)\n ? filter.field[idx]\n : filter.field,\n }));\n\n if (conditions.length === 1) {\n return conditions;\n }\n\n return [\n {operator: RecordFilterOperator.OPEN_BRACKET},\n ...interleaveElement(\n {operator: multiValueOperator},\n conditions.map(c => [c]),\n ),\n {operator: RecordFilterOperator.CLOSE_BRACKET},\n ];\n};\n\nconst _addEmptyCondition = (baseConditions: RecordFilterInput[], filter: UIFilter): RecordFilterInput[] => {\n const hasValue =\n filter.value !== null &&\n filter.value !== undefined &&\n (!Array.isArray(filter.value) || filter.value.length > 0);\n\n // field can contain multiple entries or be absent — fall back to attribute id\n const field = (Array.isArray(filter.field) ? filter.field[0] : filter.field) || filter.attribute.id;\n const emptyCondition = {\n field,\n condition: RecordFilterCondition.IS_EMPTY,\n value: null,\n };\n\n if (!hasValue) {\n return [emptyCondition];\n }\n\n return [\n {operator: RecordFilterOperator.OPEN_BRACKET},\n ...baseConditions,\n {operator: RecordFilterOperator.OR},\n emptyCondition,\n {operator: RecordFilterOperator.CLOSE_BRACKET},\n ];\n};\n\nconst _applyEmptyValues = (baseConditions: RecordFilterInput[], filter: UIFilter): RecordFilterInput[] =>\n filter.withEmptyValues ? _addEmptyCondition(baseConditions, filter) : baseConditions;\n\nconst _filterIsActive = (filter: UIFilter): boolean => {\n if (filter.withEmptyValues) {\n return true;\n }\n\n if (isUIFilterTree(filter)) {\n // Skip if: (Toggle ON + no user selection) OR (No user selection + no initial value)\n const noUserSelectionNoInitialValue = filter.userNodes == null && (!filter.value || filter.value.length === 0);\n const toggleOnNoUserSelection = filter.includeHiddenOptions && filter.userNodes == null;\n return !(noUserSelectionNoInitialValue || toggleOnNoUserSelection);\n }\n\n if (isUIFilterWithSmartFilter(filter)) {\n return (\n (filter.value !== null && filter.value.length > 0) ||\n !!(filter.condition && nullValueConditions.includes(filter.condition))\n );\n }\n\n if (isUIFilterThrough(filter)) {\n return !!(\n filter.subField &&\n filter.subCondition &&\n (filter.value !== null || nullValueConditions.includes(filter.subCondition))\n );\n }\n\n if (isUIFilterValueList(filter)) {\n return !!(\n (filter.condition && filter.value?.length) ||\n (filter.condition && nullValueConditions.includes(filter.condition))\n );\n }\n\n return filter.value !== null || !!(filter.condition && nullValueConditions.includes(filter.condition));\n};\n\nconst _filterToRecordInputs = (filter: UIFilter): RecordFilterInput[] => {\n if (isUIFilterValueList(filter) || isUIFilterTree(filter) || isUIFilterWithSmartFilter(filter)) {\n const field = (Array.isArray(filter.field) ? filter.field[0] : filter.field) || filter.attribute.id;\n\n if (filter.condition && nullValueConditions.includes(filter.condition)) {\n const baseConditions: RecordFilterInput[] = [\n {\n field,\n condition: filter.condition,\n value: null,\n },\n ];\n return _applyEmptyValues(\n baseConditions,\n filter as IUIFilterTree | IUIFilterValueList | IUIFilterSmartFiler,\n );\n }\n\n if (isUIFilterTree(filter)) {\n // No user selection (null or undefined): add IS_EMPTY to filters\n // TODO : include IS_EMPTY to permissions\n if (filter.userNodes == null) {\n if (filter.withEmptyValues) {\n return [{field, condition: RecordFilterCondition.IS_EMPTY, value: null}];\n }\n const baseConditions = _generateConditionsFromMultipleValues(filter as IUIFilterTree);\n return _addEmptyCondition(baseConditions, filter as IUIFilterTree);\n }\n }\n\n const baseConditions = _generateConditionsFromMultipleValues(\n filter as IUIFilterTree | IUIFilterValueList | IUIFilterSmartFiler,\n );\n return _applyEmptyValues(baseConditions, filter as IUIFilterTree | IUIFilterValueList | IUIFilterSmartFiler);\n }\n\n // Normalize condition and field for THROUGH and link-with-value-list filters\n const condition =\n filter.condition === AttributeConditionFilter.THROUGH\n ? (filter as IUIFilterThrough).subCondition\n : filter.condition;\n let field =\n filter.condition === AttributeConditionFilter.THROUGH\n ? `${filter.field}.${(filter as IUIFilterThrough).subField}`\n : filter.field;\n\n // When a link attribute has a values list, we must filter on the linked record id\n if (isUIFilterLinkWithValueList(filter) && typeof field === 'string' && !field.endsWith('.id')) {\n field = `${field}.id`;\n }\n\n if (isUIFilterStandard(filter as UIFilter)) {\n switch ((filter as IUIFilterStandard).attribute.format) {\n case AttributeFormat.date:\n return _getDateRequestFilters({...filter, condition, field} as IUIFilterStandard);\n case AttributeFormat.boolean:\n return _getBooleanRequestFilters({...filter, condition, field} as IUIFilterStandard);\n default:\n break;\n }\n }\n\n const baseConditions: RecordFilterInput[] = [\n {\n field: field as string,\n condition: condition as RecordFilterCondition,\n value: (filter as IUIFilterStandard | IUIFilterLink | IUIFilterThrough).value,\n },\n ];\n return _applyEmptyValues(baseConditions, filter);\n};\n\nexport const prepareFiltersForRequest = (\n filters: UIFilter[],\n filtersOperator?: FiltersOperator,\n valuesList?: string[],\n): RecordFilterInput[] => {\n const operator = filtersOperator === 'OR' ? RecordFilterOperator.OR : RecordFilterOperator.AND;\n const recordFilters = interleaveElement(\n {operator},\n filters.filter(_filterIsActive).map(_filterToRecordInputs),\n ) as RecordFilterInput[];\n\n return [\n ...recordFilters,\n ...(recordFilters.length > 0 && valuesList ? [{operator: RecordFilterOperator.AND}] : []),\n ...(valuesList ? _addValuesListForFilters(valuesList) : []),\n ];\n};\n"]}
1
+ {"version":3,"file":"prepareFiltersForRequest.js","sourceRoot":"","sources":["../../../src/components/Filters/prepareFiltersForRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,eAAe,EAAE,qBAAqB,EAA0B,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnH,OAAO,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAC,wBAAwB,EAAC,MAAM,WAAW,CAAC;AACnD,OAAO,EAMH,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EAGnB,2BAA2B,EAC3B,yBAAyB,GAE5B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAC,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AAEvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;AAE5G,MAAM,sBAAsB,GAAG,CAAC,EAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAoB,EAAuB,EAAE;IACjG,QAAQ,SAAS,EAAE,CAAC;QAChB,KAAK,qBAAqB,CAAC,OAAO;YAC9B,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACrD,OAAO;gBACH;oBACI,KAAK;oBACL,SAAS;oBACT,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;wBAClB,IAAI;wBACJ,EAAE;qBACL,CAAC;iBACL;aACJ,CAAC;QACN,KAAK,qBAAqB,CAAC,SAAS;YAChC,OAAO;gBACH;oBACI,KAAK;oBACL,SAAS,EAAE,qBAAqB,CAAC,SAAS;oBAC1C,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;iBACvC;aACJ,CAAC;QACN,KAAK,qBAAqB,CAAC,KAAK;YAC5B,OAAO;gBACH;oBACI,KAAK;oBACL,SAAS;oBACT,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;iBACvC;aACJ,CAAC;QACN;YACI,OAAO;gBACH;oBACI,KAAK;oBACL,SAAS;oBACT,KAAK;iBACR;aACJ,CAAC;IACV,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,MAAyB,EAAuB,EAAE;IACjF,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO;YACH;gBACI,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,wBAAwB,CAAC,SAAS;gBAC7C,KAAK,EAAE,MAAM;aAChB;SACJ,CAAC;IACN,CAAC;IAED,OAAO,CAAC,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAC,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,UAAoB,EAAuB,EAAE,CAAC;IAC5E,EAAC,QAAQ,EAAE,oBAAoB,CAAC,YAAY,EAAC;IAC7C,GAAI,iBAAiB,CACjB,EAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,EAAC,EACnC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB;YACI,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,wBAAwB,CAAC,KAAK;YACzC,KAAK;SACR;KACJ,CAAC,CACmB;IACzB,EAAC,QAAQ,EAAE,oBAAoB,CAAC,aAAa,EAAC;CACjD,CAAC;AAEF,MAAM,qCAAqC,GAAG,CAC1C,MAAgE,EAC7C,EAAE;IACrB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACd,CAAC;IACD,MAAM,oBAAoB,GAAwB,EAAE,CAAC;IACrD,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;QAC5B,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,oBAAoB,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAE,oBAAoB,CAAC,YAAY,EAAC,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,oBAAoB,CAAC,IAAI,CAAC;gBACtB,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,KAAK,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK;aAC3D,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,oBAAoB,CAAC,IAAI,CAAC;gBACtB,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;aACxE,CAAC,CAAC;QACP,CAAC;QACD,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,oBAAoB,CAAC,IAAI,CAAC;gBACtB,QAAQ,EACJ,MAAM,CAAC,SAAS,KAAK,qBAAqB,CAAC,SAAS;oBAChD,CAAC,CAAC,oBAAoB,CAAC,GAAG;oBAC1B,CAAC,CAAC,oBAAoB,CAAC,EAAE;aACpC,CAAC,CAAC;QACP,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,oBAAoB,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAE,oBAAoB,CAAC,aAAa,EAAC,CAAC,CAAC;QAC9E,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,oBAAoB,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,cAAmC,EAAE,MAAgB,EAAuB,EAAE;IACtG,MAAM,QAAQ,GACV,MAAM,CAAC,KAAK,KAAK,IAAI;QACrB,MAAM,CAAC,KAAK,KAAK,SAAS;QAC1B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE9D,oEAAoE;IACpE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IACpG,MAAM,cAAc,GAAG;QACnB,KAAK;QACL,SAAS,EAAE,qBAAqB,CAAC,QAAQ;QACzC,KAAK,EAAE,IAAI;KACd,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACJ,OAAO;YACH,EAAC,QAAQ,EAAE,oBAAoB,CAAC,YAAY,EAAC;YAC7C,GAAG,cAAc;YACjB,EAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,EAAC;YACnC,cAAc;YACd,EAAC,QAAQ,EAAE,oBAAoB,CAAC,aAAa,EAAC;SACjD,CAAC;IACN,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACpC,OAAmB,EACnB,eAAiC,EACjC,UAAqB,EACF,EAAE;IACrB,MAAM,gBAAgB,GAAG,iBAAiB,CACtC,EAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAC,EACzF,OAAO;SACF,MAAM,CAAC,MAAM,CAAC,EAAE;QACb,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,qFAAqF;YACrF,MAAM,6BAA6B,GAC/B,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;YAC7E,MAAM,uBAAuB,GAAG,MAAM,CAAC,oBAAoB,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;YACxF,OAAO,CAAC,CAAC,6BAA6B,IAAI,uBAAuB,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,CACH,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClD,CAAC,MAAM,CAAC,SAAS,IAAI,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CACvE,CAAC;QACN,CAAC;QAED,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,CACH,MAAM,CAAC,QAAQ;gBACf,MAAM,CAAC,YAAY;gBACnB,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAC/E,CAAC;QACN,CAAC;QAED,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO,CACH,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;gBAC5C,CAAC,MAAM,CAAC,SAAS,IAAI,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CACvE,CAAC;QACN,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACzG,CAAC,CAAC;SACD,GAAG,CAAC,MAAM,CAAC,EAAE;QACV,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,MAAM,SAAS,GACX,MAAM,CAAC,SAAS,KAAK,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;QACnG,IAAI,KAAK,GACL,MAAM,CAAC,SAAS,KAAK,wBAAwB,CAAC,OAAO;YACjD,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;YACtC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAEvB,kFAAkF;QAClF,IAAI,2BAA2B,CAAC,MAAM,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7F,KAAK,GAAG,GAAG,KAAK,KAAK,CAAC;QAC1B,CAAC;QAED,OAAO,EAAC,GAAG,MAAM,EAAE,SAAS,EAAE,KAAK,EAAC,CAAC;IACzC,CAAC,CAAC;SACD,GAAG,CAAC,MAAM,CAAC,EAAE;QACV,8DAA8D;QAC9D,IAAI,mBAAmB,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7F,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACpG,IAAI,MAAM,CAAC,SAAS,IAAI,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrE,MAAM,cAAc,GAAwB;oBACxC;wBACI,KAAK;wBACL,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,KAAK,EAAE,IAAI;qBACd;iBACJ,CAAC;gBACF,OAAO,CAAC,MAAM,CAAC,eAAe;oBAC1B,CAAC,CAAC,cAAc;oBAChB,CAAC,CAAC,kBAAkB,CACd,cAAc,EACd,MAAkE,CACrE,CAAC;YACZ,CAAC;YACD,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,iEAAiE;gBACjE,yCAAyC;gBACzC,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;oBAC3B,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;wBACzB,OAAO,CAAC,EAAC,KAAK,EAAE,SAAS,EAAE,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;oBAC7E,CAAC;oBACD,MAAM,cAAc,GAAG,qCAAqC,CAAC,MAAuB,CAAC,CAAC;oBACtF,OAAO,kBAAkB,CAAC,cAAc,EAAE,MAAuB,CAAC,CAAC;gBACvE,CAAC;YACL,CAAC;YACD,MAAM,cAAc,GAAG,qCAAqC,CACxD,MAAkE,CACrE,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,eAAe;gBAC1B,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,kBAAkB,CACd,cAAc,EACd,MAAkE,CACrE,CAAC;QACZ,CAAC;QAED,IAAI,kBAAkB,CAAC,MAAkB,CAAC,EAAE,CAAC;YACzC,QAAQ,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC9B,KAAK,eAAe,CAAC,IAAI;oBACrB,OAAO,sBAAsB,CAAC,MAA2B,CAAC,CAAC;gBAC/D,KAAK,eAAe,CAAC,OAAO;oBACxB,OAAO,yBAAyB,CAAC,MAA2B,CAAC,CAAC;gBAClE;oBACI,MAAM;YACd,CAAC;QACL,CAAC;QACD,MAAM,qBAAqB,GAAG,MAA8D,CAAC;QAC7F,MAAM,cAAc,GAAwB;YACxC;gBACI,KAAK,EAAE,qBAAqB,CAAC,KAAe;gBAC5C,SAAS,EAAE,qBAAqB,CAAC,SAAkC;gBACnE,KAAK,EAAE,qBAAqB,CAAC,KAAK;aACrC;SACJ,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,eAAe;YAC1B,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAkB,CAAC,CAAC;IACjE,CAAC,CAAC,CACT,CAAC;IAEF,OAAO;QACH,GAAG,gBAAgB;QACnB,GAAG,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,EAAC,QAAQ,EAAE,oBAAoB,CAAC,GAAG,EAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC;AACN,CAAC,CAAC","sourcesContent":["import dayjs from 'dayjs';\nimport {AttributeFormat, RecordFilterCondition, type RecordFilterInput, RecordFilterOperator} from '_ui/_gqlTypes';\nimport {interleaveElement} from '_ui/_utils/interleaveElement';\nimport {AttributeConditionFilter} from '_ui/types';\nimport {\n type UIFilter,\n type IUIFilterLink,\n type IUIFilterStandard,\n type IUIFilterThrough,\n type IUIFilterTree,\n isUIFilterStandard,\n isUIFilterThrough,\n isUIFilterTree,\n isUIFilterValueList,\n type IUIFilterValueList,\n type FiltersOperator,\n isUIFilterLinkWithValueList,\n isUIFilterWithSmartFilter,\n type IUIFilterSmartFiler,\n} from './_types';\nimport {nullValueConditions} from './conditionsHelper';\n\nexport const dateValuesSeparator = '\\n';\n\nconst _getDateAtNoon = (date: number): string => dayjs.unix(Number(date)).add(12, 'hour').unix().toString();\n\nconst _getDateRequestFilters = ({field, condition, value}: IUIFilterStandard): RecordFilterInput[] => {\n switch (condition) {\n case RecordFilterCondition.BETWEEN:\n const [from, to] = value!.split(dateValuesSeparator);\n return [\n {\n field,\n condition,\n value: JSON.stringify({\n from,\n to,\n }),\n },\n ];\n case RecordFilterCondition.NOT_EQUAL:\n return [\n {\n field,\n condition: RecordFilterCondition.NOT_EQUAL,\n value: _getDateAtNoon(Number(value)),\n },\n ];\n case RecordFilterCondition.EQUAL:\n return [\n {\n field,\n condition,\n value: _getDateAtNoon(Number(value)),\n },\n ];\n default:\n return [\n {\n field,\n condition,\n value,\n },\n ];\n }\n};\n\nconst _getBooleanRequestFilters = (filter: IUIFilterStandard): RecordFilterInput[] => {\n if (filter.value === 'false') {\n return [\n {\n field: filter.field,\n condition: AttributeConditionFilter.NOT_EQUAL,\n value: 'true',\n },\n ];\n }\n\n return [{field: filter.field, condition: filter.condition, value: filter.value}];\n};\n\nconst _addValuesListForFilters = (valuesList: string[]): RecordFilterInput[] => [\n {operator: RecordFilterOperator.OPEN_BRACKET},\n ...(interleaveElement(\n {operator: RecordFilterOperator.OR},\n valuesList.map(value => [\n {\n field: 'id',\n condition: AttributeConditionFilter.EQUAL,\n value,\n },\n ]),\n ) as RecordFilterInput[]),\n {operator: RecordFilterOperator.CLOSE_BRACKET},\n];\n\nconst _generateConditionsFromMultipleValues = (\n filter: IUIFilterTree | IUIFilterValueList | IUIFilterSmartFiler,\n): RecordFilterInput[] => {\n const value = filter.value;\n const nodes = isUIFilterTree(filter) ? filter.nodes : undefined;\n\n if (!value || value.length === 0) {\n return [];\n }\n const filtersWithOperators: RecordFilterInput[] = [];\n value.forEach((recordId, idx) => {\n if (idx === 0 && value.length > 1) {\n filtersWithOperators.push({operator: RecordFilterOperator.OPEN_BRACKET});\n }\n if (nodes?.length > 0) {\n filtersWithOperators.push({\n value: recordId,\n condition: filter.condition,\n field: `${filter.attribute.id}.${nodes[0].libraryId}.id`,\n });\n } else {\n filtersWithOperators.push({\n value: recordId,\n condition: filter.condition,\n field: Array.isArray(filter.field) ? filter.field[idx] : filter.field,\n });\n }\n if (idx < value.length - 1) {\n filtersWithOperators.push({\n operator:\n filter.condition === RecordFilterCondition.NOT_EQUAL\n ? RecordFilterOperator.AND\n : RecordFilterOperator.OR,\n });\n }\n if (value.length > 1 && idx >= value.length - 1) {\n filtersWithOperators.push({operator: RecordFilterOperator.CLOSE_BRACKET});\n }\n });\n return filtersWithOperators;\n};\n\nconst _addEmptyCondition = (baseConditions: RecordFilterInput[], filter: UIFilter): RecordFilterInput[] => {\n const hasValue =\n filter.value !== null &&\n filter.value !== undefined &&\n (!Array.isArray(filter.value) || filter.value.length > 0);\n\n // patch because field contains multiple informations & can be empty\n const field = (Array.isArray(filter.field) ? filter.field[0] : filter.field) || filter.attribute.id;\n const emptyCondition = {\n field,\n condition: RecordFilterCondition.IS_EMPTY,\n value: null,\n };\n\n if (!hasValue) {\n return [emptyCondition];\n } else {\n return [\n {operator: RecordFilterOperator.OPEN_BRACKET},\n ...baseConditions,\n {operator: RecordFilterOperator.OR},\n emptyCondition,\n {operator: RecordFilterOperator.CLOSE_BRACKET},\n ];\n }\n};\n\nexport const prepareFiltersForRequest = (\n filters: UIFilter[],\n filtersOperator?: FiltersOperator,\n valuesList?: string[],\n): RecordFilterInput[] => {\n const interleaveFilter = interleaveElement(\n {operator: filtersOperator === 'OR' ? RecordFilterOperator.OR : RecordFilterOperator.AND},\n filters\n .filter(filter => {\n if (filter.withEmptyValues) {\n return true;\n }\n if (isUIFilterTree(filter)) {\n // Skip if: (Toggle ON + no user selection) OR (No user selection + no initial value)\n const noUserSelectionNoInitialValue =\n filter.userNodes == null && (!filter.value || filter.value.length === 0);\n const toggleOnNoUserSelection = filter.includeHiddenOptions && filter.userNodes == null;\n return !(noUserSelectionNoInitialValue || toggleOnNoUserSelection);\n }\n if (isUIFilterWithSmartFilter(filter)) {\n return (\n (filter.value !== null && filter.value.length > 0) ||\n (filter.condition && nullValueConditions.includes(filter.condition))\n );\n }\n\n if (isUIFilterThrough(filter)) {\n return (\n filter.subField &&\n filter.subCondition &&\n (filter.value !== null || nullValueConditions.includes(filter.subCondition))\n );\n }\n\n if (isUIFilterValueList(filter)) {\n return (\n (!!filter.condition && filter.value?.length) ||\n (filter.condition && nullValueConditions.includes(filter.condition))\n );\n }\n\n return filter.value !== null || (filter.condition && nullValueConditions.includes(filter.condition));\n })\n .map(filter => {\n if (isUIFilterTree(filter)) {\n return filter;\n }\n const condition =\n filter.condition === AttributeConditionFilter.THROUGH ? filter.subCondition : filter.condition;\n let field =\n filter.condition === AttributeConditionFilter.THROUGH\n ? `${filter.field}.${filter.subField}`\n : filter.field;\n\n // When a link attribute has a values list, we must filter on the linked record id\n if (isUIFilterLinkWithValueList(filter) && typeof field === 'string' && !field.endsWith('.id')) {\n field = `${field}.id`;\n }\n\n return {...filter, condition, field};\n })\n .map(filter => {\n //@ts-ignore typscript does not recognize filter as a UIFilter\n if (isUIFilterValueList(filter) || isUIFilterTree(filter) || isUIFilterWithSmartFilter(filter)) {\n const field = (Array.isArray(filter.field) ? filter.field[0] : filter.field) || filter.attribute.id;\n if (filter.condition && nullValueConditions.includes(filter.condition)) {\n const baseConditions: RecordFilterInput[] = [\n {\n field,\n condition: filter.condition,\n value: null,\n },\n ];\n return !filter.withEmptyValues\n ? baseConditions\n : _addEmptyCondition(\n baseConditions,\n filter as IUIFilterTree | IUIFilterValueList | IUIFilterSmartFiler,\n );\n }\n if (isUIFilterTree(filter)) {\n // No user selection (null or undefined): add IS_EMPTY to filters\n // TODO : include IS_EMPTY to permissions\n if (filter.userNodes == null) {\n if (filter.withEmptyValues) {\n return [{field, condition: RecordFilterCondition.IS_EMPTY, value: null}];\n }\n const baseConditions = _generateConditionsFromMultipleValues(filter as IUIFilterTree);\n return _addEmptyCondition(baseConditions, filter as IUIFilterTree);\n }\n }\n const baseConditions = _generateConditionsFromMultipleValues(\n filter as IUIFilterTree | IUIFilterValueList | IUIFilterSmartFiler,\n );\n return !filter.withEmptyValues\n ? baseConditions\n : _addEmptyCondition(\n baseConditions,\n filter as IUIFilterTree | IUIFilterValueList | IUIFilterSmartFiler,\n );\n }\n\n if (isUIFilterStandard(filter as UIFilter)) {\n switch (filter.attribute.format) {\n case AttributeFormat.date:\n return _getDateRequestFilters(filter as IUIFilterStandard);\n case AttributeFormat.boolean:\n return _getBooleanRequestFilters(filter as IUIFilterStandard);\n default:\n break;\n }\n }\n const filterWithStringValue = filter as IUIFilterStandard | IUIFilterLink | IUIFilterThrough;\n const baseConditions: RecordFilterInput[] = [\n {\n field: filterWithStringValue.field as string,\n condition: filterWithStringValue.condition as RecordFilterCondition,\n value: filterWithStringValue.value,\n },\n ];\n return !filter.withEmptyValues\n ? baseConditions\n : _addEmptyCondition(baseConditions, filter as UIFilter);\n }),\n );\n\n return [\n ...interleaveFilter,\n ...(interleaveFilter.length > 0 && valuesList ? [{operator: RecordFilterOperator.AND}] : []),\n ...(valuesList ? _addValuesListForFilters(valuesList) : []),\n ];\n};\n"]}
@@ -2,7 +2,6 @@ import { type ExplorerAttributesQuery, type ExplorerLinkAttributeQuery, type Get
2
2
  import { type UIFilter, type ValidFilter } from './_types';
3
3
  import { type TFunction } from 'i18next';
4
4
  import { type ITreeFilters } from './context/useGetTreeFilters';
5
- type QueryAttributeItem = NonNullable<ExplorerAttributesQuery['attributes']>['list'][number];
6
5
  export declare const isLinkAttributeDetails: (linkAttributeData: NonNullable<ExplorerLinkAttributeQuery["attributes"]>["list"][number]) => linkAttributeData is LinkAttributeDetailsFragment & {
7
6
  id: string;
8
7
  multiple_values: boolean;
@@ -12,7 +11,7 @@ export declare const isLinkAttributeDetails: (linkAttributeData: NonNullable<Exp
12
11
  };
13
12
  };
14
13
  export type ValidFiltersArgument = GetViewsListQuery['views']['list'][number]['filters'] | UIFilter[];
15
- export type AttributesById = Record<string, QueryAttributeItem>;
14
+ export type AttributesById = Record<string, NonNullable<ExplorerAttributesQuery['attributes']>['list'][number]>;
16
15
  export declare const useTransformFilters: () => {
17
16
  toValidFilters: (filters: ValidFiltersArgument) => ValidFilter[];
18
17
  toUIFilters: ({ filters, treeFilters, attributesDataById, t, }: {
@@ -22,4 +21,3 @@ export declare const useTransformFilters: () => {
22
21
  t: TFunction;
23
22
  }) => UIFilter[];
24
23
  };
25
- export {};