summaryrefslogtreecommitdiffstats
path: root/static/interface-renderer.js
diff options
context:
space:
mode:
authorPetri Hienonen <petri.hienonen@gmail.com>2025-09-28 16:25:48 +0300
committerPetri Hienonen <petri.hienonen@gmail.com>2025-09-28 16:25:48 +0300
commit38ac4db03560200df2517ed7e06e555828ce0a15 (patch)
tree7bd8cc7d08d352bea05490e81b230a9d418a8553 /static/interface-renderer.js
parent8489f1f83da5dcc5818401393b1f6a430eea677c (diff)
downloadnetwork-38ac4db03560200df2517ed7e06e555828ce0a15.tar.zst
Update
Diffstat (limited to '')
-rw-r--r--static/interface-renderer.js333
1 files changed, 192 insertions, 141 deletions
diff --git a/static/interface-renderer.js b/static/interface-renderer.js
index 8c01696..5145cf3 100644
--- a/static/interface-renderer.js
+++ b/static/interface-renderer.js
@@ -1,162 +1,213 @@
/* jshint esversion: 2024, module: true */
-import { Utils } from './utils.js';
-import { InterfaceState } from './enums.js';
+import { Utils } from "./utils.js";
/**
* Static Interface Renderer for displaying network interfaces
* @class InterfaceRenderer
*/
class InterfaceRenderer {
- /**
- * Render interface tabs
- * @static
- * @param {Array} interfaces - Array of interface objects
- * @param {Object} currentInterface - Current interface object
- * @returns {string} HTML string
- */
- static renderInterfaceTabs(interfaces, currentInterface) {
- if (!interfaces.length) {
- return '<div class="no-interfaces">No network interfaces found</div>';
- }
-
- const tabsHTML = interfaces.map(iface => {
- const state = Utils.getInterfaceState(iface);
- const stateClass = Utils.getStateClass(state);
- const stateText = Utils.getStateText(iface);
- const isActive = iface === currentInterface;
-
- return `
- <button class="interface-tab ${isActive ? 'active' : ''}"
+ /**
+ * Render interface tabs
+ * @static
+ * @param {Array} interfaces - Array of interface objects
+ * @param {Object} currentInterface - Current interface object
+ * @returns {string} HTML string
+ */
+ static renderInterfaceTabs(interfaces, currentInterface) {
+ if (!interfaces.length) {
+ return '<div class="no-interfaces">No network interfaces found</div>';
+ }
+
+ const tabsHTML = interfaces
+ .map((iface) => {
+ const state = Utils.getInterfaceState(iface);
+ const stateClass = Utils.getStateClass(state);
+ const stateText = Utils.getStateText(iface);
+ const isActive = iface === currentInterface;
+
+ return `
+ <button class="interface-tab ${isActive ? "active" : ""}"
data-interface="${Utils.sanitizeHTML(iface.Name)}">
${Utils.sanitizeHTML(iface.Name)}
<span class="interface-state ${stateClass}">${Utils.sanitizeHTML(stateText)}</span>
</button>
`;
- }).join('');
-
- return `<div class="interface-tabs-container">${tabsHTML}</div>`;
- }
-
- /**
- * Show detailed interface information
- * @static
- * @param {Object} iface - Interface object
- * @returns {string} HTML string
- */
- static showInterfaceDetails(iface) {
- const details = [
- InterfaceRenderer.renderDetailRow('Link File', iface.LinkFile),
- InterfaceRenderer.renderDetailRow('Network File', iface.NetworkFile),
- InterfaceRenderer.renderDetailRow('State', iface.State, Utils.getStateClass(Utils.getInterfaceState(iface))),
- InterfaceRenderer.renderDetailRow('Online State', iface.OnlineState),
- InterfaceRenderer.renderDetailRow('Type', iface.Type),
- InterfaceRenderer.renderDetailRow('Path', iface.Path),
- InterfaceRenderer.renderDetailRow('Driver', iface.Driver),
- InterfaceRenderer.renderDetailRow('Vendor', iface.Vendor),
- InterfaceRenderer.renderDetailRow('Model', iface.Model),
- InterfaceRenderer.renderDetailRow('Hardware Address', Utils.arrayToMac(iface.HardwareAddress)),
- InterfaceRenderer.renderDetailRow('MTU', iface.MTU ? `${iface.MTU} (min: ${iface.MTUMin ?? '?'}, max: ${iface.MTUMax ?? '?'})` : ''),
- InterfaceRenderer.renderDetailRow('QDisc', iface.QDisc),
- InterfaceRenderer.renderDetailRow('IPv6 Address Generation Mode', iface.IPv6AddressGenerationMode),
- InterfaceRenderer.renderDetailRow('Number of Queues (Tx/Rx)', iface.Queues ? `${iface.Queues.Tx ?? '?'}/${iface.Queues.Rx ?? '?'}` : ''),
- InterfaceRenderer.renderDetailRow('Auto negotiation', iface.AutoNegotiation ? 'yes' : 'no'),
- InterfaceRenderer.renderDetailRow('Speed', iface.Speed),
- InterfaceRenderer.renderDetailRow('Duplex', iface.Duplex),
- InterfaceRenderer.renderDetailRow('Port', iface.Port),
- InterfaceRenderer.renderDetailRow('Address', InterfaceRenderer.renderAddressList(iface.Addresses)),
- InterfaceRenderer.renderDetailRow('DNS', InterfaceRenderer.renderDNSServerList(iface.DNS)),
- InterfaceRenderer.renderDetailRow('NTP', iface.NTP),
- InterfaceRenderer.renderDetailRow('Activation Policy', iface.ActivationPolicy),
- InterfaceRenderer.renderDetailRow('Required For Online', iface.RequiredForOnline ? 'yes' : 'no'),
- InterfaceRenderer.renderDetailRow('Connected To', iface.ConnectedTo),
- InterfaceRenderer.renderDetailRow('Offered DHCP leases', InterfaceRenderer.renderDHCPLeases(iface.DHCPLeases))
- ].filter(Boolean).join('');
-
- return `<div class="interface-detail-grid">${details}</div>`;
- }
-
- /**
- * Render a detail row with abbreviations
- * @static
- * @param {string} label - Row label
- * @param {string} value - Row value
- * @param {string} [valueClass] - CSS class for value
- * @returns {string} HTML string
- */
- static renderDetailRow(label, value, valueClass = '') {
- if (!value) return '';
-
- const abbreviations = {
- 'MTU': 'Maximum Transmission Unit',
- 'QDisc': 'Queueing Discipline',
- 'Tx': 'Transmit',
- 'Rx': 'Receive',
- 'DNS': 'Domain Name System',
- 'NTP': 'Network Time Protocol',
- 'DHCP': 'Dynamic Host Configuration Protocol',
- 'MAC': 'Media Access Control',
- 'IP': 'Internet Protocol',
- 'IPv6': 'Internet Protocol version 6'
- };
-
- const abbrLabel = Object.keys(abbreviations).includes(label)
- ? `<abbr title="${abbreviations[label]}">${label}</abbr>`
- : label;
-
- return `
+ })
+ .join("");
+
+ return `<div class="interface-tabs-container">${tabsHTML}</div>`;
+ }
+
+ /**
+ * Show detailed interface information
+ * @static
+ * @param {Object} iface - Interface object
+ * @returns {string} HTML string
+ */
+ static showInterfaceDetails(iface) {
+ const details = [
+ InterfaceRenderer.renderDetailRow("Link File", iface.LinkFile),
+ InterfaceRenderer.renderDetailRow("Network File", iface.NetworkFile),
+ InterfaceRenderer.renderDetailRow(
+ "State",
+ iface.State,
+ Utils.getStateClass(Utils.getInterfaceState(iface)),
+ ),
+ InterfaceRenderer.renderDetailRow("Online State", iface.OnlineState),
+ InterfaceRenderer.renderDetailRow("Type", iface.Type),
+ InterfaceRenderer.renderDetailRow("Path", iface.Path),
+ InterfaceRenderer.renderDetailRow("Driver", iface.Driver),
+ InterfaceRenderer.renderDetailRow("Vendor", iface.Vendor),
+ InterfaceRenderer.renderDetailRow("Model", iface.Model),
+ InterfaceRenderer.renderDetailRow(
+ "Hardware Address",
+ Utils.arrayToMac(iface.HardwareAddress),
+ ),
+ InterfaceRenderer.renderDetailRow(
+ "MTU",
+ iface.MTU
+ ? `${iface.MTU} (min: ${iface.MTUMin ?? "?"}, max: ${iface.MTUMax ?? "?"})`
+ : "",
+ ),
+ InterfaceRenderer.renderDetailRow("QDisc", iface.QDisc),
+ InterfaceRenderer.renderDetailRow(
+ "IPv6 Address Generation Mode",
+ iface.IPv6AddressGenerationMode,
+ ),
+ InterfaceRenderer.renderDetailRow(
+ "Number of Queues (Tx/Rx)",
+ iface.Queues
+ ? `${iface.Queues.Tx ?? "?"}/${iface.Queues.Rx ?? "?"}`
+ : "",
+ ),
+ InterfaceRenderer.renderDetailRow(
+ "Auto negotiation",
+ iface.AutoNegotiation ? "yes" : "no",
+ ),
+ InterfaceRenderer.renderDetailRow("Speed", iface.Speed),
+ InterfaceRenderer.renderDetailRow("Duplex", iface.Duplex),
+ InterfaceRenderer.renderDetailRow("Port", iface.Port),
+ InterfaceRenderer.renderDetailRow(
+ "Address",
+ InterfaceRenderer.renderAddressList(iface.Addresses),
+ ),
+ InterfaceRenderer.renderDetailRow(
+ "DNS",
+ InterfaceRenderer.renderDNSServerList(iface.DNS),
+ ),
+ InterfaceRenderer.renderDetailRow("NTP", iface.NTP),
+ InterfaceRenderer.renderDetailRow(
+ "Activation Policy",
+ iface.ActivationPolicy,
+ ),
+ InterfaceRenderer.renderDetailRow(
+ "Required For Online",
+ iface.RequiredForOnline ? "yes" : "no",
+ ),
+ InterfaceRenderer.renderDetailRow("Connected To", iface.ConnectedTo),
+ InterfaceRenderer.renderDetailRow(
+ "Offered DHCP leases",
+ InterfaceRenderer.renderDHCPLeases(iface.DHCPLeases),
+ ),
+ ]
+ .filter(Boolean)
+ .join("");
+
+ return `<div class="interface-detail-grid">${details}</div>`;
+ }
+
+ /**
+ * Render a detail row with abbreviations
+ * @static
+ * @param {string} label - Row label
+ * @param {string} value - Row value
+ * @param {string} [valueClass] - CSS class for value
+ * @returns {string} HTML string
+ */
+ static renderDetailRow(label, value, valueClass = "") {
+ if (!value) return "";
+
+ const abbreviations = {
+ MTU: "Maximum Transmission Unit",
+ QDisc: "Queueing Discipline",
+ Tx: "Transmit",
+ Rx: "Receive",
+ DNS: "Domain Name System",
+ NTP: "Network Time Protocol",
+ DHCP: "Dynamic Host Configuration Protocol",
+ MAC: "Media Access Control",
+ IP: "Internet Protocol",
+ IPv6: "Internet Protocol version 6",
+ };
+
+ const abbrLabel = Object.keys(abbreviations).includes(label)
+ ? `<abbr title="${abbreviations[label]}">${label}</abbr>`
+ : label;
+
+ return `
<div class="detail-row">
<span class="detail-label">${abbrLabel}:</span>
<span class="detail-value ${valueClass}">${Utils.sanitizeHTML(value)}</span>
</div>
`;
- }
-
- /**
- * Render address list
- * @static
- * @param {Array} addresses - Array of addresses
- * @returns {string} Formatted addresses
- */
- static renderAddressList(addresses) {
- if (!addresses?.length) return '';
-
- return addresses.map(addr => {
- const ip = Utils.ipFromArray(addr);
- return ip ? `<div class="address-item">${Utils.sanitizeHTML(ip)}</div>` : '';
- }).join('');
- }
-
- /**
- * Render DNS server list
- * @static
- * @param {Array} dnsServers - Array of DNS servers
- * @returns {string} Formatted DNS servers
- */
- static renderDNSServerList(dnsServers) {
- if (!dnsServers?.length) return '';
-
- return dnsServers.map(dns => {
- const server = Utils.ipFromArray(dns.Address ?? dns);
- return server ? `<div class="dns-item">${Utils.sanitizeHTML(server)}</div>` : '';
- }).join('');
- }
-
- /**
- * Render DHCP leases
- * @static
- * @param {Array} leases - Array of DHCP leases
- * @returns {string} Formatted leases
- */
- static renderDHCPLeases(leases) {
- if (!leases?.length) return '';
-
- return leases.map(lease => {
- const ip = lease.IP ?? lease;
- const to = lease.To ?? lease.MAC ?? '';
- return `<div class="lease-item">${Utils.sanitizeHTML(ip)} (to ${Utils.sanitizeHTML(to)})</div>`;
- }).join('');
- }
+ }
+
+ /**
+ * Render address list
+ * @static
+ * @param {Array} addresses - Array of addresses
+ * @returns {string} Formatted addresses
+ */
+ static renderAddressList(addresses) {
+ if (!addresses?.length) return "";
+
+ return addresses
+ .map((addr) => {
+ const ip = Utils.ipFromArray(addr);
+ return ip
+ ? `<div class="address-item">${Utils.sanitizeHTML(ip)}</div>`
+ : "";
+ })
+ .join("");
+ }
+
+ /**
+ * Render DNS server list
+ * @static
+ * @param {Array} dnsServers - Array of DNS servers
+ * @returns {string} Formatted DNS servers
+ */
+ static renderDNSServerList(dnsServers) {
+ if (!dnsServers?.length) return "";
+
+ return dnsServers
+ .map((dns) => {
+ const server = Utils.ipFromArray(dns.Address ?? dns);
+ return server
+ ? `<div class="dns-item">${Utils.sanitizeHTML(server)}</div>`
+ : "";
+ })
+ .join("");
+ }
+
+ /**
+ * Render DHCP leases
+ * @static
+ * @param {Array} leases - Array of DHCP leases
+ * @returns {string} Formatted leases
+ */
+ static renderDHCPLeases(leases) {
+ if (!leases?.length) return "";
+
+ return leases
+ .map((lease) => {
+ const ip = lease.IP ?? lease;
+ const to = lease.To ?? lease.MAC ?? "";
+ return `<div class="lease-item">${Utils.sanitizeHTML(ip)} (to ${Utils.sanitizeHTML(to)})</div>`;
+ })
+ .join("");
+ }
}
export { InterfaceRenderer };