fix: vanilla form scripts not executing via innerHTML (REQ-2026-04-16-vanilla-versions-fix)

Browsers strip/ignore <script> tags injected via innerHTML. Moved all vanilla
form init logic (MC version loading, node stats, port assignment, helper
functions) from _vanilla_form.ejs into index.ejs loadVanillaForm() callback
where it runs in a proper script context.

_vanilla_form.ejs <script> block replaced with a comment explaining why.
index.ejs now defines vfShowNode, vfRefreshPort, vfUpdateJava as global
functions callable from the form's onchange handlers.
This commit is contained in:
Claude Code
2026-04-16 03:05:03 -05:00
parent 8531d1891f
commit 5356132d6f
3 changed files with 75 additions and 59 deletions

View File

@@ -189,61 +189,7 @@
</form>
</div>
<script>
// Load MC versions dynamically (Paper-supported only)
fetch('/admin/modpack-installer/mc-versions?paper=1', { headers: { 'HX-Request': 'true' } })
.then(function(r) { return r.json(); })
.then(function(versions) {
var sel = document.getElementById('vf-mcversion');
sel.innerHTML = '';
versions.forEach(function(v, i) {
var opt = document.createElement('option');
opt.value = v.version;
opt.dataset.mc = v.version;
opt.dataset.java = v.java_version;
opt.textContent = v.version + (i === 0 ? ' (latest)' : '');
if (i === 0) opt.selected = true;
sel.appendChild(opt);
});
if (versions.length > 0) {
document.getElementById('vf-java').value = versions[0].java_version;
}
});
// Load node stats
fetch('/admin/modpack-installer/node-info', { headers: { 'HX-Request': 'true' } })
.then(function(r) { return r.json(); })
.then(function(d) {
window._vfNodes = d;
vfShowNode(document.getElementById('vf-node').value);
});
vfRefreshPort();
function vfShowNode(node) {
var el = document.getElementById('vf-node-usage');
var n = (window._vfNodes || {})[node];
if (!n) { el.textContent = ''; return; }
el.innerHTML = 'RAM: <strong>' + Math.round(n.ramUsedMb/1024) + 'GB / ' + Math.round(n.ramTotalMb/1024) + 'GB</strong> · Disk: <strong>' + Math.round(n.diskUsedMb/1024) + 'GB / ' + Math.round(n.diskTotalMb/1024) + 'GB</strong>';
}
function vfRefreshPort() {
var node = document.getElementById('vf-node').value;
vfShowNode(node);
fetch('/admin/modpack-installer/next-port?node=' + node, { headers: { 'HX-Request': 'true' } })
.then(function(r) { return r.json(); })
.then(function(d) { document.getElementById('vf-port').value = d.port; });
}
function vfUpdateJava(sel) {
var opt = sel.options[sel.selectedIndex];
if (opt && opt.dataset.java) {
document.getElementById('vf-java').value = opt.dataset.java;
} else {
// Fallback: derive from version string
var mc = (opt && opt.dataset.mc) || '';
var major = parseInt(mc.split('.')[0]) || 0;
var minor = parseInt(mc.split('.')[1]) || 0;
document.getElementById('vf-java').value = major >= 26 ? 21 : minor <= 16 ? 8 : minor <= 20 ? 17 : 21;
}
}
</script>
<!-- NOTE: No <script> block here. Browsers don't execute scripts injected via innerHTML.
All init logic (version loading, node stats, port assignment, helper functions)
lives in index.ejs loadVanillaForm() where it runs in a proper script context.
See REQ-2026-04-16-vanilla-versions-fix. -->

View File

@@ -118,6 +118,76 @@
document.getElementById('pack-details').innerHTML = '<div class="text-gray-500 text-sm p-4">Loading...</div>';
fetch('/admin/modpack-installer/vanilla-form', { headers: { 'HX-Request': 'true' } })
.then(function(r) { return r.text(); })
.then(function(html) { document.getElementById('pack-details').innerHTML = html; });
.then(function(html) {
document.getElementById('pack-details').innerHTML = html;
// Scripts injected via innerHTML don't execute — run init here instead
// 1. Load MC versions (Paper-supported only)
fetch('/admin/modpack-installer/mc-versions?paper=1', { headers: { 'HX-Request': 'true' } })
.then(function(r) { return r.json(); })
.then(function(versions) {
var sel = document.getElementById('vf-mcversion');
if (!sel) return;
sel.innerHTML = '';
versions.forEach(function(v, i) {
var opt = document.createElement('option');
opt.value = v.version;
opt.dataset.mc = v.version;
opt.dataset.java = v.java_version;
opt.textContent = v.version + (i === 0 ? ' (latest)' : '');
if (i === 0) opt.selected = true;
sel.appendChild(opt);
});
if (versions.length > 0) {
var javaEl = document.getElementById('vf-java');
if (javaEl) javaEl.value = versions[0].java_version;
}
});
// 2. Load node stats
fetch('/admin/modpack-installer/node-info', { headers: { 'HX-Request': 'true' } })
.then(function(r) { return r.json(); })
.then(function(d) {
window._vfNodes = d;
vfShowNode(document.getElementById('vf-node') ? document.getElementById('vf-node').value : 'NC1');
});
// 3. Load initial port
vfRefreshPort();
});
}
// Vanilla form helpers (must be in index.ejs scope since _vanilla_form.ejs scripts won't run)
function vfShowNode(node) {
var el = document.getElementById('vf-node-usage');
if (!el) return;
var n = (window._vfNodes || {})[node];
if (!n) { el.textContent = ''; return; }
el.innerHTML = 'RAM: <strong>' + Math.round(n.ramUsedMb/1024) + 'GB / ' + Math.round(n.ramTotalMb/1024) + 'GB</strong> · Disk: <strong>' + Math.round(n.diskUsedMb/1024) + 'GB / ' + Math.round(n.diskTotalMb/1024) + 'GB</strong>';
}
function vfRefreshPort() {
var nodeEl = document.getElementById('vf-node');
if (!nodeEl) return;
var node = nodeEl.value;
vfShowNode(node);
fetch('/admin/modpack-installer/next-port?node=' + node, { headers: { 'HX-Request': 'true' } })
.then(function(r) { return r.json(); })
.then(function(d) {
var portEl = document.getElementById('vf-port');
if (portEl) portEl.value = d.port;
});
}
function vfUpdateJava(sel) {
var opt = sel.options[sel.selectedIndex];
if (opt && opt.dataset.java) {
document.getElementById('vf-java').value = opt.dataset.java;
} else {
var mc = (opt && opt.dataset.mc) || '';
var major = parseInt(mc.split('.')[0]) || 0;
var minor = parseInt(mc.split('.')[1]) || 0;
document.getElementById('vf-java').value = major >= 26 ? 21 : minor <= 16 ? 8 : minor <= 20 ? 17 : 21;
}
}
</script>