@hitachivantara/uikit-react-core
Version:
Core React components for the NEXT Design System.
95 lines (94 loc) • 3.31 kB
JavaScript
import { useCallback } from "react";
import { ensurePluginOrder, useGetLatest, makePropGetter } from "react-table";
const useInstanceHook = (instance) => {
const { plugins, page, toggleAllPageRowsSelected, toggleAllRowsSelected } = instance;
ensurePluginOrder(plugins, ["useHvRowSelection"], "useHvBulkActions");
const getInstance = useGetLatest(instance);
const getHvBulkActionsProps = makePropGetter(
instance.getHooks().getHvBulkActionsProps,
{
instance: getInstance()
}
);
const isPaginated = !!page;
const invertedToggleAllRowsSelected = useCallback(() => {
if (!isPaginated) return toggleAllRowsSelected();
const {
aditivePageBulkSelection: additivePageBulkSelection,
subtractivePageBulkDeselection,
isNoRowsSelected,
isNoPageRowsSelected,
isAllSelectablePageRowsSelected,
isAllSelectablePageRowsUnselected
} = getInstance();
if (additivePageBulkSelection && subtractivePageBulkDeselection) {
return toggleAllPageRowsSelected(!isAllSelectablePageRowsSelected);
}
if (additivePageBulkSelection && !subtractivePageBulkDeselection) {
if (!isAllSelectablePageRowsSelected) {
return toggleAllPageRowsSelected(true);
}
return toggleAllRowsSelected(false);
}
if (!additivePageBulkSelection && !subtractivePageBulkDeselection) {
if (isNoRowsSelected) {
return toggleAllPageRowsSelected(true);
}
return toggleAllRowsSelected(false);
}
if (!additivePageBulkSelection && subtractivePageBulkDeselection) {
if (isNoRowsSelected) {
return toggleAllPageRowsSelected(true);
}
if (!isAllSelectablePageRowsUnselected) {
return toggleAllPageRowsSelected(false);
}
if (!isNoPageRowsSelected) {
return toggleAllPageRowsSelected(false);
}
return toggleAllRowsSelected(false);
}
return toggleAllPageRowsSelected();
}, [
getInstance,
isPaginated,
toggleAllPageRowsSelected,
toggleAllRowsSelected
]);
Object.assign(instance, {
getHvBulkActionsProps,
invertedToggleAllRowsSelected,
aditivePageBulkSelection: !!instance.aditivePageBulkSelection,
subtractivePageBulkDeselection: !!instance.subtractivePageBulkDeselection
});
};
const defaultGetHvBulkActionsProps = (props, { instance }) => {
const {
rows,
initialRows,
selectedFlatRows,
state: { selectedRowIds = {} } = {},
page,
toggleAllRowsSelected,
invertedToggleAllRowsSelected,
showSelectAllPages = true,
applyToggleAllRowsSelectedToPrefilteredRows
} = instance;
const isPaginated = !!page;
const nextProps = {
numTotal: applyToggleAllRowsSelectedToPrefilteredRows ? initialRows.length : rows.length,
numSelected: applyToggleAllRowsSelectedToPrefilteredRows ? Object.keys(selectedRowIds).length : selectedFlatRows.length,
showSelectAllPages: showSelectAllPages && isPaginated,
onSelectAll: invertedToggleAllRowsSelected,
onSelectAllPages: toggleAllRowsSelected
};
return [props, nextProps];
};
const useHvBulkActions = (hooks) => {
hooks.getHvBulkActionsProps = [defaultGetHvBulkActionsProps];
hooks.useInstance.push(useInstanceHook);
};
useHvBulkActions.pluginName = "useHvBulkActions";
export {
useHvBulkActions
};