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:
@@ -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. -->
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user