summaryrefslogtreecommitdiff
path: root/lib/equip-class
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-07-17 10:50:28 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-07-17 10:50:28 +0000
commitfb276ed3db86fe4fc0c0fcd870fd3d085b034be0 (patch)
tree4a8ab1027d7fd14602a0f837d4e18b04e2169e58 /lib/equip-class
parent4eb7532f822c821fb6b69bf103bd075fefba769b (diff)
(대표님) 벤더데이터 S-EDP 변경사항 대응(seperator), 정기평가 점수오류, dim 준비
Diffstat (limited to 'lib/equip-class')
-rw-r--r--lib/equip-class/repository.ts2
-rw-r--r--lib/equip-class/table/equipClass-table-columns.tsx143
-rw-r--r--lib/equip-class/table/equipClass-table.tsx27
3 files changed, 155 insertions, 17 deletions
diff --git a/lib/equip-class/repository.ts b/lib/equip-class/repository.ts
index d4d6d58b..5513fb03 100644
--- a/lib/equip-class/repository.ts
+++ b/lib/equip-class/repository.ts
@@ -28,6 +28,8 @@ export async function selectTagClassLists(
code: tagClasses.code,
label: tagClasses.label,
tagTypeCode: tagClasses.tagTypeCode,
+ subclassRemark: tagClasses.subclassRemark,
+ subclasses: tagClasses.subclasses,
createdAt: tagClasses.createdAt,
updatedAt: tagClasses.updatedAt,
// 프로젝트 정보 추가
diff --git a/lib/equip-class/table/equipClass-table-columns.tsx b/lib/equip-class/table/equipClass-table-columns.tsx
index 0dfbf06f..51aacc97 100644
--- a/lib/equip-class/table/equipClass-table-columns.tsx
+++ b/lib/equip-class/table/equipClass-table-columns.tsx
@@ -9,17 +9,125 @@ import { formatDate } from "@/lib/utils"
import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header"
import { equipclassColumnsConfig } from "@/config/equipClassColumnsConfig"
import { ExtendedTagClasses } from "../validation"
+import { Badge } from "@/components/ui/badge"
+import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"
interface GetColumnsProps {
setRowAction: React.Dispatch<React.SetStateAction<DataTableRowAction<ExtendedTagClasses> | null>>
}
+// 서브클래스 배열을 렌더링하는 컴포넌트
+const SubclassesCell = ({ subclasses }: { subclasses: {
+ id: string;
+ desc: string;
+}[] }) => {
+ if (!subclasses || subclasses.length === 0) {
+ return <span className="text-muted-foreground">-</span>
+ }
+
+ if (subclasses.length <= 3) {
+ return (
+ <div className="flex flex-wrap gap-1">
+ {subclasses.map((subclass) => (
+ <Badge key={subclass.id} variant="secondary" className="text-xs">
+ {subclass.desc}
+ </Badge>
+ ))}
+ </div>
+ )
+ }
+
+ return (
+ <TooltipProvider>
+ <Tooltip>
+ <TooltipTrigger asChild>
+ <div className="flex flex-wrap gap-1">
+ {subclasses.slice(0, 2).map((subclass) => (
+ <Badge key={subclass.id} variant="secondary" className="text-xs">
+ {subclass.desc}
+ </Badge>
+ ))}
+ <Badge variant="outline" className="text-xs">
+ +{subclasses.length - 2}
+ </Badge>
+ </div>
+ </TooltipTrigger>
+ <TooltipContent>
+ <div className="max-w-sm">
+ <div className="font-semibold mb-2">All Subclasses:</div>
+ <div className="flex flex-wrap gap-1">
+ {subclasses.map((subclass) => (
+ <Badge key={subclass.id} variant="secondary" className="text-xs">
+ {subclass.desc}
+ </Badge>
+ ))}
+ </div>
+ </div>
+ </TooltipContent>
+ </Tooltip>
+ </TooltipProvider>
+ )
+}
+
+// 서브클래스 리마크를 렌더링하는 컴포넌트
+const SubclassRemarksCell = ({ remarks }: { remarks: Record<string, string> }) => {
+ if (!remarks || Object.keys(remarks).length === 0) {
+ return <span className="text-muted-foreground">-</span>
+ }
+
+ const entries = Object.entries(remarks)
+
+ if (entries.length <= 2) {
+ return (
+ <div className="space-y-1">
+ {entries.map(([key, value]) => (
+ <div key={key} className="text-sm">
+ <span className="font-medium">{key}:</span>{" "}
+ <span className="text-muted-foreground">{value}</span>
+ </div>
+ ))}
+ </div>
+ )
+ }
+
+ return (
+ <TooltipProvider>
+ <Tooltip>
+ <TooltipTrigger asChild>
+ <div className="space-y-1">
+ {entries.slice(0, 1).map(([key, value]) => (
+ <div key={key} className="text-sm">
+ <span className="font-medium">{key}:</span>{" "}
+ <span className="text-muted-foreground">{value}</span>
+ </div>
+ ))}
+ <div className="text-xs text-muted-foreground">
+ +{entries.length - 1} more...
+ </div>
+ </div>
+ </TooltipTrigger>
+ <TooltipContent>
+ <div className="max-w-md">
+ <div className="font-semibold mb-2">All Remarks:</div>
+ <div className="space-y-1">
+ {entries.map(([key, value]) => (
+ <div key={key} className="text-sm">
+ <span className="font-medium">{key}:</span>{" "}
+ <span className="text-muted-foreground">{value}</span>
+ </div>
+ ))}
+ </div>
+ </div>
+ </TooltipContent>
+ </Tooltip>
+ </TooltipProvider>
+ )
+}
+
/**
* tanstack table 컬럼 정의 (중첩 헤더 버전)
*/
export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<ExtendedTagClasses>[] {
-
-
// ----------------------------------------------------------------
// 3) 일반 컬럼들을 "그룹"별로 묶어 중첩 columns 생성
// ----------------------------------------------------------------
@@ -47,12 +155,27 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<Extende
type: cfg.type,
},
cell: ({ row, cell }) => {
-
- if (cfg.id === "createdAt"||cfg.id === "updatedAt") {
+ // 날짜 필드 처리
+ if (cfg.id === "createdAt" || cfg.id === "updatedAt") {
const dateVal = cell.getValue() as Date
return formatDate(dateVal, "KR")
}
+ // 서브클래스 배열 처리
+ if (cfg.id === "subclasses") {
+ const subclasses = cell.getValue() as {
+ id: string;
+ desc: string;
+ }[]
+ return <SubclassesCell subclasses={subclasses} />
+ }
+
+ // 서브클래스 리마크 처리
+ if (cfg.id === "subclassRemark") {
+ const remarks = cell.getValue() as Record<string, string>
+ return <SubclassRemarksCell remarks={remarks} />
+ }
+
return row.getValue(cfg.id) ?? ""
},
}
@@ -65,9 +188,13 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<Extende
// ----------------------------------------------------------------
const nestedColumns: ColumnDef<ExtendedTagClasses>[] = []
- // 순서를 고정하고 싶다면 group 순서를 미리 정의하거나 sort해야 함
- // 여기서는 그냥 Object.entries 순서
- Object.entries(groupMap).forEach(([groupName, colDefs]) => {
+ // 그룹 순서 정의
+ const groupOrder = ["Basic Info", "Hierarchy", "Metadata", "_noGroup"]
+
+ groupOrder.forEach((groupName) => {
+ const colDefs = groupMap[groupName]
+ if (!colDefs) return
+
if (groupName === "_noGroup") {
// 그룹 없음 → 그냥 최상위 레벨 컬럼
nestedColumns.push(...colDefs)
@@ -75,7 +202,7 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<Extende
// 상위 컬럼
nestedColumns.push({
id: groupName,
- header: groupName, // "Basic Info", "Metadata" 등
+ header: groupName, // "Basic Info", "Hierarchy", "Metadata" 등
columns: colDefs,
})
}
diff --git a/lib/equip-class/table/equipClass-table.tsx b/lib/equip-class/table/equipClass-table.tsx
index efb3a852..04348c54 100644
--- a/lib/equip-class/table/equipClass-table.tsx
+++ b/lib/equip-class/table/equipClass-table.tsx
@@ -51,7 +51,6 @@ export function EquipClassTable({ promises }: ItemsTableProps) {
* @prop {boolean} [withCount] - An optional boolean to display the count of the filter option.
*/
const filterFields: DataTableFilterField<ExtendedTagClasses>[] = [
-
]
/**
@@ -69,31 +68,41 @@ export function EquipClassTable({ promises }: ItemsTableProps) {
id: "code",
label: "Class ID",
type: "text",
- // group: "Basic Info",
+ group: "Basic Info",
},
{
id: "label",
label: "Description",
type: "text",
- // group: "Basic Info",
+ group: "Basic Info",
+ },
+ {
+ id: "tagTypeCode",
+ label: "Type ID",
+ type: "text",
+ group: "Basic Info",
+ },
+ // 서브클래스 관련 필터 추가
+ {
+ id: "subclasses",
+ label: "Subclasses",
+ type: "text",
+ group: "Hierarchy",
},
-
-
{
id: "createdAt",
label: "Created At",
type: "date",
- // group: "Metadata",a
+ group: "Metadata",
},
{
id: "updatedAt",
label: "Updated At",
type: "date",
- // group: "Metadata",
+ group: "Metadata",
},
]
-
const { table } = useDataTable({
data,
columns,
@@ -125,4 +134,4 @@ export function EquipClassTable({ promises }: ItemsTableProps) {
</DataTable>
</>
)
-}
+} \ No newline at end of file