diff --git a/CHANGELOG.md b/CHANGELOG.md index f3afba0..504f719 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,70 @@ ADR-007 and ADR-002. ## [Unreleased] +## [0.11.3] - 2026-08-19 + +Fixes the last of the buildings-and-levels bugs, and brings the shop-floor +clients into the product: the collector reporter, EventSaver and a printer +assignment feature that lets a bay install its own printers. + +**Anyone on 0.11.0-0.11.2 should take this.** The hover preview reported "this +asset has a position but no level" for every asset, and the map PDF printed +markers from every floor onto one sheet. + +### Fixed + +- **Every hover mini-map said "no level".** When 0.11.0 gave LocationMapTooltip a + levelid, none of its seven call sites were taught to pass one - printer, + machine and PC detail, the toner report, enforcement reports, the warranty chip + and the dashboard cards. Two payloads behind them also emitted coordinates with + no level. +- **Map PDF export printed other floors' markers.** It plotted every filtered + asset onto one sheet, which is worse than the on-screen version was: nobody can + correct a sheet once it is printed and carried onto the floor. +- **The legacy import loader created undrawable markers**, sending mapleft/maptop + with no level at three call sites. That loader is the one still to run against + production. +- The build gate that should have caught all of this asked whether a FILE + mentions `levelid`, not whether each position does - one module emitted `mapx` + six times and `levelid` once and passed. It now checks per occurrence, covers + `scripts/`, and fails any Vue file that binds tooltip coordinates without a + level. + +### Added + +- **Printer assignment.** Printers belong to the MACHINE and reach whichever PC + controls it, so a reimaged or swapped PC comes back with the bay's printers and + nothing had to be saved off the old one. New `usesprinter` relationship type, + propagating through `controls` at read time; `GET /api/printers/for-host/` + for the client; `PUT /api/printers/assignments/for-asset/` to reconcile a + whole set in one call. +- **`printerdrivers.vendorid`**, so one row serves a make. HP and Xerox universal + drivers cover 41 of the reference site's 44 printers; binding a driver to a + single model meant 21 near-duplicate rows. Resolution is model, then vendor, + then the pre-vendorid name convention. +- **Client scripts** in `plugins/printers/client/`: stage a site's driver set + (`Install-ShopdbPrinterDrivers.ps1`, with `-TestOnly` for DSC), converge a + bay's queues (`Set-ShopdbPrinters.ps1`), and apply the per-user default + (`Apply-ShopdbDefaultPrinter.ps1`). +- **The collector reporter is in the repository** at + `plugins/computers/client/`, with no site in it, and the server generates a + copy carrying this site's URL and ranges: Settings > Computers > Asset + reporter, or `GET /api/computers/client-script`. The collector key is + deliberately never stamped into it. +- **EventSaver source** at `plugins/slides/client/`. The site UNC that was + compiled into it is gone; a missing ini now fails visibly rather than pointing + a new site at the reference site's file server. +- Settings: `computers_routableranges` (replaces two hardcoded VLANs) and the + buildings-and-levels admin gains editable width AND height. + +### Changed + +- The map editor accepts a click. Its handler was bound only if the map was + already a picker when it mounted, and the editor opens with nothing selected, + so placing a marker by hand was impossible for the life of the page. +- Global search orders every query before truncating, so the same search cannot + return a different subset twice. + ## [0.11.2] - 2026-08-17 Bug fixes for the buildings-and-levels work in 0.11.0, all found by using it. diff --git a/docs/PROJECT-MAP.md b/docs/PROJECT-MAP.md index 54c5925..bb14adc 100644 --- a/docs/PROJECT-MAP.md +++ b/docs/PROJECT-MAP.md @@ -11,7 +11,7 @@ never by editing this file. | series | value | governed by | |---|---|---| -| product `__version__` | `0.11.2` | ADR-007 | +| product `__version__` | `0.11.3` | ADR-007 | | plugin contract `__contract_version__` | `0.20.0` | ADR-002 | They move independently. A contract bump is not a release. @@ -34,7 +34,7 @@ with `flask plugin upgrade-all`. Both are needed on a deploy. | network | `network0003prefix` | | notifications | `notifications0005boardorder` | | printedparts | `printedparts0004txnrev` | -| printers | `printers0002supplyalerts` | +| printers | `printers0004drivervendor` | | slides | `slides0001anchor` | | usb | `usb0002dropmachineid` | | warranty | `warranty0002proof` | @@ -85,6 +85,6 @@ Manifest-less directories under `plugins/` are core frontend surface and always ## Size -- test functions defined: **1087** (parametrised cases collect higher) -- documented API paths: **276** (`docs/openapi.json`, regenerate with `scripts/gen_openapi.py`) +- test functions defined: **1113** (parametrised cases collect higher) +- documented API paths: **279** (`docs/openapi.json`, regenerate with `scripts/gen_openapi.py`) diff --git a/frontend/package.json b/frontend/package.json index 9d8352e..e3c1956 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "shopdb-frontend", - "version": "0.11.2", + "version": "0.11.3", "private": true, "type": "module", "scripts": { diff --git a/shopdb/__init__.py b/shopdb/__init__.py index 79b045d..c1457fc 100644 --- a/shopdb/__init__.py +++ b/shopdb/__init__.py @@ -63,7 +63,7 @@ __contract_version__ = '0.20.0' # plugin-contract version above are distinct series with independent # bump rules. Not part of the shopdb.api contract surface, so it is # not re-exported there. -__version__ = '0.11.2' +__version__ = '0.11.3' def create_app(config_name: str = None) -> Flask: