| 1 |
- import{a as e,n as t,r as n}from"./react-dom-stZKkA6x.js";import{a as r,c as i,d as a,r as o,u as s}from"./theme-DjPzgo6g.js";import{G as c,i as l,kt as u,n as d,t as f}from"./jsx-runtime-dm82oUI8.js";import{a as p,o as m}from"./grid-BmaFEMOO.js";import{n as h,t as g}from"./table-CSW7F8Qw.js";import{n as _,r as v,t as y}from"./StatusPill-IFsKXy8H.js";import{t as b}from"./input-number-5vwSxUlw.js";import{t as x}from"./descriptions-vs1os_w7.js";import{t as S}from"./form-CvEcrSb3.js";import{t as C}from"./input-0_Xo22Fl.js";import{t as w}from"./modal-B8KcNGBa.js";import{t as T}from"./switch-CsMGEdLR.js";import{t as E}from"./ReloadOutlined-C3S2BDne.js";import{_ as D,a as O,h as k,l as A,m as j,n as M,p as ee}from"./index-BCIgegZI.js";import{t as N}from"./EmptyState-rI31ioMm.js";var P=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:`M759 335c0-137-111-248-248-248S263 198 263 335c0 82.8 40.6 156.2 103 201.2-.4.2-.7.3-.9.4-44.7 18.9-84.8 46-119.3 80.6a373.42 373.42 0 00-80.4 119.5A373.6 373.6 0 00136 874.8a8 8 0 008 8.2h59.9c4.3 0 7.9-3.5 8-7.8 2-77.2 32.9-149.5 87.6-204.3C356 614.2 431 583 511 583c137 0 248-111 248-248zM511 507c-95 0-172-77-172-172s77-172 172-172 172 77 172 172-77 172-172 172zm105 221h264c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H703.5l47.2-60.1a8.1 8.1 0 001.7-4.9c0-4.4-3.6-8-8-8h-72.6c-4.9 0-9.5 2.3-12.6 6.1l-68.5 87.1c-4.4 5.6-6.8 12.6-6.8 19.8.1 17.7 14.4 32 32.1 32zm240 64H592c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h176.5l-47.2 60.1a8.1 8.1 0 00-1.7 4.9c0 4.4 3.6 8 8 8h72.6c4.9 0 9.5-2.3 12.6-6.1l68.5-87.1c4.4-5.6 6.8-12.6 6.8-19.8-.1-17.7-14.4-32-32.1-32z`}}]},name:`user-switch`,theme:`outlined`}})),F=e(t()),I=e(P());function L(){return L=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},L.apply(this,arguments)}var R=F.forwardRef((e,t)=>F.createElement(s,L({},e,{ref:t,icon:I.default}))),z={pending_email:{label:`待验证邮箱`,color:`gold`},pending_review:{label:`待管理员审核`,color:`blue`},active:{label:`正常`,color:`green`},disabled:{label:`已禁用`,color:`red`}},B=[[`domains`,`域名`],[`dnsCredentials`,`DNS 凭据`],[`apiTokens`,`API Token`],[`inboundMailboxes`,`收信邮箱`],[`inboundMessages`,`入站邮件`],[`sendEvents`,`发送记录`],[`smtpCredential`,`SMTP 凭据`]];function V(e){return z[e]||{label:String(e||`未知`),color:`default`}}function H(e,t){return`MERGE ${e?.username||e?.id||``} INTO ${t?.username||t?.id||``}`}function U(e){let t=e?.selectedCounts||{};return B.map(([e,n])=>({key:e,label:n,count:Number(t[e]||0)}))}function te(e){let t=re({host:e?.host,port:e?.port===``||e?.port==null?void 0:Number(e.port),secure:e?.secure,username:e?.username,password:e?.password,fromEmail:e?.fromEmail});return typeof t.password==`string`&&t.password.trim()===``&&delete t.password,t}function ne(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e||{}))r===``||r==null||t.set(n,String(r));return t.toString()}function re(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==``&&e!=null))}var W=f(),ie=[`pending_email`,`pending_review`,`active`,`disabled`],G=[`user`,`admin`],K=[`users`,`resources`,`migration`,`system-email`,`audit-logs`],ae=[[`transferDomains`,`迁移域名`,`Transfer domains`],[`transferDnsCredentials`,`迁移 DNS 凭据`,`Transfer DNS credentials`],[`transferApiTokens`,`迁移 API Token`,`Transfer API tokens`],[`transferSendEvents`,`迁移发送记录`,`Transfer sending activity`],[`transferSmtpCredential`,`迁移 SMTP 凭据`,`Transfer SMTP credential`],[`disableSource`,`禁用源用户`,`Disable source user`]];function q(){let{message:e,modal:t}=a.useApp(),{locale:n,t:i}=r(),{user:s}=M(),c=ee(),f=j(),[m,h]=k(),g=m.toString(),y=K.includes(f.section)?f.section:`users`,[b,x]=(0,F.useState)([]),[S,C]=(0,F.useState)(null),[w,T]=(0,F.useState)(null),[D,O]=(0,F.useState)([]),[A,N]=(0,F.useState)(!1),[P,I]=(0,F.useState)(()=>new Set),L=(0,F.useRef)(new Set),R=(0,F.useRef)(0);if((0,F.useEffect)(()=>{(!f.section||!K.includes(f.section))&&c(`/admin/users`,{replace:!0})},[c,f.section]),(0,F.useEffect)(()=>(s?.role===`admin`&&z(y,y===`audit-logs`,g),()=>{y===`audit-logs`&&(R.current+=1)}),[y,g,s?.role]),s?.role!==`admin`)return(0,W.jsxs)(l,{direction:`vertical`,size:20,className:`full-width`,children:[(0,W.jsx)(v,{title:i(`admin.title`)}),(0,W.jsx)(_,{children:(0,W.jsx)(d.Text,{type:`secondary`,children:i(`settings.noPermission`)})})]});async function z(t,r=!1,i=g,a=!0){if(!r&&L.current.has(t)){a&&N(!1);return}let s=null;a&&N(!0);try{if(t===`users`||t===`migration`){let e=await o.adminUsers();x(e.users||[])}else if(t===`resources`){let[e,t]=await Promise.all([o.adminUsers(),o.adminResources()]);x(e.users||[]),C(t.inventory||null)}else if(t===`system-email`){let e=await o.adminSystemEmail();T(e.settings||null)}else if(t===`audit-logs`){s=++R.current;let[e,t]=await Promise.all([o.adminUsers(),o.adminAuditLogs(i)]);if(s!==R.current)return;x(e.users||[]),O(t.logs||[])}L.current.add(t)}catch(t){if(s!==null&&s!==R.current)return;e.error(t instanceof Error?t.message:Q(n,`管理员数据加载失败`,`Failed to load admin data`))}finally{a&&(s===null||s===R.current)&&N(!1)}}async function B(t,r,i,a=!0){I(e=>new Set(e).add(t));try{await r(),e.success(i),a&&await z(y,!0,g,!1)}catch(t){e.error(t instanceof Error?t.message:Q(n,`操作失败`,`Operation failed`))}finally{I(e=>{let n=new Set(e);return n.delete(t),n})}}function V(e,n){t.confirm({title:e,okText:i(`common.confirm`),cancelText:i(`common.cancel`),onOk:n})}async function H(e){let t=new URLSearchParams(e),n=t.toString();if(n===g){await z(`audit-logs`,!0,n);return}h(t)}let U=[{key:`users`,label:i(`admin.users`),children:(0,W.jsx)(oe,{users:b,loading:A,actionKeys:P,onApprove:e=>V(Q(n,`确认审批用户 ${e.username}?`,`Approve user ${e.username}?`),()=>B(`approve:${e.id}`,()=>o.approveAdminUser(e.id),Q(n,`用户已审批`,`User approved`))),onResendVerification:e=>B(`resend:${e.id}`,()=>o.resendAdminVerification(e.id),Q(n,`验证邮件请求已提交`,`Verification email requested`)),onPasswordReset:e=>V(Q(n,`确认给 ${e.email} 发送密码重置邮件?`,`Send a password reset email to ${e.email}?`),()=>B(`reset:${e.id}`,()=>o.sendAdminPasswordReset(e.id),Q(n,`密码重置邮件请求已提交`,`Password reset email requested`))),onTemporaryPassword:(e,t)=>V(Q(n,`确认为用户 ${e.username} 设置临时密码?`,`Set a temporary password for ${e.username}?`),()=>B(`temporary-password:${e.id}`,()=>o.setAdminTemporaryPassword(e.id,t),Q(n,`临时密码已设置`,`Temporary password set`))),onUpdateUser:(e,t)=>V(Q(n,`确认更新用户 ${e.username}?`,`Update user ${e.username}?`),()=>B(`update:${e.id}`,()=>o.updateAdminUser(e.id,t),Q(n,`用户已更新`,`User updated`)))})},{key:`resources`,label:i(`admin.resources`),children:(0,W.jsx)(se,{users:b,inventory:S,loading:A,actionKeys:P,onTransferDomain:(e,t)=>B(`transfer-domain:${e}`,()=>o.transferAdminDomain(e,t),Q(n,`域名已迁移`,`Domain transferred`)),onTransferDnsCredential:(e,t)=>B(`transfer-dns:${e}`,()=>o.transferAdminDnsCredential(e,t),Q(n,`DNS 凭据已迁移`,`DNS credential transferred`)),onTransferApiTokens:e=>B(`transfer-token`,()=>o.transferAdminApiTokens(e),Q(n,`API Token 已迁移`,`API tokens transferred`))})},{key:`migration`,label:i(`admin.migration`),children:(0,W.jsx)(le,{users:b,loading:A,actionKeys:P,onPreview:e=>o.previewUserMerge(e),onExecute:e=>B(`merge`,()=>o.executeUserMerge(e),Q(n,`用户资源已合并`,`User resources merged`))})},{key:`system-email`,label:i(`admin.systemEmail`),children:(0,W.jsx)(ue,{settings:w,loading:A,actionKeys:P,onSave:e=>B(`system-email:save`,()=>o.saveAdminSystemEmail(e),Q(n,`系统邮件配置已保存`,`System email settings saved`)),onTest:e=>B(`system-email:test`,()=>o.testAdminSystemEmail(e),Q(n,`测试邮件请求已提交`,`Test email requested`),!1)})},{key:`audit-logs`,label:i(`admin.auditLogs`),children:(0,W.jsx)(de,{logs:D,users:b,query:g,loading:A,onSearch:H})}];return(0,W.jsxs)(l,{direction:`vertical`,size:20,className:`full-width`,children:[(0,W.jsx)(v,{title:i(`admin.title`),extra:(0,W.jsx)(u,{icon:(0,W.jsx)(E,{}),loading:A,onClick:()=>void z(y,!0),children:i(`common.refresh`)})}),(0,W.jsx)(_,{children:(0,W.jsx)(p,{activeKey:y,items:U,destroyOnHidden:!0,onChange:e=>c(`/admin/${e}`)})})]})}function oe({users:e,loading:t,actionKeys:n,onApprove:a,onResendVerification:o,onPasswordReset:s,onTemporaryPassword:f,onUpdateUser:p}){let{locale:m}=r(),[h,_]=(0,F.useState)(null),[v]=S.useForm(),y=[{title:`ID`,dataIndex:`id`,width:80},{title:Q(m,`用户`,`User`),render:(e,t)=>(0,W.jsxs)(l,{direction:`vertical`,size:0,children:[(0,W.jsx)(d.Text,{strong:!0,children:t.username}),(0,W.jsx)(d.Text,{type:`secondary`,children:t.email})]})},{title:Q(m,`状态`,`Status`),dataIndex:`status`,width:180,render:(e,t)=>{let r=X(n,t.id);return(0,W.jsx)(c,{value:t.status,loading:n.has(`update:${t.id}`),disabled:r,options:ie.map(e=>({value:e,label:$(e,m)})),onChange:e=>p(t,{status:e}),className:`table-select`})}},{title:Q(m,`角色`,`Role`),dataIndex:`role`,width:140,render:(e,t)=>{let r=X(n,t.id);return(0,W.jsx)(c,{value:t.role,loading:n.has(`update:${t.id}`),disabled:r,options:G.map(e=>({value:e,label:e})),onChange:e=>p(t,{role:e}),className:`table-select`})}},{title:Q(m,`资源`,`Resources`),render:(e,t)=>(0,W.jsx)(J,{counts:t.resourceCounts})},{title:Q(m,`创建时间`,`Created at`),dataIndex:`createdAt`,width:190,render:Y},{title:Q(m,`操作`,`Actions`),width:380,render:(e,t)=>{let r=X(n,t.id);return(0,W.jsxs)(l,{wrap:!0,children:[(0,W.jsx)(u,{icon:(0,W.jsx)(A,{}),disabled:r||t.status!==`pending_review`,loading:n.has(`approve:${t.id}`),onClick:()=>a(t),children:Q(m,`审批`,`Approve`)}),(0,W.jsx)(u,{icon:(0,W.jsx)(i,{}),disabled:r||t.status!==`pending_email`,loading:n.has(`resend:${t.id}`),onClick:()=>o(t),children:Q(m,`重发验证`,`Resend verification`)}),(0,W.jsx)(u,{disabled:r,icon:(0,W.jsx)(O,{}),loading:n.has(`reset:${t.id}`),onClick:()=>s(t),children:Q(m,`重置邮件`,`Reset email`)}),(0,W.jsx)(u,{disabled:r,icon:(0,W.jsx)(R,{}),loading:n.has(`temporary-password:${t.id}`),onClick:()=>_(t),children:Q(m,`临时密码`,`Temporary password`)})]})}}];async function b(){if(!h)return;let e=await v.validateFields();f(h,e.password),_(null),v.resetFields()}return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(g,{rowKey:`id`,columns:y,dataSource:e,loading:t,scroll:{x:1100}}),(0,W.jsx)(w,{title:h?`${Q(m,`设置临时密码`,`Set temporary password`)} · ${h.username}`:Q(m,`设置临时密码`,`Set temporary password`),open:!!h,confirmLoading:n.has(`temporary-password:${h?.id}`),onCancel:()=>_(null),onOk:b,children:(0,W.jsx)(S,{form:v,layout:`vertical`,children:(0,W.jsx)(S.Item,{name:`password`,label:Q(m,`临时密码`,`Temporary password`),rules:[{required:!0,min:8,message:Q(m,`密码至少需要 8 位。`,`Password must be at least 8 characters.`)}],children:(0,W.jsx)(C.Password,{autoComplete:`new-password`})})})})]})}function se({users:e,inventory:t,loading:n,actionKeys:i,onTransferDomain:a,onTransferDnsCredential:o,onTransferApiTokens:s}){let{locale:f}=r(),[p]=S.useForm(),[h]=S.useForm(),[v]=S.useForm(),b=S.useWatch(`domainId`,p),x=S.useWatch(`credentialId`,h),C=t?.users||[],T=e.filter(e=>e.status!==`disabled`).map(e=>({value:e.id,label:`${e.username} (#${e.id})`})),E=C.flatMap(e=>e.domains.map(t=>({...t,owner:e.user}))),D=C.flatMap(e=>e.dnsCredentials.map(t=>({...t,owner:e.user}))),O=C.flatMap(e=>e.apiTokens.map(t=>({...t,owner:e.user}))),k=[{title:Q(f,`用户`,`User`),render:(e,t)=>(0,W.jsxs)(l,{children:[(0,W.jsx)(d.Text,{strong:!0,children:t.user.username}),(0,W.jsx)(fe,{status:t.user.status})]})},{title:Q(f,`资源`,`Resources`),render:(e,t)=>(0,W.jsx)(J,{counts:t.user.resourceCounts})},{title:Q(f,`发送记录`,`Sending activity`),dataIndex:`sendEventCount`,width:120},{title:Q(f,`入站邮件`,`Inbound mail`),dataIndex:`inboundMessageCount`,width:120},{title:`SMTP`,width:120,render:(e,t)=>t.smtpCredential?(0,W.jsx)(y,{tone:`success`,children:Q(f,`已配置`,`Configured`)}):(0,W.jsx)(y,{tone:`neutral`,children:Q(f,`无`,`None`)})}];async function A(e){w.confirm({title:Q(f,`确认迁移该域名?`,`Transfer this domain?`),onOk:async()=>{await a(e.domainId,{targetUserId:e.targetUserId,dnsCredentialMode:e.dnsCredentialMode}),p.resetFields()}})}async function j(e){w.confirm({title:Q(f,`确认迁移该 DNS 凭据?`,`Transfer this DNS credential?`),onOk:async()=>{await o(e.credentialId,{targetUserId:e.targetUserId}),h.resetFields()}})}async function M(e){w.confirm({title:Q(f,`确认迁移 ${e.tokenIds.length} 个 API Token?`,`Transfer ${e.tokenIds.length} API tokens?`),onOk:async()=>{await s({tokenIds:e.tokenIds,targetUserId:e.targetUserId}),v.resetFields()}})}return(0,W.jsxs)(l,{direction:`vertical`,size:16,className:`full-width`,children:[t?.warnings?.length?(0,W.jsx)(m,{type:`warning`,showIcon:!0,message:Q(f,`发现 ${t.warnings.length} 个 DNS 凭据归属不一致的域名`,`${t.warnings.length} domains have mismatched DNS credential ownership`)}):null,(0,W.jsxs)(`div`,{className:`form-grid three`,children:[(0,W.jsx)(_,{title:Q(f,`迁移域名`,`Transfer domain`),children:(0,W.jsxs)(S,{form:p,layout:`vertical`,onFinish:A,disabled:n||i.has(`transfer-domain:${b}`),children:[(0,W.jsx)(S.Item,{name:`domainId`,label:Q(f,`域名`,`Domain`),rules:[{required:!0}],children:(0,W.jsx)(c,{showSearch:!0,optionFilterProp:`label`,options:E.map(e=>({value:e.id,label:`${e.domain} · ${e.owner.username}`}))})}),(0,W.jsx)(S.Item,{name:`targetUserId`,label:Q(f,`目标用户`,`Target user`),rules:[{required:!0}],children:(0,W.jsx)(c,{options:T})}),(0,W.jsx)(S.Item,{name:`dnsCredentialMode`,label:Q(f,`DNS 凭据`,`DNS credential`),initialValue:`domain_only`,children:(0,W.jsx)(c,{options:[{value:`domain_only`,label:Q(f,`仅迁移域名`,`Domain only`)},{value:`with_dns_credential`,label:Q(f,`连同 DNS 凭据迁移`,`Include DNS credential`)},{value:`clear_dns_credential`,label:Q(f,`清空 DNS 凭据绑定`,`Clear DNS credential binding`)}]})}),(0,W.jsx)(u,{type:`primary`,htmlType:`submit`,loading:i.has(`transfer-domain:${b}`),children:Q(f,`执行迁移`,`Transfer`)})]})}),(0,W.jsx)(_,{title:Q(f,`迁移 DNS 凭据`,`Transfer DNS credential`),children:(0,W.jsxs)(S,{form:h,layout:`vertical`,onFinish:j,disabled:n||i.has(`transfer-dns:${x}`),children:[(0,W.jsx)(S.Item,{name:`credentialId`,label:Q(f,`DNS 凭据`,`DNS credential`),rules:[{required:!0}],children:(0,W.jsx)(c,{showSearch:!0,optionFilterProp:`label`,options:D.map(e=>({value:e.id,label:`${e.name} · ${e.zoneName} · ${e.owner.username}`}))})}),(0,W.jsx)(S.Item,{name:`targetUserId`,label:Q(f,`目标用户`,`Target user`),rules:[{required:!0}],children:(0,W.jsx)(c,{options:T})}),(0,W.jsx)(u,{htmlType:`submit`,loading:i.has(`transfer-dns:${x}`),children:Q(f,`执行迁移`,`Transfer`)})]})}),(0,W.jsx)(_,{title:Q(f,`迁移 API Token`,`Transfer API tokens`),children:(0,W.jsxs)(S,{form:v,layout:`vertical`,onFinish:M,disabled:n||i.has(`transfer-token`),children:[(0,W.jsx)(S.Item,{name:`tokenIds`,label:`API Token`,rules:[{required:!0}],children:(0,W.jsx)(c,{mode:`multiple`,optionFilterProp:`label`,options:O.map(e=>({value:e.id,label:`${e.name} · ${e.tokenPrefix} · ${e.owner.username}`}))})}),(0,W.jsx)(S.Item,{name:`targetUserId`,label:Q(f,`目标用户`,`Target user`),rules:[{required:!0}],children:(0,W.jsx)(c,{options:T})}),(0,W.jsx)(u,{htmlType:`submit`,loading:i.has(`transfer-token`),children:Q(f,`执行迁移`,`Transfer`)})]})})]}),(0,W.jsx)(_,{title:Q(f,`资源归属`,`Resource ownership`),children:(0,W.jsx)(g,{rowKey:e=>e.user.id,columns:k,dataSource:C,loading:n,expandable:{expandedRowRender:e=>(0,W.jsx)(ce,{group:e})}})})]})}function ce({group:e}){let{locale:t}=r();return(0,W.jsxs)(l,{direction:`vertical`,size:16,className:`full-width`,children:[(0,W.jsxs)(x,{size:`small`,column:2,children:[(0,W.jsx)(x.Item,{label:Q(t,`邮箱`,`Email`),children:e.user.email}),(0,W.jsx)(x.Item,{label:Q(t,`角色`,`Role`),children:e.user.role})]}),(0,W.jsx)(g,{size:`small`,rowKey:`id`,pagination:!1,dataSource:e.domains,columns:[{title:Q(t,`域名`,`Domain`),dataIndex:`domain`},{title:Q(t,`发信主机`,`Sending host`),dataIndex:`senderHost`},{title:Q(t,`DNS 凭据 ID`,`DNS credential ID`),dataIndex:`dnsCredentialId`}]}),(0,W.jsx)(g,{size:`small`,rowKey:`id`,pagination:!1,dataSource:e.dnsCredentials,columns:[{title:Q(t,`DNS 凭据`,`DNS credential`),dataIndex:`name`},{title:`Provider`,dataIndex:`provider`},{title:`Zone`,dataIndex:`zoneName`}]}),(0,W.jsx)(g,{size:`small`,rowKey:`id`,pagination:!1,dataSource:e.apiTokens,columns:[{title:`API Token`,dataIndex:`name`},{title:Q(t,`前缀`,`Prefix`),dataIndex:`tokenPrefix`},{title:Q(t,`创建时间`,`Created at`),dataIndex:`createdAt`,render:Y}]})]})}function le({users:e,loading:t,actionKeys:n,onPreview:i,onExecute:o}){let{message:s}=a.useApp(),{locale:f}=r(),[p]=S.useForm(),[g,v]=(0,F.useState)(null),[b,w]=(0,F.useState)({}),[T,E]=(0,F.useState)(``),[D,O]=(0,F.useState)(!1),k=e.map(e=>({value:e.id,label:`${e.username} (#${e.id})`}));async function A(e){O(!0);try{let t=await i(e);v(t.preview),w(t.preview.defaultOptions),E(``)}catch(e){s.error(e instanceof Error?e.message:Q(f,`预览失败`,`Preview failed`))}finally{O(!1)}}async function j(){g&&(await o({sourceUserId:g.sourceUser.id,targetUserId:g.targetUser.id,options:b,confirmation:T}),v(null),p.resetFields(),E(``))}let M=g?H(g.sourceUser,g.targetUser):``;return(0,W.jsxs)(l,{direction:`vertical`,size:16,className:`full-width`,children:[(0,W.jsx)(_,{title:Q(f,`合并预览`,`Merge preview`),children:(0,W.jsxs)(S,{form:p,layout:`inline`,onFinish:A,disabled:t,children:[(0,W.jsx)(S.Item,{name:`sourceUserId`,label:Q(f,`源用户`,`Source user`),rules:[{required:!0}],children:(0,W.jsx)(c,{options:k,className:`toolbar-select`})}),(0,W.jsx)(S.Item,{name:`targetUserId`,label:Q(f,`目标用户`,`Target user`),rules:[{required:!0}],children:(0,W.jsx)(c,{options:k,className:`toolbar-select`})}),(0,W.jsx)(u,{type:g?`default`:`primary`,htmlType:`submit`,loading:D,children:Q(f,`预览`,`Preview`)})]})}),g?(0,W.jsx)(_,{title:`${g.sourceUser.username} → ${g.targetUser.username}`,children:(0,W.jsxs)(l,{direction:`vertical`,size:16,className:`full-width`,children:[g.warnings.length?(0,W.jsx)(m,{type:`warning`,showIcon:!0,message:g.warnings.map(e=>e.message||e.type).join(`;`)}):null,(0,W.jsx)(l,{wrap:!0,children:U(g).map(e=>(0,W.jsxs)(y,{tone:`neutral`,children:[he(e.key,f),`: `,e.count]},e.key))}),(0,W.jsx)(`div`,{className:`form-grid two`,children:ae.map(([e,t,n])=>(0,W.jsx)(h,{checked:b[e]!==!1,onChange:t=>w(n=>({...n,[e]:t.target.checked})),children:Q(f,t,n)},e))}),(0,W.jsx)(x,{column:1,bordered:!0,size:`small`,children:(0,W.jsx)(x.Item,{label:Q(f,`确认文本`,`Confirmation text`),children:(0,W.jsx)(d.Text,{code:!0,children:M})})}),(0,W.jsx)(C,{value:T,onChange:e=>E(e.target.value),placeholder:M}),(0,W.jsx)(u,{danger:!0,type:`primary`,loading:n.has(`merge`),disabled:T!==M,onClick:j,children:Q(f,`执行合并`,`Merge users`)})]})}):(0,W.jsx)(N,{description:Q(f,`暂无预览`,`No preview yet`)})]})}function ue({settings:e,loading:t,actionKeys:n,onSave:i,onTest:a}){let{locale:o}=r(),[s]=S.useForm();(0,F.useEffect)(()=>{e&&s.setFieldsValue(e)},[s,e]);async function c(e){await i(te(e)),s.setFieldValue(`password`,``)}return(0,W.jsx)(_,{title:Q(o,`系统邮件服务器`,`System email server`),children:(0,W.jsxs)(S,{form:s,layout:`vertical`,onFinish:c,disabled:t,children:[(0,W.jsxs)(`div`,{className:`form-grid two`,children:[(0,W.jsx)(S.Item,{name:`host`,label:`SMTP Host`,rules:[{required:!0}],children:(0,W.jsx)(C,{})}),(0,W.jsx)(S.Item,{name:`port`,label:`SMTP Port`,rules:[{required:!0}],children:(0,W.jsx)(b,{min:1,max:65535,className:`full-width`})}),(0,W.jsx)(S.Item,{name:`secure`,label:`SSL / TLS`,valuePropName:`checked`,children:(0,W.jsx)(T,{})}),(0,W.jsx)(S.Item,{name:`helo`,label:`HELO`,children:(0,W.jsx)(C,{})}),(0,W.jsx)(S.Item,{name:`username`,label:`Username`,children:(0,W.jsx)(C,{autoComplete:`off`})}),(0,W.jsx)(S.Item,{name:`password`,label:e?.passwordSet?Q(o,`Password(留空保留)`,`Password (leave blank to keep)`):`Password`,children:(0,W.jsx)(C.Password,{autoComplete:`new-password`})}),(0,W.jsx)(S.Item,{name:`fromEmail`,label:`From Email`,rules:[{required:!0,type:`email`}],children:(0,W.jsx)(C,{})}),(0,W.jsx)(S.Item,{name:`fromName`,label:`From Name`,children:(0,W.jsx)(C,{})}),(0,W.jsx)(S.Item,{name:`testRecipient`,label:`Test Recipient`,children:(0,W.jsx)(C,{})})]}),(0,W.jsxs)(l,{wrap:!0,children:[(0,W.jsx)(u,{type:`primary`,htmlType:`submit`,loading:n.has(`system-email:save`),children:Q(o,`保存配置`,`Save settings`)}),(0,W.jsx)(u,{onClick:()=>a(s.getFieldValue(`testRecipient`)),loading:n.has(`system-email:test`),children:Q(o,`发送测试`,`Send test`)})]})]})})}function de({logs:e,users:t,query:n,loading:i,onSearch:a}){let{locale:o}=r(),[s]=S.useForm(),f=t.map(e=>({value:e.id,label:`${e.username} (#${e.id})`}));(0,F.useEffect)(()=>{s.setFieldsValue(me(n))},[s,n]);let p=[{title:Q(o,`时间`,`Time`),dataIndex:`createdAt`,width:190,render:Y},{title:Q(o,`动作`,`Action`),dataIndex:`action`,width:220},{title:Q(o,`操作者`,`Actor`),dataIndex:`actorUserId`,width:130,render:e=>e??`system`},{title:Q(o,`目标用户`,`Target user`),dataIndex:`targetUserId`,width:130,render:e=>e??`-`},{title:Q(o,`目标`,`Target`),render:(e,t)=>`${t.targetType}:${t.targetId||`-`}`,width:180},{title:Q(o,`摘要`,`Summary`),dataIndex:`summary`,render:e=>(0,W.jsx)(d.Text,{code:!0,ellipsis:!0,children:JSON.stringify(e)})}];async function m(e){await a(ne(e))}return(0,W.jsxs)(l,{direction:`vertical`,size:16,className:`full-width`,children:[(0,W.jsx)(_,{className:`admin-audit-toolbar-card`,children:(0,W.jsxs)(S,{form:s,layout:`inline`,onFinish:m,disabled:i,children:[(0,W.jsx)(S.Item,{name:`actorUserId`,label:Q(o,`操作者`,`Actor`),children:(0,W.jsx)(c,{allowClear:!0,options:[{value:`system`,label:`system`},...f],className:`toolbar-select`})}),(0,W.jsx)(S.Item,{name:`targetUserId`,label:Q(o,`目标用户`,`Target user`),children:(0,W.jsx)(c,{allowClear:!0,options:f,className:`toolbar-select`})}),(0,W.jsx)(S.Item,{name:`action`,label:Q(o,`动作`,`Action`),children:(0,W.jsx)(C,{placeholder:`admin.user_merge`})}),(0,W.jsx)(S.Item,{name:`from`,label:Q(o,`开始`,`From`),children:(0,W.jsx)(C,{placeholder:`2026-07-08`})}),(0,W.jsx)(S.Item,{name:`to`,label:Q(o,`结束`,`To`),children:(0,W.jsx)(C,{placeholder:`2026-07-09`})}),(0,W.jsx)(u,{type:`primary`,htmlType:`submit`,loading:i,children:Q(o,`查询`,`Search`)})]})}),(0,W.jsx)(g,{rowKey:`id`,columns:p,dataSource:e,loading:i,scroll:{x:1100}})]})}function J({counts:e}){let{locale:t}=r();return e?(0,W.jsxs)(l,{wrap:!0,children:[(0,W.jsxs)(D,{children:[Q(t,`域名`,`Domains`),` `,e.domains]}),(0,W.jsxs)(D,{children:[`DNS `,e.dnsCredentials]}),(0,W.jsxs)(D,{children:[`Token `,e.apiTokens]}),(0,W.jsxs)(D,{children:[Q(t,`收信`,`Mailboxes`),` `,e.inboundMailboxes]}),(0,W.jsxs)(D,{children:[Q(t,`入站`,`Inbound`),` `,e.inboundMessages]}),(0,W.jsxs)(D,{children:[Q(t,`记录`,`Events`),` `,e.sendEvents]}),(0,W.jsxs)(D,{children:[`SMTP `,e.smtpCredential]})]}):(0,W.jsx)(D,{children:Q(t,`无资源`,`No resources`)})}function fe({status:e}){let t=V(e),{locale:n}=r();return(0,W.jsx)(y,{tone:pe(t.color),children:$(e,n)})}function pe(e){return e===`green`||e===`success`?`success`:e===`gold`||e===`orange`||e===`warning`?`warning`:e===`red`||e===`error`||e===`volcano`?`error`:e===`blue`||e===`processing`||e===`cyan`?`info`:`neutral`}function Y(e){return e?new Date(e).toLocaleString():`-`}function X(e,t){return[`update:${t}`,`approve:${t}`,`resend:${t}`,`reset:${t}`,`temporary-password:${t}`].some(t=>e.has(t))}function me(e){let t=new URLSearchParams(e),n=t.get(`actorUserId`),r=t.get(`targetUserId`);return{actorUserId:n===`system`?n:Z(n),targetUserId:Z(r),action:t.get(`action`)||void 0,from:t.get(`from`)||void 0,to:t.get(`to`)||void 0}}function Z(e){let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function Q(e,t,n){return e.startsWith(`en`)?n:t}function $(e,t){let n={pending_email:[`待验证邮箱`,`Email verification pending`],pending_review:[`待管理员审核`,`Admin review pending`],active:[`正常`,`Active`],disabled:[`已禁用`,`Disabled`]}[e];return n?Q(t,n[0],n[1]):e}function he(e,t){let n={domains:[`域名`,`Domains`],dnsCredentials:[`DNS 凭据`,`DNS credentials`],apiTokens:[`API Token`,`API tokens`],inboundMailboxes:[`收信邮箱`,`Mailboxes`],inboundMessages:[`入站邮件`,`Inbound mail`],sendEvents:[`发送记录`,`Sending activity`],smtpCredential:[`SMTP 凭据`,`SMTP credential`]}[e];return n?Q(t,n[0],n[1]):e}export{q as default};
|