Feature work from the 2026-07 session: Settings IA - Replace the flat 27-card settings hub with a persistent two-pane shell (SettingsLayout.vue): grouped, searchable left rail + content pane. - Nest all settings/* routes under the shell via router post-processing; shared nav catalog in settingsNav.js. Group by asset class (PCs, Printers, Equipment, Network) so per-type settings stop scattering. Custom fields (core) - customfields + customfieldvalues tables (migration 7d14), CRUD API at /api/customfields, per-asset value get/save. - Settings management page + reusable CustomFieldsSection (detail) and CustomFieldsInputs (form) wired into all four asset types. Warranty (new plugin) - plugins/warranty: warranties + warrantyassets (migration 7d15), derived coverage status, provider abstraction (manual now; Dell/Lenovo/HP stubs). - API CRUD + per-asset panel + report buckets; WarrantyPanel on all four detail pages; Warranties management page; Warranty report + Reports card. - Seed warranty.* permissions. Printer drivers - printerdrivers table (migration 7d13) linked to printer models; drivers now surface on the matching printer's detail page. Other - PCDetail rebalanced (Network + Status + Warranty + custom fields on the right). - Rename PCs list "Features" column to "Remote Access"; fix badge hover underline. - Drop equipment islocationonly field. - Centralize asset-type label/route maps into utils/assetTypes.js. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
82 lines
3.0 KiB
Plaintext
82 lines
3.0 KiB
Plaintext
# shopdb-flask environment template.
|
|
#
|
|
# Copy to .env and fill in the values. .env is gitignored. ProductionConfig
|
|
# refuses to boot when SECRET_KEY, JWT_SECRET_KEY, DATABASE_URL, or
|
|
# CORS_ORIGINS are missing or use the dev defaults.
|
|
#
|
|
# See docs/DEPLOY.md for the full per-site deployment runbook.
|
|
|
|
# ---- Flask ----
|
|
FLASK_APP=wsgi.py
|
|
|
|
# Set to 'production' for live sites. Other valid values: 'development',
|
|
# 'testing'. Production triggers ProductionConfig.validate() at boot.
|
|
FLASK_ENV=production
|
|
|
|
# ---- Required secrets (production refuses to boot without these) ----
|
|
|
|
# Generate strong random values, e.g.:
|
|
# python -c "import secrets; print(secrets.token_urlsafe(64))"
|
|
SECRET_KEY=change-this-to-a-secure-random-string
|
|
JWT_SECRET_KEY=change-this-to-another-secure-random-string
|
|
|
|
# ---- Database (required) ----
|
|
|
|
# Format: mysql+pymysql://<user>:<password>@<host>:<port>/<database>?charset=utf8mb4
|
|
# In docker-compose, host is `db` (the service name).
|
|
# The ?charset=utf8mb4 keeps the connection on utf8mb4; create the database as
|
|
# utf8mb4 too (see docs/DEPLOY.md). Both must be utf8mb4 to match the schema.
|
|
DATABASE_URL=mysql+pymysql://shopdb:CHANGE_ME@db:3306/shopdb_flask?charset=utf8mb4
|
|
|
|
# ---- CORS (required, no wildcards in production) ----
|
|
|
|
# Comma-separated list of explicit origins permitted to call the API.
|
|
# Example for a single-host facility deploy:
|
|
# CORS_ORIGINS=https://shopdb.facility-a.example.com
|
|
# Wildcard '*' is rejected by ProductionConfig.validate().
|
|
CORS_ORIGINS=http://localhost:5173
|
|
|
|
# ---- JWT lifecycle (optional, defaults shown) ----
|
|
JWT_ACCESS_TOKEN_EXPIRES=3600
|
|
JWT_REFRESH_TOKEN_EXPIRES=2592000
|
|
|
|
# ---- Logging (optional) ----
|
|
LOG_LEVEL=INFO
|
|
|
|
# ---- docker-compose only ----
|
|
# These are read by docker-compose.yml; not used by the Flask app directly.
|
|
MYSQL_ROOT_PASSWORD=CHANGE_ME_ROOT_PASSWORD
|
|
MYSQL_PASSWORD=CHANGE_ME_APP_PASSWORD
|
|
MYSQL_PORT=3306
|
|
API_PORT=5001
|
|
|
|
# ---- Zabbix integration (optional, for printer supply monitoring) ----
|
|
ZABBIX_URL=
|
|
ZABBIX_TOKEN=
|
|
|
|
# ---- Per-plugin collector API keys (optional) ----
|
|
# Per ADR-006, each plugin can accept external collector input at
|
|
# /api/collector/<pluginname>. The framework checks
|
|
# COLLECTOR_API_KEY_<PLUGINNAME> first, then COLLECTOR_API_KEY as fallback.
|
|
# COLLECTOR_API_KEY=
|
|
# COLLECTOR_API_KEY_COMPUTERS=
|
|
|
|
# ---- Employee directory database (optional, read-only) ----
|
|
# Separate HR/employee lookup DB consumed by the notifications plugin and the
|
|
# public shopfloor kiosks. Leave unset if the feature is not used; there is no
|
|
# safe default for the password, so an unset password fails loud.
|
|
# EMPLOYEE_DB_HOST=
|
|
# EMPLOYEE_DB_USER=
|
|
# EMPLOYEE_DB_PASSWORD=
|
|
# EMPLOYEE_DB_NAME=wjf_employees
|
|
|
|
# ---- cmmc_usb database (USB check-in/out) ----
|
|
# Separate read-write MySQL DB used by the USB plugin to track device
|
|
# check-in/out, lockers, and the check-in/out log. Leave unset if the feature
|
|
# is not used; there is no safe default for the password, so an unset password
|
|
# fails loud.
|
|
# CMMC_USB_DB_HOST=
|
|
# CMMC_USB_DB_USER=
|
|
# CMMC_USB_DB_PASSWORD=
|
|
# CMMC_USB_DB_NAME=cmmc_usb
|