Skip to content

Commit 29a8379

Browse files
committed
added dynamic inputs and adding minor fixes
1 parent dc7c80c commit 29a8379

File tree

6 files changed

+75
-47
lines changed

6 files changed

+75
-47
lines changed

client/src/api/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ export const api = Object.freeze({
126126
},
127127
getWorkflowTriggerRequirements: async workflowId => {
128128
try {
129-
const response = await instance.put(`/workflows/${workflowId}/requirements`);
129+
const response = await instance.get(`/workflows/${workflowId}/requirements`);
130130
return response;
131131
} catch (error) {
132132
return error.response;

client/src/assets/text.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
},
2121
"triggerForm": {
2222
"formTitle": "Fill in details",
23+
"formTitleWithoutInputs": "This workflow does not require additional fields",
2324
"formName": "Participant Information",
2425
"fieldsI9": {
2526
"field1": "Preparer name",

client/src/components/TriggerForm/TriggerForm.jsx

Lines changed: 59 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState } from 'react';
1+
import { useState, useEffect } from 'react';
22
import { useNavigate } from 'react-router-dom';
33
import { useDispatch, useSelector } from 'react-redux';
44
import styles from './TriggerForm.module.css';
@@ -15,45 +15,62 @@ const TriggerForm = ({ workflowId, templateType }) => {
1515
const workflows = useSelector(state => state.workflows.workflows);
1616
const [isDataSending, setDataSending] = useState(false);
1717
const [workflowInstanceUrl, setWorkflowInstanceUrl] = useState('');
18-
const [i9Form, setI9Form] = useState([
18+
const i9Form = [
1919
{ fieldHeader: triggerForm.fieldsI9.field1, fieldName: 'preparerName', value: '' },
2020
{ fieldHeader: triggerForm.fieldsI9.field2, fieldName: 'preparerEmail', value: '' },
2121
{ fieldHeader: triggerForm.fieldsI9.field3, fieldName: 'employeeName', value: '' },
2222
{ fieldHeader: triggerForm.fieldsI9.field4, fieldName: 'employeeEmail', value: '' },
2323
{ fieldHeader: triggerForm.fieldsI9.field5, fieldName: 'hrApproverName', value: '' },
2424
{ fieldHeader: triggerForm.fieldsI9.field6, fieldName: 'hrApproverEmail', value: '' },
25-
]);
26-
const [offerLetterForm, setOfferLetterForm] = useState([
25+
];
26+
const offerLetterForm = [
2727
{ fieldHeader: triggerForm.fieldsOffer.field1, fieldName: 'hrManagerName', value: '' },
2828
{ fieldHeader: triggerForm.fieldsOffer.field2, fieldName: 'hrManagerEmail', value: '' },
2929
{ fieldHeader: triggerForm.fieldsOffer.field3, fieldName: 'Company', value: '' },
30-
]);
31-
const [ndaForm, setNdaForm] = useState([
30+
];
31+
const ndaForm = [
3232
{ fieldHeader: triggerForm.fieldsNda.field1, fieldName: 'hrManagerName', value: '' },
3333
{ fieldHeader: triggerForm.fieldsNda.field2, fieldName: 'hrManagerEmail', value: '' },
34-
]);
35-
36-
let relevantFormFields = [];
37-
let relevantSetter = null;
38-
switch (templateType) {
39-
case TemplateType.I9.type:
40-
relevantFormFields = i9Form;
41-
relevantSetter = setI9Form;
42-
break;
43-
case TemplateType.OFFER.type:
44-
relevantFormFields = offerLetterForm;
45-
relevantSetter = setOfferLetterForm;
46-
break;
47-
case TemplateType.NDA.type:
48-
relevantFormFields = ndaForm;
49-
relevantSetter = setNdaForm;
50-
break;
51-
}
34+
];
35+
36+
let [relevantFormFields, setRelevantFormFields] = useState([]);
37+
38+
useEffect(() => {
39+
switch (templateType) {
40+
case TemplateType.I9.type:
41+
setRelevantFormFields(i9Form);
42+
break;
43+
case TemplateType.OFFER.type:
44+
setRelevantFormFields(offerLetterForm);
45+
break;
46+
case TemplateType.NDA.type:
47+
setRelevantFormFields(ndaForm);
48+
break;
49+
case "-":
50+
try {
51+
api.workflows.getWorkflowTriggerRequirements(workflowId).then(data => {
52+
console.log(data.data.trigger_input_schema);
53+
setRelevantFormFields(generateDynamicForm(data.data.trigger_input_schema, 'Custom'));
54+
});
55+
} catch (error) {
56+
console.error("Failed to fetch trigger requirements:", error);
57+
}
58+
break;
59+
}
60+
}, [])
61+
62+
const generateDynamicForm = (fieldNames) => {
63+
return fieldNames.map((field) => ({
64+
fieldHeader: field.field_name,
65+
fieldName: field.field_name,
66+
value: '',
67+
}));
68+
};
5269

5370
const handleChange = (idx, event) => {
5471
const newRelevantForm = [...relevantFormFields];
5572
newRelevantForm[idx].value = event.target.value;
56-
relevantSetter(newRelevantForm);
73+
setRelevantFormFields(newRelevantForm);
5774
};
5875

5976
const handleCloseTriggerPopup = () => {
@@ -76,7 +93,7 @@ const TriggerForm = ({ workflowId, templateType }) => {
7693

7794
setDataSending(true);
7895
const { data: triggeredWorkflow } = await api.workflows.triggerWorkflow(workflowId, templateType, body);
79-
setWorkflowInstanceUrl(triggeredWorkflow.workflowInstanceUrl);
96+
setWorkflowInstanceUrl(triggeredWorkflow.instance_url);
8097

8198
// Update workflowDefinitions. "...workflow" creates new workflow-object to avoid mutation in redux
8299
const updatedWorkflowDefinitions = workflows.map(w => {
@@ -93,6 +110,22 @@ const TriggerForm = ({ workflowId, templateType }) => {
93110
setDataSending(false);
94111
dispatch(openPopupWindow());
95112
};
113+
if (!relevantFormFields.length)
114+
return (
115+
<div className={styles.formContainer}>
116+
<h2>{triggerForm.formTitleWithoutInputs}</h2>
117+
118+
<form className={styles.triggerForm} onSubmit={handleSubmit}>
119+
<button className="btn btn-primary" type="submit" disabled={isDataSending}>
120+
<span className="sr-only">{buttons.triggerWorkflow}</span>
121+
{isDataSending ? <span className="spinner-border spinner-border-sm" /> : null}
122+
</button>
123+
</form>
124+
{isPopupOpened && (
125+
<WorkflowTriggerResultPopup workflowInstanceUrl={workflowInstanceUrl} togglePopup={handleCloseTriggerPopup} />
126+
)}
127+
</div>
128+
);
96129

97130
return (
98131
<div className={styles.formContainer}>

client/src/components/TriggerForm/TriggerForm.module.css

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ label {
6969

7070
.triggerForm button {
7171
margin: 0.5rem 2.5rem 0 0;
72-
width: 120px;
7372
height: 40px;
7473
border-radius: 2px;
7574
color: var(--white-main);

client/src/components/WorkflowList/WorkflowList.module.css

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
.listGroup a {
1212
width: 100%;
1313
height: 60px;
14-
display: flex;
1514
flex-direction: row;
1615
border-radius: 1px !important;
1716
justify-content: space-between;

client/src/pages/TriggerWorkflow/TriggerWorkflow.jsx

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import withAuth from '../../hocs/withAuth/withAuth.jsx';
99
import WorkflowList from '../../components/WorkflowList/WorkflowList.jsx';
1010
import WorkflowDescription from '../../components/WorkflowDescription/WorkflowDescription.jsx';
1111
import TriggerBehindTheScenes from '../../components/WorkflowDescription/BehindTheScenes/TriggerBehindTheScenes.jsx';
12-
import { ROUTE, TemplateType, WorkflowItemsInteractionType, WorkflowStatus } from '../../constants.js';
12+
import { LoginStatus, TemplateType, WorkflowItemsInteractionType } from '../../constants.js';
1313
import { api } from '../../api';
1414
import { updateWorkflowDefinitions } from '../../store/actions';
1515

@@ -18,13 +18,13 @@ const TriggerWorkflow = () => {
1818
const location = useLocation();
1919
const [isWorkflowListLoading, setWorkflowListLoading] = useState(false);
2020
const workflows = useSelector(state => state.workflows.workflows);
21+
const authType = useSelector(state => state.auth.authType);
2122

2223
useEffect(() => {
2324
const getWorkflowDefinitions = async () => {
2425
setWorkflowListLoading(true);
2526
const definitionsResponse = await api.workflows.getWorkflowDefinitions();
26-
27-
const workflowDefinitions = definitionsResponse.data.value
27+
const workflowDefinitions = definitionsResponse.data.data.workflows.filter(definition => definition.status !== 'inactive')
2828
.map(definition => {
2929
if (workflows.length) {
3030
const foundWorkflow = workflows.find(workflow => workflow.id === definition.id);
@@ -33,7 +33,16 @@ const TriggerWorkflow = () => {
3333

3434
const templateKeys = Object.keys(TemplateType);
3535
const foundKey = templateKeys.find(key => definition.name.startsWith(TemplateType[key].name));
36-
if (!foundKey) return null;
36+
if (!foundKey) {
37+
if(authType === LoginStatus.JWT)
38+
return null;
39+
40+
return {
41+
id: definition.id,
42+
name: definition.name,
43+
type: "-",
44+
};
45+
}
3746

3847
return {
3948
id: definition.id,
@@ -43,20 +52,7 @@ const TriggerWorkflow = () => {
4352
})
4453
.filter(definition => !!definition);
4554

46-
const workflowsWithState = await Promise.all(
47-
workflowDefinitions.map(async definition => {
48-
const { data } = await api.workflows.getWorkflowInstances(definition.id);
49-
const relevantInstanceState = data.length > 0 ? data[data.length - 1].instanceState : WorkflowStatus.NotRun;
50-
51-
return {
52-
...definition,
53-
instanceState: relevantInstanceState,
54-
};
55-
})
56-
);
57-
58-
// Set workflow definitions with their statuses downloaded from docusign server
59-
dispatch(updateWorkflowDefinitions(workflowsWithState));
55+
dispatch(updateWorkflowDefinitions(workflowDefinitions));
6056
setWorkflowListLoading(false);
6157
};
6258

0 commit comments

Comments
 (0)