1import{a as ge,b as fe}from"./chunk-32MVKEGG.js";import{a as _e}from"./chunk-UNIMAODD.js";import{a as ce}from"./chunk-TPEH54NC.js";import{f as de,g as me,h as pe}from"./chunk-DNFLHLBL.js";import{a as ue}from"./chunk-KSCKDLJY.js";import{b as L}from"./chunk-77FKT5JT.js";import{a as V}from"./chunk-UDAFKW5T.js";import{b as le}from"./chunk-QT4Y6DAG.js";import{a as se}from"./chunk-I27FSOWI.js";import"./chunk-YDHC32EP.js";import"./chunk-JJ3UGRRV.js";import"./chunk-PFKBWYNX.js";import"./chunk-BYRCIEHW.js";import"./chunk-KM2WX4AO.js";import"./chunk-LFU76I3C.js";import"./chunk-FDCJHWSN.js";import{c as ie}from"./chunk-DTI2P45D.js";import"./chunk-ZIUGQAJ6.js";import{a as ae}from"./chunk-XAAKPWGS.js";import{a as oe}from"./chunk-HV3GO5Z2.js";import{a as M}from"./chunk-XZBHOAEY.js";import"./chunk-RQPHNGPS.js";import{b as I}from"./chunk-2XTP3JNB.js";import"./chunk-NWDWORH2.js";import"./chunk-5MUAM7JS.js";import"./chunk-IHJCQUK6.js";import{a as ne}from"./chunk-HRGIHHFE.js";import"./chunk-KLAEZ5UA.js";import{a as re}from"./chunk-FJMQYAVB.js";import"./chunk-T5P3A2XG.js";import{g as ee,l as te}from"./chunk-UFD3WH34.js";import"./chunk-4GRCKKS4.js";import{$b as o,Ab as T,Ca as Y,Dc as s,Ec as C,Fc as R,Jc as k,Kc as E,L as q,Lc as D,Pc as J,Tc as K,Ub as _,Vb as g,Vc as Q,Yb as S,Zb as A,_b as b,ac as a,ba as z,bc as X,bd as p,dd as W,ed as Z,ga as v,ic as x,lb as d,ma as c,mc as f,na as u,oc as m,sa as G,za as h,zc as H}from"./chunk-WOGKWOFI.js";import"./chunk-HT2G6UXV.js";import{a as O,b as B}from"./chunk-QJI7QS7F.js";var we=(n,t)=>t.slug;function Ce(n,t){if(n&1){let e=x();o(0,"app-aria-input",15),f("valueChange",function(r){let l=c(e).$implicit,y=m();return u(y.toggle(l.slug,r===!0))}),a()}if(n&2){let e=t.$implicit,i=m();b("id","edit-role-"+e.slug)("label",e.name)("description",e.description??"")("disabled",i.isLocked(e.slug))("value",i.isChecked(e.slug))}}var $=class n{dialogRef;data;selected=h(new Set);changed=p(()=>{let t=this.selected(),e=new Set(this.data?.selected??[]);return t.size!==e.size||[...t].some(i=>!e.has(i))});canSave=p(()=>this.selected().size>0&&this.changed());ngOnInit(){this.selected.set(new Set(this.data.selected))}isChecked(t){return this.selected().has(t)}isLocked(t){return t!=="super_admin"?!1:!this.data.callerIsSuper||this.data.isSelf&&this.isChecked(t)}toggle(t,e){this.selected.update(i=>L(i,t,e))}cancel(){this.dialogRef.close()}save(){this.canSave()&&this.dialogRef.close([...this.selected()])}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=T({type:n,selectors:[["app-edit-admin-roles-dialog"]],decls:22,vars:2,consts:[["role","dialog","aria-modal","true","aria-labelledby","edit-roles-title",1,"bg-linear-to-br","from-[#0d1a2d]","to-[#1a2332]","shadow-2xl","flex","flex-col","md:max-w-[480px]","w-[95svw]","mx-auto","overflow-hidden","relative","rounded-xl"],[1,"flex","items-center","justify-between","px-5","py-3","border-b","border-white/10","shrink-0"],[1,"min-w-0"],["id","edit-roles-title",1,"text-base","font-semibold","text-white"],[1,"text-xs","text-white/60","truncate"],["variant","close","size","sm","aria-label","Close dialog",3,"clicked"],["novalidate","",3,"submit"],[1,"px-5","py-5","space-y-4"],[1,"text-sm","text-white/70","leading-relaxed"],[1,"flex","flex-col","gap-2"],[1,"sr-only"],["type","checkbox",3,"id","label","description","disabled","value"],[1,"flex","items-center","justify-end","gap-3","px-5","py-4","border-t","border-white/10"],["type","button","variant","outline",1,"border-white/15","text-white","hover:bg-white/5",3,"clicked"],["type","submit","variant","default",3,"disabled"],["type","checkbox",3,"valueChange","id","label","description","disabled","value"]],template:function(e,i){e&1&&(o(0,"div",0)(1,"div",1)(2,"div",2)(3,"h2",3),s(4,"Edit roles"),a(),o(5,"p",4),s(6),a()(),o(7,"app-button",5),f("clicked",function(){return i.cancel()}),a()(),o(8,"form",6),f("submit",function(l){return l.preventDefault(),i.save()}),o(9,"div",7)(10,"p",8),s(11," Permissions are the union of every role ticked. Partner roles are exclusive \u2014 one Django partner-admin row per login. "),a(),o(12,"fieldset",9)(13,"legend",10),s(14,"Roles"),a(),S(1
15,Ce,1,5,"app-aria-input",11,we),a()(),o(17,"div",12)(18,"app-button",13),f("clicked",function(){return i.cancel()}),s(19," Cancel "),a(),o(20,"app-button",14),s(21,"Save roles"),a()()()()),e&2&&(d(6),C(i.data.email),d(9),A(i.data.roles),d(5),b("disabled",!i.canSave()))},dependencies:[I,V],styles:["[_nghost-%COMP%]{display:block}"]})};var Se={roles:[],permissions:[],rolePermissions:{},admins:[]},F=class n{supabase=v(se);logger=v(re);notification=v(M);isBrowser=te(v(Y));dataResource=Z({params:()=>this.isBrowser?!0:void 0,loader:async()=>{let t=await this.supabase.getClient(),[e,i,r,l]=await Promise.all([t.from("admin_roles").select("id, slug, name, description").order("name"),t.from("admin_permissions").select("id, key, category, label").order("category").order("label"),t.from("admin_role_permissions").select("role_id, admin_permissions(key)"),t.from("admin_users").select("user_id, email, full_name, is_active, last_login_at, admin_user_roles(admin_roles(id, slug, name)), admin_user_email_domains(domain)").order("email")]),y=e.error||i.error||r.error||l.error;if(y)throw y;let P={};for(let w of r.data??[])w.admin_permissions?.key&&(P[w.role_id]??=[]).push(w.admin_permissions.key);let N=(l.data??[]).map(w=>({user_id:w.user_id,email:w.email,full_name:w.full_name,is_active:w.is_active,last_login_at:w.last_login_at,roles:(w.admin_user_roles??[]).flatMap(U=>U.admin_roles?[U.admin_roles]:[]).sort((U,ve)=>U.name.localeCompare(ve.name)),domains:(w.admin_user_email_domains??[]).map(U=>U.domain).sort()}));return{roles:e.data??[],permissions:i.data??[],rolePermissions:P,admins:N}}});data=p(()=>this.dataResource.value()??Se);roles=p(()=>this.data().roles);permissions=p(()=>this.data().permissions);rolePermissions=p(()=>this.data().rolePermissions);admins=p(()=>this.data().admins);isLoading=p(()=>this.dataResource.isLoading());error=p(()=>this.dataResource.error());constructor(){this.dataResource.error()&&this.logger.error("[AdminUsersFacade] load failed",this.dataResource.error())}async setActive(t,e){try{let i=await this.supabase.getClient(),{error:r}=await i.from("admin_users").update({is_active:e}).eq("user_id",t);if(r)throw r;return this.dataResource.reload(),this.notification.success(e?"User activated":"User deactivated",e?"They can sign in again.":"They can no longer sign in and will be signed out on their next session refresh."),!0}catch(i){return this.logger.error("[AdminUsersFacade] setActive failed",i),this.notification.error("Update failed",i instanceof Error?i.message:"Please try again."),!1}}async setDomains(t,e){try{let i=await this.supabase.getClient(),{error:r}=await i.from("admin_user_email_domains").delete().eq("user_id",t);if(r)throw r;if(e.length){let{error:l}=await i.from("admin_user_email_domains").insert(e.map(y=>({user_id:t,domain:y})));if(l)throw l}return this.dataResource.reload(),this.notification.success("Domains updated",e.length?`Mapped to ${e.join(", ")}.`:"All domain mappings removed \u2014 this admin now sees the unfiltered scope."),!0}catch(i){return this.logger.error("[AdminUsersFacade] setDomains failed",i),this.notification.error("Update failed",i instanceof Error?i.message:"Please try again."),!1}}async setRoles(t,e){try{let i=await this.supabase.getClient(),{error:r}=await i.rpc("set_admin_user_roles",{p_user_id:t,p_role_slugs:e});if(r)throw r;return this.dataResource.reload(),this.notification.success("Roles updated","They apply on their next sign-in or refresh."),!0}catch(i){return this.logger.error("[AdminUsersFacade] setRoles failed",i),this.notification.error("Update failed",i instanceof Error?i.message:"Please try again."),!1}}async deleteUser(t,e){try{let i=await this.supabase.getClient(),{error:r}=await i.rpc("delete_admin_user",{p_user_id:t});if(r)throw r;return this.dataResource.reload(),this.notification.success("User deleted",`${e} has been permanently removed.`),!0}catch(i){return this.logger.error("[AdminUsersFacade] deleteUser failed",i),this.notification.error("Delete failed",i instanceof Error?i.message:"Please try again."),!1}}reload(){this.dataResource.reload()}static \u0275fac=function(e){return new(e||n)};static \u0275prov=z({token:n,factory:n.\u0275fac})};var Ae={super_admin:{role:"super",scope:"none"},partner_platform_admin:{role:"super",scope:"none"},partner_network_admin:{role:"network",scope:"either"},partner_subcompany_admin:{role:"firm",scope:"firm"}};function j(n){for(let t of n){let e=Ae[t];if(e)return{slug:t,mapping:e}}return null}var Re=(n,t)=>t.user_id,ye=(n,t)=>t.id,ke=(n,t)=>t.category,Ee=(n,t)=>t.key;function De(n,t){if(n&1){let e=x();o(0,"app-button",18),f("clicked",function(){c(e);let r=m();return u(r.openForm())}),s(1,"New admin user"),a()}}function Ue(n,t){n&1&&(o(0,"div",6),s(1," Failed to load admin data. Refresh the page or check your connection. "),a())}function Ne(n,t){n&1&&X(0,"app-spinner",10)}function Fe(n,t){if(n&1&&(o(0,"span",22),s(1),a()),n&2){let e=t.$implicit;d(),C(e.name)}}function Pe(n,t){n&1&&(o(0,"span",23),s(1,"\u2014"),a())}function Te(n,t){n&1&&(o(0,"span",30),s(1,"You"),a())}function Ie(n,t){if(n&1){let e=x();o(0,"app-button",28),f("clicked",function(){c(e);let r=m(2).$implicit,l=m();return u(l.toggleActive(r))}),s(1," Disable "),a()}}function Me(n,t){if(n&1){let e=x();o(0,"app-button",28),f("clicked",function(){c(e);let r=m(2).$implicit,l=m();return u(l.toggleActive(r))}),s(1," Enable "),a()}}function Ve(n,t){if(n&1){let e=x();_(0,Ie,2,0,"app-button",31)(1,Me,2,0,"app-button",31),o(2,"app-button",32),f("clicked",function(){c(e);let r=m().$implicit,l=m();return u(l.deleteUser(r))}),s(3," Delete "),a()}if(n&2){let e=m().$implicit;g(e.is_active?0:1)}}function Le(n,t){if(n&1){let e=x();o(0,"tr",16)(1,"td",19),s(2),a(),o(3,"td",20),s(4),a(),o(5,"td",19)(6,"div",21),S(7,Fe,2,1,"span",22,ye,!1,Pe,2,0,"span",23),a()(),o(10,"td",20),s(11),a(),o(12,"td",19)(13,"span",24),s(14),a()(),o(15,"td",25),s(16),K(17,"date"),a(),o(18,"td",26)(19,"div",27)(20,"app-button",28),f("clicked",function(){let r=c(e).$implicit,l=m();return u(l.editRoles(r))}),s(21," Roles "),a(),o(22,"app-button",28),f("clicked",function(){let r=c(e).$implicit,l=m();return u(l.editDomains(r))}
1),s(23," Domains "),a(),o(24,"app-button",29),f("clicked",function(){let r=c(e).$implicit,l=m();return u(l.openRegister(r))}),s(25," Register partner admin "),a(),_(26,Te,2,0,"span",30)(27,Ve,4,1),a()()()}if(n&2){let e=t.$implicit,i=m();d(2),C(e.email),d(2),C(e.full_name||"\u2014"),d(3),A(e.roles),d(4),C(e.domains.join(", ")||"\u2014"),d(2),H("background",e.is_active?"var(--mm-success-bg)":"var(--mm-danger-bg)")("color",e.is_active?"var(--mm-success-fg)":"var(--mm-danger-fg)"),d(),R(" ",e.is_active?"Active":"Disabled"," "),d(2),R(" ",Q(17,11,e.last_login_at,"d MMM y, h:mm a")||"Never"," "),d(10),g(e.user_id===i.currentUserId()?26:27)}}function $e(n,t){n&1&&(o(0,"tr")(1,"td",33),s(2,"No admin users yet."),a()())}function Oe(n,t){if(n&1&&_(0,$e,3,0,"tr"),n&2){let e=m();g(e.facade.isLoading()?-1:0)}}function We(n,t){n&1&&s(0),n&2&&R(" Register partner admin \u2014 ",t.email," ")}function je(n,t){n&1&&s(0," Configure new admin ")}function Be(n,t){if(n&1&&(o(0,"div",35),s(1," Provisioning an admin for network "),o(2,"b"),s(3),a(),s(4,". Pick a partner role below \u2014 the network is pre-selected. "),a()),n&2){let e=m(2);d(3),C(e.prefilledNetworkName())}}function qe(n,t){if(n&1&&(o(0,"div",35),s(1," Provisioning an admin for firm "),o(2,"b"),s(3),a(),s(4,". Pick the firm (sub-company) role below \u2014 the firm is pre-selected. "),a()),n&2){let e=m(2);d(3),C(e.prefilledFirmName())}}function ze(n,t){if(n&1){let e=x();o(0,"app-aria-input",50),f("valueChange",function(r){let l=c(e).$implicit,y=m(3);return u(y.toggleRole(l.slug,r===!0))}),a()}if(n&2){let e=t.$implicit,i=m(3);b("id","new-admin-role-"+e.slug)("label",e.name)("description",e.description??"")("disabled",i.isRoleLocked(e.slug))("value",i.isRoleChecked(e.slug))}}function Ge(n,t){if(n&1){let e=x();o(0,"div",40)(1,"app-aria-input",41),D("valueChange",function(r){c(e);let l=m(2);return E(l.email,r)||(l.email=r),u(r)}),a(),o(2,"app-aria-input",42),D("valueChange",function(r){c(e);let l=m(2);return E(l.fullName,r)||(l.fullName=r),u(r)}),a()(),o(3,"fieldset",2)(4,"legend",43),s(5," Roles "),o(6,"span",44),s(7,"\u2014 tick every section this admin should see; partner roles are exclusive."),a()(),o(8,"div",45),S(9,ze,1,5,"app-aria-input",46,ye),a()(),o(11,"app-aria-input",47),D("valueChange",function(r){c(e);let l=m(2);return E(l.domains,r)||(l.domains=r),u(r)}),a(),o(12,"p",48),s(13," Domains this admin manages on the partner-user screens. Separate multiple with commas. "),a(),o(14,"app-aria-input",49),D("valueChange",function(r){c(e);let l=m(2);return E(l.reportType,r)||(l.reportType=r),u(r)}),a(),o(15,"p",48),s(16," Forwarded as the "),o(17,"code"),s(18,"report_type"),a(),s(19," filter on the vendor users screen. "),a()}if(n&2){let e=m(2);d(),b("required",!0),k("value",e.email),d(),k("value",e.fullName),d(7),A(e.facade.roles()),d(2),k("value",e.domains),d(3),k("value",e.reportType)}}function Ye(n,t){if(n&1){let e=x();o(0,"app-aria-input",58),f("valueChange",function(r){c(e);let l=m(3);return u(l.registerPartnerSuper.set(r===!0))}),a()}if(n&2){let e=m(3);b("value",e.registerPartnerSuper())}}function Xe(n,t){if(n&1){let e=x();o(0,"app-aria-select",59),D("valueChange",function(r){c(e);let l=m(3);return E(l.partnerScope,r)||(l.partnerScope=r),u(r)}),a()}if(n&2){let e=m(3);b("required",!0)("options",e.scopeOptions()),k("value",e.partnerScope)}}function He(n,t){if(n&1){let e=x();o(0,"app-aria-select",60),D("valueChange",function(r){c(e);let l=m(3);return E(l.partnerFirmId,r)||(l.partnerFirmId=r),u(r)}),a()}if(n&2){let e=m(3);b("required",!0)("options",e.firmOptions()),k("value",e.partnerFirmId)}}function Je(n,t){if(n&1){let e=x();o(0,"div",56)(1,"p",61),s(2,"Django capabilities"),a(),o(3,"p",57),s(4),a(),o(5,"app-checkbox-list",62),f("selectionChange",function(r){c(e);let l=m(3);return u(l.onCapabilitiesChange(r))}),a()()}if(n&2){let e=m(3);d(4),R(" Pre-set for a ",e.effectiveRole()," admin; each one gates an action in the panel. "),d(),b("options",e.capabilityOptions)("selected",e.selectedCapabilities())}}function Ke(n,t){n&1&&(o(0,"p",57),s(1," Super admin \u2014 full access (no per-capability grants). "),a())}function Qe(n,t){if(n&1&&(o(0,"div",36)(1,"div",51)(2,"h3",9),s(3,"Partner Platform provisioning"),a(),o(4,"p",52),s(5," Registers a Django "),o(6,"b"),s(7),a(),s(8," partner admin for this login \u2014 the row that scopes every "),o(9,"code"),s(10,"partners/*"),a(),s(11," API call. "),a()(),_(12,Ye,1,1,"app-aria-input",53),_(13,Xe,1,3,"app-aria-select",54),_(14,He,1,3,"app-aria-select",55),_(15,Je,6,3,"div",56)(16,Ke,2,0,"p",57),a()),n&2){let e=m(2);d(7),C(e.effectiveRole()),d(5),g(e.isSuperSelected()?12:-1),d(),g(e.partnerMapping()?.scope==="either"?13:-1),d(),g(e.partnerMapping()?.scope==="firm"?14:-1),d(),g(e.effectiveRole()!=="super"?15:16)}}function Ze(n,t){if(n&1){let e=x();o(0,"app-aria-input",64),f("valueChange",function(r){let l=c(e).$implicit,y=m(4);return u(y.toggle(l.key,r===!0))}),a()}if(n&2){let e=t.$implicit,i=m(4);b("id","new-admin-perm-"+e.id)("label",e.label)("description",e.key)("value",i.isChecked(e.key))}}function et(n,t){if(n&1&&(o(0,"fieldset",2)(1,"legend",61),s(2),a(),o(3,"div",45),S(4,Ze,1,4,"a
1pp-aria-input",63,Ee),a()()),n&2){let e=t.$implicit;d(2),R(" ",e.category," "),d(2),A(e.perms)}}function tt(n,t){if(n&1&&(o(0,"div",37)(1,"p",43),s(2," Permissions "),o(3,"span",44),s(4,"\u2014 pre-set from the roles; tick to grant, untick to deny."),a()(),S(5,et,6,1,"fieldset",2,ke),a()),n&2){let e=m(2);d(5),A(e.permissionGroups())}}function it(n,t){if(n&1&&s(0),n&2){let e=m(2);R(" ",e.isSubmitting()?"Registering\u2026":"Register partner admin"," ")}}function nt(n,t){if(n&1&&s(0),n&2){let e=m(2);R(" ",e.isSubmitting()?"Creating\u2026":"Create admin"," ")}}function rt(n,t){if(n&1){let e=x();o(0,"div",17)(1,"div",34)(2,"h2",9),_(3,We,1,1)(4,je,1,0),a(),o(5,"app-button",28),f("clicked",function(){c(e);let r=m();return u(r.closeForm())}),s(6," Cancel "),a()(),_(7,Be,5,1,"div",35),_(8,qe,5,1,"div",35),_(9,Ge,20,5),_(10,Qe,17,5,"div",36),_(11,tt,7,0,"div",37),o(12,"div",38)(13,"app-button",39),f("clicked",function(){c(e);let r=m();return u(r.provision())}),_(14,it,1,1)(15,nt,1,1),a()()()}if(n&2){let e,i=m();d(3),g((e=i.registerFor())?3:4,e),d(4),g(i.prefilledNetworkName()?7:-1),d(),g(i.prefilledFirmName()?8:-1),d(),g(i.registerFor()?-1:9),d(),g(i.isPartnerRole()?10:-1),d(),g(!i.registerFor()&&i.roleSlugs().size>0?11:-1),d(2),b("disabled",!i.canSubmit()||i.isSubmitting()),d(),g(i.registerFor()?14:15)}}var xe=class n{facade=v(F);notification=v(M);auth=v(le);partnerFacade=v(ce);provisioning=v(fe);route=v(ie);dialog=v(ae);destroyRef=v(G);constructor(){let t=this.route.snapshot.queryParamMap;if(t.get("provision")==="1"){this.showForm.set(!0);let e=Number(t.get("network"));Number.isInteger(e)&&e>0&&(this.partnerScope.set(`network:${e}`),this.prefilledNetworkId.set(e));let i=Number(t.get("firm"));Number.isInteger(i)&&i>0&&(this.partnerScope.set(`firm:${i}`),this.partnerFirmId.set(i),this.prefilledFirmId.set(i))}}prefilledNetworkId=h(null);prefilledNetworkName=p(()=>{let t=this.prefilledNetworkId();return t==null?null:this.partnerFacade.networks().find(e=>e.id===t)?.name??`#${t}`});prefilledFirmId=h(null);prefilledFirmName=p(()=>{let t=this.prefilledFirmId();return t==null?null:this.partnerFacade.firms().find(e=>e.id===t)?.name??`#${t}`});currentUserId=p(()=>this.auth.adminUser()?.user_id??null);toggleActive(t){this.facade.setActive(t.user_id,!t.is_active)}deleteUser(t){confirm(`Permanently delete ${t.email}? This removes their login and cannot be undone.`)&&this.facade.deleteUser(t.user_id,t.email)}editRoles(t){this.dialog.open($,{data:{email:t.email,roles:this.facade.roles(),selected:t.roles.map(i=>i.slug),isSelf:t.user_id===this.currentUserId(),callerIsSuper:this.auth.isSuperAdmin()},maxWidth:"480px",ariaLabel:`Edit roles for ${t.email}`}).afterClosed$.pipe(q(1),ne(this.destroyRef)).subscribe(i=>{i&&this.facade.setRoles(t.user_id,i)})}showForm=h(!1);registerFor=h(null);email=h("");fullName=h("");roleSlugs=h(new Set);domains=h("");reportType=h("");partnerScope=h(null);partnerFirmId=h(null);registerPartnerSuper=h(!0);isSubmitting=h(!1);openForm(){this.showForm.set(!0)}openRegister(t){if(!j(t.roles.map(e=>e.slug))){this.notification.error("No partner role","Assign a partner role (Roles) before registering a Django partner admin.");return}this.closeForm(),this.registerFor.set(t),this.email.set(t.email),this.fullName.set(t.full_name??""),this.roleSlugs.set(new Set(t.roles.map(e=>e.slug))),this.showForm.set(!0)}closeForm(){this.showForm.set(!1),this.registerFor.set(null),this.email.set(""),this.fullName.set(""),this.roleSlugs.set(new Set),this.domains.set(""),this.reportType.set(""),this.partnerScope.set(null),this.partnerFirmId.set(null),this.registerPartnerSuper.set(!0),this.prefilledNetworkId.set(null),this.prefilledFirmId.set(null)}isRoleChecked(t){return this.roleSlugs().has(t)}isRoleLocked(t){return t==="super_admin"&&!this.auth.isSuperAdmin()}toggleRole(t,e){this.roleSlugs.update(i=>L(i,t,e))}selectedRoles=p(()=>this.facade.roles().filter(t=>this.roleSlugs().has(t.slug)));partnerMapping=p(()=>j(this.roleSlugs())?.mapping??null);isPartnerRole=p(()=>this.partnerMapping()!==null);isSuperSelected=p(()=>this.roleSlugs().has("super_admin"));effectiveRole=p(()=>{let t=this.partnerMapping();
1return t?t.scope==="either"&&this.partnerScope()?.startsWith("firm:")?"firm":t.role:null});partnerCapabilities=W(()=>new Set(pe[this.effectiveRole()??"super"]));capabilityOptions=de.map(t=>({value:t,label:me[t]}));selectedCapabilities=p(()=>[...this.partnerCapabilities()]);onCapabilitiesChange(t){this.partnerCapabilities.set(new Set(t))}registersPartnerAdmin=p(()=>this.partnerMapping()?this.isSuperSelected()?this.registerPartnerSuper():!0:!1);firmOptions=p(()=>this.partnerFacade.firms().map(t=>({value:t.id,label:t.is_standalone?`${t.name} (standalone)`:`${t.name} \u2014 ${t.network?.name??"\u2014"}`})));scopeOptions=p(()=>[...this.partnerFacade.activeNetworks().map(t=>({value:`network:${t.id}`,label:`${t.name} (network)`})),...this.partnerFacade.standaloneFirms().map(t=>({value:`firm:${t.id}`,label:`${t.name} (standalone firm)`}))]);permissionGroups=p(()=>{let t=new Map;for(let e of this.facade.permissions()){let i=t.get(e.category)??[];i.push(e),t.set(e.category,i)}return[...t.entries()].map(([e,i])=>({category:e,perms:i}))});roleDefaults=p(()=>{let t=new Set,e=this.facade.rolePermissions();for(let i of this.selectedRoles())for(let r of e[i.id]??[])t.add(r);return t});selected=W(()=>new Set(this.roleDefaults()));isChecked(t){return this.selected().has(t)}toggle(t,e){this.selected.update(i=>{let r=new Set(i);return e?r.add(t):r.delete(t),r})}emailInvalid=p(()=>{let t=this.email().trim();return t?!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t):!1});canSubmit=p(()=>{if(!this.registerFor()&&(!this.email().trim()||this.emailInvalid()||this.roleSlugs().size===0))return!1;let t=this.partnerMapping();return!(t?.scope==="either"&&this.partnerScope()==null||t?.scope==="firm"&&this.partnerFirmId()==null)});scopeIds(){let t=this.partnerMapping()?.scope;if(!t||t==="none")return{network_id:null,firm_id:null};if(t==="firm")return{network_id:null,firm_id:this.partnerFirmId()};let e=this.partnerScope();if(!e)return{network_id:null,firm_id:null};let[i,r]=e.split(":");return i==="network"?{network_id:Number(r),firm_id:null}:{network_id:null,firm_id:Number(r)}}async provision(){if(!(!this.canSubmit()||this.isSubmitting())){this.isSubmitting.set(!0);try{let t=this.registerFor(),e=this.email().trim().toLowerCase(),i=t?.user_id??null;if(!t){let r=this.roleDefaults(),l=this.selected(),y=[...l].filter(N=>!r.has(N)),P=[...r].filter(N=>!l.has(N));if(i=await this.provisioning.provisionAdminUser({email:e,fullName:this.fullName().trim(),roleSlugs:[...this.roleSlugs()],domains:this.parseDomains(),grants:y,denies:P,reportType:this.reportType().trim()}),!i)return;this.facade.reload()}if(this.registersPartnerAdmin()&&i){let{network_id:r,firm_id:l}=this.scopeIds(),y=await this.partnerFacade.createPartnerAdmin(B(O(O({supabase_uid:i,email:e,role:this.effectiveRole()??"super"},r!=null?{network:r}:{}),l!=null?{firm:l}:{}),{capabilities:[...this.partnerCapabilities()]}));if(t&&!y)return}t||this.notification.success("Admin provisioned",`${e} created. Initial password: ${ge} \u2014 ask them to change it after signing in.`),this.closeForm()}finally{this.isSubmitting.set(!1)}}}parseDomains(t=this.domains()){return[...new Set(t.split(/[\s,]+/).map(e=>e.trim().toLowerCase()).filter(Boolean))]}editDomains(t){let e=prompt(`Email domains for ${t.email} (comma or space separated, blank to clear):`,t.domains.join(", "));e!==null&&this.facade.setDomains(t.user_id,this.parseDomains(e))}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=T({type:n,selectors:[["app-admin-admin-users"]],hostAttrs:[1,"block","w-full"],features:[J([F])],decls:37,vars:5,consts:[[1,"admin-theme","flex","flex-col","gap-6","p-6","text-white","min-h-full"],[1,"flex","flex-wrap","items-start","justify-between","gap-3"],[1,"flex","flex-col","gap-2"],[1,"text-2xl","font-bold","leading-tight"],[1,"text-sm","text-white/70"],["variant","default"],["role","alert",1,"px-3","py-2","text-sm","rounded-md",2,"background","var(--mm-danger-bg)","color","var(--mm-danger-fg)"],[1,"rounded-md","border","border-white/10",2,"background","var(--mm-surface-2)"],[1,"px-4","py-3","border-b","border-white/10","flex","items-center","gap-2"],[1,"text-sm","font-semibold"],["size","sm"],[1,"overflow-x-auto"],[1,"w-full","min-w-[880px]","text-sm"],[1,"text-white/60","text-left"],[1,"px-4","py-2","font-medium"],[1,"px-4","py-2","font-medium","text-right"],[1,"border-t","border-white/5"],[1,"rounded-md","border","border-white/10","p-4","flex","flex-col","gap-5",2,"background","var(--mm-surface-2)"],["variant","default",3,"clicked"],[1,"px-4","py-2"],[1,"px-4","py-2","text-white/80"],[1,"flex","flex-wrap","gap-1"],[1,"rounded","px-2","py-0.5","text-xs",2,"background","var(--mm-surface-3)","color","var(--mm-fg-2)"],[1,"text-white/50"],[1,"px-2","py-0.5","rounded-full","text-xs","font-medium"],[1,"px-4","py-2","text-white/60"],[1,"px-4","py-2","text-right"],[1,"inline-flex","items-center","gap-2"],["variant","outline","size","sm",1,"text-white",3,"clicked"],["variant","outline","size","sm","title","Create the Django partner-a
1dmin row for an existing login",1,"text-white",3,"clicked"],[1,"text-xs","text-white/40"],["variant","outline","size","sm",1,"text-white"],["variant","destructive","size","sm",3,"clicked"],["colspan","7",1,"px-4","py-6","text-center","text-white/50"],[1,"flex","items-center","justify-between"],[1,"px-3","py-2","text-xs","rounded-md",2,"background","var(--mm-info-bg)","color","var(--mm-info-fg)"],[1,"rounded-md","border","p-4","flex","flex-col","gap-4",2,"background","var(--card)","border-color","var(--mm-info)"],[1,"flex","flex-col","gap-3"],[1,"flex","items-center","gap-3"],["variant","default",3,"clicked","disabled"],[1,"grid","gap-4","md:grid-cols-2"],["id","new-admin-email","type","email","label","Email",3,"valueChange","required","value"],["id","new-admin-name","type","text","label","Full name",3,"valueChange","value"],[1,"text-sm","font-medium","text-white/80"],[1,"text-white/50","font-normal"],[1,"grid","gap-2","sm:grid-cols-2"],["type","checkbox",3,"id","label","description","disabled","value"],["id","new-admin-domains","type","text","label","Email domains","placeholder","acme.com, partner.org",3,"valueChange","value"],[1,"-mt-3","text-xs","text-white/50"],["id","new-admin-report-type","type","text","label","Report type (optional)",3,"valueChange","value"],["type","checkbox",3,"valueChange","id","label","description","disabled","value"],[1,"flex","flex-col","gap-1"],[1,"text-xs","text-white/60"],["id","new-admin-register-super","type","checkbox","label","Register as a Django super admin","description","Needed to use the Partner v2 super-admin console. Untick for a super admin who won't touch partners.",3,"value"],["id","partner-scope","label","Network or firm","placeholder","Select a network or firm",3,"required","options","value"],["id","partner-firm","label","Firm (sub-company)","placeholder","Select a firm",3,"required","options","value"],[1,"flex","flex-col","gap-1.5"],[1,"text-xs","text-white/50"],["id","new-admin-register-super","type","checkbox","label","Register as a Django super admin","description","Needed to use the Partner v2 super-admin console. Untick for a super admin who won't touch partners.",3,"valueChange","value"],["id","partner-scope","label","Network or firm","placeholder","Select a network or firm",3,"valueChange","required","options","value"],["id","partner-firm","label","Firm (sub-company)","placeholder","Select a firm",3,"valueChange","required","options","value"],[1,"text-xs","uppercase","tracking-wide","text-white/50"],[3,"selectionChange","options","selected"],["type","checkbox",3,"id","label","description","value"],["type","checkbox",3,"valueChange","id","label","description","value"]],template:function(e,i){e&1&&(o(0,"section",0)(1,"header",1)(2,"div",2)(3,"h1",3),s(4,"Admin Users"),a(),o(5,"p",4),s(6," Pick one or more roles (one per sidenav section \u2014 permissions add up), domains, and any permission overrides, then create the admin. The login is provisioned automatically with a shared initial password (shown when you create them); the new admin should change it after signing in. "),a()(),_(7,De,2,0,"app-button",5),a(),_(8,Ue,2,0,"div",6),o(9,"div",7)(10,"div",8)(11,"h2",9),s(12,"Existing admin users"),a(),_(13,Ne,1,0,"app-spinner",10),a(),o(14,"div",11)(15,"table",12)(16,"thead",13)(17,"tr")(18,"th",14),s(19,"Email"),a(),o(20,"th",14),s(21,"Name"),a(),o(22,"th",14),s(23,"Roles"),a(),o(24,"th",14),s(25,"Email domains"),a(),o(26,"th",14),s(27,"Status"),a(),o(28,"th",14),s(29,"Last login"),a(),o(30,"th",15),s(31,"Action"),a()()(),o(32,"tbody"),S(33,Le,28,14,"tr",16,Re,!1,Oe,1,1),a()()()(),_(36,rt,16,8,"div",17),a()),e&2&&(d(7),g(i.showForm()?-1:7),d(),g(i.facade.error()?8:-1),d(5),g(i.facade.isLoading()?13:-1),d(20),A(i.facade.admins()),d(3),g(i.showForm()?36:-1))},dependencies:[V,ue,I,_e,oe,ee],encapsulation:2})};export{xe as AdminUsers};
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.