Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15301 | Rev 15303 | 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
 
15302 stevensc 59
	const row = items.map((item, index) =>
60
		<tr key={index}>
61
			<td>{item.name}</td>
62
			<td>{item.job_description}</td>
63
			<td>
64
				{item.status === 'a'
65
					? 'Activo'
66
					: 'Inactivo'
67
				}
68
			</td>
69
			<td className='d-flex' style={{ gap: '10px' }}>
70
				{permisions.allowEdit &&
71
					<i
72
						className='fa fa-pencil'
73
						onClick={() => {
74
							setActionLink(item.actions.link_edit)
75
							setAction('edit')
76
						}}
77
						style={{ cursor: 'pointer' }} />
78
				}
79
				{permisions.allowDelete &&
80
					<i
81
						className='fa fa-trash'
82
						onClick={() => {
83
							setShowDeleteModal(true)
84
							setDeleteLink(item.actions.link_delete)
85
						}}
86
						style={{ cursor: 'pointer' }} />
87
				}
88
			</td>
89
		</tr>
90
	)
91
 
11264 stevensc 92
	useEffect(() => {
93
		getData({
94
			url: table_link,
95
			params: {
96
				search: search,
97
				length: dataLength,
12374 stevensc 98
				start: pages.current
11264 stevensc 99
			}
100
		})
101
	}, [search, dataLength, pages.current])
9502 stevensc 102
 
12373 stevensc 103
	useEffect(() => {
104
		if (pages.current > 1) {
105
			setStartItem((dataLength * (pages.current - 1)) + 1)
106
		} else {
107
			setStartItem(1)
108
		}
109
	}, [pages.current])
110
 
111
	useEffect(() => {
12712 stevensc 112
		if (items) {
12373 stevensc 113
			if (startItem > 1) {
12712 stevensc 114
				setLastItem(startItem + (items.length - 1))
12373 stevensc 115
			} else {
12712 stevensc 116
				setLastItem(items.length)
12373 stevensc 117
			}
118
		}
12712 stevensc 119
	}, [items])
12373 stevensc 120
 
11264 stevensc 121
	return (
122
		<>
123
			<section className="content">
124
				<div className="container-fluid">
125
					<div className="row">
126
						<div className="col-12">
127
							<Card>
128
								<Card.Header>
129
									<div className="row justify-content-end" style={{ gap: '10px' }}>
15103 stevensc 130
										{permisions.allowAdd &&
11268 stevensc 131
											<label
132
												className='d-flex align-items-center'
133
												onClick={() => {
134
													setActionLink(add_link)
15103 stevensc 135
													setAction('add')
11268 stevensc 136
												}}
137
												style={{ cursor: 'pointer' }}
138
											>
139
												<i className="fa fa-plus mr-2" />
140
												Agregar
141
											</label>
11264 stevensc 142
										}
143
										<label
144
											className='d-flex align-items-center'
145
											onClick={() => getData({
146
												url: table_link,
147
												params: {
148
													search: search,
149
													length: dataLength,
150
													page: pages.current
151
												}
152
											})}
153
											style={{ cursor: 'pointer' }}
154
										>
155
											<i className='fa fa-refresh mr-2' />
11268 stevensc 156
											Actualizar
11264 stevensc 157
										</label>
158
									</div>
159
									<div className="row justify-content-between align-items-center">
160
										<LengthFilter onChange={(e) => setDataLength(e.target.value)} />
161
										<SearchInput onChange={(e) => setSearch(e.target.value)} />
162
									</div>
163
								</Card.Header>
164
								<Card.Body>
11268 stevensc 165
									<div className="table-responsive">
15290 stevensc 166
										<Table
167
											data={items}
168
											headers={headers}
15292 stevensc 169
											setData={setData}
15298 stevensc 170
										>
15302 stevensc 171
											{row}
15298 stevensc 172
										</Table>
11268 stevensc 173
									</div>
11264 stevensc 174
									<div className='row justify-content-between align-items-center'>
175
										<p className='mb-0'>
12712 stevensc 176
											{`Mostrando registros del ${startItem} al ${lastItem} de un total de ${total} registros`}
11264 stevensc 177
										</p>
178
										<TablePagination
12326 stevensc 179
											onDecrement={() => setPages({ ...pages, current: pages.current - 1 })}
12325 stevensc 180
											onIncrement={() => setPages({ ...pages, current: pages.current + 1 })}
11264 stevensc 181
											totalPages={pages.last}
182
											currentPage={pages.current}
183
										/>
184
									</div>
185
								</Card.Body>
186
							</Card>
187
						</div>
188
					</div >
189
				</div >
190
			</section >
191
			<DeleteModal
192
				url={deleteLink}
193
				isOpen={showDeleteModal}
194
				closeModal={() => setShowDeleteModal(false)}
195
				title="Esta seguro de borrar esta vacante?"
12712 stevensc 196
				onComplete={() => setItems(items.filter((item) => item.actions.link_delete !== deleteLink))}
11264 stevensc 197
				message="Vacante eliminada"
198
			/>
199
		</>
200
	)
9489 stevensc 201
}
202
export default MainView