@reltio/components 1.4.2181 → 1.4.2183

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 (53) hide show
  1. package/ActionButton/ActionButton.js +1 -1
  2. package/CommentDialog/CommentDialog.d.ts +14 -0
  3. package/CommentDialog/CommentDialog.js +43 -0
  4. package/CommentDialog/CommentDialog.module.css.js +9 -0
  5. package/cjs/ActionButton/ActionButton.js +1 -1
  6. package/cjs/CommentDialog/CommentDialog.d.ts +14 -0
  7. package/cjs/CommentDialog/CommentDialog.js +73 -0
  8. package/cjs/CommentDialog/CommentDialog.module.css.js +9 -0
  9. package/cjs/contexts/CommentDialogContext/index.d.ts +16 -0
  10. package/cjs/contexts/CommentDialogContext/index.js +68 -0
  11. package/cjs/contexts/WorkflowDefinitionsContext/index.d.ts +11 -0
  12. package/cjs/contexts/WorkflowDefinitionsContext/index.js +25 -0
  13. package/cjs/features/workflow/AddWorkflowDialog/AddWorkflowDialog.js +15 -11
  14. package/cjs/features/workflow/AddWorkflowDialog/AddWorkflowDialog.spec.js +10 -9
  15. package/cjs/features/workflow/AddWorkflowDialog/styles.d.ts +1 -1
  16. package/cjs/features/workflow/AddWorkflowDialog/styles.js +11 -4
  17. package/cjs/features/workflow/ReassignButton/components/ReassignDialog/styles.d.ts +1 -1
  18. package/cjs/features/workflow/TaskActionButtons/TaskActionButtons.spec.js +54 -1
  19. package/cjs/features/workflow/WorkflowTaskCard/WorkflowTaskCard.test.js +3 -1
  20. package/cjs/features/workflow/WorkflowTaskCard/components/DataChangeRequestTaskCard/DataChangeRequestTaskCard.spec.js +3 -1
  21. package/cjs/features/workflow/WorkflowTaskCard/components/GenericWorkflowTaskCard/GenericWorkflowTaskCard.spec.js +9 -7
  22. package/cjs/features/workflow/WorkflowTaskCard/components/PotentialMatchTaskCard/PotentialMatchTaskCard.spec.js +3 -1
  23. package/cjs/features/workflow/helpers/common.d.ts +2 -1
  24. package/cjs/features/workflow/helpers/common.js +3 -1
  25. package/cjs/features/workflow/hooks/useWorkflowActions.js +82 -22
  26. package/cjs/features/workflow/hooks/useWorkflowDefinitions.d.ts +7 -2
  27. package/cjs/features/workflow/hooks/useWorkflowDefinitions.js +20 -7
  28. package/cjs/features/workflow/index.d.ts +1 -0
  29. package/cjs/features/workflow/index.js +4 -1
  30. package/cjs/hooks/useRequestDCRReview/useRequestDCRReview.js +88 -17
  31. package/contexts/CommentDialogContext/index.d.ts +16 -0
  32. package/contexts/CommentDialogContext/index.js +40 -0
  33. package/contexts/WorkflowDefinitionsContext/index.d.ts +11 -0
  34. package/contexts/WorkflowDefinitionsContext/index.js +18 -0
  35. package/features/workflow/AddWorkflowDialog/AddWorkflowDialog.js +15 -11
  36. package/features/workflow/AddWorkflowDialog/AddWorkflowDialog.spec.js +10 -9
  37. package/features/workflow/AddWorkflowDialog/styles.d.ts +1 -1
  38. package/features/workflow/AddWorkflowDialog/styles.js +11 -4
  39. package/features/workflow/ReassignButton/components/ReassignDialog/styles.d.ts +1 -1
  40. package/features/workflow/TaskActionButtons/TaskActionButtons.spec.js +55 -2
  41. package/features/workflow/WorkflowTaskCard/WorkflowTaskCard.test.js +3 -1
  42. package/features/workflow/WorkflowTaskCard/components/DataChangeRequestTaskCard/DataChangeRequestTaskCard.spec.js +3 -1
  43. package/features/workflow/WorkflowTaskCard/components/GenericWorkflowTaskCard/GenericWorkflowTaskCard.spec.js +9 -7
  44. package/features/workflow/WorkflowTaskCard/components/PotentialMatchTaskCard/PotentialMatchTaskCard.spec.js +3 -1
  45. package/features/workflow/helpers/common.d.ts +2 -1
  46. package/features/workflow/helpers/common.js +2 -1
  47. package/features/workflow/hooks/useWorkflowActions.js +82 -22
  48. package/features/workflow/hooks/useWorkflowDefinitions.d.ts +7 -2
  49. package/features/workflow/hooks/useWorkflowDefinitions.js +22 -9
  50. package/features/workflow/index.d.ts +1 -0
  51. package/features/workflow/index.js +2 -0
  52. package/hooks/useRequestDCRReview/useRequestDCRReview.js +90 -19
  53. package/package.json +2 -2
@@ -72,6 +72,7 @@ var mdm_sdk_1 = require("@reltio/mdm-sdk");
72
72
  var constants_1 = require("../../../../../constants");
73
73
  var MdmModuleContext_1 = require("../../../../../contexts/MdmModuleContext");
74
74
  var WorkflowTasksContext_1 = require("../../../../../contexts/WorkflowTasksContext");
75
+ var CommentDialogContext_1 = require("../../../../../contexts/CommentDialogContext");
75
76
  var ErrorPopup_1 = require("../../../../../ErrorPopup");
76
77
  var task_test_data_1 = require("./task.test-data");
77
78
  var GenericWorkflowTaskCard_1 = require("./GenericWorkflowTaskCard");
@@ -111,10 +112,11 @@ var setUp = function (_a) {
111
112
  return __assign(__assign({}, (0, react_2.render)(react_1.default.createElement(MdmModuleContext_1.MdmModuleProvider, { values: mdmValues, actions: { errorSet: errorSet } },
112
113
  react_1.default.createElement(styles_2.ThemeProvider, { theme: (0, styles_1.createTheme)(constants_1.theme) },
113
114
  react_1.default.createElement(LocalizationProvider_1.LocalizationProvider, { dateAdapter: AdapterMoment_1.AdapterMoment },
114
- react_1.default.createElement(WorkflowTasksContext_1.WorkflowTasksContext.Provider, { value: workflowTaskContextValue },
115
- react_1.default.createElement(GenericWorkflowTaskCard_1.GenericWorkflowTaskCard, { task: task },
116
- react_1.default.createElement("div", { className: "someChildren" }, "some children")),
117
- react_1.default.createElement(ErrorPopup_1.ErrorPopup, { showErrorFromStore: true }))))))), { user: user });
115
+ react_1.default.createElement(CommentDialogContext_1.CommentDialogProvider, null,
116
+ react_1.default.createElement(WorkflowTasksContext_1.WorkflowTasksContext.Provider, { value: workflowTaskContextValue },
117
+ react_1.default.createElement(GenericWorkflowTaskCard_1.GenericWorkflowTaskCard, { task: task },
118
+ react_1.default.createElement("div", { className: "someChildren" }, "some children")),
119
+ react_1.default.createElement(ErrorPopup_1.ErrorPopup, { showErrorFromStore: true })))))))), { user: user });
118
120
  };
119
121
  var checkAlwaysVisibleElements = function (task) {
120
122
  var processDefinitionDisplayName = task.processDefinitionDisplayName, createdBy = task.createdBy, createTime = task.createTime, dueDate = task.dueDate, displayName = task.displayName;
@@ -305,7 +307,7 @@ describe('GenericWorkflowTaskCard tests', function () {
305
307
  tenant: tenant.id,
306
308
  taskId: defaultTask.taskId,
307
309
  action: defaultTask.possibleActions[1].action,
308
- processInstanceComment: undefined
310
+ processInstanceComment: null
309
311
  });
310
312
  expect(onActionSuccess).toHaveBeenCalledWith(defaultTask.possibleActions[1].action);
311
313
  return [2 /*return*/];
@@ -330,7 +332,7 @@ describe('GenericWorkflowTaskCard tests', function () {
330
332
  tenant: tenant.id,
331
333
  taskId: defaultTask.taskId,
332
334
  action: defaultTask.possibleActions[1].action,
333
- processInstanceComment: undefined
335
+ processInstanceComment: null
334
336
  });
335
337
  expect(onActionSuccess).toHaveBeenCalledWith(defaultTask.possibleActions[1].action);
336
338
  return [2 /*return*/];
@@ -375,7 +377,7 @@ describe('GenericWorkflowTaskCard tests', function () {
375
377
  tenant: tenant.id,
376
378
  taskId: defaultTask.taskId,
377
379
  action: defaultTask.possibleActions[1].action,
378
- processInstanceComment: undefined
380
+ processInstanceComment: null
379
381
  });
380
382
  expect(onActionSuccess).not.toHaveBeenCalled();
381
383
  expect(react_2.screen.getByText('Error')).toBeInTheDocument();
@@ -57,6 +57,7 @@ var mdm_sdk_1 = require("@reltio/mdm-sdk");
57
57
  var LocalizationProvider_1 = require("@mui/x-date-pickers/LocalizationProvider");
58
58
  var AdapterMoment_1 = require("@mui/x-date-pickers/AdapterMoment");
59
59
  var MdmModuleContext_1 = require("../../../../../contexts/MdmModuleContext");
60
+ var CommentDialogContext_1 = require("../../../../../contexts/CommentDialogContext");
60
61
  var PotentialMatchTaskCard_1 = require("./PotentialMatchTaskCard");
61
62
  describe('PotentialMatchTaskCard tests', function () {
62
63
  var mdmValues = {
@@ -109,7 +110,8 @@ describe('PotentialMatchTaskCard tests', function () {
109
110
  var Providers = function (_a) {
110
111
  var children = _a.children;
111
112
  return (react_1.default.createElement(LocalizationProvider_1.LocalizationProvider, { dateAdapter: AdapterMoment_1.AdapterMoment },
112
- react_1.default.createElement(MdmModuleContext_1.MdmModuleProvider, { values: mdmValues }, children)));
113
+ react_1.default.createElement(CommentDialogContext_1.CommentDialogProvider, null,
114
+ react_1.default.createElement(MdmModuleContext_1.MdmModuleProvider, { values: mdmValues }, children))));
113
115
  };
114
116
  return __assign({ user: user }, (0, react_2.render)(react_1.default.createElement(PotentialMatchTaskCard_1.PotentialMatchTaskCard, __assign({}, defaultProps, props)), { wrapper: Providers }));
115
117
  };
@@ -1,4 +1,4 @@
1
- import { AttributeType, DCRAttributeValue, DCRObjectsInfo, DCROperationTypes, DCRValue, WorkflowTaskData } from '@reltio/mdm-sdk';
1
+ import { AttributeType, DCRAttributeValue, DCRObjectsInfo, DCROperationTypes, DCRValue, WorkflowTaskData, WorkflowDefinition } from '@reltio/mdm-sdk';
2
2
  export declare const getOperationType: (type: string, oldValue?: DCRAttributeValue) => DCROperationTypes;
3
3
  export declare const getOperationLabel: (operation: DCROperationTypes) => string;
4
4
  export declare const getAttributeDescription: (attrType: AttributeType, value: DCRAttributeValue, currentEntityUri: string, objectsInfo?: DCRObjectsInfo) => {
@@ -11,3 +11,4 @@ export declare const getDCRUri: (objectUris?: string[]) => string;
11
11
  export declare const getDCRId: (objectUris?: string[]) => string;
12
12
  export declare const isOpenTask: (isOpen: WorkflowTaskData["isOpen"]) => boolean;
13
13
  export declare const isRequestedTask: (processTypes: string[], assignee: string) => (task: WorkflowTaskData) => boolean;
14
+ export declare const findWorkflowDefinitionByType: (definitions: WorkflowDefinition[], type: string) => WorkflowDefinition | undefined;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.isRequestedTask = exports.isOpenTask = exports.getDCRId = exports.getDCRUri = exports.getSuggestionsCount = exports.getDataTypeDefinition = exports.getAttributeDescription = exports.getOperationLabel = exports.getOperationType = void 0;
6
+ exports.findWorkflowDefinitionByType = exports.isRequestedTask = exports.isOpenTask = exports.getDCRId = exports.getDCRUri = exports.getSuggestionsCount = exports.getDataTypeDefinition = exports.getAttributeDescription = exports.getOperationLabel = exports.getOperationType = void 0;
7
7
  var ramda_1 = require("ramda");
8
8
  var ui_i18n_1 = __importDefault(require("ui-i18n"));
9
9
  var mdm_sdk_1 = require("@reltio/mdm-sdk");
@@ -80,3 +80,5 @@ var isRequestedTask = function (processTypes, assignee) { return function (task)
80
80
  return (!processTypes || processTypes.includes(task.processType)) && (!assignee || assignee === task.assignee);
81
81
  }; };
82
82
  exports.isRequestedTask = isRequestedTask;
83
+ var findWorkflowDefinitionByType = function (definitions, type) { return definitions.find((0, ramda_1.propEq)('type', type)); };
84
+ exports.findWorkflowDefinitionByType = findWorkflowDefinitionByType;
@@ -1,4 +1,40 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ 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);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
2
38
  Object.defineProperty(exports, "__esModule", { value: true });
3
39
  exports.useWorkflowActions = void 0;
4
40
  var react_1 = require("react");
@@ -7,6 +43,7 @@ var errors_1 = require("../helpers/errors");
7
43
  var common_1 = require("../helpers/common");
8
44
  var WorkflowTasksContext_1 = require("../../../contexts/WorkflowTasksContext");
9
45
  var MdmModuleContext_1 = require("../../../contexts/MdmModuleContext");
46
+ var CommentDialogContext_1 = require("../../../contexts/CommentDialogContext");
10
47
  var useWorkflowActions = function (task, onActionSuccess) {
11
48
  var _a = task !== null && task !== void 0 ? task : {}, possibleActions = _a.possibleActions, assignee = _a.assignee, taskId = _a.taskId, isOpen = _a.isOpen;
12
49
  var workflowTasks = (0, react_1.useContext)(WorkflowTasksContext_1.WorkflowTasksContext);
@@ -14,34 +51,57 @@ var useWorkflowActions = function (task, onActionSuccess) {
14
51
  var environment = (0, MdmModuleContext_1.useMdmWorkflowEnvironmentUrl)();
15
52
  var tenant = (0, MdmModuleContext_1.useMdmTenant)();
16
53
  var username = (0, MdmModuleContext_1.useMdmUsername)();
54
+ var showCommentDialog = (0, CommentDialogContext_1.useCommentDialog)();
17
55
  var _b = (0, react_1.useState)(false), actionRequestIsInProgress = _b[0], setActionRequestIsInProgress = _b[1];
18
56
  var handleActionSuccess = onActionSuccess !== null && onActionSuccess !== void 0 ? onActionSuccess : workflowTasks === null || workflowTasks === void 0 ? void 0 : workflowTasks.onActionSuccess;
19
- var performTaskAction = (0, react_1.useCallback)(function (action) { return function (comment) {
20
- if (workflowPath && taskId) {
21
- setActionRequestIsInProgress(true);
22
- var processInstanceComment = typeof comment === 'string' && comment.length ? comment : undefined;
23
- (0, mdm_sdk_1.runTaskAction)({
24
- taskId: taskId,
25
- workflowPath: workflowPath,
26
- environment: environment,
27
- tenant: tenant,
28
- action: action,
29
- processInstanceComment: processInstanceComment
30
- })
31
- .then(function () {
32
- handleActionSuccess === null || handleActionSuccess === void 0 ? void 0 : handleActionSuccess(action);
33
- })
34
- .catch(errors_1.showWorkflowError)
35
- .finally(function () {
36
- setActionRequestIsInProgress(false);
57
+ var performTaskAction = (0, react_1.useCallback)(function (action, commentRequired) {
58
+ return function (comment) { return __awaiter(void 0, void 0, void 0, function () {
59
+ var processInstanceComment;
60
+ return __generator(this, function (_a) {
61
+ switch (_a.label) {
62
+ case 0:
63
+ if (!(workflowPath && taskId)) return [3 /*break*/, 3];
64
+ setActionRequestIsInProgress(true);
65
+ processInstanceComment = typeof comment === 'string' && comment.length ? comment : null;
66
+ if (!(commentRequired && !processInstanceComment)) return [3 /*break*/, 2];
67
+ return [4 /*yield*/, showCommentDialog()];
68
+ case 1:
69
+ processInstanceComment = _a.sent();
70
+ if (processInstanceComment === null) {
71
+ setActionRequestIsInProgress(false);
72
+ return [2 /*return*/];
73
+ }
74
+ _a.label = 2;
75
+ case 2:
76
+ (0, mdm_sdk_1.runTaskAction)({
77
+ taskId: taskId,
78
+ workflowPath: workflowPath,
79
+ environment: environment,
80
+ tenant: tenant,
81
+ action: action,
82
+ processInstanceComment: processInstanceComment
83
+ })
84
+ .then(function () {
85
+ handleActionSuccess === null || handleActionSuccess === void 0 ? void 0 : handleActionSuccess(action);
86
+ })
87
+ .catch(errors_1.showWorkflowError)
88
+ .finally(function () {
89
+ setActionRequestIsInProgress(false);
90
+ });
91
+ _a.label = 3;
92
+ case 3: return [2 /*return*/];
93
+ }
37
94
  });
38
- }
39
- }; }, [workflowPath, taskId, environment, tenant, handleActionSuccess]);
95
+ }); };
96
+ }, [workflowPath, taskId, environment, tenant, handleActionSuccess, showCommentDialog]);
40
97
  var actions = (0, react_1.useMemo)(function () {
41
98
  return username === assignee && (0, common_1.isOpenTask)(isOpen)
42
99
  ? (possibleActions || []).map(function (_a) {
43
- var action = _a.action, label = _a.label;
44
- return ({ text: label, onClick: performTaskAction(action) });
100
+ var action = _a.action, label = _a.label, commentRequired = _a.commentRequired;
101
+ return ({
102
+ text: label,
103
+ onClick: performTaskAction(action, commentRequired)
104
+ });
45
105
  })
46
106
  : [];
47
107
  }, [possibleActions, performTaskAction, username, assignee, isOpen]);
@@ -1,3 +1,8 @@
1
- export declare const useWorkflowDefinitions: () => {
2
- definitions: any[];
1
+ import { WorkflowDefinition } from '@reltio/mdm-sdk';
2
+ export declare const useWorkflowDefinitions: ({ all, canViewDefinitions }?: {
3
+ all?: boolean;
4
+ canViewDefinitions?: boolean;
5
+ }) => {
6
+ definitions: WorkflowDefinition[];
7
+ loading: boolean;
3
8
  };
@@ -11,27 +11,40 @@ var filterDefinitions = function (definitions, entityTypeUri) {
11
11
  return manualStart && (!objectTypes || (objectTypes === null || objectTypes === void 0 ? void 0 : objectTypes.some(function (uri) { return uri === entityTypeUri; })));
12
12
  });
13
13
  };
14
- var useWorkflowDefinitions = function () {
15
- var _a = (0, react_1.useState)([]), definitions = _a[0], setDefinitions = _a[1];
14
+ var memoizedProcessDefinitions = (0, mdm_sdk_1.memoizeWith)(function (_a) {
15
+ var workflowPath = _a.workflowPath, environment = _a.environment, tenant = _a.tenant;
16
+ return "".concat(workflowPath, "-").concat(environment, "-").concat(tenant);
17
+ }, mdm_sdk_1.processDefinitions);
18
+ var useWorkflowDefinitions = function (_a) {
19
+ var _b = _a === void 0 ? {} : _a, _c = _b.all, all = _c === void 0 ? false : _c, _d = _b.canViewDefinitions, canViewDefinitions = _d === void 0 ? true : _d;
20
+ var _e = (0, react_1.useState)([]), definitions = _e[0], setDefinitions = _e[1];
21
+ var _f = (0, react_1.useState)(false), loading = _f[0], setLoading = _f[1];
16
22
  var workflowPath = (0, MdmModuleContext_1.useMdmWorkflowPath)();
17
23
  var environment = (0, MdmModuleContext_1.useMdmWorkflowEnvironmentUrl)();
18
24
  var tenant = (0, MdmModuleContext_1.useMdmTenant)();
19
25
  var entity = (0, MdmModuleContext_1.useMdmEntity)();
20
- var entityType = entity.type;
26
+ var entityType = entity === null || entity === void 0 ? void 0 : entity.type;
21
27
  var safePromise = (0, useSafePromise_1.useSafePromise)();
22
28
  (0, react_1.useEffect)(function () {
23
- safePromise((0, mdm_sdk_1.processDefinitions)({ workflowPath: workflowPath, environment: environment, tenant: tenant }))
29
+ if (!canViewDefinitions) {
30
+ return;
31
+ }
32
+ setLoading(true);
33
+ safePromise(memoizedProcessDefinitions({ workflowPath: workflowPath, environment: environment, tenant: tenant }))
24
34
  .then(function (_a) {
25
35
  var data = _a.data;
26
36
  if (!data) {
27
37
  return;
28
38
  }
29
- setDefinitions(filterDefinitions(data, entityType));
39
+ setDefinitions(all ? data : filterDefinitions(data, entityType));
30
40
  })
31
41
  .catch(function (error) {
32
42
  console.warn('Workflow error', error);
43
+ })
44
+ .finally(function () {
45
+ setLoading(false);
33
46
  });
34
- }, [entityType, workflowPath, environment, tenant]);
35
- return { definitions: definitions };
47
+ }, [entityType, workflowPath, environment, tenant, all, canViewDefinitions]);
48
+ return (0, react_1.useMemo)(function () { return ({ definitions: definitions, loading: loading }); }, [definitions, loading]);
36
49
  };
37
50
  exports.useWorkflowDefinitions = useWorkflowDefinitions;
@@ -11,3 +11,4 @@ export { useWorkflowActions } from './hooks/useWorkflowActions';
11
11
  export { useWorkflowCheckPermission } from './hooks/useWorkflowCheckPermission';
12
12
  export { useWorkflowTasks } from './hooks/useWorkflowTasks';
13
13
  export { useWorkflowDefaultActionSuccessHandler } from './hooks/useWorkflowDefaultActionSuccessHandler';
14
+ export { findWorkflowDefinitionByType } from './helpers/common';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useWorkflowDefaultActionSuccessHandler = exports.useWorkflowTasks = exports.useWorkflowCheckPermission = exports.useWorkflowActions = exports.useWorkflowComments = exports.useWorkflowAssignee = exports.TaskActionButtons = exports.WorkflowComments = exports.ReassignButton = exports.AssigneeSelector = exports.TaskActions = exports.AddWorkflowButton = exports.WorkflowTaskCard = void 0;
3
+ exports.findWorkflowDefinitionByType = exports.useWorkflowDefaultActionSuccessHandler = exports.useWorkflowTasks = exports.useWorkflowCheckPermission = exports.useWorkflowActions = exports.useWorkflowComments = exports.useWorkflowAssignee = exports.TaskActionButtons = exports.WorkflowComments = exports.ReassignButton = exports.AssigneeSelector = exports.TaskActions = exports.AddWorkflowButton = exports.WorkflowTaskCard = void 0;
4
4
  // components
5
5
  var WorkflowTaskCard_1 = require("./WorkflowTaskCard");
6
6
  Object.defineProperty(exports, "WorkflowTaskCard", { enumerable: true, get: function () { return WorkflowTaskCard_1.WorkflowTaskCard; } });
@@ -29,3 +29,6 @@ var useWorkflowTasks_1 = require("./hooks/useWorkflowTasks");
29
29
  Object.defineProperty(exports, "useWorkflowTasks", { enumerable: true, get: function () { return useWorkflowTasks_1.useWorkflowTasks; } });
30
30
  var useWorkflowDefaultActionSuccessHandler_1 = require("./hooks/useWorkflowDefaultActionSuccessHandler");
31
31
  Object.defineProperty(exports, "useWorkflowDefaultActionSuccessHandler", { enumerable: true, get: function () { return useWorkflowDefaultActionSuccessHandler_1.useWorkflowDefaultActionSuccessHandler; } });
32
+ // helpers
33
+ var common_1 = require("./helpers/common");
34
+ Object.defineProperty(exports, "findWorkflowDefinitionByType", { enumerable: true, get: function () { return common_1.findWorkflowDefinitionByType; } });
@@ -1,4 +1,40 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ 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);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
2
38
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
39
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
40
  };
@@ -9,32 +45,67 @@ var ui_i18n_1 = __importDefault(require("ui-i18n"));
9
45
  var ramda_1 = require("ramda");
10
46
  var mdm_sdk_1 = require("@reltio/mdm-sdk");
11
47
  var MdmModuleContext_1 = require("../../contexts/MdmModuleContext");
12
- var PROCESS_TYPE = 'potentialMatchReview';
48
+ var CommentDialogContext_1 = require("../../contexts/CommentDialogContext");
49
+ var WorkflowDefinitionsContext_1 = require("../../contexts/WorkflowDefinitionsContext");
50
+ var workflow_1 = require("../../features/workflow");
13
51
  var useRequestDCRReview = function (_a) {
14
52
  var entities = _a.entities, entity = _a.entity, onStartRequest = _a.onStartRequest, onEndRequest = _a.onEndRequest, onError = _a.onError, showSnackbarMessage = _a.showSnackbarMessage;
15
53
  var workflowPath = (0, MdmModuleContext_1.useMdmWorkflowPath)();
16
54
  var environment = (0, MdmModuleContext_1.useMdmWorkflowEnvironmentUrl)();
55
+ var showCommentDialog = (0, CommentDialogContext_1.useCommentDialog)();
56
+ var definitions = (0, react_1.useContext)(WorkflowDefinitionsContext_1.WorkflowDefinitionsContext).definitions;
57
+ var _b = ((0, workflow_1.findWorkflowDefinitionByType)(definitions, mdm_sdk_1.PredefinedWorkflowProcessType.potentialMatchReview) || {}).requiresCommentOnStart, requiresCommentOnStart = _b === void 0 ? false : _b;
17
58
  var tenant = (0, MdmModuleContext_1.useMdmTenant)();
18
59
  var getUri = (0, ramda_1.prop)('uri');
19
60
  var getUrisFromEntities = (0, ramda_1.pipe)(ramda_1.concat, (0, ramda_1.map)(getUri));
20
61
  var uris = getUrisFromEntities([entity], entities);
21
- var startPMReview = (0, react_1.useCallback)(function () {
22
- onStartRequest === null || onStartRequest === void 0 ? void 0 : onStartRequest();
23
- (0, mdm_sdk_1.startProcessInstanceByPairs)({
24
- workflowPath: workflowPath,
25
- processType: PROCESS_TYPE,
26
- objectURIs: uris,
27
- tenant: tenant,
28
- environment: environment
29
- })
30
- .then(function () {
31
- showSnackbarMessage === null || showSnackbarMessage === void 0 ? void 0 : showSnackbarMessage(ui_i18n_1.default.text('Potential match request: Done'));
32
- })
33
- .catch(onError)
34
- .finally(function () {
35
- onEndRequest === null || onEndRequest === void 0 ? void 0 : onEndRequest();
62
+ var startPMReview = (0, react_1.useCallback)(function () { return __awaiter(void 0, void 0, void 0, function () {
63
+ var comment;
64
+ return __generator(this, function (_a) {
65
+ switch (_a.label) {
66
+ case 0:
67
+ onStartRequest === null || onStartRequest === void 0 ? void 0 : onStartRequest();
68
+ comment = null;
69
+ if (!requiresCommentOnStart) return [3 /*break*/, 2];
70
+ return [4 /*yield*/, showCommentDialog()];
71
+ case 1:
72
+ comment = _a.sent();
73
+ if (comment === null) {
74
+ onEndRequest === null || onEndRequest === void 0 ? void 0 : onEndRequest();
75
+ return [2 /*return*/];
76
+ }
77
+ _a.label = 2;
78
+ case 2:
79
+ (0, mdm_sdk_1.startProcessInstanceByPairs)({
80
+ workflowPath: workflowPath,
81
+ processType: mdm_sdk_1.PredefinedWorkflowProcessType.potentialMatchReview,
82
+ objectURIs: uris,
83
+ tenant: tenant,
84
+ environment: environment,
85
+ comment: comment
86
+ })
87
+ .then(function () {
88
+ showSnackbarMessage === null || showSnackbarMessage === void 0 ? void 0 : showSnackbarMessage(ui_i18n_1.default.text('Potential match request: Done'));
89
+ })
90
+ .catch(onError)
91
+ .finally(function () {
92
+ onEndRequest === null || onEndRequest === void 0 ? void 0 : onEndRequest();
93
+ });
94
+ return [2 /*return*/];
95
+ }
36
96
  });
37
- }, [onStartRequest, onEndRequest, onError, workflowPath, uris, tenant, environment, showSnackbarMessage]);
97
+ }); }, [
98
+ onStartRequest,
99
+ onEndRequest,
100
+ onError,
101
+ workflowPath,
102
+ uris,
103
+ tenant,
104
+ environment,
105
+ showSnackbarMessage,
106
+ showCommentDialog,
107
+ requiresCommentOnStart
108
+ ]);
38
109
  return startPMReview;
39
110
  };
40
111
  exports.useRequestDCRReview = useRequestDCRReview;
@@ -0,0 +1,16 @@
1
+ import React, { ReactNode } from 'react';
2
+ type DialogOptions = {
3
+ title?: string;
4
+ message?: string;
5
+ confirmLabel?: string;
6
+ cancelLabel?: string;
7
+ defaultComment?: string;
8
+ required?: boolean;
9
+ };
10
+ type DialogResult = string | null;
11
+ type CommentDialogContextType = (options?: DialogOptions) => Promise<DialogResult>;
12
+ export declare const useCommentDialog: () => CommentDialogContextType;
13
+ export declare const CommentDialogProvider: ({ children }: {
14
+ children: ReactNode;
15
+ }) => React.JSX.Element;
16
+ export {};
@@ -0,0 +1,40 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { CommentDialog } from '../../CommentDialog/CommentDialog';
13
+ import React, { createContext, useContext, useState, useRef, useCallback } from 'react';
14
+ var CommentDialogContext = createContext(undefined);
15
+ export var useCommentDialog = function () {
16
+ var context = useContext(CommentDialogContext);
17
+ if (!context)
18
+ throw new Error('useCommentDialog must be used within CommentDialogProvider');
19
+ return context;
20
+ };
21
+ export var CommentDialogProvider = function (_a) {
22
+ var children = _a.children;
23
+ var _b = useState(null), options = _b[0], setOptions = _b[1];
24
+ var commentResolverRef = useRef(null);
25
+ var showCommentDialog = useCallback(function (options) {
26
+ setOptions(options || {});
27
+ return new Promise(function (resolve) {
28
+ commentResolverRef.current = resolve;
29
+ });
30
+ }, []);
31
+ var handleClose = function (result) {
32
+ var _a;
33
+ setOptions(null);
34
+ (_a = commentResolverRef.current) === null || _a === void 0 ? void 0 : _a.call(commentResolverRef, result);
35
+ commentResolverRef.current = null;
36
+ };
37
+ return (React.createElement(CommentDialogContext.Provider, { value: showCommentDialog },
38
+ children,
39
+ options && React.createElement(CommentDialog, __assign({}, options, { onConfirm: handleClose, onCancel: function () { return handleClose(null); } }))));
40
+ };
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { WorkflowDefinition } from '@reltio/mdm-sdk';
3
+ type WorkflowDefinitionsContextType = {
4
+ definitions: WorkflowDefinition[];
5
+ loading: boolean;
6
+ };
7
+ export declare const WorkflowDefinitionsContext: React.Context<WorkflowDefinitionsContextType>;
8
+ export declare const WorkflowDefinitionsProvider: ({ children }: {
9
+ children: React.ReactNode;
10
+ }) => React.JSX.Element;
11
+ export {};
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { useWorkflowDefinitions } from '../../features/workflow/hooks/useWorkflowDefinitions';
3
+ import { useWorkflowCheckPermission } from '../../features/workflow/hooks/useWorkflowCheckPermission';
4
+ import { useMdmIsWorkflowEnabled } from '../MdmModuleContext';
5
+ export var WorkflowDefinitionsContext = React.createContext({
6
+ definitions: [],
7
+ loading: false
8
+ });
9
+ WorkflowDefinitionsContext.displayName = 'WorkflowDefinitionsContext';
10
+ export var WorkflowDefinitionsProvider = function (_a) {
11
+ var children = _a.children;
12
+ var isWorkflowEnabled = useMdmIsWorkflowEnabled();
13
+ var checkWorkflowPermission = useWorkflowCheckPermission();
14
+ var canViewProcessDefinitions = checkWorkflowPermission('VIEW_PROCESS_DEFINITIONS');
15
+ var canViewDefinitions = isWorkflowEnabled && canViewProcessDefinitions;
16
+ var workflowDefinitions = useWorkflowDefinitions({ all: true, canViewDefinitions: canViewDefinitions });
17
+ return (React.createElement(WorkflowDefinitionsContext.Provider, { value: workflowDefinitions }, children));
18
+ };
@@ -6,9 +6,10 @@ import Snackbar from '@mui/material/Snackbar';
6
6
  import Popover from '@mui/material/Popover';
7
7
  import Typography from '@mui/material/Typography';
8
8
  import Button from '@mui/material/Button';
9
- import { SimpleDropDownSelector } from '../../../SimpleDropDownSelector';
9
+ import { DropDownSelector } from '../../../DropDownSelector';
10
10
  import { useWorkflowDefinitions } from '../hooks/useWorkflowDefinitions';
11
11
  import { useWorkflowProcessInstance } from '../hooks/useWorkflowProcessInstance';
12
+ import { findWorkflowDefinitionByType } from '../helpers/common';
12
13
  import { useStyles } from './styles';
13
14
  export var AddWorkflowDialog = function (_a) {
14
15
  var anchorEl = _a.anchorEl, onClose = _a.onClose;
@@ -16,8 +17,8 @@ export var AddWorkflowDialog = function (_a) {
16
17
  var _b = useState(''), comment = _b[0], setComment = _b[1];
17
18
  var _c = useState(null), taskType = _c[0], setTaskType = _c[1];
18
19
  var _d = useState(false), isOpenSnackbar = _d[0], setIsOpenSnackbar = _d[1];
19
- var definitions = useWorkflowDefinitions().definitions;
20
- var _e = useWorkflowProcessInstance(), processInstance = _e.processInstance, loading = _e.loading;
20
+ var _e = useWorkflowDefinitions(), definitions = _e.definitions, loadingDefinitions = _e.loading;
21
+ var _f = useWorkflowProcessInstance(), processInstance = _f.processInstance, loading = _f.loading;
21
22
  var handleChangeComment = function (e) {
22
23
  setComment(e.target.value);
23
24
  };
@@ -38,6 +39,9 @@ export var AddWorkflowDialog = function (_a) {
38
39
  setIsOpenSnackbar(false);
39
40
  };
40
41
  var open = Boolean(anchorEl);
42
+ var currentDefinition = findWorkflowDefinitionByType(definitions, taskType === null || taskType === void 0 ? void 0 : taskType.value);
43
+ var isCommentRequired = (currentDefinition === null || currentDefinition === void 0 ? void 0 : currentDefinition.requiresCommentOnStart) || false;
44
+ var isStartButtonDisabled = loading || taskType === null || loadingDefinitions || (isCommentRequired && !comment);
41
45
  return (React.createElement(React.Fragment, null,
42
46
  React.createElement(Popover, { open: open, anchorEl: anchorEl, onClose: onClose, anchorOrigin: {
43
47
  vertical: 'bottom',
@@ -50,26 +54,26 @@ export var AddWorkflowDialog = function (_a) {
50
54
  } },
51
55
  React.createElement("div", { className: styles.content },
52
56
  React.createElement(Typography, { className: styles.title }, i18n.text('Add new workflow')),
53
- React.createElement(SimpleDropDownSelector, { className: styles.simpleDropDownSelector, variant: "filled", height: 40, TextFieldProps: {
54
- InputProps: {
55
- disableUnderline: true
56
- }
57
- }, placeholder: i18n.text('Select task type'), value: taskType, onChange: handleChangeTaskType, label: '', options: definitions.map(function (definition) {
57
+ React.createElement(DropDownSelector, { className: styles.simpleDropDownSelector, height: 44, value: taskType, onChange: handleChangeTaskType, label: i18n.text('Select task type'), options: definitions.map(function (definition) {
58
58
  return {
59
59
  value: definition.type,
60
60
  label: definition.displayName
61
61
  };
62
62
  }) }),
63
- React.createElement(TextField, { variant: "filled", hiddenLabel: true, size: "small", placeholder: "Type a comment", InputProps: {
64
- disableUnderline: true,
63
+ React.createElement(TextField, { variant: "filled", hiddenLabel: true, size: "small", minRows: 1, required: isCommentRequired, label: i18n.text('Type a comment'), InputProps: {
65
64
  classes: {
66
65
  input: styles.input,
67
66
  root: styles.inputRoot
68
67
  }
68
+ }, InputLabelProps: {
69
+ classes: {
70
+ root: styles.inputLabelRoot,
71
+ asterisk: styles.asterisk
72
+ }
69
73
  }, value: comment, onChange: handleChangeComment, multiline: true })),
70
74
  React.createElement("div", { className: styles.footer },
71
75
  React.createElement(Button, { disabled: loading, className: styles.cancelButton, onClick: onClose }, i18n.text('Cancel')),
72
- React.createElement(Button, { disabled: loading, color: "primary", onClick: handleStart }, i18n.text('Start')))),
76
+ React.createElement(Button, { disabled: isStartButtonDisabled, color: "primary", onClick: handleStart }, i18n.text('Start')))),
73
77
  React.createElement(Portal, { container: document.body },
74
78
  React.createElement(Snackbar, { open: isOpenSnackbar, autoHideDuration: 5000, onClose: handleCloseSnackbar, message: i18n.text('A new workflow has started'), anchorOrigin: { vertical: 'bottom', horizontal: 'center' } }))));
75
79
  };