Commit Graph

33 Commits

Author SHA1 Message Date
19cf25fb24 Editable Entra ids, machine maintenance and printer capabilities 2026-09-02 07:53:37 -04:00
8666e0271c Reciprocal controls links, dead chip links, and a resumable legacy import
The machine page now shows the PC that controls it. The endpoint was correct all
along and returned both directions; AssetTriageBand discarded every peer whose
type was not 'machine' and was mounted only on the PC page. The counterpart type,
label and relationship types are now props.

Fixed while adopting it more widely: every band chip linked to /assets/<id>, and
there is no such route. The resolver that AssetRelationships.vue kept privately
is now frontend/src/utils/assetRoute.js, used by both - and its type lookup is
case-insensitive, because seed data capitalises the type names while this site's
database does not.

The legacy import is now safe to resume. The 409-resolve asked for
per_page=10000 against a server that clamps to 100, so it silently searched the
first 100 rows and dropped links past that on every re-run. The crosswalk is now
bound to the database it describes, so one carried across a rebuild is refused
rather than attaching rows to the wrong assets. Source database names are
resolved from the environment, so the loader can be aimed without editing it.

Full suite 2178 passed, frontend 280 passed.
2026-08-29 19:09:06 -04:00
benjamin.baker
c001657582 Merge remote-tracking branch 'origin/main' into wilm
# Conflicts:
#	shopdb/__init__.py
2026-08-28 09:30:35 -04:00
benjamin.baker
01734e5449 harden CSV import reconciliation and preserve saved model selections
Default fuzzy reconcile threshold to 0 and refuse merges when digit runs differ so numbered labels like Bay 311 never bind to Bay 310. Keep edit forms from clearing saved model fields when category filtering hides untyped rows. Includes in-progress computers policy and endpoints command feature work.
2026-08-28 09:29:09 -04:00
5f069b1a5f Email report on every report page; kiosk long-name fix 2026-08-27 11:01:28 -04:00
benjamin.baker
3deff4f716 Merge remote-tracking branch 'origin/main' into wilm
# Conflicts:
#	frontend/src/views/settings/SiteSettings.vue
2026-08-27 05:45:52 -04:00
0738d71525 Guides image + draft gating, audit retention, ADR-015 gate, backup credential redaction 2026-08-26 15:08:53 -04:00
4e38303326 Tab titles name the record; Guides reach a site and the contract surface 2026-08-26 13:31:13 -04:00
benjamin.baker
3b3a7cf910 Fix location dropdowns silently truncating at the 100-row backend cap
The backend clamps perpage to MAX_PAGE_SIZE (100), so location selectors that requested a large page received only the first page and still got a 200. Late-alphabet locations (past ~C5W) simply went missing from every module's dropdown, and no error surfaced.

Add locationsApi.listAll, which pages through the full set via fetchAllPages, matching the established machines/printers pattern, and switch every location selector consumer to it.
2026-08-26 13:25:07 -04:00
benjamin.baker
c7828e7873 dynamically filter Make/Model selectors by asset category
The Add Computer, Add Machine, and Add Printer forms offered the entire model catalog and vendor list regardless of what was being added, so a PC could be pointed at a printer model and every vendor showed up whether or not it made that kind of thing. Scope each form to its own asset category so the selectors only present sensible choices.

Add a ?category= filter to GET /api/models that joins modeltypes and matches on category (Equipment, PC, Network, Printer), and include the model's category in the list response so the forms can distinguish types client-side. Untyped models are excluded, since a null category cannot satisfy the filter.

Each subtype form now loads only its category: PCForm requests category PC (servers, which are Network, stay out); MachineForm requests category Equipment, with the main Model dropdown hiding Controller-type models and the Controller dropdown showing only those; PrinterForm requests category Printer, which also fixes its Model list that previously showed the whole catalog.

Vendor dropdowns are derived from the loaded models: a form only offers vendors that actually have a model in its category. Each dropdown keeps the record's own saved vendor even if it falls outside that set, so editing an existing asset never drops its vendor.
2026-08-26 12:18:31 -04:00
74392ccad2 Only zero is empty, and the last day is worth reading 2026-08-21 11:57:17 -04:00
bbda5cbfe9 A supply nobody could read is unknown, not empty 2026-08-21 11:44:10 -04:00
65312c0502 Name the toner on the forecast, keep the number on the hover 2026-08-21 11:23:27 -04:00
04107ff8ab Search spelling suggestions across every list 2026-08-21 11:15:06 -04:00
5a58d33623 Fix what the last round of device fixes broke, and two dips it missed 2026-08-21 08:50:00 -04:00
ebb86ccf3b Blank asset numbers, contested device claims, and honest toner forecasting 2026-08-20 17:09:02 -04:00
09e9d5f047 Carry the level everywhere a position is drawn, and gate it per occurrence 2026-08-18 09:37:29 -04:00
ece0e15f03 Page past the 100-row cap in pickers and batch label sheets 2026-08-17 14:17:28 -04:00
fbd99041b0 Buildings and levels for the floor map, and make every identifier searchable 2026-08-17 13:03:54 -04:00
265ca2eb01 Security hardening, multi-site portability, and a documentation and API-surface sweep 2026-08-14 16:28:34 -04:00
376b8df0fb Shadow task fixes, asset link ids, backup verdict 2026-08-13 13:20:24 -04:00
70c5bced37 Shadow-mode client script and cutover doc correction 2026-08-13 11:23:27 -04:00
d32513727b Tech Tools section with a code generator, toner report that names the part, toner forecasting, warranty proof of cover, application uploads 2026-08-12 11:51:38 -04:00
07d390789a Modal overlay-close removed from data-entry; console menu grouped 2026-08-05 13:49:34 -04:00
50ac71d844 Qualify ambiguous Type labels 2026-08-05 10:33:47 -04:00
215d51e7df Model type shown only when it differs from the asset type 2026-08-05 10:16:21 -04:00
73940ae992 Vendor derived from catalog model; model type shown separately 2026-08-05 10:00:08 -04:00
a2cf109586 printer installer map + install-batch endpoint 2026-07-29 12:39:12 -04:00
a69ce80f86 fix: blank location dropdowns + require printer model 2026-07-29 09:08:01 -04:00
c355eaae43 printers low-toner alerts; geenforce display readiness + token scope-binding; air-gap docker deploy kit 2026-07-23 14:37:00 -04:00
cb9ede497d Kiosk entry input, gage lab tag column, model image subpath fix 2026-07-20 11:14:20 -04:00
de93b613cc ADR-013 Phase 4 complete: all plugin frontends self-contained + lint rule 2026-07-19 00:03:33 -04:00
d1592b84c7 ADR-013 Phase 4: all 13 plugin frontends relocated + staging machinery 2026-07-18 23:56:32 -04:00