Neovici/cosmoz-omnitable

View on GitHub
lib/use-omnitable.js

Summary

Maintainability
B
4 hrs
Test Coverage
A
97%
import { useState } from '@pionjs/pion';
import { useProcessedItems } from './use-processed-items';
import { useFastLayout } from './use-fast-layout';
import { useSettings } from './settings';
import { useSortAndGroupOptions } from './use-sort-and-group-options';
import { usePublicInterface } from './use-public-interface';
import { useHeader } from './use-header';
import { useList } from './use-list';
import { useFooter } from './use-footer';

// eslint-disable-next-line max-lines-per-function
export const useOmnitable = (host) => {
    const {
            hashParam,
            settingsId,
            data,
            resizeSpeedFactor,
            noLocal,
            noLocalSort = noLocal,
            noLocalFilter = noLocal,
            error,
            rowPartFn,
        } = host,
        settingS = useSettings({ settingsId, host }),
        { settings, setSettings, columns, resetRef } = settingS,
        sortAndGroupOptions = useSortAndGroupOptions(
            columns,
            hashParam,
            settings,
            setSettings,
            resetRef,
        ),
        // TODO: drop filterFunctions
        { processedItems, visibleData, filters, setFilterState, filterFunctions } =
            useProcessedItems({
                data,
                columns,
                hashParam,
                sortAndGroupOptions,
                noLocalSort,
                noLocalFilter,
            }),
        { collapsedColumns, miniColumns } = useFastLayout({
            host,
            columns,
            settings,
            setSettings,
            resizeSpeedFactor,
            sortAndGroupOptions,
        }),
        dataIsValid = data && Array.isArray(data) && data.length > 0,
        [selectedItems, setSelectedItems] = useState([]);

    usePublicInterface({
        host,
        visibleData,
        sortedFilteredGroupedItems: processedItems,
        columns,
        filters,
        setFilterState,
        selectedItems,
        ...sortAndGroupOptions,
    });

    return {
        header: useHeader({
            host,
            selectedItems,
            sortAndGroupOptions,
            dataIsValid,
            data,
            columns,
            filters,
            collapsedColumns,
            settings,
            filterFunctions,
            settingS,
            setFilterState,
            hideSelectAll: host.hideSelectAll === true,
        }),
        list: useList({
            host,
            error,
            dataIsValid,
            processedItems,
            setSelectedItems,
            columns,
            collapsedColumns,
            miniColumns,
            sortAndGroupOptions,
            rowPartFn,
        }),
        footer: useFooter({
            host,
            selectedItems,
            columns,
        }),
    };
};