Proyectos de Subversion LeadersLinked - Backend

Rev

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