Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11670 | Rev 11672 | 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)
11671 stevensc 83
						console.log(userId)
84
						console.log(allUsers)
11669 stevensc 85
 
86
						setUsersSelected(prev => [...prev, user])
87
					})
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 (
109
		<Modal size="md" onHide={closeModal} show={type === 'add' || type === ('edit')}>
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">
137
						<table>
138
							<thead>
139
								<tr>
140
									<th>Usuario</th>
141
									<th>Acciones</th>
142
								</tr>
143
							</thead>
144
							<tbody>
11669 stevensc 145
								{/* {
146
									usersSelected.length
147
									&&
11662 stevensc 148
									usersSelected.map((user) => (
149
										<tr key={user.uuid}>
150
											<td>{`${user.first_name} ${user.last_name}`}</td>
151
											<td>
152
												<div className="d-flex">
153
													<button className='btn btn-danger' onClick={() => deleteUserSelected(user.uuid)}>
154
														Eliminar
155
													</button>
156
												</div>
157
											</td>
158
										</tr>
159
									))
11669 stevensc 160
								} */}
11662 stevensc 161
							</tbody>
162
						</table>
163
					</div>
11665 stevensc 164
					<div className="d-flex align-items-center">
11662 stevensc 165
						<select name='user' ref={register} className='form-control'>
166
							<option value=''>Seleccione</option>
167
							{
168
								allUsers.map((user) => (
169
									<option key={user.uuid} value={user.uuid}>{`${user.first_name} ${user.last_name}`}</option>
170
								))
171
							}
172
						</select>
11665 stevensc 173
						<button className='d-flex align-items-center btn btn-primary ml-2' onClick={addUser}>
11662 stevensc 174
							<i className='fa fa-plus' />
175
							Agregar
176
						</button>
177
					</div>
11665 stevensc 178
					<div className="d-flex align-items-centers" style={{ gap: '5px' }}>
11546 stevensc 179
						<div className='form-group'>
11662 stevensc 180
							<label className="form-label">Donde se realizara:</label>
181
							<input type="text" name='place' className='form-control' ref={register({ required: true })} />
182
							{errors.place && <p>{errors.place.message}</p>}
11546 stevensc 183
						</div>
184
						<div className='form-group'>
11662 stevensc 185
							<label className="form-label">Fecha:</label>
186
							<Datetime
187
								dateFormat="DD-MM-YYYY"
188
								timeFormat={false}
189
								onChange={(e) =>
190
									setYear(new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: 'numeric', day: 'numeric' }).format(e.toDate()))
191
								}
192
								inputProps={{ className: 'form-control' }}
193
								initialValue={Date.parse(year)}
194
								closeOnSelect
195
								value={year}
196
							/>
11659 stevensc 197
						</div>
198
						<div className='form-group'>
11662 stevensc 199
							<label className="form-label">Horas:</label>
200
							<input type="number" name='time' className='form-control' ref={register} />
201
							{errors.time && <p>{errors.time.message}</p>}
11659 stevensc 202
						</div>
203
					</div>
11665 stevensc 204
					<div className="d-flex align-items-centers" style={{ gap: '5px' }}>
11659 stevensc 205
						<div className='form-group'>
206
							<label className="form-label">Costo:</label>
207
							<input type="number" name='cost' className='form-control' ref={register} />
208
						</div>
209
						<div className='form-group'>
210
							<label className="form-label">Prioridad:</label>
211
							<select name="priority" ref={register({ required: true })}>
212
								<option value="">Seleccione</option>
213
								<option value="i">Importante</option>
214
								<option value="ni">No importante</option>
215
							</select>
216
						</div>
217
						<div className='form-group'>
218
							<label className="form-label">Urgencia:</label>
219
							<select name="urgent" ref={register({ required: true })}>
220
								<option value="">Seleccione</option>
221
								<option value="u">Importante</option>
222
								<option value="nu">No importante</option>
223
							</select>
224
						</div>
225
					</div>
226
					<div className="form-row">
227
						<div className="col-md-9 mb-3">
228
							<label>Indicador de progreso:</label>
229
							<div className="d-flex justify-content-between align-items-center">
230
								<input type="range" name="indicator" min='1' max='100' className="form-control" ref={register} />
231
								<span className="ml-2" id="spanIndicator">{watch('indicator')}</span>
232
							</div>
233
						</div>
234
						<div className="col-md-3 mb-3 text-center">
235
							<label htmlFor="status">Estatus:</label>
11546 stevensc 236
							<div
237
								className={`toggle d-block btn btn-primary ${!isActive && 'off'}`}
238
								data-toggle="toggle"
239
								role="button"
240
								style={{ width: '130px' }}
241
								onClick={() => setIsActive(!isActive)}
242
							>
243
								<input
244
									type="checkbox"
245
									checked={isActive}
246
								/>
247
								<div className="toggle-group">
248
									<label htmlFor="status" className="btn btn-primary toggle-on">Activo</label>
249
									<label htmlFor="status" className="btn btn-light toggle-off">Inactivo</label>
250
									<span className="toggle-handle btn btn-light"></span>
251
								</div>
252
							</div>
253
						</div>
254
					</div>
255
				</Modal.Body>
256
				<Modal.Footer>
257
					<Button variant="primary" type='submit'>
258
						Enviar
259
					</Button>
260
					<Button variant="danger" onClick={closeModal}>
261
						Cancelar
262
					</Button>
263
				</Modal.Footer>
264
			</form>
265
		</Modal >
266
	)
267
}
268
 
269
export default EditAndAddModal