From 27fa860f2f9c9a96bb40a06e6be06457abdb282c Mon Sep 17 00:00:00 2001 From: PauI Ostrovckij Date: Tue, 10 Jun 2025 19:51:00 +0300 Subject: [PATCH 1/3] [feature] Add reset settings buttons --- branding/info/ai/scripts/settings.js | 3 ++ branding/info/js/ai-integration.js | 54 ++++++++++++++++++++++- branding/info/js/ai-interface.js | 64 ++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 1 deletion(-) diff --git a/branding/info/ai/scripts/settings.js b/branding/info/ai/scripts/settings.js index 405296a2..01b7f8e2 100644 --- a/branding/info/ai/scripts/settings.js +++ b/branding/info/ai/scripts/settings.js @@ -25,6 +25,9 @@ window.Asc.plugin.init = function() { updatedComboBoxes(); }); window.Asc.plugin.attachEvent("onThemeChanged", onThemeChanged); + window.Asc.plugin.attachEvent("onResetSelectors", function() { + $('.ai-model-select').val('').trigger('change'); + }); $('#edit-ai-models label').click(function(e) { window.Asc.plugin.sendToPlugin("onOpenAiModelsModal"); diff --git a/branding/info/js/ai-integration.js b/branding/info/js/ai-integration.js index 07f71e03..54e42db8 100644 --- a/branding/info/js/ai-integration.js +++ b/branding/info/js/ai-integration.js @@ -13,6 +13,8 @@ const AIIntegration = { // Callback functions onSave: null, onOk: null, + onResetActions: null, + onResetAllSettings: null, // Initialize the AI integration init() { @@ -44,6 +46,8 @@ const AIIntegration = {
+ +
@@ -60,6 +64,8 @@ const AIIntegration = { const btnCancel = document.getElementById('ai-btn-cancel'); const btnSave = document.getElementById('ai-btn-save'); const btnOk = document.getElementById('ai-btn-ok'); + const btnResetActions = document.getElementById('ai-btn-reset-actions'); + const btnResetAllSettings = document.getElementById('ai-btn-reset-all-settings'); const iframeSettings = document.getElementById('ai-iframe-settings'); const iframeEdit = document.getElementById('ai-iframe-edit'); const iframeList = document.getElementById('ai-iframe-list'); @@ -83,6 +89,14 @@ const AIIntegration = { if (btnOk) { btnOk.addEventListener('click', () => this.ok()); } + + if (btnResetActions) { + btnResetActions.addEventListener('click', () => this.resetActions()); + } + + if (btnResetAllSettings) { + btnResetAllSettings.addEventListener('click', () => this.resetAllSettings()); + } if (iframeSettings) { iframeSettings.addEventListener('load', () => this.onIframeLoad()); @@ -164,9 +178,11 @@ const AIIntegration = { const btnCancel = document.getElementById('ai-btn-cancel'); const btnSave = document.getElementById('ai-btn-save'); const btnOk = document.getElementById('ai-btn-ok'); + const btnResetActions = document.getElementById('ai-btn-reset-actions'); + const btnResetAllSettings = document.getElementById('ai-btn-reset-all-settings'); // Hide all buttons first - [btnBack, btnCancel, btnSave, btnOk].forEach(btn => { + [btnBack, btnCancel, btnSave, btnOk, btnResetActions, btnResetAllSettings].forEach(btn => { if (btn) btn.style.display = 'none'; }); @@ -174,6 +190,8 @@ const AIIntegration = { switch (this.currentView) { case 'settings': if (btnSave) btnSave.style.display = 'inline-block'; + if (btnResetActions) btnResetActions.style.display = 'inline-block'; + if (btnResetAllSettings) btnResetAllSettings.style.display = 'inline-block'; break; case 'aiModelEdit': if (btnOk) btnOk.style.display = 'inline-block'; @@ -245,6 +263,40 @@ const AIIntegration = { cancel() { this.navigateToView('aiModelsList'); + }, + + resetActions() { + if (this.onResetActions) { + this.onResetActions().then((res) => { + const btnResetActions = document.getElementById('ai-btn-reset-actions'); + if (btnResetActions) { + const originalText = btnResetActions.textContent; + btnResetActions.textContent = res ? 'Actions Reset!' : 'Reset Failed!'; + btnResetActions.disabled = true; + setTimeout(() => { + btnResetActions.textContent = originalText; + btnResetActions.disabled = false; + }, 2000); + } + }); + } + }, + + resetAllSettings() { + if (this.onResetAllSettings) { + this.onResetAllSettings().then((res) => { + const btnResetAllSettings = document.getElementById('ai-btn-reset-all-settings'); + if (btnResetAllSettings) { + const originalText = btnResetAllSettings.textContent; + btnResetAllSettings.textContent = res ? 'Settings Reset!' : 'Reset Failed!'; + btnResetAllSettings.disabled = true; + setTimeout(() => { + btnResetAllSettings.textContent = originalText; + btnResetAllSettings.disabled = false; + }, 2000); + } + }); + } } }; diff --git a/branding/info/js/ai-interface.js b/branding/info/js/ai-interface.js index 2a606661..438571ee 100644 --- a/branding/info/js/ai-interface.js +++ b/branding/info/js/ai-interface.js @@ -61,6 +61,70 @@ return false; }); }; + AIIntegration.onResetActions = function() { + try { + var settingsWindow = findIframeBySrcPart('settings'); + if (settingsWindow && settingsWindow.contentWindow) { + if (settings && settings.actions) { + for (let id in settings.actions) { + if (settings.actions[id]) { + settings.actions[id].model = ""; + } + } + } + sendMessageToSettings({ + name: 'onResetSelectors' + }, settingsWindow.contentWindow); + return Promise.resolve(true); + } + } catch (error) { + console.error('Reset actions error:', error); + } + return Promise.resolve(false); + }; + AIIntegration.onResetAllSettings = function() { + try { + if (settings) { + // Reset actions models + if (settings.actions) { + for (let id in settings.actions) { + if (settings.actions[id]) { + settings.actions[id].model = ""; + } + } + } + + // Reset models array + settings.models = []; + + // Reset custom providers + settings.customProviders = {}; + + // Reset providers + if (settings.providers) { + for (let id in settings.providers) { + if (settings.providers[id]) { + settings.providers[id].key = ""; + settings.providers[id].models = []; + } + } + } + + // Update UI + var settingsWindow = findIframeBySrcPart('settings'); + if (settingsWindow && settingsWindow.contentWindow) { + sendMessageToSettings({ + name: 'onResetSelectors' + }, settingsWindow.contentWindow); + } + + return Promise.resolve(true); + } + } catch (error) { + console.error('Reset all settings error:', error); + } + return Promise.resolve(false); + }; AIIntegration.onOk = function() { var aiModelEditWindow = findIframeBySrcPart('aiModelEdit'); if(aiModelEditWindow) { From cf40c7ccff00eb18543d583dcb2af2ee8ee817ff Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Tue, 10 Jun 2025 23:42:34 +0300 Subject: [PATCH 2/3] [feature] Save on Reset button; refactor --- branding/info/ai/scripts/settings.js | 3 --- branding/info/js/ai-integration.js | 2 +- branding/info/js/ai-interface.js | 28 +++++++++++++--------------- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/branding/info/ai/scripts/settings.js b/branding/info/ai/scripts/settings.js index 01b7f8e2..405296a2 100644 --- a/branding/info/ai/scripts/settings.js +++ b/branding/info/ai/scripts/settings.js @@ -25,9 +25,6 @@ window.Asc.plugin.init = function() { updatedComboBoxes(); }); window.Asc.plugin.attachEvent("onThemeChanged", onThemeChanged); - window.Asc.plugin.attachEvent("onResetSelectors", function() { - $('.ai-model-select').val('').trigger('change'); - }); $('#edit-ai-models label').click(function(e) { window.Asc.plugin.sendToPlugin("onOpenAiModelsModal"); diff --git a/branding/info/js/ai-integration.js b/branding/info/js/ai-integration.js index 54e42db8..74f78c69 100644 --- a/branding/info/js/ai-integration.js +++ b/branding/info/js/ai-integration.js @@ -47,7 +47,7 @@ const AIIntegration = { - + diff --git a/branding/info/js/ai-interface.js b/branding/info/js/ai-interface.js index 438571ee..77eaff59 100644 --- a/branding/info/js/ai-interface.js +++ b/branding/info/js/ai-interface.js @@ -63,20 +63,19 @@ }; AIIntegration.onResetActions = function() { try { - var settingsWindow = findIframeBySrcPart('settings'); - if (settingsWindow && settingsWindow.contentWindow) { - if (settings && settings.actions) { - for (let id in settings.actions) { - if (settings.actions[id]) { - settings.actions[id].model = ""; - } + if (settings && settings.actions) { + for (let id in settings.actions) { + if (settings.actions[id]) { + settings.actions[id].model = ""; } } - sendMessageToSettings({ - name: 'onResetSelectors' - }, settingsWindow.contentWindow); - return Promise.resolve(true); } + var settingsWindow = findIframeBySrcPart('settings'); + if (settingsWindow && settingsWindow.contentWindow) { + updateActions(settingsWindow.contentWindow); + } + updateModels(); + return AIIntegration.onSave(); } catch (error) { console.error('Reset actions error:', error); } @@ -113,12 +112,11 @@ // Update UI var settingsWindow = findIframeBySrcPart('settings'); if (settingsWindow && settingsWindow.contentWindow) { - sendMessageToSettings({ - name: 'onResetSelectors' - }, settingsWindow.contentWindow); + updateActions(settingsWindow.contentWindow); } + updateModels(); - return Promise.resolve(true); + return AIIntegration.onSave(); } } catch (error) { console.error('Reset all settings error:', error); From d7bd3bee1ade22c65c4be90d43b3b0e5a60d5886 Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Wed, 11 Jun 2025 00:07:43 +0300 Subject: [PATCH 3/3] [config] Change runtimeConfig default location --- Common/config/production-linux.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/config/production-linux.json b/Common/config/production-linux.json index 5ae26bd2..ca465d41 100644 --- a/Common/config/production-linux.json +++ b/Common/config/production-linux.json @@ -6,7 +6,7 @@ "pluginDir" : "/var/www/onlyoffice/documentserver/server/info/ai" }, "runtimeConfig": { - "filePath": "/var/www/onlyoffice/documentserver/../Data/runtime.json" + "filePath": "/etc/onlyoffice/documentserver/runtime.json" }, "storage": { "fs": {