From 12f558233b824a5f700910b3a8d1788178bbd812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Wed, 10 Dec 2025 14:48:42 -0300 Subject: [PATCH] update --- .../routes/_.$orgid.enrollments.add/data.ts | 34 ++++++++ .../routes/_.$orgid.enrollments.add/route.tsx | 81 ++++++++----------- apps/saladeaula.digital/app/routes/index.tsx | 16 ++-- 3 files changed, 76 insertions(+), 55 deletions(-) create mode 100644 apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/data.ts diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/data.ts b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/data.ts new file mode 100644 index 0000000..d392df4 --- /dev/null +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/data.ts @@ -0,0 +1,34 @@ +import { z } from 'zod' + +export const enrollment = z.object({ + user: z + .object({ + id: z.string(), + name: z.string(), + email: z.string(), + cpf: z.string() + }) + .required(), + course: z + .object({ + id: z.string(), + name: z.string(), + access_period: z.number(), + unit_price: z.number() + }) + .required(), + deduplication_window: z + .object({ + offset_days: z.number() + }) + .optional(), + scheduled_for: z.date().optional() +}) + +export const formSchema = z.object({ + enrollments: z.array(enrollment).min(1).max(100) +}) + +export type Schema = z.infer + +export const MAX_ITEMS = 100 diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/route.tsx index bcb646d..04d13d5 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/route.tsx @@ -3,21 +3,21 @@ import type { Route } from './+types/route' import { useToggle } from 'ahooks' import { CalendarIcon, - SearchIcon, CopyIcon, CopyPlusIcon, Trash2Icon, PlusIcon, XIcon, ChevronsUpDownIcon, - CheckIcon + CheckIcon, + BookIcon, + UserIcon } from 'lucide-react' import { Link } from 'react-router' import { Controller, useFieldArray, useForm } from 'react-hook-form' import { Fragment, use, useMemo, useState } from 'react' import { format } from 'date-fns' import { ptBR } from 'react-day-picker/locale' -import { z } from 'zod' import { zodResolver } from '@hookform/resolvers/zod' import { @@ -39,8 +39,7 @@ import { import { InputGroup, InputGroupAddon, - InputGroupInput, - InputGroupText + InputGroupInput } from '@repo/ui/components/ui/input-group' import { Card, @@ -61,43 +60,11 @@ import { import { Label } from '@repo/ui/components/ui/label' import { Calendar } from '@repo/ui/components/ui/calendar' import { createSearch } from '@repo/util/meili' -import { Await } from 'react-router' import { cn } from '@repo/ui/lib/utils' import Fuse from 'fuse.js' import { useIsMobile } from '@repo/ui/hooks/use-mobile' -const enrollment = z.object({ - user: z - .object({ - id: z.string(), - name: z.string(), - email: z.string(), - cpf: z.string() - }) - .required(), - course: z - .object({ - id: z.string(), - name: z.string(), - access_period: z.number(), - unit_price: z.number() - }) - .required(), - deduplication_window: z - .object({ - offset_days: z.number() - }) - .optional(), - scheduled_for: z.date().optional().nullable() -}) - -const formSchema = z.object({ - enrollments: z.array(enrollment).min(1).max(100) -}) - -type Schema = z.infer - -const MAX_ITEMS = 100 +import { formSchema, type Schema, MAX_ITEMS } from './data' export function meta({}: Route.MetaArgs) { return [{ title: 'Adicionar matrĂ­cula' }] @@ -125,7 +92,9 @@ export default function Route({ const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { - enrollments: [{ user: undefined, course: undefined, scheduled_for: null }] + enrollments: [ + { user: undefined, course: undefined, scheduled_for: undefined } + ] } }) const { formState, control, handleSubmit, getValues } = form @@ -203,9 +172,9 @@ export default function Route({ {index >= 1 &&
} - + - + @@ -266,9 +235,11 @@ export default function Route({ type="button" onClick={() => append({ + // @ts-ignore user: undefined, + // @ts-ignore course: undefined, - scheduled_for: null + scheduled_for: undefined }) } className="cursor-pointer" @@ -333,7 +304,14 @@ function FacetedFilter({ value, onChange, options }: FacetedFilterProps) { - + + + + @@ -393,21 +371,28 @@ function FacetedFilter({ value, onChange, options }: FacetedFilterProps) { ) } -function ScheduledForInput({ value, onChange }) { +interface ScheduledForInputProps { + value?: Date + onChange?: (value: any) => void +} + +function ScheduledForInput({ value, onChange }: ScheduledForInputProps) { const today = new Date() const tomorrow = new Date() tomorrow.setDate(today.getDate() + 1) const [open, { set }] = useToggle() const [selected, setDate] = useState(value) - const displayValue = !selected - ? 'Imediatamente' - : format(selected, 'dd/MM/yyyy') + const displayValue = selected ? format(selected, 'dd/MM/yyyy') : '' return ( - + diff --git a/apps/saladeaula.digital/app/routes/index.tsx b/apps/saladeaula.digital/app/routes/index.tsx index c48b995..dec0a63 100644 --- a/apps/saladeaula.digital/app/routes/index.tsx +++ b/apps/saladeaula.digital/app/routes/index.tsx @@ -87,7 +87,7 @@ export default function Component({ loaderData: { data } }: Route.ComponentProps) { const [searchParams, setSearchParams] = useSearchParams() - const s = searchParams.get('s') as string + const search = searchParams.get('s') as string return ( @@ -145,14 +145,16 @@ export default function Component({ - {({ hits = [] }) => } + {({ hits = [] }) => ( + + )} ) } -function List({ s, hits = [] }: { s: string; hits: Enrollment[] }) { +function List({ search, hits = [] }: { search: string; hits: Enrollment[] }) { const fuse = useMemo(() => { return new Fuse(hits, { keys: ['course.name'], @@ -162,12 +164,12 @@ function List({ s, hits = [] }: { s: string; hits: Enrollment[] }) { }, [hits]) const filtered = useMemo(() => { - if (!s) { + if (!search) { return hits } - return fuse.search(s).map(({ item }) => item) - }, [s, fuse, hits]) + return fuse.search(search).map(({ item }) => item) + }, [search, fuse, hits]) if (filtered.length === 0) { return ( @@ -176,7 +178,7 @@ function List({ s, hits = [] }: { s: string; hits: Enrollment[] }) { - {s ? ( + {search ? ( <> Nada encontrado