Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
10061 stevensc 1
import React, { useCallback, useState } from 'react'
10545 stevensc 2
import { useEffect } from 'react'
10061 stevensc 3
 
4
const sortData = ({ tableData, sortKey, reverse }) => {
10545 stevensc 5
	let sortedData
10061 stevensc 6
 
10545 stevensc 7
	if (!sortKey) return tableData
10061 stevensc 8
 
10545 stevensc 9
	if (sortKey !== 'name') {
10
		sortedData = tableData.sort((a, b) => {
11
			return a[sortKey] - b[sortKey]
12
		})
13
	} else {
14
		sortedData = tableData.sort((a, b) => {
15
			return a[sortKey] > b[sortKey] ? 1 : -1
16
		})
17
	}
10061 stevensc 18
 
10545 stevensc 19
	if (reverse) {
20
		return sortedData.reverse()
21
	}
10061 stevensc 22
 
10545 stevensc 23
	return sortedData
10061 stevensc 24
}
25
 
26
const SortButton = ({ sortOrder, columnKey, sortKey, onClick }) => {
10545 stevensc 27
	return (
11418 stevensc 28
		<button onClick={onClick} className="btn p-0">
10545 stevensc 29
			{
30
				(sortKey === columnKey) && (sortOrder === 'desc')
31
					? <i className='fa fa-angle-up' />
32
					: <i className='fa fa-angle-down' />
33
			}
34
		</button>
35
	)
10061 stevensc 36
}
37
 
38
export const Table = ({ data = [], headers, setData, children }) => {
39
 
10545 stevensc 40
	const [sortKey, setSortKey] = useState('name')
41
	const [sortOrder, setSortOrder] = useState('ascn')
10061 stevensc 42
 
10545 stevensc 43
	const sortedData = useCallback(
44
		() => sortData({ tableData: data, sortKey, reverse: sortOrder === 'desc' }),
45
		[data, sortKey, sortOrder]
46
	)
10061 stevensc 47
 
10545 stevensc 48
	const changeSort = (key) => {
49
		setSortOrder(sortOrder === 'ascn' ? 'desc' : 'ascn')
10061 stevensc 50
 
10545 stevensc 51
		setSortKey(key)
52
	}
10061 stevensc 53
 
10545 stevensc 54
	useEffect(() => {
55
		setData(prev => ({ ...prev, items: sortedData() }))
56
	}, [sortKey, sortOrder])
10061 stevensc 57
 
10545 stevensc 58
	return (
11442 stevensc 59
		<table className="table table-hover my-table w-100">
10545 stevensc 60
			<thead>
61
				<tr>
62
					{
63
						headers.map((row) => (
64
							<th key={row.key} className="text-vertical-middle">
65
								{row.label}
66
								{
67
									row.isSorteable
11418 stevensc 68
									&&
69
									<SortButton columnKey={row.key} onClick={() => changeSort(row.key)} {...{ sortOrder, sortKey, }} />
10545 stevensc 70
								}
71
							</th>
72
						))
73
					}
74
				</tr>
75
			</thead>
76
			<tbody>
77
				{children}
78
			</tbody>
79
		</table >
80
	)
10061 stevensc 81
}
82
 
83
export const TablePagination = ({ onDecrement, onIncrement, currentPage, totalPages }) => {
12395 stevensc 84
 
85
	const maxPages = 5 > totalPages ? totalPages : 5
12442 stevensc 86
	const [pages, setPages] = useState([])
12417 stevensc 87
	let nextPage = currentPage + 1
88
	let previousPage = currentPage - 1
89
 
12420 stevensc 90
	useEffect(() => {
12450 stevensc 91
		while (pages.length < maxPages) {
92
			const pagesArray = [currentPage]
93
 
12420 stevensc 94
			if (previousPage > 0) {
12450 stevensc 95
				pagesArray.unshift(previousPage)
12420 stevensc 96
			}
97
			if (nextPage <= totalPages) {
12450 stevensc 98
				pagesArray.push(nextPage)
12420 stevensc 99
			}
12404 stevensc 100
 
12450 stevensc 101
			return setPages(pagesArray)
102
		}
103
 
12420 stevensc 104
	}, [currentPage, totalPages])
105
 
10545 stevensc 106
	return (
107
		<ul className="pagination mb-0">
12404 stevensc 108
			<li className="paginate_button page-item previous disabled">
10545 stevensc 109
				<button
110
					type='button'
111
					className="page-link"
112
					disabled={currentPage === 1}
113
					onClick={onDecrement}
114
				>
115
					<i className='fa fa-angle-left' />
116
				</button>
117
			</li>
12396 stevensc 118
			{
12405 stevensc 119
				pages.length > 0
120
				&&
12396 stevensc 121
				pages.map((page, index) => (
122
					<li key={index} className="paginate_button page-item">
123
						<button className="page-link">
12395 stevensc 124
							{page}
125
						</button>
12396 stevensc 126
					</li>
127
				))
128
			}
10545 stevensc 129
			<li className="paginate_button page-item next">
130
				<button
131
					type='button'
132
					className="page-link"
133
					disabled={currentPage === totalPages}
134
					onClick={onIncrement}
135
				>
136
					<i className='fa fa-angle-right' />
137
				</button>
138
			</li>
139
		</ul>
140
	)
10061 stevensc 141
}
142
 
143
Table.Footer = function TableFooter({ children, startItem, lastItem, total }) {
10545 stevensc 144
	return (
145
		<div className="row">
146
			<div className="col-sm-12 col-md-5">
147
				<div className="dataTables_info" >
148
					{`Mostrando registros del ${startItem || 0} al ${lastItem || 0} de un total de ${total || 0} registros`}
149
				</div>
150
			</div>
151
			<div className="col-sm-12 col-md-7">
152
				<div className="d-flex justify-content-end">
153
					{children}
154
				</div>
155
			</div>
156
		</div>
157
	)
10061 stevensc 158
}
159
 
160
export function LengthFilter({ onChange }) {
161
 
10545 stevensc 162
	const lengthValues = ['10', '25', '50', '100']
10061 stevensc 163
 
10545 stevensc 164
	return (
165
		<label className='d-inline-flex'>
11418 stevensc 166
			Mostrar
10545 stevensc 167
			<select
168
				className="custom-select custom-select-sm form-control form-control-sm"
169
				onChange={onChange}
170
			>
171
				{
172
					lengthValues.map((value, index) => (
173
						<option key={index} value={value}>{value}</option>
174
					))
175
				}
176
			</select>
11418 stevensc 177
			registros
10545 stevensc 178
		</label>
179
	)
10061 stevensc 180
}
181
 
182
export function SearchInput({ onChange }) {
183
 
10545 stevensc 184
	return (
185
		<label className='d-inline-flex align-items-center'>
186
			<i className='fa fa-search mr-2' />
187
			<input
188
				type="search"
189
				className="form-control form-control-sm" placeholder=""
190
				onChange={onChange}
191
			/>
192
		</label>
193
	)
10061 stevensc 194
}