refactor: split CSS and JS into modular files (SRP)
This commit is contained in:
229
src/server/web/static/js/index/config-manager.js
Normal file
229
src/server/web/static/js/index/config-manager.js
Normal 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
|
||||
};
|
||||
})();
|
||||
Reference in New Issue
Block a user