summaryrefslogtreecommitdiff
path: root/lib/evaluation-criteria/table/reg-eval-criteria-table.tsx
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-06-24 01:51:59 +0000
committerjoonhoekim <26rote@gmail.com>2025-06-24 01:51:59 +0000
commit6824e097d768f724cf439b410ccfb1ab9685ac98 (patch)
tree1f297313637878e7a4ad6c89b84d5a2c3e9eb650 /lib/evaluation-criteria/table/reg-eval-criteria-table.tsx
parentf4825dd3853188de4688fb4a56c0f4e847da314b (diff)
parent4e63d8427d26d0d1b366ddc53650e15f3481fc75 (diff)
(merge) 대표님/최겸 작업사항 머지
Diffstat (limited to 'lib/evaluation-criteria/table/reg-eval-criteria-table.tsx')
-rw-r--r--lib/evaluation-criteria/table/reg-eval-criteria-table.tsx189
1 files changed, 189 insertions, 0 deletions
diff --git a/lib/evaluation-criteria/table/reg-eval-criteria-table.tsx b/lib/evaluation-criteria/table/reg-eval-criteria-table.tsx
new file mode 100644
index 00000000..a2242309
--- /dev/null
+++ b/lib/evaluation-criteria/table/reg-eval-criteria-table.tsx
@@ -0,0 +1,189 @@
+'use client';
+
+/* IMPORT */
+import { DataTable } from '@/components/data-table/data-table';
+import { DataTableAdvancedToolbar } from '@/components/data-table/data-table-advanced-toolbar';
+import getColumns from './reg-eval-criteria-columns';
+import { getRegEvalCriteria } from '../service';
+import {
+ REG_EVAL_CRITERIA_CATEGORY,
+ REG_EVAL_CRITERIA_ITEM,
+ REG_EVAL_CRITERIA_CATEGORY2,
+ type RegEvalCriteriaView
+} from '@/db/schema';
+import RegEvalCriteriaDeleteDialog from './reg-eval-criteria-delete-dialog';
+import RegEvalCriteriaFormSheet from './reg-eval-criteria-form-sheet';
+import RegEvalCriteriaTableToolbarActions from './reg-eval-criteria-table-toolbar-actions';
+import {
+ type DataTableFilterField,
+ type DataTableRowAction,
+ type DataTableAdvancedFilterField,
+} from '@/types/table';
+import { useDataTable } from '@/hooks/use-data-table';
+import { use, useCallback, useMemo, useState } from 'react';
+import { useRouter } from 'next/navigation';
+
+// ----------------------------------------------------------------------------------------------------
+
+/* TYPES */
+interface RegEvalCriteriaTableProps {
+ promises: Promise<[
+ Awaited<ReturnType<typeof getRegEvalCriteria>>,
+ ]>,
+}
+
+// ----------------------------------------------------------------------------------------------------
+
+/* TABLE COMPONENT */
+function RegEvalCriteriaTable({ promises }: RegEvalCriteriaTableProps) {
+ const router = useRouter();
+ const [rowAction, setRowAction] = useState<DataTableRowAction<RegEvalCriteriaView> | null>(null);
+ const [isCreateFormOpen, setIsCreateFormOpen] = useState<boolean>(false);
+ const [promiseData] = use(promises);
+ const tableData = promiseData;
+
+ const columns = useMemo(
+ () => getColumns({ setRowAction }),
+ [setRowAction],
+ );
+
+ const filterFields: DataTableFilterField<RegEvalCriteriaView>[] = [
+ {
+ id: 'category',
+ label: '평가부문',
+ placeholder: '평가부문 선택...',
+ },
+ {
+ id: 'scoreCategory',
+ label: '점수구분',
+ placeholder: '점수구분 선택...',
+ },
+ {
+ id: 'item',
+ label: '항목',
+ placeholder: '항목 선택...',
+ },
+ ]
+ const advancedFilterFields: DataTableAdvancedFilterField<RegEvalCriteriaView>[] = [
+ {
+ id: 'category',
+ label: '평가부문',
+ type: 'select',
+ options: REG_EVAL_CRITERIA_CATEGORY,
+ },
+ {
+ id: 'scoreCategory',
+ label: '점수구분',
+ type: 'select',
+ options: REG_EVAL_CRITERIA_CATEGORY2,
+ },
+ {
+ id: 'item',
+ label: '항목',
+ type: 'select',
+ options: REG_EVAL_CRITERIA_ITEM,
+ },
+ { id: 'classification', label: '구분', type: 'text' },
+ { id: 'range', label: '범위', type: 'text' },
+ { id: 'detail', label: '평가내용', type: 'text' },
+ { id: 'scoreEquipShip', label: '조선', type: 'number' },
+ { id: 'scoreEquipMarine', label: '해양', type: 'number' },
+ { id: 'scoreBulkShip', label: '조선', type: 'number' },
+ { id: 'scoreBulkMarine', label: '해양', type: 'number' },
+ { id: 'remarks', label: '비고', type: 'text' },
+ ];
+
+ // Data Table Setting
+ const { table } = useDataTable({
+ data: tableData.data,
+ columns,
+ pageCount: tableData.pageCount,
+ filterFields,
+ enablePinning: true,
+ enableAdvancedFilter: true,
+ initialState: {
+ sorting: [{ id: 'id', desc: false }],
+ columnPinning: { left: ['select'], right: ['actions'] },
+ },
+ getRowId: (originalRow) => String(originalRow.id),
+ shallow: false,
+ clearOnDefault: true,
+ });
+
+ const emptyCriteriaViewData: RegEvalCriteriaView = {
+ id: 0,
+ category: '',
+ scoreCategory: '',
+ item: '',
+ classification: '',
+ range: null,
+ remarks: null,
+ criteriaId: 0,
+ detail: '',
+ orderIndex: null,
+ scoreEquipShip: null,
+ scoreEquipMarine: null,
+ scoreBulkShip: null,
+ scoreBulkMarine: null,
+ };
+
+ const refreshData = useCallback(() => {
+ router.refresh();
+ }, [router]);
+ const handleCreateCriteria = () => {
+ setIsCreateFormOpen(true);
+ };
+ const handleCreateSuccess = useCallback(() => {
+ setIsCreateFormOpen(false);
+ refreshData();
+ }, [refreshData]);
+ const handleModifySuccess = useCallback(() => {
+ setRowAction(null);
+ refreshData();
+ }, [refreshData]);
+ const handleDeleteSuccess = useCallback(() => {
+ setRowAction(null);
+ refreshData();
+ }, [refreshData]);
+
+ return (
+ <>
+ <DataTable table={table}>
+ <DataTableAdvancedToolbar
+ table={table}
+ filterFields={advancedFilterFields}
+ shallow={false}
+ >
+ <RegEvalCriteriaTableToolbarActions
+ table={table}
+ onCreateCriteria={handleCreateCriteria}
+ onRefresh={refreshData}
+ />
+ </DataTableAdvancedToolbar>
+ </DataTable>
+ <RegEvalCriteriaFormSheet
+ open={isCreateFormOpen}
+ onOpenChange={setIsCreateFormOpen}
+ criteriaViewData={null}
+ onSuccess={handleCreateSuccess}
+ />
+ <RegEvalCriteriaFormSheet
+ open={rowAction?.type === 'update'}
+ onOpenChange={() => setRowAction(null)}
+ criteriaViewData={rowAction?.row.original ?? null}
+ onSuccess={handleModifySuccess}
+ />
+ <RegEvalCriteriaDeleteDialog
+ open={rowAction?.type === 'delete'}
+ onOpenChange={() => setRowAction(null)}
+ criteriaViewData={rowAction?.row.original ?? emptyCriteriaViewData}
+ onSuccess={handleDeleteSuccess}
+ />
+ </>
+ )
+}
+
+// ----------------------------------------------------------------------------------------------------
+
+/* EXPORT */
+export default RegEvalCriteriaTable;