diff options
| author | Petri Hienonen <petri.hienonen@gmail.com> | 2025-09-28 13:41:46 +0300 |
|---|---|---|
| committer | Petri Hienonen <petri.hienonen@gmail.com> | 2025-09-28 13:41:46 +0300 |
| commit | b0c76dcc159ead3d67314da3a71d60bad9385991 (patch) | |
| tree | 08a9d0be61b3e223883b8d164967c0d0ef973960 /static/config-manager.js | |
| parent | a1862888a7818ae9663b02dda48d25ef5f2ab6a6 (diff) | |
| download | network-b0c76dcc159ead3d67314da3a71d60bad9385991.tar.zst | |
Split the system
Diffstat (limited to 'static/config-manager.js')
| -rw-r--r-- | static/config-manager.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/static/config-manager.js b/static/config-manager.js new file mode 100644 index 0000000..8dc629b --- /dev/null +++ b/static/config-manager.js @@ -0,0 +1,120 @@ +/* jshint esversion: 2024, module: true */ + +/** + * 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 + */ + constructor(elements, apiClient, state) { + this.elements = elements; + this.apiClient = apiClient; + this.state = state; + } + + /** + * Set up configuration event listeners + * @method setupEventListeners + */ + setupEventListeners() { + this.elements.buttons.refreshConfigs?.addEventListener('click', () => this.refreshConfigs()); + this.elements.buttons.saveConfig?.addEventListener('click', () => this.saveConfig()); + this.elements.buttons.validateConfig?.addEventListener('click', () => this.validateConfig()); + this.elements.inputs.configSelect?.addEventListener('change', () => this.loadConfig()); + } + + /** + * Refresh configuration file list + * @method refreshConfigs + */ + async refreshConfigs() { + 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) { + await this.loadConfig(); + } else { + this.elements.inputs.cfgEditor.value = ''; + } + } catch (error) { + alert(`Failed to list configs: ${error.message}`); + } + } + + /** + * Load selected configuration file + * @method loadConfig + */ + async loadConfig() { + const name = this.elements.inputs.configSelect.value; + if (!name) return; + + try { + const text = await this.apiClient.getText(`/api/config/${encodeURIComponent(name)}`); + this.elements.inputs.cfgEditor.value = text; + this.elements.outputs.validateResult.textContent = ''; + } catch (error) { + alert(`Failed to load: ${error.message}`); + } + } + + /** + * Validate current configuration + * @method validateConfig + */ + 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'; + + 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'; + } + } catch (error) { + this.elements.outputs.validateResult.textContent = `✗ Error: ${error.message}`; + this.elements.outputs.validateResult.className = 'validation-error'; + } + } + + /** + * Save current configuration + * @method saveConfig + */ + async saveConfig() { + const name = this.elements.inputs.configSelect.value; + const content = this.elements.inputs.cfgEditor.value; + const restart = this.elements.inputs.restartAfterSave.checked; + + if (!confirm(`Save file ${name}? This will create a backup and ${restart ? 'restart' : 'not restart'} networkd.`)) { + return; + } + + try { + const result = await this.apiClient.post('/api/save', { name, content, restart }); + alert(`Saved: ${result.status ?? 'ok'}`); + } catch (error) { + alert(`Save failed: ${error.message}`); + } + } +} + +export { ConfigManager }; |
