Proyectos de Subversion LeadersLinked - Backend

Rev

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