Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 12528 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
12475 stevensc 1
import axios from 'axios'
2
import React, { useState, useEffect } from 'react'
3
import { Card } from 'react-bootstrap'
4
import { useDispatch } from 'react-redux'
5
import { useHistory } from 'react-router-dom'
6
import { LengthFilter, SearchInput, Table, TablePagination } from '../../../recruitment_and_selection/components/TableComponents'
7
import { addNotification } from '../../../redux/notification/notification.actions'
12528 stevensc 8
import parse from 'html-react-parser'
12475 stevensc 9
import DeleteModal from '../../../shared/DeleteModal'
10
 
11
const headers = [
12
	{ key: 'name', label: 'Nombre', isSorteable: true },
13
	{ key: 'description', label: 'Descripción', isSorteable: true },
14
	{ key: 'status', label: 'Estatus', isSorteable: false },
15
	{ key: 'actions', label: 'Acciones', isSorteable: false }
16
]
17
 
18
const TableView = ({ table_link, setActionLink, permisions, add_link }) => {
19
 
20
	const history = useHistory()
21
	const dispatch = useDispatch()
22
	const [showDeleteModal, setShowDeleteModal] = useState(false)
23
	const [deleteLink, setDeleteLink] = useState('')
12492 stevensc 24
	const [items, setItems] = useState([])
12475 stevensc 25
	const [search, setSearch] = useState('')
26
	const [startItem, setStartItem] = useState(1)
27
	const [lastItem, setLastItem] = useState(10)
28
	const [total, setTotal] = useState(10)
29
	const [dataLength, setDataLength] = useState(10)
30
	const [pages, setPages] = useState({
31
		current: 1,
32
		last: 1
33
	})
34
 
12491 stevensc 35
	const getData = ({ url = '', params = {} }) => {
36
 
37
		axios.get(url, { params: { ...params } })
38
			.then(({ data }) => {
39
				if (!data.success) {
40
					dispatch(addNotification({
14838 stevensc 41
						style: 'danger',
12491 stevensc 42
						msg: 'Ha ocurrido un error'
43
					}))
44
				}
45
 
46
				setItems(data.data.items)
47
				setTotal(data.data.total)
48
				setPages({ ...pages, last: Math.ceil(data.data.total / dataLength) })
49
			})
50
			.catch(() => dispatch(addNotification({
14838 stevensc 51
				style: 'danger',
12491 stevensc 52
				msg: 'Ha ocurrido un error'
53
			})))
54
	}
55
 
56
	useEffect(() => {
57
		getData({
58
			url: table_link,
59
			params: {
60
				search: search,
61
				length: dataLength,
62
				start: pages.current
63
			}
64
		})
65
	}, [search, dataLength, pages.current])
66
 
67
	useEffect(() => {
68
		if (pages.current > 1) {
69
			setStartItem((dataLength * (pages.current - 1)) + 1)
70
		} else {
71
			setStartItem(1)
72
		}
73
	}, [pages.current])
74
 
75
	useEffect(() => {
76
		if (items) {
77
			if (startItem > 1) {
78
				setLastItem(startItem + (items.length - 1))
79
			} else {
80
				setLastItem(items.length)
81
			}
82
		}
83
	}, [items])
84
 
12475 stevensc 85
	return (
86
		<>
12491 stevensc 87
			<section className="content">
88
				<div className="container-fluid">
89
					<div className="row">
90
						<div className="col-12">
91
							<Card>
92
								<Card.Header>
93
									<div className="row justify-content-end" style={{ gap: '10px' }}>
94
										{
95
											permisions.allowAdd
96
											&&
97
											<label
98
												className='d-flex align-items-center'
99
												onClick={() => {
100
													setActionLink(add_link)
101
													history.push('/organizational-climate/form/add')
102
												}}
103
												style={{ cursor: 'pointer' }}
104
											>
105
												<i className="fa fa-plus mr-2" />
106
												Agregar
107
											</label>
108
										}
109
										<label
110
											className='d-flex align-items-center'
111
											onClick={() => getData({
112
												url: table_link,
113
												params: {
114
													search: search,
115
													length: dataLength,
116
													start: pages.current
117
												}
118
											})}
119
											style={{ cursor: 'pointer' }}
120
										>
121
											<i className='fa fa-refresh mr-2' />
122
											Actualizar
123
										</label>
124
									</div>
125
									<div className="row justify-content-between align-items-center">
126
										<LengthFilter onChange={(e) => setDataLength(e.target.value)} />
127
										<SearchInput onChange={(e) => setSearch(e.target.value)} />
128
									</div>
129
								</Card.Header>
130
								<Card.Body>
131
									<div className="table-responsive">
132
										<Table data={items} headers={headers} setData={setItems}>
133
											{
12493 stevensc 134
												items.length > 0
135
												&&
136
												items.map((item, index) => (
12491 stevensc 137
													<tr key={index}>
138
														<td>{item.name}</td>
12528 stevensc 139
														<td>{parse(item.description)}</td>
12491 stevensc 140
														<td>
141
															{
142
																item.status === 'A'
143
																	? 'Activo'
144
																	: 'Inactivo'
145
															}
146
														</td>
147
														<td className='d-flex' style={{ gap: '10px' }}>
148
															{
149
																permisions.allowEdit
150
																&&
151
																<i
152
																	className='fa fa-pencil'
153
																	onClick={() => {
154
																		setActionLink(item.actions.link_edit)
155
																		history.push('/organizational-climate/form/edit')
156
																	}}
157
																	style={{ cursor: 'pointer' }}
158
																/>
159
															}
160
															{
161
																permisions.allowDelete
162
																&&
163
																<i
164
																	className='fa fa-trash'
165
																	onClick={() => {
166
																		setShowDeleteModal(true)
167
																		setDeleteLink(item.actions.link_delete)
168
																	}}
169
																	style={{ cursor: 'pointer' }}
170
																/>
171
															}
172
														</td>
173
													</tr>
174
												))
175
											}
176
										</Table>
177
									</div>
178
									<div className='row justify-content-between align-items-center'>
179
										<p className='mb-0'>
180
											{`Mostrando registros del ${startItem} al ${lastItem} de un total de ${total} registros`}
181
										</p>
182
										<TablePagination
183
											onDecrement={() => setPages({ ...pages, current: pages.current - 1 })}
184
											onIncrement={() => setPages({ ...pages, current: pages.current + 1 })}
185
											totalPages={pages.last}
186
											currentPage={pages.current}
187
										/>
188
									</div>
189
								</Card.Body>
190
							</Card>
191
						</div>
192
					</div >
193
				</div >
194
			</section >
195
			<DeleteModal
196
				url={deleteLink}
197
				isOpen={showDeleteModal}
198
				closeModal={() => setShowDeleteModal(false)}
199
				title="Esta seguro de borrar este formulario?"
200
				onComplete={() => setItems(items.filter((item) => item.actions.link_delete !== deleteLink))}
201
				message="Registro eliminado"
202
			/>
12475 stevensc 203
		</>
204
	)
205
}
206
 
207
export default TableView