@reltio/components 1.4.2044 → 1.4.2046

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 (175) hide show
  1. package/AttributesFiltersBuilder/AttributesFiltersBuilder.test.js +72 -50
  2. package/BasicTable/BasicTable.test.js +232 -278
  3. package/BlobRenderer/BlobRenderer.js +1 -1
  4. package/ConnectionRelationTypeSelector/ConnectionRelationTypeSelector.test.js +125 -111
  5. package/DateIntervalSelector/DateIntervalSelector.test.js +87 -65
  6. package/DefaultCellValueRenderer/DefaultCellValueRenderer.js +1 -1
  7. package/DefaultCellValueRenderer/DefaultCellValueRenderer.test.js +16 -46
  8. package/DeleteButton/DeleteButton.spec.js +53 -15
  9. package/DependentLookupEditor/DependentLookupEditor.test.js +555 -807
  10. package/Drawer/Drawer.test.js +9 -20
  11. package/DropDownEditor/DropDownEditor.test.js +81 -29
  12. package/DropDownMenuButton/DropDownMenuButton.spec.js +101 -70
  13. package/DropDownSelector/DropDownSelector.test.js +159 -30
  14. package/EditModeAttributesFactory/EditModeAttributesFactory.test.js +143 -0
  15. package/EditModeAttributesList/EditModeAttributesList.test.js +277 -224
  16. package/EditModeAttributesList/attributes.test-data.d.ts +0 -11
  17. package/EditModeAttributesList/attributes.test-data.js +1 -1
  18. package/EditModeAttributesPager/EditModeAttributesPager.test.js +698 -234
  19. package/EditModeAttributesPager/helpers.test.js +2 -12
  20. package/EditModeAttributesView/EditModeAttributesView.test.js +263 -157
  21. package/EditModeComplexAttribute/EditModeComplexAttribute.js +1 -1
  22. package/EditModeComplexAttribute/EditModeComplexAttribute.test.js +313 -298
  23. package/EditModeComplexAttribute/nestedAttrType.test-data.d.ts +0 -5
  24. package/EditModeComplexAttribute/nestedAttrType.test-data.js +3 -44
  25. package/EmptyState/EmptyState.test.js +99 -38
  26. package/EntityCreator/EntityCreator.test.js +68 -35
  27. package/EntitySelector/EntitySelector.js +1 -1
  28. package/EntitySelector/EntitySelector.test.js +275 -422
  29. package/EntityTypeIcon/EntityTypeIcon.test.js +16 -16
  30. package/EntityTypesSelector/EntityTypesSelector.test.js +62 -21
  31. package/ErrorBoundary/ErrorBoundary.test.js +19 -17
  32. package/ErrorMessage/ErrorMessage.js +1 -1
  33. package/ErrorPopup/ErrorPopup.test.js +72 -25
  34. package/ErrorWrapper/ErrorWrapper.test.js +10 -9
  35. package/ExpandedValueTooltip/ExpandedValueTooltip.test.js +111 -37
  36. package/FileTypeEditor/FileTypeEditor.test.js +95 -64
  37. package/FilterValueEditor/FilterValueEditor.test.js +183 -157
  38. package/FilterValueEditor/components/RangeDataTypeValueEditor/RangeDataTypeValueEditor.js +2 -2
  39. package/HierarchicalAttributeTooltip/HierarchicalAttributeTooltip.test.js +114 -24
  40. package/HierarchyNodeTitle/HierarchyNodeTitle.test.js +61 -100
  41. package/OvIcon/OvIcon.js +2 -2
  42. package/ProfileCard/components/ProfileCardPlaceholder/ProfileCardPlaceholder.js +2 -2
  43. package/ShowLess/ShowLess.js +1 -1
  44. package/SimpleAttributeEditor/SimpleAttributeEditor.js +2 -2
  45. package/UploadFileButton/components/UploadMode/UploadMode.js +1 -1
  46. package/cjs/AttributesFiltersBuilder/AttributesFiltersBuilder.test.js +72 -50
  47. package/cjs/BasicTable/BasicTable.test.js +230 -299
  48. package/cjs/BlobRenderer/BlobRenderer.js +1 -1
  49. package/cjs/ConnectionRelationTypeSelector/ConnectionRelationTypeSelector.test.js +125 -111
  50. package/cjs/DateIntervalSelector/DateIntervalSelector.test.js +87 -65
  51. package/cjs/DefaultCellValueRenderer/DefaultCellValueRenderer.js +1 -1
  52. package/cjs/DefaultCellValueRenderer/DefaultCellValueRenderer.test.js +16 -46
  53. package/cjs/DeleteButton/DeleteButton.spec.js +53 -15
  54. package/cjs/DependentLookupEditor/DependentLookupEditor.test.js +569 -821
  55. package/cjs/Drawer/Drawer.test.js +10 -21
  56. package/cjs/DropDownEditor/DropDownEditor.test.js +81 -29
  57. package/cjs/DropDownMenuButton/DropDownMenuButton.spec.js +102 -71
  58. package/cjs/DropDownSelector/DropDownSelector.test.js +159 -30
  59. package/cjs/EditModeAttributesFactory/EditModeAttributesFactory.test.js +148 -0
  60. package/cjs/EditModeAttributesList/EditModeAttributesList.test.js +277 -224
  61. package/cjs/EditModeAttributesList/attributes.test-data.d.ts +0 -11
  62. package/cjs/EditModeAttributesList/attributes.test-data.js +1 -1
  63. package/cjs/EditModeAttributesPager/EditModeAttributesPager.test.js +696 -232
  64. package/cjs/EditModeAttributesPager/helpers.test.js +2 -12
  65. package/cjs/EditModeAttributesView/EditModeAttributesView.test.js +262 -156
  66. package/cjs/EditModeComplexAttribute/EditModeComplexAttribute.js +1 -1
  67. package/cjs/EditModeComplexAttribute/EditModeComplexAttribute.test.js +312 -297
  68. package/cjs/EditModeComplexAttribute/nestedAttrType.test-data.d.ts +0 -5
  69. package/cjs/EditModeComplexAttribute/nestedAttrType.test-data.js +3 -44
  70. package/cjs/EmptyState/EmptyState.test.js +98 -37
  71. package/cjs/EntityCreator/EntityCreator.test.js +69 -36
  72. package/cjs/EntitySelector/EntitySelector.js +1 -1
  73. package/cjs/EntitySelector/EntitySelector.test.js +274 -421
  74. package/cjs/EntityTypeIcon/EntityTypeIcon.test.js +17 -17
  75. package/cjs/EntityTypesSelector/EntityTypesSelector.test.js +62 -21
  76. package/cjs/ErrorBoundary/ErrorBoundary.test.js +19 -17
  77. package/cjs/ErrorMessage/ErrorMessage.js +1 -1
  78. package/cjs/ErrorPopup/ErrorPopup.test.js +71 -24
  79. package/cjs/ErrorWrapper/ErrorWrapper.test.js +10 -9
  80. package/cjs/ExpandedValueTooltip/ExpandedValueTooltip.test.js +111 -37
  81. package/cjs/FileTypeEditor/FileTypeEditor.test.js +95 -64
  82. package/cjs/FilterValueEditor/FilterValueEditor.test.js +182 -156
  83. package/cjs/FilterValueEditor/components/RangeDataTypeValueEditor/RangeDataTypeValueEditor.js +2 -2
  84. package/cjs/HierarchicalAttributeTooltip/HierarchicalAttributeTooltip.test.js +114 -24
  85. package/cjs/HierarchyNodeTitle/HierarchyNodeTitle.test.js +61 -100
  86. package/cjs/OvIcon/OvIcon.js +2 -2
  87. package/cjs/ProfileCard/components/ProfileCardPlaceholder/ProfileCardPlaceholder.js +2 -2
  88. package/cjs/ShowLess/ShowLess.js +1 -1
  89. package/cjs/SimpleAttributeEditor/SimpleAttributeEditor.js +2 -2
  90. package/cjs/UploadFileButton/components/UploadMode/UploadMode.js +1 -1
  91. package/cjs/contexts/ExpandedAttributesContext/useAttributeExpanded.test.js +25 -18
  92. package/cjs/contexts/MdmModuleContext/hooks.d.ts +2 -2
  93. package/cjs/contexts/ReloadDataContext/ReloadDataContext.spec.js +16 -53
  94. package/cjs/test-utils/TestStylesProvider.js +6 -5
  95. package/contexts/ExpandedAttributesContext/useAttributeExpanded.test.js +25 -18
  96. package/contexts/MdmModuleContext/hooks.d.ts +2 -2
  97. package/contexts/ReloadDataContext/ReloadDataContext.spec.js +16 -30
  98. package/package.json +2 -2
  99. package/test-utils/TestStylesProvider.js +3 -2
  100. package/AttributesFiltersBuilder/components/AttributeSelector/AttributeSelector.test.js +0 -101
  101. package/AttributesFiltersBuilder/components/RowActions/RowActions.test.js +0 -106
  102. package/BasicTable/IntegrationBasicTable.test.d.ts +0 -1
  103. package/BasicTable/IntegrationBasicTable.test.js +0 -203
  104. package/DependentLookupEditor/IntegrationDependentLookupEditor.test.d.ts +0 -1
  105. package/DependentLookupEditor/IntegrationDependentLookupEditor.test.js +0 -137
  106. package/DropDownMenuButton/components/DefaultMenuItemRenderer/DefaultMenuItemRenderer.spec.d.ts +0 -1
  107. package/DropDownMenuButton/components/DefaultMenuItemRenderer/DefaultMenuItemRenderer.spec.js +0 -32
  108. package/EditModeAttributesFactory/components/EditModeAttribute/EditModeAttribute.test.d.ts +0 -1
  109. package/EditModeAttributesFactory/components/EditModeAttribute/EditModeAttribute.test.js +0 -106
  110. package/EditModeAttributesPager/components/AttributeRenderer/AttributeRenderer.test.d.ts +0 -1
  111. package/EditModeAttributesPager/components/AttributeRenderer/AttributeRenderer.test.js +0 -338
  112. package/EditModeAttributesPager/components/AttributeRenderer/IntegrationAttributeRenderer.test.d.ts +0 -1
  113. package/EditModeAttributesPager/components/AttributeRenderer/IntegrationAttributeRenderer.test.js +0 -225
  114. package/EditModeAttributesPager/components/ImageLineRenderer/ImageLineRenderer.test.d.ts +0 -1
  115. package/EditModeAttributesPager/components/ImageLineRenderer/ImageLineRenderer.test.js +0 -47
  116. package/EditModeAttributesPager/components/SpecialRenderer/SpecialRenderer.test.d.ts +0 -1
  117. package/EditModeAttributesPager/components/SpecialRenderer/SpecialRenderer.test.js +0 -204
  118. package/EditModeAttributesView/IntegrationEditModeAttributesView.test.d.ts +0 -1
  119. package/EditModeAttributesView/IntegrationEditModeAttributesView.test.js +0 -246
  120. package/EditModeAttributesView/metadata.test-data.d.ts +0 -4
  121. package/EditModeAttributesView/metadata.test-data.js +0 -119
  122. package/EntityCreator/entityType.test-data.d.ts +0 -52
  123. package/EntityCreator/entityType.test-data.js +0 -188
  124. package/EntitySelector/components/ClearIndicator/ClearIndicator.test.d.ts +0 -1
  125. package/EntitySelector/components/ClearIndicator/ClearIndicator.test.js +0 -27
  126. package/EntitySelector/components/EntityOption/EntityOption.test.d.ts +0 -1
  127. package/EntitySelector/components/EntityOption/EntityOption.test.js +0 -79
  128. package/EntitySelector/components/Group/Group.test.d.ts +0 -1
  129. package/EntitySelector/components/Group/Group.test.js +0 -65
  130. package/EntitySelector/components/SingleValue/SingleValue.test.d.ts +0 -1
  131. package/EntitySelector/components/SingleValue/SingleValue.test.js +0 -78
  132. package/FilterValueEditor/components/RangeDataTypeValueEditor/RangeDataTypeValueEditor.test.d.ts +0 -1
  133. package/FilterValueEditor/components/RangeDataTypeValueEditor/RangeDataTypeValueEditor.test.js +0 -76
  134. package/cjs/AttributesFiltersBuilder/components/AttributeSelector/AttributeSelector.test.d.ts +0 -1
  135. package/cjs/AttributesFiltersBuilder/components/AttributeSelector/AttributeSelector.test.js +0 -106
  136. package/cjs/AttributesFiltersBuilder/components/RowActions/RowActions.test.d.ts +0 -1
  137. package/cjs/AttributesFiltersBuilder/components/RowActions/RowActions.test.js +0 -111
  138. package/cjs/BasicTable/IntegrationBasicTable.test.d.ts +0 -1
  139. package/cjs/BasicTable/IntegrationBasicTable.test.js +0 -208
  140. package/cjs/DependentLookupEditor/IntegrationDependentLookupEditor.test.d.ts +0 -1
  141. package/cjs/DependentLookupEditor/IntegrationDependentLookupEditor.test.js +0 -142
  142. package/cjs/DropDownMenuButton/components/DefaultMenuItemRenderer/DefaultMenuItemRenderer.spec.d.ts +0 -1
  143. package/cjs/DropDownMenuButton/components/DefaultMenuItemRenderer/DefaultMenuItemRenderer.spec.js +0 -37
  144. package/cjs/EditModeAttributesFactory/components/EditModeAttribute/EditModeAttribute.test.d.ts +0 -1
  145. package/cjs/EditModeAttributesFactory/components/EditModeAttribute/EditModeAttribute.test.js +0 -111
  146. package/cjs/EditModeAttributesPager/components/AttributeRenderer/AttributeRenderer.test.d.ts +0 -1
  147. package/cjs/EditModeAttributesPager/components/AttributeRenderer/AttributeRenderer.test.js +0 -343
  148. package/cjs/EditModeAttributesPager/components/AttributeRenderer/IntegrationAttributeRenderer.test.d.ts +0 -1
  149. package/cjs/EditModeAttributesPager/components/AttributeRenderer/IntegrationAttributeRenderer.test.js +0 -230
  150. package/cjs/EditModeAttributesPager/components/ImageLineRenderer/ImageLineRenderer.test.d.ts +0 -1
  151. package/cjs/EditModeAttributesPager/components/ImageLineRenderer/ImageLineRenderer.test.js +0 -52
  152. package/cjs/EditModeAttributesPager/components/SpecialRenderer/SpecialRenderer.test.d.ts +0 -1
  153. package/cjs/EditModeAttributesPager/components/SpecialRenderer/SpecialRenderer.test.js +0 -209
  154. package/cjs/EditModeAttributesView/IntegrationEditModeAttributesView.test.d.ts +0 -1
  155. package/cjs/EditModeAttributesView/IntegrationEditModeAttributesView.test.js +0 -251
  156. package/cjs/EditModeAttributesView/metadata.test-data.d.ts +0 -4
  157. package/cjs/EditModeAttributesView/metadata.test-data.js +0 -123
  158. package/cjs/EntityCreator/entityType.test-data.d.ts +0 -52
  159. package/cjs/EntityCreator/entityType.test-data.js +0 -191
  160. package/cjs/EntitySelector/components/ClearIndicator/ClearIndicator.test.d.ts +0 -1
  161. package/cjs/EntitySelector/components/ClearIndicator/ClearIndicator.test.js +0 -32
  162. package/cjs/EntitySelector/components/EntityOption/EntityOption.test.d.ts +0 -1
  163. package/cjs/EntitySelector/components/EntityOption/EntityOption.test.js +0 -84
  164. package/cjs/EntitySelector/components/Group/Group.test.d.ts +0 -1
  165. package/cjs/EntitySelector/components/Group/Group.test.js +0 -70
  166. package/cjs/EntitySelector/components/SingleValue/SingleValue.test.d.ts +0 -1
  167. package/cjs/EntitySelector/components/SingleValue/SingleValue.test.js +0 -83
  168. package/cjs/FilterValueEditor/components/RangeDataTypeValueEditor/RangeDataTypeValueEditor.test.d.ts +0 -1
  169. package/cjs/FilterValueEditor/components/RangeDataTypeValueEditor/RangeDataTypeValueEditor.test.js +0 -81
  170. package/cjs/contexts/CollaborationContext/CollaborationContextProvider.test.d.ts +0 -1
  171. package/cjs/contexts/CollaborationContext/CollaborationContextProvider.test.js +0 -104
  172. package/contexts/CollaborationContext/CollaborationContextProvider.test.d.ts +0 -1
  173. package/contexts/CollaborationContext/CollaborationContextProvider.test.js +0 -99
  174. /package/{AttributesFiltersBuilder/components/AttributeSelector/AttributeSelector.test.d.ts → EditModeAttributesFactory/EditModeAttributesFactory.test.d.ts} +0 -0
  175. /package/{AttributesFiltersBuilder/components/RowActions/RowActions.test.d.ts → cjs/EditModeAttributesFactory/EditModeAttributesFactory.test.d.ts} +0 -0
@@ -9,269 +9,733 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
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 = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
23
+ return g.next = verb(0), g["throw"] = verb(1), g["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
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
+ if (ar || !(i in from)) {
51
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
+ ar[i] = from[i];
53
+ }
54
+ }
55
+ return to.concat(ar || Array.prototype.slice.call(from));
56
+ };
57
+ var _a;
12
58
  import React from 'react';
13
- import { mount } from 'enzyme';
14
- import { DataTypes, ErrorSeverity, Mode } from '@reltio/mdm-sdk';
15
- import EditModeAttributesPager from './EditModeAttributesPager';
16
- import { BranchDecorator } from '../BranchDecorator';
17
- import { AttributeRenderer } from './components/AttributeRenderer';
18
- import { SpecialRenderer } from './components/SpecialRenderer';
19
- import { ImageLineRenderer } from './components/ImageLineRenderer';
20
- import { AttributeTitle } from '../AttributeTitle';
59
+ import { mockResizeObserver } from 'jsdom-testing-mocks';
60
+ import { act, render, screen, within } from '@testing-library/react';
61
+ import userEvent from '@testing-library/user-event';
62
+ import { LocalizationProvider } from '@mui/x-date-pickers';
63
+ import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment';
64
+ import { DataTypes, EntityAttrTypes, ErrorSource, ErrorType, Mode } from '@reltio/mdm-sdk';
21
65
  import { MdmModuleProvider } from '../contexts/MdmModuleContext';
22
- import { ScrollType, ScrollToElementContext } from '../contexts/ScrollToElementContext';
23
- jest.mock('./components/AttributeRenderer', function () { return ({
24
- AttributeRenderer: function () { return null; }
25
- }); });
26
- jest.mock('./components/SpecialRenderer', function () { return ({
27
- SpecialRenderer: function () { return null; }
28
- }); });
29
- jest.mock('./components/ImageLineRenderer', function () { return ({
30
- ImageLineRenderer: function (_a) {
66
+ import { FeaturesContext } from '../contexts/FeaturesContext';
67
+ import { HiddenAttributesContext } from '../contexts/HiddenAttributesContext';
68
+ import { HasDeletionsContext } from '../contexts/HasDeletionsContext';
69
+ import { PinnedAttributesContext } from '../contexts/PinnedAttributesContext';
70
+ import EditModeAttributesPager from './EditModeAttributesPager';
71
+ import { ScrollToElementContext, ScrollType } from '../contexts/ScrollToElementContext';
72
+ var defaultAttributeType = {
73
+ uri: 'configuration/entityTypes/HCP/attributes/Fruit',
74
+ type: 'String',
75
+ name: 'Fruit',
76
+ label: 'Fruit',
77
+ defaultValue: 'pineapple'
78
+ };
79
+ var defaultValues = [
80
+ { type: defaultAttributeType.uri, uri: 'entities/sIeHttl/attributes/Fruit/apple', value: 'apple', ov: true },
81
+ { type: defaultAttributeType.uri, uri: 'entities/sIeHttl/attributes/Fruit/kiwi', value: 'kiwi', ov: true },
82
+ { type: defaultAttributeType.uri, uri: 'entities/sIeHttl/attributes/Fruit/orange', value: 'orange', ov: false },
83
+ { type: defaultAttributeType.uri, uri: 'entities/sIeHttl/attributes/Fruit/banana', value: 'banana', ov: true },
84
+ { type: defaultAttributeType.uri, uri: 'entities/sIeHttl/attributes/Fruit/mango', value: 'mango', ov: true },
85
+ { type: defaultAttributeType.uri, uri: 'entities/sIeHttl/attributes/Fruit/avocado', value: 'avocado', ov: false }
86
+ ];
87
+ var entity = { uri: 'entities/sIeHttl', type: 'configuration/entityTypes/HCP' };
88
+ var modifiedEntities = (_a = {}, _a[entity.uri] = entity, _a);
89
+ var dependentLookups = { editors: {}, structure: {}, initedTypeUris: [] };
90
+ var metadata = {
91
+ roles: [{ uri: 'configuration/roles/OfficeStaff', description: '', label: 'Office Staff' }],
92
+ entityTypes: [{ uri: 'configuration/entityTypes/HCP', entityTypeRoleURIs: ['configuration/roles/OfficeStaff'] }]
93
+ };
94
+ var defaultMdmValues = { metadata: metadata, dependentLookups: dependentLookups, entity: entity, modifiedEntities: modifiedEntities };
95
+ var defaultMdmActions = { errorDeactivated: jest.fn(), requestNextPageOfAttributeValues: jest.fn() };
96
+ var defaultProps = {
97
+ attributeType: defaultAttributeType,
98
+ values: defaultValues,
99
+ mode: Mode.Editing,
100
+ parentUri: 'entities/sIeHttl',
101
+ showEmptyEditors: false,
102
+ onDeleteAttribute: jest.fn(),
103
+ onChangeAttribute: jest.fn(),
104
+ onAddAttributes: jest.fn()
105
+ };
106
+ var setUp = function (_a) {
107
+ var _b = _a === void 0 ? {} : _a, _c = _b.props, props = _c === void 0 ? defaultProps : _c, _d = _b.mdmValues, mdmValues = _d === void 0 ? defaultMdmValues : _d, _e = _b.mdmActions, mdmActions = _e === void 0 ? defaultMdmActions : _e, _f = _b.hiddenAttributesContextValue, hiddenAttributesContextValue = _f === void 0 ? {} : _f, _g = _b.pinnedAttributesContextValue, pinnedAttributesContextValue = _g === void 0 ? [] : _g, _h = _b.CustomProviders, CustomProviders = _h === void 0 ? React.Fragment : _h;
108
+ var user = userEvent.setup();
109
+ var Providers = function (_a) {
31
110
  var children = _a.children;
32
- return React.createElement("div", null, children);
33
- } //eslint-disable-line
34
- }); });
35
- describe('AttributesPager', function () {
36
- var attributeType = {
37
- uri: 'configuration/entityTypes/HCP/attributes/Simple',
38
- type: 'String',
39
- name: 'Simple',
40
- label: 'Simple label'
111
+ return (React.createElement(CustomProviders, null,
112
+ React.createElement(LocalizationProvider, { dateAdapter: AdapterMoment },
113
+ React.createElement(MdmModuleProvider, { values: mdmValues, actions: mdmActions },
114
+ React.createElement(HiddenAttributesContext.Provider, { value: hiddenAttributesContextValue },
115
+ React.createElement(PinnedAttributesContext.Provider, { value: pinnedAttributesContextValue },
116
+ React.createElement(FeaturesContext.Provider, { value: { showDescription: true } }, children)))))));
41
117
  };
42
- var values = [
43
- {
44
- type: attributeType.uri,
45
- uri: 'entities/sIeHttl/attributes/Simple/u123',
46
- value: '123',
47
- ov: true
48
- },
49
- {
50
- type: attributeType.uri,
51
- uri: 'entities/sIeHttl/attributes/Simple/u456',
52
- value: '456',
53
- ov: true
54
- },
55
- {
56
- type: attributeType.uri,
57
- uri: 'entities/sIeHttl/attributes/Simple/u789',
58
- value: '789',
59
- ov: false
60
- }
61
- ];
62
- var defaultMdmValues = {};
63
- var mdmActions = {
64
- errorDeactivated: jest.fn(),
65
- requestNextPageOfAttributeValues: jest.fn()
66
- };
67
- var defaultProps = {
68
- attributeType: attributeType,
69
- values: values,
70
- mode: Mode.Editing,
71
- parentUri: 'entities/sIeHttl',
72
- onDeleteAttribute: jest.fn(),
73
- onChangeAttribute: jest.fn()
74
- };
75
- var setUp = function (_a) {
76
- var _b = _a === void 0 ? {} : _a, _c = _b.props, props = _c === void 0 ? defaultProps : _c, _d = _b.mdmValues, mdmValues = _d === void 0 ? defaultMdmValues : _d, _e = _b.CustomProviders, CustomProviders = _e === void 0 ? React.Fragment : _e;
77
- return mount(React.createElement(CustomProviders, null,
78
- React.createElement(MdmModuleProvider, { values: mdmValues, actions: mdmActions },
79
- React.createElement(EditModeAttributesPager, __assign({}, props)))));
80
- };
81
- it('should use defaultMaxValues as "max" if "max" prop is not provided', function () {
82
- var mdmValues = { maxValuesInResponse: 56 };
83
- var component = setUp({ mdmValues: mdmValues });
84
- var attribute = component.find(AttributeRenderer);
85
- expect(attribute.prop('max')).toBe(56);
86
- });
87
- it('should use "max" prop if it is provided', function () {
88
- var props = __assign(__assign({}, defaultProps), { max: 7 });
89
- var mdmValues = { maxValuesInResponse: 56 };
90
- var component = setUp({ mdmValues: mdmValues, props: props });
91
- var attribute = component.find(AttributeRenderer);
92
- expect(attribute.prop('max')).toBe(7);
93
- });
94
- describe('AttributeRenderer behavior', function () {
95
- it('should render main parts', function () {
96
- var component = setUp();
97
- expect(component.find(BranchDecorator)).toHaveLength(0);
98
- var attribute = component.find(AttributeRenderer);
99
- expect(attribute).toHaveLength(1);
100
- expect(attribute.props()).toMatchObject(__assign(__assign({}, defaultProps), { values: values.filter(function (_a) {
101
- var ov = _a.ov;
102
- return ov === true;
103
- }) }));
118
+ return __assign(__assign({}, render(React.createElement(EditModeAttributesPager, __assign({}, props)), { wrapper: Providers })), { user: user });
119
+ };
120
+ describe('Edit mode attributes pager tests', function () {
121
+ var resizeObserver = mockResizeObserver();
122
+ describe('attribute renderer', function () {
123
+ it('should render title correctly', function () {
124
+ setUp();
125
+ var title = screen.getByTestId('reltio-attribute-label');
126
+ expect(title).toHaveTextContent('Fruit');
127
+ expect(title).not.toHaveTextContent('*');
128
+ });
129
+ it('should render title correctly if attribute type is required', function () {
130
+ var attributeType = __assign(__assign({}, defaultAttributeType), { required: true });
131
+ var props = __assign(__assign({}, defaultProps), { attributeType: attributeType });
132
+ setUp({ props: props });
133
+ var title = screen.getByTestId('reltio-attribute-label');
134
+ expect(title).toHaveTextContent('Fruit');
135
+ expect(title).toHaveTextContent('*');
136
+ });
137
+ it('should render description correctly', function () { return __awaiter(void 0, void 0, void 0, function () {
138
+ var attributeType, props, user;
139
+ return __generator(this, function (_a) {
140
+ switch (_a.label) {
141
+ case 0:
142
+ attributeType = __assign(__assign({}, defaultAttributeType), { description: 'The soft, pulpy part of a flowering plant that contains seeds' });
143
+ props = __assign(__assign({}, defaultProps), { attributeType: attributeType });
144
+ user = setUp({ props: props }).user;
145
+ expect(screen.queryByRole('tooltip')).not.toBeInTheDocument();
146
+ return [4 /*yield*/, user.hover(screen.getByTestId('reltio-description-icon'))];
147
+ case 1:
148
+ _a.sent();
149
+ screen.getByText('The soft, pulpy part of a flowering plant that contains seeds');
150
+ return [2 /*return*/];
151
+ }
152
+ });
153
+ }); });
154
+ it('should not render description if attribute does not have it', function () { return __awaiter(void 0, void 0, void 0, function () {
155
+ return __generator(this, function (_a) {
156
+ setUp();
157
+ expect(screen.queryByTestId('reltio-description-icon')).not.toBeInTheDocument();
158
+ return [2 /*return*/];
159
+ });
160
+ }); });
161
+ it('should render control attribute icon if controlAttributes has attribute type uri', function () {
162
+ var mdmValues = __assign(__assign({}, defaultMdmValues), { controlAttributes: [
163
+ 'configuration/entityTypes/HCP/attributes/Vegatable',
164
+ 'configuration/entityTypes/HCP/attributes/Fruit'
165
+ ] });
166
+ setUp({ mdmValues: mdmValues });
167
+ screen.getByTestId('reltio-control-attribute-icon');
168
+ });
169
+ it('should not render control attribute icon if controlAttributes does not have attribute type uri', function () {
170
+ setUp();
171
+ expect(screen.queryByTestId('reltio-control-attribute-icon')).not.toBeInTheDocument();
104
172
  });
105
- it('should set correct props for Attribute component', function () {
106
- var props = __assign(__assign({}, defaultProps), { drawLines: true, showEmptyEditors: true, onAddAttributes: jest.fn(), onChangeAttribute: jest.fn(), onDeleteAttribute: jest.fn(), additionalControlsRenderer: jest.fn() });
107
- var component = setUp({ props: props });
108
- var attribute = component.find(AttributeRenderer);
109
- expect(attribute).toHaveLength(1);
110
- expect(attribute.props()).toMatchObject(__assign(__assign({}, props), { values: values.filter(function (_a) {
111
- var ov = _a.ov;
112
- return ov === true;
113
- }), nonVisibleValues: [values[2]] }));
114
- expect(component.find(AttributeTitle)).toHaveLength(0);
173
+ it('should render ov icon and non ov values correctly', function () { return __awaiter(void 0, void 0, void 0, function () {
174
+ var user, nonOvValues;
175
+ return __generator(this, function (_a) {
176
+ switch (_a.label) {
177
+ case 0:
178
+ user = setUp().user;
179
+ expect(screen.queryByRole('tooltip')).not.toBeInTheDocument();
180
+ return [4 /*yield*/, user.hover(screen.getByText('+ 2'))];
181
+ case 1:
182
+ _a.sent();
183
+ nonOvValues = screen.getAllByTestId('non-ov-value');
184
+ expect(nonOvValues).toHaveLength(2);
185
+ expect(nonOvValues[0]).toHaveTextContent('orange');
186
+ expect(nonOvValues[1]).toHaveTextContent('avocado');
187
+ return [2 /*return*/];
188
+ }
189
+ });
190
+ }); });
191
+ it('should not render ov icon if showNonOv is true', function () { return __awaiter(void 0, void 0, void 0, function () {
192
+ var props;
193
+ return __generator(this, function (_a) {
194
+ props = __assign(__assign({}, defaultProps), { showNonOv: true });
195
+ setUp({ props: props });
196
+ expect(screen.queryByTestId('ov-icon')).not.toBeInTheDocument();
197
+ return [2 /*return*/];
198
+ });
199
+ }); });
200
+ it('should render cardinality message correctly', function () {
201
+ var attributeType = {
202
+ uri: 'configuration/entityTypes/HCP/attributes/Int',
203
+ type: 'Int',
204
+ name: 'Int',
205
+ label: 'Int',
206
+ cardinality: { minValue: 10 }
207
+ };
208
+ var values = [{ type: attributeType.uri, uri: 'entities/sIeHttl/attributes/Int/1', value: 5, ov: true }];
209
+ var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: values });
210
+ setUp({ props: props });
211
+ screen.getByText('This attribute can have minimum 10 values');
212
+ });
213
+ it('should render, expand and collapse attribute values correctly when max is less than values count', function () { return __awaiter(void 0, void 0, void 0, function () {
214
+ var props, user, attributes;
215
+ return __generator(this, function (_a) {
216
+ switch (_a.label) {
217
+ case 0:
218
+ props = __assign(__assign({}, defaultProps), { max: 3 });
219
+ user = setUp({ props: props }).user;
220
+ attributes = screen.getAllByTestId('reltio-edit-attribute');
221
+ expect(attributes).toHaveLength(3);
222
+ expect(within(attributes[0]).getByRole('textbox')).toHaveValue('apple');
223
+ expect(within(attributes[1]).getByRole('textbox')).toHaveValue('kiwi');
224
+ expect(within(attributes[2]).getByRole('textbox')).toHaveValue('banana');
225
+ expect(screen.queryByText('Show less')).not.toBeInTheDocument();
226
+ return [4 /*yield*/, user.click(screen.getByText('Show 1 more of remaining 1 value'))];
227
+ case 1:
228
+ _a.sent();
229
+ attributes = screen.getAllByTestId('reltio-edit-attribute');
230
+ expect(attributes).toHaveLength(4);
231
+ expect(within(attributes[3]).getByRole('textbox')).toHaveValue('mango');
232
+ expect(screen.queryByTestId('show-more')).not.toBeInTheDocument();
233
+ return [4 /*yield*/, user.click(screen.getByText('Show less'))];
234
+ case 2:
235
+ _a.sent();
236
+ attributes = screen.getAllByTestId('reltio-edit-attribute');
237
+ expect(attributes).toHaveLength(3);
238
+ return [2 /*return*/];
239
+ }
240
+ });
241
+ }); });
242
+ it('should render, expand and collapse attribute values correctly when showNonOv is true and max is less than values count', function () { return __awaiter(void 0, void 0, void 0, function () {
243
+ var mdmValues, props, user, attributes;
244
+ return __generator(this, function (_a) {
245
+ switch (_a.label) {
246
+ case 0:
247
+ mdmValues = __assign(__assign({}, defaultMdmValues), { maxValuesInResponse: 2 });
248
+ props = __assign(__assign({}, defaultProps), { showNonOv: true });
249
+ user = setUp({ props: props, mdmValues: mdmValues }).user;
250
+ attributes = screen.getAllByTestId('reltio-edit-attribute');
251
+ expect(attributes).toHaveLength(2);
252
+ expect(within(attributes[0]).getByRole('textbox')).toHaveValue('apple');
253
+ expect(within(attributes[1]).getByRole('textbox')).toHaveValue('kiwi');
254
+ return [4 /*yield*/, user.click(screen.getByText('Show 2 more of remaining 4 value'))];
255
+ case 1:
256
+ _a.sent();
257
+ attributes = screen.getAllByTestId('reltio-edit-attribute');
258
+ expect(attributes).toHaveLength(4);
259
+ expect(within(attributes[2]).getByRole('textbox')).toHaveValue('orange');
260
+ expect(within(attributes[3]).getByRole('textbox')).toHaveValue('banana');
261
+ return [4 /*yield*/, user.click(screen.getByText('Show 2 more of remaining 2 value'))];
262
+ case 2:
263
+ _a.sent();
264
+ attributes = screen.getAllByTestId('reltio-edit-attribute');
265
+ expect(attributes).toHaveLength(6);
266
+ expect(within(attributes[4]).getByRole('textbox')).toHaveValue('mango');
267
+ expect(within(attributes[5]).getByRole('textbox')).toHaveValue('avocado');
268
+ expect(screen.queryByTestId('show-more')).not.toBeInTheDocument();
269
+ return [4 /*yield*/, user.click(screen.getByText('Show less'))];
270
+ case 3:
271
+ _a.sent();
272
+ attributes = screen.getAllByTestId('reltio-edit-attribute');
273
+ expect(attributes).toHaveLength(2);
274
+ screen.getByText('Show 2 more of remaining 4 value');
275
+ return [2 /*return*/];
276
+ }
277
+ });
278
+ }); });
279
+ it('should render attribute values correctly if max is not passed', function () {
280
+ setUp();
281
+ var attributes = screen.getAllByTestId('reltio-edit-attribute');
282
+ expect(attributes).toHaveLength(4);
283
+ expect(within(attributes[0]).getByRole('textbox')).toHaveValue('apple');
284
+ expect(within(attributes[1]).getByRole('textbox')).toHaveValue('kiwi');
285
+ expect(within(attributes[2]).getByRole('textbox')).toHaveValue('banana');
286
+ expect(within(attributes[3]).getByRole('textbox')).toHaveValue('mango');
287
+ expect(screen.queryByTestId('show-more')).not.toBeInTheDocument();
288
+ expect(screen.queryByTestId('show-less')).not.toBeInTheDocument();
115
289
  });
116
- it('should set values prop with ov:false for Attribute component if showNonOv is true', function () {
290
+ it('should render attribute values correctly if showNonOv prop is true and max is not passed', function () {
117
291
  var props = __assign(__assign({}, defaultProps), { showNonOv: true });
118
- var component = setUp({ props: props });
119
- var attribute = component.find(AttributeRenderer);
120
- expect(attribute.props()).toMatchObject(__assign(__assign({}, props), { nonVisibleValues: [] }));
292
+ setUp({ props: props });
293
+ var attributes = screen.getAllByTestId('reltio-edit-attribute');
294
+ expect(attributes).toHaveLength(6);
295
+ expect(within(attributes[0]).getByRole('textbox')).toHaveValue('apple');
296
+ expect(within(attributes[1]).getByRole('textbox')).toHaveValue('kiwi');
297
+ expect(within(attributes[2]).getByRole('textbox')).toHaveValue('orange');
298
+ expect(within(attributes[3]).getByRole('textbox')).toHaveValue('banana');
299
+ expect(within(attributes[4]).getByRole('textbox')).toHaveValue('mango');
300
+ expect(within(attributes[5]).getByRole('textbox')).toHaveValue('avocado');
301
+ expect(screen.queryByTestId('show-more')).not.toBeInTheDocument();
302
+ expect(screen.queryByTestId('show-less')).not.toBeInTheDocument();
121
303
  });
122
- it('should not send highlightedError to AttributeRenderer if error has uri', function () {
304
+ it('should return null if there are no values and showEmptyEditors is falsy', function () {
305
+ var props = __assign(__assign({}, defaultProps), { values: [], showEmptyEditors: false });
306
+ var container = setUp({ props: props }).container;
307
+ expect(container).toBeEmptyDOMElement();
308
+ });
309
+ it('should render special "empty" attribute if there are no values and showEmptyEditors is true', function () {
310
+ var props = __assign(__assign({}, defaultProps), { values: [], showEmptyEditors: true });
311
+ setUp({ props: props });
312
+ expect(within(screen.getByTestId('reltio-edit-attribute')).getByRole('textbox')).toHaveValue('');
313
+ });
314
+ it('should render special "empty" attribute if there are no values and attribute are required', function () {
315
+ var attributeType = __assign(__assign({}, defaultAttributeType), { required: true });
316
+ var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: [], showEmptyEditors: true });
317
+ setUp({ props: props });
318
+ expect(within(screen.getByTestId('reltio-edit-attribute')).getByRole('textbox')).toHaveValue('');
319
+ });
320
+ it('should add 2 attributes on add one more button click for simple "empty" attribute', function () { return __awaiter(void 0, void 0, void 0, function () {
321
+ var props, user;
322
+ return __generator(this, function (_a) {
323
+ switch (_a.label) {
324
+ case 0:
325
+ props = __assign(__assign({}, defaultProps), { values: [], showEmptyEditors: true });
326
+ user = setUp({ props: props }).user;
327
+ return [4 /*yield*/, user.click(screen.getByTestId('reltio-add-one-more-simple-attribute-button'))];
328
+ case 1:
329
+ _a.sent();
330
+ expect(props.onAddAttributes).toHaveBeenCalledWith([
331
+ {
332
+ attributeType: {
333
+ uri: 'configuration/entityTypes/HCP/attributes/Fruit',
334
+ type: 'String',
335
+ name: 'Fruit',
336
+ label: 'Fruit'
337
+ },
338
+ index: Infinity,
339
+ parentUri: props.parentUri
340
+ },
341
+ {
342
+ attributeType: props.attributeType,
343
+ index: Infinity,
344
+ parentUri: props.parentUri
345
+ }
346
+ ]);
347
+ return [2 /*return*/];
348
+ }
349
+ });
350
+ }); });
351
+ it('should add 1 attribute on on add one more button click for Nested "empty" attribute', function () { return __awaiter(void 0, void 0, void 0, function () {
352
+ var attributeType, props, user;
353
+ return __generator(this, function (_a) {
354
+ switch (_a.label) {
355
+ case 0:
356
+ attributeType = __assign(__assign({}, defaultAttributeType), { type: 'Nested' });
357
+ props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: [], showEmptyEditors: true });
358
+ user = setUp({ props: props }).user;
359
+ return [4 /*yield*/, user.click(screen.getByText('Create attribute'))];
360
+ case 1:
361
+ _a.sent();
362
+ expect(props.onAddAttributes).toHaveBeenCalledWith([
363
+ {
364
+ parentUri: props.parentUri,
365
+ index: Infinity,
366
+ attributeType: props.attributeType
367
+ }
368
+ ]);
369
+ return [2 /*return*/];
370
+ }
371
+ });
372
+ }); });
373
+ it('should return null if there are no values, showEmptyEditors is true but delete operation was performed', function () { return __awaiter(void 0, void 0, void 0, function () {
374
+ var props, _a, user, container;
375
+ return __generator(this, function (_b) {
376
+ switch (_b.label) {
377
+ case 0:
378
+ props = __assign(__assign({}, defaultProps), { values: [], showEmptyEditors: true });
379
+ _a = setUp({ props: props }), user = _a.user, container = _a.container;
380
+ return [4 /*yield*/, user.click(screen.getByTestId('reltio-delete-simple-attribute-button'))];
381
+ case 1:
382
+ _b.sent();
383
+ expect(container).toBeEmptyDOMElement();
384
+ return [2 /*return*/];
385
+ }
386
+ });
387
+ }); });
388
+ it('should render special "empty" attribute if there are no values and attribute is pinned', function () {
389
+ var props = __assign(__assign({}, defaultProps), { values: [] });
390
+ var pinnedAttributesContextValue = [defaultAttributeType.uri];
391
+ setUp({ props: props, pinnedAttributesContextValue: pinnedAttributesContextValue });
392
+ expect(within(screen.getByTestId('reltio-edit-attribute')).getByRole('textbox')).toHaveValue('');
393
+ });
394
+ it('should call onAddAttributes with correct params in case when values is not empty', function () { return __awaiter(void 0, void 0, void 0, function () {
395
+ var user;
396
+ return __generator(this, function (_a) {
397
+ switch (_a.label) {
398
+ case 0:
399
+ user = setUp().user;
400
+ return [4 /*yield*/, user.click(screen.getByTestId('reltio-add-one-more-simple-attribute-button'))];
401
+ case 1:
402
+ _a.sent();
403
+ expect(defaultProps.onAddAttributes).toHaveBeenCalledWith([
404
+ {
405
+ attributeType: defaultProps.attributeType,
406
+ index: Infinity,
407
+ parentUri: defaultProps.parentUri
408
+ }
409
+ ]);
410
+ return [2 /*return*/];
411
+ }
412
+ });
413
+ }); });
414
+ it('should render correct if one of the values is masked', function () {
415
+ var values = __spreadArray(__spreadArray([], defaultValues, true), [
416
+ {
417
+ type: defaultAttributeType.uri,
418
+ uri: 'entities/sIeHttl/attributes/Fruit/strawberry',
419
+ value: 'strawberry',
420
+ ov: true,
421
+ masked: true
422
+ }
423
+ ], false);
424
+ var props = __assign(__assign({}, defaultProps), { values: values });
425
+ setUp({ props: props });
426
+ var attributes = screen.getAllByTestId('reltio-edit-attribute');
427
+ expect(within(attributes[4]).queryByRole('textbox')).not.toBeInTheDocument();
428
+ within(attributes[4]).getByText('strawberry');
429
+ });
430
+ it('should not allow to add more values in edit mode if cardinality max value is one', function () {
431
+ var props = __assign(__assign({}, defaultProps), { values: [], showEmptyEditors: true, attributeType: __assign(__assign({}, defaultAttributeType), { cardinality: { maxValue: 1, minValue: 0 } }) });
432
+ setUp({ props: props });
433
+ expect(screen.queryByTestId('reltio-add-one-more-simple-attribute-button')).not.toBeInTheDocument();
434
+ });
435
+ it('should allow to add more values in edit mode if cardinality max value is more than one', function () {
436
+ var props = __assign(__assign({}, defaultProps), { values: [], showEmptyEditors: true, attributeType: __assign(__assign({}, defaultAttributeType), { cardinality: { maxValue: 2, minValue: 1 } }) });
437
+ setUp({ props: props });
438
+ screen.getByTestId('reltio-add-one-more-simple-attribute-button');
439
+ });
440
+ it('should highlight error if it have same parent uri, empty uri, and attribute type uri', function () {
123
441
  var fullError = {
124
442
  type: 'invalid',
125
- attributeTypeUri: attributeType.uri,
443
+ name: '',
444
+ attributeTypeUri: defaultAttributeType.uri,
126
445
  parentUri: defaultProps.parentUri,
127
- uri: 'entities/sIeHttl/attributes/Address/edEosww/AddressType/uri$$1627902448724',
446
+ uri: undefined,
128
447
  source: 'validationService',
129
448
  severity: 'ERROR'
130
449
  };
450
+ var highlightError = jest.fn();
451
+ var scrollIntoRef = jest.fn();
131
452
  var Providers = function (_a) {
132
453
  var children = _a.children;
133
- return (React.createElement(ScrollToElementContext.Provider, { value: {
134
- element: fullError,
135
- highlightError: jest.fn(),
136
- scrollIntoRef: jest.fn(),
137
- type: ScrollType.Error
138
- } }, children));
454
+ return (React.createElement(ScrollToElementContext.Provider, { value: { element: fullError, highlightError: highlightError, scrollIntoRef: scrollIntoRef, type: ScrollType.Error } }, children));
139
455
  };
140
- var component = setUp({ CustomProviders: Providers });
141
- expect(component.find(AttributeRenderer).prop('highlightedError')).toBe(null);
456
+ setUp({ CustomProviders: Providers });
457
+ expect(scrollIntoRef).toHaveBeenCalled();
142
458
  });
143
- });
144
- describe('SpecialRenderer behavior', function () {
145
- var attributeType = {
146
- type: DataTypes.TYPE_ACTIVENESS_DATE,
147
- label: 'Start date',
148
- uri: 'startDate',
149
- name: 'activeness.startDate',
150
- defaultValue: null,
151
- singleValue: true,
152
- faceted: true
153
- };
154
- it('should render SpecialRenderer for special attributes', function () {
155
- var values = [1];
156
- var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: values, showEmptyEditors: true });
157
- var component = setUp({ props: props });
158
- var decorator = component.find(BranchDecorator);
159
- expect(decorator).toHaveLength(1);
160
- expect(decorator.prop('enabled')).toBeFalsy();
161
- var attribute = decorator.find(SpecialRenderer);
162
- expect(attribute).toHaveLength(1);
163
- expect(attribute.props()).toMatchObject(props);
164
- expect(decorator.find(AttributeTitle)).toHaveLength(0);
165
- });
166
- it('should set enabled BranchDecorator prop as true when drawLines is true', function () {
167
- var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, drawLines: true });
168
- var component = setUp({ props: props });
169
- var decorator = component.find(BranchDecorator);
170
- expect(decorator).toHaveLength(1);
171
- expect(decorator.prop('enabled')).toBe(true);
172
- expect(decorator.find(SpecialRenderer)).toHaveLength(1);
459
+ it('should not highlight error if it have uri', function () {
460
+ var fullError = {
461
+ type: 'invalid',
462
+ name: '',
463
+ attributeTypeUri: defaultAttributeType.uri,
464
+ parentUri: defaultProps.parentUri,
465
+ uri: 'entities/sIeHttl/attributes/Address/edEosww/AddressType/uri$$1627902448724',
466
+ source: 'validationService',
467
+ severity: 'ERROR'
468
+ };
469
+ var highlightError = jest.fn();
470
+ var scrollIntoRef = jest.fn();
471
+ var Providers = function (_a) {
472
+ var children = _a.children;
473
+ return (React.createElement(ScrollToElementContext.Provider, { value: { element: fullError, highlightError: highlightError, scrollIntoRef: scrollIntoRef, type: ScrollType.Error } }, children));
474
+ };
475
+ setUp({ CustomProviders: Providers });
476
+ expect(scrollIntoRef).not.toHaveBeenCalled();
173
477
  });
174
478
  });
175
- describe('ImageLineRenderer behavior', function () {
176
- var attributeType = {
479
+ describe('image line attribute renderer', function () {
480
+ var defaultAttributeType = {
177
481
  type: DataTypes.TYPE_IMAGE,
178
482
  label: 'Image',
483
+ name: 'ImageGallery',
179
484
  uri: 'configuration/entityTypes/HCP/attributes/ImageGallery'
180
485
  };
181
- it('should render ImageLineRenderer for image attributes', function () {
182
- var values = [1];
183
- var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: values, showNonOv: false, paging: {}, requestNextPageOfAttributeValues: jest.fn() });
184
- var component = setUp({ props: props });
185
- var decorator = component.find(BranchDecorator);
186
- expect(decorator).toHaveLength(1);
187
- expect(decorator.prop('enabled')).toBeFalsy();
188
- var attribute = decorator.find(ImageLineRenderer);
189
- expect(attribute).toHaveLength(1);
190
- expect(attribute.props()).toMatchObject({
191
- attributeType: attributeType,
192
- attributeValues: values,
193
- parentUri: defaultProps.parentUri,
194
- onChangeAttribute: defaultProps.onChangeAttribute,
195
- showNonOv: false,
196
- paging: {},
197
- requestNextPageOfAttributeValues: expect.any(Function)
486
+ var defaultValues = [
487
+ {
488
+ label: '',
489
+ value: {
490
+ Width: [
491
+ {
492
+ type: 'configuration/entityTypes/HCP/attributes/ImageGallery/attributes/Width',
493
+ value: '200',
494
+ uri: 'entities/sIeHttl/attributes/ImageGallery/1IozCV9I/Width/1IozCuiq'
495
+ }
496
+ ],
497
+ Height: [
498
+ {
499
+ type: 'configuration/entityTypes/HCP/attributes/ImageGallery/attributes/Height',
500
+ value: '300',
501
+ uri: 'entities/sIeHttl/attributes/ImageGallery/1IozCV9I/Height/1IozCyz6'
502
+ }
503
+ ],
504
+ CdnUrlThumbnail: [
505
+ {
506
+ type: 'configuration/entityTypes/HCP/attributes/ImageGallery/attributes/CdnUrlThumbnail',
507
+ value: 'https://reltio.com/image.png',
508
+ uri: 'entities/sIeHttl/attributes/ImageGallery/1IozCV9I/CdnUrlThumbnail/1IozCqSa'
509
+ }
510
+ ]
511
+ },
512
+ uri: 'entities/sIeHttl/attributes/ImageGallery/1IozCV9I'
513
+ }
514
+ ];
515
+ var defaultImageLineAttributeProps = __assign(__assign({}, defaultProps), { attributeType: defaultAttributeType, values: defaultValues });
516
+ it('should render title correctly', function () {
517
+ setUp({ props: defaultImageLineAttributeProps });
518
+ var title = screen.getByTestId('reltio-attribute-label');
519
+ expect(title).toHaveTextContent('Image');
520
+ expect(title).not.toHaveTextContent('*');
521
+ });
522
+ it('should render title correctly if attribute type is required', function () {
523
+ var attributeType = __assign(__assign({}, defaultAttributeType), { required: true });
524
+ var props = __assign(__assign({}, defaultImageLineAttributeProps), { attributeType: attributeType });
525
+ setUp({ props: props });
526
+ var title = screen.getByTestId('reltio-attribute-label');
527
+ expect(title).toHaveTextContent('Image');
528
+ expect(title).toHaveTextContent('*');
529
+ });
530
+ it('should render description correctly', function () { return __awaiter(void 0, void 0, void 0, function () {
531
+ var attributeType, props, user;
532
+ return __generator(this, function (_a) {
533
+ switch (_a.label) {
534
+ case 0:
535
+ attributeType = __assign(__assign({}, defaultAttributeType), { description: 'Image description' });
536
+ props = __assign(__assign({}, defaultImageLineAttributeProps), { attributeType: attributeType });
537
+ user = setUp({ props: props }).user;
538
+ expect(screen.queryByRole('tooltip')).not.toBeInTheDocument();
539
+ return [4 /*yield*/, user.hover(screen.getByTestId('reltio-description-icon'))];
540
+ case 1:
541
+ _a.sent();
542
+ screen.getByText('Image description');
543
+ return [2 /*return*/];
544
+ }
545
+ });
546
+ }); });
547
+ it('should not render description if attribute does not have it', function () { return __awaiter(void 0, void 0, void 0, function () {
548
+ return __generator(this, function (_a) {
549
+ setUp({ props: defaultImageLineAttributeProps });
550
+ expect(screen.queryByTestId('reltio-description-icon')).not.toBeInTheDocument();
551
+ return [2 /*return*/];
198
552
  });
553
+ }); });
554
+ it('should render attribute values correctly', function () {
555
+ setUp({ props: defaultImageLineAttributeProps });
556
+ var imageLine = screen.getByTestId('image-line-edit-mode');
557
+ resizeObserver.mockElementSize(imageLine, { contentBoxSize: { inlineSize: 1000 } });
558
+ act(function () {
559
+ resizeObserver.resize();
560
+ });
561
+ screen.getByTestId('reltio-upload-image-button');
562
+ var attributeValues = screen.getAllByTestId('reltio-attribute-value');
563
+ expect(attributeValues).toHaveLength(2);
564
+ expect(attributeValues[0]).toHaveAttribute('src', 'https://reltio.com/image.png');
565
+ within(attributeValues[1]).getByTestId('SvgDefaultImage');
566
+ });
567
+ });
568
+ describe('special attribute renderer', function () {
569
+ it('should render Roles component for roles', function () {
570
+ var attributeType = EntityAttrTypes.roles;
571
+ var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: ['configuration/roles/OfficeStaff'] });
572
+ setUp({ props: props });
573
+ expect(screen.getByTestId('reltio-attribute-label')).toHaveTextContent(attributeType.label);
574
+ expect(screen.getAllByTestId('reltio-attribute-value')).toHaveLength(1);
575
+ expect(screen.getByRole('combobox')).toBeInTheDocument();
576
+ expect(screen.getByText('Office Staff')).toBeInTheDocument();
199
577
  });
200
- it('should set enabled BranchDecorator prop as true when drawLines is true', function () {
201
- var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, drawLines: true });
202
- var component = setUp({ props: props });
203
- var decorator = component.find(BranchDecorator);
204
- expect(decorator).toHaveLength(1);
205
- expect(decorator.prop('enabled')).toBe(true);
206
- expect(decorator.find(ImageLineRenderer)).toHaveLength(1);
578
+ it('should render Tags component for tags and special icon before title', function () {
579
+ var attributeType = EntityAttrTypes.tags;
580
+ var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: ['tag1'] });
581
+ setUp({ props: props });
582
+ expect(screen.getByTestId('reltio-attribute-label')).toHaveTextContent(attributeType.label);
583
+ expect(screen.getAllByTestId('reltio-attribute-value')).toHaveLength(1);
584
+ expect(screen.getByRole('textbox')).toBeInTheDocument();
585
+ expect(screen.getByText('tag1')).toBeInTheDocument();
586
+ });
587
+ it('should render empty Tags', function () {
588
+ var attributeType = EntityAttrTypes.tags;
589
+ var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: [] });
590
+ setUp({ props: props });
591
+ expect(screen.getByTestId('reltio-attribute-label')).toHaveTextContent(attributeType.label);
592
+ expect(screen.getAllByTestId('reltio-attribute-value')).toHaveLength(1);
593
+ expect(screen.getByRole('textbox')).toBeInTheDocument();
594
+ });
595
+ it('should render Attribute component for activeness attributes', function () {
596
+ var attributeType = EntityAttrTypes.endDate;
597
+ var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: [1690891216477] });
598
+ setUp({ props: props });
599
+ expect(screen.getByTestId('reltio-attribute-label')).toHaveTextContent(attributeType.label);
600
+ expect(screen.getAllByTestId('reltio-attribute-value')).toHaveLength(1);
601
+ expect(screen.getByRole('textbox')).toHaveValue('08/01/2023');
602
+ });
603
+ it('should return null if there are no activeness values and showEmptyEditors is falsy', function () {
604
+ var props = __assign(__assign({}, defaultProps), { attributeType: EntityAttrTypes.endDate, values: [] });
605
+ var container = setUp({ props: props }).container;
606
+ expect(container).toBeEmptyDOMElement();
607
+ });
608
+ it('should render special "empty" activeness attribute if values empty and showEmptyEditors is true', function () {
609
+ var attributeType = EntityAttrTypes.endDate;
610
+ var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: [], showEmptyEditors: true });
611
+ setUp({ props: props });
612
+ expect(screen.getByTestId('reltio-attribute-label')).toHaveTextContent(attributeType.label);
613
+ expect(screen.getAllByTestId('reltio-attribute-value')).toHaveLength(1);
614
+ expect(screen.getByRole('textbox')).toHaveValue('');
615
+ });
616
+ it('should render null if values empty, showEmptyEditors is true but delete operation was performed', function () { return __awaiter(void 0, void 0, void 0, function () {
617
+ var props, _a, user, container;
618
+ return __generator(this, function (_b) {
619
+ switch (_b.label) {
620
+ case 0:
621
+ props = __assign(__assign({}, defaultProps), { attributeType: EntityAttrTypes.endDate, values: [], showEmptyEditors: true });
622
+ _a = setUp({ props: props }), user = _a.user, container = _a.container;
623
+ expect(container).not.toBeEmptyDOMElement();
624
+ return [4 /*yield*/, user.click(screen.getByTestId('reltio-delete-simple-attribute-button'))];
625
+ case 1:
626
+ _b.sent();
627
+ expect(container).toBeEmptyDOMElement();
628
+ return [2 /*return*/];
629
+ }
630
+ });
631
+ }); });
632
+ it('should call HasDeletionsContext.Provider.value.setHasDeletions on delete operation if context is defined', function () { return __awaiter(void 0, void 0, void 0, function () {
633
+ var props, contextValue, CustomProviders, _a, container, user;
634
+ return __generator(this, function (_b) {
635
+ switch (_b.label) {
636
+ case 0:
637
+ props = __assign(__assign({}, defaultProps), { attributeType: EntityAttrTypes.endDate, values: [], showEmptyEditors: true });
638
+ contextValue = { setHasDeletions: jest.fn(), hasDeletionsMap: {} };
639
+ CustomProviders = function (_a) {
640
+ var children = _a.children;
641
+ return (React.createElement(HasDeletionsContext.Provider, { value: contextValue }, children));
642
+ };
643
+ _a = setUp({ props: props, CustomProviders: CustomProviders }), container = _a.container, user = _a.user;
644
+ return [4 /*yield*/, user.click(screen.getByTestId('reltio-delete-simple-attribute-button'))];
645
+ case 1:
646
+ _b.sent();
647
+ expect(screen.getAllByTestId('reltio-attribute-value')).toHaveLength(1);
648
+ expect(contextValue.setHasDeletions).toHaveBeenCalledWith(props.attributeType.uri, true);
649
+ expect(container).not.toBeEmptyDOMElement();
650
+ return [2 /*return*/];
651
+ }
652
+ });
653
+ }); });
654
+ it('should not crash without context provider and use internal state for hasDeletions', function () { return __awaiter(void 0, void 0, void 0, function () {
655
+ var attributeType, props, _a, user, container;
656
+ return __generator(this, function (_b) {
657
+ switch (_b.label) {
658
+ case 0:
659
+ attributeType = EntityAttrTypes.endDate;
660
+ props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: [], showEmptyEditors: true });
661
+ _a = setUp({ props: props }), user = _a.user, container = _a.container;
662
+ expect(container).not.toBeEmptyDOMElement();
663
+ return [4 /*yield*/, user.click(screen.getByTestId('reltio-delete-simple-attribute-button'))];
664
+ case 1:
665
+ _b.sent();
666
+ expect(screen.queryAllByTestId('reltio-attribute-value')).toHaveLength(0);
667
+ return [2 /*return*/];
668
+ }
669
+ });
670
+ }); });
671
+ it('should pass additional params to attribute component', function () {
672
+ var attributeType = EntityAttrTypes.endDate;
673
+ var additionalControlsRenderer = function () { return React.createElement("div", { "data-reltio-id": "additional-controls" }); };
674
+ var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: [1690891216477], additionalControlsRenderer: additionalControlsRenderer });
675
+ setUp({ props: props });
676
+ expect(screen.getByTestId('reltio-attribute-label')).toHaveTextContent(attributeType.label);
677
+ expect(screen.getAllByTestId('reltio-attribute-value')).toHaveLength(1);
678
+ expect(screen.getByTestId('additional-controls')).toBeInTheDocument();
207
679
  });
208
680
  });
209
- describe('Errors behaviour', function () {
210
- var errors = [
211
- {
212
- parentUri: defaultProps.parentUri,
213
- uri: values[0].uri,
214
- attributeTypeUri: attributeType.uri,
215
- message: 'Attribute is invalid',
216
- type: 'invalid'
217
- },
218
- {
219
- parentUri: defaultProps.parentUri,
220
- uri: values[1].uri,
221
- attributeTypeUri: attributeType.uri,
222
- message: 'Attribute is invalid',
223
- type: 'invalid',
224
- deactivated: true
225
- },
226
- {
227
- parentUri: 'entities/sIeHttl_another',
228
- uri: 'entities/sIeHttl_another/attributes/Simple/u123',
229
- attributeTypeUri: attributeType.uri,
230
- message: 'Attribute is invalid',
231
- type: 'invalid'
232
- },
233
- {
234
- parentUri: defaultProps.parentUri,
235
- uri: values[0].uri,
236
- attributeTypeUri: 'configuration/entityTypes/HCP/attributes/Simple2',
237
- message: 'Attribute is invalid',
238
- type: 'invalid'
239
- },
240
- {
241
- parentUri: defaultProps.parentUri,
242
- uri: '',
243
- attributeTypeUri: attributeType.uri,
244
- message: 'Attribute is required',
245
- type: 'missed'
246
- },
247
- {
248
- parentUri: defaultProps.parentUri,
249
- uri: '',
250
- attributeTypeUri: attributeType.uri,
251
- message: 'Cardinality error',
252
- type: 'invalid',
253
- severity: ErrorSeverity.ERROR
254
- },
255
- {
256
- parentUri: defaultProps.parentUri,
257
- uri: values[0].uri,
258
- attributeTypeUri: attributeType.uri,
259
- message: 'Attribute is invalid',
260
- type: 'invalid',
261
- severity: ErrorSeverity.WARNING
262
- }
263
- ];
264
- it('should filter active errors correctly', function () {
265
- var mdmValues = __assign(__assign({}, defaultMdmValues), { profileErrors: errors });
266
- var component = setUp({ mdmValues: mdmValues });
267
- var attribute = component.find(AttributeRenderer);
268
- expect(attribute.prop('errors')).toEqual([errors[0], errors[4], errors[5]]);
681
+ describe('errors', function () {
682
+ it('should render error message correctly', function () {
683
+ var profileErrors = [
684
+ {
685
+ type: ErrorType.invalid,
686
+ uri: '',
687
+ attributeTypeUri: 'configuration/entityTypes/HCP/attributes/Fruit',
688
+ parentUri: 'entities/sIeHttl',
689
+ message: 'Attribute is invalid',
690
+ source: ErrorSource.local,
691
+ path: []
692
+ }
693
+ ];
694
+ var mdmValues = __assign(__assign({}, defaultMdmValues), { profileErrors: profileErrors });
695
+ var props = __assign(__assign({}, defaultProps), { values: [defaultValues[0]] });
696
+ setUp({ props: props, mdmValues: mdmValues });
697
+ var attribute = screen.getByTestId('reltio-edit-attribute');
698
+ expect(within(attribute).queryByText('Attribute is invalid')).not.toBeInTheDocument();
699
+ screen.getByText('Attribute is invalid');
700
+ });
701
+ it('should render active error correctly', function () {
702
+ var profileErrors = [
703
+ {
704
+ type: ErrorType.missed,
705
+ uri: '',
706
+ attributeTypeUri: 'configuration/entityTypes/HCP/attributes/Fruit',
707
+ parentUri: 'entities/sIeHttl',
708
+ message: 'Attribute is required',
709
+ source: ErrorSource.local,
710
+ path: []
711
+ }
712
+ ];
713
+ var attributeType = __assign(__assign({}, defaultAttributeType), { required: true });
714
+ var mdmValues = __assign(__assign({}, defaultMdmValues), { profileErrors: profileErrors });
715
+ var props = __assign(__assign({}, defaultProps), { attributeType: attributeType, values: [] });
716
+ setUp({ props: props, mdmValues: mdmValues });
717
+ var attribute = screen.getByTestId('reltio-edit-attribute');
718
+ within(attribute).getByText('Attribute is required');
269
719
  });
270
- it('should get message of corresponding (to current type) active not "missed" error without uri correctly', function () {
271
- var mdmValues = __assign(__assign({}, defaultMdmValues), { profileErrors: errors });
272
- var component = setUp({ mdmValues: mdmValues });
273
- var attribute = component.find(AttributeRenderer);
274
- expect(attribute.prop('errorMessage')).toBe('Cardinality error');
720
+ it('should not render active error if attribute is hidden', function () {
721
+ var _a;
722
+ var profileErrors = [
723
+ {
724
+ type: ErrorType.missed,
725
+ uri: '',
726
+ attributeTypeUri: 'configuration/entityTypes/HCP/attributes/Fruit',
727
+ parentUri: 'entities/sIeHttl',
728
+ message: 'Attribute is required',
729
+ source: ErrorSource.local,
730
+ path: []
731
+ }
732
+ ];
733
+ var mdmValues = __assign(__assign({}, defaultMdmValues), { profileErrors: profileErrors });
734
+ var hiddenAttributesContextValue = (_a = {},
735
+ _a[defaultProps.parentUri] = ['configuration/entityTypes/HCP/attributes/Fruit'],
736
+ _a);
737
+ setUp({ mdmValues: mdmValues, hiddenAttributesContextValue: hiddenAttributesContextValue });
738
+ expect(screen.queryByText('Attribute is required')).not.toBeInTheDocument();
275
739
  });
276
740
  });
277
741
  });