From 90a044f93e56c36ff5dc455e19248cf181c70d4a Mon Sep 17 00:00:00 2001 From: paco Date: Thu, 17 Mar 2022 14:39:54 +0100 Subject: [PATCH] Search tags --- web/src/components/Filter/FilterSection.tsx | 4 +- web/src/components/Filter/TagsList.tsx | 54 +++++++++----- web/src/components/Filter/TagsPanel.tsx | 82 +++++++++++++++++---- 3 files changed, 106 insertions(+), 34 deletions(-) diff --git a/web/src/components/Filter/FilterSection.tsx b/web/src/components/Filter/FilterSection.tsx index 38d91f0..2778041 100644 --- a/web/src/components/Filter/FilterSection.tsx +++ b/web/src/components/Filter/FilterSection.tsx @@ -13,6 +13,7 @@ interface FilterSectionProps { children: React.ReactNode title: string active?: boolean + defaultIsOpen?: boolean onClear?: () => void } export const FilterSection = ({ @@ -20,8 +21,9 @@ export const FilterSection = ({ title, active, onClear, + defaultIsOpen = false, }: FilterSectionProps) => { - const disclosure = useDisclosure() + const disclosure = useDisclosure({ defaultIsOpen }) return ( ( @@ -77,6 +79,7 @@ const TagRow = ({ tag, tagCategory }) => { bg="white" mr={2} /> + {tag.name} @@ -88,6 +91,14 @@ const TagRow = ({ tag, tagCategory }) => { ) } +const TagCategoryIcon = ({ tagCategory }) => { + if (tagCategory.type === 'PERSON') { + return + } else { + return + } +} + const TagCategoryRow = ({ tagCategory }) => { const disclosure = useDisclosure({ defaultIsOpen: true }) @@ -123,8 +134,9 @@ const TagCategoryRow = ({ tagCategory }) => { )} - - +
+ +
{tagCategory.name} @@ -163,21 +175,25 @@ const TagCategoryRow = ({ tagCategory }) => { ) } -const TagsList = ({ tagCategorys }) => ( - - {tagCategorys.map((tagCategory) => ( - - ))} - -) +const TagsList = ({ tagCategorys }) => { + if (tagCategorys.length === 0) return
No tags
+ + return ( + + {tagCategorys.map((tagCategory) => ( + + ))} + + ) +} export { TagsList } diff --git a/web/src/components/Filter/TagsPanel.tsx b/web/src/components/Filter/TagsPanel.tsx index 813d673..ef1f28a 100644 --- a/web/src/components/Filter/TagsPanel.tsx +++ b/web/src/components/Filter/TagsPanel.tsx @@ -1,10 +1,19 @@ import { useFilterContext } from 'src/contexts/filter' import { useTagContext } from 'src/contexts/tags' -import { useMemo } from 'react' +import { useMemo, useState } from 'react' import { DefaultSpinner } from 'src/design-system' import { FilterSection } from 'src/components/Filter/FilterSection' import { APLUMode, useApluContext } from 'src/contexts/aplu' import { TagsList } from './TagsList' +import { + Box, + Flex, + IconButton, + Input, + InputGroup, + InputRightElement, +} from '@chakra-ui/react' +import { MdClear, MdSearch } from 'react-icons/md' export const TagsPanel = () => { const { selectedTagIds, clearTags } = useFilterContext() @@ -14,6 +23,7 @@ export const TagsPanel = () => { title="Tags" active={selectedTagIds.length > 0} onClear={clearTags} + defaultIsOpen={true} > @@ -24,32 +34,76 @@ const AvailableTagsPanel = () => { const { apluQuery, apluMode } = useApluContext() const { selectedTagIds } = useFilterContext() + const [searchText, setSearchText] = useState('') + const filteredTagCategorys = useMemo(() => { if (tagsQuery.loading) return [] - if (apluMode === APLUMode.ALL) return tagsQuery.data.tagCategorys + if (apluMode === APLUMode.FILTER && apluQuery.loading) return [] + + function filterTag(tag) { + let keep = false + + if (apluMode === APLUMode.ALL) { + keep = true + } else { + if (selectedTagIds.indexOf(tag.id) !== -1) keep = true + if ( + apluQuery.data.attributesFromFilter.tags.findIndex( + (t) => t.id === tag.id + ) !== -1 + ) + keep = true + } - if (apluQuery.loading) return [] + if (keep && searchText) { + if (!tag.name.toLowerCase().includes(searchText.toLowerCase())) + keep = false + } + + return keep + } return tagsQuery.data.tagCategorys .map((tagCategory) => { return { ...tagCategory, - tags: tagCategory.tags.filter((tag) => { - return ( - selectedTagIds.indexOf(tag.id) !== -1 || - apluQuery.data.attributesFromFilter.tags.findIndex( - (t) => t.id === tag.id - ) !== -1 - ) - }), + tags: tagCategory.tags.filter(filterTag), } }) - .filter((tagCategory) => tagCategory.tags.length > 0) - }, [selectedTagIds, apluQuery, tagsQuery]) + .filter((tagCategory) => APLUMode.ALL || tagCategory.tags.length > 0) + }, [apluMode, selectedTagIds, apluQuery, tagsQuery, searchText]) if (tagsQuery.loading) { return } - return + return ( + + + + e.code === 'Escape' && setSearchText('')} + onChange={(e) => setSearchText(e.target.value)} + value={searchText} + /> + + {searchText.length > 0 ? ( + } + size="sm" + onClick={() => setSearchText('')} + /> + ) : ( + + )} + + + + + + ) }