1import{r,l as f,j as e,b as h,S as m,n as u,o as j,q as g,t as i,I as J,B as N,m as $,D as W,w as G,x as Q,y as Z,s as b}from"./index-BCH4IFx8.js";import{C as P,b as L,c as F,a as H}from"./card-DaE3Hwfn.js";import{T as X,a as Y,b as y,c as d,d as ee,e as t}from"./table-BgVITkDQ.js";import{f as V}from"./format-ybceeo2k.js";import"./en-US-CGO0aXMi.js";const se=["timing_lab_session_entries","timing_lab_laps","timing_lab_sessions","rfid_finalized_laps","rfid_race_sessions","timing_event_standings","timing_results","timing_laps","timing_race_entries"],k=100;function re(){const[x,w]=r.useState("all"),[S,p]=r.useState("all"),[E,I]=r.useState(""),[T,C]=r.useState("all"),[q,z]=r.useState("all"),[l,A]=r.useState({orgId:"all",eventId:"all",sessionId:"",tableName:"all",operation:"all"}),[a,D]=r.useState(null),{data:v}=f({queryKey:["results-audit","orgs"],queryFn:async()=>{const{data:s,error:n}=await b.from("organizations").select("id, name").order("name");if(n)throw n;return s??[]}}),{data:_}=f({queryKey:["results-audit","events",x],queryFn:async()=>{let s=b.from("timing_lab_events").select("id, name, event_date, organization_id").order("event_date",{ascending:!1,nullsFirst:!1}).limit(500);x!=="all"&&(s=s.eq("organization_id",x));const{data:n,error:o}=await s;if(o)throw o;return n??[]}}),{data:c,isLoading:O,isFetching:B}=f({queryKey:["results-audit","log",l],queryFn:async()=>{let s=b.from("results_audit_log").select("*").order("occurred_at",{ascending:!1}).limit(k);l.orgId!=="all"&&(s=s.eq("organization_id",l.orgId)),l.eventId!=="all"&&(s=s.eq("event_id",l.eventId)),l.sessionId.trim()&&(s=s.eq("session_id",l.sessionId.trim())),l.tableName!=="all"&&(s=s.eq("table_name",l.tableName)),l.operation!=="all"&&(s=s.eq("operation",l.operation));const{data:n,error:o}=await s;if(o)throw o;return n??[]}}),R=r.useMemo(()=>{const s=new Map;return(v??[]).forEach(n=>s.set(n.id,n.name)),s},[v]),M=r.useMemo(()=>{const s=new Map;return(_??[]).forEach(n=>s.set(n.id,n.name)),s},[_]),K=()=>A({orgId:x,eventId:S,sessionId:E,tableName:T,operation:q}),U=()=>{w("all"),p("all"),I(""),C("all"),z("all"),A({orgId:"all",eventId:"all",sessionId:"",tableName:"all",operation:"all"})};return e.jsxs("div",{className:"container mx-auto p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold",children:"Results Audit"}),e.jsx("p",{className:"text-muted-foreground text-sm",children:"Every write to finalized results tables. Super admin only."})]}),e.jsxs(P,{children:[e.jsx(L,{children:e.jsx(F,{className:"text-base",children:"Filters"})}
1),e.jsxs(H,{className:"grid gap-4 md:grid-cols-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(h,{children:"Organization"}),e.jsxs(m,{value:x,onValueChange:s=>{w(s),p("all")},children:[e.jsx(u,{children:e.jsx(j,{})}),e.jsxs(g,{children:[e.jsx(i,{value:"all",children:"All organizations"}),(v??[]).map(s=>e.jsx(i,{value:s.id,children:s.name},s.id))]})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(h,{children:"Event"}),e.jsxs(m,{value:S,onValueChange:p,children:[e.jsx(u,{children:e.jsx(j,{})}),e.jsxs(g,{children:[e.jsx(i,{value:"all",children:"All events"}),(_??[]).map(s=>e.jsxs(i,{value:s.id,children:[s.name,s.event_date?` â ${s.event_date}`:""]},s.id))]})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(h,{htmlFor:"session-id",children:"Session ID (optional)"}),e.jsx(J,{id:"session-id",placeholder:"uuid",value:E,onChange:s=>I(s.target.value)})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(h,{children:"Table"}),e.jsxs(m,{value:T,onValueChange:C,children:[e.jsx(u,{children:e.jsx(j,{})}),e.jsxs(g,{children:[e.jsx(i,{value:"all",children:"All tables"}),se.map(s=>e.jsx(i,{value:s,children:s},s))]})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(h,{children:"Operation"}),e.jsxs(m,{value:q,onValueChange:z,children:[e.jsx(u,{children:e.jsx(j,{})}),e.jsxs(g,{children:[e.jsx(i,{value:"all",children:"All"}),e.jsx(i,{value:"INSERT",children:"INSERT"}),e.jsx(i,{value:"UPDATE",children:"UPDATE"}),e.jsx(i,{value:"DELETE",children:"DELETE"})]})]})]}),e.jsxs("div",{className:"flex items-end gap-2",children:[e.jsx(N,{onClick:K,disabled:B,children:"Apply"}),e.jsx(N,{variant:"outline",onClick:U,children:"Reset"})]})]})]}),e.jsxs(P,{children:[e.jsx(L,{children:e.jsx(F,{className:"text-base",children:O?"Loadingâ¦":`${(c==null?void 0:c.length)??0} events (most recent ${k})`})}),e.jsx(H,{className:"overflow-x-auto",children:e.jsxs(X,{children:[e.jsx(Y,{children:e.jsxs(y,{children:[e.jsx(d,{children:"When"}),e.jsx(d,{children:"Op"}),e.jsx(d,{children:"Table"}),e.jsx(d,{children:"Row"}),e.jsx(d,{children:"Org"}),e.jsx(d,{children:"Event"}),e.jsx(d,{children:"Actor"}),e.jsx(d,{children:"Source"}),e.jsx(d,{})]})}),e.jsxs(ee,{children:[(c??[]).map(s=>{var n,o;return e.jsxs(y,{children:[e.jsx(t,{className:"whitespace-nowrap text-xs",children:V(new Date(s.occurred_at),"MMM d, yyyy HH:mm:ss")}),e.jsx(t,{children:e.jsx($,{variant:s.operation==="DELETE"?"destructive":s.operation==="UPDATE"?"default":"secondary",children:s.operation})}),e.jsx(t,{className:"font-mono text-xs",children:s.table_name}),e.jsx(t,{className:"font-mono text-xs",children:((n=s.row_pk)==null?void 0:n.slice(0,8))??"â"}),e.jsx(t,{className:"text-xs",children:s.organization_id?R.get(s.organization_id)??s.organization_id.slice(0,8):"â"}),e.jsx(t,{className:"text-xs",children:s.event_id?M.get(s.event_id)??s.event_id.slice(0,8):"â"}),e.jsx(t,{className:"text-xs",children:s.actor_email??((o=s.actor_user_id)==null?void 0:o.slice(0,8))??s.actor_role??"â"}),e.jsx(t,{className:"text-xs",children:s.source??"â"}),e.jsx(t,{children:e.jsx(N,{size:"sm",variant:"ghost",onClick:()=>D(s),children:"View"})})]},s.id)}),!O&&((c==null?void 0:c.length)??0)===0&&e.jsx(y,{children:e.jsx(t,{colSpan:9,className:"text-center text-muted-foreground py-8",children:"No audit entries match the filters."})})]})]})})]}),e.jsx(W,{open:!!a,onOpenChange:s=>!s&&D(null),children:e.jsxs(G,{className:"max-w-4xl max-h-[85vh] overflow-y-auto",children:[e.jsx(Q,{children:e.jsxs(Z,{children:[a==null?void 0:a.operation," on ",a==null?void 0:a.table_name]})}),a&&e.jsxs("div",{className:"space-y-4 text-xs",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"When:"})," ",V(new Date(a.occurred_at),"PPpp")]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Row PK:"})," ",a.row_pk??"â"]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Actor:"})," ",a.actor_email??a.actor_user_id??"â"]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Role:"})," ",a.actor_role??"â"]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Source:"})," ",a.source??"â"]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Org:"})," ",a.organization_id?R.get(a.organization_id)??a.organization_id:"â"]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Event:"})," ",a.event_id?M.get(a.event_id)??a.event_id:"â"]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Session:"})," ",a.session_id??"â"]}
1)]}),a.changed_fields&&e.jsxs("div",{children:[e.jsx("div",{className:"font-medium mb-1",children:"Changed fields"}),e.jsx("pre",{className:"bg-muted p-3 rounded overflow-x-auto",children:JSON.stringify(a.changed_fields,null,2)})]}),a.old_row&&e.jsxs("div",{children:[e.jsx("div",{className:"font-medium mb-1",children:"Previous row"}),e.jsx("pre",{className:"bg-muted p-3 rounded overflow-x-auto",children:JSON.stringify(a.old_row,null,2)})]}),a.new_row&&e.jsxs("div",{children:[e.jsx("div",{className:"font-medium mb-1",children:"New row"}),e.jsx("pre",{className:"bg-muted p-3 rounded overflow-x-auto",children:JSON.stringify(a.new_row,null,2)})]})]})]})})]})}export{re 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.