Proyectos de Subversion LeadersLinked - Backend

Rev

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