PageSourceSearch

https://prod.mechai.app/chunk-QCR7ECJD.js

js mechai.app collected 2026-09-25 03:06:13 UTC 34,516 bytes, 1 lines download raw bytes

1import{a as fe}from"./chunk-HWWXTAU2.js";import{a as he}from"./chunk-HYXPAYDZ.js";import{a as ge}from"./chunk-ES5DF5EU.js";import{a as xe}from"./chunk-EHQTGEX5.js";import{k as ue}from"./chunk-KBSSFVI3.js";import{b as k}from"./chunk-GGY6QDTV.js";import{j as D}from"./chunk-5IJU7MQ2.js";import"./chunk-LM6BYTWK.js";import"./chunk-UXZT3DCY.js";import"./chunk-ECXCM7JU.js";import"./chunk-7DHSGR33.js";import{b as re,c as ae,f as oe,i as se,k as le,p as de,q as ce,r as me,t as pe,y as _e}from"./chunk-QO327RTO.js";import"./chunk-4MYWE7CD.js";import{i as ee}from"./chunk-EWPP756Y.js";import{d as Q}from"./chunk-I5EQON52.js";import{b as te,c as ie,d as ne}from"./chunk-G6PWMA7J.js";import{Ac as C,Bc as I,Cc as S,Fa as N,Gb as P,Gd as J,H as F,Jc as z,Jd as Z,Kc as H,M as B,Qb as d,Qc as m,Rb as r,Rc as _,Sb as t,Sc as $,Tb as j,Wc as O,Xb as A,Yb as y,ac as v,ba as R,cc as b,db as a,e as L,ec as c,fd as q,mb as E,oa as x,oc as M,pa as h,qc as W,sb as G,sc as o,tc as p,uc as f,wc as V,wd as K,xc as Y,xd as X,yb as g}from"./chunk-IQ6SK2BU.js";import"./chunk-FE7444LI.js";import"./chunk-OXDKANHF.js";import{a as U,b as T}from"./chunk-XUHYVR5R.js";var be=(()=>{class i extends D{list(e){let n=new Q({fromObject:T(U({},e.query?{q:e.query}:{}),{page:String(e.page??1),pageSize:String(e.pageSize??25),_cb:String(Date.now())})});return this.httpGet(`Admin/Users?${n.toString()}`)}getDetail(e){return this.httpGet(`Admin/Users/${e}?_cb=${Date.now()}`)}ban(e,n){return this.httpPost(`Admin/Users/${e}/Ban`,{durationDays:n})}unban(e){return this.httpPost(`Admin/Users/${e}/Unban`,null)}grantRequests(e,n){return this.httpPost(`Admin/Users/${e}/GrantRequests/${n}`,null)}impersonate(e){return this.httpPost(`Admin/Users/${e}/Impersonate`,null)}resyncSubscription(e){return this.httpPost(`Admin/Subscriptions/User/${e}/Resync`,null)}static{this.\u0275fac=(()=>{let e;return function(s){return(e||(e=N(i)))(s||i)}})()}static{this.\u0275prov=R({token:i,factory:i.\u0275fac,providedIn:"root"})}}return i})();var ve=(()=>{class i extends D{getActive(e){return this.httpGet(`Admin/Users/${e}/PlanOverride?_cb=${Date.now()}`,{excludeRetryStatuses:[404]})}create(e,n){return this.httpPost(`Admin/Users/${e}/PlanOverride`,n)}revoke(e){return this.httpDelete(`Admin/Users/${e}/PlanOverride`)}static{this.\u0275fac=(()=>{let e;return function(s){return(e||(e=N(i)))(s||i)}})()}static{this.\u0275prov=R({token:i,factory:i.\u0275fac,providedIn:"root"})}}return i})();var ye=()=>[],Me=i=>({date:i});function Oe(i,l){if(i&1&&(r(0,"div",19),o(1),t()),i&2){let e=c();a(),f(" ",e.listError," ")}}function ke(i,l){if(i&1&&(r(0,"span",27),o(1),t()),i&2){let e=c().$implicit,n=c();a(),f(" ",n.planLabel(e.tier||e.plan)," ")}}function Re(i,l){i&1&&(r(0,"span",23),o(1,"FREE"),t())}function Ne(i,l){i&1&&(r(0,"span",28),o(1," Root "),t())}function Pe(i,l){i&1&&(r(0,"span",23),o(1,"\u2014"),t())}function De(i,l){i&1&&(r(0,"span",29),o(1," Banned "),t())}function Ve(i,l){i&1&&(r(0,"span",30),o(1,"Active"),t())}function Ue(i,l){if(i&1){let e=v();r(0,"tr",20),b("click",function(){let s=x(e).$implicit,u=c();return h(u.selectUser(s))})("keydown.enter",function(s){let u=x(e).$implicit,w=c();return h(w.onRowKeydown(s,u))})("keydown.space",function(s){let u=x(e).$implicit,w=c();return h(w.onRowKeydown(s,u))}),r(1,"td")(2,"div",21)(3,"span",22),o(4),t(),r(5,"span",23),o(6),t()()(),r(7,"td",23),o(8),t(),r(9,"td"),g(10,ke,2,1,"span",24)(11,Re,2,0,"ng-template",null,0,O),t(),r(13,"td"),g(14,Ne,2,0,"span",25)(15,Pe,2,0,"ng-template",null,1,O),t(),r(17,"td"),g(18,De,2,0,"span",26)(19,Ve,2,0,"ng-template",null,2,O),t(),r(21,"td",23),o(22),t(),r(23,"td",23),o(24),t()()}if(i&2){let e=l.$implicit,n=M(12),s=M(16),u=M(20),w=c();W("is-selected",e.id===w.selectedId),P("aria-label",w.derivedName(e)),a(4),p(w.derivedName(e)),a(2),p(e.email),a(2),p(w.locationLabel(e.location)),a(2),d("ngIf",e.tier||e.plan)("ngIfElse",n),a(4),d("ngIf",e.isRoot)("ngIfElse",s),a(4),d("ngIf",e.isLocked)("ngIfElse",u),a(4),p(w.formatDate(e.createTime)),a(2),p(w.relative(e.lastActivity))}}function Te(i,l){i&1&&(r(0,"tr")(1,"td",31),o(2," No users match the current filter. "),t()())}function Le(i,l){i&1&&(r(0,"tr")(1,"td",31),o(2," Loading\u2026 "),t()())}function Fe(i,l){if(i&1){let e=v();r(0,"footer",32)(1,"span"),o(2),m(3,"number"),t(),r(4,"div",33)(5,"button",34),b("click",function(){x(e);let s=c();return h(s.onPage(-1))}),o(6," Prev "),t(),r(7,"button",34),b("click",function(){x(e);let s=c();return h(s.onPage(1))}),o(8," Next "),t()()()}if(i&2){let e=c();a(2),V("",_(3,5,e.response.total)," users \xB7 page ",e.response.page," of ",e.totalPages),a(3),d("disabled",e.page<=1||e.isListLoading),a(2),d("disabled",e.page>=e.totalPages||e.isListLoading)}}function Be(i,l){if(i&1&&(r(0,"h3",45),o(1),t()),i&2){let e=c(2);a(),f(" ",e.derivedName(e.detail)," ")}}function Ge(i,l){if(i&1&&(r(0,"p",46),o(1),t()),i&2){let e=c(2);a(),f(" ",e.detail.email," ")}}function je(i,l){i&1&&(r(0,"div",47),o(1," Loading\u2026 "),t())}function We(i,l){if(i&1&&(r(0,"div",48),o(1),t()),i&2){let e=c(2);a(),f(" ",e.detailError," ")}}function Ye(i,l){i&1&&(r(0,"span",28),o(1," Root "),t())}function ze(i,l){i&1&&(r(0,"span",29),o(1," Banned "),t())}function He(i,l){i&1&&(r(0,"span",30),o(1,"Active"),t())}function $e(i,l){if(i&1&&(r(0,"div")(1,"dt"),o(2,"Lockout until"),t(),r(3,"dd"),o(4),t()()),i&2){let e=l.ngIf,n=c(3);a(4),p(n.formatDateTime(e))}}function qe(i,l){if(i&1&&(r(0,"section")(1,"h4",51),o(2,"Subscription"),t(),r(3,"dl",52)(4,"div")(5,"dt"),o(6,"Plan"),t(),r(7,"dd"),o(8),t()(),r(9,"div")(10,"dt"),o(11,"State"),t(),r(12,"dd"),o(13),t()(),r(14,"div")(15,"dt"),o(16,"Started"),t(),r(17,"dd"),o(18),t()(),r(19,"div")(20,"dt"),o(21,"Ends"),t(),r(22,"dd"),o(23),t()()()()),i&2){let e=l.ngIf,n=c(3);a(8),p(n.planLabel(e.planName)||"\u2014"),a(5),p(e.state||"\u2014"),a(5),p(n.formatDate(e.startTime)),a(5),p(n.formatDate(e.endTime))}}function Ke(i,l){if(i&1&&(r(0,"p",64),o(1),m(2,"translate"),t()),i&2){let e=c().ngIf,n=c(3);a(),f(" ",$(2,1,"V2.ADMIN.USER_RESYNC_EXPIRY",H(4,Me,n.formatDateTime(e.entitlementExpiry)))," ")}}function Xe(i,l){if(i&1&&(r(0,"div",61)(1,"strong"),o(2),m(3,"translate"),t(),r(4,"p",62),o(5),m(6,"translate"),m(7,"translate"),m(8,"translate"),m(9,"translate"),t(),g(10,Ke,3,6,"p",63),t()),i&2){let e=l.ngIf,n=c(3);a(2),f(" ",_(3,6,e.changed?"V2.ADMIN.USER_RESYNC_UPDATED":"V2.ADMIN.USER_RESYNC_MATCHED")," "),a(3),Y(" ",n.planLabel(e.beforePlanName)||_(6,8,"V2.ADMIN.USER_RESYNC_NO_PLAN")," / ",e.beforeState||_(7,10,"V2.ADMIN.USER_RESYNC_NO_STATE")," \u2192 ",n.planLabel(e.afterPlanName)||_(8,12,"V2.ADMIN.USER_RESYNC_NO_PLAN")," / ",e.afterState||_(9,14,"V2.ADMIN.USER_RESYNC_NO_STATE")," "),a(5),d("ngIf",e.entitlementExpiry)}}function Je(i,l){if(i&1&&(r(0,"li",67)(1,"div",37)(2,"p",68),o(3),t(),r(4,"p",69),o(5),t()(),r(6,"span",70),o(7),t()()),i&2){let e=l.$implicit,n=c(4);a(3),p(e.name||"Untitled chat"),a(2),V("",e.year," ",e.make," ",e.model),a(2),p(n.relative(e.updateTime))}}function Ze(i,l){if(i&1&&(r(0,"section")(1,"h4",51),o(2,"Recent chats"),t(),r(3,"ul",65),g(4,Je,8,5,"li",66),t()()),i&2){let e=c(3);a(4),d("ngForOf",e.detail.recentChats)}}function Qe(i,l){i&1&&(r(0,"div",47),o(1),m(2,"translate"),t()),i&2&&(a(),f(" ",_(2,1,"V2.ADMIN.PLAN_OVERRIDE.LOADING")," "))}function et(i,l){if(i&1&&(r(0,"div",71),o(1),t()),i&2){let e=c(3);a(),f(" ",e.overrideError," ")}}function tt(i,l){if(i&1){let e=v();A(0),r(1,"dl",72)(2,"div")(3,"dt"),o(4),m(5,"translate"),t(),r(6,"dd",73),o(7),t()(),r(8,"div")(9,"dt"),o(10),m(11,"translate"),t(),r(12,"dd"),o(13),t()(),r(14,"div")(15,"dt"),o(16),m(17,"translate"),t(),r(18,"dd",74),o(19),t()(),r(20,"div")(21,"dt"),o(22),m(23,"translate"),t(),r(24,"dd"),o(25),m(26,"translate"),t()()(),r(27,"button",75),b("click",function(){x(e);let s=c(3);return h(s.revokeOverride())}),o(28),m(29,"translate"),t(),y()}if(i&2){let e=c(3);a(4),p(_(5,10,"V2.ADMIN.PLAN_OVERRIDE.TIER")),a(3),p(e.planLabel(e.activeOverride.tier)),a(3),p(_(11,12,"V2.ADMIN.PLAN_OVERRIDE.GRANTED_BY")),a(3),p(e.activeOverride.createdByEmail),a(3),p(_(17,14,"V2.ADMIN.PLAN_OVERRIDE.REASON")),a(3),p(e.activeOverride.reason),a(3),p(_(23,16,"V2.ADMIN.PLAN_OVERRIDE.EXPIRES")),a(3),f(" ",e.activeOverride.expiresAt?e.formatDate(e.activeOverride.expiresAt):_(26,18,"V2.ADMIN.PLAN_OVERRIDE.NEVER_EXPIRES")," "),a(2),d("disabled",e.isOverrideMutating),a(),f(" ",_(29,20,"V2.ADMIN.PLAN_OVERRIDE.REVOKE")," ")}}function it(i,l){if(i&1){let e=v();A(0),r(1,"p",76),o(2),m(3,"translate"),t(),r(4,"button",77),b("click",function(){x(e);let s=c(3);return h(s.openGrantForm())}),o(5),m(6,"translate"),t(),y()}i&2&&(a(2),f(" ",_(3,2,"V2.ADMIN.PLAN_OVERRIDE.NONE_ACTIVE")," "),a(3),f(" ",_(6,4,"V2.ADMIN.PLAN_OVERRIDE.GRANT_BUTTON")," "))}function nt(i,l){if(i&1&&(r(0,"option",86),o(1),t()),i&2){let e=l.$implicit,n=c(4);d("value",e),a(),f(" ",n.planLabel(e)," ")}}function rt(i,l){if(i&1){let e=v();r(0,"input",87),S("ngModelChange",function(s){x(e);let u=c(4);return I(u.grantExpiryDate,s)||(u.grantExpiryDate=s),h(s)}),t()}if(i&2){let e=c(4);C("ngModel",e.grantExpiryDate)}}function at(i,l){if(i&1){let e=v();A(0),r(1,"div",57)(2,"div")(3,"label",58),o(4),m(5,"translate"),t(),r(6,"select",78),m(7,"translate"),S("ngModelChange",function(s){x(e);let u=c(3);return I(u.grantTier,s)||(u.grantTier=s),h(s)}),g(8,nt,2,2,"option",79),t()(),r(9,"div")(10,"label",58),o(11),m(12,"translate"),t(),r(13,"textarea",80),m(14,"translate"),S("ngModelChange",function(s){x(e);let u=c(3);return I(u.grantReason,s)||(u.grantReason=s),h(s)}),t()(),r(15,"div")(16,"label",81)(17,"input",82),S("ngModelChange",function(s){x(e);let u=c(3);return I(u.grantForever,s)||(u.grantForever=s),h(s)}),t(),o(18),m(19,"translate"),t(),g(20,rt,1,1,"input",83),t(),r(21,"div",84)(22,"button",54),b("click",function(){x(e);let s=c(3);return h(s.submitGrantOverride())}),o(23),m(24,"translate"),m(25,"translate"),t(),r(26,"button",85),b("click",function(){x(e);let s=c(3);return h(s.cancelGrantForm())}),o(27),m(28,"translate"),t()()(),y()}if(i&2){let e=c(3);a(4),p(_(5,14,"V2.ADMIN.PLAN_OVERRIDE.TIER_LABEL")),a(2),C("ngModel",e.grantTier),P("aria-label",_(7,16,"V2.ADMIN.PLAN_OVERRIDE.TIER_LABEL")),a(2),d("ngForOf",e.planOptions),a(3),p(_(12,18,"V2.ADMIN.PLAN_OVERRIDE.REASON_LABEL")),a(2),C("ngModel",e.grantReason),d("placeholder",_(14,20,"V2.ADMIN.PLAN_OVERRIDE.REASON_PLACEHOLDER")),a(4),C("ngModel",e.grantForever),a(),f(" ",_(19,22,"V2.ADMIN.PLAN_OVERRIDE.FOREVER")," "),a(2),d("ngIf",!e.grantForever),a(2),d("disabled",e.isOverrideMutating),a(),f(" ",e.isOverrideMutating?_(24,24,"V2.ADMIN.PLAN_OVERRIDE.GRANTING"):_(25,26,"V2.ADMIN.PLAN_OVERRIDE.GRANT_SUBMIT")," "),a(3),d("disabled",e.isOverrideMutating),a(),f(" ",_(28,28,"V2.ADMIN.PLAN_OVERRIDE.CANCEL")," ")}}function ot(i,l){if(i&1){let e=v();r(0,"button",75),b("click",function(){let s=x(e).$implicit,u=c(4);return h(u.ban(s.days))}),o(1),t()}if(i&2){let e=l.$implicit,n=c(4);d("disabled",n.isMutating),a(),f(" ",e.label," ")}}function st(i,l){if(i&1&&(r(0,"div")(1,"p",58),o(2,"Ban for\u2026"),t(),r(3,"div",49),g(4,ot,2,2,"button",88),t()()),i&2){let e=c(3);a(4),d("ngForOf",e.banDurations)}}function lt(i,l){if(i&1){let e=v();r(0,"div")(1,"button",54),b("click",function(){x(e);let s=c(3);return h(s.unban())}),o(2," Unban "),t()()}if(i&2){let e=c(3);a(),d("disabled",e.isMutating)}}function dt(i,l){if(i&1){let e=v();A(0),r(1,"div",49),g(2,Ye,2,0,"span",50)(3,ze,2,0,"span",26)(4,He,2,0,"ng-template",null,3,O),t(),r(6,"section")(7,"h4",51),o(8,"Profile"),t(),r(9,"dl",52)(10,"div")(11,"dt"),o(12,"Phone"),t(),r(13,"dd"),o(14),t()(),r(15,"div")(16,"dt"),o(17,"Expertise"),t(),r(18,"dd"),o(19),t()(),r(20,"div")(21,"dt"),o(22,"Language"),t(),r(23,"dd"),o(24),t()(),r(25,"div")(26,"dt"),o(27,"Location"),t(),r(28,"dd"),o(29),t()(),r(30,"div")(31,"dt"),o(32,"Joined"),t(),r(33,"dd"),o(34),t()(),r(35,"div")(36,"dt"),o(37,"Last active"),t(),r(38,"dd"),o(39),t()(),g(40,$e,5,1,"div",16),t()(),g(41,qe,24,4,"section",16),r(42,"section")(43,"h4",51),o(44),m(45,"translate"),t(),r(46,"p",53),o(47),m(48,"translate"),t(),r(49,"button",54),b("click",function(){x(e);let s=c(2);return h(s.resyncSubscription())}),o(50),m(51,"translate"),t(),g(52,Xe,11,16,"div",55),t(),r(53,"section")(54,"h4",51),o(55,"Activity"),t(),r(56,"dl",52)(57,"div")(58,"dt"),o(59,"Remain requests"),t(),r(60,"dd"),o(61),m(62,"number"),t()(),r(63,"div")(64,"dt"),o(65,"Vehicles"),t(),r(66,"dd"),o(67),m(68,"number"),t()(),r(69,"div")(70,"dt"),o(71,"Chats"),t(),r(72,"dd"),o(73),m(74,"number"),t()(),r(75,"div")(76,"dt"),o(77,"Messages"),t(),r(78,"dd"),o(79),m(80,"number"),t()()()(),g(81,Ze,5,1,"section",16),r(82,"section")(83,"h4",51),o(84),m(85,"translate"),t(),g(86,Qe,3,3,"div",43)(87,et,2,1,"div",56)(88,tt,30,22,"ng-container",16)(89,it,7,6,"ng-container",16)(90,at,29,30,"ng-container",16),t(),r(91,"section")(92,"h4",51),o(93,"Actions"),t(),r(94,"div",57)(95,"div")(96,"p",58),o(97,"Grant requests"),t(),r(98,"div",33)(99,"input",59),S("ngModelChange",function(s){x(e);let u=c(2);return I(u.grantAmount,s)||(u.grantAmount=s),h(s)}),t(),r(100,"button",54),b("click",function(){x(e);let s=c(2);return h(s.grantRequests())}),o(101," Grant "),t()()(),g(102,st,5,1,"div",16)(103,lt,3,1,"div",16),r(104,"div")(105,"button",60),b("click",function(){x(e);let s=c(2);return h(s.impersonate())}),o(106," View as user "),t()()()(),y()}if(i&2){let e=M(5),n=c(2);a(2),d("ngIf",n.detail.isRoot),a(),d("ngIf",n.detail.isLocked)("ngIfElse",e),a(11),p(n.detail.phoneNumber||"\u2014"),a(5),p(n.detail.expertiseLevel),a(5),p(n.detail.language||"\u2014"),a(5),p(n.detail.location||"\u2014"),a(5),p(n.formatDateTime(n.detail.createTime)),a(5),p(n.formatDateTime(n.detail.lastActivity)),a(),d("ngIf",n.detail.lockoutEndUnix),a(),d("ngIf",n.detail.subscription),a(3),p(_(45,32,"V2.ADMIN.USER_RESYNC_TITLE")),a(3),f(" ",_(48,34,"V2.ADMIN.USER_RESYNC_BODY")," "),a(2),d("disabled",n.isSubscriptionResyncing),a(),f(" ",_(51,36,n.isSubscriptionResyncing?"V2.ADMIN.USER_RESYNC_CHECKING":"V2.ADMIN.USER_RESYNC_ACTION")," "),a(2),d("ngIf",n.subscriptionResyncResult),a(9),p(_(62,38,n.detail.counters.remainRequestCount)),a(6),p(_(68,40,n.detail.counters.vehiclesCount)),a(6),p(_(74,42,n.detail.counters.chatsCount)),a(6),p(_(80,44,n.detail.counters.messagesCount)),a(2),d("ngIf",n.detail.recentChats.length),a(3),p(_(85,46,"V2.ADMIN.PLAN_OVERRIDE.SECTION_TIT
1LE")),a(2),d("ngIf",n.isOverrideLoading),a(),d("ngIf",n.overrideError),a(),d("ngIf",!n.isOverrideLoading&&n.activeOverride),a(),d("ngIf",!n.isOverrideLoading&&!n.activeOverride&&!n.showGrantForm),a(),d("ngIf",n.showGrantForm),a(9),C("ngModel",n.grantAmount),a(),d("disabled",n.isMutating||n.grantAmount<=0),a(2),d("ngIf",!n.detail.isLocked),a(),d("ngIf",n.detail.isLocked),a(2),d("disabled",n.isMutating)}}function ct(i,l){if(i&1){let e=v();r(0,"aside",35)(1,"header",36)(2,"div",37)(3,"p",38),o(4,"User detail"),t(),g(5,Be,2,1,"h3",39)(6,Ge,2,1,"p",40),t(),r(7,"button",41),b("click",function(){x(e);let s=c();return h(s.closeDetail())}),o(8," \xD7 "),t()(),r(9,"div",42),g(10,je,2,0,"div",43)(11,We,2,1,"div",44)(12,dt,107,48,"ng-container",16),t()()}if(i&2){let e=c();a(5),d("ngIf",e.detail),a(),d("ngIf",e.detail),a(4),d("ngIf",e.isDetailLoading),a(),d("ngIf",e.detailError),a(),d("ngIf",e.detail)}}var mt=25,pt=[{label:"1 day",days:1},{label:"7 days",days:7},{label:"30 days",days:30},{label:"Forever",days:null}],_t=["FREE","DIY","MECHANIC","SHOP PRO","SHOP MANAGER"],ut={"SHOP PRO":"AUTOSHOP","SHOP MANAGER":"Shop Manager"};function Ee(){return Math.floor((Date.now()+30*864e5)/1e3)}function gt(i){if(!i)return null;let l=Date.parse(i);return isNaN(l)?null:Math.floor(l/1e3)}function Ce(i){let l=k(i);return l?l.toISOString().substring(0,10):""}var Vt=(()=>{class i{constructor(e,n,s,u,w,Ie){this.adminUsers=e,this.planOverrideApi=n,this.impersonation=s,this.translate=u,this.router=w,this.cdr=Ie,this.pageSize=mt,this.banDurations=pt,this.planOptions=_t,this.searchInput="",this.page=1,this.isListLoading=!0,this.listError=null,this.response=null,this.selectedId=null,this.detail=null,this.isDetailLoading=!1,this.detailError=null,this.isMutating=!1,this.isSubscriptionResyncing=!1,this.subscriptionResyncResult=null,this.grantAmount=50,this.activeOverride=null,this.isOverrideLoading=!1,this.isOverrideMutating=!1,this.overrideError=null,this.showGrantForm=!1,this.grantTier="MECHANIC",this.grantReason="",this.grantForever=!1,this.grantExpiryDate=Ce(Ee()),this.searchSubject=new L}ngOnInit(){this.searchSubject.pipe(F(300),B()).subscribe(()=>{this.page=1,this.fetchList()}),this.fetchList()}onSearchChange(){this.searchSubject.next(this.searchInput.trim())}onPage(e){let n=this.page+e;n<1||this.response&&(n-1)*this.pageSize>=this.response.total||(this.page=n,this.fetchList())}selectUser(e){this.selectedId=e.id,this.subscriptionResyncResult=null,this.fetchDetail(e.id),this.fetchActiveOverride(e.id)}onRowKeydown(e,n){e.preventDefault(),this.selectUser(n)}closeDetail(){this.selectedId=null,this.detail=null,this.detailError=null,this.activeOverride=null,this.showGrantForm=!1,this.overrideError=null,this.subscriptionResyncResult=null}ban(e){!this.selectedId||this.isMutating||(this.isMutating=!0,this.cdr.markForCheck(),this.adminUsers.ban(this.selectedId,e).subscribe({next:()=>this.refreshAfterMutation(),error:()=>this.failMutation("Ban failed")}))}unban(){!this.selectedId||this.isMutating||(this.isMutating=!0,this.cdr.markForCheck(),this.adminUsers.unban(this.selectedId).subscribe({next:()=>this.refreshAfterMutation(),error:()=>this.failMutation("Unban failed")}))}impersonate(){!this.selectedId||this.isMutating||(this.isMutating=!0,this.cdr.markForCheck(),this.adminUsers.impersonate(this.selectedId).subscribe({next:e=>{this.isMutating=!1,this.impersonation.activate({accessToken:e.accessToken,targetUserId:e.targetUserId,targetEmail:e.targetEmail,expiresAt:e.expiresAt}),this.router.navigate(["/v2/home"])},error:()=>this.failMutation("Impersonation failed")}))}grantRequests(){!this.selectedId||this.isMutating||this.grantAmount<=0||(this.isMutating=!0,this.cdr.markForCheck(),this.adminUsers.grantRequests(this.selectedId,this.grantAmount).subscribe({next:()=>this.refreshAfterMutation(),error:()=>this.failMutation("Grant failed")}))}resyncSubscription(){if(!this.selectedId||this.isSubscriptionResyncing)return;let e=this.selectedId;this.isSubscriptionResyncing=!0,this.subscriptionResyncResult=null,this.detailError=null,this.cdr.markForCheck(),this.adminUsers.resyncSubscription(this.selectedId).subscribe({next:n=>{this.isSubscriptionResyncing=!1,this.selectedId===e&&(this.subscriptionResyncResult=n,this.fetchDetail(e)),this.fetchList(),this.cdr.markForCheck()},error:()=>{this.isSubscriptionResyncing=!1,this.selectedId===e&&(this.detailError=this.translate.instant("V2.ADMIN.USER_RESYNC_FAILED")),this.cdr.markForCheck()}})}openGrantForm(){this.showGrantForm=!0,this.grantTier="MECHANIC",this.grantReason="",this.grantForever=!1,this.grantExpiryDate=Ce(Ee()),this.overrideError=null,this.cdr.markForCheck()}cancelGrantForm(){this.showGrantForm=!1,this.overrideError=null,this.cdr.markForCheck()}submitGrantOverride(){if(!this.selectedId||this.isOverrideMutating)return;let e=this.grantReason.trim();if(e.length<10){this.overrideError=this.translate.instant("V2.ADMIN.PLAN_OVERRIDE.REASON_TOO_SHORT"),this.cdr.markForCheck();return}let n=this.grantForever?null:gt(this.grantExpiryDate),s={tier:this.grantTier,reason:e,expiresAt:n};this.isOverrideMutating=!0,this.overrideError=null,this.cdr.markForCheck(),this.planOverrideApi.create(this.selectedId,s).subscribe({next:u=>{this.activeOverride=u,this.showGrantForm=!1,this.isOverrideMutating=!1,this.cdr.markForCheck()},error:()=>{this.overrideError=this.translate.instant("V2.ADMIN.PLAN_OVERRIDE.GRANT_ERROR"),this.isOverrideMutating=!1,this.cdr.markForCheck()}})}revokeOverride(){!this.selectedId||this.isOverrideMutating||confirm(this.translate.instant("V2.ADMIN.PLAN_OVERRIDE.CONFIRM_REVOKE"))&&(this.isOverrideMutating=!0,this.overrideError=null,this.cdr.markForCheck(),this.planOverrideApi.revoke(this.selectedId).subscribe({next:()=>{this.activeOverride=null,this.isOverrideMutating=!1,this.cdr.markForCheck()},error:()=>{this.overrideError=this.translate.instant("V2.ADMIN.PLAN_OVERRIDE.REVOKE_ERROR"),this.isOverrideMutating=!1,this.cdr.markForCheck()}}))}refreshList(){this.fetchList()}formatDate(e){let n=k(e);return n?n.toLocaleDateString():"\u2014"}formatDateTime(e){let n=k(e);
1return n?n.toLocaleString():"\u2014"}relative(e){let n=k(e);if(!n)return"\u2014";let s=(Date.now()-n.getTime())/1e3;return s<60?"just now":s<3600?`${Math.floor(s/60)}m ago`:s<86400?`${Math.floor(s/3600)}h ago`:s<30*86400?`${Math.floor(s/86400)}d ago`:n.toLocaleDateString()}locationLabel(e){return fe(e)}derivedName(e){return xe({fullName:e.fullName,email:e.email})}planLabel(e){if(!e)return"";let n=ue(e);return n&&ut[n]||e}get totalPages(){return this.response?Math.max(1,Math.ceil(this.response.total/this.response.pageSize)):1}fetchList(){this.isListLoading=!0,this.listError=null,this.cdr.markForCheck(),this.adminUsers.list({query:this.searchInput.trim()||void 0,page:this.page,pageSize:this.pageSize}).subscribe({next:e=>{this.response=e,this.isListLoading=!1,this.cdr.markForCheck()},error:()=>{this.listError="Couldn't load users.",this.isListLoading=!1,this.cdr.markForCheck()}})}fetchDetail(e){this.isDetailLoading=!0,this.detail=null,this.detailError=null,this.cdr.markForCheck(),this.adminUsers.getDetail(e).subscribe({next:n=>{this.selectedId===e&&(this.detail=n,this.isDetailLoading=!1,this.cdr.markForCheck())},error:()=>{this.selectedId===e&&(this.detailError="Couldn't load user detail.",this.isDetailLoading=!1,this.cdr.markForCheck())}})}fetchActiveOverride(e){this.isOverrideLoading=!0,this.activeOverride=null,this.showGrantForm=!1,this.overrideError=null,this.cdr.markForCheck(),this.planOverrideApi.getActive(e).subscribe({next:n=>{this.selectedId===e&&(this.activeOverride=n,this.isOverrideLoading=!1,this.cdr.markForCheck())},error:n=>{this.selectedId===e&&(n?.status!==404&&(this.overrideError="Couldn't load plan override."),this.activeOverride=null,this.isOverrideLoading=!1,this.cdr.markForCheck())}})}refreshAfterMutation(){this.isMutating=!1,this.selectedId&&this.fetchDetail(this.selectedId),this.fetchList()}failMutation(e){this.isMutating=!1,this.detailError=e,this.cdr.markForCheck()}static{this.\u0275fac=function(n){return new(n||i)(E(be),E(ve),E(ge),E(te),E(ee),E(q))}}static{this.\u0275cmp=G({type:i,selectors:[["app-admin-users"]],decls:37,vars:18,consts:[["freePlan",""],["viewerRole",""],["activeBadge",""],["activePill",""],[1,"tw-flex","tw-flex-col","tw-gap-4","lg:tw-flex-row"],[1,"tw-flex-1","tw-min-w-0"],[1,"tw-flex","tw-items-center","tw-justify-between","tw-mb-4","tw-gap-3"],[1,"tw-flex-1","tw-relative"],["type","search",1,"tw-w-full","tw-h-10","tw-px-4","tw-rounded-lg","tw-border","tw-border-mech-border-strong","tw-bg-mech-surface","tw-text-sm","focus:tw-outline-none","focus:tw-border-mech-primary",3,"ngModelChange","ngModel","placeholder"],["type","button",1,"tw-inline-flex","tw-items-center","tw-gap-2","tw-px-3","tw-h-10","tw-rounded-lg","tw-text-sm","tw-font-medium","tw-bg-mech-surface","tw-text-mech-dark","tw-border","tw-border-mech-border-strong","hover:tw-border-mech-primary","tw-cursor-pointer","disabled:tw-opacity-60",3,"click","disabled"],[1,"tw-w-4","tw-h-4","tw-flex","tw-items-center","tw-justify-center","tw-text-mech-primary"],["name","refresh"],["class","error-banner tw-mb-4 tw-p-3 tw-rounded-lg tw-text-sm",4,"ngIf"],[1,"tw-bg-mech-surface","tw-rounded-2xl","tw-border","tw-border-mech-border","tw-shadow-sm","tw-overflow-hidden"],[1,"users-table","tw-w-full"],["role","button","tabindex","0",3,"is-selected","click","keydown.enter","keydown.space",4,"ngFor","ngForOf"],[4,"ngIf"],["class","tw-flex tw-items-center tw-justify-between tw-px-4 tw-py-3 tw-border-t tw-border-mech-border tw-text-xs tw-text-mech-dark-500",4,"ngIf"],["class","detail-drawer tw-flex-shrink-0 tw-bg-mech-surface tw-rounded-2xl tw-border tw-border-mech-border tw-shadow-sm tw-overflow-hidden tw-flex tw-flex-col",4,"ngIf"],[1,"error-banner","tw-mb-4","tw-p-3","tw-rounded-lg","tw-text-sm"],["role","button","tabindex","0",3,"click","keydown.enter","keydown.space"],[1,"tw-flex","tw-flex-col"],[1,"tw-text-sm","tw-font-medium","tw-text-mech-dark"],[1,"tw-text-xs","tw-text-mech-dark-500"],["class","badge badge-plan",4,"ngIf","ngIfElse"],["class","badge badge-root",4,"ngIf","ngIfElse"],["class","badge badge-banned",4,"ngIf","ngIfElse"],[1,"badge","badge-plan"],[1,"badge","badge-root"],[1,"badge","badge-banned"],[1,"badge","badge-active"],["colspan","7",1,"tw-text-center","tw-py-12","tw-text-sm","tw-text-mech-dark-500"],[1,"tw-flex","tw-items-center","tw-justify-between","tw-px-4","tw-py-3","tw-border-t","tw-border-mech-border","t
1w-text-xs","tw-text-mech-dark-500"],[1,"tw-flex","tw-items-center","tw-gap-2"],["type","button",1,"page-btn",3,"click","disabled"],[1,"detail-drawer","tw-flex-shrink-0","tw-bg-mech-surface","tw-rounded-2xl","tw-border","tw-border-mech-border","tw-shadow-sm","tw-overflow-hidden","tw-flex","tw-flex-col"],[1,"tw-flex","tw-items-start","tw-justify-between","tw-p-5","tw-border-b","tw-border-mech-border"],[1,"tw-min-w-0"],[1,"tw-text-[10px]","tw-uppercase","tw-tracking-widest","tw-text-mech-text-muted","tw-m-0"],["class","tw-text-base tw-font-semibold tw-text-mech-dark tw-mt-1 tw-mb-0 tw-truncate",4,"ngIf"],["class","tw-text-xs tw-text-mech-dark-500 tw-mt-0.5 tw-truncate",4,"ngIf"],["type","button","aria-label","Close detail",1,"tw-text-mech-text-muted","hover:tw-text-mech-dark","tw-bg-transparent","tw-border-none","tw-cursor-pointer","tw-text-xl","tw-leading-none",3,"click"],[1,"tw-flex-1","tw-overflow-y-auto","tw-p-5","tw-space-y-5"],["class","tw-text-sm tw-text-mech-dark-500",4,"ngIf"],["class","error-banner tw-p-3 tw-rounded-lg tw-text-sm",4,"ngIf"],[1,"tw-text-base","tw-font-semibold","tw-text-mech-dark","tw-mt-1","tw-mb-0","tw-truncate"],[1,"tw-text-xs","tw-text-mech-dark-500","tw-mt-0.5","tw-truncate"],[1,"tw-text-sm","tw-text-mech-dark-500"],[1,"error-banner","tw-p-3","tw-rounded-lg","tw-text-sm"],[1,"tw-flex","tw-flex-wrap","tw-gap-2"],["class","badge badge-root",4,"ngIf"],[1,"section-title"],[1,"kv-list"],[1,"tw-text-xs","tw-text-mech-dark-500","tw-m-0","tw-mb-3"],["type","button",1,"action-btn","primary",3,"click","disabled"],["class","tw-mt-3 tw-rounded-lg tw-bg-mech-surface-2 tw-p-3 tw-text-xs tw-text-mech-dark",4,"ngIf"],["class","error-banner tw-p-2 tw-rounded-lg tw-text-xs tw-mb-3",4,"ngIf"],[1,"tw-space-y-3"],[1,"action-label"],["type","number","min","1",1,"tw-w-24","tw-h-9","tw-px-3","tw-rounded-lg","tw-border","tw-border-mech-border-strong","tw-bg-mech-surface","tw-text-sm","focus:tw-outline-none","focus:tw-border-mech-primary",3,"ngModelChange","ngModel"],["type","button","title","Issue a 30-min read-only token and open the user's view",1,"action-btn","ghost",3,"click","disabled"],[1,"tw-mt-3","tw-rounded-lg","tw-bg-mech-surface-2","tw-p-3","tw-text-xs","tw-text-mech-dark"],[1,"tw-m-0","tw-mt-1"],["class","tw-m-0 tw-mt-1 tw-text-mech-dark-500",4,"ngIf"],[1,"tw-m-0","tw-mt-1","tw-text-mech-dark-500"],[1,"tw-space-y-2","tw-m-0","tw-p-0","tw-list-none"],["class","tw-flex tw-items-start tw-justify-between tw-gap-3",4,"ngFor","ngForOf"],[1,"tw-flex","tw-items-start","tw-justify-between","tw-gap-3"],[1,"tw-text-sm","tw-text-mech-dark","tw-m-0","tw-truncate"],[1,"tw-text-xs","tw-text-mech-dark-500","tw-m-0"],[1,"tw-text-xs","tw-text-mech-dark-500","tw-flex-shrink-0"],[1,"error-banner","tw-p-2","tw-rounded-lg","tw-text-xs","tw-mb-3"],[1,"kv-list","tw-mb-3"],[1,"tw-font-semibold"],[1,"tw-col-span-1"],["type","button",1,"action-btn","warning",3,"click","disabled"],[1,"tw-text-sm","tw-text-mech-dark-500","tw-mb-3"],["type","button",1,"action-btn","primary",3,"click"],[1,"tw-w-full","tw-h-9","tw-px-3","tw-rounded-lg","tw-border","tw-border-mech-border-strong","tw-bg-mech-surface","tw-text-sm","focus:tw-outline-none","focus:tw-border-mech-primary",3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],["rows","3",1,"tw-w-full","tw-px-3","tw-py-2","tw-rounded-lg","tw-border","tw-border-mech-border-strong","tw-bg-mech-surface","tw-text-sm","focus:tw-outline-none","focus:tw-border-mech-primary","tw-resize-none",3,"ngModelChange","ngModel","placeholder"],[1,"tw-inline-flex","tw-items-center","tw-gap-2","tw-text-sm","tw-text-mech-dark","tw-mb-2"],["type","checkbox",3,"ngModelChange","ngModel"],["type","date","class","tw-w-full tw-h-9 tw-px-3 tw-rounded-lg tw-border tw-border-mech-border-strong tw-bg-mech-surface tw-text-sm focus:tw-outline-none focus:tw-border-mech-primary",3,"ngModel","ngModelChange",4,"ngIf"],[1,"tw-flex","tw-gap-2"],["type","button",1,"action-btn","ghost",3,"click","disabled"],[3,"value"],["type","date",1,"tw-w-full","tw-h-9","tw-px-3","tw-rounded-lg","tw-border","tw-border-mech-border-strong","tw-bg-mech-surface","tw-text-sm","focus:tw-outline-none","focus:tw-border-mech-primary",3,"ngModelChange","ngModel"],["type","button","class","action-btn warning",3,"disabled","click",4,"ngFor","ngForOf"]],template:function(n,s){n&1&&(r(0,"div",4)(1,"section",5)(2,"div",6)(3,"div",7)(4,"input",8),m(5,"translate"),m(6,"translate"),S("ngModelChange",function(w){return I(s.searchInput,w)||(s.searchInput=w),w}),b("ngModelChange",function(){return s.onSearchChange()}),t()(),r(7,"button",9),b("click",function(){return s.refreshList()}),r(8,"span",10),j(9,"app-admin-icon",11),t(),o(10," Refresh "),t()(),g(11,Oe,2,1,"div",12),r(12,"div",13)(13,"table",14)(14,"thead")(15,"tr")(16,"th"),o(17,"User"),t(),r(18,"th"),o(19),m(20,"translate"),t(),r(21,"th"),o(22,"Plan"),t(),r(23,"th"),o(24,"Role"),t(),r(25,"th"),o(26,"Status"),t(),r(27,"th"),o(28,"Joined"),t(),r(29,"th"),o(30,"Last active"),t()()(),r(31,"tbody"),g(32,Ue,25,14,"tr",15)(33,Te,3,0,"tr",16)(34,Le,3,0,"tr",16),t()(),g(35,Fe,9,7,"footer",17),t()(),g(36,ct,13,5,"aside",18),t()),n&2&&(a(4),C("ngModel",s.searchInput),d("placeholder",_(5,11,"V2.ADMIN.USER_SEARCH_PLACEHOLDER")),P("aria-label",_(6,13,"V2.ADMIN.USER_SEARCH_A11Y")),a(3),d("disabled",s.isListLoading),a(4),d("ngIf",s.listError),a(8),p(_(20,15,"V2.ADMIN.USERS_TABLE.LOCATION_COLUMN")),a(13),d("ngForOf",(s.response==null?null:s.response.items)??z(17,ye)),a(),d("ngIf",!s.isListLoading&&((s.response==null||s.response.items==null?null:s.response.items.length)??0)===0),a(),d("ngIf",s.isListLoading&&!s.response),a(),d("ngIf",s.response),a(),d("ngIf",s.selectedId))},dependencies:[Z,K,X,_e,ce,me,ae,le,re,de,oe,pe,se,he,ne,J,ie],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:block}.error-banner[_ngcontent-%COMP%]{background:rgb(var(--color-danger-rgb)/.1);color:var(--color-danger-text);border:1px solid rgb(var(--color-danger-rgb)/.28)}.users-table[_ngcontent-%COMP%]{border-collapse:collapse}.users-table[_ngcontent-%COMP%]   thead[_ngcontent-%COMP%]   th[_ngcontent-%COMP%]{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-faint);font-weight:600;padding:12px 16px;background:var(--color-surface-2);border-bottom:1px solid var(--color-border-strong)}.users-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{padding:12px 16px;border-bottom:1px solid var(--color-border);vertical-align:middle}.users-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr[_ngcontent-%COMP%]{cursor:pointer;transition:background-color .1s ease}.users-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr[_ngcontent-%COMP%]:hover{background-color:var(--color-surface-2)}.users-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr.is-selected[_ngcontent-%COMP%]{background-color:var(--color-primary-50)}.users-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr[_ngcontent-%COMP%]:last-child   td[_ngcontent-%COMP%]{border-bottom:none}.badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.badge.badge-plan[_ngcontent-%COMP%]{background:var(--color-primary-50);color:var(--color-primary)}.badge.badge-root[_ngcontent-%COMP%]{background:rgb(var(--color-warning-rgb)/.16);color:var(--color-warning-text)}.badge.badge-active[_ngcontent-%COMP%]{background:rgb(var(--color-success-rgb)/.12);color:var(--color-success-text)}.badge.badge-banned[_ngcontent-%COMP%]{background:rgb(var(--color-danger-rgb)/.12);color:var(--color-danger-text)}.page-btn[_ngcontent-%COMP%]{background:var(--color-surface);border:1px solid var(--color-border-strong);color:var(--color-text);padding:4px 10px;border-radius:6px;font-size:12px;cursor:pointer;transition:border-color .1s ease}.page-btn[_ngcontent-%COMP%]:hover:not([disabled]){border-color:var(--color-primary)}.page-btn[disabled][_ngcontent-%COMP%]{opacity:.4;cursor:not-allowed}.detail-drawer[_ngcontent-%COMP%]{width:380px;max-width:100%;max-height:calc(100vh - 140px);position:sticky;top:0}.section-title[_ngcontent-%COMP%]{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--color-text-muted);font-weight:600;margin:0 0 8px}.kv-list[_ngcontent-%COMP%]{margin:0;padding:0;display:grid;grid-template-columns:1fr 1fr;gap:6px 16px}.kv-list[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{min-width:0}.kv-list[_ngcontent-%COMP%]   dt[_ngcontent-%COMP%]{font-size:11px;color:var(--color-text-faint);margin:0}.kv-list[_ngcontent-%COMP%]   dd[_ngcontent-%COMP%]{font-size:13px;color:var(--color-text);margin:0;overflow-wrap:anywhere}.action-label[_ngcontent-%COMP%]{font-size:12px;color:var(--color-text-secondary);margin:0 0 6px}.action-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:6px 12px;border-radius:8px;font-size:12px;font-weight:600;border:1px solid transparent;cursor:pointer;transition:background-color .1s ease,border-color .1s ease}.action-btn.primary[_ngcontent-%COMP%]{background:var(--color-primary);color:#fff}.action-btn.primary[_ngcontent-%COMP%]:hover:not([disabled]){background:var(--color-primary-hover)}.action-btn.warning[_ngcontent-%COMP%]{background:var(--color-surface);color:var(--color-danger);border-color:rgb(var(--color-danger-rgb)/.32)}.action-btn.warning[_ngcontent-%COMP%]:hover:not([disabled]){background:rgb(var(--color-danger-rgb)/.08)}.action-btn.ghost[_ngcontent-%COMP%]{background:transparent;color:var(--color-text-muted);border-color:var(--color-border-strong)}.action-btn[disabled][_ngcontent-%COMP%]{opacity:.5;cursor:not-allowed}'],changeDetection:0})}}return i})();export{Vt as AdminUsersComponent};

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.