diff --git a/src/components/Tables/cms/CmsListFilters.tsx b/src/components/Tables/cms/CmsListFilters.tsx new file mode 100644 index 0000000..c3d8167 --- /dev/null +++ b/src/components/Tables/cms/CmsListFilters.tsx @@ -0,0 +1,70 @@ +import InputGroup from "@/components/FormElements/InputGroup"; +import { + FieldValues, + UseFormHandleSubmit, + UseFormRegister, + UseFormSetValue, + UseFormWatch, +} from "react-hook-form"; + +interface CmsListFiltersProps { + filterRegister: UseFormRegister; + setIsFilterModalOpen: (isOpen: boolean) => void; + isMutating: number; + handleFilterSubmit: UseFormHandleSubmit; + search: (data: any) => void; + watch: UseFormWatch; + setValue: UseFormSetValue; +} + +const CmsListFilters = ({ + filterRegister, + setIsFilterModalOpen, + isMutating, + handleFilterSubmit, + search, +}: CmsListFiltersProps) => { + return ( +
+ + + +
+ + +
+ + ); +}; + +export default CmsListFilters; diff --git a/src/components/Tables/cms/index.tsx b/src/components/Tables/cms/index.tsx index 7c0c7d7..c63374a 100644 --- a/src/components/Tables/cms/index.tsx +++ b/src/components/Tables/cms/index.tsx @@ -10,6 +10,8 @@ import { unixToDate } from "@/utils/shared"; import { Tooltip } from "react-tooltip"; import { TableHeader, TableRow } from "../../ui/table"; import useCmsTablePresenter from "./useCmsTablePresenter"; +import CmsListFilters from "./CmsListFilters"; +import Modal from "@/components/ui/modal"; const CmsTable = () => { const { @@ -23,10 +25,18 @@ const CmsTable = () => { onConfirmDelete, router, pathname, + isFilterModalOpen, + setIsFilterModalOpen, + filterRegister, + handleFilterSubmit, + search, + watch, + setFilterValue, + isMutating, } = useCmsTablePresenter(); return (
- + setIsFilterModalOpen(true)} /> @@ -103,6 +113,22 @@ const CmsTable = () => {
+ setIsFilterModalOpen(false)} + classNames="w-full xl:w-1/2" + showButtons={false} + > + + {isModalOpen && ( { const [isModalOpen, setIsModalOpen] = useState(false); + const [isFilterModalOpen, setIsFilterModalOpen] = useState(false); const [currentCms, setCurrentCms] = useState(null); + const [params, setParams] = useState>({}); const columns = ["row", "key", "created at", "actions"]; - const { isPending, data } = useGetCmsList(); const router = useRouter(); const pathname = usePathname(); + const searchParams = useSearchParams(); + const isMutating = useIsMutating(); + + const { + register: filterRegister, + handleSubmit: handleFilterSubmit, + reset: filterFormReset, + watch, + setValue: setFilterValue, + } = useForm(); + + useEffect(() => { + const newParams: Record = {}; + for (const [key, value] of searchParams.entries()) { + newParams[key] = value; + } + setParams(newParams); + filterFormReset(newParams); + }, [searchParams, filterFormReset]); + + const { isPending, data } = useGetCmsList(params); + const { mutate: deleteCms } = useDeleteCms(() => { setIsModalOpen(false); setCurrentCms(null); }); + + const search = (data: any) => { + const newParams = { ...params, ...data }; + const cleanedParams = deleteEmptyKeys(newParams); + const queryString = new URLSearchParams(cleanedParams).toString(); + router.push(`${pathname}?${queryString}`); + setIsFilterModalOpen(false); + }; + const onConfirmDelete = () => { if (!currentCms?.id) return; deleteCms(currentCms.id); @@ -30,6 +65,14 @@ const useCmsTablePresenter = () => { onConfirmDelete, router, pathname, + isFilterModalOpen, + setIsFilterModalOpen, + filterRegister, + handleFilterSubmit, + search, + watch, + setFilterValue, + isMutating, }; }; diff --git a/src/hooks/queries/useCmsQueries.ts b/src/hooks/queries/useCmsQueries.ts index c415cb2..2a1aac3 100644 --- a/src/hooks/queries/useCmsQueries.ts +++ b/src/hooks/queries/useCmsQueries.ts @@ -5,11 +5,11 @@ import { useRouter } from "next/navigation"; import { useMemo } from "react"; import { toast } from "react-toastify"; -export const useGetCmsList = () => { - const queryKey = useMemo(() => [API_ENDPOINTS.CMS.BASE()], []); +export const useGetCmsList = (params?: Record) => { + const queryKey = useMemo(() => [API_ENDPOINTS.CMS.BASE(), params], [params]); return useQuery({ queryKey, - queryFn: cmsService.getCms, + queryFn: () => cmsService.getCms(params), }); }; export const useGetCmsDetails = (id: string) => { diff --git a/src/lib/api/services/cms-service.ts b/src/lib/api/services/cms-service.ts index 05fb6d8..e652a68 100644 --- a/src/lib/api/services/cms-service.ts +++ b/src/lib/api/services/cms-service.ts @@ -4,9 +4,11 @@ import { ApiResponse } from "../types"; import { TCms, TCmsListResponse } from "../types/TCms"; export const cmsService = { - getCms: async (): Promise> => { + getCms: async ( + params?: Record, + ): Promise> => { try { - return (await api.get(API_ENDPOINTS.CMS.BASE())).data; + return (await api.get(API_ENDPOINTS.CMS.BASE(), { params })).data; } catch (error) { console.error("Error Caught in CMS Service => Get cms", error); throw error;