PageSourceSearch

https://medifit-nienburg.de/assets/QrReferralAdmin-CbJb4Bcx.js

js medifit-nienburg.de collected 2026-10-04 03:32:31 UTC 21,058 bytes, 1 lines download raw bytes

1import{a as h,j as e}from"./trpc-vendor-Bta84Nsh.js";import{t as c,L as f,B as x,I as N,g as b}from"./index-_3-B0itT.js";import{S as y}from"./switch-CMxVnDoj.js";import{S as M,a as E,b as R,c as L,d as A}from"./select-DqcHU93A.js";import{l as B,t as d,aj as j,g as w,C as z,c1 as k,d as F,a7 as q,v as K,Y as Q,aA as D,aY as I,q as C,aZ as V,ap as $}from"./ui-vendor-NEZNvIbV.js";import"./react-vendor-DpXpH6G7.js";function ae(){const t=c.brands.list.useQuery(),[n,l]=h.useState(null),r=(t.data??[]).filter(a=>!a.deletedAt&&a.magiclineOpenApiToken&&a.magiclineOpenApiBaseUrl);return n==null&&r.length>0&&l(r[0].id),e.jsxs("div",{className:"p-6 max-w-6xl mx-auto space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4 flex-wrap",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-black flex items-center gap-2",children:[e.jsx(B,{className:"w-6 h-6 text-blue-500"}),"QR-Empfehlungs-Programm"]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"Mitglieder-Login + Freund-Einladung mit Magicline-OpenAPI-Anbindung. Test-Modus aktiviert: keine echten Mails, keine Magicline-Calls."})]}),e.jsxs("div",{className:"min-w-[260px]",children:[e.jsx(f,{className:"text-xs uppercase tracking-wide text-muted-foreground",children:"Studio"}),e.jsxs(M,{value:n?String(n):"",onValueChange:a=>l(Number(a)),children:[e.jsx(E,{className:"mt-1",children:e.jsx(R,{placeholder:"Studio wählen"})}),e.jsx(L,{children:r.map(a=>e.jsx(A,{value:String(a.id),children:a.studioName??a.name},a.id))})]})]})]}),n==null?e.jsxs("div",{className:"text-center text-sm text-muted-foreground py-12 border border-dashed rounded-xl space-y-2",children:[e.jsx("div",{children:"Kein Studio mit Magicline-Open-API-Anbindung gefunden."}),e.jsxs("div",{className:"text-xs",children:['In den Brand-Einstellungen unter „Magicline" bitte',e.jsx("code",{className:"font-mono mx-1",children:"Open API Base-URL"})," + ",e.jsx("code",{className:"font-mono mx-1",children:"Open API Token"})," hinterlegen."]})]}):e.jsx(O,{brandId:n})]})}function O({brandId:t}){const n=c.qrReferral.testStatus.useQuery({brandId:t}),l=c.useUtils(),r=()=>{l.qrReferral.testStatus.invalidate({brandId:t}),l.qrReferral.listTestLog.invalidate({brandId:t}),l.qrReferral.listInvitations.invalidate({brandId:t}),l.qrReferral.listBonuses.invalidate({brandId:t})},a=c.qrReferral.toggleTestMode.useMutation({onSuccess:()=>{d.success("Modus geändert"),r()},onError:i=>d.error(i.message)}),s=c.qrReferral.toggleEnabled.useMutation({onSuccess:()=>{d.success("Status geändert"),r()},onError:i=>d.error(i.message)}),g=c.qrReferral.resetTestData.useMutation({onSuccess:i=>{d.success(`Reset OK: ${i.deletedSessions} Sessions, ${i.deletedInvitations} Einladungen, ${i.deletedBonuses} Boni, ${i.deletedLogs} Log-Einträge gelöscht`),r()},onError:i=>d.error(i.message)});if(n.isLoading)return e.jsx("div",{className:"flex justify-center py-12",children:e.jsx(j,{className:"w-6 h-6 animate-spin text-muted-foreground"})});const m=n.data,o=m.testMode,p=m.enabled===!0;return e.jsxs("div",{className:"space-y-5",children:[e.jsx("div",{className:`rounded-xl border p-4 ${p?"bg-emerald-500/5 border-emerald-500/30":"bg-red-500/10 border-red-500/40"}`,children:e.jsxs("div",{className:"flex items-center justify-between gap-4 flex-wrap",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[p?e.jsx(w,{className:"w-6 h-6 text-emerald-500"}):e.jsx(z,{className:"w-6 h-6 text-red-500"}),e.jsxs("div",{children:[e.jsxs("h3",{className:"font-bold",children:["QR-Empfehlungs-Programm: ",p?"AKTIV":"INAKTIV"]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:p?"Mitglieder können /empfehlung öffnen, Magic-Link anfordern und Freunde einladen.":"Die /empfehlung-Seite wirft den Fehler 'QR-Empfehlungs-Programm ist für dieses Studio nicht aktiv'. Hier aktivieren um die Seite freizuschalten."})]})]}),e.jsx(y,{checked:p,onCheckedChange:i=>s.mutate({brandId:t,enabled:i}),disabled:s.isPending})]})}),e.jsx("div",{className:`rounded-xl border p-4 ${o?"bg-amber-500/5 border-amber-500/30":"bg-green-500/5 border-green-500/30"}`,children:e.jsxs("div",{className:"flex items-center justify-between gap-4 flex-wrap",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[o?e.jsx(k,{className:"w-6 h-6 text-amber-500"}):e.jsx(w,{className:"w-6 h-6 text-green-500"}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-bold",children:o?"Test-Mo
1dus aktiv":"Live-Modus"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:o?"Keine echten WhatsApp/E-Mails, keine Magicline-Signups — alles wird nur ge-logged.":"Echte Kommunikation aktiv. Mails/WhatsApp gehen raus, Magicline-API wird beschrieben."})]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-xs",children:o?"Test":"Live"}),e.jsx(y,{checked:!o,onCheckedChange:i=>{i&&!window.confirm("Wirklich auf LIVE schalten? Mails/WhatsApp gehen ab dann real raus.")||a.mutate({brandId:t,enabled:!i})}}),e.jsx("span",{className:"text-xs text-green-500",children:o?"Live":""})]})]})}),e.jsxs("div",{className:"grid md:grid-cols-3 gap-4",children:[e.jsx(W,{brandId:t,status:m,onSaved:r}),e.jsxs(T,{title:"Test-Daten",icon:e.jsx(q,{className:"w-4 h-4 text-blue-400"}),children:[e.jsx(S,{label:"Sessions",value:m.counts.sessions}),e.jsx(S,{label:"Einladungen",value:m.counts.invitations}),e.jsx(S,{label:"Boni",value:m.counts.bonuses}),e.jsxs(x,{variant:"outline",size:"sm",className:"w-full mt-3",onClick:()=>{window.confirm("Alle Test-Daten löschen?")&&g.mutate({brandId:t})},disabled:g.isPending,children:[e.jsx(F,{className:"w-3 h-3 mr-1"})," Test-Daten zurücksetzen"]})]}),e.jsx(_,{brandId:t,currentTypeId:m.magiclineReferralTypeId??null,onSaved:r})]}),e.jsx(G,{brandId:t,onCreated:r}),e.jsx(U,{brandId:t}),e.jsx(Y,{brandId:t,onAction:r}),e.jsx(Z,{brandId:t,onChanged:r}),e.jsx(H,{brandId:t})]})}function U({brandId:t}){const[n,l]=h.useState(!1),r=c.qrReferral.referrerLeaderboard.useQuery({brandId:t,includeTest:n}),a=r.data;return e.jsxs("div",{className:"rounded-xl border border-border bg-card p-5 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(B,{className:"w-5 h-5 text-emerald-500"}),e.jsx("h3",{className:"text-base font-semibold",children:"Empfehler-Übersicht"})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("label",{className:"flex items-center gap-2 text-xs text-muted-foreground cursor-pointer",children:[e.jsx(y,{checked:n,onCheckedChange:l}),"Test-Einladungen einschließen"]}),e.jsxs(x,{size:"sm",variant:"ghost",onClick:()=>r.refetch(),disabled:r.isFetching,children:[e.jsx(C,{className:`w-3 h-3 mr-1 ${r.isFetching?"animate-spin":""}`}),"Neu laden"]})]})]}),!a&&r.isLoading&&e.jsxs("div",{className:"text-sm text-muted-foreground flex items-center gap-2",children:[e.jsx(j,{className:"w-4 h-4 animate-spin"})," Lade…"]}),a&&a.referrers.length===0&&e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Noch keine Einladungen. Sobald ein Mitglied über ",e.jsx("span",{className:"font-mono text-xs",children:"/empfehlung"})," Freunde einlädt, tauchen sie hier auf."]}),a&&a.referrers.length>0&&e.jsxs("div",{className:"overflow-x-auto",children:[e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-border text-xs uppercase tracking-wider text-muted-foreground",children:[e.jsx("th",{className:"text-left px-3 py-2",children:"Mitglied"}),e.jsx("th",{className:"text-center px-2 py-2",children:"Eingeladen"}),e.jsx("th",{className:"text-center px-2 py-2",children:"Geöffnet"}),e.jsx("th",{className:"text-center px-2 py-2",children:"Angemeldet"}),e.jsx("th",{className:"text-center px-2 py-2",children:"Vertrag"}),e.jsx("th",{className:"text-center px-2 py-2",children:"Conv %"}),e.jsxs("th",{className:"text-center px-2 py-2",children:["Bonus",e.jsx("sup",{className:"text-[9px] ml-0.5",children:"ⓘ"})]})]})}),e.jsx("tbody",{children:a.referrers.map(s=>e.jsxs("tr",{className:"border-b border-border/50 last:border-0 hover:bg-muted/30",children:[e.jsxs("td",{className:"px-3 py-2",children:[e.jsx("div",{className:"font-medium text-foreground",children:s.referrerName??`#${s.referrerCustomerNumber??s.referrerCustomerId}`}),s.referrerEmail&&e.jsx("div",{className:"text-xs text-muted-foreground",children:s.referrerEmail})]}),e.jsx("td",{className:"text-center px-2 py-2 font-semibold text-foreground",children:s.total}),e.jsx("td",{className:"text-center px-2 py-2 text-muted-foreground",children:s.opened}),e.jsx("td",{className:"text-center px-2 py-2 text-blue-500",children:s.registered}),e.jsx("td",{className:"text-center px-2 py-2 text-emerald-600 font-bold",children:s.contracted}),e.jsx("td",{className:"text-center px-2 py-2",children:e.jsxs(b,{variant:"outline",className:s.conversionRate>=50?"border-emerald-500/40 text-emerald-600":s.conversionRate>=20?"border-yellow-500/40 text-yellow-600":"border-muted text-muted-foreground",children:[s.conversionRate,"%"]})}),e.jsx("td",{className:"text-center px-2 py-2",title:`Schwelle bei ${a.threshold} Einladungen`,children:s.reachedThreshold?e.jsx(b,{className:"bg-emerald-500/20 text-emerald-700 dark:text-emerald-300 border-emerald-500/40",children:"✓ erreicht"}):e.jsxs("span",{className:"text-xs text-muted-foreground",children:[s.total,"/",a.threshold]})})]},s.referrerCustomerId))})]}),e.jsxs("p",{className:"text-[11px] text-muted-foreground mt-2",children:[e.jsx("strong",{children:"Bonus"}),": ab ",e.jsx("strong",{children:a.threshold})," Einladungen erreicht das Mitglied die Schwelle für den Studio-Bonus (Default 22 Wochen gratis).",e.jsx("strong",{children:" Vertrag"})," = Freund hat tatsächlich abgeschlossen (Magicline-Webhook)."]})]})]})}function T({title:t,icon:n,children:l}){return e.jsxs("div",{className:"rounded-xl border border-border bg-card p-4",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm font-bold mb-3",children:[n,t]}),e.jsx("div",{className:"space-y-2",children:l})]})}function S({label:t,value:n}){return e.jsxs("div",{className:"flex items-center justify-between text-sm",children:[e.jsx("span",{className:"text-muted-foreground",children:t}),e.jsx("span",{className:"font-bold font-mono",children:n})]})}function W({brandId:t,status:n,onSaved:l}){const[r,a]=h.useState(String(n.radiusKm)),[s,g]=h.useState(String(n.bonusThreshold)),m=c.brands.update.useMutation({onSuccess:()=>{d.success("Gespeichert"),l()},onError:o=>d.error(o.message)});return e.jsxs(T,{title:"Einstellungen",icon:e.jsx(K,{className:"w-4 h-4 text-zinc-400"}),children:[e.jsx(f,{className:"text-[11px] uppercase text-muted-foreground",children:"Umkreis (km)"}),e.jsx(N,{value:r,onChange:o=>a(o.target.value),type:"number",min:"1",max:"500",className:"text-sm"}),e.jsx(f,{className:"text-[11px] uppercase text-muted-foreground",children:"Schwelle für 2-Wochen-Bonus"}),e.jsx(N,{value:s,onChange:o=>g(o.target.value),type:"number",min:"1",max:"100",className:"text-sm"}),e.jsx(x,{size:"sm",className:"w-full mt-2",disabled:m.isPending,onClick:()=>m.mutate({id:t,qrReferralRadiusKm:Number(r)||10,qrReferralBonusThreshold:Number(s)||5}),children:"Speichern"})]})}function _({brandId:t,currentTypeId:n,onSaved:l}){const r=c.qrReferral.listMagiclineReferralTypes.useQuery({brandId:t},{retry:!1,staleTime:6e4}),a=c.qrReferral.setMagiclineReferralType.useMutation({onSuccess:()=>{d.success("Typ gesetzt"),l()},onError:s=>d.error(s.message)});return e.jsxs(T,{title:"Magicline-Referral-Typ",icon:e.jsx(Q,{className:"w-4 h-4 text-purple-400"}),children:[e.jsx("p",{className:"text-[11px] text-muted-foreground",children:'Aus Magicline gepflegte Empfehlungs-Typen (z.B. "Mitglied wirbt Mitglied"). Nur diese ID wird beim Anlegen mitgegeben.'}),r.isLoading&&e.jsx(j,{className:"w-4 h-4 animate-spin mx-auto"}),r.error&&e.jsxs("div",{className:"text-xs text-amber-500 flex gap-1 items-start",children:[e.jsx(z,{className:"w-3 h-3 mt-0.5 shrink-0"}),e.jsx("span",{children:r.error.message})]}),r.data&&e.jsxs(M,{value:n!=null?String(n):"",onValueChange:s=>a.mutate({brandId:t,typeId:s?Number(s):null}),children:[e.jsx(E,{className:"text-sm",children:e.jsx(R,{placeholder:"— wählen —"})}),e.jsx(L,{children:r.data.referrals.map(s=>e.jsxs(A,{value:String(s.id),children:["#",s.id," — ",s.type]},s.id))})]})]})}function G({brandId:t,onCreated:n}){const[l,r]=h.useState("Tim"),[a,s]=h.useState("Test"),[g,m]=h.useState("[email protected]"),[o,p]=h.useState("TESTCODE1"),[i,P]=h.useState(null),v=c.qrReferral.createTestSession.useMutation({onSuccess:u=>{P(u.memberAreaUrl),d.success("Test-Session erzeugt — Link unten"),n()},onError:u=>d.error(u.message)});return e.jsxs("div",{className:"rounded-xl border border-border bg-card p-5 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(k,{className:"w-5 h-5 text-amber-500"}),e.jsx("h3",{className:"font-bold",children:"Test-Mitglied erstellen"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Erzeugt eine Mitglieder-Session ohne echten Magicline-Lookup. Du kannst Vorname / Email / Persönlichen Code frei vergeben und dich direkt als dieses Mitglied einloggen."}),e.jsxs("div",{className:"grid md:grid-cols-4 gap-3",children:[e.jsxs("div",{children:[e.jsx(f,{className:"text-[11px] uppercase",children:"Vorname"}
1),e.jsx(N,{value:l,onChange:u=>r(u.target.value)})]}),e.jsxs("div",{children:[e.jsx(f,{className:"text-[11px] uppercase",children:"Nachname"}),e.jsx(N,{value:a,onChange:u=>s(u.target.value)})]}),e.jsxs("div",{children:[e.jsx(f,{className:"text-[11px] uppercase",children:"E-Mail"}),e.jsx(N,{value:g,onChange:u=>m(u.target.value),type:"email"})]}),e.jsxs("div",{children:[e.jsx(f,{className:"text-[11px] uppercase",children:"Persönlicher Code"}),e.jsx(N,{value:o,onChange:u=>p(u.target.value.toUpperCase()),className:"font-mono"})]})]}),e.jsxs(x,{onClick:()=>v.mutate({brandId:t,firstName:l,lastName:a,email:g,referralCode:o}),disabled:v.isPending,children:[v.isPending?e.jsx(j,{className:"w-4 h-4 mr-2 animate-spin"}):e.jsx(k,{className:"w-4 h-4 mr-2"}),"Test-Session erzeugen"]}),i&&e.jsxs("div",{className:"rounded-lg bg-amber-500/5 border border-amber-500/30 p-3 text-sm flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"overflow-hidden",children:[e.jsx("div",{className:"font-bold text-amber-300",children:"Mitglieder-Bereich öffnen"}),e.jsx("div",{className:"text-xs text-muted-foreground truncate font-mono",children:i})]}),e.jsxs("div",{className:"flex gap-1 shrink-0",children:[e.jsx(x,{size:"sm",variant:"ghost",onClick:()=>{navigator.clipboard.writeText(i),d.success("Kopiert")},children:e.jsx(D,{className:"w-3 h-3"})}),e.jsx("a",{href:i,target:"_blank",rel:"noreferrer",children:e.jsxs(x,{size:"sm",children:[e.jsx(I,{className:"w-3 h-3 mr-1"})," Öffnen"]})})]})]})]})}function Y({brandId:t,onAction:n}){const l=c.qrReferral.listInvitations.useQuery({brandId:t}),r=c.qrReferral.simulateFriendSignup.useMutation({onSuccess:()=>{d.success("Anmeldung simuliert"),n()},onError:s=>d.error(s.message)}),a=(l.data??[]).filter(s=>s.status==="sent"||s.status==="opened");return e.jsxs("div",{className:"rounded-xl border border-border bg-card p-5 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(V,{className:"w-5 h-5 text-blue-500"}),e.jsx("h3",{className:"font-bold",children:"Freund-Anmeldung simulieren"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:'Spielt durch: "Freund hat Online-Anmeldung abgeschlossen" → Bonus-Queue für Empfehler. Kein echter Magicline-Signup.'}),l.isLoading&&e.jsx(j,{className:"w-4 h-4 animate-spin"}),a.length===0?e.jsx("div",{className:"text-xs text-muted-foreground",children:"Keine offenen Einladungen — erst Test-Session anlegen + dort einen Freund einladen."}):e.jsx("ul",{className:"space-y-2",children:a.slice(0,8).map(s=>e.jsxs("li",{className:"flex items-center justify-between gap-3 rounded-md bg-muted/30 p-2 text-sm",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"font-medium",children:[s.friendFirstName," ",s.friendLastName??"",s.isTest&&e.jsx(b,{variant:"outline",className:"ml-2 text-[10px]",children:"TEST"})]}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:["von ",s.referrerName??s.referrerCustomerId," • Code ",s.referrerReferralCode??"—"," •",s.distanceKm!=null?` ${Number(s.distanceKm).toFixed(1)} km`:" keine PLZ"]})]}),e.jsxs("div",{className:"flex gap-1 shrink-0",children:[e.jsx(x,{size:"sm",variant:"outline",onClick:()=>r.mutate({invitationToken:s.invitationToken,asContract:!1}),children:"als Lead"}),e.jsx(x,{size:"sm",onClick:()=>r.mutate({invitationToken:s.invitationToken,asContract:!0}),children:"als Vertrag"})]})]},s.id))})]})}function Z({brandId:t,onChanged:n}){const l=c.qrReferral.listBonuses.useQuery({brandId:t}),r=c.qrReferral.confirmManualBonus.useMutation({onSuccess:()=>{d.success("Erledigt"),n()},onError:s=>d.error(s.message)}),a=c.qrReferral.skipBonus.useMutation({onSuccess:()=>{d.success("Übersprungen"),n()},onError:s=>d.error(s.message)});return e.jsxs("div",{className:"rounded-xl border border-border bg-card p-5 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Q,{className:"w-5 h-5 text-purple-500"}),e.jsx("h3",{className:"font-bold",children:"Bonus-Liste"}),e.jsx(x,{size:"sm",variant:"ghost",onClick:()=>l.refetch(),className:"ml-auto",children:e.jsx(C,{className:"w-3 h-3"})})]}),l.isLoading&&e.jsx(j,{className:"w-4 h-4 animate-spin"}),(l.data??[]).length===0?e.jsx("div",{className:"text-xs text-muted-foreground py-3 text-center",children:"Noch keine Boni in der Queue."}):e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"text-xs text-muted-foreground border-b border-border",children:e.jsxs("tr",{children:[e.jsx("th",{className:"text-left py-2 font-medium",children:"Empfehler"}),e.jsx("th",{className:"text-left font-medium",children:"Typ"}),e.jsx("th",{className:"text-left font-medium",children:"Status"}),e.jsx("th",{className:"text-left font-medium",children:"Code"}),e.jsx("th",{})]})}),e.jsx("tbody",{children:(l.data??[]).map(s=>e.jsxs("tr",{className:"border-b border-border/50",children:[e.jsxs("td",{className:"py-2",children:[s.referrerName??s.referrerCustomerId,s.isTest&&e.jsx(b,{variant:"outline",className:"ml-2 text-[10px]",children:"TEST"})]}),e.jsx("td",{className:"text-xs",children:s.bonusType==="free_month_per_signup"?"1 Monat (auto)":`2 Wochen (Schwelle ${s.invitationCountAtTrigger})`}),e.jsx("td",{children:e.jsx(b,{variant:"outline",className:s.status==="done"?"text-green-500 border-green-500/30":s.status==="pending_manual"?"text-amber-500 border-amber-500/30":s.status==="pending_api"?"text-blue-500 border-blue-500/30":s.status==="failed"?"text-red-500 border-red-500/30":"text-zinc-500",children:s.status})}),e.jsx("td",{className:"text-xs font-mono text-muted-foreground",children:s.magiclineCodeApplied??"—"}),e.jsx("td",{className:"text-right",children:(s.status==="pending_manual"||s.status==="pending_api")&&e.jsxs("div",{className:"flex gap-1 justify-end",children:[e.jsxs(x,{size:"sm",variant:"outline",onClick:()=>r.mutate({id:s.id}),children:[e.jsx(w,{className:"w-3 h-3 mr-1"})," Erledigt"]}),e.jsx(x,{size:"sm",variant:"ghost",onClick:()=>a.mutate({id:s.id}),children:e.jsx($,{className:"w-3 h-3"})})]})})]},s.id))})]})]})}function H({brandId:t}){const n=c.qrReferral.listTestLog.useQuery({brandId:t,limit:100});return e.jsxs("div",{className:"rounded-xl border border-border bg-card p-5 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(q,{className:"w-5 h-5 text-zinc-400"}),e.jsx("h3",{className:"font-bold",children:"Test-Log (letzte 100)"}),e.jsx(x,{size:"sm",variant:"ghost",onClick:()=>n.refetch(),className:"ml-auto",children:e.jsx(C,{className:"w-3 h-3"})})]}),n.isLoading&&e.jsx(j,{className:"w-4 h-4 animate-spin"}),(n.data??[]).length===0?e.jsx("div",{className:"text-xs text-muted-foreground py-3 text-center",children:"Keine Aktionen geloggt."}):e.jsx("ul",{className:"divide-y divide-border/50 max-h-[480px] overflow-auto",children:(n.data??[]).map(l
1=>e.jsxs("li",{className:"py-2 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(b,{variant:"outline",className:"font-mono text-[10px]",children:l.action}),e.jsx("span",{className:"text-xs text-muted-foreground",children:new Date(Number(l.createdAt)).toLocaleString("de-DE",{dateStyle:"short",timeStyle:"medium"})})]}),e.jsx("div",{className:"text-xs mt-0.5",children:l.summary}),l.payload&&e.jsxs("details",{className:"text-[10px] text-muted-foreground mt-1",children:[e.jsx("summary",{className:"cursor-pointer",children:"Payload"}),e.jsx("pre",{className:"mt-1 bg-muted/30 p-2 rounded font-mono overflow-auto max-h-40",children:JSON.stringify(l.payload,null,2)})]})]},l.id))})]})}export{O as BrandPanel,ae 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.