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

9.0 KiB
Raw Permalink Blame History

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:

    "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.

  • 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.
# 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 [email protected]; 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.