pne-ui 4.0.45 → 4.0.47

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.
Files changed (100) hide show
  1. package/README.md +17 -0
  2. package/cjs/component/search-ui/SearchUI.js +15 -11
  3. package/cjs/component/search-ui/SearchUI.js.map +1 -1
  4. package/cjs/component/search-ui/SearchUIProvider.d.ts +5 -1
  5. package/cjs/component/search-ui/SearchUIProvider.js +1 -0
  6. package/cjs/component/search-ui/SearchUIProvider.js.map +1 -1
  7. package/cjs/component/search-ui/filters/CriterionContainer.js +3 -0
  8. package/cjs/component/search-ui/filters/CriterionContainer.js.map +1 -1
  9. package/cjs/component/search-ui/filters/SearchUIFilters.d.ts +1 -0
  10. package/cjs/component/search-ui/filters/SearchUIFilters.js +43 -18
  11. package/cjs/component/search-ui/filters/SearchUIFilters.js.map +1 -1
  12. package/cjs/component/search-ui/filters/component/criterion/CustomerLevelCriterion.d.ts +2 -0
  13. package/cjs/component/search-ui/filters/component/criterion/CustomerLevelCriterion.js +92 -0
  14. package/cjs/component/search-ui/filters/component/criterion/CustomerLevelCriterion.js.map +1 -0
  15. package/cjs/component/search-ui/filters/component/select/SearchUIAbstractEntityChipSelect.d.ts +12 -0
  16. package/cjs/component/search-ui/filters/component/select/SearchUIAbstractEntityChipSelect.js +29 -0
  17. package/cjs/component/search-ui/filters/component/select/SearchUIAbstractEntityChipSelect.js.map +1 -0
  18. package/cjs/component/search-ui/filters/component/select/SearchUICollapsableGroupSelect.js +1 -0
  19. package/cjs/component/search-ui/filters/component/select/SearchUICollapsableGroupSelect.js.map +1 -1
  20. package/cjs/component/search-ui/filters/component/select/SearchUIProcessorLogEntryTypeSelect.d.ts +1 -9
  21. package/cjs/component/search-ui/filters/component/select/SearchUIProcessorLogEntryTypeSelect.js +3 -19
  22. package/cjs/component/search-ui/filters/component/select/SearchUIProcessorLogEntryTypeSelect.js.map +1 -1
  23. package/cjs/component/search-ui/filters/customerLevelDependencies.d.ts +6 -0
  24. package/cjs/component/search-ui/filters/customerLevelDependencies.js +25 -0
  25. package/cjs/component/search-ui/filters/customerLevelDependencies.js.map +1 -0
  26. package/cjs/component/search-ui/filters/state/SearchUIFiltersStoreProvider.d.ts +7 -0
  27. package/cjs/component/search-ui/filters/state/SearchUIFiltersStoreProvider.js +30 -0
  28. package/cjs/component/search-ui/filters/state/SearchUIFiltersStoreProvider.js.map +1 -0
  29. package/cjs/component/search-ui/filters/state/actions.js +209 -51
  30. package/cjs/component/search-ui/filters/state/actions.js.map +1 -1
  31. package/cjs/component/search-ui/filters/state/initial.js +6 -0
  32. package/cjs/component/search-ui/filters/state/initial.js.map +1 -1
  33. package/cjs/component/search-ui/filters/state/retention.d.ts +5 -0
  34. package/cjs/component/search-ui/filters/state/retention.js +107 -0
  35. package/cjs/component/search-ui/filters/state/retention.js.map +1 -0
  36. package/cjs/component/search-ui/filters/state/store.d.ts +11 -1068
  37. package/cjs/component/search-ui/filters/state/store.js +22 -2
  38. package/cjs/component/search-ui/filters/state/store.js.map +1 -1
  39. package/cjs/component/search-ui/filters/state/type.d.ts +17 -1
  40. package/cjs/component/search-ui/filters/state/undo.js +1 -0
  41. package/cjs/component/search-ui/filters/state/undo.js.map +1 -1
  42. package/cjs/component/search-ui/filters/types.d.ts +18 -1
  43. package/cjs/component/search-ui/filters/types.js +8 -1
  44. package/cjs/component/search-ui/filters/types.js.map +1 -1
  45. package/cjs/component/search-ui/state/initial.js +1 -0
  46. package/cjs/component/search-ui/state/initial.js.map +1 -1
  47. package/cjs/component/search-ui/state/store.d.ts +2 -0
  48. package/cjs/exports/search.d.ts +1 -1
  49. package/cjs/exports/search.js +2 -1
  50. package/cjs/exports/search.js.map +1 -1
  51. package/esm/component/search-ui/SearchUI.js +13 -9
  52. package/esm/component/search-ui/SearchUI.js.map +1 -1
  53. package/esm/component/search-ui/SearchUIProvider.d.ts +5 -1
  54. package/esm/component/search-ui/SearchUIProvider.js +1 -0
  55. package/esm/component/search-ui/SearchUIProvider.js.map +1 -1
  56. package/esm/component/search-ui/filters/CriterionContainer.js +3 -0
  57. package/esm/component/search-ui/filters/CriterionContainer.js.map +1 -1
  58. package/esm/component/search-ui/filters/SearchUIFilters.d.ts +1 -0
  59. package/esm/component/search-ui/filters/SearchUIFilters.js +42 -18
  60. package/esm/component/search-ui/filters/SearchUIFilters.js.map +1 -1
  61. package/esm/component/search-ui/filters/component/criterion/CustomerLevelCriterion.d.ts +2 -0
  62. package/esm/component/search-ui/filters/component/criterion/CustomerLevelCriterion.js +87 -0
  63. package/esm/component/search-ui/filters/component/criterion/CustomerLevelCriterion.js.map +1 -0
  64. package/esm/component/search-ui/filters/component/select/SearchUIAbstractEntityChipSelect.d.ts +12 -0
  65. package/esm/component/search-ui/filters/component/select/SearchUIAbstractEntityChipSelect.js +26 -0
  66. package/esm/component/search-ui/filters/component/select/SearchUIAbstractEntityChipSelect.js.map +1 -0
  67. package/esm/component/search-ui/filters/component/select/SearchUICollapsableGroupSelect.js +1 -0
  68. package/esm/component/search-ui/filters/component/select/SearchUICollapsableGroupSelect.js.map +1 -1
  69. package/esm/component/search-ui/filters/component/select/SearchUIProcessorLogEntryTypeSelect.d.ts +1 -9
  70. package/esm/component/search-ui/filters/component/select/SearchUIProcessorLogEntryTypeSelect.js +1 -19
  71. package/esm/component/search-ui/filters/component/select/SearchUIProcessorLogEntryTypeSelect.js.map +1 -1
  72. package/esm/component/search-ui/filters/customerLevelDependencies.d.ts +6 -0
  73. package/esm/component/search-ui/filters/customerLevelDependencies.js +21 -0
  74. package/esm/component/search-ui/filters/customerLevelDependencies.js.map +1 -0
  75. package/esm/component/search-ui/filters/state/SearchUIFiltersStoreProvider.d.ts +7 -0
  76. package/esm/component/search-ui/filters/state/SearchUIFiltersStoreProvider.js +25 -0
  77. package/esm/component/search-ui/filters/state/SearchUIFiltersStoreProvider.js.map +1 -0
  78. package/esm/component/search-ui/filters/state/actions.js +210 -52
  79. package/esm/component/search-ui/filters/state/actions.js.map +1 -1
  80. package/esm/component/search-ui/filters/state/initial.js +6 -0
  81. package/esm/component/search-ui/filters/state/initial.js.map +1 -1
  82. package/esm/component/search-ui/filters/state/retention.d.ts +5 -0
  83. package/esm/component/search-ui/filters/state/retention.js +99 -0
  84. package/esm/component/search-ui/filters/state/retention.js.map +1 -0
  85. package/esm/component/search-ui/filters/state/store.d.ts +11 -1068
  86. package/esm/component/search-ui/filters/state/store.js +18 -2
  87. package/esm/component/search-ui/filters/state/store.js.map +1 -1
  88. package/esm/component/search-ui/filters/state/type.d.ts +17 -1
  89. package/esm/component/search-ui/filters/state/undo.js +1 -0
  90. package/esm/component/search-ui/filters/state/undo.js.map +1 -1
  91. package/esm/component/search-ui/filters/types.d.ts +18 -1
  92. package/esm/component/search-ui/filters/types.js +7 -0
  93. package/esm/component/search-ui/filters/types.js.map +1 -1
  94. package/esm/component/search-ui/state/initial.js +1 -0
  95. package/esm/component/search-ui/state/initial.js.map +1 -1
  96. package/esm/component/search-ui/state/store.d.ts +2 -0
  97. package/esm/exports/search.d.ts +1 -1
  98. package/esm/exports/search.js +1 -1
  99. package/esm/exports/search.js.map +1 -1
  100. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { exhaustiveCheck, } from '../../../..';
2
- import { CriterionTypeEnum, ExactCriterionSearchLabelEnum, LinkedEntityTypeEnum, MultichoiceFilterTypeEnum, ThreeDCriterionEnum, } from '../types';
2
+ import { CUSTOMER_LEVEL_DEPENDENCIES, CriterionTypeEnum, ExactCriterionSearchLabelEnum, LinkedEntityTypeEnum, MultichoiceFilterTypeEnum, ThreeDCriterionEnum, } from '../types';
3
3
  import { getCriteriaWithAvailabilityRules, isCriterionAvailable, } from '../criterionAvailability';
4
4
  import { getSearchUIFiltersInitialState, getSearchUIInitialGrouping, getSearchUIInitialProjectCurrency, getSearchUIInitialSearchCriteria, searchUICountriesInitialAllableCollection, searchUIInitialAllableCollection, searchUIInitialDateFrom, searchUIInitialDateTo, } from './initial';
5
5
  // import {raiseUIError} from '../../../../../error';
@@ -10,6 +10,7 @@ import isoWeek from 'dayjs/plugin/isoWeek';
10
10
  import cloneDeep from 'lodash/cloneDeep';
11
11
  import isEqual from 'lodash/isEqual';
12
12
  import { applyDateOnlyTimeZone, createDateOnlySearchDate, createDateOnlySearchEndExclusiveDate, resolveDateOnlyTimeZone, SEARCH_UI_NON_EXACT_DEFAULT_TIME_ZONE, } from '../dateRangeTimeZone';
13
+ import { getConcreteCustomerLevelMerchantId } from '../customerLevelDependencies';
13
14
  dayjs.extend(utc);
14
15
  dayjs.extend(timezone);
15
16
  dayjs.extend(isoWeek);
@@ -28,6 +29,7 @@ const criterionToLinkedEntityMap = {
28
29
  const getLinkedEntityTypeByCriterion = (criterion) => {
29
30
  return criterionToLinkedEntityMap[criterion] ?? null;
30
31
  };
32
+ const isConfiguredCriterion = (draft, criterion) => draft.possibleCriteria.includes(criterion) || draft.predefinedCriteria.includes(criterion);
31
33
  const getInitialMultigetCriterion = (entityType) => ({
32
34
  entityType: entityType,
33
35
  filterType: MultichoiceFilterTypeEnum.NONE,
@@ -78,58 +80,141 @@ const sanitizeMultigetCriteria = (incoming, activeCriteria) => {
78
80
  });
79
81
  return Array.from(uniqueByEntity.values());
80
82
  };
83
+ const isRetainedSnapshotCompatible = (snapshot, state) => {
84
+ return isEqual(snapshot.possibleCriteria, state.possibleCriteria)
85
+ && isEqual(snapshot.predefinedCriteria, state.predefinedCriteria)
86
+ && isEqual(snapshot.exactSearchLabels, state.exactSearchLabels)
87
+ && snapshot.manualSearch === !!state.config?.manualSearch;
88
+ };
89
+ const addCriterionReducer = (draft, criterion, configuredOnly = false) => {
90
+ if (configuredOnly && !isConfiguredCriterion(draft, criterion)) {
91
+ return;
92
+ }
93
+ if (draft.criteria.includes(criterion)) {
94
+ const entityType = getLinkedEntityTypeByCriterion(criterion);
95
+ if (entityType !== null
96
+ && !draft.multigetCriteria.some(multigetCriterion => multigetCriterion.entityType === entityType)) {
97
+ draft.multigetCriteria.push(getInitialMultigetCriterion(entityType));
98
+ }
99
+ return;
100
+ }
101
+ draft.criteria.push(criterion);
102
+ addInitialMultigetCriterionReducer(draft, criterion);
103
+ };
104
+ const ensureCustomerLevelDependenciesReducer = (draft) => {
105
+ if (!draft.criteria.includes(CriterionTypeEnum.CUSTOMER_LEVEL)) {
106
+ return;
107
+ }
108
+ CUSTOMER_LEVEL_DEPENDENCIES.forEach(dependency => addCriterionReducer(draft, dependency, true));
109
+ };
110
+ const applyConditionsReducer = (draft, conditions) => {
111
+ const { criteria: incomingCriteria, multigetCriteria: incomingMultigetCriteria, ...rest } = conditions;
112
+ const prevCriteria = draft.criteria.slice();
113
+ Object.assign(draft, rest);
114
+ if (incomingCriteria !== undefined) {
115
+ const allowedCriteria = new Set([
116
+ ...draft.predefinedCriteria,
117
+ ...draft.possibleCriteria,
118
+ ]);
119
+ const sanitizedIncoming = Array.from(new Set(incomingCriteria.filter(criterion => allowedCriteria.has(criterion))));
120
+ const mergedCriteria = Array.from(new Set([
121
+ ...draft.predefinedCriteria,
122
+ ...sanitizedIncoming,
123
+ ]));
124
+ const removedCriteria = prevCriteria.filter(criterion => !mergedCriteria.includes(criterion));
125
+ removedCriteria.forEach(criterion => {
126
+ clearCriterionReducer(draft, criterion);
127
+ });
128
+ const addedCriteria = mergedCriteria.filter(criterion => !prevCriteria.includes(criterion));
129
+ if (incomingMultigetCriteria === undefined) {
130
+ addedCriteria.forEach(criterion => {
131
+ addInitialMultigetCriterionReducer(draft, criterion);
132
+ });
133
+ }
134
+ draft.criteria = mergedCriteria;
135
+ }
136
+ if (incomingMultigetCriteria !== undefined) {
137
+ const sanitizedMultigetCriteria = sanitizeMultigetCriteria(incomingMultigetCriteria, draft.criteria);
138
+ const missingEntityTypes = draft.criteria
139
+ .map(getLinkedEntityTypeByCriterion)
140
+ .filter((entityType) => entityType !== null)
141
+ .filter(entityType => !sanitizedMultigetCriteria.some(item => item.entityType === entityType));
142
+ missingEntityTypes.forEach(entityType => {
143
+ sanitizedMultigetCriteria.push(getInitialMultigetCriterion(entityType));
144
+ });
145
+ draft.multigetCriteria = sanitizedMultigetCriteria;
146
+ }
147
+ ensureCustomerLevelDependenciesReducer(draft);
148
+ };
149
+ const restoreAppliedSearchCriteria = (snapshot, retainedDraftSearchCriteria, currentSearchCriteria) => {
150
+ if (!snapshot.hasUnappliedFilters || !snapshot.appliedSearchCriteria) {
151
+ return currentSearchCriteria;
152
+ }
153
+ const retainedDraftWithoutDates = {
154
+ ...retainedDraftSearchCriteria,
155
+ dateFrom: currentSearchCriteria.dateFrom,
156
+ dateTo: currentSearchCriteria.dateTo,
157
+ };
158
+ if (!isEqual(retainedDraftWithoutDates, currentSearchCriteria)) {
159
+ return currentSearchCriteria;
160
+ }
161
+ return {
162
+ ...cloneDeep(snapshot.appliedSearchCriteria),
163
+ dateFrom: isEqual(snapshot.appliedSearchCriteria.dateFrom, retainedDraftSearchCriteria.dateFrom)
164
+ ? currentSearchCriteria.dateFrom
165
+ : snapshot.appliedSearchCriteria.dateFrom,
166
+ dateTo: isEqual(snapshot.appliedSearchCriteria.dateTo, retainedDraftSearchCriteria.dateTo)
167
+ ? currentSearchCriteria.dateTo
168
+ : snapshot.appliedSearchCriteria.dateTo,
169
+ };
170
+ };
81
171
  export const getSearchUIFiltersActions = (set, get) => ({
82
- setInitialState: (state) => {
172
+ setInitialState: (state, retainedSnapshot) => {
83
173
  set((draft) => {
84
- return {
174
+ const initialState = {
85
175
  ...draft,
86
176
  ...getSearchUIFiltersInitialState(),
87
177
  ...getSearchUIInitialSearchCriteria(state.defaults),
88
178
  ...state,
89
179
  };
180
+ Object.assign(draft, initialState);
181
+ ensureCustomerLevelDependenciesReducer(draft);
182
+ if (retainedSnapshot && isRetainedSnapshotCompatible(retainedSnapshot, initialState)) {
183
+ applyConditionsReducer(draft, retainedSnapshot.searchConditions);
184
+ draft.activeTemplateName = retainedSnapshot.activeTemplateName;
185
+ draft.restoredFromRetention = true;
186
+ }
187
+ draft.initialized = true;
90
188
  });
91
- postUpdate(set, get);
189
+ const retainedDraftSearchCriteria = get().restoredFromRetention
190
+ ? extractSearchCriteriaFromState(get())
191
+ : null;
192
+ syncCriterionAvailability(set, get);
193
+ normalizeRetainedDateRange(set, get);
194
+ ensureTransactionSessionStatusesPrefetched(set, get);
195
+ if (get().restoredFromRetention && retainedSnapshot && retainedDraftSearchCriteria) {
196
+ const currentSearchCriteria = extractSearchCriteriaFromState(get());
197
+ const appliedSearchCriteria = get().config?.manualSearch
198
+ ? restoreAppliedSearchCriteria(retainedSnapshot, retainedDraftSearchCriteria, currentSearchCriteria)
199
+ : currentSearchCriteria;
200
+ get().onFiltersUpdate(appliedSearchCriteria);
201
+ set((draft) => {
202
+ draft.prevSearchCriteria = currentSearchCriteria;
203
+ draft.appliedSearchCriteria = appliedSearchCriteria;
204
+ draft.hasUnappliedFilters = !!draft.config?.manualSearch
205
+ && !isEqual(currentSearchCriteria, appliedSearchCriteria);
206
+ });
207
+ return;
208
+ }
209
+ checkIfFiltersChanged(set, get);
92
210
  },
93
211
  updateConditions: (conditions, options) => {
94
212
  set((draft) => {
95
- const { criteria: incomingCriteria, multigetCriteria: incomingMultigetCriteria, ...rest } = conditions;
96
- const prevCriteria = draft.criteria.slice();
97
- Object.assign(draft, rest);
98
- if (incomingCriteria !== undefined) {
99
- const allowedCriteria = new Set([
100
- ...draft.predefinedCriteria,
101
- ...draft.possibleCriteria,
102
- ]);
103
- const sanitizedIncoming = Array.from(new Set(incomingCriteria.filter(criterion => allowedCriteria.has(criterion))));
104
- const mergedCriteria = Array.from(new Set([
105
- ...draft.predefinedCriteria,
106
- ...sanitizedIncoming,
107
- ]));
108
- const removedCriteria = prevCriteria.filter(criterion => !mergedCriteria.includes(criterion));
109
- removedCriteria.forEach(criterion => {
110
- clearCriterionReducer(draft, criterion);
111
- });
112
- const addedCriteria = mergedCriteria.filter(criterion => !prevCriteria.includes(criterion));
113
- if (incomingMultigetCriteria === undefined) {
114
- addedCriteria.forEach(criterion => {
115
- addInitialMultigetCriterionReducer(draft, criterion);
116
- });
117
- }
118
- draft.criteria = mergedCriteria;
119
- }
120
- if (incomingMultigetCriteria !== undefined) {
121
- const sanitizedMultigetCriteria = sanitizeMultigetCriteria(incomingMultigetCriteria, draft.criteria);
122
- const missingEntityTypes = draft.criteria
123
- .map(getLinkedEntityTypeByCriterion)
124
- .filter((entityType) => entityType !== null)
125
- .filter(entityType => !sanitizedMultigetCriteria.some(item => item.entityType === entityType));
126
- missingEntityTypes.forEach(entityType => {
127
- sanitizedMultigetCriteria.push(getInitialMultigetCriterion(entityType));
128
- });
129
- draft.multigetCriteria = sanitizedMultigetCriteria;
130
- }
213
+ applyConditionsReducer(draft, conditions);
131
214
  if (options?.resetTemplate) {
132
215
  draft.template = null;
216
+ draft.activeTemplateName = null;
217
+ draft.skipLastTemplateAutoApply = true;
133
218
  }
134
219
  });
135
220
  postUpdate(set, get, options);
@@ -146,6 +231,8 @@ export const getSearchUIFiltersActions = (set, get) => ({
146
231
  set(draft => {
147
232
  Object.assign(draft, conditions);
148
233
  draft.template = template;
234
+ draft.activeTemplateName = template?.name ?? null;
235
+ ensureCustomerLevelDependenciesReducer(draft);
149
236
  });
150
237
  syncCriterionAvailability(set, get);
151
238
  const currentSearchCriteria = extractSearchCriteriaFromState(get());
@@ -154,19 +241,23 @@ export const getSearchUIFiltersActions = (set, get) => ({
154
241
  }
155
242
  set(draft => {
156
243
  draft.prevSearchCriteria = currentSearchCriteria;
244
+ if (!hasUnappliedFilters) {
245
+ draft.appliedSearchCriteria = currentSearchCriteria;
246
+ }
157
247
  draft.hasUnappliedFilters = hasUnappliedFilters;
158
248
  });
159
249
  },
160
250
  clearCriteria: () => {
161
251
  localStorage.removeItem(LAST_TEMPLATE_NAME + get().settingsContextName);
162
252
  set((draft) => {
163
- return {
164
- ...draft,
253
+ Object.assign(draft, {
165
254
  ...getSearchUIInitialSearchCriteria(draft.defaults),
166
255
  exactSearchLabel: draft.exactSearchLabels[0],
167
256
  template: null,
257
+ activeTemplateName: null,
168
258
  criteria: draft.predefinedCriteria,
169
- };
259
+ });
260
+ ensureCustomerLevelDependenciesReducer(draft);
170
261
  });
171
262
  postUpdate(set, get);
172
263
  },
@@ -179,8 +270,10 @@ export const getSearchUIFiltersActions = (set, get) => ({
179
270
  },
180
271
  addCriterion: (criterionType) => {
181
272
  set((draft) => {
182
- draft.criteria.push(criterionType);
183
- addInitialMultigetCriterionReducer(draft, criterionType);
273
+ if (criterionType === CriterionTypeEnum.CUSTOMER_LEVEL) {
274
+ CUSTOMER_LEVEL_DEPENDENCIES.forEach(dependency => addCriterionReducer(draft, dependency, true));
275
+ }
276
+ addCriterionReducer(draft, criterionType);
184
277
  });
185
278
  get().setJustAddedCriterion(criterionType);
186
279
  postUpdate(set, get);
@@ -205,6 +298,7 @@ export const getSearchUIFiltersActions = (set, get) => ({
205
298
  set((draft) => {
206
299
  draft.templates.push(template);
207
300
  draft.template = template;
301
+ draft.activeTemplateName = template.name;
208
302
  });
209
303
  })
210
304
  // .catch(raiseUIError)
@@ -222,6 +316,7 @@ export const getSearchUIFiltersActions = (set, get) => ({
222
316
  const index = draft.templates.findIndex(t => t.name === templateName);
223
317
  draft.templates[index].searchConditions = template.searchConditions;
224
318
  draft.template = template;
319
+ draft.activeTemplateName = template.name;
225
320
  });
226
321
  })
227
322
  // .catch(raiseUIError)
@@ -243,7 +338,9 @@ export const getSearchUIFiltersActions = (set, get) => ({
243
338
  if (draft.template?.name === template.name) {
244
339
  Object.assign(draft, getSearchUIInitialSearchCriteria(draft.defaults));
245
340
  draft.template = null;
341
+ draft.activeTemplateName = null;
246
342
  draft.criteria = draft.predefinedCriteria;
343
+ ensureCustomerLevelDependenciesReducer(draft);
247
344
  }
248
345
  });
249
346
  postUpdate(set, get);
@@ -261,22 +358,37 @@ export const getSearchUIFiltersActions = (set, get) => ({
261
358
  }
262
359
  localStorage.setItem(LAST_TEMPLATE_NAME + get().settingsContextName, template.name);
263
360
  set((draft) => {
264
- return {
265
- ...draft,
266
- template: template,
267
- ...conditions,
268
- };
361
+ Object.assign(draft, defaults);
362
+ draft.template = template;
363
+ draft.activeTemplateName = template.name;
364
+ applyConditionsReducer(draft, conditions);
269
365
  });
270
366
  postUpdate(set, get, options);
271
367
  },
272
368
  loadTemplates: () => {
273
- get().defaults.getSearchTemplates(get().settingsContextName)
369
+ const settingsContextName = get().settingsContextName;
370
+ const defaults = get().defaults;
371
+ defaults.getSearchTemplates(settingsContextName)
274
372
  .then(templates => {
373
+ if (get().settingsContextName !== settingsContextName) {
374
+ return;
375
+ }
275
376
  const normalizedTemplates = templates.map(normalizeSearchUITemplate);
276
377
  set((draft) => {
277
378
  draft.templates = normalizedTemplates;
278
379
  });
279
- const lastTemplateName = localStorage.getItem(LAST_TEMPLATE_NAME + get().settingsContextName);
380
+ if (get().restoredFromRetention) {
381
+ const activeTemplate = normalizedTemplates.find(t => t.name === get().activeTemplateName) ?? null;
382
+ set((draft) => {
383
+ draft.template = activeTemplate;
384
+ draft.activeTemplateName = activeTemplate?.name ?? null;
385
+ });
386
+ return;
387
+ }
388
+ if (get().skipLastTemplateAutoApply) {
389
+ return;
390
+ }
391
+ const lastTemplateName = localStorage.getItem(LAST_TEMPLATE_NAME + settingsContextName);
280
392
  const lastTemplate = normalizedTemplates.find(t => t.name === lastTemplateName);
281
393
  if (lastTemplate) {
282
394
  get().setTemplate(lastTemplate, { forceSearch: true });
@@ -292,8 +404,15 @@ export const getSearchUIFiltersActions = (set, get) => ({
292
404
  },
293
405
  setMultigetCriterion: (criterion) => {
294
406
  set((draft) => {
407
+ const previousMerchantId = criterion.entityType === LinkedEntityTypeEnum.MERCHANT
408
+ ? getConcreteCustomerLevelMerchantId(draft.multigetCriteria)
409
+ : null;
295
410
  const index = draft.multigetCriteria.findIndex(c => c.entityType === criterion.entityType);
296
411
  draft.multigetCriteria[index] = criterion;
412
+ if (criterion.entityType === LinkedEntityTypeEnum.MERCHANT
413
+ && previousMerchantId !== getConcreteCustomerLevelMerchantId(draft.multigetCriteria)) {
414
+ draft.customerLevel = null;
415
+ }
297
416
  });
298
417
  postUpdate(set, get);
299
418
  },
@@ -340,8 +459,19 @@ export const getSearchUIFiltersActions = (set, get) => ({
340
459
  });
341
460
  postUpdate(set, get);
342
461
  },
462
+ setCustomerLevelCriterion: customerLevel => {
463
+ set((draft) => {
464
+ draft.customerLevel = getConcreteCustomerLevelMerchantId(draft.multigetCriteria) === null
465
+ ? null
466
+ : customerLevel;
467
+ });
468
+ postUpdate(set, get);
469
+ },
343
470
  setCurrenciesCriterion: (currencies) => {
344
471
  set((draft) => {
472
+ if (!isEqual(draft.currencies, currencies)) {
473
+ draft.customerLevel = null;
474
+ }
345
475
  draft.currencies = currencies;
346
476
  });
347
477
  postUpdate(set, get);
@@ -486,6 +616,7 @@ export const getSearchUIFiltersActions = (set, get) => ({
486
616
  const currentSearchCriteria = extractSearchCriteriaFromState(get());
487
617
  get().onFiltersUpdate(currentSearchCriteria);
488
618
  set((draft) => {
619
+ draft.appliedSearchCriteria = currentSearchCriteria;
489
620
  draft.hasUnappliedFilters = false;
490
621
  });
491
622
  },
@@ -519,6 +650,7 @@ const addInitialMultigetCriterionReducer = (draft, criterionType) => {
519
650
  case CriterionTypeEnum.RESELLER:
520
651
  draft.multigetCriteria.push(getInitialMultigetCriterion(LinkedEntityTypeEnum.RESELLER));
521
652
  break;
653
+ case CriterionTypeEnum.CUSTOMER_LEVEL:
522
654
  case CriterionTypeEnum.CURRENCY:
523
655
  case CriterionTypeEnum.EXACT:
524
656
  case CriterionTypeEnum.ORDERS_SEARCH:
@@ -562,8 +694,12 @@ const clearCriterionReducer = (draft, criterionType) => {
562
694
  draft.ordersSearchLabel = 'merchant_invoice_id';
563
695
  draft.ordersSearchValue = '';
564
696
  break;
697
+ case CriterionTypeEnum.CUSTOMER_LEVEL:
698
+ draft.customerLevel = null;
699
+ break;
565
700
  case CriterionTypeEnum.CURRENCY:
566
701
  draft.currencies = searchUIInitialAllableCollection;
702
+ draft.customerLevel = null;
567
703
  break;
568
704
  case CriterionTypeEnum.COUNTRIES:
569
705
  draft.countries = searchUICountriesInitialAllableCollection;
@@ -595,6 +731,7 @@ const clearCriterionReducer = (draft, criterionType) => {
595
731
  break;
596
732
  case CriterionTypeEnum.MERCHANT:
597
733
  removeMultigetCriterionReducer(draft, LinkedEntityTypeEnum.MERCHANT);
734
+ draft.customerLevel = null;
598
735
  break;
599
736
  case CriterionTypeEnum.RESELLER:
600
737
  removeMultigetCriterionReducer(draft, LinkedEntityTypeEnum.RESELLER);
@@ -840,6 +977,17 @@ const postUpdate = (set, get, options) => {
840
977
  ensureTransactionSessionStatusesPrefetched(set, get);
841
978
  checkIfFiltersChanged(set, get, options);
842
979
  };
980
+ const normalizeRetainedDateRange = (set, get) => {
981
+ const state = get();
982
+ if (!state.restoredFromRetention || state.dateRangeSpec.dateRangeSpecType === 'EXACTLY') {
983
+ return;
984
+ }
985
+ const timeSelectionEnabled = isDateRangeTimeSelectionEnabled(state.criteria, state.config);
986
+ const normalizedDateRange = calculateNonExactDates(state.dateRangeSpec, getNonExactDateRangeTimeZone(state.config, timeSelectionEnabled));
987
+ set(draft => {
988
+ draft.dateRangeSpec = normalizedDateRange;
989
+ });
990
+ };
843
991
  const syncCriterionAvailability = (set, get) => {
844
992
  const criteriaWithRules = getCriteriaWithAvailabilityRules(get().config);
845
993
  if (!criteriaWithRules.length) {
@@ -895,6 +1043,7 @@ const checkIfFiltersChanged = (set, get, options) => {
895
1043
  get().onFiltersUpdate(currentSearchCriteria);
896
1044
  set((draft) => {
897
1045
  draft.prevSearchCriteria = currentSearchCriteria;
1046
+ draft.appliedSearchCriteria = currentSearchCriteria;
898
1047
  draft.hasUnappliedFilters = false;
899
1048
  });
900
1049
  }
@@ -903,12 +1052,19 @@ const checkIfFiltersChanged = (set, get, options) => {
903
1052
  const extractSearchCriteriaFromState = (state) => {
904
1053
  const timeSelectionEnabled = isDateRangeTimeSelectionEnabled(state.criteria, state.config);
905
1054
  const dateOnlyTimeZone = getConfiguredDateOnlyTimeZone(state.config);
1055
+ const customerLevelDependenciesSatisfied = state.criteria.includes(CriterionTypeEnum.CUSTOMER_LEVEL)
1056
+ && state.criteria.includes(CriterionTypeEnum.MERCHANT)
1057
+ && state.criteria.includes(CriterionTypeEnum.CURRENCY)
1058
+ && getConcreteCustomerLevelMerchantId(state.multigetCriteria) !== null;
906
1059
  return {
907
1060
  initialized: true,
908
1061
  exactSearchLabel: extractExactSearchLabel(state.exactSearchLabel),
909
1062
  exactSearchValue: state.exactSearchValue,
910
1063
  ordersSearchLabel: state.ordersSearchLabel,
911
1064
  ordersSearchValue: state.ordersSearchValue,
1065
+ customerLevelId: customerLevelDependenciesSatisfied
1066
+ ? state.customerLevel?.id ?? null
1067
+ : null,
912
1068
  status: extractStatus(state.status),
913
1069
  threeD: extract3D(state.threeD),
914
1070
  currencies: extractEntitiesIds(state.currencies),
@@ -942,6 +1098,7 @@ const getTemplate = (templateName, store) => ({
942
1098
  exactSearchValue: store.exactSearchValue,
943
1099
  ordersSearchLabel: store.ordersSearchLabel,
944
1100
  ordersSearchValue: store.ordersSearchValue,
1101
+ customerLevel: store.customerLevel,
945
1102
  status: store.status,
946
1103
  currencies: store.currencies,
947
1104
  countries: store.countries,
@@ -1040,6 +1197,7 @@ export const OrdersSearchLabelsConfig = {
1040
1197
  'customer_billing_country': { type: 'country', maxLength: 128 },
1041
1198
  'customer_dna_id': { type: 'integer', maxLength: 10 },
1042
1199
  'customer_id': { type: 'integer', maxLength: 10 },
1200
+ 'merchant_customer_identifier': { type: 'string', maxLength: 128 },
1043
1201
  'batch_id': { type: 'integer', maxLength: 10 },
1044
1202
  'source_bank_name': { type: 'string', maxLength: 128 },
1045
1203
  'source_country': { type: 'country', maxLength: 128 },