Proyectos de Subversion LeadersLinked - Backend

Rev

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