From be5332d0a47c5ca2072b9d9d9992c7963f155676 Mon Sep 17 00:00:00 2001 From: Gmer4Lfe Date: Sat, 30 May 2026 18:21:31 -0400 Subject: [PATCH] Partnership: fix onclick functions not accessible outside IIFE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tab pages use full page reloads (not AJAX) — function declarations inside the IIFE are not in global scope, so onclick= attributes fail silently. Fix: assign all onclick-callable functions to window.* Replace vvRunById() calls with direct fetch (vvRunById is also IIFE-scoped in scheduler.php, unavailable in the partnership tab context). Add .catch() handlers so network/parse errors surface as alerts. --- Plugin/unraid/pages/partnership.php | 61 ++++++++++++++++------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/Plugin/unraid/pages/partnership.php b/Plugin/unraid/pages/partnership.php index 753b585..79d1c1f 100644 --- a/Plugin/unraid/pages/partnership.php +++ b/Plugin/unraid/pages/partnership.php @@ -342,48 +342,55 @@ function _render(data) { // ── Actions ─────────────────────────────────────────────────────────────────── -function vvPtPhase1(btn, hostId) { +function _vvPtRun(id, extraArgs) { + const params = {id, manual: '1'}; + if (extraArgs) params.extra_args = extraArgs; + return fetch('/plugins/varaverk/api/run.php', { + method: 'POST', + body: new URLSearchParams(params) + }).then(r => r.json()); +} + +window.vvPtPhase1 = function(btn, hostId) { if (!confirm(`Phase 1: SSH key exchange + conf push to ${hostId}?\n\nSafe to run before ${hostId} has Varaverk installed.`)) return; btn.disabled = true; btn.textContent = '⟳ Starting…'; - fetch('/plugins/varaverk/api/run.php', { - method: 'POST', - body: new URLSearchParams({id: 'Partnership/partnership_onboard.sh', manual: '1', extra_args: '--phase1-only'}) - }).then(r => r.json()).then(d => { - if (!d.ok) { alert('Failed: ' + (d.error ?? 'Unknown error')); } - setTimeout(() => { btn.disabled = false; btn.textContent = '▶ Phase 1: SSH + Conf Push'; }, 3000); - }); -} + _vvPtRun('Partnership/partnership_onboard.sh', '--phase1-only') + .then(d => { if (!d.ok) alert('Failed: ' + (d.error ?? 'Unknown error')); }) + .catch(e => alert('Error: ' + e)) + .finally(() => setTimeout(() => { btn.disabled = false; btn.textContent = '▶ Phase 1: SSH + Conf Push'; }, 3000)); +}; -function vvPtPhase2(btn, hostId) { - if (!confirm(`Phase 2: Deploy containers + arr stack + establish partnership on ${hostId}?\n\nThis requires ${hostId} to have Varaverk installed and SSH keys set up.`)) return; +window.vvPtPhase2 = function(btn, hostId) { + if (!confirm(`Phase 2: Deploy containers + arr stack + establish partnership on ${hostId}?\n\nRequires ${hostId} to have Varaverk installed and SSH keys set up.`)) return; btn.disabled = true; btn.textContent = '⟳ Starting…'; - fetch('/plugins/varaverk/api/run.php', { - method: 'POST', - body: new URLSearchParams({id: 'Partnership/partnership_onboard.sh', manual: '1', extra_args: '--phase2-only'}) - }).then(r => r.json()).then(d => { - if (!d.ok) { alert('Failed: ' + (d.error ?? 'Unknown error')); } - setTimeout(() => { btn.disabled = false; btn.textContent = '▶ Run Phase 2 Manually'; }, 3000); - }); -} + _vvPtRun('Partnership/partnership_onboard.sh', '--phase2-only') + .then(d => { if (!d.ok) alert('Failed: ' + (d.error ?? 'Unknown error')); }) + .catch(e => alert('Error: ' + e)) + .finally(() => setTimeout(() => { btn.disabled = false; btn.textContent = '▶ Run Phase 2 Manually'; }, 3000)); +}; -function vvPtOnboard(btn) { +window.vvPtOnboard = function(btn) { if (!confirm('Run full partnership_onboard.sh?\n\nRun on the MIRROR first, then on the OWNER.\n\nUse Phase 1 + Phase 2 buttons for step-by-step control.')) return; btn.disabled = true; btn.textContent = '⟳ Starting…'; - vvRunById('Partnership/partnership_onboard.sh'); - setTimeout(() => { btn.disabled = false; btn.textContent = '▶ Onboard (Mirror)'; }, 4000); -} + _vvPtRun('Partnership/partnership_onboard.sh') + .then(d => { if (!d.ok) alert('Failed: ' + (d.error ?? 'Unknown error')); }) + .catch(e => alert('Error: ' + e)) + .finally(() => setTimeout(() => { btn.disabled = false; btn.textContent = '▶ Onboard (Mirror)'; }, 4000)); +}; -function vvPtOffboard(btn) { +window.vvPtOffboard = function(btn) { if (btn.style.opacity === '0.35' || btn.style.cursor === 'default') return; if (!confirm('Run partnership_offboard.sh?\n\nThis will end the partnership, reconfigure WebUIs, and revoke SSH access.\n\nContinue?')) return; btn.disabled = true; btn.textContent = '⟳ Starting…'; - vvRunById('Partnership/partnership_offboard.sh'); - setTimeout(() => { btn.disabled = false; btn.textContent = '▶ Offboard'; }, 4000); -} + _vvPtRun('Partnership/partnership_offboard.sh') + .then(d => { if (!d.ok) alert('Failed: ' + (d.error ?? 'Unknown error')); }) + .catch(e => alert('Error: ' + e)) + .finally(() => setTimeout(() => { btn.disabled = false; btn.textContent = '▶ Offboard'; }, 4000)); +}; // ── Poll ──────────────────────────────────────────────────────────────────────