/**************************************************************************************
*
* Catalyst PHP Framework
* PHP Version 8.3 (Required).
*
* @package Catalyst
* @subpackage Public
* @see https://github.com/arcanisgk/catalyst
*
* @author Walter Nuñez (arcanisgk/original founder) < [email protected]>
* @copyright 2023 - 2025
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*
* @note This program is distributed in the hope that it will be useful
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE.
*
* @category Framework
* @filesource
*
* @link https://catalyst.dock Local development URL
*
* Index component for the Catalyst Framework
*
*/
/**
* Toast notification system for the Catalyst framework
*/
class ToastNotifications {
constructor() {
this.container = null;
this.initialize();
}
/**
* Initialize the toast container
*/
initialize() {
// Create container if it doesn't exist
if (!this.container) {
this.container = document.createElement('div');
this.container.className = 'toast-container position-fixed top-0 end-0 p-3';
this.container.style.zIndex = '1090';
document.body.appendChild(this.container);
}
}
/**
* Create a toast element
*
* @param {string} type - The toast type (success, error, warning, info)
* @param {string} message - The message to display
* @param {number} duration - Duration in ms before auto-hide
* @returns {HTMLElement} - The toast element
*/
createToast(type, message, duration = 5000) {
const bgClass = this.getBackgroundClass(type);
const iconClass = this.getIconClass(type);
const toast = document.createElement('div');
toast.className = `toast ${bgClass} text-white border-0`;
toast.setAttribute('role', 'alert');
toast.setAttribute('aria-live', 'assertive');
toast.setAttribute('aria-atomic', 'true');
toast.setAttribute('data-bs-delay', duration);
toast.innerHTML = `
<div class="toast-header ${bgClass} text-white">
<i class="bi ${iconClass} me-2"></i>
<strong class="me-auto">${this.getTitle(type)}</strong>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
<div class="toast-body">
${message}
</div>
`;
return toast;
}
/**
* Show a toast notification
*
* @param {string} type - The toast type (success, error, warning, info)
* @param {string} message - The message to display
* @param {number} duration - Duration in ms before auto-hide
*/
show(type, message, duration = 5000) {
const toast = this.createToast(type, message, duration);
this.container.appendChild(toast);
// Initialize the Bootstrap toast and show it
const bsToast = new bootstrap.Toast(toast, {
autohide: true,
delay: duration
});
bsToast.show();
// Remove the toast from DOM after it's hidden
toast.addEventListener('hidden.bs.toast', () => {
this.container.removeChild(toast);
});
}
/**
* Show a success toast
*
* @param {string} message - The message to display
* @param {number} duration - Duration in ms before auto-hide
*/
success(message, duration = 5000) {
this.show('success', message, duration);
}
/**
* Show an error toast
*
* @param {string} message - The message to display
* @param {number} duration - Duration in ms before auto-hide
*/
error(message, duration = 5000) {
this.show('error', message, duration);
}
/**
* Show a warning toast
*
* @param {string} message - The message to display
* @param {number} duration - Duration in ms before auto-hide
*/
warning(message, duration = 5000) {
this.show('warning', message, duration);
}
/**
* Show an info toast
*
* @param {string} message - The message to display
* @param {number} duration - Duration in ms before auto-hide
*/
info(message, duration = 5000) {
this.show('info', message, duration);
}
/**
* Get the background class for a toast type
*
* @param {string} type - The toast type
* @returns {string} - The CSS class
*/
getBackgroundClass(type) {
switch (type) {
case 'success':
return 'bg-success';
case 'error':
return 'bg-danger';
case 'warning':
return 'bg-warning';
case 'info':
return 'bg-info';
default:
return 'bg-primary';
}
}
/**
* Get the icon class for a toast type
*
* @param {string} type - The toast type
* @returns {string} - The icon class
*/
getIconClass(type) {
switch (type) {
case 'success':
return 'bi-check-circle-fill';
case 'error':
return 'bi-exclamation-circle-fill';
case 'warning':
return 'bi-exclamation-triangle-fill';
case 'info':
return 'bi-info-circle-fill';
default:
return 'bi-bell-fill';
}
}
/**
* Get the title for a toast type
*
* @param {string} type - The toast type
* @returns {string} - The title
*/
getTitle(type) {
switch (type) {
case 'success':
return 'Success';
case 'error':
return 'Error';
case 'warning':
return 'Warning';
case 'info':
return 'Information';
default:
return 'Notification';
}
}
}
// Create global instance
window.toasts = new ToastNotifications();
|