diff options
| author | Petri Hienonen <petri.hienonen@gmail.com> | 2025-09-28 15:08:14 +0300 |
|---|---|---|
| committer | Petri Hienonen <petri.hienonen@gmail.com> | 2025-09-28 15:08:14 +0300 |
| commit | 8489f1f83da5dcc5818401393b1f6a430eea677c (patch) | |
| tree | d55c205a0b45127765c1547fef5904d08e1171a4 /static/config-manager.js | |
| parent | 289e73570674b67f7a1561cff9cec61498efc6cc (diff) | |
| download | network-8489f1f83da5dcc5818401393b1f6a430eea677c.tar.zst | |
Intial version
Diffstat (limited to 'static/config-manager.js')
| -rw-r--r-- | static/config-manager.js | 130 |
1 files changed, 70 insertions, 60 deletions
diff --git a/static/config-manager.js b/static/config-manager.js index ebaf9f2..edb46b2 100644 --- a/static/config-manager.js +++ b/static/config-manager.js @@ -1,92 +1,102 @@ /* jshint esversion: 2024, module: true */ +import { ApiClient } from './api-client.js'; +import { ValidationState } from './enums.js'; + /** - * Configuration Manager for handling config files + * Static Configuration Manager for handling config files * @class ConfigManager */ class ConfigManager { /** - * @param {Object} elements - DOM elements - * @param {ApiClient} apiClient - API client instance - * @param {Object} state - Application state + * Refresh configuration file list + * @static + * @returns {Promise<Array>} Array of file names */ - constructor(elements, apiClient, state) { - this.elements = elements; - this.apiClient = apiClient; - this.state = state; + static async refreshConfigs() { + try { + const data = await ApiClient.getConfigFiles(); + return data.files || []; + } catch (error) { + throw new Error(`Failed to list configs: ${error.message}`); + } } /** - * Refresh configuration file list - * @method refreshConfigs + * Load selected configuration file + * @static + * @param {string} name - File name + * @returns {Promise<string>} File content */ - async refreshConfigs() { + static async loadConfig(name) { try { - const data = await this.apiClient.get('/api/configs'); - - this.elements.inputs.configSelect.innerHTML = ''; - data.files?.forEach(file => { - const option = new Option(file, file); - this.elements.inputs.configSelect.add(option); - }); - - if (data.files?.length > 0) { - this.state.currentConfigFile = data.files[0]; - await this.loadConfig(); - } else { - this.elements.inputs.cfgEditor.value = ''; - this.state.currentConfigFile = null; - } + return await ApiClient.getConfigFile(name); } catch (error) { - alert(`Failed to list configs: ${error.message}`); + throw new Error(`Failed to load: ${error.message}`); } } /** - * Load selected configuration file - * @method loadConfig + * Validate current configuration + * @static + * @param {string} name - File name + * @param {string} content - File content + * @returns {Promise<Object>} Validation result */ - async loadConfig() { - const name = this.elements.inputs.configSelect.value; - if (!name) return; - - this.state.currentConfigFile = name; - + static async validateConfig(name, content) { try { - const text = await this.apiClient.getText(`/api/config/${encodeURIComponent(name)}`); - this.elements.inputs.cfgEditor.value = text; - this.elements.outputs.validateResult.textContent = ''; + return await ApiClient.validateConfig(name, content); } catch (error) { - alert(`Failed to load: ${error.message}`); + throw new Error(`Validation failed: ${error.message}`); } } /** - * Validate current configuration - * @method validateConfig + * Save current configuration + * @static + * @param {string} name - File name + * @param {string} content - File content + * @param {boolean} restart - Restart service + * @returns {Promise<Object>} Save result */ - async validateConfig() { - const name = this.elements.inputs.configSelect.value; - const content = this.elements.inputs.cfgEditor.value; - - this.elements.outputs.validateResult.textContent = 'Validating...'; - this.elements.outputs.validateResult.className = 'validation-pending'; - + static async saveConfig(name, content, restart) { try { - const result = await this.apiClient.post('/api/validate', { name, content }); - - if (result.ok) { - this.elements.outputs.validateResult.textContent = '✓ Configuration is valid'; - this.elements.outputs.validateResult.className = 'validation-success'; - } else { - this.elements.outputs.validateResult.textContent = `✗ ${result.output || 'Validation failed'}`; - this.elements.outputs.validateResult.className = 'validation-error'; - } + return await ApiClient.saveConfig(name, content, restart); } catch (error) { - this.elements.outputs.validateResult.textContent = `✗ Error: ${error.message}`; - this.elements.outputs.validateResult.className = 'validation-error'; + throw new Error(`Save failed: ${error.message}`); + } + } + + /** + * Get validation state class + * @static + * @param {Symbol} state - Validation state + * @returns {string} CSS class + */ + static getValidationClass(state) { + switch (state) { + case ValidationState.SUCCESS: return 'validation-success'; + case ValidationState.ERROR: return 'validation-error'; + case ValidationState.PENDING: return 'validation-pending'; + default: return ''; + } + } + + /** + * Get validation message + * @static + * @param {Symbol} state - Validation state + * @param {string} [message] - Additional message + * @returns {string} Validation message + */ + static getValidationMessage(state, message = '') { + switch (state) { + case ValidationState.SUCCESS: return '✓ Configuration is valid'; + case ValidationState.ERROR: return `✗ ${message || 'Validation failed'}`; + case ValidationState.PENDING: return 'Validating...'; + default: return ''; } } } -export { ConfigManager };
\ No newline at end of file +export { ConfigManager }; |
