import { createIcons, Save, Edit2, RotateCcw } from 'lucide'; // 공통 옵션 생성 함수 export const generateOptionsHTML = (options: string[]) => options.map(opt => ``).join(''); // 필드 값 설정 유틸리티 export function setFieldValue(id: string, value: any) { const el = document.getElementById(id) as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement; if (el) { if (el.type === 'checkbox') (el as HTMLInputElement).checked = !!value; else el.value = value || ''; } } // 필드 값 가져오기 유틸리티 export function getFieldValue(id: string): string { const el = document.getElementById(id) as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement; if (!el) return ''; if (el.type === 'checkbox') return (el as HTMLInputElement).checked ? 'Y' : 'N'; return el.value || ''; } // 폼 자동 채우기 export function autoFillForm(prefix: string, data: any, fieldMap: Record) { Object.keys(fieldMap).forEach(fieldId => { const dataKey = fieldMap[fieldId]; setFieldValue(`${prefix}-${fieldId}`, data[dataKey]); }); } // 폼 데이터 자동 추출 export function autoExtractForm(prefix: string, fieldMap: Record): any { const extracted: any = {}; Object.keys(fieldMap).forEach(fieldId => { const dataKey = fieldMap[fieldId]; extracted[dataKey] = getFieldValue(`${prefix}-${fieldId}`); }); return extracted; } // 모달 편집 잠금/해제 유틸리티 export function setEditLock(formId: string, mode: 'view' | 'edit' | 'add', options: { saveBtnId: string, revertBtnId: string, generateBtnId?: string, addLogBtnId?: string }) { const form = document.getElementById(formId) as HTMLFormElement; if (!form) return; const isView = mode === 'view'; const inputs = form.querySelectorAll('input, select, textarea'); inputs.forEach(input => { const el = input as HTMLInputElement; if (el.id.includes('자산코드') || el.id.includes('asset-id') || el.classList.contains('is-readonly-field')) { el.readOnly = true; el.disabled = false; } else { if (el.tagName === 'SELECT') (el as HTMLSelectElement).disabled = isView; else (el as HTMLInputElement).readOnly = isView; } }); const saveBtn = document.getElementById(options.saveBtnId); const revertBtn = document.getElementById(options.revertBtnId); const generateBtn = options.generateBtnId ? document.getElementById(options.generateBtnId) : null; const addLogBtn = options.addLogBtnId ? document.getElementById(options.addLogBtnId) : null; if (saveBtn) { saveBtn.innerHTML = isView ? ` 수정` : ` 저장`; saveBtn.className = isView ? 'btn btn-primary' : 'btn btn-success'; } if (revertBtn) revertBtn.classList.toggle('hidden', isView); if (generateBtn) generateBtn.classList.toggle('hidden', isView); if (addLogBtn) addLogBtn.classList.toggle('hidden', isView); createIcons({ icons: { Save, Edit2, RotateCcw } }); } // 위치 정보 파싱 및 설정 export function parseAndSetLocation(locationStr: string, bldgId: string, detailId: string, etcGroupId: string, etcInputId: string) { const bldgSelect = document.getElementById(bldgId) as HTMLSelectElement; const detailSelect = document.getElementById(detailId) as HTMLSelectElement; const etcGroup = document.getElementById(etcGroupId); const etcInput = document.getElementById(etcInputId) as HTMLInputElement; if (!locationStr) return; const parts = locationStr.split(' > '); if (parts.length >= 1) { bldgSelect.value = parts[0]; bldgSelect.dispatchEvent(new Event('change')); if (parts.length >= 2) { setTimeout(() => { detailSelect.value = parts[1]; if (parts[1] === '기타' && parts[2]) { if (etcGroup) etcGroup.style.display = 'flex'; etcInput.value = parts[2]; } }, 0); } } } // 위치 정보 취합 export function getCombinedLocation(bldgId: string, detailId: string, etcId: string): string { const bldg = getFieldValue(bldgId); const detail = getFieldValue(detailId); const etc = getFieldValue(etcId); if (!bldg) return ''; if (detail === '기타') return `${bldg} > 기타 > ${etc}`; return detail ? `${bldg} > ${detail}` : bldg; } // 위치 이벤트 바인딩 import { LOCATION_DATA } from './SharedData'; export function bindLocationEvents(bldgId: string, detailId: string, etcGroupId: string, etcInputId: string) { const bldgSelect = document.getElementById(bldgId) as HTMLSelectElement; const detailSelect = document.getElementById(detailId) as HTMLSelectElement; const etcGroup = document.getElementById(etcGroupId); bldgSelect?.addEventListener('change', () => { const bldg = bldgSelect.value; const details = LOCATION_DATA[bldg] || []; detailSelect.innerHTML = `` + generateOptionsHTML(details) + ``; if (etcGroup) etcGroup.style.display = 'none'; }); detailSelect?.addEventListener('change', () => { if (etcGroup) etcGroup.style.display = detailSelect.value === '기타' ? 'flex' : 'none'; }); } // 모달 프레임 HTML 생성 (2열 그리드 표준 레이아웃) export function createModalFrameHTML(id: string, title: string, formHTML: string, options: { historyTitle?: string, addLogBtnId?: string }) { return ` `; }