Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11265 | 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 sortedData

        if (!sortKey) return tableData

        if (sortKey !== 'name') {
                sortedData = tableData.sort((a, b) => {
                        return a[sortKey] - b[sortKey]
                })
        } else {
                sortedData = tableData.sort((a, b) => {
                        return a[sortKey] > b[sortKey] ? 1 : -1
                })
        }

        if (reverse) {
                return sortedData.reverse()
        }

        return sortedData
}

const SortButton = ({ sortOrder, columnKey, sortKey, onClick }) => {
        return (
                <button onClick={onClick} className="btn">
                        {
                                (sortKey === columnKey) && (sortOrder === 'desc')
                                        ? <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 [sortOrder, setSortOrder] = useState('ascn')

        const sortedData = useCallback(
                () => sortData({ tableData: data, sortKey, reverse: sortOrder === 'desc' }),
                [data, sortKey, sortOrder]
        )

        const changeSort = (key) => {
                setSortOrder(sortOrder === 'ascn' ? 'desc' : 'ascn')

                setSortKey(key)
        }

        useEffect(() => {
                setData(prev => ({ ...prev, items: sortedData() }))
        }, [sortKey, sortOrder])

        return (
                <table className="table table-hover dataTable no-footer dtr-inline">
                        <thead>
                                <tr>
                                        {
                                                headers.map((row) => (
                                                        <th key={row.key} className="text-vertical-middle">
                                                                {row.label}
                                                                {
                                                                        row.isSorteable
                                    &&
                                    <SortButton
                                        columnKey={row.key}
                                        onClick={() => changeSort(row.key)}
                                        {...{
                                                sortOrder,
                                                sortKey,
                                        }}
                                    />
                                                                }
                                                        </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">
                                <button
                                        type='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">
                                <button
                                        type='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
                        <select
                                className="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' />
                        <input
                                type="search"
                                className="form-control form-control-sm" placeholder=""
                                onChange={onChange}
                        />
                </label>
        )
}