Files
Plushealthtech/plan/plan.md
T
Clive e5d1446791
Gitea CI/CD / build (push) Successful in 1m40s
Site pages and AI tasks.
2026-08-20 14:58:52 +10:00

124 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Site Expansion Plan — New Pages, Forms & MailPit Delivery
Status: Ready for execution — 2026-08-20
## 1. Objective
Grow the Plus Health Tech site from a single landing page into a multi-page site:
- Add **10 linked pages**: About Us, Careers, Contact, Privacy Policy, Terms & Conditions, Sign In, Request Demo, Clinical Decision Support, Patient Management, Veterinarian Solutions.
- **Contact** and **Request Demo** get forms that send email via plain SMTP (no credentials) to a MailPit server at **`tools.host.domain:1025`**, recipient **`[email protected]`**.
- Wire every page into the navbar, footer, and the Index hero / solution-card CTAs (no dead `#` links left).
## 2. Current state (audited 2026-08-20)
- `dotnet build plushealthtech.sln` — **green** (0 warnings / 0 errors).
- Pages that exist: `Index` (landing), `Privacy` (template placeholder text), `Error`.
- **In-progress work already in the working tree** (do not recreate):
- `plushealthtech/Mail/MailSender.cs` — `SmtpClient`, `EnableSsl = false`, no auth, `SendAsync(subject, body)` from `SmtpOptions`.
- `plushealthtech/Mail/SmtpOptions.cs` — binds the `"Smtp"` config section (Host/Port/From/To; From/To default to empty).
- `Program.cs` — already registers `Configure<SmtpOptions>("Smtp")` + `AddSingleton<MailSender>()`.
- `Pages/ClinicalDecisionSupport.cshtml.cs` — PageModel exists, **the `.cshtml` view is missing** (route 404s until added).
- **Gap**: no `"Smtp"` section in `appsettings.json` → `From`/`To` are empty → a form submission today would throw in `MailSender`.
- Link rot today: navbar `Sign In` / `Request Demo` → `#contact` (footer id); footer links all → `#`; Index hero CTA → `#contact`; solution-card "Learn more" links → `#`.
- Mobile menu button has **no JS** (no-op) — pre-existing defect worth fixing while we touch the nav.
- Styling: Tailwind v4 local bundle only; brand tokens (`brand`, `brand-dark`, `brand-light`, `brand-accent`, `brand-vet`) already defined.
## 3. Decisions & assumptions
1. **No new dependencies.** Razor Pages + `System.Net.Mail.SmtpClient` (already in the shared framework) + DataAnnotations validation. No auth package.
2. **Reuse the existing `Mail/` infrastructure** as-is; only the missing config section is added.
3. **SMTP target**: `tools.host.domain:1025`, no TLS, no credentials (MailPit). Recipient `[email protected]`. **From: `[email protected]`** (assumed — MailPit doesn't validate the sender; it lives in one place, `appsettings.json`, easy to change).
4. **Sign In is a placeholder page.** The repo has no auth (per CLAUDE.md); the page says sign-in is coming soon and offers Request Demo / Contact CTAs. Real authentication is a separate project.
5. **Privacy Policy keeps its existing route** `/Privacy` (page already exists); only the placeholder content is replaced.
6. **Copy** for About / Careers / Terms / Privacy is standard corporate boilerplate aligned to `Design.MD` — flagged for a legal/brand review before production.
7. **Mobile menu gets a minimal vanilla-JS toggle** so the new nav links are actually reachable on small screens.
8. **Footer newsletter input stays decorative** — no endpoint was specified for it; out of scope.
## 4. Route map
| Page | File(s) | Route |
|---|---|---|
| Clinical Decision Support | `Pages/ClinicalDecisionSupport.cshtml` (`.cs` already exists) | `/ClinicalDecisionSupport` |
| Patient Management | `Pages/PatientManagement.cshtml` + `.cs` | `/PatientManagement` |
| Veterinarian Solutions | `Pages/Veterinary.cshtml` + `.cs` | `/Veterinary` |
| About Us | `Pages/About.cshtml` + `.cs` | `/About` |
| Careers | `Pages/Careers.cshtml` + `.cs` | `/Careers` |
| Contact (form) | `Pages/Contact.cshtml` + `.cs` | `/Contact` |
| Request Demo (form) | `Pages/RequestDemo.cshtml` + `.cs` | `/RequestDemo` |
| Sign In (placeholder) | `Pages/SignIn.cshtml` + `.cs` | `/SignIn` |
| Terms & Conditions | `Pages/Terms.cshtml` + `.cs` | `/Terms` |
| Privacy Policy (content refresh) | `Pages/Privacy.cshtml` (existing) | `/Privacy` |
## 5. Page specs (summary)
- **Product pages (CDS, Patient Management, Veterinary)** — hero with one-line value prop; 3–4 feature cards reusing Index card copy + `#interoperability` section copy (FHIR®/HL7v2, alerting, point-of-care guidance); CTA band → `/RequestDemo`. Veterinary page uses the `brand-vet` (`#0d9488`) accent per `Design.MD`.
- **About Us** — mission, three product pillars (each linking to its page), values, CTA → `/RequestDemo`.
- **Careers** — culture & expectations, "how to apply" pointing at `/Contact` (no job-board data exists).
- **Terms & Conditions** — boilerplate sections, including a clinical-software disclaimer (CDS is decision support, not a substitute for professional judgment).
- **Privacy Policy** — data collected by the two forms, where it goes (`[email protected]`), third parties (cdnjs, analytics.rokoh.com), cookies, contact.
- **Sign In** — centered card: sign-in coming soon + CTAs.
- **Contact** — form: Name*, Work Email*, Organization, Phone, Message*. Success panel on send; friendly error on SMTP failure (details logged).
- **Request Demo** — form: Name*, Work Email*, Organization*, Practice Type (select), Products of Interest (select), Message (optional). Same send/success/error behavior.
## 6. Mail spec
- Config in `appsettings.json`:
```json
"Smtp": {
"Host": "tools.host.domain",
"Port": 1025,
"From": "[email protected]",
"To": "[email protected]"
}
```
- Form → `OnPost` (antiforgery token, `ModelState` check) → `MailSender.SendAsync(subject, body)`:
- Contact subject: `New contact form message — {Name}`
- Demo subject: `New demo request — {Organization}`
- Body: plain-text, one `Field: value` line per field, then the message.
- SMTP exception → re-render with a generic "message could not be sent, please email us directly" banner; exception logged, never surfaced.
## 7. Navigation & link plan
- **Desktop nav** (replaces current anchor links): CDS → `/ClinicalDecisionSupport` · Patient Management → `/PatientManagement` · Veterinary → `/Veterinary` · About → `/About` · Careers → `/Careers` · Contact → `/Contact` · Blog (external, keep).
- **CTA buttons**: Sign In → `/SignIn` · Request Demo → `/RequestDemo`.
- **Footer**: Solutions column → 3 product routes; Company column → `/About`, `/Careers`, `/Contact`; new **Legal** column → `/Privacy`, `/Terms`. Remove the footer's `id="contact"` (nothing may target it anymore).
- **Index**: hero "Explore Platform" → `/RequestDemo`; "View Solutions" keeps `#solutions`; the three solution-card links → the product routes.
- **Mobile menu**: small vanilla-JS toggle in the layout (or `<details>`) so nav is reachable on mobile.
## 8. Task list (files in `task/`, in recommended order)
| # | Task file | Scope | Depends on |
|---|---|---|---|
| 01 | `task/01-smtp-mail-configuration.md` | `Smtp` config section; confirm MailPit delivery path | — |
| 02 | `task/02-contact-page.md` | `/Contact` + form | 01 |
| 03 | `task/03-request-demo-page.md` | `/RequestDemo` + form | 01 |
| 04 | `task/04-clinical-decision-support-page.md` | CDS view (PageModel exists) | — |
| 05 | `task/05-patient-management-page.md` | `/PatientManagement` | — |
| 06 | `task/06-veterinary-solutions-page.md` | `/Veterinary` | — |
| 07 | `task/07-about-us-page.md` | `/About` | — |
| 08 | `task/08-careers-page.md` | `/Careers` | — |
| 09 | `task/09-terms-and-conditions-page.md` | `/Terms` | — |
| 10 | `task/10-sign-in-page.md` | `/SignIn` placeholder | — |
| 11 | `task/11-privacy-policy-content.md` | `/Privacy` content refresh | — |
| 12 | `task/12-navigation-footer-cta-links.md` | layout + Index links, mobile menu | 02–11 |
| 13 | `task/13-verification-and-final-checks.md` | build, link sweep, e2e mail test | all |
Tasks 02–11 are independent of each other (02/03 need 01) and can be done in any order or by parallel contributors.
## 9. Verification (task 13)
1. `dotnet build plushealthtech.sln` → 0 errors / 0 warnings.
2. `dotnet run --project plushealthtech` → walk navbar (desktop **and** mobile), footer, Index CTAs; every link resolves (no `#` left except the `#solutions` / `#interoperability` in-page anchors).
3. Submit both forms → messages appear in MailPit (Web UI / `mailpit api`) addressed to `alerts@plushealthtech.local`; app log shows the `Mail sent to …` line; error path (MailPit down) renders the friendly banner.
4. `/Privacy` shows the new policy, not the template text.
5. No changes needed to the Dockerfile / Gitea workflow — the image pipeline already rebuilds CSS and ships everything in `wwwroot` + the app.
## 10. Risks / open items
- `tools.host.domain` must be resolvable from wherever the app runs (local dev vs. the `10.10.0.90` container host). If it only resolves in the internal network, dev machines may need a hosts entry — confirm during task 01.
- Sign In placeholder: if a real portal is planned, that's a separate project (auth + account backend) and page 10 will be the integration point.
- Terms/Privacy copy is boilerplate until reviewed.