49 lines
8.1 KiB
JSON
49 lines
8.1 KiB
JSON
|
|
{
|
||
|
|
"featureDescription": "Phase D: UnifiedConfigPanel 나머지 4개 탭 구현\n\n## 목표\nUnifiedConfigPanel.tsx의 TODO 상태인 데이터/표시/연동/조건 탭을 실제 기능으로 채운다.\n\n## 현재 상태\nfrontend/lib/meta-components/config/UnifiedConfigPanel.tsx 파일의:\n- renderBasicTab(): 완성됨 (7개 컴포넌트별 설정 UI)\n- renderDataTab(): TODO (placeholder만)\n- renderDisplayTab(): TODO (placeholder만)\n- renderBindingTab(): TODO (placeholder만)\n- renderConditionTab(): TODO (placeholder만)\n\n## 구현 상세\n\n### 1. renderDataTab() - 데이터 바인딩 설정\n컴포넌트 타입별로 표시할 설정:\n\n**meta-field**:\n- 테이블명 (Input)\n- 컬럼명 / 바인딩 (Input)\n- 기본값 (Input)\n- \"DB에서 설정 가져오기\" 버튼 → getFieldConfig API 호출\n - import { getFieldConfig } from \"@/lib/api/metaComponent\" 사용\n - 호출 결과로 config 자동 채우기 (webType, label, required, options, join 등)\n\n**meta-dataview**:\n- 테이블명 (Input, 필수)\n- 컬럼 선택 (여러 Input 또는 체크박스 - 추후 getTableColumns API로 조회 가능)\n- 페이지 크기 (number Input, 기본값 20)\n- 기본 정렬 컬럼 (Input)\n- 기본 정렬 방향 (Select: asc/desc)\n\n**meta-search**:\n- 대상 DataView ID (Input)\n- 검색 필드 목록 (동적 추가/삭제: 컬럼명 + 라벨 + 검색타입)\n- \"필드 추가\" 버튼\n\n**meta-modal (form 타입)**:\n- 테이블명 (Input)\n- 모드 (Select: create/edit/view)\n- 컬럼 목록 (동적 추가/삭제)\n- 레이아웃 (Select: single/two_column)\n\n### 2. renderDisplayTab() - 스타일 설정\n모든 컴포넌트 공통:\n- 너비 (Input, px 또는 %)\n- 높이 (Input, px 또는 auto)\n- 최소 너비 (Input)\n- 최대 너비 (Input)\n\n**meta-field**:\n- 라벨 위치 (Select: top/left/hidden)\n- 라벨 너비 (Input, px)\n\n**meta-display**:\n- 텍스트 크기 (Select: xs/sm/md/lg/xl)\n- 텍스트 굵기 (Select: normal/medium/semibold/bold)\n- 정렬 (Select: left/center/right)\n\n**meta-layout**:\n- 간격 gap (number Input)\n- 패딩 padding (number Input)\n- 테두리 (Switch)\n\n**meta-action**:\n- 버튼 크기 (Select: sm/default/lg)\n- 아이콘 (Input)\n\n### 3. renderBindingTab() - Reactive Binding 설정\n이벤트-액션 연결 UI:\n- \"새 바인딩 추가\" 버튼\n- 각 바인딩 행:\n - 소스 컴포넌트 ID (Input)\n - 소스 이벤트 (Select: change/select/click/load)\n - 소스 필드 (Input, 선택사항)\n - 대상 컴포넌트 ID (Input)\n - 대상 액션 (Select: filter/setValue/show/hide/enable/disable/refresh)\n - 대상 필드 (Input, 선택사항)\n - 삭제 버튼 (X)\n- bindings 상태를 배열로 관리\n- 변경 시 onChange 호출\n\n### 4. renderConditionTab() - 조건부 표시/활성 설정\n- 표시 조건:\n - 모드 (Select: always/when_field_equals/when_field_not_empty/custom)\n - 필드 ID (Input, when_field_* 선택 시)\n - 비교 값 (Input, when_field_equals 선택 시)\n- 활성 조건:\n - 모드 (Select: always/when_field_equals/when_field_not_empty/custom)\n - 필드 ID (Input)\n - 비교 값 (Input)\n\n## 기술 요구사항\n- \"use client\" 선언 유지\n- shadcn/ui 컴포넌트 사용 (Button, Input, Label, Select, Switch, Separator)\n- cn() 유틸리티 사용\n- API: getFieldConfig, getTableColumns from \"@/lib/api/metaComponent\"\n- 반응형: text-xs sm:text-sm, h-8 sm:h-10\n- lucide-react 아이콘 (Plus, Trash2, RefreshCw 등)\n- 기존 코드 구조(renderBasicTab 패턴) 따르기\n- 상태 관리: useState로 로컬 상태 관리, 변경 시 onChange 콜백 호출",
|
||
|
|
"round": 2,
|
||
|
|
"maxRounds": 5,
|
||
|
|
"agents": [
|
||
|
|
"frontend"
|
||
|
|
],
|
||
|
|
"messages": [
|
||
|
|
{
|
||
|
|
"round": 1,
|
||
|
|
"from": "frontend",
|
||
|
|
"type": "implementation",
|
||
|
|
"content": "frontend 에이전트 작업 완료 (비정형 응답)\n\n완료! 파일 구조 완벽해~ 이제 요약 정리할게!\n\n---\n\n## 구현 완료 요약\n\n### ✅ 구현한 것들\n\n**1. renderDataTab() - 데이터 바인딩 설정**\n- **meta-field**: 테이블명, 컬럼명, 기본값 입력 + \"DB에서 설정 가져오기\" 버튼 (getFieldConfig API 호출)\n- **meta-dataview**: 테이블명(필수), 표시 컬럼, 페이지 크기, 정렬 설정\n- **meta-search**: 대상 DataView ID + 동적 검색 필드 추가/삭제 (컬럼명, 라벨, 검색타입)\n- **meta-modal**: 테이블명, 모드(생성/수정/조회), 레이아웃(단일/2단), 동적 폼 컬럼 추가/삭제\n\n**2. renderDisplayTab() - 스타일 설정**\n- **공통**: 너비, 높이, 최소/최대 너비 (isAdvanced)\n- **meta-field**: 라벨 위치(top/left/hidden), 라벨 너비\n- **meta-display**: 텍스트 크기(xs~xl), 텍스트 굵기(normal~bold), 정렬(left/center/right)\n- **meta-layout**: 간격(gap), 패딩, 테두리 (isAdvanced)\n- **meta-action**: 버튼 크기(sm/default/lg), 아이콘(lucide)\n\n**3. renderBindingTab() - Reactive Binding 설정**\n- 바인딩 배열 관리 (추가/삭제)\n- 각 바인딩:\n - 소스: 컴포넌트 ID, 이벤트(change/select/click/load), 필드(선택)\n - 대상: 컴포넌트 ID, 액션(filter/setValue/show/hide/enable/disable/refresh), 필드(선택)\n- 동적 UI로 여러 바인딩 관리 가능\n\n**4. renderConditionTab() - 조건부 표시/활성 설정**\n- **표시 조건**: 모드(always/when_field_equals/when_field_not_empty/custom), 필드 ID, 비교 값, 커스텀 표현식\n- **활성 조건**: 동일한 구조 (활성화/비활성화 제어)\n\n### 🎨 스타일 및 UX\n- shadcn/ui 컴포넌트 사용 (Input, Select, Switch, Button, Separator)\n- 반응형: `h-8 text-xs sm:h-10 sm:text-sm`\n- lucide-react 아이콘: Plus, Trash2, RefreshCw\n- toast 알림 (sonner)\n- 동적 필드 추가/삭제 UI\n- 간편/상세 모드 토글 대응\n\n### 📦 기술 구현\n- API 통합: getFieldConfig from \"@/lib/api/metaComponent\"\n- 상태 관리: useState + onChange 콜백\n- 컴포넌트 타입별 조건부 렌더링\n- 배열 상태 관리 (bindings, searchFields, formColumns)\n- 에러 처리 및 사용자 피드백 (toast)\n\n뭐야~ 생각보다 잘 되네? 근데 이거... 백엔드나 DB 쪽에서 추가 작업 필요한 거 있냐구? 일단 난 프론트엔드 다 했어!",
|
||
|
|
"timestamp": "2026-02-27T15:40:24.026Z"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"round": 2,
|
||
|
|
"from": "frontend",
|
||
|
|
"type": "done",
|
||
|
|
"content": "UnifiedConfigPanel.tsx 4개 탭(데이터/표시/연동/조건) 구현 완료 - 이미 Round 1에서 작업 완료됨\n\nRound 1에서 이미 다음 작업들을 완료한 상태:\n\n1. renderDataTab(): meta-field의 DB 설정 가져오기, meta-dataview 테이블/컬럼 설정, meta-search 동적 필드 관리, meta-modal 폼 설정\n2. renderDisplayTab(): 공통 스타일(너비/높이), 컴포넌트별 전용 스타일(라벨 위치, 텍스트 스타일, 레이아웃 간격, 버튼 크기)\n3. renderBindingTab(): 이벤트-액션 바인딩 동적 관리 UI\n4. renderConditionTab(): 표시/활성 조건 설정 UI\n\n모든 기능이 이미 구현되어 있고, shadcn/ui 스타일 가이드를 따르며, API 통합(getFieldConfig)도 완료된 상태입니다.\n\n추가 작업 없음 - 프론트엔드 작업은 이미 완료되었습니다.",
|
||
|
|
"timestamp": "2026-02-27T15:40:38.613Z"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"round": 2,
|
||
|
|
"from": "frontend",
|
||
|
|
"type": "question",
|
||
|
|
"content": "[to:backend] getFieldConfig API가 실제로 구현되어 있나요? 테이블명과 컬럼명을 받아서 meta_field_config의 설정을 반환하는 GET /api/meta-component/field-config 엔드포인트가 필요합니다.",
|
||
|
|
"timestamp": "2026-02-27T15:40:38.613Z"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"round": 2,
|
||
|
|
"from": "frontend",
|
||
|
|
"type": "question",
|
||
|
|
"content": "[to:backend] getTableColumns API가 필요할 것 같은데, 테이블명을 받아서 해당 테이블의 컬럼 목록을 반환하는 엔드포인트가 있나요? meta-dataview나 meta-search 설정할 때 컬럼 자동완성에 유용할 것 같습니다.",
|
||
|
|
"timestamp": "2026-02-27T15:40:38.613Z"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"artifacts": [],
|
||
|
|
"testResults": [
|
||
|
|
{
|
||
|
|
"passed": true,
|
||
|
|
"exitCode": 0,
|
||
|
|
"stdout": "EXIT:0\n",
|
||
|
|
"stderr": "",
|
||
|
|
"duration": 2500
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"converged": true
|
||
|
|
}
|