Proyectos de Subversion LeadersLinked - Backend

Rev

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