Merge latest main with optimized multi-branch features into server_dashboard

This commit is contained in:
2026-04-23 10:18:11 +09:00
26 changed files with 1920 additions and 1314 deletions

View File

@@ -1,45 +1,42 @@
/**
* 모든 모달의 공통 기능 (닫기, ESC 처리, 배경 클릭 등)을 관리하는 베이스 모듈입니다.
* 모든 모달의 공통 기능 (닫기, ESC 처리, 배경 클릭 등)을 관리하는 베이스 모달 모듈입니다.
*/
export function initBaseModal() {
const closeAllModals = () => {
const modals = document.querySelectorAll('.modal-overlay');
modals.forEach(modal => {
modal.classList.add('hidden');
});
};
export function closeModals() {
const modals = document.querySelectorAll('.modal-overlay');
modals.forEach(modal => modal.classList.add('hidden'));
}
export function initBaseModal() {
// ESC 키로 닫기
window.addEventListener('keydown', (e) => {
if (e.key === 'Escape') closeAllModals();
if (e.key === 'Escape') closeModals();
});
// 배경(Overlay) 및 닫기 버튼 클릭 시 닫기 (이벤트 위임)
// 배경(Overlay) 및 닫기/취소 버튼 클릭 시 닫기
document.addEventListener('click', (e) => {
const target = e.target as HTMLElement;
// 1. 오버레이 클릭 시 닫기
if (target.classList.contains('modal-overlay')) {
closeAllModals();
closeModals();
}
// 2. 닫기 아이콘(data-lucide="x") 또는 닫기/취소 버튼 클릭 시 닫기
// 버튼 ID가 btn-close- 또는 btn-cancel-로 시작하는 경우 대응
// 2. 닫기 또는 취소 버튼 클릭 시 닫기 (이름 패턴 기준)
const btn = target.closest('button');
if (btn && (btn.id.startsWith('btn-close-') || btn.id.startsWith('btn-cancel-'))) {
closeAllModals();
closeModals();
}
});
return { closeAllModals };
return { closeAllModals: closeModals };
}
/**
* 특정 모달을 엽니다.
* @param modalId 모달 엘리먼트의 ID
* 특정 모달 열기 (기존의 classList 조작을 정형화)
*/
export function openModal(modalId: string) {
const modal = document.getElementById(modalId);
export function openModal(id: string) {
const modal = document.getElementById(id);
if (modal) {
modal.classList.remove('hidden');
}