Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 14189 | Rev 14191 | 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'
9
import PaginationComponent from '../../shared/PaginationComponent'
10
 
11
const headers = [
12
	{ key: 'name', label: 'Nombre', isSorteable: true },
13
	{ key: 'status', label: 'Activo', isSorteable: false },
14
	{ key: 'actions', label: 'Acciones', isSorteable: false }
15
]
16
 
17
const TableView = ({
18
	add_link = '',
19
	table_link = '',
20
	permisions = '',
21
	setActionLink = function () { }
22
}) => {
23
 
24
	//Hooks
25
	const dispatch = useDispatch()
26
	const history = useHistory()
27
 
28
	//State
29
	const [modalToShow, setModalToShow] = useState('')
30
	const [items, setItems] = useState([])
31
	const [total, setTotal] = useState(0)
32
	const [search, setSearch] = useState('')
33
	const [dataLength, setDataLength] = useState(10)
34
	const [startItem, setStartItem] = useState(1)
35
	const [lastItem, setLastItem] = useState(10)
36
	const [pages, setPages] = useState({
37
		current: 1,
38
		last: 1
39
	})
40
 
41
	const getData = ({ url = '', params = {} }) => {
42
		axios.get(url, { params: { ...params } })
43
			.then(({ data }) => {
44
				if (!data.success) {
45
					return dispatch(addNotification({
46
						style: 'danger',
47
						msg: typeof data.data === 'string'
48
							? data.data
49
							: 'Ha ocurrido un error'
50
					}))
51
				}
52
 
53
				setItems(data.data.items)
54
				setTotal(data.data.total)
55
				setPages({ ...pages, last: Math.ceil(data.data.total / dataLength) })
56
			})
57
			.catch(() => dispatch(addNotification({
58
				style: 'danger',
59
				msg: 'Ha ocurrido un error'
60
			})))
61
	}
62
 
63
	useEffect(() => {
64
		getData({
65
			url: table_link,
66
			params: {
67
				search: search,
68
				length: dataLength,
69
				start: pages.current
70
			}
71
		})
72
	}, [search, dataLength, pages.current])
73
 
74
	useEffect(() => {
75
		if (pages.current > 1) {
76
			setStartItem((dataLength * (pages.current - 1)) + 1)
77
		} else {
78
			setStartItem(1)
79
		}
80
	}, [pages.current])
81
 
82
	useEffect(() => {
83
		if (items) {
84
			if (startItem > 1) {
85
				setLastItem(startItem + (items.length - 1))
86
			} else {
87
				setLastItem(items.length)
88
			}
89
		}
90
	}, [items])
91
 
92
	return (
93
		<section className="content">
94
			<div className="container-fluid">
95
				<div className="row">
96
					<div className="col-12">
97
						<Card>
98
							<Card.Header>
99
								<div className="row justify-content-end" style={{ gap: '10px' }}>
100
									{
101
										permisions.allowAdd
102
                                        &&
103
                                        <label className='d-flex align-items-center btn-add' style={{ cursor: 'pointer' }}>
104
                                        	<i className="fa fa-plus mr-2" />
105
                                            Agregar
106
                                        </label>
107
									}
108
									<label
109
										className='d-flex align-items-center'
110
										onClick={() => getData({
111
											url: table_link,
112
											params: {
113
												search: search,
114
												length: dataLength,
115
												page: pages.current
116
											}
117
										})}
118
										style={{ cursor: 'pointer' }}
119
									>
120
										<i className='fa fa-refresh mr-2' />
121
                                        Actualizar
122
									</label>
123
								</div>
124
								<div className="row justify-content-between align-items-center">
125
									<LengthFilter onChange={(e) => setDataLength(e.target.value)} />
126
									<SearchInput onChange={(e) => setSearch(e.target.value)} />
127
								</div>
128
							</Card.Header>
129
							<Card.Body>
130
								<div className="table-responsive">
131
									<Table data={items} headers={headers} setData={setItems}>
132
										{
133
											items.length
134
                                            &&
135
                                            items.map((item, index) => (
136
                                            	<tr key={index}>
14188 stevensc 137
                                            		<td className='text-vertical-middle'>{item.name}</td>
14184 stevensc 138
                                            		<td className='text-vertical-middle'>
14188 stevensc 139
                                            			{item.status === 'a'
140
                                            				? 'Activo'
141
                                            				: 'Inactivo'
14184 stevensc 142
                                            			}
143
                                            		</td>
144
                                            		<td>
14189 stevensc 145
                                            			<div className="d-flex align-items-center" style={{ gap: '.5rem' }}>
14184 stevensc 146
                                            				{
14188 stevensc 147
                                            					permisions.allowEdit
148
                                                                &&
149
                                                                <i
150
                                                                	className='fa fa-pencil'
151
                                                                	style={{ cursor: 'pointer' }}
152
                                                                />
153
                                            				}
154
                                            				{
14184 stevensc 155
                                            					permisions.allowDelete
156
                                                                &&
157
                                                                <i
158
                                                                	className='fa fa-trash'
159
                                                                	onClick={() => {
160
                                                                		setActionLink(item.actions.link_delete)
161
                                                                		setModalToShow('delete')
162
                                                                	}}
163
                                                                	style={{ cursor: 'pointer' }}
164
                                                                />
165
                                            				}
14189 stevensc 166
                                            				{
167
                                            					permisions.allowReport
168
                                                                &&
169
                                                                <a
14190 stevensc 170
                                                                	href={item.actions.link_report}
14189 stevensc 171
                                                                	target='_blank'
172
                                                                	rel="noreferrer"
173
                                                                >
174
                                                                	<i
175
                                                                		className='fa fa-file'
176
                                                                		style={{ cursor: 'pointer' }}
177
                                                                	/>
178
                                                                </a>
179
                                            				}
14184 stevensc 180
                                            			</div>
181
                                            		</td>
182
                                            	</tr>
183
                                            ))
184
										}
185
									</Table>
186
								</div>
187
								<div className='row justify-content-between align-items-center'>
188
									<p className='mb-0'>
189
										{`Mostrando registros del ${startItem} al ${lastItem} de un total de ${total} registros`}
190
									</p>
191
									<PaginationComponent
192
										pages={pages.last}
193
										currentActivePage={pages.current}
194
										onChangePage={(page) => setPages({ ...pages, current: page })}
195
									/>
196
								</div>
197
							</Card.Body>
198
						</Card>
199
					</div>
200
				</div >
201
			</div >
202
		</section >
203
	)
204
}
205
 
206
export default TableView