refactor: split CSS and JS into modular files (SRP)

This commit is contained in:
2025-12-26 13:55:02 +01:00
parent 94cf36bff3
commit 2e5731b5d6
47 changed files with 8882 additions and 2298 deletions

View File

@@ -0,0 +1,229 @@
/**
* AniWorld - Config Manager Module
*
* Orchestrates configuration modal and delegates to specialized config modules.
*
* Dependencies: constants.js, api-client.js, ui-utils.js,
* scheduler-config.js, logging-config.js, advanced-config.js, main-config.js
*/
var AniWorld = window.AniWorld || {};
AniWorld.ConfigManager = (function() {
'use strict';
const API = AniWorld.Constants.API;
/**
* Initialize the config manager
*/
function init() {
bindEvents();
}
/**
* Bind UI events
*/
function bindEvents() {
// Config modal
const configBtn = document.getElementById('config-btn');
if (configBtn) {
configBtn.addEventListener('click', showConfigModal);
}
const closeConfig = document.getElementById('close-config');
if (closeConfig) {
closeConfig.addEventListener('click', hideConfigModal);
}
const configModal = document.querySelector('#config-modal .modal-overlay');
if (configModal) {
configModal.addEventListener('click', hideConfigModal);
}
// Scheduler configuration
bindSchedulerEvents();
// Logging configuration
bindLoggingEvents();
// Advanced configuration
bindAdvancedEvents();
// Main configuration
bindMainEvents();
// Status panel
const closeStatus = document.getElementById('close-status');
if (closeStatus) {
closeStatus.addEventListener('click', hideStatus);
}
}
/**
* Bind scheduler-related events
*/
function bindSchedulerEvents() {
const schedulerEnabled = document.getElementById('scheduled-rescan-enabled');
if (schedulerEnabled) {
schedulerEnabled.addEventListener('change', AniWorld.SchedulerConfig.toggleTimeInput);
}
const saveScheduler = document.getElementById('save-scheduler-config');
if (saveScheduler) {
saveScheduler.addEventListener('click', AniWorld.SchedulerConfig.save);
}
const testScheduler = document.getElementById('test-scheduled-rescan');
if (testScheduler) {
testScheduler.addEventListener('click', AniWorld.SchedulerConfig.testRescan);
}
}
/**
* Bind logging-related events
*/
function bindLoggingEvents() {
const saveLogging = document.getElementById('save-logging-config');
if (saveLogging) {
saveLogging.addEventListener('click', AniWorld.LoggingConfig.save);
}
const testLogging = document.getElementById('test-logging');
if (testLogging) {
testLogging.addEventListener('click', AniWorld.LoggingConfig.testLogging);
}
const refreshLogs = document.getElementById('refresh-log-files');
if (refreshLogs) {
refreshLogs.addEventListener('click', AniWorld.LoggingConfig.loadLogFiles);
}
const cleanupLogs = document.getElementById('cleanup-logs');
if (cleanupLogs) {
cleanupLogs.addEventListener('click', AniWorld.LoggingConfig.cleanupLogs);
}
}
/**
* Bind advanced config events
*/
function bindAdvancedEvents() {
const saveAdvanced = document.getElementById('save-advanced-config');
if (saveAdvanced) {
saveAdvanced.addEventListener('click', AniWorld.AdvancedConfig.save);
}
}
/**
* Bind main configuration events
*/
function bindMainEvents() {
const createBackup = document.getElementById('create-config-backup');
if (createBackup) {
createBackup.addEventListener('click', AniWorld.MainConfig.createBackup);
}
const viewBackups = document.getElementById('view-config-backups');
if (viewBackups) {
viewBackups.addEventListener('click', AniWorld.MainConfig.viewBackups);
}
const exportConfig = document.getElementById('export-config');
if (exportConfig) {
exportConfig.addEventListener('click', AniWorld.MainConfig.exportConfig);
}
const validateConfig = document.getElementById('validate-config');
if (validateConfig) {
validateConfig.addEventListener('click', AniWorld.MainConfig.validateConfig);
}
const resetConfig = document.getElementById('reset-config');
if (resetConfig) {
resetConfig.addEventListener('click', handleResetConfig);
}
const saveMain = document.getElementById('save-main-config');
if (saveMain) {
saveMain.addEventListener('click', AniWorld.MainConfig.save);
}
const resetMain = document.getElementById('reset-main-config');
if (resetMain) {
resetMain.addEventListener('click', AniWorld.MainConfig.reset);
}
const testConnection = document.getElementById('test-connection');
if (testConnection) {
testConnection.addEventListener('click', AniWorld.MainConfig.testConnection);
}
const browseDirectory = document.getElementById('browse-directory');
if (browseDirectory) {
browseDirectory.addEventListener('click', AniWorld.MainConfig.browseDirectory);
}
}
/**
* Handle reset config with modal refresh
*/
async function handleResetConfig() {
const success = await AniWorld.MainConfig.resetAllConfig();
if (success) {
setTimeout(function() {
hideConfigModal();
showConfigModal();
}, 1000);
}
}
/**
* Show the configuration modal
*/
async function showConfigModal() {
const modal = document.getElementById('config-modal');
try {
// Load current status
const response = await AniWorld.ApiClient.get(API.ANIME_STATUS);
if (!response) return;
const data = await response.json();
document.getElementById('anime-directory-input').value = data.directory || '';
document.getElementById('series-count-input').value = data.series_count || '0';
// Load all configuration sections
await AniWorld.SchedulerConfig.load();
await AniWorld.LoggingConfig.load();
await AniWorld.AdvancedConfig.load();
modal.classList.remove('hidden');
} catch (error) {
console.error('Error loading configuration:', error);
AniWorld.UI.showToast('Failed to load configuration', 'error');
}
}
/**
* Hide the configuration modal
*/
function hideConfigModal() {
document.getElementById('config-modal').classList.add('hidden');
}
/**
* Hide status panel
*/
function hideStatus() {
document.getElementById('status-panel').classList.add('hidden');
}
// Public API
return {
init: init,
showConfigModal: showConfigModal,
hideConfigModal: hideConfigModal,
hideStatus: hideStatus
};
})();