"use client"; import React, { useState, useEffect, useMemo, useCallback } from "react"; import { Label } from "@/components/ui/label"; import { Checkbox } from "@/components/ui/checkbox"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/components/ui/command"; import { Check, ChevronsUpDown, Table2 } from "lucide-react"; import { cn } from "@/lib/utils"; import { tableTypeApi } from "@/lib/api/screen"; import { tableManagementApi } from "@/lib/api/tableManagement"; import { ApprovalStepConfig } from "./types"; export interface ApprovalStepConfigPanelProps { config: ApprovalStepConfig; onChange: (config: Partial) => void; tables?: any[]; allTables?: any[]; screenTableName?: string; tableColumns?: any[]; } export const ApprovalStepConfigPanel: React.FC = ({ config, onChange, screenTableName, }) => { const [availableTables, setAvailableTables] = useState>([]); const [loadingTables, setLoadingTables] = useState(false); const [tableComboboxOpen, setTableComboboxOpen] = useState(false); const [availableColumns, setAvailableColumns] = useState>([]); const [loadingColumns, setLoadingColumns] = useState(false); const [columnComboboxOpen, setColumnComboboxOpen] = useState(false); const handleChange = (key: keyof ApprovalStepConfig, value: any) => { onChange({ [key]: value }); }; const targetTableName = config.targetTable || screenTableName; // 테이블 목록 가져오기 - tableTypeApi 사용 (다른 ConfigPanel과 동일) useEffect(() => { const fetchTables = async () => { setLoadingTables(true); try { const response = await tableTypeApi.getTables(); setAvailableTables( response.map((table: any) => ({ tableName: table.tableName, displayName: table.displayName || table.tableName, })) ); } catch (error) { console.error("테이블 목록 가져오기 실패:", error); } finally { setLoadingTables(false); } }; fetchTables(); }, []); // 선택된 테이블의 컬럼 로드 - tableManagementApi 사용 (다른 ConfigPanel과 동일) useEffect(() => { if (!targetTableName) { setAvailableColumns([]); return; } const fetchColumns = async () => { setLoadingColumns(true); try { const result = await tableManagementApi.getColumnList(targetTableName); if (result.success && result.data) { const columns = Array.isArray(result.data) ? result.data : result.data.columns; if (columns && Array.isArray(columns)) { setAvailableColumns( columns.map((col: any) => ({ columnName: col.columnName || col.column_name || col.name, label: col.displayName || col.columnLabel || col.column_label || col.columnName || col.column_name || col.name, })) ); } } } catch (error) { console.error("컬럼 목록 가져오기 실패:", error); setAvailableColumns([]); } finally { setLoadingColumns(false); } }; fetchColumns(); }, [targetTableName]); const handleTableChange = (newTableName: string) => { if (newTableName === targetTableName) return; handleChange("targetTable", newTableName); handleChange("targetRecordIdField", ""); setTableComboboxOpen(false); }; return (
결재 단계 설정
{/* 대상 테이블 선택 - TableListConfigPanel과 동일한 Combobox */}

데이터 소스

결재 상태를 조회할 대상 테이블을 선택하세요.


테이블을 찾을 수 없습니다. {availableTables.map((table) => ( handleTableChange(table.tableName)} className="text-xs" >
{table.displayName} {table.displayName !== table.tableName && ( {table.tableName} )}
))}
{screenTableName && targetTableName !== screenTableName && (
화면 기본 테이블({screenTableName})과 다른 테이블을 사용 중
)}
{/* 레코드 ID 필드 선택 - 동일한 Combobox 패턴 */}

레코드 식별

결재 대상 레코드를 식별할 PK 컬럼을 선택하세요.


{targetTableName ? ( 컬럼을 찾을 수 없습니다. {availableColumns.map((col) => ( { handleChange("targetRecordIdField", col.columnName); setColumnComboboxOpen(false); }} className="text-xs" >
{col.label} {col.label !== col.columnName && ( {col.columnName} )}
))}
) : (

대상 테이블을 먼저 선택하세요.

)}
{/* 표시 모드 */}

표시 설정

결재 단계의 표시 방식을 설정합니다.


{/* 옵션 체크박스들 */}
handleChange("showDept", !!checked)} />
handleChange("showComment", !!checked)} />
handleChange("showTimestamp", !!checked)} />
handleChange("compact", !!checked)} />
); };