From 68c3db5213e15e6ed67cb0206c72d38fff129b74 Mon Sep 17 00:00:00 2001 From: dohyeons Date: Mon, 10 Nov 2025 11:56:39 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=B6=84=ED=95=A0=20=ED=8C=A8=EB=84=90?= =?UTF-8?q?=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20=EB=A9=80=ED=8B=B0?= =?UTF-8?q?=ED=85=8C=EB=84=8C=EC=8B=9C=20=EB=B0=8F=20=EC=9E=90=EB=8F=99=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EB=A7=81=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 데이터 조회 API에 회사별 자동 필터링 기능 추가 - GET /api/data/:tableName에 company_code 필터 자동 적용 - GET /api/data/join에 우측 테이블 회사별 필터링 추가 - 최고 관리자(company_code = '*')는 전체 데이터 조회 가능 - 분할 패널 레이아웃 우측 추가 시 조인 컬럼 자동 입력 - 좌측에서 선택한 항목의 조인 키 값을 우측 추가 모달에 자동 설정 - 자동 설정된 필드는 읽기 전용으로 표시 (disabled + 안내 문구) - 사용자는 나머지 필드만 입력하면 됨 - 데이터 서비스 개선 - getJoinedData 함수에 companyCode 파라미터 추가 - checkColumnExists 함수를 public으로 변경하여 재사용성 향상 - 조인 쿼리에 DISTINCT 추가로 중복 데이터 방지 - 복합키 테이블의 레코드 삭제 지원 - 레코드 생성 시 멀티테넌시 자동 처리 - company_code와 company_name 자동 추가 - 테이블 컬럼 존재 여부 체크 후 자동 설정 - 분할 패널 설정 UI 개선 - 좌측 패널 표시 컬럼 선택 UI 추가 - 추가 폼에 표시할 컬럼 선택 기능 추가 - Primary Key 정보 자동 조회 및 표시 --- .../SplitPanelLayoutComponent.tsx | 35 +++++++++++-- .../SplitPanelLayoutConfigPanel.tsx | 51 ++++++++++++++----- 2 files changed, 69 insertions(+), 17 deletions(-) diff --git a/frontend/lib/registry/components/split-panel-layout/SplitPanelLayoutComponent.tsx b/frontend/lib/registry/components/split-panel-layout/SplitPanelLayoutComponent.tsx index dff4ee3a..dbb99963 100644 --- a/frontend/lib/registry/components/split-panel-layout/SplitPanelLayoutComponent.tsx +++ b/frontend/lib/registry/components/split-panel-layout/SplitPanelLayoutComponent.tsx @@ -160,6 +160,16 @@ export const SplitPanelLayoutComponent: React.FC // searchTerm 제거 - 클라이언트 사이드에서 필터링 }); + // 가나다순 정렬 (좌측 패널의 표시 컬럼 기준) + const leftColumn = componentConfig.rightPanel?.relation?.leftColumn; + if (leftColumn && result.data.length > 0) { + result.data.sort((a, b) => { + const aValue = String(a[leftColumn] || ''); + const bValue = String(b[leftColumn] || ''); + return aValue.localeCompare(bValue, 'ko-KR'); + }); + } + // 계층 구조 빌드 const hierarchicalData = buildHierarchy(result.data); setLeftData(hierarchicalData); @@ -173,7 +183,7 @@ export const SplitPanelLayoutComponent: React.FC } finally { setIsLoadingLeft(false); } - }, [componentConfig.leftPanel?.tableName, isDesignMode, toast, buildHierarchy]); + }, [componentConfig.leftPanel?.tableName, componentConfig.rightPanel?.relation?.leftColumn, isDesignMode, toast, buildHierarchy]); // 우측 데이터 로드 const loadRightData = useCallback( @@ -293,9 +303,19 @@ export const SplitPanelLayoutComponent: React.FC // 추가 버튼 핸들러 const handleAddClick = useCallback((panel: "left" | "right") => { setAddModalPanel(panel); - setAddModalFormData({}); + + // 우측 패널 추가 시, 좌측에서 선택된 항목의 조인 컬럼 값을 자동으로 채움 + if (panel === "right" && selectedLeftItem && componentConfig.leftPanel?.leftColumn && componentConfig.rightPanel?.rightColumn) { + const leftColumnValue = selectedLeftItem[componentConfig.leftPanel.leftColumn]; + setAddModalFormData({ + [componentConfig.rightPanel.rightColumn]: leftColumnValue + }); + } else { + setAddModalFormData({}); + } + setShowAddModal(true); - }, []); + }, [selectedLeftItem, componentConfig]); // 수정 버튼 핸들러 const handleEditClick = useCallback((panel: "left" | "right", item: any) => { @@ -1316,10 +1336,17 @@ export const SplitPanelLayoutComponent: React.FC return modalColumns?.map((col, index) => { // 항목별 추가 버튼으로 열렸을 때, parentColumn은 미리 채워져 있고 수정 불가 - const isPreFilled = addModalPanel === "left-item" + const isItemAddPreFilled = addModalPanel === "left-item" && componentConfig.leftPanel?.itemAddConfig?.parentColumn === col.name && addModalFormData[col.name]; + // 우측 패널 추가 시, 조인 컬럼(rightColumn)은 미리 채워져 있고 수정 불가 + const isRightJoinPreFilled = addModalPanel === "right" + && componentConfig.rightPanel?.rightColumn === col.name + && addModalFormData[col.name]; + + const isPreFilled = isItemAddPreFilled || isRightJoinPreFilled; + return (