@reltio/components 1.4.1940 → 1.4.1942

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 (25) hide show
  1. package/cjs/EditModeAttributesList/EditModeAttributesList.js +1 -1
  2. package/cjs/EditModeAttributesPager/components/AttributeRenderer/IntegrationAttributeRenderer.test.js +27 -0
  3. package/cjs/EditModeComplexAttribute/EditModeComplexAttribute.js +8 -2
  4. package/cjs/EntitySelector/EntitySelector.d.ts +2 -1
  5. package/cjs/EntitySelector/EntitySelector.js +3 -3
  6. package/cjs/EntitySelector/EntitySelector.test.js +3 -2
  7. package/cjs/ReferenceAttributeEditor/ReferenceAttributeEditor.js +1 -1
  8. package/cjs/RelationEditor/IntegrationRelationEditor.test.js +60 -1
  9. package/cjs/RelationEditor/RelationEditor.js +7 -5
  10. package/cjs/SimpleAttribute/IntegrationSimpleAttribute.test.js +9 -3
  11. package/cjs/SimpleAttributeEditor/SimpleAttributeEditor.js +3 -3
  12. package/cjs/hooks/useMaskedAttribute/useMaskedAttribute.js +3 -1
  13. package/esm/EditModeAttributesList/EditModeAttributesList.js +2 -2
  14. package/esm/EditModeAttributesPager/components/AttributeRenderer/IntegrationAttributeRenderer.test.js +27 -0
  15. package/esm/EditModeComplexAttribute/EditModeComplexAttribute.js +9 -3
  16. package/esm/EntitySelector/EntitySelector.d.ts +2 -1
  17. package/esm/EntitySelector/EntitySelector.js +3 -3
  18. package/esm/EntitySelector/EntitySelector.test.js +3 -2
  19. package/esm/ReferenceAttributeEditor/ReferenceAttributeEditor.js +2 -2
  20. package/esm/RelationEditor/IntegrationRelationEditor.test.js +60 -1
  21. package/esm/RelationEditor/RelationEditor.js +9 -7
  22. package/esm/SimpleAttribute/IntegrationSimpleAttribute.test.js +9 -3
  23. package/esm/SimpleAttributeEditor/SimpleAttributeEditor.js +4 -4
  24. package/esm/hooks/useMaskedAttribute/useMaskedAttribute.js +3 -1
  25. package/package.json +2 -2
@@ -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, mode = _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;
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 && !hideDeleteButton && !!onDeleteAttribute && canDelete;
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 _f = (0, react_1.useState)(''), inputValue = _f[0], setInputValue = _f[1];
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 _c = connection.relation, relationType = _c.relationType, direction = _c.direction;
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 _d = (0, useScrollToAttributeError_1.useScrollToAttributeError)({ highlightedError: highlightedError, isSimple: true }), ref = _d.ref, errorClassName = _d.errorClassName;
98
- var _e = (0, react_1.useMemo)(function () {
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]), _f = _e.inRelations, inRelationTypes = _f === void 0 ? [] : _f, _g = _e.outRelations, outRelationTypes = _g === void 0 ? [] : _g;
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 },
@@ -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 container = (0, react_2.render)(react_1.default.createElement(MaskedAttributesContext_1.MaskedAttributesProvider, null,
98
- react_1.default.createElement(SimpleAttribute_1.SimpleAttribute, { attributeType: attributeType, attributeValue: defaultAttributeValue }))).container;
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 { container: container, user: user };
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]);
@@ -11,7 +11,7 @@ var __assign = (this && this.__assign) || function () {
11
11
  };
12
12
  import React, { useCallback, useContext, useMemo, useState, useEffect } from 'react';
13
13
  import i18n from 'ui-i18n';
14
- import { getCreatableAttributeTypes, getAttributesListForEditMode, getParentUri, checkCanCreateAttribute, getBaseUri } from '@reltio/mdm-sdk';
14
+ import { getCreatableAttributeTypes, getAttributesListForEditMode, getParentUri, checkCanCreateAttribute, getBaseUri, Mode } from '@reltio/mdm-sdk';
15
15
  import { last, path } from 'ramda';
16
16
  import { EditModeAttributesPager } from '../EditModeAttributesPager';
17
17
  import { BranchDecorator } from '../BranchDecorator';
@@ -67,7 +67,7 @@ var EditModeAttributesList = function (_a) {
67
67
  }); }, [hasDeletionsMap, setHasDeletions]);
68
68
  return (React.createElement("div", { className: className },
69
69
  children && React.createElement(BranchDecorator, __assign({}, decoratorProps), children),
70
- React.createElement(BranchDecorator, __assign({}, decoratorProps, { plain: true }), moreAttrTypes.length > 0 && (React.createElement(MoreAttributesButton, { label: i18n.text('More attributes'), onApply: onAddMoreAttributes, dense: drawLines, data: moreAttrTypes, parent: canCreateParentAttrType && parentAttributeType }))),
70
+ React.createElement(BranchDecorator, __assign({}, decoratorProps, { plain: true }), moreAttrTypes.length > 0 && mode !== Mode.Viewing && (React.createElement(MoreAttributesButton, { label: i18n.text('More attributes'), onApply: onAddMoreAttributes, dense: drawLines, data: moreAttrTypes, parent: canCreateParentAttrType && parentAttributeType }))),
71
71
  React.createElement(HasDeletionsContext.Provider, { value: hasDeletionsContextValue }, regularPagersData.concat(alwaysVisiblePagersData).map(function (_a) {
72
72
  var attrType = _a.attrType, values = _a.values;
73
73
  return (React.createElement(EditModeAttributesPager, { key: "".concat(attrType.uri, "_").concat(parentUri), attributeType: attrType, drawLines: drawLines, values: values, paging: path(['paging', attrType.uri], attributes), parentUri: parentUri, showEmptyEditors: showEmptyEditors, mode: mode, crosswalks: crosswalks, onAddAttributes: onAddAttributes, onChangeAttribute: onChangeAttribute, onDeleteAttribute: onDeleteAttribute, additionalControlsRenderer: additionalControlsRenderer, showNonOv: showNonOv }));
@@ -185,4 +185,31 @@ describe('Attribute renderer tests', function () {
185
185
  }
186
186
  });
187
187
  }); });
188
+ it('should render correct if one of the values is masked', function () {
189
+ var values = [
190
+ {
191
+ ov: true,
192
+ type: 'configuration/entityTypes/HCP/attributes/PrescriberIndicator',
193
+ uri: 'entities/0XAnnkw/attributes/PrescriberIndicator/ESG66YW',
194
+ value: false
195
+ },
196
+ {
197
+ ov: true,
198
+ type: 'configuration/entityTypes/HCP/attributes/PrescriberIndicator',
199
+ uri: 'entities/0XAnnkw/attributes/PrescriberIndicator/ESG66YW',
200
+ value: true,
201
+ masked: true
202
+ }
203
+ ];
204
+ var props = __assign(__assign({}, defaultProps), { values: values });
205
+ setUp({ props: props });
206
+ var attributeValues = screen.getAllByTestId('reltio-attribute-value');
207
+ expect(attributeValues).toHaveLength(2);
208
+ expect(within(attributeValues[0]).getAllByRole('checkbox')).toHaveLength(2);
209
+ expect(within(attributeValues[0]).getByText('Yes')).toBeInTheDocument();
210
+ expect(within(attributeValues[0]).getByText('No')).toBeInTheDocument();
211
+ expect(within(attributeValues[1]).queryAllByRole('checkbox')).toHaveLength(0);
212
+ expect(within(attributeValues[1]).getByText('Yes')).toBeInTheDocument();
213
+ expect(within(attributeValues[1]).queryByText('No')).not.toBeInTheDocument();
214
+ });
188
215
  });
@@ -2,7 +2,7 @@ import React, { useMemo, useState, useEffect } from 'react';
2
2
  import { pipe, propOr, pathEq, any } from 'ramda';
3
3
  import classnames from 'classnames';
4
4
  import i18n from 'ui-i18n';
5
- import { checkCanDeleteAttribute, isReltioCrosswalk, isTempUri, getErrorMessage, hasAttributeDescendantsWithErrors, isAnalyticAttribute } from '@reltio/mdm-sdk';
5
+ import { checkCanDeleteAttribute, isReltioCrosswalk, isTempUri, getErrorMessage, hasAttributeDescendantsWithErrors, isAnalyticAttribute, Mode } from '@reltio/mdm-sdk';
6
6
  import Button from '@mui/material/Button';
7
7
  import DeleteIcon from '@mui/icons-material/Delete';
8
8
  import Typography from '@mui/material/Typography';
@@ -17,7 +17,7 @@ import { useScrollToAttributeError } from '../hooks/useScrollToAttributeError';
17
17
  import { useStyles } from './styles';
18
18
  var EditModeComplexAttribute = function (_a) {
19
19
  var _b;
20
- var label = _a.label, attributeTypesList = _a.attributeTypesList, attributeType = _a.attributeType, attributeValue = _a.attributeValue, children = _a.children, errors = _a.errors, ownError = _a.ownError, mode = _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;
20
+ 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;
21
21
  var styles = useStyles();
22
22
  var deleted = state === 'deleted';
23
23
  var edited = state === 'edited';
@@ -26,6 +26,7 @@ var EditModeComplexAttribute = function (_a) {
26
26
  var defaultExpand = isNew || expandedProp;
27
27
  var _d = useState(defaultExpand), expanded = _d[0], setExpanded = _d[1];
28
28
  var _e = useScrollToAttributeError({ highlightedError: highlightedError }), ref = _e.ref, errorClassName = _e.errorClassName;
29
+ var mode = attributeValue.masked ? Mode.Viewing : modeProp;
29
30
  useEffect(function () {
30
31
  if (isHighlightedPath) {
31
32
  setExpanded(true);
@@ -45,7 +46,12 @@ var EditModeComplexAttribute = function (_a) {
45
46
  isReltioCrosswalk: isReltioCrosswalk(crosswalks, attributeValue)
46
47
  });
47
48
  }, [attributeType, attributeValue, mode, metadata, crosswalks, configCanDelete]);
48
- var showDeleteButton = !deleted && !hideDeleteButton && !!onDeleteAttribute && canDelete;
49
+ var showDeleteButton = !deleted &&
50
+ !hideDeleteButton &&
51
+ !!onDeleteAttribute &&
52
+ canDelete &&
53
+ !attributeValue.masked &&
54
+ mode !== Mode.Viewing;
49
55
  var onDeleteThis = function () { return onDeleteAttribute({ uri: uri, attributeType: attributeType, attributeValue: attributeValue }); };
50
56
  var hasDescendantsWithErrors = useMemo(function () { return hasAttributeDescendantsWithErrors(attributeValue, errors); }, [errors, attributeValue]);
51
57
  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 {};
@@ -35,11 +35,11 @@ import { buildEntityOptions } from './helpers';
35
35
  import { useStyles } from './styles';
36
36
  var DEFAULT_MAX_TYPEAHEAD_SEARCH_OPTION = 20;
37
37
  export var EntitySelector = function (_a) {
38
- 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"]);
38
+ 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"]);
39
39
  var styles = useStyles();
40
- var _f = useState(''), inputValue = _f[0], setInputValue = _f[1];
40
+ var _g = useState(''), inputValue = _g[0], setInputValue = _g[1];
41
41
  var entityTypes = useMemo(function () { return entityTypesUris.map(function (type) { return getEntityType(metadata, type); }).filter(isAvailableEntityType); }, [entityTypesUris, metadata]);
42
- var options = __assign(__assign({}, globalSearchRequestOptions), { max: max });
42
+ var options = __assign(__assign({}, globalSearchRequestOptions), { max: max, sendMasked: isMasked });
43
43
  var handleCreate = onCreate
44
44
  ? function (value, entityTypeUri) {
45
45
  onCreate(entityTypeUri || entityTypesUris[0], value);
@@ -133,7 +133,7 @@ describe('EntitySelector', function () {
133
133
  .prop('getOptions')()
134
134
  .then(function () {
135
135
  var entityTypes = [metadata.entityTypes[0]];
136
- var options = __assign(__assign({}, globalSearchRequestOptions), { max: 5 });
136
+ var options = __assign(__assign({}, globalSearchRequestOptions), { max: 5, sendMasked: false });
137
137
  expect(typeAheadSearchSpy).toHaveBeenCalledWith(entityTypes, undefined, options);
138
138
  done();
139
139
  });
@@ -151,7 +151,8 @@ describe('EntitySelector', function () {
151
151
  .then(function () {
152
152
  var entityTypes = [metadata.entityTypes[0]];
153
153
  var options = {
154
- max: 20
154
+ max: 20,
155
+ sendMasked: false
155
156
  };
156
157
  expect(typeAheadSearchSpy).toHaveBeenCalledWith(entityTypes, undefined, options);
157
158
  done();
@@ -23,7 +23,7 @@ var __rest = (this && this.__rest) || function (s, e) {
23
23
  import React, { useMemo, useCallback, useRef } from 'react';
24
24
  import classnames from 'classnames';
25
25
  import { identity, pipe, isEmpty } from 'ramda';
26
- import { evaluateDeepEntityLabel, referencedEntityAttributeTypesSelectionStrategy, getEntityType, getReferencedEntityFromAttrValue, getReferencedRelationFromAttrValue, getReferencedEntityUri, getReferencedEntityTypeUri, getReferencedEntityTypeUriFromAttrType, getReferencedRelationAttrTypesUris, findAttributeTypeByUri, getCreatableAttributeTypes, createTemporaryEntity, convertReferencedEntityForAttrValue, createReferencedRelationForAttrValue, addReferencedRelationCrosswalks, getReferencedEntityUriFromAttrValue, checkCanEditAttribute, checkMetadataForCreate, isReltioCrosswalk, getErrorMessage, getErrorId, getReferencedEntityActiveError, isTempUri, getLabel, isAttributeTypeError } from '@reltio/mdm-sdk';
26
+ import { evaluateDeepEntityLabel, referencedEntityAttributeTypesSelectionStrategy, getEntityType, getReferencedEntityFromAttrValue, getReferencedRelationFromAttrValue, getReferencedEntityUri, getReferencedEntityTypeUri, getReferencedEntityTypeUriFromAttrType, getReferencedRelationAttrTypesUris, findAttributeTypeByUri, getCreatableAttributeTypes, createTemporaryEntity, convertReferencedEntityForAttrValue, createReferencedRelationForAttrValue, addReferencedRelationCrosswalks, getReferencedEntityUriFromAttrValue, checkCanEditAttribute, checkMetadataForCreate, isReltioCrosswalk, getErrorMessage, getErrorId, getReferencedEntityActiveError, isTempUri, getLabel, isAttributeTypeError, isAttributeHasMaskedValue } from '@reltio/mdm-sdk';
27
27
  import { EditModeComplexAttribute } from '../EditModeComplexAttribute';
28
28
  import { EntitySelector } from '../EntitySelector';
29
29
  import { ErrorWrapper } from '../ErrorWrapper';
@@ -122,7 +122,7 @@ var ReferenceAttributeEditor = function (props) {
122
122
  React.createElement(ErrorWrapper, { errorMessage: errorMessage },
123
123
  React.createElement(EntitySelector, { className: classnames(styles.item, (_a = {},
124
124
  _a[styles.dense] = errorMessage || (selectedEntity && isTempUri(selectedEntity.entityUri)),
125
- _a)), entity: selectedEntity || {}, entityTypesUris: entityTypesUris, globalSearchRequestOptions: globalSearchRequestOptions, mode: mode, isDisabled: !canChangeReferencedEntity, onChange: onChangeEntity, onCreate: canCreateReferencedEntity ? onCreateEntity : undefined, metadata: metadata, attributeTypesSelectionStrategy: newEntityAttrTypesSelectionStrategy })))));
125
+ _a)), entity: selectedEntity || {}, entityTypesUris: entityTypesUris, globalSearchRequestOptions: globalSearchRequestOptions, mode: mode, isDisabled: !canChangeReferencedEntity || !!attributeValue.masked, onChange: onChangeEntity, onCreate: canCreateReferencedEntity ? onCreateEntity : undefined, metadata: metadata, attributeTypesSelectionStrategy: newEntityAttrTypesSelectionStrategy, isMasked: isAttributeHasMaskedValue(attributeValue) })))));
126
126
  };
127
127
  export default withContext(ScrollToElementContext, function (contextValue, _a) {
128
128
  var attributeValue = _a.attributeValue, attributeType = _a.attributeType;
@@ -179,7 +179,8 @@ describe('RelationEditor behaviour', function () {
179
179
  expect(typeAheadSearch).toBeCalledWith([{ label: 'Address', uri: 'configuration/entityTypes/Location' }], '', {
180
180
  globalFilter: '',
181
181
  max: 20,
182
- searchOptions: ''
182
+ searchOptions: '',
183
+ sendMasked: false
183
184
  });
184
185
  screen.getByText('Create new Address');
185
186
  return [2 /*return*/];
@@ -275,4 +276,62 @@ describe('RelationEditor behaviour', function () {
275
276
  }
276
277
  });
277
278
  }); });
279
+ it('should add sendMasked option if connection entity has attribute with masked value', function () { return __awaiter(void 0, void 0, void 0, function () {
280
+ var props, user, inputs;
281
+ return __generator(this, function (_a) {
282
+ switch (_a.label) {
283
+ case 0:
284
+ props = __assign(__assign({}, defaultProps), { connection: {
285
+ relation: defaultRelation,
286
+ entity: {
287
+ uri: 'entities/uri$$123',
288
+ type: 'configuration/entityTypes/HCP',
289
+ object: {
290
+ uri: 'entities/04B1CqH',
291
+ type: 'configuration/entityTypes/Location',
292
+ attributes: {
293
+ Address: [
294
+ {
295
+ label: 'AcOEvPaVqTfzZCE Josogaf VA',
296
+ relationshipLabel: '',
297
+ value: {
298
+ AddressLine1: [
299
+ {
300
+ type: 'configuration/entityTypes/Location/attributes/AddressLine1',
301
+ ov: true,
302
+ value: 'AcOEvPaVqTfzZCE',
303
+ uri: 'entities/04B1CqH/attributes/Address/03R51aT/AddressLine1/1XFBcmPYm'
304
+ }
305
+ ],
306
+ AddressLine2: [
307
+ {
308
+ type: 'configuration/entityTypes/Location/attributes/AddressLine2',
309
+ ov: true,
310
+ masked: true,
311
+ value: 'KBmiSMlqhElLHMH',
312
+ uri: 'entities/04B1CqH/attributes/Address/03R51aT/AddressLine2/1XFBcmTp2'
313
+ }
314
+ ]
315
+ }
316
+ }
317
+ ]
318
+ }
319
+ }
320
+ }
321
+ } });
322
+ user = setUp({ props: props }).user;
323
+ inputs = screen.getAllByRole('textbox');
324
+ return [4 /*yield*/, user.click(inputs[0])];
325
+ case 1:
326
+ _a.sent();
327
+ expect(typeAheadSearch).toBeCalledWith([{ label: 'Address', uri: 'configuration/entityTypes/Location' }], '', {
328
+ globalFilter: '',
329
+ max: 20,
330
+ searchOptions: '',
331
+ sendMasked: true
332
+ });
333
+ return [2 /*return*/];
334
+ }
335
+ });
336
+ }); });
278
337
  });
@@ -12,10 +12,10 @@ var __assign = (this && this.__assign) || function () {
12
12
  import React, { useCallback, useEffect, useMemo, useRef } from 'react';
13
13
  import i18n from 'ui-i18n';
14
14
  import classnames from 'classnames';
15
- import { always, assoc, concat, differenceWith, equals, forEach, map, path, pick, pipe, prop, propEq, when, uniq, curry } from 'ramda';
15
+ import { always, assoc, concat, differenceWith, equals, forEach, map, path, pick, pipe, prop, propEq, when, uniq, curry, values, flatten, any } from 'ramda';
16
16
  import Button from '@mui/material/Button';
17
17
  import Typography from '@mui/material/Typography';
18
- import { createTemporaryEntity, findRelatedTemporaryEntities, getActivenessAttributes, getCreatableAttributeTypes, getEntityType, getErrorMessage, getErrorId, omitMarks, relationEditorAttributeTypesSelectionStrategy, validateConnection, updateConnectionEntityLabel, isTempUri, isEmptyValue, getRelationAttributesList, getDefaultRelationTypeObject, getInOutRelations, isSuggestMode, isAttributeTypeError, getRelationUriFromConnection, getRelationEditorActiveError, getRelationAttributesFromConnection, getEntityUriFromConnection, evaluateErrorPath, AttributeValuePathItemType, getAllRelationEditorActiveErrors } from '@reltio/mdm-sdk';
18
+ import { createTemporaryEntity, findRelatedTemporaryEntities, getActivenessAttributes, getCreatableAttributeTypes, getEntityType, getErrorMessage, getErrorId, omitMarks, relationEditorAttributeTypesSelectionStrategy, validateConnection, updateConnectionEntityLabel, isTempUri, isEmptyValue, getRelationAttributesList, getDefaultRelationTypeObject, getInOutRelations, isSuggestMode, isAttributeTypeError, getRelationUriFromConnection, getRelationEditorActiveError, getRelationAttributesFromConnection, getEntityUriFromConnection, evaluateErrorPath, AttributeValuePathItemType, getAllRelationEditorActiveErrors, isAttributeHasMaskedValue } from '@reltio/mdm-sdk';
19
19
  import { ConnectionRelationTypeSelector } from '../ConnectionRelationTypeSelector';
20
20
  import { ErrorWrapper } from '../ErrorWrapper';
21
21
  import { EntitySelector } from '../EntitySelector';
@@ -33,9 +33,10 @@ var areRelatedEntitiesChanged = function (initial, actual) {
33
33
  var emptyHiddenAttributes = {};
34
34
  var RelationEditor = function (_a) {
35
35
  var _b;
36
+ var _c, _d;
36
37
  var connection = _a.connection, config = _a.config, mode = _a.mode, metadata = _a.metadata, highlightedError = _a.highlightedError;
37
38
  var styles = useStyles();
38
- var _c = connection.relation, relationType = _c.relationType, direction = _c.direction;
39
+ var _e = connection.relation, relationType = _e.relationType, direction = _e.direction;
39
40
  var isNew = connection.isNew;
40
41
  var entityUri = getEntityUriFromConnection(connection);
41
42
  var relationUri = getRelationUriFromConnection(connection);
@@ -66,8 +67,8 @@ var RelationEditor = function (_a) {
66
67
  var allRelationEditorErrors = getAllRelationEditorActiveErrors(connection, profileErrors);
67
68
  var modifiedEntity = isTempEntity ? mdmModifiedEntity : null;
68
69
  var allModifiedEntities = isTempEntity ? mdmAllModifiedEntities : null;
69
- var _d = useScrollToAttributeError({ highlightedError: highlightedError, isSimple: true }), ref = _d.ref, errorClassName = _d.errorClassName;
70
- var _e = useMemo(function () {
70
+ var _f = useScrollToAttributeError({ highlightedError: highlightedError, isSimple: true }), ref = _f.ref, errorClassName = _f.errorClassName;
71
+ var _g = useMemo(function () {
71
72
  return getInOutRelations({
72
73
  content: connection.parentEntityUri
73
74
  ? config.contentSecondLevel
@@ -77,7 +78,7 @@ var RelationEditor = function (_a) {
77
78
  mode: mode,
78
79
  metadata: metadata
79
80
  });
80
- }, [config, direction, relationType, mode, metadata, connection.parentEntityUri]), _f = _e.inRelations, inRelationTypes = _f === void 0 ? [] : _f, _g = _e.outRelations, outRelationTypes = _g === void 0 ? [] : _g;
81
+ }, [config, direction, relationType, mode, metadata, connection.parentEntityUri]), _h = _g.inRelations, inRelationTypes = _h === void 0 ? [] : _h, _j = _g.outRelations, outRelationTypes = _j === void 0 ? [] : _j;
81
82
  var firstLevelRelationAttrTypes = useMemo(function () { return getRelationAttributesList(metadata, relationType); }, [relationType, metadata]);
82
83
  var attributeListEntity = useMemo(function () { return (__assign({ attributes: __assign({}, getRelationAttributesFromConnection(connection)) }, getActivenessAttributes(connection.relation))); }, [connection]);
83
84
  var relatedTempEntities = useMemo(function () { return findRelatedTemporaryEntities(allModifiedEntities, modifiedEntity); }, [allModifiedEntities, modifiedEntity]);
@@ -187,6 +188,7 @@ var RelationEditor = function (_a) {
187
188
  }
188
189
  return content.entityTypes;
189
190
  }, [config, connection.parentEntityUri]);
191
+ var isEntityHasMaskedAttrValue = pipe(values, flatten, any(isAttributeHasMaskedValue))(((_d = (_c = connection.entity) === null || _c === void 0 ? void 0 : _c.object) === null || _d === void 0 ? void 0 : _d.attributes) || {});
190
192
  return (React.createElement(React.Fragment, null,
191
193
  React.createElement("div", { className: styles.editor },
192
194
  React.createElement(Typography, { className: styles.title }, isNew ? i18n.text('Add new item') : i18n.text('Edit item')),
@@ -197,7 +199,7 @@ var RelationEditor = function (_a) {
197
199
  React.createElement(EntitySelector, { className: classnames(styles.item, (_b = {},
198
200
  _b[styles.dense] = errorMessage ||
199
201
  (connection.entity && isTempUri(connection.entity.entityUri)),
200
- _b)), entity: connection.entity || {}, entityTypesUris: getEntityTypesUris() || [], globalSearchRequestOptions: globalSearchRequestOptions, mode: mode, onChange: onChangeEntity, onCreate: canCreateNewEntity ? onCreateEntity : undefined, metadata: metadata, attributeTypesSelectionStrategy: relationEditorAttributeTypesSelectionStrategy }))),
202
+ _b)), entity: connection.entity || {}, entityTypesUris: getEntityTypesUris() || [], globalSearchRequestOptions: globalSearchRequestOptions, mode: mode, onChange: onChangeEntity, onCreate: canCreateNewEntity ? onCreateEntity : undefined, metadata: metadata, attributeTypesSelectionStrategy: relationEditorAttributeTypesSelectionStrategy, isMasked: isEntityHasMaskedAttrValue }))),
201
203
  React.createElement(HiddenAttributesContext.Provider, { value: emptyHiddenAttributes },
202
204
  React.createElement(EditModeAttributesList, { className: styles.item, attrTypes: firstLevelRelationAttrTypes, entity: attributeListEntity, showEmptyEditors: true, mode: mode, parentUri: relationUri, onAddAttributes: onAddAttributes, onChangeAttribute: onChangeAttribute, onDeleteAttribute: onDeleteAttribute }))))),
203
205
  React.createElement("div", { className: styles.actionButtons },
@@ -51,6 +51,7 @@ import { render, screen } from '@testing-library/react';
51
51
  import userEvent from '@testing-library/user-event';
52
52
  import * as mdmSdk from '@reltio/mdm-sdk';
53
53
  import { MaskedAttributesProvider } from '../contexts/MaskedAttributesContext';
54
+ import { MdmModuleProvider } from '../contexts/MdmModuleContext';
54
55
  import { SimpleAttribute } from './SimpleAttribute';
55
56
  jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { getUnmaskedAttributeValue: jest.fn() })); });
56
57
  describe('masking/unmasking behaviour', function () {
@@ -66,10 +67,15 @@ describe('masking/unmasking behaviour', function () {
66
67
  var setUp = function (isMaskingNeeded) {
67
68
  if (isMaskingNeeded === void 0) { isMaskingNeeded = true; }
68
69
  var attributeType = isMaskingNeeded ? defaultAttributeType : dissoc('masking', defaultAttributeType);
69
- var container = render(React.createElement(MaskedAttributesProvider, null,
70
- React.createElement(SimpleAttribute, { attributeType: attributeType, attributeValue: defaultAttributeValue }))).container;
70
+ var Providers = function (_a) {
71
+ var children = _a.children;
72
+ return (React.createElement(MdmModuleProvider, { values: { mode: mdmSdk.Mode.Viewing } },
73
+ React.createElement(MaskedAttributesProvider, null, children)));
74
+ };
71
75
  var user = userEvent.setup();
72
- return { container: container, user: user };
76
+ return __assign({ user: user }, render(React.createElement(SimpleAttribute, { attributeType: attributeType, attributeValue: defaultAttributeValue }), {
77
+ wrapper: Providers
78
+ }));
73
79
  };
74
80
  it('should not render MaskingSwitcher if attribute should not be masked', function () {
75
81
  var container = setUp(false).container;
@@ -27,7 +27,7 @@ import AddIcon from '@mui/icons-material/Add';
27
27
  import DeleteIcon from '@mui/icons-material/Delete';
28
28
  import Typography from '@mui/material/Typography';
29
29
  import i18n from 'ui-i18n';
30
- import { attributeUriToSearchUri, ErrorType, getAttributeValue, getAttrDataTypeDefinition, getErrorId, getErrorMessage, getErrorType, isDependentLookupAttrType, isEditableMode as checkIsEditableMode } from '@reltio/mdm-sdk';
30
+ import { attributeUriToSearchUri, ErrorType, getAttributeValue, getAttrDataTypeDefinition, getErrorId, getErrorMessage, getErrorType, isDependentLookupAttrType, isEditableMode as checkIsEditableMode, Mode } from '@reltio/mdm-sdk';
31
31
  import { DataTypeValue } from '../DataTypeValue';
32
32
  import { DataTypeValueEditor } from '../DataTypeValueEditor';
33
33
  import { ErrorWrapper } from '../ErrorWrapper';
@@ -61,7 +61,7 @@ var SimpleAttributeEditor = function (_a) {
61
61
  mode: mode,
62
62
  isReltioCrosswalk: isReltioCrosswalk
63
63
  }), canCreate = _e.canCreate, canEdit = _e.canEdit, canDelete = _e.canDelete;
64
- var showToEdit = canEdit && isEditableMode;
64
+ var showToEdit = canEdit && isEditableMode && !attributeValue.masked;
65
65
  var errorMessage = getErrorMessage(ownError);
66
66
  var dependentLookupEditorContext = useMdmDependentLookupEditorContext(attributeValue, attributeType);
67
67
  var _f = useScrollToAttributeError({ highlightedError: highlightedError, isSimple: true }), ref = _f.ref, errorClassName = _f.errorClassName;
@@ -90,8 +90,8 @@ var SimpleAttributeEditor = function (_a) {
90
90
  deactivateError();
91
91
  }
92
92
  };
93
- var showAddButton = !!onAddOneMore && canCreate && !attributeType.singleValue;
94
- var showDeleteButton = !deleted && !!onDeleteAttribute && canDelete;
93
+ var showAddButton = !!onAddOneMore && canCreate && !attributeType.singleValue && !attributeValue.masked && mode !== Mode.Viewing;
94
+ var showDeleteButton = !deleted && !!onDeleteAttribute && canDelete && !attributeValue.masked && mode !== Mode.Viewing;
95
95
  var hasError = !!errorMessage;
96
96
  var deletedProps = deleted ? { disabled: true, isCrossedOut: true } : {};
97
97
  var isProfilePerspectiveView = useContext(ProfilePerspectiveViewContext);
@@ -1,11 +1,13 @@
1
1
  import { useCallback } from 'react';
2
+ import { useMdmIsViewMode } from '../../contexts/MdmModuleContext';
2
3
  import { useMaskAttributeValue, useUnmaskAttributeValue, useUnmaskedAttributeValue } from '../../contexts/MaskedAttributesContext';
3
4
  export var useMaskedAttribute = function (_a) {
4
5
  var attributeType = _a.attributeType, attributeValue = _a.attributeValue;
6
+ var isViewMode = useMdmIsViewMode();
5
7
  var unmaskAttributeValue = useUnmaskAttributeValue();
6
8
  var maskAttributeValue = useMaskAttributeValue();
7
9
  var _b = useUnmaskedAttributeValue(attributeValue.uri) || {}, unmaskedAttributeValue = _b.attributeValue, _c = _b.isUnmasked, isUnmasked = _c === void 0 ? false : _c, _d = _b.loading, loading = _d === void 0 ? false : _d;
8
- var isUnmaskingNeeded = unmaskAttributeValue && maskAttributeValue && !!attributeType.masking;
10
+ var isUnmaskingNeeded = unmaskAttributeValue && maskAttributeValue && !!attributeType.masking && isViewMode;
9
11
  var unmask = useCallback(function () {
10
12
  return isUnmaskingNeeded ? unmaskAttributeValue(attributeValue.uri) : Promise.resolve();
11
13
  }, [unmaskAttributeValue, attributeValue.uri, isUnmaskingNeeded]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reltio/components",
3
- "version": "1.4.1940",
3
+ "version": "1.4.1942",
4
4
  "license": "SEE LICENSE IN LICENSE FILE",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -8,7 +8,7 @@
8
8
  "@fluentui/react-context-selector": "^9.1.26",
9
9
  "@react-google-maps/api": "2.7.0",
10
10
  "@react-sigma/core": "3.4.0",
11
- "@reltio/mdm-sdk": "^1.4.1854",
11
+ "@reltio/mdm-sdk": "^1.4.1856",
12
12
  "d3-cloud": "^1.2.5",
13
13
  "d3-geo": "^2.0.1",
14
14
  "d3-hierarchy": "^2.0.0",