Update samy.js
This commit is contained in:
174
samy.js
174
samy.js
@@ -261,8 +261,168 @@ async function fetchSites() {
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// Run Selected (main trigger)
|
||||
// Printer management (Devices tab)
|
||||
// =======================================================================
|
||||
let allPrinters = [];
|
||||
|
||||
// POST /getprinters with password from Devices tab
|
||||
async function fetchPrinters() {
|
||||
const pwdInput = document.getElementById("PrinterPassword");
|
||||
const pwd = pwdInput?.value;
|
||||
if (!pwd) {
|
||||
alert("Please enter the printer password.");
|
||||
return;
|
||||
}
|
||||
|
||||
const clientContainer = document.getElementById("printerClientContainer");
|
||||
const listContainer = document.getElementById("printerListContainer");
|
||||
const dropdown = document.getElementById("printerClientDropdown");
|
||||
const checkboxContainer = document.getElementById("printerCheckboxContainer");
|
||||
|
||||
if (dropdown) {
|
||||
dropdown.innerHTML = '<option disabled selected>Loading clients...</option>';
|
||||
}
|
||||
if (checkboxContainer) {
|
||||
checkboxContainer.innerHTML = "";
|
||||
}
|
||||
if (clientContainer) clientContainer.style.display = "none";
|
||||
if (listContainer) listContainer.style.display = "none";
|
||||
|
||||
try {
|
||||
const resp = await fetch("/getprinters", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ password: pwd }),
|
||||
});
|
||||
|
||||
if (!resp.ok) throw new Error("HTTP " + resp.status);
|
||||
|
||||
const data = await resp.json();
|
||||
allPrinters = Array.isArray(data) ? data : [];
|
||||
|
||||
if (!allPrinters.length) {
|
||||
alert("No printers returned for this password.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Build unique sorted ClientCode list
|
||||
const codes = [...new Set(allPrinters.map((p) => p.ClientCode))].sort();
|
||||
|
||||
dropdown.innerHTML = "";
|
||||
const defaultOpt = new Option("Select a client...", "", true, true);
|
||||
defaultOpt.disabled = true;
|
||||
dropdown.appendChild(defaultOpt);
|
||||
|
||||
codes.forEach((code) => {
|
||||
dropdown.appendChild(new Option(code, code));
|
||||
});
|
||||
|
||||
if (clientContainer) clientContainer.style.display = "block";
|
||||
} catch (e) {
|
||||
console.error("fetchPrinters error:", e);
|
||||
if (dropdown) {
|
||||
dropdown.innerHTML =
|
||||
'<option disabled selected>Error loading clients</option>';
|
||||
}
|
||||
alert("Failed to fetch printers. Check password and try again.");
|
||||
}
|
||||
}
|
||||
|
||||
function renderPrintersForClient(clientCode) {
|
||||
const container = document.getElementById("printerCheckboxContainer");
|
||||
const listContainer = document.getElementById("printerListContainer");
|
||||
if (!container) return;
|
||||
|
||||
container.innerHTML = "";
|
||||
|
||||
const printers = allPrinters.filter((p) => p.ClientCode === clientCode);
|
||||
|
||||
if (!printers.length) {
|
||||
container.textContent = "No printers found for this client.";
|
||||
if (listContainer) listContainer.style.display = "block";
|
||||
return;
|
||||
}
|
||||
|
||||
printers.forEach((p, idx) => {
|
||||
const id = `printer_${clientCode}_${idx}`;
|
||||
const label = document.createElement("label");
|
||||
label.style.display = "block";
|
||||
|
||||
const cb = document.createElement("input");
|
||||
cb.type = "checkbox";
|
||||
cb.id = id;
|
||||
|
||||
// stash all fields we might need later
|
||||
cb.dataset.clientCode = p.ClientCode;
|
||||
cb.dataset.profileName = p.ProfileName;
|
||||
cb.dataset.displayName = p.DisplayName;
|
||||
cb.dataset.location = p.Location;
|
||||
cb.dataset.address = p.Address;
|
||||
cb.dataset.printServer = p.PrintServer;
|
||||
cb.dataset.shareName = p.ShareName;
|
||||
cb.dataset.driverName = p.DriverName;
|
||||
cb.dataset.driverInfPath = p.DriverInfPath;
|
||||
|
||||
const nameText =
|
||||
p.DisplayName || p.ProfileName || "Unnamed printer";
|
||||
const locText = p.Location || "Unknown location";
|
||||
|
||||
label.appendChild(cb);
|
||||
label.appendChild(document.createTextNode(" "));
|
||||
label.appendChild(
|
||||
document.createTextNode(`${nameText} (${locText})`)
|
||||
);
|
||||
|
||||
container.appendChild(label);
|
||||
});
|
||||
|
||||
if (listContainer) listContainer.style.display = "block";
|
||||
}
|
||||
|
||||
async function installSelectedPrinters() {
|
||||
const container = document.getElementById("printerCheckboxContainer");
|
||||
if (!container) return;
|
||||
|
||||
const checked = container.querySelectorAll("input[type=checkbox]:checked");
|
||||
if (!checked.length) {
|
||||
alert("Please select at least one printer.");
|
||||
return;
|
||||
}
|
||||
|
||||
const selected = Array.from(checked).map((cb) => ({
|
||||
ClientCode: cb.dataset.clientCode,
|
||||
ProfileName: cb.dataset.profileName,
|
||||
DisplayName: cb.dataset.displayName,
|
||||
Location: cb.dataset.location,
|
||||
Address: cb.dataset.address,
|
||||
PrintServer: cb.dataset.printServer,
|
||||
ShareName: cb.dataset.shareName,
|
||||
DriverName: cb.dataset.driverName,
|
||||
DriverInfPath: cb.dataset.driverInfPath,
|
||||
}));
|
||||
|
||||
try {
|
||||
const resp = await fetch("/installprinters", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ printers: selected }),
|
||||
});
|
||||
|
||||
if (!resp.ok) throw new Error("HTTP " + resp.status);
|
||||
|
||||
const result = await resp.json().catch(() => null);
|
||||
|
||||
alert(
|
||||
`Requested installation for ${selected.length} printer(s).` +
|
||||
(result && result.Message ? "\n" + result.Message : "")
|
||||
);
|
||||
} catch (e) {
|
||||
console.error("installSelectedPrinters error:", e);
|
||||
alert("Failed to trigger printer install.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// =======================================================================
|
||||
// Run Selected (main trigger)
|
||||
// =======================================================================
|
||||
@@ -474,6 +634,18 @@ document.addEventListener("DOMContentLoaded", () => {
|
||||
}
|
||||
});
|
||||
|
||||
// printer dropdown
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const clientDropdown = document.getElementById("printerClientDropdown");
|
||||
if (clientDropdown) {
|
||||
clientDropdown.addEventListener("change", (e) => {
|
||||
const code = e.target.value;
|
||||
if (code) renderPrintersForClient(code);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// notify server on window close
|
||||
window.addEventListener("beforeunload", () => {
|
||||
fetch("/quit", { method: "GET", keepalive: true });
|
||||
|
||||
Reference in New Issue
Block a user