Proyectos de Subversion LeadersLinked - Backend

Rev

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

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