From a0be16d8481851f6e41cd97fd897b77be28f4dcb Mon Sep 17 00:00:00 2001 From: ryan Date: Sat, 4 Apr 2026 20:12:17 +0000 Subject: [PATCH] fix: resolve all frontend lint errors and warnings Replace all `any` types with proper types across 36 files: - TanStack Router search params: `{} as Record` - API response pagination: proper typed interface - DataTable column casts: remove unnecessary `as any` - Function params and event handlers: use specific types - Remove unused imports and variables in POS components Frontend lint now passes with 0 errors and 0 warnings. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/admin/src/api/pos.ts | 2 +- .../src/components/pos/pos-item-panel.tsx | 2 +- .../admin/src/components/pos/pos-register.tsx | 5 ++-- .../admin/src/components/pos/pos-top-bar.tsx | 2 +- packages/admin/src/hooks/use-pagination.ts | 6 ++--- packages/admin/src/routes/_authenticated.tsx | 2 +- .../accounts/$accountId/enrollments.tsx | 6 ++--- .../accounts/$accountId/members.tsx | 2 +- .../src/routes/_authenticated/files/index.tsx | 2 +- .../admin/src/routes/_authenticated/index.tsx | 2 +- .../_authenticated/inventory/$productId.tsx | 12 +++++----- .../routes/_authenticated/inventory/index.tsx | 12 +++++----- .../inventory/suppliers/index.tsx | 2 +- .../lessons/enrollments/$enrollmentId.tsx | 24 +++++++++++++------ .../lessons/enrollments/index.tsx | 12 +++++----- .../lessons/enrollments/new.tsx | 6 ++--- .../_authenticated/lessons/plans/$planId.tsx | 2 +- .../_authenticated/lessons/plans/index.tsx | 2 +- .../_authenticated/lessons/schedule/index.tsx | 18 +++++++------- .../schedule/instructors/$instructorId.tsx | 4 ++-- .../lessons/sessions/$sessionId.tsx | 13 ++++++---- .../_authenticated/lessons/sessions/index.tsx | 8 +++---- .../lessons/templates/$templateId.tsx | 10 ++++---- .../lessons/templates/index.tsx | 8 +++---- .../_authenticated/lessons/templates/new.tsx | 6 ++--- .../_authenticated/members/$memberId.tsx | 16 ++++++------- .../routes/_authenticated/members/index.tsx | 4 ++-- .../repair-batches/$batchId.tsx | 6 ++--- .../_authenticated/repair-batches/index.tsx | 2 +- .../_authenticated/repair-batches/new.tsx | 6 ++--- .../_authenticated/repairs/$ticketId.tsx | 2 +- .../routes/_authenticated/repairs/index.tsx | 4 ++-- .../src/routes/_authenticated/repairs/new.tsx | 8 +++---- .../routes/_authenticated/roles/$roleId.tsx | 4 ++-- .../src/routes/_authenticated/roles/new.tsx | 4 ++-- packages/admin/src/routes/login.tsx | 4 ++-- 36 files changed, 122 insertions(+), 108 deletions(-) diff --git a/packages/admin/src/api/pos.ts b/packages/admin/src/api/pos.ts index 9a48b95..f71623a 100644 --- a/packages/admin/src/api/pos.ts +++ b/packages/admin/src/api/pos.ts @@ -119,7 +119,7 @@ export function currentDrawerOptions(locationId: string | null) { export function productSearchOptions(search: string) { return queryOptions({ queryKey: posKeys.products(search), - queryFn: () => api.get<{ data: Product[]; pagination: any }>('/v1/products', { q: search, limit: 24, isActive: true }), + queryFn: () => api.get<{ data: Product[]; pagination: { page: number; limit: number; total: number; totalPages: number } }>('/v1/products', { q: search, limit: 24, isActive: true }), enabled: search.length >= 1, }) } diff --git a/packages/admin/src/components/pos/pos-item-panel.tsx b/packages/admin/src/components/pos/pos-item-panel.tsx index 6b1381b..4949c18 100644 --- a/packages/admin/src/components/pos/pos-item-panel.tsx +++ b/packages/admin/src/components/pos/pos-item-panel.tsx @@ -14,7 +14,7 @@ interface POSItemPanelProps { transaction: Transaction | null } -export function POSItemPanel({ transaction }: POSItemPanelProps) { +export function POSItemPanel({ transaction: _transaction }: POSItemPanelProps) { const queryClient = useQueryClient() const { currentTransactionId, setTransaction, locationId } = usePOSStore() const [search, setSearch] = useState('') diff --git a/packages/admin/src/components/pos/pos-register.tsx b/packages/admin/src/components/pos/pos-register.tsx index 92cc852..4bd8645 100644 --- a/packages/admin/src/components/pos/pos-register.tsx +++ b/packages/admin/src/components/pos/pos-register.tsx @@ -1,5 +1,5 @@ import { useEffect } from 'react' -import { useQuery, useQueryClient } from '@tanstack/react-query' +import { useQuery } from '@tanstack/react-query' import { queryOptions } from '@tanstack/react-query' import { api } from '@/lib/api-client' import { usePOSStore } from '@/stores/pos.store' @@ -21,8 +21,7 @@ function locationsOptions() { } export function POSRegister() { - const { locationId, setLocation, currentTransactionId, drawerSessionId, setDrawerSession } = usePOSStore() - const queryClient = useQueryClient() + const { locationId, setLocation, currentTransactionId, setDrawerSession } = usePOSStore() // Fetch locations const { data: locationsData } = useQuery(locationsOptions()) diff --git a/packages/admin/src/components/pos/pos-top-bar.tsx b/packages/admin/src/components/pos/pos-top-bar.tsx index 250308b..4fa48a9 100644 --- a/packages/admin/src/components/pos/pos-top-bar.tsx +++ b/packages/admin/src/components/pos/pos-top-bar.tsx @@ -1,6 +1,6 @@ import { Link, useRouter } from '@tanstack/react-router' import { useAuthStore } from '@/stores/auth.store' -import { usePOSStore } from '@/stores/pos.store' + import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' diff --git a/packages/admin/src/hooks/use-pagination.ts b/packages/admin/src/hooks/use-pagination.ts index fa5858b..e8ea822 100644 --- a/packages/admin/src/hooks/use-pagination.ts +++ b/packages/admin/src/hooks/use-pagination.ts @@ -23,12 +23,12 @@ export function usePagination() { function setParams(updates: Partial) { navigate({ - search: ((prev: PaginationSearch) => ({ + search: ((prev: Record) => ({ ...prev, ...updates, // Reset to page 1 when search or sort changes - page: updates.q !== undefined || updates.sort !== undefined ? 1 : (updates.page ?? prev.page), - })) as any, + page: updates.q !== undefined || updates.sort !== undefined ? 1 : (updates.page ?? (prev as PaginationSearch).page), + })) as (prev: Record) => Record, replace: true, }) } diff --git a/packages/admin/src/routes/_authenticated.tsx b/packages/admin/src/routes/_authenticated.tsx index 8f342cc..e94bfb2 100644 --- a/packages/admin/src/routes/_authenticated.tsx +++ b/packages/admin/src/routes/_authenticated.tsx @@ -67,7 +67,7 @@ function NavLink({ to, icon, label, collapsed }: { to: string; icon: React.React return ( } className="flex items-center gap-2 px-3 py-2 rounded-md text-sm text-sidebar-foreground hover:bg-sidebar-accent" activeProps={{ className: 'flex items-center gap-2 px-3 py-2 rounded-md text-sm bg-sidebar-accent text-sidebar-accent-foreground' }} title={collapsed ? label : undefined} diff --git a/packages/admin/src/routes/_authenticated/accounts/$accountId/enrollments.tsx b/packages/admin/src/routes/_authenticated/accounts/$accountId/enrollments.tsx index b366be5..bb94538 100644 --- a/packages/admin/src/routes/_authenticated/accounts/$accountId/enrollments.tsx +++ b/packages/admin/src/routes/_authenticated/accounts/$accountId/enrollments.tsx @@ -20,7 +20,7 @@ function statusBadge(status: string) { } const columns: Column[] = [ - { key: 'member_name', header: 'Member', sortable: true, render: (e) => {(e as any).memberName ?? e.memberId} }, + { key: 'member_name', header: 'Member', sortable: true, render: (e) => {e.memberName ?? e.memberId} }, { key: 'status', header: 'Status', sortable: true, render: (e) => statusBadge(e.status) }, { key: 'start_date', header: 'Start', sortable: true, render: (e) => <>{new Date(e.startDate + 'T00:00:00').toLocaleDateString()} }, { key: 'rate', header: 'Rate', render: (e) => <>{e.rate ? `$${e.rate}${e.billingInterval ? ` / ${e.billingInterval} ${e.billingUnit}` : ''}` : } }, @@ -41,7 +41,7 @@ function AccountEnrollmentsTab() {

{data?.pagination.total ?? 0} enrollment(s)

{hasPermission('lessons.edit') && ( - )} @@ -55,7 +55,7 @@ function AccountEnrollmentsTab() { total={data?.data?.length ?? 0} onPageChange={() => {}} onSort={() => {}} - onRowClick={(e) => navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId: e.id }, search: {} as any })} + onRowClick={(e) => navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId: e.id }, search: {} as Record })} />
) diff --git a/packages/admin/src/routes/_authenticated/accounts/$accountId/members.tsx b/packages/admin/src/routes/_authenticated/accounts/$accountId/members.tsx index d8b0c92..589bc78 100644 --- a/packages/admin/src/routes/_authenticated/accounts/$accountId/members.tsx +++ b/packages/admin/src/routes/_authenticated/accounts/$accountId/members.tsx @@ -281,7 +281,7 @@ function MembersTab() { navigate({ to: '/members/$memberId', params: { memberId: m.id }, - search: {} as any, + search: {} as Record, })}> Edit diff --git a/packages/admin/src/routes/_authenticated/files/index.tsx b/packages/admin/src/routes/_authenticated/files/index.tsx index 063447b..8c06462 100644 --- a/packages/admin/src/routes/_authenticated/files/index.tsx +++ b/packages/admin/src/routes/_authenticated/files/index.tsx @@ -92,7 +92,7 @@ function FileManagerPage() { }) if (!res.ok) { const err = await res.json().catch(() => ({})) - toast.error(`Upload failed: ${(err as any).error?.message ?? file.name}`) + toast.error(`Upload failed: ${(err as { error?: { message?: string } }).error?.message ?? file.name}`) } } catch { toast.error(`Upload failed: ${file.name}`) diff --git a/packages/admin/src/routes/_authenticated/index.tsx b/packages/admin/src/routes/_authenticated/index.tsx index 6e054a3..2cc6eaa 100644 --- a/packages/admin/src/routes/_authenticated/index.tsx +++ b/packages/admin/src/routes/_authenticated/index.tsx @@ -2,6 +2,6 @@ import { createFileRoute, redirect } from '@tanstack/react-router' export const Route = createFileRoute('/_authenticated/')({ beforeLoad: () => { - throw redirect({ to: '/accounts', search: {} as any }) + throw redirect({ to: '/accounts', search: {} as Record }) }, }) diff --git a/packages/admin/src/routes/_authenticated/inventory/$productId.tsx b/packages/admin/src/routes/_authenticated/inventory/$productId.tsx index cb10925..8f35893 100644 --- a/packages/admin/src/routes/_authenticated/inventory/$productId.tsx +++ b/packages/admin/src/routes/_authenticated/inventory/$productId.tsx @@ -159,7 +159,7 @@ function ProductDetailPage() { }) function setTab(t: string) { - navigate({ to: '/inventory/$productId', params: { productId }, search: { tab: t } as any }) + navigate({ to: '/inventory/$productId', params: { productId }, search: { tab: t } as Record }) } function handleQtySave() { @@ -192,7 +192,7 @@ function ProductDetailPage() {
{/* Header */}
-
@@ -507,12 +507,12 @@ function SuppliersTab({ setAddOpen: (v: boolean) => void editTarget: ProductSupplier | null setEditTarget: (v: ProductSupplier | null) => void - addMutation: any - updateMutation: any - removeMutation: any + addMutation: { mutate: (data: Record) => void; isPending: boolean } + updateMutation: { mutate: (args: { id: string; data: Record }) => void; isPending: boolean } + removeMutation: { mutate: (id: string) => void; isPending: boolean } canEdit: boolean }) { - const { data: allSuppliersData } = useQuery(supplierListOptions({ page: 1, limit: 500, order: 'asc', sort: 'name' } as any)) + const { data: allSuppliersData } = useQuery(supplierListOptions({ page: 1, limit: 500, order: 'asc', sort: 'name' })) const allSuppliers = allSuppliersData?.data ?? [] const linkedIds = new Set(linkedSuppliers.map((s) => s.supplierId)) const availableSuppliers = allSuppliers.filter((s) => !linkedIds.has(s.id)) diff --git a/packages/admin/src/routes/_authenticated/inventory/index.tsx b/packages/admin/src/routes/_authenticated/inventory/index.tsx index 3ebbb7a..bb877fa 100644 --- a/packages/admin/src/routes/_authenticated/inventory/index.tsx +++ b/packages/admin/src/routes/_authenticated/inventory/index.tsx @@ -71,7 +71,7 @@ function InventoryPage() { queryClient.invalidateQueries({ queryKey: productKeys.all }) toast.success('Product created') setCreateOpen(false) - navigate({ to: '/inventory/$productId', params: { productId: product.id }, search: {} as any }) + navigate({ to: '/inventory/$productId', params: { productId: product.id }, search: {} as Record }) }, onError: (err) => toast.error(err.message), }) @@ -83,23 +83,23 @@ function InventoryPage() { function handleCategoryChange(v: string) { setCategoryFilter(v === 'all' ? '' : v) - navigate({ to: '/inventory', search: { ...search, categoryId: v === 'all' ? undefined : v, page: 1 } as any }) + navigate({ to: '/inventory', search: { ...search, categoryId: v === 'all' ? undefined : v, page: 1 } as Record }) } function handleActiveChange(v: string) { setActiveFilter(v === 'all' ? '' : v) - navigate({ to: '/inventory', search: { ...search, isActive: v === 'all' ? undefined : v, page: 1 } as any }) + navigate({ to: '/inventory', search: { ...search, isActive: v === 'all' ? undefined : v, page: 1 } as Record }) } function handleTypeChange(v: string) { setTypeFilter(v === 'all' ? '' : v) - navigate({ to: '/inventory', search: { ...search, type: v === 'all' ? undefined : v, page: 1 } as any }) + navigate({ to: '/inventory', search: { ...search, type: v === 'all' ? undefined : v, page: 1 } as Record }) } function handleLowStockChange(v: string) { const on = v === 'true' setLowStockFilter(on) - navigate({ to: '/inventory', search: { ...search, lowStock: on ? 'true' : undefined, page: 1 } as any }) + navigate({ to: '/inventory', search: { ...search, lowStock: on ? 'true' : undefined, page: 1 } as Record }) } const columns: Column[] = [ @@ -246,7 +246,7 @@ function InventoryPage() { order={params.order} onPageChange={setPage} onSort={setSort} - onRowClick={(p) => navigate({ to: '/inventory/$productId', params: { productId: p.id }, search: {} as any })} + onRowClick={(p) => navigate({ to: '/inventory/$productId', params: { productId: p.id }, search: {} as Record })} />
) diff --git a/packages/admin/src/routes/_authenticated/inventory/suppliers/index.tsx b/packages/admin/src/routes/_authenticated/inventory/suppliers/index.tsx index 5d05eee..ac551f9 100644 --- a/packages/admin/src/routes/_authenticated/inventory/suppliers/index.tsx +++ b/packages/admin/src/routes/_authenticated/inventory/suppliers/index.tsx @@ -130,7 +130,7 @@ function SuppliersPage() { New Supplier { createMutation.mutate(data) }} loading={createMutation.isPending} /> diff --git a/packages/admin/src/routes/_authenticated/lessons/enrollments/$enrollmentId.tsx b/packages/admin/src/routes/_authenticated/lessons/enrollments/$enrollmentId.tsx index e904845..1c88f64 100644 --- a/packages/admin/src/routes/_authenticated/lessons/enrollments/$enrollmentId.tsx +++ b/packages/admin/src/routes/_authenticated/lessons/enrollments/$enrollmentId.tsx @@ -21,7 +21,7 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/u import { ArrowLeft, RefreshCw } from 'lucide-react' import { toast } from 'sonner' import { useAuthStore } from '@/stores/auth.store' -import type { LessonSession, LessonPlan, LessonPlanTemplate } from '@/types/lesson' +import type { Enrollment, LessonSession, LessonPlan, LessonPlanTemplate } from '@/types/lesson' export const Route = createFileRoute('/_authenticated/lessons/enrollments/$enrollmentId')({ validateSearch: (search: Record) => ({ @@ -81,7 +81,7 @@ function EnrollmentDetailPage() { const tab = search.tab function setTab(t: string) { - navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId }, search: { tab: t } as any }) + navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId }, search: { tab: t } as Record }) } const { data: enrollment, isLoading } = useQuery(enrollmentDetailOptions(enrollmentId)) @@ -131,7 +131,7 @@ function EnrollmentDetailPage() { return (
-
@@ -193,7 +193,17 @@ const BILLING_UNITS = [ function DetailsTab({ enrollment, slotLabel, lessonTypeName, instructorName, canEdit, onSave, saving, onStatusChange, statusChanging, -}: any) { +}: { + enrollment: Enrollment + slotLabel: string + lessonTypeName: string | undefined + instructorName: string | undefined + canEdit: boolean + onSave: (data: Record) => void + saving: boolean + onStatusChange: (status: string) => void + statusChanging: boolean +}) { const [rate, setRate] = useState(enrollment.rate ?? '') const [billingInterval, setBillingInterval] = useState(String(enrollment.billingInterval ?? 1)) const [billingUnit, setBillingUnit] = useState(enrollment.billingUnit ?? 'month') @@ -334,7 +344,7 @@ function SessionsTab({ enrollmentId, onGenerate, generating }: { enrollmentId: s total={data?.data?.length ?? 0} onPageChange={() => {}} onSort={() => {}} - onRowClick={(s) => navigate({ to: '/lessons/sessions/$sessionId', params: { sessionId: s.id }, search: {} as any })} + onRowClick={(s) => navigate({ to: '/lessons/sessions/$sessionId', params: { sessionId: s.id }, search: {} as Record })} />
) @@ -373,7 +383,7 @@ function LessonPlanTab({ enrollmentId, memberId, canEdit }: { enrollmentId: stri queryClient.invalidateQueries({ queryKey: lessonPlanKeys.all }) toast.success('Plan created from template') setTemplatePickerOpen(false) - navigate({ to: '/lessons/plans/$planId', params: { planId: plan.id }, search: {} as any }) + navigate({ to: '/lessons/plans/$planId', params: { planId: plan.id }, search: {} as Record }) }, onError: (err) => toast.error(err.message), }) @@ -391,7 +401,7 @@ function LessonPlanTab({ enrollmentId, memberId, canEdit }: { enrollmentId: stri {Math.round(activePlan.progress)}% complete

-
diff --git a/packages/admin/src/routes/_authenticated/lessons/enrollments/index.tsx b/packages/admin/src/routes/_authenticated/lessons/enrollments/index.tsx index d543060..c62611f 100644 --- a/packages/admin/src/routes/_authenticated/lessons/enrollments/index.tsx +++ b/packages/admin/src/routes/_authenticated/lessons/enrollments/index.tsx @@ -43,9 +43,9 @@ function statusBadge(status: string) { } const columns: Column[] = [ - { key: 'member_name', header: 'Member', sortable: true, render: (e) => {(e as any).memberName ?? e.memberId} }, - { key: 'instructor_name', header: 'Instructor', render: (e) => <>{(e as any).instructorName ?? e.instructorId} }, - { key: 'slot_info', header: 'Day / Time', render: (e) => <>{(e as any).slotInfo ?? '—'} }, + { key: 'member_name', header: 'Member', sortable: true, render: (e) => {e.memberName ?? e.memberId} }, + { key: 'instructor_name', header: 'Instructor', render: (e) => <>{e.instructorName ?? e.instructorId} }, + { key: 'slot_info', header: 'Day / Time', render: (e) => <>{e.slotInfo ?? '—'} }, { key: 'status', header: 'Status', sortable: true, render: (e) => statusBadge(e.status) }, { key: 'start_date', header: 'Start', sortable: true, render: (e) => <>{new Date(e.startDate + 'T00:00:00').toLocaleDateString()} }, { key: 'rate', header: 'Rate', render: (e) => <>{e.rate ? `$${e.rate}${e.billingInterval ? ` / ${e.billingInterval} ${e.billingUnit}` : ''}` : } }, @@ -72,7 +72,7 @@ function EnrollmentsListPage() { function handleStatusChange(v: string) { const s = v === 'all' ? '' : v setStatusFilter(s) - navigate({ to: '/lessons/enrollments', search: { ...search, status: s || undefined, page: 1 } as any }) + navigate({ to: '/lessons/enrollments', search: { ...search, status: s || undefined, page: 1 } as Record }) } return ( @@ -80,7 +80,7 @@ function EnrollmentsListPage() {

Enrollments

{hasPermission('lessons.edit') && ( - )} @@ -125,7 +125,7 @@ function EnrollmentsListPage() { order={params.order} onPageChange={setPage} onSort={setSort} - onRowClick={(e) => navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId: e.id }, search: {} as any })} + onRowClick={(e) => navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId: e.id }, search: {} as Record })} />
) diff --git a/packages/admin/src/routes/_authenticated/lessons/enrollments/new.tsx b/packages/admin/src/routes/_authenticated/lessons/enrollments/new.tsx index af291f2..c47ba82 100644 --- a/packages/admin/src/routes/_authenticated/lessons/enrollments/new.tsx +++ b/packages/admin/src/routes/_authenticated/lessons/enrollments/new.tsx @@ -108,7 +108,7 @@ function NewEnrollmentPage() { }, onSuccess: (enrollment) => { toast.success('Enrollment created') - navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId: enrollment.id }, search: {} as any }) + navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId: enrollment.id }, search: {} as Record }) }, onError: (err) => toast.error(err.message), }) @@ -141,7 +141,7 @@ function NewEnrollmentPage() { return (
-

New Enrollment

@@ -282,7 +282,7 @@ function NewEnrollmentPage() { -
diff --git a/packages/admin/src/routes/_authenticated/lessons/plans/$planId.tsx b/packages/admin/src/routes/_authenticated/lessons/plans/$planId.tsx index 2a203ee..17c1863 100644 --- a/packages/admin/src/routes/_authenticated/lessons/plans/$planId.tsx +++ b/packages/admin/src/routes/_authenticated/lessons/plans/$planId.tsx @@ -93,7 +93,7 @@ function LessonPlanDetailPage() { return (
-
diff --git a/packages/admin/src/routes/_authenticated/lessons/plans/index.tsx b/packages/admin/src/routes/_authenticated/lessons/plans/index.tsx index 3d49e80..9c27b4e 100644 --- a/packages/admin/src/routes/_authenticated/lessons/plans/index.tsx +++ b/packages/admin/src/routes/_authenticated/lessons/plans/index.tsx @@ -84,7 +84,7 @@ function LessonPlansPage() { order={params.order} onPageChange={setPage} onSort={setSort} - onRowClick={(p) => navigate({ to: '/lessons/plans/$planId', params: { planId: p.id }, search: {} as any })} + onRowClick={(p) => navigate({ to: '/lessons/plans/$planId', params: { planId: p.id }, search: {} as Record })} />
) diff --git a/packages/admin/src/routes/_authenticated/lessons/schedule/index.tsx b/packages/admin/src/routes/_authenticated/lessons/schedule/index.tsx index f3bb71c..0dbe820 100644 --- a/packages/admin/src/routes/_authenticated/lessons/schedule/index.tsx +++ b/packages/admin/src/routes/_authenticated/lessons/schedule/index.tsx @@ -49,7 +49,7 @@ function ScheduleHubPage() { const canAdmin = hasPermission('lessons.admin') function setTab(t: string) { - navigate({ to: '/lessons/schedule', search: { ...search, tab: t, page: 1 } as any }) + navigate({ to: '/lessons/schedule', search: { ...search, tab: t, page: 1 } as Record }) } return ( @@ -90,7 +90,7 @@ const instructorColumns: Column[] = [ }, ] -function InstructorsTab({ canAdmin, search: _search }: { canAdmin: boolean; search: any }) { +function InstructorsTab({ canAdmin, search: _search }: { canAdmin: boolean; search: Record }) { const navigate = useNavigate() const queryClient = useQueryClient() const { params, setPage, setSearch, setSort } = usePagination() @@ -152,7 +152,7 @@ function InstructorsTab({ canAdmin, search: _search }: { canAdmin: boolean; sear order={params.order} onPageChange={setPage} onSort={setSort} - onRowClick={(i) => navigate({ to: '/lessons/schedule/instructors/$instructorId', params: { instructorId: i.id }, search: {} as any })} + onRowClick={(i) => navigate({ to: '/lessons/schedule/instructors/$instructorId', params: { instructorId: i.id }, search: {} as Record })} />
) @@ -169,7 +169,7 @@ const lessonTypeColumns: Column[] = [ { key: 'is_active', header: 'Status', render: (lt) => {lt.isActive ? 'Active' : 'Inactive'} }, ] -function LessonTypesTab({ canAdmin, search: _search }: { canAdmin: boolean; search: any }) { +function LessonTypesTab({ canAdmin, search: _search }: { canAdmin: boolean; search: Record }) { const queryClient = useQueryClient() const { params, setPage, setSearch, setSort } = usePagination() const [searchInput, setSearchInput] = useState(params.q ?? '') @@ -215,8 +215,8 @@ function LessonTypesTab({ canAdmin, search: _search }: { canAdmin: boolean; sear const columnsWithActions: Column[] = [ ...lessonTypeColumns, ...(canAdmin ? [{ - key: 'actions' as any, - header: '' as any, + key: 'actions', + header: '', render: (lt: LessonType) => (
@@ -298,7 +298,7 @@ const gradingScaleColumns: Column[] = [ { key: 'is_active', header: 'Status', render: (gs) => {gs.isActive ? 'Active' : 'Inactive'} }, ] -function GradingScalesTab({ canAdmin, search: _search }: { canAdmin: boolean; search: any }) { +function GradingScalesTab({ canAdmin, search: _search }: { canAdmin: boolean; search: Record }) { const queryClient = useQueryClient() const { params, setPage, setSort } = usePagination() const [createOpen, setCreateOpen] = useState(false) @@ -327,8 +327,8 @@ function GradingScalesTab({ canAdmin, search: _search }: { canAdmin: boolean; se const columnsWithActions: Column[] = [ ...gradingScaleColumns, ...(canAdmin ? [{ - key: 'actions' as any, - header: '' as any, + key: 'actions', + header: '', render: (gs: GradingScale) => (
diff --git a/packages/admin/src/routes/_authenticated/lessons/sessions/$sessionId.tsx b/packages/admin/src/routes/_authenticated/lessons/sessions/$sessionId.tsx index c5752e5..c6a9a69 100644 --- a/packages/admin/src/routes/_authenticated/lessons/sessions/$sessionId.tsx +++ b/packages/admin/src/routes/_authenticated/lessons/sessions/$sessionId.tsx @@ -18,7 +18,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { ArrowLeft, CheckSquare, Square } from 'lucide-react' import { toast } from 'sonner' import { useAuthStore } from '@/stores/auth.store' -import type { LessonPlan, LessonPlanSection } from '@/types/lesson' +import type { LessonPlan, LessonPlanSection, LessonSession } from '@/types/lesson' export const Route = createFileRoute('/_authenticated/lessons/sessions/$sessionId')({ component: SessionDetailPage, @@ -126,7 +126,7 @@ function SessionDetailPage() { return (
-
@@ -137,7 +137,7 @@ function SessionDetailPage() { } className="text-sm text-primary hover:underline" > View Enrollment @@ -209,7 +209,12 @@ function SessionDetailPage() { // ─── Notes Card ─────────────────────────────────────────────────────────────── -function NotesCard({ session, canEdit, onSave, saving }: any) { +function NotesCard({ session, canEdit, onSave, saving }: { + session: LessonSession + canEdit: boolean + onSave: (data: Record) => void + saving: boolean +}) { const [instructorNotes, setInstructorNotes] = useState(session.instructorNotes ?? '') const [memberNotes, setMemberNotes] = useState(session.memberNotes ?? '') const [homeworkAssigned, setHomeworkAssigned] = useState(session.homeworkAssigned ?? '') diff --git a/packages/admin/src/routes/_authenticated/lessons/sessions/index.tsx b/packages/admin/src/routes/_authenticated/lessons/sessions/index.tsx index d0d5833..0177076 100644 --- a/packages/admin/src/routes/_authenticated/lessons/sessions/index.tsx +++ b/packages/admin/src/routes/_authenticated/lessons/sessions/index.tsx @@ -92,13 +92,13 @@ function SessionsPage() { const weekEnd = endOfWeek(weekStart, { weekStartsOn: 0 }) function setView(v: 'list' | 'week') { - navigate({ to: '/lessons/sessions', search: { ...search, view: v, page: 1 } as any }) + navigate({ to: '/lessons/sessions', search: { ...search, view: v, page: 1 } as Record }) } function handleStatusChange(v: string) { const s = v === 'all' ? '' : v setStatusFilter(s) - navigate({ to: '/lessons/sessions', search: { ...search, status: s || undefined, page: 1 } as any }) + navigate({ to: '/lessons/sessions', search: { ...search, status: s || undefined, page: 1 } as Record }) } // List query @@ -189,7 +189,7 @@ function SessionsPage() { order={params.order} onPageChange={setPage} onSort={setSort} - onRowClick={(s) => navigate({ to: '/lessons/sessions/$sessionId', params: { sessionId: s.id }, search: {} as any })} + onRowClick={(s) => navigate({ to: '/lessons/sessions/$sessionId', params: { sessionId: s.id }, search: {} as Record })} /> )} @@ -249,7 +249,7 @@ function SessionsPage() { {daySessions.map((s) => (
@@ -93,7 +93,7 @@ function TemplateDetailPage() { // ─── Edit Form ──────────────────────────────────────────────────────────────── -function EditTemplateForm({ template, templateId, queryClient }: { template: LessonPlanTemplate; templateId: string; queryClient: any }) { +function EditTemplateForm({ template, templateId, queryClient }: { template: LessonPlanTemplate; templateId: string; queryClient: ReturnType }) { const [name, setName] = useState(template.name) const [description, setDescription] = useState(template.description ?? '') const [instrument, setInstrument] = useState(template.instrument ?? '') @@ -218,7 +218,7 @@ function InstantiateDialog({ template, templateId, open, onClose }: { }), onSuccess: (plan) => { toast.success('Plan created from template') - navigate({ to: '/lessons/plans/$planId', params: { planId: plan.id }, search: {} as any }) + navigate({ to: '/lessons/plans/$planId', params: { planId: plan.id }, search: {} as Record }) }, onError: (err) => toast.error(err.message), }) @@ -293,7 +293,7 @@ function InstantiateDialog({ template, templateId, open, onClose }: { Not linked to enrollment - {enrollments.map((e: any) => ( + {enrollments.map((e: Enrollment) => ( Enrollment {e.id.slice(-6)} ))} diff --git a/packages/admin/src/routes/_authenticated/lessons/templates/index.tsx b/packages/admin/src/routes/_authenticated/lessons/templates/index.tsx index 6819fc6..8844746 100644 --- a/packages/admin/src/routes/_authenticated/lessons/templates/index.tsx +++ b/packages/admin/src/routes/_authenticated/lessons/templates/index.tsx @@ -81,8 +81,8 @@ function TemplatesListPage() { const columnsWithActions: Column[] = [ ...columns, ...(canAdmin ? [{ - key: 'actions' as any, - header: '' as any, + key: 'actions', + header: '', render: (t: LessonPlanTemplate) => ( )} @@ -126,7 +126,7 @@ function TemplatesListPage() { order={params.order} onPageChange={setPage} onSort={setSort} - onRowClick={(t) => navigate({ to: '/lessons/templates/$templateId', params: { templateId: t.id }, search: {} as any })} + onRowClick={(t) => navigate({ to: '/lessons/templates/$templateId', params: { templateId: t.id }, search: {} as Record })} />
) diff --git a/packages/admin/src/routes/_authenticated/lessons/templates/new.tsx b/packages/admin/src/routes/_authenticated/lessons/templates/new.tsx index 5ddb1f4..ceaa5d4 100644 --- a/packages/admin/src/routes/_authenticated/lessons/templates/new.tsx +++ b/packages/admin/src/routes/_authenticated/lessons/templates/new.tsx @@ -45,7 +45,7 @@ function NewTemplatePage() { }), onSuccess: (template) => { toast.success('Template created') - navigate({ to: '/lessons/templates/$templateId', params: { templateId: template.id }, search: {} as any }) + navigate({ to: '/lessons/templates/$templateId', params: { templateId: template.id }, search: {} as Record }) }, onError: (err) => toast.error(err.message), }) @@ -63,7 +63,7 @@ function NewTemplatePage() { return (
-

New Template

@@ -112,7 +112,7 @@ function NewTemplatePage() { -
diff --git a/packages/admin/src/routes/_authenticated/members/$memberId.tsx b/packages/admin/src/routes/_authenticated/members/$memberId.tsx index 639a538..2e6b1a1 100644 --- a/packages/admin/src/routes/_authenticated/members/$memberId.tsx +++ b/packages/admin/src/routes/_authenticated/members/$memberId.tsx @@ -70,11 +70,11 @@ function statusBadge(status: string) { return {status} } -const enrollmentColumns: Column[] = [ +const enrollmentColumns: Column[] = [ { key: 'status', header: 'Status', sortable: true, render: (e) => statusBadge(e.status) }, - { key: 'instructor_name', header: 'Instructor', render: (e) => <>{(e as any).instructorName ?? e.instructorId} }, - { key: 'slot_info', header: 'Day / Time', render: (e) => <>{(e as any).slotInfo ?? '—'} }, - { key: 'lesson_type', header: 'Lesson', render: (e) => <>{(e as any).lessonTypeName ?? '—'} }, + { key: 'instructor_name', header: 'Instructor', render: (e) => <>{e.instructorName ?? e.instructorId} }, + { key: 'slot_info', header: 'Day / Time', render: (e) => <>{e.slotInfo ?? '—'} }, + { key: 'lesson_type', header: 'Lesson', render: (e) => <>{e.lessonTypeName ?? '—'} }, { key: 'start_date', header: 'Start', sortable: true, render: (e) => <>{new Date(e.startDate + 'T00:00:00').toLocaleDateString()} }, { key: 'rate', header: 'Rate', render: (e) => <>{e.rate ? `$${e.rate} / ${e.billingInterval} ${e.billingUnit}` : } }, ] @@ -161,7 +161,7 @@ function MemberDetailPage() { }) function setTab(t: string) { - navigate({ to: '/members/$memberId', params: { memberId }, search: { tab: t } as any }) + navigate({ to: '/members/$memberId', params: { memberId }, search: { tab: t } as Record }) } if (isLoading) { @@ -188,7 +188,7 @@ function MemberDetailPage() {
{/* Header */}
-
@@ -293,7 +293,7 @@ function MemberDetailPage() {

{enrollmentsData?.pagination.total ?? 0} enrollment(s)

{hasPermission('lessons.edit') && ( - )} @@ -307,7 +307,7 @@ function MemberDetailPage() { total={enrollmentsData?.data?.length ?? 0} onPageChange={() => {}} onSort={() => {}} - onRowClick={(e) => navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId: e.id }, search: {} as any })} + onRowClick={(e) => navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId: e.id }, search: {} as Record })} />
)} diff --git a/packages/admin/src/routes/_authenticated/members/index.tsx b/packages/admin/src/routes/_authenticated/members/index.tsx index 9c42873..014ca2e 100644 --- a/packages/admin/src/routes/_authenticated/members/index.tsx +++ b/packages/admin/src/routes/_authenticated/members/index.tsx @@ -84,7 +84,7 @@ function MembersListPage() { - navigate({ to: '/members/$memberId', params: { memberId: row.id }, search: {} as any })}> + navigate({ to: '/members/$memberId', params: { memberId: row.id }, search: {} as Record })}> Edit @@ -134,7 +134,7 @@ function MembersListPage() { order={params.order} onPageChange={setPage} onSort={setSort} - onRowClick={(member) => navigate({ to: '/members/$memberId', params: { memberId: member.id }, search: {} as any })} + onRowClick={(member) => navigate({ to: '/members/$memberId', params: { memberId: member.id }, search: {} as Record })} />
) diff --git a/packages/admin/src/routes/_authenticated/repair-batches/$batchId.tsx b/packages/admin/src/routes/_authenticated/repair-batches/$batchId.tsx index 0dfda66..f1ec150 100644 --- a/packages/admin/src/routes/_authenticated/repair-batches/$batchId.tsx +++ b/packages/admin/src/routes/_authenticated/repair-batches/$batchId.tsx @@ -96,12 +96,12 @@ function RepairBatchDetailPage() { const totalActual = tickets.reduce((sum, t) => sum + (t.actualCost ? parseFloat(t.actualCost) : 0), 0) function handleTicketClick(ticket: RepairTicket) { - navigate({ to: '/repairs/$ticketId', params: { ticketId: ticket.id }, search: {} as any }) + navigate({ to: '/repairs/$ticketId', params: { ticketId: ticket.id }, search: {} as Record }) } function handleAddRepair() { // Navigate to new repair with batch and account pre-linked - navigate({ to: '/repairs/new', search: { batchId, batchName: batch!.batchNumber ?? '', accountId: batch!.accountId, contactName: batch!.contactName ?? '' } as any }) + navigate({ to: '/repairs/new', search: { batchId, batchName: batch!.batchNumber ?? '', accountId: batch!.accountId, contactName: batch!.contactName ?? '' } as Record }) } async function generateBatchPdf() { @@ -233,7 +233,7 @@ function RepairBatchDetailPage() { return (
-
diff --git a/packages/admin/src/routes/_authenticated/repair-batches/index.tsx b/packages/admin/src/routes/_authenticated/repair-batches/index.tsx index 83a634c..0c1a459 100644 --- a/packages/admin/src/routes/_authenticated/repair-batches/index.tsx +++ b/packages/admin/src/routes/_authenticated/repair-batches/index.tsx @@ -75,7 +75,7 @@ function RepairBatchesListPage() { } function handleRowClick(batch: RepairBatch) { - navigate({ to: '/repair-batches/$batchId', params: { batchId: batch.id }, search: {} as any }) + navigate({ to: '/repair-batches/$batchId', params: { batchId: batch.id }, search: {} as Record }) } return ( diff --git a/packages/admin/src/routes/_authenticated/repair-batches/new.tsx b/packages/admin/src/routes/_authenticated/repair-batches/new.tsx index 26fb8a4..7395f35 100644 --- a/packages/admin/src/routes/_authenticated/repair-batches/new.tsx +++ b/packages/admin/src/routes/_authenticated/repair-batches/new.tsx @@ -50,7 +50,7 @@ function NewRepairBatchPage() { mutationFn: repairBatchMutations.create, onSuccess: (batch) => { toast.success('Repair batch created') - navigate({ to: '/repair-batches/$batchId', params: { batchId: batch.id }, search: {} as any }) + navigate({ to: '/repair-batches/$batchId', params: { batchId: batch.id }, search: {} as Record }) }, onError: (err) => toast.error(err.message), }) @@ -78,7 +78,7 @@ function NewRepairBatchPage() { return (
-

New Repair Batch

@@ -176,7 +176,7 @@ function NewRepairBatchPage() { -
diff --git a/packages/admin/src/routes/_authenticated/repairs/$ticketId.tsx b/packages/admin/src/routes/_authenticated/repairs/$ticketId.tsx index ebc0e1b..5aeff6a 100644 --- a/packages/admin/src/routes/_authenticated/repairs/$ticketId.tsx +++ b/packages/admin/src/routes/_authenticated/repairs/$ticketId.tsx @@ -175,7 +175,7 @@ function RepairTicketDetailPage() {
{/* Header */}
-
diff --git a/packages/admin/src/routes/_authenticated/repairs/index.tsx b/packages/admin/src/routes/_authenticated/repairs/index.tsx index ba07558..1d433eb 100644 --- a/packages/admin/src/routes/_authenticated/repairs/index.tsx +++ b/packages/admin/src/routes/_authenticated/repairs/index.tsx @@ -129,7 +129,7 @@ function RepairsListPage() { } function handleRowClick(ticket: RepairTicket) { - navigate({ to: '/repairs/$ticketId', params: { ticketId: ticket.id }, search: {} as any }) + navigate({ to: '/repairs/$ticketId', params: { ticketId: ticket.id }, search: {} as Record }) } return ( @@ -137,7 +137,7 @@ function RepairsListPage() {

Repairs

{hasPermission('repairs.edit') && ( - diff --git a/packages/admin/src/routes/_authenticated/repairs/new.tsx b/packages/admin/src/routes/_authenticated/repairs/new.tsx index 0dba6f2..2b8f72d 100644 --- a/packages/admin/src/routes/_authenticated/repairs/new.tsx +++ b/packages/admin/src/routes/_authenticated/repairs/new.tsx @@ -136,7 +136,7 @@ function NewRepairPage() { }, onSuccess: (ticket) => { toast.success('Repair ticket created') - navigate({ to: '/repairs/$ticketId', params: { ticketId: ticket.id }, search: {} as any }) + navigate({ to: '/repairs/$ticketId', params: { ticketId: ticket.id }, search: {} as Record }) }, onError: (err) => toast.error(err.message), }) @@ -210,7 +210,7 @@ function NewRepairPage() { return (
-

New Repair Ticket

@@ -314,7 +314,7 @@ function NewRepairPage() {
- setValue('conditionIn', v as 'excellent' | 'good' | 'fair' | 'poor')}> Excellent @@ -486,7 +486,7 @@ function NewRepairPage() { -
diff --git a/packages/admin/src/routes/_authenticated/roles/$roleId.tsx b/packages/admin/src/routes/_authenticated/roles/$roleId.tsx index 31ec29c..b1ba295 100644 --- a/packages/admin/src/routes/_authenticated/roles/$roleId.tsx +++ b/packages/admin/src/routes/_authenticated/roles/$roleId.tsx @@ -100,7 +100,7 @@ function RoleDetailPage() { return (
-
@@ -177,7 +177,7 @@ function RoleDetailPage() { -
diff --git a/packages/admin/src/routes/_authenticated/roles/new.tsx b/packages/admin/src/routes/_authenticated/roles/new.tsx index 7ad7be2..d7b34c4 100644 --- a/packages/admin/src/routes/_authenticated/roles/new.tsx +++ b/packages/admin/src/routes/_authenticated/roles/new.tsx @@ -29,7 +29,7 @@ function NewRolePage() { onSuccess: () => { queryClient.invalidateQueries({ queryKey: rbacKeys.roles }) toast.success('Role created') - navigate({ to: '/roles', search: {} as any }) + navigate({ to: '/roles', search: {} as Record }) }, onError: (err) => toast.error(err.message), }) @@ -153,7 +153,7 @@ function NewRolePage() { -
diff --git a/packages/admin/src/routes/login.tsx b/packages/admin/src/routes/login.tsx index c97d9a2..8e66c2f 100644 --- a/packages/admin/src/routes/login.tsx +++ b/packages/admin/src/routes/login.tsx @@ -7,7 +7,7 @@ export const Route = createFileRoute('/login')({ beforeLoad: () => { const { token } = useAuthStore.getState() if (token) { - throw redirect({ to: '/accounts', search: {} as any }) + throw redirect({ to: '/accounts', search: {} as Record }) } }, component: LoginPage, @@ -30,7 +30,7 @@ function LoginPage() { const res = await login(email, password) setAuth(res.token, res.user) await router.invalidate() - await router.navigate({ to: '/accounts', search: {} as any, replace: true }) + await router.navigate({ to: '/accounts', search: {} as Record, replace: true }) } catch (err) { setError(err instanceof Error ? err.message : 'Login failed') } finally {