Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11676 | Rev 11683 | 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([])
11677 stevensc 17
	const [year, setYear] = useState(new Intl.DateTimeFormat('en-CA').format(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 = () => {
11677 stevensc 26
		console.log(allUsers)
27
		console.log(watch('user'))
28
		const newUser = allUsers.find(userOption => userOption.uuid === watch('user'))
29
		setUsersSelected(prev => [...prev, { uuid: newUser.uuid }])
11659 stevensc 30
	}
31
 
11546 stevensc 32
	const onSubmit = (data) => {
33
		const submitData = new FormData()
34
 
11659 stevensc 35
		submitData.append('status', isActive ? 'a' : 'i')
36
		submitData.append('date', year)
37
		usersSelected.map((user) => submitData.append('who[]', user.uuid))
38
		Object.entries(data).map(([key, value]) => {
11546 stevensc 39
			submitData.append(key, value)
40
		})
41
 
42
		axios.post(action_link, submitData)
43
			.then(({ data }) => {
44
				if (!data.success) {
45
					return dispatch(addNotification({
46
						style: 'danger',
47
						msg: 'Ha ocurrido un error'
48
					}))
49
				}
50
 
51
				clearErrors()
52
				closeModal()
53
				onComplete()
54
				dispatch(addNotification({
55
					style: 'success',
56
					msg: 'Usuario registrado'
57
				}))
58
			})
59
	}
60
 
61
	useEffect(() => {
62
		if (type === 'edit') {
63
			axios.get(action_link)
11672 stevensc 64
				.then(({ data }) => {
11546 stevensc 65
					if (!data.success) {
66
						return dispatch(addNotification({
67
							style: 'danger',
68
							msg: 'Ha ocurrido un error'
69
						}))
70
					}
71
 
11672 stevensc 72
					setAllUsers(data.all_users)
11659 stevensc 73
					setValue('title', data.data.title)
74
					setValue('description', data.data.description)
75
					setValue('how', data.data.how)
76
					setValue('place', data.data.place)
77
					setValue('date', data.data.date)
78
					setValue('cost', data.data.time)
79
					setValue('priority', data.data.time)
80
					setValue('urgent', data.data.time)
81
					setValue('indicator', data.data.indicator)
82
					setIsActive(data.data.status === 'a' ? true : false)
11676 stevensc 83
					setUsersSelected(data.users)
11546 stevensc 84
				})
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>
11676 stevensc 141
								{
142
									usersSelected.map((user) => {
143
										const renderUser = allUsers.find(userOption => userOption.uuid === user.uuid)
144
 
145
										return (
146
											<tr key={renderUser.uuid}>
147
												<td>{`${renderUser.first_name} ${renderUser.last_name}`}</td>
148
												<td>
149
													<div className="d-flex">
150
														<button className='btn btn-danger' onClick={() => deleteUserSelected(renderUser.uuid)}>
151
															Eliminar
152
														</button>
153
													</div>
154
												</td>
155
											</tr>
156
										)
157
									})
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 })}>
11677 stevensc 210
								<option selected={watch('priority') === ''} value="">Seleccione</option>
211
								<option selected={watch('priority') === 'i'} value="i">Importante</option>
212
								<option selected={watch('priority') === 'ni'} value="ni">No importante</option>
11659 stevensc 213
							</select>
214
						</div>
215
						<div className='form-group'>
216
							<label className="form-label">Urgencia:</label>
217
							<select name="urgent" ref={register({ required: true })}>
11677 stevensc 218
								<option selected={watch('urgent') === ''} value="">Seleccione</option>
219
								<option selected={watch('urgent') === 'u'} value="u">Importante</option>
220
								<option selected={watch('urgent') === 'nu'} value="nu">No importante</option>
11659 stevensc 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