@reltio/components 1.4.1939 → 1.4.1941
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.
- package/cjs/AttributesFiltersButton/AttributesFiltersButton.d.ts +4 -1
- package/cjs/AttributesFiltersButton/AttributesFiltersButton.js +9 -8
- package/cjs/AttributesFiltersButton/AttributesFiltersButton.test.js +15 -0
- package/cjs/EditModeAttributesList/EditModeAttributesList.js +1 -1
- package/cjs/EditModeAttributesPager/components/AttributeRenderer/IntegrationAttributeRenderer.test.js +27 -0
- package/cjs/EditModeComplexAttribute/EditModeComplexAttribute.js +8 -2
- package/cjs/EntitySelector/EntitySelector.d.ts +2 -1
- package/cjs/EntitySelector/EntitySelector.js +3 -3
- package/cjs/EntitySelector/EntitySelector.test.js +3 -2
- package/cjs/ReferenceAttributeEditor/ReferenceAttributeEditor.js +1 -1
- package/cjs/RelationEditor/IntegrationRelationEditor.test.js +60 -1
- package/cjs/RelationEditor/RelationEditor.js +7 -5
- package/cjs/SearchInput/SearchInput.d.ts +2 -1
- package/cjs/SearchInput/SearchInput.js +4 -2
- package/cjs/SearchInput/SearchInput.spec.js +115 -35
- package/cjs/SimpleAttribute/IntegrationSimpleAttribute.test.js +9 -3
- package/cjs/SimpleAttributeEditor/SimpleAttributeEditor.js +3 -3
- package/cjs/hooks/useMaskedAttribute/useMaskedAttribute.js +3 -1
- package/cjs/types/index.d.ts +1 -0
- package/esm/AttributesFiltersButton/AttributesFiltersButton.d.ts +4 -1
- package/esm/AttributesFiltersButton/AttributesFiltersButton.js +9 -8
- package/esm/AttributesFiltersButton/AttributesFiltersButton.test.js +15 -0
- package/esm/EditModeAttributesList/EditModeAttributesList.js +2 -2
- package/esm/EditModeAttributesPager/components/AttributeRenderer/IntegrationAttributeRenderer.test.js +27 -0
- package/esm/EditModeComplexAttribute/EditModeComplexAttribute.js +9 -3
- package/esm/EntitySelector/EntitySelector.d.ts +2 -1
- package/esm/EntitySelector/EntitySelector.js +3 -3
- package/esm/EntitySelector/EntitySelector.test.js +3 -2
- package/esm/ReferenceAttributeEditor/ReferenceAttributeEditor.js +2 -2
- package/esm/RelationEditor/IntegrationRelationEditor.test.js +60 -1
- package/esm/RelationEditor/RelationEditor.js +9 -7
- package/esm/SearchInput/SearchInput.d.ts +2 -1
- package/esm/SearchInput/SearchInput.js +4 -2
- package/esm/SearchInput/SearchInput.spec.js +115 -35
- package/esm/SimpleAttribute/IntegrationSimpleAttribute.test.js +9 -3
- package/esm/SimpleAttributeEditor/SimpleAttributeEditor.js +4 -4
- package/esm/hooks/useMaskedAttribute/useMaskedAttribute.js +3 -1
- package/esm/types/index.d.ts +1 -0
- package/package.json +2 -2
|
@@ -16,10 +16,13 @@ type Props = {
|
|
|
16
16
|
onTogglePopup?: (open: boolean) => void;
|
|
17
17
|
isFiltersApplied?: boolean;
|
|
18
18
|
dataReltioId?: string;
|
|
19
|
+
ButtonIcon?: React.ElementType;
|
|
19
20
|
onFilterAttributeChange?: (attrSelectInfo: AttributeSelectionInfo) => void;
|
|
20
21
|
onClear?: () => void;
|
|
21
22
|
onCancel?: () => void;
|
|
22
23
|
onApply?: () => void;
|
|
24
|
+
popoverAnchorRef?: React.MutableRefObject<HTMLDivElement>;
|
|
25
|
+
title?: string;
|
|
23
26
|
};
|
|
24
|
-
declare const _default: React.MemoExoticComponent<({ filters: filtersProp, classes, attributesTypesGroups, attributesTypesGroupFilter, onChange, components, children, onTogglePopup, isFiltersApplied: isFiltersAppliedProp, dataReltioId, onFilterAttributeChange, onCancel, onClear, onApply }: Props) => JSX.Element>;
|
|
27
|
+
declare const _default: React.MemoExoticComponent<({ filters: filtersProp, classes, attributesTypesGroups, attributesTypesGroupFilter, onChange, components, children, onTogglePopup, isFiltersApplied: isFiltersAppliedProp, dataReltioId, onFilterAttributeChange, onCancel, onClear, onApply, ButtonIcon, popoverAnchorRef, title }: Props) => JSX.Element>;
|
|
25
28
|
export default _default;
|
|
@@ -39,11 +39,12 @@ var AttributesFiltersBuilder_1 = require("../AttributesFiltersBuilder");
|
|
|
39
39
|
var ActionButtons_1 = require("./components/ActionButtons/");
|
|
40
40
|
var styles_1 = require("./styles");
|
|
41
41
|
var AttributesFiltersButton = function (_a) {
|
|
42
|
-
var
|
|
42
|
+
var _b;
|
|
43
|
+
var filtersProp = _a.filters, classes = _a.classes, attributesTypesGroups = _a.attributesTypesGroups, attributesTypesGroupFilter = _a.attributesTypesGroupFilter, 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, _c = _a.ButtonIcon, ButtonIcon = _c === void 0 ? FilterList_1.default : _c, popoverAnchorRef = _a.popoverAnchorRef, title = _a.title;
|
|
43
44
|
var styles = (0, styles_1.useStyles)();
|
|
44
45
|
var buttonRef = (0, react_1.useRef)();
|
|
45
|
-
var
|
|
46
|
-
var
|
|
46
|
+
var _d = (0, react_1.useState)(false), isOpen = _d[0], setIsOpen = _d[1];
|
|
47
|
+
var _e = (0, react_1.useState)([]), filters = _e[0], setFilters = _e[1];
|
|
47
48
|
var isFiltersApplied = isFiltersAppliedProp !== null && isFiltersAppliedProp !== void 0 ? isFiltersAppliedProp : !!(0, mdm_sdk_1.buildFilterQueryString)()(filtersProp);
|
|
48
49
|
var buttonColor = isFiltersApplied ? 'primary' : 'inherit';
|
|
49
50
|
var togglePopup = function () {
|
|
@@ -72,19 +73,19 @@ var AttributesFiltersButton = function (_a) {
|
|
|
72
73
|
}, [onClear]);
|
|
73
74
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
74
75
|
react_1.default.createElement(Button_1.default, { "data-reltio-id": dataReltioId, ref: buttonRef, color: buttonColor, classes: {
|
|
75
|
-
root: styles.triggerButton,
|
|
76
|
+
root: (0, classnames_1.default)(styles.triggerButton, classes === null || classes === void 0 ? void 0 : classes.triggerButton),
|
|
76
77
|
textPrimary: styles.changedFiltersIndicator
|
|
77
78
|
}, onClick: togglePopup },
|
|
78
|
-
react_1.default.createElement(
|
|
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: {
|
|
79
|
+
react_1.default.createElement(ButtonIcon, { color: buttonColor })),
|
|
80
|
+
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: (_b = popoverAnchorRef === null || popoverAnchorRef === void 0 ? void 0 : popoverAnchorRef.current) !== null && _b !== void 0 ? _b : buttonRef.current, onClose: togglePopup, anchorOrigin: {
|
|
80
81
|
vertical: 'bottom',
|
|
81
|
-
horizontal: 'right'
|
|
82
|
+
horizontal: (popoverAnchorRef === null || popoverAnchorRef === void 0 ? void 0 : popoverAnchorRef.current) ? 'left' : 'right'
|
|
82
83
|
}, transformOrigin: {
|
|
83
84
|
vertical: 'top',
|
|
84
85
|
horizontal: 'left'
|
|
85
86
|
} },
|
|
86
87
|
react_1.default.createElement(react_1.default.Fragment, null,
|
|
87
|
-
react_1.default.createElement(Typography_1.default, { variant: "h6" }, ui_i18n_1.default.text('Filter')),
|
|
88
|
+
react_1.default.createElement(Typography_1.default, { variant: "h6" }, title !== null && title !== void 0 ? title : ui_i18n_1.default.text('Filter')),
|
|
88
89
|
react_1.default.createElement("div", { className: styles.filtersBuilderWrapper },
|
|
89
90
|
children,
|
|
90
91
|
react_1.default.createElement(AttributesFiltersBuilder_1.AttributesFiltersBuilder, { attributesTypesGroups: attributesTypesGroups, attributesTypesGroupFilter: attributesTypesGroupFilter, filters: filters, onChange: setFilters, components: components, onFilterAttributeChange: onFilterAttributeChange, classes: classes })),
|
|
@@ -247,4 +247,19 @@ describe('AttributesFiltersButton tests', function () {
|
|
|
247
247
|
}
|
|
248
248
|
});
|
|
249
249
|
}); });
|
|
250
|
+
it('should use title if defined', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
251
|
+
var title, user;
|
|
252
|
+
return __generator(this, function (_a) {
|
|
253
|
+
switch (_a.label) {
|
|
254
|
+
case 0:
|
|
255
|
+
title = 'TestTitle';
|
|
256
|
+
user = setUp(__assign(__assign({}, defaultProps), { title: title })).user;
|
|
257
|
+
return [4 /*yield*/, user.click(react_2.screen.getByRole('button'))];
|
|
258
|
+
case 1:
|
|
259
|
+
_a.sent();
|
|
260
|
+
expect(react_2.screen.getByText(title)).toBeInTheDocument();
|
|
261
|
+
return [2 /*return*/];
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}); });
|
|
250
265
|
});
|
|
@@ -95,7 +95,7 @@ var EditModeAttributesList = function (_a) {
|
|
|
95
95
|
}); }, [hasDeletionsMap, setHasDeletions]);
|
|
96
96
|
return (react_1.default.createElement("div", { className: className },
|
|
97
97
|
children && react_1.default.createElement(BranchDecorator_1.BranchDecorator, __assign({}, decoratorProps), children),
|
|
98
|
-
react_1.default.createElement(BranchDecorator_1.BranchDecorator, __assign({}, decoratorProps, { plain: true }), moreAttrTypes.length > 0 && (react_1.default.createElement(MoreAttributesButton_1.MoreAttributesButton, { label: ui_i18n_1.default.text('More attributes'), onApply: onAddMoreAttributes, dense: drawLines, data: moreAttrTypes, parent: canCreateParentAttrType && parentAttributeType }))),
|
|
98
|
+
react_1.default.createElement(BranchDecorator_1.BranchDecorator, __assign({}, decoratorProps, { plain: true }), moreAttrTypes.length > 0 && mode !== mdm_sdk_1.Mode.Viewing && (react_1.default.createElement(MoreAttributesButton_1.MoreAttributesButton, { label: ui_i18n_1.default.text('More attributes'), onApply: onAddMoreAttributes, dense: drawLines, data: moreAttrTypes, parent: canCreateParentAttrType && parentAttributeType }))),
|
|
99
99
|
react_1.default.createElement(HasDeletionsContext_1.HasDeletionsContext.Provider, { value: hasDeletionsContextValue }, regularPagersData.concat(alwaysVisiblePagersData).map(function (_a) {
|
|
100
100
|
var attrType = _a.attrType, values = _a.values;
|
|
101
101
|
return (react_1.default.createElement(EditModeAttributesPager_1.EditModeAttributesPager, { key: "".concat(attrType.uri, "_").concat(parentUri), attributeType: attrType, drawLines: drawLines, values: values, paging: (0, ramda_1.path)(['paging', attrType.uri], attributes), parentUri: parentUri, showEmptyEditors: showEmptyEditors, mode: mode, crosswalks: crosswalks, onAddAttributes: onAddAttributes, onChangeAttribute: onChangeAttribute, onDeleteAttribute: onDeleteAttribute, additionalControlsRenderer: additionalControlsRenderer, showNonOv: showNonOv }));
|
|
@@ -190,4 +190,31 @@ describe('Attribute renderer tests', function () {
|
|
|
190
190
|
}
|
|
191
191
|
});
|
|
192
192
|
}); });
|
|
193
|
+
it('should render correct if one of the values is masked', function () {
|
|
194
|
+
var values = [
|
|
195
|
+
{
|
|
196
|
+
ov: true,
|
|
197
|
+
type: 'configuration/entityTypes/HCP/attributes/PrescriberIndicator',
|
|
198
|
+
uri: 'entities/0XAnnkw/attributes/PrescriberIndicator/ESG66YW',
|
|
199
|
+
value: false
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
ov: true,
|
|
203
|
+
type: 'configuration/entityTypes/HCP/attributes/PrescriberIndicator',
|
|
204
|
+
uri: 'entities/0XAnnkw/attributes/PrescriberIndicator/ESG66YW',
|
|
205
|
+
value: true,
|
|
206
|
+
masked: true
|
|
207
|
+
}
|
|
208
|
+
];
|
|
209
|
+
var props = __assign(__assign({}, defaultProps), { values: values });
|
|
210
|
+
setUp({ props: props });
|
|
211
|
+
var attributeValues = react_2.screen.getAllByTestId('reltio-attribute-value');
|
|
212
|
+
expect(attributeValues).toHaveLength(2);
|
|
213
|
+
expect((0, react_2.within)(attributeValues[0]).getAllByRole('checkbox')).toHaveLength(2);
|
|
214
|
+
expect((0, react_2.within)(attributeValues[0]).getByText('Yes')).toBeInTheDocument();
|
|
215
|
+
expect((0, react_2.within)(attributeValues[0]).getByText('No')).toBeInTheDocument();
|
|
216
|
+
expect((0, react_2.within)(attributeValues[1]).queryAllByRole('checkbox')).toHaveLength(0);
|
|
217
|
+
expect((0, react_2.within)(attributeValues[1]).getByText('Yes')).toBeInTheDocument();
|
|
218
|
+
expect((0, react_2.within)(attributeValues[1]).queryByText('No')).not.toBeInTheDocument();
|
|
219
|
+
});
|
|
193
220
|
});
|
|
@@ -45,7 +45,7 @@ var useScrollToAttributeError_1 = require("../hooks/useScrollToAttributeError");
|
|
|
45
45
|
var styles_1 = require("./styles");
|
|
46
46
|
var EditModeComplexAttribute = function (_a) {
|
|
47
47
|
var _b;
|
|
48
|
-
var label = _a.label, attributeTypesList = _a.attributeTypesList, attributeType = _a.attributeType, attributeValue = _a.attributeValue, children = _a.children, errors = _a.errors, ownError = _a.ownError,
|
|
48
|
+
var label = _a.label, attributeTypesList = _a.attributeTypesList, attributeType = _a.attributeType, attributeValue = _a.attributeValue, children = _a.children, errors = _a.errors, ownError = _a.ownError, modeProp = _a.mode, metadata = _a.metadata, crosswalks = _a.crosswalks, lazy = _a.lazy, showEmptyEditors = _a.showEmptyEditors, onAddOneMore = _a.onAddOneMore, onAddAttributes = _a.onAddAttributes, onDeleteAttribute = _a.onDeleteAttribute, onChangeAttribute = _a.onChangeAttribute, additionalControlsRenderer = _a.additionalControlsRenderer, hideDeleteButton = _a.hideDeleteButton, state = _a.state, showNonOv = _a.showNonOv, isHighlightedPath = _a.isHighlightedPath, highlightedError = _a.highlightedError, _c = _a.expanded, expandedProp = _c === void 0 ? false : _c;
|
|
49
49
|
var styles = (0, styles_1.useStyles)();
|
|
50
50
|
var deleted = state === 'deleted';
|
|
51
51
|
var edited = state === 'edited';
|
|
@@ -54,6 +54,7 @@ var EditModeComplexAttribute = function (_a) {
|
|
|
54
54
|
var defaultExpand = isNew || expandedProp;
|
|
55
55
|
var _d = (0, react_1.useState)(defaultExpand), expanded = _d[0], setExpanded = _d[1];
|
|
56
56
|
var _e = (0, useScrollToAttributeError_1.useScrollToAttributeError)({ highlightedError: highlightedError }), ref = _e.ref, errorClassName = _e.errorClassName;
|
|
57
|
+
var mode = attributeValue.masked ? mdm_sdk_1.Mode.Viewing : modeProp;
|
|
57
58
|
(0, react_1.useEffect)(function () {
|
|
58
59
|
if (isHighlightedPath) {
|
|
59
60
|
setExpanded(true);
|
|
@@ -73,7 +74,12 @@ var EditModeComplexAttribute = function (_a) {
|
|
|
73
74
|
isReltioCrosswalk: (0, mdm_sdk_1.isReltioCrosswalk)(crosswalks, attributeValue)
|
|
74
75
|
});
|
|
75
76
|
}, [attributeType, attributeValue, mode, metadata, crosswalks, configCanDelete]);
|
|
76
|
-
var showDeleteButton = !deleted &&
|
|
77
|
+
var showDeleteButton = !deleted &&
|
|
78
|
+
!hideDeleteButton &&
|
|
79
|
+
!!onDeleteAttribute &&
|
|
80
|
+
canDelete &&
|
|
81
|
+
!attributeValue.masked &&
|
|
82
|
+
mode !== mdm_sdk_1.Mode.Viewing;
|
|
77
83
|
var onDeleteThis = function () { return onDeleteAttribute({ uri: uri, attributeType: attributeType, attributeValue: attributeValue }); };
|
|
78
84
|
var hasDescendantsWithErrors = (0, react_1.useMemo)(function () { return (0, mdm_sdk_1.hasAttributeDescendantsWithErrors)(attributeValue, errors); }, [errors, attributeValue]);
|
|
79
85
|
(0, react_1.useEffect)(function () {
|
|
@@ -17,6 +17,7 @@ type Props = {
|
|
|
17
17
|
className?: string;
|
|
18
18
|
height?: number;
|
|
19
19
|
isDisabled?: boolean;
|
|
20
|
+
isMasked?: boolean;
|
|
20
21
|
};
|
|
21
|
-
export declare const EntitySelector: ({ entity, entityTypesUris, mode, max, onChange, onCreate, metadata, globalSearchRequestOptions, attributeTypesSelectionStrategy, disableLinkClick, ...otherProps }: Props) => JSX.Element;
|
|
22
|
+
export declare const EntitySelector: ({ entity, entityTypesUris, mode, max, onChange, onCreate, metadata, globalSearchRequestOptions, attributeTypesSelectionStrategy, disableLinkClick, isMasked, ...otherProps }: Props) => JSX.Element;
|
|
22
23
|
export {};
|
|
@@ -64,11 +64,11 @@ var helpers_1 = require("./helpers");
|
|
|
64
64
|
var styles_1 = require("./styles");
|
|
65
65
|
var DEFAULT_MAX_TYPEAHEAD_SEARCH_OPTION = 20;
|
|
66
66
|
var EntitySelector = function (_a) {
|
|
67
|
-
var _b = _a.entity, entity = _b === void 0 ? {} : _b, _c = _a.entityTypesUris, entityTypesUris = _c === void 0 ? [] : _c, mode = _a.mode, _d = _a.max, max = _d === void 0 ? DEFAULT_MAX_TYPEAHEAD_SEARCH_OPTION : _d, onChange = _a.onChange, onCreate = _a.onCreate, metadata = _a.metadata, globalSearchRequestOptions = _a.globalSearchRequestOptions, attributeTypesSelectionStrategy = _a.attributeTypesSelectionStrategy, _e = _a.disableLinkClick, disableLinkClick = _e === void 0 ? false : _e, otherProps = __rest(_a, ["entity", "entityTypesUris", "mode", "max", "onChange", "onCreate", "metadata", "globalSearchRequestOptions", "attributeTypesSelectionStrategy", "disableLinkClick"]);
|
|
67
|
+
var _b = _a.entity, entity = _b === void 0 ? {} : _b, _c = _a.entityTypesUris, entityTypesUris = _c === void 0 ? [] : _c, mode = _a.mode, _d = _a.max, max = _d === void 0 ? DEFAULT_MAX_TYPEAHEAD_SEARCH_OPTION : _d, onChange = _a.onChange, onCreate = _a.onCreate, metadata = _a.metadata, globalSearchRequestOptions = _a.globalSearchRequestOptions, attributeTypesSelectionStrategy = _a.attributeTypesSelectionStrategy, _e = _a.disableLinkClick, disableLinkClick = _e === void 0 ? false : _e, _f = _a.isMasked, isMasked = _f === void 0 ? false : _f, otherProps = __rest(_a, ["entity", "entityTypesUris", "mode", "max", "onChange", "onCreate", "metadata", "globalSearchRequestOptions", "attributeTypesSelectionStrategy", "disableLinkClick", "isMasked"]);
|
|
68
68
|
var styles = (0, styles_1.useStyles)();
|
|
69
|
-
var
|
|
69
|
+
var _g = (0, react_1.useState)(''), inputValue = _g[0], setInputValue = _g[1];
|
|
70
70
|
var entityTypes = (0, react_1.useMemo)(function () { return entityTypesUris.map(function (type) { return (0, mdm_sdk_1.getEntityType)(metadata, type); }).filter(mdm_sdk_1.isAvailableEntityType); }, [entityTypesUris, metadata]);
|
|
71
|
-
var options = __assign(__assign({}, globalSearchRequestOptions), { max: max });
|
|
71
|
+
var options = __assign(__assign({}, globalSearchRequestOptions), { max: max, sendMasked: isMasked });
|
|
72
72
|
var handleCreate = onCreate
|
|
73
73
|
? function (value, entityTypeUri) {
|
|
74
74
|
onCreate(entityTypeUri || entityTypesUris[0], value);
|
|
@@ -161,7 +161,7 @@ describe('EntitySelector', function () {
|
|
|
161
161
|
.prop('getOptions')()
|
|
162
162
|
.then(function () {
|
|
163
163
|
var entityTypes = [metadata.entityTypes[0]];
|
|
164
|
-
var options = __assign(__assign({}, globalSearchRequestOptions), { max: 5 });
|
|
164
|
+
var options = __assign(__assign({}, globalSearchRequestOptions), { max: 5, sendMasked: false });
|
|
165
165
|
expect(typeAheadSearchSpy).toHaveBeenCalledWith(entityTypes, undefined, options);
|
|
166
166
|
done();
|
|
167
167
|
});
|
|
@@ -179,7 +179,8 @@ describe('EntitySelector', function () {
|
|
|
179
179
|
.then(function () {
|
|
180
180
|
var entityTypes = [metadata.entityTypes[0]];
|
|
181
181
|
var options = {
|
|
182
|
-
max: 20
|
|
182
|
+
max: 20,
|
|
183
|
+
sendMasked: false
|
|
183
184
|
};
|
|
184
185
|
expect(typeAheadSearchSpy).toHaveBeenCalledWith(entityTypes, undefined, options);
|
|
185
186
|
done();
|
|
@@ -150,7 +150,7 @@ var ReferenceAttributeEditor = function (props) {
|
|
|
150
150
|
react_1.default.createElement(ErrorWrapper_1.ErrorWrapper, { errorMessage: errorMessage },
|
|
151
151
|
react_1.default.createElement(EntitySelector_1.EntitySelector, { className: (0, classnames_1.default)(styles.item, (_a = {},
|
|
152
152
|
_a[styles.dense] = errorMessage || (selectedEntity && (0, mdm_sdk_1.isTempUri)(selectedEntity.entityUri)),
|
|
153
|
-
_a)), entity: selectedEntity || {}, entityTypesUris: entityTypesUris, globalSearchRequestOptions: globalSearchRequestOptions, mode: mode, isDisabled: !canChangeReferencedEntity, onChange: onChangeEntity, onCreate: canCreateReferencedEntity ? onCreateEntity : undefined, metadata: metadata, attributeTypesSelectionStrategy: newEntityAttrTypesSelectionStrategy })))));
|
|
153
|
+
_a)), entity: selectedEntity || {}, entityTypesUris: entityTypesUris, globalSearchRequestOptions: globalSearchRequestOptions, mode: mode, isDisabled: !canChangeReferencedEntity || !!attributeValue.masked, onChange: onChangeEntity, onCreate: canCreateReferencedEntity ? onCreateEntity : undefined, metadata: metadata, attributeTypesSelectionStrategy: newEntityAttrTypesSelectionStrategy, isMasked: (0, mdm_sdk_1.isAttributeHasMaskedValue)(attributeValue) })))));
|
|
154
154
|
};
|
|
155
155
|
exports.default = (0, withContext_1.withContext)(ScrollToElementContext_1.ScrollToElementContext, function (contextValue, _a) {
|
|
156
156
|
var attributeValue = _a.attributeValue, attributeType = _a.attributeType;
|
|
@@ -184,7 +184,8 @@ describe('RelationEditor behaviour', function () {
|
|
|
184
184
|
expect(mdm_sdk_1.typeAheadSearch).toBeCalledWith([{ label: 'Address', uri: 'configuration/entityTypes/Location' }], '', {
|
|
185
185
|
globalFilter: '',
|
|
186
186
|
max: 20,
|
|
187
|
-
searchOptions: ''
|
|
187
|
+
searchOptions: '',
|
|
188
|
+
sendMasked: false
|
|
188
189
|
});
|
|
189
190
|
react_2.screen.getByText('Create new Address');
|
|
190
191
|
return [2 /*return*/];
|
|
@@ -280,4 +281,62 @@ describe('RelationEditor behaviour', function () {
|
|
|
280
281
|
}
|
|
281
282
|
});
|
|
282
283
|
}); });
|
|
284
|
+
it('should add sendMasked option if connection entity has attribute with masked value', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
285
|
+
var props, user, inputs;
|
|
286
|
+
return __generator(this, function (_a) {
|
|
287
|
+
switch (_a.label) {
|
|
288
|
+
case 0:
|
|
289
|
+
props = __assign(__assign({}, defaultProps), { connection: {
|
|
290
|
+
relation: defaultRelation,
|
|
291
|
+
entity: {
|
|
292
|
+
uri: 'entities/uri$$123',
|
|
293
|
+
type: 'configuration/entityTypes/HCP',
|
|
294
|
+
object: {
|
|
295
|
+
uri: 'entities/04B1CqH',
|
|
296
|
+
type: 'configuration/entityTypes/Location',
|
|
297
|
+
attributes: {
|
|
298
|
+
Address: [
|
|
299
|
+
{
|
|
300
|
+
label: 'AcOEvPaVqTfzZCE Josogaf VA',
|
|
301
|
+
relationshipLabel: '',
|
|
302
|
+
value: {
|
|
303
|
+
AddressLine1: [
|
|
304
|
+
{
|
|
305
|
+
type: 'configuration/entityTypes/Location/attributes/AddressLine1',
|
|
306
|
+
ov: true,
|
|
307
|
+
value: 'AcOEvPaVqTfzZCE',
|
|
308
|
+
uri: 'entities/04B1CqH/attributes/Address/03R51aT/AddressLine1/1XFBcmPYm'
|
|
309
|
+
}
|
|
310
|
+
],
|
|
311
|
+
AddressLine2: [
|
|
312
|
+
{
|
|
313
|
+
type: 'configuration/entityTypes/Location/attributes/AddressLine2',
|
|
314
|
+
ov: true,
|
|
315
|
+
masked: true,
|
|
316
|
+
value: 'KBmiSMlqhElLHMH',
|
|
317
|
+
uri: 'entities/04B1CqH/attributes/Address/03R51aT/AddressLine2/1XFBcmTp2'
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
]
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
} });
|
|
327
|
+
user = setUp({ props: props }).user;
|
|
328
|
+
inputs = react_2.screen.getAllByRole('textbox');
|
|
329
|
+
return [4 /*yield*/, user.click(inputs[0])];
|
|
330
|
+
case 1:
|
|
331
|
+
_a.sent();
|
|
332
|
+
expect(mdm_sdk_1.typeAheadSearch).toBeCalledWith([{ label: 'Address', uri: 'configuration/entityTypes/Location' }], '', {
|
|
333
|
+
globalFilter: '',
|
|
334
|
+
max: 20,
|
|
335
|
+
searchOptions: '',
|
|
336
|
+
sendMasked: true
|
|
337
|
+
});
|
|
338
|
+
return [2 /*return*/];
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
}); });
|
|
283
342
|
});
|
|
@@ -61,9 +61,10 @@ var areRelatedEntitiesChanged = function (initial, actual) {
|
|
|
61
61
|
var emptyHiddenAttributes = {};
|
|
62
62
|
var RelationEditor = function (_a) {
|
|
63
63
|
var _b;
|
|
64
|
+
var _c, _d;
|
|
64
65
|
var connection = _a.connection, config = _a.config, mode = _a.mode, metadata = _a.metadata, highlightedError = _a.highlightedError;
|
|
65
66
|
var styles = (0, styles_1.useStyles)();
|
|
66
|
-
var
|
|
67
|
+
var _e = connection.relation, relationType = _e.relationType, direction = _e.direction;
|
|
67
68
|
var isNew = connection.isNew;
|
|
68
69
|
var entityUri = (0, mdm_sdk_1.getEntityUriFromConnection)(connection);
|
|
69
70
|
var relationUri = (0, mdm_sdk_1.getRelationUriFromConnection)(connection);
|
|
@@ -94,8 +95,8 @@ var RelationEditor = function (_a) {
|
|
|
94
95
|
var allRelationEditorErrors = (0, mdm_sdk_1.getAllRelationEditorActiveErrors)(connection, profileErrors);
|
|
95
96
|
var modifiedEntity = isTempEntity ? mdmModifiedEntity : null;
|
|
96
97
|
var allModifiedEntities = isTempEntity ? mdmAllModifiedEntities : null;
|
|
97
|
-
var
|
|
98
|
-
var
|
|
98
|
+
var _f = (0, useScrollToAttributeError_1.useScrollToAttributeError)({ highlightedError: highlightedError, isSimple: true }), ref = _f.ref, errorClassName = _f.errorClassName;
|
|
99
|
+
var _g = (0, react_1.useMemo)(function () {
|
|
99
100
|
return (0, mdm_sdk_1.getInOutRelations)({
|
|
100
101
|
content: connection.parentEntityUri
|
|
101
102
|
? config.contentSecondLevel
|
|
@@ -105,7 +106,7 @@ var RelationEditor = function (_a) {
|
|
|
105
106
|
mode: mode,
|
|
106
107
|
metadata: metadata
|
|
107
108
|
});
|
|
108
|
-
}, [config, direction, relationType, mode, metadata, connection.parentEntityUri]),
|
|
109
|
+
}, [config, direction, relationType, mode, metadata, connection.parentEntityUri]), _h = _g.inRelations, inRelationTypes = _h === void 0 ? [] : _h, _j = _g.outRelations, outRelationTypes = _j === void 0 ? [] : _j;
|
|
109
110
|
var firstLevelRelationAttrTypes = (0, react_1.useMemo)(function () { return (0, mdm_sdk_1.getRelationAttributesList)(metadata, relationType); }, [relationType, metadata]);
|
|
110
111
|
var attributeListEntity = (0, react_1.useMemo)(function () { return (__assign({ attributes: __assign({}, (0, mdm_sdk_1.getRelationAttributesFromConnection)(connection)) }, (0, mdm_sdk_1.getActivenessAttributes)(connection.relation))); }, [connection]);
|
|
111
112
|
var relatedTempEntities = (0, react_1.useMemo)(function () { return (0, mdm_sdk_1.findRelatedTemporaryEntities)(allModifiedEntities, modifiedEntity); }, [allModifiedEntities, modifiedEntity]);
|
|
@@ -215,6 +216,7 @@ var RelationEditor = function (_a) {
|
|
|
215
216
|
}
|
|
216
217
|
return content.entityTypes;
|
|
217
218
|
}, [config, connection.parentEntityUri]);
|
|
219
|
+
var isEntityHasMaskedAttrValue = (0, ramda_1.pipe)(ramda_1.values, ramda_1.flatten, (0, ramda_1.any)(mdm_sdk_1.isAttributeHasMaskedValue))(((_d = (_c = connection.entity) === null || _c === void 0 ? void 0 : _c.object) === null || _d === void 0 ? void 0 : _d.attributes) || {});
|
|
218
220
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
219
221
|
react_1.default.createElement("div", { className: styles.editor },
|
|
220
222
|
react_1.default.createElement(Typography_1.default, { className: styles.title }, isNew ? ui_i18n_1.default.text('Add new item') : ui_i18n_1.default.text('Edit item')),
|
|
@@ -225,7 +227,7 @@ var RelationEditor = function (_a) {
|
|
|
225
227
|
react_1.default.createElement(EntitySelector_1.EntitySelector, { className: (0, classnames_1.default)(styles.item, (_b = {},
|
|
226
228
|
_b[styles.dense] = errorMessage ||
|
|
227
229
|
(connection.entity && (0, mdm_sdk_1.isTempUri)(connection.entity.entityUri)),
|
|
228
|
-
_b)), entity: connection.entity || {}, entityTypesUris: getEntityTypesUris() || [], globalSearchRequestOptions: globalSearchRequestOptions, mode: mode, onChange: onChangeEntity, onCreate: canCreateNewEntity ? onCreateEntity : undefined, metadata: metadata, attributeTypesSelectionStrategy: mdm_sdk_1.relationEditorAttributeTypesSelectionStrategy }))),
|
|
230
|
+
_b)), entity: connection.entity || {}, entityTypesUris: getEntityTypesUris() || [], globalSearchRequestOptions: globalSearchRequestOptions, mode: mode, onChange: onChangeEntity, onCreate: canCreateNewEntity ? onCreateEntity : undefined, metadata: metadata, attributeTypesSelectionStrategy: mdm_sdk_1.relationEditorAttributeTypesSelectionStrategy, isMasked: isEntityHasMaskedAttrValue }))),
|
|
229
231
|
react_1.default.createElement(HiddenAttributesContext_1.HiddenAttributesContext.Provider, { value: emptyHiddenAttributes },
|
|
230
232
|
react_1.default.createElement(EditModeAttributesList_1.EditModeAttributesList, { className: styles.item, attrTypes: firstLevelRelationAttrTypes, entity: attributeListEntity, showEmptyEditors: true, mode: mode, parentUri: relationUri, onAddAttributes: onAddAttributes, onChangeAttribute: onChangeAttribute, onDeleteAttribute: onDeleteAttribute }))))),
|
|
231
233
|
react_1.default.createElement("div", { className: styles.actionButtons },
|
|
@@ -7,6 +7,7 @@ type Props = InputProps & {
|
|
|
7
7
|
rootRef?: React.MutableRefObject<HTMLInputElement>;
|
|
8
8
|
height: number;
|
|
9
9
|
placeholder?: string;
|
|
10
|
+
endAdornmentContent?: React.ReactNode;
|
|
10
11
|
};
|
|
11
|
-
declare const _default: React.MemoExoticComponent<({ value, autofocus, onSearch, rootRef, classes, height, placeholder, ...otherProps }: Props) => JSX.Element>;
|
|
12
|
+
declare const _default: React.MemoExoticComponent<({ value, autofocus, onSearch, rootRef, classes, height, placeholder, endAdornmentContent, ...otherProps }: Props) => JSX.Element>;
|
|
12
13
|
export default _default;
|
|
@@ -60,13 +60,15 @@ var events_1 = require("../helpers/events");
|
|
|
60
60
|
var SmallIconButton_1 = require("../SmallIconButton");
|
|
61
61
|
var styles_1 = require("./styles");
|
|
62
62
|
var SearchInput = function (_a) {
|
|
63
|
-
var value = _a.value, autofocus = _a.autofocus, _b = _a.onSearch, onSearch = _b === void 0 ? ramda_1.identity : _b, rootRef = _a.rootRef, _c = _a.classes, classes = _c === void 0 ? {} : _c, height = _a.height, _d = _a.placeholder, placeholder = _d === void 0 ? ui_i18n_1.default.text('Search') : _d, otherProps = __rest(_a, ["value", "autofocus", "onSearch", "rootRef", "classes", "height", "placeholder"]);
|
|
63
|
+
var value = _a.value, autofocus = _a.autofocus, _b = _a.onSearch, onSearch = _b === void 0 ? ramda_1.identity : _b, rootRef = _a.rootRef, _c = _a.classes, classes = _c === void 0 ? {} : _c, height = _a.height, _d = _a.placeholder, placeholder = _d === void 0 ? ui_i18n_1.default.text('Search') : _d, endAdornmentContent = _a.endAdornmentContent, otherProps = __rest(_a, ["value", "autofocus", "onSearch", "rootRef", "classes", "height", "placeholder", "endAdornmentContent"]);
|
|
64
64
|
var styles = (0, styles_1.useStyles)({ height: height });
|
|
65
65
|
var _e = (0, react_1.useState)(''), localValue = _e[0], setLocalValue = _e[1];
|
|
66
66
|
var updateValue = (0, ramda_1.pipe)((0, ramda_1.tap)(onSearch), setLocalValue);
|
|
67
67
|
var clearValue = function () { return updateValue(''); };
|
|
68
68
|
var inputValue = (0, ramda_1.isNil)(value) ? localValue : value;
|
|
69
69
|
return (react_1.default.createElement(Input_1.default, __assign({ startAdornment: react_1.default.createElement(InputAdornment_1.default, { position: "start" },
|
|
70
|
-
react_1.default.createElement(Search_1.default, { className: styles.icon })), endAdornment: react_1.default.createElement(InputAdornment_1.default, { position: "end" },
|
|
70
|
+
react_1.default.createElement(Search_1.default, { className: styles.icon })), endAdornment: react_1.default.createElement(InputAdornment_1.default, { position: "end" },
|
|
71
|
+
inputValue.length > 0 && (react_1.default.createElement(SmallIconButton_1.SmallIconButton, { icon: Close_1.default, className: styles.clearButton, onClick: clearValue })),
|
|
72
|
+
endAdornmentContent), autoFocus: autofocus, classes: __assign(__assign({}, classes), { input: (0, classnames_1.default)(styles.input, classes.input), root: (0, classnames_1.default)(styles.container, classes.root) }), placeholder: placeholder, value: inputValue, onChange: (0, ramda_1.pipe)(events_1.getValue, updateValue), disableUnderline: true, ref: rootRef }, otherProps)));
|
|
71
73
|
};
|
|
72
74
|
exports.default = (0, react_1.memo)(SearchInput);
|
|
@@ -10,55 +10,135 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
};
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
13
49
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
50
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
51
|
};
|
|
16
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
53
|
var react_1 = __importDefault(require("react"));
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
var SmallIconButton_1 = require("../SmallIconButton");
|
|
54
|
+
var react_2 = require("@testing-library/react");
|
|
55
|
+
var user_event_1 = __importDefault(require("@testing-library/user-event"));
|
|
21
56
|
var SearchInput_1 = __importDefault(require("./SearchInput"));
|
|
57
|
+
var test_utils_1 = require("../test-utils");
|
|
22
58
|
describe('SearchInput tests', function () {
|
|
59
|
+
var onSearch = jest.fn();
|
|
23
60
|
var defaultProps = {
|
|
24
61
|
value: '',
|
|
25
62
|
autofocus: true,
|
|
26
|
-
onSearch:
|
|
63
|
+
onSearch: onSearch,
|
|
27
64
|
height: 40
|
|
28
65
|
};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
var onSearch = jest.fn();
|
|
37
|
-
var component = (0, enzyme_1.shallow)(react_1.default.createElement(SearchInput_1.default, __assign({}, defaultProps, { onSearch: onSearch })));
|
|
38
|
-
var input = component.find(Input_1.default);
|
|
39
|
-
input.simulate('change', { target: { value: 'test' } });
|
|
40
|
-
expect(onSearch).toBeCalledWith('test');
|
|
41
|
-
});
|
|
42
|
-
it('should call onSearch prop on clear input', function () {
|
|
43
|
-
var onSearch = jest.fn();
|
|
44
|
-
var component = (0, enzyme_1.mount)(react_1.default.createElement(SearchInput_1.default, __assign({}, defaultProps, { onSearch: onSearch, value: 'test' })));
|
|
45
|
-
component.find(SmallIconButton_1.SmallIconButton).find('button').simulate('click');
|
|
46
|
-
expect(onSearch).toBeCalledWith('');
|
|
66
|
+
var setUp = function (props) {
|
|
67
|
+
if (props === void 0) { props = defaultProps; }
|
|
68
|
+
var user = user_event_1.default.setup();
|
|
69
|
+
return __assign({ user: user }, (0, react_2.render)(react_1.default.createElement(SearchInput_1.default, __assign({}, props))));
|
|
70
|
+
};
|
|
71
|
+
afterEach(function () {
|
|
72
|
+
jest.clearAllMocks();
|
|
47
73
|
});
|
|
48
|
-
it('should
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
74
|
+
it('should render all components', function () {
|
|
75
|
+
setUp();
|
|
76
|
+
expect(react_2.screen.getByRole('textbox')).toBeInTheDocument();
|
|
77
|
+
expect(react_2.screen.getByPlaceholderText('Search')).toBeInTheDocument();
|
|
78
|
+
expect((0, test_utils_1.getMuiIconByName)('Search')).toBeInTheDocument();
|
|
52
79
|
});
|
|
53
|
-
it('should
|
|
54
|
-
var
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
80
|
+
it('should call onSearch prop on change', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
81
|
+
var user, searchValue;
|
|
82
|
+
return __generator(this, function (_a) {
|
|
83
|
+
switch (_a.label) {
|
|
84
|
+
case 0:
|
|
85
|
+
user = setUp(__assign(__assign({}, defaultProps), { value: null })).user;
|
|
86
|
+
searchValue = 'searchValue';
|
|
87
|
+
return [4 /*yield*/, user.type(react_2.screen.getByRole('textbox'), searchValue)];
|
|
88
|
+
case 1:
|
|
89
|
+
_a.sent();
|
|
90
|
+
expect(onSearch).toHaveBeenLastCalledWith(searchValue);
|
|
91
|
+
return [2 /*return*/];
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}); });
|
|
95
|
+
it('should call onSearch prop on clear input', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
96
|
+
var user;
|
|
97
|
+
return __generator(this, function (_a) {
|
|
98
|
+
switch (_a.label) {
|
|
99
|
+
case 0:
|
|
100
|
+
user = setUp(__assign(__assign({}, defaultProps), { value: 'test' })).user;
|
|
101
|
+
return [4 /*yield*/, user.click(react_2.screen.getByRole('button'))];
|
|
102
|
+
case 1:
|
|
103
|
+
_a.sent();
|
|
104
|
+
expect(onSearch).toBeCalledWith('');
|
|
105
|
+
return [2 /*return*/];
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}); });
|
|
109
|
+
it('should not fail when onSearch prop is undefined', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
110
|
+
var user;
|
|
111
|
+
return __generator(this, function (_a) {
|
|
112
|
+
switch (_a.label) {
|
|
113
|
+
case 0:
|
|
114
|
+
user = setUp().user;
|
|
115
|
+
return [4 /*yield*/, user.type(react_2.screen.getByRole('textbox'), 'q')];
|
|
116
|
+
case 1:
|
|
117
|
+
_a.sent();
|
|
118
|
+
return [2 /*return*/];
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}); });
|
|
122
|
+
it('should forward props to Input', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
123
|
+
var onKeyDown, onFocus, user;
|
|
124
|
+
return __generator(this, function (_a) {
|
|
125
|
+
switch (_a.label) {
|
|
126
|
+
case 0:
|
|
127
|
+
onKeyDown = jest.fn();
|
|
128
|
+
onFocus = jest.fn();
|
|
129
|
+
user = setUp(__assign(__assign({}, defaultProps), { fullWidth: true, onKeyDown: onKeyDown, onFocus: onFocus })).user;
|
|
130
|
+
return [4 /*yield*/, user.type(react_2.screen.getByRole('textbox'), 'q')];
|
|
131
|
+
case 1:
|
|
132
|
+
_a.sent();
|
|
133
|
+
expect(onKeyDown).toHaveBeenCalled();
|
|
134
|
+
expect(onFocus).toHaveBeenCalled();
|
|
135
|
+
return [2 /*return*/];
|
|
136
|
+
}
|
|
62
137
|
});
|
|
138
|
+
}); });
|
|
139
|
+
it('should use provided endAdornmentContent', function () {
|
|
140
|
+
var endAdornmentContent = react_1.default.createElement("div", null, "testContent");
|
|
141
|
+
setUp(__assign(__assign({}, defaultProps), { endAdornmentContent: endAdornmentContent }));
|
|
142
|
+
expect(react_2.screen.getByText('testContent')).toBeInTheDocument();
|
|
63
143
|
});
|
|
64
144
|
});
|
|
@@ -79,6 +79,7 @@ var react_2 = require("@testing-library/react");
|
|
|
79
79
|
var user_event_1 = __importDefault(require("@testing-library/user-event"));
|
|
80
80
|
var mdmSdk = __importStar(require("@reltio/mdm-sdk"));
|
|
81
81
|
var MaskedAttributesContext_1 = require("../contexts/MaskedAttributesContext");
|
|
82
|
+
var MdmModuleContext_1 = require("../contexts/MdmModuleContext");
|
|
82
83
|
var SimpleAttribute_1 = require("./SimpleAttribute");
|
|
83
84
|
jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { getUnmaskedAttributeValue: jest.fn() })); });
|
|
84
85
|
describe('masking/unmasking behaviour', function () {
|
|
@@ -94,10 +95,15 @@ describe('masking/unmasking behaviour', function () {
|
|
|
94
95
|
var setUp = function (isMaskingNeeded) {
|
|
95
96
|
if (isMaskingNeeded === void 0) { isMaskingNeeded = true; }
|
|
96
97
|
var attributeType = isMaskingNeeded ? defaultAttributeType : (0, ramda_1.dissoc)('masking', defaultAttributeType);
|
|
97
|
-
var
|
|
98
|
-
|
|
98
|
+
var Providers = function (_a) {
|
|
99
|
+
var children = _a.children;
|
|
100
|
+
return (react_1.default.createElement(MdmModuleContext_1.MdmModuleProvider, { values: { mode: mdmSdk.Mode.Viewing } },
|
|
101
|
+
react_1.default.createElement(MaskedAttributesContext_1.MaskedAttributesProvider, null, children)));
|
|
102
|
+
};
|
|
99
103
|
var user = user_event_1.default.setup();
|
|
100
|
-
return {
|
|
104
|
+
return __assign({ user: user }, (0, react_2.render)(react_1.default.createElement(SimpleAttribute_1.SimpleAttribute, { attributeType: attributeType, attributeValue: defaultAttributeValue }), {
|
|
105
|
+
wrapper: Providers
|
|
106
|
+
}));
|
|
101
107
|
};
|
|
102
108
|
it('should not render MaskingSwitcher if attribute should not be masked', function () {
|
|
103
109
|
var container = setUp(false).container;
|
|
@@ -89,7 +89,7 @@ var SimpleAttributeEditor = function (_a) {
|
|
|
89
89
|
mode: mode,
|
|
90
90
|
isReltioCrosswalk: isReltioCrosswalk
|
|
91
91
|
}), canCreate = _e.canCreate, canEdit = _e.canEdit, canDelete = _e.canDelete;
|
|
92
|
-
var showToEdit = canEdit && isEditableMode;
|
|
92
|
+
var showToEdit = canEdit && isEditableMode && !attributeValue.masked;
|
|
93
93
|
var errorMessage = (0, mdm_sdk_1.getErrorMessage)(ownError);
|
|
94
94
|
var dependentLookupEditorContext = (0, MdmModuleContext_1.useMdmDependentLookupEditorContext)(attributeValue, attributeType);
|
|
95
95
|
var _f = (0, useScrollToAttributeError_1.useScrollToAttributeError)({ highlightedError: highlightedError, isSimple: true }), ref = _f.ref, errorClassName = _f.errorClassName;
|
|
@@ -118,8 +118,8 @@ var SimpleAttributeEditor = function (_a) {
|
|
|
118
118
|
deactivateError();
|
|
119
119
|
}
|
|
120
120
|
};
|
|
121
|
-
var showAddButton = !!onAddOneMore && canCreate && !attributeType.singleValue;
|
|
122
|
-
var showDeleteButton = !deleted && !!onDeleteAttribute && canDelete;
|
|
121
|
+
var showAddButton = !!onAddOneMore && canCreate && !attributeType.singleValue && !attributeValue.masked && mode !== mdm_sdk_1.Mode.Viewing;
|
|
122
|
+
var showDeleteButton = !deleted && !!onDeleteAttribute && canDelete && !attributeValue.masked && mode !== mdm_sdk_1.Mode.Viewing;
|
|
123
123
|
var hasError = !!errorMessage;
|
|
124
124
|
var deletedProps = deleted ? { disabled: true, isCrossedOut: true } : {};
|
|
125
125
|
var isProfilePerspectiveView = (0, react_1.useContext)(ProfilePerspectiveViewContext_1.ProfilePerspectiveViewContext);
|
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useMaskedAttribute = void 0;
|
|
4
4
|
var react_1 = require("react");
|
|
5
|
+
var MdmModuleContext_1 = require("../../contexts/MdmModuleContext");
|
|
5
6
|
var MaskedAttributesContext_1 = require("../../contexts/MaskedAttributesContext");
|
|
6
7
|
var useMaskedAttribute = function (_a) {
|
|
7
8
|
var attributeType = _a.attributeType, attributeValue = _a.attributeValue;
|
|
9
|
+
var isViewMode = (0, MdmModuleContext_1.useMdmIsViewMode)();
|
|
8
10
|
var unmaskAttributeValue = (0, MaskedAttributesContext_1.useUnmaskAttributeValue)();
|
|
9
11
|
var maskAttributeValue = (0, MaskedAttributesContext_1.useMaskAttributeValue)();
|
|
10
12
|
var _b = (0, MaskedAttributesContext_1.useUnmaskedAttributeValue)(attributeValue.uri) || {}, unmaskedAttributeValue = _b.attributeValue, _c = _b.isUnmasked, isUnmasked = _c === void 0 ? false : _c, _d = _b.loading, loading = _d === void 0 ? false : _d;
|
|
11
|
-
var isUnmaskingNeeded = unmaskAttributeValue && maskAttributeValue && !!attributeType.masking;
|
|
13
|
+
var isUnmaskingNeeded = unmaskAttributeValue && maskAttributeValue && !!attributeType.masking && isViewMode;
|
|
12
14
|
var unmask = (0, react_1.useCallback)(function () {
|
|
13
15
|
return isUnmaskingNeeded ? unmaskAttributeValue(attributeValue.uri) : Promise.resolve();
|
|
14
16
|
}, [unmaskAttributeValue, attributeValue.uri, isUnmaskingNeeded]);
|