PageSourceSearch

https://yalla-africa.lovable.app/assets/CharterPricingAlerts-CGvhHT5h.js

js yalla-africa.lovable.app collected 2026-10-03 03:49:03 UTC 8,955 bytes, 2 lines download raw bytes

1import{aa as B,r as l,j as e,Y as H,g as y,bs as Q,a4 as d,ai as m,aj as x,a8 as h,L as W,D as b,N as k,_ as D,ab as Y}from"./index-DcYTpc4o.js";import{u as J}from"./untyped-Cqm2QZQJ.js";import{A as K}from"./AdminOnly-CAR1ujVL.js";import{S as E,a as q,b as I,c as R,d as T}from"./select-BYgXUA7u.js";import{d as X,t as Z}from"./csv-DdlUEiZ8.js";import{A as ee,r as V}from"./pricingGovernance-BLflD0xr.js";import{u as se}from"./useTableView-BTvAOxp2.js";import{D as te}from"./download-ItgXvEwv.js";import{G as ae}from"./gauge-B6uBbtlw.js";import{E as re}from"./external-link-BIjQpuyV.js";import"./index-D17hSi50.js";import"./index-CL314bJl.js";import"./chevron-up-Bh0rAdWG.js";const le=["all",...ee,"bus-charter","marine-charter","heavy-machinery-leasing"],ie=c=>c==="critical"?"destructive":c==="warning"?"secondary":"outline",n=(c,_)=>{const r=(c.context??{})[_];return r==null||r===""?"—":String(r)};function Ne(){const[c,_]=B(),[r,F]=l.useState([]),[u,$]=l.useState(null),[S,w]=l.useState(!0),[C,P]=l.useState(null),[p,G]=l.useState(c.get("slug")??"all"),[f,O]=l.useState("all"),[g,M]=l.useState(""),[j,U]=l.useState(""),A=async()=>{w(!0),P(null);const s=J;let t=s.from("alerts_events").select("id,severity,message,observed_value,threshold,context,created_at").eq("metric_key","charter.pricing_version_stale").order("created_at",{ascending:!1}).limit(500);p!=="all"&&(t=t.contains("context",{slug:p})),f!=="all"&&(t=t.eq("severity",f)),g&&(t=t.gte("created_at",new Date(g).toISOString())),j&&(t=t.lte("created_at",new Date(`${j}T23:59:59`).toISOString()));const[{data:N,error:o},i]=await Promise.all([t,s.from("charter_pricing_config").select("version,effective_at,created_at,actor_email,note").order("version",{ascending:!1}).limit(1).maybeSingle()]);o&&P(o.message),F(N??[]),$((i==null?void 0:i.data)??null),w(!1)},z=()=>{const s=`${g||"start"}_${j||"now"}`;X(`charter-pricing-stale-${p}-${s}.csv`,Z(r.map(t=>({created_at:t.created_at,severity:t.severity,slug:n(t,"slug"),category:n(t,"category"),quoted_version:n(t,"quoted_version"),active_version:n(t,"active_version"),last_publish_at:n(t,"last_publish_at"),observed_value:t.observed_value??"",threshold:t.threshold??"",message:t.message}))))};l.useEffect(()=>{A()},[p,f,g,j]);const v=l.useMemo(()=>{const s=new Map;let t=0,N=0;for(const o of r){const i=String((o.context??{}).slug??"unknown");s.set(i,(s.get(i)??0)+1),o.severity==="critical"&&(t+=1),V(i)||(N+=1)}return{total:r.length,critical:t,nonAviation:N,top:[...s.entries()].sort((o,i)=>i[1]-o[1]).slice(0,6)}},[r]),a=se(r,{created_at:s=>s.created_at,severity:s=>s.severity,slug:s=>String((s.context??{}).slug??""),observed_value:s=>s.observed_value??0},25),L=s=>{G(s);const t=new URLSearchParams(c);s==="all"?t.delete("slug"):t.set("slug",s),_(t,{replace:!0})};return e.jsx(K,{children:e.jsxs("div",{className:"p-6 space-y-6",children:[e.jsxs("header",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-semibold flex items-center gap-2",children:[e.jsx(H,{className:"h-5 w-5 text-primary"}),"Charter pricing staleness alerts"]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Every ",e.jsx("code",{children:"charter.pricing_version_stale"})," rejection, by category and time range. Any non-aviation occurrence is a category-offline regression."]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(y,{"data-analytics":"charterpricingalerts.export_csv",variant:"outline",onClick:z,disabled:!r.length,children:[e.jsx(te,{className:"mr-2 h-4 w-4"})," Export CSV"]}),e.jsxs(y,{variant:"outline",onClick:()=>void A(),disabled:S,children:[e.jsx(Q,{className:"mr-2 h-4 w-4"})," Refresh"]})]})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-4",children:[e.jsxs(d,{children:[e.jsx(m,{className:"pb-2",children:e.jsx(x,{className:"text-sm",children:"Alerts in range"})}),e.jsx(h,{className:"text-2xl font-semibold",children:v.total})]}),e.jsxs(d,{children:[e.jsx(m,{className:"pb-2",children:e.jsx(x,{className:"text-sm",children:"Critical"})}),e.jsx(h,{className:"text-2xl font-semibold text-destructive",children:v.critical})]}),e.jsxs(d,{children:[e.jsx(m,{className:"pb-2",children:e.jsx(x,{className:"text-sm",children:"Non-aviation (regression)"})}),e.jsx(h,{className:"text-2xl font-semibold text-destructive",children:v.nonAviation})]}),e.jsxs(d,{children:[e.jsx(m,{className:"pb-2",children:e.jsxs(x,{className:"text-sm flex items-center gap-2",children:[e.jsx(ae,{className:"h-4 w-4"})," Latest published pricing"]})}),e.jsxs(h,{className:"space-y-1 text-sm",children:[u?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-2xl font-semibold",children:["v",u.version]}),e.jsxs("div",{className:"text-muted-foreground",children:[new Date(u.effective_at??u.created_at).toLocaleStr
1ing(),u.actor_email?` · ${u.actor_email}`:""]})]}):e.jsx("div",{className:"text-muted-foreground",children:"No pricing published yet."}),e.jsxs(W,{to:"/dashboard/admin/flight-hub/pricing",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Pricing control ",e.jsx(re,{className:"h-3 w-3"})]})]})]})]}),e.jsxs(d,{children:[e.jsx(m,{className:"pb-3",children:e.jsx(x,{className:"text-base",children:"Filters"})}),e.jsxs(h,{className:"grid gap-3 md:grid-cols-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(b,{children:"Category slug"}),e.jsxs(E,{value:p,onValueChange:L,children:[e.jsx(q,{children:e.jsx(I,{})}),e.jsx(R,{children:le.map(s=>e.jsx(T,{value:s,children:s==="all"?"All categories":s},s))})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(b,{children:"Severity"}),e.jsxs(E,{value:f,onValueChange:O,children:[e.jsx(q,{children:e.jsx(I,{})}),e.jsx(R,{children:["all","info","warning","critical"].map(s=>e.jsx(T,{value:s,children:s==="all"?"All severities":s},s))})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(b,{htmlFor:"from",children:"From"}),e.jsx(k,{id:"from",type:"date",value:g,onChange:s=>M(s.target.value)})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(b,{htmlFor:"to",children:"To"}),e.jsx(k,{id:"to",type:"date",value:j,onChange:s=>U(s.target.value)})]})]})]}),v.top.length>0&&e.jsxs(d,{children:[e.jsx(m,{className:"pb-3",children:e.jsx(x,{className:"text-base",children:"Rejections by slug"})}),e.jsx(h,{className:"flex flex-wrap gap-2",children:v.top.map(([s,t])=>e.jsxs(D,{variant:V(s)?"secondary":"destructive",className:"cursor-pointer",onClick:()=>L(s),children:[s,": ",t]},s))})]}),e.jsxs(d,{children:[e.jsx(m,{className:"pb-3",children:e.jsx(x,{className:"text-base",children:"Recent quote_create rejections"})}),e.jsxs(h,{className:"space-y-3",children:[C&&e.jsx("p",{className:"text-sm text-destructive",children:C}),S?e.jsx("div",{className:"space-y-2",children:[0,1,2,3].map(s=>e.jsx(Y,{className:"h-10 w-full"},s))}):a.rows.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:"No staleness alerts in this range."}):e.jsxs("div",{className:"overflow-x-auto",children:[e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"text-left text-muted-foreground",children:e.jsxs("tr",{children:[[["created_at","When"],["slug","Slug"],["severity","Severity"],["observed_value","In window"]].map(([s,t])=>e.jsx("th",{className:"py-2 pr-4",children:e.jsx("button",{className:"hover:underline",onClick:()=>a.toggleSort(s),children:t})},s)),e.jsx("th",{className:"py-2 pr-4",children:"Quoted → active"}),e.jsx("th",{className:"py-2 pr-4",children:"Last publish"}),e.jsx("th",{className:"py-2",children:"Message"})]})}),e.jsx("tbody",{children:a.rows.map(s=>e.jsxs("tr",{className:"border-t border-border/60 align-top",children:[e.jsx("td",{className:"py-2 pr-4 whitespace-nowrap",children:new Date(s.created_at).toLocaleString()}),e.jsx("td",{className:"py-2 pr-4",children:n(s,"slug")}),e.jsx("td",{className:"py-2 pr-4",children:e.jsx(D,{variant:ie(s.severity),children:s.severity})}),e.jsx("td",{className:"py-2 pr-4",children:s.observed_value??"—"}),e.jsxs("td",{className:"py-2 pr-4 whitespace-nowrap",children:["v",n(s,"quoted_version")," → v",n(s,"active_version")]}),e.jsx("td",{className:"py-2 pr-4 whitespace-nowrap",children:(s.context??{}).last_published_at?new Date(String((s.context??{}).last_published_at)).toLocaleString():"—"}),e.jsx("td",{className:"py-2 text-muted-foreground",children:s.message})]},s.id))})]}),e.jsxs("div",{className:"flex items-center justify-between pt-3 text-sm text-muted-foreground",children:[e.jsxs("span",{children:["Page ",a.info.page," of ",a.info.pageCount]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(y,{size:"sm",variant:"outline",disabled:a.page<=1,onClick:()=>a.setPage(a.page-1),children:"Previous"}),e.jsx(y,{size:"sm",variant:"outline",disabled:a.page>=a.info.pageCount,onClick:()=>a.setPage(a.page+1),children:"Next"})]})]})]})]})]})]})})}export{Ne as default};
2//# sourceMappingURL=CharterPricingAlerts-CGvhHT5h.js.map

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.