Commit Graph

40 Commits

Author SHA1 Message Date
da28ee9f33 Lean build: always ship core (manifest-less) frontends 2026-07-19 12:10:45 -04:00
384b8f7668 ADR-014 Phase 2: flask plugin prune-schema for lean per-site DBs 2026-07-19 11:39:51 -04:00
18d59f82c9 ADR-014 schema-lean investigation + idempotent create_plugin_tables 2026-07-19 00:36:54 -04:00
99025d10f0 ADR-013 Phase 5: lean per-site builds (build-site.sh + guards + CI) 2026-07-19 00:11:41 -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
d0c31d1c97 ADR-013 Phase 4: frontend staging + printedparts relocation 2026-07-18 23:43:39 -04:00
a9274d71e8 ADR-013 Phase 4: core-router surgery (plugin top-level routes) 2026-07-18 23:26:39 -04:00
fd2ab0ab1c ADR-013 Phase 3 complete: asset-panels + asset-presentation + map-overlays renderers 2026-07-18 23:10:27 -04:00
69922a4e16 ADR-013 Phase 3: asset-presentation search routing 2026-07-18 22:59:19 -04:00
c22d3a7c23 ADR-013 Phase 3: asset-panels renderer + full detail-page migration 2026-07-18 22:52:06 -04:00
72e3484497 ADR-013 Phase 3: generic asset-panels renderer (Path A) 2026-07-18 22:44:06 -04:00
197b51f2b3 ADR-013 Phase 2: import guard round-4 fix (init-less dir .py sibling) 2026-07-18 22:28:40 -04:00
bbd5224bcd ADR-013 Phase 2: import guard hardening (round-3 review fixes) 2026-07-18 22:12:27 -04:00
83a5ce79d9 ADR-013 Phase 2: meta_path import guard (re-review fix) 2026-07-18 21:47:40 -04:00
77ca2e0d2d ADR-013 Phase 2: enforcement + signed shelf + adopt (adversarial-review hardened) 2026-07-18 21:06:38 -04:00
0ff5edc553 ADR-013 Phase 1: signed plugin artifacts (pack/validate/keygen) 2026-07-18 20:22:07 -04:00
41f5dbf5e0 ADR-013 Phase 0: plugin lifecycle groundwork (validate, apply-profile, dependency fixes) 2026-07-18 18:08:48 -04:00
61514b61a8 Add Copilot custom instructions 2026-07-17 20:56:53 -04:00
199438cec9 Add flask seed demo sample data; widen settings.description to TEXT 2026-07-17 20:32:38 -04:00
f255de4097 Add cryptography dependency for MySQL 8 auth 2026-07-17 19:41:43 -04:00
cfa3d1da36 Standardize on Python 3.13 (matches prod 3.13.7) 2026-07-17 19:30:20 -04:00
2afb3027dd Docs audit fixes: kiosk code drift, PowerShell chains, links, leaks, CI auth 2026-07-17 18:06:02 -04:00
9757de50b1 Add GitHub Actions CI + Windows notes on developer docs; neutralize internal-host references 2026-07-17 15:13:35 -04:00
d046231d00 Dev setup: correct the hook claim, ship an opt-in committed hook
The naming check was documented as an auto-running pre-commit hook,
but .git/hooks is never cloned - a fresh clone had nothing and CI is
the real enforcement. Ship .githooks/pre-commit for opt-in local use.
2026-07-17 15:08:51 -04:00
e23a0fae2b Dev setup Windows-first + LF-pin shell scripts
PowerShell-first onboarding (most devs are on VS Code/Windows), a
Windows variant for the VS Code check task, and a .gitattributes rule
keeping shell scripts LF so Windows checkouts do not corrupt them.
2026-07-17 15:01:50 -04:00
6aaed7de42 Add development setup guide and shared VS Code config
Clone-to-first-change onboarding, plus .vscode launch/tasks/extensions
so F5 debugs the backend and a task runs both dev servers. Fix the
README manual path to run the backend on 5001 (the frontend proxies
there; the default 5000 loaded nothing).
2026-07-17 14:40:57 -04:00
365b0f2f69 printedparts: gage-lab asset tag + print-files redesign
The gage lab assigns real WJRP asset numbers: internal itemcode stays
auto-minted, a new optional unique gagelabtag carries the lab's number,
searchable and kiosk-resolved (scans and bare digits against either
identifier). Print files render as stacked revision cards instead of a
scrolling table.
2026-07-17 14:01:10 -04:00
444fcbd8b9 Dark mode: dropdown arrow no longer tiles across selects
The dark form-control override used the background shorthand, which
resets a select's repeat/position; restated as background-color plus
explicit no-repeat/position.
2026-07-17 13:37:25 -04:00
fce7937b9b Shopfloor feed resolves employee names live when none is stored
Photos already resolved at read time; names only came from the stored
column, so imports without the employee source showed bare SSOs. New
mode-aware display-name resolver backs a live fallback; stored names
still win.
2026-07-17 13:29:35 -04:00
4f77874f10 Floor-map previews honor the mount path
The uploaded-blueprint thumbnails used the raw setting value, which
404s under a subpath mount while the map itself worked. Wrap the
previews in withBase.
2026-07-17 11:43:07 -04:00
c89f4d398b GE monogram avatar fallback + per-page document titles
Users without a profile photo show the GE monogram (sidebar, employee
detail, directory thumbs). Document titles become
'<Facility> ShopDB - <Page>' so copied links and tabs identify the
page.
2026-07-17 11:31:39 -04:00
9ba20100de Employees: external photo base URL is a setting
External HR Picture values are relative paths; the resolver hardcoded
/static/employees/, but sites can serve photos from another host. New
employee_photo_base_url setting; blank keeps the old behavior.
2026-07-17 11:16:05 -04:00
6de329a390 Users: deleting a user clears their API tokens and detaches audit rows
Deleting any user who owned an API token or appeared in the audit log
hit the users FK and returned 500. Tokens are revoked outright; audit
history is kept but detached so the trail survives the account.
2026-07-17 10:54:48 -04:00
503c0cfcf4 printedparts: badge resolution honors the employee directory mode
At sites running the external HR directory the self-hosted table is
empty, so every kiosk badge fell to the deny policy. The resolver now
branches on employee_directory_mode: selfhosted reads the directory
table by SSO; external queries the HR directory, resolving PayNo
badges by their real PayNo column.
2026-07-17 10:39:12 -04:00
11c8d79ba4 Add the printedparts plugin: 3D-printed parts storefront and kiosk
Catalog with photos and append-only print-file revisions, a stock
ledger attributing every take/restock/adjust to a badge-resolved
employee, a touch kiosk (scan bin, scan badge, keypad quantity) with a
deliberately open decrement-only take endpoint, 1x0.5in CODE128 bin
labels, low-stock email alerts to selected users, roles, or addresses,
and stock/consumption/by-person reports with a cache-vs-ledger
reconcile. Ships disabled; enable per site. Contract 0.13.0 adds the
mailer and the User/Role models to the plugin surface.
2026-07-17 09:29:01 -04:00
2fda94f67a Forward real client IPs through waitress trusted-proxy flags
The X-Forwarded-For rewrite rule alone is not enough: waitress 2+
strips forwarded headers from untrusted proxies by default, so the app
still saw 127.0.0.1 with the rule active. Trust the loopback proxy and
consume x-forwarded-for on the waitress command line.
2026-07-16 15:27:45 -04:00
3003c0666c Scope dark-mode form and notification styles to the explicit theme
The form-control and notification-tint blocks applied on the OS
prefers-color-scheme alone, so a machine in OS dark mode leaked dark
widget styling into the app's explicit light theme - dropdown options
rendered near-black on black. Scope the rules to [data-theme=dark].
2026-07-16 15:11:36 -04:00
95cfa9e939 Fix bit(1) import coercion and subpath login redirect
The WJ import loader coerced MySQL bit(1) columns with bool(), which is
always true for the bytes pymysql returns; applications.isinstallable
and notifications.isshopfloor imported as 1 for every row. Route both
through the existing _truthy_bit helper. The loader also no longer
requires the employee source database: without it, notifications keep
the bare SSO and the verify stage skips the employee count.

Under a subpath mount, the session-expiry interceptor stored the
browser path (which includes the mount base) as the login redirect,
and the router applied its base again after login. Add stripBase()
and store base-free router paths; the login page also strips a stale
base from old bookmarked redirects.

Also point the external-plugin CI helper at the repo's GitHub URL.
2026-07-16 14:08:19 -04:00
a9d0dfff4a Initial import: shopdb-flask multi-site asset platform
Flask + Vue rewrite of the classic-ASP shopdb, built as a plugin
framework so sister GE Aerospace sites can adopt it. Product version
0.7.0-pre-0.8.0, plugin contract 0.11.0, 966 backend tests.

Key entry points:
- docs/INSTALL-WINDOWS-IIS.md - tested Windows + IIS install runbook
  (own-site and subpath deployment methods)
- docs/PILOT-DEPLOY.md - production pilot: stand up + import + verify
- docs/IMPORT-API.md - schema-agnostic legacy data import contract
- scripts/site_imports/wjf/ - West Jefferson reference import loader
- docs/adr/ - twelve accepted architecture decision records
2026-07-14 07:58:51 -04:00