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 |
|
10513 |
stevensc |
10 |
const FormView = ({ actionLink }) => {
|
|
|
11 |
|
10558 |
stevensc |
12 |
// States
|
|
|
13 |
const [generalOptions, setGeneralOptions] = useState({
|
|
|
14 |
uuid: '',
|
|
|
15 |
name: '',
|
|
|
16 |
description: '',
|
|
|
17 |
functions: '',
|
|
|
18 |
objectives: ''
|
|
|
19 |
})
|
|
|
20 |
const [pointsOptions, setPointsOptions] = useState([
|
|
|
21 |
{ label: 'Evaluación', value: 0 },
|
|
|
22 |
{ label: 'Sugerir otro cargo', value: 0 },
|
|
|
23 |
{ label: '25%', value: 1 },
|
|
|
24 |
{ label: '50%', value: 2 },
|
|
|
25 |
{ label: '75%', value: 3 },
|
|
|
26 |
{ label: '100%', value: 4 }
|
|
|
27 |
])
|
|
|
28 |
const [statusOptions, setStatusOptions] = useState([
|
|
|
29 |
{ label: 'Estatus', value: '' },
|
|
|
30 |
{ label: 'Aceptado', value: 'a' },
|
|
|
31 |
{ label: 'Rechazado', value: 'r' }
|
|
|
32 |
])
|
|
|
33 |
const [vacancyOptions, setVacancyOptions] = useState([
|
|
|
34 |
{ label: 'Estatus', value: '' },
|
|
|
35 |
{ label: 'Aceptado', value: 'a' },
|
|
|
36 |
{ label: 'Rechazado', value: 'r' }
|
|
|
37 |
])
|
|
|
38 |
const [candidatesOptions, setCandidatesOptions] = useState([
|
|
|
39 |
{ label: 'Estatus', value: '' },
|
|
|
40 |
{ label: 'Aceptado', value: 'a' },
|
|
|
41 |
{ label: 'Rechazado', value: 'r' }
|
|
|
42 |
])
|
|
|
43 |
const [competencies, setCompetencies] = useState([])
|
10516 |
stevensc |
44 |
|
10558 |
stevensc |
45 |
// Hooks
|
|
|
46 |
const { setValue, register, watch } = useForm()
|
|
|
47 |
const history = useHistory()
|
|
|
48 |
const dispatch = useDispatch()
|
|
|
49 |
const { action } = useParams()
|
10439 |
stevensc |
50 |
|
10558 |
stevensc |
51 |
useEffect(() => {
|
10513 |
stevensc |
52 |
|
10558 |
stevensc |
53 |
// Get current item data
|
|
|
54 |
if (action === 'edit') {
|
|
|
55 |
axios.get(actionLink)
|
|
|
56 |
.then(({ data }) => {
|
|
|
57 |
const resData = data.data
|
10513 |
stevensc |
58 |
|
10558 |
stevensc |
59 |
if (!data.success) {
|
|
|
60 |
dispatch(addNotification({
|
|
|
61 |
style: 'error',
|
|
|
62 |
msg: 'Ha ocurrido un error'
|
|
|
63 |
}))
|
|
|
64 |
}
|
10513 |
stevensc |
65 |
|
10558 |
stevensc |
66 |
setValue('comment', resData.interview.comment)
|
|
|
67 |
setValue('points', resData.interview.points)
|
|
|
68 |
setValue('status', resData.interview.status)
|
|
|
69 |
setCompetencies(resData.job_description.competencies)
|
|
|
70 |
setGeneralOptions({
|
|
|
71 |
...generalOptions,
|
|
|
72 |
name: resData.vacancy.name,
|
|
|
73 |
uuid: resData.vacancy.uuid,
|
|
|
74 |
description: resData.vacancy.description,
|
|
|
75 |
functions: dataExaple.job_description.functions,
|
|
|
76 |
objectives: dataExaple.job_description.objectives
|
|
|
77 |
})
|
|
|
78 |
})
|
|
|
79 |
}
|
|
|
80 |
}, [action])
|
10516 |
stevensc |
81 |
|
10558 |
stevensc |
82 |
const dataExaple = {
|
|
|
83 |
'job_description': {
|
|
|
84 |
'uuid': '8ff86a9a-651c-4dd0-86c1-b9c0716d09e0',
|
|
|
85 |
'name': 'Programador Junior',
|
|
|
86 |
'functions': '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tempus urna et pharetra pharetra massa massa ultricies mi. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Tortor posuere ac ut consequat semper viverra nam. Ultricies leo integer malesuada nunc.</p>',
|
|
|
87 |
'objectives': '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tempus urna et pharetra pharetra massa massa ultricies mi. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Tortor posuere ac ut consequat semper viverra nam. Ultricies leo integer malesuada nunc.</p>',
|
|
|
88 |
'competencies': [
|
|
|
89 |
{
|
|
|
90 |
'competency_uuid': '79b6ae02-f8e9-4f57-976d-d28b31fc824b',
|
|
|
91 |
'competency_name': 'Flexibilidad',
|
|
|
92 |
'competency_type_uuid': 'ae45b2e5-73a9-4a0b-ad04-29a07524ccd6',
|
|
|
93 |
'competency_type_name': 'Competencias Horizontales',
|
|
|
94 |
'behaviors': [
|
|
|
95 |
{
|
|
|
96 |
'uuid': '4cee9594-051d-4a52-82f0-58d4accc5583',
|
|
|
97 |
'description': 'Enfocar sus acciones al logro de los resultados planteados.',
|
|
|
98 |
'points': 0,
|
|
|
99 |
'comment': '',
|
|
|
100 |
'competency_uuid': '79b6ae02-f8e9-4f57-976d-d28b31fc824b'
|
|
|
101 |
}
|
|
|
102 |
]
|
|
|
103 |
}
|
|
|
104 |
]
|
|
|
105 |
},
|
|
|
106 |
'interview': {
|
|
|
107 |
'id': 'd1cb9f3d-a6d0-43c1-a698-645b0156d99d',
|
|
|
108 |
'status': 'a',
|
|
|
109 |
'content': [
|
|
|
110 |
{
|
|
|
111 |
'competencyUuid': '79b6ae02-f8e9-4f57-976d-d28b31fc824b',
|
|
|
112 |
'behaviorUuid': '4cee9594-051d-4a52-82f0-58d4accc5583',
|
|
|
113 |
'comment': '',
|
|
|
114 |
'evaluation': '0'
|
|
|
115 |
}
|
|
|
116 |
],
|
|
|
117 |
'type': 'b',
|
|
|
118 |
'points': '3',
|
|
|
119 |
'comment': null
|
|
|
120 |
}
|
|
|
121 |
}
|
10513 |
stevensc |
122 |
|
10558 |
stevensc |
123 |
useEffect(() => {
|
|
|
124 |
console.log(action)
|
|
|
125 |
}, [])
|
10450 |
stevensc |
126 |
|
10558 |
stevensc |
127 |
return (
|
|
|
128 |
<section className="content">
|
|
|
129 |
<div className="container-fluid">
|
|
|
130 |
<div className="row">
|
|
|
131 |
<div className="col-12">
|
|
|
132 |
<div className='card'>
|
|
|
133 |
<div className="card-header">
|
|
|
134 |
<ul className="nav nav-tabs" id="myTab" role="tablist">
|
|
|
135 |
<li className="nav-item" role="presentation">
|
|
|
136 |
<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>
|
|
|
137 |
</li>
|
|
|
138 |
<li className="nav-item" role="presentation">
|
|
|
139 |
<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>
|
|
|
140 |
</li>
|
|
|
141 |
<li className="nav-item" role="presentation">
|
|
|
142 |
<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>
|
|
|
143 |
</li>
|
|
|
144 |
</ul>
|
|
|
145 |
</div>
|
|
|
146 |
<div className="card-body">
|
|
|
147 |
<div className="tab-content" id="myTabContent">
|
|
|
148 |
<div className="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
|
|
|
149 |
<div className="row p-3 justify-content-between">
|
|
|
150 |
<div className="form-group">
|
|
|
151 |
<label>Vacantes</label>
|
|
|
152 |
<select className='form-control' name='points' ref={register}>
|
|
|
153 |
{
|
|
|
154 |
vacancyOptions.map(({ label, value }) => (
|
|
|
155 |
<option selected={generalOptions.name === label} key={value} value={value}>{label}</option>
|
|
|
156 |
))
|
|
|
157 |
}
|
|
|
158 |
</select>
|
|
|
159 |
</div>
|
|
|
160 |
<div className="form-group">
|
|
|
161 |
<label>Candidatos</label>
|
|
|
162 |
<select className='form-control' name='points' ref={register}>
|
|
|
163 |
{
|
|
|
164 |
candidatesOptions.map(({ label, value }) => (
|
|
|
165 |
<option selected={watch('candidate') === value} key={value} value={value}>{label}</option>
|
|
|
166 |
))
|
|
|
167 |
}
|
|
|
168 |
</select>
|
|
|
169 |
</div>
|
|
|
170 |
</div>
|
|
|
171 |
<div className="card">
|
|
|
172 |
<div className="card-body">
|
|
|
173 |
<h5>{generalOptions.name}</h5>
|
|
|
174 |
<p>{generalOptions.description}</p>
|
|
|
175 |
<h6>Funciones</h6>
|
|
|
176 |
<p>{generalOptions.functions}</p>
|
|
|
177 |
<h6>Objetivos</h6>
|
|
|
178 |
<p>{generalOptions.objectives}</p>
|
|
|
179 |
</div>
|
|
|
180 |
</div>
|
|
|
181 |
</div>
|
|
|
182 |
<div className="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
|
|
|
183 |
{
|
|
|
184 |
competencies.length
|
10540 |
stevensc |
185 |
&&
|
10558 |
stevensc |
186 |
competencies.map((competency, competency_index) => (
|
|
|
187 |
<div className="card" key={competency.competency_uuid}>
|
|
|
188 |
<div className="card-header">
|
|
|
189 |
<h5>{competency.competency_name} - {competency.competency_type_name}</h5>
|
|
|
190 |
</div>
|
|
|
191 |
<div className="card-body">
|
|
|
192 |
{
|
|
|
193 |
competency.behaviors
|
10532 |
stevensc |
194 |
&&
|
10554 |
stevensc |
195 |
competency.behaviors.map((behavior, index) => (
|
10558 |
stevensc |
196 |
<table key={behavior.uuid}>
|
|
|
197 |
<thead>
|
|
|
198 |
<tr>
|
|
|
199 |
<th style={{ width: '20%' }}>Conducta Observable</th>
|
|
|
200 |
<th style={{ width: '60%' }}>Comentario</th>
|
|
|
201 |
<th style={{ width: '20%' }}>Evaluación</th>
|
|
|
202 |
</tr>
|
|
|
203 |
</thead>
|
|
|
204 |
<tbody>
|
|
|
205 |
<tr>
|
|
|
206 |
<td style={{ width: '20%' }}>{behavior.description}</td>
|
|
|
207 |
<td style={{ width: '60%' }}>
|
|
|
208 |
<textarea
|
|
|
209 |
name="behavior-comment"
|
|
|
210 |
cols="30"
|
|
|
211 |
rows="3"
|
|
|
212 |
onChange={(e) => setCompetencies([...competencies, competencies[competency_index].behaviors[index].name = e.target.value])}
|
|
|
213 |
/>
|
|
|
214 |
</td>
|
|
|
215 |
<td style={{ width: '20%' }}>
|
|
|
216 |
<select className='form-control' name='behavior-points' >
|
|
|
217 |
{
|
|
|
218 |
pointsOptions.map(({ label, value }) => (
|
|
|
219 |
<option selected={behavior.points === value} key={value} value={value}>{label}</option>
|
|
|
220 |
))
|
|
|
221 |
}
|
|
|
222 |
</select>
|
|
|
223 |
</td>
|
|
|
224 |
</tr>
|
|
|
225 |
</tbody>
|
|
|
226 |
</table>
|
10532 |
stevensc |
227 |
))
|
10558 |
stevensc |
228 |
}
|
|
|
229 |
</div>
|
|
|
230 |
</div>
|
10540 |
stevensc |
231 |
))
|
10558 |
stevensc |
232 |
}
|
|
|
233 |
</div>
|
|
|
234 |
<div className="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab">
|
|
|
235 |
<div className="form-group">
|
|
|
236 |
<label>Comentario</label>
|
|
|
237 |
<input type="text" name="comment" className="form-control" ref={register} />
|
|
|
238 |
</div>
|
|
|
239 |
<div className="form-group">
|
|
|
240 |
<label>Evaluación</label>
|
|
|
241 |
<select className='form-control' name='points' ref={register}>
|
|
|
242 |
{
|
|
|
243 |
pointsOptions.map(({ label, value }) => (
|
|
|
244 |
<option selected={watch('points') === value} key={value} value={value}>{label}</option>
|
|
|
245 |
))
|
|
|
246 |
}
|
|
|
247 |
</select>
|
|
|
248 |
</div>
|
|
|
249 |
<div className="form-group">
|
|
|
250 |
<label>Estatus</label>
|
|
|
251 |
<select className='form-control' name='status' ref={register}>
|
|
|
252 |
{
|
|
|
253 |
statusOptions.map(({ label, value }) => (
|
|
|
254 |
<option selected={watch('status') === value} key={value} value={value}>{label}</option>
|
|
|
255 |
))
|
|
|
256 |
}
|
|
|
257 |
</select>
|
|
|
258 |
</div>
|
|
|
259 |
</div>
|
|
|
260 |
</div>
|
|
|
261 |
<div className="form-group">
|
|
|
262 |
<button type="submit" className="btn btn-primary btn-form-save-close mr-2">
|
10439 |
stevensc |
263 |
Guardar
|
10558 |
stevensc |
264 |
</button>
|
|
|
265 |
<button
|
|
|
266 |
type="button"
|
|
|
267 |
className="btn btn-secondary btn-edit-cancel"
|
|
|
268 |
onClick={() => history.goBack()}
|
|
|
269 |
>
|
10439 |
stevensc |
270 |
Cancelar
|
10558 |
stevensc |
271 |
</button>
|
|
|
272 |
</div>
|
|
|
273 |
</div>
|
|
|
274 |
</div>
|
|
|
275 |
</div>
|
|
|
276 |
</div>
|
|
|
277 |
</div>
|
|
|
278 |
</section >
|
|
|
279 |
)
|
10436 |
stevensc |
280 |
}
|
|
|
281 |
export default FormView
|