From 055094308d99b2a573ed6052b9bb7fc627f2b8dd Mon Sep 17 00:00:00 2001 From: SeongHyun Kim Date: Wed, 21 Jan 2026 16:42:11 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=AA=A8=EB=8B=AC=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=8B=9C=20menuObjid=20=EC=A0=84=EB=8B=AC=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 카테고리 값을 메뉴별로 다르게 설정할 수 있도록 menuObjid를 모달 체인 전체에 전달합니다. 변경 내용: - InteractiveDataTable: 등록/수정 모달 열 때 menuObjid를 이벤트에 포함 - EditModal: menuObjid를 state에 저장하고 하위 컴포넌트에 전달 - SaveModal: menuObjid props를 받아서 DynamicComponentRenderer에 전달 - SelectBasicComponent: getCategoryValues API 호출 시 menuObjid 파라미터 전달 이를 통해 같은 테이블/컬럼이라도 메뉴에 따라 다른 카테고리 옵션을 표시할 수 있습니다. 카테고리 API를 호출할 때 menuObjid를 전달하여 메뉴별 필터링 적용 가능하게 변경 --- frontend/components/screen/EditModal.tsx | 7 ++++++- frontend/components/screen/InteractiveDataTable.tsx | 4 +++- frontend/components/screen/SaveModal.tsx | 4 ++++ .../components/select-basic/SelectBasicComponent.tsx | 7 +++++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/frontend/components/screen/EditModal.tsx b/frontend/components/screen/EditModal.tsx index 7c722ad6..48bf898f 100644 --- a/frontend/components/screen/EditModal.tsx +++ b/frontend/components/screen/EditModal.tsx @@ -33,6 +33,7 @@ interface EditModalState { dataflowConfig?: any; dataflowTiming?: string; }; // 🆕 모달 내부 저장 버튼의 제어로직 설정 + menuObjid?: number; // 🆕 메뉴 OBJID (카테고리 스코프용) } interface EditModalProps { @@ -91,6 +92,7 @@ export const EditModal: React.FC = ({ className }) => { buttonConfig: undefined, buttonContext: undefined, saveButtonConfig: undefined, + menuObjid: undefined, }); const [screenData, setScreenData] = useState<{ @@ -234,7 +236,7 @@ export const EditModal: React.FC = ({ className }) => { // 전역 모달 이벤트 리스너 useEffect(() => { const handleOpenEditModal = async (event: CustomEvent) => { - const { screenId, title, description, modalSize, editData, onSave, groupByColumns, tableName, isCreateMode, buttonConfig, buttonContext } = event.detail; + const { screenId, title, description, modalSize, editData, onSave, groupByColumns, tableName, isCreateMode, buttonConfig, buttonContext, menuObjid } = event.detail; // 🆕 모달 내부 저장 버튼의 제어로직 설정 조회 let saveButtonConfig: EditModalState["saveButtonConfig"] = undefined; @@ -258,6 +260,7 @@ export const EditModal: React.FC = ({ className }) => { buttonConfig, // 🆕 버튼 설정 buttonContext, // 🆕 버튼 컨텍스트 saveButtonConfig, // 🆕 모달 내부 저장 버튼의 제어로직 설정 + menuObjid, // 🆕 메뉴 OBJID (카테고리 스코프용) }); // 편집 데이터로 폼 데이터 초기화 @@ -1079,6 +1082,8 @@ export const EditModal: React.FC = ({ className }) => { id: modalState.screenId!, tableName: screenData.screenInfo?.tableName, }} + // 🆕 메뉴 OBJID 전달 (카테고리 스코프용) + menuObjid={modalState.menuObjid} // 🆕 그룹 데이터가 있거나 UniversalFormModal이 없으면 EditModal.handleSave 사용 // groupData가 있으면 일괄 저장을 위해 반드시 EditModal.handleSave 사용 onSave={shouldUseEditModalSave ? handleSave : undefined} diff --git a/frontend/components/screen/InteractiveDataTable.tsx b/frontend/components/screen/InteractiveDataTable.tsx index 8c4c95ce..e872e587 100644 --- a/frontend/components/screen/InteractiveDataTable.tsx +++ b/frontend/components/screen/InteractiveDataTable.tsx @@ -1213,13 +1213,14 @@ export const InteractiveDataTable: React.FC = ({ description: editModalDescription, modalSize: "lg", editData: initialData, + menuObjid, // 🆕 메뉴 OBJID 전달 (카테고리 스코프용) onSave: () => { loadData(); // 테이블 데이터 새로고침 }, }, }); window.dispatchEvent(event); - }, [selectedRows, data, getDisplayColumns, component.addModalConfig, component.editModalConfig, loadData]); + }, [selectedRows, data, getDisplayColumns, component.addModalConfig, component.editModalConfig, loadData, menuObjid]); // 수정 폼 데이터 변경 핸들러 const handleEditFormChange = useCallback((columnName: string, value: any) => { @@ -2720,6 +2721,7 @@ export const InteractiveDataTable: React.FC = ({ screenId={saveModalScreenId} modalSize={component.addModalConfig?.modalSize || "lg"} initialData={saveModalData} + menuObjid={menuObjid} // 🆕 메뉴 OBJID 전달 (카테고리 스코프용) onSaveSuccess={() => { // 저장 성공 시 테이블 새로고침 loadData(currentPage, searchValues); // 현재 페이지로 다시 로드 diff --git a/frontend/components/screen/SaveModal.tsx b/frontend/components/screen/SaveModal.tsx index 88ca2534..61b2e2c5 100644 --- a/frontend/components/screen/SaveModal.tsx +++ b/frontend/components/screen/SaveModal.tsx @@ -19,6 +19,7 @@ interface SaveModalProps { modalSize?: "sm" | "md" | "lg" | "xl" | "full"; initialData?: any; // 수정 모드일 때 기존 데이터 onSaveSuccess?: () => void; // 저장 성공 시 콜백 (테이블 새로고침용) + menuObjid?: number; // 🆕 메뉴 OBJID (카테고리 스코프용) } /** @@ -33,6 +34,7 @@ export const SaveModal: React.FC = ({ modalSize = "lg", initialData, onSaveSuccess, + menuObjid, }) => { const { user, userName } = useAuth(); // 현재 사용자 정보 가져오기 const [formData, setFormData] = useState>(initialData || {}); @@ -373,6 +375,7 @@ export const SaveModal: React.FC = ({ })); }} hideLabel={false} + menuObjid={menuObjid} // 🆕 메뉴 OBJID 전달 (카테고리 스코프용) /> ) : ( = ({ }} screenId={screenId} tableName={screenData.tableName} + menuObjid={menuObjid} // 🆕 메뉴 OBJID 전달 (카테고리 스코프용) userId={user?.userId} // ✅ 사용자 ID 전달 userName={user?.userName} // ✅ 사용자 이름 전달 companyCode={user?.companyCode} // ✅ 회사 코드 전달 diff --git a/frontend/lib/registry/components/select-basic/SelectBasicComponent.tsx b/frontend/lib/registry/components/select-basic/SelectBasicComponent.tsx index c896e1f2..697e0f69 100644 --- a/frontend/lib/registry/components/select-basic/SelectBasicComponent.tsx +++ b/frontend/lib/registry/components/select-basic/SelectBasicComponent.tsx @@ -299,12 +299,14 @@ const SelectBasicComponent: React.FC = ({ tableName: component.tableName, columnName: component.columnName, webType, + menuObjid, // 🆕 menuObjid 로깅 추가 }); setIsLoadingCategories(true); import("@/lib/api/tableCategoryValue").then(({ getCategoryValues }) => { - getCategoryValues(component.tableName!, component.columnName!) + // 🆕 menuObjid를 4번째 파라미터로 전달 (카테고리 스코프 적용) + getCategoryValues(component.tableName!, component.columnName!, false, menuObjid) .then((response) => { console.log("🔍 [SelectBasic] 카테고리 API 응답:", response); @@ -324,6 +326,7 @@ const SelectBasicComponent: React.FC = ({ activeValuesCount: activeValues.length, options, sampleOption: options[0], + menuObjid, // 🆕 menuObjid 로깅 추가 }); setCategoryOptions(options); @@ -339,7 +342,7 @@ const SelectBasicComponent: React.FC = ({ }); }); } - }, [webType, component.tableName, component.columnName]); + }, [webType, component.tableName, component.columnName, menuObjid]); // 🆕 menuObjid 의존성 추가 // 디버깅: menuObjid가 제대로 전달되는지 확인 useEffect(() => {