From 7ab0eab6bbd0c1d4d04e9410a40939ec3014b652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Tue, 23 Dec 2025 13:42:50 -0300 Subject: [PATCH] fix --- .../app/routes/_.$orgid.checkout/assigned.tsx | 2 + .../app/routes/_.$orgid.checkout/bulk.tsx | 33 ++- .../course-picker.tsx | 231 +++++++++--------- .../routes/_.$orgid.enrollments.add/route.tsx | 1 + 4 files changed, 150 insertions(+), 117 deletions(-) diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.checkout/assigned.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.checkout/assigned.tsx index c1f95f0..35fea86 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.checkout/assigned.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.checkout/assigned.tsx @@ -118,6 +118,7 @@ export function Assigned({ courses }: AssignedProps) { onChange={onChange} options={courses} error={fieldState.error} + readOnly /> diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.checkout/bulk.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.checkout/bulk.tsx index 0913aff..ee1e542 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.checkout/bulk.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.checkout/bulk.tsx @@ -20,8 +20,7 @@ import { CoursePicker } from '../_.$orgid.enrollments.add/course-picker' import { MAX_ITEMS, type Course } from '../_.$orgid.enrollments.add/data' const emptyRow = { - course: undefined, - quantity: undefined + course: undefined } type BulkProps = { @@ -54,8 +53,15 @@ export function Bulk({ courses }: BulkProps) { resolver: zodResolver(formSchema), defaultValues: { items: [emptyRow] } }) - const { formState, control, handleSubmit, register, setValue, getValues } = - form + const { + formState, + control, + handleSubmit, + register, + setValue, + getValues, + setFocus + } = form const { fields, remove, append } = useFieldArray({ control, name: 'items' @@ -96,15 +102,19 @@ export function Bulk({ courses }: BulkProps) { control={control} name={`items.${index}.course`} render={({ - field: { name, value, onChange }, + field: { name, value, onChange, ref }, fieldState }) => (
{ @@ -157,6 +168,7 @@ export function Bulk({ courses }: BulkProps) { { @@ -172,6 +184,7 @@ export function Bulk({ courses }: BulkProps) { append(emptyRow)} + onClick={() => { + // @ts-ignore + append(emptyRow, { shouldFocus: false }) + queueMicrotask(() => { + setFocus(`items.${fields.length}.course`) + }) + }} className="cursor-pointer" disabled={fields.length == MAX_ITEMS} variant="outline" diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/course-picker.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/course-picker.tsx index 5cdca5e..4dbb9ed 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/course-picker.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments.add/course-picker.tsx @@ -1,4 +1,10 @@ -import { use, useState, useMemo } from 'react' +import { + use, + useState, + useMemo, + forwardRef, + type InputHTMLAttributes +} from 'react' import { useToggle } from 'ahooks' import Fuse from 'fuse.js' import { @@ -32,124 +38,129 @@ import { import { type Course } from './data' -interface CoursePickerProps { +interface CoursePickerProps extends Omit< + InputHTMLAttributes, + 'value' | 'onChange' +> { value?: Course options: Promise<{ hits: any[] }> onChange?: (value: any) => void error?: any } -export function CoursePicker({ - value, - onChange, - options, - error -}: CoursePickerProps) { - const { hits } = use(options) - const [search, setSearch] = useState('') - const [open, { set }] = useToggle() - const [sort, { toggle }] = useToggle('a-z', 'z-a') - const fuse = useMemo(() => { - return new Fuse(hits, { - keys: ['name'], - threshold: 0.3, - includeMatches: true - }) - }, [hits]) +export const CoursePicker = forwardRef( + ({ value, onChange, options, error, ...props }, ref) => { + const { hits } = use(options) + const [search, setSearch] = useState('') + const [open, { set }] = useToggle() + const [sort, { toggle }] = useToggle('a-z', 'z-a') + const fuse = useMemo(() => { + return new Fuse(hits, { + keys: ['name'], + threshold: 0.3, + includeMatches: true + }) + }, [hits]) - const filtered = useMemo(() => { - const results = !search ? hits : fuse.search(search).map(({ item }) => item) + const filtered = useMemo(() => { + const results = !search + ? hits + : fuse.search(search).map(({ item }) => item) - return results.sort((a, b) => { - const comparison = a.name.localeCompare(b.name) - return sort === 'a-z' ? comparison : -comparison - }) - }, [search, fuse, hits, sort]) + return results.sort((a, b) => { + const comparison = a.name.localeCompare(b.name) + return sort === 'a-z' ? comparison : -comparison + }) + }, [search, fuse, hits, sort]) - return ( - - - - - - - - - - - - + return ( + + + + - - -
-
- + + + + + + + + + + + + +
+
+ +
+
+ +
-
- -
-
- {/* Force rerender to reset the scroll position */} - - Nenhum resultado encontrado. - - {filtered - .filter( - ({ metadata__unit_price = 0 }) => metadata__unit_price > 0 - ) - .map( - ({ - id, - name, - access_period, - metadata__unit_price: unit_price - }) => ( - { - onChange?.({ - id, - name, - access_period: Number(access_period), - unit_price: Number(unit_price) - }) - set(false) - }} - > - {name} - - + {/* Force rerender to reset the scroll position */} + + Nenhum resultado encontrado. + + {filtered + .filter( + ({ metadata__unit_price = 0 }) => metadata__unit_price > 0 ) - )} - - - - - - ) -} + .map( + ({ + id, + name, + access_period, + metadata__unit_price: unit_price + }) => ( + { + onChange?.({ + id, + name, + access_period: Number(access_period), + unit_price: Number(unit_price) + }) + set(false) + }} + > + {name} + + + ) + )} + + + + + + ) + } +) 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 54fbcc9..74ee4f3 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 @@ -263,6 +263,7 @@ export default function Route({ onChange={onChange} options={courses} error={fieldState.error} + readOnly />