diff --git a/apps/remix/app/components/forms/search-param-selector.tsx b/apps/remix/app/components/forms/search-param-selector.tsx deleted file mode 100644 index 5992004a5..000000000 --- a/apps/remix/app/components/forms/search-param-selector.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React, { useMemo } from 'react'; - -import { useLocation, useNavigate } from 'react-router'; -import { useSearchParams } from 'react-router'; - -import { Select, SelectContent, SelectTrigger, SelectValue } from '@documenso/ui/primitives/select'; - -export type SearchParamSelector = { - paramKey: string; - isValueValid: (value: unknown) => boolean; - children: React.ReactNode; -}; - -export const SearchParamSelector = ({ children, paramKey, isValueValid }: SearchParamSelector) => { - const { pathname } = useLocation(); - const [searchParams] = useSearchParams(); - - const navigate = useNavigate(); - - const value = useMemo(() => { - const p = searchParams?.get(paramKey) ?? 'all'; - - return isValueValid(p) ? p : 'all'; - }, [searchParams]); - - const onValueChange = (newValue: string) => { - if (!pathname) { - return; - } - - const params = new URLSearchParams(searchParams?.toString()); - - params.set(paramKey, newValue); - - if (newValue === '' || newValue === 'all') { - params.delete(paramKey); - } - - void navigate(`${pathname}?${params.toString()}`, { preventScrollReset: true }); - }; - - return ( - - ); -}; diff --git a/apps/remix/app/components/general/document/document-search.tsx b/apps/remix/app/components/general/document/document-search.tsx deleted file mode 100644 index 92477853a..000000000 --- a/apps/remix/app/components/general/document/document-search.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { useCallback, useEffect, useState } from 'react'; - -import { msg } from '@lingui/core/macro'; -import { useLingui } from '@lingui/react'; -import { useSearchParams } from 'react-router'; - -import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value'; -import { Input } from '@documenso/ui/primitives/input'; - -export const DocumentSearch = ({ initialValue = '' }: { initialValue?: string }) => { - const { _ } = useLingui(); - - const [searchParams, setSearchParams] = useSearchParams(); - - const [searchTerm, setSearchTerm] = useState(initialValue); - const debouncedSearchTerm = useDebouncedValue(searchTerm, 500); - - const handleSearch = useCallback( - (term: string) => { - const params = new URLSearchParams(searchParams?.toString() ?? ''); - if (term) { - params.set('query', term); - } else { - params.delete('query'); - } - - setSearchParams(params); - }, - [searchParams], - ); - - useEffect(() => { - const currentQueryParam = searchParams.get('query') || ''; - - if (debouncedSearchTerm !== currentQueryParam) { - handleSearch(debouncedSearchTerm); - } - }, [debouncedSearchTerm, searchParams]); - - return ( - setSearchTerm(e.target.value)} - /> - ); -}; diff --git a/apps/remix/app/components/general/period-selector.tsx b/apps/remix/app/components/general/period-selector.tsx deleted file mode 100644 index 025925a92..000000000 --- a/apps/remix/app/components/general/period-selector.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { useMemo } from 'react'; - -import { Trans } from '@lingui/react/macro'; -import { useLocation, useNavigate, useSearchParams } from 'react-router'; - -import type { PeriodSelectorValue } from '@documenso/lib/server-only/document/find-documents'; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@documenso/ui/primitives/select'; - -const isPeriodSelectorValue = (value: unknown): value is PeriodSelectorValue => { - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - return ['', '7d', '14d', '30d'].includes(value as string); -}; - -export const PeriodSelector = () => { - const { pathname } = useLocation(); - const [searchParams] = useSearchParams(); - - const navigate = useNavigate(); - - const period = useMemo(() => { - const p = searchParams?.get('period') ?? 'all'; - - return isPeriodSelectorValue(p) ? p : 'all'; - }, [searchParams]); - - const onPeriodChange = (newPeriod: string) => { - if (!pathname) { - return; - } - - const params = new URLSearchParams(searchParams?.toString()); - - params.set('period', newPeriod); - - if (newPeriod === '' || newPeriod === 'all') { - params.delete('period'); - } - - void navigate(`${pathname}?${params.toString()}`, { preventScrollReset: true }); - }; - - return ( - - ); -}; diff --git a/apps/remix/app/components/general/template/template-page-view-documents-table.tsx b/apps/remix/app/components/general/template/template-page-view-documents-table.tsx index 6072a8846..9974cb5a4 100644 --- a/apps/remix/app/components/general/template/template-page-view-documents-table.tsx +++ b/apps/remix/app/components/general/template/template-page-view-documents-table.tsx @@ -4,49 +4,42 @@ import type { MessageDescriptor } from '@lingui/core'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; -import { DocumentSource, DocumentStatus as DocumentStatusEnum } from '@prisma/client'; +import type { DocumentSource } from '@prisma/client'; import { InfoIcon } from 'lucide-react'; import { DateTime } from 'luxon'; import { useSearchParams } from 'react-router'; -import { z } from 'zod'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; -import { ZUrlSearchParamsSchema } from '@documenso/lib/types/search-params'; import { trpc } from '@documenso/trpc/react'; +import { ZFindDocumentsInternalRequestSchema } from '@documenso/trpc/server/document-router/find-documents-internal.types'; import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; -import { SelectItem } from '@documenso/ui/primitives/select'; import { Skeleton } from '@documenso/ui/primitives/skeleton'; import { TableCell } from '@documenso/ui/primitives/table'; import { Tooltip, TooltipContent, TooltipTrigger } from '@documenso/ui/primitives/tooltip'; -import { SearchParamSelector } from '~/components/forms/search-param-selector'; -import { DocumentSearch } from '~/components/general/document/document-search'; import { DocumentStatus } from '~/components/general/document/document-status'; import { StackAvatarsWithTooltip } from '~/components/general/stack-avatars-with-tooltip'; import { DocumentsTableActionButton } from '~/components/tables/documents-table-action-button'; import { DocumentsTableActionDropdown } from '~/components/tables/documents-table-action-dropdown'; import { DataTableTitle } from '~/components/tables/documents-table-title'; +import { TemplateDocumentsTableToolbar } from '~/components/tables/template-documents-table-toolbar'; import { useCurrentTeam } from '~/providers/team'; -import { PeriodSelector } from '../period-selector'; - const DOCUMENT_SOURCE_LABELS: { [key in DocumentSource]: MessageDescriptor } = { DOCUMENT: msg`Document`, TEMPLATE: msg`Template`, TEMPLATE_DIRECT_LINK: msg`Direct link`, }; -const ZDocumentSearchParamsSchema = ZUrlSearchParamsSchema.extend({ - source: z - .nativeEnum(DocumentSource) - .optional() - .catch(() => undefined), - status: z - .nativeEnum(DocumentStatusEnum) - .optional() - .catch(() => undefined), +const ZDocumentSearchParamsSchema = ZFindDocumentsInternalRequestSchema.pick({ + page: true, + perPage: true, + query: true, + period: true, + status: true, + source: true, }); type TemplatePageViewDocumentsTableProps = { @@ -67,7 +60,7 @@ export const TemplatePageViewDocumentsTable = ({ Object.fromEntries(searchParams ?? []), ); - const { data, isLoading, isLoadingError } = trpc.document.find.useQuery( + const { data, isLoading, isLoadingError } = trpc.document.findDocumentsInternal.useQuery( { templateId, page: parsedSearchParams.page, @@ -75,6 +68,7 @@ export const TemplatePageViewDocumentsTable = ({ query: parsedSearchParams.query, source: parsedSearchParams.source, status: parsedSearchParams.status, + period: parsedSearchParams.period, }, { placeholderData: (previousData) => previousData, @@ -133,8 +127,8 @@ export const TemplatePageViewDocumentsTable = ({ - -