import React, { useEffect, useRef, useState } from 'react'; import { useSearchUIContext, useSearchUIContextActions } from '../SearchUIContextProvider'; import { ActiveFilterButtons } from '../../../data-display/ActiveFilterButtons'; import NumberFormat from 'react-number-format'; import { FaAngleDown, FaLink, FaTable, FaThLarge } from 'react-icons/fa'; import { Wrapper as MenuWrapper, Button, Menu, MenuItem } from 'react-aria-menubutton'; import classNames from 'classnames'; import { pluralize } from '../../../data-entry/utils'; import { v4 as uuidv4 } from 'uuid'; import * as d3 from 'd3'; import { SortDropdown } from '../../SortDropdown'; import { DropdownItem } from '../../SortDropdown/SortDropdown'; import { SearchUIViewType } from '../types'; import { ColumnsMenu } from '../../DataTable/ColumnsMenu'; const componentHtmlId = uuidv4(); const getLowerResultBound = (totalResults: number, resultsPerPage: number, skip: number) => { if (totalResults === 0) { return 0; } else if (totalResults < resultsPerPage) { return 1; } else { return skip + 1; } }; const getUpperResultBound = ( totalResults: number, resultsPerPage: number, lowerResultBound: number ) => { if (totalResults < resultsPerPage) { return totalResults; } else { return lowerResultBound - 1 + resultsPerPage; } }; /** * Render information about SearchUI results as well as controls * for modifying the data in the results view. */ export const SearchUIDataHeader: React.FC = () => { const { state, query } = useSearchUIContext(); const actions = useSearchUIContextActions(); const ref = useRef(null); const [titleHover, setTitleHover] = useState(false); const [columns, setColumns] = useState(state.columns.filter((c) => !c.hidden)); const limit = query[state.limitKey] || state.defaultLimit; const skip = query[state.skipKey] || state.defaultSkip; const lowerResultBound = getLowerResultBound(state.totalResults!, limit, skip); const upperResultBound = getUpperResultBound(state.totalResults!, limit, lowerResultBound); const handlePerRowsChange = (perPage: number) => { actions.setResultsPerPage(perPage); }; const TableHeaderTitle = () => { if (state.activeFilters!.length === 0 && state.totalResults! > 0 && !state.loading) { return (
setTitleHover(true)} onMouseLeave={() => setTitleHover(false)} onClick={() => setTitleHover(false)} > All {' '} {pluralize(state.resultLabel)} {titleHover && }
); } else if ( state.activeFilters!.length > 1 || (state.activeFilters!.length === 1 && !state.loading) ) { return (
setTitleHover(true)} onMouseLeave={() => setTitleHover(false)} onClick={() => setTitleHover(false)} > {d3.format(',')(state.totalResults)} {state.totalResults === 1 && ( {state.resultLabel} matches )} {state.totalResults !== 1 && ( {pluralize(state.resultLabel)} match )} your search {titleHover && }
); } else { return (

Loading {pluralize(state.resultLabel)}...

); } }; const columnsMenu = state.view === SearchUIViewType.TABLE ? ( ) : null; const resultsPerPageOptions = [10, 15, 30, 50, 75]; const resultsPerPageMenu = (
    {resultsPerPageOptions.map((d, i) => (
  • {d}
  • ))}
); const sortMenu = state.hasSortMenu ? ( !c.hidden) .map((c) => { return { label: c.nameString, value: c.selector } as DropdownItem; })} sortField={state.sortFields && state.sortFields[0] ? state.sortFields[0] : undefined} setSortField={actions.setSortField} sortAscending={ state.sortFields && state.sortFields[0] ? state.sortFields[0].indexOf('-') !== 0 : undefined } setSortAscending={actions.setSortAscending} sortFn={actions.setSort} /> ) : null; // const viewSwitcher = state.allowViewSwitching ? ( //
//
// //
//
// //
//
// ) : null; useEffect(() => { actions.setResultsRef(ref); }, []); return (

Showing {d3.format(',')(lowerResultBound)}-{d3.format(',')(upperResultBound)}

{state.loading && ( )}
{/* {viewSwitcher} */} {/* {sortMenu} */} {columnsMenu} {/* {resultsPerPageMenu} */}
{state.activeFilters!.length > 0 && ( actions.removeFilters(params)} /> )}
); };