260322:1648 Correct Coresspondence / Doing RFA / Correct CI
CI Pipeline / build (push) Failing after 12m41s
Build and Deploy / deploy (push) Failing after 2m44s

This commit is contained in:
admin
2026-03-22 16:48:12 +07:00
parent e5deedb42e
commit 11984bfa29
683 changed files with 105251 additions and 29068 deletions
@@ -1,38 +1,34 @@
"use client";
'use client';
import { GenericCrudTable } from "@/components/admin/reference/generic-crud-table";
import { masterDataService } from "@/lib/services/master-data.service";
import { ColumnDef } from "@tanstack/react-table";
import { GenericCrudTable } from '@/components/admin/reference/generic-crud-table';
import { masterDataService } from '@/lib/services/master-data.service';
import { ColumnDef } from '@tanstack/react-table';
export default function CorrespondenceTypesPage() {
const columns: ColumnDef<any>[] = [
const columns: ColumnDef<unknown>[] = [
{
accessorKey: "typeCode",
header: "Code",
cell: ({ row }) => (
<span className="font-mono font-bold">{row.getValue("typeCode")}</span>
),
accessorKey: 'typeCode',
header: 'Code',
cell: ({ row }) => <span className="font-mono font-bold">{row.getValue('typeCode')}</span>,
},
{
accessorKey: "typeName",
header: "Name",
accessorKey: 'typeName',
header: 'Name',
},
{
accessorKey: "sortOrder",
header: "Sort Order",
accessorKey: 'sortOrder',
header: 'Sort Order',
},
{
accessorKey: "isActive",
header: "Status",
accessorKey: 'isActive',
header: 'Status',
cell: ({ row }) => (
<span
className={`px-2 py-1 rounded-full text-xs ${
row.getValue("isActive")
? "bg-green-100 text-green-800"
: "bg-red-100 text-red-800"
row.getValue('isActive') ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'
}`}
>
{row.getValue("isActive") ? "Active" : "Inactive"}
{row.getValue('isActive') ? 'Active' : 'Inactive'}
</span>
),
},
@@ -44,17 +40,21 @@ export default function CorrespondenceTypesPage() {
entityName="Correspondence Type"
title="Correspondence Types Management"
description="Manage global correspondence types (e.g., LETTER, TRANSMITTAL)"
queryKey={["correspondence-types"]}
queryKey={['correspondence-types']}
fetchFn={() => masterDataService.getCorrespondenceTypes()}
createFn={(data: Record<string, unknown>) => masterDataService.createCorrespondenceType(data as unknown as Parameters<typeof masterDataService.createCorrespondenceType>[0])}
createFn={(data: Record<string, unknown>) =>
masterDataService.createCorrespondenceType(
data as unknown as Parameters<typeof masterDataService.createCorrespondenceType>[0]
)
}
updateFn={(id, data) => masterDataService.updateCorrespondenceType(id, data)}
deleteFn={(id) => masterDataService.deleteCorrespondenceType(id)}
columns={columns}
fields={[
{ name: "typeCode", label: "Code", type: "text", required: true },
{ name: "typeName", label: "Name", type: "text", required: true },
{ name: "sortOrder", label: "Sort Order", type: "text" },
{ name: "isActive", label: "Active", type: "checkbox" },
{ name: 'typeCode', label: 'Code', type: 'text', required: true },
{ name: 'typeName', label: 'Name', type: 'text', required: true },
{ name: 'sortOrder', label: 'Sort Order', type: 'text' },
{ name: 'isActive', label: 'Active', type: 'checkbox' },
]}
/>
</div>
@@ -14,7 +14,7 @@ export default function DisciplinesPage() {
// Ensure we consistently use an array
const contracts = Array.isArray(contractsData) ? contractsData : [];
const columns: ColumnDef<any>[] = [
const columns: ColumnDef<unknown>[] = [
{
accessorKey: 'disciplineCode',
header: 'Code',
@@ -43,7 +43,7 @@ export default function DisciplinesPage() {
},
];
const contractOptions = contracts.map((c: any) => ({
const contractOptions = contracts.map((c: unknown) => ({
label: `${c.contractName} (${c.contractCode})`,
value: String(c.id),
}));
@@ -66,8 +66,12 @@ export default function DisciplinesPage() {
};
});
}}
createFn={(data) => masterDataService.createDiscipline(data as unknown as Parameters<typeof masterDataService.createDiscipline>[0])}
updateFn={(id, data) => Promise.reject('Not implemented yet')}
createFn={(data) =>
masterDataService.createDiscipline(
data as unknown as Parameters<typeof masterDataService.createDiscipline>[0]
)
}
updateFn={(_id, _data) => Promise.reject('Not implemented yet')}
deleteFn={(id) => masterDataService.deleteDiscipline(id)}
columns={columns}
filters={
@@ -81,7 +85,7 @@ export default function DisciplinesPage() {
</SelectTrigger>
<SelectContent>
<SelectItem value="all">All Contracts</SelectItem>
{contracts.map((c: any) => (
{contracts.map((c: unknown) => (
<SelectItem key={c.id} value={String(c.id)}>
{c.contractName} ({c.contractCode})
</SelectItem>
@@ -1,28 +1,24 @@
"use client";
'use client';
import { GenericCrudTable } from "@/components/admin/reference/generic-crud-table";
import { masterDataService } from "@/lib/services/master-data.service";
import { ColumnDef } from "@tanstack/react-table";
import { GenericCrudTable } from '@/components/admin/reference/generic-crud-table';
import { masterDataService } from '@/lib/services/master-data.service';
import { ColumnDef } from '@tanstack/react-table';
export default function DrawingCategoriesPage() {
const columns: ColumnDef<any>[] = [
const columns: ColumnDef<unknown>[] = [
{
accessorKey: "subTypeCode",
header: "Code",
cell: ({ row }) => (
<span className="font-mono font-bold">{row.getValue("subTypeCode")}</span>
),
accessorKey: 'subTypeCode',
header: 'Code',
cell: ({ row }) => <span className="font-mono font-bold">{row.getValue('subTypeCode')}</span>,
},
{
accessorKey: "subTypeName",
header: "Name",
accessorKey: 'subTypeName',
header: 'Name',
},
{
accessorKey: "subTypeNumber",
header: "Running Code",
cell: ({ row }) => (
<span className="font-mono">{row.getValue("subTypeNumber") || "-"}</span>
),
accessorKey: 'subTypeNumber',
header: 'Running Code',
cell: ({ row }) => <span className="font-mono">{row.getValue('subTypeNumber') || '-'}</span>,
},
];
@@ -32,16 +28,22 @@ export default function DrawingCategoriesPage() {
entityName="Drawing Category (Sub-Type)"
title="Drawing Categories Management"
description="Manage drawing sub-types and categories"
queryKey={["drawing-categories"]}
queryKey={['drawing-categories']}
fetchFn={() => masterDataService.getSubTypes(1)} // Default contract ID 1
createFn={(data: Record<string, unknown>) => masterDataService.createSubType({ ...(data as unknown as Parameters<typeof masterDataService.createSubType>[0]), contractId: 1, correspondenceTypeId: 3 })} // Assuming 3 is Drawings, hardcoded for now to prevent error
updateFn={() => Promise.reject("Not implemented yet")}
deleteFn={() => Promise.reject("Not implemented yet")} // Delete might be restricted
createFn={(data: Record<string, unknown>) =>
masterDataService.createSubType({
...(data as unknown as Parameters<typeof masterDataService.createSubType>[0]),
contractId: 1,
correspondenceTypeId: 3,
})
} // Assuming 3 is Drawings, hardcoded for now to prevent error
updateFn={() => Promise.reject('Not implemented yet')}
deleteFn={() => Promise.reject('Not implemented yet')} // Delete might be restricted
columns={columns}
fields={[
{ name: "subTypeCode", label: "Code", type: "text", required: true },
{ name: "subTypeName", label: "Name", type: "text", required: true },
{ name: "subTypeNumber", label: "Running Code", type: "text" },
{ name: 'subTypeCode', label: 'Code', type: 'text', required: true },
{ name: 'subTypeName', label: 'Name', type: 'text', required: true },
{ name: 'subTypeNumber', label: 'Running Code', type: 'text' },
]}
/>
</div>
@@ -14,7 +14,7 @@ export default function RfaTypesPage() {
// Ensure we consistently use an array
const contracts = Array.isArray(contractsData) ? contractsData : [];
const columns: ColumnDef<any>[] = [
const columns: ColumnDef<unknown>[] = [
{
accessorKey: 'typeCode',
header: 'Code',
@@ -47,7 +47,7 @@ export default function RfaTypesPage() {
},
];
const contractOptions = contracts.map((c: any) => ({
const contractOptions = contracts.map((c: unknown) => ({
label: `${c.contractName} (${c.contractCode})`,
value: String(c.id),
}));
@@ -69,7 +69,9 @@ export default function RfaTypesPage() {
};
});
}}
createFn={(data) => masterDataService.createRfaType(data as unknown as Parameters<typeof masterDataService.createRfaType>[0])}
createFn={(data) =>
masterDataService.createRfaType(data as unknown as Parameters<typeof masterDataService.createRfaType>[0])
}
updateFn={(id, data) => masterDataService.updateRfaType(id, data)}
deleteFn={(id) => masterDataService.deleteRfaType(id)}
columns={columns}
@@ -84,7 +86,7 @@ export default function RfaTypesPage() {
</SelectTrigger>
<SelectContent>
<SelectItem value="all">All Contracts</SelectItem>
{contracts.map((c: any) => (
{contracts.map((c: unknown) => (
<SelectItem key={c.id} value={String(c.id)}>
{c.contractName} ({c.contractCode})
</SelectItem>
@@ -1,20 +1,20 @@
"use client";
'use client';
import { GenericCrudTable } from "@/components/admin/reference/generic-crud-table";
import { masterDataService } from "@/lib/services/master-data.service";
import { projectService } from "@/lib/services/project.service";
import { CreateTagDto } from "@/types/dto/master/tag.dto";
import { ColumnDef } from "@tanstack/react-table";
import { useQuery } from "@tanstack/react-query";
import { GenericCrudTable } from '@/components/admin/reference/generic-crud-table';
import { masterDataService } from '@/lib/services/master-data.service';
import { projectService } from '@/lib/services/project.service';
import { CreateTagDto } from '@/types/dto/master/tag.dto';
import { ColumnDef } from '@tanstack/react-table';
import { useQuery } from '@tanstack/react-query';
export default function TagsPage() {
const { data: projectsData } = useQuery({
queryKey: ["projects"],
queryKey: ['projects'],
queryFn: () => projectService.getAll(),
});
const projectOptions = [
{ label: "Global (All Projects)", value: "__none__" },
{ 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}`) as string,
value: String(p.id), // p.id = UUID string via serialization
@@ -23,8 +23,8 @@ export default function TagsPage() {
const columns: ColumnDef<Record<string, unknown>>[] = [
{
accessorKey: "project_id",
header: "Project",
accessorKey: 'project_id',
header: 'Project',
cell: ({ row }) => {
const item = row.original as Record<string, unknown>;
const project = item.project as Record<string, unknown> | null;
@@ -33,8 +33,8 @@ export default function TagsPage() {
},
},
{
accessorKey: "tag_name",
header: "Tag Name",
accessorKey: 'tag_name',
header: 'Tag Name',
cell: ({ row }) => {
const color = String(row.original.color_code || 'default');
const isHex = color.startsWith('#');
@@ -42,24 +42,24 @@ export default function TagsPage() {
<div className="flex items-center gap-2">
<span
className="w-3 h-3 rounded-full border border-border"
style={{ backgroundColor: isHex ? color : (color === 'default' ? '#e2e8f0' : color) }}
style={{ backgroundColor: isHex ? color : color === 'default' ? '#e2e8f0' : color }}
/>
{String(row.original.tag_name)}
</div>
);
}
},
},
{
accessorKey: "description",
header: "Description",
accessorKey: 'description',
header: 'Description',
},
];
const formatPayload = (data: Record<string, unknown>) => {
const payload = { ...data };
// ADR-019: project_id is now a UUID string or '__none__' for global
if (!payload.project_id || payload.project_id === "__none__") {
payload.project_id = null;
if (!payload.project_id || payload.project_id === '__none__') {
payload.project_id = null;
}
return payload;
};
@@ -69,7 +69,7 @@ export default function TagsPage() {
title="Tags"
description="Manage system tags, multi-tenant capable."
entityName="Tag"
queryKey={["tags"]}
queryKey={['tags']}
fetchFn={async () => {
const items = await masterDataService.getTags();
// ADR-019: Map project_id INT → project UUID for edit mode select matching
@@ -81,34 +81,36 @@ export default function TagsPage() {
};
});
}}
createFn={(data: Record<string, unknown>) => masterDataService.createTag(formatPayload(data) as unknown as CreateTagDto)}
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)}
columns={columns}
fields={[
{
name: "project_id",
label: "Project Scope",
type: "select",
name: 'project_id',
label: 'Project Scope',
type: 'select',
options: projectOptions,
required: false,
},
{
name: "tag_name",
label: "Tag Name",
type: "text",
name: 'tag_name',
label: 'Tag Name',
type: 'text',
required: true,
},
{
name: "color_code",
label: "Color Code (Hex or Name)",
type: "text",
name: 'color_code',
label: 'Color Code (Hex or Name)',
type: 'text',
required: false,
},
{
name: "description",
label: "Description",
type: "textarea",
name: 'description',
label: 'Description',
type: 'textarea',
required: false,
},
]}