@@ -3,23 +3,58 @@ import { useNavigate } from 'react-router-dom';
33import { useDispatch , useSelector } from 'react-redux' ;
44import styles from './TriggerForm.module.css' ;
55import WorkflowTriggerResultPopup from '../Popups/WorkflowTriggerResult/WorkflowTriggerResult.jsx' ;
6- import textContent from '../../assets/text.json' ;
7- import { ROUTE } from '../../constants.js' ;
6+ import { triggerForm , buttons } from '../../assets/text.json' ;
7+ import { ROUTE , TemplateType } from '../../constants.js' ;
88import { api } from '../../api' ;
99import { openPopupWindow , closePopupWindow , updateWorkflowDefinitions } from '../../store/actions' ;
1010
11- const TriggerForm = ( { workflowId } ) => {
11+ const TriggerForm = ( { workflowId, templateType } ) => {
1212 const dispatch = useDispatch ( ) ;
1313 const navigate = useNavigate ( ) ;
1414 const isPopupOpened = useSelector ( state => state . popup . isOpened ) ;
1515 const workflows = useSelector ( state => state . workflows . workflows ) ;
16- const [ instanceName , setInstanceName ] = useState ( '' ) ;
17- const [ signerName , setSignerName ] = useState ( '' ) ;
18- const [ signerEmail , setSignerEmail ] = useState ( '' ) ;
19- const [ ccName , setCcName ] = useState ( '' ) ;
20- const [ ccEmail , setCcEmail ] = useState ( '' ) ;
2116 const [ isDataSending , setDataSending ] = useState ( false ) ;
2217 const [ workflowInstanceUrl , setWorkflowInstanceUrl ] = useState ( '' ) ;
18+ const [ i9Form , setI9Form ] = useState ( [
19+ { fieldHeader : triggerForm . fieldsI9 . field1 , fieldName : 'preparerName' , value : '' } ,
20+ { fieldHeader : triggerForm . fieldsI9 . field2 , fieldName : 'preparerEmail' , value : '' } ,
21+ { fieldHeader : triggerForm . fieldsI9 . field3 , fieldName : 'employeeName' , value : '' } ,
22+ { fieldHeader : triggerForm . fieldsI9 . field4 , fieldName : 'employeeEmail' , value : '' } ,
23+ { fieldHeader : triggerForm . fieldsI9 . field5 , fieldName : 'hrApproverName' , value : '' } ,
24+ { fieldHeader : triggerForm . fieldsI9 . field6 , fieldName : 'hrApproverEmail' , value : '' } ,
25+ ] ) ;
26+ const [ offerLetterForm , setOfferLetterForm ] = useState ( [
27+ { fieldHeader : triggerForm . fieldsOffer . field1 , fieldName : 'hrManagerName' , value : '' } ,
28+ { fieldHeader : triggerForm . fieldsOffer . field2 , fieldName : 'hrManagerEmail' , value : '' } ,
29+ { fieldHeader : triggerForm . fieldsOffer . field3 , fieldName : 'Company' , value : '' } ,
30+ ] ) ;
31+ const [ ndaForm , setNdaForm ] = useState ( [
32+ { fieldHeader : triggerForm . fieldsNda . field1 , fieldName : 'hrManagerName' , value : '' } ,
33+ { 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+ }
52+
53+ const handleChange = ( idx , event ) => {
54+ const newRelevantForm = [ ...relevantFormFields ] ;
55+ newRelevantForm [ idx ] . value = event . target . value ;
56+ relevantSetter ( newRelevantForm ) ;
57+ } ;
2358
2459 const handleCloseTriggerPopup = ( ) => {
2560 dispatch ( closePopupWindow ( ) ) ;
@@ -29,76 +64,54 @@ const TriggerForm = ({ workflowId }) => {
2964 const handleSubmit = async event => {
3065 event . preventDefault ( ) ;
3166
32- const body = {
33- instanceName,
34- signerEmail,
35- signerName,
36- ccEmail,
37- ccName,
38- } ;
67+ const body = relevantFormFields . reduce ( ( acc , current ) => {
68+ acc [ current . fieldName ] = current . value ;
69+ return acc ;
70+ } , { } ) ;
71+
72+ if ( ! Object . keys ( body ) . length ) {
73+ navigate ( ROUTE . TRIGGER ) ;
74+ return ;
75+ }
3976
4077 setDataSending ( true ) ;
41- const { data : triggeredWorkflow } = await api . workflows . triggerWorkflow ( workflowId , body ) ;
78+ const { data : triggeredWorkflow } = await api . workflows . triggerWorkflow ( workflowId , templateType , body ) ;
4279 setWorkflowInstanceUrl ( triggeredWorkflow . workflowInstanceUrl ) ;
4380
4481 // Update workflowDefinitions. "...workflow" creates new workflow-object to avoid mutation in redux
45- const updatedWorkflowDefinitions = workflows . map ( workflow => {
46- if ( workflow . id === workflowId ) {
47- return {
48- ...workflow ,
49- instanceId : triggeredWorkflow . instanceId ,
50- isTriggered : true ,
51- } ;
52- }
53-
54- return { ...workflow } ;
82+ const updatedWorkflowDefinitions = workflows . map ( w => {
83+ if ( w . id !== workflowId ) return { ...w } ;
84+
85+ return {
86+ ...w ,
87+ instanceId : triggeredWorkflow . instanceId ,
88+ isTriggered : true ,
89+ } ;
5590 } ) ;
5691
5792 dispatch ( updateWorkflowDefinitions ( updatedWorkflowDefinitions ) ) ;
5893 setDataSending ( false ) ;
59-
60- setInstanceName ( '' ) ;
61- setSignerName ( '' ) ;
62- setSignerEmail ( '' ) ;
63- setCcName ( '' ) ;
64- setCcEmail ( '' ) ;
6594 dispatch ( openPopupWindow ( ) ) ;
6695 } ;
6796
6897 return (
6998 < div className = { styles . formContainer } >
70- < h2 > { textContent . triggerForm . formTitle } </ h2 >
99+ < h2 > { triggerForm . formTitle } </ h2 >
71100 < div className = { styles . divider } />
72101 < form className = { styles . triggerForm } onSubmit = { handleSubmit } >
73- < h3 > { textContent . triggerForm . formName } </ h3 >
74- < div >
75- < label > { textContent . triggerForm . fields . instanceName } </ label >
76- < input type = "text" value = { instanceName } onChange = { e => setInstanceName ( e . target . value ) } required = { true } />
77- </ div >
78-
79- < div >
80- < label > { textContent . triggerForm . fields . signerName } </ label >
81- < input type = "text" value = { signerName } onChange = { e => setSignerName ( e . target . value ) } required = { true } />
82- </ div >
83-
84- < div >
85- < label > { textContent . triggerForm . fields . signerEmail } </ label >
86- < input type = "text" value = { signerEmail } onChange = { e => setSignerEmail ( e . target . value ) } required = { true } />
87- </ div >
88-
89- < div >
90- < label > { textContent . triggerForm . fields . ccName } </ label >
91- < input type = "text" value = { ccName } onChange = { e => setCcName ( e . target . value ) } required = { true } />
92- </ div >
102+ < h3 > { triggerForm . formName } </ h3 >
93103
94- < div >
95- < label > { textContent . triggerForm . fields . ccEmail } </ label >
96- < input type = "text" value = { ccEmail } onChange = { e => setCcEmail ( e . target . value ) } required = { true } />
97- </ div >
104+ { relevantFormFields . map ( ( formItem , idx ) => (
105+ < div key = { formItem . fieldHeader } >
106+ < label > { formItem . fieldHeader } </ label >
107+ < input type = "text" value = { formItem . value } onChange = { e => handleChange ( idx , e ) } required = { true } />
108+ </ div >
109+ ) ) }
98110
99111 < div className = { styles . divider } />
100- < button type = "submit" disabled = { isDataSending } >
101- { textContent . buttons . continue }
112+ < button className = "btn btn-primary" type = "submit" disabled = { isDataSending } >
113+ < span className = "sr-only" > { buttons . continue } </ span >
114+ { isDataSending ? < span className = "spinner-border spinner-border-sm" /> : null }
102115 </ button >
103116 </ form >
104117 { isPopupOpened && (
0 commit comments