PageSourceSearch

https://ainowork.ai/assets/UserManagementPage-DpAKejXZ.js

js ainowork.ai collected 2026-10-05 14:00:30 UTC 17,375 bytes, 1 lines download raw bytes

1import{r as e,j as a}from"./vendor-BrFbdvfN.js";import{A as s}from"./index-Dfu6jSUb.js";import{C as t}from"./ContentPanel-CLTGkTdc.js";import{q as r,F as l,G as o,H as n,t as i,I as c,J as d,K as u,p as m,a as x,A as h,j as p}from"./index-C_PVNRFj.js";import{A as j}from"./index-BUteM_8b.js";import{A as y}from"./index-acUzuHvQ.js";import{u as g,A as _}from"./index-TuALcKuB.js";import{A as f}from"./index-l8GLbxks.js";import{u as b,b as v,c as w}from"./query-OVg_3KLz.js";import{u as N}from"./i18n-BRRhXaHa.js";import{u as S}from"./useDebounce-Dj2iY7dT.js";import{A as C}from"./index-Cz96gkO2.js";import{A as k}from"./index-BGa2bK5J.js";import{A as F}from"./index-CPb4lQjj.js";import{A as q}from"./index-AIpepluZ.js";import{a7 as A,I as z,T,ac as M,ar as P,b as Q,a4 as U,l as D,as as E}from"./icons-BM-S0DN8.js";import{A as K}from"./index-_RF1fmNQ.js";import{P as L}from"./users-BZh2qvLN.js";import{A as B}from"./index-DuveTdGO.js";import"./zustand-BcOr8Ggu.js";import"./router-D1D-CY2D.js";import"./index-D5OYaf12.js";import"./motion-D0-MsV41.js";import"./use-auth-D9QQ1h8S.js";function H(){const[a,s]=e.useState(1),[t]=e.useState(20),[x,h]=e.useState(""),[p,j]=e.useState([]),y=S(x,300),g=1===p.length?p[0]:void 0,{data:_,isLoading:f,isError:C,refetch:k}=w({queryKey:["users","list",a,t,y,g],queryFn:async()=>{const e={page:a,page_size:t};y&&(e.q=y),g&&(e.status=g);const s=await m(e);let r=s.data.items;return p.length>1&&(r=r.filter(e=>p.includes(e.status))),{items:r,total:s.data.total,statusCounts:s.data.status_counts??{}}}}),F=function(){const e=b();return v({mutationFn:async e=>(await l(e)).data,onSuccess:()=>{e.invalidateQueries({queryKey:r.users.list()})}})}(),q=function(){const e=b();return v({mutationFn:async({id:e,data:a})=>(await o(e,a)).data,onSuccess:()=>{e.invalidateQueries({queryKey:r.users.list()})}})}(),A=function(){const e=b();return v({mutationFn:async e=>{await n(e)},onSuccess:()=>{e.invalidateQueries({queryKey:r.users.list()})}})}(),z=function(){const e=b(),{t:a}=N("users");return v({mutationFn:async({id:e,enabled:a})=>(a?await c(e):await d(e)).data,onSuccess:(s,{enabled:t})=>{e.invalidateQueries({queryKey:r.users.list()}),i.success(a(t?"toast.user_enabled":"toast.user_disabled"))},onError:()=>{i.error(a("toast.status_change_failed"))}})}(),T=function(){const{t:e}=N("users");return v({mutationFn:async({id:e,data:a})=>(await u(e,a)).data,onSuccess:a=>{const s=a?.message??e("toast.password_reset");i.success(s)},onError:()=>{i.error(e("toast.password_reset_failed"))}})}();return{users:_?.items??[],total:_?.total??0,page:a,pageSize:t,loading:f,error:C?"Failed to load users":null,searchQuery:x,statusFilters:p,statusCounts:_?.statusCounts??{},setPage:s,setSearchQuery:h,setStatusFilters:j,refresh:()=>{k()},createUser:async e=>{try{return await F.mutateAsync(e),!0}catch{return!1}},updateUser:async(e,a)=>{try{return await q.mutateAsync({id:e,data:a}),!0}catch{return!1}},removeUser:async e=>{try{return await A.mutateAsync(e),!0}catch{return!1}},resetPassword:async(e,a)=>{try{return await T.mutateAsync({id:e,data:a}),!0}catch{return!1}},toggleStatus:async(e,a)=>{try{return await z.mutateAsync({id:e,enabled:"active"===a}),!0}catch{return!1}}}}function R({user:s,onClose:t,onSubmit:r,t:l}){const o=!!s,[n,i]=e.useState(s?.display_name??""),[c,d]=e.useState(s?.email??""),[u,m]=e.useState(""),[p,j]=e.useState(!1),[y,g]=e.useState(!1),[_,f]=e.useState({}),b=e=>{_[e]&&f(a=>{const s={...a};return delete s[e],s})};return a.jsxs(x,{open:!0,onClose:t,children:[a.jsx(x.Header,{icon:a.jsx(A,{className:"w-5 h-5",style:{color:"var(--aino-color-accent)"}}),title:l(o?"modal_create.title_edit":"modal_create.title_create")}),a.jsx(x.Body,{children:a.jsx(C,{id:"user-form",noValidate:!0,onSubmit:e=>{e.preventDefault(),(()=>{const e={};return n.trim()||(e.displayName=l("modal_create.field_required")),o||(c.trim()||(e.email=l("modal_create.field_required")),u||(e.password=l("modal_create.field_required"))),f(e),0===Object.keys(e).length})()&&(g(!0),o?r({display_name:n,email:"",password:""}).finally(()=>g(!1)):r({display_name:n,email:c,password:u}).finally(()=>g(!1)))},children:o?a.jsx(k,{label:l("modal_create.field_username"),required:!0,htmlFor:"displayName",error:_.displayName,children:a.jsx(F,{id:"displayName",placeholder:l("modal_create.field_username_placeholder"),value:n,onChange:e=>{i(e.target.value),b("displayName")},required:!0})}):a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsx(k,{label:l("modal_create.field_username"),required:!0,htmlFor:"displayName",error:_.displayName,children:a.jsx(F,{id:"displayName",placeholder:l("modal_create.field_username_placeholder"),value:n,onChange:e=>{i(e.target.value),b("displayName")},required:!0})}),a.jsx(k,{label:l("modal_create.field_email"),required:!0,htmlFor:"email",error:_.email,children:a.jsx(F,{id:"email",type:"email",placeholder:l("modal_create.field_email_placeholder"),value:c,onChange:e=>{d(e.target.value),b("email")},required:!0})})]}),a.jsxs(k,{label:l("modal_create.field_password"),required:!0,htmlFor:"password",labelExtra:a.jsx(h,{ghost:!0,size:"sm",type:"button",style:{color:"var(--aino-color-accent)"},onClick:()=>{const e="ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789!@#$%";let a="";for(let s=0;s<16;s++)a+=e[Math.floor(60*Math.random())];m(a),j(!0),b("password")},children:l("modal_create.field_password_auto")}),error:_.password,children:[a.jsx(q,{id:"password",visible:p,onVisibleChange:j,placeholder:l("modal_create.field_password_placeholder"),value:u,onChange:e=>{m(e.target.value),b("password")},required:!0}),a.jsx("p",{className:"text-[11px] mt-1.5",style:{color:"var(--aino-color-text-muted)"},children:l("modal_create.field_password_hint")})]})]})})}),a.jsxs(x.Footer,{children:[a.jsx(h,{variant:"secondary",onClick:t,children:l("modal_create.btn_cancel")}),a.jsx(h,{type:"submit",form:"user-form",variant:"primary",disabled:y,children:l(o?"modal_create.btn_save":"modal_create.btn_create")})]})]})}function I({user:s,onClose:t,onSubmit:r,t:l}){const[o,n]=e.useState(""),[i,c]=e.useState(!1);return a.jsxs(p,{open:!0,onClose:t,status:"danger",icon:a.jsx(T,{className:"w-5 h-5",style:{color:"var(--aino-color-danger)"}}),title:l("modal_delete.title"),children:[a.jsxs(p.Body,{children:[a.jsx("p",{className:"text-sm mb-4",style:{color:"var(--aino-color-text-muted)"},children:l("modal_delete.description",{name:s.display_name})}),a.jsxs("div",{className:"p-3 rounded-md",style:{backgroundColor:"rgba(239, 68, 68, 0.05)",border:"1px solid rgba(239, 68, 68, 0.2)"},children:[a.jsxs("p",{className:"text-xs flex items-start gap-1.5",style:{color:"var(--aino-color-danger)"},children:[a.jsx(z,{className:"w-4 h-4 shrink-0"}),l("modal_delete.warning")]}),a.jsx(F,{type:"text",className:"mt-2",style:{borderColor:"rgba(239, 68, 68, 0.3)"},placeholder:l("modal_delete.confirm_placeholder"),value:o,onChange:e=>n(e.target.value),onFocus:e=>{e.currentTarget.style.borderColor="var(--aino-color-danger)",e.currentTarget.style.boxShadow="0 0 0 1px var(--aino-color-danger)"},onBlur:e=>{e.currentTarget.style.borderColor="rgba(239, 68, 68, 0.3)",e.currentTarget.style.boxShadow="none"}})]})]}),a.jsxs(p.Footer,{children:[a.jsx(h,{variant:"secondary",onClick:t,children:l("modal_delete.btn_cancel")}),a.jsx(h,{variant:"danger",disabled:"confirm"!==o||i,onClick:async()=>{"confirm"===o&&(c(!0),await r(),c(!1))},children:l("modal_delete.btn_delete")})]})]})}function J({user:s,onClose:t,onSubmit:r,t:l}){const[o,n]=e.useState(L.email),[i,c]=e.useState(""),[d,u]=e.useState(!1);return a.jsxs(p,{open:!0,onClose:t,status:"warning",icon:a.jsx(M,{className:"w-5 h-5",style:{color:"var(--aino-color-warning)"}}),title:l("modal_reset.title"),children:[a.jsxs(p.Body,{children:[a.jsx("p",{className:"text-sm mb-4",style:{color:"var(--aino-color-text-muted)"},children:l("modal_reset.description",{name:s.display_name,email:s.email})}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[a.jsx(K,{name:"reset-type",checked:o===L.email,onChange:()=>n(L.email)}),a.jsxs("div",{children:[a.jsx("div",{className:"text-sm font-medium",style:{color:"var(--aino-color-text)"},children:l("modal_reset.option_email")}),a.jsx("div",{className:"text-xs mt-0.5",style:{color:"var(--aino-color-text-muted)"},children:l("modal_reset.option_email_desc")})]})]}),a.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[a.jsx(K,{name:"reset-type",checked:o===L.manual,onChange:()=>n(L.manual)}),a.jsxs("div",{className:"w-full",children:[a.jsx("div",{className:"text-sm font-medium mb-2",style:{color:"var(--aino-color-text)"},children:l("modal_reset.option_manual")}),a.jsx(F,{type:"password",placeholder:l("modal_reset.field_password_placeholder"),disabled:o!==L.manual,value:i,onChange:e=>c(e.target.value)})]})]})]})]}),a.jsxs(p.Footer,{children:[a.jsx(h,{variant:"secondary",onClick:t,children:l("modal_reset.btn_cancel")}),a.jsx(h,{variant:"warning",disabled:d,onClick:async()=>{u(!0),await r({type:o,password:o===L.manual?i:void 0}),u(!1)},children:l("modal_reset.btn_reset")})]})]})}function V({user:s,action:t,onClose:r,onSubmit:l,t:o}){const[n,i]=e.useState(!1),c="disable"===t;return a.jsxs(p,{open:!0,onClose:r,status:c?"warning":"info",icon:c?a.jsx(P,{className:"w-5 h-5",style:{color:"var(--aino-color-danger)"}}):a.jsx(Q,{className:"w-5 h-5",style:{color:"var(--aino-color-success)"}}),title:o(c?"modal_disable.title":"modal_enable.title"),children:[a.jsx(p.Body,{children:a.jsx("p",{className:"text-sm",style:{color:"var(--aino-color-text-muted)"},children:o(c?"modal_disable.description":"modal_enable.description",{name:s.display_name})})}),a.jsxs(p.Footer,{children:[a.jsx(h,{variant:"secondary",onClick:r,children:o(c?"modal_disable.btn_cancel":"modal_enable.btn_cancel")}),a.jsx(h,{variant:c?"warning":"primary",disabled:n,onClick:async()=>{i(!0),await l(),i(!1)},children:o(c?"modal_disable.btn_disable":"modal_enable.btn_enable")})]})]})}function G({status:e,t:s}){const t="active"===e;return a.jsxs(B,{variant:t?"success":"default",pill:!0,size:"md",children:[a.jsx("span",{className:"w-1.5 h-1.5 rounded-full",style:{backgroundColor:t?"var(--aino-color-success)":"var(--aino-color-text-muted)"}}),s(t?"status.active":"status.inactive")]})}const W=["#6366f1","#0891b2","#059669","#d97706","#dc2626","#7c3aed","#ea580c","#4f46e5"];function Y(e){return"active"===e?"var(--aino-color-success)":"var(--aino-color-text-muted)"}function O(e,a){const s=new Date(e),t=Math.floor((Date.now()-s.getTime())/1e3);return t<60?a("time.just_now"):t<3600?a("time.minutes_ago",{n:Math.floor(t/60)}):t<86400?a("time.hours_ago",{n:Math.floor(t/3600)}):t<604800?a("time.days_ago",{n:Math.floor(t/86400)}):s.toLocaleDateString()+" "+s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function X({user:e,selected:s,onSelect:t,onEdit:r,onResetPassword:l,onToggleStatus:o,onDelete:n,t:i}){const c="active"===e.status,d=c?function(e){let a=0;for(let s=0;s<e.length;s++)a=e.charCodeAt(s)+((a<<5)-a);return W[Math.abs(a)%W.length]}(e.display_name):"#9ca3af",u=e.display_name[0]?.toUpperCase()??"U";return a.jsxs("tr",{children:[a.jsx("td",{children:a.jsx(j,{checked:s,onChange:t})}),a.jsx("td",{children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"w-9 h-9 rounded-full flex items-center justify-center font-semibold shrink-0",style:{backgroundColor:d,c
1olor:c?"white":"var(--aino-color-text-muted)",border:c?"none":"1px solid var(--aino-color-border)"},children:u}),a.jsxs("div",{className:"flex flex-col min-w-0",children:[a.jsx("span",{className:"font-semibold truncate",style:{color:c?"var(--aino-color-text)":"var(--aino-color-text-muted)"},children:e.display_name}),a.jsx("span",{className:"text-xs truncate mt-0.5",style:{color:"var(--aino-color-text-muted)"},children:e.email})]})]})}),a.jsx("td",{children:a.jsx(G,{status:e.status,t:i})}),a.jsx("td",{children:e.last_login_at?a.jsx("div",{className:"text-xs",style:{color:"var(--aino-color-text)"},children:O(e.last_login_at,i)}):a.jsx("div",{className:"text-xs",style:{color:"var(--aino-color-text-muted)"},children:"-"})}),a.jsx("td",{className:"text-right",children:a.jsxs("div",{className:"flex items-center justify-end gap-1",children:[a.jsx(h,{ghost:!0,size:"icon",className:"h-9 w-9",title:i("table.action_edit"),onClick:r,children:a.jsx(U,{className:"w-4 h-4"})}),c&&a.jsxs(a.Fragment,{children:[a.jsx(h,{ghost:!0,size:"icon",className:"h-9 w-9",title:i("table.action_reset_password"),onClick:l,children:a.jsx(M,{className:"w-4 h-4"})}),a.jsx(h,{ghost:!0,size:"icon",className:"h-9 w-9",style:{color:"var(--aino-color-danger)"},title:i("table.action_disable"),onClick:o,children:a.jsx(P,{className:"w-4 h-4"})})]}),!c&&a.jsxs(a.Fragment,{children:[a.jsx(h,{ghost:!0,size:"icon",className:"h-9 w-9",style:{color:"var(--aino-color-success)"},title:i("table.action_enable"),onClick:o,children:a.jsx(Q,{className:"w-4 h-4"})}),a.jsx(h,{ghost:!0,size:"icon",className:"h-9 w-9",style:{color:"var(--aino-color-danger)"},title:i("table.action_delete"),onClick:n,children:a.jsx(D,{className:"w-4 h-4"})})]})]})})]})}function Z(){const{t:r}=N("users"),{isBalanceInsufficient:l}=g(),{users:o,total:n,page:i,pageSize:c,loading:d,searchQuery:u,statusFilters:m,statusCounts:x,setPage:p,setSearchQuery:b,setStatusFilters:v,createUser:w,updateUser:S,removeUser:C,resetPassword:k,toggleStatus:F}=H(),[q,z]=e.useState(new Set),[T,M]=e.useState(!1),[P,Q]=e.useState(null),[U,D]=e.useState(null),[K,L]=e.useState(null),[B,G]=e.useState(null),[W,O]=e.useState(null),Z=e.useCallback(()=>{q.size===o.length?z(new Set):z(new Set(o.map(e=>e.id)))},[o,q]),$=e.useCallback(e=>{z(a=>{const s=new Set(a);return s.has(e)?s.delete(e):s.add(e),s})},[]),ee=0===n?0:(i-1)*c+1,ae=Math.min(i*c,n);return a.jsxs(s,{children:[a.jsxs(_,{className:"w-[280px] flex flex-col shrink-0",children:[a.jsx(_.Header,{children:a.jsx("span",{className:"text-sm font-semibold",style:{color:"var(--aino-color-text)"},children:r("filter.title")})}),a.jsx("div",{className:"flex-1 overflow-y-auto px-2 py-3 space-y-4",children:a.jsxs("div",{children:[a.jsx("div",{className:"text-xs font-semibold px-2 mb-2 uppercase tracking-wider",style:{color:"var(--aino-color-text-muted)"},children:r("filter.status_title")}),a.jsx("div",{className:"space-y-0.5",children:["active","inactive"].map(e=>a.jsxs("label",{className:"flex items-center gap-2 p-1.5 px-2 rounded cursor-pointer transition-colors",style:{color:"var(--aino-color-text)"},onMouseEnter:e=>{e.currentTarget.style.backgroundColor="var(--aino-color-border-subtle)"},onMouseLeave:e=>{e.currentTarget.style.backgroundColor="transparent"},children:[a.jsx(j,{checked:m.includes(e),onChange:()=>(e=>{v(m.includes(e)?m.filter(a=>a!==e):[...m,e])})(e)}),a.jsx("span",{className:"w-2 h-2 rounded-full shrink-0",style:{backgroundColor:Y(e)}}),a.jsx("span",{className:"text-sm",children:r("active"===e?"filter.status_active":"filter.status_inactive")}),a.jsx("span",{className:"text-xs ml-auto",style:{color:"var(--aino-color-text-muted)"},children:x[e]??0})]},e))})]})})]}),a.jsx(t,{icon:E,title:r("page.title"),description:r("page.description"),toolbar:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(f,{placeholder:r("toolbar.search_placeholder"),value:u,onChange:e=>b(e.target.value)}),a.jsxs(h,{variant:"primary",size:"sm",balanceLocked:l,onClick:()=>M(!0),children:[a.jsx(A,{className:"w-4 h-4"}),r("page.create_user")]})]}),children:a.jsx("div",{className:"flex-1 overflow-y-auto p-4 bg-aino-bg",children:a.jsxs(y,{children:[a.jsxs("table",{children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{className:"w-10",children:a.jsx(j,{checked:o.length>0&&q.size===o.length,onChange:Z})}),a.jsx("th",{className:"w-1/3",children:r("table.col_user_info")}),a.jsx("th",{children:r("table.col_status")}),a.jsx("th",{children:r("table.col_last_login")}),a.jsx("th",{className:"text-right w-28",children:r("table.col_actions")})]})}),a.jsxs("tbody",{children:[d&&0===o.length&&a.jsx("tr",{children:a.jsx("td",{colSpan:5,className:"text-center",style:{color:"var(--aino-color-text-muted)"},children:"Loading..."})}),!d&&0===o.length&&a.jsx("tr",{children:a.jsx("td",{colSpan:5,className:"text-center",style:{color:"var(--aino-color-text-muted)"},children:"No users found"})}),o.map(e=>a.jsx(X,{user:e,selected:q.has(e.id),onSelect:()=>$(e.id),onEdit:()=>Q(e),onResetPassword:()=>D(e),onToggleStatus:()=>{"active"===e.status?G(e):O(e)},onDelete:()=>L(e),t:r},e.id))]})]}),a.jsx(y.Footer,{page:i,pageSize:c,total:n,onPageChange:p,label:r("pagination.showing",{from:ee,to:ae,total:n})})]})})}),(T||P)&&a.jsx(R,{user:P,onClose:()=>{M(!1),Q(null)},onSubmit:async e=>{if(P){const a=await S(P.id,{display_name:e.display_name});return a&&Q(null),a}const a=await w(e);return a&&M(!1),a},t:r}),U&&a.jsx(J,{user:U,onClose:()=>D(null),onSubmit:async e=>{const a=await k(U.id,e);return a&&D(null),a},t:r}),K&&a.jsx(I,{user:K,onClose:()=>L(null),onSubmit:async()=>{const e=await C(K.id);return e&&L(null),e},t:r}),B&&a.jsx(V,{user:B,action:"disable",onClose:()=>G(null),onSubmit:async()=>{const e=await F(B.id,"inactive");return e&&G(null),e},t:r}),W&&a.jsx(V,{user:W,action:"enable",onClose:()=>O(null),onSubmit:async()=>{const e=await F(W.id,"active");return e&&O(null),e},t:r})]})}
1export{Z as UserManagementPage};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.