import * as React from "react"; import Checkbox from "@material-ui/core/Checkbox"; import Table from "@material-ui/core/Table"; import TableBody from "@material-ui/core/TableBody"; import TableCell from "@material-ui/core/TableCell"; import TableHead from "@material-ui/core/TableHead"; import TableRow from "@material-ui/core/TableRow"; import TablePagination from "@material-ui/core/TablePagination"; import moment from "moment"; import { DataCard, FilterGroup, AlphabetFilter, BulkActionsMenu, BulkSelectedActions, EmptyStateComponent, } from "./components"; import { DisplayItemsProps, DisplayItemsPropsType, DisplayItemsFieldDataType, } from "./components/types"; import { Button, Icon } from "@material-ui/core"; /** * A module for displaying and filtering data with tools for hooking actions into the resulting records */ export const DisplayItems: React.FC = ({ name, type, data, fields, loading, loadingComponent, title, bulkActions, bulkActionsComponent, showbulkActions, dataItemActions, dataItemComponent, showCheckboxes, filterComponent, showFilterControls, currentFilter, showAlphabetFilter, emptyStateComponent, tags, showTags, showHeaders, showPagination, paginationSettings, enableSorting, onCreate, onUpdate, onDelete, onSelect, onSelectAll, onRowActionSelect, onFilterChange, onFilterSave, onSort, onExport, onImport, onBulkActionSelect, onPaginationChange, }: DisplayItemsProps) => { const [selectedItems, setSelectedItems] = React.useState([]); /** * Triggered when page change occurs * @params */ const goToPage = (): void => {}; /** * Triggered when pagination rows per page option changes * @params */ const setRowsPerPage = (): void => {}; /** * CSV download of the active filtered record set * @params */ const exportData = (): void => {}; /** * Method to select all of the items in the current view or filter * @params */ const selectAll = (checked: boolean) => { if (checked) setSelectedItems([...data.map((i, k) => k)]); if (!checked) setSelectedItems([]); }; /** * Method to select one of the items in the current view or filter * @params */ const selectItem = (i: any, checked: boolean): void => { if (checked) setSelectedItems([...selectedItems, i]); else setSelectedItems(selectedItems.filter((itm) => itm !== i)); }; const handleFilterChange = (filter: any): void => { const doOwnFilter: boolean = onFilterChange(filter); if (doOwnFilter) { // do local filter console.log("Filter"); } }; // Show the default loading component (or one provided) if we're loading if (loading) { if (loadingComponent) return (
{loadingComponent}
); else return
Loading...
; } // Show the default empty state component (or the one provided) if there is no data to show if (!loading && !data.length) { if (emptyStateComponent) return (
{emptyStateComponent}
); else return (
); } const displayFieldValue = (row, itm) => { if (itm.type === DisplayItemsFieldDataType.DATE) return moment(row[itm.name]).format("MMM Do, YYYY"); if (itm.type === DisplayItemsFieldDataType.BOOLEAN) return row[itm.name] ? "Yes" : "No"; return row[itm.name].toString(); }; return (
{showAlphabetFilter && ( onFilterChange({ allFields: ch, condition: "contains" }) } /> )} {title &&

{title}

} {showFilterControls && filterComponent && showHeaders && ( {typeof filterComponent === "function" ? filterComponent(currentFilter) : filterComponent} )} {showFilterControls && !filterComponent && showHeaders && ( )} {enableSorting && showHeaders && ( )} {data && type === DisplayItemsPropsType.CARDS && (
{data.map((itm, k) => (
  • {showCheckboxes && ( , checked: boolean ): void => selectItem(k, checked)} data-testid="DisplayItems-Checkbox" checked={selectedItems.indexOf(k) > -1} /> )} {dataItemComponent ? ( {typeof dataItemComponent === "function" ? dataItemComponent(itm) : dataItemComponent} ) : ( )}
  • ))}
    )} {data && type === DisplayItemsPropsType.TABLE && ( {showCheckboxes && ( , checked: boolean ): void => selectAll(checked)} data-testid="DisplayItems-Checkbox" /> )} {fields.map((itm, colKey) => { return ( {itm.label} ); })} {data.map((row, key) => { return ( {showCheckboxes && ( , checked: boolean ): void => selectItem(key, checked)} data-testid="DisplayItems-Checkbox" checked={selectedItems.indexOf(key) > -1} /> )} {fields.map((itm, cellKey) => { return ( {displayFieldValue(row, itm)} ); })} ); })}
    )} {showPagination && ( Pagination Controls Here )} {selectedItems.length > 0 && !bulkActionsComponent && ( selectedItems.indexOf(k) > -1)} showActionButtons={Boolean(bulkActions.length)} actionButtons={bulkActions} /> )} {selectedItems.length > 0 && bulkActionsComponent && ( {typeof bulkActionsComponent === "function" ? bulkActionsComponent({ data: data.filter((itm, k) => selectedItems.indexOf(k) > -1), }) : bulkActionsComponent} )}
    ); }; DisplayItems.defaultProps = { type: DisplayItemsPropsType.CARDS, loading: false, showbulkActions: false, showCheckboxes: false, showFilterControls: true, showAlphabetFilter: false, showTags: false, showHeaders: true, showPagination: false, enableSorting: false, }; export default DisplayItems;