# 그룹화 및 목록보기 옵션 저장 기능 가이드 ## 📋 개요 사용자가 설정한 그룹화 컬럼과 목록보기 모드를 LocalStorage에 저장하고, 페이지를 다시 열 때 자동으로 복원하는 기능입니다. ## 🎯 주요 기능 1. **그룹화 컬럼 선택 저장** - 사용자가 선택한 그룹화 기준(거래처, 상태 등)을 저장 - 페이지 재진입 시 자동으로 그룹화 적용 2. **목록보기 모드 저장** - 펼쳐보기(expanded) 또는 목록보기(list) 모드 저장 - 페이지 재진입 시 저장된 모드로 표시 ## 📦 필요한 컴포넌트 ```html ``` ## 🔧 구현 방법 ### 1. 사용자옵션 모달 초기화 ```javascript // ========== 사용자옵션 모달 초기화 ========== function initUserOptionsModal() { const modalHtml = createUserOptionsModal({ pageId: 'shipmentPlan', // 페이지별 고유 ID (localStorage 키로 사용) enableGrouping: true, // 그룹화 기능 활성화 groupingColumns: [ // 그룹화 가능한 컬럼 목록 { key: 'customer', label: '거래처' }, { key: 'status', label: '상태' }, { key: 'itemCode', label: '품번' }, { key: 'material', label: '재질' }, { key: 'shippingPlanDate', label: '출하계획일' } ], enableFreezeColumns: false, // 틀고정 비활성화 (선택사항) enableGridLines: false, // 그리드선 비활성화 (선택사항) enableViewMode: false, // 보기모드 비활성화 (선택사항) onSave: () => { console.log('✅ 사용자 옵션 저장됨'); // 저장된 옵션 즉시 적용 restoreGroupingOptions(); } }); document.body.insertAdjacentHTML('beforeend', modalHtml); } ``` ### 2. 저장된 옵션 복원 함수 ```javascript // ========== 저장된 그룹화 옵션 복원 ========== function restoreGroupingOptions() { if (typeof getGroupByColumn === 'function' && typeof getGroupListView === 'function') { const savedColumn = getGroupByColumn('shipmentPlan'); // pageId와 동일하게 const savedListView = getGroupListView('shipmentPlan'); console.log('💾 저장된 그룹화 옵션:', { savedColumn, savedListView }); // 저장된 그룹화 컬럼이 있으면 적용 if (savedColumn && groupByInstance) { setTimeout(() => { groupByInstance.addGrouping(savedColumn); // 목록보기 옵션 복원 if (savedListView) { isGroupCollapsedView = true; const checkbox = document.getElementById('collapseGroupsCheckbox'); if (checkbox) { checkbox.checked = true; } } renderShipmentTable(); // 또는 해당 페이지의 테이블 렌더링 함수 console.log('✅ 그룹화 옵션 복원 완료'); }, 300); } } } ``` ### 3. 그룹 컴포넌트 초기화 시 복원 호출 ```javascript function initGroupBy() { try { // DOM 요소 확인 const selectElement = document.getElementById('groupByField'); const tagsElement = document.getElementById('groupByTags'); if (!selectElement || !tagsElement) { console.error('그룹화 DOM 요소를 찾을 수 없습니다.'); setTimeout(() => initGroupBy(), 200); return; } groupByInstance = new GroupByComponent({ fields: { 'customer': '거래처', 'status': '상태', 'itemCode': '품번', 'material': '재질', 'shippingPlanDate': '출하계획일' }, onGroupChange: () => { // 그룹화 여부에 따라 목록보기 체크박스 표시/숨김 const toggleElement = document.getElementById('groupViewToggle'); if (toggleElement) { if (groupByInstance.isGrouped()) { toggleElement.style.display = 'flex'; } else { toggleElement.style.display = 'none'; isGroupCollapsedView = false; const checkbox = document.getElementById('collapseGroupsCheckbox'); if (checkbox) checkbox.checked = false; } } renderShipmentTable(); }, selectId: 'groupByField', tagsId: 'groupByTags' }); console.log('✅ 그룹 컴포넌트 초기화 완료'); // 저장된 그룹화 옵션 복원 restoreGroupingOptions(); } catch (error) { console.error('❌ 그룹 컴포넌트 초기화 실패:', error); } } ``` ### 4. DOMContentLoaded 이벤트에서 초기화 ```javascript document.addEventListener('DOMContentLoaded', function() { // 검색 섹션 초기화 initSearchSection(); // 테이블 액션바 초기화 initActionBar(); // 그룹 컴포넌트 초기화 (ActionBar 이후에 초기화) setTimeout(() => { initGroupBy(); }, 100); // 데이터 로드 및 렌더링 loadShipmentData(); renderShipmentTable(); // 사용자옵션 모달 초기화 initUserOptionsModal(); }); ``` ## 💾 저장되는 데이터 구조 LocalStorage에 다음과 같이 저장됩니다: ```javascript // 그룹화 컬럼 localStorage.setItem('shipmentPlan_groupByColumn', 'customer'); // 목록보기 여부 localStorage.setItem('shipmentPlan_groupListView', 'true'); ``` ## 🔑 주요 함수 ### userOptions.js에서 제공하는 함수 ```javascript // 그룹화 컬럼 가져오기 getGroupByColumn(pageId) // 반환: string (컬럼 키) // 목록보기 모드 가져오기 getGroupListView(pageId) // 반환: boolean ``` ## 📝 HTML 구조 요구사항 ### 테이블 액션바에 그룹화 UI 포함 ```javascript leftExtraHtml: `
` ``` ### 사용자옵션 버튼 ```html ``` ## 🎨 사용자 경험 ### 저장 과정 1. 사용자가 "⚙️ 사용자옵션" 버튼 클릭 2. 모달에서 "기타옵션" 탭 선택 3. "📊 그룹화 설정" 섹션에서: - 그룹화 컬럼 선택 (예: 거래처) - 보기 모드 선택 (펼쳐보기 / 목록보기) 4. "💾 저장" 버튼 클릭 5. 옵션이 LocalStorage에 저장되고 즉시 적용됨 ### 복원 과정 1. 페이지 로드 시 `DOMContentLoaded` 이벤트 발생 2. `initGroupBy()` 함수에서 `restoreGroupingOptions()` 호출 3. LocalStorage에서 저장된 옵션 읽기 4. 그룹화 컬럼이 있으면 자동으로 적용 5. 목록보기 모드가 true면 체크박스 체크 및 접힌 상태로 렌더링 ## 🔍 디버깅 콘솔에서 다음과 같은 로그를 확인할 수 있습니다: ``` ✅ 그룹 컴포넌트 초기화 완료 💾 저장된 그룹화 옵션: {savedColumn: "customer", savedListView: true} ✅ 그룹화 옵션 복원 완료 ``` ## 📌 다른 메뉴에 적용하기 ### 1단계: pageId 변경 ```javascript const modalHtml = createUserOptionsModal({ pageId: 'yourPageId', // 예: 'orderManagement', 'productInfo' 등 enableGrouping: true, groupingColumns: [ // 해당 페이지의 그룹화 가능한 컬럼 정의 { key: 'column1', label: '컬럼1' }, { key: 'column2', label: '컬럼2' } ], onSave: () => { restoreGroupingOptions(); } }); ``` ### 2단계: restoreGroupingOptions에서 pageId 일치시키기 ```javascript function restoreGroupingOptions() { const savedColumn = getGroupByColumn('yourPageId'); // pageId와 동일하게 const savedListView = getGroupListView('yourPageId'); // ... 복원 로직 } ``` ### 3단계: groupByInstance 필드 일치시키기 ```javascript groupByInstance = new GroupByComponent({ fields: { 'column1': '컬럼1', 'column2': '컬럼2' // groupingColumns의 key와 일치해야 함 }, // ... }); ``` ## ⚠️ 주의사항 1. **pageId 일관성**: - `createUserOptionsModal`의 `pageId` - `getGroupByColumn`의 인자 - `getGroupListView`의 인자 - 모두 동일한 값이어야 합니다. 2. **컬럼 키 일관성**: - `groupingColumns`의 `key` - `GroupByComponent`의 `fields` 키 - 테이블 액션바의 `