Commit Graph

345 Commits

Author SHA1 Message Date
2326f8f096 USB kiosk: guest check-out/check-in without a login 2026-08-27 08:19:03 -04:00
benjamin.baker
d68c6db9ab fix endpoints plugin CI failures
Migration tests knew no endpoints head revision, so the parametrized guards raised KeyError. Register it in EXPECTED_HEAD_REVISION.

EndpointState declared lastreportedat both index=True and an explicit db.Index over the same column, and the baseline migration named single-column indexes differently from what create_all builds. On a pre-existing table the name-keyed guard could not see the create_all index and added a duplicate, tripping the idempotency guard. Drop the redundant declaration and rename migration indexes to ix_<table>_<column> to match.

endpoints was absent from the universal site profile, so the installer would not offer it and prune-schema would drop its tables at provisioning. Add it.

The agent design record lived under docs/, which is stripped to the public wiki and normally absent from the tree; a lone file there un-skipped the wiki-publish guards. Move it into the plugin.
2026-08-27 07:10:43 -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
benjamin.baker
8b1ba3c310 add endpoints plugin with fleet list view and monitoring drafts
Server-side RMM telemetry plugin: current-snapshot endpointstates plus append-only curated endpointevents, resolved to existing Computer assets by hostname. Adds ADR-010 asset panels (status, services, recent events), dashboard quiet and stability cards, and a minimal Fleet list view that links into existing PC detail pages. Registers the activity sidebar icon and a dev-only sample seeder. Ingest arrives on the generic collector route; the future C# agent design record lives in docs/DESIGN-DECISIONS-agent.md.
2026-08-27 05:41:06 -04:00
benjamin.baker
ce1fbd6d62 fix container healthcheck false negative and register endpoints tables
curl --fail exited nonzero on the login probe's 400 before the body reached grep VALIDATION_ERROR, so the healthcheck always failed and the container reported unhealthy while the app was fine. Drop --fail so grep decides pass/fail. Also register endpoint tables in PLUGIN_TABLE_OWNERS so plugin migrations can resolve their owned metadata.
2026-08-27 05:38:56 -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
801dfd54ab Merge remote-tracking branch 'origin/main' into wilm
# Conflicts:
#	shopdb/data/catalog.json
2026-08-26 12:53:03 -04:00
benjamin.baker
7cd3aadcd1 stop tracking docs/CSV-IMPORT-GUIDE.md
docs/ is generated and published to the wiki, not tracked in the product repo, and the docs publish/version tests skip when docs/ is absent. A single tracked file under docs/ made the directory exist in the CI checkout, so those tests ran against a near-empty folder and failed test_there_are_docs_to_check (needs >20 files) and test_the_map_itself_is_current (needs PROJECT-MAP.md). Untrack the guide and ignore it so it stays local-only and docs/ is absent in a fresh checkout, restoring the intended skip.
2026-08-26 12:48:38 -04:00
f221fba540 Guides: procedures written and read inside ShopDB 2026-08-26 12:42:24 -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
benjamin.baker
3cb15239dd curate shipped catalog and clarify subtype import docs
Rework the seed catalog from the cleaned live DB: dedupe Dell vendor/model rows, strip vendor names out of model numbers, add missing models, assign model types across printer and equipment lines, add a Controller type, and split a mashup HP LaserJet row into six real models. Now 44 vendors, 172 models, 173 modelsupplies. Also document that assets.csv needs its subtype file to appear in typed list views, and ignore devnotes/ scratch.
2026-08-26 11:55:05 -04:00
271d558f8b An unmeasurable backup must not hide a working one 2026-08-26 10:07:51 -04:00
benjamin.baker
0577e32240 add CSV import guide and clarify Azure export location
Adds a concise native-CSV import guide covering exact headers, required columns, foreign-key-by-name resolution, import order, and the do-not-edit rule for Azure/Thor exports. Also clarifies the Import Site Assets Azure card that Bulk operations lives in the top command bar of the group Members page, matching the Entra UI.
2026-08-25 17:12:01 -04:00
benjamin.baker
8fd0d725f7 pin computers migration head to azurefields after Entra field merge
The merge of the Entra device-identity work added computers 0002/0003 migrations, advancing the computers head past its anchor. Update the expected-head guard to match so upgrade-all stays green.
2026-08-25 16:53:51 -04:00
benjamin.baker
e2207f2e7c Merge remote-tracking branch 'origin/main' into wilm 2026-08-25 16:48:23 -04:00
benjamin.baker
bdef21da50 add Entra device identity to computers and Azure/Thor import sources
PC records now carry Entra/Azure device identity so imported machines keep a durable link back to their directory object instead of matching on hostname alone. Adds azuredeviceid, azureobjectid, and azuredevicecategory to the Computer model with matching migrations, surfaces them read-only in PCDetail as an Entra Device Info card, and lets PCForm edit the device id directly. The computers plugin registers a machineassetnumber import hook that reconciles PC-to-machine links during bulk import and warns on unresolved or conflicting relationships.

Adds importsources adapters that normalize Azure device-group and Thor PC inventory exports into canonical ShopDB CSVs via hostname alignment, exposes register_import_hook and RowWarning on the shopdb.api contract surface (contract 0.21.0), and refreshes the Import Site Assets page with clearer source instructions. Includes reconcile_locations maintenance script and coverage for the new import paths.
2026-08-25 16:46:00 -04:00
4a5d2122db Repair backup revisions that recorded a mapped drive 2026-08-25 15:00:57 -04:00
8e10584c4d Give the backups plugin a settings page, and show where a snapshot is 2026-08-25 14:53:13 -04:00
fa856c1f94 Judge a PC's backup by its stalest kind, not its newest 2026-08-25 13:56:53 -04:00
f1e265190e Let a share-backed backup say what is in it 2026-08-25 13:52:06 -04:00
c7fd00c225 One canonical name per vendor in the shipped catalog 2026-08-25 07:47:56 -04:00
benjamin.baker
f4d8868463 Merge remote-tracking branch 'origin/main' into wilm 2026-08-24 14:52:59 -04:00
1812def14f Catalog dedupe commands, and a seed catalog with no duplicate vendors or models 2026-08-24 14:49:54 -04:00
4fe4e91ae4 Maintenance scripts load .env, so they reach the site's real database 2026-08-24 14:32:38 -04:00
benjamin.baker
4a1b97362b Add site asset CSV import with fuzzy reconciliation
Sites seed inventory from the Asset Collector script or spreadsheet exports, but lookup names drift between sources (Dell vs Dell Inc.), which would otherwise create duplicate vendors/models/types on every import. The importer now normalizes and fuzzy-matches near-miss references onto existing lookup rows within an operator-set similarity threshold, auto-applying the match while reporting it for review so nothing merges silently. Operating systems and asset rows are never reconciled. Adds the dedicated Import Site Assets page with script/template download and a multi-file dry-run/commit workflow.
2026-08-24 14:29:02 -04:00
ead9fd6b56 Search results open the record they found; plugin scaffolder emits a prunable frontend 2026-08-24 14:06:14 -04:00
0398c55fb5 Warranty search finds a machine number; the collector can no longer set a printer assignment 2026-08-24 11:52:48 -04:00
f109dd1349 Plugin baselines skip tables that already exist 2026-08-24 09:28:52 -04:00
ce3a0f4338 Secure Send documented, and the machine form stops re-creating a controlling-PC link that already exists 2026-08-24 08:55:45 -04:00
b90d7a7051 Secure send settings page 2026-08-21 16:10:52 -04:00
ee1da0ffb8 Tech Tools reachable without a login 2026-08-21 16:02:52 -04:00
0b4a1db842 Secure send: guests by setting, and a custom view count 2026-08-21 15:53:42 -04:00
21af2731f3 site_base_url: say the subpath belongs in it 2026-08-21 15:27:32 -04:00
1dd8474ce4 Secret links: one mount, not two 2026-08-21 15:23:18 -04:00
627804535e Secret links carry the site URL and the mount path 2026-08-21 15:19:43 -04:00
94fd70391a Secure send: the pages a person actually touches 2026-08-21 15:11:04 -04:00
a01f5c1a83 Secure send moves into Tech Tools 2026-08-21 14:18:10 -04:00
4242028270 Secure send: hand somebody a password without leaving it in a chat window 2026-08-21 13:44:34 -04:00
2719589c6e Label generator: back-side codes, pictures, two-column layout, measurement guards 2026-08-21 12:38:08 -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
fdf3c51cb0 Hover mini-map marker in box coordinates 2026-08-21 10:20:38 -04:00
d26355cebb Hover mini-map marker, knowledge base search, and the label generator 2026-08-21 09:51:12 -04:00
980b2e8be3 Find a knowledge base article by words from different fields 2026-08-21 09:40:14 -04:00
44432c9b5a Label generator: gap, position and a back side 2026-08-21 09:09:14 -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