| 1 |
- import{a as e,n as t,r as n}from"./react-dom-stZKkA6x.js";import{d as r,f as i,l as a,o,r as s}from"./theme-JEAJA3Ef.js";import{G as c,M as l,i as u,kt as d,n as f,st as p,t as m}from"./jsx-runtime-dm82oUI8.js";import{a as h,i as g,o as _}from"./grid-oQFtU3R0.js";import{n as v,r as y,t as b}from"./table-DZMCIB4H.js";import{n as x,t as S}from"./SectionCard-DDGEHf10.js";import{t as C}from"./input-number-5vwSxUlw.js";import{t as w}from"./descriptions-vs1os_w7.js";import{t as T}from"./form-lkDIWt8f.js";import{t as E}from"./input-0_Xo22Fl.js";import{t as D}from"./list-B0gNP0uN.js";import{t as O}from"./modal-DFePRHO7.js";import{t as k}from"./switch-CsMGEdLR.js";import{n as A,t as j}from"./EditOutlined-BiwqHVQr.js";import{t as M}from"./EllipsisOutlined-BPVXOKZP.js";import{t as N}from"./PlusOutlined-YlpF_uyR.js";import{t as ee}from"./ReloadOutlined-B6H5UA27.js";import{_ as P,a as F,b as te,h as ne,l as re,m as ie,n as I,p as L,t as ae,y as oe}from"./index-avDTLp8M.js";import{t as se}from"./EmptyState-rI31ioMm.js";import{t as ce}from"./MailboxPermissionTags-ORMgZe2y.js";import{t as R}from"./StatusPill-BM21x0ED.js";var z=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:`M824.2 699.9a301.55 301.55 0 00-86.4-60.4C783.1 602.8 812 546.8 812 484c0-110.8-92.4-201.7-203.2-200-109.1 1.7-197 90.6-197 200 0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 00-86.4 60.4C345 754.6 314 826.8 312 903.8a8 8 0 008 8.2h56c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5A226.62 226.62 0 01612 684c60.9 0 118.2 23.7 161.3 66.8C814.5 792 838 846.3 840 904.3c.1 4.3 3.7 7.7 8 7.7h56a8 8 0 008-8.2c-2-77-33-149.2-87.8-203.9zM612 612c-34.2 0-66.4-13.3-90.5-37.5a126.86 126.86 0 01-37.5-91.8c.3-32.8 13.4-64.5 36.3-88 24-24.6 56.1-38.3 90.4-38.7 33.9-.3 66.8 12.9 91 36.6 24.8 24.3 38.4 56.8 38.4 91.4 0 34.2-13.3 66.3-37.5 90.5A127.3 127.3 0 01612 612zM361.5 510.4c-.9-8.7-1.4-17.5-1.4-26.4 0-15.9 1.5-31.4 4.3-46.5.7-3.6-1.2-7.3-4.5-8.8-13.6-6.1-26.1-14.5-36.9-25.1a127.54 127.54 0 01-38.7-95.4c.9-32.1 13.8-62.6 36.3-85.6 24.7-25.3 57.9-39.1 93.2-38.7 31.9.3 62.7 12.6 86 34.4 7.9 7.4 14.7 15.6 20.4 24.4 2 3.1 5.9 4.4 9.3 3.2 17.6-6.1 36.2-10.4 55.3-12.4 5.6-.6 8.8-6.6 6.3-11.6-32.5-64.3-98.9-108.7-175.7-109.9-110.9-1.7-203.3 89.2-203.3 199.9 0 62.8 28.9 118.8 74.2 155.5-31.8 14.7-61.1 35-86.5 60.4-54.8 54.7-85.8 126.9-87.8 204a8 8 0 008 8.2h56.1c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5 29.4-29.4 65.4-49.8 104.7-59.7 3.9-1 6.5-4.7 6-8.7z`}}]},name:`team`,theme:`outlined`}})),B=e(t()),V=e(z());function le(){return le=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},le.apply(this,arguments)}var ue=B.forwardRef((e,t)=>B.createElement(r,le({},e,{ref:t,icon:V.default}))),de=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:`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`}}))());function H(){return H=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},H.apply(this,arguments)}var fe=B.forwardRef((e,t)=>B.createElement(r,H({},e,{ref:t,icon:de.default}))),U={pending_email:{label:`待验证邮箱`,color:`gold`},pending_review:{label:`待管理员审核`,color:`blue`},active:{label:`正常`,color:`green`},disabled:{label:`已禁用`,color:`red`}},pe=[[`domains`,`域名`],[`dnsCredentials`,`DNS 凭据`],[`apiTokens`,`API 密钥`],[`inboundMailboxes`,`收信邮箱`],[`inboundMessages`,`入站邮件`],[`sendEvents`,`发送记录`],[`smtpCredential`,`SMTP 凭据`]];function W(e){return U[e]||{label:String(e||`未知`),color:`default`}}function me(e,t){return`MERGE ${e?.username||e?.id||``} INTO ${t?.username||t?.id||``}`}function he(e){let t=e?.selectedCounts||{};return pe.map(([e,n])=>({key:e,label:n,count:Number(t[e]||0)}))}function ge(e){let t=ve({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 _e(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 ve(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==``&&e!=null))}var G=m(),ye=`mailbox-access:bulk`,K=500,q=500,be=5e3;function J({users:e}){let{message:t,modal:n}=i.useApp(),{t:r}=o(),a=ae(`(min-width: 768px)`),[l,m]=ne(),[h,x]=(0,B.useState)([]),[C,k]=(0,B.useState)(!0),[M,F]=(0,B.useState)(``),[re,ie]=(0,B.useState)(``),[I,L]=(0,B.useState)([]),[oe,R]=(0,B.useState)(``),[z,V]=(0,B.useState)([]),[le,de]=(0,B.useState)(!1),[H,fe]=(0,B.useState)(`upsert`),[U,pe]=(0,B.useState)([]),[W,me]=(0,B.useState)({view:!0,receive:!1,send:!1}),[he,ge]=(0,B.useState)(``),_e=(0,B.useRef)(null),ve=(0,B.useRef)(null),K=(0,B.useRef)(!1),q=(0,B.useRef)(!1),be=Ce(l.get(`mailboxId`)),J=be&&h.find(e=>e.mailbox.id===be)||null,De=(0,B.useCallback)(async()=>{k(!0),F(``);try{let e=(await s.adminMailboxAccess()).mailboxes||[],t=new Set(e.map(e=>e.mailbox.id));x(e),V(e=>e.filter(e=>t.has(e)))}catch(e){F(e instanceof Error?e.message:r(`common.error`))}finally{k(!1)}},[r]);(0,B.useEffect)(()=>{De()},[De]),(0,B.useEffect)(()=>{if(!J){L([]);return}L(J.grants.map(e=>({userId:e.user.id,...Se(e.permissions)})))},[J]);let Oe=(0,B.useMemo)(()=>{let e=re.trim().toLowerCase();return e?h.filter(t=>[t.mailbox.address,t.mailbox.displayName,t.owner.username,t.owner.email].some(t=>String(t||``).toLowerCase().includes(e))):h},[h,re]),ke=(0,B.useMemo)(()=>new Set(z),[z]),Ae=(0,B.useMemo)(()=>new Map(h.map(e=>[e.mailbox.id,e])),[h]),je=(0,B.useMemo)(()=>z.map(e=>Ae.get(e)).filter(e=>!!e),[Ae,z]),Y=(0,B.useMemo)(()=>Oe.map(e=>e.mailbox.id),[Oe]),Me=(0,B.useMemo)(()=>Y.filter(e=>ke.has(e)).length,[ke,Y]),Ne=(0,B.useMemo)(()=>e.filter(e=>H===`remove`||e.status!==`disabled`).map(e=>({value:e.id,label:`${e.username} · ${e.email}${e.status===`disabled`?` · ${r(`adminMailboxAccess.disabledUser`)}`:``}`})),[H,r,e]),Pe=(0,B.useMemo)(()=>{let e=new Set(U);return je.reduce((t,n)=>t+ +!!e.has(xe(n)),0)},[U,je]),X=we(r,z.length,U.length),Z=oe===ye;function Fe(e){let t=new URLSearchParams(l);t.set(`mailboxId`,String(e.mailbox.id)),m(t)}function Ie(){let e=be,t=new URLSearchParams(l);t.delete(`mailboxId`),m(t),e&&window.requestAnimationFrame(()=>{document.querySelector(`[data-mailbox-access-trigger="${e}"]`)?.focus()})}function Le(){let t=new Set(I.map(e=>e.userId)),n=J?xe(J):0,r=e.find(e=>e.id!==n&&e.status!==`disabled`&&!t.has(e.id));r&&L(e=>[...e,{userId:r.id,view:!0,receive:!1,send:!1}])}function Re(e,t){V(n=>{let r=new Set(n);return t?r.add(e):r.delete(e),[...r]})}function ze(e){V(t=>{let n=new Set(t);for(let t of Y)e?n.add(t):n.delete(t);return[...n]})}function Be(){if(!z.length)return;let e=we(r,z.length,0);if(e){t.error(e);return}fe(`upsert`),pe([]),me({view:!0,receive:!1,send:!1}),ge(``),q.current=!1,de(!0)}function Ve(t){if(fe(t),ge(``),t!==`upsert`)return;let n=new Set(e.filter(e=>e.status!==`disabled`).map(e=>e.id));pe(e=>e.filter(e=>n.has(e)))}function Q(e){me(t=>Se({...t,...e}))}function He(){if(K.current||!z.length||!U.length)return;let e=Se(W);if(H===`upsert`&&!e.view&&!e.receive&&!e.send){t.error(r(`adminMailboxAccess.permissionRequired`));return}if(X){t.error(X);return}let i={mailboxIds:[...z],userIds:[...U],operation:H,...H===`upsert`?{permissions:e}:{}};if(H!==`remove`){Ue(i);return}let a=n.confirm({title:r(`adminMailboxAccess.bulkRemoveConfirmTitle`),content:(0,G.jsxs)(u,{direction:`vertical`,size:12,className:`full-width`,children:[(0,G.jsx)(f.Text,{children:Te(r,i.mailboxIds.length,i.userIds.length)}),Pe?(0,G.jsxs)(f.Text,{type:`secondary`,children:[r(`adminMailboxAccess.bulkOwnerSkipPreview`),` `,Pe]}):null,(0,G.jsx)(_,{type:`warning`,showIcon:!0,message:r(`adminMailboxAccess.bulkRemoveConfirmWarning`)})]}),okText:r(`adminMailboxAccess.bulkRemoveAction`),cancelText:r(`common.cancel`),okButtonProps:{danger:!0,style:{minHeight:44}},cancelButtonProps:{"aria-label":r(`common.cancel`),style:{minHeight:44}},width:520,onOk:async()=>{a.update({keyboard:!1,maskClosable:!1,cancelButtonProps:{"aria-label":r(`common.cancel`),disabled:!0,style:{minHeight:44}}}),await Ue(i)}})}async function Ue(e){if(!K.current){K.current=!0,ge(``),R(ye);try{let n=await s.bulkUpdateAdminMailboxAccess(e),i=new Map(n.mailboxes.map(e=>[e.mailbox.id,e]));x(e=>e.map(e=>i.get(e.mailbox.id)||e)),t.success(Ee(r,e.operation,n.summary)),q.current=!0,V([]),de(!1)}catch(e){let n=e instanceof Error?e.message:r(`common.error`);ge(n),t.error(n)}finally{K.current=!1,R(``)}}}function We(e,t){L(n=>n.map((n,r)=>{if(r!==e)return n;let i={...n,...t};return(i.receive||i.send)&&(i.view=!0),i}))}async function $(){if(!J)return;if(I.find((e,t)=>I.some((n,r)=>r!==t&&n.userId===e.userId))){t.error(r(`adminMailboxAccess.duplicateUser`));return}if(I.some(e=>!e.view&&!e.receive&&!e.send)){t.error(r(`adminMailboxAccess.permissionRequired`));return}let e=`mailbox-access:${J.mailbox.id}`;R(e);try{let e=await s.saveAdminMailboxAccess(J.mailbox.id,I.map(e=>({userId:e.userId,...Se(e)})));x(t=>t.map(t=>t.mailbox.id===e.mailbox.mailbox.id?e.mailbox:t)),t.success(r(`adminMailboxAccess.saved`))}catch(e){t.error(e instanceof Error?e.message:r(`common.error`))}finally{R(``)}}function Ge(t){let n=new Set(I.filter((e,n)=>n!==t).map(e=>e.userId)),i=J?xe(J):0;return e.filter(e=>e.id!==i&&!n.has(e.id)).map(e=>({value:e.id,label:`${e.username} · ${e.email}${e.status===`disabled`?` · ${r(`adminMailboxAccess.disabledUser`)}`:``}`,disabled:e.status===`disabled`}))}let Ke=[{title:r(`inbox.mailboxAddress`),render:(e,t)=>(0,G.jsxs)(u,{direction:`vertical`,size:0,children:[(0,G.jsx)(f.Text,{strong:!0,children:t.mailbox.address}),t.mailbox.displayName?(0,G.jsx)(f.Text,{type:`secondary`,children:t.mailbox.displayName}):null]})},{title:r(`adminMailboxAccess.owner`),width:220,render:(e,t)=>(0,G.jsxs)(u,{direction:`vertical`,size:0,children:[(0,G.jsx)(f.Text,{children:t.owner.username}),(0,G.jsx)(f.Text,{type:`secondary`,children:t.owner.email})]})},{title:r(`adminMailboxAccess.assignedUsers`),width:170,render:(e,t)=>(0,G.jsx)(P,{children:t.grants.length})},{title:r(`common.actions`),align:`right`,width:150,render:(e,t)=>(0,G.jsx)(d,{"data-mailbox-access-trigger":t.mailbox.id,"aria-label":`${r(`adminMailboxAccess.configure`)} · ${t.mailbox.address}`,icon:(0,G.jsx)(j,{}),style:{minHeight:44},onClick:()=>Fe(t),children:r(`adminMailboxAccess.configure`)})}];return(0,G.jsxs)(u,{direction:`vertical`,size:16,className:`full-width`,children:[(0,G.jsxs)(u,{wrap:!0,className:`admin-mailbox-access-toolbar`,children:[(0,G.jsx)(E.Search,{ref:ve,allowClear:!0,"aria-label":r(`adminMailboxAccess.search`),placeholder:r(`adminMailboxAccess.search`),value:re,disabled:Z,onChange:e=>ie(e.target.value)}),(0,G.jsx)(d,{icon:(0,G.jsx)(ee,{}),loading:C,disabled:Z,style:{minHeight:44},onClick:()=>void De(),children:r(`common.refresh`)}),(0,G.jsxs)(v,{className:`admin-mailbox-access-select-visible`,checked:!!Y.length&&Me===Y.length,indeterminate:Me>0&&Me<Y.length,disabled:C||Z||!Y.length,onChange:e=>ze(e.target.checked),children:[r(`adminMailboxAccess.selectVisible`),` (`,Y.length,`)`]}),(0,G.jsxs)(d,{type:`primary`,icon:(0,G.jsx)(ue,{}),"aria-label":`${r(`adminMailboxAccess.bulkConfigure`)}${z.length?` (${z.length})`:``}`,disabled:C||Z||!z.length||!!we(r,z.length,0),style:{minHeight:44},onClick:Be,children:[r(`adminMailboxAccess.bulkConfigure`),z.length?` (${z.length})`:``]})]}),z.length?(0,G.jsxs)(`div`,{className:`admin-mailbox-access-selection-bar`,"aria-live":`polite`,children:[(0,G.jsxs)(u,{wrap:!0,size:12,children:[(0,G.jsxs)(f.Text,{strong:!0,children:[r(`adminMailboxAccess.selectedMailboxes`),` `,z.length]}),(0,G.jsxs)(f.Text,{type:`secondary`,children:[r(`adminMailboxAccess.selectedVisible`),` `,Me]}),(0,G.jsx)(d,{type:`link`,disabled:Z,style:{minHeight:44},onClick:()=>V([]),children:r(`adminMailboxAccess.clearSelection`)})]}),we(r,z.length,0)?(0,G.jsx)(f.Text,{type:`danger`,role:`alert`,children:we(r,z.length,0)}):null]}):null,M?(0,G.jsx)(_,{type:`error`,showIcon:!0,message:M,action:(0,G.jsx)(d,{onClick:()=>void De(),children:r(`common.refresh`)})}):null,(0,G.jsx)(S,{title:r(`adminMailboxAccess.title`),extra:(0,G.jsx)(P,{children:h.length}),children:C&&!h.length?(0,G.jsx)(p,{active:!0,paragraph:{rows:8}}):Oe.length?a?(0,G.jsx)(b,{className:`admin-mailbox-access-table`,rowKey:e=>e.mailbox.id,rowSelection:{selectedRowKeys:z,preserveSelectedRowKeys:!0,getCheckboxProps:e=>({disabled:C||Z,"aria-label":`${r(`adminMailboxAccess.selectMailbox`)} · ${e.mailbox.address}`}),onChange:e=>V(e.map(Number))},columns:Ke,dataSource:Oe,scroll:{x:760}}):(0,G.jsx)(D,{dataSource:Oe,renderItem:e=>(0,G.jsx)(D.Item,{children:(0,G.jsx)(g,{size:`small`,className:`full-width admin-mailbox-access-card`,title:(0,G.jsx)(v,{checked:ke.has(e.mailbox.id),disabled:C||Z,"aria-label":`${r(`adminMailboxAccess.selectMailbox`)} · ${e.mailbox.address}`,onChange:t=>Re(e.mailbox.id,t.target.checked),children:e.mailbox.address}),children:(0,G.jsxs)(u,{direction:`vertical`,size:12,className:`full-width`,children:[(0,G.jsxs)(f.Text,{type:`secondary`,children:[r(`adminMailboxAccess.owner`),` · `,e.owner.username]}),(0,G.jsxs)(P,{children:[r(`adminMailboxAccess.assignedUsers`),` `,e.grants.length]}),(0,G.jsx)(d,{block:!0,"data-mailbox-access-trigger":e.mailbox.id,"aria-label":`${r(`adminMailboxAccess.configure`)} · ${e.mailbox.address}`,icon:(0,G.jsx)(j,{}),style:{minHeight:44},onClick:()=>Fe(e),children:r(`adminMailboxAccess.configure`)})]})})})}):(0,G.jsx)(se,{description:r(re?`adminMailboxAccess.noSearchResult`:`adminMailboxAccess.empty`)})}),(0,G.jsx)(O,{className:`admin-mailbox-access-bulk-modal`,title:r(`adminMailboxAccess.bulkTitle`),open:le,width:600,okText:r(H===`remove`?`adminMailboxAccess.bulkRemoveAction`:`adminMailboxAccess.bulkSaveAction`),cancelText:r(`common.cancel`),okButtonProps:{danger:H===`remove`,disabled:Z||!U.length||!!X,loading:Z,style:{minHeight:44}},cancelButtonProps:{"aria-label":r(`common.cancel`),disabled:Z,style:{minHeight:44}},closable:!Z,keyboard:!Z,maskClosable:!Z,destroyOnHidden:!0,afterClose:()=>{q.current&&(q.current=!1,window.requestAnimationFrame(()=>ve.current?.focus({preventScroll:!0})))},onCancel:()=>{K.current||de(!1)},onOk:He,children:(0,G.jsxs)(u,{direction:`vertical`,size:16,className:`full-width`,children:[(0,G.jsx)(_,{type:`info`,showIcon:!0,message:r(H===`upsert`?`adminMailboxAccess.bulkUpsertHint`:`adminMailboxAccess.bulkHint`),description:(0,G.jsxs)(u,{direction:`vertical`,size:8,className:`full-width`,children:[(0,G.jsxs)(f.Text,{children:[r(`adminMailboxAccess.selectedMailboxes`),` `,z.length]}),(0,G.jsxs)(`div`,{className:`admin-mailbox-access-preview`,"aria-label":r(`adminMailboxAccess.selectedMailboxPreview`),children:[je.slice(0,5).map(e=>(0,G.jsx)(P,{title:e.mailbox.address,children:e.mailbox.address},e.mailbox.id)),je.length>5?(0,G.jsxs)(P,{children:[`+`,je.length-5]}):null]}),U.length?(0,G.jsx)(f.Text,{type:`secondary`,children:Te(r,z.length,U.length)}):null,Pe?(0,G.jsxs)(f.Text,{type:`secondary`,children:[r(`adminMailboxAccess.bulkOwnerSkipPreview`),` `,Pe]}):null]})}),X?(0,G.jsx)(_,{type:`error`,showIcon:!0,message:X}):null,he?(0,G.jsx)(_,{type:`error`,showIcon:!0,message:he}):null,(0,G.jsxs)(T,{layout:`vertical`,className:`full-width`,disabled:Z,children:[(0,G.jsx)(T.Item,{label:r(`adminMailboxAccess.bulkOperation`),required:!0,children:(0,G.jsx)(`div`,{role:`radiogroup`,"aria-label":r(`adminMailboxAccess.bulkOperation`),"aria-required":`true`,children:(0,G.jsxs)(y.Group,{className:`admin-mailbox-access-operation`,value:H,onChange:e=>Ve(e.target.value),children:[(0,G.jsx)(y.Button,{value:`upsert`,children:r(`adminMailboxAccess.bulkUpsert`)}),(0,G.jsx)(y.Button,{value:`remove`,children:r(`adminMailboxAccess.bulkRemove`)})]})})}),(0,G.jsx)(T.Item,{label:r(`adminMailboxAccess.bulkUsers`),required:!0,extra:H===`remove`?r(`adminMailboxAccess.bulkRemoveDisabledHint`):void 0,children:(0,G.jsx)(c,{mode:`multiple`,showSearch:!0,optionFilterProp:`label`,"aria-label":r(`adminMailboxAccess.bulkUsers`),"aria-required":`true`,value:U,options:Ne,maxTagCount:`responsive`,maxTagTextLength:32,placeholder:r(`adminMailboxAccess.bulkUsersPlaceholder`),onChange:pe,className:`full-width`})}),H===`upsert`?(0,G.jsx)(T.Item,{label:r(`adminMailboxAccess.permissions`),required:!0,extra:r(`adminMailboxAccess.permissionHint`),children:(0,G.jsxs)(`div`,{role:`group`,"aria-label":r(`adminMailboxAccess.permissions`),className:`admin-mailbox-permissions`,children:[(0,G.jsx)(v,{checked:W.view,disabled:Z||W.receive||W.send,onChange:e=>Q({view:e.target.checked}),children:r(`mailboxPermission.view`)}),(0,G.jsx)(v,{disabled:Z,checked:W.receive,onChange:e=>Q({receive:e.target.checked}),children:r(`mailboxPermission.receive`)}),(0,G.jsx)(v,{disabled:Z,checked:W.send,onChange:e=>Q({send:e.target.checked}),children:r(`mailboxPermission.send`)})]})}):(0,G.jsx)(_,{type:`warning`,showIcon:!0,message:r(`adminMailboxAccess.bulkRemoveWarning`)})]})]})}),(0,G.jsx)(te,{title:(0,G.jsx)(`span`,{ref:_e,tabIndex:-1,children:J?.mailbox.address||r(`adminMailboxAccess.drawerTitle`)}),width:a?720:`100%`,open:!!be,onClose:Ie,destroyOnHidden:!0,afterOpenChange:e=>{e&&window.requestAnimationFrame(()=>_e.current?.focus({preventScroll:!0}))},footer:J?(0,G.jsxs)(u,{className:`admin-mailbox-access-footer`,children:[(0,G.jsx)(d,{style:{minHeight:44},onClick:Ie,children:r(`common.cancel`)}),(0,G.jsx)(d,{type:`primary`,style:{minHeight:44},loading:oe===`mailbox-access:${J.mailbox.id}`,onClick:()=>void $(),children:r(`common.save`)})]}):null,children:C&&!J?(0,G.jsx)(p,{active:!0,paragraph:{rows:8}}):J?(0,G.jsxs)(u,{direction:`vertical`,size:20,className:`full-width`,children:[(0,G.jsxs)(w,{bordered:!0,size:`small`,column:1,children:[(0,G.jsx)(w.Item,{label:r(`inbox.mailboxAddress`),children:J.mailbox.address}),(0,G.jsxs)(w.Item,{label:r(`adminMailboxAccess.owner`),children:[J.owner.username,` · `,J.owner.email]}),(0,G.jsx)(w.Item,{label:r(`adminMailboxAccess.ownerPermissions`),children:(0,G.jsx)(ce,{permissions:{view:!0,receive:!0,send:!0}})})]}),(0,G.jsx)(_,{type:`info`,showIcon:!0,message:r(`adminMailboxAccess.permissionHint`)}),(0,G.jsxs)(u,{direction:`vertical`,size:12,className:`full-width`,children:[I.map((t,n)=>{let i=e.find(e=>e.id===t.userId);return(0,G.jsx)(g,{size:`small`,title:i?.username||r(`common.user`),extra:(0,G.jsx)(d,{danger:!0,type:`text`,icon:(0,G.jsx)(A,{}),"aria-label":`${r(`adminMailboxAccess.remove`)} ${i?.username||t.userId}`,style:{minHeight:44,minWidth:44},onClick:()=>L(e=>e.filter((e,t)=>t!==n))}),children:(0,G.jsxs)(u,{direction:`vertical`,size:12,className:`full-width`,children:[(0,G.jsx)(c,{"aria-label":`${r(`adminMailboxAccess.user`)} ${n+1}`,showSearch:!0,optionFilterProp:`label`,value:t.userId,options:Ge(n),className:`full-width`,onChange:e=>We(n,{userId:e})}),(0,G.jsxs)(`div`,{role:`group`,"aria-label":`${r(`adminMailboxAccess.permissions`)} · ${i?.username||t.userId}`,className:`admin-mailbox-permissions`,children:[(0,G.jsx)(v,{checked:t.view,disabled:t.receive||t.send,onChange:e=>We(n,{view:e.target.checked}),children:r(`mailboxPermission.view`)}),(0,G.jsx)(v,{checked:t.receive,onChange:e=>We(n,{receive:e.target.checked}),children:r(`mailboxPermission.receive`)}),(0,G.jsx)(v,{checked:t.send,onChange:e=>We(n,{send:e.target.checked}),children:r(`mailboxPermission.send`)})]})]})},`${t.userId}:${n}`)}),I.length?null:(0,G.jsx)(se,{description:r(`adminMailboxAccess.noAssignments`)}),(0,G.jsx)(d,{type:`dashed`,block:!0,icon:(0,G.jsx)(N,{}),style:{minHeight:44},disabled:!e.some(e=>e.status!==`disabled`&&e.id!==xe(J)&&!I.some(t=>t.userId===e.id)),onClick:Le,children:r(`adminMailboxAccess.addUser`)})]})]}):(0,G.jsx)(_,{type:`error`,showIcon:!0,message:M||r(`adminMailboxAccess.notFound`),action:(0,G.jsx)(d,{onClick:Ie,children:r(`common.confirm`)})})})]})}function xe(e){return e.mailbox.ownerUserId||e.mailbox.userId||e.owner.id}function Se(e){let t=!!e.receive,n=!!e.send;return{view:!!e.view||t||n,receive:t,send:n}}function Ce(e){let t=Number(e);return Number.isInteger(t)&&t>0?t:null}function we(e,t,n){return t>K?`${e(`adminMailboxAccess.bulkMailboxLimit`)} ${K}`:n>q?`${e(`adminMailboxAccess.bulkUserLimit`)} ${q}`:t*n>be?`${e(`adminMailboxAccess.bulkPairLimit`)} ${be}`:``}function Te(e,t,n){return`${t} ${e(`adminMailboxAccess.bulkMailboxUnit`)} × ${n} ${e(`adminMailboxAccess.bulkUserUnit`)} = ${t*n} ${e(`adminMailboxAccess.bulkPairUnit`)}`}function Ee(e,t,n){let r=n.pairCount??n.mailboxCount*n.userCount,i=n.unchangedGrantCount??Math.max(0,r-n.changedGrantCount-n.skippedOwnerCount);return`${e(t===`remove`?`adminMailboxAccess.bulkRemoved`:`adminMailboxAccess.bulkSaved`)}: ${e(`adminMailboxAccess.bulkChanged`)} ${n.changedGrantCount} · ${e(`adminMailboxAccess.bulkUnchanged`)} ${i} · ${e(`adminMailboxAccess.bulkSkippedOwner`)} ${n.skippedOwnerCount}`}var De=[`pending_email`,`pending_review`,`active`,`disabled`],Oe=[`user`,`admin`],ke=[`users`,`mailbox-access`,`resources`,`migration`,`system-email`,`audit-logs`],Ae=[[`transferDomains`,`迁移域名`,`Transfer domains`],[`transferDnsCredentials`,`迁移 DNS 凭据`,`Transfer DNS credentials`],[`transferApiTokens`,`迁移 API 密钥`,`Transfer API keys`],[`transferSendEvents`,`迁移发送记录`,`Transfer sending activity`],[`transferSmtpCredential`,`迁移 SMTP 凭据`,`Transfer SMTP credential`],[`disableSource`,`禁用源用户`,`Disable source user`]];function je(){let{message:e,modal:t}=i.useApp(),{locale:n,t:r}=o(),{user:a}=I(),c=L(),l=ie(),[p,m]=ne(),g=p.toString(),_=ke.includes(l.section)?l.section:`users`,[v,y]=(0,B.useState)([]),[b,C]=(0,B.useState)(null),[w,T]=(0,B.useState)(null),[E,D]=(0,B.useState)([]),[O,k]=(0,B.useState)(!1),[A,j]=(0,B.useState)(()=>new Set),M=(0,B.useRef)(new Set),N=(0,B.useRef)(0);if((0,B.useEffect)(()=>{(!l.section||!ke.includes(l.section))&&c(`/admin/users`,{replace:!0})},[c,l.section]),(0,B.useEffect)(()=>(a?.role===`admin`&&P(_,_===`audit-logs`,g),()=>{_===`audit-logs`&&(N.current+=1)}),[_,g,a?.role]),a?.role!==`admin`)return(0,G.jsxs)(u,{direction:`vertical`,size:20,className:`full-width admin-page`,children:[(0,G.jsx)(x,{title:r(`nav.adminCenter`)}),(0,G.jsx)(S,{children:(0,G.jsx)(f.Text,{type:`secondary`,children:r(`settings.noPermission`)})})]});async function P(t,r=!1,i=g,a=!0){if(!r&&M.current.has(t)){a&&k(!1);return}let o=null;a&&k(!0);try{if(t===`users`||t===`mailbox-access`||t===`migration`){let e=await s.adminUsers();y(e.users||[])}else if(t===`resources`){let[e,t]=await Promise.all([s.adminUsers(),s.adminResources()]);y(e.users||[]),C(t.inventory||null)}else if(t===`system-email`){let e=await s.adminSystemEmail();T(e.settings||null)}else if(t===`audit-logs`){o=++N.current;let[e,t]=await Promise.all([s.adminUsers(),s.adminAuditLogs(i)]);if(o!==N.current)return;y(e.users||[]),D(t.logs||[])}M.current.add(t)}catch(t){if(o!==null&&o!==N.current)return;e.error(t instanceof Error?t.message:$(n,`管理员数据加载失败`,`Failed to load admin data`))}finally{a&&(o===null||o===N.current)&&k(!1)}}async function F(t,r,i,a=!0){j(e=>new Set(e).add(t));try{await r(),e.success(i),a&&await P(_,!0,g,!1)}catch(t){e.error(t instanceof Error?t.message:$(n,`操作失败`,`Operation failed`))}finally{j(e=>{let n=new Set(e);return n.delete(t),n})}}function te(e,n){t.confirm({title:e,okText:r(`common.confirm`),cancelText:r(`common.cancel`),onOk:n})}async function re(e){let t=new URLSearchParams(e),n=t.toString();if(n===g){await P(`audit-logs`,!0,n);return}m(t)}let ae=[{key:`users`,label:r(`admin.users`),children:(0,G.jsx)(Y,{users:v,loading:O,actionKeys:A,onApprove:e=>te($(n,`确认审批用户 ${e.username}?`,`Approve user ${e.username}?`),()=>F(`approve:${e.id}`,()=>s.approveAdminUser(e.id),$(n,`用户已审批`,`User approved`))),onResendVerification:e=>F(`resend:${e.id}`,()=>s.resendAdminVerification(e.id),$(n,`验证邮件请求已提交`,`Verification email requested`)),onPasswordReset:e=>te($(n,`确认给 ${e.email} 发送密码重置邮件?`,`Send a password reset email to ${e.email}?`),()=>F(`reset:${e.id}`,()=>s.sendAdminPasswordReset(e.id),$(n,`密码重置邮件请求已提交`,`Password reset email requested`))),onTemporaryPassword:(e,t)=>te($(n,`确认为用户 ${e.username} 设置临时密码?`,`Set a temporary password for ${e.username}?`),()=>F(`temporary-password:${e.id}`,()=>s.setAdminTemporaryPassword(e.id,t),$(n,`临时密码已设置`,`Temporary password set`))),onUpdateUser:(e,t)=>te($(n,`确认更新用户 ${e.username}?`,`Update user ${e.username}?`),()=>F(`update:${e.id}`,()=>s.updateAdminUser(e.id,t),$(n,`用户已更新`,`User updated`)))})},{key:`mailbox-access`,label:r(`admin.mailboxAccess`),children:(0,G.jsx)(J,{users:v})},{key:`resources`,label:r(`admin.resources`),children:(0,G.jsx)(Z,{users:v,inventory:b,loading:O,actionKeys:A,onTransferDomain:(e,t)=>F(`transfer-domain:${e}`,()=>s.transferAdminDomain(e,t),$(n,`域名已迁移`,`Domain transferred`)),onTransferDnsCredential:(e,t)=>F(`transfer-dns:${e}`,()=>s.transferAdminDnsCredential(e,t),$(n,`DNS 凭据已迁移`,`DNS credential transferred`)),onTransferApiTokens:e=>F(`transfer-token`,()=>s.transferAdminApiTokens(e),$(n,`API 密钥已迁移`,`API keys transferred`))})},{key:`migration`,label:r(`admin.migration`),children:(0,G.jsx)(Ie,{users:v,loading:O,actionKeys:A,onPreview:e=>s.previewUserMerge(e),onExecute:e=>F(`merge`,()=>s.executeUserMerge(e),$(n,`用户资源已合并`,`User resources merged`))})},{key:`system-email`,label:r(`admin.systemEmail`),children:(0,G.jsx)(Le,{settings:w,loading:O,actionKeys:A,onSave:e=>F(`system-email:save`,()=>s.saveAdminSystemEmail(e),$(n,`系统邮件配置已保存`,`System email settings saved`)),onTest:e=>F(`system-email:test`,()=>s.testAdminSystemEmail(e),$(n,`测试邮件请求已提交`,`Test email requested`),!1)})},{key:`audit-logs`,label:r(`admin.auditLogs`),children:(0,G.jsx)(Re,{logs:E,users:v,query:g,loading:O,onSearch:re})}];return(0,G.jsxs)(u,{direction:`vertical`,size:20,className:`full-width admin-page`,children:[(0,G.jsx)(x,{title:r(`nav.adminCenter`),extra:_===`mailbox-access`?void 0:(0,G.jsx)(d,{icon:(0,G.jsx)(ee,{}),loading:O,onClick:()=>void P(_,!0),children:r(`common.refresh`)})}),(0,G.jsx)(S,{className:`admin-center-card`,children:(0,G.jsx)(h,{className:`admin-center-tabs`,activeKey:_,items:ae,destroyOnHidden:!0,onChange:e=>c(`/admin/${e}`)})})]})}function Y({users:e,loading:t,actionKeys:n,onApprove:r,onResendVerification:i,onPasswordReset:a,onTemporaryPassword:s,onUpdateUser:c}){let{locale:l}=o(),u=ae(`(min-width: 768px)`),[d,p]=(0,B.useState)(null),[m]=T.useForm(),h=[{title:`ID`,dataIndex:`id`,width:72},{title:$(l,`用户`,`User`),width:260,className:`admin-user-column`,render:(e,t)=>(0,G.jsx)(Me,{user:t})},{title:$(l,`状态`,`Status`),dataIndex:`status`,width:200,render:(e,t)=>(0,G.jsx)(Ne,{user:t,actionKeys:n,onUpdateUser:c})},{title:$(l,`角色`,`Role`),dataIndex:`role`,width:152,render:(e,t)=>(0,G.jsx)(Pe,{user:t,actionKeys:n,onUpdateUser:c})},{title:$(l,`资源`,`Resources`),width:340,render:(e,t)=>(0,G.jsx)(ze,{counts:t.resourceCounts})},{title:$(l,`创建时间`,`Created at`),dataIndex:`createdAt`,width:190,render:Q},{title:$(l,`操作`,`Actions`),width:72,fixed:`right`,align:`center`,render:(e,t)=>(0,G.jsx)(X,{user:t,actionKeys:n,onApprove:r,onResendVerification:i,onPasswordReset:a,onTemporaryPassword:()=>p(t)})}];async function _(){if(!d)return;let e=await m.validateFields();s(d,e.password),p(null),m.resetFields()}return(0,G.jsxs)(G.Fragment,{children:[u?(0,G.jsx)(b,{className:`admin-users-table`,rowKey:`id`,columns:h,dataSource:e,loading:t,tableLayout:`fixed`,scroll:{x:1280}}):(0,G.jsx)(D,{className:`admin-users-list`,dataSource:e,loading:t,renderItem:e=>(0,G.jsx)(D.Item,{children:(0,G.jsxs)(g,{className:`admin-user-card`,size:`small`,children:[(0,G.jsxs)(`div`,{className:`admin-user-card__header`,children:[(0,G.jsx)(Me,{user:e}),(0,G.jsx)(X,{user:e,actionKeys:n,onApprove:r,onResendVerification:i,onPasswordReset:a,onTemporaryPassword:()=>p(e)})]}),(0,G.jsxs)(f.Text,{type:`secondary`,className:`admin-user-card__meta`,children:[`ID #`,e.id,` · `,Q(e.createdAt)]}),(0,G.jsxs)(`div`,{className:`admin-user-card__fields`,children:[(0,G.jsxs)(`div`,{className:`admin-user-card__field`,children:[(0,G.jsx)(f.Text,{type:`secondary`,children:$(l,`状态`,`Status`)}),(0,G.jsx)(Ne,{user:e,actionKeys:n,onUpdateUser:c})]}),(0,G.jsxs)(`div`,{className:`admin-user-card__field`,children:[(0,G.jsx)(f.Text,{type:`secondary`,children:$(l,`角色`,`Role`)}),(0,G.jsx)(Pe,{user:e,actionKeys:n,onUpdateUser:c})]})]}),(0,G.jsxs)(`div`,{className:`admin-user-card__resources`,children:[(0,G.jsx)(f.Text,{type:`secondary`,children:$(l,`资源`,`Resources`)}),(0,G.jsx)(ze,{counts:e.resourceCounts})]})]})})}),(0,G.jsx)(O,{title:d?`${$(l,`设置临时密码`,`Set temporary password`)} · ${d.username}`:$(l,`设置临时密码`,`Set temporary password`),open:!!d,confirmLoading:n.has(`temporary-password:${d?.id}`),onCancel:()=>p(null),onOk:_,children:(0,G.jsx)(T,{form:m,layout:`vertical`,children:(0,G.jsx)(T.Item,{name:`password`,label:$(l,`临时密码`,`Temporary password`),rules:[{required:!0,min:8,message:$(l,`密码至少需要 8 位。`,`Password must be at least 8 characters.`)}],children:(0,G.jsx)(E.Password,{autoComplete:`new-password`})})})})]})}function Me({user:e}){return(0,G.jsxs)(`div`,{className:`admin-user-identity`,children:[(0,G.jsx)(f.Text,{strong:!0,className:`admin-user-identity__line`,ellipsis:{tooltip:e.username},children:e.username}),(0,G.jsx)(f.Text,{type:`secondary`,className:`admin-user-identity__line`,ellipsis:{tooltip:e.email},children:e.email})]})}function Ne({user:e,actionKeys:t,onUpdateUser:n}){let{locale:r}=o();return(0,G.jsx)(c,{"aria-label":$(r,`用户状态 · ${e.username}`,`Status · ${e.username}`),value:e.status,loading:t.has(`update:${e.id}`),disabled:He(t,e.id),options:De.map(e=>({value:e,label:Ge(e,r)})),onChange:t=>n(e,{status:t}),className:`table-select admin-user-select`})}function Pe({user:e,actionKeys:t,onUpdateUser:n}){let{locale:r}=o();return(0,G.jsx)(c,{"aria-label":$(r,`用户角色 · ${e.username}`,`Role · ${e.username}`),value:e.role,loading:t.has(`update:${e.id}`),disabled:He(t,e.id),options:Oe.map(e=>({value:e,label:e})),onChange:t=>n(e,{role:t}),className:`table-select admin-user-select`})}function X({user:e,actionKeys:t,onApprove:n,onResendVerification:r,onPasswordReset:i,onTemporaryPassword:s}){let{locale:c}=o(),u=He(t,e.id),f=$(c,`用户操作 · ${e.username}`,`User actions · ${e.username}`),p=[{key:`approve`,icon:(0,G.jsx)(re,{}),label:$(c,`审批`,`Approve`),disabled:u||e.status!==`pending_review`},{key:`resend`,icon:(0,G.jsx)(a,{}),label:$(c,`重发验证`,`Resend verification`),disabled:u||e.status!==`pending_email`},{type:`divider`},{key:`reset`,icon:(0,G.jsx)(F,{}),label:$(c,`重置邮件`,`Reset email`),danger:!0,disabled:u},{key:`temporary-password`,icon:(0,G.jsx)(fe,{}),label:$(c,`临时密码`,`Temporary password`),danger:!0,disabled:u}];function m(t){t===`approve`?n(e):t===`resend`?r(e):t===`reset`?i(e):t===`temporary-password`&&s()}return(0,G.jsx)(l,{title:f,children:(0,G.jsx)(oe,{trigger:[`click`],placement:`bottomRight`,menu:{items:p,onClick:({key:e})=>m(e)},disabled:u,children:(0,G.jsx)(d,{"aria-label":f,icon:(0,G.jsx)(M,{}),loading:u,disabled:u,className:`admin-user-actions-trigger`})})})}function Z({users:e,inventory:t,loading:n,actionKeys:r,onTransferDomain:a,onTransferDnsCredential:s,onTransferApiTokens:l}){let{locale:p,t:m}=o(),{modal:h}=i.useApp(),[g]=T.useForm(),[v]=T.useForm(),[y]=T.useForm(),x=T.useWatch(`domainId`,g),C=T.useWatch(`credentialId`,v),w=t?.users||[],E=e.filter(e=>e.status!==`disabled`).map(e=>({value:e.id,label:`${e.username} (#${e.id})`})),D=w.flatMap(e=>e.domains.map(t=>({...t,owner:e.user}))),O=w.flatMap(e=>e.dnsCredentials.map(t=>({...t,owner:e.user}))),k=w.flatMap(e=>e.apiTokens.map(t=>({...t,owner:e.user}))),A=[{title:$(p,`用户`,`User`),width:260,render:(e,t)=>(0,G.jsxs)(`div`,{className:`admin-resource-owner`,children:[(0,G.jsx)(f.Text,{strong:!0,ellipsis:{tooltip:t.user.username},children:t.user.username}),(0,G.jsx)(Be,{status:t.user.status})]})},{title:$(p,`资源`,`Resources`),width:360,render:(e,t)=>(0,G.jsx)(ze,{counts:t.user.resourceCounts})},{title:$(p,`发送记录`,`Sending activity`),dataIndex:`sendEventCount`,width:120},{title:$(p,`入站邮件`,`Inbound mail`),dataIndex:`inboundMessageCount`,width:120},{title:`SMTP`,width:120,render:(e,t)=>t.smtpCredential?(0,G.jsx)(R,{tone:`success`,children:$(p,`已配置`,`Configured`)}):(0,G.jsx)(R,{tone:`neutral`,children:$(p,`无`,`None`)})}];async function j(e){h.confirm({title:$(p,`确认迁移该域名?`,`Transfer this domain?`),okText:m(`common.confirm`),cancelText:m(`common.cancel`),onOk:async()=>{await a(e.domainId,{targetUserId:e.targetUserId,dnsCredentialMode:e.dnsCredentialMode}),g.resetFields()}})}async function M(e){h.confirm({title:$(p,`确认迁移该 DNS 凭据?`,`Transfer this DNS credential?`),okText:m(`common.confirm`),cancelText:m(`common.cancel`),onOk:async()=>{await s(e.credentialId,{targetUserId:e.targetUserId}),v.resetFields()}})}async function N(e){h.confirm({title:$(p,`确认迁移 ${e.tokenIds.length} 个 API 密钥?`,`Transfer ${e.tokenIds.length} API keys?`),okText:m(`common.confirm`),cancelText:m(`common.cancel`),onOk:async()=>{await l({tokenIds:e.tokenIds,targetUserId:e.targetUserId}),y.resetFields()}})}return(0,G.jsxs)(u,{direction:`vertical`,size:16,className:`full-width`,children:[t?.warnings?.length?(0,G.jsx)(_,{type:`warning`,showIcon:!0,message:$(p,`发现 ${t.warnings.length} 个 DNS 凭据归属不一致的域名`,`${t.warnings.length} domains have mismatched DNS credential ownership`)}):null,(0,G.jsxs)(`div`,{className:`form-grid three`,children:[(0,G.jsx)(S,{title:$(p,`迁移域名`,`Transfer domain`),children:(0,G.jsxs)(T,{form:g,name:`admin-domain-transfer`,layout:`vertical`,onFinish:j,disabled:n||r.has(`transfer-domain:${x}`),children:[(0,G.jsx)(T.Item,{name:`domainId`,label:$(p,`域名`,`Domain`),rules:[{required:!0}],children:(0,G.jsx)(c,{showSearch:!0,optionFilterProp:`label`,options:D.map(e=>({value:e.id,label:`${e.domain} · ${e.owner.username}`}))})}),(0,G.jsx)(T.Item,{name:`targetUserId`,label:$(p,`目标用户`,`Target user`),rules:[{required:!0}],children:(0,G.jsx)(c,{options:E})}),(0,G.jsx)(T.Item,{name:`dnsCredentialMode`,label:$(p,`DNS 凭据`,`DNS credential`),initialValue:`domain_only`,children:(0,G.jsx)(c,{options:[{value:`domain_only`,label:$(p,`仅迁移域名`,`Domain only`)},{value:`with_dns_credential`,label:$(p,`连同 DNS 凭据迁移`,`Include DNS credential`)},{value:`clear_dns_credential`,label:$(p,`清空 DNS 凭据绑定`,`Clear DNS credential binding`)}]})}),(0,G.jsx)(d,{type:`primary`,htmlType:`submit`,loading:r.has(`transfer-domain:${x}`),children:$(p,`执行迁移`,`Transfer`)})]})}),(0,G.jsx)(S,{title:$(p,`迁移 DNS 凭据`,`Transfer DNS credential`),children:(0,G.jsxs)(T,{form:v,name:`admin-dns-credential-transfer`,layout:`vertical`,onFinish:M,disabled:n||r.has(`transfer-dns:${C}`),children:[(0,G.jsx)(T.Item,{name:`credentialId`,label:$(p,`DNS 凭据`,`DNS credential`),rules:[{required:!0}],children:(0,G.jsx)(c,{showSearch:!0,optionFilterProp:`label`,options:O.map(e=>({value:e.id,label:`${e.name} · ${e.zoneName} · ${e.owner.username}`}))})}),(0,G.jsx)(T.Item,{name:`targetUserId`,label:$(p,`目标用户`,`Target user`),rules:[{required:!0}],children:(0,G.jsx)(c,{options:E})}),(0,G.jsx)(d,{htmlType:`submit`,loading:r.has(`transfer-dns:${C}`),children:$(p,`执行迁移`,`Transfer`)})]})}),(0,G.jsx)(S,{title:$(p,`迁移 API 密钥`,`Transfer API keys`),children:(0,G.jsxs)(T,{form:y,name:`admin-api-token-transfer`,layout:`vertical`,onFinish:N,disabled:n||r.has(`transfer-token`),children:[(0,G.jsx)(T.Item,{name:`tokenIds`,label:$(p,`API 密钥`,`API key`),rules:[{required:!0}],children:(0,G.jsx)(c,{mode:`multiple`,optionFilterProp:`label`,options:k.map(e=>({value:e.id,label:`${e.name} · ${e.tokenPrefix} · ${e.owner.username}`}))})}),(0,G.jsx)(T.Item,{name:`targetUserId`,label:$(p,`目标用户`,`Target user`),rules:[{required:!0}],children:(0,G.jsx)(c,{options:E})}),(0,G.jsx)(d,{htmlType:`submit`,loading:r.has(`transfer-token`),children:$(p,`执行迁移`,`Transfer`)})]})})]}),(0,G.jsx)(S,{title:$(p,`资源归属`,`Resource ownership`),children:(0,G.jsx)(b,{rowKey:e=>e.user.id,columns:A,dataSource:w,loading:n,expandable:{expandedRowRender:e=>(0,G.jsx)(Fe,{group:e})},scroll:{x:980}})})]})}function Fe({group:e}){let{locale:t}=o();return(0,G.jsxs)(u,{direction:`vertical`,size:16,className:`full-width`,children:[(0,G.jsxs)(w,{size:`small`,column:2,className:`admin-resource-descriptions`,children:[(0,G.jsx)(w.Item,{label:$(t,`邮箱`,`Email`),children:(0,G.jsx)(`span`,{className:`admin-breakable-text`,children:e.user.email})}),(0,G.jsx)(w.Item,{label:$(t,`角色`,`Role`),children:e.user.role})]}),(0,G.jsx)(b,{size:`small`,rowKey:`id`,pagination:!1,dataSource:e.domains,columns:[{title:$(t,`域名`,`Domain`),dataIndex:`domain`},{title:$(t,`发信主机`,`Sending host`),dataIndex:`senderHost`},{title:$(t,`DNS 凭据 ID`,`DNS credential ID`),dataIndex:`dnsCredentialId`}],scroll:{x:640}}),(0,G.jsx)(b,{size:`small`,rowKey:`id`,pagination:!1,dataSource:e.dnsCredentials,columns:[{title:$(t,`DNS 凭据`,`DNS credential`),dataIndex:`name`},{title:`Provider`,dataIndex:`provider`},{title:`Zone`,dataIndex:`zoneName`}],scroll:{x:520}}),(0,G.jsx)(b,{size:`small`,rowKey:`id`,pagination:!1,dataSource:e.apiTokens,columns:[{title:$(t,`API 密钥`,`API key`),dataIndex:`name`},{title:$(t,`前缀`,`Prefix`),dataIndex:`tokenPrefix`},{title:$(t,`创建时间`,`Created at`),dataIndex:`createdAt`,render:Q}],scroll:{x:580}})]})}function Ie({users:e,loading:t,actionKeys:n,onPreview:r,onExecute:a}){let{message:s}=i.useApp(),{locale:l}=o(),[p]=T.useForm(),[m,h]=(0,B.useState)(null),[g,y]=(0,B.useState)({}),[b,x]=(0,B.useState)(``),[C,D]=(0,B.useState)(!1),O=e.map(e=>({value:e.id,label:`${e.username} (#${e.id})`}));async function k(e){D(!0);try{let t=await r(e);h(t.preview),y(t.preview.defaultOptions),x(``)}catch(e){s.error(e instanceof Error?e.message:$(l,`预览失败`,`Preview failed`))}finally{D(!1)}}async function A(){m&&(await a({sourceUserId:m.sourceUser.id,targetUserId:m.targetUser.id,options:g,confirmation:b}),h(null),p.resetFields(),x(``))}let j=m?me(m.sourceUser,m.targetUser):``;return(0,G.jsxs)(u,{direction:`vertical`,size:16,className:`full-width`,children:[(0,G.jsx)(S,{title:$(l,`合并预览`,`Merge preview`),children:(0,G.jsxs)(T,{form:p,layout:`inline`,onFinish:k,disabled:t,className:`admin-inline-form`,children:[(0,G.jsx)(T.Item,{name:`sourceUserId`,label:$(l,`源用户`,`Source user`),rules:[{required:!0}],children:(0,G.jsx)(c,{options:O,className:`toolbar-select`})}),(0,G.jsx)(T.Item,{name:`targetUserId`,label:$(l,`目标用户`,`Target user`),rules:[{required:!0}],children:(0,G.jsx)(c,{options:O,className:`toolbar-select`})}),(0,G.jsx)(d,{type:m?`default`:`primary`,htmlType:`submit`,loading:C,children:$(l,`预览`,`Preview`)})]})}),m?(0,G.jsx)(S,{title:`${m.sourceUser.username} → ${m.targetUser.username}`,children:(0,G.jsxs)(u,{direction:`vertical`,size:16,className:`full-width`,children:[m.warnings.length?(0,G.jsx)(_,{type:`warning`,showIcon:!0,message:m.warnings.map(e=>e.message||e.type).join(`;`)}):null,(0,G.jsx)(u,{wrap:!0,children:he(m).map(e=>(0,G.jsxs)(R,{tone:`neutral`,children:[Ke(e.key,l),`: `,e.count]},e.key))}),(0,G.jsx)(`div`,{className:`form-grid two`,children:Ae.map(([e,t,n])=>(0,G.jsx)(v,{checked:g[e]!==!1,onChange:t=>y(n=>({...n,[e]:t.target.checked})),children:$(l,t,n)},e))}),(0,G.jsx)(w,{column:1,bordered:!0,size:`small`,children:(0,G.jsx)(w.Item,{label:$(l,`确认文本`,`Confirmation text`),children:(0,G.jsx)(f.Text,{code:!0,children:j})})}),(0,G.jsx)(E,{value:b,onChange:e=>x(e.target.value),placeholder:j}),(0,G.jsx)(d,{danger:!0,type:`primary`,loading:n.has(`merge`),disabled:b!==j,onClick:A,children:$(l,`执行合并`,`Merge users`)})]})}):(0,G.jsx)(se,{description:$(l,`暂无预览`,`No preview yet`)})]})}function Le({settings:e,loading:t,actionKeys:n,onSave:r,onTest:i}){let{locale:a}=o(),[s]=T.useForm();(0,B.useEffect)(()=>{e&&s.setFieldsValue(e)},[s,e]);async function c(e){await r(ge(e)),s.setFieldValue(`password`,``)}return(0,G.jsx)(S,{title:$(a,`系统邮件服务器`,`System email server`),children:(0,G.jsxs)(T,{form:s,layout:`vertical`,onFinish:c,disabled:t,children:[(0,G.jsxs)(`div`,{className:`form-grid two`,children:[(0,G.jsx)(T.Item,{name:`host`,label:`SMTP Host`,rules:[{required:!0}],children:(0,G.jsx)(E,{})}),(0,G.jsx)(T.Item,{name:`port`,label:`SMTP Port`,rules:[{required:!0}],children:(0,G.jsx)(C,{min:1,max:65535,className:`full-width`})}),(0,G.jsx)(T.Item,{name:`secure`,label:`SSL / TLS`,valuePropName:`checked`,children:(0,G.jsx)(k,{})}),(0,G.jsx)(T.Item,{name:`helo`,label:`HELO`,children:(0,G.jsx)(E,{})}),(0,G.jsx)(T.Item,{name:`username`,label:`Username`,children:(0,G.jsx)(E,{autoComplete:`off`})}),(0,G.jsx)(T.Item,{name:`password`,label:e?.passwordSet?$(a,`Password(留空保留)`,`Password (leave blank to keep)`):`Password`,children:(0,G.jsx)(E.Password,{autoComplete:`new-password`})}),(0,G.jsx)(T.Item,{name:`fromEmail`,label:`From Email`,rules:[{required:!0,type:`email`}],children:(0,G.jsx)(E,{})}),(0,G.jsx)(T.Item,{name:`fromName`,label:`From Name`,children:(0,G.jsx)(E,{})}),(0,G.jsx)(T.Item,{name:`testRecipient`,label:`Test Recipient`,children:(0,G.jsx)(E,{})})]}),(0,G.jsxs)(u,{wrap:!0,children:[(0,G.jsx)(d,{type:`primary`,htmlType:`submit`,loading:n.has(`system-email:save`),children:$(a,`保存配置`,`Save settings`)}),(0,G.jsx)(d,{onClick:()=>i(s.getFieldValue(`testRecipient`)),loading:n.has(`system-email:test`),children:$(a,`发送测试`,`Send test`)})]})]})})}function Re({logs:e,users:t,query:n,loading:r,onSearch:i}){let{locale:a}=o(),[s]=T.useForm(),l=t.map(e=>({value:e.id,label:`${e.username} (#${e.id})`}));(0,B.useEffect)(()=>{s.setFieldsValue(Ue(n))},[s,n]);let p=[{title:$(a,`时间`,`Time`),dataIndex:`createdAt`,width:190,render:Q},{title:$(a,`动作`,`Action`),dataIndex:`action`,width:220},{title:$(a,`操作者`,`Actor`),dataIndex:`actorUserId`,width:130,render:e=>e??`system`},{title:$(a,`目标用户`,`Target user`),dataIndex:`targetUserId`,width:130,render:e=>e??`-`},{title:$(a,`目标`,`Target`),render:(e,t)=>`${t.targetType}:${t.targetId||`-`}`,width:180},{title:$(a,`摘要`,`Summary`),dataIndex:`summary`,render:e=>(0,G.jsx)(f.Text,{code:!0,ellipsis:!0,children:JSON.stringify(e)})}];async function m(e){await i(_e(e))}return(0,G.jsxs)(u,{direction:`vertical`,size:16,className:`full-width`,children:[(0,G.jsx)(S,{className:`admin-audit-toolbar-card`,children:(0,G.jsxs)(T,{form:s,layout:`inline`,onFinish:m,disabled:r,className:`admin-inline-form`,children:[(0,G.jsx)(T.Item,{name:`actorUserId`,label:$(a,`操作者`,`Actor`),children:(0,G.jsx)(c,{allowClear:!0,options:[{value:`system`,label:`system`},...l],className:`toolbar-select`})}),(0,G.jsx)(T.Item,{name:`targetUserId`,label:$(a,`目标用户`,`Target user`),children:(0,G.jsx)(c,{allowClear:!0,options:l,className:`toolbar-select`})}),(0,G.jsx)(T.Item,{name:`action`,label:$(a,`动作`,`Action`),children:(0,G.jsx)(E,{placeholder:`admin.user_merge`})}),(0,G.jsx)(T.Item,{name:`from`,label:$(a,`开始`,`From`),children:(0,G.jsx)(E,{placeholder:`2026-07-08`})}),(0,G.jsx)(T.Item,{name:`to`,label:$(a,`结束`,`To`),children:(0,G.jsx)(E,{placeholder:`2026-07-09`})}),(0,G.jsx)(d,{type:`primary`,htmlType:`submit`,loading:r,children:$(a,`查询`,`Search`)})]})}),(0,G.jsx)(b,{rowKey:`id`,columns:p,dataSource:e,loading:r,scroll:{x:1100}})]})}function ze({counts:e}){let{locale:t}=o();return e?(0,G.jsxs)(u,{wrap:!0,children:[(0,G.jsxs)(P,{children:[$(t,`域名`,`Domains`),` `,e.domains]}),(0,G.jsxs)(P,{children:[`DNS `,e.dnsCredentials]}),(0,G.jsxs)(P,{children:[`Token `,e.apiTokens]}),(0,G.jsxs)(P,{children:[$(t,`收信`,`Mailboxes`),` `,e.inboundMailboxes]}),(0,G.jsxs)(P,{children:[$(t,`入站`,`Inbound`),` `,e.inboundMessages]}),(0,G.jsxs)(P,{children:[$(t,`记录`,`Events`),` `,e.sendEvents]}),(0,G.jsxs)(P,{children:[`SMTP `,e.smtpCredential]})]}):(0,G.jsx)(P,{children:$(t,`无资源`,`No resources`)})}function Be({status:e}){let t=W(e),{locale:n}=o();return(0,G.jsx)(R,{tone:Ve(t.color),children:Ge(e,n)})}function Ve(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 Q(e){return e?new Date(e).toLocaleString():`-`}function He(e,t){return[`update:${t}`,`approve:${t}`,`resend:${t}`,`reset:${t}`,`temporary-password:${t}`].some(t=>e.has(t))}function Ue(e){let t=new URLSearchParams(e),n=t.get(`actorUserId`),r=t.get(`targetUserId`);return{actorUserId:n===`system`?n:We(n),targetUserId:We(r),action:t.get(`action`)||void 0,from:t.get(`from`)||void 0,to:t.get(`to`)||void 0}}function We(e){let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function $(e,t,n){return e.startsWith(`en`)?n:t}function Ge(e,t){let n={pending_email:[`待验证邮箱`,`Email verification pending`],pending_review:[`待管理员审核`,`Admin review pending`],active:[`正常`,`Active`],disabled:[`已禁用`,`Disabled`]}[e];return n?$(t,n[0],n[1]):e}function Ke(e,t){let n={domains:[`域名`,`Domains`],dnsCredentials:[`DNS 凭据`,`DNS credentials`],apiTokens:[`API 密钥`,`API keys`],inboundMailboxes:[`收信邮箱`,`Mailboxes`],inboundMessages:[`入站邮件`,`Inbound mail`],sendEvents:[`发送记录`,`Sending activity`],smtpCredential:[`SMTP 凭据`,`SMTP credential`]}[e];return n?$(t,n[0],n[1]):e}export{je as default};
|