260318:1135 Fix UUID #3
Build and Deploy / deploy (push) Successful in 8m43s

This commit is contained in:
admin
2026-03-18 11:35:51 +07:00
parent 6172b058df
commit 5d89079c2a
43 changed files with 1073 additions and 132 deletions
@@ -45,7 +45,7 @@ export default function DisciplinesPage() {
const contractOptions = contracts.map((c: any) => ({
label: `${c.contractName} (${c.contractCode})`,
value: String(c.id || c.uuid),
value: String(c.id),
}));
return (
@@ -55,9 +55,16 @@ export default function DisciplinesPage() {
title="Disciplines Management"
description="Manage system disciplines (e.g., ARCH, STR, MEC)"
queryKey={['disciplines', selectedContractId ?? 'all']}
fetchFn={() => masterDataService.getDisciplines(selectedContractId ? selectedContractId : undefined)}
fetchFn={async () => {
const items = await masterDataService.getDisciplines(selectedContractId ? selectedContractId : undefined);
// ADR-019: Map contractId INT → contract UUID for edit mode select matching
return (items as any[]).map((item: any) => ({
...item,
contractId: item.contract?.id || item.contract?.uuid || String(item.contractId),
}));
}}
createFn={(data: Record<string, unknown>) => masterDataService.createDiscipline(data as any)}
updateFn={(id, data) => Promise.reject('Not implemented yet')}
updateFn={(id, data) => Promise.reject('Not implemented yet')}
deleteFn={(id) => masterDataService.deleteDiscipline(id)}
columns={columns}
filters={
@@ -72,7 +79,7 @@ export default function DisciplinesPage() {
<SelectContent>
<SelectItem value="all">All Contracts</SelectItem>
{contracts.map((c: any) => (
<SelectItem key={c.uuid || c.id} value={String(c.id || c.uuid)}>
<SelectItem key={c.id} value={String(c.id)}>
{c.contractName} ({c.contractCode})
</SelectItem>
))}
@@ -49,7 +49,7 @@ export default function RfaTypesPage() {
const contractOptions = contracts.map((c: any) => ({
label: `${c.contractName} (${c.contractCode})`,
value: String(c.id || c.uuid),
value: String(c.id),
}));
return (
@@ -58,7 +58,14 @@ export default function RfaTypesPage() {
entityName="RFA Type"
title="RFA Types Management"
queryKey={['rfa-types', selectedContractId ?? 'all']}
fetchFn={() => masterDataService.getRfaTypes(selectedContractId ? selectedContractId : undefined)}
fetchFn={async () => {
const items = await masterDataService.getRfaTypes(selectedContractId ? selectedContractId : undefined);
// ADR-019: Map contractId INT → contract UUID for edit mode select matching
return (items as any[]).map((item: any) => ({
...item,
contractId: item.contract?.id || item.contract?.uuid || String(item.contractId),
}));
}}
createFn={(data: Record<string, unknown>) => masterDataService.createRfaType(data as any)}
updateFn={(id, data) => masterDataService.updateRfaType(id, data)}
deleteFn={(id) => masterDataService.deleteRfaType(id)}
@@ -75,7 +82,7 @@ export default function RfaTypesPage() {
<SelectContent>
<SelectItem value="all">All Contracts</SelectItem>
{contracts.map((c: any) => (
<SelectItem key={c.uuid || c.id} value={String(c.id || c.uuid)}>
<SelectItem key={c.id} value={String(c.id)}>
{c.contractName} ({c.contractCode})
</SelectItem>
))}
@@ -16,8 +16,8 @@ export default function TagsPage() {
const projectOptions = [
{ label: "Global (All Projects)", value: "__none__" },
...(projectsData || []).map((p: Record<string, unknown>) => ({
label: p.projectName || p.projectCode || p.project_name || p.project_code || `Project ${p.id}`,
value: String(p.id),
label: (p.projectName || p.projectCode || p.project_name || p.project_code || `Project ${p.id}`) as string,
value: String(p.id), // p.id = UUID string via serialization
})),
];
@@ -26,10 +26,10 @@ export default function TagsPage() {
accessorKey: "project_id",
header: "Project",
cell: ({ row }) => {
const pId = row.original.project_id;
if (!pId) return <span className="text-muted-foreground italic">Global</span>;
const p = (projectsData || []).find((proj: Record<string, unknown>) => proj.id === pId);
return p ? (p.projectName || p.projectCode || p.project_name || p.project_code || `Project ${pId}`) as React.ReactNode : pId as React.ReactNode;
const item = row.original as Record<string, unknown>;
const project = item.project as Record<string, unknown> | null;
if (!project) return <span className="text-muted-foreground italic">Global</span>;
return (project.projectName || project.projectCode || `Project ${project.id}`) as React.ReactNode;
},
},
{
@@ -70,7 +70,14 @@ export default function TagsPage() {
description="Manage system tags, multi-tenant capable."
entityName="Tag"
queryKey={["tags"]}
fetchFn={() => masterDataService.getTags()}
fetchFn={async () => {
const items = await masterDataService.getTags();
// ADR-019: Map project_id INT → project UUID for edit mode select matching
return (items as any[]).map((item: any) => ({
...item,
project_id: item.project?.id || item.project?.uuid || (item.project_id ? String(item.project_id) : null),
}));
}}
createFn={(data: Record<string, unknown>) => masterDataService.createTag(formatPayload(data) as unknown as CreateTagDto)}
updateFn={(id, data) => masterDataService.updateTag(id, formatPayload(data))}
deleteFn={(id) => masterDataService.deleteTag(id)}
@@ -45,9 +45,9 @@ import { cn } from "@/lib/utils";
// Form validation schema
const formSchema = z.object({
correspondenceId: z.number(),
correspondenceId: z.string().min(1, "Please select a document"),
subject: z.string().min(1, "Subject is required"),
assigneeIds: z.array(z.number()).min(1, "At least one assignee is required"),
assigneeIds: z.array(z.string()).min(1, "At least one assignee is required"),
remarks: z.string().optional(),
});
@@ -98,18 +98,18 @@ export default function CreateCirculationPage() {
const selectedDocId = form.watch("correspondenceId");
const selectedDoc = correspondences?.data?.find(
(c: { id: number }) => c.id === selectedDocId
(c: { uuid: string }) => c.uuid === selectedDocId
);
const toggleAssignee = (userId: number) => {
const toggleAssignee = (userUuid: string) => {
const current = form.getValues("assigneeIds");
if (current.includes(userId)) {
if (current.includes(userUuid)) {
form.setValue(
"assigneeIds",
current.filter((id) => id !== userId)
current.filter((id) => id !== userUuid)
);
} else {
form.setValue("assigneeIds", [...current, userId]);
form.setValue("assigneeIds", [...current, userUuid]);
}
};
@@ -168,19 +168,19 @@ export default function CreateCirculationPage() {
<CommandList>
<CommandEmpty>No document found.</CommandEmpty>
<CommandGroup>
{correspondences?.data?.map((doc: { id: number; correspondenceNumber: string }) => (
{correspondences?.data?.map((doc: { uuid: string; correspondenceNumber: string }) => (
<CommandItem
key={doc.id}
key={doc.uuid}
value={doc.correspondenceNumber}
onSelect={() => {
form.setValue("correspondenceId", doc.id);
form.setValue("correspondenceId", doc.uuid);
setDocOpen(false);
}}
>
<Check
className={cn(
"mr-2 h-4 w-4",
doc.id === field.value
doc.uuid === field.value
? "opacity-100"
: "opacity-0"
)}
@@ -230,13 +230,13 @@ export default function CreateCirculationPage() {
>
{selectedAssignees.length > 0 ? (
<div className="flex flex-wrap gap-1">
{selectedAssignees.map((userId) => {
{selectedAssignees.map((userUuid) => {
const user = users.find(
(u) => u.userId === userId
(u) => u.uuid === userUuid
);
return user ? (
<Badge
key={userId}
key={userUuid}
variant="secondary"
className="mr-1"
>
@@ -245,7 +245,7 @@ export default function CreateCirculationPage() {
className="ml-1 h-3 w-3 cursor-pointer"
onClick={(e) => {
e.stopPropagation();
toggleAssignee(userId);
toggleAssignee(userUuid);
}}
/>
</Badge>
@@ -269,14 +269,14 @@ export default function CreateCirculationPage() {
<CommandGroup>
{users.map((user) => (
<CommandItem
key={user.userId ?? user.uuid}
key={user.uuid}
value={user.username}
onSelect={() => user.userId && toggleAssignee(user.userId)}
onSelect={() => toggleAssignee(user.uuid)}
>
<Check
className={cn(
"mr-2 h-4 w-4",
user.userId != null && selectedAssignees.includes(user.userId)
selectedAssignees.includes(user.uuid)
? "opacity-100"
: "opacity-0"
)}