Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 14254 | Rev 14256 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
14197 stevensc 1
/* eslint-disable no-mixed-spaces-and-tabs */
2
import axios from 'axios'
14231 stevensc 3
import { CKEditor } from 'ckeditor4-react'
14197 stevensc 4
import React, { useEffect, useState } from 'react'
14237 stevensc 5
import { useRef } from 'react'
14197 stevensc 6
import { useForm } from 'react-hook-form'
7
import { useDispatch } from 'react-redux'
8
import { useHistory, useParams } from 'react-router-dom'
9
import { addNotification } from '../../redux/notification/notification.actions'
14231 stevensc 10
import { config } from '../../shared/helpers/ckeditor_config'
14230 stevensc 11
import ToggleComponent from '../../shared/ToggleComponent'
14197 stevensc 12
 
14255 stevensc 13
const CONDUCTS_OPTIONS = {
14
	0: 'No aplica',
15
	1: 'Uno',
16
	2: 'Dos',
17
	3: 'Tres',
18
	4: 'Cuatro'
19
}
20
 
14197 stevensc 21
const FormView = ({
22
	actionLink = '',
23
	setActionLink = function () { }
24
}) => {
25
 
26
	// Hooks
27
	const dispatch = useDispatch()
28
	const history = useHistory()
14237 stevensc 29
	const selectInput = useRef(null)
14246 stevensc 30
	const selectInput2 = useRef(null)
14197 stevensc 31
	const { action } = useParams()
14234 stevensc 32
	const {
33
		setValue,
34
		register,
14236 stevensc 35
		handleSubmit
14234 stevensc 36
	} = useForm()
14197 stevensc 37
 
38
	//States
14205 stevensc 39
	const [supervisers, setSupervisers] = useState([])
14234 stevensc 40
	const [initObjectives, setInitObjectives] = useState('')
41
	const [initFunctions, setInitFunctions] = useState('')
14237 stevensc 42
	const [competencyOptions, setCompetencyOptions] = useState([])
43
	const [competenciesSelected, setCompetenciesSelected] = useState([])
44
	const [competencyTypeOptions, setCompetencyTypeOptions] = useState([])
14246 stevensc 45
	const [jobsDescription, setJobsDescription] = useState([])
46
	const [subordinatesSelected, setSubordinatesSelected] = useState([])
14197 stevensc 47
 
14251 stevensc 48
	const onSubmit = (data) => {
14197 stevensc 49
 
14206 stevensc 50
		const submitData = new FormData()
14252 stevensc 51
		submitData.append('subordinates_selected', JSON.stringify(subordinatesSelected))
52
		submitData.append('competencies_selected', JSON.stringify(competenciesSelected))
14251 stevensc 53
		submitData.append('name', data.name)
54
		submitData.append('job_description_id_boss', data.job_description_id_boss)
55
		submitData.append('status', data.status ? 'a' : 'i')
56
		submitData.append('objectives', data.objectives)
57
		submitData.append('functions', data.functions)
14197 stevensc 58
 
59
		axios.post(actionLink, submitData)
60
			.then(({ data }) => {
61
				if (!data.success) {
62
					return dispatch(addNotification({
63
						style: 'danger',
64
						msg: typeof data.data === 'string'
65
							? data.data
66
							: 'Ha ocurrido un error'
67
					}))
68
				}
69
 
70
				history.goBack()
71
				setActionLink('')
72
				dispatch(addNotification({
73
					style: 'success',
74
					msg: `Registro ${action === 'edit' ? 'actualizado' : 'añadido'}`
75
				}))
76
			})
77
	}
78
 
14246 stevensc 79
	const addCompetencies = () => {
14237 stevensc 80
		const current_competency = competencyOptions.find(competency => competency.competency_id === selectInput.current.value)
14246 stevensc 81
		const filterCompetencies = new Set([current_competency, ...competenciesSelected])
82
		setCompetenciesSelected([...filterCompetencies])
14237 stevensc 83
	}
84
 
14246 stevensc 85
	const addSubordinates = () => {
86
		const current_subordinate = jobsDescription.find(subordinate => subordinate.job_description_id === selectInput2.current.value)
87
		const filterSubordinate = new Set([current_subordinate, ...subordinatesSelected])
14248 stevensc 88
		console.log(filterSubordinate)
89
		setSubordinatesSelected([...filterSubordinate])
14246 stevensc 90
	}
91
 
14241 stevensc 92
	const deleteCompetency = (id) => {
14251 stevensc 93
		setCompetenciesSelected(prev => prev.filter(competency => competency.competency_id !== id))
14241 stevensc 94
	}
95
 
14246 stevensc 96
	const deleteSubordinate = (id) => {
14251 stevensc 97
		setSubordinatesSelected(prev => prev.filter(subordinate => subordinate.job_description_id !== id))
14246 stevensc 98
	}
99
 
14197 stevensc 100
	useEffect(() => {
14230 stevensc 101
		register('status')
14231 stevensc 102
		register('objectives')
103
		register('functions')
14230 stevensc 104
	}, [])
105
 
106
	useEffect(() => {
14197 stevensc 107
		axios.get(actionLink)
108
			.then(({ data }) => {
109
				if (!data.success) {
110
					return dispatch(addNotification({
111
						style: 'danger',
112
						msg: 'Ha ocurrido un error'
113
					}))
114
				}
115
 
14246 stevensc 116
				setSupervisers(data.data['supervisers'].map(option => ({ key: option.name, value: option.uuid })))
14247 stevensc 117
				setJobsDescription(data.data['jobs_description'])
14246 stevensc 118
 
14234 stevensc 119
				setInitObjectives(data.data['objectives'])
120
				setInitFunctions(data.data['functions'])
14246 stevensc 121
 
14237 stevensc 122
				setCompetencyOptions(data.data['competencies'])
123
				setCompetencyTypeOptions(data.data['competency_types'])
14246 stevensc 124
 
14237 stevensc 125
				setCompetenciesSelected(data.data['competencies_selected'])
14246 stevensc 126
				setSubordinatesSelected(data.data['subordinates_selected'])
14234 stevensc 127
 
14205 stevensc 128
				setValue('name', data.data['name'])
14231 stevensc 129
				setValue('status', data.data['status'])
14205 stevensc 130
				setValue('job_description_id_boss', data.data['job_description_id_boss'])
14197 stevensc 131
 
132
			})
133
	}, [action])
134
 
14254 stevensc 135
	useEffect(() => {
136
		if (action === 'add') {
137
			setInitFunctions(' ')
138
			setInitObjectives(' ')
139
		}
140
	}, [action])
141
 
14197 stevensc 142
	return (
143
		<section className="content">
144
			<div className="container-fluid">
145
				<div className="row">
146
					<div className="col-12">
147
						<form onSubmit={handleSubmit(onSubmit)}>
14232 stevensc 148
							<div className='card'>
14197 stevensc 149
								<div className="card-header">
150
									<ul className="nav nav-tabs" id="myTab" role="tablist">
151
										<li className="nav-item" role="presentation">
14252 stevensc 152
											<button
153
												className="nav-link active"
154
												id="home-tab"
155
												data-toggle="tab"
156
												data-target="#home"
157
												type="button"
158
												role="tab"
159
												aria-controls="home"
160
												aria-selected="true"
161
											>
162
												General
163
											</button>
14197 stevensc 164
										</li>
165
										<li className="nav-item" role="presentation">
14252 stevensc 166
											<button
167
												className="nav-link"
168
												id="profile-tab"
169
												data-toggle="tab"
170
												data-target="#profile"
171
												type="button"
172
												role="tab"
173
												aria-controls="profile"
174
												aria-selected="false"
175
											>
176
												Competencias
177
											</button>
14197 stevensc 178
										</li>
179
										<li className="nav-item" role="presentation">
14252 stevensc 180
											<button
181
												className="nav-link"
182
												id="contact-tab"
183
												data-toggle="tab"
184
												data-target="#contact"
185
												type="button"
186
												role="tab"
187
												aria-controls="contact"
188
												aria-selected="false"
189
											>
190
												Dependientes
191
											</button>
14197 stevensc 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">
14237 stevensc 198
											<div className="card p-2">
14232 stevensc 199
												<div className="d-flex">
14205 stevensc 200
													<div className="col-4">
201
														<div className="form-group">
202
															<label>Nombre</label>
14228 stevensc 203
															<input className='form-control' type="text" name='name' ref={register} />
14197 stevensc 204
														</div>
14205 stevensc 205
													</div>
206
													<div className="col-4">
207
														<div className="form-group">
208
															<label>Nombre</label>
14206 stevensc 209
															<select className='form-control' name="job_description_id_boss" ref={register}>
14205 stevensc 210
																<option value="">No aplica</option>
14197 stevensc 211
																{
14207 stevensc 212
																	supervisers.map(({ key, value }) =>
14205 stevensc 213
																		<option key={value} value={value}>{key}</option>
214
																	)
14197 stevensc 215
																}
14205 stevensc 216
															</select>
14197 stevensc 217
														</div>
218
													</div>
14228 stevensc 219
													<div className="col-4">
220
														<div className="form-group">
14231 stevensc 221
															<label>Estatus</label>
14230 stevensc 222
															<ToggleComponent
223
																setValue={(e) => setValue('status', e)}
224
															/>
14228 stevensc 225
														</div>
226
													</div>
14205 stevensc 227
												</div>
14232 stevensc 228
												<div className="d-flex">
229
													<div className="form-group w-100">
14231 stevensc 230
														<label>Objetivo</label>
14237 stevensc 231
														{
14254 stevensc 232
															(initObjectives)
14237 stevensc 233
															&&
234
															<CKEditor
235
																onChange={(e) => setValue('objectives', e.editor.getData())}
14238 stevensc 236
																onInstanceReady={(e) => e.editor.setData(initObjectives)}
14237 stevensc 237
																config={config}
238
																name="objectives"
239
															/>
240
														}
14231 stevensc 241
													</div>
242
												</div>
14232 stevensc 243
												<div className="d-flex">
244
													<div className="form-group w-100">
14231 stevensc 245
														<label>Funciones</label>
14237 stevensc 246
														{
247
															initFunctions
248
															&&
249
															<CKEditor
250
																onChange={(e) => setValue('functions', e.editor.getData())}
14240 stevensc 251
																onInstanceReady={(e) => e.editor.setData(initFunctions)}
14237 stevensc 252
																config={config}
253
																name="functions"
254
															/>
255
														}
14231 stevensc 256
													</div>
257
												</div>
14205 stevensc 258
											</div>
14197 stevensc 259
										</div>
14205 stevensc 260
										<div className="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
14237 stevensc 261
											<div className="card p-2">
262
												<div className="d-flex justify-content-around">
14238 stevensc 263
													<div className="col-9">
14251 stevensc 264
														<select className='form-control' ref={selectInput}>
14238 stevensc 265
															<option value="">Seleccione</option>
266
															{
267
																competencyOptions.map((competency) => {
268
																	const competency_type = competencyTypeOptions.find(type => type.competency_type_id === competency.competency_type_id)
14206 stevensc 269
 
14238 stevensc 270
																	return (
271
																		<option
272
																			key={competency.competency_id}
273
																			value={competency.competency_id}>
14239 stevensc 274
																			{`${competency_type?.name} - ${competency.name}`}
14238 stevensc 275
																		</option>
276
																	)
277
																})
278
															}
279
														</select>
280
													</div>
281
													<div className='col-3'>
282
														<button
14240 stevensc 283
															type='button'
14238 stevensc 284
															className='btn btn-primary'
14246 stevensc 285
															onClick={addCompetencies}
14238 stevensc 286
														>
287
															Agregar Competencia
288
														</button>
289
													</div>
14237 stevensc 290
												</div>
14241 stevensc 291
												{
292
													competenciesSelected.map(competency_selected => {
293
														const competency_type = competencyTypeOptions.find(type => type.competency_type_id === competency_selected.competency_type_id)
294
 
295
														return (
296
															<div key={competency_selected.competency_type_id}>
14244 stevensc 297
																<h3 className='my-2'>{`${competency_type.name} - ${competency_selected.name}`}</h3>
14242 stevensc 298
																<table className='table table-bordered'>
14241 stevensc 299
																	<thead>
300
																		<tr>
301
																			<th>Elemento</th>
302
																			<th>Título</th>
303
																			<th>Nivel</th>
304
																			<th>Acciones</th>
305
																		</tr>
306
																	</thead>
307
																	<tbody>
308
																		<tr>
309
																			<td>Competencia</td>
310
																			<td>{competency_selected.name}</td>
311
																			<td></td>
312
																			<td>
313
																				<button
314
																					type='button'
315
																					className='btn btn-primary'
14242 stevensc 316
																					onClick={() => deleteCompetency(competency_selected.competency_id)}
14241 stevensc 317
																				>
14245 stevensc 318
																					<i className='fa fa-ban mr-1' />
14241 stevensc 319
																					Borrar Competencia
320
																				</button>
321
																			</td>
322
																		</tr>
14243 stevensc 323
																		{
324
																			competency_selected.behaviors?.map(behavior => (
325
																				<tr key={behavior.behavior_id}>
14244 stevensc 326
																					<td>- Conducta Observable</td>
14243 stevensc 327
																					<td>{behavior.description}</td>
14255 stevensc 328
																					<td>{CONDUCTS_OPTIONS[behavior.level]}</td>
14243 stevensc 329
																					<td>
330
																						<button
331
																							type='button'
332
																							className='btn btn-primary'
14246 stevensc 333
																							onClick={() => deleteSubordinate(competency_selected.competency_id)}
14243 stevensc 334
																						>
14245 stevensc 335
																							<i className='fa fa-edit mr-1' />
14243 stevensc 336
																							Editar Perfil
337
																						</button>
338
																					</td>
339
																				</tr>
340
																			))
341
																		}
14241 stevensc 342
																	</tbody>
343
																</table>
344
															</div>
345
														)
346
													})
347
												}
14237 stevensc 348
											</div>
14205 stevensc 349
										</div>
14197 stevensc 350
										<div className="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab">
14245 stevensc 351
											<div className="card p-2">
352
												<div className="d-flex justify-content-around">
353
													<div className="col-9">
14251 stevensc 354
														<select className='form-control' ref={selectInput2}>
14245 stevensc 355
															<option value="">Seleccione</option>
356
															{
14247 stevensc 357
																jobsDescription.map((subordinate) =>
358
																	<option
359
																		key={subordinate.job_description_id}
360
																		value={subordinate.job_description_id}
361
																	>
362
																		{subordinate.name}
363
																	</option>
14246 stevensc 364
																)
14245 stevensc 365
															}
366
														</select>
367
													</div>
368
													<div className='col-3'>
369
														<button
370
															type='button'
371
															className='btn btn-primary'
14246 stevensc 372
															onClick={addSubordinates}
14245 stevensc 373
														>
14246 stevensc 374
															Agregar
14245 stevensc 375
														</button>
376
													</div>
377
												</div>
14250 stevensc 378
												<div className="d-block p-2">
379
													<table className='table table-bordered'>
380
														<thead>
381
															<tr>
382
																<th>Nombre</th>
383
																<th>Acciones</th>
384
															</tr>
385
														</thead>
386
														<tbody>
387
															{
388
																subordinatesSelected.map(subordinate =>
389
																	<tr key={subordinate.job_description_id}>
390
																		<td>{subordinate.name}</td>
391
																		<td>
392
																			<button
393
																				type='button'
394
																				className='btn btn-primary'
395
																				onClick={() => deleteSubordinate(subordinate.job_description_id)}
396
																			>
397
																				<i className='fa fa-ban mr-1' />
398
																				Borrar
399
																			</button>
400
																		</td>
401
																	</tr>
402
																)
403
															}
404
														</tbody>
405
													</table>
406
												</div>
14245 stevensc 407
											</div>
14197 stevensc 408
										</div>
409
									</div>
410
									<div className="form-group">
411
										<button type="submit" className="btn btn-primary btn-form-save-close mr-2">
412
											Guardar & Cerrar
413
										</button>
414
										<button
415
											type="button"
416
											className="btn btn-secondary btn-edit-cancel"
417
											onClick={() => history.goBack()}
418
										>
419
											Cancelar
420
										</button>
421
									</div>
422
								</div>
423
							</div>
424
						</form>
425
					</div>
426
				</div>
14241 stevensc 427
			</div >
14197 stevensc 428
		</section >
429
	)
430
}
431
 
432
export default FormView