From 4e8aae4f9ef57e09742cff0cfe6bd468fb7dcb6e Mon Sep 17 00:00:00 2001 From: Pablo Lara Date: Fri, 6 Sep 2024 07:59:35 +0200 Subject: [PATCH] feat: add new component for search input --- components/filters/CustomSearchInput.tsx | 61 ++++++++++++ components/filters/FilterControls.tsx | 12 +-- .../providers/table/FilterColumnTable.tsx | 99 +++---------------- store/ui/ui-store.ts | 2 +- 4 files changed, 82 insertions(+), 92 deletions(-) create mode 100644 components/filters/CustomSearchInput.tsx diff --git a/components/filters/CustomSearchInput.tsx b/components/filters/CustomSearchInput.tsx new file mode 100644 index 0000000000..b3a827abb7 --- /dev/null +++ b/components/filters/CustomSearchInput.tsx @@ -0,0 +1,61 @@ +import { Input } from "@nextui-org/react"; +import { XCircle } from "lucide-react"; +import { useRouter, useSearchParams } from "next/navigation"; +import React, { useCallback, useEffect, useState } from "react"; + +import { useDebounce } from "../../hooks/useDebounce"; + +export const CustomSearchInput: React.FC = () => { + const router = useRouter(); + const searchParams = useSearchParams(); + const [searchQuery, setSearchQuery] = useState(() => { + return searchParams.get("filter[search]") || ""; + }); + const debouncedSearchQuery = useDebounce(searchQuery, 300); + + const applySearch = useCallback( + (query: string) => { + const params = new URLSearchParams(searchParams.toString()); + if (query) { + params.set("filter[search]", query); + } else { + params.delete("filter[search]"); + } + router.replace(`?${params.toString()}`, { scroll: false }); + }, + [router, searchParams], + ); + + const clearIconSearch = () => { + setSearchQuery(""); + applySearch(""); + }; + + useEffect(() => { + applySearch(debouncedSearchQuery); + }, [debouncedSearchQuery, applySearch]); + + return ( + setSearchQuery(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + applySearch(searchQuery); + } + }} + endContent={ + searchQuery && ( + + ) + } + size="sm" + /> + ); +}; diff --git a/components/filters/FilterControls.tsx b/components/filters/FilterControls.tsx index ea4bf5dace..a1ddc3d011 100644 --- a/components/filters/FilterControls.tsx +++ b/components/filters/FilterControls.tsx @@ -2,30 +2,26 @@ import { Button } from "@nextui-org/react"; import { useRouter, useSearchParams } from "next/navigation"; -import React from "react"; -import { useCallback } from "react"; +import React, { useCallback } from "react"; -// import { SearchParamsProps } from "../../types/components"; import { CustomAccountSelection } from "./CustomAccountSelection"; import { CustomCheckboxMutedFindings } from "./CustomCheckboxMutedFindings"; import { CustomDatePicker } from "./CustomDatePicker"; +import { CustomSearchInput } from "./CustomSearchInput"; import { CustomSelectProvider } from "./CustomSelectProvider"; interface FilterControlsProps { mutedFindings?: boolean; - // searchParams: SearchParamsProps; } export const FilterControls: React.FC = ({ mutedFindings = true, - // searchParams, }) => { const router = useRouter(); const searchParams = useSearchParams(); const clearAllFilters = useCallback(() => { const params = new URLSearchParams(searchParams.toString()); - // Remove all filter parameters Array.from(params.keys()).forEach((key) => { if (key.startsWith("filter[")) { params.delete(key); @@ -33,14 +29,16 @@ export const FilterControls: React.FC = ({ }); router.push(`?${params.toString()}`, { scroll: false }); }, [router, searchParams]); + return (
+ - ) - } - /> -
-
- {filters.flatMap(({ key, values }) => - values.map((value) => ( - - )), - )} - -
+
+ {filters.flatMap(({ key, values }) => + values.map((value) => ( + + )), + )}
); } diff --git a/store/ui/ui-store.ts b/store/ui/ui-store.ts index b47d474c94..db9e8e6674 100644 --- a/store/ui/ui-store.ts +++ b/store/ui/ui-store.ts @@ -11,7 +11,7 @@ interface SidebarStoreState { export const useUIStore = create()( persist( (set) => ({ - isSideMenuOpen: true, + isSideMenuOpen: false, openSideMenu: () => set({ isSideMenuOpen: true }), closeSideMenu: () => set({ isSideMenuOpen: false }), }),