Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15314 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
15310 stevensc 1
/* eslint-disable no-mixed-spaces-and-tabs */
2
import React from 'react'
15314 stevensc 3
import { useEffect, useState, useCallback } from 'react'
15310 stevensc 4
 
15314 stevensc 5
const sortData = ({ tableData, sortKey, reverse }) => {
6
	let sortedData
7
 
8
	if (!sortKey) return tableData
9
 
10
	sortedData = tableData.sort((a, b) => {
11
		if (typeof a[sortKey] === 'string') {
12
			return a[sortKey].toLowerCase() < b[sortKey].toLowerCase() && -1
13
		}
14
		return a[sortKey] - b[sortKey]
15
	})
16
 
15315 stevensc 17
	if (!reverse) return sortedData.reverse()
15314 stevensc 18
 
19
	return sortedData
20
}
21
 
22
const SortButton = ({ reverse, columnKey, sortKey, onClick }) => {
15310 stevensc 23
	return (
24
		<button onClick={onClick} className="btn p-0">
15314 stevensc 25
			{
26
				(sortKey === columnKey) && reverse
15315 stevensc 27
					? <i className='fa fa-angle-up ml-2' />
28
					: <i className='fa fa-angle-down ml-2' />
15314 stevensc 29
			}
15310 stevensc 30
		</button>
31
	)
32
}
33
 
15314 stevensc 34
const Table = ({ data = [], headers, setData, children }) => {
15310 stevensc 35
 
36
	const [sortKey, setSortKey] = useState('name')
15314 stevensc 37
	const [reverse, setReverse] = useState(false)
15310 stevensc 38
 
15314 stevensc 39
	const sortedData = useCallback(
40
		() => sortData({ tableData: data, sortKey, reverse: reverse }),
41
		[data, sortKey, reverse]
42
	)
43
 
44
	const changeSort = (key) => {
45
		setReverse(!reverse)
46
		setSortKey(key)
47
	}
48
 
49
	useEffect(() => {
50
		setData(sortedData())
51
	}, [sortKey, reverse])
52
 
15310 stevensc 53
	return (
54
		<table className="table table-hover my-table w-100">
55
			<thead>
56
				<tr>
57
					{headers.map((row) =>
58
						<th key={row.key} className="text-vertical-middle">
59
							{row.label}
60
							{row.isSorteable &&
15312 stevensc 61
								<SortButton
62
									columnKey={row.key}
15314 stevensc 63
									onClick={() => changeSort(row.key)}
15312 stevensc 64
									sortKey={sortKey}
15314 stevensc 65
									reverse={reverse}
15312 stevensc 66
								/>
15310 stevensc 67
							}
68
						</th>
69
					)}
70
				</tr>
71
			</thead>
72
			<tbody>
73
				{children()}
74
			</tbody>
75
		</table >
76
	)
77
}
78
 
79
export default Table