Skip to content

Commit 93081bc

Browse files
committed
emdebbing the workflow in case when the trigger type is URL
1 parent 6a86835 commit 93081bc

File tree

11 files changed

+84
-46
lines changed

11 files changed

+84
-46
lines changed

client/src/assets/text.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@
7272
},
7373
"pageTitles": {
7474
"manageWorkflow": "Manage workflows",
75-
"triggerWorkflow": "Trigger a workflow instance"
75+
"triggerWorkflow": "Trigger a workflow instance",
76+
"completeWorkflow": "Complete the workflow"
7677
},
7778
"popups": {
7879
"workflowTriggered": {
@@ -90,7 +91,7 @@
9091
"triggerNewWorkflow": "Trigger new workflow ->",
9192
"getStarted": "Get started",
9293
"moreInfo": "More info",
93-
"backHome": "← Back to home"
94+
"backHome": "← Back to workflows"
9495
},
9596
"links": {
9697
"github": "https://github.com/docusign/sample-app-maestro-node",

client/src/components/TriggerForm/TriggerForm.jsx

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { ROUTE, TemplateType } from '../../constants.js';
88
import { api } from '../../api';
99
import { openPopupWindow, closePopupWindow, updateWorkflowDefinitions } from '../../store/actions';
1010

11-
const TriggerForm = ({ workflowId, templateType }) => {
11+
const TriggerForm = ({ workflowId, templateType, triggerType }) => {
1212
const dispatch = useDispatch();
1313
const navigate = useNavigate();
1414
const isPopupOpened = useSelector(state => state.popup.isOpened);
@@ -49,7 +49,14 @@ const TriggerForm = ({ workflowId, templateType }) => {
4949
case "-":
5050
try {
5151
api.workflows.getWorkflowTriggerRequirements(workflowId).then(data => {
52-
setRelevantFormFields(generateDynamicForm(data.data.trigger_input_schema, 'Custom'));
52+
const result = Object.values(data.data.workflowDefinition.trigger.input.payload)
53+
.filter(entry => entry.propertyName !== "id" && entry.propertyName !== "dacId")
54+
.map(entry => ({
55+
field_name: entry.propertyName,
56+
field_data_type: entry.type
57+
}));
58+
59+
setRelevantFormFields(generateDynamicForm(result, 'Custom'));
5360
});
5461
} catch (error) {
5562
console.error("Failed to fetch trigger requirements:", error);
@@ -80,35 +87,45 @@ const TriggerForm = ({ workflowId, templateType }) => {
8087
const handleSubmit = async event => {
8188
event.preventDefault();
8289

83-
const body = relevantFormFields.reduce((acc, current) => {
90+
let body = relevantFormFields.reduce((acc, current) => {
8491
acc[current.fieldName] = current.value;
8592
return acc;
8693
}, {});
8794

88-
if (!Object.keys(body).length) {
95+
if (!Object.keys(body).length && relevantFormFields.length) {
8996
navigate(ROUTE.TRIGGER);
9097
return;
9198
}
9299

93100
setDataSending(true);
101+
102+
if(!relevantFormFields.length) {
103+
body = {};
104+
}
105+
94106
const { data: triggeredWorkflow } = await api.workflows.triggerWorkflow(workflowId, templateType, body);
95-
setWorkflowInstanceUrl(triggeredWorkflow.instance_url);
96-
97-
// Update workflowDefinitions. "...workflow" creates new workflow-object to avoid mutation in redux
98-
const updatedWorkflowDefinitions = workflows.map(w => {
99-
if (w.id !== workflowId) return { ...w };
100-
101-
return {
102-
...w,
103-
instanceId: triggeredWorkflow.instanceId,
104-
isTriggered: true,
105-
};
106-
});
107-
108-
dispatch(updateWorkflowDefinitions(updatedWorkflowDefinitions));
109-
setDataSending(false);
110-
dispatch(openPopupWindow());
107+
setWorkflowInstanceUrl(triggeredWorkflow.workflowInstanceUrl);
108+
109+
if(triggerType === "Url") {
110+
navigate(`${ROUTE.TRIGGERFORM}/${workflowId}?type=${templateType}&triggerType=${triggerType}&triggerUrl=${triggeredWorkflow.workflowInstanceUrl}`)
111+
} else {
112+
// Update workflowDefinitions. "...workflow" creates new workflow-object to avoid mutation in redux
113+
const updatedWorkflowDefinitions = workflows.map(w => {
114+
if (w.id !== workflowId) return { ...w };
115+
116+
return {
117+
...w,
118+
instanceId: triggeredWorkflow.instanceId,
119+
isTriggered: true,
120+
};
121+
});
122+
123+
dispatch(updateWorkflowDefinitions(updatedWorkflowDefinitions));
124+
setDataSending(false);
125+
dispatch(openPopupWindow());
126+
}
111127
};
128+
112129
if (!relevantFormFields.length)
113130
return (
114131
<div className={styles.formContainer}>

client/src/components/WorkflowDescription/WorkflowDescription.jsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
import { Link } from 'react-router-dom';
12
import styles from './WorkflowDescription.module.css';
23
import textContent from '../../assets/text.json';
34

4-
const WorkflowDescription = ({ title, behindTheScenesComponent }) => {
5+
const WorkflowDescription = ({ title, behindTheScenesComponent, backRoute }) => {
56
return (
67
<div className={styles.descriptionContainer}>
8+
{backRoute && (
9+
<Link to={backRoute}>
10+
<button className={styles.backButton}>{textContent.buttons.backHome}</button>
11+
</Link>
12+
)}
13+
714
<h2>{title}</h2>
815
<div className={`dropdown ${styles.dropDown}`}>
916
<button

client/src/components/WorkflowDescription/WorkflowDescription.module.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
justify-content: flex-start;
44
align-items: center;
55
margin-left: -20px;
6-
width: 200px;
6+
width: 300px;
77
height: 40px;
88
background-color: transparent;
99
color: var(--secondary-main);

client/src/components/WorkflowList/WorkflowList.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ const WorkflowList = ({ items, interactionType, isLoading }) => {
4848
</div>
4949

5050
{interactionType === WorkflowItemsInteractionType.TRIGGER && (
51-
<button className={styles.cell3} onClick={() => navigate(`${ROUTE.TRIGGERFORM}/${item.id}?type=${item.type}`)}>
51+
<button className={styles.cell3} onClick={() => navigate(`${ROUTE.TRIGGERFORM}/${item.id}?type=${item.type}&triggerType=${item.triggerType}`)}>
5252
{textContent.buttons.triggerWorkflow}
5353
</button>
5454
)}

client/src/pages/TriggerWorkflow/TriggerWorkflow.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const TriggerWorkflow = () => {
2424
const getWorkflowDefinitions = async () => {
2525
setWorkflowListLoading(true);
2626
const definitionsResponse = await api.workflows.getWorkflowDefinitions();
27-
const workflowDefinitions = definitionsResponse.data.data.workflows.filter(definition => definition.status !== 'inactive')
27+
const workflowDefinitions = definitionsResponse.data.value.filter(definition => definition.status !== 'inactive')
2828
.map(definition => {
2929
if (workflows.length) {
3030
const foundWorkflow = workflows.find(workflow => workflow.id === definition.id);
@@ -41,13 +41,15 @@ const TriggerWorkflow = () => {
4141
id: definition.id,
4242
name: definition.name,
4343
type: "-",
44+
triggerType: definition.triggerType
4445
};
4546
}
4647

4748
return {
4849
id: definition.id,
4950
name: `${TemplateType[foundKey]?.name}`,
5051
type: TemplateType[foundKey]?.type,
52+
triggerType: definition.triggerType
5153
};
5254
})
5355
.filter(definition => !!definition);

client/src/pages/TriggerWorkflowForm/TriggerWorkflowForm.jsx

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,37 @@ import withAuth from '../../hocs/withAuth/withAuth.jsx';
77
import WorkflowDescription from '../../components/WorkflowDescription/WorkflowDescription.jsx';
88
import TriggerBehindTheScenes from '../../components/WorkflowDescription/BehindTheScenes/TriggerBehindTheScenes.jsx';
99
import TriggerForm from '../../components/TriggerForm/TriggerForm.jsx';
10+
import { ROUTE } from '../../constants.js';
1011

1112
const TriggerWorkflowForm = () => {
1213
const { workflowId } = useParams();
1314

1415
const location = useLocation();
1516
const searchParams = new URLSearchParams(location.search);
1617
const type = searchParams.get('type');
18+
const triggerType = searchParams.get('triggerType');
19+
const triggerUrl = searchParams.get('triggerUrl');
20+
21+
if(triggerUrl !== null){
22+
return (
23+
<div className="page-box">
24+
<Header />
25+
<div className={styles.contentContainer}>
26+
<WorkflowDescription
27+
title={textContent.pageTitles.completeWorkflow}
28+
behindTheScenesComponent={<TriggerBehindTheScenes />}
29+
backRoute={ROUTE.TRIGGER}
30+
/>
31+
32+
<div className={styles.formContainer}>
33+
<iframe src={triggerUrl} width="800" height="600">
34+
</iframe>
35+
</div>
36+
</div>
37+
<Footer withContent={false} />
38+
</div>
39+
);
40+
}
1741

1842
return (
1943
<div className="page-box">
@@ -22,8 +46,9 @@ const TriggerWorkflowForm = () => {
2246
<WorkflowDescription
2347
title={textContent.pageTitles.triggerWorkflow}
2448
behindTheScenesComponent={<TriggerBehindTheScenes />}
49+
backRoute={ROUTE.TRIGGER}
2550
/>
26-
<TriggerForm workflowId={workflowId} templateType={type} />
51+
<TriggerForm workflowId={workflowId} templateType={type} triggerType={triggerType} />
2752
</div>
2853
<Footer withContent={false} />
2954
</div>

server/api/apiFactory.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ const createMaestroApi = (axios, basePath, accountId, accessToken) => {
3939
const api = createAPI(axios, accessToken);
4040

4141
const getWorkflowDefinitions = async params => {
42-
const response = await api.get(`${basePath}/accounts/${accountId}/workflows`, { params });
42+
const response = await api.get(`${basePath}/accounts/${accountId}/management/workflow_definitions`, { params });
4343
return response.data;
4444
};
4545

4646
const getTriggerRequirements = async workflowId => {
47-
const response = await api.get(`${basePath}/accounts/${accountId}/workflows/${workflowId}/trigger-requirements`);
47+
const response = await api.get(`${basePath}/accounts/${accountId}/management/workflow_definitions/${workflowId}`);
4848
return response.data;
4949
};
5050

server/controllers/workflowsController.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ const docusign = require('docusign-esign');
1515
const config = require('../config');
1616
const WorkflowsService = require('../services/workflowsService');
1717
const createPrefixedLogger = require('../utils/logger');
18-
const { TEMPLATE_TYPE } = require('../constants');
19-
const { getPayloadBySchema } = require('../utils/utils');
2018

2119
const oAuth = docusign.ApiClient.OAuth;
2220
const restApi = docusign.ApiClient.RestApi;
@@ -77,9 +75,7 @@ class WorkflowsController {
7775

7876
try {
7977
const triggerRequirements = await WorkflowsService.getWorkflowTriggerRequirements(args);
80-
const payload = getPayloadBySchema(body, triggerRequirements.trigger_input_schema);
81-
82-
const result = await WorkflowsService.triggerWorkflowInstance(args, payload, triggerRequirements);
78+
const result = await WorkflowsService.triggerWorkflowInstance(args, body, triggerRequirements);
8379
res.status(200).send(result);
8480
} catch (error) {
8581
this.handleErrorResponse(error, res);

server/services/workflowsService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class WorkflowsService {
3535
metadata: {},
3636
payload,
3737
};
38-
const triggerResponse = await api.triggerWorkflow(triggerPayload, triggerRequirements.trigger_http_config.url);
38+
const triggerResponse = await api.triggerWorkflow(triggerPayload, triggerRequirements.triggerUrl);
3939

4040
return triggerResponse;
4141
};

0 commit comments

Comments
 (0)