From b9a109073d11262dd7ed84e25ff3cd0144c0c391 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Fri, 4 Jul 2025 00:21:05 +0000 Subject: (최겸) 0703 평가기준표 대표님 작업사항 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../excel/reg-eval-criteria-excel-import.ts | 2 +- lib/evaluation-criteria/service.ts | 72 ++- .../table/reg-eval-criteria-columns.tsx | 221 ++++---- .../table/reg-eval-criteria-details-sheet.tsx | 226 ++++++++ .../table/reg-eval-criteria-form-sheet.tsx | 12 +- .../table/reg-eval-criteria-table.tsx | 83 ++- .../table/reg-eval-criteria-update-sheet.tsx | 574 +++++++++++++-------- lib/evaluation-criteria/validations.ts | 13 +- 8 files changed, 817 insertions(+), 386 deletions(-) create mode 100644 lib/evaluation-criteria/table/reg-eval-criteria-details-sheet.tsx (limited to 'lib') diff --git a/lib/evaluation-criteria/excel/reg-eval-criteria-excel-import.ts b/lib/evaluation-criteria/excel/reg-eval-criteria-excel-import.ts index eb3d7020..92c7a25e 100644 --- a/lib/evaluation-criteria/excel/reg-eval-criteria-excel-import.ts +++ b/lib/evaluation-criteria/excel/reg-eval-criteria-excel-import.ts @@ -318,7 +318,7 @@ export async function importRegEvalCriteriaExcel(file: File): Promise 0 ? input.sort.map((item) => { return item.desc - ? desc(regEvalCriteriaView[item.id]) - : asc(regEvalCriteriaView[item.id]); + ? desc(regEvalCriteria[item.id]) + : asc(regEvalCriteria[item.id]); }) - : [asc(regEvalCriteriaView.id)]; + : [asc(regEvalCriteria.id)]; - // Getting Data + // Getting Data - 메인 기준 데이터만 가져오기 const { data, total } = await db.transaction(async (tx) => { - const data = await selectRegEvalCriteria(tx, { - where: finalWhere, - orderBy, - offset, - limit: input.perPage, - }); - const total = await countRegEvalCriteria(tx, finalWhere); + const data = await tx + .select() + .from(regEvalCriteria) + .where(finalWhere) + .orderBy(...orderBy) + .offset(offset) + .limit(input.perPage); + + const totalResult = await tx + .select({ count: count() }) + .from(regEvalCriteria) + .where(finalWhere); + + const total = totalResult[0]?.count || 0; return { data, total }; }); @@ -105,6 +113,26 @@ async function getRegEvalCriteriaWithDetails(id: number) { } } +/* FUNCTION FOR GETTING CRITERIA DETAILS ONLY - 특정 기준의 상세 항목들만 가져오기 */ +async function getRegEvalCriteriaDetails(criteriaId: number) { + try { + + console.log(criteriaId,"criteriaId") + return await db.transaction(async (tx) => { + const details = await tx + .select() + .from(regEvalCriteriaDetails) + .where(eq(regEvalCriteriaDetails.criteriaId, criteriaId)) + .orderBy(asc(regEvalCriteriaDetails.orderIndex)); + + return details; + }); + } catch (err) { + console.error('Error in Getting Regular Evaluation Criteria Details: ', err); + return []; + } +} + // ---------------------------------------------------------------------------------------------------- /* FUNCTION FOR CREATING CRITERIA WITH DETAILS */ @@ -145,6 +173,9 @@ async function modifyRegEvalCriteriaWithDetails( ) { try { return await db.transaction(async (tx) => { + + console.log(id, criteriaData) + const modifiedCriteria = await updateRegEvalCriteria(tx, id, criteriaData); const originCriteria = await getRegEvalCriteriaWithDetails(id); const originCriteriaDetails = originCriteria?.criteriaDetails || []; @@ -214,8 +245,6 @@ async function removeRegEvalCriteriaDetails(id: number) { } } - - // ---------------------------------------------------------------------------------------------------- /* EXPORT */ @@ -224,6 +253,7 @@ export { modifyRegEvalCriteriaWithDetails, getRegEvalCriteria, getRegEvalCriteriaWithDetails, + getRegEvalCriteriaDetails, // 새로 추가 removeRegEvalCriteria, removeRegEvalCriteriaDetails, }; \ No newline at end of file diff --git a/lib/evaluation-criteria/table/reg-eval-criteria-columns.tsx b/lib/evaluation-criteria/table/reg-eval-criteria-columns.tsx index bdf583bc..88c8107b 100644 --- a/lib/evaluation-criteria/table/reg-eval-criteria-columns.tsx +++ b/lib/evaluation-criteria/table/reg-eval-criteria-columns.tsx @@ -10,14 +10,16 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, + DropdownMenuShortcut, + DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; -import { Ellipsis } from 'lucide-react'; +import { Ellipsis, Eye, Edit, Trash2 } from 'lucide-react'; import { REG_EVAL_CRITERIA_CATEGORY, REG_EVAL_CRITERIA_CATEGORY2, REG_EVAL_CRITERIA_ITEM, - type RegEvalCriteriaView, + type RegEvalCriteria, // RegEvalCriteriaView 대신 RegEvalCriteria 사용 } from '@/db/schema'; import { type ColumnDef } from '@tanstack/react-table'; import { type DataTableRowAction } from '@/types/table'; @@ -26,16 +28,16 @@ import { type DataTableRowAction } from '@/types/table'; /* TYPES */ interface GetColumnsProps { - setRowAction: Dispatch | null>>, + setRowAction: Dispatch | null>>, }; // ---------------------------------------------------------------------------------------------------- /* FUNCTION FOR GETTING COLUMNS SETTING */ -function getColumns({ setRowAction }: GetColumnsProps): ColumnDef[] { +function getColumns({ setRowAction }: GetColumnsProps): ColumnDef[] { // [1] SELECT COLUMN - CHECKBOX - const selectColumn: ColumnDef = { + const selectColumn: ColumnDef = { id: 'select', header: ({ table }) => ( [] = [ + const criteriaColumns: ColumnDef[] = [ { accessorKey: 'category', header: ({ column }) => ( @@ -146,149 +148,129 @@ function getColumns({ setRowAction }: GetColumnsProps): ColumnDef ( - + ), cell: ({ row }) => ( -
+
{row.getValue('range') || '-'}
), enableSorting: true, enableHiding: false, meta: { - excelHeader: 'Range', + excelHeader: 'Evaluation Name', type: 'text', }, }, { - accessorKey: 'detail', + accessorKey: 'scoreType', header: ({ column }) => ( - - ), - cell: ({ row }) => ( -
- {row.getValue('detail')} -
- ), - enableSorting: true, - enableHiding: false, - meta: { - excelHeader: 'Detail', - type: 'text', - }, - }, - ]; - - // [3] SCORE COLUMNS - const scoreEquipColumns: ColumnDef[] = [ - { - accessorKey: 'scoreEquipShip', - header: ({ column }) => ( - + ), cell: ({ row }) => { - const value = row.getValue('scoreEquipShip'); - const displayValue = typeof value === 'string' - ? parseFloat(parseFloat(value).toFixed(2)).toString() - : '-'; + const value = row.getValue('scoreType'); return ( -
- {displayValue} -
+ + {value === 'fixed' ? '고정점수' : '변동점수'} + ); }, enableSorting: true, enableHiding: false, meta: { - excelHeader: 'Equipment-Shipbuilding Score', - group: 'Equipment Score', - type: 'number', + excelHeader: 'Score Type', + type: 'select', }, }, + ]; + + // [3] VARIABLE SCORE COLUMNS (변동점수 관련 컬럼들) + const variableScoreColumns: ColumnDef[] = [ { - accessorKey: 'scoreEquipMarine', + accessorKey: 'variableScoreMin', header: ({ column }) => ( - + ), cell: ({ row }) => { - const value = row.getValue('scoreEquipMarine'); + const value = row.getValue('variableScoreMin'); + const scoreType = row.getValue('scoreType'); + if (scoreType !== 'variable') return
-
; + const displayValue = typeof value === 'string' ? parseFloat(parseFloat(value).toFixed(2)).toString() : '-'; return ( -
+
{displayValue}
); }, enableSorting: true, - enableHiding: false, + enableHiding: true, meta: { - excelHeader: 'Equipment-Marine Engineering Score', - group: 'Equipment Score', + excelHeader: 'Min Score', type: 'number', }, }, - ]; - const scoreBulkColumns: ColumnDef[] = [ { - accessorKey: 'scoreBulkShip', + accessorKey: 'variableScoreMax', header: ({ column }) => ( - + ), cell: ({ row }) => { - const value = row.getValue('scoreBulkShip'); + const value = row.getValue('variableScoreMax'); + const scoreType = row.getValue('scoreType'); + if (scoreType !== 'variable') return
-
; + const displayValue = typeof value === 'string' ? parseFloat(parseFloat(value).toFixed(2)).toString() : '-'; return ( -
+
{displayValue}
); }, enableSorting: true, - enableHiding: false, + enableHiding: true, meta: { - excelHeader: 'Bulk-Shipbuilding Score', - group: 'Bulk Score', + excelHeader: 'Max Score', type: 'number', }, }, { - accessorKey: 'scoreBulkMarine', + accessorKey: 'variableScoreUnit', header: ({ column }) => ( - + ), cell: ({ row }) => { - const value = row.getValue('scoreBulkMarine'); - const displayValue = typeof value === 'string' - ? parseFloat(parseFloat(value).toFixed(2)).toString() - : '-'; + const value = row.getValue('variableScoreUnit'); + const scoreType = row.getValue('scoreType'); + if (scoreType !== 'variable') return
-
; + return ( -
- {displayValue} +
+ {value || '-'}
); }, enableSorting: true, - enableHiding: false, + enableHiding: true, meta: { - excelHeader: 'Bulk-Marine Engineering Score', - group: 'Bulk Score', - type: 'number', + excelHeader: 'Score Unit', + type: 'text', }, }, ]; // [4] REMARKS COLUMN - const remarksColumn: ColumnDef = { + const remarksColumn: ColumnDef = { accessorKey: 'remarks', header: ({ column }) => ( ), cell: ({ row }) => ( -
+
{row.getValue('remarks') || '-'}
), @@ -300,8 +282,8 @@ function getColumns({ setRowAction }: GetColumnsProps): ColumnDef