@reltio/components 1.4.1731 → 1.4.1732

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 (39) hide show
  1. package/cjs/components/AttributesFiltersBuilder/AttributesFiltersBuilder.d.ts +7 -3
  2. package/cjs/components/AttributesFiltersBuilder/AttributesFiltersBuilder.js +34 -19
  3. package/cjs/components/AttributesFiltersBuilder/components/AttributeSelector/AttributeSelector.js +7 -5
  4. package/cjs/components/AttributesFiltersBuilder/components/FilterSelector/FilterSelector.js +3 -2
  5. package/cjs/components/AttributesFiltersBuilder/components/ValuesEditor/ValuesEditor.js +5 -3
  6. package/cjs/components/AttributesFiltersBuilder/components/ValuesEditor/styles.js +1 -1
  7. package/cjs/components/AttributesFiltersBuilder/helpers.d.ts +5 -4
  8. package/cjs/components/AttributesFiltersBuilder/helpers.js +33 -19
  9. package/cjs/components/AttributesFiltersBuilder/types.d.ts +3 -2
  10. package/cjs/components/AttributesFiltersButton/AttributesFiltersButton.d.ts +10 -3
  11. package/cjs/components/AttributesFiltersButton/AttributesFiltersButton.js +10 -6
  12. package/cjs/components/BasicAttributeSelector/styles.js +1 -0
  13. package/cjs/components/LogicOperator/LogicOperator.d.ts +9 -0
  14. package/cjs/components/LogicOperator/LogicOperator.js +29 -0
  15. package/cjs/components/LogicOperator/styles.d.ts +2 -0
  16. package/cjs/components/LogicOperator/styles.js +15 -0
  17. package/cjs/components/index.d.ts +1 -0
  18. package/cjs/components/index.js +3 -1
  19. package/cjs/types/index.d.ts +14 -1
  20. package/esm/components/AttributesFiltersBuilder/AttributesFiltersBuilder.d.ts +7 -3
  21. package/esm/components/AttributesFiltersBuilder/AttributesFiltersBuilder.js +36 -21
  22. package/esm/components/AttributesFiltersBuilder/components/AttributeSelector/AttributeSelector.js +9 -7
  23. package/esm/components/AttributesFiltersBuilder/components/FilterSelector/FilterSelector.js +3 -2
  24. package/esm/components/AttributesFiltersBuilder/components/ValuesEditor/ValuesEditor.js +5 -3
  25. package/esm/components/AttributesFiltersBuilder/components/ValuesEditor/styles.js +1 -1
  26. package/esm/components/AttributesFiltersBuilder/helpers.d.ts +5 -4
  27. package/esm/components/AttributesFiltersBuilder/helpers.js +34 -20
  28. package/esm/components/AttributesFiltersBuilder/types.d.ts +3 -2
  29. package/esm/components/AttributesFiltersButton/AttributesFiltersButton.d.ts +10 -3
  30. package/esm/components/AttributesFiltersButton/AttributesFiltersButton.js +10 -6
  31. package/esm/components/BasicAttributeSelector/styles.js +1 -0
  32. package/esm/components/LogicOperator/LogicOperator.d.ts +9 -0
  33. package/esm/components/LogicOperator/LogicOperator.js +24 -0
  34. package/esm/components/LogicOperator/styles.d.ts +2 -0
  35. package/esm/components/LogicOperator/styles.js +13 -0
  36. package/esm/components/index.d.ts +1 -0
  37. package/esm/components/index.js +1 -0
  38. package/esm/types/index.d.ts +14 -1
  39. package/package.json +2 -2
@@ -1,13 +1,17 @@
1
1
  import React from 'react';
2
- import { SearchFilter, AttributeType } from '@reltio/mdm-sdk';
2
+ import { SearchFilter } from '@reltio/mdm-sdk';
3
+ import { AttributeSelectionInfo, AttributesFilterComponentsClasses, AttributesTypesGroup } from '../../types';
3
4
  type Props = {
5
+ classes?: AttributesFilterComponentsClasses;
4
6
  filters: SearchFilter[];
5
7
  onChange: (filters: SearchFilter[]) => void;
6
- attributeTypes: AttributeType[];
8
+ attributesTypesGroups: AttributesTypesGroup[];
7
9
  components?: {
8
10
  ValuesEditor?: React.ElementType;
9
11
  FilterSelector?: React.ElementType;
12
+ LogicalOperator?: React.ElementType;
10
13
  };
14
+ onFilterAttributeChange?: (attrSelectInfo: AttributeSelectionInfo) => void;
11
15
  };
12
- declare const _default: React.MemoExoticComponent<({ attributeTypes, filters, onChange, components }: Props) => JSX.Element>;
16
+ declare const _default: React.MemoExoticComponent<({ classes, attributesTypesGroups, filters, onChange, components, onFilterAttributeChange }: Props) => JSX.Element>;
13
17
  export default _default;
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
14
  if (k2 === undefined) k2 = k;
4
15
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -42,30 +53,38 @@ var helpers_1 = require("./helpers");
42
53
  var FilterSelector_1 = __importDefault(require("./components/FilterSelector/FilterSelector"));
43
54
  var RowActions_1 = __importDefault(require("./components/RowActions/RowActions"));
44
55
  var QueryBuilderRowsGroup_1 = __importDefault(require("../QueryBuilderRowsGroup/QueryBuilderRowsGroup"));
56
+ var contexts_1 = require("../../contexts");
57
+ var core_1 = require("../../core");
45
58
  var AttributeSelector_1 = __importDefault(require("./components/AttributeSelector/AttributeSelector"));
46
59
  var ValuesEditor_1 = __importDefault(require("./components/ValuesEditor/ValuesEditor"));
47
- var contexts_1 = require("../../contexts");
48
60
  var styles_1 = require("./styles");
49
- var EMPTY_FILTER = { fieldName: null, filter: null, values: [] };
50
- var Stub = function () { return null; };
61
+ var EMPTY_FILTER = { fieldName: null, filter: null, operator: mdm_sdk_1.SearchOperator.and, values: [] };
51
62
  var AttributesFiltersBuilder = function (_a) {
52
- var attributeTypes = _a.attributeTypes, filters = _a.filters, onChange = _a.onChange, _b = _a.components, components = _b === void 0 ? {} : _b;
53
- var CustomValuesEditor = components.ValuesEditor, CustomFilterSelector = components.FilterSelector;
54
- var _c = (0, styles_1.useStyles)(), attrSelector = _c.attrSelector, filterSelector = _c.filterSelector, actionContainer = _c.actionContainer;
63
+ var _b = _a.classes, classes = _b === void 0 ? {} : _b, attributesTypesGroups = _a.attributesTypesGroups, filters = _a.filters, onChange = _a.onChange, _c = _a.components, components = _c === void 0 ? {} : _c, onFilterAttributeChange = _a.onFilterAttributeChange;
64
+ var CustomValuesEditor = components.ValuesEditor, CustomFilterSelector = components.FilterSelector, _d = components.LogicalOperator, LogicalOperator = _d === void 0 ? core_1.EmptyStub : _d;
65
+ var styles = (0, styles_1.useStyles)();
55
66
  var actualFilters = (0, react_1.useRef)(filters);
56
67
  var attributeFilterRef = (0, react_1.useRef)(null);
57
68
  var lastAttributesCountRef = (0, react_1.useRef)(null);
58
69
  var attributesCountRef = (0, react_1.useRef)(null);
59
70
  var metadata = (0, contexts_1.useMdmMetadata)();
60
- var entityType = (0, mdm_sdk_1.getEntityType)(metadata, (0, helpers_1.getEntityTypeFromAttrTypes)(attributeTypes));
61
71
  actualFilters.current = filters;
62
72
  var rowClasses = (0, react_1.useMemo)(function () { return ({
63
- attributeSelectorContainer: attrSelector,
64
- filterSelectorContainer: filterSelector,
65
- actionsContainer: actionContainer
66
- }); }, [attrSelector, filterSelector, actionContainer]);
67
- var attributeSelectorItems = (0, react_1.useMemo)(function () { return (0, helpers_1.getAttributeSelectorItems)(attributeTypes, entityType, metadata); }, [attributeTypes, metadata, entityType]);
68
- var rowsData = (0, react_1.useMemo)(function () { return (filters.length ? (0, helpers_1.getRowsDataFromFilters)(filters, attributeSelectorItems) : []); }, [attributeSelectorItems, filters]);
73
+ attributeSelectorContainer: classes.attributeSelectorContainer || styles.attrSelector,
74
+ valuesEditorContainer: classes.valuesEditorContainer || '',
75
+ filterSelectorContainer: styles.filterSelector,
76
+ actionsContainer: styles.actionContainer
77
+ }); }, [classes, styles]);
78
+ var currentEntityType = (0, react_1.useMemo)(function () {
79
+ var entityTypesUris = attributesTypesGroups.map(function (_a) {
80
+ var attributeTypes = _a.attributeTypes;
81
+ return (0, helpers_1.getEntityTypeFromAttrTypes)(attributeTypes);
82
+ });
83
+ var closestEntityTypeAncestorUri = (0, mdm_sdk_1.findClosestCommonAncestor)(metadata, entityTypesUris);
84
+ return (0, mdm_sdk_1.getEntityType)(metadata, closestEntityTypeAncestorUri);
85
+ }, [attributesTypesGroups, metadata]);
86
+ var attributeSelectorItemsGroups = (0, react_1.useMemo)(function () { return (0, helpers_1.getAttributeSelectorItems)(attributesTypesGroups, metadata); }, [attributesTypesGroups, metadata]);
87
+ var rowsData = (0, react_1.useMemo)(function () { return (filters.length ? (0, helpers_1.getRowsDataFromFilters)(filters, attributeSelectorItemsGroups) : []); }, [attributeSelectorItemsGroups, filters]);
69
88
  attributesCountRef.current = rowsData.length;
70
89
  (0, react_1.useEffect)(function () {
71
90
  if (attributeFilterRef.current && lastAttributesCountRef.current !== attributesCountRef.current) {
@@ -91,11 +110,7 @@ var AttributesFiltersBuilder = function (_a) {
91
110
  }, [onChange]);
92
111
  var duplicateRow = (0, react_1.useCallback)(function (index) {
93
112
  var newFilters = __spreadArray([], actualFilters.current, true);
94
- newFilters.splice(index + 1, 0, {
95
- fieldName: actualFilters.current[index].fieldName,
96
- filter: actualFilters.current[index].filter,
97
- values: actualFilters.current[index].values
98
- });
113
+ newFilters.splice(index + 1, 0, __assign({}, actualFilters.current[index]));
99
114
  onChange(newFilters);
100
115
  }, [onChange]);
101
116
  var changeFilter = (0, react_1.useCallback)(function (newFilter, id) {
@@ -108,6 +123,6 @@ var AttributesFiltersBuilder = function (_a) {
108
123
  var addNewFilter = (0, react_1.useCallback)(function (newFilter) {
109
124
  onChange(__spreadArray(__spreadArray([], actualFilters.current, true), [newFilter], false));
110
125
  }, [onChange]);
111
- return (react_1.default.createElement(QueryBuilderRowsGroup_1.default, { rowClasses: rowClasses, rowsData: rowsData, AttributeSelectorComponent: AttributeSelector_1.default, FilterSelectorComponent: CustomFilterSelector || FilterSelector_1.default, ValuesEditorComponent: CustomValuesEditor || ValuesEditor_1.default, ActionsComponent: RowActions_1.default, LogicOperatorComponent: Stub, filterSelectorRefIndex: lastAttributesCountRef.current, filterSelectorRef: attributeFilterRef, lastRowAttributeSelectorProps: lastRowAttributeSelectorProps, attributesGroup: attributeSelectorItems, changeFilter: changeFilter, addNewFilter: addNewFilter, addRowAfterIndex: addRowAfterIndex, removeRow: removeRow, duplicateRow: duplicateRow, entityType: entityType }));
126
+ return (react_1.default.createElement(QueryBuilderRowsGroup_1.default, { rowClasses: rowClasses, rowsData: rowsData, AttributeSelectorComponent: AttributeSelector_1.default, FilterSelectorComponent: CustomFilterSelector || FilterSelector_1.default, ValuesEditorComponent: CustomValuesEditor || ValuesEditor_1.default, ActionsComponent: RowActions_1.default, LogicOperatorComponent: LogicalOperator, filterSelectorRefIndex: lastAttributesCountRef.current, filterSelectorRef: attributeFilterRef, lastRowAttributeSelectorProps: lastRowAttributeSelectorProps, attributeSelectorItemsGroups: attributeSelectorItemsGroups, entityType: currentEntityType, changeFilter: changeFilter, addNewFilter: addNewFilter, addRowAfterIndex: addRowAfterIndex, removeRow: removeRow, duplicateRow: duplicateRow, onFilterAttributeChange: onFilterAttributeChange }));
112
127
  };
113
128
  exports.default = (0, react_1.memo)(AttributesFiltersBuilder);
@@ -31,15 +31,15 @@ var mdm_sdk_1 = require("@reltio/mdm-sdk");
31
31
  var BasicAttributeSelector_1 = __importDefault(require("../../../BasicAttributeSelector/BasicAttributeSelector"));
32
32
  var AttributeSelector = function (_a) {
33
33
  var rowData = _a.rowData, rowContext = _a.rowContext, attributeSelectorProps = _a.attributeSelectorProps;
34
- var _b = rowData || {}, attribute = _b.attribute, id = _b.id, filter = _b.filter;
35
- var changeFilter = rowContext.changeFilter, addNewFilter = rowContext.addNewFilter, attributesGroup = rowContext.attributesGroup;
34
+ var _b = rowData || {}, attribute = _b.attribute, id = _b.id, filter = _b.filter, operator = _b.operator;
35
+ var changeFilter = rowContext.changeFilter, addNewFilter = rowContext.addNewFilter, attributeSelectorItemsGroups = rowContext.attributeSelectorItemsGroups, onFilterAttributeChange = rowContext.onFilterAttributeChange;
36
36
  var getSelectedAttributeLabel = (0, react_1.useCallback)(function (data) { return (0, mdm_sdk_1.getSearchGroupAttributeLabel)({ data: data }); }, []);
37
- var itemsGroup = (0, react_1.useMemo)(function () { return [{ id: '', title: '', attributes: attributesGroup }]; }, [attributesGroup]);
38
37
  var changeAttribute = (0, react_1.useCallback)(function (selectInfo) {
39
38
  if (rowData) {
40
39
  var newFilter = {
41
40
  fieldName: selectInfo.attribute.fieldName,
42
41
  filter: filter,
42
+ operator: operator,
43
43
  values: []
44
44
  };
45
45
  changeFilter(newFilter, id);
@@ -48,10 +48,12 @@ var AttributeSelector = function (_a) {
48
48
  addNewFilter({
49
49
  fieldName: selectInfo.attribute.fieldName,
50
50
  filter: null,
51
+ operator: mdm_sdk_1.SearchOperator.and,
51
52
  values: []
52
53
  });
53
54
  }
54
- }, [addNewFilter, changeFilter, id, rowData, filter]);
55
- return (react_1.default.createElement(BasicAttributeSelector_1.default, { itemsGroups: itemsGroup, ungroup: true, single: true, value: attribute, getLabel: getSelectedAttributeLabel, onSelect: changeAttribute, onOpenPopup: attributeSelectorProps.onOpen }));
55
+ onFilterAttributeChange && onFilterAttributeChange(selectInfo);
56
+ }, [rowData, onFilterAttributeChange, filter, operator, changeFilter, id, addNewFilter]);
57
+ return (react_1.default.createElement(BasicAttributeSelector_1.default, { itemsGroups: attributeSelectorItemsGroups, ungroup: attributeSelectorItemsGroups.length < 2, single: true, value: attribute, getLabel: getSelectedAttributeLabel, onSelect: changeAttribute, onOpenPopup: attributeSelectorProps.onOpen }));
56
58
  };
57
59
  exports.default = (0, react_1.memo)(AttributeSelector);
@@ -38,7 +38,7 @@ var FilterSelector = function (_a) {
38
38
  var _b;
39
39
  var rowData = _a.rowData, rowContext = _a.rowContext, textFieldInputRef = _a.textFieldInputRef, optionsProp = _a.options;
40
40
  var styles = (0, styles_1.default)();
41
- var _c = rowData || {}, _d = _c.attribute, _e = _d === void 0 ? {} : _d, _f = _e.attrType, attrType = _f === void 0 ? {} : _f, _g = _e.fieldName, fieldName = _g === void 0 ? null : _g, filter = _c.filter, id = _c.id;
41
+ var _c = rowData || {}, _d = _c.attribute, _e = _d === void 0 ? {} : _d, _f = _e.attrType, attrType = _f === void 0 ? {} : _f, _g = _e.fieldName, fieldName = _g === void 0 ? null : _g, filter = _c.filter, id = _c.id, operator = _c.operator;
42
42
  var changeFilter = rowContext.changeFilter;
43
43
  var options = optionsProp ||
44
44
  (attrType &&
@@ -48,10 +48,11 @@ var FilterSelector = function (_a) {
48
48
  var newFilter = {
49
49
  fieldName: fieldName,
50
50
  filter: filterOption.value,
51
+ operator: operator,
51
52
  values: []
52
53
  };
53
54
  changeFilter(newFilter, id);
54
- }, [changeFilter, id, fieldName]);
55
+ }, [fieldName, operator, changeFilter, id]);
55
56
  (0, react_1.useEffect)(function () {
56
57
  if ((fieldName && !filter) || (fieldName && !(0, helpers_1.findValue)(options, filter))) {
57
58
  onChangeFilter(options[0]);
@@ -35,14 +35,15 @@ var ValuesEditor = function (_a) {
35
35
  var styles = (0, styles_1.useStyles)();
36
36
  var canFilterAcceptValues = (rowData === null || rowData === void 0 ? void 0 : rowData.attribute) && (0, mdm_sdk_1.checkIfOptionHasValues)(rowData.filter);
37
37
  var changeFilter = rowContext.changeFilter;
38
- var _b = (rowData || {}), _c = _b.values, values = _c === void 0 ? [] : _c, _d = _b.attribute, _e = _d === void 0 ? {} : _d, attrType = _e.attrType, _f = _e.fieldName, fieldName = _f === void 0 ? null : _f, filter = _b.filter, id = _b.id;
38
+ var _b = (rowData || {}), _c = _b.values, values = _c === void 0 ? [] : _c, _d = _b.attribute, _e = _d === void 0 ? {} : _d, attrType = _e.attrType, _f = _e.fieldName, fieldName = _f === void 0 ? null : _f, filter = _b.filter, id = _b.id, operator = _b.operator;
39
39
  var valueDataTypeDefinition = attrType && (0, mdm_sdk_1.getAttrDataTypeDefinition)(attrType);
40
40
  var filterValueDataTypeDefinition = valueDataTypeDefinition && (0, mdm_sdk_1.getDataTypeDefinitionForFilterValue)(valueDataTypeDefinition, filter);
41
41
  var editorFilter = (0, react_1.useMemo)(function () { return ({
42
42
  filter: filter,
43
43
  fieldName: fieldName,
44
+ operator: operator,
44
45
  values: values || []
45
- }); }, [filter, fieldName, values]);
46
+ }); }, [filter, fieldName, operator, values]);
46
47
  var TextFieldProps = (0, react_1.useMemo)(function () { return ({
47
48
  InputProps: {
48
49
  classes: {
@@ -55,10 +56,11 @@ var ValuesEditor = function (_a) {
55
56
  var newFilter = {
56
57
  fieldName: fieldName,
57
58
  filter: filter,
59
+ operator: operator,
58
60
  values: newValues
59
61
  };
60
62
  changeFilter(newFilter, id);
61
- }, [changeFilter, id, fieldName, filter]);
63
+ }, [fieldName, filter, operator, changeFilter, id]);
62
64
  return (react_1.default.createElement("div", { className: styles.valuesEditor }, (rowData === null || rowData === void 0 ? void 0 : rowData.attribute) && canFilterAcceptValues && (react_1.default.createElement(FilterValueEditor_1.default, { "data-reltio-id": "filter-value-editor", filter: editorFilter, onChange: changeValue, dataTypeDefinition: filterValueDataTypeDefinition, fullWidth: true, TextFieldProps: TextFieldProps, color: "primary", classes: editorClasses, orientation: "horizontal" }))));
63
65
  };
64
66
  exports.default = (0, react_1.memo)(ValuesEditor);
@@ -20,7 +20,7 @@ exports.useStyles = (0, styles_1.makeStyles)({
20
20
  valuesEditor: {
21
21
  display: 'flex',
22
22
  alignItems: 'center',
23
- width: '222px!important',
23
+ width: '100%',
24
24
  minHeight: '40px',
25
25
  flexShrink: 0
26
26
  }
@@ -1,11 +1,12 @@
1
- import { AttributeType, TEntityType, Metadata, SearchFilter } from '@reltio/mdm-sdk';
2
- import { AttributeSelectorItem } from '../../types';
1
+ import { AttributeType, Metadata, SearchFilter } from '@reltio/mdm-sdk';
2
+ import { AttributeSelectorItem, AttributeSelectorItemsGroup, AttributesTypesGroup } from '../../types';
3
3
  import { FilterOption } from './types';
4
- export declare const getAttributeSelectorItems: (attributeTypes: AttributeType[], entityType: TEntityType, metadata: Metadata) => AttributeSelectorItem[];
4
+ export declare const getAttributeSelectorItems: (attributesTypesGroups: AttributesTypesGroup[], metadata: Metadata) => AttributeSelectorItemsGroup[];
5
5
  export declare const findValue: (options: FilterOption[], filter: string) => FilterOption;
6
- export declare const getRowsDataFromFilters: (filters: SearchFilter[], attributesGroup: AttributeSelectorItem[]) => {
6
+ export declare const getRowsDataFromFilters: (filters: SearchFilter[], attributesGroupArr: AttributeSelectorItemsGroup[]) => {
7
7
  attribute: AttributeSelectorItem;
8
8
  filter: string;
9
+ operator: import("@reltio/mdm-sdk").SearchOperator;
9
10
  id: number;
10
11
  values: (import("@reltio/mdm-sdk").PrimitiveValue | Pick<import("@reltio/mdm-sdk").SimpleAttributeValue, "value" | "lookupCode">)[] | [(import("@reltio/mdm-sdk").PrimitiveValue | Pick<import("@reltio/mdm-sdk").SimpleAttributeValue, "value" | "lookupCode">)[]];
11
12
  }[];
@@ -51,40 +51,54 @@ var createAttributesConfig = function (metadata, attrNode, entityTypeUri, parent
51
51
  }
52
52
  return resConfig;
53
53
  };
54
- var getAttributeSelectorItems = function (attributeTypes, entityType, metadata) {
55
- if (entityType === void 0) { entityType = {}; }
56
- return (0, mdm_sdk_1.getAttributesTreeFromAttributes)(attributeTypes, metadata).map(function (attrNode) {
57
- var entityTypeUri = (0, mdm_sdk_1.isSpecialAttribute)(attrNode) ? null : entityType.uri;
58
- return createAttributesConfig(metadata, attrNode, entityTypeUri);
54
+ var getAttributeSelectorItems = function (attributesTypesGroups, metadata) {
55
+ return attributesTypesGroups.map(function (_a) {
56
+ var id = _a.id, title = _a.title, attributeTypes = _a.attributeTypes;
57
+ var entityType = (0, mdm_sdk_1.getEntityType)(metadata, (0, exports.getEntityTypeFromAttrTypes)(attributeTypes));
58
+ return {
59
+ id: id,
60
+ title: title,
61
+ attributes: (0, mdm_sdk_1.getAttributesTreeFromAttributes)(attributeTypes, metadata).map(function (attrNode) {
62
+ var entityTypeUri = (0, mdm_sdk_1.isSpecialAttribute)(attrNode) ? null : entityType.uri;
63
+ return createAttributesConfig(metadata, attrNode, entityTypeUri);
64
+ })
65
+ };
59
66
  });
60
67
  };
61
68
  exports.getAttributeSelectorItems = getAttributeSelectorItems;
62
69
  var findAttributeSelectorItem = function (fieldName, attributesGroup) {
63
70
  var attrGroup;
64
- var findAttribute = function (fieldName, attributesGroup) {
65
- for (var _i = 0, attributesGroup_1 = attributesGroup; _i < attributesGroup_1.length; _i++) {
66
- var attributeGroup = attributesGroup_1[_i];
67
- if (fieldName === attributeGroup.fieldName) {
68
- attrGroup = attributeGroup;
69
- return;
70
- }
71
- if ('children' in attributeGroup) {
72
- findAttribute(fieldName, attributeGroup.children);
71
+ var _loop_1 = function (attributesGroupItem) {
72
+ var findAttribute = function (fieldName, attributesSelectorItems) {
73
+ for (var _i = 0, attributesSelectorItems_1 = attributesSelectorItems; _i < attributesSelectorItems_1.length; _i++) {
74
+ var attributeGroup = attributesSelectorItems_1[_i];
75
+ if (fieldName === attributeGroup.fieldName) {
76
+ attrGroup = attributeGroup;
77
+ return;
78
+ }
79
+ if ('children' in attributeGroup) {
80
+ findAttribute(fieldName, attributeGroup.children);
81
+ }
73
82
  }
74
- }
83
+ };
84
+ findAttribute(fieldName, attributesGroupItem.attributes);
75
85
  };
76
- findAttribute(fieldName, attributesGroup);
86
+ for (var _i = 0, attributesGroup_1 = attributesGroup; _i < attributesGroup_1.length; _i++) {
87
+ var attributesGroupItem = attributesGroup_1[_i];
88
+ _loop_1(attributesGroupItem);
89
+ }
77
90
  return attrGroup;
78
91
  };
79
92
  var findValue = function (options, filter) {
80
93
  return options ? options.find(function (option) { return option.value === filter; }) : null;
81
94
  };
82
95
  exports.findValue = findValue;
83
- var getRowsDataFromFilters = function (filters, attributesGroup) {
96
+ var getRowsDataFromFilters = function (filters, attributesGroupArr) {
84
97
  return filters.map(function (filter, index) {
85
98
  return {
86
- attribute: filter.fieldName ? findAttributeSelectorItem(filter.fieldName, attributesGroup) : undefined,
99
+ attribute: filter.fieldName ? findAttributeSelectorItem(filter.fieldName, attributesGroupArr) : undefined,
87
100
  filter: filter.filter,
101
+ operator: filter.operator,
88
102
  id: index,
89
103
  values: filter.values
90
104
  };
@@ -92,7 +106,7 @@ var getRowsDataFromFilters = function (filters, attributesGroup) {
92
106
  };
93
107
  exports.getRowsDataFromFilters = getRowsDataFromFilters;
94
108
  var getEntityTypeFromAttrTypes = function (attributeTypes) {
95
- var regularAttribute = attributeTypes.find(function (attribute) { return !(0, mdm_sdk_1.isSpecialAttribute)(attribute); });
109
+ var regularAttribute = (0, mdm_sdk_1.findRegularAttribute)(attributeTypes);
96
110
  return regularAttribute ? (0, mdm_sdk_1.getBaseUri)(regularAttribute.uri) : null;
97
111
  };
98
112
  exports.getEntityTypeFromAttrTypes = getEntityTypeFromAttrTypes;
@@ -1,17 +1,18 @@
1
1
  import { SearchFilter, TEntityType } from '@reltio/mdm-sdk';
2
- import { AttributeSelectorItem, FiltersRowData } from '../../types';
2
+ import { AttributeSelectionInfo, AttributeSelectorItemsGroup, FiltersRowData } from '../../types';
3
3
  export type FilterOption = {
4
4
  value: string;
5
5
  label: string;
6
6
  };
7
7
  export type RowContext = {
8
- attributesGroup: AttributeSelectorItem[];
8
+ attributeSelectorItemsGroups: AttributeSelectorItemsGroup[];
9
9
  entityType: TEntityType;
10
10
  addNewFilter: (newFilter: SearchFilter) => void;
11
11
  addRowAfterIndex: (index: number) => void;
12
12
  changeFilter: (newFilter: SearchFilter, id: number) => void;
13
13
  duplicateRow: (index: number) => void;
14
14
  removeRow: (index: number) => void;
15
+ onFilterAttributeChange?: (attrSelectInfo: AttributeSelectionInfo) => void;
15
16
  };
16
17
  export type AttributeFiltersComponentProps = {
17
18
  rowData: FiltersRowData;
@@ -1,17 +1,24 @@
1
1
  import React from 'react';
2
- import { SearchFilter, AttributeType } from '@reltio/mdm-sdk';
2
+ import { SearchFilter } from '@reltio/mdm-sdk';
3
+ import { AttributeSelectionInfo, AttributesFilterComponentsClasses, AttributesTypesGroup } from '../../types';
3
4
  type Props = {
5
+ classes?: AttributesFilterComponentsClasses;
4
6
  filters: SearchFilter[];
5
7
  onChange: (filters: SearchFilter[]) => void;
6
- attributeTypes: AttributeType[];
8
+ attributesTypesGroups: AttributesTypesGroup[];
7
9
  components?: {
8
10
  ValuesEditor?: React.ElementType;
9
11
  FilterSelector?: React.ElementType;
12
+ LogicalOperator?: React.ElementType;
10
13
  };
11
14
  children?: React.ReactNode;
12
15
  onTogglePopup?: (open: boolean) => void;
13
16
  isFiltersApplied?: boolean;
14
17
  dataReltioId?: string;
18
+ onFilterAttributeChange?: (attrSelectInfo: AttributeSelectionInfo) => void;
19
+ onClear?: () => void;
20
+ onCancel?: () => void;
21
+ onApply?: () => void;
15
22
  };
16
- declare const _default: React.MemoExoticComponent<({ filters: filtersProp, attributeTypes, onChange, components, children, onTogglePopup, isFiltersApplied: isFiltersAppliedProp, dataReltioId }: Props) => JSX.Element>;
23
+ declare const _default: React.MemoExoticComponent<({ filters: filtersProp, classes, attributesTypesGroups, onChange, components, children, onTogglePopup, isFiltersApplied: isFiltersAppliedProp, dataReltioId, onFilterAttributeChange, onCancel, onClear, onApply }: Props) => JSX.Element>;
17
24
  export default _default;
@@ -33,12 +33,13 @@ var Button_1 = __importDefault(require("@mui/material/Button"));
33
33
  var FilterList_1 = __importDefault(require("@mui/icons-material/FilterList"));
34
34
  var Typography_1 = __importDefault(require("@mui/material/Typography"));
35
35
  var Divider_1 = __importDefault(require("@mui/material/Divider"));
36
+ var classnames_1 = __importDefault(require("classnames"));
36
37
  var mdm_sdk_1 = require("@reltio/mdm-sdk");
37
38
  var AttributesFiltersBuilder_1 = __importDefault(require("../AttributesFiltersBuilder/AttributesFiltersBuilder"));
38
39
  var ActionButtons_1 = __importDefault(require("./ActionButtons/ActionButtons"));
39
40
  var styles_1 = require("./styles");
40
41
  var AttributesFiltersButton = function (_a) {
41
- var filtersProp = _a.filters, attributeTypes = _a.attributeTypes, onChange = _a.onChange, components = _a.components, children = _a.children, onTogglePopup = _a.onTogglePopup, isFiltersAppliedProp = _a.isFiltersApplied, dataReltioId = _a.dataReltioId;
42
+ var filtersProp = _a.filters, classes = _a.classes, attributesTypesGroups = _a.attributesTypesGroups, onChange = _a.onChange, components = _a.components, children = _a.children, onTogglePopup = _a.onTogglePopup, isFiltersAppliedProp = _a.isFiltersApplied, dataReltioId = _a.dataReltioId, onFilterAttributeChange = _a.onFilterAttributeChange, onCancel = _a.onCancel, onClear = _a.onClear, onApply = _a.onApply;
42
43
  var styles = (0, styles_1.useStyles)();
43
44
  var buttonRef = (0, react_1.useRef)();
44
45
  var _b = (0, react_1.useState)(false), isOpen = _b[0], setIsOpen = _b[1];
@@ -58,21 +59,24 @@ var AttributesFiltersButton = function (_a) {
58
59
  }, [filtersProp, isOpen]);
59
60
  var applyButtonHandler = (0, react_1.useCallback)(function () {
60
61
  onChange(filters);
62
+ onApply && onApply();
61
63
  togglePopup();
62
- }, [filters, onChange]);
64
+ }, [filters, onChange, onApply]);
63
65
  var cancelButtonHandler = (0, react_1.useCallback)(function () {
66
+ onCancel && onCancel();
64
67
  togglePopup();
65
- }, []);
68
+ }, [onCancel]);
66
69
  var clearAllButtonHandler = (0, react_1.useCallback)(function () {
70
+ onClear && onClear();
67
71
  setFilters([]);
68
- }, []);
72
+ }, [onClear]);
69
73
  return (react_1.default.createElement(react_1.default.Fragment, null,
70
74
  react_1.default.createElement(Button_1.default, { "data-reltio-id": dataReltioId, ref: buttonRef, color: buttonColor, classes: {
71
75
  root: styles.triggerButton,
72
76
  textPrimary: styles.changedFiltersIndicator
73
77
  }, onClick: togglePopup },
74
78
  react_1.default.createElement(FilterList_1.default, { color: buttonColor })),
75
- react_1.default.createElement(Popover_1.default, { open: isOpen, classes: { paper: styles.popupContent }, anchorEl: buttonRef.current, onClose: togglePopup, anchorOrigin: {
79
+ react_1.default.createElement(Popover_1.default, { open: isOpen, classes: { paper: (0, classnames_1.default)(styles.popupContent, classes === null || classes === void 0 ? void 0 : classes.filterPopup) }, anchorEl: buttonRef.current, onClose: togglePopup, anchorOrigin: {
76
80
  vertical: 'bottom',
77
81
  horizontal: 'right'
78
82
  }, transformOrigin: {
@@ -83,7 +87,7 @@ var AttributesFiltersButton = function (_a) {
83
87
  react_1.default.createElement(Typography_1.default, { variant: "h6" }, ui_i18n_1.default.text('Filter')),
84
88
  react_1.default.createElement("div", { className: styles.filtersBuilderWrapper },
85
89
  children,
86
- react_1.default.createElement(AttributesFiltersBuilder_1.default, { attributeTypes: attributeTypes, filters: filters, onChange: setFilters, components: components })),
90
+ react_1.default.createElement(AttributesFiltersBuilder_1.default, { attributesTypesGroups: attributesTypesGroups, filters: filters, onChange: setFilters, components: components, onFilterAttributeChange: onFilterAttributeChange, classes: classes })),
87
91
  react_1.default.createElement(Divider_1.default, { className: styles.divider }),
88
92
  react_1.default.createElement(ActionButtons_1.default, { onApply: applyButtonHandler, onCancel: cancelButtonHandler, onClear: clearAllButtonHandler })))));
89
93
  };
@@ -4,6 +4,7 @@ var styles_1 = require("@mui/styles");
4
4
  var useStyles = (0, styles_1.makeStyles)({
5
5
  selector: {
6
6
  minWidth: '200px',
7
+ width: '100%',
7
8
  alignItems: 'stretch',
8
9
  background: 'rgba(0,0,0, 0.0267)',
9
10
  boxSizing: 'border-box',
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ import { SearchOperator } from '@reltio/mdm-sdk';
3
+ type Props = {
4
+ className?: string;
5
+ value: string;
6
+ onChange: (value: SearchOperator) => void;
7
+ };
8
+ declare const LogicOperator: ({ className, value, onChange }: Props) => JSX.Element;
9
+ export default LogicOperator;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ var react_1 = __importDefault(require("react"));
18
+ var classnames_1 = __importDefault(require("classnames"));
19
+ var components_1 = require("@reltio/components");
20
+ var mdm_sdk_1 = require("@reltio/mdm-sdk");
21
+ var ui_i18n_1 = __importDefault(require("ui-i18n"));
22
+ var styles_1 = __importDefault(require("./styles"));
23
+ var LogicOperator = function (_a) {
24
+ var className = _a.className, value = _a.value, onChange = _a.onChange;
25
+ var classes = (0, styles_1.default)();
26
+ var entries = mdm_sdk_1.operatorOptions.map(function (operator) { return (__assign(__assign({}, operator), { label: ui_i18n_1.default.text(operator.label) })); });
27
+ return (react_1.default.createElement(components_1.DropDownEditor, { className: (0, classnames_1.default)(classes.dropDown, className), classes: classes, value: value, entries: entries, onChange: onChange }));
28
+ };
29
+ exports.default = LogicOperator;
@@ -0,0 +1,2 @@
1
+ declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"select" | "dropDown">;
2
+ export default useStyles;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var styles_1 = require("@mui/styles");
4
+ var useStyles = (0, styles_1.makeStyles)(function () { return ({
5
+ select: {
6
+ padding: '6px 16px 7px'
7
+ },
8
+ dropDown: {
9
+ width: '100px',
10
+ '&:before': {
11
+ content: 'none !important'
12
+ }
13
+ }
14
+ }); });
15
+ exports.default = useStyles;
@@ -155,3 +155,4 @@ export { default as MultilineMenuItem } from './MultilineMenuItem/MultilineMenuI
155
155
  export { default as TenantLabel } from './TenantLabel/TenantLabel';
156
156
  export { default as StepNavigation } from './StepNavigation/StepNavigation';
157
157
  export { TableSkeleton } from './TableSkeleton/TableSkeleton';
158
+ export { default as LogicOperator } from './LogicOperator/LogicOperator';
@@ -20,7 +20,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
20
20
  exports.EmptyState = exports.NoResults = exports.NoData = exports.DropDownSelector = exports.DropDownMenuButton = exports.Drawer = exports.DataTypeValue = exports.ConnectionRelationTypeSelector = exports.ConfigureColumnsPopup = exports.MenuWithPopper = exports.MenuList = exports.LoadMoreButton = exports.DropdownIndicatorWithIconButton = exports.DropdownIndicator = exports.CommentsContainer = exports.ColorBar = exports.CollapseButton = exports.CollaborationItem = exports.ClickAwayProvider = exports.BasicViewHeader = exports.BasicViewContent = exports.BasicView = exports.ScreenProfileBand = exports.ProfileBandNavigation = exports.AvatarWithFallback = exports.AutoSizeList = exports.ReadOnlyAttributesPager = exports.SimpleAttribute = exports.ReferenceAttribute = exports.NestedAttribute = exports.EditableImageAttributesLine = exports.ImageAttributesLine = exports.ReadOnlyAttributesList = exports.ReadOnlyAttributeValuesBlock = exports.EditableAttribute = exports.ReadOnlyAttribute = exports.CardinalityMessage = exports.AttributesPager = exports.SimpleAttributeEditor = exports.RelationTypeSelector = exports.ReferenceAttributeEditor = exports.NestedAttributeEditor = exports.MoreAttributesButton = exports.EntitySelector = exports.EntityCreator = exports.AttributesList = exports.BranchDecorator = exports.DescriptionIcon = exports.AttributesView = exports.AttributeListItem = void 0;
21
21
  exports.useKeyboardNavigation = exports.WhiteSearchInput = exports.SearchInput = exports.ProfileResizablePanes = exports.ResizablePanes = exports.ReltioGridLayout = exports.ReactSortableTreeUtils = exports.ReactSortableTreeHandlers = exports.ReactSortableTree = exports.ReactSelectOptionFilters = exports.MultiSelect = exports.QueryBuilderRowsGroup = exports.QueryBuilderRow = exports.ProfileCard = exports.ProfileBand = exports.PotentialMatchReviewCard = exports.PopupWithArrow = exports.Popper = exports.MultipleInput = exports.ModeSwitcherSelect = exports.ModeSwitcher = exports.TransitiveMatchBlock = exports.SimpleMatchRulesBlock = exports.MatchRuleVariant = exports.MatchRulesBlock = exports.LoadingSpinner = exports.Link = exports.LinearLoadIndicator = exports.ImportModes = exports.ImportButton = exports.ImageGalleryDialog = exports.Highlighter = exports.HierarchicalAttributeTooltip = exports.HideOnShrink = exports.FlipCard = exports.FacetViewHeader = exports.ExternalInvalidRelations = exports.ExpandedValueTooltip = exports.ErrorWrapper = exports.ErrorPopup = exports.AttributesErrorsPanel = exports.ErrorBoundary = exports.EntityUriLink = exports.RelationTypesSelector = exports.EntityTypesSelector = exports.EntityTypeIcon = exports.EntityTypeBadge = exports.EntityAvatar = exports.EMPTY_STATE_VARIANTS = exports.EMPTY_STATE_ICONS = void 0;
22
22
  exports.RequiredMark = exports.HierarchyNodeTitle = exports.DataTenantBadge = exports.SettingsMenu = exports.TenantsDropDownSelector = exports.TenantIcon = exports.SourceSystemsSelector = exports.MatchRulesSelector = exports.MultiValueSelector = exports.DragAndDrop = exports.ConnectionEditor = exports.AttributesFiltersBuilder = exports.AttributesFiltersButton = exports.AttributeGroupIcon = exports.BasicAttributeSelector = exports.ProfilesList = exports.ActionButtonMode = exports.ActionButton = exports.NotMatchButton = exports.MergeButton = exports.ProfileMatchCard = exports.RelationEditor = exports.OvIcon = exports.ErrorMessage = exports.ReltioMap = exports.ConfirmDeleteDialog = exports.ConfirmationDialog = exports.Marginator = exports.LightArrowTooltip = exports.ArrowExpandButton = exports.ScrollableTabs = exports.ExpandableSearchInput = exports.VirtualGroupedList = exports.ViewMoreToggle = exports.VerticalHeadingsTable = exports.VerticalDivider = exports.AttributeTitle = exports.Spacer = exports.ColoredSourceIcon = exports.SourceIcon = exports.SmallIconButtonWithTooltip = exports.SmallIconButton = exports.SimpleDropDownSelector = exports.SidePanelContentHeader = exports.SidePanel = exports.SidePanelEmptyState = exports.SideButtonsPanel = exports.SelectorWithOnlyOptionAutoSelect = exports.SelectionPopupPopper = exports.SelectionPopup = void 0;
23
- exports.TableSkeleton = exports.StepNavigation = exports.TenantLabel = exports.MultilineMenuItem = exports.RelevanceScoreBadge = void 0;
23
+ exports.LogicOperator = exports.TableSkeleton = exports.StepNavigation = exports.TenantLabel = exports.MultilineMenuItem = exports.RelevanceScoreBadge = void 0;
24
24
  __exportStar(require("./activityLog"), exports);
25
25
  var AttributeListItem_1 = require("./AttributeListItem/AttributeListItem");
26
26
  Object.defineProperty(exports, "AttributeListItem", { enumerable: true, get: function () { return __importDefault(AttributeListItem_1).default; } });
@@ -333,3 +333,5 @@ var StepNavigation_1 = require("./StepNavigation/StepNavigation");
333
333
  Object.defineProperty(exports, "StepNavigation", { enumerable: true, get: function () { return __importDefault(StepNavigation_1).default; } });
334
334
  var TableSkeleton_1 = require("./TableSkeleton/TableSkeleton");
335
335
  Object.defineProperty(exports, "TableSkeleton", { enumerable: true, get: function () { return TableSkeleton_1.TableSkeleton; } });
336
+ var LogicOperator_1 = require("./LogicOperator/LogicOperator");
337
+ Object.defineProperty(exports, "LogicOperator", { enumerable: true, get: function () { return __importDefault(LogicOperator_1).default; } });
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { AttributeType, SearchFilter } from '@reltio/mdm-sdk';
2
+ import { AttributeType, SearchFilter, SearchOperator } from '@reltio/mdm-sdk';
3
3
  export type ReactGridLayoutItem = {
4
4
  i: string;
5
5
  x: number;
@@ -46,6 +46,7 @@ export type FiltersRowData = {
46
46
  filter: string;
47
47
  id: number;
48
48
  values: SearchFilter['values'];
49
+ operator?: SearchOperator;
49
50
  };
50
51
  export type AttributeSelectorItem = {
51
52
  attrType?: AttributeType;
@@ -62,6 +63,11 @@ export type AttributeSelectorItemsGroup = {
62
63
  title: string;
63
64
  attributes: AttributeSelectorItem[];
64
65
  };
66
+ export type AttributesTypesGroup = {
67
+ id?: string;
68
+ title: string;
69
+ attributeTypes: AttributeType[];
70
+ };
65
71
  export type AttributeSelectionInfo = {
66
72
  index: number;
67
73
  checked: boolean;
@@ -137,3 +143,10 @@ export type AnyAction = {
137
143
  type: string;
138
144
  [key: string]: any;
139
145
  };
146
+ export type AttributesFilterComponentsClasses = {
147
+ attributeSelectorContainer?: string;
148
+ valuesEditorContainer?: string;
149
+ filterSelectorContainer?: string;
150
+ actionsContainer?: string;
151
+ filterPopup?: string;
152
+ };
@@ -1,13 +1,17 @@
1
1
  import React from 'react';
2
- import { SearchFilter, AttributeType } from '@reltio/mdm-sdk';
2
+ import { SearchFilter } from '@reltio/mdm-sdk';
3
+ import { AttributeSelectionInfo, AttributesFilterComponentsClasses, AttributesTypesGroup } from '../../types';
3
4
  type Props = {
5
+ classes?: AttributesFilterComponentsClasses;
4
6
  filters: SearchFilter[];
5
7
  onChange: (filters: SearchFilter[]) => void;
6
- attributeTypes: AttributeType[];
8
+ attributesTypesGroups: AttributesTypesGroup[];
7
9
  components?: {
8
10
  ValuesEditor?: React.ElementType;
9
11
  FilterSelector?: React.ElementType;
12
+ LogicalOperator?: React.ElementType;
10
13
  };
14
+ onFilterAttributeChange?: (attrSelectInfo: AttributeSelectionInfo) => void;
11
15
  };
12
- declare const _default: React.MemoExoticComponent<({ attributeTypes, filters, onChange, components }: Props) => JSX.Element>;
16
+ declare const _default: React.MemoExoticComponent<({ classes, attributesTypesGroups, filters, onChange, components, onFilterAttributeChange }: Props) => JSX.Element>;
13
17
  export default _default;
@@ -1,3 +1,14 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
1
12
  var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
13
  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
14
  if (ar || !(i in from)) {
@@ -9,35 +20,43 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
9
20
  };
10
21
  import React, { useCallback, useRef, useMemo, useEffect, memo } from 'react';
11
22
  import { always, evolve } from 'ramda';
12
- import { getEntityType } from '@reltio/mdm-sdk';
13
- import { getAttributeSelectorItems, getRowsDataFromFilters, getEntityTypeFromAttrTypes } from './helpers';
23
+ import { SearchOperator, findClosestCommonAncestor, getEntityType } from '@reltio/mdm-sdk';
24
+ import { getAttributeSelectorItems, getEntityTypeFromAttrTypes, getRowsDataFromFilters } from './helpers';
14
25
  import FilterSelector from './components/FilterSelector/FilterSelector';
15
26
  import RowActions from './components/RowActions/RowActions';
16
27
  import QueryBuilderRowsGroup from '../QueryBuilderRowsGroup/QueryBuilderRowsGroup';
28
+ import { useMdmMetadata } from '../../contexts';
29
+ import { EmptyStub } from '../../core';
17
30
  import AttributeSelector from './components/AttributeSelector/AttributeSelector';
18
31
  import ValuesEditor from './components/ValuesEditor/ValuesEditor';
19
- import { useMdmMetadata } from '../../contexts';
20
32
  import { useStyles } from './styles';
21
- var EMPTY_FILTER = { fieldName: null, filter: null, values: [] };
22
- var Stub = function () { return null; };
33
+ var EMPTY_FILTER = { fieldName: null, filter: null, operator: SearchOperator.and, values: [] };
23
34
  var AttributesFiltersBuilder = function (_a) {
24
- var attributeTypes = _a.attributeTypes, filters = _a.filters, onChange = _a.onChange, _b = _a.components, components = _b === void 0 ? {} : _b;
25
- var CustomValuesEditor = components.ValuesEditor, CustomFilterSelector = components.FilterSelector;
26
- var _c = useStyles(), attrSelector = _c.attrSelector, filterSelector = _c.filterSelector, actionContainer = _c.actionContainer;
35
+ var _b = _a.classes, classes = _b === void 0 ? {} : _b, attributesTypesGroups = _a.attributesTypesGroups, filters = _a.filters, onChange = _a.onChange, _c = _a.components, components = _c === void 0 ? {} : _c, onFilterAttributeChange = _a.onFilterAttributeChange;
36
+ var CustomValuesEditor = components.ValuesEditor, CustomFilterSelector = components.FilterSelector, _d = components.LogicalOperator, LogicalOperator = _d === void 0 ? EmptyStub : _d;
37
+ var styles = useStyles();
27
38
  var actualFilters = useRef(filters);
28
39
  var attributeFilterRef = useRef(null);
29
40
  var lastAttributesCountRef = useRef(null);
30
41
  var attributesCountRef = useRef(null);
31
42
  var metadata = useMdmMetadata();
32
- var entityType = getEntityType(metadata, getEntityTypeFromAttrTypes(attributeTypes));
33
43
  actualFilters.current = filters;
34
44
  var rowClasses = useMemo(function () { return ({
35
- attributeSelectorContainer: attrSelector,
36
- filterSelectorContainer: filterSelector,
37
- actionsContainer: actionContainer
38
- }); }, [attrSelector, filterSelector, actionContainer]);
39
- var attributeSelectorItems = useMemo(function () { return getAttributeSelectorItems(attributeTypes, entityType, metadata); }, [attributeTypes, metadata, entityType]);
40
- var rowsData = useMemo(function () { return (filters.length ? getRowsDataFromFilters(filters, attributeSelectorItems) : []); }, [attributeSelectorItems, filters]);
45
+ attributeSelectorContainer: classes.attributeSelectorContainer || styles.attrSelector,
46
+ valuesEditorContainer: classes.valuesEditorContainer || '',
47
+ filterSelectorContainer: styles.filterSelector,
48
+ actionsContainer: styles.actionContainer
49
+ }); }, [classes, styles]);
50
+ var currentEntityType = useMemo(function () {
51
+ var entityTypesUris = attributesTypesGroups.map(function (_a) {
52
+ var attributeTypes = _a.attributeTypes;
53
+ return getEntityTypeFromAttrTypes(attributeTypes);
54
+ });
55
+ var closestEntityTypeAncestorUri = findClosestCommonAncestor(metadata, entityTypesUris);
56
+ return getEntityType(metadata, closestEntityTypeAncestorUri);
57
+ }, [attributesTypesGroups, metadata]);
58
+ var attributeSelectorItemsGroups = useMemo(function () { return getAttributeSelectorItems(attributesTypesGroups, metadata); }, [attributesTypesGroups, metadata]);
59
+ var rowsData = useMemo(function () { return (filters.length ? getRowsDataFromFilters(filters, attributeSelectorItemsGroups) : []); }, [attributeSelectorItemsGroups, filters]);
41
60
  attributesCountRef.current = rowsData.length;
42
61
  useEffect(function () {
43
62
  if (attributeFilterRef.current && lastAttributesCountRef.current !== attributesCountRef.current) {
@@ -63,11 +82,7 @@ var AttributesFiltersBuilder = function (_a) {
63
82
  }, [onChange]);
64
83
  var duplicateRow = useCallback(function (index) {
65
84
  var newFilters = __spreadArray([], actualFilters.current, true);
66
- newFilters.splice(index + 1, 0, {
67
- fieldName: actualFilters.current[index].fieldName,
68
- filter: actualFilters.current[index].filter,
69
- values: actualFilters.current[index].values
70
- });
85
+ newFilters.splice(index + 1, 0, __assign({}, actualFilters.current[index]));
71
86
  onChange(newFilters);
72
87
  }, [onChange]);
73
88
  var changeFilter = useCallback(function (newFilter, id) {
@@ -80,6 +95,6 @@ var AttributesFiltersBuilder = function (_a) {
80
95
  var addNewFilter = useCallback(function (newFilter) {
81
96
  onChange(__spreadArray(__spreadArray([], actualFilters.current, true), [newFilter], false));
82
97
  }, [onChange]);
83
- return (React.createElement(QueryBuilderRowsGroup, { rowClasses: rowClasses, rowsData: rowsData, AttributeSelectorComponent: AttributeSelector, FilterSelectorComponent: CustomFilterSelector || FilterSelector, ValuesEditorComponent: CustomValuesEditor || ValuesEditor, ActionsComponent: RowActions, LogicOperatorComponent: Stub, filterSelectorRefIndex: lastAttributesCountRef.current, filterSelectorRef: attributeFilterRef, lastRowAttributeSelectorProps: lastRowAttributeSelectorProps, attributesGroup: attributeSelectorItems, changeFilter: changeFilter, addNewFilter: addNewFilter, addRowAfterIndex: addRowAfterIndex, removeRow: removeRow, duplicateRow: duplicateRow, entityType: entityType }));
98
+ return (React.createElement(QueryBuilderRowsGroup, { rowClasses: rowClasses, rowsData: rowsData, AttributeSelectorComponent: AttributeSelector, FilterSelectorComponent: CustomFilterSelector || FilterSelector, ValuesEditorComponent: CustomValuesEditor || ValuesEditor, ActionsComponent: RowActions, LogicOperatorComponent: LogicalOperator, filterSelectorRefIndex: lastAttributesCountRef.current, filterSelectorRef: attributeFilterRef, lastRowAttributeSelectorProps: lastRowAttributeSelectorProps, attributeSelectorItemsGroups: attributeSelectorItemsGroups, entityType: currentEntityType, changeFilter: changeFilter, addNewFilter: addNewFilter, addRowAfterIndex: addRowAfterIndex, removeRow: removeRow, duplicateRow: duplicateRow, onFilterAttributeChange: onFilterAttributeChange }));
84
99
  };
85
100
  export default memo(AttributesFiltersBuilder);
@@ -1,17 +1,17 @@
1
- import React, { useCallback, useMemo, memo } from 'react';
2
- import { getSearchGroupAttributeLabel } from '@reltio/mdm-sdk';
1
+ import React, { useCallback, memo } from 'react';
2
+ import { SearchOperator, getSearchGroupAttributeLabel } from '@reltio/mdm-sdk';
3
3
  import BasicAttributeSelector from '../../../BasicAttributeSelector/BasicAttributeSelector';
4
4
  var AttributeSelector = function (_a) {
5
5
  var rowData = _a.rowData, rowContext = _a.rowContext, attributeSelectorProps = _a.attributeSelectorProps;
6
- var _b = rowData || {}, attribute = _b.attribute, id = _b.id, filter = _b.filter;
7
- var changeFilter = rowContext.changeFilter, addNewFilter = rowContext.addNewFilter, attributesGroup = rowContext.attributesGroup;
6
+ var _b = rowData || {}, attribute = _b.attribute, id = _b.id, filter = _b.filter, operator = _b.operator;
7
+ var changeFilter = rowContext.changeFilter, addNewFilter = rowContext.addNewFilter, attributeSelectorItemsGroups = rowContext.attributeSelectorItemsGroups, onFilterAttributeChange = rowContext.onFilterAttributeChange;
8
8
  var getSelectedAttributeLabel = useCallback(function (data) { return getSearchGroupAttributeLabel({ data: data }); }, []);
9
- var itemsGroup = useMemo(function () { return [{ id: '', title: '', attributes: attributesGroup }]; }, [attributesGroup]);
10
9
  var changeAttribute = useCallback(function (selectInfo) {
11
10
  if (rowData) {
12
11
  var newFilter = {
13
12
  fieldName: selectInfo.attribute.fieldName,
14
13
  filter: filter,
14
+ operator: operator,
15
15
  values: []
16
16
  };
17
17
  changeFilter(newFilter, id);
@@ -20,10 +20,12 @@ var AttributeSelector = function (_a) {
20
20
  addNewFilter({
21
21
  fieldName: selectInfo.attribute.fieldName,
22
22
  filter: null,
23
+ operator: SearchOperator.and,
23
24
  values: []
24
25
  });
25
26
  }
26
- }, [addNewFilter, changeFilter, id, rowData, filter]);
27
- return (React.createElement(BasicAttributeSelector, { itemsGroups: itemsGroup, ungroup: true, single: true, value: attribute, getLabel: getSelectedAttributeLabel, onSelect: changeAttribute, onOpenPopup: attributeSelectorProps.onOpen }));
27
+ onFilterAttributeChange && onFilterAttributeChange(selectInfo);
28
+ }, [rowData, onFilterAttributeChange, filter, operator, changeFilter, id, addNewFilter]);
29
+ return (React.createElement(BasicAttributeSelector, { itemsGroups: attributeSelectorItemsGroups, ungroup: attributeSelectorItemsGroups.length < 2, single: true, value: attribute, getLabel: getSelectedAttributeLabel, onSelect: changeAttribute, onOpenPopup: attributeSelectorProps.onOpen }));
28
30
  };
29
31
  export default memo(AttributeSelector);
@@ -10,7 +10,7 @@ var FilterSelector = function (_a) {
10
10
  var _b;
11
11
  var rowData = _a.rowData, rowContext = _a.rowContext, textFieldInputRef = _a.textFieldInputRef, optionsProp = _a.options;
12
12
  var styles = useStyles();
13
- var _c = rowData || {}, _d = _c.attribute, _e = _d === void 0 ? {} : _d, _f = _e.attrType, attrType = _f === void 0 ? {} : _f, _g = _e.fieldName, fieldName = _g === void 0 ? null : _g, filter = _c.filter, id = _c.id;
13
+ var _c = rowData || {}, _d = _c.attribute, _e = _d === void 0 ? {} : _d, _f = _e.attrType, attrType = _f === void 0 ? {} : _f, _g = _e.fieldName, fieldName = _g === void 0 ? null : _g, filter = _c.filter, id = _c.id, operator = _c.operator;
14
14
  var changeFilter = rowContext.changeFilter;
15
15
  var options = optionsProp ||
16
16
  (attrType &&
@@ -20,10 +20,11 @@ var FilterSelector = function (_a) {
20
20
  var newFilter = {
21
21
  fieldName: fieldName,
22
22
  filter: filterOption.value,
23
+ operator: operator,
23
24
  values: []
24
25
  };
25
26
  changeFilter(newFilter, id);
26
- }, [changeFilter, id, fieldName]);
27
+ }, [fieldName, operator, changeFilter, id]);
27
28
  useEffect(function () {
28
29
  if ((fieldName && !filter) || (fieldName && !findValue(options, filter))) {
29
30
  onChangeFilter(options[0]);
@@ -7,14 +7,15 @@ var ValuesEditor = function (_a) {
7
7
  var styles = useStyles();
8
8
  var canFilterAcceptValues = (rowData === null || rowData === void 0 ? void 0 : rowData.attribute) && checkIfOptionHasValues(rowData.filter);
9
9
  var changeFilter = rowContext.changeFilter;
10
- var _b = (rowData || {}), _c = _b.values, values = _c === void 0 ? [] : _c, _d = _b.attribute, _e = _d === void 0 ? {} : _d, attrType = _e.attrType, _f = _e.fieldName, fieldName = _f === void 0 ? null : _f, filter = _b.filter, id = _b.id;
10
+ var _b = (rowData || {}), _c = _b.values, values = _c === void 0 ? [] : _c, _d = _b.attribute, _e = _d === void 0 ? {} : _d, attrType = _e.attrType, _f = _e.fieldName, fieldName = _f === void 0 ? null : _f, filter = _b.filter, id = _b.id, operator = _b.operator;
11
11
  var valueDataTypeDefinition = attrType && getAttrDataTypeDefinition(attrType);
12
12
  var filterValueDataTypeDefinition = valueDataTypeDefinition && getDataTypeDefinitionForFilterValue(valueDataTypeDefinition, filter);
13
13
  var editorFilter = useMemo(function () { return ({
14
14
  filter: filter,
15
15
  fieldName: fieldName,
16
+ operator: operator,
16
17
  values: values || []
17
- }); }, [filter, fieldName, values]);
18
+ }); }, [filter, fieldName, operator, values]);
18
19
  var TextFieldProps = useMemo(function () { return ({
19
20
  InputProps: {
20
21
  classes: {
@@ -27,10 +28,11 @@ var ValuesEditor = function (_a) {
27
28
  var newFilter = {
28
29
  fieldName: fieldName,
29
30
  filter: filter,
31
+ operator: operator,
30
32
  values: newValues
31
33
  };
32
34
  changeFilter(newFilter, id);
33
- }, [changeFilter, id, fieldName, filter]);
35
+ }, [fieldName, filter, operator, changeFilter, id]);
34
36
  return (React.createElement("div", { className: styles.valuesEditor }, (rowData === null || rowData === void 0 ? void 0 : rowData.attribute) && canFilterAcceptValues && (React.createElement(FilterValueEditor, { "data-reltio-id": "filter-value-editor", filter: editorFilter, onChange: changeValue, dataTypeDefinition: filterValueDataTypeDefinition, fullWidth: true, TextFieldProps: TextFieldProps, color: "primary", classes: editorClasses, orientation: "horizontal" }))));
35
37
  };
36
38
  export default memo(ValuesEditor);
@@ -17,7 +17,7 @@ export var useStyles = makeStyles({
17
17
  valuesEditor: {
18
18
  display: 'flex',
19
19
  alignItems: 'center',
20
- width: '222px!important',
20
+ width: '100%',
21
21
  minHeight: '40px',
22
22
  flexShrink: 0
23
23
  }
@@ -1,11 +1,12 @@
1
- import { AttributeType, TEntityType, Metadata, SearchFilter } from '@reltio/mdm-sdk';
2
- import { AttributeSelectorItem } from '../../types';
1
+ import { AttributeType, Metadata, SearchFilter } from '@reltio/mdm-sdk';
2
+ import { AttributeSelectorItem, AttributeSelectorItemsGroup, AttributesTypesGroup } from '../../types';
3
3
  import { FilterOption } from './types';
4
- export declare const getAttributeSelectorItems: (attributeTypes: AttributeType[], entityType: TEntityType, metadata: Metadata) => AttributeSelectorItem[];
4
+ export declare const getAttributeSelectorItems: (attributesTypesGroups: AttributesTypesGroup[], metadata: Metadata) => AttributeSelectorItemsGroup[];
5
5
  export declare const findValue: (options: FilterOption[], filter: string) => FilterOption;
6
- export declare const getRowsDataFromFilters: (filters: SearchFilter[], attributesGroup: AttributeSelectorItem[]) => {
6
+ export declare const getRowsDataFromFilters: (filters: SearchFilter[], attributesGroupArr: AttributeSelectorItemsGroup[]) => {
7
7
  attribute: AttributeSelectorItem;
8
8
  filter: string;
9
+ operator: import("@reltio/mdm-sdk").SearchOperator;
9
10
  id: number;
10
11
  values: (import("@reltio/mdm-sdk").PrimitiveValue | Pick<import("@reltio/mdm-sdk").SimpleAttributeValue, "value" | "lookupCode">)[] | [(import("@reltio/mdm-sdk").PrimitiveValue | Pick<import("@reltio/mdm-sdk").SimpleAttributeValue, "value" | "lookupCode">)[]];
11
12
  }[];
@@ -18,7 +18,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
18
18
  }
19
19
  return to.concat(ar || Array.prototype.slice.call(from));
20
20
  };
21
- import { getAttributesTreeFromAttributes, attributeUriToSearchUri, isSpecialAttribute, getBaseUri, getEntityTypeLabel } from '@reltio/mdm-sdk';
21
+ import { getAttributesTreeFromAttributes, attributeUriToSearchUri, isSpecialAttribute, getBaseUri, getEntityTypeLabel, getEntityType, findRegularAttribute } from '@reltio/mdm-sdk';
22
22
  import { chain, prop } from 'ramda';
23
23
  var createAttributeItem = function (metadata, attrType, entityTypeUri, parents) {
24
24
  var entityTypeLabel = getEntityTypeLabel(metadata, { type: entityTypeUri });
@@ -48,44 +48,58 @@ var createAttributesConfig = function (metadata, attrNode, entityTypeUri, parent
48
48
  }
49
49
  return resConfig;
50
50
  };
51
- export var getAttributeSelectorItems = function (attributeTypes, entityType, metadata) {
52
- if (entityType === void 0) { entityType = {}; }
53
- return getAttributesTreeFromAttributes(attributeTypes, metadata).map(function (attrNode) {
54
- var entityTypeUri = isSpecialAttribute(attrNode) ? null : entityType.uri;
55
- return createAttributesConfig(metadata, attrNode, entityTypeUri);
51
+ export var getAttributeSelectorItems = function (attributesTypesGroups, metadata) {
52
+ return attributesTypesGroups.map(function (_a) {
53
+ var id = _a.id, title = _a.title, attributeTypes = _a.attributeTypes;
54
+ var entityType = getEntityType(metadata, getEntityTypeFromAttrTypes(attributeTypes));
55
+ return {
56
+ id: id,
57
+ title: title,
58
+ attributes: getAttributesTreeFromAttributes(attributeTypes, metadata).map(function (attrNode) {
59
+ var entityTypeUri = isSpecialAttribute(attrNode) ? null : entityType.uri;
60
+ return createAttributesConfig(metadata, attrNode, entityTypeUri);
61
+ })
62
+ };
56
63
  });
57
64
  };
58
65
  var findAttributeSelectorItem = function (fieldName, attributesGroup) {
59
66
  var attrGroup;
60
- var findAttribute = function (fieldName, attributesGroup) {
61
- for (var _i = 0, attributesGroup_1 = attributesGroup; _i < attributesGroup_1.length; _i++) {
62
- var attributeGroup = attributesGroup_1[_i];
63
- if (fieldName === attributeGroup.fieldName) {
64
- attrGroup = attributeGroup;
65
- return;
66
- }
67
- if ('children' in attributeGroup) {
68
- findAttribute(fieldName, attributeGroup.children);
67
+ var _loop_1 = function (attributesGroupItem) {
68
+ var findAttribute = function (fieldName, attributesSelectorItems) {
69
+ for (var _i = 0, attributesSelectorItems_1 = attributesSelectorItems; _i < attributesSelectorItems_1.length; _i++) {
70
+ var attributeGroup = attributesSelectorItems_1[_i];
71
+ if (fieldName === attributeGroup.fieldName) {
72
+ attrGroup = attributeGroup;
73
+ return;
74
+ }
75
+ if ('children' in attributeGroup) {
76
+ findAttribute(fieldName, attributeGroup.children);
77
+ }
69
78
  }
70
- }
79
+ };
80
+ findAttribute(fieldName, attributesGroupItem.attributes);
71
81
  };
72
- findAttribute(fieldName, attributesGroup);
82
+ for (var _i = 0, attributesGroup_1 = attributesGroup; _i < attributesGroup_1.length; _i++) {
83
+ var attributesGroupItem = attributesGroup_1[_i];
84
+ _loop_1(attributesGroupItem);
85
+ }
73
86
  return attrGroup;
74
87
  };
75
88
  export var findValue = function (options, filter) {
76
89
  return options ? options.find(function (option) { return option.value === filter; }) : null;
77
90
  };
78
- export var getRowsDataFromFilters = function (filters, attributesGroup) {
91
+ export var getRowsDataFromFilters = function (filters, attributesGroupArr) {
79
92
  return filters.map(function (filter, index) {
80
93
  return {
81
- attribute: filter.fieldName ? findAttributeSelectorItem(filter.fieldName, attributesGroup) : undefined,
94
+ attribute: filter.fieldName ? findAttributeSelectorItem(filter.fieldName, attributesGroupArr) : undefined,
82
95
  filter: filter.filter,
96
+ operator: filter.operator,
83
97
  id: index,
84
98
  values: filter.values
85
99
  };
86
100
  });
87
101
  };
88
102
  export var getEntityTypeFromAttrTypes = function (attributeTypes) {
89
- var regularAttribute = attributeTypes.find(function (attribute) { return !isSpecialAttribute(attribute); });
103
+ var regularAttribute = findRegularAttribute(attributeTypes);
90
104
  return regularAttribute ? getBaseUri(regularAttribute.uri) : null;
91
105
  };
@@ -1,17 +1,18 @@
1
1
  import { SearchFilter, TEntityType } from '@reltio/mdm-sdk';
2
- import { AttributeSelectorItem, FiltersRowData } from '../../types';
2
+ import { AttributeSelectionInfo, AttributeSelectorItemsGroup, FiltersRowData } from '../../types';
3
3
  export type FilterOption = {
4
4
  value: string;
5
5
  label: string;
6
6
  };
7
7
  export type RowContext = {
8
- attributesGroup: AttributeSelectorItem[];
8
+ attributeSelectorItemsGroups: AttributeSelectorItemsGroup[];
9
9
  entityType: TEntityType;
10
10
  addNewFilter: (newFilter: SearchFilter) => void;
11
11
  addRowAfterIndex: (index: number) => void;
12
12
  changeFilter: (newFilter: SearchFilter, id: number) => void;
13
13
  duplicateRow: (index: number) => void;
14
14
  removeRow: (index: number) => void;
15
+ onFilterAttributeChange?: (attrSelectInfo: AttributeSelectionInfo) => void;
15
16
  };
16
17
  export type AttributeFiltersComponentProps = {
17
18
  rowData: FiltersRowData;
@@ -1,17 +1,24 @@
1
1
  import React from 'react';
2
- import { SearchFilter, AttributeType } from '@reltio/mdm-sdk';
2
+ import { SearchFilter } from '@reltio/mdm-sdk';
3
+ import { AttributeSelectionInfo, AttributesFilterComponentsClasses, AttributesTypesGroup } from '../../types';
3
4
  type Props = {
5
+ classes?: AttributesFilterComponentsClasses;
4
6
  filters: SearchFilter[];
5
7
  onChange: (filters: SearchFilter[]) => void;
6
- attributeTypes: AttributeType[];
8
+ attributesTypesGroups: AttributesTypesGroup[];
7
9
  components?: {
8
10
  ValuesEditor?: React.ElementType;
9
11
  FilterSelector?: React.ElementType;
12
+ LogicalOperator?: React.ElementType;
10
13
  };
11
14
  children?: React.ReactNode;
12
15
  onTogglePopup?: (open: boolean) => void;
13
16
  isFiltersApplied?: boolean;
14
17
  dataReltioId?: string;
18
+ onFilterAttributeChange?: (attrSelectInfo: AttributeSelectionInfo) => void;
19
+ onClear?: () => void;
20
+ onCancel?: () => void;
21
+ onApply?: () => void;
15
22
  };
16
- declare const _default: React.MemoExoticComponent<({ filters: filtersProp, attributeTypes, onChange, components, children, onTogglePopup, isFiltersApplied: isFiltersAppliedProp, dataReltioId }: Props) => JSX.Element>;
23
+ declare const _default: React.MemoExoticComponent<({ filters: filtersProp, classes, attributesTypesGroups, onChange, components, children, onTogglePopup, isFiltersApplied: isFiltersAppliedProp, dataReltioId, onFilterAttributeChange, onCancel, onClear, onApply }: Props) => JSX.Element>;
17
24
  export default _default;
@@ -5,12 +5,13 @@ import Button from '@mui/material/Button';
5
5
  import FilterIcon from '@mui/icons-material/FilterList';
6
6
  import Typography from '@mui/material/Typography';
7
7
  import Divider from '@mui/material/Divider';
8
+ import classNames from 'classnames';
8
9
  import { buildFilterQueryString } from '@reltio/mdm-sdk';
9
10
  import AttributesFiltersBuilder from '../AttributesFiltersBuilder/AttributesFiltersBuilder';
10
11
  import ActionButtons from './ActionButtons/ActionButtons';
11
12
  import { useStyles } from './styles';
12
13
  var AttributesFiltersButton = function (_a) {
13
- var filtersProp = _a.filters, attributeTypes = _a.attributeTypes, onChange = _a.onChange, components = _a.components, children = _a.children, onTogglePopup = _a.onTogglePopup, isFiltersAppliedProp = _a.isFiltersApplied, dataReltioId = _a.dataReltioId;
14
+ var filtersProp = _a.filters, classes = _a.classes, attributesTypesGroups = _a.attributesTypesGroups, onChange = _a.onChange, components = _a.components, children = _a.children, onTogglePopup = _a.onTogglePopup, isFiltersAppliedProp = _a.isFiltersApplied, dataReltioId = _a.dataReltioId, onFilterAttributeChange = _a.onFilterAttributeChange, onCancel = _a.onCancel, onClear = _a.onClear, onApply = _a.onApply;
14
15
  var styles = useStyles();
15
16
  var buttonRef = useRef();
16
17
  var _b = useState(false), isOpen = _b[0], setIsOpen = _b[1];
@@ -30,21 +31,24 @@ var AttributesFiltersButton = function (_a) {
30
31
  }, [filtersProp, isOpen]);
31
32
  var applyButtonHandler = useCallback(function () {
32
33
  onChange(filters);
34
+ onApply && onApply();
33
35
  togglePopup();
34
- }, [filters, onChange]);
36
+ }, [filters, onChange, onApply]);
35
37
  var cancelButtonHandler = useCallback(function () {
38
+ onCancel && onCancel();
36
39
  togglePopup();
37
- }, []);
40
+ }, [onCancel]);
38
41
  var clearAllButtonHandler = useCallback(function () {
42
+ onClear && onClear();
39
43
  setFilters([]);
40
- }, []);
44
+ }, [onClear]);
41
45
  return (React.createElement(React.Fragment, null,
42
46
  React.createElement(Button, { "data-reltio-id": dataReltioId, ref: buttonRef, color: buttonColor, classes: {
43
47
  root: styles.triggerButton,
44
48
  textPrimary: styles.changedFiltersIndicator
45
49
  }, onClick: togglePopup },
46
50
  React.createElement(FilterIcon, { color: buttonColor })),
47
- React.createElement(Popover, { open: isOpen, classes: { paper: styles.popupContent }, anchorEl: buttonRef.current, onClose: togglePopup, anchorOrigin: {
51
+ React.createElement(Popover, { open: isOpen, classes: { paper: classNames(styles.popupContent, classes === null || classes === void 0 ? void 0 : classes.filterPopup) }, anchorEl: buttonRef.current, onClose: togglePopup, anchorOrigin: {
48
52
  vertical: 'bottom',
49
53
  horizontal: 'right'
50
54
  }, transformOrigin: {
@@ -55,7 +59,7 @@ var AttributesFiltersButton = function (_a) {
55
59
  React.createElement(Typography, { variant: "h6" }, i18n.text('Filter')),
56
60
  React.createElement("div", { className: styles.filtersBuilderWrapper },
57
61
  children,
58
- React.createElement(AttributesFiltersBuilder, { attributeTypes: attributeTypes, filters: filters, onChange: setFilters, components: components })),
62
+ React.createElement(AttributesFiltersBuilder, { attributesTypesGroups: attributesTypesGroups, filters: filters, onChange: setFilters, components: components, onFilterAttributeChange: onFilterAttributeChange, classes: classes })),
59
63
  React.createElement(Divider, { className: styles.divider }),
60
64
  React.createElement(ActionButtons, { onApply: applyButtonHandler, onCancel: cancelButtonHandler, onClear: clearAllButtonHandler })))));
61
65
  };
@@ -2,6 +2,7 @@ import { makeStyles } from '@mui/styles';
2
2
  var useStyles = makeStyles({
3
3
  selector: {
4
4
  minWidth: '200px',
5
+ width: '100%',
5
6
  alignItems: 'stretch',
6
7
  background: 'rgba(0,0,0, 0.0267)',
7
8
  boxSizing: 'border-box',
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ import { SearchOperator } from '@reltio/mdm-sdk';
3
+ type Props = {
4
+ className?: string;
5
+ value: string;
6
+ onChange: (value: SearchOperator) => void;
7
+ };
8
+ declare const LogicOperator: ({ className, value, onChange }: Props) => JSX.Element;
9
+ export default LogicOperator;
@@ -0,0 +1,24 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import React from 'react';
13
+ import classnames from 'classnames';
14
+ import { DropDownEditor } from '@reltio/components';
15
+ import { operatorOptions } from '@reltio/mdm-sdk';
16
+ import i18n from 'ui-i18n';
17
+ import useStyles from './styles';
18
+ var LogicOperator = function (_a) {
19
+ var className = _a.className, value = _a.value, onChange = _a.onChange;
20
+ var classes = useStyles();
21
+ var entries = operatorOptions.map(function (operator) { return (__assign(__assign({}, operator), { label: i18n.text(operator.label) })); });
22
+ return (React.createElement(DropDownEditor, { className: classnames(classes.dropDown, className), classes: classes, value: value, entries: entries, onChange: onChange }));
23
+ };
24
+ export default LogicOperator;
@@ -0,0 +1,2 @@
1
+ declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"select" | "dropDown">;
2
+ export default useStyles;
@@ -0,0 +1,13 @@
1
+ import { makeStyles } from '@mui/styles';
2
+ var useStyles = makeStyles(function () { return ({
3
+ select: {
4
+ padding: '6px 16px 7px'
5
+ },
6
+ dropDown: {
7
+ width: '100px',
8
+ '&:before': {
9
+ content: 'none !important'
10
+ }
11
+ }
12
+ }); });
13
+ export default useStyles;
@@ -155,3 +155,4 @@ export { default as MultilineMenuItem } from './MultilineMenuItem/MultilineMenuI
155
155
  export { default as TenantLabel } from './TenantLabel/TenantLabel';
156
156
  export { default as StepNavigation } from './StepNavigation/StepNavigation';
157
157
  export { TableSkeleton } from './TableSkeleton/TableSkeleton';
158
+ export { default as LogicOperator } from './LogicOperator/LogicOperator';
@@ -155,3 +155,4 @@ export { default as MultilineMenuItem } from './MultilineMenuItem/MultilineMenuI
155
155
  export { default as TenantLabel } from './TenantLabel/TenantLabel';
156
156
  export { default as StepNavigation } from './StepNavigation/StepNavigation';
157
157
  export { TableSkeleton } from './TableSkeleton/TableSkeleton';
158
+ export { default as LogicOperator } from './LogicOperator/LogicOperator';
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { AttributeType, SearchFilter } from '@reltio/mdm-sdk';
2
+ import { AttributeType, SearchFilter, SearchOperator } from '@reltio/mdm-sdk';
3
3
  export type ReactGridLayoutItem = {
4
4
  i: string;
5
5
  x: number;
@@ -46,6 +46,7 @@ export type FiltersRowData = {
46
46
  filter: string;
47
47
  id: number;
48
48
  values: SearchFilter['values'];
49
+ operator?: SearchOperator;
49
50
  };
50
51
  export type AttributeSelectorItem = {
51
52
  attrType?: AttributeType;
@@ -62,6 +63,11 @@ export type AttributeSelectorItemsGroup = {
62
63
  title: string;
63
64
  attributes: AttributeSelectorItem[];
64
65
  };
66
+ export type AttributesTypesGroup = {
67
+ id?: string;
68
+ title: string;
69
+ attributeTypes: AttributeType[];
70
+ };
65
71
  export type AttributeSelectionInfo = {
66
72
  index: number;
67
73
  checked: boolean;
@@ -137,3 +143,10 @@ export type AnyAction = {
137
143
  type: string;
138
144
  [key: string]: any;
139
145
  };
146
+ export type AttributesFilterComponentsClasses = {
147
+ attributeSelectorContainer?: string;
148
+ valuesEditorContainer?: string;
149
+ filterSelectorContainer?: string;
150
+ actionsContainer?: string;
151
+ filterPopup?: string;
152
+ };
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@reltio/components",
3
- "version": "1.4.1731",
3
+ "version": "1.4.1732",
4
4
  "license": "SEE LICENSE IN LICENSE FILE",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
7
7
  "dependencies": {
8
8
  "@fluentui/react-context-selector": "^9.1.26",
9
9
  "@react-google-maps/api": "2.7.0",
10
- "@reltio/mdm-sdk": "^1.4.1716",
10
+ "@reltio/mdm-sdk": "^1.4.1717",
11
11
  "classnames": "^2.2.5",
12
12
  "d3-cloud": "^1.2.5",
13
13
  "d3-geo": "^2.0.1",