Proyectos de Subversion LeadersLinked - Backend

Rev

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