Proyectos de Subversion LeadersLinked - Backend

Rev

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