Proyectos de Subversion LeadersLinked - Backend

Rev

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