Proyectos de Subversion LeadersLinked - Backend

Rev

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