Commit Graph
23 Commits
Author SHA1 Message Date
Johan Sandoval 486b57cacb Demo popup: link the source repo, keep the buttons pinned on screen
The popup text now scrolls inside the card while the buttons stay at the
bottom, so phone visitors see 'Explore the dashboard' right away (it goes
first and full width on narrow screens). The card height uses dvh so the
top edge isn't cut off behind a phone's address bar.
2026-10-07 18:46:44 +00:00
Johan Sandoval b478604944 Add MIT license 2026-10-07 17:07:51 +00:00
Johan Sandoval 18dc8961e2 Docs refresh: README, in-app user guide, screenshots
- README: configuration table, every web module, corrected filter and live
  update wording, Data/ file list.
- Using USMT Dash article rewritten as a user guide: pages and addresses,
  tracking, device details, filtering, phones and tablets, tips.
- Screenshots retaken from the current build.
2026-10-07 16:24:14 +00:00
Johan Sandoval 4cc810adf5 Jump to the middle; bold jump arrows; Chicago time; demo hours 6 AM-9 PM
- Jump sheet: Top / Middle / Bottom with the Card fields arrows; the Jump
  button uses the same bold arrows.
- Container timezone defaults to America/Chicago (TZ in Dockerfile/compose).
- Demo worker follows its own business hours (Demo.BusinessHours, default
  06:00-21:00 every day) with the midnight pitstop; the simulated cycle in
  the browser shows the real worker's next run.
2026-10-06 22:16:58 +00:00
Johan Sandoval b0f700928e Phone Jump button; docs never scroll sideways; presence sweep timing kept
- Jump (phones / tablets): find a device by name and scroll to its card, or
  jump to a section, the top or the bottom of the page.
- Documentation on phones: long paths, links, code and tables wrap; toolbar is
  title, last edited, then the buttons.
- Filter bar's Clear is the only clear button on phones.
- Card fields: search box and add list as wide as the field rows.
- Presence sweep: the demo uses the hourly schedule too, and the last sweep
  time survives a worker restart (a restart used to trigger an extra sweep).
2026-10-06 22:01:43 +00:00
Johan Sandoval 9dc2d88726 Live updates during a cycle; Filter & sort dropdown on phones; layout polish
- Worker publishes the rows swept so far every few seconds (LivePublishSeconds)
  with a DataVersion stamp; the dashboard reloads on each new version, so
  tables, the Overview and open dialogs update mid-cycle. Shared files are
  written to a temp file and swapped in, so readers never see half a file.
- Phones / tablets: one Filter & sort button opens a column list instead of a
  row of chips, on every table.
- Details: a wrapped Simple / Advanced toggle sits on the left.
- Card fields: fixed-height dialog; field list and add list share it evenly.
2026-10-06 21:33:29 +00:00
Johan Sandoval 7242f8f8af Wider details dialog, Card fields dialog like device details, no sideways chip scroll
- Details dialog is wider so the device name is never cut off.
- Overview list rows use the USMT Status colors (row color, ping color).
- Workbench on phones: the stack header no longer sits over the device list.
- Card fields uses the device-details dialog frame; bolder arrows; x to remove.
- Filter chips wrap onto more lines instead of scrolling sideways.
2026-10-06 21:09:33 +00:00
Johan Sandoval 9c21567f6d Undocumented apps: per-device filter and wider device column; presence for Skip USMT
- Source Devices in the undocumented-apps list filters by device name, like
  the software columns; Devices and the action column take less room.
- Drop the one-click documented pick (Documented + Only ticked does it).
- Stage legend underline spans label and number.
- Device details title stays on one line; the name truncates instead.
- Presence sweep also pings devices under Skip USMT tags.
2026-10-06 20:49:58 +00:00
Johan Sandoval f72e39892c Page routes, Home link, documented-app filters, Overview colors and list fixes
- Every nav page has its own address (/tracked, /status, /devices, ...);
  the logo and name go to the Overview; back/forward work.
- List filters gain an "Only ticked" mode; software columns get a one-click
  "devices with only documented apps" pick and an easiest-first sort.
- Overview: the device list uses the dashboard's table header (sticky, with
  Excel filters); what opened it is clearly highlighted; locations colored by
  how much is done (red to green); stages read red / amber / green.
- Details: one-line title bar; presence and monitors only in Advanced View.
- Presence sweep pings only completed pairs (everything else is pinged by
  the sweep itself), hourly and at midnight.
- Custom View scrollbar smaller, in the table header blue.
- Docs: no sideways scroll in the article list; no blank lines around code.
2026-10-06 20:27:37 +00:00
Johan Sandoval e2125c760a Polish: nav fits at every desktop width, Custom View list values, phone docs, README 2026-10-06 19:38:42 +00:00
Johan Sandoval a5c0a5210e Knowledge base: /docs/<title> permalinks, search, categories, count, better PDF
Articles get their own address (shareable, back/forward work); the list is
searchable by title and text, shows the article count, and is grouped into
Applications and Troubleshooting & Guides via a hidden category line set
from the editor. PDF export lays out at page width with page breaks, a title
block and page numbers; Print uses the browser's vector print. Inline code
is a pill that glows blue on hover, blockquotes no longer squeeze, and
GitHub-style [!NOTE] alerts render. [[Badge]] syntax inside code spans is
left alone.
2026-10-06 19:31:19 +00:00
Johan Sandoval 514bc31566 Overview landing page: issue counters, progress, status, locations, deployment calendar 2026-10-06 19:25:05 +00:00
Johan Sandoval 7868948bfc Presence, AD/SCCM/DNS reasons, monitors, snapshots, new-device priority
Worker: pings every tracked device on a presence sweep (hourly in business
hours plus midnight) and records last online; inventory reports whether a
device was found in AD and SCCM; monitors from WmiMonitorID; snapshots of
the last reachable state replace "Cached"; newly tracked devices are swept
and published first; totals count source devices only; per-type timing in
Worker-State.

Front end: details dialog shows presence, reasons instead of N/A,
"Waiting for worker...", monitors and snapshot times, and refreshes in
place; Custom View gains Days Offline, Last Online, Found In and monitor
columns; manual pair changes show immediately; sync dialog shows timing by
type. Custom View gets a large scrollbar; "Exactly ticked" filter.
2026-10-06 19:09:49 +00:00
Johan Sandoval 50c2a18a68 Live-ghost column drag; "only" app filter; disk size / free space filters
Custom View column drag rewritten with pointer events (replacing native
drag-and-drop): grab a column by its grip or anywhere on its header (a
click still sorts); the real column slides into the slot it would land
in as a translucent striped ghost while a label follows the pointer.
Only the horizontal position decides the slot. Esc cancels; data
refreshes wait until the drop; wide tables scroll near the edges.

Filters:
- List columns (software, tags): "Has any ticked" / "Has only ticked"
  toggle - e.g. devices missing only Adobe Acrobat Pro
- Space columns: filter by disk size (221 GB, 442 GB, no reading) plus a
  free-space rule (any / at least N GB / less than N GB, default 20); sort
  by disk size or by free space (numeric, no reading last); header clicks
  cancel these sorts
- Menu controls no longer shrink when the menu is height-limited
2026-10-06 18:20:00 +00:00
Johan Sandoval 973ff592a4 Filter menus: None first, documented picks; Custom View drag preview
- 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
2026-10-06 18:03:33 +00:00
Johan Sandoval 318c59e610 Custom View: native sticky header, one-line Excel-style header; fixes
- Custom View header now uses the browser's sticky positioning like the
  other tables, so it no longer lags or bounces while scrolling. Because a
  sideways-scrolling box prevents sticky headers, the table is clipped and
  shifted sideways by a scrollbar pinned to the bottom of the window
  (shown only when the columns are wider than the page; trackpad,
  shift+wheel and touch swipes drive it too)
- Custom View header on one line like the other tables: drag grip, name,
  the combined sort/filter dropdown and copy icon (remove on hover)
- Workbench stack text boxes size to their contents on load and when the
  page is shown, not only while typing
- Demo sandbox waits for the worker's first sweep after a container
  restart instead of treating every device as unknown
2026-10-06 17:48:54 +00:00
Johan Sandoval b216ce43f2 Excel-style column filters, full-page Custom View, card field editor
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.
2026-10-06 17:24:55 +00:00
Johan Sandoval d24be4a2d6 Polish sticky headers, Custom View, docs page and dialogs
- 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
2026-10-06 16:58:05 +00:00
Johan Sandoval a85c22b2b9 Sticky status headers; fix floating details-view button on phones
- 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
2026-10-06 16:43:49 +00:00
Johan Sandoval 2cbb03894b Card layout for tables on phones and tablets; fit terminal bar
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
2026-10-06 16:29:23 +00:00
Johan Sandoval 5a7fd4f2df Make the dashboard usable on phones and tablets
- 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
2026-10-06 16:10:43 +00:00
Johan Sandoval c1b107e264 Polish terminal bar: centered chevron, legend dot, resume divider
- Replace the text triangle with an SVG chevron so it centers with the label
- Make the "your actions (simulated)" legend dot the same yellow as the
  markers on simulated lines
- When live worker output was held back during a visitor's simulated
  cycle, print a divider before flushing it so the jump is explained
2026-10-06 15:51:03 +00:00
Johan Sandoval 1c531bc2ab Generalize USMT Dash and add a containerized demo mode
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)
2026-10-06 15:20:43 +00:00