Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 14253 | Rev 15081 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
14184 stevensc 1
/* eslint-disable no-mixed-spaces-and-tabs */
2
import axios from 'axios'
3
import React, { useEffect, useState } from 'react'
4
import { Card } from 'react-bootstrap'
5
import { useDispatch } from 'react-redux'
6
import { useHistory } from 'react-router-dom'
7
import { LengthFilter, SearchInput, Table } from '../../recruitment_and_selection/components/TableComponents'
8
import { addNotification } from '../../redux/notification/notification.actions'
14197 stevensc 9
import DeleteModal from '../../shared/DeleteModal'
14184 stevensc 10
import PaginationComponent from '../../shared/PaginationComponent'
11
 
12
const headers = [
13
	{ key: 'name', label: 'Nombre', isSorteable: true },
14
	{ key: 'status', label: 'Activo', isSorteable: false },
15
	{ key: 'actions', label: 'Acciones', isSorteable: false }
16
]
17
 
18
const TableView = ({
14197 stevensc 19
	actionLink = '',
14193 stevensc 20
	import_link = '',
14184 stevensc 21
	add_link = '',
22
	table_link = '',
23
	permisions = '',
24
	setActionLink = function () { }
25
}) => {
26
 
27
	//Hooks
28
	const dispatch = useDispatch()
29
	const history = useHistory()
30
 
31
	//State
14197 stevensc 32
	const [isOpen, setIsOpen] = useState(false)
14184 stevensc 33
	const [items, setItems] = useState([])
34
	const [total, setTotal] = useState(0)
35
	const [search, setSearch] = useState('')
36
	const [dataLength, setDataLength] = useState(10)
37
	const [startItem, setStartItem] = useState(1)
38
	const [lastItem, setLastItem] = useState(10)
39
	const [pages, setPages] = useState({
40
		current: 1,
41
		last: 1
42
	})
43
 
44
	const getData = ({ url = '', params = {} }) => {
14199 stevensc 45
		axios.get(url, { params: { ...params } })
14184 stevensc 46
			.then(({ data }) => {
47
				if (!data.success) {
48
					return dispatch(addNotification({
49
						style: 'danger',
50
						msg: typeof data.data === 'string'
51
							? data.data
52
							: 'Ha ocurrido un error'
53
					}))
54
				}
55
 
56
				setItems(data.data.items)
57
				setTotal(data.data.total)
58
				setPages({ ...pages, last: Math.ceil(data.data.total / dataLength) })
59
			})
60
			.catch(() => dispatch(addNotification({
61
				style: 'danger',
62
				msg: 'Ha ocurrido un error'
63
			})))
64
	}
65
 
14193 stevensc 66
	const getImport = () => {
14199 stevensc 67
		axios.post(import_link)
14193 stevensc 68
			.then(({ data }) => {
69
				if (!data.success) {
14843 stevensc 70
					typeof data.data === 'string'
71
						?
72
						dispatch(addNotification({
73
							style: 'danger',
74
							msg: data.data
75
						}))
76
						: Object.entries(data.data).map(([key, value]) =>
77
							value.map(err =>
78
								dispatch(addNotification({
79
									style: 'danger',
80
									msg: `${key}: ${err}`
81
								}))
82
							)
83
						)
84
					return
14193 stevensc 85
				}
14201 stevensc 86
 
87
				dispatch(addNotification({
88
					style: 'success',
89
					msg: data.data
90
				}))
14193 stevensc 91
			})
92
	}
93
 
14184 stevensc 94
	useEffect(() => {
95
		getData({
96
			url: table_link,
97
			params: {
98
				search: search,
99
				length: dataLength,
100
				start: pages.current
101
			}
102
		})
103
	}, [search, dataLength, pages.current])
104
 
105
	useEffect(() => {
106
		if (pages.current > 1) {
107
			setStartItem((dataLength * (pages.current - 1)) + 1)
108
		} else {
109
			setStartItem(1)
110
		}
111
	}, [pages.current])
112
 
113
	useEffect(() => {
114
		if (items) {
115
			if (startItem > 1) {
116
				setLastItem(startItem + (items.length - 1))
117
			} else {
118
				setLastItem(items.length)
119
			}
120
		}
121
	}, [items])
122
 
123
	return (
14197 stevensc 124
		<>
125
			<section className="content">
126
				<div className="container-fluid">
127
					<div className="row">
128
						<div className="col-12">
129
							<Card>
130
								<Card.Header>
131
									<div className="row justify-content-end" style={{ gap: '10px' }}>
14184 stevensc 132
										{
14197 stevensc 133
											permisions.allowAdd
14253 stevensc 134
											&&
135
											<label
136
												onClick={getImport}
137
												className='d-flex align-items-center btn-add'
138
												style={{ cursor: 'pointer' }}
139
											>
140
												<i className="fa fa-upload mr-2" />
141
												Importar
142
											</label>
14184 stevensc 143
										}
14197 stevensc 144
										{
145
											permisions.allowAdd
14253 stevensc 146
											&&
147
											<label
148
												onClick={() => {
149
													setActionLink(add_link)
150
													history.push('/settings/jobs-description/add')
151
												}}
152
												className='d-flex align-items-center btn-add'
153
												style={{ cursor: 'pointer' }}
154
											>
155
												<i className="fa fa-plus mr-2" />
156
												Agregar
157
											</label>
14197 stevensc 158
										}
159
										<label
160
											className='d-flex align-items-center'
161
											onClick={() => getData({
162
												url: table_link,
163
												params: {
164
													search: search,
165
													length: dataLength,
166
													page: pages.current
167
												}
168
											})}
169
											style={{ cursor: 'pointer' }}
170
										>
171
											<i className='fa fa-refresh mr-2' />
14253 stevensc 172
											Actualizar
14197 stevensc 173
										</label>
174
									</div>
175
									<div className="row justify-content-between align-items-center">
176
										<LengthFilter onChange={(e) => setDataLength(e.target.value)} />
177
										<SearchInput onChange={(e) => setSearch(e.target.value)} />
178
									</div>
179
								</Card.Header>
180
								<Card.Body>
181
									<div className="table-responsive">
182
										<Table data={items} headers={headers} setData={setItems}>
183
											{
184
												items.length
14253 stevensc 185
												&&
186
												items.map((item, index) => (
187
													<tr key={index}>
188
														<td className='text-vertical-middle'>{item.name}</td>
189
														<td className='text-vertical-middle'>
190
															{item.status === 'a'
191
																? 'Activo'
192
																: 'Inactivo'
193
															}
194
														</td>
195
														<td>
196
															<div className="d-flex align-items-center" style={{ gap: '.5rem' }}>
197
																{
198
																	permisions.allowEdit
199
																	&&
200
																	<i
201
																		onClick={() => {
202
																			setActionLink(item.actions.link_edit)
203
																			history.push('/settings/jobs-description/edit')
204
																		}}
205
																		className='fa fa-pencil'
206
																		style={{ cursor: 'pointer' }}
207
																	/>
208
																}
209
																{
210
																	permisions.allowDelete
211
																	&&
212
																	<i
213
																		className='fa fa-trash'
214
																		onClick={() => {
215
																			setActionLink(item.actions.link_delete)
216
																			setIsOpen(true)
217
																		}}
218
																		style={{ cursor: 'pointer' }}
219
																	/>
220
																}
221
																{
222
																	permisions.allowReport
223
																	&&
224
																	<a
225
																		href={item.actions.link_report}
226
																		target='_blank'
227
																		rel="noreferrer"
228
																	>
229
																		<i
230
																			className='fa fa-file'
231
																			style={{ cursor: 'pointer' }}
232
																		/>
233
																	</a>
234
																}
235
															</div>
236
														</td>
237
													</tr>
238
												))
14197 stevensc 239
											}
240
										</Table>
241
									</div>
242
									<div className='row justify-content-between align-items-center'>
243
										<p className='mb-0'>
244
											{`Mostrando registros del ${startItem} al ${lastItem} de un total de ${total} registros`}
245
										</p>
246
										<PaginationComponent
247
											pages={pages.last}
248
											currentActivePage={pages.current}
249
											onChangePage={(page) => setPages({ ...pages, current: page })}
250
										/>
251
									</div>
252
								</Card.Body>
253
							</Card>
254
						</div>
255
					</div >
14184 stevensc 256
				</div >
14197 stevensc 257
			</section >
258
			<DeleteModal
259
				url={actionLink}
260
				isOpen={isOpen}
261
				closeModal={() => setIsOpen(false)}
262
				title="Esta seguro de borrar este registro?"
263
				onComplete={() => setItems(items.filter((item) => item.actions.link_delete !== actionLink))}
264
				message="Registro eliminado"
265
			/>
266
		</>
14184 stevensc 267
	)
268
}
269
 
270
export default TableView