From 6eea3c068721a4379ee8dd7a60a38b7e506b0a12 Mon Sep 17 00:00:00 2001 From: flfeders Date: Tue, 13 Oct 2026 19:06:33 +0200 Subject: [PATCH] feat(portal): configure customer portal accent color in company settings --- backend/src/routes/auth/me.ts | 1 + backend/src/routes/tenant.ts | 10 +++++ frontend/pages/customer-portal.vue | 14 ++++--- frontend/pages/settings/tenant.vue | 62 ++++++++++++++++++++++++++++++ frontend/utils/portalTheme.ts | 32 +++++++++++++++ 5 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 frontend/utils/portalTheme.ts diff --git a/backend/src/routes/auth/me.ts b/backend/src/routes/auth/me.ts index ad013c7f..5af4fe53 100644 --- a/backend/src/routes/auth/me.ts +++ b/backend/src/routes/auth/me.ts @@ -58,6 +58,7 @@ export default async function meRoutes(server: FastifyInstance) { features: tenants.features, extraModules: tenants.extraModules, businessInfo: tenants.businessInfo, + portalConfig: tenants.portalConfig, numberRanges: tenants.numberRanges, accountChart: tenants.accountChart, taxEvaluationPeriod: tenants.taxEvaluationPeriod, diff --git a/backend/src/routes/tenant.ts b/backend/src/routes/tenant.ts index b67fb3a4..d9b913a5 100644 --- a/backend/src/routes/tenant.ts +++ b/backend/src/routes/tenant.ts @@ -271,6 +271,16 @@ export default async function tenantRoutes(server: FastifyInstance) { if (!data) return reply.code(400).send({ error: "data required" }) + if (Object.prototype.hasOwnProperty.call(data, "portalConfig")) { + const config = data.portalConfig + if (!config || typeof config !== "object" || Array.isArray(config) + || typeof config.primaryColor !== "string" || !/^#[0-9a-f]{6}$/i.test(config.primaryColor.trim())) { + return reply.code(400).send({ error: "Die Portal-Akzentfarbe muss ein Hex-Farbwert wie #69c350 sein." }) + } + data.portalConfig = { ...config, primaryColor: config.primaryColor.trim().toLowerCase() } + delete data.portalConfig.primayColor + } + const updated = await server.db .update(tenants) .set(data) diff --git a/frontend/pages/customer-portal.vue b/frontend/pages/customer-portal.vue index e5a00083..47d81525 100644 --- a/frontend/pages/customer-portal.vue +++ b/frontend/pages/customer-portal.vue @@ -1,5 +1,6 @@