Quick version bump
This commit is contained in:
238
documentation/PROJECT__AE_Events_PressMgmt_Config_Cleanup.md
Normal file
238
documentation/PROJECT__AE_Events_PressMgmt_Config_Cleanup.md
Normal file
@@ -0,0 +1,238 @@
|
||||
# Project: Pres Mgmt Config Cleanup & Config UI
|
||||
|
||||
**Status:** Planning / Ready to Execute
|
||||
**Priority:** High (BGH conference in ~2 weeks; only one active event using pres_mgmt)
|
||||
**Created:** 2026-04-02
|
||||
**Related:** `TODO__Agents.md`, `PROJECT__Stores_Svelte5_Migration.md`
|
||||
|
||||
---
|
||||
|
||||
## Background
|
||||
|
||||
The `event.mod_pres_mgmt_json` config grew organically across several conferences
|
||||
(LCI, BGH, etc.) and has accumulated serious inconsistencies:
|
||||
|
||||
- Mixed `show__` and `hide__` prefixes for the same concepts
|
||||
- Some features have BOTH `show__foo` and `hide__foo` keys active simultaneously
|
||||
- Duplicate keys with different names (`file_purpose_option_kv` = `file_purpose_option_li`)
|
||||
- Dead config (`HOLD__*` prefix)
|
||||
- Type inconsistency (`label__person_external_id: false` vs `"LCI member ID"` string)
|
||||
- Keys in the DB not consumed by `sync_config__event_pres_mgmt()`
|
||||
- Bug: `label__session_poc_name_short` is read then immediately overwritten (line 970-972 in ae_events__event.ts)
|
||||
- `hide_launcher_link` / `hide_launcher_link_legacy` missing the `__` separator (inconsistent)
|
||||
- `show_content__presentation_description` uses a third naming convention
|
||||
- Admin must edit DB records directly to change config — error-prone
|
||||
|
||||
The local config (`events_loc.pres_mgmt`) is also tangled into the main `events_loc`
|
||||
persisted store which is part of the paused Svelte 5 migration.
|
||||
|
||||
---
|
||||
|
||||
## Goals
|
||||
|
||||
1. **Canonical config schema** — define a TypeScript interface for `mod_pres_mgmt_json`
|
||||
2. **Consistent naming convention** — one rule for all `show__`/`hide__` keys
|
||||
3. **New Svelte 5 store** — break out local pres_mgmt config from `events_loc`
|
||||
4. **Config UI** — admin page within pres_mgmt to manage the remote config
|
||||
5. **No more direct DB edits** for routine pres_mgmt configuration
|
||||
|
||||
---
|
||||
|
||||
## Convention Decision
|
||||
|
||||
**Rule: the prefix reflects the default state.**
|
||||
|
||||
| Prefix | Default | Use for |
|
||||
|--------|---------|---------|
|
||||
| `hide__` | `false` = visible | Features ON by default that can be turned off |
|
||||
| `show__` | `false` = hidden | Features OFF by default that can be turned on |
|
||||
|
||||
**Never have both `show__foo` and `hide__foo` for the same concept.**
|
||||
|
||||
- Visibility controls (codes, descriptions, POC, biography) → default visible → `hide__`
|
||||
- Opt-in features (access links, launcher, QR links) → default hidden → `show__`
|
||||
|
||||
---
|
||||
|
||||
## Canonical Remote Config Schema
|
||||
|
||||
`PressMgmtRemoteCfg` — the authoritative TypeScript interface for `event.mod_pres_mgmt_json`:
|
||||
|
||||
```typescript
|
||||
interface PressMgmtRemoteCfg {
|
||||
// System
|
||||
lock_config: boolean; // true = force remote→local sync (prevent user overrides)
|
||||
|
||||
// Labels (event-specific terminology overrides)
|
||||
label__person_external_id: string | null; // default: 'External ID'
|
||||
label__presenter_external_id: string | null; // default: 'External ID'
|
||||
label__session_poc_type: string | null; // e.g. 'champion', 'poc'
|
||||
label__session_poc_name: string | null; // e.g. 'Champion', 'Point of Contact'
|
||||
|
||||
// Codes (visible by default — hide to suppress)
|
||||
hide__location_code: boolean;
|
||||
hide__presentation_code: boolean;
|
||||
hide__presenter_code: boolean;
|
||||
hide__session_code: boolean;
|
||||
|
||||
// Session fields (visible by default)
|
||||
hide__session_description: boolean;
|
||||
hide__session_location: boolean;
|
||||
hide__session_msg: boolean;
|
||||
hide__session_poc: boolean;
|
||||
hide__session_poc_biography: boolean;
|
||||
hide__session_poc_profile_pic: boolean;
|
||||
|
||||
// Presenter fields
|
||||
hide__presenter_biography: boolean;
|
||||
|
||||
// Presentation fields
|
||||
hide__presentation_datetime: boolean;
|
||||
hide__presentation_description: boolean; // replaces show_content__presentation_description
|
||||
|
||||
// Opt-in features (hidden by default — show to enable)
|
||||
show__copy_access_link: boolean;
|
||||
show__email_access_link: boolean;
|
||||
show__launcher_link: boolean;
|
||||
show__launcher_link_legacy: boolean;
|
||||
|
||||
// Requirements
|
||||
require__presenter_agree: boolean;
|
||||
require__session_agree: boolean;
|
||||
|
||||
// Navigation/UI constraints
|
||||
limit__navigation: boolean;
|
||||
limit__options: boolean;
|
||||
|
||||
// File upload config
|
||||
file_purpose_option_kv: Record<string, {
|
||||
name: string;
|
||||
disabled?: boolean;
|
||||
hidden?: boolean;
|
||||
}> | null;
|
||||
|
||||
// Report visibility (key = report slug, value = true to hide)
|
||||
hide__report_kv: Record<string, boolean>;
|
||||
}
|
||||
```
|
||||
|
||||
### Keys Removed vs. Current DB Records
|
||||
|
||||
| Removed Key | Reason |
|
||||
|-------------|--------|
|
||||
| `file_purpose_option_li` | Duplicate of `file_purpose_option_kv` |
|
||||
| `HOLD__file_os_selection_option` | Dead/held feature |
|
||||
| `hide__copy_access_link` | Conflicts with `show__copy_access_link` — use `show__` |
|
||||
| `hide__email_access_link` | Conflicts with `show__email_access_link` — use `show__` |
|
||||
| `hide__launcher_link` | Conflicts with `show__launcher_link` — use `show__` |
|
||||
| `hide__launcher_link_legacy` | Conflicts with `show__launcher_link_legacy` — use `show__` |
|
||||
| `hide__report_li` | Superseded by `hide__report_kv` |
|
||||
| `show__navigation` | Ambiguous — covered by `limit__navigation` |
|
||||
| `label__session_poc_name_short` | Was a bug — never applied (overwritten immediately) |
|
||||
| `show_content__presentation_description` | Renamed to `hide__presentation_description` |
|
||||
|
||||
---
|
||||
|
||||
## New Svelte 5 Local Store
|
||||
|
||||
**Do NOT touch `events_loc` or the paused Svelte 5 migration.**
|
||||
Instead, create a standalone store for pres_mgmt local config.
|
||||
|
||||
**File:** `src/lib/stores/ae_events_stores__pres_mgmt.svelte.ts`
|
||||
|
||||
```typescript
|
||||
import { PersistedState } from 'runed';
|
||||
import { pres_mgmt_loc_defaults } from './ae_events_stores__pres_mgmt_defaults';
|
||||
|
||||
export const pres_mgmt_loc = new PersistedState('ae_pres_mgmt_loc', pres_mgmt_loc_defaults);
|
||||
// Usage: pres_mgmt_loc.current.hide__session_code
|
||||
```
|
||||
|
||||
- New localStorage key: `ae_pres_mgmt_loc` (separate from `ae_events_loc`)
|
||||
- Version gate: add `AE_PRES_MGMT_LOC_VERSION` to `store_versions.ts`
|
||||
- `sync_config__event_pres_mgmt()` writes to `pres_mgmt_loc.current` directly
|
||||
|
||||
Consumer syntax change:
|
||||
```
|
||||
BEFORE: $events_loc.pres_mgmt.hide__session_code
|
||||
AFTER: pres_mgmt_loc.current.hide__session_code
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Config UI Page
|
||||
|
||||
**Route:** `/events/[event_id]/(pres_mgmt)/pres_mgmt/config/`
|
||||
**Access:** `$ae_loc.manager_access` only
|
||||
**Button visibility:** Edit mode only (`$ae_loc.edit_mode`)
|
||||
|
||||
### Page behavior
|
||||
- Loads `event.mod_pres_mgmt_json` fresh from API on page open
|
||||
- Displays grouped form sections (see below)
|
||||
- Save = load → merge → PATCH `/v3/crud/event/{event_id}` with `{ mod_pres_mgmt_json: updated }`
|
||||
- The existing settings form at `/events/[id]/settings` has its pres_mgmt section removed or replaced with a link
|
||||
|
||||
### Form sections (grouped)
|
||||
|
||||
1. **System** — `lock_config`
|
||||
2. **Labels** — `label__*` fields (text inputs, nullable)
|
||||
3. **Session Visibility** — `hide__session_*` toggles
|
||||
4. **Presenter Visibility** — `hide__presenter_*` toggles
|
||||
5. **Presentation Visibility** — `hide__presentation_*` toggles
|
||||
6. **Code Visibility** — `hide__*_code` toggles
|
||||
7. **Opt-in Features** — `show__*` toggles
|
||||
8. **Requirements** — `require__presenter_agree`, `require__session_agree`
|
||||
9. **Navigation Limits** — `limit__navigation`, `limit__options`
|
||||
10. **File Purpose Config** — `file_purpose_option_kv` (JSON editor or structured form)
|
||||
11. **Report Visibility** — `hide__report_kv` (key-value toggles)
|
||||
|
||||
---
|
||||
|
||||
## Migration Path
|
||||
|
||||
Safe and backward compatible — old DB records fall through to `?? false` defaults.
|
||||
|
||||
1. No DB migration script needed — old keys are simply ignored by the updated sync function
|
||||
2. Active events (BGH) get updated via the new UI after it's built
|
||||
3. The `sync_config__event_pres_mgmt()` rewrite is the critical step — it must handle the
|
||||
canonical keys and clean defaults before the UI ships
|
||||
|
||||
---
|
||||
|
||||
## Implementation Steps
|
||||
|
||||
- [ ] **Step 1** — Define `PressMgmtRemoteCfg` TypeScript interface (new file or in `ae_events__event.ts`)
|
||||
- [ ] **Step 2** — New `ae_events_stores__pres_mgmt.svelte.ts` with `PersistedState`; add version gate to `store_versions.ts`
|
||||
- [ ] **Step 3** — Rewrite `sync_config__event_pres_mgmt()` in `ae_events__event.ts` to use canonical keys and write to the new store
|
||||
- [ ] **Step 4** — Build config UI page at `(pres_mgmt)/pres_mgmt/config/+page.svelte` (manager_access + edit_mode gated)
|
||||
- [ ] **Step 5** — Strip `ae_comp__event_settings_pres_mgmt_form.svelte` from settings page (or replace with a link to new page)
|
||||
- [ ] **Step 6** — Migrate all `$events_loc.pres_mgmt.*` references in pres_mgmt templates to `pres_mgmt_loc.current.*`
|
||||
- [ ] **Step 7** — Update BGH (and any other active events) via new UI
|
||||
- [ ] **Step 8** — `npx svelte-check` clean; commit
|
||||
|
||||
### Step 6 scope (mechanical find-replace)
|
||||
|
||||
The `$events_loc.pres_mgmt` pattern appears across:
|
||||
- `ae_comp__event_session_obj_li.svelte`
|
||||
- `ae_comp__events_menu_opts.svelte`
|
||||
- `session/[session_id]/+page.svelte`
|
||||
- `session/[session_id]/session_view.svelte`
|
||||
- `session/[session_id]/session_page_menu.svelte`
|
||||
- `locations/locations_page_menu.svelte`
|
||||
- `reports/+page.svelte`
|
||||
- `pres_mgmt/+page.svelte`
|
||||
- (and likely others — run `grep -r 'events_loc.pres_mgmt' src/` to get full list)
|
||||
|
||||
---
|
||||
|
||||
## Notes
|
||||
|
||||
- The `lock_config: true` default means most events will always sync from remote.
|
||||
This is intentional — it prevents presenter laptops from drifting into different configs.
|
||||
- `file_purpose_option_kv` may need a structured editor (not raw JSON) to be usable.
|
||||
Consider a simple key-value form row per purpose type for Phase 2.
|
||||
- QR link keys (`hide__presenter_qr_link`, `hide__session_qr_link`) appeared in LCI config
|
||||
but are not in the canonical schema above. Evaluate whether they're actively used before
|
||||
adding them back.
|
||||
- `limit__navigation` and `limit__options` are in the DB but not currently read by
|
||||
`sync_config__event_pres_mgmt()`. Confirm where they're consumed before adding to sync.
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "osit-aether-app-svelte",
|
||||
"version": "3.00.08",
|
||||
"version": "3.00.09",
|
||||
"description": "One Sky IT's Aether App created with Svelte, SvelteKit, Tailwind CSS, Lucide, Font Awesome, and Skeleton UI. -Scott Idem",
|
||||
"homepage": "https://oneskyit.com/",
|
||||
"private": true,
|
||||
|
||||
Reference in New Issue
Block a user