fix bugs phase 2 (excel ) , download sample feature

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
2026-05-01 11:04:38 +03:00
co-authored by Copilot
parent e1ef6fa2ea
commit 97364f4734
24 changed files with 597 additions and 85 deletions
@@ -1,7 +1,8 @@
"use client"
import { useEffect } from "react"
import { use } from "react"
import { useRouter } from "next/navigation"
import { usePathname, useRouter, useSearchParams } from "next/navigation"
import { ResourcePage } from "@/shared/data-view/resource-page"
import { ColumnHeader } from "@/shared/data-view/table-view"
import FormDialog from "@/shared/components/form-dialog"
@@ -27,8 +28,20 @@ export default function JobCardAppointmentsPage({
}) {
const { id: jobCardId } = use(params)
const router = useRouter()
const pathname = usePathname()
const searchParams = useSearchParams()
const jobCard = useJobCard()
useEffect(() => {
if (searchParams.get("create") !== "1") return
const params = new URLSearchParams(searchParams.toString())
params.delete("create")
params.set("dialog", "true")
router.replace(`${pathname}?${params.toString()}`)
}, [pathname, router, searchParams])
const defaultJobCard = jobCard
? { value: String((jobCard as any).id), label: (jobCard as any).label || (jobCard as any).title || `Job Card` }
: null
@@ -48,7 +48,7 @@ export default function JobCardExpenseItemsPage({
const rows = (data as any)?.data ?? []
const invalidate = () => queryClient.invalidateQueries({ queryKey }).then(() => router.refresh())
const invalidate = () => queryClient.invalidateQueries({ queryKey , refetchType:'all'}).then(() => router.refresh())
async function handleDelete(row: any) {
const confirmed = await confirm({
@@ -58,15 +58,15 @@ export default async function JobCardDetailLayout(props: { params: Promise<{ id:
label: `Attachments (${docs?.length || 0})`
},
{
href: `/sales/job-cards/${id}/appointments`,
label: `Appointments (${jobCard?.appointments_count || 0})`
},
// {
// href: `/sales/job-cards/${id}/inspections`,
// label: `Inspections (${(jobCard as any)?.inspections_count || 0})`
// },
// {
// href: `/sales/job-cards/${id}/appointments`,
// label: `Appointments (${jobCard?.appointments_count || 0})`
// },
// {
// href: `/sales/job-cards/${id}/tasks`,
@@ -25,6 +25,7 @@ import { Ellipsis, Plus } from "lucide-react"
import type { ColumnDef } from "@tanstack/react-table"
import { JobCardPartForm } from "@/modules/job-cards/job-card-part-form"
import { formatDate } from "@/shared/utils/formatters"
import { JOB_CARD_ROUTES } from "@garage/api"
export default function JobCardPartsPage({
params,
@@ -35,7 +36,7 @@ export default function JobCardPartsPage({
const api = useAuthApi()
const queryClient = useQueryClient()
const router = useRouter()
const queryKey = ["job-card-parts", jobCardId]
const queryKey = [JOB_CARD_ROUTES.GET_PARTS, jobCardId]
const [dialogOpen, setDialogOpen] = useState(false)
const [editItem, setEditItem] = useState<any | null>(null)
@@ -47,7 +48,7 @@ export default function JobCardPartsPage({
const rows = (data as any)?.data ?? []
const invalidate = () => queryClient.invalidateQueries({ queryKey }).then(() => router.refresh())
const invalidate = () => queryClient.invalidateQueries({ queryKey, type: 'all', refetchType: 'all' },).then(() => router.refresh())
async function handleDelete(row: any) {
const confirmed = await confirm({
@@ -50,7 +50,7 @@ export default function JobCardServicesPage({
const rows = (data as any)?.data ?? []
const invalidate = () => queryClient.invalidateQueries({ queryKey }).then(() => router.refresh())
const invalidate = () => queryClient.invalidateQueries({ queryKey , refetchType:'all'}).then(() => router.refresh())
async function handleDelete(row: any) {
const confirmed = await confirm({