PageSourceSearch

https://digitalbehandling.se/assets/TokenAlertsPage-CTnxvi07.js

js digitalbehandling.se collected 2026-09-30 08:26:57 UTC 5,679 bytes, 1 lines download raw bytes

1import{r as n,l as g,X as l,j as e,a_ as E,B as c,a5 as z,C as o,c as d,d as x,a as m,_ as B,I as F,b as R,k as v,D as H,p as I,q as O,t as M,T as P,v as $}from"./index-CobRY8C4.js";const T={replay_burst:{label:"Replay-attack",tone:"destructive"},invalid_burst:{label:"Många ogiltiga tokens",tone:"destructive"},opt_out_spike:{label:"Opt-out-topp",tone:"warning"},auto_unknown_spike:{label:"Många auto-okänd",tone:"warning"}};function X(){var C;const[h,f]=n.useState([]),[u,N]=n.useState(!0),[k,y]=n.useState(!1),[a,i]=n.useState(null),[_,b]=n.useState(""),[p,A]=n.useState(""),r=n.useCallback(async()=>{N(!0);const{data:s,error:t}=await g("get_open_token_alerts");t?(l.error("Kunde inte hämta alerts: "+t.message),f([])):f(s??[]),N(!1)},[]);n.useEffect(()=>{r()},[r]);const D=async()=>{var S;y(!0);const{data:s,error:t}=await g("scan_token_anomalies");if(y(!1),t){l.error("Skanning misslyckades: "+t.message);return}const L=((S=(s??[])[0])==null?void 0:S.alerts_created)??0;l.success(`Skanning klar — ${L} nya alerts`),r()},K=async()=>{if(!a)return;const{data:s,error:t}=await g("acknowledge_token_alert",{_alert_id:a.id,_note:_||null});if(t||!(s!=null&&s.ok)){l.error("Kvittering misslyckades");return}l.success("Alert kvitterad"),i(null),b(""),r()},j=h.filter(s=>{if(!p)return!0;const t=p.toLowerCase();return s.alert_type.includes(t)||(s.organization_name??"").toLowerCase().includes(t)||s.scope_key.toLowerCase().includes(t)}),w=h.filter(s=>s.status==="open").length;return e.jsxs("div",{className:"container mx-auto p-6 space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-semibold flex items-center gap-2",children:[e.jsx(E,{className:"h-6 w-6"})," Token-vakt"]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"Övervakar uppföljnings-tokens för replay-försök, opt-out-toppar och anomalier."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(c,{variant:"outline",size:"sm",onClick:r,disabled:u,children:[e.jsx(z,{className:`h-4 w-4 mr-2 ${u?"animate-spin":""}`}),"Uppdatera"]}),e.jsx(c,{size:"sm",onClick:D,disabled:k,children:k?"Skannar…":"Kör skanning nu"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[e.jsxs(o,{children:[e.jsx(d,{className:"pb-2",children:e.jsx(x,{className:"text-sm text-muted-foreground",children:"Öppna alerts"})}),e.jsx(m,{children:e.jsxs("div",{className:"text-3xl font-semibold flex items-center gap-2",children:[w>0&&e.jsx(B,{className:"h-6 w-6 text-destructive"}),w]})})]}),e.jsxs(o,{children:[e.jsx(d,{className:"pb-2",children:e.jsx(x,{className:"text-sm text-muted-foreground",children:"Totalt visat"})}),e.jsx(m,{children:e.jsx("div",{className:"text-3xl font-semibold",children:h.length})})]}),e.jsxs(o,{children:[e.jsx(d,{className:"pb-2",children:e.jsx(x,{className:"text-sm text-muted-foreground",children:"Cron"})}),e.jsx(m,{children:e.jsx("div",{className:"text-sm",children:"var 15:e min"})})]})]}),e.jsx(F,{placeholder:"Filtrera på typ, organisation eller scope…",value:p,onChange:s=>A(s.target.value),className:"max-w-md"}),e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs(x,{children:["Alerts (",j.length,")"]})}),e.jsx(m,{children:u?e.jsx("div",{className:"text-sm text-muted-foreground",children:"Hämtar…"}):j.length===0?e.jsxs("div",{className:"text-sm text-muted-foreground py-8 text-center",children:[e.jsx(R,{className:"h-8 w-8 mx-auto text-accent mb-2"}),"Inga alerts att visa."]}):e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"text-left text-muted-foreground border-b",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-2",children:"Typ"}),e.jsx("th",{className:"py-2",children:"Organisation / Scope"}),e.jsx("th",{className:"py-2",children:"Antal"}),e.jsx("th",{className:"py-2",children:"Tröskel"}),e.jsx("th",{className:"py-2",children:"Fönster"}),e.jsx("th",{className:"py-2",children:"Status"}),e.jsx("th",{className:"py-2"})]})}),e.jsx("tbody",{children:j.map(s=>{const t=T[s.alert_type]??{label:s.alert_type,tone:"secondary"};return e.jsxs("tr",{className:"border-b last:border-0 hover:bg-muted/30",children:[e.jsx("td",{className:"py-2",children:e.jsx(v,{variant:t.tone
1==="destructive"?"destructive":"secondary",children:t.label})}),e.jsx("td",{className:"py-2",children:s.organization_name??s.scope_key}),e.jsx("td",{className:"py-2 font-mono",children:s.event_count}),e.jsxs("td",{className:"py-2 font-mono text-muted-foreground",children:["≥ ",s.threshold]}),e.jsx("td",{className:"py-2 text-xs text-muted-foreground",children:new Date(s.window_start).toLocaleString("sv-SE")}),e.jsx("td",{className:"py-2",children:s.status==="open"?e.jsx(v,{variant:"destructive",children:"Öppen"}):e.jsx(v,{variant:"outline",children:"Kvitterad"})}),e.jsx("td",{className:"py-2 text-right",children:s.status==="open"&&e.jsx(c,{size:"sm",variant:"outline",onClick:()=>i(s),children:"Kvittera"})})]},s.id)})})]})})})]}),e.jsx(H,{open:!!a,onOpenChange:s=>!s&&i(null),children:e.jsxs(I,{children:[e.jsx(O,{children:e.jsx(M,{children:"Kvittera alert"})}),a&&e.jsxs("div",{className:"space-y-3",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:[((C=T[a.alert_type])==null?void 0:C.label)??a.alert_type," — ",a.event_count," händelser (tröskel ≥ ",a.threshold,")."]}),e.jsx(P,{placeholder:"Notering (valfritt)…",value:_,onChange:s=>b(s.target.value),rows:3})]}),e.jsxs($,{children:[e.jsx(c,{variant:"outline",onClick:()=>i(null),children:"Avbryt"}),e.jsx(c,{onClick:K,children:"Kvittera"})]})]})})]})}export{X 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.