Dashboard-DG8Jzdjp.js 13 KB

12
  1. const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DashboardCharts-okY0rwB6.js","assets/react-dom-stZKkA6x.js","assets/theme-DjPzgo6g.js","assets/jsx-runtime-dm82oUI8.js","assets/theme-CT_1QDVH.css","assets/grid-BmaFEMOO.js","assets/table-CSW7F8Qw.js","assets/useForm-sdDvuRHy.js","assets/StatusPill-IFsKXy8H.js","assets/index-BCIgegZI.js","assets/modulepreload-polyfill-Dezn_h7o.js","assets/index-Tu04tXLf.css","assets/row-BogeM7vF.js","assets/EmptyState-rI31ioMm.js","assets/analytics-model-BpU8MjWz.js"])))=>i.map(i=>d[i]);
  2. import{a as e,n as t,r as n}from"./react-dom-stZKkA6x.js";import{a as r,r as i,u as a}from"./theme-DjPzgo6g.js";import{i as o,kt as s,n as c,st as l,t as u}from"./jsx-runtime-dm82oUI8.js";import{i as d,o as f}from"./grid-BmaFEMOO.js";import{n as p,r as m,t as h}from"./StatusPill-IFsKXy8H.js";import{n as g,t as _}from"./row-BogeM7vF.js";import{t as v}from"./segmented-DUpU-ING.js";import{t as y}from"./list-HagL8Wla.js";import{g as b,h as x,l as S,n as C,p as w,v as T}from"./index-BCIgegZI.js";import{t as ee}from"./EmptyState-rI31ioMm.js";import{t as E}from"./domain-model-BLOrIAIx.js";import{n as D}from"./analytics-model-BpU8MjWz.js";var O=n((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.default={icon:{tag:`svg`,attrs:{viewBox:`64 64 896 896`,focusable:`false`},children:[{tag:`path`,attrs:{d:`M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z`}}]},name:`arrow-right`,theme:`outlined`}})),k=e(t()),A=e(O());function j(){return j=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},j.apply(this,arguments)}var M=k.forwardRef((e,t)=>k.createElement(a,j({},e,{ref:t,icon:A.default}))),N=e(n((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.default={icon:{tag:`svg`,attrs:{viewBox:`64 64 896 896`,focusable:`false`},children:[{tag:`path`,attrs:{d:`M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z`}},{tag:`path`,attrs:{d:`M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z`}}]},name:`exclamation-circle`,theme:`outlined`}}))());function P(){return P=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},P.apply(this,arguments)}var te=k.forwardRef((e,t)=>k.createElement(a,P({},e,{ref:t,icon:N.default}))),F=u();function I({label:e,value:t,hint:n,tone:r=`default`}){return(0,F.jsxs)(d,{className:`metric-card metric-card--${r}`,children:[(0,F.jsx)(c.Text,{type:`secondary`,children:e}),(0,F.jsx)(c.Title,{level:3,className:`metric-value`,children:t}),n?(0,F.jsx)(c.Text,{type:`secondary`,className:`metric-card__hint`,children:n}):null]})}var L=(0,k.lazy)(()=>b(()=>import(`./DashboardCharts-okY0rwB6.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])));function R(){let{config:e}=C(),{locale:t}=r(),n=w(),[a,u]=x(),d=V(a.get(`range`)),b=H(a.get(`analysis`)),[E,O]=(0,k.useState)(null),[A,j]=(0,k.useState)(!0),[N,P]=(0,k.useState)(``),R=t.startsWith(`en`)?W:U,G=(0,k.useCallback)(async()=>{j(!0),P(``);try{let[e,t]=await Promise.all([i.analytics(d),i.domains()]),[n,r]=await Promise.allSettled([i.smtpCredential(),i.webhookDeliveries({status:`dead`,limit:5})]);O({analytics:e.analytics,domains:t.domains,smtpCredential:n.status===`fulfilled`?n.value.credential:null,failedWebhooks:r.status===`fulfilled`?r.value.deliveries:[]})}catch(e){P(e instanceof Error?e.message:R.loadFailed)}finally{j(!1)}},[R.loadFailed,d]);(0,k.useEffect)(()=>{G()},[G]);let K=(0,k.useMemo)(()=>E?B(E,R):[],[R,E]);function q(e){let t=new URLSearchParams(a);t.set(`range`,String(e)),u(t)}function J(e){let t=new URLSearchParams(a);e===`delivery`?t.delete(`analysis`):t.set(`analysis`,e),u(t)}if(A&&!E)return(0,F.jsxs)(o,{direction:`vertical`,size:20,className:`full-width`,"aria-label":R.loading,children:[(0,F.jsx)(l,{active:!0,title:{width:`28%`},paragraph:{rows:2}}),(0,F.jsx)(_,{gutter:[16,16],children:[0,1,2,3].map(e=>(0,F.jsx)(g,{xs:24,sm:12,xl:6,children:(0,F.jsx)(l.Node,{active:!0,style:{width:`100%`}})},e))}),(0,F.jsx)(p,{children:(0,F.jsx)(l,{active:!0,paragraph:{rows:8}})})]});if(N&&!E)return(0,F.jsx)(T,{status:`error`,title:R.loadFailed,subTitle:N,extra:(0,F.jsx)(s,{type:`primary`,onClick:()=>void G(),children:R.retry})});if(!E)return null;let{analytics:Y,domains:X}=E,Z=Y.summary,Q=D(Y),$=Number(Z.terminalFailed||Z.failed||0)+Number(Z.deferred||0)+Number(Z.pending||0);return(0,F.jsxs)(o,{direction:`vertical`,size:20,className:`full-width`,children:[e?.usingDefaultAdminPassword?(0,F.jsx)(f,{type:`warning`,showIcon:!0,message:R.defaultPassword}):null,N?(0,F.jsx)(f,{type:`error`,showIcon:!0,message:R.partialFailure,description:N,action:(0,F.jsx)(s,{size:`small`,onClick:()=>void G(),children:R.retry})}):null,(0,F.jsx)(m,{title:R.title,subtitle:R.subtitle,extra:(0,F.jsx)(v,{"aria-label":R.rangeLabel,value:d,onChange:q,options:[{label:R.last24Hours,value:1},{label:R.last7Days,value:7},{label:R.last30Days,value:30}]})}),(0,F.jsxs)(_,{gutter:[16,16],children:[(0,F.jsx)(g,{xs:24,sm:12,xl:6,children:(0,F.jsx)(I,{label:R.sent,value:Z.total||0,hint:`${Z.recipients||0} ${R.recipients}`})}),(0,F.jsx)(g,{xs:24,sm:12,xl:6,children:(0,F.jsx)(I,{label:R.deliveryRate,value:`${Z.deliveryRate||0}%`,hint:`${Z.delivered||0} ${R.delivered}`})}),(0,F.jsx)(g,{xs:24,sm:12,xl:6,children:(0,F.jsx)(I,{label:R.failuresAndDelays,value:$,tone:$?`danger`:`default`,hint:`${Z.terminalFailed||Z.failed||0} ${R.failed} · ${Z.deferred||0} ${R.deferred}`})}),(0,F.jsx)(g,{xs:24,sm:12,xl:6,children:(0,F.jsx)(I,{label:R.opensAndClicks,value:`${Q.openRate}% / ${Q.clickRate}%`,hint:`${Q.uniqueOpens} ${R.opens} · ${Q.uniqueClicks} ${R.clicks}`})})]}),(0,F.jsx)(p,{title:R.actionNeeded,extra:K.length?(0,F.jsxs)(h,{tone:`warning`,children:[K.length,` `,R.items]}):(0,F.jsx)(h,{tone:`success`,children:R.allClear}),children:K.length?(0,F.jsx)(y,{dataSource:K,renderItem:e=>(0,F.jsx)(y.Item,{actions:[(0,F.jsxs)(s,{type:`link`,onClick:()=>n(e.path),children:[e.label,` `,(0,F.jsx)(M,{})]},`resolve`)],children:(0,F.jsx)(y.Item.Meta,{avatar:(0,F.jsx)(te,{"aria-hidden":!0,style:{color:e.tone===`error`?`#dc2626`:`#d97706`,fontSize:20}}),title:(0,F.jsxs)(o,{wrap:!0,children:[(0,F.jsx)(c.Text,{strong:!0,children:e.title}),(0,F.jsx)(h,{tone:e.tone,children:R.needsAction})]}),description:e.description})})}):(0,F.jsx)(ee,{description:R.noActionNeeded,icon:(0,F.jsx)(S,{style:{color:`#16a34a`}})})}),Z.total?null:(0,F.jsx)(z,{domains:X,credential:E.smtpCredential,onNavigate:n,copy:R}),(0,F.jsx)(k.Suspense,{fallback:(0,F.jsx)(p,{children:(0,F.jsx)(l,{active:!0,paragraph:{rows:8}})}),children:(0,F.jsx)(L,{analytics:Y,copy:R,activeSection:b,onSectionChange:J})})]})}function z({domains:e,credential:t,onNavigate:n,copy:r}){let i=e.length>0,a=e.some(e=>E(e).status===`success`),o=!!t?.passwordSet,l=[{title:r.addDomain,done:i,path:`/domains`},{title:r.configureDns,done:a,path:i?`/domains/${e[0].id}/dns`:`/domains`},{title:r.createCredential,done:o,path:`/integrations/smtp`},{title:r.sendTest,done:!1,path:i?`/domains/${e[0].id}/sending`:`/domains`}];return(0,F.jsx)(p,{title:r.getReady,extra:(0,F.jsx)(c.Text,{type:`secondary`,children:r.getReadyHint}),children:(0,F.jsx)(y,{dataSource:l,renderItem:(e,t)=>(0,F.jsx)(y.Item,{actions:[(0,F.jsx)(s,{type:t===0&&!e.done?`primary`:`default`,onClick:()=>n(e.path),children:e.done?r.review:r.start},`go`)],children:(0,F.jsx)(y.Item.Meta,{avatar:e.done?(0,F.jsx)(S,{style:{color:`#16a34a`,fontSize:20}}):(0,F.jsx)(h,{tone:`neutral`,children:t+1}),title:(0,F.jsx)(c.Text,{delete:e.done,children:e.title})})})})})}function B(e,t){let n=e.domains.filter(e=>E(e).status!==`success`),r=e.analytics.recentFailures||[],i=[];return n.length&&i.push({key:`dns`,title:t.dnsNotReady(n.length),description:t.dnsNotReadyHint,tone:`warning`,label:t.reviewDomains,path:`/domains?status=error`}),r.length&&i.push({key:`failures`,title:t.recentFailures(r.length),description:r[0]?.detail||t.recentFailuresHint,tone:`error`,label:t.inspectActivity,path:`/activity?status=failed`}),e.failedWebhooks.length&&i.push({key:`webhooks`,title:t.webhookFailures(e.failedWebhooks.length),description:t.webhookFailuresHint,tone:`error`,label:t.reviewWebhooks,path:`/integrations/webhooks`}),e.smtpCredential?.passwordSet||i.push({key:`credential`,title:t.missingCredential,description:t.missingCredentialHint,tone:`warning`,label:t.configure,path:`/integrations/smtp`}),i}function V(e){return e===`1`?1:e===`30`?30:7}function H(e){return e===`engagement`?`engagement`:`delivery`}var U={title:`运行概览`,subtitle:`从投递健康开始,快速定位需要处理的问题。`,loading:`正在加载运行概览`,loadFailed:`概览加载失败`,retry:`重试`,rangeLabel:`统计时间范围`,last24Hours:`24 小时`,last7Days:`7 天`,last30Days:`30 天`,sent:`发送量`,recipients:`位收件人`,deliveryRate:`送达率`,delivered:`已送达`,failuresAndDelays:`失败 / 延迟`,failed:`失败`,deferred:`延迟`,opensAndClicks:`打开 / 点击`,opens:`打开`,clicks:`点击`,actionNeeded:`需要处理`,items:`项`,allClear:`状态正常`,needsAction:`需要处理`,noActionNeeded:`当前没有检测到需要处理的投递问题。`,partialFailure:`部分数据刷新失败`,defaultPassword:`当前仍在使用默认管理密码,请尽快在系统设置中更换。`,getReady:`发送就绪清单`,getReadyHint:`完成以下步骤后即可进行首次测试发送`,addDomain:`添加发信域名`,configureDns:`配置并验证 DNS`,createCredential:`创建 SMTP 或 API 凭据`,sendTest:`发送测试邮件`,review:`查看`,start:`开始`,deliveryQuality:`投递质量`,engagementAnalysis:`互动分析`,deliveryTrend:`发送与送达趋势`,engagementTrend:`打开与点击趋势`,domainRanking:`域名发送排行`,topLinks:`热门链接`,link:`链接`,uniqueClicks:`独立点击`,noDeliveryData:`当前范围暂无发送数据`,noDomainData:`暂无域名发送数据`,noEngagementData:`暂无互动数据`,dnsNotReady:e=>`${e} 个域名的 DNS 尚未就绪`,dnsNotReadyHint:`认证记录不完整可能导致投递失败或进入垃圾箱。`,reviewDomains:`处理域名`,recentFailures:e=>`最近发现 ${e} 条发送失败`,recentFailuresHint:`请检查投递响应和队列日志。`,inspectActivity:`查看活动`,webhookFailures:e=>`${e} 条 Webhook 投递已停止重试`,webhookFailuresHint:`请检查回调地址、签名校验和服务可用性。`,reviewWebhooks:`检查 Webhooks`,missingCredential:`尚未创建可用的 SMTP 凭据`,missingCredentialHint:`创建凭据后,应用才能通过 Submission 服务发送邮件。`,configure:`去配置`},W={title:`Operations overview`,subtitle:`Start with delivery health and move directly to issues that need attention.`,loading:`Loading operations overview`,loadFailed:`Unable to load overview`,retry:`Retry`,rangeLabel:`Analytics range`,last24Hours:`24 hours`,last7Days:`7 days`,last30Days:`30 days`,sent:`Sent`,recipients:`recipients`,deliveryRate:`Delivery rate`,delivered:`Delivered`,failuresAndDelays:`Failed / delayed`,failed:`Failed`,deferred:`Delayed`,opensAndClicks:`Opens / clicks`,opens:`Opens`,clicks:`Clicks`,actionNeeded:`Action needed`,items:`items`,allClear:`All clear`,needsAction:`Needs action`,noActionNeeded:`No delivery issues currently require attention.`,partialFailure:`Some data could not be refreshed`,defaultPassword:`The default administrator password is still in use. Change it in system settings.`,getReady:`Sending readiness`,getReadyHint:`Complete these steps before your first test send`,addDomain:`Add a sending domain`,configureDns:`Configure and verify DNS`,createCredential:`Create an SMTP or API credential`,sendTest:`Send a test email`,review:`Review`,start:`Start`,deliveryQuality:`Delivery quality`,engagementAnalysis:`Engagement`,deliveryTrend:`Sending and delivery trend`,engagementTrend:`Open and click trend`,domainRanking:`Domain ranking`,topLinks:`Top links`,link:`Link`,uniqueClicks:`Unique clicks`,noDeliveryData:`No sending data in this range`,noDomainData:`No domain sending data`,noEngagementData:`No engagement data`,dnsNotReady:e=>`${e} domains have incomplete DNS`,dnsNotReadyHint:`Incomplete authentication records can cause delivery failures or spam placement.`,reviewDomains:`Review domains`,recentFailures:e=>`${e} recent sends failed`,recentFailuresHint:`Inspect the delivery response and queue log.`,inspectActivity:`Inspect activity`,webhookFailures:e=>`${e} webhook deliveries stopped retrying`,webhookFailuresHint:`Check the callback endpoint, signature validation, and service availability.`,reviewWebhooks:`Review webhooks`,missingCredential:`No usable SMTP credential`,missingCredentialHint:`Create a credential before applications can use the Submission service.`,configure:`Configure`};export{R as default};