Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15303 | Rev 15310 | 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 = {} }) => {
15304 stevensc 38
 
11264 stevensc 39
		axios.get(url, { params: { ...params } })
40
			.then(({ data }) => {
41
				if (!data.success) {
42
					dispatch(addNotification({
14838 stevensc 43
						style: 'danger',
11264 stevensc 44
						msg: 'Ha ocurrido un error'
45
					}))
46
				}
9502 stevensc 47
 
12712 stevensc 48
				setItems(data.data.items)
49
				setTotal(data.data.total)
11264 stevensc 50
				setPages({ ...pages, last: Math.ceil(data.data.total / dataLength) })
51
			})
52
			.catch(() => dispatch(addNotification({
14838 stevensc 53
				style: 'danger',
11264 stevensc 54
				msg: 'Ha ocurrido un error'
55
			})))
56
	}
9502 stevensc 57
 
11264 stevensc 58
	useEffect(() => {
59
		getData({
60
			url: table_link,
61
			params: {
62
				search: search,
63
				length: dataLength,
12374 stevensc 64
				start: pages.current
11264 stevensc 65
			}
66
		})
67
	}, [search, dataLength, pages.current])
9502 stevensc 68
 
12373 stevensc 69
	useEffect(() => {
70
		if (pages.current > 1) {
71
			setStartItem((dataLength * (pages.current - 1)) + 1)
72
		} else {
73
			setStartItem(1)
74
		}
75
	}, [pages.current])
76
 
77
	useEffect(() => {
12712 stevensc 78
		if (items) {
12373 stevensc 79
			if (startItem > 1) {
12712 stevensc 80
				setLastItem(startItem + (items.length - 1))
12373 stevensc 81
			} else {
12712 stevensc 82
				setLastItem(items.length)
12373 stevensc 83
			}
84
		}
12712 stevensc 85
	}, [items])
12373 stevensc 86
 
11264 stevensc 87
	return (
88
		<>
89
			<section className="content">
90
				<div className="container-fluid">
91
					<div className="row">
92
						<div className="col-12">
93
							<Card>
94
								<Card.Header>
95
									<div className="row justify-content-end" style={{ gap: '10px' }}>
15103 stevensc 96
										{permisions.allowAdd &&
11268 stevensc 97
											<label
98
												className='d-flex align-items-center'
99
												onClick={() => {
100
													setActionLink(add_link)
15103 stevensc 101
													setAction('add')
11268 stevensc 102
												}}
103
												style={{ cursor: 'pointer' }}
104
											>
105
												<i className="fa fa-plus mr-2" />
106
												Agregar
107
											</label>
11264 stevensc 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
													page: pages.current
117
												}
118
											})}
119
											style={{ cursor: 'pointer' }}
120
										>
121
											<i className='fa fa-refresh mr-2' />
11268 stevensc 122
											Actualizar
11264 stevensc 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>
11268 stevensc 131
									<div className="table-responsive">
15304 stevensc 132
										<Table data={items} headers={headers} setData={setItems}>
133
											{items.map((item, index) => (
134
												<tr key={index}>
135
													<td>{item.name}</td>
136
													<td>{item.job_description}</td>
137
													<td>
138
														{item.status === 'a'
139
															? 'Activo'
140
															: 'Inactivo'
141
														}
142
													</td>
143
													<td className='d-flex' style={{ gap: '10px' }}>
144
														{permisions.allowEdit &&
145
															<i
146
																className='fa fa-pencil'
147
																onClick={() => {
148
																	setActionLink(item.actions.link_edit)
149
																	setAction('edit')
150
																}}
151
																style={{ cursor: 'pointer' }} />
152
														}
153
														{permisions.allowDelete &&
154
															<i
155
																className='fa fa-trash'
156
																onClick={() => {
157
																	setShowDeleteModal(true)
158
																	setDeleteLink(item.actions.link_delete)
159
																}}
160
																style={{ cursor: 'pointer' }} />
161
														}
162
													</td>
163
												</tr>
164
											))
165
											}
15298 stevensc 166
										</Table>
11268 stevensc 167
									</div>
11264 stevensc 168
									<div className='row justify-content-between align-items-center'>
169
										<p className='mb-0'>
12712 stevensc 170
											{`Mostrando registros del ${startItem} al ${lastItem} de un total de ${total} registros`}
11264 stevensc 171
										</p>
172
										<TablePagination
12326 stevensc 173
											onDecrement={() => setPages({ ...pages, current: pages.current - 1 })}
12325 stevensc 174
											onIncrement={() => setPages({ ...pages, current: pages.current + 1 })}
11264 stevensc 175
											totalPages={pages.last}
176
											currentPage={pages.current}
177
										/>
178
									</div>
179
								</Card.Body>
180
							</Card>
181
						</div>
182
					</div >
183
				</div >
184
			</section >
185
			<DeleteModal
186
				url={deleteLink}
187
				isOpen={showDeleteModal}
188
				closeModal={() => setShowDeleteModal(false)}
189
				title="Esta seguro de borrar esta vacante?"
12712 stevensc 190
				onComplete={() => setItems(items.filter((item) => item.actions.link_delete !== deleteLink))}
11264 stevensc 191
				message="Vacante eliminada"
192
			/>
193
		</>
194
	)
9489 stevensc 195
}
196
export default MainView