Proyectos de Subversion LeadersLinked - Backend

Rev

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
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