Proyectos de Subversion LeadersLinked - Backend

Rev

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