Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11074 | Rev 11237 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
10540 stevensc 1
/* eslint-disable no-mixed-spaces-and-tabs */
10513 stevensc 2
import axios from 'axios'
10518 stevensc 3
import React, { useState, useEffect } from 'react'
10513 stevensc 4
import { useForm } from 'react-hook-form'
5
import { useDispatch } from 'react-redux'
10450 stevensc 6
import { useHistory, useParams } from 'react-router-dom'
10513 stevensc 7
import { addNotification } from '../../../redux/notification/notification.actions'
10436 stevensc 8
 
10439 stevensc 9
 
10856 stevensc 10
const FormView = ({ actionLink, type_link, vacancy_link, vacancies, add_link, setActionLink }) => {
10513 stevensc 11
 
10558 stevensc 12
	// States
10845 stevensc 13
	const [vacancyOptions, setVacancyOptions] = useState(vacancies)
14
	const [vacancyUrl, setVacancyUrl] = useState(vacancy_link.replace('UUID_PLACEHOLDER', vacancies[0].uuid))
10840 stevensc 15
	const [typeOptions, setTypeOptions] = useState({
16
		url: type_link,
17
		value: ''
18
	})
10558 stevensc 19
	const [generalOptions, setGeneralOptions] = useState({
20
		uuid: '',
21
		name: '',
22
		description: '',
23
		functions: '',
24
		objectives: ''
25
	})
10852 stevensc 26
	const [candidatesOptions, setCandidatesOptions] = useState([])
10853 stevensc 27
	const [competencies, setCompetencies] = useState([{
28
		competency_uuid: '',
29
		competency_name: '',
30
		competency_type_uuid: '',
31
		competency_type_name: '',
32
		behaviors: []
33
	}])
11069 stevensc 34
	const [pointsOptions] = useState([
10558 stevensc 35
		{ label: 'Sugerir otro cargo', value: 0 },
36
		{ label: '25%', value: 1 },
37
		{ label: '50%', value: 2 },
38
		{ label: '75%', value: 3 },
39
		{ label: '100%', value: 4 }
40
	])
11069 stevensc 41
	const [statusOptions] = useState([
10558 stevensc 42
		{ label: 'Aceptado', value: 'a' },
43
		{ label: 'Rechazado', value: 'r' }
44
	])
10516 stevensc 45
 
10558 stevensc 46
	// Hooks
10852 stevensc 47
	const { setValue, register, watch, handleSubmit } = useForm()
10558 stevensc 48
	const history = useHistory()
49
	const dispatch = useDispatch()
50
	const { action } = useParams()
10439 stevensc 51
 
11071 stevensc 52
	const onSubmit = () => {
10915 stevensc 53
 
10856 stevensc 54
		const content = []
55
		competencies.forEach(competency => competency.behaviors.forEach(behavior => {
56
			content.push({
10852 stevensc 57
				competencyUuid: behavior.competency_uuid,
58
				behaviorUuid: behavior.uuid,
11075 stevensc 59
				comment: watch(`${behavior.competency_uuid}-${behavior.uuid}-comment`),
11073 stevensc 60
				evaluation: watch(`select-${behavior.competency_uuid}-${behavior.uuid}`)
10856 stevensc 61
			})
10853 stevensc 62
		}))
10852 stevensc 63
 
64
		const submitData = new FormData()
10865 stevensc 65
		submitData.append('content', JSON.stringify(content))
10852 stevensc 66
		submitData.append('candidate_uuid', watch('candidate'))
67
		submitData.append('points', watch('points'))
68
		submitData.append('comment', watch('comment'))
69
		submitData.append('status', watch('status'))
70
 
10859 stevensc 71
		axios.post(actionLink, submitData)
72
			.then(({ data }) => {
73
				if (!data.success) {
11071 stevensc 74
					typeof data.data === 'string'
75
						?
76
						dispatch(addNotification({
77
							style: 'danger',
78
							msg: data.data
79
						}))
80
						:
81
						dispatch(addNotification({
82
							style: 'danger',
83
							msg: 'Ha ocurrido un error'
84
						}))
11072 stevensc 85
					return
10859 stevensc 86
				}
87
 
10870 stevensc 88
				history.goBack()
10859 stevensc 89
				dispatch(addNotification({
90
					style: 'success',
91
					msg: `Registro ${action === 'edit' ? 'actualizado' : 'añadido'}`
92
				}))
93
			})
10852 stevensc 94
	}
95
 
10558 stevensc 96
	useEffect(() => {
10840 stevensc 97
		if (action === 'edit') {
98
			axios.get(actionLink)
99
				.then(({ data }) => {
100
					const resData = data.data
101
 
102
					if (!data.success) {
11071 stevensc 103
						return dispatch(addNotification({
11051 stevensc 104
							style: 'danger',
10840 stevensc 105
							msg: 'Ha ocurrido un error'
106
						}))
107
					}
108
 
109
					setValue('comment', resData.interview.comment)
110
					setValue('points', resData.interview.points)
111
					setValue('status', resData.interview.status)
112
					setCompetencies(resData.job_description.competencies)
10844 stevensc 113
					setCandidatesOptions([resData.candidate])
114
					setVacancyOptions([{ name: resData.vacancy.name, uuid: resData.vacancy.uuid }])
10843 stevensc 115
					setTypeOptions({ ...typeOptions, value: resData.interview.type === 'r' ? 'Entrevista por Recursos Humanos' : 'Entrevista por Potencial superior' })
10840 stevensc 116
					setGeneralOptions({
117
						...generalOptions,
118
						name: resData.vacancy.name,
119
						uuid: resData.vacancy.uuid,
120
						description: resData.vacancy.description,
121
						functions: resData.job_description.functions,
122
						objectives: resData.job_description.objectives
123
					})
11073 stevensc 124
					resData.interview.content.forEach((obj) => {
125
						setValue(`select-${obj.competencyUuid}-${obj.behaviorUuid}`, obj.evaluation)
11074 stevensc 126
						setValue(`${obj.competencyUuid}-${obj.behaviorUuid}-comment`, obj.comment)
11073 stevensc 127
					})
10840 stevensc 128
				})
129
		}
130
	}, [action])
131
 
132
	useEffect(() => {
133
		axios.get(typeOptions.url)
10753 stevensc 134
			.then(({ data }) => {
10513 stevensc 135
 
10753 stevensc 136
				if (!data.success) {
11071 stevensc 137
					return dispatch(addNotification({
11051 stevensc 138
						style: 'danger',
10753 stevensc 139
						msg: 'Ha ocurrido un error'
140
					}))
141
				}
10513 stevensc 142
 
10843 stevensc 143
				setTypeOptions({ ...typeOptions, value: data.data })
10753 stevensc 144
			})
145
 
10840 stevensc 146
	}, [typeOptions.url])
10516 stevensc 147
 
10843 stevensc 148
	useEffect(() => {
10935 stevensc 149
		if (action == 'add') {
150
			axios.get(vacancyUrl)
151
				.then(({ data }) => {
152
					const resData = data.data
10843 stevensc 153
 
10935 stevensc 154
					if (!data.success) {
11071 stevensc 155
						return dispatch(addNotification({
11051 stevensc 156
							style: 'danger',
10935 stevensc 157
							msg: 'Ha ocurrido un error'
158
						}))
159
					}
10843 stevensc 160
 
10935 stevensc 161
					setCandidatesOptions(resData.candidates)
162
					setCompetencies(resData.job_description.competencies)
163
					setTypeOptions({ ...typeOptions, value: resData.interview.type === 'r' ? 'Entrevista por Recursos Humanos' : 'Entrevista por Potencial superior' })
164
					setGeneralOptions({
165
						...generalOptions,
166
						name: resData.vacancy.name,
167
						uuid: resData.vacancy.uuid,
168
						description: resData.vacancy.description,
169
						functions: resData.job_description.functions,
170
						objectives: resData.job_description.objectives
171
					})
10843 stevensc 172
				})
10935 stevensc 173
		}
10843 stevensc 174
	}, [vacancyUrl])
175
 
10558 stevensc 176
	return (
177
		<section className="content">
178
			<div className="container-fluid">
179
				<div className="row">
180
					<div className="col-12">
10852 stevensc 181
						<form onSubmit={handleSubmit(onSubmit)}>
182
							<div className='card'>
183
								<div className="card-header">
184
									<ul className="nav nav-tabs" id="myTab" role="tablist">
185
										<li className="nav-item" role="presentation">
186
											<button className="nav-link active" id="home-tab" data-toggle="tab" data-target="#home" type="button" role="tab" aria-controls="home" aria-selected="true">General</button>
187
										</li>
188
										<li className="nav-item" role="presentation">
189
											<button className="nav-link" id="profile-tab" data-toggle="tab" data-target="#profile" type="button" role="tab" aria-controls="profile" aria-selected="false">Competencias</button>
190
										</li>
191
										<li className="nav-item" role="presentation">
192
											<button className="nav-link" id="contact-tab" data-toggle="tab" data-target="#contact" type="button" role="tab" aria-controls="contact" aria-selected="false">Conclusiones</button>
193
										</li>
194
									</ul>
195
								</div>
196
								<div className="card-body">
197
									<div className="tab-content" id="myTabContent">
198
										<div className="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
199
											<div className="row p-3 justify-content-between">
200
												<div className="col-6">
201
													<div className="form-group">
202
														<label>Vacantes</label>
10856 stevensc 203
														<select
204
															className='form-control'
205
															name='vacancy' ref={register}
206
															disabled={action === 'edit'}
207
															onChange={(e) => {
208
																setVacancyUrl(vacancy_link.replace('UUID_PLACEHOLDER', e.target.value))
209
																setActionLink(add_link.replace('UUID_PLACEHOLDER', e.target.value))
210
															}}>
10852 stevensc 211
															{
212
																vacancyOptions.map(({ name, uuid }) => (
213
																	<option selected={generalOptions.name === name} key={uuid} value={uuid}>{name}</option>
214
																))
215
															}
216
														</select>
217
													</div>
10569 stevensc 218
												</div>
10852 stevensc 219
												<div className="col-6">
220
													<div className="form-group">
221
														<label>Candidatos</label>
222
														<select className='form-control' name='candidate' ref={register} disabled={action === 'edit'} onChange={(e) => setTypeOptions(prev => ({ ...prev, url: type_link.replace('UUID_PLACEHOLDER', e.target.value) }))}>
223
															{
224
																candidatesOptions.map(({ first_name, last_name, uuid }) => (
225
																	<option selected={watch('candidate') === uuid} key={uuid} value={uuid}>{`${first_name} ${last_name}`}</option>
226
																))
227
															}
228
														</select>
229
													</div>
230
												</div>
10558 stevensc 231
											</div>
10852 stevensc 232
											<h5>{typeOptions.value}</h5>
233
											<div className="card">
234
												<div className="card-body">
235
													<h5>{generalOptions.name}</h5>
236
													<p>{generalOptions.description}</p>
237
													<h6>Funciones</h6>
238
													<p>{generalOptions.functions}</p>
239
													<h6>Objetivos</h6>
240
													<p>{generalOptions.objectives}</p>
10569 stevensc 241
												</div>
10558 stevensc 242
											</div>
243
										</div>
10852 stevensc 244
										<div className="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
245
											{
246
												competencies.map((competency) => (
247
													<div className="card" key={competency.competency_uuid}>
248
														<div className="card-header">
249
															<h5>{competency.competency_name} - {competency.competency_type_name}</h5>
250
														</div>
251
														<div className="card-body">
252
															{
253
																competency.behaviors
254
																&&
255
																competency.behaviors.map((behavior) => (
256
																	<table key={behavior.uuid} className="table table-hover">
257
																		<thead>
258
																			<tr>
259
																				<th style={{ width: '20%' }}>Conducta Observable</th>
260
																				<th style={{ width: '60%' }}>Comentario</th>
261
																				<th style={{ width: '20%' }}>Evaluación</th>
262
																			</tr>
263
																		</thead>
264
																		<tbody>
265
																			<tr>
266
																				<td style={{ width: '20%' }}>{behavior.description}</td>
267
																				<td style={{ width: '60%' }}>
268
																					<textarea
11074 stevensc 269
																						name={`${behavior.competency_uuid}-${behavior.uuid}-comment`}
10852 stevensc 270
																						cols="30"
271
																						rows="3"
272
																						ref={register}
273
																						className='form-control w100'
274
																					/>
275
																				</td>
276
																				<td style={{ width: '20%' }}>
11073 stevensc 277
																					<select className='form-control' name={`select-${behavior.competency_uuid}-${behavior.uuid}`} ref={register}>
10852 stevensc 278
																						{
10935 stevensc 279
																							pointsOptions.map(({ label, value }) => {
11073 stevensc 280
																								return <option selected={watch(`select-${behavior.competency_uuid}-${behavior.uuid}`) === value} key={value} value={value}>{label}</option>
10935 stevensc 281
																							})
10852 stevensc 282
																						}
283
																					</select>
284
																				</td>
285
																			</tr>
286
																		</tbody>
287
																	</table>
288
																))
289
															}
290
														</div>
291
													</div>
292
												))
293
											}
294
										</div>
295
										<div className="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab">
296
											<div className="form-group">
297
												<label>Comentario</label>
298
												<input type="text" name="comment" className="form-control" ref={register} />
10558 stevensc 299
											</div>
10852 stevensc 300
											<div className="form-group">
301
												<label>Evaluación</label>
302
												<select className='form-control' name='points' ref={register} defaultValue={pointsOptions[0].value}>
303
													{
304
														pointsOptions.map(({ label, value }) => (
305
															<option selected={watch('points') === value} key={value} value={value}>{label}</option>
306
														))
307
													}
308
												</select>
309
											</div>
310
											<div className="form-group">
311
												<label>Estatus</label>
312
												<select className='form-control' name='status' ref={register} defaultValue={statusOptions[0].value}>
313
													{
314
														statusOptions.map(({ label, value }) => (
315
															<option selected={watch('status') === value} key={value} value={value}>{label}</option>
316
														))
317
													}
318
												</select>
319
											</div>
10558 stevensc 320
										</div>
321
									</div>
10852 stevensc 322
									<div className="form-group">
323
										<button type="submit" className="btn btn-primary btn-form-save-close mr-2">
324
											Guardar
325
										</button>
326
										<button
327
											type="button"
328
											className="btn btn-secondary btn-edit-cancel"
329
											onClick={() => history.goBack()}
330
										>
331
											Cancelar
332
										</button>
10558 stevensc 333
									</div>
334
								</div>
335
							</div>
10852 stevensc 336
						</form>
10558 stevensc 337
					</div>
338
				</div>
339
			</div>
340
		</section >
341
	)
10436 stevensc 342
}
343
export default FormView