summaryrefslogtreecommitdiffstats
path: root/static/config-manager.js
diff options
context:
space:
mode:
authorPetri Hienonen <petri.hienonen@gmail.com>2025-09-28 15:08:14 +0300
committerPetri Hienonen <petri.hienonen@gmail.com>2025-09-28 15:08:14 +0300
commit8489f1f83da5dcc5818401393b1f6a430eea677c (patch)
treed55c205a0b45127765c1547fef5904d08e1171a4 /static/config-manager.js
parent289e73570674b67f7a1561cff9cec61498efc6cc (diff)
downloadnetwork-8489f1f83da5dcc5818401393b1f6a430eea677c.tar.zst
Intial version
Diffstat (limited to 'static/config-manager.js')
-rw-r--r--static/config-manager.js130
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 };