# [계획서] 카테고리 트리 대분류 추가 모달 - 연속 등록 모드 수정 > 관련 문서: [맥락노트](./CCA[맥락]-카테고리-연속등록모드.md) | [체크리스트](./CCA[체크]-카테고리-연속등록모드.md) ## 개요 기준정보 - 옵션설정 화면에서 트리 구조 카테고리(예: 품목정보 > 재고단위)의 "대분류 추가" 모달이 저장 후 닫히지 않는 버그를 수정합니다. 평면 목록용 추가 모달(`CategoryValueAddDialog.tsx`)과 동일한 연속 입력 패턴을 적용합니다. --- ## 현재 동작 - 대분류 추가 모달에서 값 입력 후 "추가" 클릭 시 **값은 정상 저장됨** - 저장 후 **모달이 닫히지 않고** 폼만 초기화됨 (항상 연속 입력 상태) - "연속 입력" 체크박스 UI가 **없음** → 사용자가 모드를 끌 수 없음 - 모달을 닫으려면 "닫기" 버튼 또는 외부 클릭을 해야 함 ### 현재 코드 (CategoryValueManagerTree.tsx - handleAdd, 512~530행) ```tsx if (response.success) { toast.success("카테고리가 추가되었습니다"); // 폼 초기화 (모달은 닫지 않고 연속 입력) setFormData((prev) => ({ ...prev, valueCode: "", valueLabel: "", description: "", color: "", })); setTimeout(() => addNameRef.current?.focus(), 50); await loadTree(true); if (parentValue) { setExpandedNodes((prev) => new Set([...prev, parentValue.valueId])); } } ``` ### 현재 DialogFooter (809~821행) ```tsx ``` --- ## 변경 후 동작 ### 1. 기본 동작: 저장 후 모달 닫힘 - "추가" 클릭 → 저장 성공 → 모달 닫힘 + 트리 새로고침 - `CategoryValueAddDialog.tsx`(평면 목록 추가 모달)와 동일한 기본 동작 ### 2. 연속 입력 체크박스 추가 - DialogFooter 좌측에 "연속 입력" 체크박스 표시 - 기본값: 체크 해제 (OFF) - 체크 시: 저장 후 폼만 초기화, 모달 유지, 이름 필드에 포커스 - 체크 해제 시: 저장 후 모달 닫힘 --- ## 시각적 예시 | 상태 | 연속 입력 체크 | 추가 버튼 클릭 후 | |------|---------------|-----------------| | 기본 (체크 해제) | [ ] 연속 입력 | 저장 → 모달 닫힘 → 트리 갱신 | | 연속 모드 (체크) | [x] 연속 입력 | 저장 → 폼 초기화 → 모달 유지 → 이름 필드 포커스 | ### 모달 하단 레이아웃 (ScreenModal.tsx 패턴) ``` ┌─────────────────────────────────────────┐ │ [닫기] [추가] │ ← DialogFooter (버튼만) ├─────────────────────────────────────────┤ │ [x] 저장 후 계속 입력 (연속 등록 모드) │ ← border-t 구분선 아래 별도 영역 └─────────────────────────────────────────┘ ``` --- ## 아키텍처 ```mermaid flowchart TD A["사용자: '추가' 클릭"] --> B["handleAdd()"] B --> C{"API 호출 성공?"} C -- 실패 --> D["toast.error → 모달 유지"] C -- 성공 --> E["toast.success + loadTree"] E --> F{"continuousAdd?"} F -- true --> G["폼 초기화 + 이름 필드 포커스\n모달 유지"] F -- false --> H["폼 초기화 + 모달 닫힘"] ``` --- ## 변경 대상 파일 | 파일 | 역할 | 변경 내용 | |------|------|----------| | `frontend/components/table-category/CategoryValueManagerTree.tsx` | 트리형 카테고리 값 관리 | 상태 추가, handleAdd 분기, DialogFooter UI | - **변경 규모**: 약 20줄 내외 소규모 변경 - **참고 파일**: `frontend/components/table-category/CategoryValueAddDialog.tsx` (동일 패턴) --- ## 코드 설계 ### 1. 상태 추가 (286행 근처, 모달 상태 선언부) ```tsx const [continuousAdd, setContinuousAdd] = useState(false); ``` ### 2. handleAdd 성공 분기 수정 (512~530행 대체) ```tsx if (response.success) { toast.success("카테고리가 추가되었습니다"); await loadTree(true); if (parentValue) { setExpandedNodes((prev) => new Set([...prev, parentValue.valueId])); } if (continuousAdd) { setFormData((prev) => ({ ...prev, valueCode: "", valueLabel: "", description: "", color: "", })); setTimeout(() => addNameRef.current?.focus(), 50); } else { setFormData({ valueCode: "", valueLabel: "", description: "", color: "", isActive: true }); setIsAddModalOpen(false); } } ``` ### 3. DialogFooter + 연속 등록 체크박스 수정 (809~821행 대체) DialogFooter는 버튼만 유지하고, 그 아래에 `border-t` 구분선과 체크박스를 별도 영역으로 배치합니다. `ScreenModal.tsx` (1287~1303행) 패턴 그대로입니다. ```tsx {/* 연속 등록 모드 체크박스 - ScreenModal.tsx 패턴 */}
setContinuousAdd(checked as boolean)} />
``` --- ## 예상 문제 및 대응 `CategoryValueAddDialog.tsx`와 동일한 패턴이므로 별도 예상 문제 없음. --- ## 설계 원칙 - `CategoryValueAddDialog.tsx`(같은 폴더, 같은 목적)의 패턴을 그대로 따름 - 기존 수정/삭제 모달 동작은 변경하지 않음 - 하위 추가(중분류/소분류) 모달도 동일한 `handleAdd`를 사용하므로 자동 적용 - `Checkbox` import는 이미 존재 (24행)하므로 추가 import 불필요 - `Label` import는 이미 존재 (53행)하므로 추가 import 불필요 - 체크박스 위치/라벨/className 모두 `ScreenModal.tsx` (1287~1303행)과 동일