Matt Ciaccio
4877b97f27
Build & Push Docker Images / lint (pull_request) Successful in 1m1s
Build & Push Docker Images / build-and-push (pull_request) Has been skipped
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
..
2026-03-26 11:52:51 +01:00
2026-04-08 19:45:56 -04:00
2026-04-24 14:25:10 +02:00
2026-04-24 12:02:08 +02:00
2026-04-24 12:07:58 +02:00
2026-03-26 11:52:51 +01:00
2026-04-26 13:48:06 +02:00
2026-04-26 13:57:54 +02:00
2026-03-26 11:52:51 +01:00
2026-03-26 11:52:51 +01:00
2026-03-26 11:52:51 +01:00
2026-04-27 21:54:32 +02:00
2026-04-26 13:57:54 +02:00
2026-04-24 16:02:00 +02:00
2026-03-26 11:52:51 +01:00
2026-03-26 11:52:51 +01:00
2026-04-08 15:53:33 -04:00
2026-04-08 16:27:34 -04:00
2026-03-26 11:52:51 +01:00
2026-04-24 12:15:22 +02:00
2026-04-27 21:54:32 +02:00
2026-04-08 15:47:11 -04:00
2026-03-26 11:52:51 +01:00
2026-03-26 11:52:51 +01:00
2026-04-08 15:53:33 -04:00
2026-03-26 11:52:51 +01:00
2026-04-27 23:21:54 +02:00
2026-04-27 21:54:32 +02:00
2026-03-26 11:52:51 +01:00
2026-04-23 23:35:30 +02:00