@reltio/components 1.4.2181 → 1.4.2182

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
@@ -51,7 +51,7 @@ export var ActionButton = forwardRef(function (_a, ref) {
51
51
  onClick();
52
52
  };
53
53
  var isComplexItem = !!description;
54
- return (React.createElement(MenuItem, __assign({ classes: { root: classnames(styles.menuItem, (_a = {}, _a[styles.complexItem] = isComplexItem, _a)) }, onClick: handleClick, ref: ref }, otherProps),
54
+ return (React.createElement(MenuItem, __assign({ classes: { root: classnames(styles.menuItem, (_a = {}, _a[styles.complexItem] = isComplexItem, _a)) }, disabled: disabled, onClick: handleClick, ref: ref }, otherProps),
55
55
  Icon && (React.createElement(ListItemIcon, null,
56
56
  React.createElement(Icon, null))),
57
57
  React.createElement(ListItemText, { primary: label, secondary: description, classes: {
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ open?: boolean;
4
+ title?: string;
5
+ message?: string;
6
+ confirmLabel?: string;
7
+ cancelLabel?: string;
8
+ defaultComment?: string;
9
+ required?: boolean;
10
+ onConfirm: (value: string) => void;
11
+ onCancel: () => void;
12
+ };
13
+ export declare const CommentDialog: ({ open, title, confirmLabel, cancelLabel, defaultComment, required, onConfirm, onCancel }: Props) => React.JSX.Element;
14
+ export {};
@@ -0,0 +1,43 @@
1
+ import React, { useCallback, useState } from 'react';
2
+ import Button from '@mui/material/Button';
3
+ import Dialog from '@mui/material/Dialog';
4
+ import DialogActions from '@mui/material/DialogActions';
5
+ import DialogContent from '@mui/material/DialogContent';
6
+ import DialogTitle from '@mui/material/DialogTitle';
7
+ import TextField from '@mui/material/TextField';
8
+ import i18n from 'ui-i18n';
9
+ import styles from './CommentDialog.module.css';
10
+ export var CommentDialog = function (_a) {
11
+ var _b = _a.open, open = _b === void 0 ? true : _b, title = _a.title, confirmLabel = _a.confirmLabel, cancelLabel = _a.cancelLabel, _c = _a.defaultComment, defaultComment = _c === void 0 ? '' : _c, _d = _a.required, required = _d === void 0 ? true : _d, onConfirm = _a.onConfirm, onCancel = _a.onCancel;
12
+ var _e = useState(defaultComment || ''), comment = _e[0], setComment = _e[1];
13
+ var handleChangeComment = useCallback(function (e) {
14
+ setComment(e.target.value);
15
+ }, []);
16
+ var handleConfirm = useCallback(function () {
17
+ if (required && !comment.trim())
18
+ return;
19
+ onConfirm(comment);
20
+ setComment('');
21
+ }, [comment, required, onConfirm]);
22
+ var handleCancel = useCallback(function () {
23
+ onCancel();
24
+ }, [onCancel]);
25
+ var isConfirmDisabled = required && !comment.trim();
26
+ return (React.createElement(Dialog, { open: open, onClose: handleCancel, fullWidth: true, classes: { paper: styles.dialog } },
27
+ React.createElement(DialogTitle, { classes: { root: styles.dialogTitle } }, title || i18n.text('Please provide a comment for your action')),
28
+ React.createElement(DialogContent, { classes: { root: styles.dialogContent } },
29
+ React.createElement(TextField, { autoFocus: true, multiline: true, minRows: 5, fullWidth: true, variant: "filled", value: comment, size: "small", onChange: handleChangeComment, required: required, InputLabelProps: {
30
+ classes: {
31
+ root: styles.inputLabelRoot,
32
+ asterisk: styles.asterisk
33
+ }
34
+ }, InputProps: {
35
+ classes: {
36
+ input: styles.input,
37
+ formControl: styles.formControl
38
+ }
39
+ }, label: i18n.text('Type a comment') })),
40
+ React.createElement(DialogActions, { classes: { root: styles.dialogActions } },
41
+ React.createElement(Button, { onClick: handleCancel }, cancelLabel || i18n.text('Cancel')),
42
+ React.createElement(Button, { onClick: handleConfirm, disabled: isConfirmDisabled, color: "primary" }, confirmLabel || i18n.text('Done')))));
43
+ };
@@ -0,0 +1,9 @@
1
+ const styles = {"dialog":"CommentDialog-dialog--28OuU","dialogTitle":"CommentDialog-dialogTitle--mtuLI","dialogContent":"CommentDialog-dialogContent--bx8o1","input":"CommentDialog-input--v9ZO3","formControl":"CommentDialog-formControl--vptF6","inputLabelRoot":"CommentDialog-inputLabelRoot--VGQ5g","dialogActions":"CommentDialog-dialogActions--4669K","asterisk":"CommentDialog-asterisk--8ondZ"};
2
+ if (typeof document !== 'undefined') {
3
+ const head = document.head || document.getElementsByTagName('head')[0]
4
+ const style = document.createElement('style');
5
+ style.type = 'text/css'
6
+ style.innerHTML = `.CommentDialog-dialog--28OuU{width:465px}.CommentDialog-dialogTitle--mtuLI{padding:16px 16px 4px}.CommentDialog-dialogContent--bx8o1{padding:20px 16px}.CommentDialog-input--v9ZO3{font-size:14px;line-height:16px}.CommentDialog-formControl--vptF6{padding-bottom:6px}.CommentDialog-inputLabelRoot--VGQ5g{font-size:14px}.CommentDialog-dialogActions--4669K{border-top:1px solid rgba(0,0,0,.12);padding:4px 2px}.CommentDialog-asterisk--8ondZ{color:red}`;
7
+ head.appendChild(style);
8
+ }
9
+ export default styles;
@@ -80,7 +80,7 @@ exports.ActionButton = (0, react_1.forwardRef)(function (_a, ref) {
80
80
  onClick();
81
81
  };
82
82
  var isComplexItem = !!description;
83
- return (react_1.default.createElement(MenuItem_1.default, __assign({ classes: { root: (0, classnames_1.default)(styles.menuItem, (_a = {}, _a[styles.complexItem] = isComplexItem, _a)) }, onClick: handleClick, ref: ref }, otherProps),
83
+ return (react_1.default.createElement(MenuItem_1.default, __assign({ classes: { root: (0, classnames_1.default)(styles.menuItem, (_a = {}, _a[styles.complexItem] = isComplexItem, _a)) }, disabled: disabled, onClick: handleClick, ref: ref }, otherProps),
84
84
  Icon && (react_1.default.createElement(ListItemIcon_1.default, null,
85
85
  react_1.default.createElement(Icon, null))),
86
86
  react_1.default.createElement(ListItemText_1.default, { primary: label, secondary: description, classes: {
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ open?: boolean;
4
+ title?: string;
5
+ message?: string;
6
+ confirmLabel?: string;
7
+ cancelLabel?: string;
8
+ defaultComment?: string;
9
+ required?: boolean;
10
+ onConfirm: (value: string) => void;
11
+ onCancel: () => void;
12
+ };
13
+ export declare const CommentDialog: ({ open, title, confirmLabel, cancelLabel, defaultComment, required, onConfirm, onCancel }: Props) => React.JSX.Element;
14
+ export {};
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.CommentDialog = void 0;
30
+ var react_1 = __importStar(require("react"));
31
+ var Button_1 = __importDefault(require("@mui/material/Button"));
32
+ var Dialog_1 = __importDefault(require("@mui/material/Dialog"));
33
+ var DialogActions_1 = __importDefault(require("@mui/material/DialogActions"));
34
+ var DialogContent_1 = __importDefault(require("@mui/material/DialogContent"));
35
+ var DialogTitle_1 = __importDefault(require("@mui/material/DialogTitle"));
36
+ var TextField_1 = __importDefault(require("@mui/material/TextField"));
37
+ var ui_i18n_1 = __importDefault(require("ui-i18n"));
38
+ var CommentDialog_module_css_1 = __importDefault(require("./CommentDialog.module.css"));
39
+ var CommentDialog = function (_a) {
40
+ var _b = _a.open, open = _b === void 0 ? true : _b, title = _a.title, confirmLabel = _a.confirmLabel, cancelLabel = _a.cancelLabel, _c = _a.defaultComment, defaultComment = _c === void 0 ? '' : _c, _d = _a.required, required = _d === void 0 ? true : _d, onConfirm = _a.onConfirm, onCancel = _a.onCancel;
41
+ var _e = (0, react_1.useState)(defaultComment || ''), comment = _e[0], setComment = _e[1];
42
+ var handleChangeComment = (0, react_1.useCallback)(function (e) {
43
+ setComment(e.target.value);
44
+ }, []);
45
+ var handleConfirm = (0, react_1.useCallback)(function () {
46
+ if (required && !comment.trim())
47
+ return;
48
+ onConfirm(comment);
49
+ setComment('');
50
+ }, [comment, required, onConfirm]);
51
+ var handleCancel = (0, react_1.useCallback)(function () {
52
+ onCancel();
53
+ }, [onCancel]);
54
+ var isConfirmDisabled = required && !comment.trim();
55
+ return (react_1.default.createElement(Dialog_1.default, { open: open, onClose: handleCancel, fullWidth: true, classes: { paper: CommentDialog_module_css_1.default.dialog } },
56
+ react_1.default.createElement(DialogTitle_1.default, { classes: { root: CommentDialog_module_css_1.default.dialogTitle } }, title || ui_i18n_1.default.text('Please provide a comment for your action')),
57
+ react_1.default.createElement(DialogContent_1.default, { classes: { root: CommentDialog_module_css_1.default.dialogContent } },
58
+ react_1.default.createElement(TextField_1.default, { autoFocus: true, multiline: true, minRows: 5, fullWidth: true, variant: "filled", value: comment, size: "small", onChange: handleChangeComment, required: required, InputLabelProps: {
59
+ classes: {
60
+ root: CommentDialog_module_css_1.default.inputLabelRoot,
61
+ asterisk: CommentDialog_module_css_1.default.asterisk
62
+ }
63
+ }, InputProps: {
64
+ classes: {
65
+ input: CommentDialog_module_css_1.default.input,
66
+ formControl: CommentDialog_module_css_1.default.formControl
67
+ }
68
+ }, label: ui_i18n_1.default.text('Type a comment') })),
69
+ react_1.default.createElement(DialogActions_1.default, { classes: { root: CommentDialog_module_css_1.default.dialogActions } },
70
+ react_1.default.createElement(Button_1.default, { onClick: handleCancel }, cancelLabel || ui_i18n_1.default.text('Cancel')),
71
+ react_1.default.createElement(Button_1.default, { onClick: handleConfirm, disabled: isConfirmDisabled, color: "primary" }, confirmLabel || ui_i18n_1.default.text('Done')))));
72
+ };
73
+ exports.CommentDialog = CommentDialog;
@@ -0,0 +1,9 @@
1
+ const styles = {"dialog":"CommentDialog-dialog--28OuU","dialogTitle":"CommentDialog-dialogTitle--mtuLI","dialogContent":"CommentDialog-dialogContent--bx8o1","input":"CommentDialog-input--v9ZO3","formControl":"CommentDialog-formControl--vptF6","inputLabelRoot":"CommentDialog-inputLabelRoot--VGQ5g","dialogActions":"CommentDialog-dialogActions--4669K","asterisk":"CommentDialog-asterisk--8ondZ"};
2
+ if (typeof document !== 'undefined') {
3
+ const head = document.head || document.getElementsByTagName('head')[0]
4
+ const style = document.createElement('style');
5
+ style.type = 'text/css'
6
+ style.innerHTML = `.CommentDialog-dialog--28OuU{width:465px}.CommentDialog-dialogTitle--mtuLI{padding:16px 16px 4px}.CommentDialog-dialogContent--bx8o1{padding:20px 16px}.CommentDialog-input--v9ZO3{font-size:14px;line-height:16px}.CommentDialog-formControl--vptF6{padding-bottom:6px}.CommentDialog-inputLabelRoot--VGQ5g{font-size:14px}.CommentDialog-dialogActions--4669K{border-top:1px solid rgba(0,0,0,.12);padding:4px 2px}.CommentDialog-asterisk--8ondZ{color:red}`;
7
+ head.appendChild(style);
8
+ }
9
+ module.exports = styles;
@@ -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,68 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.CommentDialogProvider = exports.useCommentDialog = void 0;
38
+ var CommentDialog_1 = require("../../CommentDialog/CommentDialog");
39
+ var react_1 = __importStar(require("react"));
40
+ var CommentDialogContext = (0, react_1.createContext)(undefined);
41
+ var useCommentDialog = function () {
42
+ var context = (0, react_1.useContext)(CommentDialogContext);
43
+ if (!context)
44
+ throw new Error('useCommentDialog must be used within CommentDialogProvider');
45
+ return context;
46
+ };
47
+ exports.useCommentDialog = useCommentDialog;
48
+ var CommentDialogProvider = function (_a) {
49
+ var children = _a.children;
50
+ var _b = (0, react_1.useState)(null), options = _b[0], setOptions = _b[1];
51
+ var commentResolverRef = (0, react_1.useRef)(null);
52
+ var showCommentDialog = (0, react_1.useCallback)(function (options) {
53
+ setOptions(options || {});
54
+ return new Promise(function (resolve) {
55
+ commentResolverRef.current = resolve;
56
+ });
57
+ }, []);
58
+ var handleClose = function (result) {
59
+ var _a;
60
+ setOptions(null);
61
+ (_a = commentResolverRef.current) === null || _a === void 0 ? void 0 : _a.call(commentResolverRef, result);
62
+ commentResolverRef.current = null;
63
+ };
64
+ return (react_1.default.createElement(CommentDialogContext.Provider, { value: showCommentDialog },
65
+ children,
66
+ options && react_1.default.createElement(CommentDialog_1.CommentDialog, __assign({}, options, { onConfirm: handleClose, onCancel: function () { return handleClose(null); } }))));
67
+ };
68
+ exports.CommentDialogProvider = CommentDialogProvider;
@@ -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,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WorkflowDefinitionsProvider = exports.WorkflowDefinitionsContext = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var useWorkflowDefinitions_1 = require("../../features/workflow/hooks/useWorkflowDefinitions");
9
+ var useWorkflowCheckPermission_1 = require("../../features/workflow/hooks/useWorkflowCheckPermission");
10
+ var MdmModuleContext_1 = require("../MdmModuleContext");
11
+ exports.WorkflowDefinitionsContext = react_1.default.createContext({
12
+ definitions: [],
13
+ loading: false
14
+ });
15
+ exports.WorkflowDefinitionsContext.displayName = 'WorkflowDefinitionsContext';
16
+ var WorkflowDefinitionsProvider = function (_a) {
17
+ var children = _a.children;
18
+ var isWorkflowEnabled = (0, MdmModuleContext_1.useMdmIsWorkflowEnabled)();
19
+ var checkWorkflowPermission = (0, useWorkflowCheckPermission_1.useWorkflowCheckPermission)();
20
+ var canViewProcessDefinitions = checkWorkflowPermission('VIEW_PROCESS_DEFINITIONS');
21
+ var canViewDefinitions = isWorkflowEnabled && canViewProcessDefinitions;
22
+ var workflowDefinitions = (0, useWorkflowDefinitions_1.useWorkflowDefinitions)({ all: true, canViewDefinitions: canViewDefinitions });
23
+ return (react_1.default.createElement(exports.WorkflowDefinitionsContext.Provider, { value: workflowDefinitions }, children));
24
+ };
25
+ exports.WorkflowDefinitionsProvider = WorkflowDefinitionsProvider;
@@ -35,9 +35,10 @@ var Snackbar_1 = __importDefault(require("@mui/material/Snackbar"));
35
35
  var Popover_1 = __importDefault(require("@mui/material/Popover"));
36
36
  var Typography_1 = __importDefault(require("@mui/material/Typography"));
37
37
  var Button_1 = __importDefault(require("@mui/material/Button"));
38
- var SimpleDropDownSelector_1 = require("../../../SimpleDropDownSelector");
38
+ var DropDownSelector_1 = require("../../../DropDownSelector");
39
39
  var useWorkflowDefinitions_1 = require("../hooks/useWorkflowDefinitions");
40
40
  var useWorkflowProcessInstance_1 = require("../hooks/useWorkflowProcessInstance");
41
+ var common_1 = require("../helpers/common");
41
42
  var styles_1 = require("./styles");
42
43
  var AddWorkflowDialog = function (_a) {
43
44
  var anchorEl = _a.anchorEl, onClose = _a.onClose;
@@ -45,8 +46,8 @@ var AddWorkflowDialog = function (_a) {
45
46
  var _b = (0, react_1.useState)(''), comment = _b[0], setComment = _b[1];
46
47
  var _c = (0, react_1.useState)(null), taskType = _c[0], setTaskType = _c[1];
47
48
  var _d = (0, react_1.useState)(false), isOpenSnackbar = _d[0], setIsOpenSnackbar = _d[1];
48
- var definitions = (0, useWorkflowDefinitions_1.useWorkflowDefinitions)().definitions;
49
- var _e = (0, useWorkflowProcessInstance_1.useWorkflowProcessInstance)(), processInstance = _e.processInstance, loading = _e.loading;
49
+ var _e = (0, useWorkflowDefinitions_1.useWorkflowDefinitions)(), definitions = _e.definitions, loadingDefinitions = _e.loading;
50
+ var _f = (0, useWorkflowProcessInstance_1.useWorkflowProcessInstance)(), processInstance = _f.processInstance, loading = _f.loading;
50
51
  var handleChangeComment = function (e) {
51
52
  setComment(e.target.value);
52
53
  };
@@ -67,6 +68,9 @@ var AddWorkflowDialog = function (_a) {
67
68
  setIsOpenSnackbar(false);
68
69
  };
69
70
  var open = Boolean(anchorEl);
71
+ var currentDefinition = (0, common_1.findWorkflowDefinitionByType)(definitions, taskType === null || taskType === void 0 ? void 0 : taskType.value);
72
+ var isCommentRequired = (currentDefinition === null || currentDefinition === void 0 ? void 0 : currentDefinition.requiresCommentOnStart) || false;
73
+ var isStartButtonDisabled = loading || taskType === null || loadingDefinitions || (isCommentRequired && !comment);
70
74
  return (react_1.default.createElement(react_1.default.Fragment, null,
71
75
  react_1.default.createElement(Popover_1.default, { open: open, anchorEl: anchorEl, onClose: onClose, anchorOrigin: {
72
76
  vertical: 'bottom',
@@ -79,26 +83,26 @@ var AddWorkflowDialog = function (_a) {
79
83
  } },
80
84
  react_1.default.createElement("div", { className: styles.content },
81
85
  react_1.default.createElement(Typography_1.default, { className: styles.title }, ui_i18n_1.default.text('Add new workflow')),
82
- react_1.default.createElement(SimpleDropDownSelector_1.SimpleDropDownSelector, { className: styles.simpleDropDownSelector, variant: "filled", height: 40, TextFieldProps: {
83
- InputProps: {
84
- disableUnderline: true
85
- }
86
- }, placeholder: ui_i18n_1.default.text('Select task type'), value: taskType, onChange: handleChangeTaskType, label: '', options: definitions.map(function (definition) {
86
+ react_1.default.createElement(DropDownSelector_1.DropDownSelector, { className: styles.simpleDropDownSelector, height: 44, value: taskType, onChange: handleChangeTaskType, label: ui_i18n_1.default.text('Select task type'), options: definitions.map(function (definition) {
87
87
  return {
88
88
  value: definition.type,
89
89
  label: definition.displayName
90
90
  };
91
91
  }) }),
92
- react_1.default.createElement(TextField_1.default, { variant: "filled", hiddenLabel: true, size: "small", placeholder: "Type a comment", InputProps: {
93
- disableUnderline: true,
92
+ react_1.default.createElement(TextField_1.default, { variant: "filled", hiddenLabel: true, size: "small", minRows: 1, required: isCommentRequired, label: ui_i18n_1.default.text('Type a comment'), InputProps: {
94
93
  classes: {
95
94
  input: styles.input,
96
95
  root: styles.inputRoot
97
96
  }
97
+ }, InputLabelProps: {
98
+ classes: {
99
+ root: styles.inputLabelRoot,
100
+ asterisk: styles.asterisk
101
+ }
98
102
  }, value: comment, onChange: handleChangeComment, multiline: true })),
99
103
  react_1.default.createElement("div", { className: styles.footer },
100
104
  react_1.default.createElement(Button_1.default, { disabled: loading, className: styles.cancelButton, onClick: onClose }, ui_i18n_1.default.text('Cancel')),
101
- react_1.default.createElement(Button_1.default, { disabled: loading, color: "primary", onClick: handleStart }, ui_i18n_1.default.text('Start')))),
105
+ react_1.default.createElement(Button_1.default, { disabled: isStartButtonDisabled, color: "primary", onClick: handleStart }, ui_i18n_1.default.text('Start')))),
102
106
  react_1.default.createElement(Portal_1.default, { container: document.body },
103
107
  react_1.default.createElement(Snackbar_1.default, { open: isOpenSnackbar, autoHideDuration: 5000, onClose: handleCloseSnackbar, message: ui_i18n_1.default.text('A new workflow has started'), anchorOrigin: { vertical: 'bottom', horizontal: 'center' } }))));
104
108
  };
@@ -61,7 +61,7 @@ var constants_1 = require("../../../constants");
61
61
  var MdmModuleContext_1 = require("../../../contexts/MdmModuleContext");
62
62
  var WorkflowTasksContext_1 = require("../../../contexts/WorkflowTasksContext");
63
63
  var AddWorkflowDialog_1 = require("./AddWorkflowDialog");
64
- jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { processDefinitions: jest.fn(), startProcessInstance: jest.fn() })); });
64
+ jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { processDefinitions: jest.fn(), startProcessInstance: jest.fn(), memoizeWith: jest.fn(function (keyFn, fn) { return fn; }) })); });
65
65
  var tenant = { id: 'alenat', name: 'alenat' };
66
66
  var workflowEnvironmentUrl = 'https://tst-01.reltio.com';
67
67
  var workflowPath = 'https://tst-01-workflow.reltio.com/workflow-adapter';
@@ -136,7 +136,7 @@ describe('AddWorkflowDialog tests', function () {
136
136
  });
137
137
  }); });
138
138
  it('should render Popover and selector correctly if anchorEl exists', function () { return __awaiter(void 0, void 0, void 0, function () {
139
- var mockAnchorEl, props, user;
139
+ var mockAnchorEl, props, user, dropdown;
140
140
  return __generator(this, function (_a) {
141
141
  switch (_a.label) {
142
142
  case 0:
@@ -147,10 +147,10 @@ describe('AddWorkflowDialog tests', function () {
147
147
  };
148
148
  user = setUp(props).user;
149
149
  expect(react_2.screen.getByText('Add new workflow')).toBeInTheDocument();
150
- return [4 /*yield*/, user.click(react_2.screen.getByText('Select task type'))];
150
+ dropdown = react_2.screen.getByRole('combobox');
151
+ return [4 /*yield*/, user.click(dropdown)];
151
152
  case 1:
152
153
  _a.sent();
153
- expect(react_2.screen.getByText('RDM Data Change Request Review')).toBeInTheDocument();
154
154
  expect(react_2.screen.getByText('Data Verification With Loop')).toBeInTheDocument();
155
155
  expect(react_2.screen.getByText('Account onboarding')).toBeInTheDocument();
156
156
  return [2 /*return*/];
@@ -170,13 +170,14 @@ describe('AddWorkflowDialog tests', function () {
170
170
  };
171
171
  user = setUp(props).user;
172
172
  expect(react_2.screen.getByText('Add new workflow')).toBeInTheDocument();
173
- return [4 /*yield*/, user.click(react_2.screen.getByText('Select task type'))];
173
+ return [4 /*yield*/, user.click(react_2.screen.getByRole('combobox'))];
174
174
  case 1:
175
175
  _a.sent();
176
+ expect(react_2.screen.getByText('RDM Data Change Request Review')).toBeInTheDocument();
176
177
  return [4 /*yield*/, user.click(react_2.screen.getByText('RDM Data Change Request Review'))];
177
178
  case 2:
178
179
  _a.sent();
179
- comment = react_2.screen.getByPlaceholderText('Type a comment');
180
+ comment = react_2.screen.getByLabelText('Type a comment');
180
181
  return [4 /*yield*/, user.type(comment, 'comment')];
181
182
  case 3:
182
183
  _a.sent();
@@ -215,13 +216,13 @@ describe('AddWorkflowDialog tests', function () {
215
216
  };
216
217
  user = setUp(props).user;
217
218
  expect(react_2.screen.getByText('Add new workflow')).toBeInTheDocument();
218
- return [4 /*yield*/, user.click(react_2.screen.getByText('Select task type'))];
219
+ return [4 /*yield*/, user.click(react_2.screen.getByRole('combobox'))];
219
220
  case 1:
220
221
  _a.sent();
221
222
  return [4 /*yield*/, user.click(react_2.screen.getByText('RDM Data Change Request Review'))];
222
223
  case 2:
223
224
  _a.sent();
224
- comment = react_2.screen.getByPlaceholderText('Type a comment');
225
+ comment = react_2.screen.getByLabelText('Type a comment');
225
226
  return [4 /*yield*/, user.type(comment, 'comment')];
226
227
  case 3:
227
228
  _a.sent();
@@ -256,7 +257,7 @@ describe('AddWorkflowDialog tests', function () {
256
257
  anchorEl: mockAnchorEl
257
258
  };
258
259
  user = setUp(props).user;
259
- return [4 /*yield*/, user.click(react_2.screen.getByText('Select task type'))];
260
+ return [4 /*yield*/, user.click(react_2.screen.getByRole('combobox'))];
260
261
  case 1:
261
262
  _a.sent();
262
263
  expect(consoleSpy).toHaveBeenCalledWith('Workflow error', 'Some error');
@@ -1 +1 @@
1
- export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"content" | "title" | "footer" | "input" | "select" | "inputRoot" | "cancelButton" | "popoverPaper" | "simpleDropDownSelector">;
1
+ export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"content" | "title" | "footer" | "input" | "select" | "inputRoot" | "asterisk" | "cancelButton" | "inputLabelRoot" | "popoverPaper" | "simpleDropDownSelector">;
@@ -12,20 +12,26 @@ exports.useStyles = (0, styles_1.makeStyles)(function (theme) { return ({
12
12
  letterSpacing: '0.25px',
13
13
  lineHeight: '24px',
14
14
  color: theme.palette.text.primary,
15
- marginBottom: '17px'
15
+ marginBottom: '20px'
16
16
  },
17
17
  content: {
18
18
  display: 'flex',
19
19
  flexDirection: 'column',
20
- padding: '23px 24px 14px 24px'
20
+ padding: '18px 16px 20px 16px'
21
21
  },
22
22
  simpleDropDownSelector: {
23
23
  marginBottom: '20px'
24
24
  },
25
25
  inputRoot: {
26
- paddingTop: '0 !important',
26
+ paddingTop: '12px !important',
27
27
  paddingBottom: '0 !important'
28
28
  },
29
+ inputLabelRoot: {
30
+ fontSize: '14px'
31
+ },
32
+ asterisk: {
33
+ color: 'red'
34
+ },
29
35
  select: {
30
36
  fontSize: '14px'
31
37
  },
@@ -39,6 +45,7 @@ exports.useStyles = (0, styles_1.makeStyles)(function (theme) { return ({
39
45
  marginRight: '8px'
40
46
  },
41
47
  input: {
42
- fontSize: '14px'
48
+ fontSize: '14px',
49
+ paddingBottom: '5px'
43
50
  }
44
51
  }); });
@@ -1 +1 @@
1
- export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"caption" | "disabled" | "title" | "currentAssignee" | "dialogText" | "dialogContent">;
1
+ export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"caption" | "disabled" | "title" | "currentAssignee" | "dialogContent" | "dialogText">;
@@ -57,6 +57,7 @@ var user_event_1 = __importDefault(require("@testing-library/user-event"));
57
57
  var TaskActionButtons_1 = require("../TaskActionButtons");
58
58
  var WorkflowTasksContext_1 = require("../../../contexts/WorkflowTasksContext");
59
59
  var MdmModuleContext_1 = require("../../../contexts/MdmModuleContext");
60
+ var CommentDialogContext_1 = require("../../../contexts/CommentDialogContext");
60
61
  jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { runTaskAction: jest.fn() })); });
61
62
  var task = {
62
63
  assignee: 'somebody',
@@ -97,7 +98,8 @@ var setUp = function (props) {
97
98
  var Providers = function (_a) {
98
99
  var children = _a.children;
99
100
  return (react_1.default.createElement(WorkflowTasksContext_1.WorkflowTasksContext.Provider, { value: workflowTaskContextValue },
100
- react_1.default.createElement(MdmModuleContext_1.MdmModuleProvider, { values: mdmValues }, children)));
101
+ react_1.default.createElement(CommentDialogContext_1.CommentDialogProvider, null,
102
+ react_1.default.createElement(MdmModuleContext_1.MdmModuleProvider, { values: mdmValues }, children))));
101
103
  };
102
104
  return __assign(__assign({}, (0, react_2.render)(react_1.default.createElement(TaskActionButtons_1.TaskActionButtons, __assign({}, props)), { wrapper: Providers })), { user: user });
103
105
  };
@@ -137,4 +139,55 @@ describe('TaskActionButtons tests', function () {
137
139
  }
138
140
  });
139
141
  }); });
142
+ describe('required comments', function () {
143
+ it('should show comment dialog if commentRequired is true', function () { return __awaiter(void 0, void 0, void 0, function () {
144
+ var task, user, dialog, textfield;
145
+ return __generator(this, function (_a) {
146
+ switch (_a.label) {
147
+ case 0:
148
+ task = __assign(__assign({}, defaultProps.task), { possibleActions: [
149
+ { action: 'Approve', label: 'Approve', commentRequired: false },
150
+ { action: 'Reject', label: 'Reject', commentRequired: true }
151
+ ] });
152
+ user = setUp({ task: task }).user;
153
+ return [4 /*yield*/, user.click(react_2.screen.getByText('Reject'))];
154
+ case 1:
155
+ _a.sent();
156
+ expect(onActionSuccess).not.toHaveBeenCalledWith('Reject');
157
+ dialog = react_2.screen.getAllByRole('presentation')[1];
158
+ expect((0, react_2.within)(dialog).getByText('Please provide a comment for your action')).toBeInTheDocument();
159
+ expect((0, react_2.within)(dialog).getByText('Type a comment')).toBeInTheDocument();
160
+ expect((0, react_2.within)(dialog).getByText('Cancel')).toBeInTheDocument();
161
+ expect((0, react_2.within)(dialog).getByText('Done')).toBeInTheDocument();
162
+ return [4 /*yield*/, user.click((0, react_2.within)(dialog).getByText('Cancel'))];
163
+ case 2:
164
+ _a.sent();
165
+ expect(onActionSuccess).not.toHaveBeenCalled();
166
+ return [4 /*yield*/, user.click(react_2.screen.getByText('Reject'))];
167
+ case 3:
168
+ _a.sent();
169
+ textfield = react_2.screen.getAllByRole('textbox')[0];
170
+ return [4 /*yield*/, user.click(textfield)];
171
+ case 4:
172
+ _a.sent();
173
+ return [4 /*yield*/, user.paste('test comment')];
174
+ case 5:
175
+ _a.sent();
176
+ return [4 /*yield*/, user.click((0, react_2.within)(react_2.screen.getAllByRole('presentation')[1]).getByText('Done'))];
177
+ case 6:
178
+ _a.sent();
179
+ expect(onActionSuccess).toHaveBeenCalledWith('Reject');
180
+ expect(mdm_sdk_1.runTaskAction).toHaveBeenCalledWith({
181
+ taskId: '38453993',
182
+ workflowPath: 'workflowPath',
183
+ environment: 'workflowEnvironmentURL',
184
+ tenant: 't1',
185
+ action: 'Reject',
186
+ processInstanceComment: 'test comment'
187
+ });
188
+ return [2 /*return*/];
189
+ }
190
+ });
191
+ }); });
192
+ });
140
193
  });
@@ -67,6 +67,7 @@ var WorkflowTaskCard_1 = require("./WorkflowTaskCard");
67
67
  var LocalizationProvider_1 = require("@mui/x-date-pickers/LocalizationProvider");
68
68
  var AdapterMoment_1 = require("@mui/x-date-pickers/AdapterMoment");
69
69
  var MdmModuleContext_1 = require("../../../contexts/MdmModuleContext");
70
+ var CommentDialogContext_1 = require("../../../contexts/CommentDialogContext");
70
71
  jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { getDataChangeRequest: jest.fn(), getEntitiesByUris: jest.fn() })); });
71
72
  jest.mock('../../../icons/DefaultTaskIcon', function () {
72
73
  var MockDefaultTaskIcon = function () { return react_1.default.createElement("div", { "data-reltio-id": "default-task-icon" }); };
@@ -102,7 +103,8 @@ describe('WorkflowTaskCard tests', function () {
102
103
  var Providers = function (_a) {
103
104
  var children = _a.children;
104
105
  return (react_1.default.createElement(LocalizationProvider_1.LocalizationProvider, { dateAdapter: AdapterMoment_1.AdapterMoment },
105
- react_1.default.createElement(MdmModuleContext_1.MdmModuleProvider, { values: mdmValues }, children)));
106
+ react_1.default.createElement(CommentDialogContext_1.CommentDialogProvider, null,
107
+ react_1.default.createElement(MdmModuleContext_1.MdmModuleProvider, { values: mdmValues }, children))));
106
108
  };
107
109
  return __assign({ user: user }, (0, react_2.render)(react_1.default.createElement(WorkflowTaskCard_1.WorkflowTaskCard, { task: __assign(__assign({}, defaultTask), task) }), { wrapper: Providers }));
108
110
  };
@@ -67,6 +67,7 @@ var LocalizationProvider_1 = require("@mui/x-date-pickers/LocalizationProvider")
67
67
  var AdapterMoment_1 = require("@mui/x-date-pickers/AdapterMoment");
68
68
  var mdm_sdk_1 = require("@reltio/mdm-sdk");
69
69
  var MdmModuleContext_1 = require("../../../../../contexts/MdmModuleContext");
70
+ var CommentDialogContext_1 = require("../../../../../contexts/CommentDialogContext");
70
71
  var DataChangeRequestTaskCard_1 = require("./DataChangeRequestTaskCard");
71
72
  jest.mock('@reltio/mdm-sdk', function () { return (__assign(__assign({}, jest.requireActual('@reltio/mdm-sdk')), { getDataChangeRequest: jest.fn(), getEntitiesByUris: jest.fn() })); });
72
73
  jest.mock('../../../../../contexts/MdmModuleContext', function () { return (__assign(__assign({}, jest.requireActual('../../../../../contexts/MdmModuleContext')), { useMdmMetadata: jest.fn() })); });
@@ -263,7 +264,8 @@ describe('DataChangeRequestTaskCard tests', function () {
263
264
  var user = user_event_1.default.setup();
264
265
  var Providers = function (_a) {
265
266
  var children = _a.children;
266
- return (react_1.default.createElement(LocalizationProvider_1.LocalizationProvider, { dateAdapter: AdapterMoment_1.AdapterMoment }, children));
267
+ return (react_1.default.createElement(LocalizationProvider_1.LocalizationProvider, { dateAdapter: AdapterMoment_1.AdapterMoment },
268
+ react_1.default.createElement(CommentDialogContext_1.CommentDialogProvider, null, children)));
267
269
  };
268
270
  return __assign(__assign({}, (0, react_2.render)(react_1.default.createElement(DataChangeRequestTaskCard_1.DataChangeRequestTaskCard, { task: task }), { wrapper: Providers })), { user: user });
269
271
  };