@reltio/components 1.4.2208 → 1.4.2209

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 (59) hide show
  1. package/AttributesErrorsPanel/components/Error/Error.js +2 -2
  2. package/cjs/AttributesErrorsPanel/components/Error/Error.js +2 -2
  3. package/cjs/contexts/MdmModuleContext/context.d.ts +2 -0
  4. package/cjs/contexts/MdmModuleContext/hooks.d.ts +1 -0
  5. package/cjs/contexts/MdmModuleContext/hooks.js +3 -1
  6. package/cjs/contexts/MdmModuleContext/index.d.ts +1 -1
  7. package/cjs/contexts/MdmModuleContext/index.js +2 -1
  8. package/cjs/features/workflow/ChangeRequestEditor/components/ChangeItemLabel/ChangeItemLabel.js +8 -3
  9. package/cjs/features/workflow/ChangeRequestEditor/components/ChangeItemRow/ChangeItemRow.js +45 -4
  10. package/cjs/features/workflow/ChangeRequestEditor/components/ChangeItemRow/ChangeItemRow.module.css.js +2 -2
  11. package/cjs/features/workflow/ChangeRequestEditor/components/DCRValueEditor/DCRValueEditor.d.ts +1 -1
  12. package/cjs/features/workflow/ChangeRequestEditor/components/DCRValueEditorFactory/DCRValueEditorFactory.d.ts +1 -1
  13. package/cjs/features/workflow/ChangeRequestEditor/hooks/useChangeRequestEditor.d.ts +1 -1
  14. package/cjs/features/workflow/ReviewDCRDialog/DCRErrorsPanel/DCRErrorsPanel.d.ts +2 -0
  15. package/cjs/features/workflow/ReviewDCRDialog/DCRErrorsPanel/DCRErrorsPanel.js +44 -0
  16. package/cjs/features/workflow/ReviewDCRDialog/DCRErrorsPanel/DCRErrorsPanel.module.css.js +9 -0
  17. package/cjs/features/workflow/ReviewDCRDialog/ReviewDCRDialog.js +2 -0
  18. package/cjs/features/workflow/WorkflowTaskCard/components/DataChangeRequestTaskCard/DataChangeRequestTaskCard.js +3 -1
  19. package/cjs/features/workflow/contexts/ChangeRequestEditorContext/index.d.ts +19 -10
  20. package/cjs/features/workflow/contexts/ChangeRequestEditorContext/index.js +28 -2
  21. package/cjs/features/workflow/helpers/dcr.d.ts +1 -1
  22. package/cjs/features/workflow/helpers/merge.js +3 -3
  23. package/cjs/features/workflow/helpers/validation.d.ts +17 -0
  24. package/cjs/features/workflow/helpers/validation.js +333 -0
  25. package/cjs/features/workflow/hooks/useApplyDcrChanges.js +34 -24
  26. package/cjs/features/workflow/hooks/useDCRValidation.d.ts +5 -0
  27. package/cjs/features/workflow/hooks/useDCRValidation.js +153 -0
  28. package/cjs/features/workflow/types.d.ts +8 -1
  29. package/cjs/hooks/useScrollToAttributeError/useScrollToAttributeError.d.ts +2 -1
  30. package/cjs/hooks/useScrollToAttributeError/useScrollToAttributeError.js +2 -2
  31. package/contexts/MdmModuleContext/context.d.ts +2 -0
  32. package/contexts/MdmModuleContext/hooks.d.ts +1 -0
  33. package/contexts/MdmModuleContext/hooks.js +1 -0
  34. package/contexts/MdmModuleContext/index.d.ts +1 -1
  35. package/contexts/MdmModuleContext/index.js +1 -1
  36. package/features/workflow/ChangeRequestEditor/components/ChangeItemLabel/ChangeItemLabel.js +8 -3
  37. package/features/workflow/ChangeRequestEditor/components/ChangeItemRow/ChangeItemRow.js +22 -4
  38. package/features/workflow/ChangeRequestEditor/components/ChangeItemRow/ChangeItemRow.module.css.js +2 -2
  39. package/features/workflow/ChangeRequestEditor/components/DCRValueEditor/DCRValueEditor.d.ts +1 -1
  40. package/features/workflow/ChangeRequestEditor/components/DCRValueEditorFactory/DCRValueEditorFactory.d.ts +1 -1
  41. package/features/workflow/ChangeRequestEditor/hooks/useChangeRequestEditor.d.ts +1 -1
  42. package/features/workflow/ReviewDCRDialog/DCRErrorsPanel/DCRErrorsPanel.d.ts +2 -0
  43. package/features/workflow/ReviewDCRDialog/DCRErrorsPanel/DCRErrorsPanel.js +14 -0
  44. package/features/workflow/ReviewDCRDialog/DCRErrorsPanel/DCRErrorsPanel.module.css.js +9 -0
  45. package/features/workflow/ReviewDCRDialog/ReviewDCRDialog.js +2 -0
  46. package/features/workflow/WorkflowTaskCard/components/DataChangeRequestTaskCard/DataChangeRequestTaskCard.js +3 -1
  47. package/features/workflow/contexts/ChangeRequestEditorContext/index.d.ts +19 -10
  48. package/features/workflow/contexts/ChangeRequestEditorContext/index.js +28 -2
  49. package/features/workflow/helpers/dcr.d.ts +1 -1
  50. package/features/workflow/helpers/merge.js +3 -3
  51. package/features/workflow/helpers/validation.d.ts +17 -0
  52. package/features/workflow/helpers/validation.js +326 -0
  53. package/features/workflow/hooks/useApplyDcrChanges.js +34 -24
  54. package/features/workflow/hooks/useDCRValidation.d.ts +5 -0
  55. package/features/workflow/hooks/useDCRValidation.js +149 -0
  56. package/features/workflow/types.d.ts +8 -1
  57. package/hooks/useScrollToAttributeError/useScrollToAttributeError.d.ts +2 -1
  58. package/hooks/useScrollToAttributeError/useScrollToAttributeError.js +2 -2
  59. package/package.json +2 -2
@@ -0,0 +1,333 @@
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 __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
14
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
15
+ if (ar || !(i in from)) {
16
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
17
+ ar[i] = from[i];
18
+ }
19
+ }
20
+ return to.concat(ar || Array.prototype.slice.call(from));
21
+ };
22
+ var __importDefault = (this && this.__importDefault) || function (mod) {
23
+ return (mod && mod.__esModule) ? mod : { "default": mod };
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.getValidationErrors = void 0;
27
+ var ramda_1 = require("ramda");
28
+ var ui_i18n_1 = __importDefault(require("ui-i18n"));
29
+ var mdm_sdk_1 = require("@reltio/mdm-sdk");
30
+ var ALLOWED_CHANGE_TYPES = [
31
+ mdm_sdk_1.DCRTypes.UPDATE_ATTRIBUTE,
32
+ mdm_sdk_1.DCRTypes.INSERT_ATTRIBUTE,
33
+ mdm_sdk_1.DCRTypes.DELETE_ATTRIBUTE,
34
+ mdm_sdk_1.DCRTypes.IGNORE_ATTRIBUTE
35
+ ];
36
+ var getValidationErrors = function (_a) {
37
+ var changes = _a.changes, userChanges = _a.userChanges, entitiesOrRelations = _a.entitiesOrRelations, metadata = _a.metadata;
38
+ var _b = validateTopLevelAttributes({
39
+ changes: changes,
40
+ userChanges: userChanges,
41
+ entitiesOrRelations: entitiesOrRelations,
42
+ metadata: metadata
43
+ }), topLevelErrors = _b.errors, topRejectedChangeIds = _b.topRejectedChangeIds;
44
+ var complexErrors = validateComplexAttributes({ changes: changes, userChanges: userChanges, metadata: metadata, topRejectedChangeIds: topRejectedChangeIds });
45
+ return __spreadArray(__spreadArray([], topLevelErrors, true), complexErrors, true);
46
+ };
47
+ exports.getValidationErrors = getValidationErrors;
48
+ var validateTopLevelAttributes = function (_a) {
49
+ var changes = _a.changes, userChanges = _a.userChanges, entitiesOrRelations = _a.entitiesOrRelations, metadata = _a.metadata;
50
+ var errors = [];
51
+ var topRejectedChangeIds = [];
52
+ var _loop_1 = function (entityUri) {
53
+ var entityOrRelation = entitiesOrRelations[entityUri];
54
+ var objectChanges = changes[entityUri] || [];
55
+ var requiredAttributeUris = getRequiredAttributeUris(metadata, entityOrRelation.type);
56
+ var changesByAttributePath = {};
57
+ objectChanges.forEach(function (change) {
58
+ var _a;
59
+ var attributeTypeUri = change.refAttributeType || change.attributeType;
60
+ if (!change.type ||
61
+ !ALLOWED_CHANGE_TYPES.includes(change.type) ||
62
+ !requiredAttributeUris.includes(change.attributeType || '')) {
63
+ return;
64
+ }
65
+ var foundUserChanges = getTopLevelUserChangesByChangeId(userChanges, change.id);
66
+ foundUserChanges.forEach(function (userChange) {
67
+ if (userChange.data.isRejected) {
68
+ topRejectedChangeIds.push(change.id);
69
+ }
70
+ });
71
+ var hasUserChanges = foundUserChanges.length > 0;
72
+ var adjustedChange = adjustChangeWithUserChanges(change, foundUserChanges);
73
+ var currentAttributePath = getCurrentAttributePath(change.attributePath);
74
+ if (!changesByAttributePath[currentAttributePath]) {
75
+ var objectValues = (0, mdm_sdk_1.findAttributeValuesByTypeUri)(metadata, entityOrRelation, attributeTypeUri);
76
+ changesByAttributePath[currentAttributePath] = {
77
+ changes: [],
78
+ objectValues: objectValues,
79
+ attributeTypeUri: attributeTypeUri,
80
+ attributeType: (0, mdm_sdk_1.findAttributeTypeByUri)(metadata, attributeTypeUri),
81
+ parentUri: (0, mdm_sdk_1.getParentUri)(change.attributePath),
82
+ lineIds: []
83
+ };
84
+ }
85
+ if (adjustedChange) {
86
+ changesByAttributePath[currentAttributePath].changes.push(adjustedChange);
87
+ }
88
+ if (hasUserChanges) {
89
+ changesByAttributePath[currentAttributePath].hasUserChanges = true;
90
+ }
91
+ (_a = changesByAttributePath[currentAttributePath].lineIds).push.apply(_a, foundUserChanges.map(function (userChange) { return userChange.lineId; }));
92
+ });
93
+ Object.values(changesByAttributePath).forEach(function (_a) {
94
+ var _b;
95
+ var hasUserChanges = _a.hasUserChanges, objectValues = _a.objectValues, attributeChanges = _a.changes, attributeTypeUri = _a.attributeTypeUri, attributeType = _a.attributeType, parentUri = _a.parentUri, lineIds = _a.lineIds;
96
+ if (hasUserChanges && !hasAttributeValue(objectValues, attributeChanges, entityUri)) {
97
+ var valueUri = (_b = objectValues === null || objectValues === void 0 ? void 0 : objectValues[0]) === null || _b === void 0 ? void 0 : _b.uri;
98
+ errors.push(createRequiredError({
99
+ attributeType: attributeType,
100
+ attributeTypeUri: attributeTypeUri,
101
+ parentUri: parentUri,
102
+ lineIds: lineIds,
103
+ metadata: metadata,
104
+ entityUri: entityUri,
105
+ entitiesMap: entitiesOrRelations,
106
+ valueUri: valueUri
107
+ }));
108
+ }
109
+ });
110
+ };
111
+ for (var entityUri in entitiesOrRelations) {
112
+ _loop_1(entityUri);
113
+ }
114
+ return { errors: errors, topRejectedChangeIds: topRejectedChangeIds };
115
+ };
116
+ var validateComplexAttributes = function (_a) {
117
+ var changes = _a.changes, userChanges = _a.userChanges, metadata = _a.metadata, _b = _a.topRejectedChangeIds, topRejectedChangeIds = _b === void 0 ? [] : _b;
118
+ var errors = [];
119
+ var _loop_2 = function (entityUri) {
120
+ var objectChanges = changes[entityUri] || [];
121
+ objectChanges.forEach(function (change) {
122
+ var _a, _b, _c, _d;
123
+ if (topRejectedChangeIds.includes(change.id)) {
124
+ return;
125
+ }
126
+ var hasComplexValue = (typeof ((_a = change.newValue) === null || _a === void 0 ? void 0 : _a.value) === 'object' &&
127
+ !Array.isArray((_b = change.newValue) === null || _b === void 0 ? void 0 : _b.value)) ||
128
+ (typeof ((_c = change.oldValue) === null || _c === void 0 ? void 0 : _c.value) === 'object' &&
129
+ !Array.isArray((_d = change.oldValue) === null || _d === void 0 ? void 0 : _d.value));
130
+ var isCreateType = change.type === mdm_sdk_1.DCRTypes.CREATE_ENTITY || change.type === mdm_sdk_1.DCRTypes.CREATE_RELATIONSHIP;
131
+ if (!hasComplexValue && !isCreateType) {
132
+ return;
133
+ }
134
+ var foundUserChanges = getUserChangesByChangeId(userChanges, change.id);
135
+ var complexErrors = validateRequiredComplexAttributes({
136
+ metadata: metadata,
137
+ change: change,
138
+ userChanges: foundUserChanges,
139
+ entityUri: entityUri
140
+ });
141
+ errors.push.apply(errors, complexErrors);
142
+ });
143
+ };
144
+ for (var entityUri in changes) {
145
+ _loop_2(entityUri);
146
+ }
147
+ return errors;
148
+ };
149
+ var getTopLevelUserChangesByChangeId = function (userChanges, changeId) {
150
+ return getUserChangesByChangeId(userChanges, changeId).filter(function (userChange) { return userChange.lineId.split('/').length === 3; });
151
+ };
152
+ var getUserChangesByChangeId = function (userChanges, changeId) {
153
+ return userChanges.filter(function (userChange) { return userChange.lineId.split('/')[1] === changeId; });
154
+ };
155
+ var getIsChangeRejected = function (userChanges, changeType) {
156
+ if (userChanges.length === 0)
157
+ return false;
158
+ var isInsertType = changeType === mdm_sdk_1.DCRTypes.INSERT_ATTRIBUTE;
159
+ return userChanges.some(function (userChange) { var _a; return userChange.data.isRejected || (isInsertType && (0, mdm_sdk_1.isEmptyValue)((_a = userChange.data.value) === null || _a === void 0 ? void 0 : _a.value)); });
160
+ };
161
+ var adjustChangeWithUserChanges = function (change, userChanges) {
162
+ var _a;
163
+ if (getIsChangeRejected(userChanges, change.type)) {
164
+ return null;
165
+ }
166
+ if (change.type === mdm_sdk_1.DCRTypes.UPDATE_ATTRIBUTE && userChanges.length > 0) {
167
+ if ((0, mdm_sdk_1.isEmptyValue)((_a = userChanges[0].data.value) === null || _a === void 0 ? void 0 : _a.value)) {
168
+ return __assign(__assign({}, change), { type: mdm_sdk_1.DCRTypes.DELETE_ATTRIBUTE });
169
+ }
170
+ }
171
+ return change;
172
+ };
173
+ var getCurrentAttributePath = function (attributePath) {
174
+ var parts = attributePath.split('/');
175
+ return parts.slice(0, parts.length % 2 === 0 ? parts.length - 1 : parts.length).join('/');
176
+ };
177
+ var getEntityValueUri = function (entityOrRelationTypeUri, change) {
178
+ if (change.refObjectURI) {
179
+ var relationId = change.refObjectURI.split('/').pop();
180
+ var refAttributeTypeParts = change.refAttributeType.split('/attributes/');
181
+ return "".concat(entityOrRelationTypeUri, "/attributes/").concat(refAttributeTypeParts[1], "/").concat(relationId, "/").concat(change.attributePath);
182
+ }
183
+ return "".concat(entityOrRelationTypeUri, "/attributes/").concat(change.attributePath);
184
+ };
185
+ var hasAttributeValue = function (objectValues, changes, entityUri) {
186
+ var values = (0, ramda_1.clone)(objectValues);
187
+ var _loop_3 = function (change) {
188
+ if (change.type === mdm_sdk_1.DCRTypes.UPDATE_ATTRIBUTE || change.type === mdm_sdk_1.DCRTypes.INSERT_ATTRIBUTE) {
189
+ return { value: true };
190
+ }
191
+ var valueUri = getEntityValueUri(entityUri, change);
192
+ var valueIndex = values.findIndex(function (value) { return value.uri === valueUri; });
193
+ if (change.type === mdm_sdk_1.DCRTypes.DELETE_ATTRIBUTE) {
194
+ if (valueIndex !== -1) {
195
+ values.splice(valueIndex, 1);
196
+ }
197
+ }
198
+ else if (change.type === mdm_sdk_1.DCRTypes.IGNORE_ATTRIBUTE && valueIndex !== -1) {
199
+ values[valueIndex].ignored = change.newPinOrIgnoreValue;
200
+ }
201
+ };
202
+ for (var _i = 0, changes_1 = changes; _i < changes_1.length; _i++) {
203
+ var change = changes_1[_i];
204
+ var state_1 = _loop_3(change);
205
+ if (typeof state_1 === "object")
206
+ return state_1.value;
207
+ }
208
+ return values.filter(mdm_sdk_1.isOv).filter(function (value) { return !(0, mdm_sdk_1.isIgnored)(value); }).length > 0;
209
+ };
210
+ var getEntityTypeUriFromAttributeUri = function (attributeUri) {
211
+ return attributeUri.split('/').slice(0, 3).join('/');
212
+ };
213
+ var getAttributeTypeUriFromLineId = function (attributeTypeUri, lineId) {
214
+ var EXCLUDED_PARTS = new Set(['value', 'newValue', 'oldValue', 'attributes']);
215
+ var lineParts = lineId
216
+ .split('/')
217
+ .slice(2)
218
+ .filter(function (part) {
219
+ if (!isNaN(Number(part)))
220
+ return false;
221
+ return !EXCLUDED_PARTS.has(part);
222
+ });
223
+ return __spreadArray([attributeTypeUri], lineParts, true).join('/attributes/');
224
+ };
225
+ var getEntityTypeUriFromChange = function (change) {
226
+ if (change.type === mdm_sdk_1.DCRTypes.CREATE_ENTITY || change.type === mdm_sdk_1.DCRTypes.CREATE_RELATIONSHIP) {
227
+ return change.objectType || '';
228
+ }
229
+ return getEntityTypeUriFromAttributeUri(change.attributeType || change.objectType || '');
230
+ };
231
+ var getRequiredAttributeUris = function (metadata, typeUri) {
232
+ var requiredAttrTypes = (0, mdm_sdk_1.getRequiredAttributeTypesByTypeUri)(metadata, typeUri, true) || [];
233
+ return requiredAttrTypes.map(function (attr) { return attr.uri; });
234
+ };
235
+ var createRequiredError = function (_a) {
236
+ var attributeType = _a.attributeType, attributeTypeUri = _a.attributeTypeUri, parentUri = _a.parentUri, lineIds = _a.lineIds, metadata = _a.metadata, entityUri = _a.entityUri, entitiesMap = _a.entitiesMap, valueUri = _a.valueUri;
237
+ var error = (0, mdm_sdk_1.buildError)({
238
+ type: mdm_sdk_1.ErrorType.missed,
239
+ attributeType: attributeType,
240
+ attributeTypeUri: attributeTypeUri,
241
+ parentUri: parentUri,
242
+ message: ui_i18n_1.default.text('Attribute is required'),
243
+ source: mdm_sdk_1.ErrorSource.local,
244
+ alwaysShow: true,
245
+ uri: lineIds[0]
246
+ });
247
+ var path = [];
248
+ if ((entitiesMap === null || entitiesMap === void 0 ? void 0 : entitiesMap[entityUri]) && valueUri) {
249
+ path = (0, mdm_sdk_1.evaluateErrorPath)({
250
+ entityUri: entityUri,
251
+ metadata: metadata,
252
+ entitiesMap: entitiesMap
253
+ }, valueUri);
254
+ }
255
+ return {
256
+ error: __assign(__assign({}, error), { path: path }),
257
+ lineIds: lineIds
258
+ };
259
+ };
260
+ var validateRequiredComplexAttributes = function (_a) {
261
+ var _b;
262
+ var metadata = _a.metadata, change = _a.change, userChanges = _a.userChanges, entityUri = _a.entityUri;
263
+ if (userChanges.length === 0 || change.type === mdm_sdk_1.DCRTypes.DELETE_ATTRIBUTE) {
264
+ return [];
265
+ }
266
+ var valueHolder = change.type === mdm_sdk_1.DCRTypes.CREATE_ENTITY || change.type === mdm_sdk_1.DCRTypes.CREATE_RELATIONSHIP ? 'attributes' : 'value';
267
+ var rootAttributeTypeUri = change.refAttributeType || change.attributeType || change.objectType;
268
+ var attributeType = (0, mdm_sdk_1.findAttributeTypeByUri)(metadata, rootAttributeTypeUri);
269
+ var isReferenceType = (0, mdm_sdk_1.isReference)(attributeType);
270
+ var entityTypeUri = isReferenceType ? attributeType.relationshipTypeURI : getEntityTypeUriFromChange(change);
271
+ var requiredAttributeUris = getRequiredAttributeUris(metadata, entityTypeUri);
272
+ var calculateLineIdFromPath = function (path) {
273
+ if (path === void 0) { path = ''; }
274
+ var entityId = entityUri.split('/').pop() || '';
275
+ return "".concat(entityId, "/").concat(change.id, "/newValue").concat(path ? "/".concat(path) : '');
276
+ };
277
+ var checkIsChangeRejected = function (path) {
278
+ var _a, _b, _c;
279
+ var searchLineId = calculateLineIdFromPath(path);
280
+ var lineUserChanges = userChanges.find(function (userChange) { return userChange.lineId === searchLineId; });
281
+ return (((_a = lineUserChanges === null || lineUserChanges === void 0 ? void 0 : lineUserChanges.data) === null || _a === void 0 ? void 0 : _a.isRejected) || (lineUserChanges && (0, mdm_sdk_1.isEmptyValue)((_c = (_b = lineUserChanges === null || lineUserChanges === void 0 ? void 0 : lineUserChanges.data) === null || _b === void 0 ? void 0 : _b.value) === null || _c === void 0 ? void 0 : _c.value)));
282
+ };
283
+ var collectErrors = function (attributes) {
284
+ var errors = [];
285
+ var visitValue = function (value, path) {
286
+ var isRejected = checkIsChangeRejected(path.slice(0, -1).join('/'));
287
+ if (typeof value === 'string') {
288
+ return !isRejected;
289
+ }
290
+ if (isRejected) {
291
+ return false;
292
+ }
293
+ var anyFieldHasValue = false;
294
+ Object.entries(value).forEach(function (_a) {
295
+ var fieldName = _a[0], subAttributes = _a[1];
296
+ var anyChildHasValue = false;
297
+ var attributePath = __spreadArray(__spreadArray([], path, true), [fieldName], false);
298
+ var rejectedLineIds = [];
299
+ subAttributes.forEach(function (subAttribute, index) {
300
+ var childPath = __spreadArray(__spreadArray([], attributePath, true), [index, 'value'], false);
301
+ var childHasValue = visitValue(subAttribute.value, childPath);
302
+ if (!childHasValue) {
303
+ rejectedLineIds.push(calculateLineIdFromPath(childPath.slice(0, -1).join('/')));
304
+ }
305
+ anyChildHasValue = anyChildHasValue || childHasValue;
306
+ });
307
+ anyFieldHasValue = anyFieldHasValue || anyChildHasValue;
308
+ if (!anyChildHasValue) {
309
+ var attributeTypeUri = getAttributeTypeUriFromLineId(isReferenceType ? entityTypeUri : rootAttributeTypeUri, rejectedLineIds[0]);
310
+ var isRequired = requiredAttributeUris.includes(attributeTypeUri);
311
+ if (isRequired) {
312
+ errors.push(createRequiredError({
313
+ attributeType: (0, mdm_sdk_1.findAttributeTypeByUri)(metadata, attributeTypeUri),
314
+ attributeTypeUri: attributeTypeUri,
315
+ lineIds: rejectedLineIds
316
+ }));
317
+ }
318
+ }
319
+ });
320
+ return anyFieldHasValue;
321
+ };
322
+ var hasValue = visitValue(attributes, [valueHolder]);
323
+ if (!hasValue && attributeType.required) {
324
+ errors.push(createRequiredError({
325
+ attributeType: attributeType,
326
+ attributeTypeUri: attributeType.uri,
327
+ lineIds: [calculateLineIdFromPath()]
328
+ }));
329
+ }
330
+ return errors;
331
+ };
332
+ return collectErrors((_b = change.newValue) === null || _b === void 0 ? void 0 : _b[valueHolder]);
333
+ };
@@ -44,30 +44,40 @@ var ramda_1 = require("ramda");
44
44
  var MdmModuleContext_1 = require("../../../contexts/MdmModuleContext");
45
45
  var ChangeRequestEditorContext_1 = require("../contexts/ChangeRequestEditorContext");
46
46
  var dcr_1 = require("../helpers/dcr");
47
+ var useDCRValidation_1 = require("./useDCRValidation");
47
48
  var withChangeRequestId = function (dcrUri) { return function (url) {
48
49
  return url + (url.includes('?') ? '&' : '?') + "changeRequestId=".concat(encodeURIComponent(dcrUri.split('/')[1]));
49
50
  }; };
50
51
  var useApplyDcrChanges = function (dcr) {
51
52
  var getLinesByChangeId = (0, react_context_selector_1.useContextSelector)(ChangeRequestEditorContext_1.ChangeRequestEditorContext, function (context) { return context.getLinesByChangeId; });
52
53
  var metadata = (0, MdmModuleContext_1.useMdmMetadata)();
54
+ var getErrors = (0, useDCRValidation_1.useDCRValidation)(dcr);
53
55
  var applyDcrChanges = (0, react_1.useCallback)(function () { return __awaiter(void 0, void 0, void 0, function () {
54
- var _a, rejectedChangeIds, updatedChanges, deleteEntityAttributes, deleteRelationAttributes, deleteChangeResults, deleteEntityAttributesResults, deleteRelationAttributesResults, deleteChangeFailures, error_1, deleteEntityAttributesFailures, deleteRelationAttributesFailures;
56
+ var errors, _a, rejectedChangeIds, updatedChanges, deleteEntityAttributes, deleteRelationAttributes, deleteChangeResults, deleteEntityAttributesResults, deleteRelationAttributesResults, deleteChangeFailures, error_1, deleteEntityAttributesFailures, deleteRelationAttributesFailures;
55
57
  return __generator(this, function (_b) {
56
58
  switch (_b.label) {
57
59
  case 0:
58
- if (!(dcr === null || dcr === void 0 ? void 0 : dcr.changes)) return [3 /*break*/, 11];
60
+ if (!(dcr === null || dcr === void 0 ? void 0 : dcr.changes)) return [3 /*break*/, 12];
61
+ return [4 /*yield*/, getErrors()];
62
+ case 1:
63
+ errors = _b.sent();
64
+ if (errors.length > 0) {
65
+ return [2 /*return*/, {
66
+ proceed: false
67
+ }];
68
+ }
59
69
  _a = (0, dcr_1.buildDCRSavePlan)(dcr.changes, getLinesByChangeId, metadata), rejectedChangeIds = _a.rejectedChangeIds, updatedChanges = _a.updatedChanges, deleteEntityAttributes = _a.deleteEntityAttributes, deleteRelationAttributes = _a.deleteRelationAttributes;
60
70
  deleteChangeResults = [];
61
71
  deleteEntityAttributesResults = [];
62
72
  deleteRelationAttributesResults = [];
63
- if (!(rejectedChangeIds.length > 0)) return [3 /*break*/, 2];
73
+ if (!(rejectedChangeIds.length > 0)) return [3 /*break*/, 3];
64
74
  return [4 /*yield*/, (0, mdm_sdk_1.promiseAllSettled)(rejectedChangeIds.map(function (changeId) {
65
75
  return (0, mdm_sdk_1.deleteChangeRequestItem)({ dcrUri: dcr.uri, changeItemId: changeId });
66
76
  }))];
67
- case 1:
68
- deleteChangeResults = _b.sent();
69
- _b.label = 2;
70
77
  case 2:
78
+ deleteChangeResults = _b.sent();
79
+ _b.label = 3;
80
+ case 3:
71
81
  deleteChangeFailures = deleteChangeResults.filter(function (result) { return result.status === 'rejected'; });
72
82
  if (deleteChangeFailures.length) {
73
83
  return [2 /*return*/, {
@@ -75,22 +85,22 @@ var useApplyDcrChanges = function (dcr) {
75
85
  error: new Error("Failed to delete DCR change(s): ".concat(deleteChangeFailures.map(function (result) { return result.reason; }).join(', ')))
76
86
  }];
77
87
  }
78
- if (!!(0, ramda_1.isEmpty)(updatedChanges)) return [3 /*break*/, 6];
79
- _b.label = 3;
80
- case 3:
81
- _b.trys.push([3, 5, , 6]);
82
- return [4 /*yield*/, (0, mdm_sdk_1.updateChangeRequest)({ dcrUri: dcr.uri, payload: updatedChanges })];
88
+ if (!!(0, ramda_1.isEmpty)(updatedChanges)) return [3 /*break*/, 7];
89
+ _b.label = 4;
83
90
  case 4:
84
- _b.sent();
85
- return [3 /*break*/, 6];
91
+ _b.trys.push([4, 6, , 7]);
92
+ return [4 /*yield*/, (0, mdm_sdk_1.updateChangeRequest)({ dcrUri: dcr.uri, payload: updatedChanges })];
86
93
  case 5:
94
+ _b.sent();
95
+ return [3 /*break*/, 7];
96
+ case 6:
87
97
  error_1 = _b.sent();
88
98
  return [2 /*return*/, {
89
99
  proceed: false,
90
100
  error: error_1
91
101
  }];
92
- case 6:
93
- if (!!(0, ramda_1.isEmpty)(deleteEntityAttributes)) return [3 /*break*/, 8];
102
+ case 7:
103
+ if (!!(0, ramda_1.isEmpty)(deleteEntityAttributes)) return [3 /*break*/, 9];
94
104
  return [4 /*yield*/, (0, mdm_sdk_1.promiseAllSettled)(Object.entries(deleteEntityAttributes).map(function (_a) {
95
105
  var entityUri = _a[0], diff = _a[1];
96
106
  return (0, mdm_sdk_1.entityCumulativeUpdate)({
@@ -99,10 +109,10 @@ var useApplyDcrChanges = function (dcr) {
99
109
  uriPreprocessor: withChangeRequestId(dcr.uri)
100
110
  });
101
111
  }))];
102
- case 7:
103
- deleteEntityAttributesResults = _b.sent();
104
- _b.label = 8;
105
112
  case 8:
113
+ deleteEntityAttributesResults = _b.sent();
114
+ _b.label = 9;
115
+ case 9:
106
116
  deleteEntityAttributesFailures = deleteEntityAttributesResults.filter(function (result) { return result.status === 'rejected'; });
107
117
  if (deleteEntityAttributesFailures.length) {
108
118
  return [2 /*return*/, {
@@ -110,7 +120,7 @@ var useApplyDcrChanges = function (dcr) {
110
120
  error: new Error("Failed to delete entity attributes: ".concat(deleteEntityAttributesFailures.map(function (result) { return result.reason; }).join(', ')))
111
121
  }];
112
122
  }
113
- if (!!(0, ramda_1.isEmpty)(deleteRelationAttributes)) return [3 /*break*/, 10];
123
+ if (!!(0, ramda_1.isEmpty)(deleteRelationAttributes)) return [3 /*break*/, 11];
114
124
  return [4 /*yield*/, (0, mdm_sdk_1.promiseAllSettled)(Object.entries(deleteRelationAttributes).map(function (_a) {
115
125
  var relationUri = _a[0], diff = _a[1];
116
126
  return (0, mdm_sdk_1.updateRelationWithDiff)({
@@ -119,10 +129,10 @@ var useApplyDcrChanges = function (dcr) {
119
129
  uriPreprocessor: withChangeRequestId(dcr.uri)
120
130
  });
121
131
  }))];
122
- case 9:
123
- deleteRelationAttributesResults = _b.sent();
124
- _b.label = 10;
125
132
  case 10:
133
+ deleteRelationAttributesResults = _b.sent();
134
+ _b.label = 11;
135
+ case 11:
126
136
  deleteRelationAttributesFailures = deleteRelationAttributesResults.filter(function (result) { return result.status === 'rejected'; });
127
137
  if (deleteRelationAttributesFailures.length) {
128
138
  return [2 /*return*/, {
@@ -133,13 +143,13 @@ var useApplyDcrChanges = function (dcr) {
133
143
  return [2 /*return*/, {
134
144
  proceed: true
135
145
  }];
136
- case 11: return [2 /*return*/, {
146
+ case 12: return [2 /*return*/, {
137
147
  proceed: false,
138
148
  error: new Error('No changes to apply')
139
149
  }];
140
150
  }
141
151
  });
142
- }); }, [dcr, getLinesByChangeId, metadata]);
152
+ }); }, [dcr, getLinesByChangeId, metadata, getErrors]);
143
153
  return applyDcrChanges;
144
154
  };
145
155
  exports.useApplyDcrChanges = useApplyDcrChanges;
@@ -0,0 +1,5 @@
1
+ import { ChangeRequest } from '@reltio/mdm-sdk';
2
+ export declare const useDCRValidation: (dcr: ChangeRequest) => () => Promise<{
3
+ error: import("@reltio/mdm-sdk").AttributeError;
4
+ lineIds: string[];
5
+ }[]>;
@@ -0,0 +1,153 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.useDCRValidation = void 0;
51
+ var react_1 = require("react");
52
+ var react_context_selector_1 = require("@fluentui/react-context-selector");
53
+ var mdm_sdk_1 = require("@reltio/mdm-sdk");
54
+ var MdmModuleContext_1 = require("../../../contexts/MdmModuleContext");
55
+ var useSafePromise_1 = require("../../../hooks/useSafePromise");
56
+ var context_1 = require("../../../contexts/MdmModuleContext/context");
57
+ var ChangeRequestEditorContext_1 = require("../contexts/ChangeRequestEditorContext");
58
+ var validation_1 = require("../helpers/validation");
59
+ var useDCRValidation = function (dcr) {
60
+ var metadata = (0, MdmModuleContext_1.useMdmMetadata)();
61
+ var currentEntity = (0, MdmModuleContext_1.useMdmEntity)();
62
+ var dcrReviewValidation = (0, MdmModuleContext_1.useMdmDcrReviewValidation)();
63
+ var relationsState = (0, react_context_selector_1.useContextSelector)(context_1.MdmModuleValuesContext, function (context) { return context.relations; });
64
+ var getAllChanges = (0, react_context_selector_1.useContextSelector)(ChangeRequestEditorContext_1.ChangeRequestEditorContext, function (context) { return context.getAllChanges; });
65
+ var setErrors = (0, react_context_selector_1.useContextSelector)(ChangeRequestEditorContext_1.ChangeRequestEditorContext, function (context) { return context.setErrors; });
66
+ var relationsRef = (0, react_1.useRef)(null);
67
+ var safePromise = (0, useSafePromise_1.useSafePromise)();
68
+ var findRelationInStore = (0, react_1.useCallback)(function (uri) {
69
+ if (!relationsState)
70
+ return null;
71
+ for (var viewId in relationsState) {
72
+ var viewState = relationsState[viewId];
73
+ if (viewState === null || viewState === void 0 ? void 0 : viewState.connections) {
74
+ return (0, mdm_sdk_1.findConnectionRelationObjectByRelationUri)(viewState.connections, uri);
75
+ }
76
+ }
77
+ return null;
78
+ }, [relationsState]);
79
+ var urisFromDcr = (0, react_1.useMemo)(function () {
80
+ var result = [];
81
+ if (!(dcr === null || dcr === void 0 ? void 0 : dcr.changes))
82
+ return result;
83
+ for (var key in dcr.changes) {
84
+ var changes = dcr.changes[key] || [];
85
+ var hasCreate = changes.some(function (c) { return (c === null || c === void 0 ? void 0 : c.type) === mdm_sdk_1.DCRTypes.CREATE_ENTITY || (c === null || c === void 0 ? void 0 : c.type) === mdm_sdk_1.DCRTypes.CREATE_RELATIONSHIP; });
86
+ if (!hasCreate) {
87
+ result.push(key);
88
+ }
89
+ }
90
+ return result;
91
+ }, [dcr]);
92
+ var localObjects = (0, react_1.useMemo)(function () {
93
+ var currentEntityObject = {};
94
+ currentEntityObject[currentEntity === null || currentEntity === void 0 ? void 0 : currentEntity.uri] = currentEntity;
95
+ return urisFromDcr.reduce(function (acc, uri) {
96
+ if ((0, mdm_sdk_1.isRelationUri)(uri)) {
97
+ var localRelation = findRelationInStore(uri);
98
+ if (localRelation) {
99
+ acc[uri] = localRelation;
100
+ }
101
+ }
102
+ return acc;
103
+ }, currentEntityObject);
104
+ }, [urisFromDcr, findRelationInStore, currentEntity]);
105
+ (0, react_1.useEffect)(function () {
106
+ if (!dcrReviewValidation || !urisFromDcr.length || (relationsRef === null || relationsRef === void 0 ? void 0 : relationsRef.current))
107
+ return;
108
+ var relationsPromises = [];
109
+ urisFromDcr.forEach(function (uri) {
110
+ if ((0, mdm_sdk_1.isRelationUri)(uri) && !localObjects[uri]) {
111
+ relationsPromises.push((0, mdm_sdk_1.getRelation)(uri));
112
+ }
113
+ });
114
+ relationsRef.current = safePromise(Promise.all(relationsPromises));
115
+ }, [dcrReviewValidation, urisFromDcr, findRelationInStore, safePromise, localObjects]);
116
+ var getErrors = (0, react_1.useCallback)(function () { return __awaiter(void 0, void 0, void 0, function () {
117
+ var relations, _a, loadedRelationsObject, objectsByUri, userChanges, errors;
118
+ return __generator(this, function (_b) {
119
+ switch (_b.label) {
120
+ case 0:
121
+ if (!dcrReviewValidation) {
122
+ return [2 /*return*/, []];
123
+ }
124
+ if (!relationsRef.current) return [3 /*break*/, 2];
125
+ return [4 /*yield*/, relationsRef.current];
126
+ case 1:
127
+ _a = _b.sent();
128
+ return [3 /*break*/, 3];
129
+ case 2:
130
+ _a = [];
131
+ _b.label = 3;
132
+ case 3:
133
+ relations = _a;
134
+ loadedRelationsObject = relations.reduce(function (acc, relation) {
135
+ acc[relation.uri] = relation;
136
+ return acc;
137
+ }, {});
138
+ objectsByUri = __assign(__assign({}, localObjects), loadedRelationsObject);
139
+ userChanges = getAllChanges();
140
+ errors = (0, validation_1.getValidationErrors)({
141
+ changes: dcr === null || dcr === void 0 ? void 0 : dcr.changes,
142
+ userChanges: userChanges,
143
+ entitiesOrRelations: objectsByUri,
144
+ metadata: metadata
145
+ });
146
+ setErrors(errors);
147
+ return [2 /*return*/, errors];
148
+ }
149
+ });
150
+ }); }, [dcrReviewValidation, dcr === null || dcr === void 0 ? void 0 : dcr.changes, getAllChanges, localObjects, metadata, setErrors]);
151
+ return getErrors;
152
+ };
153
+ exports.useDCRValidation = useDCRValidation;
@@ -1,4 +1,4 @@
1
- import { AttributeType, DCRAttributeValue, DCROperationTypes, DCRRelationInfo, EnrichedChangeValue, TRelationType, ChangeValue } from '@reltio/mdm-sdk';
1
+ import { AttributeType, DCRAttributeValue, DCROperationTypes, DCRRelationInfo, EnrichedChangeValue, TRelationType, ChangeValue, SimpleAttributeValue, PrimitiveValue } from '@reltio/mdm-sdk';
2
2
  export type TaskAction = {
3
3
  text: string;
4
4
  onClick: (comment: string) => void;
@@ -23,3 +23,10 @@ export type BeforeActionOutcome = {
23
23
  proceed: boolean;
24
24
  error?: unknown;
25
25
  };
26
+ export type LineDataValue = SimpleAttributeValue | {
27
+ value: string[] | PrimitiveValue;
28
+ };
29
+ export type LineData = {
30
+ value?: LineDataValue;
31
+ isRejected?: boolean;
32
+ };
@@ -3,8 +3,9 @@ import { ScrollToElementContext } from '../../contexts/ScrollToElementContext';
3
3
  type Props = {
4
4
  highlightedError: ContextType<typeof ScrollToElementContext> | null;
5
5
  isSimple?: boolean;
6
+ className?: string;
6
7
  };
7
- export declare const useScrollToAttributeError: ({ highlightedError: context, isSimple }: Props) => {
8
+ export declare const useScrollToAttributeError: ({ highlightedError: context, isSimple, className }: Props) => {
8
9
  ref: import("react").MutableRefObject<HTMLDivElement>;
9
10
  errorClassName: string;
10
11
  } | {