parts and areas tested

This commit is contained in:
2025-11-24 21:04:14 +03:00
parent a5a7a7e7b5
commit eedfed1a65
131 changed files with 5429 additions and 471 deletions

View File

@@ -9,21 +9,12 @@ import { DateTimePicker } from "@/components/ui/date-time-picker"
import { BuildAreasAdd, buildAreasAddSchema } from "./schema"
import { useAddBuildAreasMutation } from "./queries"
const BuildAreasForm = ({ refetchTable }: { refetchTable: () => void }) => {
const BuildAreasForm = ({ refetchTable, buildId }: { refetchTable: () => void, buildId: string }) => {
const form = useForm<BuildAreasAdd>({
resolver: zodResolver(buildAreasAddSchema),
defaultValues: {
areaName: "",
areaCode: "",
areaType: "",
areaDirection: "",
areaGrossSize: 0,
areaNetSize: 0,
width: 0,
size: 0,
expiryStarts: "",
expiryEnds: "",
areaName: "", areaCode: "", areaType: "", areaDirection: "", areaGrossSize: 0, areaNetSize: 0, width: 0, size: 0, expiryStarts: "", expiryEnds: "",
},
});
@@ -31,17 +22,13 @@ const BuildAreasForm = ({ refetchTable }: { refetchTable: () => void }) => {
const mutation = useAddBuildAreasMutation();
function onSubmit(values: BuildAreasAdd) { mutation.mutate({ data: values }); setTimeout(() => refetchTable(), 400) };
function onSubmit(values: BuildAreasAdd) { mutation.mutate({ data: values, buildId }); setTimeout(() => refetchTable(), 400) };
return (
<Form {...form}>
<form
onSubmit={handleSubmit(onSubmit)}
className="space-y-6 p-4"
>
<form onSubmit={handleSubmit(onSubmit)} className="space-y-6 p-4">
{/* ROW 1 */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<FormField
control={form.control}
name="areaName"
@@ -110,7 +97,7 @@ const BuildAreasForm = ({ refetchTable }: { refetchTable: () => void }) => {
<FormItem>
<FormLabel>Area Gross Size</FormLabel>
<FormControl>
<Input placeholder="Area Gross Size" {...field} />
<Input type="number" placeholder="Area Gross Size" {...field} onChange={(e) => field.onChange(e.target.value === "" ? undefined : Number(e.target.value))} />
</FormControl>
<FormMessage />
</FormItem>
@@ -124,7 +111,7 @@ const BuildAreasForm = ({ refetchTable }: { refetchTable: () => void }) => {
<FormItem>
<FormLabel>Area Net Size</FormLabel>
<FormControl>
<Input placeholder="Area Net Size" {...field} />
<Input type="number" placeholder="Area Net Size" {...field} onChange={(e) => field.onChange(e.target.value === "" ? undefined : Number(e.target.value))} />
</FormControl>
<FormMessage />
</FormItem>
@@ -140,7 +127,7 @@ const BuildAreasForm = ({ refetchTable }: { refetchTable: () => void }) => {
<FormItem>
<FormLabel>Width</FormLabel>
<FormControl>
<Input placeholder="Width" {...field} />
<Input type="number" placeholder="Width" {...field} onChange={(e) => field.onChange(e.target.value === "" ? undefined : Number(e.target.value))} />
</FormControl>
<FormMessage />
</FormItem>
@@ -154,7 +141,7 @@ const BuildAreasForm = ({ refetchTable }: { refetchTable: () => void }) => {
<FormItem>
<FormLabel>Size</FormLabel>
<FormControl>
<Input placeholder="Size" {...field} />
<Input type="number" placeholder="Size" {...field} onChange={(e) => field.onChange(e.target.value === "" ? undefined : Number(e.target.value))} />
</FormControl>
<FormMessage />
</FormItem>

View File

@@ -3,6 +3,8 @@ import { useState } from 'react';
import { BuildAreasDataTableAdd } from './table/data-table';
import { useGraphQlBuildAreasList } from '@/pages/build-areas/queries';
import { BuildAreasForm } from './form';
import { Button } from '@/components/ui/button';
import { useSearchParams, useRouter } from 'next/navigation';
const PageAddBuildAreas = () => {
const [page, setPage] = useState(1);
@@ -10,14 +12,19 @@ const PageAddBuildAreas = () => {
const [sort, setSort] = useState({ createdAt: 'desc' });
const [filters, setFilters] = useState({});
const { data, isLoading, error, refetch } = useGraphQlBuildAreasList({ limit, skip: (page - 1) * limit, sort, filters });
const searchParams = useSearchParams();
const router = useRouter();
const buildId = searchParams?.get('build');
const { data, isLoading, error, refetch } = useGraphQlBuildAreasList({ limit, skip: (page - 1) * limit, sort, filters: { ...filters, buildId: buildId } });
const noUUIDFound = <><div>Back To Builds. No uuid is found on headers</div><Button onClick={() => router.push('/builds')}>Back to Builds</Button></>
if (!buildId) { return noUUIDFound }
return (
<>
<BuildAreasDataTableAdd
data={data?.data || []} totalCount={data?.totalCount || 0} currentPage={page} pageSize={limit} onPageChange={setPage} onPageSizeChange={setLimit} refetchTable={refetch}
data={data?.data || []} totalCount={data?.totalCount || 0} currentPage={page} pageSize={limit} onPageChange={setPage} onPageSizeChange={setLimit} refetchTable={refetch} buildId={buildId}
/>
<BuildAreasForm refetchTable={refetch} />
<BuildAreasForm refetchTable={refetch} buildId={buildId} />
</>
)
}

View File

@@ -3,13 +3,12 @@ import { useMutation } from '@tanstack/react-query'
import { toISOIfNotZ } from '@/lib/utils';
import { BuildAreasAdd } from './schema';
const fetchGraphQlBuildSitesAdd = async (record: BuildAreasAdd): Promise<{ data: BuildAreasAdd | null; status: number }> => {
const fetchGraphQlBuildSitesAdd = async (record: BuildAreasAdd, buildId: string): Promise<{ data: BuildAreasAdd | null; status: number }> => {
console.log('Fetching test data from local API');
record.expiryStarts = record.expiryStarts ? toISOIfNotZ(record.expiryStarts) : undefined;
record.expiryEnds = record.expiryEnds ? toISOIfNotZ(record.expiryEnds) : undefined;
console.dir({ record })
try {
const res = await fetch('/api/build-areas/add', { method: 'POST', cache: 'no-store', credentials: "include", body: JSON.stringify(record) });
const res = await fetch('/api/build-areas/add', { method: 'POST', cache: 'no-store', credentials: "include", body: JSON.stringify({ ...record, buildId }) });
if (!res.ok) { const errorText = await res.text(); console.error('Test data API error:', errorText); throw new Error(`API error: ${res.status} ${res.statusText}`) }
const data = await res.json();
return { data: data.data, status: res.status }
@@ -18,7 +17,7 @@ const fetchGraphQlBuildSitesAdd = async (record: BuildAreasAdd): Promise<{ data:
export function useAddBuildAreasMutation() {
return useMutation({
mutationFn: ({ data }: { data: BuildAreasAdd }) => fetchGraphQlBuildSitesAdd(data),
mutationFn: ({ data, buildId }: { data: BuildAreasAdd, buildId: string }) => fetchGraphQlBuildSitesAdd(data, buildId),
onSuccess: () => { console.log("Build areas created successfully") },
onError: (error) => { console.error("Add build areas failed:", error) },
})

View File

@@ -105,9 +105,6 @@ function getColumns(router: any, deleteHandler: (id: string) => void): ColumnDef
cell: ({ row }) => {
return (
<div>
<Button className="bg-amber-400 text-black border-amber-400" variant="outline" size="sm" onClick={() => { router.push(`/build-sites/update?uuid=${row.original.uuid}`) }}>
<Pencil />
</Button>
<Button className="bg-red-700 text-white border-red-700 mx-4" variant="outline" size="sm" onClick={() => { deleteHandler(row.original.uuid || "") }}>
<Trash />
</Button>

View File

@@ -55,6 +55,7 @@ export function BuildAreasDataTableAdd({
onPageChange,
onPageSizeChange,
refetchTable,
buildId
}: {
data: schemaType[],
totalCount: number,
@@ -62,7 +63,8 @@ export function BuildAreasDataTableAdd({
pageSize: number,
onPageChange: (page: number) => void,
onPageSizeChange: (size: number) => void,
refetchTable: () => void
refetchTable: () => void,
buildId: string
}) {
const router = useRouter();
@@ -142,7 +144,7 @@ export function BuildAreasDataTableAdd({
})}
</DropdownMenuContent>
</DropdownMenu>
<Button variant="outline" size="sm" onClick={() => { router.push("/build-areas") }}>
<Button variant="outline" size="sm" onClick={() => { router.push(`/build-areas?build=${buildId}`) }}>
<Home />
<span className="hidden lg:inline">Back to Build Areas</span>
</Button>

View File

@@ -23,7 +23,7 @@ export function DraggableRow({ row }: { row: Row<z.infer<typeof schema>> }) {
)
}
function getColumns(router: any, deleteHandler: (id: string) => void): ColumnDef<schemaType>[] {
function getColumns(router: any, deleteHandler: (id: string) => void, buildID: string): ColumnDef<schemaType>[] {
return [
{
accessorKey: "uuid",
@@ -88,7 +88,7 @@ function getColumns(router: any, deleteHandler: (id: string) => void): ColumnDef
cell: ({ row }) => {
return (
<div>
<Button className="bg-amber-400 text-black border-amber-400" variant="outline" size="sm" onClick={() => { router.push(`/build-areas/update?uuid=${row.original.uuid}`) }}>
<Button className="bg-amber-400 text-black border-amber-400" variant="outline" size="sm" onClick={() => { router.push(`/build-areas/update?uuid=${row.original.uuid}&build=${buildID}`) }}>
<Pencil />
</Button>
<Button className="bg-red-700 text-white border-red-700 mx-4" variant="outline" size="sm" onClick={() => { deleteHandler(row.original.uuid || "") }}>

View File

@@ -78,7 +78,8 @@ export function BuildAreasDataTable({
pageSize = 10,
onPageChange,
onPageSizeChange,
refetchTable
refetchTable,
buildId
}: {
data: schemaType[],
totalCount: number,
@@ -87,6 +88,7 @@ export function BuildAreasDataTable({
onPageChange: (page: number) => void,
onPageSizeChange: (size: number) => void,
refetchTable: () => void,
buildId: string
}) {
const router = useRouter();
@@ -100,7 +102,7 @@ export function BuildAreasDataTable({
const deleteMutation = useDeleteBuildAreaMutation()
const deleteHandler = (id: string) => { deleteMutation.mutate({ uuid: id }); setTimeout(() => { refetchTable() }, 400) }
const columns = getColumns(router, deleteHandler);
const columns = getColumns(router, deleteHandler, buildId);
const pagination = React.useMemo(() => ({ pageIndex: currentPage - 1, pageSize: pageSize }), [currentPage, pageSize])
const totalPages = Math.ceil(totalCount / pageSize)
@@ -163,7 +165,7 @@ export function BuildAreasDataTable({
})}
</DropdownMenuContent>
</DropdownMenu>
<Button variant="outline" size="sm" onClick={() => { router.push("/build-areas/add") }}>
<Button variant="outline" size="sm" onClick={() => { router.push(`/build-areas/add?build=${buildId}`) }}>
<IconPlus />
<span className="hidden lg:inline">Add Build Areas</span>
</Button>

View File

@@ -1,7 +1,9 @@
'use client';
import { Button } from '@/components/ui/button';
import { BuildAreasDataTable } from './list/data-table';
import { useGraphQlBuildAreasList } from './queries';
import { useState } from 'react';
import { useSearchParams, useRouter } from 'next/navigation';
const PageBuildAreas = () => {
@@ -9,16 +11,17 @@ const PageBuildAreas = () => {
const [limit, setLimit] = useState(10);
const [sort, setSort] = useState({ createdAt: 'desc' });
const [filters, setFilters] = useState({});
const { data, isLoading, error, refetch } = useGraphQlBuildAreasList({ limit, skip: (page - 1) * limit, sort, filters });
const searchParams = useSearchParams();
const router = useRouter();
const buildId = searchParams?.get('build');
const noUUIDFound = <><div>Back To Builds. No uuid is found on headers</div><Button onClick={() => router.push('/builds')}>Back to Builds</Button></>
if (!buildId) { return noUUIDFound }
const { data, isLoading, error, refetch } = useGraphQlBuildAreasList({ limit, skip: (page - 1) * limit, sort, filters: { ...filters, buildId: buildId } });
const handlePageChange = (newPage: number) => { setPage(newPage) };
const handlePageSizeChange = (newSize: number) => { setLimit(newSize); setPage(1) };
if (isLoading) { return <div className="flex items-center justify-center p-8">Loading...</div> }
if (error) { return <div className="flex items-center justify-center p-8 text-red-500">Error loading build areas</div> }
return <BuildAreasDataTable data={data?.data || []} totalCount={data?.totalCount || 0} currentPage={page} pageSize={limit} onPageChange={handlePageChange} onPageSizeChange={handlePageSizeChange} refetchTable={refetch} />;
return <BuildAreasDataTable data={data?.data || []} totalCount={data?.totalCount || 0} currentPage={page} pageSize={limit} onPageChange={handlePageChange} onPageSizeChange={handlePageSizeChange} refetchTable={refetch} buildId={buildId} />;
};

View File

@@ -9,7 +9,7 @@ import { DateTimePicker } from "@/components/ui/date-time-picker"
import { useUpdateBuildSitesMutation } from "@/pages/build-sites/update/queries"
import { BuildAreasUpdate, buildAreasUpdateSchema } from "@/pages/build-areas/update/schema"
const BuildAreasForm = ({ refetchTable, initData, selectedUuid }: { refetchTable: () => void, initData: BuildAreasUpdate, selectedUuid: string }) => {
const BuildAreasForm = ({ refetchTable, initData, selectedUuid, buildId }: { refetchTable: () => void, initData: BuildAreasUpdate, selectedUuid: string, buildId: string }) => {
const form = useForm<BuildAreasUpdate>({ resolver: zodResolver(buildAreasUpdateSchema), defaultValues: { ...initData } })
@@ -17,7 +17,7 @@ const BuildAreasForm = ({ refetchTable, initData, selectedUuid }: { refetchTable
const mutation = useUpdateBuildSitesMutation();
function onSubmit(values: BuildAreasUpdate) { mutation.mutate({ data: values as any || initData, uuid: selectedUuid }); setTimeout(() => refetchTable(), 400) }
function onSubmit(values: BuildAreasUpdate) { mutation.mutate({ data: values as any || initData, uuid: selectedUuid, buildId }); setTimeout(() => refetchTable(), 400) }
return (
<Form {...form}>

View File

@@ -6,7 +6,7 @@ import { Button } from '@/components/ui/button';
import { BuildAreasDataTableUpdate } from './table/data-table';
import { useGraphQlBuildAreasList } from '../queries';
const PageUpdateBuildSites = () => {
const PageUpdateBuildAreas = () => {
const [page, setPage] = useState(1);
const [limit, setLimit] = useState(10);
const [sort, setSort] = useState({ createdAt: 'desc' });
@@ -14,23 +14,21 @@ const PageUpdateBuildSites = () => {
const searchParams = useSearchParams()
const router = useRouter()
const uuid = searchParams?.get('uuid') || null
const backToBuildAddress = <>
<div>UUID not found in search params</div>
<Button onClick={() => router.push('/build-areas')}>Back to Build Areas</Button>
</>
if (!uuid) { return backToBuildAddress }
const { data, isLoading, error, refetch } = useGraphQlBuildAreasList({ limit, skip: (page - 1) * limit, sort, filters: { ...filters, uuid } });
const backToBuildAddress = <><div>UUID not found in search params</div><Button onClick={() => router.push('/build-areas')}>Back to Build Areas</Button></>
const buildId = searchParams?.get('build');
const noUUIDFound = <><div>Back To Builds. No uuid is found on headers</div><Button onClick={() => router.push('/builds')}>Back to Builds</Button></>
if (!buildId) { return noUUIDFound }; if (!uuid) { return backToBuildAddress }
const { data, isLoading, error, refetch } = useGraphQlBuildAreasList({ limit, skip: (page - 1) * limit, sort, filters: { ...filters, buildId, uuid } });
const initData = data?.data?.[0] || null;
if (!initData) { return backToBuildAddress }
return (
<>
<BuildAreasDataTableUpdate
data={data?.data || []} totalCount={data?.totalCount || 0} currentPage={page} pageSize={limit}
onPageChange={setPage} onPageSizeChange={setLimit} refetchTable={refetch}
data={data?.data || []} totalCount={data?.totalCount || 0} currentPage={page} pageSize={limit} onPageChange={setPage} onPageSizeChange={setLimit} refetchTable={refetch} buildID={buildId}
/>
<BuildAreasForm refetchTable={refetch} initData={initData} selectedUuid={uuid} />
<BuildAreasForm refetchTable={refetch} initData={initData} selectedUuid={uuid} buildId={buildId} />
</>
)
}
export { PageUpdateBuildSites };
export { PageUpdateBuildAreas };

View File

@@ -30,7 +30,7 @@ export function DraggableRow({ row }: { row: Row<z.infer<typeof schema>> }) {
)
}
function getColumns(router: any, deleteHandler: (id: string) => void): ColumnDef<schemaType>[] {
function getColumns(deleteHandler: (id: string) => void): ColumnDef<schemaType>[] {
return [
{
accessorKey: "uuid",

View File

@@ -80,6 +80,7 @@ export function BuildAreasDataTableUpdate({
onPageChange,
onPageSizeChange,
refetchTable,
buildID
}: {
data: schemaType[],
totalCount: number,
@@ -87,7 +88,8 @@ export function BuildAreasDataTableUpdate({
pageSize: number,
onPageChange: (page: number) => void,
onPageSizeChange: (size: number) => void,
refetchTable: () => void
refetchTable: () => void,
buildID: string
}) {
const router = useRouter();
@@ -101,7 +103,7 @@ export function BuildAreasDataTableUpdate({
const deleteMutation = useDeletePersonMutation()
const deleteHandler = (id: string) => { deleteMutation.mutate({ uuid: id }); setTimeout(() => { refetchTable() }, 200) }
const columns = getColumns(router, deleteHandler);
const columns = getColumns(deleteHandler);
const pagination = React.useMemo(() => ({ pageIndex: currentPage - 1, pageSize: pageSize, }), [currentPage, pageSize])
const totalPages = Math.ceil(totalCount / pageSize)
@@ -167,7 +169,7 @@ export function BuildAreasDataTableUpdate({
})}
</DropdownMenuContent>
</DropdownMenu>
<Button variant="outline" size="sm" onClick={() => { router.push("/build-areas") }}>
<Button variant="outline" size="sm" onClick={() => { router.push(`/build-areas?build=${buildID}`) }}>
<Home />
<span className="hidden lg:inline">Back to Build Areas</span>
</Button>