From b202c6b52de7b7a99c9cbc0b38f9641392bd602e Mon Sep 17 00:00:00 2001 From: tayloraj10 Date: Tue, 14 Jul 2026 19:52:02 -0400 Subject: [PATCH 01/13] Update docs, README, and project config Adds implementation-progress and resource-review-flow-scoping docs, refreshes the README, and tweaks Biome/CI/.gitignore config. --- .github/workflows/pull_request.yml | 2 +- .gitignore | 1 + README.md | 49 +++- ...t 2026-07-07 at 8.06.36\342\200\257PM.png" | Bin 0 -> 140635 bytes biome.json | 3 +- docs/implementation-progress.md | 260 ++++++++++++++++++ docs/resource-review-flow-scoping.md | 191 +++++++++++++ 7 files changed, 492 insertions(+), 14 deletions(-) create mode 100644 "Screenshot 2026-07-07 at 8.06.36\342\200\257PM.png" create mode 100644 docs/implementation-progress.md create mode 100644 docs/resource-review-flow-scoping.md diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 2f16260..0411bae 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -16,6 +16,6 @@ jobs: - name: Setup Biome uses: biomejs/setup-biome@v2 with: - version: latest + version: 2.3.14 - name: Run Biome run: biome ci . diff --git a/.gitignore b/.gitignore index f25ae95..b494fc6 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ # React Router /.react-router/ /build/ +/docker/build/ diff --git a/README.md b/README.md index 1d02163..d0c1af2 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,12 @@ This is the admin dashboard for the [PHLASK](https://github.com/phlask/phlask-ma ## Key Features +- Authenticate via Supabase (login, password reset, email confirmation) - View and manage resources from the Supabase database - Review and approve/reject suggested edits to resources - View and resolve reports on resources - View resource changelogs and roll back changes if needed +- Light/dark theme support ## Getting Started @@ -65,23 +67,46 @@ Replace 3000:3000 with the actual port your application listens on if it is diff app/ ├── api/ │ ├── resources/ -│ │ └── methods.ts # API methods related to resources -│ ├── client.ts # API client setup -│ └── types.ts # Shared API request/response types +│ │ └── methods.ts # API methods related to resources +│ ├── resource-revisions/ +│ │ └── methods.ts # API methods related to resource revisions/changelogs +│ ├── client.server.ts # Supabase client setup (server-side) +│ └── types.ts # Shared API request/response types ├── assets/ -│ └── PHILASK_v2.svg # Static assets (logos, images, etc.) +│ └── PHILASK_v2.svg # Static assets (logos, images, etc.) +├── components/ +│ ├── ThemeToggle.tsx # Light/dark theme toggle control +│ └── WaveDivider.tsx # Decorative UI component ├── constants/ -│ └── db.ts # Database-related constants/config +│ └── db.ts # Database-related constants/config +├── context/ +│ └── user.ts # Authenticated user context +├── middleware/ +│ └── auth.ts # Route authentication middleware ├── routes/ -│ ├── _layout.tsx # Shared layout for route pages -│ ├── dashboard.tsx # Dashboard page component +│ ├── authenticated/ # Routes that require a logged-in user +│ │ ├── reviews/ # Review & approve/reject suggested edits +│ │ ├── _layout.tsx +│ │ ├── dashboard.tsx +│ │ └── logout.tsx +│ ├── unauthenticated/ # Public auth routes (login, password reset, etc.) +│ │ ├── _layout.tsx +│ │ ├── login.tsx +│ │ ├── forgot-password.tsx +│ │ ├── reset-password.tsx +│ │ └── confirm.tsx +├── schemas/ +│ └── *.ts # Zod schemas for auth forms +├── theme/ +│ ├── theme.ts # MUI theme configuration +│ └── ThemeModeProvider.tsx # Light/dark theme context provider ├── types/ -│ └── ResourceEntry.ts # Domain-specific TypeScript types +│ └── ResourceEntry.ts # Domain-specific TypeScript types ├── utils/ -│ └── distance.ts # Distance calculation utilities -├── app.css # Global application styles -├── root.tsx # App root component / Entry point -└── routes.ts # Route definitions and router configuration +│ └── distance.ts # Distance calculation utilities +├── app.css # Global application styles +├── root.tsx # App root component / Entry point +└── routes.ts # Route definitions and router configuration ``` ## How to Contribute / Next Steps diff --git "a/Screenshot 2026-07-07 at 8.06.36\342\200\257PM.png" "b/Screenshot 2026-07-07 at 8.06.36\342\200\257PM.png" new file mode 100644 index 0000000000000000000000000000000000000000..81ced280bf73eb8972e73c056f659797bb590fe8 GIT binary patch literal 140635 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Μ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 literal 0 HcmV?d00001 diff --git a/biome.json b/biome.json index 58f2367..5a9649f 100644 --- a/biome.json +++ b/biome.json @@ -25,7 +25,8 @@ "enabled": true, "rules": { "recommended": true - } + }, + "includes": ["**", "!app/assets/**"] }, "css": { "assist": { diff --git a/docs/implementation-progress.md b/docs/implementation-progress.md new file mode 100644 index 0000000..d73352f --- /dev/null +++ b/docs/implementation-progress.md @@ -0,0 +1,260 @@ +# Implementation Progress + +Running log of build work, piece by piece. Companion to +`resource-review-flow-scoping.md` (which scopes the review/moderation flow +itself) — this doc tracks whatever's actively being built, including +prerequisite work like auth that isn't part of that scoping doc. + +## 2026-07-07 — Login / auth pages redesign + +**Status:** Done. + +**What changed:** +- `app/routes/unauthenticated/_layout.tsx` — replaced the reused + dashboard-sidebar shell with a centered auth-card layout (logo above a + bordered `Paper`-style card), standard pattern for auth screens instead of + a half-populated dashboard sidebar. +- `app/routes/unauthenticated/login.tsx` — added a password visibility + toggle, an MUI `Alert` for Supabase sign-in errors (was a plain caption), + and a "Forgot password?" link. +- Added a full forgot-password flow, since Supabase auth makes it nearly free + and it's a standard expectation for a login page: + - `app/routes/unauthenticated/forgot-password.tsx` — request form, calls + `client.auth.resetPasswordForEmail`. Always shows a generic "check your + email" confirmation regardless of whether the address exists, to avoid + user enumeration (this is also just how Supabase's API behaves). + - `app/routes/unauthenticated/confirm.tsx` — loader-only route. Supabase's + SSR client uses the PKCE flow (`flowType: "pkce"`), so the recovery email + link lands here with a `?code=` param; this route exchanges it for a + session via `exchangeCodeForSession` and redirects to `reset-password`. + - `app/routes/unauthenticated/reset-password.tsx` — new-password form + (with confirm field + visibility toggle), calls `client.auth.updateUser`. + Requires an active (recovery) session — loader redirects to + forgot-password if there isn't one. +- New schemas: `app/schemas/forgot-password.ts`, `app/schemas/reset-password.ts`. +- `app/routes.ts` — registered `forgot-password`, `confirm`, `reset-password` + under the existing `/auth` layout. + +**Decisions made along the way:** +- After a successful password reset, the user lands signed in and is + redirected straight to `/` rather than being forced to log in again — + matches Supabase's own recommended pattern (the recovery session becomes a + normal session once `updateUser` succeeds). +- Kept the existing `remix-forms` / `composable-functions` / zod pattern used + by the original login page rather than introducing a different form + approach, for consistency. + +**Verified:** +- `pnpm typecheck` and `pnpm biome check` clean. +- Dev server smoke-tested via curl: `/auth`, `/auth/forgot-password` render + 200; `/auth/reset-password` and `/auth/confirm` correctly redirect to + `/auth/forgot-password` when there's no recovery session/code; submitting + bad credentials to the login action surfaces "Invalid login credentials" + through the new Alert; submitting the forgot-password form renders the + "Check your email" confirmation state. +- Not yet verified visually in an actual browser (no browser automation tool + available in this session) — worth a manual pass before merging. + +**Not done / explicitly out of scope for this pass:** +- Rate-limit/lockout-specific error copy (deferred per your answer). +- Any changes to the `VerificationButton` bypass or other items from + `resource-review-flow-scoping.md` §8 — unrelated to this piece. + +## 2026-07-07 — Resource edit review dashboard + +**Status:** Done (approve/reject only — no propagation to `resources` yet, by design). + +**Source-of-truth discovery:** the scoping doc's proposed schema +(`resource_submissions` etc.) doesn't exist yet — you pointed me at the +actual live table, `resource_revisions`, which already exists in Supabase. +Since there's no `information_schema` access via the publishable key, I +reverse-engineered its real shape via probing inserts/selects against the +REST API directly (and cleaned up the throwaway test rows after). Findings, +which differ from the scoping doc and are worth knowing for later phases: + +- `resource_revisions` is shaped exactly like `resources`/`ResourceEntry` + (same columns: `name`, `resource_type`, `address`, `water`/`food`/etc.) — + it's a full proposed snapshot, not a sparse diff. +- No `submission_type` (NEW vs EDIT) column exists. Every row has a + required, FK-enforced link to an existing resource (see below), so this + table currently only models **edits to existing resources**, not + brand-new resource submissions. +- The FK to `resources.id` is the confusingly-named `mapped_resources` + column (plural, has the FK constraint). There's *also* a `mapped_resource` + (singular) int column that's required (NOT NULL) but has no FK and isn't + used by this feature — looks like schema cruft, left untouched. +- `status` is free text (no DB-level CHECK constraint) — this build treats + it as `'PENDING' | 'APPROVED' | 'REJECTED'` by convention. Note this + column does double duty awkwardly: on `resources` the same column name + means operational status (OPERATIONAL/HIDDEN/etc.), but on + `resource_revisions` it means review status — there's no separate column + for "what operational status is being proposed." +- No `reviewed_by`, `reviewed_at`, or `rejection_reason` columns — reject + is a bare status flip, no reason is captured today. +- `resources.id` / `resource_revisions.id` are plain integers, not uuids + (despite `ResourceEntry.id` being typed `string` — pre-existing type/DB + mismatch, not something this change touches). +- The table is currently empty in the live DB (phlask-map doesn't write to + it yet, consistent with the scoping doc's §2 finding that "Suggest Edit" + is still a TODO there). + +**What changed:** +- `app/types/ResourceRevision.ts` — new type, `ResourceEntry` shape minus + `id`/`status`, plus `id: number`, `mapped_resource`/`mapped_resources: + number`, and `status: RevisionStatus`. +- `app/api/resource-revisions/methods.ts` — `getList` (optionally filtered + by status, newest first), `getById`, `updateStatus`. +- `app/routes/authenticated/reviews/index.tsx` — queue page. Lists + `PENDING` revisions in a sortable table (`@tanstack/react-table`, per the + scoping doc's suggestion — first real use of that dependency), joined + against `resources` for a human-readable "existing resource" label. + Row click routes to the detail page. Handles the empty-queue state. +- `app/routes/authenticated/reviews/detail.tsx` — detail/diff page. Loads + the revision plus its mapped `resources` row, renders a field-by-field + table (Current vs Proposed) highlighting changed fields. Approve/Reject + buttons post to the route's own action, which just flips + `resource_revisions.status` — per your instruction, does **not** touch + the live `resources` row or write any history yet. Handles the case + where the mapped resource no longer exists. +- `app/routes.ts` — registered `reviews` (index) and `reviews/:id` (detail) + under the authenticated layout. +- `app/routes/authenticated/_layout.tsx` — added a "Reviews" nav link. + +**Decisions made along the way (flagging per your "design questions" carve-out):** +- Approve/Reject currently only updates `resource_revisions.status`. It does + **not** write to `resources` or any history table — matches your explicit + "don't worry about sending approved reviews anywhere for now." This means + approving something here has no visible effect on the live map yet; that + wiring is future work once the target (`resources` update? new + `resource_history` table? something else?) is decided. +- Built one queue (edits to existing resources) rather than the doc's three + (New Resources / Resource Edits / Reports), since `resource_revisions` as + it actually exists can't represent "new resource" or "report" cases (no + submission-type column, always FK'd to an existing resource, no reports + table). If NEW-resource submissions or reports need a queue later, they'll + need their own table(s) or a schema change to this one. +- Diff view compares against the *live* `resources` row at request time + (not a snapshot), so if the underlying resource changes between + submission and review, the diff reflects the current state, not what the + submitter saw. + +**Verified:** +- `pnpm typecheck` and `pnpm biome check` clean. +- Confirmed via direct REST calls against the Supabase table (not just + reading code) that `resource_revisions`' real columns match what's coded + above, and that inserts/updates against it behave as assumed. +- Dev server smoke test: `/reviews` and `/reviews/:id` both correctly + 302-redirect to `/auth` when unauthenticated (confirms the route-level + `authMiddleware` is wired up). Did not verify the authenticated render + path against a real logged-in session in this pass (no test credentials + in hand) — worth a manual pass, same caveat as the login-page piece. + +**Not done / explicitly out of scope for this pass:** +- Approve/Reject propagating to `resources` or `resource_history` — you + said we'll figure that out later. +- New Resources queue, Reports queue, rollback/history timeline — blocked + on schema that doesn't exist yet (see discovery notes above). +- `reviewed_by`/`rejection_reason` capture — no columns for it today. + +## 2026-07-07 — Dashboard summary page + +**Status:** Done, with one stat explicitly blocked on schema. + +**What changed:** +- `app/routes/authenticated/dashboard.tsx` — replaced the placeholder with a + real loader that fetches all `resource_revisions` and aggregates in JS + (no DB-side aggregation available beyond REST filters): top 5 submitters + by revision count, outstanding (`PENDING`) count per resource type (all + four types always shown, defaulting to 0), plus pending/total stat cards. +- "Top approvers" is rendered but explicitly disabled with an explanatory + tooltip: `resource_revisions` has no `reviewed_by` column, so there's no + record of who approved/rejected a given revision. Can't add that column + myself — no service-role key or DB connection string in `.env`, only the + publishable key (REST-level CRUD, no DDL). Needs a schema change (add + `reviewed_by`, set it in the approve/reject action) before this is + buildable. + +## 2026-07-07 — Editable review detail page + +**Status:** Done. + +**What changed:** +- `app/api/resource-revisions/methods.ts` — added `updateFields(id, values)`, + a partial update against `resource_revisions` (separate from + `updateStatus`, which only flips `status`). +- `app/routes/authenticated/reviews/detail.tsx` — rewritten. The Proposed + column of the diff table is now editable (scalar fields as text/number/ + select inputs; water/food/forage/bathroom info as `Autocomplete` chip + pickers scoped to the current `resource_type`, switching live if you + change the type). Hours/images stay read-only — no editor UI for those + yet. A "Save changes" button submits via `useFetcher` as a JSON body + (`{ intent: "save", values }`); Approve/Reject remain plain `

` + FormData posts. The route's `action` dispatches on the request's + `Content-Type` header to tell the two apart. Editing is only enabled + while `status === "PENDING"` — approved/rejected revisions render + read-only. +- Verified via `pnpm typecheck` / `pnpm biome check` (clean) and a curl + smoke test against a locally-running dev server (temporarily disabling + `authMiddleware`, then reverting): `/reviews`, `/reviews/15`, + `/reviews/16`, `/reviews/17` all render 200 with no server-side errors, + and a JSON POST of `{"intent":"save",...}` against revision 15 round- + tripped through Supabase correctly ("Changes saved"). + +**Not done:** no diff/preview before saving, no undo — saving writes +directly to the revision row immediately. + +## Fixed: "page freezes and crashes" when opening a review + +**Status:** Done. + +Reported symptom: clicking a resource in the reviews queue did nothing — +no navigation, no error page, just silence (a truer description than the +original "crash" framing). Root-caused this pass by installing Playwright +for real browser-level testing (no browser access in earlier passes, which +is why it went unresolved for two prior sessions). + +**Root cause:** `app/middleware/auth.ts` exports `authMiddleware`, which +imports the genuinely server-only `~/api/client.server` (Supabase SSR +client + secrets). Every route using `export const middleware = +[authMiddleware]` (`reviews/index.tsx`, `reviews/detail.tsx`, +`dashboard.tsx`) therefore has a top-level `import { authMiddleware } from +"~/middleware/auth"` that's supposed to be stripped from the client bundle +(React Router auto-removes server-only route exports like `middleware` +from what ships to the browser). With `future.v8_splitRouteModules: true` +enabled in `react-router.config.ts`, that stripping silently failed in dev +mode: the browser's client-side navigation (clicking a row calls +`navigate()`, which lazy-loads the target route's module) ended up +requesting `/app/middleware/auth.ts` directly, which 500'd with "Server-only +module referenced by client" (Vite's guard against `.server.ts` code +reaching the client). The failed module load silently aborted the +navigation — URL never changed, UI appeared to do nothing, which read as a +freeze. + +**Fix:** disabled the `v8_splitRouteModules` future flag in +`react-router.config.ts` (kept `v8_middleware` and `v8_viteEnvironmentApi`, +both still needed). This is an opt-in, still-evolving code-splitting +optimization for RR 7.13.0 — the more basic "strip server-only route +exports from the client bundle" mechanism it layers on top of works +correctly without it. Verified via Playwright: after the fix, `/app` no +longer appears in the browser's request graph for `auth.ts` at all, and +clicking a review row in `/reviews` correctly navigates to `/reviews/:id` +with no console errors, no failed requests, no error overlay. Also +confirmed `/` (dashboard) still loads and renders correctly. + +**Not investigated further:** whether this is a known upstream bug in RR +7.13.0's `v8_splitRouteModules` + `v8_middleware` combination, or something +fixable by restructuring the import (e.g. not sharing a single +`authMiddleware` module across every leaf route file). Given +`v8_splitRouteModules` is purely a performance optimization (lazy-loads +`clientLoader`/`clientAction`/etc. into separate chunks) and not required +for anything this app currently does, turning it off was the lower-risk +fix over reverse-engineering the splitter's dead-code-elimination bug. +Worth revisiting if the app later depends on that optimization, or on an +RR upgrade past 7.13.0. + +## Next up + +Not yet started — pending your direction on which piece to tackle next: +propagating approved reviews to `resources` (and deciding what that even +means given the current schema — direct update? new `resource_history` +table?), or a different item from `resource-review-flow-scoping.md` §9. diff --git a/docs/resource-review-flow-scoping.md b/docs/resource-review-flow-scoping.md new file mode 100644 index 0000000..8e6f61c --- /dev/null +++ b/docs/resource-review-flow-scoping.md @@ -0,0 +1,191 @@ +# Scoping: Crowdsourced Resource Review Flow + +Status: Draft for discussion +Owner: TBD +Related: README's "Review and approve/reject suggested edits," "View and resolve reports," "View resource changelogs and roll back changes" + +## 1. Goal + +Let admins review, approve, or reject crowdsourced submissions (new resources, edits to +existing resources, and reports flagging problems with a resource) before they affect the +live PHLask map, and keep a rollback-able version history of every resource. + +## 2. Current state (verified against the codebase, 2026-07-07) + +**admin-dashboard** (this repo): Supabase client + auth are wired up. A `resources` table +and matching `ResourceEntry` type exist (`app/types/ResourceEntry.ts`). One CRUD API +(`app/api/resources/methods.ts`) against that table only. No review UI, no edits/reports/ +history tables, no roles. The dashboard route tree currently has a single placeholder +Dashboard page. + +**phlask-map** (sibling repo, the live community-facing app): "Add Resource" is fully built +and inserts **directly into the live `resources` table** — no staging step. "Suggest Edit" +is a menu item with an unimplemented handler (`// TODO`). "Report" has no handler at all. +There is no `edits`/`suggestions`/`reports` table anywhere, and no existing concept of +linking a proposed change to a `resource_id`. The only edit mechanism today is a +password-gated `VerificationButton` that upserts straight onto the live row, bypassing +any review step. + +**Conclusion:** everything below is greenfield. This doc scopes the admin-dashboard side +in full (schema, review UI, approve/reject, versioning) and defines the data contract +phlask-map must satisfy — it does not design phlask-map's Suggest Edit / Report form UX, +which is a separate scoping effort in that repo. + +## 3. Out of scope for this doc + +- phlask-map UI/UX for the Suggest Edit and Report forms (tracked as a dependency, §7). +- Notifying submitters of approval/rejection (no submitter accounts exist today). +- Reversing the `VerificationButton` bypass path in phlask-map (flagged as a risk, §8). + +## 4. Proposed data model (Supabase / Postgres) + +### 4.1 `resource_submissions` +Unified staging table for both new-resource and edit-to-existing submissions — matches +the diagram's single "Resources Table(s)" feeding two dashboard views via a discriminator. + +| column | type | notes | +|---|---|---| +| `id` | uuid pk | | +| `submission_type` | `'NEW' \| 'EDIT'` | set by auto-matching (§5.1) | +| `target_resource_id` | uuid, nullable, FK → resources.id | set for EDIT; null for NEW | +| `match_confidence` | numeric, nullable | populated when matched automatically rather than by explicit resource_id | +| `proposed_data` | jsonb | full `ResourceEntry`-shaped payload | +| `source` | jsonb | submitter contact/context, if any (phlask-map has no submitter accounts today) | +| `status` | `'PENDING' \| 'APPROVED' \| 'REJECTED'` | soft-delete on reject, not a hard delete | +| `rejection_reason` | text, nullable | | +| `reviewed_by` | uuid, nullable, FK → admin user | | +| `reviewed_at` | timestamptz, nullable | | +| `created_at` | timestamptz | | + +### 4.2 `resource_reports` +| column | type | notes | +|---|---|---| +| `id` | uuid pk | | +| `resource_id` | uuid, FK → resources.id | | +| `report_type` | `'CLOSED' \| 'INACCURATE' \| 'INAPPROPRIATE' \| 'OTHER'` | | +| `description` | text | | +| `source` | jsonb | submitter contact/context, optional | +| `status` | `'PENDING' \| 'RESOLVED' \| 'DISMISSED'` | | +| `resolution_notes` | text, nullable | | +| `resolved_by` | uuid, nullable, FK → admin user | | +| `resolved_at` | timestamptz, nullable | | +| `created_at` | timestamptz | | + +### 4.3 `resource_history` +Linear, append-only version log. A rollback writes a **new** version that copies an old +snapshot forward (like a revert commit) rather than mutating history — this is what the +diagram's "Git logic as instance saving" annotation is read as here; full branch/merge +semantics are out of scope per your answer. + +| column | type | notes | +|---|---|---| +| `id` | uuid pk | | +| `resource_id` | uuid, FK → resources.id | | +| `version` | int | matches `resources.version`, increments monotonically | +| `snapshot` | jsonb | full `ResourceEntry` at this version | +| `change_source` | `'SUBMISSION_APPROVAL' \| 'ADMIN_DIRECT_EDIT' \| 'ROLLBACK'` | | +| `changed_by` | uuid, FK → admin user | | +| `source_submission_id` | uuid, nullable, FK → resource_submissions.id | traceability back to the approved submission | +| `created_at` | timestamptz | | + +### 4.4 `admin_roles` +Per your answer, v1 needs more than one permission level. + +| column | type | notes | +|---|---|---| +| `user_id` | uuid, FK → auth.users | | +| `role` | `'REVIEWER' \| 'ADMIN'` | REVIEWER: approve/reject submissions & reports. ADMIN: also rollback history, manage roles | + +Open question: does this need a third tier, or is Reviewer/Admin sufficient for launch? + +## 5. Flow + +### 5.1 Intake & classification +1. phlask-map writes a row to `resource_submissions` (contract in §7) instead of directly + to `resources`. +2. A Postgres trigger or Supabase Edge Function runs automatic matching: if + `target_resource_id` wasn't supplied, match on proximity (lat/lng within a threshold) + + name similarity against existing `resources`. Strong match → `submission_type = EDIT`, + `target_resource_id` set, `match_confidence` recorded. No match → `submission_type = NEW`. + Reviewers can override this classification in the UI regardless of the auto-tag. +3. `resource_reports` rows land directly (no classification needed, already tied to a + `resource_id`). + +### 5.2 Review queues (admin-dashboard UI) +Three queues, matching the diagram's split dashboard views plus Reports: +- **New Resources** — `resource_submissions` where `submission_type = NEW`, `status = PENDING` +- **Resource Edits** — `resource_submissions` where `submission_type = EDIT`, `status = PENDING` +- **Reports** — `resource_reports` where `status = PENDING` + +### 5.3 Review detail / "In Review" mode +For an EDIT: side-by-side diff of existing `resources` row vs. `proposed_data` (the +diagram's "Existing site data" / "Suggested site data" panes), field-by-field. +For a NEW resource: single preview of `proposed_data` (nothing to diff against), plus a +flag if `match_confidence` was borderline so the reviewer can manually link it to an +existing resource instead of creating a duplicate. +For a Report: resource context + report description, with Resolve/Dismiss actions. + +Actions: +- **Approve** — NEW: insert into `resources`, create `resource_history` v1. + EDIT: update `resources` row, increment `resources.version`, append `resource_history` + entry. Either way, mark the submission `APPROVED`. +- **Reject** — mark `resource_submissions.status = REJECTED` with reason; no changes to + `resources`. Row is kept, not deleted (audit trail). +- **Resolve / Dismiss** (reports) — mark `resource_reports.status`; resolving a report does + not itself change the resource — a follow-up edit/verification does that separately. + +### 5.4 History & rollback +Per resource, a version timeline view backed by `resource_history`. Selecting an older +version and confirming "Roll back" writes a new `resource_history` row (and updates +`resources`) whose snapshot equals the selected old version — preserving full lineage +rather than deleting intervening history. + +## 6. Admin-dashboard scope (this repo) + +New routes (under the existing authenticated layout): +- `/reviews/new-resources`, `/reviews/edits`, `/reviews/reports` — queues +- `/reviews/submissions/:id` — diff/detail + approve/reject +- `/reviews/reports/:id` — report detail + resolve/dismiss +- `/resources/:id/history` — version timeline + rollback + +New Supabase tables: `resource_submissions`, `resource_reports`, `resource_history`, +`admin_roles` (§4), plus RLS policies scoping writes to authenticated admins and +role-gating rollback to `ADMIN`. +`@tanstack/react-table` is already installed and unused — natural fit for the three queues. + +## 7. Contract required from phlask-map (tracked as external dependency, not designed here) + +- "Add Resource" must stop inserting directly into `resources`; it inserts into + `resource_submissions` with `submission_type = 'NEW'`, `target_resource_id = null`. +- "Suggest Edit" must be implemented: inserts into `resource_submissions` with + `submission_type = 'EDIT'`, `target_resource_id` set to the resource being edited, + `proposed_data` containing only the changed fields merged over current values (exact + merge strategy TBD with phlask-map team). +- "Report" must be implemented: inserts into `resource_reports` with `resource_id` and + `report_type`. +- The `VerificationButton` direct-upsert bypass either needs to be retired in favor of + this flow, or explicitly kept as an admin-only fast path (decide in §8). + +## 8. Open questions / risks + +- **`VerificationButton` bypass**: phlask-map already has a password-gated direct-edit + path that writes straight to `resources`, skipping review and history entirely. Does + this get retired, or coexist? If it coexists, `resource_history` will have gaps. + **Needs a decision before this ships**, since it undermines the "every change has a + version + audit trail" guarantee. +- **Matching threshold**: what proximity/name-similarity threshold counts as a confident + auto-match for NEW vs EDIT classification? Needs tuning against real data, likely a + follow-up spike rather than something to nail down in this doc. +- **Admin role bootstrap**: who assigns the first `ADMIN` role, and how (manual SQL vs. a + seed script)? +- **Duplicate resources already in the wild**: since Add Resource has been inserting + directly with no dedup, is a one-time cleanup pass needed before this launches? + +## 9. Suggested phasing + +1. Schema + RLS (`resource_submissions`, `resource_reports`, `resource_history`, `admin_roles`) +2. Review queues + detail/diff view + approve/reject (New Resources, Resource Edits) +3. History timeline + rollback +4. Reports queue +5. Coordinate with phlask-map team on the intake contract (§7) — can happen in parallel + with 1–3 once the schema is settled From 836272280cff899c5d2414f078c16d78e917c624 Mon Sep 17 00:00:00 2001 From: tayloraj10 Date: Tue, 14 Jul 2026 19:50:18 -0400 Subject: [PATCH 02/13] Add theming system and shared UI components Introduces a centralized MUI theme, dark/light mode provider, and shared components (ThemeToggle, WaveDivider, chip color helpers) used across the authenticated and unauthenticated layouts. --- app/app.css | 103 ++++++++++++++++++++++++- app/components/ThemeToggle.tsx | 34 ++++++++ app/components/WaveDivider.tsx | 43 +++++++++++ app/root.tsx | 22 +++++- app/theme/ThemeModeProvider.tsx | 63 +++++++++++++++ app/theme/theme.ts | 133 ++++++++++++++++++++++++++++++++ 6 files changed, 394 insertions(+), 4 deletions(-) create mode 100644 app/components/ThemeToggle.tsx create mode 100644 app/components/WaveDivider.tsx create mode 100644 app/theme/ThemeModeProvider.tsx create mode 100644 app/theme/theme.ts diff --git a/app/app.css b/app/app.css index 75c6338..ceb77af 100644 --- a/app/app.css +++ b/app/app.css @@ -1,16 +1,113 @@ @import 'tailwindcss'; +/* Dark mode is toggled by adding/removing `.dark` on (see ThemeModeProvider), + rather than following the OS preference, so it can stay in sync with the MUI theme. */ +@custom-variant dark (&:where(.dark, .dark *)); + @theme { --font-sans: 'Inter', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + + /* Water/brand blue, anchored on the PHLASK logo color (#10B6FF = brand-500) */ + --color-brand-50: #eafaff; + --color-brand-100: #d6f4ff; + --color-brand-200: #ade8ff; + --color-brand-300: #6fd6ff; + --color-brand-400: #38c1ff; + --color-brand-500: #10b6ff; + --color-brand-600: #0090de; + --color-brand-700: #0072b3; + --color-brand-800: #045c90; + --color-brand-900: #0a3a5c; + + /* Deep ocean navy, used for dark-mode surfaces */ + --color-navy-950: #071522; + --color-navy-900: #0a1929; + --color-navy-800: #10263a; + --color-navy-700: #17344c; + --color-navy-600: #1f4560; } html, body { - @apply bg-white dark:bg-gray-950; + @apply bg-brand-50 text-navy-900 dark:bg-navy-950 dark:text-brand-50; + color-scheme: light; +} + +html.dark { + color-scheme: dark; +} + +@keyframes wave-drift { + from { + transform: translateX(0); + } + to { + transform: translateX(-50%); + } +} + +@keyframes bubble-rise { + from { + transform: translateY(0) scale(1); + opacity: 0.5; + } + to { + transform: translateY(-140px) scale(1.15); + opacity: 0; + } +} + +/* Ambient per-type motion for resource-type chip icons (see chipColors.tsx) */ +@keyframes chip-icon-bob { + 0%, + 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-2px); + } +} + +@keyframes chip-icon-pulse { + 0%, + 100% { + transform: scale(1); + } + 50% { + transform: scale(1.18); + } +} + +@keyframes chip-icon-sway { + 0%, + 100% { + transform: rotate(-10deg); + } + 50% { + transform: rotate(10deg); + } +} - @media (prefers-color-scheme: dark) { - color-scheme: dark; +@keyframes chip-icon-wiggle { + 0%, + 100% { + transform: rotate(0deg); + } + 25% { + transform: rotate(-12deg); + } + 75% { + transform: rotate(12deg); } } + +/* Water-themed scrollbar */ +* { + scrollbar-color: var(--color-brand-300) transparent; +} + +html.dark * { + scrollbar-color: var(--color-navy-600) transparent; +} diff --git a/app/components/ThemeToggle.tsx b/app/components/ThemeToggle.tsx new file mode 100644 index 0000000..c5ee989 --- /dev/null +++ b/app/components/ThemeToggle.tsx @@ -0,0 +1,34 @@ +import { DarkMode, LightMode } from "@mui/icons-material"; +import { IconButton, Tooltip } from "@mui/material"; +import { useThemeMode } from "~/theme/ThemeModeProvider"; +import { brand, navy } from "~/theme/theme"; + +// Styling and icon visibility are driven purely by the `.dark` class (via +// theme.applyStyles / Tailwind's dark: variant) rather than the `mode` value +// from React state, so this can never mismatch between SSR and hydration. +export function ThemeToggle() { + const { toggleMode } = useThemeMode(); + + return ( + + ({ + bgcolor: brand[100], + color: brand[700], + transition: "transform 0.35s ease, background-color 0.2s ease", + "&:hover": { bgcolor: brand[200], transform: "rotate(-14deg)" }, + ...theme.applyStyles("dark", { + bgcolor: navy[800], + color: brand[300], + "&:hover": { bgcolor: navy[700] }, + }), + })} + > + + + + + ); +} diff --git a/app/components/WaveDivider.tsx b/app/components/WaveDivider.tsx new file mode 100644 index 0000000..06057c5 --- /dev/null +++ b/app/components/WaveDivider.tsx @@ -0,0 +1,43 @@ +// Two periods of the same wave back-to-back so a -50% translateX loops seamlessly. +const WAVE_PATH = + "M0,40 C150,90 350,0 600,40 C850,80 1050,0 1200,40 C1350,80 1550,0 1800,40 C1950,80 2150,0 2400,40 L2400,120 L0,120 Z"; + +type WaveDividerProps = { + color: string; + height?: number; + opacity?: number; + duration?: number; + reverse?: boolean; + className?: string; +}; + +export function WaveDivider({ + color, + height = 60, + opacity = 1, + duration = 18, + reverse = false, + className, +}: WaveDividerProps) { + return ( +
+ +
+ ); +} diff --git a/app/root.tsx b/app/root.tsx index 9fc6636..346688c 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -9,6 +9,20 @@ import { import type { Route } from "./+types/root"; import "./app.css"; +import { ThemeModeProvider } from "./theme/ThemeModeProvider"; + +// Runs before hydration to apply the persisted theme as a class on , +// so the very first paint is already in the right mode. Defaults to light +// unless the user has previously chosen dark mode (no OS-preference fallback). +const THEME_INIT_SCRIPT = ` +(function () { + try { + if (localStorage.getItem("phlask-theme-mode") === "dark") { + document.documentElement.classList.add("dark"); + } + } catch (e) {} +})(); +`; export const links: Route.LinksFunction = () => [ { rel: "preconnect", href: "https://fonts.googleapis.com" }, @@ -31,6 +45,8 @@ export function Layout({ children }: { children: React.ReactNode }) { + {/* biome-ignore lint/security/noDangerouslySetInnerHtml: static inline script, no user input */} +