@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.
- package/cjs/CollaborationItem/components/TextFieldWithMentions/TextFieldWithMentions.js +1 -1
- package/cjs/CollaborationItem/components/TextFieldWithMentions/styles.js +1 -2
- package/cjs/MaskingSwitcher/MaskingSwitcher.d.ts +7 -0
- package/cjs/MaskingSwitcher/MaskingSwitcher.js +20 -0
- package/cjs/MaskingSwitcher/index.d.ts +1 -0
- package/cjs/MaskingSwitcher/index.js +5 -0
- package/cjs/MaskingSwitcher/styles.d.ts +1 -0
- package/cjs/MaskingSwitcher/styles.js +16 -0
- package/cjs/SaveSegmentDialog/SaveSegmentDialog.js +1 -1
- package/cjs/SimpleAttribute/IntegrationSimpleAttribute.test.d.ts +1 -0
- package/cjs/SimpleAttribute/IntegrationSimpleAttribute.test.js +189 -0
- package/cjs/SimpleAttribute/SimpleAttribute.d.ts +1 -1
- package/cjs/SimpleAttribute/SimpleAttribute.js +16 -5
- package/cjs/contexts/MaskedAttributesContext/hooks.d.ts +3 -0
- package/cjs/contexts/MaskedAttributesContext/hooks.js +18 -0
- package/cjs/contexts/MaskedAttributesContext/index.d.ts +13 -0
- package/cjs/contexts/MaskedAttributesContext/index.js +106 -0
- package/cjs/contexts/index.d.ts +1 -0
- package/cjs/contexts/index.js +3 -1
- package/cjs/hooks/useMaskedAttribute.d.ts +13 -0
- package/cjs/hooks/useMaskedAttribute.js +29 -0
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +3 -1
- package/esm/CollaborationItem/components/TextFieldWithMentions/TextFieldWithMentions.js +1 -1
- package/esm/CollaborationItem/components/TextFieldWithMentions/styles.js +1 -2
- package/esm/MaskingSwitcher/MaskingSwitcher.d.ts +7 -0
- package/esm/MaskingSwitcher/MaskingSwitcher.js +13 -0
- package/esm/MaskingSwitcher/index.d.ts +1 -0
- package/esm/MaskingSwitcher/index.js +1 -0
- package/esm/MaskingSwitcher/styles.d.ts +1 -0
- package/esm/MaskingSwitcher/styles.js +13 -0
- package/esm/SaveSegmentDialog/SaveSegmentDialog.js +1 -1
- package/esm/SimpleAttribute/IntegrationSimpleAttribute.test.d.ts +1 -0
- package/esm/SimpleAttribute/IntegrationSimpleAttribute.test.js +161 -0
- package/esm/SimpleAttribute/SimpleAttribute.d.ts +1 -1
- package/esm/SimpleAttribute/SimpleAttribute.js +17 -6
- package/esm/contexts/MaskedAttributesContext/hooks.d.ts +3 -0
- package/esm/contexts/MaskedAttributesContext/hooks.js +13 -0
- package/esm/contexts/MaskedAttributesContext/index.d.ts +13 -0
- package/esm/contexts/MaskedAttributesContext/index.js +79 -0
- package/esm/contexts/index.d.ts +1 -0
- package/esm/contexts/index.js +1 -0
- package/esm/hooks/useMaskedAttribute.d.ts +13 -0
- package/esm/hooks/useMaskedAttribute.js +27 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- 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,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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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,
|
|
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
|
|
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" },
|
|
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" },
|
|
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;
|
package/cjs/contexts/index.d.ts
CHANGED
|
@@ -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';
|
package/cjs/contexts/index.js
CHANGED
|
@@ -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,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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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,
|
|
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
|
|
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" },
|
|
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" },
|
|
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
|
+
};
|
package/esm/contexts/index.d.ts
CHANGED
|
@@ -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';
|
package/esm/contexts/index.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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",
|