You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.0 KiB
Markdown

+++
title = "quotesdb/ui: /admin page component"
priority = 5
status = "done"
ticket_type = "feature"
dependencies = ["161f32"]
+++
## /admin page component (UI)
Create the /admin route and page component. The page provides a persistent admin auth code input, an auth code reset section, and a submissions lock/unlock section.
Depends on ticket 161f32 (admin API client functions). Complete that ticket first.
---
## Files to create / modify
- `src/bin/ui/pages/admin.rs`**create** the new page component
- `src/bin/ui/pages/mod.rs` — add `pub mod admin;`
- `src/bin/ui/main.rs` — add the `/admin` route to the Yew Router switch and add an "Admin" link to the top nav (or wherever the nav links are defined)
---
## Component: AdminPage
The component holds the following local state:
| State field | Type | Purpose |
|---|---|---|
| `admin_code` | `String` | The persistent admin auth code input |
| `new_passphrase` | `String` | Optional input for reset section |
| `reset_result` | `Option<String>` | Newly returned auth code after reset |
| `reset_error` | `Option<String>` | Error message for the reset section |
| `submissions_locked` | `Option<bool>` | Current lock state, fetched on mount |
| `lock_error` | `Option<String>` | Error message for lock/unlock section |
| `loading` | `bool` | Disables buttons during in-flight requests |
### On mount
Call `api::get_status()` and set `submissions_locked` from the response.
### Layout
```
[ Admin ] (page heading)
Admin auth code: [__________________] (persistent text input)
--- Reset auth code ---
New passphrase (optional): [__________]
[ Reset ]
> (success) New code: ocean-table-purple-storm
> (error) Wrong auth code.
--- Submissions ---
Status: Open | Closed
[ Lock submissions ] / [ Unlock submissions ]
> (error) Wrong auth code.
```
### Behaviour
- **Reset button:** calls `api::admin_reset_auth_code(&admin_code, new_passphrase_opt, &admin_code)`. On success, shows the new code in `reset_result` and clears `reset_error`. On `ApiError::Forbidden`, sets `reset_error = "Wrong auth code."`. On other errors, sets a generic message.
- **Lock button** (shown when `submissions_locked == Some(false)`): calls `api::admin_lock(&admin_code)`. On success, sets `submissions_locked = Some(true)`. On `ApiError::Forbidden`, sets `lock_error`.
- **Unlock button** (shown when `submissions_locked == Some(true)`): calls `api::admin_unlock(&admin_code)`. On success, sets `submissions_locked = Some(false)`. On `ApiError::Forbidden`, sets `lock_error`.
- While `loading = true`, disable all buttons.
---
## Route registration (src/bin/ui/main.rs)
Add to the router switch:
```rust
Route { path: "/admin".to_string(), render: ... }
// or whichever router pattern is already in use
```
---
## Tests
No runtime unit tests (wasm-only). Verify the build:
```sh
cargo check --target wasm32-unknown-unknown --bin ui
```
---
## Validation
```sh
cargo fmt && cargo check --target wasm32-unknown-unknown --bin ui
```
---
## Commit
```
feat(quotesdb): /admin page component
```