- Fix: sorting a software column stopped its filter listing apps
individually (the sort arrow written into the header changed the label
used to recognise list columns)
- "None" (nothing missing) is pinned to the top of the value list, so the
easy devices are one click away
- Software columns get "Documented" / "Undocumented" quick picks that
tick only apps with / without a knowledge-base article; documented apps
are marked in the list
- Custom View: remove Reset Filters / Reset Sort (Clear filters and the
column menus replace them); old saved filters are cleared since nothing
else could clear them
- Custom View column drag: a ghost of the column follows the cursor, the
column being moved is dimmed, and a line shows where it will land
Filters (web/excel-filter.js), modeled on Excel's AutoFilter:
- Every column header gets a dropdown: Sort A to Z / Z to A, Clear Filter
From "<column>", Search, a checkbox list of the column's values with
(Select All) and (Blanks), OK / Cancel. Values come from rows passing
the other columns' filters; filters on several columns combine. Tags
and software lists are split into individual items.
- The button shows a funnel when filtered and an arrow when sorted, and a
"Clear filters (n)" button appears beside the group's copy buttons
- Replaces the old per-column filter row (which also removes the gap
between header and filter rows); hooks the existing filter passes so
global search, counts and worker re-renders keep working
- Menus are fixed-position on <body>, so sticky headers and neighbouring
tables can't cover them; on phones they open as a bottom sheet
- Workbench stacks get the same menus (sorting done client-side)
- Custom View's filter icon opens the same menu
Layout:
- Sticky headers use separated borders so no hairline gap opens
- Phones/tablets: a sticky bar of column chips (with active counts and
"Clear all") opens the filter menus
- Custom View fills the page like the other views on desktop; it still
scrolls sideways when wide, with its header pinned under the group header
- Custom View on phones/tablets: a "Card fields" sheet to choose, order
and remove the fields shown on each card
Demo: first visit puts 6 PCs (one per migration stage) on the Workbench.
- Status tables: the whole header (column names + filters) sticks as one
block, tucked 1px under the group header, so no gap can open between
the rows; offsets use fractional heights
- Phones/tablets: the filter panel sticks under the group header too, and
is opaque and compact (three filters per row on phones)
- Custom View: fix the group header being pushed over the column header
(it lives inside the view's own scroll box); the column header now pins
to the top of that box on desktop, and the header strip sticks on phones
- All Devices: group title is "All Devices (N)" instead of "Missing
Software", matching the page title count
- Documentation fits the window on desktop: only the article list and the
article scroll; placeholder no longer says "from the left"
- Dialogs sit above the terminal dock so it can't cover their last rows;
page bottom padding follows the dock's measured height
- Status group headers ("Not Started (37)") stick under the top nav while
scrolling through their group, on every screen size
- On desktop the column header and filter rows stick beneath the group
header (table wrappers no longer clip them; these fixed-layout tables
never scroll sideways at desktop widths)
- layout.js measures the nav, group header and header row heights so the
sticky rows stack without gaps, re-measuring on re-render/resize/scroll
- Phones: the Advanced/Simple View button sits on its own line under the
device name instead of floating over the dialog content
- Rename mobile.css/js to layout.css/js now that they hold desktop rules
Sideways-scrolling tables only showed a few of the 11 columns at a time on
a phone or iPad. Below 1100px (where the nav already collapses) each row
now renders as a card: the device as the title and every other column as
a labelled line, one card per row on phones and two or more on tablets.
- web/mobile.js copies column names onto cells (data-label) for the cards
and re-applies them as the dashboard re-renders; no-op on wide screens
- Column filters fold behind a "Show filters" button with an active count
- Custom View keeps its sort/filter header as a strip of chips
- Terminal: Follow and the "your actions (simulated)" legend move into the
terminal window's title bar; tabs read "Server" / "Worker" on phones, so
LIVE, the legend and Follow are all visible on small screens
- Add the missing viewport meta tag; phones were rendering the desktop
layout at 980px and shrinking it
- Add web/mobile.css (all rules inside max-width media queries, so desktop
is unchanged):
- data tables keep readable column widths and scroll sideways in their card
- group headers wrap their copy buttons and stay put while tables scroll
- Tracked Devices cards and the Documentation sidebar stack vertically
- modals fit the screen below the fixed nav; Advanced View's three
columns stack and the dialog scrolls as one
- 16px inputs on phones so iOS doesn't zoom on focus
- Terminal bar: compact tabs and a dot-only LIVE indicator on narrow
screens, taller panel in phone landscape, tighter demo dialog
Remove all environment-specific data and make the dashboard adoptable
anywhere, then add a demo that runs the real PowerShell services.
- Strip cached device data, internal knowledge-base articles and
screenshots, server/site names and the old project notes; replace the
knowledge base with generic sample articles and diagrams
- Move every environment value into Config/usmt-dash.psd1
- Route all infrastructure access in the worker and Get-Software.ps1
through a provider (Providers/SCCM.ps1), with a config-driven asset
inventory view instead of a hard-coded custom class
- Add Providers/Demo.ps1: a deterministic simulated fleet whose
migrations progress in real time, and Demo/New-DemoData.ps1 to seed it
- Server: -Demo makes the API read-only; add get-config and get-logs;
serve static files only from web/, Documentation/ and an allowlist of
Data/ files with a path-traversal guard; gzip large responses
- Mirror both services' console output to Data/Logs via a Write-Host
proxy, and add a terminal panel to the dashboard that streams it
- Demo sandbox (web/demo/demo.js): visitor changes to tags, articles and
images are kept in the visitor's browser and echoed in the terminals;
nothing a visitor does reaches the server
- Vendor marked, highlight.js and html2pdf.js instead of loading CDNs
- Dockerfile and compose file for hosting the demo (Coolify-ready)