Conversation
The contact and location leaves were absent from the operational datastore. Fetch each leaf from the running ds tool and inject into ietf-system:system. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Initial import of https://github.com/kernelkit/webui2 @ e344d3f Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Replace flat nav-section-header labels with collapsible <details>/<summary> accordion groups (Network, Wireless, VPN, Services, System). Groups default open; user state persists via localStorage. Tablet icon-only mode always shows all items regardless of open/closed state. Add badge-up/down/warning/info/neutral utility classes with full dark mode support, complementing the existing firewall-specific badge variants. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Anonymise the login page: generic "Login" title, lock icon instead of product logo — makes the device harder to fingerprint. Add a floating theme toggle button to the login page so users can switch theme before logging in (cycles auto→light→dark). Replace the four cluttered sidebar footer buttons (theme, download config, reboot, logout) with an always-visible topbar user menu. The dropdown shows the username, three theme options with a checkmark on the active one, download config, reboot, and logout. Refactor all handler page-data structs to embed PageData instead of repeating the four base fields, and add Username (sourced from the request context) so the topbar can display the logged-in user. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Drop the useless 768–1024px icon-only sidebar mode; everything up to 1024px now uses the hamburger overlay and full-width sidebar. Fix the user dropdown on touch devices: click now toggles aria-expanded so CSS-driven visibility works without hover. A document click listener closes the menu when tapping outside. Give the sidebar proper light/dark tokens instead of hardcoded dark values. Introduce --sidebar-hover-fg (primary in light, white in dark) so nav-link hover text is legible in both themes. Fix dropdown hover background using --border instead of --border-subtle, which had zero contrast against the surface in dark mode. Keep active nav link in sync with the current URL via JS so it updates correctly after htmx navigation instead of staying on the initial server-rendered page. Also, add YouTube-style progress when laoding pages that take time, e.g., Dashboard. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Replace the RAUC-centric firmware page with a cleaner layout: - Show software slots (primary/secondary) using their bootnames rather than internal RAUC slot names; filter to rootfs-class slots only - Add boot order display (mirrors `show software` in the CLI) - Show installed timestamp per slot (truncated to second precision) - Fix Booted flag comparison: compare against bootname not slot name - Lay out all three cards (Software, Install from URL, Upload & Install) in a responsive grid instead of full-width stacked sections Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Split the old monolithic Hardware card into dedicated Board, WiFi, and Sensors cards, matching the structure of `show system` / `show hardware` in the CLI: - System Information: add Current Time row, rename Firmware → Boot Partition - Board: model, manufacturer, Base MAC only (no sensors) - WiFi (new, conditional): all radios with supported bands, standards (11n/11ac/11ax), and max AP count; card spans 2 grid columns so the table never needs horizontal scroll - Sensors (new, conditional, collapsible): all hardware sensors grouped by parent component (SFP sub-sensors indent under sfp1/sfp2 headings); JS "Show more" button injected only when content overflows 300 px - Disk Usage: replaced wide multi-column table with a per-mount widget (path + % on one line, health bar, "X free of Y" below); health colour follows the same warn/crit thresholds as the memory bar - Fix humanKiB to output IEC units (MiB / GiB) with a space, matching the memory display style - Fix info-table th wrapping (width:1%; white-space:nowrap) - Fix JS collapsible init to run on DOMContentLoaded, not immediately in <head>, so scrollHeight check has a real DOM to inspect - CSS scroll-shadow on data-table-wrap: pure-CSS right-edge shadow indicates overflow without needing JS or a scroll listener - Equal-height grid rows via align-items:stretch; info-grid-span-2 for cards with wide tables Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Expandable detail row per key. Clicking the ▶ arrow left of the name unfolds a full-width row showing labeled key fields (Value / Public Key / Private Key) as word-wrapped monospace blocks (max-width: 72ch), making base64 data easy to read and copy. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Display interfaces in a hierarchical tree: bridge and LAG parent rows show a ▼ toggle in the tree column that collapses/expands their member ports. The vertical connector line disappears when collapsed. Member ports within each group are sorted alphabetically; loopback interfaces always appear first, the rest alphabetically. A ⚑ forwarding-flag column indicates which interfaces have IP forwarding enabled, fetched concurrently from ietf-routing:routing. The "Address" and "Detail" columns are replaced by a single "Data" column matching the CLI layout: IP addresses, VLAN id, WiFi SSID/mode, WireGuard peer count, etc. Table rows are top-aligned so interfaces with multiple addresses don't cause odd vertical centering on other cells; the two narrow icon columns (⚑ and tree) stay middle-aligned. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Add a zone-to-zone traffic matrix matching the CLI's traffic_flow logic: - HOST row/column always present; zone→HOST uses zone action + services (not policies), producing allow/conditional/deny verdicts correctly - Clicking a matrix cell shows a detail panel with the policy or zone reason for the verdict - Conditional (⚠) detection for zones with services or port-forwarding Enrich the policy and zone tables: - Immutable (built-in) policies flagged with ⚷ in column header and row - Policy rows show description as tooltip; sorted by priority - Zones table renamed "Host Services" column; Policies drops Priority column - Wide tables (Zones, Policies) span two grid columns like Dashboard WiFi Fix the info-grid layout: #content lacked width:100% so margin:0 auto was overriding flex stretch, collapsing the grid to a single column on both the firewall and dashboard pages. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Group nav items by purpose: - Security: Firewall, WireGuard, NACM - Services: Services, DHCP, NTP, LLDP, mDNS (moved from Network) - Network trimmed to: Interfaces, Routing, WiFi Rename Dashboard → Overview for clearer Status > System > Overview navigation hierarchy. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Implements the configure accordion section with a candidate datastore workflow: opening Configure copies running → candidate (Enter), each card saves directly to candidate, Apply copies candidate → running atomically, and Abort discards by resetting candidate from running. - RESTCONF client: add Put, Patch, Delete, GetDatastore, PutDatastore, CopyDatastore, and a shared doRequest/writeJSON helper - Handlers: ConfigureHandler (enter/apply/abort), ConfigureSystemHandler (hostname, clock, NTP, DNS, motd, editor), ConfigureUsersHandler (add/delete user, shell, password, SSH keys, NACM group membership) - Status > NACM page: read-only group permission matrix derived from ietf-netconf-acm groups + rule-list mappings - Sticky Apply/Abort toolbar with custom confirm dialog; server returns HX-Redirect:/ so HTMX does a full-page reload, keeping sidebar in sync - Accordion persistence fixed: Configure excluded from localStorage so it never auto-reopens after Abort/Apply; restore no longer closes an accordion that contains the active page - Password hashing by shelling out to mkpasswd(1) Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Navigating interfaces now work, and the tree follows the accordion style like the rest of the UI. Also, some updates to the curated pages: online help, lists of leafrefs instead of hard-coded list options. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Adds Configure > Routes page for viewing, adding, editing, and deleting IPv4 and IPv6 static routes. Each route row expands in-place to an edit form; YANG field descriptions are shown as ⓘ tooltips. Also fixes a goyang bug where inline augments inside a uses block were never applied to the expanded tree, making it so next-hop-address and outgoing-interface were missing from the schema — and therefore had no tooltip text. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Idea of wizard is to simplify: - Re-adding Ethernet interfaces you've accidentally removed - Setting up WiFi access point/station, incl. radio & PSK - VLAN filtering bridges Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Adds a per-user inactivity countdown that POSTs /logout after a configurable timeout (default 15 min, persisted in localStorage) and navigates to /login. Background pollers (watchdog, *counters refresh) are excluded from the activity reset so they don't keep the session alive indefinitely. htmx:responseError on 401 short- circuits straight to /login so a server-side expiration doesn't leave the UI failing silently. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
The errors.As(err, &rcErr) + StatusCode == http.StatusNotFound boilerplate was repeated across six handlers. Replace with the IsNotFound helper introduced in restconf/errors.go, dropping the now-unused errors import from each affected file along the way. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
The NTP page showed a red "Failed to fetch NTP data" banner whenever /data/ietf-ntp:ntp returned 404 — which is the normal RESTCONF response when NTP isn't configured at all. Treat 404 as the not-configured case and render the empty-state card with a Configure → link, mirroring the DHCP status page. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Mirrors the CLI's "show hardware" command — a single page that summarises everything ietf-hardware exposes about the device: - Board (chassis info: model, manufacturer, serial, base MAC) - USB Ports (state + description) - WiFi Radios (bands, standards, max-AP) - GPS Receivers - Sensors (grouped by parent component, all status values) - Other Components (fallback so the page is exhaustive) This is Phase 1 of webui-roadmap-v2. Phase 2 will trim the dashboard's Sensors card to a few key vitals with an "All sensors →" link here, fixing the existing height-clipping regression in the process. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Clicking a section header (Status / Configure / Maintenance) used to fold the previously-open section AND fire a click on the first page link inside the just-opened section. That meant going from "Status > Overview" to "Configure > Hardware" was three clicks worth of page loads: Configure header expands and lands you on Configure > Interfaces, then you click Hardware and wait again. Toggle now just expands or collapses its own section. Sibling sections stay open until a real page-link click, at which point updateActiveNav() already closes the others to leave only the section containing the active page open. Configure's enter-POST (running → candidate snapshot) still fires the first time the Configure accordion opens per page lifecycle, so the candidate datastore is ready by the time the user clicks a Configure page. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Five pages drew their per-row delete control as a bespoke <svg> "X" glyph instead of the icon-trash partial used by Hardware, Routes, Firewall, Interfaces and the yang tree fragments. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
The "Running config has unsaved changes" banner kept showing after a power cycle even though the device reloaded running from startup at boot. The cookie was just "1" with a 24-hour MaxAge, so the browser held on to it and the banner stayed up — but the state it referred to was long gone. Carry a unix timestamp in the cookie value (when set) and compare against a webuiStartTime captured at process start. Cookies whose timestamp predates this run are from a previous boot or webui restart; running was reloaded from startup since then, so they no longer describe reality and the banner must stay hidden. - Apply / Restore-to-running: cookie = now → banner shown. - Power cycle, page load: webuiStartTime > cookie ts → banner hidden. - Save / Apply-and-Save: cookie cleared (unchanged). - Legacy "1" / unparseable values: treated as stale. Also centre the "Device unreachable" connectivity banner past the sidebar on desktop — left:0 leaves its text drifting behind the sidebar's z-index. On ≤1024px the sidebar slides off-screen so the banner reclaims full width. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
renderSaveError lost the HX-Trigger header during the Configure-mode
fold, leaving forms with hx-swap="none" silent on validation errors.
Re-emit `{"cfgError":...}` so the toast layer still gets the event.
DeleteKey's response goes back to a bare 200 to match the other
configure_users.go endpoints; the activity-log redirect form belongs
on the Add/Edit flows.
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
First WebUI for Infix. Uses go + htmx as middleware, custom javascript for the frontend (atm.), and RESTCONF from the middleware to 127.0.0.1.
Based on kernelkit/webui2 by @mattiaswal
Screenshots
Checklist
Tick relevant boxes, this PR is-a or has-a: