Rev 15295 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useCallback, useState } from 'react'import { useEffect } from 'react'const sortData = ({ tableData, sortKey, reverse }) => {let sortedDataif (!sortKey) return tableDatasortedData = tableData.sort((a, b) => a[sortKey].toLowerCase() < b[sortKey].toLowerCase() && -1)if (reverse) {sortedData.reverse()}return sortedData}const SortButton = ({ reverse, columnKey, sortKey, onClick }) => {return (<button onClick={onClick} className="btn p-0 ml-2">{(sortKey === columnKey) && reverse? <i className='fa fa-angle-up' />: <i className='fa fa-angle-down' />}</button>)}export const Table = ({ data = [], headers, setData, children }) => {const [sortKey, setSortKey] = useState('name')const [reverse, setReverse] = useState(false)const sortedData = useCallback(() => sortData({ tableData: data, sortKey: sortKey, reverse: reverse }), [data, sortKey, reverse])const changeSort = (key) => {setReverse(!reverse)setSortKey(key)}useEffect(() => {setData(sortedData())setReverse(reverse)}, [sortKey, reverse])return (<table className="table table-hover my-table w-100"><thead><tr>{headers.map((row) =><th key={row.key} className="text-vertical-middle">{row.label}{row.isSorteable &&<SortButtoncolumnKey={row.key}onClick={() => changeSort(row.key)}sortKey={sortKey}reverse={reverse}/>}</th>)}</tr></thead><tbody>{children}</tbody></table >)}export const TablePagination = ({ onDecrement, onIncrement, currentPage, totalPages }) => {return (<ul className="pagination mb-0"><li className={`paginate_button page-item previous ${currentPage === 1 ? 'disabled' : ''}`}><buttontype='button'className="page-link"disabled={currentPage === 1}onClick={onDecrement}><i className='fa fa-angle-left' /></button></li><li className="paginate_button page-item"><button className="page-link">{currentPage}</button></li><li className={`paginate_button page-item next ${currentPage === totalPages ? 'disabled' : ''}`}><buttontype='button'className="page-link"disabled={currentPage === totalPages}onClick={onIncrement}><i className='fa fa-angle-right' /></button></li></ul>)}Table.Footer = function TableFooter({ children, startItem, lastItem, total }) {return (<div className="row"><div className="col-sm-12 col-md-5"><div className="dataTables_info" >{`Mostrando registros del ${startItem || 0} al ${lastItem || 0} de un total de ${total || 0} registros`}</div></div><div className="col-sm-12 col-md-7"><div className="d-flex justify-content-end">{children}</div></div></div>)}export function LengthFilter({ onChange }) {const lengthValues = ['10', '25', '50', '100']return (<label className='d-inline-flex'>Mostrar<selectclassName="custom-select custom-select-sm form-control form-control-sm"onChange={onChange}>{lengthValues.map((value, index) => (<option key={index} value={value}>{value}</option>))}</select>registros</label>)}export function SearchInput({ onChange }) {return (<label className='d-inline-flex align-items-center'><i className='fa fa-search mr-2' /><inputtype="search"className="form-control form-control-sm" placeholder=""onChange={onChange}/></label>)}