Drop the Host Settings card now the partnership settings card covers HOST1/HOST2
It existed to render two fields that live in master.conf's HOST IDENTITIES group, which the shared renderer now includes — one settings surface for the page rather than two both editing the same file.
This commit is contained in:
@@ -64,9 +64,14 @@ require_once dirname(__DIR__) . '/include/confform.php';
|
||||
$files = vv_get_conf_files();
|
||||
$out = [];
|
||||
foreach ($files as $f) {
|
||||
// "HOST IDENTITIES" is included alongside the partnership subsections because it holds HOST1
|
||||
// and HOST2 — the hostnames the whole partnership is keyed on. They were shown by a separate
|
||||
// "Host Settings" card on the partnership page, which existed only to render those two fields
|
||||
// and is now redundant: one settings surface for the page, not two that both edit master.conf.
|
||||
$groups = array_values(array_filter(
|
||||
vv_conf_all_groups($f),
|
||||
fn($g) => stripos($g['subsection'], 'partnership') !== false
|
||||
|| stripos($g['subsection'], 'host identities') !== false
|
||||
));
|
||||
if ($groups) {
|
||||
$out[] = ['file' => $f, 'groups' => $groups];
|
||||
|
||||
@@ -178,15 +178,6 @@ textarea.vv-pt-set-input { resize:vertical; white-space:pre; }
|
||||
Collapsed together they cost one line until opened. -->
|
||||
<div id="vv-pt-settings-body" style="display:none;margin-top:10px;">
|
||||
|
||||
<div id="vv-pt-hosts-section" style="display:none;margin-bottom:16px;">
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;">
|
||||
<div class="vv-cl-title" style="margin:0;">Host settings</div>
|
||||
<button id="vv-pt-hosts-save" class="vv-pt-action-btn run"
|
||||
onclick="vvPtSaveHosts(this)" style="display:none;">Save</button>
|
||||
</div>
|
||||
<div id="vv-pt-hosts-body"></div>
|
||||
</div>
|
||||
|
||||
<div id="vv-pt-arrays-wrap" style="display:none;margin-bottom:16px;"></div>
|
||||
|
||||
<div id="vv-pt-settings-conf"></div>
|
||||
@@ -388,32 +379,6 @@ function vvPtToggleSync(el, varName, enabled) {
|
||||
|
||||
// ── Host Settings ─────────────────────────────────────────────────────────────
|
||||
|
||||
function _renderHostSettings(nodes, isOwner) {
|
||||
let html = '<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;">';
|
||||
for (const n of nodes) {
|
||||
const rdonly = isOwner ? '' : 'readonly style="opacity:.5;cursor:default;"';
|
||||
html += `<div>
|
||||
<div class="vv-pt-set-key" style="margin-bottom:4px;">${_vvSetEsc(n.id)}</div>
|
||||
<input type="text" ${rdonly}
|
||||
class="vv-pt-set-input vv-pt-host-inp"
|
||||
data-key="${_vvSetEsc(n.id)}" data-file="master.conf" data-type="scalar"
|
||||
data-orig="${_vvSetEsc(n.hostname)}"
|
||||
value="${_vvSetEsc(n.hostname)}"
|
||||
oninput="vvPtHostChanged(this)"
|
||||
placeholder="hostname">
|
||||
</div>`;
|
||||
}
|
||||
html += '</div>';
|
||||
if (!isOwner) html += '<div style="font-size:10px;color:#333;margin-top:6px;">Editing requires host1.</div>';
|
||||
return html;
|
||||
}
|
||||
|
||||
function vvPtHostChanged(el) {
|
||||
el.classList.toggle('changed', el.value !== el.dataset.orig);
|
||||
const any = document.querySelector('.vv-pt-host-inp.changed');
|
||||
document.getElementById('vv-pt-hosts-save').style.display = any ? '' : 'none';
|
||||
}
|
||||
|
||||
// Stop the background media seed. Safe to press: rsync.sh runs --inplace --partial, so this
|
||||
// costs the file in flight and a later start resumes the share rather than restarting it.
|
||||
// Phase 3 — the media seed, as its own phase rather than the tail of an onboard. Routed through
|
||||
@@ -457,37 +422,6 @@ async function vvPtStopSeed(btn) {
|
||||
}
|
||||
}
|
||||
|
||||
async function vvPtSaveHosts(btn) {
|
||||
const changedEls = document.querySelectorAll('.vv-pt-host-inp.changed');
|
||||
if (!changedEls.length) return;
|
||||
const changes = [];
|
||||
changedEls.forEach(el => changes.push({key: el.dataset.key, file: el.dataset.file, type: el.dataset.type, value: el.value}));
|
||||
if (!await vvConfirm(`Save ${changes.length} host setting(s)?`)) return;
|
||||
btn.disabled = true; btn.textContent = '⟳ Saving…';
|
||||
fetch('/plugins/varaverk/api/confform.php', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
body: new URLSearchParams({
|
||||
csrf_token: typeof csrf_token !== 'undefined' ? csrf_token : '',
|
||||
id: '__settings__',
|
||||
changes: JSON.stringify(changes)
|
||||
})
|
||||
})
|
||||
.then(r => r.json())
|
||||
.then(d => {
|
||||
btn.disabled = false;
|
||||
if (d.ok) {
|
||||
changedEls.forEach(el => { el.dataset.orig = el.value; el.classList.remove('changed'); });
|
||||
btn.textContent = '✓ Saved';
|
||||
setTimeout(() => { btn.textContent = 'Save'; btn.style.display = 'none'; }, 2000);
|
||||
} else {
|
||||
btn.textContent = 'Save';
|
||||
vvAlert('Save failed: ' + (d.error ?? 'Unknown error'));
|
||||
}
|
||||
})
|
||||
.catch(e => { btn.disabled = false; btn.textContent = 'Save'; vvAlert('Error: ' + e); });
|
||||
}
|
||||
|
||||
// ── Array settings cards ───────────────────────────────────────────────────────
|
||||
|
||||
let _vvArrFiles = null;
|
||||
@@ -1465,12 +1399,6 @@ function _render(data) {
|
||||
// Config bar
|
||||
document.getElementById('vv-pt-config-body').innerHTML = _renderConfig(cfg);
|
||||
|
||||
// Host settings — always shown upfront
|
||||
const hostsCard = document.getElementById("vv-pt-hosts-section");
|
||||
hostsCard.style.display = nodes.length ? '' : 'none';
|
||||
document.getElementById('vv-pt-hosts-body').innerHTML = _renderHostSettings(nodes, isOwner);
|
||||
document.getElementById('vv-pt-hosts-save').style.display = 'none';
|
||||
|
||||
// Offline countdown warning
|
||||
_renderOfflineWarn(cfg);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user