Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11265 | 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 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>
    )
}