Bundles the prior autonomous-session output that was sitting unstaged: - Em-dash sweep across src/ + tests/ (en-dash/em-dash to hyphen, ~2280 instances) - country-flag-icons rollout (CountryFlag component, replaces emoji glyphs that never rendered on Windows; lazy-loads the 3x2 SVG index as a single chunk after the per-subpath dynamic-import approach silently failed in webpack) - Admin IA Phase 1+2: 7-domain regroup, 41 to 38 pages, /admin/berths index, redirects (ocr to ai, reports to dashboard, invitations to users), docs/admin-ia-proposal.md - Per-template email tester (registry + endpoint + UI on Email admin page) - Cancel-document mode picker (delete-from-Documenso vs keep-for-audit) - Dashboard PDF report: 25 widgets, SVG charts, date-range picker, 11 resolvers - Customize-widgets per-region sortables at xl+ (charts/rails/feed); single flat sortable below xl when the layout stacks; per-viewport saved orders - Audit doc updates capturing each shipped item - Lint fixes: react-compiler immutability in DonutChart (reduce instead of let-reassign), set-state-in-effect disables in CountryFlag and UploadForSigning preview-bytes effect, unused 'confirm' destructures in interest contract + reservation tabs, unescaped apostrophe in test-template card copy
62 lines
3.1 KiB
TypeScript
62 lines
3.1 KiB
TypeScript
import { Info } from 'lucide-react';
|
|
|
|
import { PageHeader } from '@/components/shared/page-header';
|
|
import { RegistryDrivenForm } from '@/components/admin/shared/registry-driven-form';
|
|
import { SalesEmailConfigCard } from '@/components/admin/sales-email-config-card';
|
|
import { EmailRoutingCard } from '@/components/admin/email-routing-card';
|
|
import { SmtpTestSendCard } from '@/components/admin/email/smtp-test-send-card';
|
|
import { TestTemplateCard } from '@/components/admin/email/test-template-card';
|
|
|
|
export default function EmailSettingsPage() {
|
|
return (
|
|
<div className="space-y-6">
|
|
<PageHeader
|
|
title="Email Settings"
|
|
description="Per-port outgoing email configuration. SMTP credentials and the From address default to environment variables when these fields are blank. Header/footer HTML lives under Branding."
|
|
/>
|
|
|
|
{/* Explainer for the "two accounts" model - addresses the recurring
|
|
UAT question "why are there separate SMTP credentials for sales
|
|
and noreply?". Keeps the answer in front of the admin before
|
|
they reach the per-card form below. */}
|
|
<div className="rounded-md border border-border bg-muted/40 px-4 py-3 text-sm">
|
|
<div className="flex items-start gap-2">
|
|
<Info className="mt-0.5 size-4 shrink-0 text-muted-foreground" aria-hidden />
|
|
<div className="space-y-1 text-muted-foreground">
|
|
<p>
|
|
<strong className="text-foreground">Why two accounts?</strong> Transactional emails
|
|
(signing invites, notifications, password resets) ship from your noreply mailbox over
|
|
the SMTP credentials below. Rep-authored sales emails (one-off messages, proposal
|
|
sends) ship from the sales mailbox with separate credentials so replies land in a
|
|
human-monitored inbox.
|
|
</p>
|
|
<p>
|
|
The noreply credentials are also used by the supplemental-info workflow + portal
|
|
activation, i.e. anywhere the platform sends on its own initiative. The sales
|
|
credentials are only used when a rep clicks Send in the compose UI.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Registry-driven so each field shows the "Using env fallback /
|
|
port / global / default" badge inline - admins can tell at a
|
|
glance which fields are coming from .env vs. UI overrides. */}
|
|
<RegistryDrivenForm
|
|
sections={['email.from']}
|
|
title="From address (noreply)"
|
|
description="Identity headers used by system-generated emails. Set the From + Reply-To here; the matching SMTP credentials live in the next card."
|
|
/>
|
|
<RegistryDrivenForm
|
|
sections={['email.smtp']}
|
|
title="SMTP transport overrides (noreply)"
|
|
description="Optional per-port SMTP credentials for the noreply mailbox. Leave blank to use the global env defaults. Each field shows its current source (env / port / default) so you can tell what's active without checking the deploy."
|
|
/>
|
|
<SmtpTestSendCard />
|
|
<TestTemplateCard />
|
|
<SalesEmailConfigCard />
|
|
<EmailRoutingCard />
|
|
</div>
|
|
);
|
|
}
|