Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11665 | Rev 11670 | 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)
62
				.then(({ data }) => {
63
					if (!data.success) {
64
						return dispatch(addNotification({
65
							style: 'danger',
66
							msg: 'Ha ocurrido un error'
67
						}))
68
					}
69
 
11659 stevensc 70
					setAllUsers(data.all_users)
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
					data.users.forEach(({ uuid }) => {
82
						const user = allUsers.find(userToAdd => userToAdd.uuid === uuid)
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