Proyectos de Subversion LeadersLinked - Backend

Rev

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