From 680176f166d5c93e34f493da0aaae1da590d7380 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 17 Jul 2026 09:03:52 +0000 Subject: [PATCH] fix: wait 2s after destroyEditor for ONLYOFFICE session to close before reopening --- .../433a0593-d3cf-414e-8763-ab5f87cbc75c.docx | Bin 40671 -> 40685 bytes renderer/carbone-templates/registry.json | 2 +- static/carbone.js | 10 +++++----- static/index.html | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx b/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx index 2ba4ff5d6bf216b8d0f3bd255a0a931b95d6ee0d..2db4c184eec9f4b6b660ace7f2c54762efeb549d 100644 GIT binary patch delta 2356 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 delta 2249 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 Phr>yoWy+lSg+S;(C6?ic diff --git a/renderer/carbone-templates/registry.json b/renderer/carbone-templates/registry.json index 7d48d87..28652d7 100644 --- a/renderer/carbone-templates/registry.json +++ b/renderer/carbone-templates/registry.json @@ -6,6 +6,6 @@ "originalName": "master_cv_template.docx", "path": "/root/workspace/cv-app/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx", "uploadedAt": "2026-07-16T09:03:29.601Z", - "updatedAt": "2026-07-17T08:58:13.712Z" + "updatedAt": "2026-07-17T09:01:35.526Z" } ] \ No newline at end of file diff --git a/static/carbone.js b/static/carbone.js index 7a60077..69a4d98 100644 --- a/static/carbone.js +++ b/static/carbone.js @@ -277,10 +277,6 @@ function closeOnlyofficeEditor() { // Delete the DocsAPI global and remove the script tag so the next // openOnlyofficeEditor call loads a completely fresh ONLYOFFICE API. - // This is the key: destroyEditor() cleans the editor instance, but - // the DocsAPI object itself retains internal state (websocket pools, - // document session references) that causes the next editor to load - // a stale document. Removing the script + global forces a fresh init. delete window.DocsAPI; const oldScript = document.querySelector('script[src*="api/documents/api.js"]'); if (oldScript) oldScript.remove(); @@ -290,9 +286,14 @@ function closeOnlyofficeEditor() { // Open ONLYOFFICE editor in a modal async function openOnlyofficeEditor(templateId, templateName) { + // Block reopening if a previous editor is still tearing down. + // destroyEditor() is async — the ONLYOFFICE websocket/session needs + // time to close before a new editor can be created cleanly. if (onlyofficeEditorInstance) { try { onlyofficeEditorInstance.destroyEditor(); } catch (e) {} onlyofficeEditorInstance = null; + // Give ONLYOFFICE's internal session 2 seconds to fully close + await new Promise(r => setTimeout(r, 2000)); } try { @@ -317,7 +318,6 @@ async function openOnlyofficeEditor(templateId, templateName) { showModal(body, '', 'xlarge'); // Load ONLYOFFICE API script fresh each time with cache-buster. - // This ensures a completely new DocsAPI instance with no stale state. const scriptUrl = onlyofficeUrl + '/web-apps/apps/api/documents/api.js?cb=' + Date.now(); await new Promise((resolve, reject) => { const s = document.createElement('script'); diff --git a/static/index.html b/static/index.html index f06ab67..90fe4cd 100644 --- a/static/index.html +++ b/static/index.html @@ -139,7 +139,7 @@ - - + + \ No newline at end of file