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,9 +1 @@
1
- import React from 'react';
2
- import { AbstractEntity } from '../../../../..';
3
- interface IProps {
4
- value: AbstractEntity | null;
5
- onChange: (value: AbstractEntity) => void;
6
- options: AbstractEntity[];
7
- }
8
- declare const SearchUIProcessorLogEntryTypeSelect: (props: IProps) => React.JSX.Element;
9
- export default SearchUIProcessorLogEntryTypeSelect;
1
+ export { default } from './SearchUIAbstractEntityChipSelect';
@@ -1,23 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = void 0;
3
4
  const tslib_1 = require("tslib");
4
- const react_1 = tslib_1.__importStar(require("react"));
5
- const material_1 = require("@mui/material");
6
- const ExpandMore_1 = tslib_1.__importDefault(require("@mui/icons-material/ExpandMore"));
7
- const style_1 = require("./style");
8
- const __1 = require("../../../../..");
9
- const react_i18next_1 = require("react-i18next");
10
- const NULL_OPTION = {
11
- id: 0,
12
- displayName: '',
13
- };
14
- const SearchUIProcessorLogEntryTypeSelect = (props) => {
15
- const { t } = (0, react_i18next_1.useTranslation)();
16
- const { value, onChange, options, } = props;
17
- const [open, setOpen] = (0, react_1.useState)(false);
18
- return react_1.default.createElement(material_1.Box, { sx: { position: 'relative' } },
19
- react_1.default.createElement(material_1.Chip, { onDelete: () => setOpen(true), deleteIcon: react_1.default.createElement(ExpandMore_1.default, null), label: value ? value.displayName : t('react.chooseOne'), size: 'small' }),
20
- react_1.default.createElement(__1.PneSelect, { open: open, onClose: () => setOpen(false), onOpen: () => setOpen(true), sx: style_1.selectUnderChipSx, getOptionLabel: opt => opt.label, value: value ? value : NULL_OPTION, onChange: (value) => onChange(value), options: options }));
21
- };
22
- exports.default = SearchUIProcessorLogEntryTypeSelect;
5
+ var SearchUIAbstractEntityChipSelect_1 = require("./SearchUIAbstractEntityChipSelect");
6
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(SearchUIAbstractEntityChipSelect_1).default; } });
23
7
  //# sourceMappingURL=SearchUIProcessorLogEntryTypeSelect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchUIProcessorLogEntryTypeSelect.js","sourceRoot":"","sources":["../../../../../../src/component/search-ui/filters/component/select/SearchUIProcessorLogEntryTypeSelect.tsx"],"names":[],"mappings":";;;AAAA,uDAAuC;AACvC,4CAAyC;AACzC,wFAA2D;AAC3D,mCAA2C;AAC3C,sCAA0D;AAC1D,iDAA8C;AAQ9C,MAAM,WAAW,GAAmB;IAChC,EAAE,EAAE,CAAC;IACL,WAAW,EAAE,EAAE;CAClB,CAAA;AAED,MAAM,mCAAmC,GAAG,CAAC,KAAa,EAAE,EAAE;IAC1D,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAA;IAC9B,MAAM,EACF,KAAK,EACL,QAAQ,EACR,OAAO,GACV,GAAG,KAAK,CAAA;IACT,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAA;IAEvC,OAAO,8BAAC,cAAG,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;QACpC,8BAAC,eAAI,IACD,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAC7B,UAAU,EAAE,8BAAC,oBAAc,OAAE,EAC7B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,EACvD,IAAI,EAAE,OAAO,GACf;QACF,8BAAC,aAAS,IACN,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAC3B,EAAE,EAAE,yBAAiB,EACrB,cAAc,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAChC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAuB,CAAC,EACtD,OAAO,EAAE,OAAO,GAClB,CACA,CAAA;AACV,CAAC,CAAA;AAED,kBAAe,mCAAmC,CAAA"}
1
+ {"version":3,"file":"SearchUIProcessorLogEntryTypeSelect.js","sourceRoot":"","sources":["../../../../../../src/component/search-ui/filters/component/select/SearchUIProcessorLogEntryTypeSelect.tsx"],"names":[],"mappings":";;;;AAAA,uFAA4D;AAAnD,oJAAA,OAAO,OAAA"}
@@ -0,0 +1,6 @@
1
+ import { MultigetCriterion } from './types';
2
+ /**
3
+ * Returns the merchant selected by an exact multiget criterion.
4
+ * Customer levels are intentionally unavailable for ALL, SEARCH or multi-selection.
5
+ */
6
+ export declare const getConcreteCustomerLevelMerchantId: (multigetCriteria: readonly MultigetCriterion[]) => number | null;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getConcreteCustomerLevelMerchantId = void 0;
4
+ const types_1 = require("./types");
5
+ /**
6
+ * Returns the merchant selected by an exact multiget criterion.
7
+ * Customer levels are intentionally unavailable for ALL, SEARCH or multi-selection.
8
+ */
9
+ const getConcreteCustomerLevelMerchantId = (multigetCriteria) => {
10
+ const merchantCriterion = multigetCriteria.find(criterion => criterion.entityType === types_1.LinkedEntityTypeEnum.MERCHANT);
11
+ if (!merchantCriterion || merchantCriterion.filterType !== types_1.MultichoiceFilterTypeEnum.NONE) {
12
+ return null;
13
+ }
14
+ const selectedIds = merchantCriterion.selectedItems
15
+ .split(',')
16
+ .map(value => value.trim())
17
+ .filter(Boolean);
18
+ if (selectedIds.length !== 1) {
19
+ return null;
20
+ }
21
+ const merchantId = Number(selectedIds[0]);
22
+ return Number.isSafeInteger(merchantId) && merchantId > 0 ? merchantId : null;
23
+ };
24
+ exports.getConcreteCustomerLevelMerchantId = getConcreteCustomerLevelMerchantId;
25
+ //# sourceMappingURL=customerLevelDependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customerLevelDependencies.js","sourceRoot":"","sources":["../../../../src/component/search-ui/filters/customerLevelDependencies.ts"],"names":[],"mappings":";;;AAAA,mCAIgB;AAEhB;;;GAGG;AACI,MAAM,kCAAkC,GAAG,CAC9C,gBAA8C,EACjC,EAAE;IACf,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,IAAI,CAC3C,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,KAAK,4BAAoB,CAAC,QAAQ,CACtE,CAAA;IAED,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,UAAU,KAAK,iCAAyB,CAAC,IAAI,EAAE,CAAC;QACxF,OAAO,IAAI,CAAA;IACf,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,aAAa;SAC9C,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAA;IAEpB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAA;IACf,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IACzC,OAAO,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAA;AACjF,CAAC,CAAA;AAtBY,QAAA,kCAAkC,sCAsB9C"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ settingsContextName: string;
4
+ children: React.ReactNode;
5
+ };
6
+ export declare const SearchUIFiltersStoreProvider: ({ settingsContextName, children }: Props) => React.JSX.Element;
7
+ export {};
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchUIFiltersStoreProvider = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importStar(require("react"));
6
+ const store_1 = require("./store");
7
+ const retention_1 = require("./retention");
8
+ const SearchUIFiltersStoreProvider = ({ settingsContextName, children }) => {
9
+ const store = (0, react_1.useMemo)(store_1.createSearchUIFiltersStore, [settingsContextName]);
10
+ const instanceIdRef = (0, react_1.useRef)(Symbol(settingsContextName));
11
+ useStoreLifecycleEffect(() => {
12
+ const unregister = (0, retention_1.registerSearchUIInstance)(settingsContextName, instanceIdRef.current);
13
+ const persistState = () => (0, retention_1.retainSearchUIState)(settingsContextName, store.getState());
14
+ const unsubscribe = store.subscribe(persistState);
15
+ persistState();
16
+ return () => {
17
+ persistState();
18
+ unsubscribe();
19
+ unregister();
20
+ };
21
+ }, [settingsContextName, store]);
22
+ const contextValue = (0, react_1.useMemo)(() => ({
23
+ store,
24
+ instanceId: instanceIdRef.current,
25
+ }), [store]);
26
+ return react_1.default.createElement(store_1.SearchUIFiltersStoreContext.Provider, { value: contextValue }, children);
27
+ };
28
+ exports.SearchUIFiltersStoreProvider = SearchUIFiltersStoreProvider;
29
+ const useStoreLifecycleEffect = typeof window === 'undefined' ? react_1.useEffect : react_1.useLayoutEffect;
30
+ //# sourceMappingURL=SearchUIFiltersStoreProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchUIFiltersStoreProvider.js","sourceRoot":"","sources":["../../../../../src/component/search-ui/filters/state/SearchUIFiltersStoreProvider.tsx"],"names":[],"mappings":";;;;AAAA,uDAAwE;AACxE,mCAGgB;AAChB,2CAGoB;AAOb,MAAM,4BAA4B,GAAG,CAAC,EAAC,mBAAmB,EAAE,QAAQ,EAAQ,EAAE,EAAE;IACnF,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,kCAA0B,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACxE,MAAM,aAAa,GAAG,IAAA,cAAM,EAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAEzD,uBAAuB,CAAC,GAAG,EAAE;QACzB,MAAM,UAAU,GAAG,IAAA,oCAAwB,EAAC,mBAAmB,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;QACvF,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAA,+BAAmB,EAAC,mBAAmB,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACrF,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAEjD,YAAY,EAAE,CAAA;QAEd,OAAO,GAAG,EAAE;YACR,YAAY,EAAE,CAAA;YACd,WAAW,EAAE,CAAA;YACb,UAAU,EAAE,CAAA;QAChB,CAAC,CAAA;IACL,CAAC,EAAE,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAAA;IAEhC,MAAM,YAAY,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,CAAC;QAChC,KAAK;QACL,UAAU,EAAE,aAAa,CAAC,OAAO;KACpC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEZ,OAAO,8BAAC,mCAA2B,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,IAC3D,QAAQ,CAC0B,CAAA;AAC3C,CAAC,CAAA;AA1BY,QAAA,4BAA4B,gCA0BxC;AAED,MAAM,uBAAuB,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,iBAAS,CAAC,CAAC,CAAC,uBAAe,CAAA"}
@@ -14,6 +14,7 @@ const isoWeek_1 = tslib_1.__importDefault(require("dayjs/plugin/isoWeek"));
14
14
  const cloneDeep_1 = tslib_1.__importDefault(require("lodash/cloneDeep"));
15
15
  const isEqual_1 = tslib_1.__importDefault(require("lodash/isEqual"));
16
16
  const dateRangeTimeZone_1 = require("../dateRangeTimeZone");
17
+ const customerLevelDependencies_1 = require("../customerLevelDependencies");
17
18
  dayjs_1.default.extend(utc_1.default);
18
19
  dayjs_1.default.extend(timezone_1.default);
19
20
  dayjs_1.default.extend(isoWeek_1.default);
@@ -32,6 +33,7 @@ const criterionToLinkedEntityMap = {
32
33
  const getLinkedEntityTypeByCriterion = (criterion) => {
33
34
  return criterionToLinkedEntityMap[criterion] ?? null;
34
35
  };
36
+ const isConfiguredCriterion = (draft, criterion) => draft.possibleCriteria.includes(criterion) || draft.predefinedCriteria.includes(criterion);
35
37
  const getInitialMultigetCriterion = (entityType) => ({
36
38
  entityType: entityType,
37
39
  filterType: types_1.MultichoiceFilterTypeEnum.NONE,
@@ -82,58 +84,141 @@ const sanitizeMultigetCriteria = (incoming, activeCriteria) => {
82
84
  });
83
85
  return Array.from(uniqueByEntity.values());
84
86
  };
87
+ const isRetainedSnapshotCompatible = (snapshot, state) => {
88
+ return (0, isEqual_1.default)(snapshot.possibleCriteria, state.possibleCriteria)
89
+ && (0, isEqual_1.default)(snapshot.predefinedCriteria, state.predefinedCriteria)
90
+ && (0, isEqual_1.default)(snapshot.exactSearchLabels, state.exactSearchLabels)
91
+ && snapshot.manualSearch === !!state.config?.manualSearch;
92
+ };
93
+ const addCriterionReducer = (draft, criterion, configuredOnly = false) => {
94
+ if (configuredOnly && !isConfiguredCriterion(draft, criterion)) {
95
+ return;
96
+ }
97
+ if (draft.criteria.includes(criterion)) {
98
+ const entityType = getLinkedEntityTypeByCriterion(criterion);
99
+ if (entityType !== null
100
+ && !draft.multigetCriteria.some(multigetCriterion => multigetCriterion.entityType === entityType)) {
101
+ draft.multigetCriteria.push(getInitialMultigetCriterion(entityType));
102
+ }
103
+ return;
104
+ }
105
+ draft.criteria.push(criterion);
106
+ addInitialMultigetCriterionReducer(draft, criterion);
107
+ };
108
+ const ensureCustomerLevelDependenciesReducer = (draft) => {
109
+ if (!draft.criteria.includes(types_1.CriterionTypeEnum.CUSTOMER_LEVEL)) {
110
+ return;
111
+ }
112
+ types_1.CUSTOMER_LEVEL_DEPENDENCIES.forEach(dependency => addCriterionReducer(draft, dependency, true));
113
+ };
114
+ const applyConditionsReducer = (draft, conditions) => {
115
+ const { criteria: incomingCriteria, multigetCriteria: incomingMultigetCriteria, ...rest } = conditions;
116
+ const prevCriteria = draft.criteria.slice();
117
+ Object.assign(draft, rest);
118
+ if (incomingCriteria !== undefined) {
119
+ const allowedCriteria = new Set([
120
+ ...draft.predefinedCriteria,
121
+ ...draft.possibleCriteria,
122
+ ]);
123
+ const sanitizedIncoming = Array.from(new Set(incomingCriteria.filter(criterion => allowedCriteria.has(criterion))));
124
+ const mergedCriteria = Array.from(new Set([
125
+ ...draft.predefinedCriteria,
126
+ ...sanitizedIncoming,
127
+ ]));
128
+ const removedCriteria = prevCriteria.filter(criterion => !mergedCriteria.includes(criterion));
129
+ removedCriteria.forEach(criterion => {
130
+ clearCriterionReducer(draft, criterion);
131
+ });
132
+ const addedCriteria = mergedCriteria.filter(criterion => !prevCriteria.includes(criterion));
133
+ if (incomingMultigetCriteria === undefined) {
134
+ addedCriteria.forEach(criterion => {
135
+ addInitialMultigetCriterionReducer(draft, criterion);
136
+ });
137
+ }
138
+ draft.criteria = mergedCriteria;
139
+ }
140
+ if (incomingMultigetCriteria !== undefined) {
141
+ const sanitizedMultigetCriteria = sanitizeMultigetCriteria(incomingMultigetCriteria, draft.criteria);
142
+ const missingEntityTypes = draft.criteria
143
+ .map(getLinkedEntityTypeByCriterion)
144
+ .filter((entityType) => entityType !== null)
145
+ .filter(entityType => !sanitizedMultigetCriteria.some(item => item.entityType === entityType));
146
+ missingEntityTypes.forEach(entityType => {
147
+ sanitizedMultigetCriteria.push(getInitialMultigetCriterion(entityType));
148
+ });
149
+ draft.multigetCriteria = sanitizedMultigetCriteria;
150
+ }
151
+ ensureCustomerLevelDependenciesReducer(draft);
152
+ };
153
+ const restoreAppliedSearchCriteria = (snapshot, retainedDraftSearchCriteria, currentSearchCriteria) => {
154
+ if (!snapshot.hasUnappliedFilters || !snapshot.appliedSearchCriteria) {
155
+ return currentSearchCriteria;
156
+ }
157
+ const retainedDraftWithoutDates = {
158
+ ...retainedDraftSearchCriteria,
159
+ dateFrom: currentSearchCriteria.dateFrom,
160
+ dateTo: currentSearchCriteria.dateTo,
161
+ };
162
+ if (!(0, isEqual_1.default)(retainedDraftWithoutDates, currentSearchCriteria)) {
163
+ return currentSearchCriteria;
164
+ }
165
+ return {
166
+ ...(0, cloneDeep_1.default)(snapshot.appliedSearchCriteria),
167
+ dateFrom: (0, isEqual_1.default)(snapshot.appliedSearchCriteria.dateFrom, retainedDraftSearchCriteria.dateFrom)
168
+ ? currentSearchCriteria.dateFrom
169
+ : snapshot.appliedSearchCriteria.dateFrom,
170
+ dateTo: (0, isEqual_1.default)(snapshot.appliedSearchCriteria.dateTo, retainedDraftSearchCriteria.dateTo)
171
+ ? currentSearchCriteria.dateTo
172
+ : snapshot.appliedSearchCriteria.dateTo,
173
+ };
174
+ };
85
175
  const getSearchUIFiltersActions = (set, get) => ({
86
- setInitialState: (state) => {
176
+ setInitialState: (state, retainedSnapshot) => {
87
177
  set((draft) => {
88
- return {
178
+ const initialState = {
89
179
  ...draft,
90
180
  ...(0, initial_1.getSearchUIFiltersInitialState)(),
91
181
  ...(0, initial_1.getSearchUIInitialSearchCriteria)(state.defaults),
92
182
  ...state,
93
183
  };
184
+ Object.assign(draft, initialState);
185
+ ensureCustomerLevelDependenciesReducer(draft);
186
+ if (retainedSnapshot && isRetainedSnapshotCompatible(retainedSnapshot, initialState)) {
187
+ applyConditionsReducer(draft, retainedSnapshot.searchConditions);
188
+ draft.activeTemplateName = retainedSnapshot.activeTemplateName;
189
+ draft.restoredFromRetention = true;
190
+ }
191
+ draft.initialized = true;
94
192
  });
95
- postUpdate(set, get);
193
+ const retainedDraftSearchCriteria = get().restoredFromRetention
194
+ ? extractSearchCriteriaFromState(get())
195
+ : null;
196
+ syncCriterionAvailability(set, get);
197
+ normalizeRetainedDateRange(set, get);
198
+ ensureTransactionSessionStatusesPrefetched(set, get);
199
+ if (get().restoredFromRetention && retainedSnapshot && retainedDraftSearchCriteria) {
200
+ const currentSearchCriteria = extractSearchCriteriaFromState(get());
201
+ const appliedSearchCriteria = get().config?.manualSearch
202
+ ? restoreAppliedSearchCriteria(retainedSnapshot, retainedDraftSearchCriteria, currentSearchCriteria)
203
+ : currentSearchCriteria;
204
+ get().onFiltersUpdate(appliedSearchCriteria);
205
+ set((draft) => {
206
+ draft.prevSearchCriteria = currentSearchCriteria;
207
+ draft.appliedSearchCriteria = appliedSearchCriteria;
208
+ draft.hasUnappliedFilters = !!draft.config?.manualSearch
209
+ && !(0, isEqual_1.default)(currentSearchCriteria, appliedSearchCriteria);
210
+ });
211
+ return;
212
+ }
213
+ checkIfFiltersChanged(set, get);
96
214
  },
97
215
  updateConditions: (conditions, options) => {
98
216
  set((draft) => {
99
- const { criteria: incomingCriteria, multigetCriteria: incomingMultigetCriteria, ...rest } = conditions;
100
- const prevCriteria = draft.criteria.slice();
101
- Object.assign(draft, rest);
102
- if (incomingCriteria !== undefined) {
103
- const allowedCriteria = new Set([
104
- ...draft.predefinedCriteria,
105
- ...draft.possibleCriteria,
106
- ]);
107
- const sanitizedIncoming = Array.from(new Set(incomingCriteria.filter(criterion => allowedCriteria.has(criterion))));
108
- const mergedCriteria = Array.from(new Set([
109
- ...draft.predefinedCriteria,
110
- ...sanitizedIncoming,
111
- ]));
112
- const removedCriteria = prevCriteria.filter(criterion => !mergedCriteria.includes(criterion));
113
- removedCriteria.forEach(criterion => {
114
- clearCriterionReducer(draft, criterion);
115
- });
116
- const addedCriteria = mergedCriteria.filter(criterion => !prevCriteria.includes(criterion));
117
- if (incomingMultigetCriteria === undefined) {
118
- addedCriteria.forEach(criterion => {
119
- addInitialMultigetCriterionReducer(draft, criterion);
120
- });
121
- }
122
- draft.criteria = mergedCriteria;
123
- }
124
- if (incomingMultigetCriteria !== undefined) {
125
- const sanitizedMultigetCriteria = sanitizeMultigetCriteria(incomingMultigetCriteria, draft.criteria);
126
- const missingEntityTypes = draft.criteria
127
- .map(getLinkedEntityTypeByCriterion)
128
- .filter((entityType) => entityType !== null)
129
- .filter(entityType => !sanitizedMultigetCriteria.some(item => item.entityType === entityType));
130
- missingEntityTypes.forEach(entityType => {
131
- sanitizedMultigetCriteria.push(getInitialMultigetCriterion(entityType));
132
- });
133
- draft.multigetCriteria = sanitizedMultigetCriteria;
134
- }
217
+ applyConditionsReducer(draft, conditions);
135
218
  if (options?.resetTemplate) {
136
219
  draft.template = null;
220
+ draft.activeTemplateName = null;
221
+ draft.skipLastTemplateAutoApply = true;
137
222
  }
138
223
  });
139
224
  postUpdate(set, get, options);
@@ -150,6 +235,8 @@ const getSearchUIFiltersActions = (set, get) => ({
150
235
  set(draft => {
151
236
  Object.assign(draft, conditions);
152
237
  draft.template = template;
238
+ draft.activeTemplateName = template?.name ?? null;
239
+ ensureCustomerLevelDependenciesReducer(draft);
153
240
  });
154
241
  syncCriterionAvailability(set, get);
155
242
  const currentSearchCriteria = extractSearchCriteriaFromState(get());
@@ -158,19 +245,23 @@ const getSearchUIFiltersActions = (set, get) => ({
158
245
  }
159
246
  set(draft => {
160
247
  draft.prevSearchCriteria = currentSearchCriteria;
248
+ if (!hasUnappliedFilters) {
249
+ draft.appliedSearchCriteria = currentSearchCriteria;
250
+ }
161
251
  draft.hasUnappliedFilters = hasUnappliedFilters;
162
252
  });
163
253
  },
164
254
  clearCriteria: () => {
165
255
  localStorage.removeItem(LAST_TEMPLATE_NAME + get().settingsContextName);
166
256
  set((draft) => {
167
- return {
168
- ...draft,
257
+ Object.assign(draft, {
169
258
  ...(0, initial_1.getSearchUIInitialSearchCriteria)(draft.defaults),
170
259
  exactSearchLabel: draft.exactSearchLabels[0],
171
260
  template: null,
261
+ activeTemplateName: null,
172
262
  criteria: draft.predefinedCriteria,
173
- };
263
+ });
264
+ ensureCustomerLevelDependenciesReducer(draft);
174
265
  });
175
266
  postUpdate(set, get);
176
267
  },
@@ -183,8 +274,10 @@ const getSearchUIFiltersActions = (set, get) => ({
183
274
  },
184
275
  addCriterion: (criterionType) => {
185
276
  set((draft) => {
186
- draft.criteria.push(criterionType);
187
- addInitialMultigetCriterionReducer(draft, criterionType);
277
+ if (criterionType === types_1.CriterionTypeEnum.CUSTOMER_LEVEL) {
278
+ types_1.CUSTOMER_LEVEL_DEPENDENCIES.forEach(dependency => addCriterionReducer(draft, dependency, true));
279
+ }
280
+ addCriterionReducer(draft, criterionType);
188
281
  });
189
282
  get().setJustAddedCriterion(criterionType);
190
283
  postUpdate(set, get);
@@ -209,6 +302,7 @@ const getSearchUIFiltersActions = (set, get) => ({
209
302
  set((draft) => {
210
303
  draft.templates.push(template);
211
304
  draft.template = template;
305
+ draft.activeTemplateName = template.name;
212
306
  });
213
307
  })
214
308
  // .catch(raiseUIError)
@@ -226,6 +320,7 @@ const getSearchUIFiltersActions = (set, get) => ({
226
320
  const index = draft.templates.findIndex(t => t.name === templateName);
227
321
  draft.templates[index].searchConditions = template.searchConditions;
228
322
  draft.template = template;
323
+ draft.activeTemplateName = template.name;
229
324
  });
230
325
  })
231
326
  // .catch(raiseUIError)
@@ -247,7 +342,9 @@ const getSearchUIFiltersActions = (set, get) => ({
247
342
  if (draft.template?.name === template.name) {
248
343
  Object.assign(draft, (0, initial_1.getSearchUIInitialSearchCriteria)(draft.defaults));
249
344
  draft.template = null;
345
+ draft.activeTemplateName = null;
250
346
  draft.criteria = draft.predefinedCriteria;
347
+ ensureCustomerLevelDependenciesReducer(draft);
251
348
  }
252
349
  });
253
350
  postUpdate(set, get);
@@ -265,22 +362,37 @@ const getSearchUIFiltersActions = (set, get) => ({
265
362
  }
266
363
  localStorage.setItem(LAST_TEMPLATE_NAME + get().settingsContextName, template.name);
267
364
  set((draft) => {
268
- return {
269
- ...draft,
270
- template: template,
271
- ...conditions,
272
- };
365
+ Object.assign(draft, defaults);
366
+ draft.template = template;
367
+ draft.activeTemplateName = template.name;
368
+ applyConditionsReducer(draft, conditions);
273
369
  });
274
370
  postUpdate(set, get, options);
275
371
  },
276
372
  loadTemplates: () => {
277
- get().defaults.getSearchTemplates(get().settingsContextName)
373
+ const settingsContextName = get().settingsContextName;
374
+ const defaults = get().defaults;
375
+ defaults.getSearchTemplates(settingsContextName)
278
376
  .then(templates => {
377
+ if (get().settingsContextName !== settingsContextName) {
378
+ return;
379
+ }
279
380
  const normalizedTemplates = templates.map(normalizeSearchUITemplate);
280
381
  set((draft) => {
281
382
  draft.templates = normalizedTemplates;
282
383
  });
283
- const lastTemplateName = localStorage.getItem(LAST_TEMPLATE_NAME + get().settingsContextName);
384
+ if (get().restoredFromRetention) {
385
+ const activeTemplate = normalizedTemplates.find(t => t.name === get().activeTemplateName) ?? null;
386
+ set((draft) => {
387
+ draft.template = activeTemplate;
388
+ draft.activeTemplateName = activeTemplate?.name ?? null;
389
+ });
390
+ return;
391
+ }
392
+ if (get().skipLastTemplateAutoApply) {
393
+ return;
394
+ }
395
+ const lastTemplateName = localStorage.getItem(LAST_TEMPLATE_NAME + settingsContextName);
284
396
  const lastTemplate = normalizedTemplates.find(t => t.name === lastTemplateName);
285
397
  if (lastTemplate) {
286
398
  get().setTemplate(lastTemplate, { forceSearch: true });
@@ -296,8 +408,15 @@ const getSearchUIFiltersActions = (set, get) => ({
296
408
  },
297
409
  setMultigetCriterion: (criterion) => {
298
410
  set((draft) => {
411
+ const previousMerchantId = criterion.entityType === types_1.LinkedEntityTypeEnum.MERCHANT
412
+ ? (0, customerLevelDependencies_1.getConcreteCustomerLevelMerchantId)(draft.multigetCriteria)
413
+ : null;
299
414
  const index = draft.multigetCriteria.findIndex(c => c.entityType === criterion.entityType);
300
415
  draft.multigetCriteria[index] = criterion;
416
+ if (criterion.entityType === types_1.LinkedEntityTypeEnum.MERCHANT
417
+ && previousMerchantId !== (0, customerLevelDependencies_1.getConcreteCustomerLevelMerchantId)(draft.multigetCriteria)) {
418
+ draft.customerLevel = null;
419
+ }
301
420
  });
302
421
  postUpdate(set, get);
303
422
  },
@@ -344,8 +463,19 @@ const getSearchUIFiltersActions = (set, get) => ({
344
463
  });
345
464
  postUpdate(set, get);
346
465
  },
466
+ setCustomerLevelCriterion: customerLevel => {
467
+ set((draft) => {
468
+ draft.customerLevel = (0, customerLevelDependencies_1.getConcreteCustomerLevelMerchantId)(draft.multigetCriteria) === null
469
+ ? null
470
+ : customerLevel;
471
+ });
472
+ postUpdate(set, get);
473
+ },
347
474
  setCurrenciesCriterion: (currencies) => {
348
475
  set((draft) => {
476
+ if (!(0, isEqual_1.default)(draft.currencies, currencies)) {
477
+ draft.customerLevel = null;
478
+ }
349
479
  draft.currencies = currencies;
350
480
  });
351
481
  postUpdate(set, get);
@@ -490,6 +620,7 @@ const getSearchUIFiltersActions = (set, get) => ({
490
620
  const currentSearchCriteria = extractSearchCriteriaFromState(get());
491
621
  get().onFiltersUpdate(currentSearchCriteria);
492
622
  set((draft) => {
623
+ draft.appliedSearchCriteria = currentSearchCriteria;
493
624
  draft.hasUnappliedFilters = false;
494
625
  });
495
626
  },
@@ -524,6 +655,7 @@ const addInitialMultigetCriterionReducer = (draft, criterionType) => {
524
655
  case types_1.CriterionTypeEnum.RESELLER:
525
656
  draft.multigetCriteria.push(getInitialMultigetCriterion(types_1.LinkedEntityTypeEnum.RESELLER));
526
657
  break;
658
+ case types_1.CriterionTypeEnum.CUSTOMER_LEVEL:
527
659
  case types_1.CriterionTypeEnum.CURRENCY:
528
660
  case types_1.CriterionTypeEnum.EXACT:
529
661
  case types_1.CriterionTypeEnum.ORDERS_SEARCH:
@@ -567,8 +699,12 @@ const clearCriterionReducer = (draft, criterionType) => {
567
699
  draft.ordersSearchLabel = 'merchant_invoice_id';
568
700
  draft.ordersSearchValue = '';
569
701
  break;
702
+ case types_1.CriterionTypeEnum.CUSTOMER_LEVEL:
703
+ draft.customerLevel = null;
704
+ break;
570
705
  case types_1.CriterionTypeEnum.CURRENCY:
571
706
  draft.currencies = initial_1.searchUIInitialAllableCollection;
707
+ draft.customerLevel = null;
572
708
  break;
573
709
  case types_1.CriterionTypeEnum.COUNTRIES:
574
710
  draft.countries = initial_1.searchUICountriesInitialAllableCollection;
@@ -600,6 +736,7 @@ const clearCriterionReducer = (draft, criterionType) => {
600
736
  break;
601
737
  case types_1.CriterionTypeEnum.MERCHANT:
602
738
  removeMultigetCriterionReducer(draft, types_1.LinkedEntityTypeEnum.MERCHANT);
739
+ draft.customerLevel = null;
603
740
  break;
604
741
  case types_1.CriterionTypeEnum.RESELLER:
605
742
  removeMultigetCriterionReducer(draft, types_1.LinkedEntityTypeEnum.RESELLER);
@@ -845,6 +982,17 @@ const postUpdate = (set, get, options) => {
845
982
  ensureTransactionSessionStatusesPrefetched(set, get);
846
983
  checkIfFiltersChanged(set, get, options);
847
984
  };
985
+ const normalizeRetainedDateRange = (set, get) => {
986
+ const state = get();
987
+ if (!state.restoredFromRetention || state.dateRangeSpec.dateRangeSpecType === 'EXACTLY') {
988
+ return;
989
+ }
990
+ const timeSelectionEnabled = isDateRangeTimeSelectionEnabled(state.criteria, state.config);
991
+ const normalizedDateRange = calculateNonExactDates(state.dateRangeSpec, getNonExactDateRangeTimeZone(state.config, timeSelectionEnabled));
992
+ set(draft => {
993
+ draft.dateRangeSpec = normalizedDateRange;
994
+ });
995
+ };
848
996
  const syncCriterionAvailability = (set, get) => {
849
997
  const criteriaWithRules = (0, criterionAvailability_1.getCriteriaWithAvailabilityRules)(get().config);
850
998
  if (!criteriaWithRules.length) {
@@ -900,6 +1048,7 @@ const checkIfFiltersChanged = (set, get, options) => {
900
1048
  get().onFiltersUpdate(currentSearchCriteria);
901
1049
  set((draft) => {
902
1050
  draft.prevSearchCriteria = currentSearchCriteria;
1051
+ draft.appliedSearchCriteria = currentSearchCriteria;
903
1052
  draft.hasUnappliedFilters = false;
904
1053
  });
905
1054
  }
@@ -908,12 +1057,19 @@ const checkIfFiltersChanged = (set, get, options) => {
908
1057
  const extractSearchCriteriaFromState = (state) => {
909
1058
  const timeSelectionEnabled = isDateRangeTimeSelectionEnabled(state.criteria, state.config);
910
1059
  const dateOnlyTimeZone = getConfiguredDateOnlyTimeZone(state.config);
1060
+ const customerLevelDependenciesSatisfied = state.criteria.includes(types_1.CriterionTypeEnum.CUSTOMER_LEVEL)
1061
+ && state.criteria.includes(types_1.CriterionTypeEnum.MERCHANT)
1062
+ && state.criteria.includes(types_1.CriterionTypeEnum.CURRENCY)
1063
+ && (0, customerLevelDependencies_1.getConcreteCustomerLevelMerchantId)(state.multigetCriteria) !== null;
911
1064
  return {
912
1065
  initialized: true,
913
1066
  exactSearchLabel: extractExactSearchLabel(state.exactSearchLabel),
914
1067
  exactSearchValue: state.exactSearchValue,
915
1068
  ordersSearchLabel: state.ordersSearchLabel,
916
1069
  ordersSearchValue: state.ordersSearchValue,
1070
+ customerLevelId: customerLevelDependenciesSatisfied
1071
+ ? state.customerLevel?.id ?? null
1072
+ : null,
917
1073
  status: extractStatus(state.status),
918
1074
  threeD: extract3D(state.threeD),
919
1075
  currencies: extractEntitiesIds(state.currencies),
@@ -947,6 +1103,7 @@ const getTemplate = (templateName, store) => ({
947
1103
  exactSearchValue: store.exactSearchValue,
948
1104
  ordersSearchLabel: store.ordersSearchLabel,
949
1105
  ordersSearchValue: store.ordersSearchValue,
1106
+ customerLevel: store.customerLevel,
950
1107
  status: store.status,
951
1108
  currencies: store.currencies,
952
1109
  countries: store.countries,
@@ -1045,6 +1202,7 @@ exports.OrdersSearchLabelsConfig = {
1045
1202
  'customer_billing_country': { type: 'country', maxLength: 128 },
1046
1203
  'customer_dna_id': { type: 'integer', maxLength: 10 },
1047
1204
  'customer_id': { type: 'integer', maxLength: 10 },
1205
+ 'merchant_customer_identifier': { type: 'string', maxLength: 128 },
1048
1206
  'batch_id': { type: 'integer', maxLength: 10 },
1049
1207
  'source_bank_name': { type: 'string', maxLength: 128 },
1050
1208
  'source_country': { type: 'country', maxLength: 128 },