a1a3bd1b2b
- Fix recursive CTE: add missing RECURSIVE keyword in move_to_trash and restore_from_trash SQL queries (relation 'descendants' does not exist) - Fix folder deletion: delete descendant files before folder to avoid 'duplicate key violates unique constraint idx_files_unique_name_at_root' - Simplify trash model: only mark the folder as trashed, not child files (implicit trash via parent) - Update trash_items view: filter to show only top-level trashed items - Update schema.sql: change files.folder_id FK from ON DELETE SET NULL to ON DELETE CASCADE - Fix trash view icons: folders and files now show correct visual icons (folder-icon, pdf-icon, etc.) in trash view - Frontend refactoring: extract inline CSS/JS from admin.html and profile.html into dedicated external files - Frontend cleanup: replace all inline style attributes with CSS classes - Frontend cleanup: replace style.display JS - Fix recursive CTE: add missing RECURSIVE keyword in move_to_trash and restore_from_trash SQL queries (relation 'descendants' d
56 lines
2.1 KiB
JavaScript
56 lines
2.1 KiB
JavaScript
/**
|
|
* OxiCloud - UI notifications adapter
|
|
* Isolates notification rendering policy from ui.js.
|
|
*/
|
|
|
|
const uiNotifications = {
|
|
show(title, message) {
|
|
if (window.notifications && typeof window.notifications.addNotification === 'function') {
|
|
const normalizedTitle = String(title || '').toLowerCase();
|
|
let icon = 'fa-info-circle';
|
|
let iconClass = 'upload';
|
|
|
|
if (normalizedTitle.includes('error') || normalizedTitle.includes('failed') || normalizedTitle.includes('fail')) {
|
|
icon = 'fa-exclamation-circle';
|
|
iconClass = 'error';
|
|
} else if (normalizedTitle.includes('favorite') || normalizedTitle.includes('favorit') || normalizedTitle.includes('fav')) {
|
|
icon = 'fa-star';
|
|
iconClass = 'success';
|
|
} else if (normalizedTitle.includes('delete') || normalizedTitle.includes('removed') || normalizedTitle.includes('trash') || normalizedTitle.includes('rename') || normalizedTitle.includes('complete')) {
|
|
icon = 'fa-check-circle';
|
|
iconClass = 'success';
|
|
}
|
|
|
|
window.notifications.addNotification({
|
|
icon,
|
|
iconClass,
|
|
title: title || '',
|
|
text: message || ''
|
|
});
|
|
return;
|
|
}
|
|
|
|
let notification = document.querySelector('.notification');
|
|
if (!notification) {
|
|
notification = document.createElement('div');
|
|
notification.className = 'notification';
|
|
notification.innerHTML = `
|
|
<div class="notification-title">${title}</div>
|
|
<div class="notification-message">${message}</div>
|
|
`;
|
|
document.body.appendChild(notification);
|
|
} else {
|
|
notification.querySelector('.notification-title').textContent = title;
|
|
notification.querySelector('.notification-message').textContent = message;
|
|
}
|
|
|
|
notification.style.display = 'block';
|
|
|
|
setTimeout(() => {
|
|
notification.style.display = 'none';
|
|
}, 5000);
|
|
}
|
|
};
|
|
|
|
window.uiNotifications = uiNotifications;
|