1import{_ as G}from"./x1q-JyMn.js";import{_ as O}from"./B_Aipfgl.js";import{d as Q,a4 as H,a as K,l as q,S as R,o as W,E as d,a2 as e,ah as m,Z as Y,q as r,ac as C,ad as k,ab as o,af as y,ae as p,Y as J,s as Z,v as c,H as l,G as N}from"#entry";import{E as X}from"./CuX9t6fr.js";import{S as ee}from"./Do9P2-69.js";import{C as te}from"./ciJkRlzz.js";import{c as se}from"./BSEZURDX.js";import{C as re}from"./D00V6e9j.js";import{I as ae}from"./B8hqCJI6.js";import{R as oe}from"./CHX6-CKN.js";import"./BJmlCAnR.js";import"./DCADjnpI.js";import"./D5pNXTG0.js";import"./D80cUg7i.js";import"./luP5HEs-.js";import"./CpKPES1b.js";import"./DWitJC9L.js";import"./DMhfFuUI.js";import"./DaWZu8wl.js";const ne=se("percent",[["line",{x1:"19",x2:"5",y1:"5",y2:"19",key:"1x9vlm"}],["circle",{cx:"6.5",cy:"6.5",r:"2.5",key:"4mh3h7"}],["circle",{cx:"17.5",cy:"17.5",r:"2.5",key:"1mdrzq"}]]),le={class:"max-w-screen-2xl px-4 py-32 mx-auto"},ie={class:"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between"},de={class:"mt-6 rounded-lg border border-gray-200 bg-white p-4 shadow-sm"},me={class:"mt-2 grid gap-2 sm:grid-cols-4"},ce=["onClick"],ue={key:0,class:"mt-6 rounded-md border border-red-200 bg-red-50 p-4 text-sm text-red-700"},ge=["href"],pe={key:1,class:"mt-8 rounded-md border border-gray-200 bg-white p-6 text-sm text-gray-600"},xe={key:2,class:"mt-8 space-y-6"},ye={class:"grid gap-4 md:grid-cols-2 xl:grid-cols-4"},fe={class:"rounded-lg border border-gray-200 bg-white p-5 shadow-sm"},he={class:"flex items-center justify-between gap-3"},be={class:"mt-3 text-3xl font-semibold text-gray-900"},ve={class:"mt-2 text-sm text-gray-500"},we={class:"rounded-lg border border-gray-200 bg-white p-5 shadow-sm"},_e={class:"flex items-center justify-between gap-3"},Ce={class:"mt-3 text-3xl font-semibold text-gray-900"},ke={class:"mt-2 text-sm text-gray-500"},De={class:"rounded-lg border border-gray-200 bg-white p-5 shadow-sm"},Ie={class:"flex items-center justify-between gap-3"},Ae={class:"mt-3 text-3xl font-semibold text-gray-900"},Te={class:"rounded-lg border border-gray-200 bg-white p-5 shadow-sm"},Fe={class:"flex items-center justify-between gap-3"},Se={class:"mt-3 text-3xl font-semibold text-gray-900"},qe={class:"rounded-md border border-blue-100 bg-blue-50 p-4 text-sm text-blue-900"},Re={class:"flex gap-2"},Ze={class:"mt-1"},Ne={key:0,class:"mt-1"},$e={class:"rounded-lg border border-gray-200 bg-white p-5 shadow-sm"},Ee={class:"flex flex-col gap-1 sm:flex-row sm:items-end sm:justify-between"},Be={class:"text-xs text-gray-500"},je={class:"overflow-hidden rounded-lg border border-gray-200 bg-white shadow-sm"},Le={class:"overflow-x-auto"},Ue={class:"min-w-full divide-y divide-gray-200 text-sm"},ze={class:"divide-y divide-gray-100 bg-white"},Me={class:"whitespace-nowrap px-5 py-4 font-medium text-gray-900"},Pe={class:"whitespace-nowrap px-5 py-4 text-right text-gray-700"},Ve={class:"whitespace-nowrap px-5 py-4 text-right text-gray-700"},Ge={class:"whitespace-nowrap px-5 py-4 text-right text-gray-700"},Oe={class:"whitespace-nowrap px-5 py-4 text-right font-medium text-gray-900"},pt=Q({__name:"challenge-invites",setup(Qe){const f=H(),$=K(),D=[7,30,90,180],E=s=>Array.isArray(s)?s[0]?String(s[0]):"":typeof s=="string"?s:"",I=s=>{const t=Number(E(s)||30);return D.includes(t)?t:30},u=q(I(f.query.days)),a=Z(null),g=q(!1),h=Z(null);let b=0;const A=new Intl.NumberFormat("de-DE"),T=new Intl.DateTimeFormat("de-DE",{dateStyle:"medium",timeZone:"UTC"}),B=new Intl.DateTimeFormat("de-DE",{dateStyle:"medium",timeStyle:"short",timeZone:"UTC"}),i=s=>A.format(s),F=s=>s===null?"n/a":`${(s*100).toFixed(1)}%`,j=s=>typeof s=="number"?A.format(Math.round(s)):"",L=s=>T.format(new Date(s)),U=s=>`${B.format(new Date(s))} UTC`;R(()=>f.query.days,s=>{const t=I(s);u.value!==t&&(u.value=t)}),R(u,s=>{f.query.days!==String(s)&&$.replace({query:{...f.query,days:String(s)}}),_()});const _=async(s=!1)=>{const t=++b;g.value=!0,h.value=null;try{const x=await $fetch("/api/admin/challenge-invites",{query:{days:u.value,force:s?"true":void 0}});t===b&&(a.value=x)}catch(x){t===b&&(h.value=x)}finally{t===b&&(g.value=!1)}};W(()=>{_()});const S=c(()=>(a.value?.days??[]).map(s=>
1({date:s.label,Invites:s.invites,Angenommen:s.accepted}))),z=c(()=>{if(!a.value)return"";const s=new Date(new Date(a.value.range.endAt).getTime()-1);return`${L(a.value.range.startAt)} - ${T.format(s)}`}),M=c(()=>a.value?.days.length?a.value.totals.invites/a.value.days.length:0),P=c(()=>a.value?.days.length?a.value.totals.accepted/a.value.days.length:0),v=c(()=>{if(!h.value)return"";const s=h.value;return s.data?.statusMessage??s.data?.message??s.statusMessage??s.message??"Challenge-Invite-Auswertung konnte nicht geladen werden."}),w=c(()=>v.value.match(/https:\/\/console\.firebase\.google\.com\/\S+/)?.[0]??""),V=c(()=>w.value?v.value.replace(w.value,"").trim():v.value);return(s,t)=>{const x=G;return l(),d("div",le,[e("div",ie,[t[1]||(t[1]=e("div",null,[e("h1",{class:"text-4xl font-semibold text-gray-900"},"Challenge Invites"),e("p",{class:"mt-2 max-w-3xl text-sm text-gray-600"}," Tägliche erstellte Challenge-Invites und angenommene Challenges. Default ist der Zeitraum der letzten 30 UTC-Kalendertage. ")],-1)),m(x,{variant:"outline",disabled:r(g),class:"gap-2",onClick:t[0]||(t[0]=n=>_(!0))},{default:Y(()=>[m(r(oe),{class:N(["h-4 w-4",{"animate-spin":r(g)}])},null,8,["class"]),y(" "+o(r(g)?"Loading...":"Refresh"),1)]),_:1},8,["disabled"])]),e("div",de,[t[2]||(t[2]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-500"},"Zeitraum",-1)),e("div",me,[(l(),d(C,null,k(D,n=>e("button",{key:n,type:"button",class:N(["rounded-md border px-3 py-2 text-sm font-medium transition",r(u)===n?"border-gray-900 bg-gray-900 text-white":"border-gray-200 bg-white text-gray-700 hover:bg-gray-50"]),onClick:He=>u.value=n},o(n)+" Tage ",11,ce)),64))])]),r(v)?(l(),d("div",ue,[e("p",null,o(r(V)),1),r(w)?(l(),d("a",{key:0,href:r(w),target:"_blank",rel:"noreferrer",class:"mt-2 inline-flex items-center gap-1 font-medium underline"},[t[3]||(t[3]=y(" Firestore Index öffnen ",-1)),m(r(X),{class:"h-3 w-3"})],8,ge)):p("",!0)])):p("",!0),r(g)&&!r(a)?(l(),d("div",pe," Loading challenge invite activity... ")):p("",!0),r(a)?(l(),d("div",xe,[e("div",ye,[e("div",fe,[e("div",he,[t[4]||(t[4]=e("p",{class:"text-sm font-medium text-gray-500"},"Invites erstellt",-1)),m(r(ee),{class:"h-5 w-5 text-orange-600"})]),e("p",be,o(i(r(a).totals.invites)),1),e("p",ve," à "+o(r(M).toFixed(1))+" pro Tag im Zeitraum. ",1)]),e("div",we,[e("div",_e,[t[5]||(t[5]=e("p",{class:"text-sm font-medium text-gray-500"},"Angenommen",-1)),m(r(te),{class:"h-5 w-5 text-emerald-600"})]),e("p",Ce,o(i(r(a).totals.accepted)),1),e("p",ke," à "+o(r(P).toFixed(1))+" Annahmen pro Tag. ",1)]),e("div",De,[e("div",Ie,[t[6]||(t[6]=e("p",{class:"text-sm font-medium text-gray-500"},"Quote im Zeitraum",-1)),m(r(ne),{class:"h-5 w-5 text-gray-700"})]),e("p",Ae,o(F(r(a).totals.acceptanceRate)),1),t[7]||(t[7]=e("p",{class:"mt-2 text-sm text-gray-500"},"Angenommen geteilt durch erstellte Invites im selben Zeitraum.",-1))]),e("div",Te,[e("div",Fe,[t[8]||(t[8]=e("p",{class:"text-sm font-medium text-gray-500"},"Noch offen",-1)),m(r(re),{class:"h-5 w-5 text-amber-600"})]),e("p",Se,o(i(r(a).totals.pending)),1),t[9]||(t[9]=e("p",{class:"mt-2 text-sm text-gray-500"},"Offene, im Zeitraum erstellte Invites.",-1))])]),e("div",qe,[e("div",Re,[m(r(ae),{class:"mt-0.5 h-4 w-4 shrink-0"}),e("div",null,[e("p",null," Generated "+o(U(r(a).generatedAt))+" · Zeitraum: "+o(r(z))+" · Cache: "+o(r(a).cache.hit?"hit":"miss")+". ",1),e("p",Ze,o(i(r(a).sourceCounts.sourceRecords))+" Firestore-Dokumente gelesen, "+o(i(r(a).deduplicatedCount))+" Dubletten entfernt. ",1),r(a).legacyAcceptedFallbackCount?(l(),d("p",Ne,[y(o(i(r(a).legacyAcceptedFallbackCount))+" historische Annahmen nutzen ",1),t[10]||(t[10]=e("code",null,"start",-1)),t[11]||(t[11]=y(" als Fallback, weil ",-1)),t[12]||(t[12]=e("code",null,"acceptedDate",-1)),t[13]||(t[13]=y(" damals noch nicht gesetzt wurde. ",-1))])):p("",!0),(l(!0),d(C,null,k(r(a).notes,n=>(l(),d("p",{key:n,class:"mt-1"},o(n),1))),128))])])]),e("div",$e,[e("div",Ee,[t[14]||(t[14]=e("div",null,[e("h2",{class:"text-lg font-semibold text-gray-900"},"Tagesverlauf"),e("p",{class:"mt-1 text-sm text-gray-500"},"Gruppierte Balken für erstellte und angenommene Challenges.")],-1)),e("p",Be," Pending docs: "+o(i(r(a).sourceCounts.pendingInvites))+", Challenge copies: "+o(i(r(a).sourceCounts.createdChallengeCopies)),1)]),r(S).length?(l(),J(r(O),{key:0,data:r(S),index:"date",categories:["Invites","Angenommen"],colors:["#f97316","#059669"],"y-formatter":j,"rounded-corners":4,class:"mt-6 h-[420px]"},null,8,["data"])):p("",!0)]),e("div",je,[t[16]||(t[16]=e("div",{class:"border-b border-gray-200 px-5 py-4"},[e("h2",{class:"text-lg font-semibold text-gray-900"},"Daily Breakdown")],-1)),e("div",Le,[e("table",Ue,[t[15]||(t[15]=e("thead",{class:"bg-gray-50 text-left text-xs font-semibold uppercase text-gray-500"},[e("tr",null,[e("th",{class:"px-5 py-3"},"Datum"),e("th",{class:"px-5 py-3 text-right"},"Invites"),e("th",{class:"px-5 py-3 text-right"},"Angenommen"),e("th",{class:"px-5 py-3 text-right"},"Offen"),e("th",{class:"px-5 py-3 text-right"},"Quote")])],-1)),e("tbody",ze,[(l(!0),d(C,null,k(r(a).days,n=>(l(),d("tr",{key:n.date}
1,[e("td",Me,o(n.date),1),e("td",Pe,o(i(n.invites)),1),e("td",Ve,o(i(n.accepted)),1),e("td",Ge,o(i(n.pending)),1),e("td",Oe,o(F(n.acceptanceRate)),1)]))),128))])])])])])):p("",!0)])}}});export{pt as default};
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.