@reltio/components 1.4.2078 → 1.4.2080

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 (111) hide show
  1. package/ExpandableSearchInput/ExpandableSearchInput.d.ts +4 -1
  2. package/ExpandableSearchInput/ExpandableSearchInput.js +4 -4
  3. package/ExpandableSearchInput/ExpandableSearchInput.module.css.js +9 -0
  4. package/SegmentsTable/CellRenderer.module.css.js +9 -0
  5. package/SegmentsTable/SegmentsTable.d.ts +13 -0
  6. package/SegmentsTable/SegmentsTable.js +70 -0
  7. package/SegmentsTable/SegmentsTable.module.css.js +9 -0
  8. package/SegmentsTable/SegmentsTable.test.d.ts +1 -0
  9. package/SegmentsTable/SegmentsTable.test.js +165 -0
  10. package/SegmentsTable/components/AttributeCellRenderer/AttributeCellRenderer.d.ts +6 -0
  11. package/SegmentsTable/components/AttributeCellRenderer/AttributeCellRenderer.js +8 -0
  12. package/SegmentsTable/components/AttributeCellRenderer/index.d.ts +1 -0
  13. package/SegmentsTable/components/AttributeCellRenderer/index.js +1 -0
  14. package/SegmentsTable/components/AudienceCountCellRenderer/AudienceCountCellRenderer.d.ts +6 -0
  15. package/SegmentsTable/components/AudienceCountCellRenderer/AudienceCountCellRenderer.js +8 -0
  16. package/SegmentsTable/components/AudienceCountCellRenderer/AudienceCountCellRenderer.module.css.js +9 -0
  17. package/SegmentsTable/components/AudienceCountCellRenderer/index.d.ts +1 -0
  18. package/SegmentsTable/components/AudienceCountCellRenderer/index.js +1 -0
  19. package/SegmentsTable/components/BarCellRenderer/BarCellRenderer.d.ts +9 -0
  20. package/SegmentsTable/components/BarCellRenderer/BarCellRenderer.js +9 -0
  21. package/SegmentsTable/components/BarCellRenderer/BarCellRenderer.module.css.js +9 -0
  22. package/SegmentsTable/components/BarCellRenderer/index.d.ts +1 -0
  23. package/SegmentsTable/components/BarCellRenderer/index.js +1 -0
  24. package/SegmentsTable/components/BarHeadCellRenderer/BarHeadCellRenderer.d.ts +5 -0
  25. package/SegmentsTable/components/BarHeadCellRenderer/BarHeadCellRenderer.js +12 -0
  26. package/SegmentsTable/components/BarHeadCellRenderer/BarHeadCellRenderer.module.css.js +9 -0
  27. package/SegmentsTable/components/BarHeadCellRenderer/index.d.ts +1 -0
  28. package/SegmentsTable/components/BarHeadCellRenderer/index.js +1 -0
  29. package/SegmentsTable/components/HeadCellRenderer/HeadCellRenderer.d.ts +9 -0
  30. package/SegmentsTable/components/HeadCellRenderer/HeadCellRenderer.js +33 -0
  31. package/SegmentsTable/components/HeadCellRenderer/HeadCellRenderer.module.css.js +9 -0
  32. package/SegmentsTable/components/HeadCellRenderer/index.d.ts +1 -0
  33. package/SegmentsTable/components/HeadCellRenderer/index.js +1 -0
  34. package/SegmentsTable/components/LabelCellRenderer/LabelCellRenderer.d.ts +9 -0
  35. package/SegmentsTable/components/LabelCellRenderer/LabelCellRenderer.js +14 -0
  36. package/SegmentsTable/components/LabelCellRenderer/LabelCellRenderer.module.css.js +9 -0
  37. package/SegmentsTable/components/LabelCellRenderer/index.d.ts +1 -0
  38. package/SegmentsTable/components/LabelCellRenderer/index.js +1 -0
  39. package/SegmentsTable/helpers.d.ts +3 -0
  40. package/SegmentsTable/helpers.js +16 -0
  41. package/SegmentsTable/index.d.ts +1 -0
  42. package/SegmentsTable/index.js +1 -0
  43. package/SimpleAttribute/IntegrationSimpleAttribute.test.js +109 -4
  44. package/cjs/ExpandableSearchInput/ExpandableSearchInput.d.ts +4 -1
  45. package/cjs/ExpandableSearchInput/ExpandableSearchInput.js +6 -6
  46. package/cjs/ExpandableSearchInput/ExpandableSearchInput.module.css.js +9 -0
  47. package/cjs/SegmentsTable/CellRenderer.module.css.js +9 -0
  48. package/cjs/SegmentsTable/SegmentsTable.d.ts +13 -0
  49. package/cjs/SegmentsTable/SegmentsTable.js +100 -0
  50. package/cjs/SegmentsTable/SegmentsTable.module.css.js +9 -0
  51. package/cjs/SegmentsTable/SegmentsTable.test.d.ts +1 -0
  52. package/cjs/SegmentsTable/SegmentsTable.test.js +170 -0
  53. package/cjs/SegmentsTable/components/AttributeCellRenderer/AttributeCellRenderer.d.ts +6 -0
  54. package/cjs/SegmentsTable/components/AttributeCellRenderer/AttributeCellRenderer.js +15 -0
  55. package/cjs/SegmentsTable/components/AttributeCellRenderer/index.d.ts +1 -0
  56. package/cjs/SegmentsTable/components/AttributeCellRenderer/index.js +5 -0
  57. package/cjs/SegmentsTable/components/AudienceCountCellRenderer/AudienceCountCellRenderer.d.ts +6 -0
  58. package/cjs/SegmentsTable/components/AudienceCountCellRenderer/AudienceCountCellRenderer.js +15 -0
  59. package/cjs/SegmentsTable/components/AudienceCountCellRenderer/AudienceCountCellRenderer.module.css.js +9 -0
  60. package/cjs/SegmentsTable/components/AudienceCountCellRenderer/index.d.ts +1 -0
  61. package/cjs/SegmentsTable/components/AudienceCountCellRenderer/index.js +5 -0
  62. package/cjs/SegmentsTable/components/BarCellRenderer/BarCellRenderer.d.ts +9 -0
  63. package/cjs/SegmentsTable/components/BarCellRenderer/BarCellRenderer.js +16 -0
  64. package/cjs/SegmentsTable/components/BarCellRenderer/BarCellRenderer.module.css.js +9 -0
  65. package/cjs/SegmentsTable/components/BarCellRenderer/index.d.ts +1 -0
  66. package/cjs/SegmentsTable/components/BarCellRenderer/index.js +5 -0
  67. package/cjs/SegmentsTable/components/BarHeadCellRenderer/BarHeadCellRenderer.d.ts +5 -0
  68. package/cjs/SegmentsTable/components/BarHeadCellRenderer/BarHeadCellRenderer.js +17 -0
  69. package/cjs/SegmentsTable/components/BarHeadCellRenderer/BarHeadCellRenderer.module.css.js +9 -0
  70. package/cjs/SegmentsTable/components/BarHeadCellRenderer/index.d.ts +1 -0
  71. package/cjs/SegmentsTable/components/BarHeadCellRenderer/index.js +8 -0
  72. package/cjs/SegmentsTable/components/HeadCellRenderer/HeadCellRenderer.d.ts +9 -0
  73. package/cjs/SegmentsTable/components/HeadCellRenderer/HeadCellRenderer.js +40 -0
  74. package/cjs/SegmentsTable/components/HeadCellRenderer/HeadCellRenderer.module.css.js +9 -0
  75. package/cjs/SegmentsTable/components/HeadCellRenderer/index.d.ts +1 -0
  76. package/cjs/SegmentsTable/components/HeadCellRenderer/index.js +5 -0
  77. package/cjs/SegmentsTable/components/LabelCellRenderer/LabelCellRenderer.d.ts +9 -0
  78. package/cjs/SegmentsTable/components/LabelCellRenderer/LabelCellRenderer.js +21 -0
  79. package/cjs/SegmentsTable/components/LabelCellRenderer/LabelCellRenderer.module.css.js +9 -0
  80. package/cjs/SegmentsTable/components/LabelCellRenderer/index.d.ts +1 -0
  81. package/cjs/SegmentsTable/components/LabelCellRenderer/index.js +5 -0
  82. package/cjs/SegmentsTable/helpers.d.ts +3 -0
  83. package/cjs/SegmentsTable/helpers.js +23 -0
  84. package/cjs/SegmentsTable/index.d.ts +1 -0
  85. package/cjs/SegmentsTable/index.js +5 -0
  86. package/cjs/SimpleAttribute/IntegrationSimpleAttribute.test.js +108 -3
  87. package/cjs/hooks/useMaskedAttribute/helpers.d.ts +6 -0
  88. package/cjs/hooks/useMaskedAttribute/helpers.js +72 -0
  89. package/cjs/hooks/useMaskedAttribute/useMaskedAttribute.d.ts +4 -3
  90. package/cjs/hooks/useMaskedAttribute/useMaskedAttribute.js +58 -4
  91. package/cjs/hooks/useSegmentsRequest/helper.d.ts +2 -0
  92. package/cjs/hooks/useSegmentsRequest/helper.js +51 -0
  93. package/cjs/hooks/useSegmentsRequest/index.d.ts +1 -0
  94. package/cjs/hooks/useSegmentsRequest/index.js +5 -0
  95. package/cjs/hooks/useSegmentsRequest/useSegmentsRequest.d.ts +42 -0
  96. package/cjs/hooks/useSegmentsRequest/useSegmentsRequest.js +146 -0
  97. package/hooks/useMaskedAttribute/helpers.d.ts +6 -0
  98. package/hooks/useMaskedAttribute/helpers.js +68 -0
  99. package/hooks/useMaskedAttribute/useMaskedAttribute.d.ts +4 -3
  100. package/hooks/useMaskedAttribute/useMaskedAttribute.js +60 -6
  101. package/hooks/useSegmentsRequest/helper.d.ts +2 -0
  102. package/hooks/useSegmentsRequest/helper.js +47 -0
  103. package/hooks/useSegmentsRequest/index.d.ts +1 -0
  104. package/hooks/useSegmentsRequest/index.js +1 -0
  105. package/hooks/useSegmentsRequest/useSegmentsRequest.d.ts +42 -0
  106. package/hooks/useSegmentsRequest/useSegmentsRequest.js +142 -0
  107. package/package.json +2 -2
  108. package/ExpandableSearchInput/styles.d.ts +0 -1
  109. package/ExpandableSearchInput/styles.js +0 -22
  110. package/cjs/ExpandableSearchInput/styles.d.ts +0 -1
  111. package/cjs/ExpandableSearchInput/styles.js +0 -25
@@ -49,11 +49,11 @@ import React from 'react';
49
49
  import { dissoc } from 'ramda';
50
50
  import { act, render, screen } from '@testing-library/react';
51
51
  import userEvent from '@testing-library/user-event';
52
- import { Mode, getUnmaskedAttributeValue } from '@reltio/mdm-sdk';
52
+ import { Mode, getUnmaskedAttributeValue, createActivity } from '@reltio/mdm-sdk';
53
53
  import { MaskedAttributesProvider } from '../contexts/MaskedAttributesContext';
54
54
  import { MdmModuleProvider } from '../contexts/MdmModuleContext';
55
55
  import { SimpleAttribute } from './SimpleAttribute';
56
- jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { getUnmaskedAttributeValue: jest.fn() })); });
56
+ jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { getUnmaskedAttributeValue: jest.fn(), createActivity: jest.fn() })); });
57
57
  describe('masking/unmasking behaviour', function () {
58
58
  beforeAll(function () {
59
59
  getUnmaskedAttributeValue.mockResolvedValue({
@@ -67,11 +67,48 @@ describe('masking/unmasking behaviour', function () {
67
67
  attributeType: defaultAttributeType,
68
68
  attributeValue: defaultAttributeValue
69
69
  };
70
+ var store = {
71
+ entity: {
72
+ uri: 'entities/16U21B8f',
73
+ type: 'configuration/entityTypes/HCP',
74
+ label: 'Test Entity'
75
+ },
76
+ metadata: {
77
+ entityTypes: [
78
+ {
79
+ uri: 'configuration/entityTypes/HCP',
80
+ attributes: [
81
+ {
82
+ uri: 'configuration/entityTypes/HCP/attributes/Nested',
83
+ name: 'Name',
84
+ label: 'Nested',
85
+ type: 'Nested',
86
+ attributes: [
87
+ {
88
+ uri: 'configuration/entityTypes/HCP/attributes/Nested/attributes/TextField',
89
+ label: 'Name Label',
90
+ type: 'String',
91
+ name: 'Name'
92
+ }
93
+ ]
94
+ },
95
+ {
96
+ uri: 'configuration/entityTypes/HCP/attributes/RDMLookup',
97
+ type: 'Reference',
98
+ label: 'RDMLookup Label',
99
+ name: 'RDMLookup'
100
+ }
101
+ ]
102
+ }
103
+ ]
104
+ },
105
+ mode: Mode.Viewing
106
+ };
70
107
  var setUp = function (props) {
71
108
  if (props === void 0) { props = defaultProps; }
72
109
  var Providers = function (_a) {
73
110
  var children = _a.children;
74
- return (React.createElement(MdmModuleProvider, { values: { mode: Mode.Viewing } },
111
+ return (React.createElement(MdmModuleProvider, { values: store },
75
112
  React.createElement(MaskedAttributesProvider, null, children)));
76
113
  };
77
114
  var user = userEvent.setup();
@@ -79,6 +116,9 @@ describe('masking/unmasking behaviour', function () {
79
116
  wrapper: Providers
80
117
  }));
81
118
  };
119
+ afterEach(function () {
120
+ jest.clearAllMocks();
121
+ });
82
122
  it('should not render MaskingSwitcher if attribute should not be masked', function () {
83
123
  var attributeType = dissoc('masking', defaultAttributeType);
84
124
  var container = setUp(__assign(__assign({}, defaultProps), { attributeType: attributeType })).container;
@@ -146,7 +186,7 @@ describe('masking/unmasking behaviour', function () {
146
186
  return __generator(this, function (_b) {
147
187
  switch (_b.label) {
148
188
  case 0:
149
- getUnmaskedAttributeValue.mockImplementation(function () { return new Promise(function (resolve) { return (resolveGetUnmaskedAttributeValue = resolve); }); });
189
+ getUnmaskedAttributeValue.mockImplementationOnce(function () { return new Promise(function (resolve) { return (resolveGetUnmaskedAttributeValue = resolve); }); });
150
190
  _a = setUp(), container = _a.container, user = _a.user;
151
191
  switcher = container.querySelector('.switcherWrapper');
152
192
  return [4 /*yield*/, user.click(switcher)];
@@ -184,4 +224,69 @@ describe('masking/unmasking behaviour', function () {
184
224
  setUp({ attributeType: attributeType, attributeValue: attributeValue });
185
225
  expect(screen.getByText('**********0000')).toBeInTheDocument();
186
226
  });
227
+ it('should call createActivity with correct arguments when MaskingSwitcher is clicked to unmask', function () { return __awaiter(void 0, void 0, void 0, function () {
228
+ var attributeType, attributeValue, _a, container, user, switcher;
229
+ return __generator(this, function (_b) {
230
+ switch (_b.label) {
231
+ case 0:
232
+ attributeType = __assign(__assign({}, defaultAttributeType), { uri: 'configuration/entityTypes/HCP/attributes/Nested/attributes/TextField' });
233
+ attributeValue = __assign(__assign({}, defaultAttributeValue), { uri: 'entities/02ZRRE9/attributes/Nested/1bgW4Wj3/TextField/1bgW4nm5' });
234
+ _a = setUp({ attributeType: attributeType, attributeValue: attributeValue }), container = _a.container, user = _a.user;
235
+ switcher = container.querySelector('.switcherWrapper');
236
+ return [4 /*yield*/, user.click(switcher)];
237
+ case 1:
238
+ _b.sent();
239
+ expect(createActivity).toHaveBeenCalledWith({
240
+ label: 'ATTRIBUTE_UNMASKED',
241
+ description: JSON.stringify({
242
+ uri: 'entities/16U21B8f',
243
+ label: 'Test Entity: Nested / Name Label - Masked value'
244
+ }),
245
+ items: [{ objectUri: 'entities/16U21B8f' }]
246
+ });
247
+ return [2 /*return*/];
248
+ }
249
+ });
250
+ }); });
251
+ it('should not call createActivity if attribute is already unmasked', function () { return __awaiter(void 0, void 0, void 0, function () {
252
+ var unmaskedAttributeValue, _a, container, user, switcher;
253
+ return __generator(this, function (_b) {
254
+ switch (_b.label) {
255
+ case 0:
256
+ unmaskedAttributeValue = {
257
+ value: 'Unmasked value',
258
+ uri: defaultAttributeValue.uri
259
+ };
260
+ getUnmaskedAttributeValue.mockResolvedValue(unmaskedAttributeValue);
261
+ _a = setUp(), container = _a.container, user = _a.user;
262
+ switcher = container.querySelector('.switcherWrapper');
263
+ return [4 /*yield*/, user.click(switcher)];
264
+ case 1:
265
+ _b.sent();
266
+ return [4 /*yield*/, user.click(switcher)];
267
+ case 2:
268
+ _b.sent();
269
+ expect(createActivity).toHaveBeenCalledTimes(1);
270
+ return [2 /*return*/];
271
+ }
272
+ });
273
+ }); });
274
+ it('should log an error if createActivity request fails', function () { return __awaiter(void 0, void 0, void 0, function () {
275
+ var consoleErrorSpy, _a, container, user, switcher;
276
+ return __generator(this, function (_b) {
277
+ switch (_b.label) {
278
+ case 0:
279
+ consoleErrorSpy = jest.spyOn(console, 'warn').mockImplementation();
280
+ createActivity.mockRejectedValue(new Error('API Error'));
281
+ _a = setUp(), container = _a.container, user = _a.user;
282
+ switcher = container.querySelector('.switcherWrapper');
283
+ return [4 /*yield*/, user.click(switcher)];
284
+ case 1:
285
+ _b.sent();
286
+ expect(consoleErrorSpy).toHaveBeenCalledWith(new Error('API Error'));
287
+ consoleErrorSpy.mockRestore();
288
+ return [2 /*return*/];
289
+ }
290
+ });
291
+ }); });
187
292
  });
@@ -2,6 +2,9 @@ import React from 'react';
2
2
  type Props = {
3
3
  query: string;
4
4
  onChange: (value: string) => void;
5
+ classes?: {
6
+ searchButton: string;
7
+ };
5
8
  };
6
- export declare const ExpandableSearchInput: ({ query, onChange }: Props) => React.JSX.Element;
9
+ export declare const ExpandableSearchInput: ({ query, onChange, classes }: Props) => React.JSX.Element;
7
10
  export {};
@@ -29,6 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.ExpandableSearchInput = void 0;
30
30
  var react_1 = __importStar(require("react"));
31
31
  var ui_i18n_1 = __importDefault(require("ui-i18n"));
32
+ var classnames_1 = __importDefault(require("classnames"));
32
33
  var ramda_1 = require("ramda");
33
34
  var Close_1 = __importDefault(require("@mui/icons-material/Close"));
34
35
  var IconButton_1 = __importDefault(require("@mui/material/IconButton"));
@@ -37,18 +38,17 @@ var InputAdornment_1 = __importDefault(require("@mui/material/InputAdornment"));
37
38
  var Search_1 = __importDefault(require("@mui/icons-material/Search"));
38
39
  var SmallIconButton_1 = require("../SmallIconButton");
39
40
  var events_1 = require("../helpers/events");
40
- var styles_1 = require("./styles");
41
+ var ExpandableSearchInput_module_css_1 = __importDefault(require("./ExpandableSearchInput.module.css"));
41
42
  var ExpandableSearchInput = function (_a) {
42
- var query = _a.query, onChange = _a.onChange;
43
+ var query = _a.query, onChange = _a.onChange, classes = _a.classes;
43
44
  var _b = (0, react_1.useState)(query), value = _b[0], setValue = _b[1];
44
45
  var _c = (0, react_1.useState)(!!query), isOpen = _c[0], setIsOpen = _c[1];
45
46
  (0, react_1.useEffect)(function () {
46
47
  setValue(query);
47
48
  }, [query]);
48
- var styles = (0, styles_1.useStyles)();
49
- return isOpen ? (react_1.default.createElement(Input_1.default, { "data-reltio-id": "expandable-search-input", className: styles.input, value: value, autoFocus: true, placeholder: ui_i18n_1.default.text('Search'), disableUnderline: true, onChange: (0, ramda_1.pipe)(events_1.getValue, setValue), startAdornment: react_1.default.createElement(InputAdornment_1.default, { position: "start" },
50
- react_1.default.createElement(Search_1.default, { className: styles.startAdornment })), endAdornment: react_1.default.createElement(InputAdornment_1.default, { position: "end" },
51
- react_1.default.createElement(SmallIconButton_1.SmallIconButton, { size: "S", icon: Close_1.default, className: styles.endAdornment, onClick: (0, ramda_1.pipe)(ramda_1.F, setIsOpen, (0, ramda_1.always)(''), (0, ramda_1.tap)(onChange), setValue) })), onKeyPress: (0, ramda_1.when)((0, ramda_1.propEq)('key', 'Enter'), (0, ramda_1.pipe)((0, ramda_1.always)(value), ramda_1.trim, onChange)) })) : (react_1.default.createElement(IconButton_1.default, { "data-reltio-id": "expandable-search-button", className: styles.searchButton, onClick: (0, ramda_1.pipe)(ramda_1.T, setIsOpen), size: "large" },
49
+ return isOpen ? (react_1.default.createElement(Input_1.default, { "data-reltio-id": "expandable-search-input", className: ExpandableSearchInput_module_css_1.default.input, value: value, autoFocus: true, placeholder: ui_i18n_1.default.text('Search'), disableUnderline: true, onChange: (0, ramda_1.pipe)(events_1.getValue, setValue), startAdornment: react_1.default.createElement(InputAdornment_1.default, { position: "start" },
50
+ react_1.default.createElement(Search_1.default, { className: ExpandableSearchInput_module_css_1.default.startAdornment })), endAdornment: react_1.default.createElement(InputAdornment_1.default, { position: "end" },
51
+ react_1.default.createElement(SmallIconButton_1.SmallIconButton, { size: "S", icon: Close_1.default, className: ExpandableSearchInput_module_css_1.default.endAdornment, onClick: (0, ramda_1.pipe)(ramda_1.F, setIsOpen, (0, ramda_1.always)(''), (0, ramda_1.tap)(onChange), setValue) })), onKeyPress: (0, ramda_1.when)((0, ramda_1.propEq)('key', 'Enter'), (0, ramda_1.pipe)((0, ramda_1.always)(value), ramda_1.trim, onChange)) })) : (react_1.default.createElement(IconButton_1.default, { "data-reltio-id": "expandable-search-button", className: (0, classnames_1.default)(ExpandableSearchInput_module_css_1.default.searchButton, classes === null || classes === void 0 ? void 0 : classes.searchButton), onClick: (0, ramda_1.pipe)(ramda_1.T, setIsOpen), size: "large" },
52
52
  react_1.default.createElement(Search_1.default, null)));
53
53
  };
54
54
  exports.ExpandableSearchInput = ExpandableSearchInput;
@@ -0,0 +1,9 @@
1
+ const styles = {"searchButton":"ExpandableSearchInput-searchButton--Quegj","input":"ExpandableSearchInput-input--ZVai5","startAdornment":"ExpandableSearchInput-startAdornment--1qJKE","endAdornment":"ExpandableSearchInput-endAdornment--YHXxA"};
2
+ if (typeof document !== 'undefined') {
3
+ const head = document.head || document.getElementsByTagName('head')[0]
4
+ const style = document.createElement('style');
5
+ style.type = 'text/css'
6
+ style.innerHTML = `.ExpandableSearchInput-searchButton--Quegj{padding:8px}.ExpandableSearchInput-input--ZVai5{background:rgba(0,0,0,.03) 2px;flex:1 1;font-size:14px;margin-right:4px;max-width:350px;min-width:160px;padding:4px 0}.ExpandableSearchInput-startAdornment--1qJKE{color:rgba(0,0,0,.54);padding-left:8px}.ExpandableSearchInput-endAdornment--YHXxA{margin-right:4px}`;
7
+ head.appendChild(style);
8
+ }
9
+ module.exports = styles;
@@ -0,0 +1,9 @@
1
+ const styles = {"attribute":"SegmentsTable-attribute--xdeVk"};
2
+ if (typeof document !== 'undefined') {
3
+ const head = document.head || document.getElementsByTagName('head')[0]
4
+ const style = document.createElement('style');
5
+ style.type = 'text/css'
6
+ style.innerHTML = `.SegmentsTable-attribute--xdeVk{align-items:center;color:var(--mui-palette-text-primary);display:flex;font-size:13px;font-weight:400;height:100%;line-height:15px;overflow:hidden;padding:0 16px;position:relative;white-space:nowrap}.SegmentsTable-attribute--xdeVk:after{background:linear-gradient(90deg,hsla(0,0%,100%,.2),#fff);content:"";height:100%;pointer-events:none;position:absolute;right:0;top:0;width:40px}`;
7
+ head.appendChild(style);
8
+ }
9
+ module.exports = styles;
@@ -0,0 +1,13 @@
1
+ import React, { RefObject } from 'react';
2
+ import { Segment } from '@reltio/mdm-sdk';
3
+ import { Sorting } from '../types/basicTable';
4
+ type Props = {
5
+ width: number;
6
+ height: number;
7
+ segments: Segment[];
8
+ basicTableRef?: RefObject<HTMLDivElement>;
9
+ onSort: (field: string) => void;
10
+ sorting?: Sorting;
11
+ };
12
+ export declare const SegmentsTable: ({ width, height, segments, basicTableRef, onSort, sorting }: Props) => React.JSX.Element;
13
+ export {};
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.SegmentsTable = void 0;
30
+ var react_1 = __importStar(require("react"));
31
+ var ui_i18n_1 = __importDefault(require("ui-i18n"));
32
+ var BasicTable_1 = require("../BasicTable");
33
+ var helpers_1 = require("./helpers");
34
+ var HeadCellRenderer_1 = require("./components/HeadCellRenderer");
35
+ var AttributeCellRenderer_1 = require("./components/AttributeCellRenderer");
36
+ var LabelCellRenderer_1 = require("./components/LabelCellRenderer");
37
+ var AudienceCountCellRenderer_1 = require("./components/AudienceCountCellRenderer");
38
+ var BarCellRenderer_1 = require("./components/BarCellRenderer");
39
+ var BarHeadCellRenderer_1 = require("./components/BarHeadCellRenderer");
40
+ var SegmentsTable_module_css_1 = __importDefault(require("./SegmentsTable.module.css"));
41
+ var SegmentsTable = function (_a) {
42
+ var width = _a.width, height = _a.height, segments = _a.segments, basicTableRef = _a.basicTableRef, onSort = _a.onSort, sorting = _a.sorting;
43
+ var containerStyle = (0, react_1.useMemo)(function () { return ({
44
+ width: width,
45
+ height: height
46
+ }); }, [width, height]);
47
+ var maxCount = (0, react_1.useMemo)(function () { return Math.max.apply(Math, segments.map(function (item) { return item.count; })); }, [segments]);
48
+ var headData = (0, react_1.useMemo)(function () { return [
49
+ {
50
+ id: 'label',
51
+ label: ui_i18n_1.default.text('Segments'),
52
+ resizable: false,
53
+ minWidth: 130,
54
+ sortable: true,
55
+ initialWidth: width * 0.34,
56
+ headCellRenderer: HeadCellRenderer_1.HeadCellRenderer,
57
+ rowCellValueRenderer: LabelCellRenderer_1.LabelCellRenderer
58
+ },
59
+ {
60
+ id: 'refreshedOn',
61
+ label: ui_i18n_1.default.text('Refreshed On'),
62
+ resizable: false,
63
+ minWidth: 160,
64
+ initialWidth: width * 0.18,
65
+ autoResize: false,
66
+ headCellRenderer: HeadCellRenderer_1.HeadCellRenderer,
67
+ rowCellValueRenderer: AttributeCellRenderer_1.AttributeCellRenderer
68
+ },
69
+ {
70
+ id: 'audienceCount',
71
+ label: ui_i18n_1.default.text('Audience Count'),
72
+ resizable: false,
73
+ minWidth: 130,
74
+ initialWidth: width * 0.14,
75
+ autoResize: false,
76
+ headCellRenderer: HeadCellRenderer_1.HeadCellRenderer,
77
+ rowCellValueRenderer: AudienceCountCellRenderer_1.AudienceCountCellRenderer
78
+ },
79
+ {
80
+ id: 'audienceCountBar',
81
+ label: '',
82
+ resizable: false,
83
+ minWidth: 130,
84
+ initialWidth: width * 0.34,
85
+ maxCount: maxCount,
86
+ headCellRenderer: BarHeadCellRenderer_1.BarHeadCellRenderer,
87
+ rowCellValueRenderer: BarCellRenderer_1.BarCellRenderer
88
+ }
89
+ ]; }, [width, maxCount]);
90
+ var context = (0, react_1.useMemo)(function () { return ({
91
+ maxCount: maxCount
92
+ }); }, [maxCount]);
93
+ var rowsData = (0, react_1.useMemo)(function () { return (0, helpers_1.getSegmentTableData)(segments); }, [segments]);
94
+ var handleSort = (0, react_1.useCallback)(function (field) {
95
+ onSort(field);
96
+ }, [onSort]);
97
+ return (react_1.default.createElement("div", { style: containerStyle, className: SegmentsTable_module_css_1.default.container },
98
+ react_1.default.createElement(BasicTable_1.BasicTable, { sorting: sorting, onSort: handleSort, columnsData: headData, rowsData: rowsData, headRowHeight: 48, getRowCellHeight: null, defaultColumnWidth: 100, defaultColumnMinWidth: 100, ref: basicTableRef, context: context })));
99
+ };
100
+ exports.SegmentsTable = SegmentsTable;
@@ -0,0 +1,9 @@
1
+ const styles = {"container":"SegmentsTable-container--LfVXz"};
2
+ if (typeof document !== 'undefined') {
3
+ const head = document.head || document.getElementsByTagName('head')[0]
4
+ const style = document.createElement('style');
5
+ style.type = 'text/css'
6
+ style.innerHTML = `.SegmentsTable-container--LfVXz{display:flex;flex-direction:column}`;
7
+ head.appendChild(style);
8
+ }
9
+ module.exports = styles;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,170 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ var react_1 = __importDefault(require("react"));
54
+ var react_2 = require("@testing-library/react");
55
+ var SegmentsTable_1 = require("./SegmentsTable");
56
+ var mdm_sdk_1 = require("@reltio/mdm-sdk");
57
+ var user_event_1 = __importDefault(require("@testing-library/user-event"));
58
+ var test_utils_1 = require("../test-utils");
59
+ var mockSegments = [
60
+ {
61
+ uri: 'savedSearches/0BDCmca',
62
+ name: 'Test Segment 1',
63
+ description: '',
64
+ query: "filter=equals(entity.type%2C'configuration%2FentityTypes%2FHCO')",
65
+ type: mdm_sdk_1.SavedSearchType.SEGMENTATION,
66
+ isFavorite: true,
67
+ uiState: {
68
+ groups: [
69
+ {
70
+ operator: 'and',
71
+ entityType: 'configuration/entityTypes/HCO',
72
+ id: 'Qvg_2OeFm7UkX19-9C2jC'
73
+ }
74
+ ]
75
+ },
76
+ createDate: 1730795566249,
77
+ updateDate: 1730795573955,
78
+ isPublic: true,
79
+ owner: 'test.test',
80
+ count: 10000
81
+ },
82
+ {
83
+ uri: 'savedSearches/0BXFqDH',
84
+ name: 'Test Segment 2',
85
+ description: '',
86
+ query: "filter=equals(entity.type%2C'configuration%2FentityTypes%2FHCO')",
87
+ type: mdm_sdk_1.SavedSearchType.SEGMENTATION,
88
+ isFavorite: false,
89
+ uiState: {
90
+ groups: [
91
+ {
92
+ operator: 'and',
93
+ entityType: 'configuration/entityTypes/HCO',
94
+ id: 'SWLihLs4pRtsGpwWPXe8M'
95
+ }
96
+ ]
97
+ },
98
+ createDate: 1729868922843,
99
+ updateDate: 1729869197093,
100
+ isPublic: true,
101
+ owner: 'test.test',
102
+ count: 20000
103
+ }
104
+ ];
105
+ var defaultProps = {
106
+ width: 1920,
107
+ height: 1080,
108
+ segments: mockSegments,
109
+ onSort: jest.fn()
110
+ };
111
+ var setUp = function (props) {
112
+ if (props === void 0) { props = {}; }
113
+ var user = user_event_1.default.setup();
114
+ return __assign({ user: user }, (0, react_2.render)(react_1.default.createElement(SegmentsTable_1.SegmentsTable, __assign({}, defaultProps, props))));
115
+ };
116
+ describe('SegmentsTable tests', function () {
117
+ var unmockTableSizing;
118
+ beforeAll(function () {
119
+ unmockTableSizing = (0, test_utils_1.mockBasicTableSizing)();
120
+ });
121
+ afterAll(function () {
122
+ unmockTableSizing();
123
+ });
124
+ beforeEach(function () {
125
+ jest.clearAllMocks();
126
+ });
127
+ it('renders table with correct columns', function () {
128
+ setUp();
129
+ expect(react_2.screen.getByText('Segments')).toBeInTheDocument();
130
+ expect(react_2.screen.getByText('Refreshed On')).toBeInTheDocument();
131
+ expect(react_2.screen.getByText('Audience Count')).toBeInTheDocument();
132
+ });
133
+ it('displays segment data correctly', function () {
134
+ setUp();
135
+ expect(react_2.screen.getByText('Test Segment 1')).toBeInTheDocument();
136
+ expect(react_2.screen.getByText('Test Segment 2')).toBeInTheDocument();
137
+ expect(react_2.screen.getByText('10.0K')).toBeInTheDocument();
138
+ expect(react_2.screen.getAllByText('20.0K')).toHaveLength(2);
139
+ });
140
+ it('calls onSort when clicking sortable column header', function () { return __awaiter(void 0, void 0, void 0, function () {
141
+ var user, segmentsHeader;
142
+ return __generator(this, function (_a) {
143
+ switch (_a.label) {
144
+ case 0:
145
+ user = setUp().user;
146
+ segmentsHeader = react_2.screen.getByText('Segments');
147
+ return [4 /*yield*/, user.click(segmentsHeader)];
148
+ case 1:
149
+ _a.sent();
150
+ expect(defaultProps.onSort).toHaveBeenCalledWith('label');
151
+ return [2 /*return*/];
152
+ }
153
+ });
154
+ }); });
155
+ it('shows star icon for favorite segments', function () {
156
+ setUp();
157
+ var starIcons = document.querySelectorAll('.starIcon');
158
+ expect(starIcons[0]).toHaveClass('starIconActive');
159
+ expect(starIcons[1]).not.toHaveClass('starIconActive');
160
+ });
161
+ it('displays formatted dates in Refreshed On column', function () {
162
+ setUp();
163
+ expect(react_2.screen.getByText('11/05/2024 8:32 AM')).toBeInTheDocument();
164
+ expect(react_2.screen.getByText('10/25/2024 3:13 PM')).toBeInTheDocument();
165
+ });
166
+ it('calculates max count correctly for bar visualization', function () {
167
+ setUp();
168
+ expect(react_2.screen.getAllByText('20.0K')).toHaveLength(2);
169
+ });
170
+ });
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ value?: string;
4
+ };
5
+ export declare const AttributeCellRenderer: ({ value }: Props) => React.JSX.Element;
6
+ export {};
@@ -0,0 +1,15 @@
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.AttributeCellRenderer = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var ExpandedValueTooltip_1 = require("../../../ExpandedValueTooltip");
9
+ var CellRenderer_module_css_1 = __importDefault(require("../../CellRenderer.module.css"));
10
+ var AttributeCellRenderer = function (_a) {
11
+ var _b = _a.value, value = _b === void 0 ? '' : _b;
12
+ return (react_1.default.createElement(ExpandedValueTooltip_1.ExpandedValueTooltip, { value: value },
13
+ react_1.default.createElement("div", { className: CellRenderer_module_css_1.default.attribute }, value)));
14
+ };
15
+ exports.AttributeCellRenderer = AttributeCellRenderer;
@@ -0,0 +1 @@
1
+ export { AttributeCellRenderer } from './AttributeCellRenderer';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AttributeCellRenderer = void 0;
4
+ var AttributeCellRenderer_1 = require("./AttributeCellRenderer");
5
+ Object.defineProperty(exports, "AttributeCellRenderer", { enumerable: true, get: function () { return AttributeCellRenderer_1.AttributeCellRenderer; } });
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ value: string;
4
+ };
5
+ export declare const AudienceCountCellRenderer: ({ value }: Props) => React.JSX.Element;
6
+ export {};
@@ -0,0 +1,15 @@
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.AudienceCountCellRenderer = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var ExpandedValueTooltip_1 = require("../../../ExpandedValueTooltip");
9
+ var AudienceCountCellRenderer_module_css_1 = __importDefault(require("./AudienceCountCellRenderer.module.css"));
10
+ var AudienceCountCellRenderer = function (_a) {
11
+ var value = _a.value;
12
+ return (react_1.default.createElement(ExpandedValueTooltip_1.ExpandedValueTooltip, { value: value },
13
+ react_1.default.createElement("div", { className: AudienceCountCellRenderer_module_css_1.default.countValue }, value)));
14
+ };
15
+ exports.AudienceCountCellRenderer = AudienceCountCellRenderer;
@@ -0,0 +1,9 @@
1
+ const styles = {"countValue":"AudienceCountCellRenderer-countValue--atqCe"};
2
+ if (typeof document !== 'undefined') {
3
+ const head = document.head || document.getElementsByTagName('head')[0]
4
+ const style = document.createElement('style');
5
+ style.type = 'text/css'
6
+ style.innerHTML = `.AudienceCountCellRenderer-countValue--atqCe{align-items:center;color:var(--mui-palette-text-primary);display:flex;font-size:13px;font-weight:400;height:100%;justify-content:end;line-height:15px;overflow:hidden;padding:0 16px;white-space:nowrap}`;
7
+ head.appendChild(style);
8
+ }
9
+ module.exports = styles;
@@ -0,0 +1 @@
1
+ export { AudienceCountCellRenderer } from './AudienceCountCellRenderer';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AudienceCountCellRenderer = void 0;
4
+ var AudienceCountCellRenderer_1 = require("./AudienceCountCellRenderer");
5
+ Object.defineProperty(exports, "AudienceCountCellRenderer", { enumerable: true, get: function () { return AudienceCountCellRenderer_1.AudienceCountCellRenderer; } });
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ value: number;
4
+ columnData: {
5
+ maxCount: number;
6
+ };
7
+ };
8
+ export declare const BarCellRenderer: ({ value, columnData }: Props) => React.JSX.Element;
9
+ export {};
@@ -0,0 +1,16 @@
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.BarCellRenderer = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var ColorBar_1 = require("../../../ColorBar");
9
+ var BarCellRenderer_module_css_1 = __importDefault(require("./BarCellRenderer.module.css"));
10
+ var BarCellRenderer = function (_a) {
11
+ var value = _a.value, columnData = _a.columnData;
12
+ return (react_1.default.createElement("div", { className: BarCellRenderer_module_css_1.default.container },
13
+ react_1.default.createElement("div", { className: BarCellRenderer_module_css_1.default.colorBarContainer },
14
+ react_1.default.createElement(ColorBar_1.ColorBar, { width: value, maxWidth: columnData.maxCount }))));
15
+ };
16
+ exports.BarCellRenderer = BarCellRenderer;
@@ -0,0 +1,9 @@
1
+ const styles = {"container":"BarCellRenderer-container--AEzOK","colorBarContainer":"BarCellRenderer-colorBarContainer---yasX"};
2
+ if (typeof document !== 'undefined') {
3
+ const head = document.head || document.getElementsByTagName('head')[0]
4
+ const style = document.createElement('style');
5
+ style.type = 'text/css'
6
+ style.innerHTML = `.BarCellRenderer-container--AEzOK{align-items:center;display:flex;height:100%;padding:0 16px}.BarCellRenderer-colorBarContainer---yasX{height:20px;position:relative;width:100%}.BarCellRenderer-colorBarContainer---yasX>div{background-color:#0072ce;opacity:1}`;
7
+ head.appendChild(style);
8
+ }
9
+ module.exports = styles;
@@ -0,0 +1 @@
1
+ export { BarCellRenderer } from './BarCellRenderer';