Proyectos de Subversion LeadersLinked - Backend

Rev

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