This commit is contained in:
+123
@@ -0,0 +1,123 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user