PageSourceSearch

https://partner-tools.lovable.app/assets/certification.index-BJP0f2ty.js

js partner-tools.lovable.app collected 2026-10-03 03:34:45 UTC 71,237 bytes, 2 lines download raw bytes

1import{o as at,p as rt,r as n,s as ne,j as e,bf as de,c9 as wt,q as Ie,b7 as As,b8 as Rs,b9 as Es,ba as Fs,x as Re,B as Ee,M as Qt,L as Oe,a3 as Ot,I as vt,aZ as Ts,aT as Zt,E as Xt,an as Be,d as Is,v as Me,bV as Ms,n as Bt,w as $t,bW as Ds,bX as zs,bY as Ps,bZ as Ls,cJ as Os,b_ as Bs,bc as $s,be as Ws,bg as Us,az as Gs,aA as Hs,aB as Ks,bJ as Vs,aC as qs,b4 as Ys,bD as tt,c0 as Js,l as Qs,cE as Wt}from"./index-BycdTO8j.js";import{D as Zs}from"./data-table-qcwN_37m.js";import{d as Xs,E as ea}from"./expert-cert-derive-DeRQF2bV.js";import{a as ta}from"./expert-cert-account-BFbLi7Li.js";import{D as sa,a as aa,b as ra,d as ut}from"./dropdown-menu-WZf4XFdc.js";import{H as ia,a as na,b as la}from"./hover-card-DXVn4QQu.js";import{normalizeCertStatus as ft}from"./CertStatusBadge-NctHRJRI.js";import{d as es,c as oa,C as da,a as pt}from"./cert-status-C7BdDwW7.js";import{u as ca}from"./gmail-connection-COpUq6lq.js";import{createGmailDraft as ua}from"./gmail-draft.functions-B3wrDYXj.js";import{P as fa}from"./plug-Bf6AGZMq.js";import{F as pa}from"./file-text-DPuG6g-X.js";import{C as ma}from"./CertMemberDetailSheet-DxF-Ti7o.js";import{g as ga,s as ha}from"./partner-certification-card-Cp6ckSuo.js";import{T as ba}from"./table-view-controls-D2GedfKp.js";import{u as xa,M as Ze}from"./use-table-views-DlgpqCZo.js";import{S as va}from"./sort-hierarchy-control-CrwjKEdL.js";import{S as ya}from"./sort-header-DMLQOYug.js";import{u as wa}from"./use-sort-hierarchy-VzLwiE1k.js";import{b as _a,g as Sa,a as ja,C as Ut}from"./cert-review-sla-lprXrQp_.js";import{E as ka}from"./ellipsis-COLaCsMs.js";import"./sortable-columns-Bb_lEAxL.js";import"./sortable.esm-DubU9P6B.js";import"./grip-vertical-BnuQTFnD.js";import"./use-table-toolbar-CXDGXJxD.js";import"./stable-stringify-BR9KxSfa.js";import"./use-mobile-BzrCZLdS.js";import"./circle-CkjdgFx1.js";import"./purify.es-DdwdxIb1.js";import"./shield-alert-BvgKR_Ae.js";import"./partner-overview-card-B2UI4EHl.js";import"./hammer-DTPemZSq.js";import"./expert-cert-award-nhWUd7Bi.js";import"./shield-off-kmZuzEZf.js";import"./circle-question-mark-DaXA2ujP.js";import"./trash-2-TDGSdsDb.js";import"./auth-DH1Ecueb.js";import"./invoice-sla-D6BMS3a5.js";const Ca=at({method:"POST"}).handler(rt("e62582d058383ba79f7d1dcb7f29d61440539121f51e13ea88ca2ddc5e14ed6b")),Na={course_pending:0,account_pending:1,in_progress:2,certified:3,not_assessable:4};function Gt(s){return s?new Date(s).toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"}):"—"}function Aa({state:s}){const o=ea[s],N={met:{bg:"rgba(105, 160, 40, 0.14)",fg:"#3b6d11"},pending:{bg:"rgba(217, 160, 20, 0.14)",fg:"#8a6100"},neutral:{bg:"rgba(127,127,127,0.10)",fg:"var(--ds-text-tertiary)"}}[o.tone];return e.jsx("span",{title:o.next,style:{fontSize:11,padding:"2px 8px",borderRadius:5,background:N.bg,color:N.fg,whiteSpace:"nowrap"},children:o.short})}function Ra(){const[s,o]=n.useState([]),[m,N]=n.useState(!0),[A,b]=n.useState(null),[O,G]=n.useState([]),[I,ee]=n.useState([]),[H,fe]=n.useState([]);n.useEffect(()=>{let l=!1;return(async()=>{N(!0),b(null);try{const[y,M,F,ae,q,ye,c]=await Promise.all([ne.from("expert_cert_status").select("*"),ne.from("expert_certifications").select("email, tracks, certified_at, expires_at, revoked_at"),ne.from("expert_courses").select("id, slug, title, is_active"),ne.from("expert_course_lessons").select("id, course_id"),ne.from("expert_course_progress").select("user_id, lesson_id"),ne.from("partner_users").select("user_id, invited_email, partner_id"),ne.from("partner_user_vibe_cache").select("email, total_credits, credits_l30d, projects_created, projects_published, vibe_coding_level")]);if(y.error)throw y.error;const w=y.data??[],x=M.data??[],j=Array.from(new Set(w.map(i=>i.partner_id).filter(Boolean))),X=new Map;if(j.length>0){const{data:i}=await ne.from("partners").select("id, company_name").in("id",j);for(const h of i??[])X.set(h.id,h.company_name??"—")}const _=(F.data??[]).filter(i=>i.is_active!==!1),Y=ae.data??[],$=new Map(Y.map(i=>[i.id,i.course_id])),K=new Map;for(const i of Y)K.set(i.course_id,(K.get(i.course_id)??0)+1);const te=new Map;for(const i of q.data??[]){const h=$.get(i.lesson_id);if(!h)continue;const z=`${i.user_id}::${h}`,R=te.get(z)??new Set;R.add(i.lesson_id),te.set(z,R)}const D=new Map;for(const i of ye.data??[])i.user_id&&i.invited_email&&D.set(i.user_id,i.invited_email.toLowerCase());const pe=new Map;for(const[i,h]of te){const[z,R]=i.split("::"),T=_.find(ie=>ie.id===R);if(!T)continue;const W=K.get(R)??0;if(W===0||h.size<W)continue;const me=D.get(z);if(!me)continue;const V=pe.get(me)??[];V.push(T.title??T.slug),pe.set(me,V)}const Q=new Map;for(const i of c.data??[])Q.set((i.email??"").toLowerCase(),{total_credits:i.total_credits??0,credits_l30d:i.credits_l30d??0,projects_created:i.projects_created??0,projects_published:i.projects_published??0,vibe_coding_level:i.vibe_coding_level??null});const ke=Date.now(),re=w.map(i=>{const h=(i.email??"").toLowerCase(),z=x.find(ie=>ie.email.toLowerCase()===h&&!ie.revoked_at&&new Date(ie.expires_at).getTime()>ke)??null,R=pe.get(h)??[],T=Q.get(h),W=Xs({inMart:i.in_mart,warehouseCertified:i.is_certified,coursePassed:R.length>0,hasActiveAward:!!z,accountMaturityMet:ta(i)}),me=i.in_mart&&!(i.meets_website_security_gate&&i.meets_app_security_gate),V=[];return i.meets_paid_gate||V.push(i.in_mart?"Paid plan":"Not evaluated"),me&&V.push("Security scan"),i.in_mart&&!i.meets_website_portfolio_gate&&!i.meets_app_portfolio_gate&&V.push("Portfolio"),i.in_mart&&!i.meets_website_signal_gate&&!i.meets_app_signal_gate&&V.push("Signal of real use"),W==="course_pending"&&V.push("Course"),W==="account_pe
1nding"&&V.push("Account maturity"),{key:i.partner_user_id,email:i.email,partnerName:i.partner_id?X.get(i.partner_id)??"—":"—",state:W,blockers:W==="certified"?[]:V,securityBlocked:me,coursesPassed:R,tracks:(z?.tracks??[]).map(ie=>ie==="website"?"Website":ie==="app"?"App":ie),evaluationDate:i.evaluation_date,expiresAt:z?.expires_at??null,syncedAt:i.synced_at,inMart:i.in_mart,totalCredits:T?.total_credits??0,creditsL30d:T?.credits_l30d??0,projectsCreated:T?.projects_created??0,projectsPublished:T?.projects_published??0,vibeLevel:T?.vibe_coding_level??null}});l||o(re)}catch(y){l||b(y?.message??"Failed to load expert certification status")}finally{l||N(!1)}})(),()=>{l=!0}},[]);const se=n.useMemo(()=>{let l=s;O.length>0&&!O.includes("all")&&(l=l.filter(F=>O.includes(F.state)));const y=H.filter(F=>F!=="all");y.length===1&&(l=y[0]==="missing_with_usage"?l.filter(F=>!F.inMart&&(F.totalCredits>0||F.projectsCreated>0)):l.filter(F=>F.inMart));const M=I.filter(F=>F!=="all");if(M.length===1){const F=M[0]==="blocked";l=l.filter(ae=>ae.securityBlocked===F)}return l},[s,O,I,H]),ve=n.useMemo(()=>{const l=y=>s.filter(M=>M.state===y).length;return[{label:"Certified",value:l("certified")},{label:"Course pending",value:l("course_pending"),sub:"Product requirements met"},{label:"Account maturity pending",value:l("account_pending"),sub:"3 months and 1,000 credits"},{label:"In progress",value:l("in_progress")},{label:"Not assessable",value:l("not_assessable"),sub:"Paid plan not seen by evaluation"},{label:"Missing from evaluation",value:s.filter(y=>!y.inMart&&(y.totalCredits>0||y.projectsCreated>0)).length,sub:"Has usage, no mart row"},{label:"Security scan blocking",value:s.filter(y=>y.securityBlocked).length,sub:"Most common blocker"}]},[s]),le=n.useMemo(()=>[{key:"partner",label:"Partner",width:200,sortField:"partner",render:l=>e.jsx("span",{style:{fontSize:12.5,color:"var(--ds-text-primary)"},children:l.partnerName})},{key:"email",label:"Seat",width:240,sortField:"email",render:l=>e.jsx("span",{style:{fontSize:12,color:"var(--ds-text-body)"},children:l.email})},{key:"state",label:"Status",width:150,sortField:"state",render:l=>e.jsx(Aa,{state:l.state})},{key:"blockers",label:"Outstanding",width:240,render:l=>l.blockers.length===0?e.jsx("span",{style:{fontSize:11,color:"var(--ds-text-tertiary)"},children:"—"}):e.jsx("span",{className:"flex flex-wrap items-center gap-1",children:l.blockers.map(y=>e.jsx("span",{style:{fontSize:10.5,padding:"1px 6px",borderRadius:4,background:y==="Security scan"?"rgba(220,38,38,0.12)":"rgba(127,127,127,0.10)",color:y==="Security scan"?"#b42318":"var(--ds-text-tertiary)"},children:y},y))})},{key:"courses",label:"Courses passed",width:200,sortField:"courses",render:l=>e.jsx("span",{style:{fontSize:11.5,color:"var(--ds-text-body)"},children:l.coursesPassed.length>0?l.coursesPassed.join(", "):"None"})},{key:"tracks",label:"Tracks",width:130,render:l=>e.jsx("span",{style:{fontSize:11.5,color:"var(--ds-text-body)"},children:l.tracks.length>0?l.tracks.join(" · "):"—"})},{key:"usage",label:"Usage signal",width:210,sortField:"usage",render:l=>l.totalCredits>0||l.projectsCreated>0?e.jsxs("span",{style:{fontSize:11.5,color:"var(--ds-text-body)"},children:[Math.round(l.totalCredits).toLocaleString()," credits · ",l.projectsCreated," projects",l.inMart?"":" · not evaluated"]}):e.jsx("span",{style:{fontSize:11,color:"var(--ds-text-tertiary)"},children:"—"})},{key:"assessed",label:"Assessed",width:130,sortField:"assessed",render:l=>e.jsx("span",{style:{fontSize:11.5,color:"var(--ds-text-tertiary)"},children:l.evaluationDate?Gt(l.evaluationDate):"not yet"})},{key:"expires",label:"Certified until",width:140,sortField:"expires",render:l=>e.jsx("span",{style:{fontSize:11.5,color:"var(--ds-text-tertiary)"},children:Gt(l.expiresAt)})}],[]);return e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[A&&e.jsx("div",{style:{fontSize:12,color:"#a33",marginBottom:12},children:A}),e.jsx(Zs,{tableKey:"admin-expert-certs",title:"Expert certification",subtitle:"Warehouse verdict plus one in-portal course pass. A stamped award holds for 12 months even if a later warehouse run changes.",columns:le,rows:se,rowKey:l=>l.key,loading:m,pageSize:100,sortOptions:[{field:"state",label:"Status"},{field:"partner",label:"Partner"},{field:"email",label:"Seat"},{field:"courses",label:"Courses passed"},{field:"usage",label:"Usage signal"},{field:"assessed",label:"Assessed"},{field:"expires",label:"Certified until"}],sortAccessors:{state:l=>Na[l.state],partner:l=>l.partnerName.toLowerCase(),email:l=>l.email.toLowerCase(),courses:l=>l.coursesPassed.length,usage:l=>l.totalCredits,assessed:l=>l.evaluationDate?new Date(l.evaluationDate).getTime():0,expires:l=>l.expiresAt?new Date(l.expiresAt).getTime():0},defaultSorts:[{field:"state",dir:"asc"}],searchFields:l=>[l.email,l.partnerName],searchPlaceholder:"Search experts…",filters:{state:O,security:I,gap:H},defaultFilters:{state:[],security:[],gap:[]},applyFilters:l=>{G(Array.isArray(l.state)?l.state:[]),ee(Array.isArray(l.security)?l.security:[]),fe(Array.isArray(l.gap)?l.gap:[])},onClearFilters:()=>{G([]),ee([]),fe([])},showClearFilters:O.length>0||I.length>0||H.length>0,renderFilters:()=>e.jsxs(e.Fragment,{children:[e.jsx(de,{multiple:!0,group:"Status",label:"Status",value:O,onChange:G,options:[{value:"all",label:"Any status"},{value:"certified",label:"Certified"},{value:"course_pending",label:"Course pending"}
1,{value:"account_pending",label:"Account maturity pending"},{value:"in_progress",label:"In progress"},{value:"not_assessable",label:"Not assessable"}]}),e.jsx(de,{multiple:!0,group:"Evaluation",label:"Evaluation",value:H,onChange:fe,options:[{value:"all",label:"Any"},{value:"missing_with_usage",label:"Missing from evaluation, has usage"},{value:"in_mart",label:"In evaluation"}]}),e.jsx(de,{multiple:!0,group:"Blockers",label:"Security scan",value:I,onChange:ee,options:[{value:"all",label:"Any"},{value:"blocked",label:"Blocking"},{value:"clear",label:"Clear"}]})]}),stats:ve,emptyLabel:"No expert seats assessed yet",layout:"fill"})]})}const Ea=at({method:"POST"}).middleware([wt]).handler(rt("5cb3cc1a98674a043fac1d3b8278a3ac0dd7607c2eae0e686a9902635d2e3018")),Fa=at({method:"POST"}).middleware([wt]).handler(rt("58a7384fca11525c64abd4fe7a22ee67c4e5e646804712562602b372e584540a")),mt={finish_build:{label:"Finish build",description:"Sell cert passed, build submission still missing",aiAngle:"They have already passed the sell certification. The only thing left is submitting the build. Nudge them to submit it."},finish_sell:{label:"Finish sell",description:"Build is in, sell scenarios still outstanding",aiAngle:"Their build is already in. The only thing left is passing the sell scenarios — anyone on their team can do that half."},almost_there:{label:"Almost there",description:"Generic nudge when the missing step is unclear",aiAngle:"It is not clear which half is outstanding. Keep it generic — they started but have not finished, and are close."}},Ta="https://partner-tools.lovable.app/portal/certs",Ht=7;function Ia(s){return s.sellPassed&&!s.buildSubmitted?"finish_build":s.buildSubmitted&&!s.sellPassed?"finish_sell":"almost_there"}function Kt(s){return[`Sell certification passed: ${s.sellPassed?`yes${s.sellPassedBy?` (${s.sellPassedBy})`:""}`:"no"}`,`Build submitted: ${s.buildSubmitted?`yes${s.buildSubmittedBy?` (${s.buildSubmittedBy})`:""}`:"no"}`,`Build approved by Lovable: ${s.buildApproved?"yes":"no"}`,`Still blocked on: ${s.blockedOn==="sell"?"passing the sell scenarios":s.blockedOn==="build"?"submitting the build":s.blockedOn==="review"?"our review (everything is submitted)":"nothing"}`].join(`
2`)}function Ma({target:s,open:o,onOpenChange:m,onSent:N}){const A=ca(o),b=Ie(Ea),O=Ie(ua),G=Ie(Fa),[I,ee]=n.useState("almost_there"),[H,fe]=n.useState(""),[se,ve]=n.useState(new Set),[le,l]=n.useState(""),[y,M]=n.useState(""),[F,ae]=n.useState(!1),[q,ye]=n.useState(""),[c,w]=n.useState(null),[x,j]=n.useState(!1),[X,B]=n.useState(null),[_,Y]=n.useState(!1),[$,K]=n.useState([]),te=$[0]??null,D=n.useMemo(()=>te?(Date.now()-new Date(te.created_at).getTime())/864e5<Ht:!1,[te]),pe=async i=>{const{data:h}=await ne.from("partner_cert_nudges").select("id, recipient, template, status, created_at, sender_email, subject").eq("partner_id",i).order("created_at",{ascending:!1}).limit(5);K(h??[])};n.useEffect(()=>{if(!o||!s)return;const i=Ia(s.gate);ee(i),fe(s.primaryEmail),ve(new Set),l(""),M(""),ye(""),ae(!1),w(null),Y(!1),K([]),pe(s.partnerId),Q(i,s,s.primaryEmail)},[o,s?.partnerId]);const Q=async(i,h,z)=>{j(!0),w(null);try{const R=await b({data:{partnerId:h.partnerId,template:i,recipientEmail:z,recipientName:h.primaryName,certSummary:Kt(h.gate),certificationLink:Ta}});l(R.subject),M(R.body),ae(R.aiGenerated),ye(R.senderName??""),w(R.aiError??null)}catch(R){w(R instanceof Error?R.message:"Could not generate a draft")}finally{j(!1)}},ke=i=>{s&&(ee(i),Q(i,s,H||s.primaryEmail))},re=async i=>{if(!s)return;const h=H.trim();if(!h||!h.includes("@")){Me.error("Enter a valid recipient email");return}if(i&&D&&!_){Y(!0);return}B(i?"send":"draft");const z=Array.from(se),R=s.gate;try{const T=await O({data:{toEmails:[h],ccEmails:z,subject:le,body:y,send:i,appendSignature:!0}});await G({data:{partnerId:s.partnerId,recipient:h,ccEmails:z,template:I,subject:le,body:y,status:T.sent?"sent":"draft",aiGenerated:F,gmailDraftId:T.draftId,gmailDraftUrl:T.draftUrl,certState:R,senderEmail:T.fromEmail}}),Me.success(T.sent?`Nudge sent to ${h}`:`Draft saved in ${T.fromEmail||"your"} Gmail drafts`),await pe(s.partnerId),N?.(),m(!1)}catch(T){const W=T instanceof Error?T.message:"Gmail request failed";await G({data:{partnerId:s.partnerId,recipient:h,ccEmails:z,template:I,subject:le,body:y,status:"failed",aiGenerated:F,errorMessage:W,certState:R}}).catch(()=>{}),Me.error(W),/not connected|unauthor|invalid_grant|401|403/i.test(W)&&A.refresh()}finally{B(null),Y(!1)}};return e.jsx(As,{open:o,onOpenChange:m,children:e.jsxs(Rs,{side:"right",className:"w-full sm:max-w-[560px] p-0 flex flex-col gap-0",style:{background:"var(--ds-surface)"},children:[e.jsxs(Es,{className:"px-5 py-4",style:{borderBottom:"0.5px solid var(--ds-border-faint)"},children:[e.jsx(Fs,{style:{fontSize:14,fontWeight:500,color:"var(--ds-text-primary)"},children:"Send certification nudge"}),e.jsxs("p",{style:{fontSize:12,color:"#777777"},children:[s?.partnerName??""," · sent from your own Gmail"]})]}),s?e.jsxs("div",{className:"flex-1 min-h-0 overflow-auto px-5 py-4 flex flex-col gap-4",children:[A.checking?e.jsxs(gt,{muted:!0,children:[e.jsx(Re,{className:"h-3.5 w-3.5 animate-spin"})," Checking your Gmail connection…"]}):A.connected?e.jsxs(gt,{muted:!0,children:[e.jsx(Qt,{className:"h-3.5 w-3.5"})," Sending as ",A.email]}):e.jsxs("div",{className:"flex items-center justify-between gap-3 px-3 py-2.5",style:{border:"0.5px solid var(--ds-border-faint)",borderRadius:8,background:"var(--ds-surface-muted)"},children:[e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:12,fontWeight:500,color:"var(--ds-text-primary)"},children:"Gmail is not connected"}),e.jsx("div",{style:{fontSize:11,color:"#777777"},children:"Connect your account to draft or send this nudge as yourself."})]}),e.jsxs(Ee,{size:"sm",variant:"outline",className:"h-7 text-xs gap-1.5",disabled:A.busy,onClick:A.connect,children:[A.busy?e.jsx(Re,{className:"h-3 w-3 animate-spin"}):e.jsx(fa,{className:"h-3 w-3"}),"Connect Gmail"]})]}),e.jsxs("div",{style:{border:"0.5px solid var(--ds-border-faint)",borderRadius:8,padding:"10px 12px"},children:[e.jsx("div",{style:{fontSize:11,color:"#999999",marginBottom:6},children:"Where they stand"}),e.jsx("pre",{className:"whitespace-pre-wrap",style:{fontSize:11.5,color:"var(--ds-text-secondary)",fontFamily:"inherit",margin:0},children:Kt(s.gate)})]}),e.jsxs("div",{children:[e.jsx(Oe,{style:{fontSize:11,color:"#777777"},children:"Template"}),e.jsxs("div",{className:"flex flex-wrap gap-1.5 mt-1.5",children:[Object.keys(mt).map(i=>{const h=I===i;return e.jsx("button",{type:"button",onClick:()=>ke(i),disabled:x,title:mt[i].description,style:{fontSize:11,padding:"3px 9px",borderRadius:6,border:"0.5px solid",borderColor:h?"var(--ds-text-primary)":"var(--ds-border-faint)",background:h?"var(--ds-text-primary)":"var(--ds-surface)",color:h?"var(--ds-surface)":"var(--ds-text-secondary)"},children:mt[i].label},i)}),e.jsxs("button",{type:"button",onClick:()=>s&&Q(I,s,H),disabled:x,className:"inline-flex items-center gap-1",style:{fontSize:11,padding:"3px 9px",borderRadius:6,border:"0.5px solid var(--ds-border-faint)",background:"var(--ds-surface)",color:"var(--ds-text-secondary)"},children:[x?e.jsx(Re,{className:"h-3 w-3 animate-spin"}):e.jsx(Ot,{className:"h-3 w-3"}),"Regenerate"]})]})]}),e.jsxs("div",{className:"grid gap-1.5",children:[e.jsx(Oe,{style:{fontSize:11,color:"#777777"},children:"To"}),e.jsx(vt,{value:H,onChange:i=>fe(i.target.value),className:"h-8 text-xs"})]}),s.otherEmails.length>0&&e.jsxs("div",{children:[e.jsx(Oe,{style:{fontSize:11,color:"#777777"},children:"Cc other teammates who aren't certified"}),e.jsx("div",{className:"flex flex-col gap-1.5 mt-1.5",children:s.otherEmails.map(i=>e.jsxs("label",{className:"flex items-center gap-2",style:{fontSize:12},children:[e.jsx(Ts,{checked:se.has(i.email),onCheckedChange:h=>{const z=new Set(se);h?z.add(i.email):z.delete(i.email),ve(z)}}),e.jsxs("span",{style:{color:"var(--ds-text-secondary)"},children:[i.name?`${i.name} · `:"",i.email]})]},i.email))})]}),e.jsx("div",{style:{borderRadius:10,padding:1,background:x?"linear-gradient(120deg, #FE6B07, #FE4C2C, #FE3B7A, #C060D8, #7670FD)":"linear-gradient(120deg, rgba(254,107,7,0.35), rgba(254,59,122,0.35), rgba(118,112,253,0.35))"},children:e.jsxs("div",{className:"flex flex-col gap-3",style:{background:"var(--ds-surface)",borderRadius:9,padding:"12px 12px 13px"},children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"inline-flex items-center gap-1.5",children:[e.jsx(Ot,{className:"h-3.5 w-3.5",
2style:{color:"#FE3B7A"}}),e.jsx("span",{className:"brand-gradient-text",style:{fontSize:12,fontWeight:500},children:"Email draft"})]}),e.jsx("span",{style:{fontSize:10.5,color:"#999999"},children:x?"Personalising…":F?"AI personalised":"Template copy"})]}),e.jsxs("div",{className:"grid gap-1.5",children:[e.jsx(Oe,{style:{fontSize:11,color:"#777777"},children:"Subject"}),e.jsx(vt,{value:le,onChange:i=>l(i.target.value),className:"h-8 text-xs",placeholder:x?"Generating…":""})]}),e.jsxs("div",{className:"grid gap-1.5",children:[e.jsx(Oe,{style:{fontSize:11,color:"#777777"},children:"Body"}),e.jsx(Zt,{value:y,onChange:i=>M(i.target.value),rows:14,className:"text-xs",placeholder:x?"Generating…":""})]}),e.jsxs("div",{className:"flex items-start gap-2.5",style:{borderTop:"0.5px solid var(--ds-border-faint)",paddingTop:10},children:[e.jsx("img",{src:"/lovable-logo-icon.png",alt:"Lovable",width:26,height:26,style:{display:"block",borderRadius:4}}),e.jsxs("div",{style:{fontSize:11,lineHeight:1.45},children:[e.jsx("div",{style:{fontSize:12,fontWeight:500,color:"var(--ds-text-primary)"},children:q||"Your name"}),e.jsx("div",{style:{color:"#777777"},children:"Partnerships · Lovable"}),e.jsx("div",{style:{color:"#777777"},children:A.email??""})]}),e.jsx("span",{className:"ml-auto",style:{fontSize:10,color:"var(--ds-text-faint)"},children:"Signature added automatically"})]}),e.jsx("div",{style:{fontSize:10.5,color:"#999999"},children:x?"Personalising from their certification state…":"Review before sending — this goes out from your own Gmail."}),c&&e.jsxs(gt,{muted:!0,children:[e.jsx(Xt,{className:"h-3.5 w-3.5"})," ",c]})]})}),$.length>0&&e.jsxs("div",{style:{border:"0.5px solid var(--ds-border-faint)",borderRadius:8,padding:"10px 12px"},children:[e.jsx("div",{style:{fontSize:11,color:"#999999",marginBottom:6},children:"Recent nudges"}),e.jsx("div",{className:"flex flex-col gap-1.5",children:$.map(i=>e.jsxs("div",{style:{fontSize:11,color:"#555555"},children:[Be(new Date(i.created_at),{addSuffix:!0})," ·"," ",i.status==="sent"?"sent":i.status==="draft"?"drafted":"failed"," to"," ",i.recipient,i.sender_email?` by ${i.sender_email}`:""]},i.id))})]})]}):null,e.jsxs("div",{className:"px-5 py-3 flex items-center justify-between gap-2",style:{borderTop:"0.5px solid var(--ds-border-faint)"},children:[e.jsx("div",{style:{fontSize:11,color:D?"#7a5a06":"#999999"},children:D&&te?`Last nudged ${Be(new Date(te.created_at),{addSuffix:!0})}`:`Cooldown ${Ht} days`}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(Ee,{size:"sm",variant:"outline",className:"h-8 text-xs gap-1.5",disabled:!A.connected||x||!!X||!le||!y,onClick:()=>re(!1),children:[X==="draft"?e.jsx(Re,{className:"h-3 w-3 animate-spin"}):e.jsx(pa,{className:"h-3 w-3"}),"Save draft"]}),e.jsxs(Ee,{size:"sm",className:"h-8 text-xs gap-1.5",style:{background:"var(--ds-text-primary)",color:"var(--ds-surface)"},disabled:!A.connected||x||!!X||!le||!y,onClick:()=>re(!0),children:[X==="send"?e.jsx(Re,{className:"h-3 w-3 animate-spin"}):e.jsx(Is,{className:"h-3 w-3"}),_?"Confirm send":"Send email"]})]})]})]})})}function gt({children:s,muted:o}){return e.jsx("div",{className:"inline-flex items-center gap-1.5",style:{fontSize:11.5,color:o?"#777777":"var(--ds-text-primary)"},children:s})}const Da=at({method:"POST"}).middleware([wt]).handler(rt("bc8a1f2e06245d841b3af14e58a5a3485ff1aa34d7cfe132e722de07127cd9f7")),za={finish_build:"Finish build",finish_sell:"Finish sell",almost_there:"Almost there"},Vt=[{value:"never",label:"Never nudged"},{value:"last7",label:"Nudged in last 7 days"},{value:"last30",label:"Nudged in last 30 days"},{value:"over14",label:"Nudged over 14 days ago"},{value:"failed",label:"Last nudge failed"},{value:"draft",label:"Last nudge left as draft"}];function qt(s,o){const m=[];for(let N=0;N<s.length;N+=o)m.push(s.slice(N,N+o));return m}function Pa(s){const o=new Set;if(!s)return o.add("never"),o;const m=(Date.now()-new Date(s.lastAt).getTime())/864e5;return m<=7&&o.add("last7"),m<=30&&o.add("last30"),m>14&&o.add("over14"),s.lastStatus==="failed"&&o.add("failed"),s.lastStatus==="draft"&&o.add("draft"),o}function Or(){const s=Ms({from:"/_authenticated/admin/certification/"}),[o,m]=n.useState(!0),[N,A]=n.useState(null),[b,O]=n.useState([]),[G,I]=n.useState([]),[ee,H]=n.useState(new Map),[fe,se]=n.useState(new Set),[ve,le]=n.useState([]),[l,y]=n.useState(new Map),[M,F]=n.useState(null),[ae,q]=n.useState(null),[ye,c]=n.useState(null),[w,x]=n.useState(null),[j,X]=n.useState("solution"),[B,_]=n.useState(s.q??""),Y=s.bucket==="certified"||s.bucket==="in_progress"||s.bucket==="awaiting_review"||s.bucket==="failed"||s.bucket==="expiring"?s.bucket:s.tab==="queue"?"awaiting_review":"all",$
2=!!s.q||Y!=="all",[K,te]=n.useState(Y),[D,pe]=n.useState([]),[Q,ke]=n.useState([]),[re,i]=n.useState([]),[h,z]=n.useState([]),[R,T]=n.useState([]),[W,me]=n.useState([]),[V,ie]=n.useState([]),[we,Ue]=n.useState([]),[_e,Ge]=n.useState([]),[Se,He]=n.useState([]),[it,er]=n.useState({key:"submitted",dir:"desc"}),Ce=wa({options:Jt,accessors:Wa,defaultSorts:et}),U=xa($a),[De,nt]=n.useState(Ze),[he,Ke]=n.useState(()=>[...Xe]),[be,Ve]=n.useState([]),[St,ts]=n.useState(!1),Z=n.useMemo(()=>{const t=[...Xe],a=[...ht],r=U.masterOverride;if(!r)return{order:t,hidden:[],filters:{}};const d=r.column_order.filter(E=>t.includes(E)),u=t.filter(E=>!d.includes(E));return{order:[...d,...u],hidden:r.hidden_columns.filter(E=>!a.includes(E)),filters:r.filters??{}}},[U.masterOverride]),jt=n.useCallback(async()=>{const{data:t,error:a}=await ne.from("partner_cert_nudges").select("id, partner_id, recipient, template, status, sender_email, created_by, created_at, error_message").order("created_at",{ascending:!1}).limit(5e3);if(a)return console.error("[certification] nudge log read failed",a),[];const r=t??[];return le(r),r},[]),[ss,as]=n.useState(0),[rs,qe]=n.useState(!1),[Ye,kt]=n.useState(""),[lt,Ct]=n.useState(""),[Nt,At]=n.useState(!1),Rt=Ie(Da),is=n.useCallback(async()=>{At(!0);try{const t=await Rt({data:{email:Ye,note:lt||null}});Me.success(`Certified ${t.email}${t.partnerName?` (${t.partnerName})`:""}${t.created?" — new record created":""}`),qe(!1),kt(""),Ct(""),as(a=>a+1)}catch(t){Me.error(t?.message??"Could not certify")}finally{At(!1)}},[Ye,lt,Rt]);n.useEffect(()=>{let t=!1;return(async()=>{m(!0);try{const a=await ne.from("partner_user_certifications").select("id, email, status, progress_pct, certified_at, expires_at, updated_at, build, build_history, sell, review_verdict, review_next_steps, reviewed_by, reviewed_at, feedback_sent_to_partner").order("updated_at",{ascending:!1}).limit(5e3);if(t)return;if(a.error)throw a.error;const r=a.data??[];O(r);const{data:d}=await ne.from("partner_credit_grants").select("partner_id").in("credit_type",["partner_cert_started_credit","partner_join_credit"]).eq("status","sent");if(t)return;se(new Set((d??[]).map(g=>g.partner_id).filter(g=>!!g)));const u=await jt();if(t)return;const E=Array.from(new Set(r.map(g=>g.email.toLowerCase()).filter(Boolean)));let v=[];for(const g of qt(E,100)){const{data:Ae,error:P}=await ne.from("partner_users").select("id, user_id, invited_email, partner_id, role, status, partners(id, company_name, owner_user_id)").in("invited_email",g);if(t)return;if(P)throw P;v=v.concat(Ae??[])}I(v);const f=v.map(g=>g.user_id).filter(g=>!!g),S=Array.from(new Set(r.map(g=>g.reviewed_by).filter(g=>!!g))),p=v.map(g=>g.partners?.owner_user_id).filter(g=>!!g),k=Array.from(new Set(u.map(g=>g.created_by).filter(g=>!!g))),J=Array.from(new Set([...f,...S,...p,...k]));if(J.length>0){let g=[];for(const P of qt(J,100)){const{data:ce,error:C}=await ne.from("profiles").select("user_id, full_name, avatar_url, email").in("user_id",P);if(t)return;if(C)throw C;g=g.concat(ce??[])}const Ae=new Map((g??[]).map(P=>[P.user_id,P]));I(P=>P.map(ce=>({...ce,profiles:ce.user_id?Ae.get(ce.user_id)??null:null,_ownerProfile:ce.partners?.owner_user_id?Ae.get(ce.partners.owner_user_id)??null:null}))),H(new Map((g??[]).filter(P=>S.includes(P.user_id)).map(P=>[P.user_id,P.full_name??null]))),y(new Map((g??[]).map(P=>[P.user_id,P.full_name??P.email??null])))}}catch(a){t||A(a?.message??"Failed to load")}finally{t||m(!1)}})(),()=>{t=!0}},[ss]);const Et=n.useMemo(()=>{const t=new Map;for(const a of ve){if(!a.partner_id)continue;const r=t.get(a.partner_id);if(!r){t.set(a.partner_id,{lastAt:a.created_at,lastStatus:a.status,sentCount:a.status==="sent"?1:0,count:1,recent:[a]});continue}r.count+=1,a.status==="sent"&&(r.sentCount+=1),r.recent.length<5&&r.recent.push(a)}return t},[ve]),L=n.useMemo(()=>{const t=new Map;for(const d of G){const u=d.invited_email.toLowerCase(),E=t.get(u);(!E||E.status!=="active"&&d.status==="active")&&t.set(u,d)}const a=b.map(d=>{const u=t.get(d.email.toLowerCase());return{...d,partnerId:u?.partner_id??null,partnerName:u?.partners?.company_name??null,fullName:u?.profiles?.full_name??null,partnerUserId:u?.id??null,userId:u?.user_id??null,avatarUrl:u?.profiles?.avatar_url??null,reviewerName:d.reviewed_by?ee.get(d.reviewed_by)??null:null,pdmOwnerUserId:u?.partners?.owner_user_id??null,pdmOwnerName:u?._ownerProfile?.full_name??null,pdmOwnerEmail:u?._ownerProfile?.email??null,certCreditGranted:u?.partner_id?fe.has(u.partner_id):!1,nudge:u?.partner_id?Et.get(u.partner_id)??null:null}}),r=new Map;for(const d of a){const u=Ga(d),E=r.get(u);E?E.push(d):r.set(u,[d])}for(const d of r.values()){const u=Ha(d);for(const E of d)E.orgStatus=u.status,E.orgGate=u}return a},[b,G,ee,fe,Et]),Ft=n.useMemo(()=>{const t=Date.now();return new Set(L.filter(a=>a.status==="certified"&&(!a.expires_at||new Date(a.expires_at).getTime()>t)).map(a=>a.partnerId).filter(a=>!!a))},[L]),Je=n.useMemo(()=>{const t=B.trim().toLowerCase(),a=d=>`${d.fullName??""} ${d.email} ${d.partnerName??""}`.toLowerCase();if(!t)return()=>!0;const r=new Set(L.filter(d=>a(d).includes(t)&&d.partnerId).map(d=>d.partnerId));return d=>!!d.partnerId&&r.has(d.partnerId)||a(d).includes(t)},[L,B]),ns=n.useMemo(()=>{const t=Date.now(),a=L.filter(C=>{if(D.length>0){const Te=C.pdmOwnerUserId;if(D.includes("unassigned")){if(Te&&!D.includes(Te))return!1}else if(!Te||!D.includes(Te))return!1}return!!Je(C)}),r=a.filter(C=>C.status==="certified"&&(!C.expires_at||new Date(C.expires_at).getTime()>t)),d=new Set(r.map(C=>C.partnerId).filter(C=>!!C)),u=C=>C.partnerId??`__solo__:${C.id}`,E=new Set(a.filter(C=>ue(C)==="awaiting_review"&&!d.has(C.partnerId??"")).map(u)),f=new Set(a.filter(C=>ue(C)==="in_progress"&&!d.has(C.partnerId??"")).map(u)).size,S=E.size,k=new Set(a.filter(C=>ue(C)==="failed"&&!d.has(C.partnerId??"")).map(u)).size,J=r.filter(C=>{if(!C.expires_at)return!1;const Te=(new Date(C.expires_at).getTime()-t)/864e5;return Te>=0&&Te<=30}).length,g=r.length,Ae=a.filter(C=>C.status==="certified"&&C.expires_at&&new Date(C.expires_at).getTime()<=t).length,P=g+f+Ae,ce=P>0?Math.round(g/P*100):0;return{certifiedUsers:g,certifiedPartners:d.size,inProgress:f,awaitingReview:S,failed:k,expiringSoon:J,passRate:ce}},[L,D,Je]),Qe=n.useMemo(()=>{const t=new Map;let a=!1;for(const d of L){if(!d.pdmOwnerUserId){a=!0;continue}const u=d.pdmOwnerName?.trim()||d.pdmOwnerEmail?.trim()||d.pdmOwnerUserId;t.has(d.pdmOwnerUserId)||t.set(d.pdmOwnerUserId,u)}return{list:Array.from(t.entries()).map(([d,u])=>({value:d,label:u})).sort((d,u)=>d.label.localeCompare(u.label)),hasUnassigned:a}},[L]),ls=n.useMemo(()=>{const t=new Map;for(const a of Qe.list)t.set(a.value,a.label);return t},[Qe]),os=n.useMemo(()=>{const t=Date.now(),a=L.filter(f=>{const S=!!f.partnerId&&Ft.has(f.partnerId);if(K==="awaiting_review"){if(ue(f)!=="awaiting_review"||S)return!1}else if(K==="certified"){if(f.status!=="certified"||f.expires_at&&new Date(f.expires_at).getTime()<=t)return!1}else if(K==="in_progress"){if(ue(f)!=="in_progress"||S)return!1}else if(K==="failed"){if(ue(f)!=="failed"||S)return!1}else if(K==="expiring"){if(f.status!=="certified"||!f.expires_at)return!1;const p=(new Date(f.expires_at).getTime()-t)/864e5;if(p<0||p>30)return!1}if(!Je(f))return!1;if(D.length>0){const p=f.pdmOwnerUserId;if(D.includes("unassigned")){if(p&&!D.includes(p))return!1}else if(!p||!D.includes(p))return!1}if(Q.length>0){const p=ue(f),k=ft(f.status),J=!["in_progress","certified","expired","not_started","awaiting_review","failed"].includes(k);if(!Q.includes(p)&&!(J&&Q.includes(k)))return!1}if(re.length>0){const p=f.build?.status??"not_started";if(!re.includes(p))return!1}if(h.length>0){const p=f.sell?.status??"not_started";if(!h.includes(p))return!1}if(R.length>0){const p=f.build?.autograde,k=p?p.verdict:"ungraded";if(!R.includes(k))return!1}if(W.length>0&&!W.includes(xt(f)))return!1;if(V.length>0){const p=f.review_verdict,k=p==="pass"?"pass":p==="fail"?"fail":"unreviewed";if(!V.includes(k))return!1}if(we.length>0){const p=f.feedback_sent_to_partner?"yes":"no";if(!we.includes(p))return!1}if(_e.length>0){const p=st(f),k=p===0?"none":p===1?"new":p===2?"resub2":p===3?"resub3":"resub4plus";if(!_e.includes(k))return!1}if(Se.length>0){const p=Pa(f.nudge??null);if(!Se.some(k=>p.has(k)))return!1}return!0}),r=it.dir==="asc"?1:-1,d=(f,S)=>f<S?-1:f>S?1:0,u={passed:0,submitted:1,in_progress:2,failed:3,not_started:4},E={Strong:0,Borderline:1,Weak:2,Invalid:3},v={pass:0,fail:1,pending:2};return a.sort((f,S)=>{const p=f.build??{},k=S.build??{};switch(it.key){case"user":return r*d((f.fullName??f.email).toLowerCase(),(S.fullName??S.email).toLowerCase());case"partner":return r*d((f.partnerName??"").toLowerCase(),(S.partnerName??"").toLowerCase());case"pdm":return r*d((f.pdmOwnerName??f.pdmOwnerEmail??"").toLowerCase(),(S.pdmOwnerName??S.pdmOwnerEmail??"").toLowerCase());case"status":return r*d(ft(f.status),ft(S.status));case"build":return r*d(u[p.status??"not_started"]??99,u[k.status??"not_started"]??99);case"sell":return r*d(u[f.sell?.status??"not_started"]??99,u[S.sell?.status??"not_started"]??99);case"progress":return r*d(f.progress_pct??0,S.progress_pct??0);case"submitted":return r*d(Yt(f)??f.updated_at??"",Yt(S)??S.updated_at??"");case"attempts":return r*d(p.attempt_count??0,k.attempt_count??0);case"autograde":{const J=p.autograde?.composite,g=k.autograde?.composite;return J==null&&g==null?r*d(E[p.autograde?.verdict]??99,E[k.autograde?.verdict]??99):J==null?1:g==null?-1:r*d(J,g)}case"suggested":return r*d(v[xt(f)]??99,v[xt(S)]??99);case"review":{const J=ce=>ce==="pass"?0:ce==="fail"?1:2,g=J(f.review_verdict)-J(S.review_verdict);if(g!==0)return r*g;const Ae=f.reviewed_at?new Date(f.reviewed_at).getTime():0,P=S.reviewed_at?new Date(S.reviewed_at).getTime():0;return r*d(Ae,P)}case"feedback":return r*d(f.feedback_sent_to_partner?1:0,S.feedback_sent_to_partner?1:0);case"certified":{const J=f.certified_at?new Date(f.certified_at).getTime():0,g=S.certified_at?new Date(S.certified_at).getTime():0;return r*d(J,g)}}return 0}),a},[L,Ft,K,Je,D,Q,re,h,R,W,V,we,_e,Se,it]),Tt=t=>{const a={id:t.partnerUserId??t.id,user_id:t.userId,invited_email:t.email,full_name:t.fullName,avatar_url:t.avatarUrl,role:"member",status:"active",cert_status:t.status,cert_progress_pct:t.progress_pct,cert_certified_at:t.certified_at,cert_expires_at:t.expires_at,cert_last_reminded_at:null};F(a),q(t.partnerId),c(t.pdmOwnerEmail),x({certificationId:t.id,verdict:t.review_verdict,nextSteps:t.review_next_steps,reviewerName:t.reviewerName,reviewedAt:t.reviewed_at,feedbackSent:t.feedback_sent_to_partner??!1})},ds=Ie(ga),cs=Ie(ha),[ze,It]=n.useState(new Set),[Mt,Dt]=n.useState(null),ot=n.useRef(new Set),us=t=>{O(a=>a.map(r=>r.id===t.id?{...r,review_verdict:t.review_verdict,review_next_steps:t.review_next_steps,reviewed_by:t.reviewed_by,reviewed_at:t.reviewed_at,feedback_sent_to_partner:t.feedback_sent_to_partner}:r)),t.reviewed_by&&H(a=>{const r=new Map(a);return r.set(t.reviewed_by,t.reviewer_name),r}),x(a=>a&&a.certificationId===t.id?{certificationId:t.id,verdict:t.review_verdict,nextSteps:t.review_next_steps,reviewerName:t.reviewer_name,reviewedAt:t.reviewed_at,feedbackSent:t.feedback_sent_to_partner}:a)},zt=async(t,a,r,d)=>{const u=await cs({data:{certificationId:t,verdict:a,nextSteps:r,feedbackSent:d}});return us(u),u},dt=async t=>{It(a=>
2{const r=new Set(a);return r.add(t),r});try{const a=await ds({data:{certificationId:t}});O(r=>r.map(d=>d.id===t?{...d,build:{...d.build??{},autograde:a}}:d))}catch(a){console.error("autograde failed",a)}finally{It(a=>{const r=new Set(a);return r.delete(t),r})}},Pe=n.useMemo(()=>L.filter(t=>t.build?.latest_status==="submitted"),[L]);n.useEffect(()=>{if(o)return;const t=Pe.filter(r=>!r.build?.autograde&&r.build?.submission_url&&!ot.current.has(r.id)&&!ze.has(r.id));if(t.length===0)return;t.slice(0,3).forEach(r=>{ot.current.add(r.id),dt(r.id)})},[Pe,o]);const fs=async()=>{ot.current=new Set;const t=Pe.map(a=>a.id);for(let a=0;a<t.length;a+=3){const r=t.slice(a,a+3);await Promise.all(r.map(d=>dt(d)))}},ps=Ie(Ca),[ct,Pt]=n.useState(!1),ms=async()=>{Pt(!0);try{const t=await ps({data:{}});Me.success(`Expert certs synced — ${t.matched}/${t.seats} seats matched, ${t.stamped??0} newly stamped`)}catch(t){Me.error(t instanceof Error?t.message:"Expert cert sync failed")}finally{Pt(!1)}},gs=D.length+Q.length+re.length+h.length+R.length+W.length+V.length+we.length+_e.length+Se.length+(K!=="all"?1:0),hs=()=>{pe([]),ke([]),i([]),z([]),T([]),me([]),ie([]),Ue([]),Ge([]),He([]),te("all")},Fe=n.useCallback(()=>({search:B,bucket:K,pdmFilter:D,statusFilter:Q,buildFilter:re,sellFilter:h,autogradeFilter:R,suggestedFilter:W,reviewFilter:V,feedbackFilter:we,attemptsFilter:_e,nudgeFilter:Se,sorts:Ce.sorts}),[B,K,D,Q,re,h,R,W,V,we,_e,Se,Ce.sorts]),Le=n.useCallback((t,a)=>{const r=[...Xe],d=[...ht],u=t.column_order.filter(f=>r.includes(f)),E=r.filter(f=>!u.includes(f));Ke([...u,...E]),Ve(t.hidden_columns.filter(f=>!d.includes(f)));const v=t.filters??{};typeof a?.search=="string"?_(a.search):typeof v.search=="string"&&_(v.search),a?.bucket?te(a.bucket):typeof v.bucket=="string"&&te(v.bucket),Array.isArray(v.pdmFilter)&&pe(v.pdmFilter),Array.isArray(v.statusFilter)&&ke(v.statusFilter),Array.isArray(v.buildFilter)&&i(v.buildFilter),Array.isArray(v.sellFilter)&&z(v.sellFilter),Array.isArray(v.autogradeFilter)&&T(v.autogradeFilter),Array.isArray(v.suggestedFilter)&&me(v.suggestedFilter),Array.isArray(v.reviewFilter)&&ie(v.reviewFilter),Array.isArray(v.feedbackFilter)&&Ue(v.feedbackFilter),Array.isArray(v.attemptsFilter)&&Ge(v.attemptsFilter),Array.isArray(v.nudgeFilter)&&He(v.nudgeFilter),Ce.setSorts(Array.isArray(v.sorts)&&v.sorts.length?v.sorts:et)},[Ce.setSorts]);n.useEffect(()=>{if(St||!U.userId||!U.isFetched)return;const t=U.defaultView;t?(Le(t,$?{search:s.q??"",bucket:Y}:void 0),nt(t.id)):(Ke(Z.order),Ve(Z.hidden),Le({column_order:Z.order,hidden_columns:Z.hidden,filters:Z.filters},$?{search:s.q??"",bucket:Y}:void 0)),ts(!0)},[U.userId,U.isFetched,U.defaultView,St]);const Ne=U.views.find(t=>t.id===De)??null,bs=n.useMemo(()=>{const t=[...Xe],a=f=>{const S=f.filter(k=>t.includes(k)),p=t.filter(k=>!S.includes(k));return[...S,...p].join("|")},r=f=>{const p={...{search:"",bucket:"all",pdmFilter:[],statusFilter:[],buildFilter:[],sellFilter:[],autogradeFilter:[],suggestedFilter:[],reviewFilter:[],feedbackFilter:[],attemptsFilter:[],nudgeFilter:[],sorts:et},...f??{}};(!Array.isArray(p.sorts)||p.sorts.length===0)&&(p.sorts=et),p.sorts=p.sorts.map(k=>`${k.field}:${k.dir}`).join(",");for(const k of Object.keys(p))Array.isArray(p[k])&&(p[k]=[...p[k]].sort());return JSON.stringify(Object.keys(p).sort().reduce((k,J)=>(k[J]=p[J],k),{}))},d=Fe();if(De===Ze){const f=a(he)===a(Z.order),S=[...be].sort().join("|")===[...Z.hidden].sort().join("|"),p=r(Z.filters)===r(d);return!f||!S||!p}if(!Ne)return!1;const u=a(Ne.column_order)===a(he),E=[...Ne.hidden_columns].sort().join("|")===[...be].sort().join("|"),v=r(Ne.filters)===r(d);return!(u&&E&&v)},[Ne,De,he,be,Fe,Z]),xs=n.useCallback(t=>{if(nt(t),t===Ze){Ke(Z.order),Ve(Z.hidden),Le({column_order:Z.order,hidden_columns:Z.hidden,filters:Z.filters});return}const a=U.views.find(r=>r.id===t);a&&Le(a)},[U.views,Le,Z]),vs=n.useCallback(async t=>{const a=await U.saveAs(t,{column_order:he,hidden_columns:be,filters:Fe()});nt(a.id)},[U,he,be,Fe]),ys=n.useCallback(async()=>{if(De===Ze){await U.saveMasterOverride({column_order:he,hidden_columns:be,filters:Fe()});return}Ne&&await U.update(Ne.id,{column_order:he,hidden_columns:be,filters:Fe()})},[U,Ne,De,he,be,Fe]),xe=(t,a)=>t.filter(r=>r!==a),ws={certified:"Certified",in_progress:"In progress",not_started:"Not started",expired:"Expired"},Lt={passed:"Passed",submitted:"Submitted",in_progress:"In progress",failed:"Failed",not_started:"Not started"},_s={Strong:"Strong",Borderline:"Borderline",Weak:"Weak",Invalid:"Invalid",ungraded:"Ungraded"},Ss={pass:"Pass",fail:"Fail",pending:"Pending"},js={pass:"Pass",fail:"Fail",unreviewed:"Unreviewed"},ks={yes:"Yes",no:"No"},Cs={new:"First attempt",resub2:"Resubmission (attempt 2)",resub3:"Resubmission (attempt 3)",resub4plus:"Resubmission (attempt 4+)",none:"Not submitted"},Ns={certified:{label:"Cert status",value:"Certified"},in_progress:{label:"Cert status",value:"In progress"},awaiting_review:{label:"Quick filter",value:"Awaiting review"},failed:{label:"Quick filter",value:"Failed"},expiring:{label:"Quick filter",value:"Expiring < 30 days"}},oe=[];if(K!=="all"){const t=Ns[K];oe.push({key:`bucket-${K}`,label:t.label,value:t.value,onRemove:()=>te("all")})}return D.forEach(t=>oe.push({key:`pdm-${t}`,label:"PDM owner",value:t==="unassigned"?"Unassigned":ls.get(t)??t,onRemove:()=>pe(xe(D,t))})),Q.forEach(t=>oe.push({key:`status-${t}`,label:"Cert status",value:ws[t]??t,onRemove:()=>ke(xe(Q,t))})),re.forEach(t=>oe.push({key:`build-${t}`,label:"Build",value:Lt[t]??t,onRemove:()=>i(xe(re,t))})),h.forEach(t=>oe.push({key:`sell-${t}`,label:"Sell",value:Lt[t]??t,onRemove:()=>z(xe(h,t))})),R.forEach(t=>oe.push({key:`autograde-${t}`,label:"Autograde",value:_s[t]??t,onRemove:()=>T(xe(R,t))})),W.forEach(t=>oe.push({key:`suggested-${t}`,label:"Suggested",value:Ss[t]??t,onRemove:()=>me(xe(W,t))}
2)),V.forEach(t=>oe.push({key:`review-${t}`,label:"Review",value:js[t]??t,onRemove:()=>ie(xe(V,t))})),we.forEach(t=>oe.push({key:`feedback-${t}`,label:"Feedback sent",value:ks[t]??t,onRemove:()=>Ue(xe(we,t))})),_e.forEach(t=>oe.push({key:`attempts-${t}`,label:"Submission",value:Cs[t]??t,onRemove:()=>Ge(xe(_e,t))})),Se.forEach(t=>oe.push({key:`nudge-${t}`,label:"Nudged",value:Vt.find(a=>a.value===t)?.label??t,onRemove:()=>He(xe(Se,t))})),e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col px-4 py-4 sm:px-8 sm:py-8","data-theme-surface":!0,children:[e.jsxs("div",{className:"flex-shrink-0 space-y-6",children:[e.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold tracking-tight",style:{color:"var(--ds-text-primary)"},children:[e.jsx("span",{className:"brand-gradient-text",children:"Certification"})," command centre"]}),e.jsx("p",{className:"mt-1",style:{fontSize:12,color:"var(--ds-text-faint)"},children:"Track partner certification progress, review submissions, and approve from the cert tool."})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsxs(sa,{children:[e.jsx(aa,{asChild:!0,children:e.jsxs(Ee,{variant:"outline",size:"sm",className:"h-8 text-xs font-normal",children:[e.jsx(ka,{className:"h-3.5 w-3.5 mr-1.5"}),"Actions"]})}),e.jsxs(ra,{align:"end",className:"w-64",children:[e.jsxs(ut,{onClick:fs,disabled:ze.size>0||Pe.length===0,children:[e.jsx(Bt,{className:"h-3.5 w-3.5 mr-2 "+(ze.size>0?"animate-spin":"")}),ze.size>0?`Re-grading… ${ze.size} in flight`:`Re-grade all submitted (${Pe.length})`]}),e.jsxs(ut,{onClick:()=>qe(!0),children:[e.jsx($t,{className:"h-3.5 w-3.5 mr-2"}),"Certify manually (override)"]}),e.jsxs(ut,{onClick:ms,disabled:ct,children:[e.jsx(Bt,{className:"h-3.5 w-3.5 mr-2 "+(ct?"animate-spin":"")}),ct?"Syncing experts…":"Refresh expert certs from warehouse"]})]})]})})]}),e.jsx(Ds,{open:rs,onOpenChange:qe,children:e.jsxs(zs,{className:"sm:max-w-md",children:[e.jsxs(Ps,{children:[e.jsx(Ls,{style:{fontSize:14},children:"Certify manually"}),e.jsx(Os,{style:{fontSize:12},children:"Marks a partner team member certified even if they never started the cert tool. Creates the record if it doesn't exist and stamps a 1-year expiry."})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{style:{fontSize:11,color:"var(--ds-text-faint)"},children:"Team member email"}),e.jsx(vt,{value:Ye,onChange:t=>kt(t.target.value),placeholder:"[email protected]",className:"h-8 text-xs"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{style:{fontSize:11,color:"var(--ds-text-faint)"},children:"Reason (kept on the record)"}),e.jsx(Zt,{value:lt,onChange:t=>Ct(t.target.value),placeholder:"Why this is being certified without a submission",className:"text-xs min-h-[72px]"})]})]}),e.jsxs(Bs,{children:[e.jsx(Ee,{variant:"outline",size:"sm",className:"h-8 text-xs",onClick:()=>qe(!1),children:"Cancel"}),e.jsxs(Ee,{size:"sm",className:"h-8 text-xs",disabled:Nt||!Ye.trim(),onClick:is,children:[Nt?e.jsx(Re,{className:"h-3 w-3 mr-1.5 animate-spin"}):e.jsx($t,{className:"h-3 w-3 mr-1.5"}),"Certify"]})]})]})}),e.jsx("div",{className:"flex items-center gap-1.5",children:["solution","expert"].map(t=>e.jsx(Ee,{size:"sm",variant:j===t?"default":"outline",className:"h-7 text-xs font-normal",onClick:()=>X(t),children:t==="solution"?"Solution partners":"Experts"},t))}),j==="solution"&&e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx($s,{value:B,onChange:_}),e.jsx(ba,{views:U.views,activeViewId:De,setActiveViewId:xs,columnOrder:he,hiddenColumns:be,onColumnOrderChange:Ke,onHiddenColumnsChange:Ve,columnLabels:Ba,pinnedColumns:[...ht],masterColumnOrder:Z.order,masterHiddenColumns:Z.hidden,dirty:bs,onSaveAs:vs,onUpdateCurrent:ys,onRename:(t,a)=>U.update(t,{name:a}),onDelete:t=>U.remove(t),onSetDefault:t=>U.setDefault(t),defaultViewId:U.defaultView?.id??null}),e.jsx(va,{...Ce.controlProps,options:Jt}),e.jsxs(Ws,{onClear:hs,showClear:gs>0,children:[e.jsx(de,{multiple:!0,group:"Ownership",label:"PDM owner",value:D,onChange:pe,options:[{value:"all",label:"All owners"},...Qe.hasUnassigned?[{value:"unassigned",label:"Unassigned"}]:[],...Qe.list]}),e.jsx(de,{multiple:!0,group:"Status",label:"Cert status",value:Q,onChange:ke,options:[{value:"all",label:"Any status"},{value:"certified",label:"Certified"},{value:"awaiting_review",label:"Awaiting review"},{value:"in_progress",label:"In progress"},{value:"failed",label:"Failed"},{value:"not_started",label:"Not started"},{value:"expired",label:"Expired"}]}),e.jsx(de,{multiple:!0,group:"Status",label:"Build",value:re,onChange:i,options:[{value:"all",label:"Any phase"},{value:"passed",label:"Passed"},{value:"submitted",label:"Submitted"},{value:"in_progress",label:"In progress"},{value:"failed",label:"Failed"},{value:"not_started",label:"Not started"}]}),e.jsx(de,{multiple:!0,group:"Status",label:"Sell",value:h,onChange:z,options:[{value:"all",label:"Any phase"},{value:"passed",label:"Passed"},{value:"in_progress",label:"In progress"},{value:"failed",label:"Failed"},{value:"not_started",label:"Not started"}]}),e.jsx(de,{multiple:!0,group:"Review",label:"Autograde",value:R,onChange:T,options:[{value:"all",label:"Any autograde"},{value:"Strong",label:"Strong"},{value:"Borderline",label:"Borderline"},{value:"Weak",label:"Weak"},{value:"Invalid",label:"Invalid"},{value:"ungraded",label:"Ungraded"}]}),e.jsx(de,{multiple:!0,group:"Review",label:"Suggested verdict",value:W,onChange:me,options:[{value:"all",label:"Any"},{value:"pass",label:"Pass"},{value:"fail",label:"Fail"},{value:"pending",label:"Pending"}]}),e.jsx(de,{multiple:!0,group:"Review",label:"Review verdict",value:V,onChange:ie,options:[{value:"all",label:"Any"},{value:"pass",label:"Pass"},{value:"fail",label:"Fail"},{value:"unreviewed",label:"Unreviewed"}]}),e.jsx(de,{multiple:!0,group:"Review",label:"Feedback sent",value:we,onChange:Ue,options:[{value:"all",label:"Any"},{value:"yes",label:"Yes"},{value:"no",label:"No"}]}),e.jsx(de,{multiple:!0,group:"Status",label:"Submission",value:_e,onChange:Ge,options:[{value:"all",label:"Any submission"},{value:"new",label:"First attempt"},{value:"resub2",label:"Resubmission (attempt 2)"},{value:"resub3",label:"Resubmission (attempt 3)"},{value:"resub4plus",label:"Resubmission (attempt 4+)"},{value:"none",label:"Not submitted"}]}),e.jsx(de,{multiple:!0,group:"Outreach",label:"Nudged",value:Se,onChange:He,options:[{value:"all",label:"Any"},...Vt]})]})]}),j==="solution"&&oe.length>0&&e.jsx("div",{className:"mt-2",children:e.jsx(Us,{pills:oe})})]}),N&&j==="solution"&&e.jsx("div",{style:{fontSize:12,color:"#a33",marginTop:12},children:N}),j==="expert"?e.jsx("div",{className:"flex-1 min-h-0 mt-6 overflow-hidden flex flex-col",children:e.jsx(Ra,{})}):e.jsxs("div",{className:"flex-1 min-h-0 mt-6 overflow-hidden flex flex-col",style:{borderRadius:8,border:"0.5px solid var(--ds-border-faint)",background:"var(--ds-surface)"},children:[e.jsx(La,{metrics:ns,loading:o,bucket:K,onToggleBucket:t=>te(a=>a===t?"all":t)}),e.jsx(qa,{rows:os,loading:o,onRowClick:Tt,onNudge:Dt,onGrade:dt,grading:ze,onSaveReview:zt,compare:Ce.compare,headerBadge:Ce.headerBadge,onHeaderClick:Ce.onHeaderClick,senderNames:l,columnOrder:he,hiddenColumns:be})]}),e.jsx(Ma,{target:Mt,open:!!Mt,onOpenChange:t=>{t||Dt(null)},onSent:()=>{jt()}}),e.jsx(ma,{isAdmin:!0,member:M,partnerId:ae,pdmOwnerEmail:ye,teamSellPassed:(()=>{const t=M?.invited_email?.toLowerCase();return!!(t?L.find(r=>r.email.toLowerCase()===t):null)?.orgGate?.sellPassed})(),orgBuildApproved:(()=>{const t=M?.invited_email?.toLowerCase();return!!(t?L.find(r=>r.email.toLowerCase()===t):null)?.orgGate?.buildApproved})(),orgBuildExpiresAt:(()=>{const t=M?.invited_email?.toLowerCase();return(t?L.find(r=>r.email.toLowerCase()===t):null)?.orgGate?.buildApprovedExpiresAt??null})(),orgBuildSubmitted:(()=>{const t=M?.invited_email?.toLowerCase();return!!(t?L.find(r=>r.email.toLowerCase()===t):null)?.orgGate?.buildSubmitted})(),orgBuildSubmittedBy:(()=>{const t=M?.invited_email?.toLowerCase();return(t?L.find(r=>r.email.toLowerCase()===t):null)?.orgGate?.buildSubmittedBy??null})(),orgBuildApprovedBy:(()=>{const t=M?.invited_email?.toLowerCase();return(t?L.find(r=>r.email.toLowerCase()===t):null)?.orgGate?.buildApprovedBy??null})(),orgBuildApprovedAt:(()=>{const t=M?.invited_email?.toLowerCase();return(t?L.find(r=>r.email.toLowerCase()===t):null)?.orgGate?.buildApprovedAt??null})(),open:!!M,onOpenChange:t=>{t||(F(null),q(null),c(null),x(null))},review:w,onSaveReview:zt,siblings:(()=>{const t=M?.invited_email?.toLowerCase(),a=t?L.find(u=>u.email.toLowerCase()===t):null;if(!a?.partnerId)return[];const r=new Set;r.add(a.userId??`email:${a.email.toLowerCase()}`);const d=[];for(const u of L){if(u.partnerId!==a.partnerId||u.id===a.id)continue;const E=u.userId??`email:${u.email.toLowerCase()}`;r.has(E)||(r.add(E),d.push({key:u.id,member:{id:u.partnerUserId??u.id,user_id:u.userId,invited_email:u.email,full_name:u.fullName,avatar_url:u.avatarUrl,role:"member",status:"active",cert_status:u.status,cert_progress_pct:u.progress_pct,cert_certified_at:u.certified_at,cert_expires_at:u.expires_at,cert_last_reminded_at:null}}))}return d})(),onSelectSibling:t=>{const a=L.find(r=>r.id===t);a&&Tt(a)}})]})}function La({metrics:s,loading:o,bucket:m,onToggleBucket:N}){const A=[{key:"certified_partners",bucket:"certified",label:"Certified partners",value:s.certifiedPartners,tooltip:"Unique partners with at least one user whose certification is active — passed sell, build approved, and not expired."},{key:"in_progress",bucket:"in_progress",label:"In progress",value:s.inProgress,tooltip:"Users actively working through the cert (started sell or build) but not yet awaiting review or certified. Excludes users whose build submission is waiting for review."},{key:"awaiting_review",bucket:"awaiting_review",label:"Awaiting review",value:s.awaitingReview,highlight:s.awaitingReview>0,tooltip:"Users who passed the sell cert and submitted their build cert — ready for you to review and approve or send back 
2with feedback."},{key:"failed",bucket:"failed",label:"Failed",value:s.failed,tooltip:"Users whose most recent review verdict was fail. They stay here until they resubmit and get certified."}];return e.jsx(Gs,{delayDuration:200,children:e.jsx("div",{className:"flex-shrink-0 flex",style:{borderBottom:"0.5px solid var(--ds-border-faint)"},children:A.map((b,O)=>{const G=b.bucket!==null&&m===b.bucket,I=b.bucket!==null,ee=I?()=>N(b.bucket):void 0;return e.jsxs(Hs,{children:[e.jsx(Ks,{asChild:!0,children:e.jsxs("button",{type:"button",onClick:ee,"aria-pressed":G,disabled:!I,className:"relative flex-1 px-5 py-4 text-left transition-colors focus:outline-none",style:{borderRight:O<A.length-1?"0.5px solid var(--ds-border-faint)":void 0,background:G?"var(--ds-surface-hover, rgba(0,0,0,0.03))":void 0,cursor:I?"pointer":"default",minWidth:0},onMouseEnter:H=>{I&&!G&&(H.currentTarget.style.background="var(--ds-surface-hover, rgba(0,0,0,0.02))")},onMouseLeave:H=>{I&&!G&&(H.currentTarget.style.background="")},children:[e.jsxs("div",{className:"flex items-center gap-1.5 truncate",style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.08em",color:G?"var(--ds-text-primary)":"var(--ds-text-tertiary)",fontWeight:500},children:[e.jsx("span",{className:"truncate",children:b.label}),e.jsx(Vs,{size:12,strokeWidth:1.5,style:{opacity:.6,flexShrink:0}})]}),e.jsx("div",{className:"mt-2",style:b.highlight?{fontSize:22,fontWeight:600,lineHeight:1,backgroundImage:"var(--brand-gradient)",WebkitBackgroundClip:"text",backgroundClip:"text",color:"transparent",WebkitTextFillColor:"transparent"}:{fontSize:22,fontWeight:600,lineHeight:1,color:"var(--ds-text-primary)"},children:o?"—":b.value}),G&&e.jsx("span",{"aria-hidden":"true",className:"absolute bottom-0 left-0 right-0",style:{height:2,background:"var(--brand-gradient)"}})]})}),e.jsx(qs,{side:"bottom",className:"max-w-xs text-xs",children:b.tooltip})]},b.key)})})})}function Oa({attempts:s}){const o=s>1;return e.jsx("span",{style:{alignSelf:"flex-start",display:"inline-flex",alignItems:"center",padding:"1px 6px",borderRadius:3,fontSize:10.5,fontWeight:500,background:o?"#fef3c7":"var(--ds-row-hover)",color:o?"#78350f":"var(--ds-text-body)"},children:o?`Resubmission · attempt ${s}`:"First attempt"})}const $e=[{key:"partner",label:"Partner",initialWidth:260,minWidth:180,pinned:!0},{key:"pdm",label:"PDM owner",initialWidth:160,minWidth:120},{key:"status",label:"Status",initialWidth:140,minWidth:110},{key:"submitted",label:"Submitted",initialWidth:150,minWidth:120},{key:"attempts",label:"Submission",initialWidth:170,minWidth:130},{key:"sla",label:"Review SLA",initialWidth:120,minWidth:100},{key:"nudged",label:"Nudged",initialWidth:140,minWidth:110},{key:"certified",label:"Certified",initialWidth:100,minWidth:90},{key:"feedback_sent",label:"Feedback sent",initialWidth:130,minWidth:110},{key:"cert_credit",label:"Cert credit",initialWidth:120,minWidth:100},{key:"actions",label:"Actions",initialWidth:130,minWidth:120}],Xe=$e.map(s=>s.key),ht=$e.filter(s=>s.pinned).map(s=>s.key),Ba=Object.fromEntries($e.map(s=>[s.key,s.label])),$a="admin_certification",We=s=>Sa(s),Yt=s=>_a(s);function st(s){const o=s.build??{},m=Number(o.attempt_count??0),N=Array.isArray(s.build_history)?s.build_history.length+1:0,A=!!(o.submitted_at||o.submission_url||We(s));return Math.max(m,N,A?1:0)}function yt(s,o,m=Date.now()){const N=o==="certified"||o==="failed",A=We(s);return ja(A,o==="awaiting_review",N,new Date(m))}const Jt=[{field:"partner",label:"Partner"},{field:"pdm",label:"PDM owner"},{field:"status",label:"Status"},{field:"submitted",label:"Submitted"},{field:"attempts",label:"Submission"},{field:"sla",label:"Review SLA"},{field:"certified",label:"Certified"},{field:"feedback_sent",label:"Feedback sent"},{field:"cert_credit",label:"Cert credit"},{field:"nudged",label:"Nudged"}],et=[{field:"sla",dir:"asc"}],Wa={partner:s=>(s.partnerName??"").toLowerCase(),pdm:s=>(s.pdmOwnerName??s.pdmOwnerEmail??"").toLowerCase(),status:s=>_t[ue(s)].rank,submitted:s=>We(s)??null,attempts:s=>st(s),sla:s=>{const o=yt(s,ue(s)),m=1e15;switch(o.kind){case"overdue":return 0*m+o.dueAt.getTime();
2case"nearing":return 1*m+o.dueAt.getTime();case"safe":return 2*m+o.dueAt.getTime();case"done":return 3*m;default:return 4*m}},certified:s=>ue(s)==="certified"?0:1,feedback_sent:s=>s.feedback_sent_to_partner?0:1,cert_credit:s=>s.certCreditGranted?0:1,nudged:s=>s.nudge?new Date(s.nudge.lastAt).getTime():null};function Ua({state:s}){return s.kind==="none"?e.jsx("span",{style:{fontSize:12,color:"var(--ds-text-faint)"},children:"—"}):s.kind==="done"?e.jsxs("div",{className:"inline-flex items-center gap-1.5",title:"Review complete",children:[e.jsx(Qs,{className:"h-3.5 w-3.5 text-emerald-600 shrink-0"}),e.jsx("span",{style:{fontSize:11,color:"var(--ds-badge-approved-text)",fontWeight:500},children:"Reviewed"})]}):s.kind==="safe"?e.jsxs("div",{className:"inline-flex items-center gap-1 rounded-md px-2 py-0.5",title:`Review SLA: ${s.businessDaysLeft} business day${s.businessDaysLeft===1?"":"s"} left of ${Ut}`,style:{background:"var(--ds-badge-new-bg)",color:"var(--ds-badge-new-text)"},children:[e.jsx(Wt,{className:"h-3 w-3 shrink-0"}),e.jsxs("span",{style:{fontSize:11,fontWeight:500},children:[s.businessDaysLeft,"d left"]})]}):s.kind==="nearing"?e.jsxs("div",{className:"inline-flex items-center gap-1 rounded-md px-2 py-0.5",title:`SLA nearing — ${s.businessDaysLeft} business day${s.businessDaysLeft===1?"":"s"} left`,style:{background:"#fdf1e3",color:"#9a5b1a"},children:[e.jsx(Wt,{className:"h-3 w-3 shrink-0"}),e.jsx("span",{style:{fontSize:11,fontWeight:500},children:"Due soon"})]}):e.jsxs("div",{className:"inline-flex items-center gap-1 rounded-md px-2 py-0.5",title:`Overdue — ${s.businessDaysOver} business day${s.businessDaysOver===1?"":"s"} past ${Ut}-day SLA`,style:{background:"#fbe9e9",color:"var(--ds-badge-rejected-text)"},children:[e.jsx(Xt,{className:"h-3 w-3 shrink-0"}),e.jsxs("span",{style:{fontSize:11,fontWeight:500},children:[s.businessDaysOver,"d overdue"]})]})}const ue=s=>s.orgStatus??oa(s);function Ga(s){return s.partnerId??`__solo__:${s.id}`}function Ha(s){return es(s.map(o=>({id:o.id,email:o.email,status:o.status??null,certified_at:o.certified_at??null,expires_at:o.expires_at??null,reviewed_at:o.reviewed_at??null,review_verdict:o.review_verdict??null,build:o.build,sell:o.sell,who:o.fullName??o.email})))}const _t=da;function Ka({status:s}){const o=_t[s];return e.jsx("span",{style:{fontSize:11,fontWeight:400,background:o.bg,color:o.fg,borderRadius:5,padding:"2px 8px",display:"inline-block",whiteSpace:"nowrap"},children:o.label})}function bt({yes:s,tone:o="green"}){if(!s)return e.jsx("span",{style:{fontSize:12,color:"var(--ds-text-faint)"},children:"No"});const m=o==="green"?{bg:"#eaf5df",fg:"var(--ds-badge-approved-text)"}:{bg:"var(--ds-badge-new-bg)",fg:"var(--ds-badge-new-text)"};return e.jsx("span",{style:{fontSize:11,fontWeight:400,background:m.bg,color:m.fg,borderRadius:5,padding:"2px 8px",display:"inline-block"},children:"Yes"})}function Va({nudge:s,senderNames:o}){if(!s)return e.jsx("span",{style:{fontSize:12,color:"var(--ds-text-faint)"},children:"Never"});const m=new Date(s.lastAt),N=s.lastStatus==="failed",A=s.lastStatus==="draft";return e.jsxs(ia,{openDelay:120,children:[e.jsx(na,{asChild:!0,children:e.jsxs("div",{className:"min-w-0 cursor-default",children:[e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("span",{className:"truncate",style:{fontSize:12,color:N?"var(--ds-badge-danger-text)":"var(--ds-text-body)"},children:Be(m,{addSuffix:!0})}),s.count>1&&e.jsxs("span",{style:{fontSize:10,background:"var(--ds-badge-new-bg)",color:"var(--ds-badge-new-text)",padding:"1px 5px",borderRadius:4},children:["×",s.count]})]}),e.jsx("div",{className:"truncate",style:{fontSize:10.5,color:"var(--ds-text-faint)"},children:N?"Last send failed":A?"Left as draft":tt(m,"MMM d, yyyy")})]})}),e.jsxs(la,{align:"start",className:"w-80 p-3",children:[e.jsxs("div",{style:{fontSize:11,color:"var(--ds-text-faint)"},children:[s.sentCount," sent",s.count>s.sentCount?` · ${s.count-s.sentCount} draft/failed`:""]}),e.jsx("div",{className:"mt-2 space-y-2",children:s.recent.map(b=>e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"truncate",style:{fontSize:12,color:"var(--ds-text-primary)"},children:b.recipient}),e.jsx("span",{style:{fontSize:10.5,color:"var(--ds-text-faint)",whiteSpace:"nowrap"},children:tt(new Date(b.created_at),"MMM d")})]}),e.jsxs("div",{className:"truncate",style:{fontSize:10.5,color:"var(--ds-text-faint)"},children:[za[b.template]??b.template," · ",b.status==="sent"?"Sent":b.status==="draft"?"Draft":"Failed"," · by ",(b.created_by?o.get(b.created_by):null)??b.sender_email??"unknown"]}),b.error_message&&e.jsx("div",{className:"truncate",style:{fontSize:10.5,color:"var(--ds-badge-danger-text)"},children:b.error_message})]},b.id))})]})]})}function qa({rows:s,loading:o,onRowClick:m,onNudge:N,columnOrder:A,hiddenColumns:b,compare:O,headerBadge:G,onHeaderClick:I,senderNames:ee}){const{widths:H,onMouseDown:fe}=Ys([...$e]),se=n.useMemo(()=>{const c=new Map($e.map(w=>[w.key,w]));return A.filter(w=>!b.includes(w)).map(w=>c.get(w)).filter(w=>!!w)},[A,b]),ve=se.reduce((c,w)=>c+(H[w.key]??w.initialWidth),0),le=n.useMemo(()=>{const c=new Map,w=[];for(const x of s){const j=x.partnerId??`__solo__:${x.id}`,X=x.userId??`email:${x.email.toLowerCase()}`,B=c.get(j);if(!B){c.set(j,{primary:x,othersCount:0,seenUsers:new Set([X]),members:[x]}),w.push(j);continue}B.members.push(x);const _=pt(B.primary.build,B.primary.sell).buildSubmitted,Y=pt(x.build,x.sell).buildSubmitted;(Y&&!_||Y===_&&(x.updated_at??"")>
2(B.primary.updated_at??""))&&(B.primary=x),B.seenUsers.has(X)||(B.seenUsers.add(X),B.othersCount+=1)}return w.map(x=>{const j=c.get(x);return{primary:j.primary,othersCount:j.othersCount,members:j.members}})},[s]),l=n.useMemo(()=>[...le].sort((c,w)=>O(c.primary,w.primary)),[le,O]),y=100,[M,F]=n.useState(0),ae=Math.max(1,Math.ceil(l.length/y)),q=Math.min(M,ae-1);n.useEffect(()=>{F(0)},[s,O]);const ye=n.useMemo(()=>l.slice(q*y,(q+1)*y),[l,q]);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"md:hidden flex-1 min-h-0 overflow-auto flex flex-col gap-2 p-3 pb-24",children:o?e.jsx(Za,{}):l.length===0?e.jsx(Xa,{children:"No users match."}):ye.map(({primary:c,othersCount:w})=>{const x=ue(c);return e.jsxs(Ja,{onClick:()=>m(c),children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{style:{fontSize:13,fontWeight:500,color:"var(--ds-text-primary)"},className:"truncate",children:c.partnerName??"Unassigned"}),e.jsxs("div",{className:"truncate",style:{fontSize:11,color:"var(--ds-text-faint)"},children:[c.fullName||c.email.split("@")[0],w>0?` +${w} other${w===1?"":"s"}`:""]})]}),e.jsxs(Qa,{children:[e.jsx(je,{label:"PDM Owner",value:c.pdmOwnerName??c.pdmOwnerEmail??"Unassigned"}),e.jsx(je,{label:"Status",value:_t[x].label}),e.jsx(je,{label:"Submitted",value:(()=>{const j=We(c);return j?tt(new Date(j),"MMM d, yyyy"):"—"})()}),e.jsx(je,{label:"Submission",value:(()=>{const j=st(c);return j===0?"—":j===1?"First attempt":`Resubmission · attempt ${j}`})()}),e.jsx(je,{label:"Review SLA",value:(()=>{const j=yt(c,x);switch(j.kind){case"none":return"—";case"done":return"Reviewed";case"safe":return`${j.businessDaysLeft}d left`;case"nearing":return"Due soon";case"overdue":return`${j.businessDaysOver}d overdue`;default:return"—"}})()}),e.jsx(je,{label:"Certified",value:x==="certified"?"Yes":"No"}),e.jsx(je,{label:"Feedback sent",value:c.feedback_sent_to_partner?"Yes":"No"}),e.jsx(je,{label:"Cert credit",value:c.certCreditGranted?"Yes":"No"}),e.jsx(je,{label:"Nudged",value:c.nudge?`${Be(new Date(c.nudge.lastAt),{addSuffix:!0})}${c.nudge.count>1?` · ×${c.nudge.count}`:""}`:"Never"})]})]},c.partnerId??c.id)})}),e.jsxs("div",{className:"hidden md:flex flex-1 min-h-0 overflow-auto",children:[e.jsxs("table",{style:{tableLayout:"fixed",width:ve,minWidth:"100%",borderCollapse:"collapse"},children:[e.jsx("colgroup",{children:se.map(c=>e.jsx("col",{style:{width:H[c.key]??c.initialWidth}},c.key))}),e.jsx("thead",{children:e.jsx("tr",{style:{background:"var(--ds-surface)",borderBottom:"0.5px solid var(--ds-border-faint)"},children:se.map((c,w)=>{const x=w===0;return c.key==="actions"?e.jsx("th",{style:{padding:"8px 12px",textAlign:"right",fontSize:11,fontWeight:400,color:"var(--ds-text-faint)"},children:c.label},c.key):e.jsx(Ya,{sortKey:c.key,label:c.label,badge:G(c.key),onSort:I,onResize:fe(c.key),style:x?{paddingLeft:20}:void 0},c.key)})})}),e.jsx("tbody",{children:o?e.jsx("tr",{children:e.jsx("td",{colSpan:se.length,style:{padding:40,textAlign:"center"},children:e.jsx(Re,{className:"h-4 w-4 animate-spin inline"})})}):l.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:se.length,style:{padding:40,textAlign:"center",fontSize:12,color:"var(--ds-text-faint)"},children:"No users match the current filters."})}):ye.map(({primary:c,othersCount:w,members:x})=>{const j=ue(c),X=es(x.map(_=>({status:_.status??null,certified_at:_.certified_at??null,expires_at:_.expires_at??null,review_verdict:_.review_verdict??null,build:_.build,sell:_.sell,who:_.fullName??_.email}))),B={partner:e.jsx(ge,{style:{paddingLeft:20},children:e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"truncate",style:{fontSize:13,fontWeight:500,color:"var(--ds-text-primary)"},children:c.partnerName??"Unassigned"}),e.jsxs("div",{className:"truncate flex items-center gap-1.5",style:{fontSize:11,color:"var(--ds-text-faint)"},children:[e.jsx("span",{className:"truncate",children:c.fullName||c.email}),w>0&&e.jsxs("span",{style:{fontSize:10,background:"var(--ds-badge-new-bg)",color:"var(--ds-badge-new-text)",padding:"1px 6px",borderRadius:4,whiteSpace:"nowrap"},children:["+",w," other",w===1?"":"s"]})]})]})}),pdm:e.jsx(ge,{children:c.pdmOwnerName||c.pdmOwnerEmail?e.jsx("span",{className:"truncate block",style:{fontSize:12,color:"var(--ds-text-body)"},children:c.pdmOwnerName??c.pdmOwnerEmail}):e.jsx("span",{style:{fontSize:12,color:"var(--ds-text-faint)"},children:"Unassigned"})}),status:e.jsx(ge,{children:e.jsx(Ka,{status:j})}),submitted:e.jsx(ge,{children:(()=>{const _=We(c);if(!_)return e.jsx("span",{style:{fontSize:12,color:"var(--ds-text-faint)"},children:"—"});const Y=c.progress_pct??0,$=!c.build?.submitted_at&&Y>=75;return e.jsxs("div",{className:"min-w-0",title:$?"Date partner reached 75% progress":"Build submitted for review",children:[e.jsx("div",{className:"flex items-center gap-1.5",children:e.jsx("span",{style:{fontSize:12,color:"var(--ds-text-body)"},children:tt(new Date(_),"MMM d, yyyy")})}),e.jsx("div",{className:"mt-0.5 flex items-center gap-1.5 min-w-0",children:e.jsxs("span",{className:"truncate",style:{fontSize:10.5,color:"var(--ds-text-faint)"},children:[Be(new Date(_),{addSuffix:!0}),$?" · at 75%":""]})})]})})()}),attempts:e.jsx(ge,{children:(()=>{const _=st(c);return _===0?e.jsx("span",{style:{fontSize:12,color:"var(--ds-text-faint)"},children:"—"}):e.jsx(Oa,{attempts:_})})()}),sla:e.jsx(ge,{children:e.jsx(Ua,{state:yt(c,j)})}),certified:e.jsx(ge,{children:e.jsx(bt,{yes:j==="certified"})}),feedback_sent:e.jsx(ge,{children:e.jsx(bt,{yes:c.feedback_sent_to_partner})}),nudged:e.jsx(ge,{children:e.jsx(Va,{nudge:c.nudge,senderNames:ee})}),cert_credit:e.jsx(ge,{children:e.jsx(bt,{yes:c.certCreditGranted})}),actions:e.jsx(ge,{style:{textAlign:"right"},children:X.certified||!c.partnerId?e.jsx("span",{style:{fontSize:12,color:"var(--ds-text-faint)"},children:"—"}):e.jsxs(Ee,{size:"sm",variant:"outline",className:"h-7 text-[11px] gap-1.5",onClick:_=>{_.stopPropagation();const Y=x.filter($=>$.email.toLowerCase()!==c.email.toLowerCase()&&!pt($.build,$.sell).sellPassed).map($=>({email:$.email,name:$.fullName}));N({partnerId:c.partnerId,partnerName:c.partnerName??"Partner",primaryEmail:c.email,primaryName:c.fullName,otherEmails:Array.from(new Map(Y.map($=>[$.email.toLowerCase(),$])).values()),gate:X})},children:[e.jsx(Qt,{className:"h-3 w-3"}),"Send email"]})})};return e.jsx("tr",{onClick:()=>m(c),style:{borderBottom:"0.5px solid var(--ds-border-faint)",height:54,cursor:"pointer"},onMouseEnter:_=>{_.currentTarget.style.background="var(--ds-surface-subtle)"},onMouseLeave:_=>{_.currentTarget.style.background=""},children:se.map(_=>e.jsx(Js.Fragment,{children:B[_.key]},_.key))},c.partnerId??c.id)})})]}),!o&&ae>1?e.jsxs("div",{className:"flex items-center justify-between",style:{padding:"8px 12px",fontSize:12,color:"var(--ds-text-faint)",borderTop:"0.5px solid var(--ds-border)"},children:[e.jsxs("span",{children:["Showing ",(q*y+1).toLocaleStr
2ing(),"–",Math.min((q+1)*y,l.length).toLocaleString()," of ",l.length.toLocaleString()]}),e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("button",{type:"button",disabled:q===0,onClick:()=>F(q-1),style:{opacity:q===0?.4:1},children:"Previous"}),e.jsxs("span",{children:["Page ",q+1," of ",ae]}),e.jsx("button",{type:"button",disabled:q>=ae-1,onClick:()=>F(q+1),style:{opacity:q>=ae-1?.4:1},children:"Next"})]})]}):null]})]})}function Ya({label:s,sortKey:o,badge:m,onSort:N,onResize:A,style:b}){return e.jsxs("th",{className:"relative",style:{padding:"10px 12px",textAlign:"left",fontSize:11,fontWeight:400,color:m?"var(--ds-text-primary)":"var(--ds-text-faint)",whiteSpace:"nowrap",position:"sticky",top:0,background:"var(--ds-surface)",zIndex:1,userSelect:"none",...b},children:[e.jsx(ya,{field:o,label:s,badge:m,onClick:N,title:"Click to sort by this column"}),e.jsx("div",{className:"absolute right-0 top-0 h-full w-1 cursor-col-resize hover:bg-[var(--ds-border-faint)]",onMouseDown:A})]})}function ge({children:s,style:o,onClick:m}){return e.jsx("td",{onClick:m,style:{padding:"8px 12px",verticalAlign:"middle",overflow:"hidden",...o},children:s})}function xt(s){const o=s.build?.autograde?.composite,m=s.build?.autograde?.ownership_match,N=s.sell?.status,A=s.sell?.scenarios_passed??0,b=s.sell?.scenarios_total??0,O=typeof o=="number",G=N==="passed"||N==="failed"||b>0;if(!O||!G)return"pending";const I=(o??0)>=50&&m!==!1,ee=b>0&&A>=b;return I&&ee?"pass":"fail"}function Ja({children:s,onClick:o}){return e.jsx("div",{role:"button",tabIndex:0,onClick:o,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),o())},className:"text-left",style:{width:"100%",display:"flex",flexDirection:"column",gap:10,padding:12,border:"0.5px solid var(--ds-border-faint)",borderRadius:8,background:"var(--ds-surface)",cursor:"pointer"},children:s})}function Qa({children:s}){return e.jsx("div",{className:"grid grid-cols-2 gap-x-3 gap-y-3",children:s})}function je({label:s,value:o}){return e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{style:{fontSize:10.5,color:"var(--ds-text-faint)",marginBottom:3},children:s}),e.jsx("div",{className:"truncate",style:{fontSize:12,color:"var(--ds-text-body)"},children:o})]})}function Za(){return e.jsx("div",{style:{padding:40,textAlign:"center",color:"var(--ds-text-faint)"},children:e.jsx(Re,{className:"h-4 w-4 animate-spin inline"})})}function Xa({children:s}){return e.jsx("div",{style:{padding:24,textAlign:"center",fontSize:12,color:"var(--ds-text-faint)",border:"0.5px solid var(--ds-border-faint)",borderRadius:8,background:"var(--ds-surface)"},children:s})}export{Or as component};

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.