From c4b3c54b3daeb072ad0cb1aa3fe7aecedba846b6 Mon Sep 17 00:00:00 2001 From: daniel-barbosaa Date: Tue, 4 Nov 2025 19:01:28 -0300 Subject: [PATCH 1/3] feat(approvals): first base created --- src/app/(dashboard)/aprovacoes/page.tsx | 153 +++++++++++++++++++++++- src/components/ui/input-search.tsx | 60 ++++++++++ 2 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 src/components/ui/input-search.tsx diff --git a/src/app/(dashboard)/aprovacoes/page.tsx b/src/app/(dashboard)/aprovacoes/page.tsx index 1cbb52bc..fd473106 100644 --- a/src/app/(dashboard)/aprovacoes/page.tsx +++ b/src/app/(dashboard)/aprovacoes/page.tsx @@ -1,9 +1,160 @@ +import { formatDistanceToNow } from 'date-fns' +import { ptBR } from 'date-fns/locale' +import { CircleAlert, PlusIcon } from 'lucide-react' import type { Metadata } from 'next' +import { Pagination } from '@/components/pagination' +import { Button } from '@/components/ui/button' +import { Card } from '@/components/ui/card' +import { InputSearch } from '@/components/ui/input-search' + export const metadata: Metadata = { title: 'Aprovações pendentes', } +type RequirementType = { + id: string + name: string + type: string + approved_at: string +} + +const approvalsPending: RequirementType[] = [ + { id: '1', name: 'Julius Menezes', type: 'laudo', approved_at: '2025-01-10' }, + { + id: '2', + name: 'Ana Paula Silva', + type: 'primeiro cadastro', + approved_at: '2025-01-12', + }, + { id: '3', name: 'Carlos Alberto', type: 'laudo', approved_at: '2025-01-13' }, + { + id: '4', + name: 'Fernanda Torres', + type: 'primeiro cadastro', + approved_at: '2025-03-14', + }, + { id: '5', name: 'Rafael Lima', type: 'laudo', approved_at: '2025-01-15' }, + { + id: '6', + name: 'Mariana Oliveira', + type: 'primeiro cadastro', + approved_at: '2025-05-16', + }, + { id: '7', name: 'Pedro Henrique', type: 'laudo', approved_at: '2025-10-17' }, + { + id: '8', + name: 'Beatriz Santos', + type: 'primeiro cadastro', + approved_at: '2025-01-18', + }, + { id: '9', name: 'Lucas Rocha', type: 'laudo', approved_at: '2025-11-03' }, + { + id: '10', + name: 'Isabela Ferreira', + type: 'primeiro cadastro', + approved_at: '2025-01-20', + }, + { + id: '11', + name: 'Gustavo Pereira', + type: 'laudo', + approved_at: '2025-01-21', + }, + { + id: '12', + name: 'Camila Costa', + type: 'primeiro cadastro', + approved_at: '2025-01-22', + }, + { + id: '13', + name: 'Thiago Ribeiro', + type: 'laudo', + approved_at: '2025-01-23', + }, + { + id: '14', + name: 'Larissa Almeida', + type: 'primeiro cadastro', + approved_at: '2025-01-24', + }, + { + id: '15', + name: 'Vinícius Martins', + type: 'laudo', + approved_at: '2025-01-25', + }, + { + id: '16', + name: 'Natália Gomes', + type: 'primeiro cadastro', + approved_at: '2025-01-26', + }, + { + id: '17', + name: 'Eduardo Carvalho', + type: 'laudo', + approved_at: '2025-01-27', + }, + { + id: '18', + name: 'Patrícia Mendes', + type: 'primeiro cadastro', + approved_at: '2025-01-28', + }, + { id: '19', name: 'João Pedro', type: 'laudo', approved_at: '2025-01-29' }, + { + id: '20', + name: 'Sabrina Azevedo', + type: 'primeiro cadastro', + approved_at: '2025-01-30', + }, +] export default function Page() { - return

Aprovações pendentes

+ function formatReceivedDate(date: string) { + return formatDistanceToNow(date, { + addSuffix: true, + locale: ptBR, + }) + } + return ( +
+
+ + +
+ + + {approvalsPending.map((person) => ( + +
+ {person.name} +
+ + {`Recebido ${formatReceivedDate(person.approved_at)}`} +
+
+ +
+ + Tipo de solicitação: + + + {person.type} + +
+
+ ))} +
+ + +
+ ) } diff --git a/src/components/ui/input-search.tsx b/src/components/ui/input-search.tsx new file mode 100644 index 00000000..f2677abf --- /dev/null +++ b/src/components/ui/input-search.tsx @@ -0,0 +1,60 @@ +'use client' + +import { SearchIcon, XIcon } from 'lucide-react' +import { useEffect, useState } from 'react' + +import { Button } from '@/components/ui/button' +import { Input, type InputProps } from '@/components/ui/input' +import { QUERY_PARAMS } from '@/constants/params' +import { useDebounce } from '@/hooks/debounce' +import { useParams } from '@/hooks/params' +import { cn } from '@/utils/class-name-merge' + +export function InputSearch({ className, ...props }: Readonly) { + const queryParam = QUERY_PARAMS.search + const pageParam = QUERY_PARAMS.page + + const { getParam, updateParams } = useParams() + const searchQuery = getParam(queryParam) || '' + + const [query, setQuery] = useState(searchQuery) + const debouncedQuery = useDebounce(query) + + useEffect(() => { + updateParams({ + set: [{ key: queryParam, value: debouncedQuery }], + remove: !debouncedQuery ? [queryParam, pageParam] : [pageParam], + }) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [debouncedQuery]) + + useEffect(() => { + if (!searchQuery) setQuery('') + }, [searchQuery]) + + return ( +
+ setQuery(e.target.value)} + className={cn('w-52 pr-10', className)} + {...props} + /> + + {query && ( + + )} +
+ ) +} From 1d4f7dbfbccb9d81e2f5c30a56bf0a9079c0dfec Mon Sep 17 00:00:00 2001 From: daniel-barbosaa Date: Fri, 7 Nov 2025 13:39:27 -0300 Subject: [PATCH 2/3] feat(approvals): adds responsivity --- src/app/(dashboard)/aprovacoes/page.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/(dashboard)/aprovacoes/page.tsx b/src/app/(dashboard)/aprovacoes/page.tsx index fd473106..fd8a3e17 100644 --- a/src/app/(dashboard)/aprovacoes/page.tsx +++ b/src/app/(dashboard)/aprovacoes/page.tsx @@ -131,7 +131,7 @@ export default function Page() { - + {approvalsPending.map((person) => (
@@ -142,11 +142,11 @@ export default function Page() {
-
+
Tipo de solicitação: - + {person.type}
From 7537fb1dbe6db6ea13ad37dab2af8f8be7bb25fa Mon Sep 17 00:00:00 2001 From: Juliano Sill Date: Mon, 17 Nov 2025 00:29:59 -0300 Subject: [PATCH 3/3] feat(approvals): create under-review requirements page - Add UnderReviewPatientRequirements component for under_review status - Refactor approvals page to use new component - Display 12 cards per page with search and order functionality - Create SearchInput and getTimeDistanceToNow helper utilities - Update PendingPatientRequirements to use new time formatting helper --- src/app/(dashboard)/aprovacoes/page.tsx | 153 +----------------- .../ui/{input-search.tsx => search-input.tsx} | 4 +- src/helpers/get-time-distance-to-now.ts | 6 + .../pending-requirements.tsx | 15 +- .../under-review-requirements.tsx | 135 ++++++++++++++++ 5 files changed, 151 insertions(+), 162 deletions(-) rename src/components/ui/{input-search.tsx => search-input.tsx} (94%) create mode 100644 src/helpers/get-time-distance-to-now.ts create mode 100644 src/modules/patient-requirements/under-review-requirements.tsx diff --git a/src/app/(dashboard)/aprovacoes/page.tsx b/src/app/(dashboard)/aprovacoes/page.tsx index fd8a3e17..52dfda76 100644 --- a/src/app/(dashboard)/aprovacoes/page.tsx +++ b/src/app/(dashboard)/aprovacoes/page.tsx @@ -1,160 +1,11 @@ -import { formatDistanceToNow } from 'date-fns' -import { ptBR } from 'date-fns/locale' -import { CircleAlert, PlusIcon } from 'lucide-react' import type { Metadata } from 'next' -import { Pagination } from '@/components/pagination' -import { Button } from '@/components/ui/button' -import { Card } from '@/components/ui/card' -import { InputSearch } from '@/components/ui/input-search' +import { UnderReviewPatientRequirements } from '@/modules/patient-requirements/under-review-requirements' export const metadata: Metadata = { title: 'Aprovações pendentes', } -type RequirementType = { - id: string - name: string - type: string - approved_at: string -} - -const approvalsPending: RequirementType[] = [ - { id: '1', name: 'Julius Menezes', type: 'laudo', approved_at: '2025-01-10' }, - { - id: '2', - name: 'Ana Paula Silva', - type: 'primeiro cadastro', - approved_at: '2025-01-12', - }, - { id: '3', name: 'Carlos Alberto', type: 'laudo', approved_at: '2025-01-13' }, - { - id: '4', - name: 'Fernanda Torres', - type: 'primeiro cadastro', - approved_at: '2025-03-14', - }, - { id: '5', name: 'Rafael Lima', type: 'laudo', approved_at: '2025-01-15' }, - { - id: '6', - name: 'Mariana Oliveira', - type: 'primeiro cadastro', - approved_at: '2025-05-16', - }, - { id: '7', name: 'Pedro Henrique', type: 'laudo', approved_at: '2025-10-17' }, - { - id: '8', - name: 'Beatriz Santos', - type: 'primeiro cadastro', - approved_at: '2025-01-18', - }, - { id: '9', name: 'Lucas Rocha', type: 'laudo', approved_at: '2025-11-03' }, - { - id: '10', - name: 'Isabela Ferreira', - type: 'primeiro cadastro', - approved_at: '2025-01-20', - }, - { - id: '11', - name: 'Gustavo Pereira', - type: 'laudo', - approved_at: '2025-01-21', - }, - { - id: '12', - name: 'Camila Costa', - type: 'primeiro cadastro', - approved_at: '2025-01-22', - }, - { - id: '13', - name: 'Thiago Ribeiro', - type: 'laudo', - approved_at: '2025-01-23', - }, - { - id: '14', - name: 'Larissa Almeida', - type: 'primeiro cadastro', - approved_at: '2025-01-24', - }, - { - id: '15', - name: 'Vinícius Martins', - type: 'laudo', - approved_at: '2025-01-25', - }, - { - id: '16', - name: 'Natália Gomes', - type: 'primeiro cadastro', - approved_at: '2025-01-26', - }, - { - id: '17', - name: 'Eduardo Carvalho', - type: 'laudo', - approved_at: '2025-01-27', - }, - { - id: '18', - name: 'Patrícia Mendes', - type: 'primeiro cadastro', - approved_at: '2025-01-28', - }, - { id: '19', name: 'João Pedro', type: 'laudo', approved_at: '2025-01-29' }, - { - id: '20', - name: 'Sabrina Azevedo', - type: 'primeiro cadastro', - approved_at: '2025-01-30', - }, -] export default function Page() { - function formatReceivedDate(date: string) { - return formatDistanceToNow(date, { - addSuffix: true, - locale: ptBR, - }) - } - return ( -
-
- - -
- - - {approvalsPending.map((person) => ( - -
- {person.name} -
- - {`Recebido ${formatReceivedDate(person.approved_at)}`} -
-
- -
- - Tipo de solicitação: - - - {person.type} - -
-
- ))} -
- - -
- ) + return } diff --git a/src/components/ui/input-search.tsx b/src/components/ui/search-input.tsx similarity index 94% rename from src/components/ui/input-search.tsx rename to src/components/ui/search-input.tsx index f2677abf..8447652f 100644 --- a/src/components/ui/input-search.tsx +++ b/src/components/ui/search-input.tsx @@ -10,7 +10,7 @@ import { useDebounce } from '@/hooks/debounce' import { useParams } from '@/hooks/params' import { cn } from '@/utils/class-name-merge' -export function InputSearch({ className, ...props }: Readonly) { +export function SearchInput({ className, ...props }: Readonly) { const queryParam = QUERY_PARAMS.search const pageParam = QUERY_PARAMS.page @@ -48,7 +48,7 @@ export function InputSearch({ className, ...props }: Readonly) {