Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
11546 stevensc 1
import React, { useState, useEffect } from 'react'
2
import { Button, Modal } from 'react-bootstrap'
3
import axios from 'axios'
11659 stevensc 4
import Datetime from 'react-datetime'
11546 stevensc 5
import { useForm } from 'react-hook-form'
6
import { useDispatch } from 'react-redux'
7
import { addNotification } from '../../../redux/notification/notification.actions'
11659 stevensc 8
import 'react-datetime/css/react-datetime.css'
11546 stevensc 9
 
10
const EditAndAddModal = ({ action_link, closeModal, type, onComplete }) => {
11
 
12
	//Hooks
11683 stevensc 13
	const { register, handleSubmit, errors, setValue, clearErrors, watch, reset } = useForm()
11546 stevensc 14
	const [isActive, setIsActive] = useState(false)
11659 stevensc 15
	const [usersSelected, setUsersSelected] = useState([])
16
	const [allUsers, setAllUsers] = useState([])
11677 stevensc 17
	const [year, setYear] = useState(new Intl.DateTimeFormat('en-CA').format(new Date()))
11546 stevensc 18
	const dispatch = useDispatch()
19
 
11659 stevensc 20
	const deleteUserSelected = (uuid) => {
21
		const newUsersSelected = usersSelected.filter((user) => user.uuid !== uuid)
22
		setUsersSelected(newUsersSelected)
23
	}
24
 
25
	const addUser = () => {
11677 stevensc 26
		const newUser = allUsers.find(userOption => userOption.uuid === watch('user'))
27
		setUsersSelected(prev => [...prev, { uuid: newUser.uuid }])
11659 stevensc 28
	}
29
 
11683 stevensc 30
	const onClose = () => {
31
		reset()
32
		closeModal()
33
	}
34
 
11546 stevensc 35
	const onSubmit = (data) => {
36
		const submitData = new FormData()
37
 
11659 stevensc 38
		submitData.append('status', isActive ? 'a' : 'i')
39
		submitData.append('date', year)
40
		usersSelected.map((user) => submitData.append('who[]', user.uuid))
41
		Object.entries(data).map(([key, value]) => {
11546 stevensc 42
			submitData.append(key, value)
43
		})
44
 
45
		axios.post(action_link, submitData)
46
			.then(({ data }) => {
47
				if (!data.success) {
48
					return dispatch(addNotification({
49
						style: 'danger',
50
						msg: 'Ha ocurrido un error'
51
					}))
52
				}
53
 
54
				clearErrors()
55
				closeModal()
11683 stevensc 56
				reset()
11546 stevensc 57
				onComplete()
58
				dispatch(addNotification({
59
					style: 'success',
11683 stevensc 60
					msg: 'Registro guardadof'
11546 stevensc 61
				}))
62
			})
63
	}
64
 
65
	useEffect(() => {
66
		if (type === 'edit') {
67
			axios.get(action_link)
11672 stevensc 68
				.then(({ data }) => {
11546 stevensc 69
					if (!data.success) {
70
						return dispatch(addNotification({
71
							style: 'danger',
72
							msg: 'Ha ocurrido un error'
73
						}))
74
					}
75
 
11672 stevensc 76
					setAllUsers(data.all_users)
11659 stevensc 77
					setValue('title', data.data.title)
78
					setValue('description', data.data.description)
79
					setValue('how', data.data.how)
80
					setValue('place', data.data.place)
81
					setValue('date', data.data.date)
82
					setValue('cost', data.data.time)
83
					setValue('priority', data.data.time)
84
					setValue('urgent', data.data.time)
85
					setValue('indicator', data.data.indicator)
86
					setIsActive(data.data.status === 'a' ? true : false)
11676 stevensc 87
					setUsersSelected(data.users)
11546 stevensc 88
				})
89
		}
90
	}, [type])
91
 
11659 stevensc 92
	useEffect(() => {
93
		if (type === 'add') {
94
			axios.get(action_link)
95
				.then(({ data }) => {
96
					if (!data.success) {
97
						return dispatch(addNotification({
98
							style: 'danger',
99
							msg: 'Ha ocurrido un error'
100
						}))
101
					}
102
 
103
					setAllUsers(data.data)
104
				})
105
		}
106
	}, [type])
107
 
11546 stevensc 108
	return (
11683 stevensc 109
		<Modal size="md" onHide={onClose} show={type === 'add' || type === ('edit')}>
11546 stevensc 110
			<Modal.Header closeButton>
111
				<Modal.Title>
112
					{
113
						type === 'add'
11659 stevensc 114
							? 'Agregar Tarea'
115
							: 'Editar Tarea'
11546 stevensc 116
					}
117
				</Modal.Title>
118
			</Modal.Header>
119
			<form onSubmit={handleSubmit(onSubmit)}>
120
				<Modal.Body>
11662 stevensc 121
					<div className='form-group'>
122
						<label className="form-label">Título</label>
123
						<input type="text" name='title' className='form-control' ref={register({ required: true })} />
124
						{errors.title && <p>{errors.title.message}</p>}
125
					</div>
126
					<div className='form-group'>
127
						<label className="form-label">Descripción de la tarea</label>
128
						<input type="text" name='description' className='form-control' ref={register({ required: true })} />
129
						{errors.description && <p>{errors.description.message}</p>}
130
					</div>
131
					<div className='form-group'>
132
						<label className="form-label">Como se implementara</label>
133
						<input type="text" name='how' className='form-control' ref={register({ required: true })} />
134
						{errors.how && <p>{errors.how.message}</p>}
135
					</div>
136
					<div className="w-100">
11683 stevensc 137
						<table className='table'>
11662 stevensc 138
							<thead>
139
								<tr>
140
									<th>Usuario</th>
141
									<th>Acciones</th>
142
								</tr>
143
							</thead>
144
							<tbody>
11676 stevensc 145
								{
146
									usersSelected.map((user) => {
147
										const renderUser = allUsers.find(userOption => userOption.uuid === user.uuid)
148
 
149
										return (
150
											<tr key={renderUser.uuid}>
151
												<td>{`${renderUser.first_name} ${renderUser.last_name}`}</td>
152
												<td>
153
													<div className="d-flex">
154
														<button className='btn btn-danger' onClick={() => deleteUserSelected(renderUser.uuid)}>
155
															Eliminar
156
														</button>
157
													</div>
158
												</td>
159
											</tr>
160
										)
161
									})
162
								}
11662 stevensc 163
							</tbody>
164
						</table>
165
					</div>
11665 stevensc 166
					<div className="d-flex align-items-center">
11662 stevensc 167
						<select name='user' ref={register} className='form-control'>
168
							<option value=''>Seleccione</option>
169
							{
170
								allUsers.map((user) => (
171
									<option key={user.uuid} value={user.uuid}>{`${user.first_name} ${user.last_name}`}</option>
172
								))
173
							}
174
						</select>
11665 stevensc 175
						<button className='d-flex align-items-center btn btn-primary ml-2' onClick={addUser}>
11662 stevensc 176
							<i className='fa fa-plus' />
177
							Agregar
178
						</button>
179
					</div>
11665 stevensc 180
					<div className="d-flex align-items-centers" style={{ gap: '5px' }}>
11546 stevensc 181
						<div className='form-group'>
11662 stevensc 182
							<label className="form-label">Donde se realizara:</label>
183
							<input type="text" name='place' className='form-control' ref={register({ required: true })} />
184
							{errors.place && <p>{errors.place.message}</p>}
11546 stevensc 185
						</div>
186
						<div className='form-group'>
11662 stevensc 187
							<label className="form-label">Fecha:</label>
188
							<Datetime
189
								dateFormat="DD-MM-YYYY"
190
								timeFormat={false}
191
								onChange={(e) =>
192
									setYear(new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: 'numeric', day: 'numeric' }).format(e.toDate()))
193
								}
194
								inputProps={{ className: 'form-control' }}
195
								initialValue={Date.parse(year)}
196
								closeOnSelect
197
								value={year}
198
							/>
11659 stevensc 199
						</div>
200
						<div className='form-group'>
11662 stevensc 201
							<label className="form-label">Horas:</label>
11683 stevensc 202
							<input type="number" name='time' className='form-control' ref={register} defaultValue='1' />
11662 stevensc 203
							{errors.time && <p>{errors.time.message}</p>}
11659 stevensc 204
						</div>
205
					</div>
11665 stevensc 206
					<div className="d-flex align-items-centers" style={{ gap: '5px' }}>
11659 stevensc 207
						<div className='form-group'>
208
							<label className="form-label">Costo:</label>
11683 stevensc 209
							<input type="number" name='cost' className='form-control' defaultValue='1' ref={register} />
11659 stevensc 210
						</div>
211
						<div className='form-group'>
212
							<label className="form-label">Prioridad:</label>
213
							<select name="priority" ref={register({ required: true })}>
11677 stevensc 214
								<option selected={watch('priority') === ''} value="">Seleccione</option>
215
								<option selected={watch('priority') === 'i'} value="i">Importante</option>
216
								<option selected={watch('priority') === 'ni'} value="ni">No importante</option>
11659 stevensc 217
							</select>
218
						</div>
219
						<div className='form-group'>
220
							<label className="form-label">Urgencia:</label>
221
							<select name="urgent" ref={register({ required: true })}>
11677 stevensc 222
								<option selected={watch('urgent') === ''} value="">Seleccione</option>
11683 stevensc 223
								<option selected={watch('urgent') === 'u'} value="u">Urgente</option>
224
								<option selected={watch('urgent') === 'nu'} value="nu">No urgente</option>
11659 stevensc 225
							</select>
226
						</div>
227
					</div>
228
					<div className="form-row">
229
						<div className="col-md-9 mb-3">
230
							<label>Indicador de progreso:</label>
231
							<div className="d-flex justify-content-between align-items-center">
232
								<input type="range" name="indicator" min='1' max='100' className="form-control" ref={register} />
233
								<span className="ml-2" id="spanIndicator">{watch('indicator')}</span>
234
							</div>
235
						</div>
236
						<div className="col-md-3 mb-3 text-center">
237
							<label htmlFor="status">Estatus:</label>
11546 stevensc 238
							<div
239
								className={`toggle d-block btn btn-primary ${!isActive && 'off'}`}
240
								data-toggle="toggle"
241
								role="button"
242
								style={{ width: '130px' }}
243
								onClick={() => setIsActive(!isActive)}
244
							>
245
								<input
246
									type="checkbox"
247
									checked={isActive}
248
								/>
249
								<div className="toggle-group">
250
									<label htmlFor="status" className="btn btn-primary toggle-on">Activo</label>
251
									<label htmlFor="status" className="btn btn-light toggle-off">Inactivo</label>
252
									<span className="toggle-handle btn btn-light"></span>
253
								</div>
254
							</div>
255
						</div>
256
					</div>
257
				</Modal.Body>
258
				<Modal.Footer>
259
					<Button variant="primary" type='submit'>
260
						Enviar
261
					</Button>
262
					<Button variant="danger" onClick={closeModal}>
263
						Cancelar
264
					</Button>
265
				</Modal.Footer>
266
			</form>
267
		</Modal >
268
	)
269
}
270
 
271
export default EditAndAddModal