| 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
|
| 11683 |
stevensc |
13 |
const { register, handleSubmit, errors, setValue, clearErrors, watch, reset } = 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 |
const newUser = allUsers.find(userOption => userOption.uuid === watch('user'))
|
|
|
27 |
setUsersSelected(prev => [...prev, { uuid: newUser.uuid }])
|
| 11659 |
stevensc |
28 |
}
|
|
|
29 |
|
| 11683 |
stevensc |
30 |
const onClose = () => {
|
|
|
31 |
reset()
|
| 11684 |
stevensc |
32 |
setUsersSelected([])
|
| 11683 |
stevensc |
33 |
closeModal()
|
|
|
34 |
}
|
|
|
35 |
|
| 11546 |
stevensc |
36 |
const onSubmit = (data) => {
|
|
|
37 |
const submitData = new FormData()
|
|
|
38 |
|
| 11659 |
stevensc |
39 |
submitData.append('status', isActive ? 'a' : 'i')
|
|
|
40 |
submitData.append('date', year)
|
|
|
41 |
usersSelected.map((user) => submitData.append('who[]', user.uuid))
|
|
|
42 |
Object.entries(data).map(([key, value]) => {
|
| 11546 |
stevensc |
43 |
submitData.append(key, value)
|
|
|
44 |
})
|
|
|
45 |
|
|
|
46 |
axios.post(action_link, submitData)
|
|
|
47 |
.then(({ data }) => {
|
|
|
48 |
if (!data.success) {
|
|
|
49 |
return dispatch(addNotification({
|
|
|
50 |
style: 'danger',
|
|
|
51 |
msg: 'Ha ocurrido un error'
|
|
|
52 |
}))
|
|
|
53 |
}
|
|
|
54 |
|
|
|
55 |
clearErrors()
|
|
|
56 |
closeModal()
|
| 11683 |
stevensc |
57 |
reset()
|
| 11546 |
stevensc |
58 |
onComplete()
|
|
|
59 |
dispatch(addNotification({
|
|
|
60 |
style: 'success',
|
| 11683 |
stevensc |
61 |
msg: 'Registro guardadof'
|
| 11546 |
stevensc |
62 |
}))
|
|
|
63 |
})
|
|
|
64 |
}
|
|
|
65 |
|
|
|
66 |
useEffect(() => {
|
|
|
67 |
if (type === 'edit') {
|
|
|
68 |
axios.get(action_link)
|
| 11672 |
stevensc |
69 |
.then(({ data }) => {
|
| 11546 |
stevensc |
70 |
if (!data.success) {
|
|
|
71 |
return dispatch(addNotification({
|
|
|
72 |
style: 'danger',
|
|
|
73 |
msg: 'Ha ocurrido un error'
|
|
|
74 |
}))
|
|
|
75 |
}
|
|
|
76 |
|
| 11672 |
stevensc |
77 |
setAllUsers(data.all_users)
|
| 11659 |
stevensc |
78 |
setValue('title', data.data.title)
|
|
|
79 |
setValue('description', data.data.description)
|
|
|
80 |
setValue('how', data.data.how)
|
|
|
81 |
setValue('place', data.data.place)
|
|
|
82 |
setValue('date', data.data.date)
|
|
|
83 |
setValue('cost', data.data.time)
|
|
|
84 |
setValue('priority', data.data.time)
|
|
|
85 |
setValue('urgent', data.data.time)
|
|
|
86 |
setValue('indicator', data.data.indicator)
|
|
|
87 |
setIsActive(data.data.status === 'a' ? true : false)
|
| 11676 |
stevensc |
88 |
setUsersSelected(data.users)
|
| 11546 |
stevensc |
89 |
})
|
|
|
90 |
}
|
|
|
91 |
}, [type])
|
|
|
92 |
|
| 11659 |
stevensc |
93 |
useEffect(() => {
|
|
|
94 |
if (type === 'add') {
|
|
|
95 |
axios.get(action_link)
|
|
|
96 |
.then(({ data }) => {
|
|
|
97 |
if (!data.success) {
|
|
|
98 |
return dispatch(addNotification({
|
|
|
99 |
style: 'danger',
|
|
|
100 |
msg: 'Ha ocurrido un error'
|
|
|
101 |
}))
|
|
|
102 |
}
|
|
|
103 |
|
|
|
104 |
setAllUsers(data.data)
|
|
|
105 |
})
|
|
|
106 |
}
|
|
|
107 |
}, [type])
|
|
|
108 |
|
| 11546 |
stevensc |
109 |
return (
|
| 11683 |
stevensc |
110 |
<Modal size="md" onHide={onClose} show={type === 'add' || type === ('edit')}>
|
| 11546 |
stevensc |
111 |
<Modal.Header closeButton>
|
|
|
112 |
<Modal.Title>
|
|
|
113 |
{
|
|
|
114 |
type === 'add'
|
| 11659 |
stevensc |
115 |
? 'Agregar Tarea'
|
|
|
116 |
: 'Editar Tarea'
|
| 11546 |
stevensc |
117 |
}
|
|
|
118 |
</Modal.Title>
|
|
|
119 |
</Modal.Header>
|
|
|
120 |
<form onSubmit={handleSubmit(onSubmit)}>
|
|
|
121 |
<Modal.Body>
|
| 11662 |
stevensc |
122 |
<div className='form-group'>
|
|
|
123 |
<label className="form-label">Título</label>
|
|
|
124 |
<input type="text" name='title' className='form-control' ref={register({ required: true })} />
|
|
|
125 |
{errors.title && <p>{errors.title.message}</p>}
|
|
|
126 |
</div>
|
|
|
127 |
<div className='form-group'>
|
|
|
128 |
<label className="form-label">Descripción de la tarea</label>
|
|
|
129 |
<input type="text" name='description' className='form-control' ref={register({ required: true })} />
|
|
|
130 |
{errors.description && <p>{errors.description.message}</p>}
|
|
|
131 |
</div>
|
|
|
132 |
<div className='form-group'>
|
|
|
133 |
<label className="form-label">Como se implementara</label>
|
|
|
134 |
<input type="text" name='how' className='form-control' ref={register({ required: true })} />
|
|
|
135 |
{errors.how && <p>{errors.how.message}</p>}
|
|
|
136 |
</div>
|
|
|
137 |
<div className="w-100">
|
| 11683 |
stevensc |
138 |
<table className='table'>
|
| 11662 |
stevensc |
139 |
<thead>
|
|
|
140 |
<tr>
|
|
|
141 |
<th>Usuario</th>
|
|
|
142 |
<th>Acciones</th>
|
|
|
143 |
</tr>
|
|
|
144 |
</thead>
|
|
|
145 |
<tbody>
|
| 11676 |
stevensc |
146 |
{
|
|
|
147 |
usersSelected.map((user) => {
|
|
|
148 |
const renderUser = allUsers.find(userOption => userOption.uuid === user.uuid)
|
|
|
149 |
|
|
|
150 |
return (
|
|
|
151 |
<tr key={renderUser.uuid}>
|
|
|
152 |
<td>{`${renderUser.first_name} ${renderUser.last_name}`}</td>
|
|
|
153 |
<td>
|
|
|
154 |
<div className="d-flex">
|
|
|
155 |
<button className='btn btn-danger' onClick={() => deleteUserSelected(renderUser.uuid)}>
|
|
|
156 |
Eliminar
|
|
|
157 |
</button>
|
|
|
158 |
</div>
|
|
|
159 |
</td>
|
|
|
160 |
</tr>
|
|
|
161 |
)
|
|
|
162 |
})
|
|
|
163 |
}
|
| 11662 |
stevensc |
164 |
</tbody>
|
|
|
165 |
</table>
|
|
|
166 |
</div>
|
| 11665 |
stevensc |
167 |
<div className="d-flex align-items-center">
|
| 11662 |
stevensc |
168 |
<select name='user' ref={register} className='form-control'>
|
|
|
169 |
<option value=''>Seleccione</option>
|
|
|
170 |
{
|
|
|
171 |
allUsers.map((user) => (
|
|
|
172 |
<option key={user.uuid} value={user.uuid}>{`${user.first_name} ${user.last_name}`}</option>
|
|
|
173 |
))
|
|
|
174 |
}
|
|
|
175 |
</select>
|
| 11665 |
stevensc |
176 |
<button className='d-flex align-items-center btn btn-primary ml-2' onClick={addUser}>
|
| 11662 |
stevensc |
177 |
<i className='fa fa-plus' />
|
|
|
178 |
Agregar
|
|
|
179 |
</button>
|
|
|
180 |
</div>
|
| 11665 |
stevensc |
181 |
<div className="d-flex align-items-centers" style={{ gap: '5px' }}>
|
| 11546 |
stevensc |
182 |
<div className='form-group'>
|
| 11662 |
stevensc |
183 |
<label className="form-label">Donde se realizara:</label>
|
|
|
184 |
<input type="text" name='place' className='form-control' ref={register({ required: true })} />
|
|
|
185 |
{errors.place && <p>{errors.place.message}</p>}
|
| 11546 |
stevensc |
186 |
</div>
|
|
|
187 |
<div className='form-group'>
|
| 11662 |
stevensc |
188 |
<label className="form-label">Fecha:</label>
|
|
|
189 |
<Datetime
|
|
|
190 |
dateFormat="DD-MM-YYYY"
|
|
|
191 |
timeFormat={false}
|
|
|
192 |
onChange={(e) =>
|
|
|
193 |
setYear(new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: 'numeric', day: 'numeric' }).format(e.toDate()))
|
|
|
194 |
}
|
|
|
195 |
inputProps={{ className: 'form-control' }}
|
|
|
196 |
initialValue={Date.parse(year)}
|
|
|
197 |
closeOnSelect
|
|
|
198 |
value={year}
|
|
|
199 |
/>
|
| 11659 |
stevensc |
200 |
</div>
|
|
|
201 |
<div className='form-group'>
|
| 11662 |
stevensc |
202 |
<label className="form-label">Horas:</label>
|
| 11683 |
stevensc |
203 |
<input type="number" name='time' className='form-control' ref={register} defaultValue='1' />
|
| 11662 |
stevensc |
204 |
{errors.time && <p>{errors.time.message}</p>}
|
| 11659 |
stevensc |
205 |
</div>
|
|
|
206 |
</div>
|
| 11665 |
stevensc |
207 |
<div className="d-flex align-items-centers" style={{ gap: '5px' }}>
|
| 11659 |
stevensc |
208 |
<div className='form-group'>
|
|
|
209 |
<label className="form-label">Costo:</label>
|
| 11683 |
stevensc |
210 |
<input type="number" name='cost' className='form-control' defaultValue='1' ref={register} />
|
| 11659 |
stevensc |
211 |
</div>
|
|
|
212 |
<div className='form-group'>
|
|
|
213 |
<label className="form-label">Prioridad:</label>
|
|
|
214 |
<select name="priority" ref={register({ required: true })}>
|
| 11677 |
stevensc |
215 |
<option selected={watch('priority') === ''} value="">Seleccione</option>
|
|
|
216 |
<option selected={watch('priority') === 'i'} value="i">Importante</option>
|
|
|
217 |
<option selected={watch('priority') === 'ni'} value="ni">No importante</option>
|
| 11659 |
stevensc |
218 |
</select>
|
|
|
219 |
</div>
|
|
|
220 |
<div className='form-group'>
|
|
|
221 |
<label className="form-label">Urgencia:</label>
|
|
|
222 |
<select name="urgent" ref={register({ required: true })}>
|
| 11677 |
stevensc |
223 |
<option selected={watch('urgent') === ''} value="">Seleccione</option>
|
| 11683 |
stevensc |
224 |
<option selected={watch('urgent') === 'u'} value="u">Urgente</option>
|
|
|
225 |
<option selected={watch('urgent') === 'nu'} value="nu">No urgente</option>
|
| 11659 |
stevensc |
226 |
</select>
|
|
|
227 |
</div>
|
|
|
228 |
</div>
|
|
|
229 |
<div className="form-row">
|
|
|
230 |
<div className="col-md-9 mb-3">
|
|
|
231 |
<label>Indicador de progreso:</label>
|
|
|
232 |
<div className="d-flex justify-content-between align-items-center">
|
|
|
233 |
<input type="range" name="indicator" min='1' max='100' className="form-control" ref={register} />
|
|
|
234 |
<span className="ml-2" id="spanIndicator">{watch('indicator')}</span>
|
|
|
235 |
</div>
|
|
|
236 |
</div>
|
|
|
237 |
<div className="col-md-3 mb-3 text-center">
|
|
|
238 |
<label htmlFor="status">Estatus:</label>
|
| 11546 |
stevensc |
239 |
<div
|
|
|
240 |
className={`toggle d-block btn btn-primary ${!isActive && 'off'}`}
|
|
|
241 |
data-toggle="toggle"
|
|
|
242 |
role="button"
|
|
|
243 |
style={{ width: '130px' }}
|
|
|
244 |
onClick={() => setIsActive(!isActive)}
|
|
|
245 |
>
|
|
|
246 |
<input
|
|
|
247 |
type="checkbox"
|
|
|
248 |
checked={isActive}
|
|
|
249 |
/>
|
|
|
250 |
<div className="toggle-group">
|
|
|
251 |
<label htmlFor="status" className="btn btn-primary toggle-on">Activo</label>
|
|
|
252 |
<label htmlFor="status" className="btn btn-light toggle-off">Inactivo</label>
|
|
|
253 |
<span className="toggle-handle btn btn-light"></span>
|
|
|
254 |
</div>
|
|
|
255 |
</div>
|
|
|
256 |
</div>
|
|
|
257 |
</div>
|
|
|
258 |
</Modal.Body>
|
|
|
259 |
<Modal.Footer>
|
|
|
260 |
<Button variant="primary" type='submit'>
|
|
|
261 |
Enviar
|
|
|
262 |
</Button>
|
|
|
263 |
<Button variant="danger" onClick={closeModal}>
|
|
|
264 |
Cancelar
|
|
|
265 |
</Button>
|
|
|
266 |
</Modal.Footer>
|
|
|
267 |
</form>
|
|
|
268 |
</Modal >
|
|
|
269 |
)
|
|
|
270 |
}
|
|
|
271 |
|
|
|
272 |
export default EditAndAddModal
|