fix: add staleTime to job card expense, parts, and services queries; update job card general info and payments received components

This commit is contained in:
humam kerdiah 2026-05-13 17:20:59 +04:00
parent 6b356d2855
commit 05b55b5721
12 changed files with 174 additions and 91 deletions

View File

@ -44,6 +44,7 @@ export default function JobCardExpenseItemsPage({
const { data, isLoading } = useQuery({ const { data, isLoading } = useQuery({
queryKey, queryKey,
queryFn: () => api.jobCards.getExpenseItems(jobCardId), queryFn: () => api.jobCards.getExpenseItems(jobCardId),
staleTime: 30_000,
}) })
const rows = (data as any)?.data ?? [] const rows = (data as any)?.data ?? []

View File

@ -1,21 +1,10 @@
import { getServerApi } from '@garage/api/server'
import { JobCardGeneralInfo } from '@/modules/job-cards/job-card-general-info' import { JobCardGeneralInfo } from '@/modules/job-cards/job-card-general-info'
import DashboardPage from '@/base/components/layout/dashboard/dashboard-page' import DashboardPage from '@/base/components/layout/dashboard/dashboard-page'
import type { JobCardShowData } from '@garage/api'
export default async function JobCardDetailPage(props: { params: Promise<{ id: string }> }) {
const { id } = await props.params
const api = await getServerApi()
const response = await api.jobCards.show(id)
const data = response.data
if (!data) {
return <div className="text-muted-foreground">Job card not found.</div>
}
export default async function JobCardDetailPage() {
return ( return (
<DashboardPage header={null}> <DashboardPage header={null}>
<JobCardGeneralInfo jobCard={data} /> <JobCardGeneralInfo />
</DashboardPage> </DashboardPage>
) )
} }

View File

@ -44,6 +44,7 @@ export default function JobCardPartsPage({
const { data, isLoading } = useQuery({ const { data, isLoading } = useQuery({
queryKey, queryKey,
queryFn: () => api.jobCards.getParts(jobCardId), queryFn: () => api.jobCards.getParts(jobCardId),
staleTime: 30_000,
}) })
const rows = (data as any)?.data ?? [] const rows = (data as any)?.data ?? []

View File

@ -46,6 +46,7 @@ export default function JobCardServicesPage({
const { data, isLoading } = useQuery({ const { data, isLoading } = useQuery({
queryKey, queryKey,
queryFn: () => api.jobCards.getServices(jobCardId), queryFn: () => api.jobCards.getServices(jobCardId),
staleTime: 30_000,
}) })
const rows = (data as any)?.data ?? [] const rows = (data as any)?.data ?? []

View File

@ -1,4 +1,5 @@
import { Geist_Mono, Inter } from "next/font/google" import { Geist_Mono, Inter } from "next/font/google"
import NextTopLoader from "nextjs-toploader"
import { QueryProvider } from "@/shared/components/query-provider" import { QueryProvider } from "@/shared/components/query-provider"
@ -33,6 +34,7 @@ export default function RootLayout({
className={cn("antialiased", fontMono.variable, "font-sans", inter.variable)} className={cn("antialiased", fontMono.variable, "font-sans", inter.variable)}
> >
<body> <body>
<NextTopLoader color="var(--primary)" height={3} showSpinner={false} />
<NuqsAdapter> <NuqsAdapter>
<ThemeProvider> <ThemeProvider>
<QueryProvider>{children}</QueryProvider> <QueryProvider>{children}</QueryProvider>

View File

@ -109,6 +109,7 @@ export default function DashboardDetailsPageLayout({
<Link <Link
key={tab.href} key={tab.href}
href={tab.href} href={tab.href}
prefetch
className={cn( className={cn(
"relative inline-flex items-center justify-center px-3 py-2 text-sm font-medium whitespace-nowrap transition-colors", "relative inline-flex items-center justify-center px-3 py-2 text-sm font-medium whitespace-nowrap transition-colors",
"text-muted-foreground hover:text-foreground", "text-muted-foreground hover:text-foreground",

View File

@ -63,24 +63,48 @@ const DEFAULT_VALUES: EstimateFormValues = {
// ── Mapping helpers ── // ── Mapping helpers ──
function customerLabel(c: any): string | undefined {
if (!c) return undefined
const name = [c.first_name, c.last_name].filter(Boolean).join(" ").trim()
return c.company_name || name || undefined
}
function vehicleLabel(v: any): string | undefined {
if (!v) return undefined
const core = [v.make, v.model, v.sub_model].filter(Boolean).join(" ")
const suffix = [v.year, v.license_plate].filter(Boolean).join(" - ")
if (core && suffix) return `${core} (${suffix})`
return core || suffix || undefined
}
function mapToFormValues(data: unknown): EstimateFormValues { function mapToFormValues(data: unknown): EstimateFormValues {
const d = (data as any)?.data ?? data ?? {} const d = (data as any)?.data ?? data ?? {}
return { return {
title: d.title || "", title: d.title || "",
customer: toRelation(d.customer_id, d.customer_name), customer: toRelation(
vehicle: toRelation(d.vehicle_id, d.vehicle_name), d.customer_id ?? d.customer?.id,
department: toRelation(d.department_id, d.department_name), d.customer_name ?? customerLabel(d.customer),
insurance_type: toRelation(d.insurance_type_id, d.insurance_type_title ?? d.insurance_type_name ?? d.insurance_type?.title), ),
vehicle: toRelation(
d.vehicle_id ?? d.vehicle?.id,
d.vehicle_name ?? vehicleLabel(d.vehicle),
),
department: toRelation(
d.department_id ?? d.department?.id,
d.department_name ?? d.department?.name ?? d.department?.title,
),
insurance_type: toRelation(
d.insurance_type_id ?? d.insurance_type?.id,
d.insurance_type_title ?? d.insurance_type_name ?? d.insurance_type?.title ?? d.insurance_type?.name,
),
insurer: toRelation( insurer: toRelation(
d.insurer_id, d.insurer_id ?? d.insurer?.id,
d.insurer_name d.insurer_name ?? customerLabel(d.insurer),
?? [d.insurer?.first_name, d.insurer?.last_name].filter(Boolean).join(" ")
?? d.insurer?.company_name,
), ),
service_writer: toRelation( service_writer: toRelation(
d.service_writer_id, d.service_writer_id ?? d.service_writer?.id,
d.service_writer_name ?? [d.service_writer?.first_name, d.service_writer?.last_name].filter(Boolean).join(" "), d.service_writer_name ?? customerLabel(d.service_writer),
), ),
estimate_number: d.estimate_number || "", estimate_number: d.estimate_number || "",
date: d.date ? d.date.split("T")[0] : "", date: d.date ? d.date.split("T")[0] : "",

View File

@ -1,3 +1,5 @@
"use client"
import { import {
ClipboardList, ClipboardList,
Calendar, Calendar,
@ -30,6 +32,7 @@ import PaymentReceivedPage from "@/app/(authenticated)/sales/payment-received/pa
import JobCardPaymentsReceived from "./job-card-payments-received" import JobCardPaymentsReceived from "./job-card-payments-received"
import { formatDate } from "@/shared/utils/formatters" import { formatDate } from "@/shared/utils/formatters"
import type { JobCardShowData } from "@garage/api" import type { JobCardShowData } from "@garage/api"
import { useJobCard } from "./job-card-context"
type JobCard = JobCardShowData type JobCard = JobCardShowData
@ -67,7 +70,14 @@ const statusColorMap: Record<string, string> = {
cancelled: "destructive", cancelled: "destructive",
} }
export function JobCardGeneralInfo({ jobCard }: { jobCard: JobCard }) { export function JobCardGeneralInfo({ jobCard: jobCardProp }: { jobCard?: JobCard } = {}) {
const jobCardFromContext = useJobCard()
const jobCard = (jobCardProp ?? jobCardFromContext) as JobCard
if (!jobCard) {
return <div className="text-muted-foreground">Job card not found.</div>
}
const formatStatus = (status?: string) => { const formatStatus = (status?: string) => {
if (!status) return null if (!status) return null
return status return status

View File

@ -17,12 +17,20 @@ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/shared/co
import { Button } from "@/shared/components/ui/button" import { Button } from "@/shared/components/ui/button"
import { useJobCard } from "./job-card-context" import { useJobCard } from "./job-card-context"
import { formatDate, formatCurrency } from "@/shared/utils/formatters" import { formatDate, formatCurrency } from "@/shared/utils/formatters"
import { useState } from "react"
export default function JobCardPaymentsReceived() { export default function JobCardPaymentsReceived() {
const jobCard = useJobCard() const jobCard = useJobCard()
const [hasOpened, setHasOpened] = useState(false)
return ( return (
<Collapsible defaultOpen={false} className="group/collapsible"> <Collapsible
defaultOpen={false}
className="group/collapsible"
onOpenChange={(open) => {
if (open) setHasOpened(true)
}}
>
<Card> <Card>
<CardHeader> <CardHeader>
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
@ -36,6 +44,7 @@ export default function JobCardPaymentsReceived() {
</CardHeader> </CardHeader>
<CollapsibleContent> <CollapsibleContent>
<CardContent className="pt-0"> <CardContent className="pt-0">
{hasOpened && (
<CrudResource<PaymentReceivedClient> <CrudResource<PaymentReceivedClient>
extraParams={{ job_card_id: jobCard?.id }} extraParams={{ job_card_id: jobCard?.id }}
routeKey={PAYMENT_RECEIVED_ROUTES.INDEX} routeKey={PAYMENT_RECEIVED_ROUTES.INDEX}
@ -48,6 +57,8 @@ export default function JobCardPaymentsReceived() {
resourceId={resourceId} resourceId={resourceId}
defaultJobCard={{ id: jobCard?.id, title: jobCard?.title }} defaultJobCard={{ id: jobCard?.id, title: jobCard?.title }}
invoiceCustomer={jobCard?.customer as any} invoiceCustomer={jobCard?.customer as any}
lockJobCard
lockCustomer
onSuccess={invalidateQuery} onSuccess={invalidateQuery}
/> />
)} )}
@ -127,6 +138,7 @@ export default function JobCardPaymentsReceived() {
actionsColumn(), actionsColumn(),
]} ]}
/> />
)}
</CardContent> </CardContent>
</CollapsibleContent> </CollapsibleContent>
</Card> </Card>

View File

@ -5,7 +5,8 @@ import { AlertTriangle, Plus, Save } from "lucide-react"
import { Button } from "@/shared/components/ui/button" import { Button } from "@/shared/components/ui/button"
import { Alert, AlertTitle } from "@/shared/components/ui/alert" import { Alert, AlertTitle } from "@/shared/components/ui/alert"
import { FieldGroup } from "@/shared/components/ui/field" import { Field, FieldGroup, FieldLabel } from "@/shared/components/ui/field"
import { Input } from "@/shared/components/ui/input"
import { import {
Rhform, Rhform,
RhfTextField, RhfTextField,
@ -36,6 +37,8 @@ export type PaymentReceivedFormProps = {
invoiceId?: string | null invoiceId?: string | null
invoiceCustomer?: { id?: number | null; first_name?: string | null; last_name?: string | null } | null invoiceCustomer?: { id?: number | null; first_name?: string | null; last_name?: string | null } | null
invoiceAmount?: number | string | null invoiceAmount?: number | string | null
lockJobCard?: boolean
lockCustomer?: boolean
} }
// ── Default values ── // ── Default values ──
@ -90,27 +93,33 @@ const STORE_OBJECT = { getOptionValue: (o: any) => o, getOptionLabel: (o: any) =
// ── Component ── // ── Component ──
export function PaymentReceivedForm({ resourceId, initialData, onSuccess, defaultJobCard, invoiceId, invoiceCustomer, invoiceAmount }: PaymentReceivedFormProps) { export function PaymentReceivedForm({ resourceId, initialData, onSuccess, defaultJobCard, invoiceId, invoiceCustomer, invoiceAmount, lockJobCard, lockCustomer }: PaymentReceivedFormProps) {
const api = useAuthApi() const api = useAuthApi()
const isJobCardLocked = !resourceId && (lockJobCard ?? !!defaultJobCard?.id)
const isCustomerLocked = !resourceId && (lockCustomer ?? !!invoiceCustomer?.id)
const customerLabel = invoiceCustomer?.first_name
? `${invoiceCustomer.first_name} ${invoiceCustomer.last_name || ""}`.trim()
: (invoiceCustomer as any)?.company_name || (invoiceCustomer as any)?.name || ""
const resolvedInitialData = useMemo(() => { const resolvedInitialData = useMemo(() => {
const base: any = { ...(initialData as any) } const base: any = { ...(initialData as any) }
if (!resourceId) { if (!resourceId) {
if (defaultJobCard?.id != null) { if (defaultJobCard?.id != null) {
base.job_card = toRelation(defaultJobCard.id, defaultJobCard.title ?? undefined) base.job_card_id = defaultJobCard.id
base.job_card_name = defaultJobCard.title ?? undefined
} }
if (invoiceCustomer?.id != null) { if (invoiceCustomer?.id != null) {
const customerLabel = invoiceCustomer.first_name base.customer_id = invoiceCustomer.id
? `${invoiceCustomer.first_name} ${invoiceCustomer.last_name || ""}`.trim() base.customer_name = customerLabel
: (invoiceCustomer as any).company_name || (invoiceCustomer as any).name || undefined
base.customer = toRelation(invoiceCustomer.id, customerLabel)
} }
if (invoiceAmount != null && invoiceAmount !== "") { if (invoiceAmount != null && invoiceAmount !== "") {
base.amount_received = Number(invoiceAmount) base.amount_received = Number(invoiceAmount)
} }
} }
return Object.keys(base).length ? base : initialData return Object.keys(base).length ? base : initialData
}, [resourceId, defaultJobCard, initialData, invoiceCustomer, invoiceAmount]) }, [resourceId, defaultJobCard, initialData, invoiceCustomer, invoiceAmount, customerLabel])
const { form, isEditing } = useResourceForm<PaymentReceivedFormValues, any>({ const { form, isEditing } = useResourceForm<PaymentReceivedFormValues, any>({
schema: paymentReceivedFormSchema, schema: paymentReceivedFormSchema,
@ -153,6 +162,14 @@ export function PaymentReceivedForm({ resourceId, initialData, onSuccess, defaul
<FieldGroup> <FieldGroup>
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2"> <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
{isCustomerLocked ? (
<Field>
<FieldLabel>
Customer<span className="text-destructive ms-0.5">*</span>
</FieldLabel>
<Input value={customerLabel} readOnly disabled />
</Field>
) : (
<RhfAsyncSelectField <RhfAsyncSelectField
name="customer" name="customer"
label="Customer" label="Customer"
@ -168,6 +185,13 @@ export function PaymentReceivedForm({ resourceId, initialData, onSuccess, defaul
})} })}
{...STORE_OBJECT} {...STORE_OBJECT}
/> />
)}
{isJobCardLocked ? (
<Field>
<FieldLabel>Job Card</FieldLabel>
<Input value={defaultJobCard?.title ?? ""} readOnly disabled />
</Field>
) : (
<RhfAsyncSelectField <RhfAsyncSelectField
name="job_card" name="job_card"
label="Job Card" label="Job Card"
@ -180,6 +204,7 @@ export function PaymentReceivedForm({ resourceId, initialData, onSuccess, defaul
})} })}
{...STORE_OBJECT} {...STORE_OBJECT}
/> />
)}
</div> </div>
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2"> <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">

View File

@ -31,6 +31,7 @@
"lucide-react": "^0.577.0", "lucide-react": "^0.577.0",
"next": "16.1.7", "next": "16.1.7",
"next-themes": "^0.4.6", "next-themes": "^0.4.6",
"nextjs-toploader": "^3.9.17",
"nuqs": "^2.8.9", "nuqs": "^2.8.9",
"object-to-formdata": "^4.5.1", "object-to-formdata": "^4.5.1",
"radix-ui": "^1.4.3", "radix-ui": "^1.4.3",

76
pnpm-lock.yaml generated
View File

@ -62,6 +62,9 @@ importers:
next-themes: next-themes:
specifier: ^0.4.6 specifier: ^0.4.6
version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
nextjs-toploader:
specifier: ^3.9.17
version: 3.9.17(next@16.1.7(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
nuqs: nuqs:
specifier: ^2.8.9 specifier: ^2.8.9
version: 2.8.9(next@16.1.7(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) version: 2.8.9(next@16.1.7(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
@ -3707,6 +3710,13 @@ packages:
sass: sass:
optional: true optional: true
nextjs-toploader@3.9.17:
resolution: {integrity: sha512-9OF0KSSLtoSAuNg2LZ3aTl4hR9mBDj5L9s9DZiFCbMlXehyICGjkIz5dVGzuATU2bheJZoBdFgq9w07AKSuQQw==}
peerDependencies:
next: '>= 6.0.0'
react: '>= 16.0.0'
react-dom: '>= 16.0.0'
node-domexception@1.0.0: node-domexception@1.0.0:
resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
engines: {node: '>=10.5.0'} engines: {node: '>=10.5.0'}
@ -3727,6 +3737,9 @@ packages:
resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
engines: {node: '>=18'} engines: {node: '>=18'}
nprogress@0.2.0:
resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
nuqs@2.8.9: nuqs@2.8.9:
resolution: {integrity: sha512-8ou6AEwsxMWSYo2qkfZtYFVzngwbKmg4c00HVxC1fF6CEJv3Fwm6eoZmfVPALB+vw8Udo7KL5uy96PFcYe1BIQ==} resolution: {integrity: sha512-8ou6AEwsxMWSYo2qkfZtYFVzngwbKmg4c00HVxC1fF6CEJv3Fwm6eoZmfVPALB+vw8Udo7KL5uy96PFcYe1BIQ==}
peerDependencies: peerDependencies:
@ -4921,7 +4934,7 @@ snapshots:
'@babel/types': 7.29.0 '@babel/types': 7.29.0
'@jridgewell/remapping': 2.3.5 '@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0 convert-source-map: 2.0.0
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
gensync: 1.0.0-beta.2 gensync: 1.0.0-beta.2
json5: 2.2.3 json5: 2.2.3
semver: 6.3.1 semver: 6.3.1
@ -5079,7 +5092,7 @@ snapshots:
'@babel/parser': 7.29.2 '@babel/parser': 7.29.2
'@babel/template': 7.28.6 '@babel/template': 7.28.6
'@babel/types': 7.29.0 '@babel/types': 7.29.0
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -5189,7 +5202,7 @@ snapshots:
'@eslint/config-array@0.21.1': '@eslint/config-array@0.21.1':
dependencies: dependencies:
'@eslint/object-schema': 2.1.7 '@eslint/object-schema': 2.1.7
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
minimatch: 3.1.2 minimatch: 3.1.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -5197,7 +5210,7 @@ snapshots:
'@eslint/config-array@0.21.2': '@eslint/config-array@0.21.2':
dependencies: dependencies:
'@eslint/object-schema': 2.1.7 '@eslint/object-schema': 2.1.7
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
minimatch: 3.1.5 minimatch: 3.1.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -5213,7 +5226,7 @@ snapshots:
'@eslint/eslintrc@3.3.1': '@eslint/eslintrc@3.3.1':
dependencies: dependencies:
ajv: 6.12.6 ajv: 6.12.6
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
espree: 10.4.0 espree: 10.4.0
globals: 14.0.0 globals: 14.0.0
ignore: 5.3.2 ignore: 5.3.2
@ -5227,7 +5240,7 @@ snapshots:
'@eslint/eslintrc@3.3.5': '@eslint/eslintrc@3.3.5':
dependencies: dependencies:
ajv: 6.14.0 ajv: 6.14.0
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
espree: 10.4.0 espree: 10.4.0
globals: 14.0.0 globals: 14.0.0
ignore: 5.3.2 ignore: 5.3.2
@ -6557,7 +6570,7 @@ snapshots:
'@typescript-eslint/types': 8.50.0 '@typescript-eslint/types': 8.50.0
'@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2) '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 8.50.0 '@typescript-eslint/visitor-keys': 8.50.0
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
eslint: 9.39.1(jiti@2.6.1) eslint: 9.39.1(jiti@2.6.1)
typescript: 5.9.2 typescript: 5.9.2
transitivePeerDependencies: transitivePeerDependencies:
@ -6569,7 +6582,7 @@ snapshots:
'@typescript-eslint/types': 8.50.0 '@typescript-eslint/types': 8.50.0
'@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.50.0 '@typescript-eslint/visitor-keys': 8.50.0
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
eslint: 9.39.4(jiti@2.6.1) eslint: 9.39.4(jiti@2.6.1)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
@ -6579,7 +6592,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.2) '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.2)
'@typescript-eslint/types': 8.50.0 '@typescript-eslint/types': 8.50.0
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
typescript: 5.9.2 typescript: 5.9.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -6588,7 +6601,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3)
'@typescript-eslint/types': 8.50.0 '@typescript-eslint/types': 8.50.0
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -6611,7 +6624,7 @@ snapshots:
'@typescript-eslint/types': 8.50.0 '@typescript-eslint/types': 8.50.0
'@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2) '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2)
'@typescript-eslint/utils': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/utils': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2)
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
eslint: 9.39.1(jiti@2.6.1) eslint: 9.39.1(jiti@2.6.1)
ts-api-utils: 2.1.0(typescript@5.9.2) ts-api-utils: 2.1.0(typescript@5.9.2)
typescript: 5.9.2 typescript: 5.9.2
@ -6623,7 +6636,7 @@ snapshots:
'@typescript-eslint/types': 8.50.0 '@typescript-eslint/types': 8.50.0
'@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
'@typescript-eslint/utils': 8.50.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': 8.50.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
eslint: 9.39.4(jiti@2.6.1) eslint: 9.39.4(jiti@2.6.1)
ts-api-utils: 2.1.0(typescript@5.9.3) ts-api-utils: 2.1.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
@ -6638,7 +6651,7 @@ snapshots:
'@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.2) '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.2)
'@typescript-eslint/types': 8.50.0 '@typescript-eslint/types': 8.50.0
'@typescript-eslint/visitor-keys': 8.50.0 '@typescript-eslint/visitor-keys': 8.50.0
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.3 semver: 7.7.3
tinyglobby: 0.2.15 tinyglobby: 0.2.15
@ -6653,7 +6666,7 @@ snapshots:
'@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3)
'@typescript-eslint/types': 8.50.0 '@typescript-eslint/types': 8.50.0
'@typescript-eslint/visitor-keys': 8.50.0 '@typescript-eslint/visitor-keys': 8.50.0
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.3 semver: 7.7.3
tinyglobby: 0.2.15 tinyglobby: 0.2.15
@ -6936,7 +6949,7 @@ snapshots:
dependencies: dependencies:
bytes: 3.1.2 bytes: 3.1.2
content-type: 1.0.5 content-type: 1.0.5
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
http-errors: 2.0.1 http-errors: 2.0.1
iconv-lite: 0.7.2 iconv-lite: 0.7.2
on-finished: 2.4.1 on-finished: 2.4.1
@ -7529,7 +7542,7 @@ snapshots:
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.6.1)): eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.6.1)):
dependencies: dependencies:
'@nolyfill/is-core-module': 1.0.39 '@nolyfill/is-core-module': 1.0.39
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
eslint: 9.39.4(jiti@2.6.1) eslint: 9.39.4(jiti@2.6.1)
get-tsconfig: 4.13.7 get-tsconfig: 4.13.7
is-bun-module: 2.0.0 is-bun-module: 2.0.0
@ -7693,7 +7706,7 @@ snapshots:
ajv: 6.12.6 ajv: 6.12.6
chalk: 4.1.2 chalk: 4.1.2
cross-spawn: 7.0.6 cross-spawn: 7.0.6
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
escape-string-regexp: 4.0.0 escape-string-regexp: 4.0.0
eslint-scope: 8.4.0 eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 4.2.1
@ -7734,7 +7747,7 @@ snapshots:
ajv: 6.14.0 ajv: 6.14.0
chalk: 4.1.2 chalk: 4.1.2
cross-spawn: 7.0.6 cross-spawn: 7.0.6
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
escape-string-regexp: 4.0.0 escape-string-regexp: 4.0.0
eslint-scope: 8.4.0 eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 4.2.1
@ -7846,7 +7859,7 @@ snapshots:
content-type: 1.0.5 content-type: 1.0.5
cookie: 0.7.2 cookie: 0.7.2
cookie-signature: 1.2.2 cookie-signature: 1.2.2
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
depd: 2.0.0 depd: 2.0.0
encodeurl: 2.0.0 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
@ -7944,7 +7957,7 @@ snapshots:
finalhandler@2.1.1: finalhandler@2.1.1:
dependencies: dependencies:
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
encodeurl: 2.0.0 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
on-finished: 2.4.1 on-finished: 2.4.1
@ -8148,13 +8161,6 @@ snapshots:
jsprim: 2.0.2 jsprim: 2.0.2
sshpk: 1.18.0 sshpk: 1.18.0
https-proxy-agent@7.0.6:
dependencies:
agent-base: 7.1.4
debug: 4.4.3(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
https-proxy-agent@7.0.6(supports-color@10.2.2): https-proxy-agent@7.0.6(supports-color@10.2.2):
dependencies: dependencies:
agent-base: 7.1.4 agent-base: 7.1.4
@ -8696,6 +8702,14 @@ snapshots:
- '@babel/core' - '@babel/core'
- babel-plugin-macros - babel-plugin-macros
nextjs-toploader@3.9.17(next@16.1.7(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
next: 16.1.7(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
nprogress: 0.2.0
prop-types: 15.8.1
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
node-domexception@1.0.0: {} node-domexception@1.0.0: {}
node-fetch@3.3.2: node-fetch@3.3.2:
@ -8715,6 +8729,8 @@ snapshots:
path-key: 4.0.0 path-key: 4.0.0
unicorn-magic: 0.3.0 unicorn-magic: 0.3.0
nprogress@0.2.0: {}
nuqs@2.8.9(next@16.1.7(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4): nuqs@2.8.9(next@16.1.7(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4):
dependencies: dependencies:
'@standard-schema/spec': 1.0.0 '@standard-schema/spec': 1.0.0
@ -9244,7 +9260,7 @@ snapshots:
router@2.2.0: router@2.2.0:
dependencies: dependencies:
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
depd: 2.0.0 depd: 2.0.0
is-promise: 4.0.0 is-promise: 4.0.0
parseurl: 1.3.3 parseurl: 1.3.3
@ -9295,7 +9311,7 @@ snapshots:
send@1.2.1: send@1.2.1:
dependencies: dependencies:
debug: 4.4.3(supports-color@8.1.1) debug: 4.4.3(supports-color@10.2.2)
encodeurl: 2.0.0 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
etag: 1.8.1 etag: 1.8.1
@ -9363,7 +9379,7 @@ snapshots:
fast-glob: 3.3.3 fast-glob: 3.3.3
fs-extra: 11.3.4 fs-extra: 11.3.4
fuzzysort: 3.1.0 fuzzysort: 3.1.0
https-proxy-agent: 7.0.6 https-proxy-agent: 7.0.6(supports-color@10.2.2)
kleur: 4.1.5 kleur: 4.1.5
msw: 2.12.14(@types/node@25.5.0)(typescript@5.9.3) msw: 2.12.14(@types/node@25.5.0)(typescript@5.9.3)
node-fetch: 3.3.2 node-fetch: 3.3.2