@reltio/components 1.4.1858 → 1.4.1860

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 (47) hide show
  1. package/cjs/CollaborationItem/components/TextFieldWithMentions/TextFieldWithMentions.js +1 -1
  2. package/cjs/CollaborationItem/components/TextFieldWithMentions/styles.js +1 -2
  3. package/cjs/MaskingSwitcher/MaskingSwitcher.d.ts +7 -0
  4. package/cjs/MaskingSwitcher/MaskingSwitcher.js +20 -0
  5. package/cjs/MaskingSwitcher/index.d.ts +1 -0
  6. package/cjs/MaskingSwitcher/index.js +5 -0
  7. package/cjs/MaskingSwitcher/styles.d.ts +1 -0
  8. package/cjs/MaskingSwitcher/styles.js +16 -0
  9. package/cjs/SaveSegmentDialog/SaveSegmentDialog.js +1 -1
  10. package/cjs/SimpleAttribute/IntegrationSimpleAttribute.test.d.ts +1 -0
  11. package/cjs/SimpleAttribute/IntegrationSimpleAttribute.test.js +189 -0
  12. package/cjs/SimpleAttribute/SimpleAttribute.d.ts +1 -1
  13. package/cjs/SimpleAttribute/SimpleAttribute.js +16 -5
  14. package/cjs/contexts/MaskedAttributesContext/hooks.d.ts +3 -0
  15. package/cjs/contexts/MaskedAttributesContext/hooks.js +18 -0
  16. package/cjs/contexts/MaskedAttributesContext/index.d.ts +13 -0
  17. package/cjs/contexts/MaskedAttributesContext/index.js +106 -0
  18. package/cjs/contexts/index.d.ts +1 -0
  19. package/cjs/contexts/index.js +3 -1
  20. package/cjs/hooks/useMaskedAttribute.d.ts +13 -0
  21. package/cjs/hooks/useMaskedAttribute.js +29 -0
  22. package/cjs/index.d.ts +1 -0
  23. package/cjs/index.js +3 -1
  24. package/esm/CollaborationItem/components/TextFieldWithMentions/TextFieldWithMentions.js +1 -1
  25. package/esm/CollaborationItem/components/TextFieldWithMentions/styles.js +1 -2
  26. package/esm/MaskingSwitcher/MaskingSwitcher.d.ts +7 -0
  27. package/esm/MaskingSwitcher/MaskingSwitcher.js +13 -0
  28. package/esm/MaskingSwitcher/index.d.ts +1 -0
  29. package/esm/MaskingSwitcher/index.js +1 -0
  30. package/esm/MaskingSwitcher/styles.d.ts +1 -0
  31. package/esm/MaskingSwitcher/styles.js +13 -0
  32. package/esm/SaveSegmentDialog/SaveSegmentDialog.js +1 -1
  33. package/esm/SimpleAttribute/IntegrationSimpleAttribute.test.d.ts +1 -0
  34. package/esm/SimpleAttribute/IntegrationSimpleAttribute.test.js +161 -0
  35. package/esm/SimpleAttribute/SimpleAttribute.d.ts +1 -1
  36. package/esm/SimpleAttribute/SimpleAttribute.js +17 -6
  37. package/esm/contexts/MaskedAttributesContext/hooks.d.ts +3 -0
  38. package/esm/contexts/MaskedAttributesContext/hooks.js +13 -0
  39. package/esm/contexts/MaskedAttributesContext/index.d.ts +13 -0
  40. package/esm/contexts/MaskedAttributesContext/index.js +79 -0
  41. package/esm/contexts/index.d.ts +1 -0
  42. package/esm/contexts/index.js +1 -0
  43. package/esm/hooks/useMaskedAttribute.d.ts +13 -0
  44. package/esm/hooks/useMaskedAttribute.js +27 -0
  45. package/esm/index.d.ts +1 -0
  46. package/esm/index.js +1 -0
  47. package/package.json +2 -2
@@ -68,7 +68,7 @@ var TextFieldWithMentions = function (_a) {
68
68
  })));
69
69
  };
70
70
  return (react_1.default.createElement("div", { className: (0, classnames_1.default)(styles.root, className) },
71
- react_1.default.createElement(react_mentions_1.MentionsInput, __assign({}, props, { value: value, placeholder: placeholder, onChange: handleChange, className: MENTIONS_TEXTAREA_CLASSNAME, suggestionsPortalHost: document.body, classNames: (_b = {},
71
+ react_1.default.createElement(react_mentions_1.MentionsInput, __assign({}, props, { value: value, placeholder: placeholder, onChange: handleChange, className: MENTIONS_TEXTAREA_CLASSNAME, suggestionsPortalHost: document.body, allowSuggestionsAboveCursor: true, classNames: (_b = {},
72
72
  _b["".concat(MENTIONS_TEXTAREA_CLASSNAME, "__input")] = styles.mentionsInput,
73
73
  _b["".concat(MENTIONS_TEXTAREA_CLASSNAME, "__highlighter")] = styles.mentionsHighlighter,
74
74
  _b["".concat(MENTIONS_TEXTAREA_CLASSNAME, "__control")] = styles.mentionsControl,
@@ -34,8 +34,7 @@ exports.useStyles = (0, styles_1.makeStyles)(function (theme) { return ({
34
34
  zIndex: suggestionsZIndex + '!important',
35
35
  borderRadius: '4px',
36
36
  backgroundColor: '#fafafa !important',
37
- boxShadow: '0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12), 0 1px 5px 0 rgba(0,0,0,0.2)',
38
- transform: 'translateY(-100%)'
37
+ boxShadow: '0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12), 0 1px 5px 0 rgba(0,0,0,0.2)'
39
38
  },
40
39
  mentionsSuggestionsList: {
41
40
  maxHeight: '200px',
@@ -0,0 +1,7 @@
1
+ type MaskingSwitcherProps = {
2
+ isMasked: boolean;
3
+ isUnmasking?: boolean;
4
+ onToggleMasking: () => void;
5
+ };
6
+ export declare const MaskingSwitcher: ({ isMasked, isUnmasking, onToggleMasking }: MaskingSwitcherProps) => JSX.Element;
7
+ export {};
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MaskingSwitcher = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var VisibilityOff_1 = __importDefault(require("@mui/icons-material/VisibilityOff"));
9
+ var Visibility_1 = __importDefault(require("@mui/icons-material/Visibility"));
10
+ var Tooltip_1 = __importDefault(require("@mui/material/Tooltip"));
11
+ var IconButton_1 = __importDefault(require("@mui/material/IconButton"));
12
+ var CircularProgress_1 = __importDefault(require("@mui/material/CircularProgress"));
13
+ var ui_i18n_1 = __importDefault(require("ui-i18n"));
14
+ var styles_1 = require("./styles");
15
+ var MaskingSwitcher = function (_a) {
16
+ var isMasked = _a.isMasked, isUnmasking = _a.isUnmasking, onToggleMasking = _a.onToggleMasking;
17
+ var styles = (0, styles_1.useStyles)();
18
+ return (react_1.default.createElement(Tooltip_1.default, { title: isMasked ? ui_i18n_1.default.text('Show') : ui_i18n_1.default.text('Hide'), placement: "right" }, isUnmasking ? (react_1.default.createElement(CircularProgress_1.default, { size: 14, className: styles.switcherWrapper })) : (react_1.default.createElement(IconButton_1.default, { onClick: onToggleMasking, className: styles.switcherWrapper }, isMasked ? (react_1.default.createElement(Visibility_1.default, { className: styles.icon })) : (react_1.default.createElement(VisibilityOff_1.default, { className: styles.icon }))))));
19
+ };
20
+ exports.MaskingSwitcher = MaskingSwitcher;
@@ -0,0 +1 @@
1
+ export { MaskingSwitcher } from './MaskingSwitcher';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaskingSwitcher = void 0;
4
+ var MaskingSwitcher_1 = require("./MaskingSwitcher");
5
+ Object.defineProperty(exports, "MaskingSwitcher", { enumerable: true, get: function () { return MaskingSwitcher_1.MaskingSwitcher; } });
@@ -0,0 +1 @@
1
+ export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"icon" | "switcherWrapper">;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useStyles = void 0;
4
+ var styles_1 = require("@mui/styles");
5
+ exports.useStyles = (0, styles_1.makeStyles)(function (theme) { return ({
6
+ icon: {
7
+ color: theme.palette.text.secondary,
8
+ fontSize: 18
9
+ },
10
+ switcherWrapper: {
11
+ verticalAlign: 'middle',
12
+ marginLeft: 8,
13
+ width: '16px',
14
+ height: '16px'
15
+ }
16
+ }); });
@@ -115,7 +115,7 @@ var SaveSegmentDialog = function (_a) {
115
115
  }
116
116
  }, [isOpen, data]);
117
117
  return (react_1.default.createElement(Dialog_1.default, { onClose: onClose, open: isOpen, PaperProps: { classes: { root: styles.root } } },
118
- react_1.default.createElement(DialogTitle_1.default, null, shouldSaveAsNew ? ui_i18n_1.default.text('Save as new segment') : ui_i18n_1.default.text('Save segment')),
118
+ react_1.default.createElement(DialogTitle_1.default, null, shouldSaveAsNew ? ui_i18n_1.default.text('Save as a new segment') : ui_i18n_1.default.text('Save segment')),
119
119
  react_1.default.createElement(DialogContent_1.default, { className: styles.dialogContent },
120
120
  react_1.default.createElement(TextEditor_1.TextEditor, { label: ui_i18n_1.default.text('Name'), required: true, variant: "filled", onInput: handleChangeName, value: name, size: "small", autoFocus: true }),
121
121
  react_1.default.createElement(TextEditor_1.TextEditor, { label: ui_i18n_1.default.text('Description (optional)'), multiline: true, variant: "filled", value: description, onInput: handleChangeDescription, size: "small", rows: 5 }),
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __generator = (this && this.__generator) || function (thisArg, body) {
46
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
+ function verb(n) { return function (v) { return step([n, v]); }; }
49
+ function step(op) {
50
+ if (f) throw new TypeError("Generator is already executing.");
51
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
52
+ 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;
53
+ if (y = 0, t) op = [op[0] & 2, t.value];
54
+ switch (op[0]) {
55
+ case 0: case 1: t = op; break;
56
+ case 4: _.label++; return { value: op[1], done: false };
57
+ case 5: _.label++; y = op[1]; op = [0]; continue;
58
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
+ default:
60
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
+ if (t[2]) _.ops.pop();
65
+ _.trys.pop(); continue;
66
+ }
67
+ op = body.call(thisArg, _);
68
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
+ }
71
+ };
72
+ var __importDefault = (this && this.__importDefault) || function (mod) {
73
+ return (mod && mod.__esModule) ? mod : { "default": mod };
74
+ };
75
+ Object.defineProperty(exports, "__esModule", { value: true });
76
+ var ramda_1 = require("ramda");
77
+ var react_1 = __importDefault(require("react"));
78
+ var react_2 = require("@testing-library/react");
79
+ var user_event_1 = __importDefault(require("@testing-library/user-event"));
80
+ var mdmSdk = __importStar(require("@reltio/mdm-sdk"));
81
+ var MaskedAttributesContext_1 = require("../contexts/MaskedAttributesContext");
82
+ var SimpleAttribute_1 = require("./SimpleAttribute");
83
+ jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { getUnmaskedAttributeValue: jest.fn() })); });
84
+ describe('masking/unmasking behaviour', function () {
85
+ var getUnmaskedAttributeValueMock = jest.spyOn(mdmSdk, 'getUnmaskedAttributeValue');
86
+ beforeAll(function () {
87
+ getUnmaskedAttributeValueMock.mockResolvedValue({
88
+ value: 'Unmasked value',
89
+ uri: 'entities/16U21B8f/attributes/Name/2sAfjGOIh'
90
+ });
91
+ });
92
+ var defaultAttributeType = { type: 'String', name: 'Name', uri: 'URI', masking: { regexPattern: '.*' } };
93
+ var defaultAttributeValue = { value: 'Masked value', uri: 'entities/16U21B8f/attributes/Name/2sAfjGOIh' };
94
+ var setUp = function (isMaskingNeeded) {
95
+ if (isMaskingNeeded === void 0) { isMaskingNeeded = true; }
96
+ 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;
99
+ var user = user_event_1.default.setup();
100
+ return { container: container, user: user };
101
+ };
102
+ it('should not render MaskingSwitcher if attribute should not be masked', function () {
103
+ var container = setUp(false).container;
104
+ expect(container.querySelector('.switcherWrapper')).not.toBeInTheDocument();
105
+ });
106
+ it('should render MaskingSwitcher if attribute should be masked', function () {
107
+ var container = setUp().container;
108
+ expect(container.querySelector('.switcherWrapper')).toBeInTheDocument();
109
+ });
110
+ it('should call getUnmaskedAttributeValue when MaskingSwitcher is clicked', function () { return __awaiter(void 0, void 0, void 0, function () {
111
+ var _a, container, user, switcher;
112
+ return __generator(this, function (_b) {
113
+ switch (_b.label) {
114
+ case 0:
115
+ _a = setUp(), container = _a.container, user = _a.user;
116
+ switcher = container.querySelector('.switcherWrapper');
117
+ return [4 /*yield*/, user.click(switcher)];
118
+ case 1:
119
+ _b.sent();
120
+ expect(getUnmaskedAttributeValueMock).toHaveBeenCalledWith(defaultAttributeValue.uri);
121
+ return [2 /*return*/];
122
+ }
123
+ });
124
+ }); });
125
+ it('should render unmasked value when MaskingSwitcher is clicked', function () { return __awaiter(void 0, void 0, void 0, function () {
126
+ var _a, container, user, switcher;
127
+ return __generator(this, function (_b) {
128
+ switch (_b.label) {
129
+ case 0:
130
+ _a = setUp(), container = _a.container, user = _a.user;
131
+ switcher = container.querySelector('.switcherWrapper');
132
+ expect(react_2.screen.getByText('Masked value')).toBeInTheDocument();
133
+ return [4 /*yield*/, user.click(switcher)];
134
+ case 1:
135
+ _b.sent();
136
+ expect(react_2.screen.queryByText('Masked value')).not.toBeInTheDocument();
137
+ expect(react_2.screen.getByText('Unmasked value')).toBeInTheDocument();
138
+ return [2 /*return*/];
139
+ }
140
+ });
141
+ }); });
142
+ it('should render masked value when MaskingSwitcher is clicked twice', function () { return __awaiter(void 0, void 0, void 0, function () {
143
+ var _a, container, user;
144
+ return __generator(this, function (_b) {
145
+ switch (_b.label) {
146
+ case 0:
147
+ _a = setUp(), container = _a.container, user = _a.user;
148
+ expect(react_2.screen.getByText('Masked value')).toBeInTheDocument();
149
+ return [4 /*yield*/, user.click(container.querySelector('.switcherWrapper'))];
150
+ case 1:
151
+ _b.sent();
152
+ expect(react_2.screen.queryByText('Masked value')).not.toBeInTheDocument();
153
+ expect(react_2.screen.getByText('Unmasked value')).toBeInTheDocument();
154
+ return [4 /*yield*/, user.click(container.querySelector('.switcherWrapper'))];
155
+ case 2:
156
+ _b.sent();
157
+ expect(react_2.screen.getByText('Masked value')).toBeInTheDocument();
158
+ expect(react_2.screen.queryByText('Unmasked value')).not.toBeInTheDocument();
159
+ return [2 /*return*/];
160
+ }
161
+ });
162
+ }); });
163
+ it('should render CircularProgress while unmasked attribute value is loading', function () { return __awaiter(void 0, void 0, void 0, function () {
164
+ var resolveGetUnmaskedAttributeValue, _a, container, user, switcher;
165
+ return __generator(this, function (_b) {
166
+ switch (_b.label) {
167
+ case 0:
168
+ getUnmaskedAttributeValueMock.mockImplementation(function () { return new Promise(function (resolve) { return (resolveGetUnmaskedAttributeValue = resolve); }); });
169
+ _a = setUp(), container = _a.container, user = _a.user;
170
+ switcher = container.querySelector('.switcherWrapper');
171
+ return [4 /*yield*/, user.click(switcher)];
172
+ case 1:
173
+ _b.sent();
174
+ expect(react_2.screen.getByRole('progressbar')).toBeInTheDocument();
175
+ return [4 /*yield*/, resolveGetUnmaskedAttributeValue({
176
+ value: 'Unmasked value',
177
+ uri: 'entities/16U21B8f/attributes/Name/2sAfjGOIh'
178
+ })];
179
+ case 2:
180
+ _b.sent();
181
+ return [4 /*yield*/, react_2.screen.findByText('Unmasked value')];
182
+ case 3:
183
+ _b.sent();
184
+ expect(react_2.screen.queryByRole('progressbar')).not.toBeInTheDocument();
185
+ return [2 /*return*/];
186
+ }
187
+ });
188
+ }); });
189
+ });
@@ -5,5 +5,5 @@ type Props = {
5
5
  attributeType: AttributeType;
6
6
  inlined?: boolean;
7
7
  };
8
- export declare const SimpleAttribute: ({ className, attributeType, attributeValue, inlined }: Props) => JSX.Element;
8
+ export declare const SimpleAttribute: ({ className, attributeType, attributeValue: rawAttributeValue, inlined }: Props) => JSX.Element;
9
9
  export {};
@@ -29,7 +29,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.SimpleAttribute = void 0;
30
30
  var react_1 = __importStar(require("react"));
31
31
  var mdm_sdk_1 = require("@reltio/mdm-sdk");
32
+ var MaskingSwitcher_1 = require("../MaskingSwitcher");
32
33
  var classnames_1 = __importDefault(require("classnames"));
34
+ var useMaskedAttribute_1 = __importDefault(require("../hooks/useMaskedAttribute"));
33
35
  var classnames_2 = require("../constants/classnames");
34
36
  var HistoryAppearanceContext_1 = require("../contexts/HistoryAppearanceContext");
35
37
  var HighlightedValuesContext_1 = require("../contexts/HighlightedValuesContext");
@@ -39,27 +41,36 @@ var PivotingTooltip_1 = require("../PivotingTooltip");
39
41
  var styles_1 = require("./styles");
40
42
  var SimpleAttribute = function (_a) {
41
43
  var _b, _c, _d, _e, _f;
42
- var className = _a.className, _g = _a.attributeType, attributeType = _g === void 0 ? null : _g, attributeValue = _a.attributeValue, inlined = _a.inlined;
44
+ var className = _a.className, _g = _a.attributeType, attributeType = _g === void 0 ? null : _g, rawAttributeValue = _a.attributeValue, inlined = _a.inlined;
45
+ var _h = (0, useMaskedAttribute_1.default)({
46
+ attributeType: attributeType,
47
+ attributeValue: rawAttributeValue
48
+ }), isUnmaskingNeeded = _h.isUnmaskingNeeded, isMasked = _h.isMasked, toggleMasking = _h.toggleMasking, attributeValue = _h.attributeValue, isUnmasking = _h.isUnmasking;
43
49
  var styles = (0, styles_1.useStyles)();
44
- var _h = (0, react_1.useContext)(HighlightedValuesContext_1.HighlightedValuesContext), _j = _h.highlightedValuesUris, highlightedValuesUris = _j === void 0 ? [] : _j, highlightedClassName = _h.highlightedClassName;
50
+ var _j = (0, react_1.useContext)(HighlightedValuesContext_1.HighlightedValuesContext), _k = _j.highlightedValuesUris, highlightedValuesUris = _k === void 0 ? [] : _k, highlightedClassName = _j.highlightedClassName;
45
51
  var appearance = (0, react_1.useContext)(HistoryAppearanceContext_1.HistoryDiffContext).appearance;
46
52
  var attributeAppearance = (0, mdm_sdk_1.getHistoryAppearanceByUri)(attributeValue.uri, appearance);
47
53
  var historyClassName = (0, mdm_sdk_1.getHistoryAttributeClassName)(attributeAppearance);
48
- var dataTypeValue = (react_1.default.createElement(DataTypeValue_1.DataTypeValue, { value: (0, mdm_sdk_1.getAttributeValue)(attributeValue), dataTypeDefinition: (0, mdm_sdk_1.getAttrDataTypeDefinition)(attributeType) }));
54
+ var dataTypeValue = (0, react_1.useMemo)(function () { return (react_1.default.createElement(DataTypeValue_1.DataTypeValue, { value: (0, mdm_sdk_1.getAttributeValue)(attributeValue), dataTypeDefinition: (0, mdm_sdk_1.getAttrDataTypeDefinition)(attributeType) })); }, [attributeValue, attributeType]);
49
55
  var objectType = (0, mdm_sdk_1.isRelationUri)(attributeValue.uri)
50
56
  ? mdm_sdk_1.CollaborationObjectTypes.RELATION_ATTRIBUTE
51
57
  : mdm_sdk_1.CollaborationObjectTypes.ENTITY_ATTRIBUTE;
58
+ var unmaskingControl = isUnmaskingNeeded && (react_1.default.createElement(MaskingSwitcher_1.MaskingSwitcher, { isMasked: isMasked, onToggleMasking: toggleMasking, isUnmasking: isUnmasking }));
52
59
  return inlined || historyClassName ? (react_1.default.createElement("div", { className: (0, classnames_1.default)(className, (_b = {},
53
60
  _b[highlightedClassName] = highlightedValuesUris.includes(attributeValue.uri),
54
61
  _b)) },
55
62
  react_1.default.createElement(PivotingTooltip_1.PivotingTooltip, { value: attributeValue, attributeType: attributeType, key: attributeValue.uri, className: (0, classnames_1.default)((_c = {}, _c[styles.multilineAttribute] = !inlined, _c)) },
56
63
  react_1.default.createElement("span", { className: (0, classnames_1.default)(styles.attributeValue, styles[historyClassName], (_d = {},
57
64
  _d[styles.ovFalse] = !(0, mdm_sdk_1.isOv)(attributeValue),
58
- _d)), "data-reltio-id": "reltio-attribute-value" }, dataTypeValue)))) : (react_1.default.createElement("div", { className: (0, classnames_1.default)(className, styles.root, classnames_2.COMMENTS_CONTAINER_VISIBILITY_AREA, (_e = {},
65
+ _d)), "data-reltio-id": "reltio-attribute-value" },
66
+ dataTypeValue,
67
+ unmaskingControl)))) : (react_1.default.createElement("div", { className: (0, classnames_1.default)(className, styles.root, classnames_2.COMMENTS_CONTAINER_VISIBILITY_AREA, (_e = {},
59
68
  _e[highlightedClassName] = highlightedValuesUris.includes(attributeValue.uri),
60
69
  _e)) },
61
70
  react_1.default.createElement(PivotingTooltip_1.PivotingTooltip, { value: attributeValue, attributeType: attributeType, key: attributeValue.uri },
62
- react_1.default.createElement("span", { className: (0, classnames_1.default)(styles.attributeValue, (_f = {}, _f[styles.ovFalse] = !(0, mdm_sdk_1.isOv)(attributeValue), _f)), "data-reltio-id": "reltio-attribute-value" }, dataTypeValue)),
71
+ react_1.default.createElement("span", { className: (0, classnames_1.default)(styles.attributeValue, (_f = {}, _f[styles.ovFalse] = !(0, mdm_sdk_1.isOv)(attributeValue), _f)), "data-reltio-id": "reltio-attribute-value" },
72
+ dataTypeValue,
73
+ unmaskingControl)),
63
74
  react_1.default.createElement(CommentsContainer_1.CommentsContainer, { className: styles.commentsContainer, uri: attributeValue.uri, relatedObjectUris: (0, mdm_sdk_1.createRelatedObjectUris)(objectType, {
64
75
  uri: attributeValue.uri
65
76
  }), objectType: objectType })));
@@ -0,0 +1,3 @@
1
+ import { SimpleAttributeValue } from '@reltio/mdm-sdk';
2
+ export declare const useUnmaskedAttributeValue: (attributeValue: SimpleAttributeValue) => SimpleAttributeValue;
3
+ export declare const useAddUnmaskedAttributeValue: () => (attributeValue: SimpleAttributeValue) => Promise<void>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useAddUnmaskedAttributeValue = exports.useUnmaskedAttributeValue = void 0;
4
+ var react_context_selector_1 = require("@fluentui/react-context-selector");
5
+ var _1 = require(".");
6
+ var useMaskedAttributesContext = function (selector) {
7
+ return (0, react_context_selector_1.useContextSelector)(_1.MaskedAttributesContext, selector);
8
+ };
9
+ var useUnmaskedAttributeValue = function (attributeValue) {
10
+ return useMaskedAttributesContext(function (context) {
11
+ return context ? context.unmaskedAttributesValues[attributeValue.uri] : attributeValue;
12
+ });
13
+ };
14
+ exports.useUnmaskedAttributeValue = useUnmaskedAttributeValue;
15
+ var useAddUnmaskedAttributeValue = function () {
16
+ return useMaskedAttributesContext(function (context) { return (context ? context.addUnmaskedAttributeValue : Promise.resolve); });
17
+ };
18
+ exports.useAddUnmaskedAttributeValue = useAddUnmaskedAttributeValue;
@@ -0,0 +1,13 @@
1
+ import { ReactNode } from 'react';
2
+ import { SimpleAttributeValue } from '@reltio/mdm-sdk';
3
+ type UnmaskedAttributesValues = Record<string, SimpleAttributeValue>;
4
+ export type MaskedAttributesContextType = {
5
+ unmaskedAttributesValues: UnmaskedAttributesValues;
6
+ addUnmaskedAttributeValue: (attributeValue: SimpleAttributeValue) => Promise<void>;
7
+ };
8
+ export declare const MaskedAttributesContext: import("@fluentui/react-context-selector").Context<MaskedAttributesContextType>;
9
+ type Props = {
10
+ children: ReactNode;
11
+ };
12
+ export declare const MaskedAttributesProvider: ({ children }: Props) => JSX.Element;
13
+ export {};
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __generator = (this && this.__generator) || function (thisArg, body) {
46
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
+ function verb(n) { return function (v) { return step([n, v]); }; }
49
+ function step(op) {
50
+ if (f) throw new TypeError("Generator is already executing.");
51
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
52
+ 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;
53
+ if (y = 0, t) op = [op[0] & 2, t.value];
54
+ switch (op[0]) {
55
+ case 0: case 1: t = op; break;
56
+ case 4: _.label++; return { value: op[1], done: false };
57
+ case 5: _.label++; y = op[1]; op = [0]; continue;
58
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
+ default:
60
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
+ if (t[2]) _.ops.pop();
65
+ _.trys.pop(); continue;
66
+ }
67
+ op = body.call(thisArg, _);
68
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
+ }
71
+ };
72
+ Object.defineProperty(exports, "__esModule", { value: true });
73
+ exports.MaskedAttributesProvider = exports.MaskedAttributesContext = void 0;
74
+ var react_1 = __importStar(require("react"));
75
+ var react_context_selector_1 = require("@fluentui/react-context-selector");
76
+ var mdm_sdk_1 = require("@reltio/mdm-sdk");
77
+ var errors_1 = require("../../core/errors");
78
+ exports.MaskedAttributesContext = (0, react_context_selector_1.createContext)(null);
79
+ var MaskedAttributesProvider = function (_a) {
80
+ var children = _a.children;
81
+ var _b = (0, react_1.useState)({}), unmaskedAttributesValues = _b[0], setUnmaskedAttributesValues = _b[1];
82
+ var addUnmaskedAttributeValue = (0, react_1.useCallback)(function (attributeValue) { return __awaiter(void 0, void 0, void 0, function () {
83
+ var unmaskedAttributeValue_1, error_1;
84
+ return __generator(this, function (_a) {
85
+ switch (_a.label) {
86
+ case 0:
87
+ _a.trys.push([0, 2, , 3]);
88
+ return [4 /*yield*/, (0, mdm_sdk_1.getUnmaskedAttributeValue)(attributeValue.uri)];
89
+ case 1:
90
+ unmaskedAttributeValue_1 = _a.sent();
91
+ setUnmaskedAttributesValues(function (prev) {
92
+ var _a;
93
+ return (__assign(__assign({}, prev), (_a = {}, _a[attributeValue.uri] = unmaskedAttributeValue_1, _a)));
94
+ });
95
+ return [3 /*break*/, 3];
96
+ case 2:
97
+ error_1 = _a.sent();
98
+ (0, errors_1.showErrorMessage)(error_1);
99
+ return [3 /*break*/, 3];
100
+ case 3: return [2 /*return*/];
101
+ }
102
+ });
103
+ }); }, []);
104
+ return (react_1.default.createElement(exports.MaskedAttributesContext.Provider, { value: { unmaskedAttributesValues: unmaskedAttributesValues, addUnmaskedAttributeValue: addUnmaskedAttributeValue } }, children));
105
+ };
106
+ exports.MaskedAttributesProvider = MaskedAttributesProvider;
@@ -34,3 +34,4 @@ export { ConfigPermissionsContext, ConfigPermissionsContextProvider, useAttribut
34
34
  export * from './MdmModuleContext';
35
35
  export { ReloadDataProvider, useReloadData } from './ReloadDataContext';
36
36
  export { SegmentationContext } from './SegmentationContext';
37
+ export { MaskedAttributesProvider } from './MaskedAttributesContext';
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.useAttributeValueConfigPermissions = exports.ConfigPermissionsContextProvider = exports.ConfigPermissionsContext = exports.useActionsHook = exports.ActionsHookProvider = exports.PageRequestsAbortingContext = exports.DependentLookupAutopopulationContext = exports.FeaturesContext = exports.LabelsContext = exports.UrlGeneratorsContext = exports.isHighlightedAttributeType = exports.isHighlightedErrorType = exports.ScrollType = exports.ScrollToElementProvider = exports.ScrollToElementContext = exports.SearchValueContext = exports.InterceptHandlersContext = exports.HighlightedValuesContext = exports.SnackbarContext = exports.SearchFiltersContext = exports.useReloadFacet = exports.ReloadFacetProvider = exports.useReloadAllFacets = exports.SandboxAPIContext = exports.EntityContext = exports.RelatedObjectUrisContext = exports.WorkflowTasksContext = exports.useEntityLoadingIndication = exports.EntityLoadingIndicationProvider = exports.EntityMarkerContext = exports.useAttributeExpanded = exports.ExpandedAttributesProvider = exports.useHighlightedCrosswalks = exports.useCrosswalkHighlight = exports.useCrosswalkFocus = exports.useCrosswalkColor = exports.CrosswalksDisplayProvider = exports.EntitiesMapContext = exports.IdContext = exports.ProfilePerspectiveViewContext = exports.usePerspectivesSettings = exports.PerspectivesSettingsContext = exports.PivotingAttributeContext = exports.UsersContext = exports.CollaborationContextProvider = exports.CollaborationContext = exports.BlockImageGalleryDialogContext = exports.PopupBoundariesContext = exports.HistoryDiffContext = exports.AsyncMountContext = void 0;
18
- exports.SegmentationContext = exports.useReloadData = exports.ReloadDataProvider = void 0;
18
+ exports.MaskedAttributesProvider = exports.SegmentationContext = exports.useReloadData = exports.ReloadDataProvider = void 0;
19
19
  var AsyncMountContext_1 = require("./AsyncMountContext");
20
20
  Object.defineProperty(exports, "AsyncMountContext", { enumerable: true, get: function () { return AsyncMountContext_1.AsyncMountContext; } });
21
21
  var HistoryAppearanceContext_1 = require("./HistoryAppearanceContext");
@@ -105,3 +105,5 @@ Object.defineProperty(exports, "ReloadDataProvider", { enumerable: true, get: fu
105
105
  Object.defineProperty(exports, "useReloadData", { enumerable: true, get: function () { return ReloadDataContext_1.useReloadData; } });
106
106
  var SegmentationContext_1 = require("./SegmentationContext");
107
107
  Object.defineProperty(exports, "SegmentationContext", { enumerable: true, get: function () { return SegmentationContext_1.SegmentationContext; } });
108
+ var MaskedAttributesContext_1 = require("./MaskedAttributesContext");
109
+ Object.defineProperty(exports, "MaskedAttributesProvider", { enumerable: true, get: function () { return MaskedAttributesContext_1.MaskedAttributesProvider; } });
@@ -0,0 +1,13 @@
1
+ import { AttributeType, SimpleAttributeValue } from '@reltio/mdm-sdk';
2
+ type Props = {
3
+ attributeValue: SimpleAttributeValue;
4
+ attributeType: AttributeType;
5
+ };
6
+ declare const useMaskedAttribute: ({ attributeType, attributeValue }: Props) => {
7
+ isUnmaskingNeeded: boolean;
8
+ isMasked: boolean;
9
+ toggleMasking: () => void;
10
+ isUnmasking: boolean;
11
+ attributeValue: SimpleAttributeValue;
12
+ };
13
+ export default useMaskedAttribute;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var react_1 = require("react");
4
+ var hooks_1 = require("../contexts/MaskedAttributesContext/hooks");
5
+ var useMaskedAttribute = function (_a) {
6
+ var attributeType = _a.attributeType, attributeValue = _a.attributeValue;
7
+ var isUnmaskingNeeded = !!attributeType.masking;
8
+ var _b = (0, react_1.useState)(isUnmaskingNeeded), isMasked = _b[0], setIsMasked = _b[1];
9
+ var _c = (0, react_1.useState)(false), isUnmasking = _c[0], setIsUnmasking = _c[1];
10
+ var addUnmaskedAttributeValue = (0, hooks_1.useAddUnmaskedAttributeValue)();
11
+ var unmaskedAttributeValue = (0, hooks_1.useUnmaskedAttributeValue)(attributeValue);
12
+ (0, react_1.useEffect)(function () {
13
+ if (isUnmaskingNeeded && addUnmaskedAttributeValue && !isMasked && unmaskedAttributeValue === undefined) {
14
+ setIsUnmasking(true);
15
+ addUnmaskedAttributeValue(attributeValue).finally(function () { return setIsUnmasking(false); });
16
+ }
17
+ }, [isUnmaskingNeeded, isMasked, addUnmaskedAttributeValue, attributeValue, unmaskedAttributeValue]);
18
+ var toggleMasking = (0, react_1.useCallback)(function () {
19
+ setIsMasked(function (prev) { return !prev; });
20
+ }, []);
21
+ return {
22
+ isUnmaskingNeeded: isUnmaskingNeeded,
23
+ isMasked: isMasked,
24
+ toggleMasking: toggleMasking,
25
+ isUnmasking: isUnmasking,
26
+ attributeValue: isMasked ? attributeValue : unmaskedAttributeValue || attributeValue
27
+ };
28
+ };
29
+ exports.default = useMaskedAttribute;
package/cjs/index.d.ts CHANGED
@@ -110,6 +110,7 @@ export { FilterValueEditor } from './FilterValueEditor';
110
110
  export { DropDownEditor } from './DropDownEditor';
111
111
  export { EmptySearchResult } from './EmptySearchResult';
112
112
  export { FileTypeEditor } from './FileTypeEditor';
113
+ export { MaskingSwitcher } from './MaskingSwitcher';
113
114
  export { SaveSegmentDialog } from './SaveSegmentDialog';
114
115
  export { withChartDataPercents as withPercents } from './HOCs/withChartDataPercents';
115
116
  export { withFilterAtBottom } from './HOCs/withFilterAtBottom';
package/cjs/index.js CHANGED
@@ -16,7 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.ReadOnlyAttributeValuesBlock = exports.PieChart = exports.OvIcon = exports.NestedAttributeEditor = exports.NestedAttribute = exports.MoreAttributesButton = exports.InlineReferenceAttribute = exports.InlineNestedAttribute = exports.InlineImageAttribute = exports.InlineAttributesPager = exports.EditableImageAttributesLine = exports.FilterButton = exports.FacetViewHeader = exports.ExpandedValueTooltip = exports.EntitySelector = exports.EntityCreator = exports.AttributesPager = exports.AttributesList = exports.EditableAttribute = exports.DropDownMenuButton = exports.DescriptionIcon = exports.DefaultCellValueRenderer = exports.ColumnsSettingsPopup = exports.ColumnsSettings = exports.ColorBar = exports.CollapseRowButton = exports.ChartsFactory = exports.CardinalityMessage = exports.BranchDecorator = exports.BasicViewHeader = exports.BasicViewContent = exports.BasicView = exports.BasicTablePagination = exports.basicTableViewState = exports.BasicTable = exports.BasicAttributeSelector = exports.BarChart = exports.AvatarWithFallback = exports.AutoSizeList = exports.AttributesView = exports.AttributesValuesEditor = exports.AttributesFiltersButton = exports.AttributesFiltersBuilder = exports.AttributesFilterSelector = exports.AttributesErrorsPanel = exports.AttributeListItem = exports.AttributeGroupIcon = exports.ArrowExpandButton = exports.ActionsPanel = exports.ActionButton = void 0;
18
18
  exports.ErrorWrapper = exports.ErrorMessage = exports.ConfigureColumnsPopup = exports.ConnectionEditor = exports.DropDownSelector = exports.ReactSelectOptionWithCheckIcon = exports.ReactSelectMenuWithPopper = exports.ReactSelectMenuList = exports.ReactSelectLoadMoreButton = exports.ReactSelectDropdownIndicatorWithIconButton = exports.ReactSelectDropdownIndicator = exports.Highlighter = exports.HierarchyNodeTitle = exports.HierarchicalAttributeTooltip = exports.HideOnShrink = exports.ExpandableSearchInput = exports.ErrorPopup = exports.ErrorBoundary = exports.EntityUriLink = exports.EntityTypesSelector = exports.EntityTypeIcon = exports.EntityTypeBadge = exports.EntityAvatar = exports.EMPTY_STATE_VARIANTS = exports.EMPTY_STATE_ICONS = exports.EmptyState = exports.Drawer = exports.DataTypeValue = exports.DataTenantBadge = exports.ConnectionRelationTypeSelector = exports.CollaborationItem = exports.ConfirmationDialog = exports.CommentsContainer = exports.ColoredSourceIcon = exports.CollapseButton = exports.TreeChart = exports.TableWithBars = exports.SourceIcon = exports.SmallIconButtonWithTooltip = exports.SmallIconButton = exports.SimpleAttributeEditor = exports.SimpleAttribute = exports.RowCellAutoSizer = exports.RelationTypeSelector = exports.ReferenceAttributeEditor = exports.ReferenceAttribute = exports.ImageAttributesLine = exports.ReadOnlyAttributesPager = exports.ReadOnlyAttributesList = exports.ReadOnlyAttribute = void 0;
19
- exports.CrosswalkType = exports.AttributesTable = exports.CrosswalkDragLayer = exports.SourceCrosswalksRow = exports.CrosswalkEditor = exports.useModifiedEntity = exports.useCrosswalkActions = exports.groupCrosswalksByTypesAndSources = exports.ActivityTypes = exports.useProfileActivitiesLoader = exports.useActivitiesLoader = exports.ActivityLogFilter = exports.ActivityLog = exports.rerenderWrapper = exports.mockElementSizes = exports.mockBasicTableSizing = exports.getMuiIconByName = exports.delayPromise = exports.deepFreeze = exports.awaitMockPromises = exports.TestStylesProvider = exports.TestPerspectivesSettingsProvider = exports.enrichDataWithPercents = exports.defaultRenderRowCell = exports.defaultGetRowCellHeight = exports.columnFilterToMdmFilter = exports.buildColumnsFilter = exports.useDynamicRowCellHeight = exports.useClickableStyle = exports.BasicTableCellRenderer = exports.useBasicTableCellRenderer = exports.BasicTableContext = exports.BasicTableRowCollapseContext = exports.withTableContext = exports.withFilterAtBottom = exports.withPercents = exports.SaveSegmentDialog = exports.FileTypeEditor = exports.EmptySearchResult = exports.DropDownEditor = exports.FilterValueEditor = exports.MultiValueChip = exports.TextEditor = exports.DateRangeEditor = exports.NumberEditor = exports.DataTypeValueEditor = exports.DateEditor = void 0;
19
+ exports.CrosswalkType = exports.AttributesTable = exports.CrosswalkDragLayer = exports.SourceCrosswalksRow = exports.CrosswalkEditor = exports.useModifiedEntity = exports.useCrosswalkActions = exports.groupCrosswalksByTypesAndSources = exports.ActivityTypes = exports.useProfileActivitiesLoader = exports.useActivitiesLoader = exports.ActivityLogFilter = exports.ActivityLog = exports.rerenderWrapper = exports.mockElementSizes = exports.mockBasicTableSizing = exports.getMuiIconByName = exports.delayPromise = exports.deepFreeze = exports.awaitMockPromises = exports.TestStylesProvider = exports.TestPerspectivesSettingsProvider = exports.enrichDataWithPercents = exports.defaultRenderRowCell = exports.defaultGetRowCellHeight = exports.columnFilterToMdmFilter = exports.buildColumnsFilter = exports.useDynamicRowCellHeight = exports.useClickableStyle = exports.BasicTableCellRenderer = exports.useBasicTableCellRenderer = exports.BasicTableContext = exports.BasicTableRowCollapseContext = exports.withTableContext = exports.withFilterAtBottom = exports.withPercents = exports.SaveSegmentDialog = exports.MaskingSwitcher = exports.FileTypeEditor = exports.EmptySearchResult = exports.DropDownEditor = exports.FilterValueEditor = exports.MultiValueChip = exports.TextEditor = exports.DateRangeEditor = exports.NumberEditor = exports.DataTypeValueEditor = exports.DateEditor = void 0;
20
20
  __exportStar(require("./HOCs"), exports);
21
21
  __exportStar(require("./components"), exports);
22
22
  __exportStar(require("./constants"), exports);
@@ -240,6 +240,8 @@ var EmptySearchResult_1 = require("./EmptySearchResult");
240
240
  Object.defineProperty(exports, "EmptySearchResult", { enumerable: true, get: function () { return EmptySearchResult_1.EmptySearchResult; } });
241
241
  var FileTypeEditor_1 = require("./FileTypeEditor");
242
242
  Object.defineProperty(exports, "FileTypeEditor", { enumerable: true, get: function () { return FileTypeEditor_1.FileTypeEditor; } });
243
+ var MaskingSwitcher_1 = require("./MaskingSwitcher");
244
+ Object.defineProperty(exports, "MaskingSwitcher", { enumerable: true, get: function () { return MaskingSwitcher_1.MaskingSwitcher; } });
243
245
  var SaveSegmentDialog_1 = require("./SaveSegmentDialog");
244
246
  Object.defineProperty(exports, "SaveSegmentDialog", { enumerable: true, get: function () { return SaveSegmentDialog_1.SaveSegmentDialog; } });
245
247
  // HOCs
@@ -39,7 +39,7 @@ export var TextFieldWithMentions = function (_a) {
39
39
  })));
40
40
  };
41
41
  return (React.createElement("div", { className: classnames(styles.root, className) },
42
- React.createElement(MentionsInput, __assign({}, props, { value: value, placeholder: placeholder, onChange: handleChange, className: MENTIONS_TEXTAREA_CLASSNAME, suggestionsPortalHost: document.body, classNames: (_b = {},
42
+ React.createElement(MentionsInput, __assign({}, props, { value: value, placeholder: placeholder, onChange: handleChange, className: MENTIONS_TEXTAREA_CLASSNAME, suggestionsPortalHost: document.body, allowSuggestionsAboveCursor: true, classNames: (_b = {},
43
43
  _b["".concat(MENTIONS_TEXTAREA_CLASSNAME, "__input")] = styles.mentionsInput,
44
44
  _b["".concat(MENTIONS_TEXTAREA_CLASSNAME, "__highlighter")] = styles.mentionsHighlighter,
45
45
  _b["".concat(MENTIONS_TEXTAREA_CLASSNAME, "__control")] = styles.mentionsControl,
@@ -31,8 +31,7 @@ export var useStyles = makeStyles(function (theme) { return ({
31
31
  zIndex: suggestionsZIndex + '!important',
32
32
  borderRadius: '4px',
33
33
  backgroundColor: '#fafafa !important',
34
- boxShadow: '0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12), 0 1px 5px 0 rgba(0,0,0,0.2)',
35
- transform: 'translateY(-100%)'
34
+ boxShadow: '0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12), 0 1px 5px 0 rgba(0,0,0,0.2)'
36
35
  },
37
36
  mentionsSuggestionsList: {
38
37
  maxHeight: '200px',
@@ -0,0 +1,7 @@
1
+ type MaskingSwitcherProps = {
2
+ isMasked: boolean;
3
+ isUnmasking?: boolean;
4
+ onToggleMasking: () => void;
5
+ };
6
+ export declare const MaskingSwitcher: ({ isMasked, isUnmasking, onToggleMasking }: MaskingSwitcherProps) => JSX.Element;
7
+ export {};
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import VisibilityOffIcon from '@mui/icons-material/VisibilityOff';
3
+ import VisibilityIcon from '@mui/icons-material/Visibility';
4
+ import Tooltip from '@mui/material/Tooltip';
5
+ import IconButton from '@mui/material/IconButton';
6
+ import CircularProgress from '@mui/material/CircularProgress';
7
+ import i18n from 'ui-i18n';
8
+ import { useStyles } from './styles';
9
+ export var MaskingSwitcher = function (_a) {
10
+ var isMasked = _a.isMasked, isUnmasking = _a.isUnmasking, onToggleMasking = _a.onToggleMasking;
11
+ var styles = useStyles();
12
+ return (React.createElement(Tooltip, { title: isMasked ? i18n.text('Show') : i18n.text('Hide'), placement: "right" }, isUnmasking ? (React.createElement(CircularProgress, { size: 14, className: styles.switcherWrapper })) : (React.createElement(IconButton, { onClick: onToggleMasking, className: styles.switcherWrapper }, isMasked ? (React.createElement(VisibilityIcon, { className: styles.icon })) : (React.createElement(VisibilityOffIcon, { className: styles.icon }))))));
13
+ };
@@ -0,0 +1 @@
1
+ export { MaskingSwitcher } from './MaskingSwitcher';
@@ -0,0 +1 @@
1
+ export { MaskingSwitcher } from './MaskingSwitcher';
@@ -0,0 +1 @@
1
+ export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"icon" | "switcherWrapper">;
@@ -0,0 +1,13 @@
1
+ import { makeStyles } from '@mui/styles';
2
+ export var useStyles = makeStyles(function (theme) { return ({
3
+ icon: {
4
+ color: theme.palette.text.secondary,
5
+ fontSize: 18
6
+ },
7
+ switcherWrapper: {
8
+ verticalAlign: 'middle',
9
+ marginLeft: 8,
10
+ width: '16px',
11
+ height: '16px'
12
+ }
13
+ }); });
@@ -86,7 +86,7 @@ export var SaveSegmentDialog = function (_a) {
86
86
  }
87
87
  }, [isOpen, data]);
88
88
  return (React.createElement(Dialog, { onClose: onClose, open: isOpen, PaperProps: { classes: { root: styles.root } } },
89
- React.createElement(DialogTitle, null, shouldSaveAsNew ? i18n.text('Save as new segment') : i18n.text('Save segment')),
89
+ React.createElement(DialogTitle, null, shouldSaveAsNew ? i18n.text('Save as a new segment') : i18n.text('Save segment')),
90
90
  React.createElement(DialogContent, { className: styles.dialogContent },
91
91
  React.createElement(TextEditor, { label: i18n.text('Name'), required: true, variant: "filled", onInput: handleChangeName, value: name, size: "small", autoFocus: true }),
92
92
  React.createElement(TextEditor, { label: i18n.text('Description (optional)'), multiline: true, variant: "filled", value: description, onInput: handleChangeDescription, size: "small", rows: 5 }),
@@ -0,0 +1,161 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ 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;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import { dissoc } from 'ramda';
49
+ import React from 'react';
50
+ import { render, screen } from '@testing-library/react';
51
+ import userEvent from '@testing-library/user-event';
52
+ import * as mdmSdk from '@reltio/mdm-sdk';
53
+ import { MaskedAttributesProvider } from '../contexts/MaskedAttributesContext';
54
+ import { SimpleAttribute } from './SimpleAttribute';
55
+ jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { getUnmaskedAttributeValue: jest.fn() })); });
56
+ describe('masking/unmasking behaviour', function () {
57
+ var getUnmaskedAttributeValueMock = jest.spyOn(mdmSdk, 'getUnmaskedAttributeValue');
58
+ beforeAll(function () {
59
+ getUnmaskedAttributeValueMock.mockResolvedValue({
60
+ value: 'Unmasked value',
61
+ uri: 'entities/16U21B8f/attributes/Name/2sAfjGOIh'
62
+ });
63
+ });
64
+ var defaultAttributeType = { type: 'String', name: 'Name', uri: 'URI', masking: { regexPattern: '.*' } };
65
+ var defaultAttributeValue = { value: 'Masked value', uri: 'entities/16U21B8f/attributes/Name/2sAfjGOIh' };
66
+ var setUp = function (isMaskingNeeded) {
67
+ if (isMaskingNeeded === void 0) { isMaskingNeeded = true; }
68
+ var attributeType = isMaskingNeeded ? defaultAttributeType : dissoc('masking', defaultAttributeType);
69
+ var container = render(React.createElement(MaskedAttributesProvider, null,
70
+ React.createElement(SimpleAttribute, { attributeType: attributeType, attributeValue: defaultAttributeValue }))).container;
71
+ var user = userEvent.setup();
72
+ return { container: container, user: user };
73
+ };
74
+ it('should not render MaskingSwitcher if attribute should not be masked', function () {
75
+ var container = setUp(false).container;
76
+ expect(container.querySelector('.switcherWrapper')).not.toBeInTheDocument();
77
+ });
78
+ it('should render MaskingSwitcher if attribute should be masked', function () {
79
+ var container = setUp().container;
80
+ expect(container.querySelector('.switcherWrapper')).toBeInTheDocument();
81
+ });
82
+ it('should call getUnmaskedAttributeValue when MaskingSwitcher is clicked', function () { return __awaiter(void 0, void 0, void 0, function () {
83
+ var _a, container, user, switcher;
84
+ return __generator(this, function (_b) {
85
+ switch (_b.label) {
86
+ case 0:
87
+ _a = setUp(), container = _a.container, user = _a.user;
88
+ switcher = container.querySelector('.switcherWrapper');
89
+ return [4 /*yield*/, user.click(switcher)];
90
+ case 1:
91
+ _b.sent();
92
+ expect(getUnmaskedAttributeValueMock).toHaveBeenCalledWith(defaultAttributeValue.uri);
93
+ return [2 /*return*/];
94
+ }
95
+ });
96
+ }); });
97
+ it('should render unmasked value when MaskingSwitcher is clicked', function () { return __awaiter(void 0, void 0, void 0, function () {
98
+ var _a, container, user, switcher;
99
+ return __generator(this, function (_b) {
100
+ switch (_b.label) {
101
+ case 0:
102
+ _a = setUp(), container = _a.container, user = _a.user;
103
+ switcher = container.querySelector('.switcherWrapper');
104
+ expect(screen.getByText('Masked value')).toBeInTheDocument();
105
+ return [4 /*yield*/, user.click(switcher)];
106
+ case 1:
107
+ _b.sent();
108
+ expect(screen.queryByText('Masked value')).not.toBeInTheDocument();
109
+ expect(screen.getByText('Unmasked value')).toBeInTheDocument();
110
+ return [2 /*return*/];
111
+ }
112
+ });
113
+ }); });
114
+ it('should render masked value when MaskingSwitcher is clicked twice', function () { return __awaiter(void 0, void 0, void 0, function () {
115
+ var _a, container, user;
116
+ return __generator(this, function (_b) {
117
+ switch (_b.label) {
118
+ case 0:
119
+ _a = setUp(), container = _a.container, user = _a.user;
120
+ expect(screen.getByText('Masked value')).toBeInTheDocument();
121
+ return [4 /*yield*/, user.click(container.querySelector('.switcherWrapper'))];
122
+ case 1:
123
+ _b.sent();
124
+ expect(screen.queryByText('Masked value')).not.toBeInTheDocument();
125
+ expect(screen.getByText('Unmasked value')).toBeInTheDocument();
126
+ return [4 /*yield*/, user.click(container.querySelector('.switcherWrapper'))];
127
+ case 2:
128
+ _b.sent();
129
+ expect(screen.getByText('Masked value')).toBeInTheDocument();
130
+ expect(screen.queryByText('Unmasked value')).not.toBeInTheDocument();
131
+ return [2 /*return*/];
132
+ }
133
+ });
134
+ }); });
135
+ it('should render CircularProgress while unmasked attribute value is loading', function () { return __awaiter(void 0, void 0, void 0, function () {
136
+ var resolveGetUnmaskedAttributeValue, _a, container, user, switcher;
137
+ return __generator(this, function (_b) {
138
+ switch (_b.label) {
139
+ case 0:
140
+ getUnmaskedAttributeValueMock.mockImplementation(function () { return new Promise(function (resolve) { return (resolveGetUnmaskedAttributeValue = resolve); }); });
141
+ _a = setUp(), container = _a.container, user = _a.user;
142
+ switcher = container.querySelector('.switcherWrapper');
143
+ return [4 /*yield*/, user.click(switcher)];
144
+ case 1:
145
+ _b.sent();
146
+ expect(screen.getByRole('progressbar')).toBeInTheDocument();
147
+ return [4 /*yield*/, resolveGetUnmaskedAttributeValue({
148
+ value: 'Unmasked value',
149
+ uri: 'entities/16U21B8f/attributes/Name/2sAfjGOIh'
150
+ })];
151
+ case 2:
152
+ _b.sent();
153
+ return [4 /*yield*/, screen.findByText('Unmasked value')];
154
+ case 3:
155
+ _b.sent();
156
+ expect(screen.queryByRole('progressbar')).not.toBeInTheDocument();
157
+ return [2 /*return*/];
158
+ }
159
+ });
160
+ }); });
161
+ });
@@ -5,5 +5,5 @@ type Props = {
5
5
  attributeType: AttributeType;
6
6
  inlined?: boolean;
7
7
  };
8
- export declare const SimpleAttribute: ({ className, attributeType, attributeValue, inlined }: Props) => JSX.Element;
8
+ export declare const SimpleAttribute: ({ className, attributeType, attributeValue: rawAttributeValue, inlined }: Props) => JSX.Element;
9
9
  export {};
@@ -1,6 +1,8 @@
1
- import React, { useContext } from 'react';
1
+ import React, { useContext, useMemo } from 'react';
2
2
  import { getAttrDataTypeDefinition, getHistoryAppearanceByUri, getAttributeValue, CollaborationObjectTypes, createRelatedObjectUris, isOv, getHistoryAttributeClassName, isRelationUri } from '@reltio/mdm-sdk';
3
+ import { MaskingSwitcher } from '../MaskingSwitcher';
3
4
  import classnames from 'classnames';
5
+ import useMaskedAttribute from '../hooks/useMaskedAttribute';
4
6
  import { COMMENTS_CONTAINER_VISIBILITY_AREA } from '../constants/classnames';
5
7
  import { HistoryDiffContext } from '../contexts/HistoryAppearanceContext';
6
8
  import { HighlightedValuesContext } from '../contexts/HighlightedValuesContext';
@@ -10,27 +12,36 @@ import { PivotingTooltip } from '../PivotingTooltip';
10
12
  import { useStyles } from './styles';
11
13
  export var SimpleAttribute = function (_a) {
12
14
  var _b, _c, _d, _e, _f;
13
- var className = _a.className, _g = _a.attributeType, attributeType = _g === void 0 ? null : _g, attributeValue = _a.attributeValue, inlined = _a.inlined;
15
+ var className = _a.className, _g = _a.attributeType, attributeType = _g === void 0 ? null : _g, rawAttributeValue = _a.attributeValue, inlined = _a.inlined;
16
+ var _h = useMaskedAttribute({
17
+ attributeType: attributeType,
18
+ attributeValue: rawAttributeValue
19
+ }), isUnmaskingNeeded = _h.isUnmaskingNeeded, isMasked = _h.isMasked, toggleMasking = _h.toggleMasking, attributeValue = _h.attributeValue, isUnmasking = _h.isUnmasking;
14
20
  var styles = useStyles();
15
- var _h = useContext(HighlightedValuesContext), _j = _h.highlightedValuesUris, highlightedValuesUris = _j === void 0 ? [] : _j, highlightedClassName = _h.highlightedClassName;
21
+ var _j = useContext(HighlightedValuesContext), _k = _j.highlightedValuesUris, highlightedValuesUris = _k === void 0 ? [] : _k, highlightedClassName = _j.highlightedClassName;
16
22
  var appearance = useContext(HistoryDiffContext).appearance;
17
23
  var attributeAppearance = getHistoryAppearanceByUri(attributeValue.uri, appearance);
18
24
  var historyClassName = getHistoryAttributeClassName(attributeAppearance);
19
- var dataTypeValue = (React.createElement(DataTypeValue, { value: getAttributeValue(attributeValue), dataTypeDefinition: getAttrDataTypeDefinition(attributeType) }));
25
+ var dataTypeValue = useMemo(function () { return (React.createElement(DataTypeValue, { value: getAttributeValue(attributeValue), dataTypeDefinition: getAttrDataTypeDefinition(attributeType) })); }, [attributeValue, attributeType]);
20
26
  var objectType = isRelationUri(attributeValue.uri)
21
27
  ? CollaborationObjectTypes.RELATION_ATTRIBUTE
22
28
  : CollaborationObjectTypes.ENTITY_ATTRIBUTE;
29
+ var unmaskingControl = isUnmaskingNeeded && (React.createElement(MaskingSwitcher, { isMasked: isMasked, onToggleMasking: toggleMasking, isUnmasking: isUnmasking }));
23
30
  return inlined || historyClassName ? (React.createElement("div", { className: classnames(className, (_b = {},
24
31
  _b[highlightedClassName] = highlightedValuesUris.includes(attributeValue.uri),
25
32
  _b)) },
26
33
  React.createElement(PivotingTooltip, { value: attributeValue, attributeType: attributeType, key: attributeValue.uri, className: classnames((_c = {}, _c[styles.multilineAttribute] = !inlined, _c)) },
27
34
  React.createElement("span", { className: classnames(styles.attributeValue, styles[historyClassName], (_d = {},
28
35
  _d[styles.ovFalse] = !isOv(attributeValue),
29
- _d)), "data-reltio-id": "reltio-attribute-value" }, dataTypeValue)))) : (React.createElement("div", { className: classnames(className, styles.root, COMMENTS_CONTAINER_VISIBILITY_AREA, (_e = {},
36
+ _d)), "data-reltio-id": "reltio-attribute-value" },
37
+ dataTypeValue,
38
+ unmaskingControl)))) : (React.createElement("div", { className: classnames(className, styles.root, COMMENTS_CONTAINER_VISIBILITY_AREA, (_e = {},
30
39
  _e[highlightedClassName] = highlightedValuesUris.includes(attributeValue.uri),
31
40
  _e)) },
32
41
  React.createElement(PivotingTooltip, { value: attributeValue, attributeType: attributeType, key: attributeValue.uri },
33
- React.createElement("span", { className: classnames(styles.attributeValue, (_f = {}, _f[styles.ovFalse] = !isOv(attributeValue), _f)), "data-reltio-id": "reltio-attribute-value" }, dataTypeValue)),
42
+ React.createElement("span", { className: classnames(styles.attributeValue, (_f = {}, _f[styles.ovFalse] = !isOv(attributeValue), _f)), "data-reltio-id": "reltio-attribute-value" },
43
+ dataTypeValue,
44
+ unmaskingControl)),
34
45
  React.createElement(CommentsContainer, { className: styles.commentsContainer, uri: attributeValue.uri, relatedObjectUris: createRelatedObjectUris(objectType, {
35
46
  uri: attributeValue.uri
36
47
  }), objectType: objectType })));
@@ -0,0 +1,3 @@
1
+ import { SimpleAttributeValue } from '@reltio/mdm-sdk';
2
+ export declare const useUnmaskedAttributeValue: (attributeValue: SimpleAttributeValue) => SimpleAttributeValue;
3
+ export declare const useAddUnmaskedAttributeValue: () => (attributeValue: SimpleAttributeValue) => Promise<void>;
@@ -0,0 +1,13 @@
1
+ import { useContextSelector } from '@fluentui/react-context-selector';
2
+ import { MaskedAttributesContext } from '.';
3
+ var useMaskedAttributesContext = function (selector) {
4
+ return useContextSelector(MaskedAttributesContext, selector);
5
+ };
6
+ export var useUnmaskedAttributeValue = function (attributeValue) {
7
+ return useMaskedAttributesContext(function (context) {
8
+ return context ? context.unmaskedAttributesValues[attributeValue.uri] : attributeValue;
9
+ });
10
+ };
11
+ export var useAddUnmaskedAttributeValue = function () {
12
+ return useMaskedAttributesContext(function (context) { return (context ? context.addUnmaskedAttributeValue : Promise.resolve); });
13
+ };
@@ -0,0 +1,13 @@
1
+ import { ReactNode } from 'react';
2
+ import { SimpleAttributeValue } from '@reltio/mdm-sdk';
3
+ type UnmaskedAttributesValues = Record<string, SimpleAttributeValue>;
4
+ export type MaskedAttributesContextType = {
5
+ unmaskedAttributesValues: UnmaskedAttributesValues;
6
+ addUnmaskedAttributeValue: (attributeValue: SimpleAttributeValue) => Promise<void>;
7
+ };
8
+ export declare const MaskedAttributesContext: import("@fluentui/react-context-selector").Context<MaskedAttributesContextType>;
9
+ type Props = {
10
+ children: ReactNode;
11
+ };
12
+ export declare const MaskedAttributesProvider: ({ children }: Props) => JSX.Element;
13
+ export {};
@@ -0,0 +1,79 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ 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;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import React, { useState, useCallback } from 'react';
49
+ import { createContext } from '@fluentui/react-context-selector';
50
+ import { getUnmaskedAttributeValue } from '@reltio/mdm-sdk';
51
+ import { showErrorMessage } from '../../core/errors';
52
+ export var MaskedAttributesContext = createContext(null);
53
+ export var MaskedAttributesProvider = function (_a) {
54
+ var children = _a.children;
55
+ var _b = useState({}), unmaskedAttributesValues = _b[0], setUnmaskedAttributesValues = _b[1];
56
+ var addUnmaskedAttributeValue = useCallback(function (attributeValue) { return __awaiter(void 0, void 0, void 0, function () {
57
+ var unmaskedAttributeValue_1, error_1;
58
+ return __generator(this, function (_a) {
59
+ switch (_a.label) {
60
+ case 0:
61
+ _a.trys.push([0, 2, , 3]);
62
+ return [4 /*yield*/, getUnmaskedAttributeValue(attributeValue.uri)];
63
+ case 1:
64
+ unmaskedAttributeValue_1 = _a.sent();
65
+ setUnmaskedAttributesValues(function (prev) {
66
+ var _a;
67
+ return (__assign(__assign({}, prev), (_a = {}, _a[attributeValue.uri] = unmaskedAttributeValue_1, _a)));
68
+ });
69
+ return [3 /*break*/, 3];
70
+ case 2:
71
+ error_1 = _a.sent();
72
+ showErrorMessage(error_1);
73
+ return [3 /*break*/, 3];
74
+ case 3: return [2 /*return*/];
75
+ }
76
+ });
77
+ }); }, []);
78
+ return (React.createElement(MaskedAttributesContext.Provider, { value: { unmaskedAttributesValues: unmaskedAttributesValues, addUnmaskedAttributeValue: addUnmaskedAttributeValue } }, children));
79
+ };
@@ -34,3 +34,4 @@ export { ConfigPermissionsContext, ConfigPermissionsContextProvider, useAttribut
34
34
  export * from './MdmModuleContext';
35
35
  export { ReloadDataProvider, useReloadData } from './ReloadDataContext';
36
36
  export { SegmentationContext } from './SegmentationContext';
37
+ export { MaskedAttributesProvider } from './MaskedAttributesContext';
@@ -34,3 +34,4 @@ export { ConfigPermissionsContext, ConfigPermissionsContextProvider, useAttribut
34
34
  export * from './MdmModuleContext';
35
35
  export { ReloadDataProvider, useReloadData } from './ReloadDataContext';
36
36
  export { SegmentationContext } from './SegmentationContext';
37
+ export { MaskedAttributesProvider } from './MaskedAttributesContext';
@@ -0,0 +1,13 @@
1
+ import { AttributeType, SimpleAttributeValue } from '@reltio/mdm-sdk';
2
+ type Props = {
3
+ attributeValue: SimpleAttributeValue;
4
+ attributeType: AttributeType;
5
+ };
6
+ declare const useMaskedAttribute: ({ attributeType, attributeValue }: Props) => {
7
+ isUnmaskingNeeded: boolean;
8
+ isMasked: boolean;
9
+ toggleMasking: () => void;
10
+ isUnmasking: boolean;
11
+ attributeValue: SimpleAttributeValue;
12
+ };
13
+ export default useMaskedAttribute;
@@ -0,0 +1,27 @@
1
+ import { useEffect, useState, useCallback } from 'react';
2
+ import { useUnmaskedAttributeValue, useAddUnmaskedAttributeValue } from '../contexts/MaskedAttributesContext/hooks';
3
+ var useMaskedAttribute = function (_a) {
4
+ var attributeType = _a.attributeType, attributeValue = _a.attributeValue;
5
+ var isUnmaskingNeeded = !!attributeType.masking;
6
+ var _b = useState(isUnmaskingNeeded), isMasked = _b[0], setIsMasked = _b[1];
7
+ var _c = useState(false), isUnmasking = _c[0], setIsUnmasking = _c[1];
8
+ var addUnmaskedAttributeValue = useAddUnmaskedAttributeValue();
9
+ var unmaskedAttributeValue = useUnmaskedAttributeValue(attributeValue);
10
+ useEffect(function () {
11
+ if (isUnmaskingNeeded && addUnmaskedAttributeValue && !isMasked && unmaskedAttributeValue === undefined) {
12
+ setIsUnmasking(true);
13
+ addUnmaskedAttributeValue(attributeValue).finally(function () { return setIsUnmasking(false); });
14
+ }
15
+ }, [isUnmaskingNeeded, isMasked, addUnmaskedAttributeValue, attributeValue, unmaskedAttributeValue]);
16
+ var toggleMasking = useCallback(function () {
17
+ setIsMasked(function (prev) { return !prev; });
18
+ }, []);
19
+ return {
20
+ isUnmaskingNeeded: isUnmaskingNeeded,
21
+ isMasked: isMasked,
22
+ toggleMasking: toggleMasking,
23
+ isUnmasking: isUnmasking,
24
+ attributeValue: isMasked ? attributeValue : unmaskedAttributeValue || attributeValue
25
+ };
26
+ };
27
+ export default useMaskedAttribute;
package/esm/index.d.ts CHANGED
@@ -110,6 +110,7 @@ export { FilterValueEditor } from './FilterValueEditor';
110
110
  export { DropDownEditor } from './DropDownEditor';
111
111
  export { EmptySearchResult } from './EmptySearchResult';
112
112
  export { FileTypeEditor } from './FileTypeEditor';
113
+ export { MaskingSwitcher } from './MaskingSwitcher';
113
114
  export { SaveSegmentDialog } from './SaveSegmentDialog';
114
115
  export { withChartDataPercents as withPercents } from './HOCs/withChartDataPercents';
115
116
  export { withFilterAtBottom } from './HOCs/withFilterAtBottom';
package/esm/index.js CHANGED
@@ -111,6 +111,7 @@ export { FilterValueEditor } from './FilterValueEditor';
111
111
  export { DropDownEditor } from './DropDownEditor';
112
112
  export { EmptySearchResult } from './EmptySearchResult';
113
113
  export { FileTypeEditor } from './FileTypeEditor';
114
+ export { MaskingSwitcher } from './MaskingSwitcher';
114
115
  export { SaveSegmentDialog } from './SaveSegmentDialog';
115
116
  // HOCs
116
117
  export { withChartDataPercents as withPercents } from './HOCs/withChartDataPercents';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reltio/components",
3
- "version": "1.4.1858",
3
+ "version": "1.4.1860",
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.1805",
11
+ "@reltio/mdm-sdk": "^1.4.1806",
12
12
  "classnames": "^2.2.5",
13
13
  "d3-cloud": "^1.2.5",
14
14
  "d3-geo": "^2.0.1",