import { memo, useCallback, useMemo } from "react"; import { InputGroup, NonIdealState } from "@blueprintjs/core"; import { ListWrapper, Pagination, Toolbar } from "Components/DataList"; import FilterSelect from "Components/DataList/FilterSelect"; import { SemanticGuide } from "Components/Guide"; import SemanticItem from "./SemanticItem"; import { Filter, useFilterList, usePagination, useText } from "@hooks"; import { ShowTypeSemantic } from "../types"; import { CustomClasses } from "../../../constants"; import { searchEngine } from "../../../utils"; import { AsBoolean } from "Types/helpers"; import { SEnrichedItem, isSBacklink } from "Types/transforms"; const itemsPerPage = 30; const SEMANTIC_FILTER_OPTIONS: Filter[] = [ { active: false, label: "In Library", value: "library" }, { active: false, label: "Highly Influential", value: "influential" }, { active: false, label: "Has DOI", value: "doi" } ]; function filter(items: SEnrichedItem[], filterList: Filter[]){ let arr = [...items]; const activeFilters = filterList.filter(op => op.active == true); activeFilters.forEach(op => { switch(op.value){ case "library": arr = arr.filter(isSBacklink); break; case "influential": arr = arr.filter(item => item.isInfluential); break; case "doi": arr = arr.filter(item => item.doi); break; default: window.zoteroRoam?.warn?.({ origin: "Interface", message: `Filter not recognized: ${op.value}`, context: { ...op } }); } }); return arr; } function search(query: string, items: SEnrichedItem[]){ return items.filter(it => searchEngine( query, it._multiField, { any_case: true, match: "partial", search_compounds: true, word_order: "loose" } )); } type ItemProps = { item: SEnrichedItem, selectProps: { handleRemove: (value: SEnrichedItem) => void, handleSelect: (value: SEnrichedItem) => void, items: SEnrichedItem[], resetImport: () => void }, type: ShowTypeSemantic }; function Item({ item, selectProps, type }: ItemProps){ const { handleRemove, handleSelect, items: selectedItems } = selectProps; const isSelected = selectedItems.findIndex(i => i.doi == item.doi || i.url == item.url) >= 0; return ; } export type SemanticPaginationProps = { items: SEnrichedItem[], } & Pick; const SemanticPagination = memo(function SemanticPagination(props){ const { items, selectProps, type } = props; const { currentPage, pageLimits, setCurrentPage } = usePagination({ itemsPerPage }); const [query, onQueryChange] = useText(""); const [filterList, toggleFilter] = useFilterList(SEMANTIC_FILTER_OPTIONS); const handleFilter = useCallback((value) => { toggleFilter(value); setCurrentPage(1); }, [setCurrentPage, toggleFilter]); const filteredItems = useMemo(() => filter(items, filterList), [filterList, items]); const queriedItems = useMemo(() => !query ? filteredItems : search(query, filteredItems), [filteredItems, query]); return ( {queriedItems.length == 0 ? : {queriedItems .slice(...pageLimits) .map(el => )} } ); }); export default SemanticPagination;