From 8b6b083d3d21aed87c695512258943fb923bcb78 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 16 Jul 2026 12:02:45 +0000 Subject: [PATCH] fix: force-reload ONLYOFFICE API.js each session + Date.now for truly unique doc key --- .../433a0593-d3cf-414e-8763-ab5f87cbc75c.docx | Bin 40658 -> 40657 bytes renderer/carbone-templates/registry.json | 2 +- renderer/onlyoffice-service.js | 3 ++- static/carbone.js | 16 ++++++++++------ static/index.html | 4 ++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx b/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx index f223f58b131c693fa113043344376a25a00caf9a..1d793655782b396cc0d4053f8402f4a9d1f9962d 100644 GIT binary patch delta 1324 zcmcb#m+9hOCY}IqW)=|!5a^BD$dk>%)EhUslH(AN+HA}Doe@NvaYyHZ=*bno!2JFy z5fzbud4^R3W+BD-sk|B93X>m}9O?ip__vw1mBHT&ZJ4eOg-9DJIrb5`&9yWKHj z@wKpTS(C3dsxj`H{I^k_asFi4CP&8WljEC|nBMQ++}tF_C@O#IZhQTXdH>j9zUBb> zdh@#G{mdZ$<+pc({r9IM4n$8D?3SJEHAirAS63^9yBS0s>)rxVT+>s|!~qI~U5lsM zP5#{{Uw=FAv4TKb{Lx4E4&KO$Qapb3Tgg?gsb;%l-^#YGbk1gO%9P#zH_5t?Z`HTF zwx7>uKWzV0b=&Nu_>To^BL%me@L+O_TI#!3Y5z6;m!h6bT#H?jdDnRGH^zi7Es2TZ zKY!2a!wN-}iOEdU^IXk3`humNutf=q1tunaJo_sw!Kb#~ckTrFMQpRuZ%*3Q;KV6X z!mun)ZIW!zNy(RXwZ=?SmRxY)W@Ap}cH@s?x!;yAeeBf4O;>MN{|MWqf9_T8h0PmY z?{W?AxwON6as52G`o3`At&(#lIjjou?30pS;Z?a zmYh2EcE!#4{C)Kf_v<6qJH4?xxyZ+HLY#Ha`iQFu2e?_L?)i4o@_mGbfwbTUO}p>2 z*-9^mZ{I&z{+#M}uj30J&oDlC;qgOn{{KsNNr@Imy?Zl%THoizxivR5u^)7PTfZs4RL`(&H|sy|Gt)E6W^Q^q%dl=@aapCy9U10j^Q9kd z{rdOG8Gdnsgf!d*YKhz+A;CpFmvEsf{e4xScW69z@-o=>Vdn zXW4?Ns9Dw^YWgfY5OsZ)9ctR2tTfxG9+VI?rpNM6VrF14^+1X6Lrm#1ohz|G^=&{Sgiy36wL`V1<>!@z zBqrsgqU%=x8KApSI!Fy@Krkxi>*bjnSxoW}$5f&3g9M*qn+bF`rxCYJ8W zirsRPqv!C*gUosP^Wfxap#IrFEQ?~!&dC?%=zw(n0~(P(S$eJ%SOX{r^aCwc0Jto836tO4p0 z0Gc3-qFZ64YtmiAT|K4Jn3P)TN{&N7YO^ipcSaCx#vPptq9<4U0`vQ; zL|AyAM}3GnpzXEn77GKz*3BF0e3-01$+q13AD8#Ees}4iw|bAeJx+A}JYu(1@9LL| z8#j9uN+P$o{a1RSuJ|JIo1x+cAKQnq|K;y0AA7H{XVql0#%Pz*T@NgrKAW^7R%>S*^CkmBl|awZN?D7dKQ z?U?+lPrm-H-(v%T)_B!VwXZA$SzT8OZa95aNinza>OIM7kG(3}Qu&uu{w|$l_E+#x z-m&6mvp;TJ{W|xy%KQh-+tOTbC@FJFWKK2v+GVr${blV*EFx~5$D|@A$}#PHHnn8w z7CE`Sr4Is~J(P~O1nm;NsjzF(B?a>fT^l;MguC;vZD&e;RiFK;rAFNJg3ak^TUbTB z7A#;kC^eq=W`fr_kM9p>3ocM;Ws5S9(1hk9|O^!eNpBW{NH%({-$EoF{+o0GJo6G^`DoptV;)+adWC6wP^qKY`>c&h5 z5G6Is7DPqPvIbGpX4!$LYqRW76aQqz*+v?mgrG4!mVXj61A`$K1A`zqOEEAog6T!g z3=HM@MJf8llNo1;%Yzh`F4MUZ3zTgGY7jzEoIH8sY(=md-Hp;gYCtu?tPBh?C~7`T z{y1A3L}t>?fvOsw6L6}sgnN6p~@8}ahz!O7J?t+Rnx7R88Nlh4o50U7ZZ zXhgwesku`1u+-cSv{M1-E>usv>|U|DrTlz{<=zyN3f5O7Xj MJWqqIYbJ;d05oF*>;M1& diff --git a/renderer/carbone-templates/registry.json b/renderer/carbone-templates/registry.json index f637f33..5d48489 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-16T11:23:15.854Z" + "updatedAt": "2026-07-16T11:52:26.701Z" } ] \ No newline at end of file diff --git a/renderer/onlyoffice-service.js b/renderer/onlyoffice-service.js index 30d6e51..5804d30 100644 --- a/renderer/onlyoffice-service.js +++ b/renderer/onlyoffice-service.js @@ -143,7 +143,8 @@ router.get('/:templateId/config', (req, res) => { // Get file modification time for cache-busting doc key const fileStats = fs.statSync(template.path); const fileMtime = fileStats.mtimeMs; - const docKey = generateDocKey(templateId, fileMtime); + // Use Date.now() as the primary uniqueness driver — guaranteed fresh every time + const docKey = generateDocKey(templateId, Date.now()); const fileName = template.originalName || template.name + '.docx'; // Add file mtime as cache-buster to the document URL so ONLYOFFICE diff --git a/static/carbone.js b/static/carbone.js index 886201a..f52fe7e 100644 --- a/static/carbone.js +++ b/static/carbone.js @@ -324,10 +324,15 @@ async function openOnlyofficeEditor(templateId, templateName) { `; showModal(body, '', 'xlarge'); - // Load ONLYOFFICE API script dynamically - const scriptUrl = onlyofficeUrl + '/web-apps/apps/api/documents/api.js'; - if (!document.getElementById('onlyoffice-api-script')) { - await new Promise((resolve, reject) => { + // Load ONLYOFFICE API script - force fresh load each time + // Remove old script to force ONLYOFFICE to reload API.js from server + const oldScript = document.getElementById('onlyoffice-api-script'); + if (oldScript) oldScript.remove(); + + // Reload with cache-buster so ONLYOFFICE gets fresh API state + const scriptBuster = Date.now(); + const scriptUrl = onlyofficeUrl + '/web-apps/apps/api/documents/api.js?cb=' + scriptBuster; + await new Promise((resolve, reject) => { const script = document.createElement('script'); script.id = 'onlyoffice-api-script'; script.src = scriptUrl; @@ -335,8 +340,7 @@ async function openOnlyofficeEditor(templateId, templateName) { script.onerror = () => reject(new Error('Failed to load ONLYOFFICE API from ' + scriptUrl)); document.head.appendChild(script); }); - } - + // Initialize the ONLYOFFICE editor if (typeof DocsAPI === 'undefined' || !DocsAPI.DocEditor) { throw new Error('ONLYOFFICE API not loaded. Check that the server is running at ' + onlyofficeUrl); diff --git a/static/index.html b/static/index.html index b099f2c..8a43737 100644 --- a/static/index.html +++ b/static/index.html @@ -139,7 +139,7 @@ - - + + \ No newline at end of file