이 글에서는 BootstrapDialog를 활용해 사용자에게 확인 메시지를 표시하고, 특정 조건(체크박스 선택)이 충족될 때만 동작을 수행하는 다이얼로그를 구현하는 방법을 소개합니다.
목표
- BootstrapDialog를 사용하여 사용자 확인 다이얼로그 생성
- 사용자에게 중요한 작업(예: 데이터 저장, 취소)을 확인받기 위한 UI를 제공.
- 체크박스 선택 여부로 동작 제한
- 사용자가 확인 체크박스를 선택하지 않으면 진행되지 않도록 구현.
- 사용성 향상 및 코드 구조화
- 이해하기 쉬운 로직과 이벤트 처리를 통해 유지보수성을 높임.
구현하기
예제 1: BootstrapDialog.show() 사용
이 예제에서는 BootstrapDialog.show() 메서드를 이용하여 대화상자를 생성합니다. 이 방법은 즉시 대화상자를 띄우고자 할 때 유용합니다.
BootstrapDialog.show({
type: BootstrapDialog.TYPE_DANGER, // 다이얼로그의 유형 설정 (Danger 스타일)
title: '저장', // 다이얼로그 제목
message: `
취소하시겠습니까?<br/><br/>
<div>
<label>
<input type="checkbox" id="confirmCheck" />
확인 했습니다.
</label>
</div>
`, // 메시지와 확인용 체크박스 추가
closable: true, // 닫기 버튼 허용
draggable: true, // 다이얼로그 드래그 가능
buttons: [
{
label: 'Cancel', // 취소 버튼
cssClass: 'btn-secondary',
action: function (dialog) {
const confirmCheck = document.getElementById('confirmCheck');
if (confirmCheck) {
confirmCheck.remove(); // 체크박스 DOM 제거
}
dialog.close(); // 다이얼로그 닫기
}
},
{
label: 'OK', // 확인 버튼
cssClass: 'btn-danger',
action: async function (dialog) {
// 체크박스 상태 확인
const confirmCheck = document.getElementById('confirmCheck');
if (confirmCheck && !confirmCheck.checked) {
alert('체크박스를 선택해주세요.'); // 체크박스 미선택 시 경고
return;
}
// 로직 실행
console.log('작업을 진행합니다.');
if (confirmCheck) {
confirmCheck.remove(); // 체크박스 DOM 제거
}
dialog.close(); // 다이얼로그 닫기
}
}
]
});
코드 설명
- BootstrapDialog.show() 호출
다이얼로그를 표시하는 기본 함수입니다. type, title, message 등 다이얼로그의 속성을 설정할 수 있습니다. - 체크박스 추가
메시지(message)에 HTML로 <input type="checkbox"> 요소를 추가합니다.- id="confirmCheck"로 DOM 접근을 간단히 처리할 수 있습니다.
- Cancel 버튼 동작
사용자가 취소 버튼을 클릭하면:- 다이얼로그가 닫히고(dialog.close()),
- 체크박스가 DOM에서 제거됩니다(confirmCheck.remove()).
- OK 버튼 동작
- 체크박스 선택 여부 확인
체크박스(confirmCheck)가 선택되지 않은 상태에서 진행을 막고 경고 메시지를 표시합니다. - 작업 로직 실행
작업 수행 후 다이얼로그를 닫고, 체크박스를 DOM에서 제거합니다.
- 체크박스 선택 여부 확인
- 장단점
장점- 간편한 방법: 코드가 간결하고, 대화상자가 바로 뜨므로 즉시 확인 대화상자를 띄울 때 유용합니다.
- 유연한 버튼 구성: 버튼을 자유롭게 추가하고, 각 버튼에 맞는 행동을 지정할 수 있습니다.
- 제어의 어려움: 대화상자의 상태를 코드에서 계속 추적하기 어렵고, 여러 대화상자를 동시에 사용할 때 관리가 어려울 수 있습니다.
예제 2: BootstrapDialog 객체 생성 후 사용
이 예제에서는 BootstrapDialog 객체를 전역 변수로 선언하고, 필요할 때마다 open() 메서드를 호출하여 대화상자를 띄웁니다. 이 방법은 동적 생성을 원하는 경우에 유용합니다.
if (!dialog) newDialog();
dialog.open();
let dialog;
const newDialog = () => {
dialog = new BootstrapDialog({
title: '저장',
message: '저장하시겠습니까?<br/><br/><div><label><input type="checkbox" id="confirmCheck" /> 저장확인 했습니다.</label></div>',
buttons: [
{
label: 'Cancel',
cssClass: 'btn-secondary',
action: function(dialog) {
dialog.close();
}
},
{
label: 'OK',
cssClass: 'btn-secondary',
id: 'confirm-button',
action: async function(dialog) {
// 체크박스 상태 확인
const confirmCheck = document.getElementById('confirmCheck');
if (confirmCheck && !confirmCheck.checked) {
alert('체크박스를 선택해주세요.');
return;
}
// 로직 실행
console.log('작업을 진행합니다.')
confirmCheck.checked = false; // 체크박스 상태 초기화
dialog.close();
}
}
],
});
};
코드 설명
- dialog 객체: BootstrapDialog 객체를 전역 변수로 선언하고, newDialog() 함수에서 한 번만 초기화합니다.
- buttons: "Cancel"과 "OK" 버튼을 정의하며, "OK" 버튼 클릭 시 체크박스를 확인하고, 체크된 경우에만 로직을 실행합니다.
- open() 메서드: dialog.open()으로 대화상자를 열 수 있습니다. 이 방식은 dialog 객체가 이미 존재하는 경우, 다시 생성하지 않고 열기만 합니다.
장점
- 재사용성: 대화상자를 여러 번 열고 닫을 수 있어, 동일한 대화상자를 반복적으로 사용해야 하는 경우 유용합니다.
- 상태 관리 용이: 대화상자의 객체를 변수로 관리하므로, 상태나 설정을 보다 쉽게 변경하거나 추적할 수 있습니다.
단점
- 초기화 필요: 처음에는 newDialog()를 호출하여 대화상자를 초기화해야 하므로, 초기화 코드가 필요합니다.
- 복잡성 증가: 코드가 더 복잡해져서, 간단한 대화상자에는 불필요할 수 있습니다.
사용자 경험 디자인
체크박스 활용 이유
- 확인 절차 강화: 작업의 중요도를 사용자에게 상기.
- 오작동 방지: 실수로 인한 작업 진행을 예방.
UI 예시
1. 다이얼로그 표시 화면
- 제목: "저장"
- 메시지: 작업 취소 메시지와 확인 체크박스
- 버튼: "Cancel"과 "OK" 버튼
<이미지: 다이얼로그 UI 스크린샷>
주요 팁
- 동적 DOM 조작
- 다이얼로그가 닫힐 때 추가한 DOM 요소(체크박스)를 제거해 메모리 누수 방지.
- 유효성 검사
- OK 버튼 클릭 시 체크박스가 선택되지 않으면 경고를 표시하고 작업 진행을 막습니다.
- Svelte와의 통합
- 이 코드는 독립적인 JavaScript로 작성되었지만, Svelte 컴포넌트 내에서 BootstrapDialog를 사용할 수 있습니다.
- 메시지나 로직은 Svelte의 상태 및 스토어와 연동해 동적으로 변경 가능합니다.
추천하는 방법
- 단순한 경우: 대화상자가 단 한 번만 사용된다면 예제 1처럼 BootstrapDialog.show()를 사용하는 것이 더 간편하고 직관적입니다.
- 여러 번 사용해야 할 경우: 대화상자가 여러 번 필요하거나, 대화상자의 상태를 관리해야 한다면 예제 2처럼 BootstrapDialog 객체를 생성하여 관리하는 것이 더 효율적입니다.
결론
두 예제 모두 실용적인 방법이지만, 예제 1은 간단하고 즉시 대화상자를 표시할 때 유용하고, 예제 2는 대화상자의 상태를 관리하거나 여러 번 재사용할 때 유리합니다. 사용하려는 목적에 따라 적합한 방식을 선택하면 됩니다.
'프론트' 카테고리의 다른 글
[Svelte] 애니메이션 검색 창 만들기 (0) | 2024.12.14 |
---|---|
복사 방지 해제 법 (0) | 2024.12.13 |
[Svelte] input type="text" change event (1) | 2024.12.12 |
텍스트 무지개 애니메이션 (1) | 2024.11.27 |
쉘 스크립트 - 변수 (0) | 2024.11.14 |