diff --git a/frontend/app/(main)/sales/shipping-plan/page.tsx b/frontend/app/(main)/sales/shipping-plan/page.tsx index f04e6908..e77e7066 100644 --- a/frontend/app/(main)/sales/shipping-plan/page.tsx +++ b/frontend/app/(main)/sales/shipping-plan/page.tsx @@ -315,15 +315,15 @@ export default function ShippingPlanPage() { onCheckedChange={handleCheckAll} /> - 수주번호 - 납기일 - 거래처 - 품목코드 - 품목명 - 수주수량 - 계획수량 - 출하계획일 - 상태 + 수주번호 + 납기일 + 거래처 + 품목코드 + 품목명 + 수주수량 + 계획수량 + 출하계획일 + 상태 diff --git a/frontend/lib/registry/components/universal-form-modal/modals/FieldDetailSettingsModal.tsx b/frontend/lib/registry/components/universal-form-modal/modals/FieldDetailSettingsModal.tsx index 9fa2e0a0..13bf2c11 100644 --- a/frontend/lib/registry/components/universal-form-modal/modals/FieldDetailSettingsModal.tsx +++ b/frontend/lib/registry/components/universal-form-modal/modals/FieldDetailSettingsModal.tsx @@ -109,6 +109,11 @@ export function FieldDetailSettingsModal({ const [cascadingRelationOpen, setCascadingRelationOpen] = useState(false); const [parentFieldOpen, setParentFieldOpen] = useState(false); + // 기본 선택값용 옵션 목록 상태 + const [defaultValueCategoryValues, setDefaultValueCategoryValues] = useState<{value: string; label: string}[]>([]); + const [defaultValueTableOptions, setDefaultValueTableOptions] = useState<{value: string; label: string}[]>([]); + const [loadingDefaultValueOptions, setLoadingDefaultValueOptions] = useState(false); + // Combobox 열림 상태 const [sourceTableOpen, setSourceTableOpen] = useState(false); const [targetColumnOpenMap, setTargetColumnOpenMap] = useState>({}); @@ -209,6 +214,69 @@ export function FieldDetailSettingsModal({ loadCascadingRelations(); }, [open]); + // 기본 선택값용: code 타입 카테고리 값 로드 + useEffect(() => { + const loadCategoryValues = async () => { + const categoryKey = localField.selectOptions?.categoryKey; + if (!open || localField.selectOptions?.type !== "code" || !categoryKey) { + setDefaultValueCategoryValues([]); + return; + } + setLoadingDefaultValueOptions(true); + try { + const [tableName, columnName] = categoryKey.split("."); + const response = await apiClient.get(`/table-categories/${tableName}/${columnName}/values`); + if (response.data?.success && response.data?.data) { + setDefaultValueCategoryValues( + response.data.data.map((item: any) => ({ + value: item.valueCode || item.value_code, + label: item.valueLabel || item.value_label, + })) + ); + } else { + setDefaultValueCategoryValues([]); + } + } catch { + setDefaultValueCategoryValues([]); + } finally { + setLoadingDefaultValueOptions(false); + } + }; + loadCategoryValues(); + }, [open, localField.selectOptions?.type, localField.selectOptions?.categoryKey]); + + // 기본 선택값용: table 타입 옵션 로드 + useEffect(() => { + const loadTableOptions = async () => { + const opts = localField.selectOptions; + if (!open || opts?.type !== "table" || !opts?.tableName || !opts?.valueColumn || !opts?.labelColumn) { + setDefaultValueTableOptions([]); + return; + } + setLoadingDefaultValueOptions(true); + try { + const response = await apiClient.post(`/table-management/tables/${opts.tableName}/data`, { + page: 1, + size: 200, + autoFilter: { enabled: true, filterColumn: "company_code" }, + }); + const dataArray = response.data?.data?.data || response.data?.data || []; + setDefaultValueTableOptions( + dataArray.map((row: any) => ({ + value: String(row[opts.valueColumn!] || ""), + label: String(row[opts.labelColumn!] || ""), + })) + ); + } catch { + setDefaultValueTableOptions([]); + } finally { + setLoadingDefaultValueOptions(false); + } + }; + loadTableOptions(); + }, [open, localField.selectOptions?.type, localField.selectOptions?.tableName, + localField.selectOptions?.valueColumn, localField.selectOptions?.labelColumn]); + // 관계 코드 선택 시 상세 설정 자동 채움 const handleRelationCodeSelect = async (relationCode: string) => { if (!relationCode) return; @@ -1181,6 +1249,80 @@ export function FieldDetailSettingsModal({ )} + + {/* 기본 선택값 설정 (cascading 제외) */} + {(() => { + const effectiveType = localField.selectOptions?.type || "static"; + if (effectiveType === "cascading") return null; + return ( +
+
+ 기본 선택값 + {/* static 타입 */} + {effectiveType === "static" && (localField.selectOptions?.staticOptions?.length || 0) > 0 && ( + + )} + {/* code 타입 */} + {effectiveType === "code" && defaultValueCategoryValues.length > 0 && ( + + )} + {/* table 타입 */} + {effectiveType === "table" && defaultValueTableOptions.length > 0 && ( + + )} + {loadingDefaultValueOptions && ( + 로딩 중... + )} +
+ 폼이 열릴 때 자동으로 선택될 기본값을 설정합니다 +
+ ); + })()} )}