/** * Confirmation Modal Manager * Handles showing and hiding a Bootstrap modal for confirmations and prompts. */ class Confirmation { constructor(modalId) { this.modalElement = document.getElementById(modalId); this.modal = new bootstrap.Modal(this.modalElement); this.messageElement = this.modalElement.querySelector('#confirmationMessage'); this.inputElement = this.modalElement.querySelector('#confirmationInput'); this.confirmButton = this.modalElement.querySelector('#confirmButton'); this.titleElement = this.modalElement.querySelector('.modal-title'); this.currentResolver = null; } _show(message, title, showInput = false, defaultValue = '') { return new Promise((resolve) => { this.currentResolver = resolve; this.titleElement.textContent = title; this.messageElement.textContent = message; if (showInput) { this.inputElement.style.display = 'block'; this.inputElement.value = defaultValue; this.inputElement.focus(); } else { this.inputElement.style.display = 'none'; } this.confirmButton.onclick = () => this._handleConfirm(showInput); this.modalElement.addEventListener('hidden.bs.modal', () => this._handleCancel(), { once: true }); this.modal.show(); }); } _handleConfirm(isPrompt) { if (this.currentResolver) { const value = isPrompt ? this.inputElement.value : true; this.currentResolver(value); this._cleanup(); } } _handleCancel() { if (this.currentResolver) { this.currentResolver(null); // Resolve with null for cancellation this._cleanup(); } } _cleanup() { this.confirmButton.onclick = null; this.modal.hide(); this.currentResolver = null; } confirm(message, title = 'Confirmation') { return this._show(message, title, false); } prompt(message, defaultValue = '', title = 'Prompt') { return this._show(message, title, true, defaultValue); } } // Make it globally available window.ConfirmationManager = new Confirmation('confirmationModal');