Files
controls-web/controls-rework/docs/personal-dashboards.md
2026-02-17 09:29:34 -06:00

72 lines
4.6 KiB
Markdown

# Personal Dashboard Rollout
## Table: `user_tag_dashboards`
Purpose: capture per-user widget selections and configuration for upcoming personal dashboards. One row represents a single widget/tag on a personal page.
| Column | Type | Notes |
| --- | --- | --- |
| `id` | INT UNSIGNED PK | Auto-increment identifier. |
| `user_id` | INT | References `members.member_id`; cascades on delete/update. |
| `dashboard_key` | VARCHAR(64) | Allows multiple saved pages per user (e.g., `default`, `boilers`, `lab`). |
| `widget_type` | VARCHAR(32) | `trend`, `stat`, `gauge`, etc. Defaults to `trend`. |
| `panel_size` | VARCHAR(16) | Layout hint (`full`, `half`, `card`). |
| `position_index` | SMALLINT UNSIGNED | Zero-based ordering for rendering widgets. |
| `tag_name` | VARCHAR(255) | Historian/OPC tag identifier. |
| `display_label` | VARCHAR(255) | Optional friendly label shown on the UI. |
| `series_color` | VARCHAR(32) | Optional color override (hex/RGB). |
| `preferred_axis` | VARCHAR(16) | Left/right axis preference for trend widgets. |
| `update_interval_ms` | INT UNSIGNED | Polling cadence in milliseconds (default 5000). |
| `time_window_minutes` | SMALLINT UNSIGNED | Historical span for trend charts (default 180). |
| `rollup_function` | VARCHAR(16) | Server-side aggregation hint (`raw`, `avg`, `min`, `max`, `sum`, `delta`). |
| `scale_min` / `scale_max` | DECIMAL(14,4) | Optional manual bounds for chart scaling. |
| `threshold_low` / `threshold_high` | DECIMAL(14,4) | Alert thresholds for future highlighting. |
| `is_active` | TINYINT(1) | Soft delete flag; inactive rows stay archived. |
| `config_json` | LONGTEXT | Free-form JSON for extended configuration (annotations, alert styles, etc.). |
| `last_viewed_at` | DATETIME | Updated when a user loads the dashboard. |
| `created_at` / `updated_at` | TIMESTAMP | Audit columns managed by MySQL. |
### Indexing
- `uniq_user_dashboard_tag` ensures each user/dashboard/widget/tag combo is unique.
- `idx_user_dashboard` supports fast lookups while rendering the personal page.
> **FK note:** the `user_id` column is left signed (no `UNSIGNED`) so it matches the existing `members.member_id` definition in production. MySQL requires the parent and child column types to be identical (size and sign) for foreign keys to succeed.
### Seed Checklist
1. Run `sql/create_user_tag_dashboards.sql` in the LASUCA MySQL schema.
2. Insert starter rows for the pilot account (use your `members.member_id`).
3. Verify `SELECT * FROM user_tag_dashboards WHERE user_id = ?;` returns the seeded tags.
### Implemented
- Read endpoint: `data/personal/get_user_tags.php` returns active rows for the authenticated user and accepts an optional `dashboard` query parameter (defaults to `default`).
- Prototype personal page: `personal/dashboard.php` renders saved widgets, surfaces metadata, and links out to the live trend view.
## Table: `dashboard_row_catalog`
Purpose: master reference of displayable rows (friendly labels, units, rendering hints) that users can pin to their personal dashboard.
| Column | Type | Notes |
| --- | --- | --- |
| `id` | INT UNSIGNED PK | Auto-increment identifier. |
| `row_key` | VARCHAR(64) | Stable identifier used by code/user selections. Unique. |
| `friendly_name` | VARCHAR(255) | Picker label shown to users. |
| `source_type` | VARCHAR(32) | Data origin (`historian`, `mysql`, `computed`, etc.). |
| `source_id` | VARCHAR(128) | Identifier consumed by the source system (historian ID, OPC tag, etc.). |
| `unit` | VARCHAR(32) | Unit of measure (psi, %, °F, rpm, etc.). |
| `is_level_indicator` | TINYINT(1) | `1` = render with a level indicator/UI instead of plain numeric output. |
| `value_precision` | TINYINT UNSIGNED | Optional decimal precision hint. |
| `display_template` | VARCHAR(128) | Optional PHP include or template key for rendering the row. |
| `requires_include` | VARCHAR(128) | Name of prerequisite include (e.g., `items.php`). |
| `sort_order` | SMALLINT UNSIGNED | Default order when listing catalog entries. |
| `metadata_json` | LONGTEXT | Extra configuration (thresholds, grouping, color hints). |
| `created_at` / `updated_at` | TIMESTAMP | Audit columns managed by MySQL. |
Seed checklist mirrors the prior pattern:
1. Run `sql/create_dashboard_row_catalog.sql` in the LASUCA MySQL schema.
2. Insert catalog rows for each displayable metric (include unit/level flag).
3. Verify lookups via `SELECT * FROM dashboard_row_catalog ORDER BY sort_order, friendly_name;`.
### Next Steps
- Prototype a personal dashboard page that hydrates from the endpoint and renders the tags in slot order.
- Build write endpoints/UI for managing selections, expose threshold alerts, and support multiple dashboards via `dashboard_key`.