Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11673 | Rev 11676 | 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)
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)
11669 stevensc 81
 
11672 stevensc 82
					return data.users
11546 stevensc 83
				})
11673 stevensc 84
				.then(users => users.forEach((userId) => {
85
					const user = allUsers.find(userToAdd => userToAdd.uuid === userId.uuid)
11674 stevensc 86
					console.log(allUsers)
87
					console.log(userId)
88
 
11673 stevensc 89
					setUsersSelected(prev => [...prev, user])
90
				}))
11546 stevensc 91
		}
92
	}, [type])
93
 
11659 stevensc 94
	useEffect(() => {
95
		if (type === 'add') {
96
			axios.get(action_link)
97
				.then(({ data }) => {
98
					if (!data.success) {
99
						return dispatch(addNotification({
100
							style: 'danger',
101
							msg: 'Ha ocurrido un error'
102
						}))
103
					}
104
 
105
					setAllUsers(data.data)
106
				})
107
		}
108
	}, [type])
109
 
11546 stevensc 110
	return (
111
		<Modal size="md" onHide={closeModal} show={type === 'add' || type === ('edit')}>
112
			<Modal.Header closeButton>
113
				<Modal.Title>
114
					{
115
						type === 'add'
11659 stevensc 116
							? 'Agregar Tarea'
117
							: 'Editar Tarea'
11546 stevensc 118
					}
119
				</Modal.Title>
120
			</Modal.Header>
121
			<form onSubmit={handleSubmit(onSubmit)}>
122
				<Modal.Body>
11662 stevensc 123
					<div className='form-group'>
124
						<label className="form-label">Título</label>
125
						<input type="text" name='title' className='form-control' ref={register({ required: true })} />
126
						{errors.title && <p>{errors.title.message}</p>}
127
					</div>
128
					<div className='form-group'>
129
						<label className="form-label">Descripción de la tarea</label>
130
						<input type="text" name='description' className='form-control' ref={register({ required: true })} />
131
						{errors.description && <p>{errors.description.message}</p>}
132
					</div>
133
					<div className='form-group'>
134
						<label className="form-label">Como se implementara</label>
135
						<input type="text" name='how' className='form-control' ref={register({ required: true })} />
136
						{errors.how && <p>{errors.how.message}</p>}
137
					</div>
138
					<div className="w-100">
139
						<table>
140
							<thead>
141
								<tr>
142
									<th>Usuario</th>
143
									<th>Acciones</th>
144
								</tr>
145
							</thead>
146
							<tbody>
11669 stevensc 147
								{/* {
148
									usersSelected.length
149
									&&
11662 stevensc 150
									usersSelected.map((user) => (
151
										<tr key={user.uuid}>
152
											<td>{`${user.first_name} ${user.last_name}`}</td>
153
											<td>
154
												<div className="d-flex">
155
													<button className='btn btn-danger' onClick={() => deleteUserSelected(user.uuid)}>
156
														Eliminar
157
													</button>
158
												</div>
159
											</td>
160
										</tr>
161
									))
11669 stevensc 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>
202
							<input type="number" name='time' className='form-control' ref={register} />
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>
209
							<input type="number" name='cost' className='form-control' ref={register} />
210
						</div>
211
						<div className='form-group'>
212
							<label className="form-label">Prioridad:</label>
213
							<select name="priority" ref={register({ required: true })}>
214
								<option value="">Seleccione</option>
215
								<option value="i">Importante</option>
216
								<option value="ni">No importante</option>
217
							</select>
218
						</div>
219
						<div className='form-group'>
220
							<label className="form-label">Urgencia:</label>
221
							<select name="urgent" ref={register({ required: true })}>
222
								<option value="">Seleccione</option>
223
								<option value="u">Importante</option>
224
								<option value="nu">No importante</option>
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