Преглед на файлове

fix(ui): use 7-day trend window and unclip pie labels

Default analytics range is now 7 days for a clearer send trend, and the
status distribution pie leaves margin so outside labels are not cropped.

AI-Co-Authored-By: Grok
chendeben преди 1 месец
родител
ревизия
402b18f681

+ 2 - 2
public/app.js

@@ -143,7 +143,7 @@ async function refreshAll() {
       api('/api/config'),
       api('/api/domains'),
       api('/api/events'),
-      api('/api/analytics?days=30'),
+      api('/api/analytics?days=7'),
       api('/api/smtp-credential'),
       api('/api/dns-credentials'),
       api('/api/api-tokens')
@@ -1308,7 +1308,7 @@ async function sendTest(form) {
     await api(`/api/domains/${id}/test-send`, { method: 'POST', body: JSON.stringify(data) });
     const [events, analytics] = await Promise.all([
       api('/api/events'),
-      api('/api/analytics?days=30')
+      api('/api/analytics?days=7')
     ]);
     state.events = events.events || [];
     state.analytics = analytics.analytics || state.analytics;

Файловите разлики са ограничени, защото са твърде много
+ 0 - 1
public/assets/index-Ct8zandB.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
public/assets/login-B5MFdD7e.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
public/assets/styles-DhFdDZ_K.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
public/assets/styles-DnGt72Bi.css


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
public/assets/styles-_IX60o7a.css


+ 3 - 3
public/index.html

@@ -4,9 +4,9 @@
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>MailHub</title>
-    <script type="module" crossorigin src="/assets/index-RYmNqsdv.js"></script>
-    <link rel="modulepreload" crossorigin href="/assets/styles-QhtMJdIX.js">
-    <link rel="stylesheet" crossorigin href="/assets/styles-DnGt72Bi.css">
+    <script type="module" crossorigin src="/assets/index-Ct8zandB.js"></script>
+    <link rel="modulepreload" crossorigin href="/assets/styles-DhFdDZ_K.js">
+    <link rel="stylesheet" crossorigin href="/assets/styles-_IX60o7a.css">
     <link rel="stylesheet" crossorigin href="/assets/index-Tu04tXLf.css">
   </head>
   <body>

+ 3 - 3
public/login.html

@@ -4,9 +4,9 @@
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>MailHub Auth</title>
-    <script type="module" crossorigin src="/assets/login-CPmqxgxE.js"></script>
-    <link rel="modulepreload" crossorigin href="/assets/styles-QhtMJdIX.js">
-    <link rel="stylesheet" crossorigin href="/assets/styles-DnGt72Bi.css">
+    <script type="module" crossorigin src="/assets/login-B5MFdD7e.js"></script>
+    <link rel="modulepreload" crossorigin href="/assets/styles-DhFdDZ_K.js">
+    <link rel="stylesheet" crossorigin href="/assets/styles-_IX60o7a.css">
   </head>
   <body>
     <div id="auth-root"></div>

+ 3 - 3
src/db.js

@@ -826,7 +826,7 @@ export function listSendEvents(userId, limit = 30) {
     }));
 }
 
-export function getSendAnalytics(userId, { days = 30 } = {}) {
+export function getSendAnalytics(userId, { days = 7 } = {}) {
   const windowDays = clampAnalyticsDays(days);
   const since = new Date();
   since.setUTCHours(0, 0, 0, 0);
@@ -1709,8 +1709,8 @@ function clampTtl(value) {
 }
 
 function clampAnalyticsDays(value) {
-  const days = Number(value || 30);
-  if (!Number.isInteger(days) || days < 7) return 30;
+  const days = Number(value || 7);
+  if (!Number.isInteger(days) || days < 7) return 7;
   if (days > 90) return 90;
   return days;
 }

+ 2 - 2
src/frontend/App.tsx

@@ -101,7 +101,7 @@ function MailHubConsole() {
         api.config(),
         api.domains(),
         api.events(),
-        api.analytics(30),
+        api.analytics(7),
         api.smtpCredential(),
         api.smtpCredentials(),
         api.smtpRelays(),
@@ -245,7 +245,7 @@ function MailHubConsole() {
     const values = await testForm.validateFields();
     await runAction(async () => api.sendTest(testDomain.id, values), t('actions.testMailQueued'));
     setTestDomain(null);
-    const [events, analytics] = await Promise.all([api.events(), api.analytics(30)]);
+    const [events, analytics] = await Promise.all([api.events(), api.analytics(7)]);
     setData((current) => ({ ...current, events: events.events || [], analytics: analytics.analytics || current.analytics }));
   }
 

+ 1 - 1
src/frontend/services/api.ts

@@ -89,7 +89,7 @@ export const api = {
   config: () => request<RuntimeConfig>('/api/config'),
   domains: () => request<{ domains: Domain[] }>('/api/domains'),
   events: () => request<{ events: SendEvent[] }>('/api/events'),
-  analytics: (days = 30) => request<{ analytics: Analytics }>(`/api/analytics?days=${days}`),
+  analytics: (days = 7) => request<{ analytics: Analytics }>(`/api/analytics?days=${days}`),
   smtpCredential: () => request<{ credential: SmtpCredential | null }>('/api/smtp-credential'),
   saveSmtpCredential: (data: { username: string; password?: string }) =>
     request<{ credential: SmtpCredential }>('/api/smtp-credential', { method: 'PUT', data }),

+ 7 - 0
src/frontend/styles.css

@@ -228,6 +228,13 @@ body {
 
 .chart-card .ant-card-body {
   min-height: 364px;
+  overflow: visible;
+}
+
+.chart-card .g2-tooltip,
+.chart-card canvas,
+.chart-card svg {
+  overflow: visible;
 }
 
 .language-select {

+ 13 - 2
src/pages/Dashboard.tsx

@@ -132,8 +132,13 @@ export default function Dashboard({ analytics, domains, events, config, smtpCred
                 data={statusData}
                 angleField="value"
                 colorField="label"
-                innerRadius={0.64}
+                radius={0.68}
+                innerRadius={0.48}
                 height={316}
+                marginLeft={24}
+                marginRight={24}
+                marginTop={8}
+                marginBottom={8}
                 scale={{
                   color: {
                     range: [brandColors.chartSuccess, brandColors.chartDanger, brandColors.chartWarning]
@@ -142,7 +147,13 @@ export default function Dashboard({ analytics, domains, events, config, smtpCred
                 label={{
                   text: (datum: { label?: string; value?: number }) =>
                     `${datum.label || ''}${datum.value != null ? ` ${datum.value}` : ''}`,
-                  position: 'outside'
+                  position: 'outside',
+                  transform: [{ type: 'overlapDodgeY' }],
+                  style: {
+                    fontSize: 12,
+                    textAlign: 'center'
+                  },
+                  connector: true
                 }}
                 legend={{ color: { position: 'bottom' } }}
                 tooltip={{

+ 1 - 1
src/server.js

@@ -263,7 +263,7 @@ async function handleApi(req, res, url, user) {
     return sendJson(res, 200, { events: listSendEvents(user.id) });
   }
   if (method === 'GET' && pathname === '/api/analytics') {
-    return sendJson(res, 200, { analytics: getSendAnalytics(user.id, { days: Number(url.searchParams.get('days') || 30) }) });
+    return sendJson(res, 200, { analytics: getSendAnalytics(user.id, { days: Number(url.searchParams.get('days') || 7) }) });
   }
   if (method === 'GET' && pathname === '/api/smtp-credential') {
     return sendJson(res, 200, { credential: getSmtpCredential(user.id, { includePassword: true }) });

Някои файлове не бяха показани, защото твърде много файлове са промени