summaryrefslogtreecommitdiffstats
path: root/static/config-manager.js
diff options
context:
space:
mode:
authorPetri Hienonen <petri.hienonen@gmail.com>2025-09-28 13:41:46 +0300
committerPetri Hienonen <petri.hienonen@gmail.com>2025-09-28 13:41:46 +0300
commitb0c76dcc159ead3d67314da3a71d60bad9385991 (patch)
tree08a9d0be61b3e223883b8d164967c0d0ef973960 /static/config-manager.js
parenta1862888a7818ae9663b02dda48d25ef5f2ab6a6 (diff)
downloadnetwork-b0c76dcc159ead3d67314da3a71d60bad9385991.tar.zst
Split the system
Diffstat (limited to '')
-rw-r--r--static/config-manager.js120
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 };