fix: config modal scrollbar, scheduler-config.js, logging API endpoint, static cache-busting

This commit is contained in:
2026-02-22 10:01:52 +01:00
parent 0265ae2a70
commit eed75ff08b
14 changed files with 614 additions and 62 deletions

View File

@@ -35,13 +35,17 @@
max-width: 500px;
width: 90%;
max-height: 80vh;
overflow: hidden;
/* overflow:hidden removed — it was clipping the modal-body scrollbar.
Border-radius clips backgrounds correctly without it on modern browsers. */
display: flex;
flex-direction: column;
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
padding: var(--spacing-lg);
border-bottom: 1px solid var(--color-border);
}
@@ -55,6 +59,8 @@
.modal-body {
padding: var(--spacing-lg);
overflow-y: auto;
flex: 1;
min-height: 0;
}
/* Config Section within modals */

View File

@@ -24,21 +24,37 @@ AniWorld.SchedulerConfig = (function() {
if (data.success) {
const config = data.config;
const runtimeStatus = data.status || {};
// Update UI elements
document.getElementById('scheduled-rescan-enabled').checked = config.enabled;
document.getElementById('scheduled-rescan-time').value = config.time || '03:00';
document.getElementById('auto-download-after-rescan').checked = config.auto_download_after_rescan;
document.getElementById('scheduled-rescan-time').value = config.schedule_time || '03:00';
// Update status display
document.getElementById('next-rescan-time').textContent =
config.next_run ? new Date(config.next_run).toLocaleString() : 'Not scheduled';
document.getElementById('last-rescan-time').textContent =
config.last_run ? new Date(config.last_run).toLocaleString() : 'Never';
const autoDownload = document.getElementById('auto-download-after-rescan');
if (autoDownload) {
autoDownload.checked = config.auto_download_after_rescan || false;
}
// Update schedule day checkboxes
const days = config.schedule_days || ['mon','tue','wed','thu','fri','sat','sun'];
['mon','tue','wed','thu','fri','sat','sun'].forEach(function(day) {
const cb = document.getElementById('scheduler-day-' + day);
if (cb) cb.checked = days.indexOf(day) !== -1;
});
// Update status display (runtime fields come from data.status)
const nextRunEl = document.getElementById('scheduler-next-run');
if (nextRunEl) {
nextRunEl.textContent = runtimeStatus.next_run
? new Date(runtimeStatus.next_run).toLocaleString()
: 'Not scheduled';
}
const statusBadge = document.getElementById('scheduler-running-status');
statusBadge.textContent = config.is_running ? 'Running' : 'Stopped';
statusBadge.className = 'info-value status-badge ' + (config.is_running ? 'running' : 'stopped');
if (statusBadge) {
statusBadge.textContent = runtimeStatus.is_running ? 'Running' : 'Stopped';
statusBadge.className = 'info-value status-badge ' + (runtimeStatus.is_running ? 'running' : 'stopped');
}
// Enable/disable time input based on checkbox
toggleTimeInput();
@@ -55,25 +71,45 @@ AniWorld.SchedulerConfig = (function() {
async function save() {
try {
const enabled = document.getElementById('scheduled-rescan-enabled').checked;
const interval = parseInt(document.getElementById('scheduled-rescan-interval').value) || 60;
const scheduleTime = document.getElementById('scheduled-rescan-time').value || '03:00';
// Get current config
const configResponse = await AniWorld.ApiClient.get(AniWorld.Constants.API.CONFIG);
if (!configResponse) return;
const config = await configResponse.json();
// Collect checked day checkboxes
const scheduleDays = ['mon','tue','wed','thu','fri','sat','sun'].filter(function(day) {
const cb = document.getElementById('scheduler-day-' + day);
return cb && cb.checked;
});
// Update scheduler settings
config.scheduler = {
const autoDownloadEl = document.getElementById('auto-download-after-rescan');
const autoDownload = autoDownloadEl ? autoDownloadEl.checked : false;
const intervalEl = document.getElementById('scheduled-rescan-interval');
const interval = intervalEl ? (parseInt(intervalEl.value) || 60) : 60;
// POST directly to the scheduler config endpoint
const payload = {
enabled: enabled,
schedule_time: scheduleTime,
schedule_days: scheduleDays,
auto_download_after_rescan: autoDownload,
interval_minutes: interval
};
// Save updated config
const response = await AniWorld.ApiClient.put(AniWorld.Constants.API.CONFIG, config);
const response = await AniWorld.ApiClient.post(API.SCHEDULER_CONFIG, payload);
if (!response) return;
AniWorld.UI.showToast('Scheduler configuration saved successfully', 'success');
await load();
const result = await response.json();
if (result.success) {
AniWorld.UI.showToast('Scheduler configuration saved successfully', 'success');
// Update next run display from response
const nextRunEl = document.getElementById('scheduler-next-run');
if (nextRunEl && result.status) {
nextRunEl.textContent = result.status.next_run
? new Date(result.status.next_run).toLocaleString()
: 'Not scheduled';
}
} else {
AniWorld.UI.showToast('Failed to save scheduler configuration', 'error');
}
} catch (error) {
console.error('Error saving scheduler config:', error);
AniWorld.UI.showToast('Failed to save scheduler configuration', 'error');

View File

@@ -40,6 +40,7 @@ AniWorld.Constants = (function() {
QUEUE_PENDING: '/api/queue/pending',
// Config endpoints
CONFIG: '/api/config',
CONFIG_DIRECTORY: '/api/config/directory',
CONFIG_SECTION: '/api/config/section', // + /{section}
CONFIG_BACKUP: '/api/config/backup',