Webapp redesign phase 6: the remaining pages

Restyled to the same row pattern (one line, details in an expandable
body, one action plus a menu, tokens for light and dark):
- hardware coverage, audit log (family chips, destructive actions in
  red, client-side filters, first 300 rows), Clonezilla backups,
  enrollment packages (active package marked and undeletable, MCL flags
  with a visible legend)
- image Overview, OS and packages, Unattend (sticky save bar), Import
- Dell, iPXE, Blancco and BPRT update pages; Dell history links to the
  rollback review instead of rolling back on one click
- boot menu editor (tabs, rows with a menu, lint chips that jump to the
  line, tokens instead of hard-coded dark colours) and the imaging
  session detail page

Fixes found on the way:
- BPRT batch Activate never asked to confirm: a hidden input named
  'confirm' shadowed window.confirm in the inline handler, so the form
  submitted without a prompt. It now calls window.confirm.
- Backup upload refused when a backup with that name exists, unless
  'Replace the existing backup' is ticked (it overwrote silently).
- app.js: em dashes in comments replaced (plain ASCII).
This commit is contained in:
cproudlock
2026-10-14 14:29:03 -04:00
parent a6f95fcca1
commit fd00d5ff89
17 changed files with 3913 additions and 3130 deletions

View File

@@ -203,7 +203,7 @@ document.addEventListener('DOMContentLoaded', function () {
});
// -----------------------------------------------------------------------
// AutoLogon Enabled toggle — keep hidden input in sync
// AutoLogon Enabled toggle - keep hidden input in sync
// -----------------------------------------------------------------------
var autologonToggle = document.getElementById('autologonEnabledToggle');
if (autologonToggle) {
@@ -216,7 +216,7 @@ document.addEventListener('DOMContentLoaded', function () {
}
// -----------------------------------------------------------------------
// OOBE toggle switches — keep hidden input in sync
// OOBE toggle switches - keep hidden input in sync
// -----------------------------------------------------------------------
document.querySelectorAll('.oobe-toggle').forEach(function (cb) {
cb.addEventListener('change', function () {

View File

@@ -167,6 +167,8 @@
var rd = rawDirty();
var head = document.querySelector('.image-head');
if (head) head.classList.toggle('dirty', fd || rd);
var page = document.getElementById('unaPage');
if (page) page.classList.toggle('dirty', fd || rd);
if (reviewBtn) reviewBtn.disabled = !(fd || rd);
var now = sectionState(f);
var groups = {};
@@ -415,7 +417,7 @@
return box;
}
var bad = lint.new_errors > 0;
var a = el('div', 'alert mb-0 ' + (bad ? 'alert-danger' : 'alert-warning'));
var a = el('div', 'notice una-lintbox' + (bad ? ' bad' : ''));
a.appendChild(el('strong', '', bad
? 'This change adds ' + lint.new_errors + ' lint error' + (lint.new_errors === 1 ? '' : 's') +
' and will not be saved. One error invalidates the whole answer file for its pass.'
@@ -423,8 +425,8 @@
var ul = el('ul', 'una-lint-list');
lint.findings.forEach(function (f) {
var li = el('li');
li.appendChild(el('span', 'badge ' + (f.level === 'ERROR' ? 'badge-danger' : 'badge-warning'), f.level));
if (f['new']) li.appendChild(el('span', 'badge badge-info ms-1', 'new'));
li.appendChild(el('span', 'chip ' + (f.level === 'ERROR' ? 'c-err' : 'c-warn'), f.level));
if (f['new']) li.appendChild(el('span', 'chip c-edit', 'new'));
li.appendChild(document.createTextNode(' ' + f.message));
ul.appendChild(li);
});
@@ -462,7 +464,7 @@
if (!r.ok) { out.innerHTML = ''; fail(r.data.error || 'Preview failed.'); return; }
var n = PxeImage.renderDiff(out, r.data.files);
if ((mode === 'form' && rd) || (mode === 'raw' && fd)) {
out.insertBefore(el('div', 'alert alert-info',
out.insertBefore(el('div', 'notice info',
(mode === 'form' ? 'Your Raw XML edits are' : 'Your Form edits are') +
' not part of this save and are lost when the page reloads after it.'), out.firstChild);
}