feat(admin): per-port email/Documenso/branding/reminder settings + invitations
Centralizes everything operators need to configure into the admin panel,
each setting per-port with env fallback.
New admin pages
- /admin landing page linking to every admin section as a card
- /admin/email FROM name+address, reply-to, signature/footer HTML,
optional SMTP host/port/user/pass override
- /admin/documenso API URL+key override, EOI Documenso template ID,
default EOI pathway (documenso-template vs inapp),
"Test connection" button
- /admin/branding logo URL, primary color, app name, email
header/footer HTML
- /admin/reminders port-level defaults for new interests +
port-wide daily-digest delivery window
- /admin/invitations send / list / resend / revoke CRM invitations
Per-user reminder digest
- /notifications/preferences gains a Reminder digest card:
immediate / daily / weekly / off, with HH:MM, day-of-week,
IANA timezone fields. Stored in user_profiles.preferences.reminders.
Plumbing
- port-config.ts typed accessors (getPortEmailConfig, getPortDocumensoConfig,
getPortBrandingConfig, getPortReminderConfig) — settings → env fallback.
- sendEmail accepts optional portId; resolves From/SMTP from settings
when supplied.
- documensoFetch + downloadSignedPdf accept optional portId; each public
function takes it through. checkDocumensoHealth() backs the test button.
- crm-invite.service gains listCrmInvites / revokeCrmInvite / resendCrmInvite
with audit-log entries (revoke_invite, resend_invite added to AuditAction).
- AdminLandingPage card grid + shared SettingsFormCard component to remove
per-page form boilerplate.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 23:21:54 +02:00
|
|
|
import {
|
|
|
|
|
SettingsFormCard,
|
|
|
|
|
type SettingFieldDef,
|
|
|
|
|
} from '@/components/admin/shared/settings-form-card';
|
|
|
|
|
import { DocumensoTestButton } from '@/components/admin/documenso/documenso-test-button';
|
feat(mobile): swap admin page headers to PageHeader
Mechanical sweep replacing the plain h1+p header markup with the
mobile-aware PageHeader primitive across 12 admin pages: index,
backup, branding, documenso, email, import, invitations, monitoring,
onboarding, reminders, reports, webhooks. Webhooks "Add Webhook"
button preserved via the actions slot.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 12:57:52 +02:00
|
|
|
import { PageHeader } from '@/components/shared/page-header';
|
feat(admin): per-port email/Documenso/branding/reminder settings + invitations
Centralizes everything operators need to configure into the admin panel,
each setting per-port with env fallback.
New admin pages
- /admin landing page linking to every admin section as a card
- /admin/email FROM name+address, reply-to, signature/footer HTML,
optional SMTP host/port/user/pass override
- /admin/documenso API URL+key override, EOI Documenso template ID,
default EOI pathway (documenso-template vs inapp),
"Test connection" button
- /admin/branding logo URL, primary color, app name, email
header/footer HTML
- /admin/reminders port-level defaults for new interests +
port-wide daily-digest delivery window
- /admin/invitations send / list / resend / revoke CRM invitations
Per-user reminder digest
- /notifications/preferences gains a Reminder digest card:
immediate / daily / weekly / off, with HH:MM, day-of-week,
IANA timezone fields. Stored in user_profiles.preferences.reminders.
Plumbing
- port-config.ts typed accessors (getPortEmailConfig, getPortDocumensoConfig,
getPortBrandingConfig, getPortReminderConfig) — settings → env fallback.
- sendEmail accepts optional portId; resolves From/SMTP from settings
when supplied.
- documensoFetch + downloadSignedPdf accept optional portId; each public
function takes it through. checkDocumensoHealth() backs the test button.
- crm-invite.service gains listCrmInvites / revokeCrmInvite / resendCrmInvite
with audit-log entries (revoke_invite, resend_invite added to AuditAction).
- AdminLandingPage card grid + shared SettingsFormCard component to remove
per-page form boilerplate.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 23:21:54 +02:00
|
|
|
|
|
|
|
|
const API_FIELDS: SettingFieldDef[] = [
|
|
|
|
|
{
|
|
|
|
|
key: 'documenso_api_url_override',
|
|
|
|
|
label: 'API URL override',
|
|
|
|
|
description: 'Optional. Falls back to DOCUMENSO_API_URL env when blank.',
|
|
|
|
|
type: 'string',
|
|
|
|
|
placeholder: 'https://documenso.example.com',
|
|
|
|
|
defaultValue: '',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
key: 'documenso_api_key_override',
|
|
|
|
|
label: 'API key override',
|
|
|
|
|
description: 'Optional. Falls back to DOCUMENSO_API_KEY env when blank. Stored in plain text.',
|
|
|
|
|
type: 'password',
|
|
|
|
|
defaultValue: '',
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const EOI_FIELDS: SettingFieldDef[] = [
|
|
|
|
|
{
|
|
|
|
|
key: 'documenso_eoi_template_id',
|
|
|
|
|
label: 'EOI Documenso template ID',
|
|
|
|
|
description: 'Numeric template ID used by the Documenso EOI pathway.',
|
|
|
|
|
type: 'string',
|
|
|
|
|
placeholder: '12345',
|
|
|
|
|
defaultValue: '',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
key: 'eoi_default_pathway',
|
|
|
|
|
label: 'Default EOI pathway',
|
|
|
|
|
description:
|
|
|
|
|
'Which pathway is used when an EOI is generated without an explicit choice. Documenso = signed via Documenso, In-app = filled locally with pdf-lib.',
|
|
|
|
|
type: 'select',
|
|
|
|
|
options: [
|
|
|
|
|
{ value: 'documenso-template', label: 'Documenso template' },
|
|
|
|
|
{ value: 'inapp', label: 'In-app (pdf-lib)' },
|
|
|
|
|
],
|
|
|
|
|
defaultValue: 'documenso-template',
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
export default function DocumensoSettingsPage() {
|
|
|
|
|
return (
|
|
|
|
|
<div className="space-y-6">
|
feat(mobile): swap admin page headers to PageHeader
Mechanical sweep replacing the plain h1+p header markup with the
mobile-aware PageHeader primitive across 12 admin pages: index,
backup, branding, documenso, email, import, invitations, monitoring,
onboarding, reminders, reports, webhooks. Webhooks "Add Webhook"
button preserved via the actions slot.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 12:57:52 +02:00
|
|
|
<PageHeader
|
|
|
|
|
title="Documenso & EOI"
|
|
|
|
|
description="API credentials and default EOI generation pathway. Use the test-connection button to verify a saved configuration before relying on it."
|
|
|
|
|
/>
|
feat(admin): per-port email/Documenso/branding/reminder settings + invitations
Centralizes everything operators need to configure into the admin panel,
each setting per-port with env fallback.
New admin pages
- /admin landing page linking to every admin section as a card
- /admin/email FROM name+address, reply-to, signature/footer HTML,
optional SMTP host/port/user/pass override
- /admin/documenso API URL+key override, EOI Documenso template ID,
default EOI pathway (documenso-template vs inapp),
"Test connection" button
- /admin/branding logo URL, primary color, app name, email
header/footer HTML
- /admin/reminders port-level defaults for new interests +
port-wide daily-digest delivery window
- /admin/invitations send / list / resend / revoke CRM invitations
Per-user reminder digest
- /notifications/preferences gains a Reminder digest card:
immediate / daily / weekly / off, with HH:MM, day-of-week,
IANA timezone fields. Stored in user_profiles.preferences.reminders.
Plumbing
- port-config.ts typed accessors (getPortEmailConfig, getPortDocumensoConfig,
getPortBrandingConfig, getPortReminderConfig) — settings → env fallback.
- sendEmail accepts optional portId; resolves From/SMTP from settings
when supplied.
- documensoFetch + downloadSignedPdf accept optional portId; each public
function takes it through. checkDocumensoHealth() backs the test button.
- crm-invite.service gains listCrmInvites / revokeCrmInvite / resendCrmInvite
with audit-log entries (revoke_invite, resend_invite added to AuditAction).
- AdminLandingPage card grid + shared SettingsFormCard component to remove
per-page form boilerplate.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 23:21:54 +02:00
|
|
|
|
|
|
|
|
<SettingsFormCard
|
|
|
|
|
title="Documenso API"
|
|
|
|
|
description="Per-port API credentials. Leave blank to use the global env defaults."
|
|
|
|
|
fields={API_FIELDS}
|
|
|
|
|
extra={<DocumensoTestButton />}
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
<SettingsFormCard
|
|
|
|
|
title="EOI generation"
|
|
|
|
|
description="Default pathway and template used when an interest's EOI is generated."
|
|
|
|
|
fields={EOI_FIELDS}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|