Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 14191 | Rev 14193 | 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
                                        &&
14191 stevensc 103
                                        <label
104
                                        	onClick={() => setActionLink(add_link)}
105
                                        	className='d-flex align-items-center btn-add'
106
                                        	style={{ cursor: 'pointer' }}
107
                                        >
14184 stevensc 108
                                        	<i className="fa fa-plus mr-2" />
109
                                            Agregar
110
                                        </label>
111
									}
112
									<label
113
										className='d-flex align-items-center'
114
										onClick={() => getData({
115
											url: table_link,
116
											params: {
117
												search: search,
118
												length: dataLength,
119
												page: pages.current
120
											}
121
										})}
122
										style={{ cursor: 'pointer' }}
123
									>
124
										<i className='fa fa-refresh mr-2' />
125
                                        Actualizar
126
									</label>
127
								</div>
128
								<div className="row justify-content-between align-items-center">
129
									<LengthFilter onChange={(e) => setDataLength(e.target.value)} />
130
									<SearchInput onChange={(e) => setSearch(e.target.value)} />
131
								</div>
132
							</Card.Header>
133
							<Card.Body>
134
								<div className="table-responsive">
135
									<Table data={items} headers={headers} setData={setItems}>
136
										{
137
											items.length
138
                                            &&
139
                                            items.map((item, index) => (
140
                                            	<tr key={index}>
14188 stevensc 141
                                            		<td className='text-vertical-middle'>{item.name}</td>
14184 stevensc 142
                                            		<td className='text-vertical-middle'>
14188 stevensc 143
                                            			{item.status === 'a'
144
                                            				? 'Activo'
145
                                            				: 'Inactivo'
14184 stevensc 146
                                            			}
147
                                            		</td>
148
                                            		<td>
14189 stevensc 149
                                            			<div className="d-flex align-items-center" style={{ gap: '.5rem' }}>
14184 stevensc 150
                                            				{
14188 stevensc 151
                                            					permisions.allowEdit
152
                                                                &&
153
                                                                <i
14191 stevensc 154
                                                                	onClick={() => {
155
                                                                		setActionLink(item.actions.link_edit)
14192 stevensc 156
                                                                		history.push('/settings/jobs-description/edit')
14191 stevensc 157
                                                                	}}
14188 stevensc 158
                                                                	className='fa fa-pencil'
159
                                                                	style={{ cursor: 'pointer' }}
160
                                                                />
161
                                            				}
162
                                            				{
14184 stevensc 163
                                            					permisions.allowDelete
164
                                                                &&
165
                                                                <i
166
                                                                	className='fa fa-trash'
167
                                                                	onClick={() => {
168
                                                                		setActionLink(item.actions.link_delete)
169
                                                                		setModalToShow('delete')
170
                                                                	}}
171
                                                                	style={{ cursor: 'pointer' }}
172
                                                                />
173
                                            				}
14189 stevensc 174
                                            				{
175
                                            					permisions.allowReport
176
                                                                &&
177
                                                                <a
14190 stevensc 178
                                                                	href={item.actions.link_report}
14189 stevensc 179
                                                                	target='_blank'
180
                                                                	rel="noreferrer"
181
                                                                >
182
                                                                	<i
183
                                                                		className='fa fa-file'
184
                                                                		style={{ cursor: 'pointer' }}
185
                                                                	/>
186
                                                                </a>
187
                                            				}
14184 stevensc 188
                                            			</div>
189
                                            		</td>
190
                                            	</tr>
191
                                            ))
192
										}
193
									</Table>
194
								</div>
195
								<div className='row justify-content-between align-items-center'>
196
									<p className='mb-0'>
197
										{`Mostrando registros del ${startItem} al ${lastItem} de un total de ${total} registros`}
198
									</p>
199
									<PaginationComponent
200
										pages={pages.last}
201
										currentActivePage={pages.current}
202
										onChangePage={(page) => setPages({ ...pages, current: page })}
203
									/>
204
								</div>
205
							</Card.Body>
206
						</Card>
207
					</div>
208
				</div >
209
			</div >
210
		</section >
211
	)
212
}
213
 
214
export default TableView