PageSourceSearch

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

js mechai.app collected 2026-09-25 03:06:15 UTC 30,766 bytes, 1 lines download raw bytes

1import{a as dt}from"./chunk-HYXPAYDZ.js";import{k as ct}from"./chunk-KBSSFVI3.js";import{b as k}from"./chunk-GGY6QDTV.js";import{j as W}from"./chunk-5IJU7MQ2.js";import"./chunk-LM6BYTWK.js";import"./chunk-7DHSGR33.js";import{b as lt,c as z,f as K,i as U,y as q}from"./chunk-QO327RTO.js";import"./chunk-4MYWE7CD.js";import{d as at}from"./chunk-I5EQON52.js";import{b as st,c as j,d as $}from"./chunk-G6PWMA7J.js";import{Ac as E,Bc as P,Cc as I,Fa as A,Gb as G,Gd as ot,H as X,Jc as rt,Jd as B,M as tt,Qb as l,Qc as g,Rb as i,Rc as w,Sb as n,Tb as y,Wc as V,Xb as L,Yb as T,ac as v,ba as M,cc as f,db as a,e as Q,ec as c,fd as N,mb as S,oa as h,oc as D,pa as b,pc as et,qc as nt,sb as O,sc as s,tc as m,uc as _,vc as H,wc as it,wd as F,xd as R,yb as x}from"./chunk-IQ6SK2BU.js";import"./chunk-FE7444LI.js";import"./chunk-OXDKANHF.js";import{a as Y,b as Z}from"./chunk-XUHYVR5R.js";var mt=(()=>{class e extends W{list(){return this.httpGet(`Admin/PlanPrices?_cb=${Date.now()}`)}setOverride(t,o,r){let p=encodeURIComponent(t),u=encodeURIComponent(o);return this.httpPut(`Admin/PlanPrices/${p}/${u}`,{overridePrice:r})}static{this.\u0275fac=(()=>{let t;return function(r){return(t||(t=A(e)))(r||e)}})()}static{this.\u0275prov=M({token:e,factory:e.\u0275fac,providedIn:"root"})}}return e})();function ht(e,d){if(e&1&&(i(0,"div",9),s(1),n()),e&2){let t=c();a(),_(" ",t.loadError," ")}}function bt(e,d){e&1&&(i(0,"div",10),s(1),g(2,"translate"),n()),e&2&&(a(),_(" ",w(2,1,"V2.ADMIN.PLAN_PRICES.LOADING")," "))}function vt(e,d){if(e&1&&(i(0,"p",23),s(1),n()),e&2){let t=c().$implicit,o=c(2);a(),_(" ",o.errors[o.rowKey(t)]," ")}}function Ct(e,d){if(e&1&&(L(0),i(1,"span"),s(2),n(),y(3,"br"),i(4,"span",24),s(5),n(),T()),e&2){let t=c().$implicit,o=c(2);a(2),m(o.formatDate(t.updatedAt)),a(3),m(t.updatedByAdminEmail)}}function St(e,d){e&1&&s(0,"\u2014")}function yt(e,d){if(e&1){let t=v();i(0,"button",25),f("click",function(){h(t);let r=c().$implicit,p=c(2);return b(p.clear(r))}),s(1),g(2,"translate"),n()}if(e&2){let t=c().$implicit,o=c(2);l("disabled",o.saving[o.rowKey(t)]),a(),_(" ",w(2,2,"V2.ADMIN.PLAN_PRICES.CLEAR")," ")}}function Et(e,d){if(e&1){let t=v();i(0,"tr")(1,"td",14),s(2),n(),i(3,"td",15),s(4),n(),i(5,"td",15),s(6),n(),i(7,"td")(8,"div",16)(9,"input",17),g(10,"translate"),I("ngModelChange",function(r){let p=h(t).$implicit,u=c(2);return P(u.editValues[u.rowKey(p)],r)||(u.editValues[u.rowKey(p)]=r),b(r)}),n()(),x(11,vt,2,1,"p",18),n(),i(12,"td",19),x(13,Ct,6,2,"ng-container",20)(14,St,1,0,"ng-template",null,0,V),n(),i(16,"td")(17,"div",16)(18,"button",21),f("click",function(){let r=h(t).$implicit,p=c(2);return b(p.save(r))}),s(19),g(20,"translate"),g(21,"translate"),n(),x(22,yt,3,4,"button",22),n()()()}if(e&2){let t=d.$implicit,o=D(15),r=c(2);a(2),m(t.plan),a(2),m(t.billingPeriod),a(2),_(" ",t.revenueCatCurrentPrice??"\u2014"," "),a(3),l("placeholder",w(10,12,"V2.ADMIN.PLAN_PRICES.PRICE_PLACEHOLDER")),E("ngModel",r.editValues[r.rowKey(t)]),l("disabled",r.saving[r.rowKey(t)]),a(2),l("ngIf",r.errors[r.rowKey(t)]),a(2),l("ngIf",t.updatedAt)("ngIfElse",o),a(5),l("disabled",r.saving[r.rowKey(t)]),a(),_(" ",r.saving[r.rowKey(t)]?w(20,14,"V2.ADMIN.PLAN_PRICES.SAVING"):w(21,16,"V2.ADMIN.PLAN_PRICES.SAVE")," "),a(3),l("ngIf",t.overridePrice)}}function Pt(e,d){if(e&1&&(i(0,"div",11)(1,"table",12)(2,"thead")(3,"tr")(4,"th"),s(5),g(6,"translate"),n(),i(7,"th"),s(8),g(9,"translate"),n(),i(10,"th"),s(11),g(12,"translate"),n(),i(13,"th"),s(14),g(15,"translate"),n(),i(16,"th"),s(17),g(18,"translate"),n(),y(19,"th"),n()(),i(20,"tbody"),x(21,Et,23,18,"tr",13),n()()()),e&2){let t=c();a(5),m(w(6,6,"V2.ADMIN.PLAN_PRICES.COL_PLAN")),a(3),m(w(9,8,"V2.ADMIN.PLAN_PRICES.COL_PERIOD")),a(3),m(w(12,10,"V2.ADMIN.PLAN_PRICES.COL_REVENUECAT")),a(3),m(w(15,12,"V2.ADMIN.PLAN_PRICES.COL_OVERRIDE")),a(3),m(w(18,14,"V2.ADMIN.PLAN_PRICES.COL_LAST_UPDATED")),a(4),l("ngForOf",t.rows)}}var pt=(()=>{class e{constructor(t,o,r){this.api=t,this.translate=o,this.cdr=r,this.rows=[],this.editValues={},this.saving={},this.errors={},this.isLoading=!0,this.loadError=null}ngOnInit(){this.load()}rowKey(t){return`${t.plan}|${t.billingPeriod}`}formatDate(t){if(!t)return"\u2014";let o=k(t);return o?o.toLocaleDateString():"\u2014"}save(t){let o=this.rowKey(t),r=(this.editValues[o]??"").trim(),p=r.length>0?r:null;this.saving[o]=!0,this.errors[o]=null,this.cdr.markForCheck(),this.api.setOverride(t.plan,t.billingPeriod,p).subscribe({next:u=>{let C=this.rows.findIndex(xt=>this.rowKey(xt)===o);C!==-1&&(this.rows[C]=u),this.editValues[o]=u.overridePrice??"",this.saving[o]=!1,this.cdr.markForCheck()},error:()=>{this.errors[o]=this.translate.instant("V2.ADMIN.PLAN_PRICES.SAVE_ERROR"),this.saving[o]=!1,this.cdr.markForCheck()}})}clear(t){let o=this.rowKey(t);this.editValues[o]="",this.save(t)}refresh(){this.load()}load(){this.isLoading=!0,this.loadError=null,this.cdr.markForCheck(),this.api.list().subscribe({next:t=>{this.rows=t,t.forEach(o=>{this.editValues[this.rowKey(o)]=o.overridePrice??""}),this.isLoading=!1,this.cdr.markForCheck()},error:()=>{this.loadError=this.translate.instant("V2.ADMIN.PLAN_PRICES.LOAD_ERROR"),this.isLoading=!1,this.cdr.markForCheck()}})}static{this.\u0275fac=function(o){return new(o||e)(S(mt),S(st),S(N))}}static{this.\u0275cmp=O({type:e,selectors:[["app-admin-plan-prices"]],decls:15,vars:13,consts:[["neverUpdated",""],[1,"prices-panel"],[1,"prices-panel__header"],[1,"prices-panel__title"],[1,"prices-panel__subtitle"],["type","button",1,"tw-inline-flex","tw-items-center","tw-gap-1","tw-px-3","tw-h-8","tw-rounded-lg","tw-text-xs","tw-font-medium","tw-bg-mech-surface","tw-text-mech-dark","tw-border","t
1w-border-mech-border-strong","hover:tw-border-mech-primary","tw-cursor-pointer","disabled:tw-opacity-60",3,"click","disabled"],["class","error-banner tw-mb-3 tw-p-3 tw-rounded-lg tw-text-sm",4,"ngIf"],["class","tw-text-sm tw-text-mech-dark-500 tw-py-4",4,"ngIf"],["class","tw-overflow-x-auto tw-rounded-xl tw-border tw-border-mech-border",4,"ngIf"],[1,"error-banner","tw-mb-3","tw-p-3","tw-rounded-lg","tw-text-sm"],[1,"tw-text-sm","tw-text-mech-dark-500","tw-py-4"],[1,"tw-overflow-x-auto","tw-rounded-xl","tw-border","tw-border-mech-border"],[1,"prices-table","tw-w-full"],[4,"ngFor","ngForOf"],[1,"tw-font-medium","tw-text-sm","tw-text-mech-dark"],[1,"tw-text-sm","tw-text-mech-dark-500"],[1,"tw-flex","tw-items-center","tw-gap-2"],["type","text",1,"tw-w-28","tw-h-8","tw-px-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",3,"ngModelChange","placeholder","ngModel","disabled"],["class","error-text tw-text-xs tw-mt-1 tw-m-0",4,"ngIf"],[1,"tw-text-xs","tw-text-mech-dark-500"],[4,"ngIf","ngIfElse"],["type","button",1,"action-btn","primary",3,"click","disabled"],["type","button","class","action-btn ghost",3,"disabled","click",4,"ngIf"],[1,"error-text","tw-text-xs","tw-mt-1","tw-m-0"],[1,"tw-text-mech-dark-500/60"],["type","button",1,"action-btn","ghost",3,"click","disabled"]],template:function(o,r){o&1&&(i(0,"section",1)(1,"header",2)(2,"div")(3,"h3",3),s(4),g(5,"translate"),n(),i(6,"p",4),s(7),g(8,"translate"),n()(),i(9,"button",5),f("click",function(){return r.refresh()}),s(10),g(11,"translate"),n()(),x(12,ht,2,1,"div",6)(13,bt,3,3,"div",7)(14,Pt,22,16,"div",8),n()),o&2&&(a(4),m(w(5,7,"V2.ADMIN.PLAN_PRICES.TITLE")),a(3),m(w(8,9,"V2.ADMIN.PLAN_PRICES.SUBTITLE")),a(2),l("disabled",r.isLoading),a(),_(" ",w(11,11,"V2.ADMIN.PLAN_PRICES.REFRESH")," "),a(2),l("ngIf",r.loadError),a(),l("ngIf",r.isLoading&&!r.rows.length),a(),l("ngIf",!r.isLoading||r.rows.length))},dependencies:[B,F,R,q,z,K,U,$,j],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)}.error-text[_ngcontent-%COMP%]{color:var(--color-danger)}.prices-panel[_ngcontent-%COMP%]{background:var(--color-surface);border:1px solid var(--color-border);border-radius:16px;padding:20px;margin-bottom:24px}.prices-panel__header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:16px}.prices-panel__title[_ngcontent-%COMP%]{font-size:14px;font-weight:600;color:var(--color-text);margin:0 0 4px}.prices-panel__subtitle[_ngcontent-%COMP%]{font-size:12px;color:var(--color-text-muted);margin:0}.prices-table[_ngcontent-%COMP%]{border-collapse:collapse}.prices-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:10px 14px;background:var(--color-surface-2);border-bottom:1px solid var(--color-border)}.prices-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{padding:10px 14px;border-bottom:1px solid var(--color-border-subtle);vertical-align:middle}.prices-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr[_ngcontent-%COMP%]:last-child   td[_ngcontent-%COMP%]{border-bottom:none}.action-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:5px 12px;border-radius:8px;font-size:12px;font-weight:600;border:1px solid transparent;cursor:pointer;transition:background-color .1s ease;white-space:nowrap}.action-btn.primary[_ngcontent-%COMP%]{background:var(--color-primary);color:#fff}.action-btn.primary[_ngcontent-%COMP%]:hover:not([disabled]){opacity:.9}.action-btn.ghost[_ngcontent-%COMP%]{background:transparent;border-color:var(--color-border-strong);color:var(--color-text-secondary)}.action-btn.ghost[_ngcontent-%COMP%]:hover:not([disabled]){border-color:var(--color-primary);color:var(--color-primary)}.action-btn[disabled][_ngcontent-%COMP%]{opacity:.5;cursor:not-allowed}'],changeDetection:0})}}return e})();var ut=(()=>{class e extends W{list(t){let o=new at({fromObject:Z(Y({},t.query?{q:t.query}:{}),{activeOnly:String(t.activeOnly??!1),page:String(t.page??1),pageSize:String(t.pageSize??25),_cb:String(Date.now())})});return this.httpGet(`Admin/Subscriptions?${o.toString()}`)}getDetail(t){return this.httpGet(`Admin/Subscriptions/${t}?_cb=${Date.now()}`)}resync(t){return this.httpPost(`Admin/Subscriptions/${t}/Resync`,null)}getCancellationSurveys(t=30){return this.httpGet(`Admin/Subscriptions/CancellationSurveys?days=${t}&_cb=${Date.now()}`)}static{this.\u0275fac=(()=>{let t;return function(r){return(t||(t=A(e)))(r||e)}})()}static{this.\u0275prov=M({token:e,factory:e.\u0275fac,providedIn:"root"})}}return e})();var kt=()=>[];function Mt(e,d){if(e&1&&(i(0,"span",27),s(1),n()),e&2){let t=c(2);a(),_(" (",t.cancelSummary.responseRows," raw response rows) ")}}function At(e,d){if(e&1&&(i(0,"span"),s(1),x(2,Mt,2,1,"span",26),n()),e&2){let t=c();a(),H(" \xB7 ",t.cancelSummary.uniqueIntents," cancel intent",t.cancelSummary.uniqueIntents===1?"":"s"," "),a(),l("ngIf",t.cancelSummary.responseRows>t.cancelSummary.uniqueIntents)}}function Ot(e,d){e&1&&(i(0,"p",4),s(1," Loading\u2026 "),n())}function Lt(e,d){if(e&1&&(i(0,"p",28),s(1),n()),e&2){let t=c();a(),_(" ",t.cancelSummaryError," ")}}function Tt(e,d){e&1&&(i(0,"p",4),s(1," No cancel-reason responses yet. "),n())}function Dt(e,d){if(e&1&&(i(0,"div",31)(1,"span",32),s(2),n(),i(3,"div",33),y(4,"div",34),n(),i(5,"span",35),s(6),n()()),e&2){let t=d.$implicit,o=c(2);a(2),m(o.reasonLabel(t.reason)),a(2),et("width",o.reasonPct(t.count),"%"),a(2),H(" ",t.count," \xB7 ",o.reasonPct(t.count),"% ")}}function Vt(e,d){if(e&1&&(i(0,"div",29),x(1,Dt,7,5,"div",30),n()),e&2){let t=c();a(),l("ngForOf",t.cancelSummary.reasons)}}function Nt(e,d){if(e&1&&(i(0,"div",36),s(1),n()),e&2){let t=c();a(),_(" ",t.listError," ")}}function Ft(e,d){e&1&&(i(0,"span",43),s(1," Active "),n())}function Rt(e,d){e&1&&(i(0,"span",44),s(1,"Expired"),n())}function Bt(e,d){if(e&1){let t=v();i(0,"tr",37),f("click",function(){let r=h(t).$implicit,p=c();return b(p.selectSubscription(r))})("keydown.enter",function(r){let p=h(t).$implicit,u=c();return b(u.onRowKeydown(r,p))})("keydown.space",function(r){let p=h(t).$implicit,u=c();return b(u.onRowKeydown(r,p))}),i(1,"td")(2,"div",38),s(3),n(),i(4,"div",39),s(5),n()(),i(6,"td",40),s(7),n(),i(8,"td",41),s(9),n(),i(10,"td"),x(11,Ft,2,0,"span",42)(12,Rt,2,0,"ng-template",null,0,V),n(),i(14,"td",39)(15,"div"),s(16),n(),i(17,"div"),s(18),n()()()}if(e&2){let t=d.$implicit,o=D(13),r=c();
1nt("is-selected",t.id!==0&&t.id===r.selectedId)("is-non-clickable",t.id===0),G("role",t.id===0?null:"button")("tabindex",t.id===0?null:0)("aria-label",t.id===0?null:t.entitlementName),a(3),m(t.entitlementName),a(2),m(t.entitlementId),a(2),m(t.ownerEmail),a(2),m(t.memberCount),a(2),l("ngIf",t.isActive)("ngIfElse",o),a(5),m(r.formatDate(t.entitlementEndTime)),a(2),m(r.relative(t.entitlementEndTime))}}function jt(e,d){e&1&&(i(0,"tr")(1,"td",45),s(2," No subscriptions match the current filter. "),n()())}function $t(e,d){e&1&&(i(0,"tr")(1,"td",45),s(2," Loading\u2026 "),n()())}function zt(e,d){if(e&1){let t=v();i(0,"footer",46)(1,"span"),s(2),g(3,"number"),n(),i(4,"div",47)(5,"button",48),f("click",function(){h(t);let r=c();return b(r.onPage(-1))}),s(6," Prev "),n(),i(7,"button",48),f("click",function(){h(t);let r=c();return b(r.onPage(1))}),s(8," Next "),n()()()}if(e&2){let t=c();a(2),it("",w(3,5,t.response.total)," groups \xB7 page ",t.response.page," of ",t.totalPages),a(3),l("disabled",t.page<=1||t.isListLoading),a(2),l("disabled",t.page>=t.totalPages||t.isListLoading)}}function Kt(e,d){if(e&1&&(i(0,"h3",59),s(1),n()),e&2){let t=c(2);a(),_(" ",t.detail.entitlementName," ")}}function Ut(e,d){if(e&1&&(i(0,"p",60),s(1),n()),e&2){let t=c(2);a(),_(" ",t.detail.ownerEmail," ")}}function qt(e,d){e&1&&(i(0,"div",40),s(1," Loading\u2026 "),n())}function Wt(e,d){if(e&1&&(i(0,"div",61),s(1),n()),e&2){let t=c(2);a(),_(" ",t.detailError," ")}}function Gt(e,d){if(e&1&&(i(0,"section")(1,"h4",62),s(2,"RevenueCat snapshot"),n(),i(3,"dl",63)(4,"div")(5,"dt"),s(6,"Plan name"),n(),i(7,"dd"),s(8),n()(),i(9,"div")(10,"dt"),s(11,"State"),n(),i(12,"dd"),s(13),n()(),i(14,"div")(15,"dt"),s(16,"Started"),n(),i(17,"dd"),s(18),n()(),i(19,"div")(20,"dt"),s(21,"Ends"),n(),i(22,"dd"),s(23),n()()()()),e&2){let t=d.ngIf,o=c(3);a(8),m(o.planLabel(t.planName)||"\u2014"),a(5),m(t.state||"\u2014"),a(5),m(o.formatDate(t.startTime)),a(5),m(o.formatDate(t.endTime))}}function Ht(e,d){e&1&&(i(0,"div",40),s(1," Owner only. "),n())}function Jt(e,d){if(e&1&&(i(0,"li",69)(1,"span",70),s(2),n(),i(3,"span",71),s(4),n()()),e&2){let t=d.$implicit,o=c(4);a(2),m(t.email),a(2),m(o.relative(t.lastActivity))}}function Yt(e,d){if(e&1&&(i(0,"ul",67),x(1,Jt,5,2,"li",68),n()),e&2){let t=c(3);a(),l("ngForOf",t.detail.members)}}function Zt(e,d){if(e&1){let t=v();L(0),i(1,"section")(2,"h4",62),s(3,"Group"),n(),i(4,"dl",63)(5,"div")(6,"dt"),s(7,"Plan"),n(),i(8,"dd"),s(9),n()(),i(10,"div")(11,"dt"),s(12,"Entitlement ID"),n(),i(13,"dd"),s(14),n()(),i(15,"div")(16,"dt"),s(17,"Join code"),n(),i(18,"dd"),s(19),n()(),i(20,"div")(21,"dt"),s(22,"Status"),n(),i(23,"dd"),s(24),n()(),i(25,"div")(26,"dt"),s(27,"Ends"),n(),i(28,"dd"),s(29),n()()()(),x(30,Gt,24,4,"section",5),i(31,"section")(32,"h4",62),s(33),n(),x(34,Ht,2,0,"div",57)(35,Yt,2,1,"ul",64),n(),i(36,"section")(37,"h4",62),s(38,"Actions"),n(),i(39,"button",65),f("click",function(){h(t);let r=c(2);return b(r.resync())}),s(40," Force resync from RevenueCat "),n(),i(41,"p",66),s(42," Refetches active entitlements for the owner. Useful after a webhook drop or manual refund. "),n()(),T()}if(e&2){let t=c(2);a(9),m(t.detail.entitlementName),a(5),m(t.detail.entitlementId),a(5),m(t.detail.joinCode),a(5),m(t.detail.isActive?"Active":"Expired"),a(5),m(t.formatDate(t.detail.entitlementEndTime)),a(),l("ngIf",t.detail.ownerLatestSubscription),a(3),_("Members (",t.detail.members.length,")"),a(),l("ngIf",!t.detail.members.length),a(),l("ngIf",t.detail.members.length),a(4),l("disabled",t.isMutating)}}function Qt(e,d){if(e&1){let t=v();i(0,"aside",49)(1,"header",50)(2,"div",51)(3,"p",52),s(4,"Subscription"),n(),x(5,Kt,2,1,"h3",53)(6,Ut,2,1,"p",54),n(),i(7,"button",55),f("click",function(){h(t);let r=c();return b(r.closeDetail())}),s(8," \xD7 "),n()(),i(9,"div",56),x(10,qt,2,0,"div",57)(11,Wt,2,1,"div",58)(12,Zt,43,10,"ng-container",5),n()()}if(e&2){let t=c();a(5),l("ngIf",t.detail),a(),l("ngIf",t.detail),a(4),l("ngIf",t.isDetailLoading),a(),l("ngIf",t.detailError),a(),l("ngIf",t.detail)}}var Xt=25,te={"SHOP PRO":"AUTOSHOP"},he=(()=>{class e{constructor(t,o){this.adminSubs=t,this.cdr=o,this.pageSize=Xt,this.searchInput="",this.activeOnly=!0,this.page=1,this.isListLoading=!0,this.listError=null,this.response=null,this.selectedId=null,this.detail=null,this.isDetailLoa
1ding=!1,this.detailError=null,this.isMutating=!1,this.cancelSummary=null,this.isCancelSummaryLoading=!0,this.cancelSummaryError=null,this.reasonLabels={too_expensive:"Too expensive",not_using_enough:"Not using enough",missing_feature:"Missing a feature",not_accurate:"Answers not accurate",technical_issue:"Technical issue",found_alternative:"Found a better app",just_trying:"Just trying the trial",other:"Other"},this.searchSubject=new Q}ngOnInit(){this.searchSubject.pipe(X(300),tt()).subscribe(()=>{this.page=1,this.fetchList()}),this.fetchList(),this.fetchCancelSummary()}reasonLabel(t){return this.reasonLabels[t]??t}reasonPct(t){let o=this.cancelSummary?.uniqueIntents??0;return o>0?Math.round(t/o*100):0}fetchCancelSummary(){this.isCancelSummaryLoading=!0,this.cancelSummaryError=null,this.cdr.markForCheck(),this.adminSubs.getCancellationSurveys(30).subscribe({next:t=>{this.cancelSummary=t,this.isCancelSummaryLoading=!1,this.cdr.markForCheck()},error:()=>{this.cancelSummaryError="Couldn't load cancellation reasons.",this.isCancelSummaryLoading=!1,this.cdr.markForCheck()}})}onFilterChange(){this.searchSubject.next()}onPage(t){let o=this.page+t;o<1||this.response&&(o-1)*this.pageSize>=this.response.total||(this.page=o,this.fetchList())}selectSubscription(t){t.id&&(this.selectedId=t.id,this.fetchDetail(t.id))}onRowKeydown(t,o){o.id&&(t.preventDefault(),this.selectSubscription(o))}closeDetail(){this.selectedId=null,this.detail=null,this.detailError=null}resync(){!this.selectedId||this.isMutating||(this.isMutating=!0,this.cdr.markForCheck(),this.adminSubs.resync(this.selectedId).subscribe({next:()=>{this.isMutating=!1,this.selectedId&&this.fetchDetail(this.selectedId),this.fetchList()},error:()=>{this.isMutating=!1,this.detailError="Resync failed.",this.cdr.markForCheck()}}))}refresh(){this.fetchList()}formatDate(t){let o=k(t);return o?o.toLocaleDateString():"\u2014"}planLabel(t){if(!t)return"";let o=ct(t);return o&&te[o]||t}relative(t){let o=k(t);if(!o)return"\u2014";let r=(Date.now()-o.getTime())/1e3,p=r<0,u=Math.abs(r);if(u<86400)return p?"today":"just now";let C=Math.floor(u/86400);return p?C===1?"in 1 day":`in ${C}d`:C===1?"1d ago":`${C}d ago`}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.adminSubs.list({query:this.searchInput.trim()||void 0,activeOnly:this.activeOnly,page:this.page,pageSize:this.pageSize}).subscribe({next:t=>{this.response=t,this.isListLoading=!1,this.cdr.markForCheck()},error:()=>{this.listError="Couldn't load subscriptions.",this.isListLoading=!1,this.cdr.markForCheck()}})}fetchDetail(t){this.isDetailLoading=!0,this.detail=null,this.detailError=null,this.cdr.markForCheck(),this.adminSubs.getDetail(t).subscribe({next:o=>{this.detail=o,this.isDetailLoading=!1,this.cdr.markForCheck()},error:()=>{this.detailError="Couldn't load subscription detail.",this.isDetailLoading=!1,this.cdr.markForCheck()}})}static{this.\u0275fac=function(o){return new(o||e)(S(ut),S(N))}}static{this.\u0275cmp=O({type:e,selectors:[["app-admin-subscriptions"]],decls:48,vars:18,consts:[["expired",""],[1,"tw-mb-4","tw-p-4","tw-rounded-xl","tw-border","tw-border-mech-border-strong","tw-bg-mech-surface"],[1,"tw-flex","tw-items-center","tw-justify-between","tw-mb-3"],[1,"tw-text-sm","tw-font-bold","tw-text-mech-dark"],[1,"tw-text-xs","tw-text-mech-text-muted"],[4,"ngIf"],[1,"tw-text-[11px]","tw-text-mech-text-muted","tw-mb-2","tw--mt-1"],["class","tw-text-xs tw-text-mech-text-muted",4,"ngIf"],["class","error-text tw-text-xs",4,"ngIf"],["class","tw-flex tw-flex-col tw-gap-2",4,"ngIf"],[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","tw-flex-wrap"],[1,"tw-flex","tw-items-center","tw-gap-3","tw-flex-1"],["type","search","placeholder","Search by plan or owner email\u2026",1,"tw-h-10","tw-flex-1","tw-min-w-0","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"],[1,"tw-inline-flex","tw-items-center","tw-gap-2","tw-text-sm","tw-text-mech-dark"],["type","checkbox",3,"ngModelChange","ngModel"],["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","t
1w-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","tw-mb-4 tw-p-3 tw-rounded-lg tw-text-sm error-banner",4,"ngIf"],[1,"tw-bg-mech-surface","tw-rounded-2xl","tw-border","tw-border-mech-border","tw-shadow-sm","tw-overflow-hidden"],[1,"subs-table","tw-w-full"],[3,"is-selected","is-non-clickable","click","keydown.enter","keydown.space",4,"ngFor","ngForOf"],["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"],["class","tw-text-mech-text-muted",4,"ngIf"],[1,"tw-text-mech-text-muted"],[1,"error-text","tw-text-xs"],[1,"tw-flex","tw-flex-col","tw-gap-2"],["class","tw-flex tw-items-center tw-gap-3",4,"ngFor","ngForOf"],[1,"tw-flex","tw-items-center","tw-gap-3"],[1,"tw-text-xs","tw-text-mech-dark","tw-w-40","tw-shrink-0"],[1,"tw-flex-1","tw-h-2","tw-rounded-full","tw-bg-mech-surface-2","tw-overflow-hidden"],[1,"tw-h-full","tw-rounded-full","tw-bg-mech-primary"],[1,"tw-text-xs","tw-font-semibold","tw-text-mech-dark","tw-w-16","tw-text-right","tw-shrink-0"],[1,"tw-mb-4","tw-p-3","tw-rounded-lg","tw-text-sm","error-banner"],[3,"click","keydown.enter","keydown.space"],[1,"tw-text-sm","tw-font-medium","tw-text-mech-dark"],[1,"tw-text-xs","tw-text-mech-dark-500"],[1,"tw-text-sm","tw-text-mech-dark-500"],[1,"tw-text-sm","tw-text-mech-dark"],["class","badge badge-active",4,"ngIf","ngIfElse"],[1,"badge","badge-active"],[1,"badge","badge-expired"],["colspan","5",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","tw-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","tw-p-3 tw-rounded-lg tw-text-sm error-banner",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-p-3","tw-rounded-lg","tw-text-sm","error-banner"],[1,"section-title"],[1,"kv-list"],["class","tw-space-y-2 tw-m-0 tw-p-0 tw-list-none",4,"ngIf"],["type","button",1,"action-btn","primary",3,"click","disabled"],[1,"tw-text-xs","tw-text-mech-dark-500","tw-m-0","tw-mt-2"],[1,"tw-space-y-2","tw-m-0","tw-p-0","tw-list-none"],["class","tw-flex tw-items-center tw-justify-between tw-gap-3 tw-text-sm",4,"ngFor","ngForOf"],[1,"tw-flex","tw-items-center","tw-justify-between","tw-gap-3","tw-text-sm"],[1,"tw-text-mech-dark","tw-truncate"],[1,"tw-text-xs","tw-text-mech-dark-500","tw-flex-shrink-0"]],template:function(o,r){o&1&&(y(0,"app-admin-plan-prices"),i(1,"div",1)(2,"div",2)(3,"h3",3),s(4,"Why users say they're cancelling"),n(),i(5,"span",4),s(6," Last 30 days "),x(7,At,3,3,"span",5),n()(),i(8,"p",6),s(9," Stated cancel reasons (one per person/episode) \u2014 not completed cancellations. "),n(),x(10,Ot,2,0,"p",7)(11,Lt,2,1,"p",8)(12,Tt,2,0,"p",7)(13,Vt,2,1,"div",9),n(),i(14,"div",10)(15,"section",11)(16,"div",12)(17,"div",13)(18,"input",14),g(19,"translate"),I("ngModelChange",function(u){return P(r.searchInput,u)||(r.searchInput=u),u}),f("ngModelChange",function(){return r.onFilterChange()}),n(),i(20,"label",15)(21,"input",16),I("ngModelChange",function(u){return P(r.activeOnly,u)||(r.activeOnly=u),u}),f("ngModelChange",function(){return r.onFilterChange()}
1),n(),s(22," Active only "),n()(),i(23,"button",17),f("click",function(){return r.refresh()}),i(24,"span",18),y(25,"app-admin-icon",19),n(),s(26," Refresh "),n()(),x(27,Nt,2,1,"div",20),i(28,"div",21)(29,"table",22)(30,"thead")(31,"tr")(32,"th"),s(33,"Plan"),n(),i(34,"th"),s(35,"Owner"),n(),i(36,"th"),s(37,"Members"),n(),i(38,"th"),s(39,"Status"),n(),i(40,"th"),s(41,"Ends"),n()()(),i(42,"tbody"),x(43,Bt,19,15,"tr",23)(44,jt,3,0,"tr",5)(45,$t,3,0,"tr",5),n()(),x(46,zt,9,7,"footer",24),n()(),x(47,Qt,13,5,"aside",25),n()),o&2&&(a(7),l("ngIf",r.cancelSummary),a(3),l("ngIf",r.isCancelSummaryLoading),a(),l("ngIf",r.cancelSummaryError),a(),l("ngIf",!r.isCancelSummaryLoading&&!r.cancelSummaryError&&r.cancelSummary&&r.cancelSummary.uniqueIntents===0),a(),l("ngIf",!r.isCancelSummaryLoading&&r.cancelSummary&&r.cancelSummary.uniqueIntents>0),a(5),E("ngModel",r.searchInput),G("aria-label",w(19,15,"V2.ADMIN.A11Y.SEARCH_SUBSCRIPTIONS")),a(3),E("ngModel",r.activeOnly),a(2),l("disabled",r.isListLoading),a(4),l("ngIf",r.listError),a(16),l("ngForOf",(r.response==null?null:r.response.items)??rt(17,kt)),a(),l("ngIf",!r.isListLoading&&((r.response==null||r.response.items==null?null:r.response.items.length)??0)===0),a(),l("ngIf",r.isListLoading&&!r.response),a(),l("ngIf",r.response),a(),l("ngIf",r.selectedId))},dependencies:[B,F,R,q,z,lt,K,U,dt,pt,$,ot,j],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)}.error-text[_ngcontent-%COMP%]{color:var(--color-danger)}.subs-table[_ngcontent-%COMP%]{border-collapse:collapse}.subs-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)}.subs-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{padding:12px 16px;border-bottom:1px solid var(--color-border);vertical-align:middle}.subs-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr[_ngcontent-%COMP%]{cursor:pointer;transition:background-color .1s ease}.subs-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr[_ngcontent-%COMP%]:hover{background-color:var(--color-surface-2)}.subs-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr.is-selected[_ngcontent-%COMP%]{background-color:var(--color-primary-50)}.subs-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr.is-non-clickable[_ngcontent-%COMP%]{cursor:default}.subs-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr.is-non-clickable[_ngcontent-%COMP%]:hover{background-color:transparent}.subs-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-active[_ngcontent-%COMP%]{background:rgb(var(--color-success-rgb)/.12);color:var(--color-success-text)}.badge.badge-expired[_ngcontent-%COMP%]{background:var(--color-surface-2);color:var(--color-text-secondary)}.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-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:8px 14px;border-radius:8px;font-size:13px;font-weight:600;border:1px solid transparent;cursor:pointer;transition:background-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[disabled][_ngcontent-%COMP%]{opacity:.5;cursor:not-allowed}'],changeDetection:0})}}return e})();export{he as AdminSubscriptionsComponent};

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.