PageSourceSearch

https://uzonachamber.org/assets/AdminCommandCenter-BKET6S4Z.js

js uzonachamber.org collected 2026-10-04 10:39:12 UTC 35,362 bytes, 4 lines download raw bytes

1import{aw as e,ct as O,dO as se,d4 as te,b2 as F,bM as g,bz as ae,dc as oe,bA as ie,dP as me,dL as q,dd as xe,bJ as ne,cN as ue,da as he,d6 as pe,dQ as ge,cT as je,cI as fe,r as I,bN as ye,dR as Ne,dS as be,cU as ve,d8 as we,ce as Ce,d9 as ke,dT as Te,dU as Se,cD as Re,b3 as Q,dV as E,cS as J,dW as Z,dJ as X,cJ as $e,cO as Fe,c0 as Ae}from"./vendor-Dv8DySgF.js";import{C as x,a as h,B as S,f as y,u as De,c as R,d as $,b as Ie,e as Le,g as Y}from"./index-DzfKy7jS.js";import{T as Me,a as Ue,b as A,c as D}from"./tabs-DqADLGll.js";import{T as K,a as V,b,c as u,d as _,e as m}from"./table-CjJPNzTm.js";import{A as Pe,a as Ee,b as Oe,c as qe,d as Ke,e as Ve,f as _e,g as Be}from"./alert-dialog-0ssEK394.js";import{D as ze,a as Ge}from"./DashboardLineChart-CCV2x7R2.js";import{R as We,t as He}from"./ReportDateRangePicker-DgRGSk78.js";import{R as Qe,P as Je,e as Ze,f as Xe,T as Ye}from"./vendor-charts-C85SCl_A.js";import"./vendor-zod-EJO41mb4.js";import"./vendor-dates-DjYGpBD-.js";import"./vendor-pdf-BWZ7rE8i.js";import"./calendar-BUf06FiT.js";function f(a){const i=Number(a??0);return i>=1e6?`${(i/1e6).toFixed(1)}M`:i>=1e3?`${(i/1e3).toFixed(1)}K`:i.toLocaleString()}function T(a){return`$${Number(a??0).toFixed(2)}`}function k({title:a,value:i,icon:d,delta:t,isCurrency:s,testId:l}){const r=s?T(i):f(i);return e.jsx(x,{children:e.jsxs(h,{className:"p-4 flex items-center gap-3",children:[e.jsx("div",{className:"rounded-md bg-muted p-2 flex-shrink-0",children:e.jsx(d,{className:"h-5 w-5 text-muted-foreground"})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"text-xs text-muted-foreground truncate",children:a}),e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[e.jsx("p",{className:"text-xl font-bold tabular-nums","data-testid":l,children:r}),typeof t=="number"&&e.jsxs("span",{className:`inline-flex items-center gap-0.5 text-xs tabular-nums ${t>0?"text-green-600 dark:text-green-400":t<0?"text-red-600 dark:text-red-400":"text-muted-foreground"}`,"data-testid":`${l}-delta`,children:[t>0?e.jsx(O,{className:"h-3 w-3"}):t<0?e.jsx(se,{className:"h-3 w-3"}):e.jsx(te,{className:"h-3 w-3"}),t>0?"+":"",t.toFixed(0),"%"]})]})]})]})})}function L(a){return He(a)}function es({value:a,onChange:i,className:d}){return e.jsx(We,{value:a,onChange:i,className:d,align:"end",triggerTestId:"dashboard-date-picker"})}function ss({dateRange:a,enabled:i}){const{dateFrom:d,dateTo:t}=L(a),{data:s,isLoading:l,isError:r,refetch:n}=F({queryKey:["/api/admin/dashboard/summary",d,t],queryFn:()=>fetch(`/api/admin/dashboard/summary?dateFrom=${encodeURIComponent(d)}&dateTo=${encodeURIComponent(t)}`).then(c=>c.json()),enabled:i,refetchInterval:6e4});return r?e.jsx("div",{className:"sticky top-0 z-30 bg-background py-3 -mx-6 px-6 border-b","data-testid":"kpi-strip-error",children:e.jsxs("div",{className:"flex items-center justify-center gap-3 h-16",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"Failed to load KPIs."}),e.jsx("button",{onClick:()=>n(),className:"text-xs underline text-muted-foreground hover:text-foreground","data-testid":"button-retry-kpi",children:"Retry"})]})}):l||!s?e.jsx("div",{className:"sticky top-0 z-30 bg-background py-3 -mx-6 px-6 border-b","data-testid":"kpi-strip",children:e.jsx("div",{className:"flex items-center justify-center h-16",children:e.jsx(g,{className:"h-5 w-5 animate-spin text-muted-foreground"})})}):e.jsx("div",{className:"sticky top-0 z-30 bg-background py-3 -mx-6 px-6 border-b","data-testid":"kpi-strip",children:e.jsxs("div",{className:"grid gap-3 grid-cols-2 sm:grid-cols-3 lg:grid-cols-6",children:[e.jsx(ae,{href:"/admin/directory/accounts",className:"block hover-elevate rounded-md",children:e.jsx(k,{title:"Total Accounts",value:s.totalAccounts,icon:oe,delta:s.accountsDelta,testId:"kpi-total-accounts"})}),e.jsx(k,{title:"Active Listings",value:s.totalListings,icon:ie,delta:s.listingsDelta,testId:"kpi-active-listings"}),e.jsx(k,{title:"Upgrades (Period)",value:s.upgradesThisMonth,icon:me,delta:s.upgradesDelta,testId:"kpi-upgrades-mtd"}),e.jsx(k,{title:"Visitors (Period)",value:s.visitorsToday,icon:q,delta:s.visitorsDelta,testId:"kpi-visitors-today"}),e.jsx(k,{title:"Ad Spend (Period)",value:s.adSpendMTD,icon:xe,delta:s.adSpendDelta,isCurrency:!0,testId:"kpi-ad-spend-mtd"}),e.jsx(k,{title:"Actions (Period)",value:s.actionsToday,icon:ne,delta:s.actionsDelta,testId:"kpi-actions-today"})]})})}const ts={visitors:q,signups:ge,listings_created:ie,listings_live:je,qr_orders:fe},as={visitors:"hsl(var(--chart-1))",signups:"hsl(var(--chart-2))",listings_created:"hsl(var(--chart-3))",listings_live:"hsl(var(--chart-4))",qr_orders:"hsl(var(--chart-5))"};function is(a,i,d){const t=i===d;switch(a){case"listings_created":return t?"/admin/directory/listings?entityType=business&createdPeriod=today&sortBy=createdAt&sortOrder=desc":"/admin/directory/listings?entityType=business&sortBy=createdAt&sortOrder=desc";case"listings_live":return t?"/admin/directory/listings?entityType=business&publishStatus=published&hasDescription=yes&hasCatalogImage=yes&updatedPeriod=today&sortBy=updatedAt&sortOrder=desc":"/admin/directory/listings?entityType=business&publishStatus=published&hasDescription=yes&hasCatalogImage=yes&sortBy=updatedAt&sortOrder=desc";case"signups":return"/admin/directory/accounts";case"qr_orders":return"/admin/orders";default:return}}function ns({data:a,color:i}){if(a.length<2)return null;const d=Math.max(...a,1),t=72,s=22,l=a.map((r,n)=>`${n/(a.length-1)*t},${s-r/d*s}`).join(" ");return e.jsx("svg",{width:t,height:s,className:"inline-block","data-testid":"sparkline-trend",children:e.jsx("polyline",{fill:"none",stroke:i,strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",points:l})})}function rs({today:a,avg:i}){if(i===0)return a>0?e.jsx(y,{variant:"secondary",className:"text-xs tabular-nums",children:"New"}):null;const d=Math.round((a-i)/i*100),t=d>0,s=d===0;return e.jsxs("span",{className:`inline-flex items-center gap-0.5 text-xs font-semibold tabular-nums ${s?"text-muted-foreground":t?"text-green-600 dark:text-green-400":"text-red-500 dark:text-red-400"}`,"data-testid":"delta-badge",children:[s?e.jsx(te,{className:"h-3 w-3"}):t?e.jsx(O,{className:"h-3 w-3"}):e.jsx(se,{className:"h-3 w-3"}),s?"avg":`${t?"+":""}${d}%`]})}function ds(a,i){return i===0?"—":`${Math.round(a/i*1e3)/10}%`}function ls(a,i){return i===0?"—":`${Math.round(a/i*1e3)/10}%`}function cs({step:a,prevStep:i,dateFrom:d,dateTo:t}){const s=ts[a.key]??q,l=as[a.key],r=is(a.key,d,t),n=e.jsxs(h,{className:"p-3 sm:p-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3 flex-wrap",children:[e.jsxs("div",{className:"flex items-center gap-2.5 min-w-0",children:[e.jsx("div",{className:"shrink-0 rounded-md p-1.5",style:{backgroundColor:`${l}22`},children:e.jsx(s,{className:"h-4 w-4",style:{color:l}})}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("p",{className:"text-xs text-muted-foreground font-medium",children:a.label}
1),r&&e.jsx(he,{className:"h-3 w-3 text-muted-foreground/50"})]}),e.jsxs("div",{className:"flex items-baseline gap-2 flex-wrap",children:[e.jsx("span",{className:"text-2xl font-bold tabular-nums","data-testid":`funnel-today-${a.key}`,children:a.today.toLocaleString()}),e.jsx(rs,{today:a.today,avg:a.avg30d})]})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-1 shrink-0",children:[e.jsx(ns,{data:a.trend14d,color:l}),e.jsxs("span",{className:"text-xs text-muted-foreground tabular-nums",children:["prior avg ",a.avg30d%1===0?a.avg30d:a.avg30d.toFixed(1),"/day"]})]})]}),i&&e.jsxs("div",{className:"mt-2 pt-2 border-t flex items-center gap-2 text-xs text-muted-foreground flex-wrap",children:[e.jsxs("span",{children:["Conversion from ",i.label,":"," ",e.jsx("span",{className:"font-semibold text-foreground","data-testid":`conversion-today-${a.key}`,children:ds(a.today,i.today)})," (period)"]}),e.jsx("span",{className:"text-muted-foreground/50",children:"·"}),e.jsxs("span",{children:["prior avg"," ",e.jsx("span",{className:"font-medium",children:ls(a.avg30d,i.avg30d)})]})]})]});return e.jsx("div",{className:"flex items-center gap-3 sm:gap-4","data-testid":`funnel-row-${a.key}`,children:e.jsx("div",{className:"flex-1 min-w-0",children:r?e.jsx(ae,{href:r,children:e.jsx(x,{className:"border hover-elevate cursor-pointer",children:n})}):e.jsx(x,{className:"border",children:n})})})}function os(){return e.jsx("div",{className:"flex justify-start pl-5","aria-hidden":!0,children:e.jsx(pe,{className:"h-4 w-4 text-muted-foreground/40"})})}function ms({enabled:a,dateRange:i}){const{dateFrom:d,dateTo:t}=L(i),{data:s,isLoading:l,isError:r,refetch:n,isFetching:c,dataUpdatedAt:p}=F({queryKey:["/api/admin/dashboard/today-funnel",d,t],queryFn:()=>fetch(`/api/admin/dashboard/today-funnel?dateFrom=${encodeURIComponent(d)}&dateTo=${encodeURIComponent(t)}`).then(j=>{if(!j.ok)throw new Error(j.statusText||`Request failed with status ${j.status}`);return j.json()}),enabled:a,staleTime:2*60*1e3,refetchInterval:5*60*1e3}),v=p?new Date(p).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):null;if(l)return e.jsx("div",{className:"flex items-center justify-center py-16","data-testid":"loading-today-funnel",children:e.jsx(g,{className:"h-7 w-7 animate-spin text-muted-foreground"})});if(r||!s||!Array.isArray(s.steps))return e.jsxs("div",{className:"flex flex-col items-center justify-center py-16 gap-3","data-testid":"error-today-funnel",children:[e.jsx("p",{className:"text-muted-foreground text-sm",children:"Failed to load signup funnel."}),e.jsx(S,{variant:"outline",size:"sm",onClick:()=>n(),children:"Retry"})]});const w=i.from.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"})+(i.from.toDateString()!==i.to.toDateString()?" – "+i.to.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}):"");return e.jsxs("div",{className:"space-y-1","data-testid":"today-funnel-tab",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3 flex-wrap gap-2",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-semibold",children:w}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Selected period vs equivalent prior period (daily avg)"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[v&&e.jsxs("span",{className:"text-xs text-muted-foreground",children:["Updated ",v]}),e.jsxs(S,{variant:"outline",size:"sm",onClick:()=>n(),disabled:c,"data-testid":"button-refresh-funnel",className:"gap-1.5",children:[e.jsx(ue,{className:`h-3.5 w-3.5 ${c?"animate-spin":""}`}),"Refresh"]})]})]}),e.jsx("div",{className:"space-y-1",children:s.steps.map((j,C)=>e.jsxs("div",{children:[C>0&&e.jsx(os,{}),e.jsx(cs,{step:j,prevStep:C>0?s.steps[C-1]:void 0,dateFrom:d,dateTo:t})]},j.key))}),e.jsx("p",{className:"text-xs text-muted-foreground pt-2",children:'"Profile Complete" = listing published with image & description. All times Mountain (America/Denver).'})]})}function xs(){const a=new Intl.DateTimeFormat("en-CA",{timeZone:"America/Denver"}).format(new Date),[i,d,t]=a.split("-").map(Number),s=new Date(Date.UTC(i,d-1,t));return{from:s,to:s}}function us({data:a,color:i="hsl(var(--chart-1))"}){if(a.length<2)return null;const d=Math.max(...a),t=Math.min(...a),s=d-t||1,l=80,r=24,n=a.map((c,p)=>`${p/(a.length-1)*l},${r-(c-t)/s*r}`).join(" ");return e.jsx("svg",{width:l,height:r,className:"inline-block","data-testid":"mini-sparkline",children:e.jsx("polyline",{fill:"none",stroke:i,strokeWidth:"1.5",points:n})})}function re({title:a,summaryValue:i,sparklineData:d,sparklineColor:t,children:s}
1){const[l,r]=I.useState(!1);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"md:hidden",children:[e.jsxs(S,{variant:"outline",className:"w-full justify-between gap-2",onClick:()=>r(!l),"data-testid":`toggle-chart-${a.toLowerCase().replace(/\s+/g,"-")}`,children:[e.jsx("span",{className:"text-sm truncate",children:a}),e.jsxs("span",{className:"flex items-center gap-2",children:[!l&&i&&e.jsx("span",{className:"text-xs font-semibold tabular-nums text-muted-foreground","data-testid":"chart-summary-value",children:i}),!l&&d&&d.length>=2&&e.jsx(us,{data:d,color:t}),l?e.jsx(Fe,{className:"h-4 w-4"}):e.jsx(Ae,{className:"h-4 w-4"})]})]}),l&&e.jsx("div",{className:"mt-3",children:s})]}),e.jsx("div",{className:"hidden md:block",children:s})]})}const ee={FREE:"hsl(var(--chart-1))",PREMIUM:"hsl(var(--chart-2))",FEATURED:"hsl(var(--chart-3))",ENTERPRISE:"hsl(var(--chart-4))"};function U({title:a,icon:i,data:d,testId:t}){const s=d.periodDelta;return e.jsx(x,{children:e.jsxs(h,{className:"p-4 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(i,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("p",{className:"text-sm font-medium",children:a})]}),e.jsxs("div",{className:"flex items-baseline gap-3","data-testid":t,children:[e.jsx("p",{className:"text-2xl font-bold tabular-nums",children:d.today.toLocaleString()}),s!=null&&e.jsxs("span",{className:`text-sm tabular-nums font-medium ${s>=0?"text-green-600 dark:text-green-400":"text-red-600 dark:text-red-400"}`,children:[s>0?"+":"",Number(s).toFixed(0),"% vs prior"]})]})]})})}function hs({enabled:a,dateRange:i}){var n;const{dateFrom:d,dateTo:t}=L(i),{data:s,isLoading:l}=F({queryKey:["/api/admin/dashboard/growth",d,t],queryFn:()=>fetch(`/api/admin/dashboard/growth?dateFrom=${encodeURIComponent(d)}&dateTo=${encodeURIComponent(t)}`).then(c=>c.json()),enabled:a});if(l||!s)return e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx(g,{className:"h-6 w-6 animate-spin"})});const r=s.tierDistribution.reduce((c,p)=>c+p.count,0);return e.jsxs("div",{className:"space-y-6",children:[e.jsx(re,{title:"Growth Chart",summaryValue:`${f(((n=s.series[s.series.length-1])==null?void 0:n.accounts)??0)} accts`,sparklineData:s.series.map(c=>c.accounts),sparklineColor:"hsl(var(--chart-1))",children:e.jsx(ze,{title:"Growth (Accounts / Listings / Upgrades)",description:"Accounts reflects only password-enabled sign-ups (excludes admin-created/imported accounts)",data:s.series,series:[{dataKey:"accounts",name:"Accounts",color:"hsl(var(--chart-1))"},{dataKey:"listings",name:"Listings",color:"hsl(var(--chart-2))"},{dataKey:"upgrades",name:"Upgrades",color:"hsl(var(--chart-3))"}],testId:"chart-growth-series"})}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsxs(x,{children:[e.jsx(R,{className:"pb-2",children:e.jsx($,{className:"text-sm font-medium",children:"Recent Sign-ups"})}),e.jsx(h,{children:s.recentSignups.length===0?e.jsx("p",{className:"text-sm text-muted-foreground py-4 text-center",children:"No recent sign-ups"}):e.jsx("div",{className:"overflow-x-auto -mx-4 px-4 md:mx-0 md:px-0",children:e.jsxs(K,{children:[e.jsx(V,{children:e.jsxs(b,{children:[e.jsx(u,{children:"Name"}),e.jsx(u,{children:"Tier"}),e.jsx(u,{className:"text-right",children:"Listings"}),e.jsx(u,{children:"Joined"})]})}),e.jsx(_,{children:s.recentSignups.map(c=>e.jsxs(b,{"data-testid":`signup-row-${c.id}`,children:[e.jsx(m,{className:"font-medium truncate max-w-[200px]",children:c.firstName||c.lastName?`${c.firstName||""} ${c.lastName||""}`.trim():c.email}),e.jsx(m,{children:e.jsx(y,{variant:"secondary",children:c.tier})}),e.jsx(m,{className:"text-right tabular-nums",children:c.listingCount}),e.jsx(m,{className:"text-muted-foreground text-xs tabular-nums",children:new Date(c.createdAt).toLocaleDateString("en-US",{month:"short",day:"numeric"})})]},c.id))})]})})})]}),e.jsxs(x,{children:[e.jsx(R,{className:"pb-2",children:e.jsx($,{className:"text-sm font-medium",children:"Tier Distribution"})}),e.jsx(h,{children:e.jsxs("div",{className:"flex items-center gap-6",children:[e.jsx("div",{className:"w-40 h-40",children:e.jsx(Qe,{width:"100%",height:"100%",children:e.jsxs(Je,{children:[e.jsx(Ze,{data:s.tierDistribution,dataKey:"count",nameKey:"tier",cx:"50%",cy:"50%",innerRadius:35,outerRadius:65,paddingAngle:2,children:s.tierDistribution.map(c=>e.jsx(Xe,{fill:ee[c.tier]||"hsl(var(--chart-5))"},c.tier))}),e.jsx(Ye,{contentStyle:{borderRadius:6,fontSize:12}})]})})}),e.jsx("div",{className:"space-y-2 flex-1",children:s.tierDistribution.map(c=>{const p=r>0?(c.count/r*100).toFixed(1):"0";return e.jsxs("div",{className:"flex items-center gap-2 text-sm","data-testid":`tier-row-${c.tier}`,children:[e.jsx("span",{className:"inline-block w-2.5 h-2.5 rounded-full flex-shrink-0",style:{backgroundColor:ee[c.tier]||"hsl(var(--chart-5))"}}),e.jsx("span",{className:"flex-1 truncate",children:c.tier}),e.jsx("span",{className:"tabular-nums text-muted-foreground",children:c.count}),e.jsxs("span",{className:"tabular-nums text-muted-foreground text-xs",children:["(",p,"%)"]})]},c.tier)})})]})})]})]})]})}function ps({enabled:a,dateRange:i}){const{dateFrom:d,dateTo:t}=L(i),{data:s,isLoading:l}=F({queryKey:["/api/admin/dashboard/engagement",d,t],queryFn:()=>fetch(`/api/admin/dashboard/engagement?dateFrom=${encodeURIComponent(d)}&dateTo=${encodeURIComponent(t)}`).then(r=>r.json()),enabled:a});return l||!s?e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx(g,{className:"h-6 w-6 animate-spin"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[e.jsx(U,{title:"Phone Calls",icon:ne,data:s.actions.call,testId:"action-call"}),e.jsx(U,{title:"Website Clicks",icon:ke,data:s.actions.website,testId:"action-website"}),e.jsx(U,{title:"Directions",icon:Te,data:s.actions.directions,testId:"action-directions"}),e.jsx(U,{title:"Favorites",icon:Se,data:s.actions.favorite,testId:"action-favorite"})]}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsxs(x,{children:[e.jsx(R,{className:"pb-2",children:e.jsx($,{className:"text-sm font-medium",children:"Top 5 Cities by Visitors"})}),e.jsx(h,{children:e.jsx("div",{className:"space-y-1.5",children:s.topCities.length===0?e.jsx("p",{className:"text-sm text-muted-foreground py-4 text-center",children:"No city data yet"}):s.topCities.map((r,n)=>e.jsxs("div",{className:"flex items-center justify-between gap-2 text-sm py-1","data-testid":`city-row-${n}`,children:[e.jsxs("span",{className:"truncate",children:[r.city,", ",r.state.toUpperCase()]}),e.jsx(y,{variant:"secondary",className:"tabular-nums flex-shrink-0",children:f(r.sessions)})]},`${r.state}-${r.city}`))})})]}),e.jsxs(x,{children:[e.jsx(R,{className:"pb-2",children:e.jsx($,{className:"text-sm font-medium",children:"Top 5 Listings by Engagement"})}),e.jsx(h,{children:e.jsx("div",{className:"space-y-1.5",children:s.topListings.length===0?e.jsx("p",{className:"text-sm text-muted-foreground py-4 text-center",children:"No listing data yet"}):s.topListings.map((r,n)=>e.jsxs("div",{className:"flex items-center justify-between gap-2 text-sm py-1","data-testid":`listing-row-${n}`,children:[e.jsx("span",{className:"truncate flex-1",children:r.name||`Listing #${r.wyitId}`}),e.jsxs(y,{variant:"secondary",className:"tabular-nums flex-shrink-0",children:[f(r.actions)," actions"]})]},r.wyitId))})})]})]})]})}function gs({enabled:a}){var C,B,z,G,W;const{toast:i}
1=Ie(),d=Re(),[t,s]=I.useState(null),[l,r]=I.useState(!1),{data:n,isLoading:c}=F({queryKey:["/api/admin/tools/migrate-cloudinary"],enabled:a,refetchInterval:!1}),p=Q({mutationFn:()=>Y("POST","/api/admin/tools/migrate-cloudinary?dryRun=true"),onSuccess:o=>{s(o),i({title:"Dry run complete",description:`Would migrate ${o.migrated} listing field(s) and ${o.cityMigrated??0} city hero image(s).`})},onError:o=>{i({title:"Dry run failed",description:o.message,variant:"destructive"})}}),v=Q({mutationFn:()=>Y("POST","/api/admin/tools/migrate-cloudinary"),onSuccess:o=>{s(o),d.invalidateQueries({queryKey:["/api/admin/tools/migrate-cloudinary"]}),i({title:"Migration complete",description:`Listings: migrated ${o.migrated}, skipped ${o.skipped}, failed ${o.failed}. Cities: migrated ${o.cityMigrated??0}, skipped ${o.citySkipped??0}, failed ${o.cityFailed??0}.`})},onError:o=>{i({title:"Migration failed",description:o.message,variant:"destructive"})}}),w=p.isPending||v.isPending;function j(o){const M=`listing_id,name,city,state,field,url,reason
2`,de=o.map(N=>[N.listingId,N.name,N.city,N.state,N.field,N.url,N.reason].map(ce=>`"${String(ce).replace(/"/g,'""')}"`).join(",")).join(`
3`),le=new Blob([M+de+`
4`],{type:"text/csv"}),H=URL.createObjectURL(le),P=document.createElement("a");P.href=H,P.download="cloudinary-migration-failures.csv",P.click(),URL.revokeObjectURL(H)}return e.jsxs("div",{className:"space-y-6","data-testid":"tab-content-maintenance",children:[e.jsxs(x,{"data-testid":"card-cloudinary-migration",children:[e.jsxs(R,{className:"pb-3",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{className:"h-5 w-5 text-muted-foreground"}),e.jsx($,{className:"text-base",children:"Cloudinary Migration"})]}),c?e.jsx(g,{className:"h-4 w-4 animate-spin text-muted-foreground"}):e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs(y,{variant:((n==null?void 0:n.cloudinaryCount)??1)===0?"secondary":"destructive","data-testid":"badge-cloudinary-count",children:[(n==null?void 0:n.cloudinaryCount)??"?"," listings"]}),e.jsxs(y,{variant:((n==null?void 0:n.cityCloudinaryCount)??1)===0?"secondary":"destructive","data-testid":"badge-city-cloudinary-count",children:[(n==null?void 0:n.cityCloudinaryCount)??"?"," cities"]})]})]}),e.jsx(Le,{children:"Copies images from Cloudinary into GCS for listing cover/logo images and city page hero images, then rewrites the DB URLs. Idempotent — already-migrated images are skipped."})]}),e.jsxs(h,{className:"space-y-4",children:[e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsxs(S,{variant:"outline",onClick:()=>p.mutate(),disabled:w,"data-testid":"button-cloudinary-dry-run",children:[p.isPending?e.jsx(g,{className:"h-4 w-4 animate-spin mr-2"}):null,"Dry Run"]}),e.jsxs(S,{variant:"destructive",onClick:()=>r(!0),disabled:w||(n==null?void 0:n.cloudinaryCount)===0&&(n==null?void 0:n.cityCloudinaryCount)===0,"data-testid":"button-cloudinary-run",children:[v.isPending?e.jsx(g,{className:"h-4 w-4 animate-spin mr-2"}):null,"Run Migration"]})]}),w&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground","data-testid":"migration-running",children:[e.jsx(g,{className:"h-4 w-4 animate-spin"}),"Migration in progress — this may take several minutes…"]}),t&&!w&&e.jsxs("div",{className:"space-y-4","data-testid":"migration-results",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm font-medium",children:t.dryRun?"Dry Run Results":"Migration Results"}),t.dryRun&&e.jsx(y,{variant:"secondary",className:"text-xs",children:"No changes made"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("p",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wide",children:"Listings"}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[e.jsxs("div",{className:"rounded-md border p-3 text-center space-y-1",children:[e.jsx(J,{className:"h-5 w-5 text-green-600 dark:text-green-400 mx-auto"}),e.jsx("p",{className:"text-xl font-bold tabular-nums","data-testid":"result-migrated",children:t.migrated}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t.dryRun?"Would migrate":"Migrated"})]}),e.jsxs("div",{className:"rounded-md border p-3 text-center space-y-1",children:[e.jsx(Z,{className:"h-5 w-5 text-muted-foreground mx-auto"}),e.jsx("p",{className:"text-xl font-bold tabular-nums","data-testid":"result-skipped",children:t.skipped}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Already done"})]}),e.jsxs("div",{className:"rounded-md border p-3 text-center space-y-1",children:[e.jsx(X,{className:"h-5 w-5 text-destructive mx-auto"}),e.jsx("p",{className:"text-xl font-bold tabular-nums","data-testid":"result-failed",children:t.failed}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Failed"})]}),e.jsxs("div",{className:"rounded-md border p-3 text-center space-y-1",children:[e.jsx(E,{className:"h-5 w-5 text-muted-foreground mx-auto"}),e.jsx("p",{className:"text-xl font-bold tabular-nums","data-testid":"result-remaining",children:t.remaining}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Still Cloudinary"})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("p",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wide",children:"City Pages"}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[e.jsxs("div",{className:"rounded-md border p-3 text-center space-y-1",children:[e.jsx(J,{className:"h-5 w-5 text-green-600 dark:text-green-400 mx-auto"}),e.jsx("p",{className:"text-xl font-bold tabular-nums","data-testid":"result-city-migrated",children:t.cityMigrated??0}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t.dryRun?"Would migrate":"Migrated"})]}),e.jsxs("div",{className:"rounded-md border p-3 text-center space-y-1",children:[e.jsx(Z,{className:"h-5 w-5 text-muted-foreground mx-auto"}),e.jsx("p",{className:"text-xl font-bold tabular-nums","data-testid":"result-city-skipped",children:t.citySkipped??0}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Already done"})]}),e.jsxs("div",{className:"rounded-md border p-3 text-center space-y-1",children:[e.jsx(X,{className:"h-5 w-5 text-destructive mx-auto"}),e.jsx("p",{className:"text-xl font-bold tabular-nums","data-testid":"result-city-failed",children:t.cityFailed??0}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Failed"})]}),e.jsxs("div",{className:"rounded-md border p-3 text-center space-y-1",children:[e.jsx(E,{className:"h-5 w-5 text-muted-foreground mx-auto"}),e.jsx("p",{className:"text-xl font-bold tabular-nums","data-testid":"result-city-remaining",children:t.cityRemaining??0}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Still Cloudinary"})]})]})]}),(t.failures.length>0||(((C=t.cityFailures)==null?void 0:C.length)??0)>0)&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("p",{className:"text-sm font-medium text-destructive",children:[t.failures.length+(((B=t.cityFailures)==null?void 0:B.length)??0)," failure",t.failures.length+(((z=t.cityFailures)==null?void 0:z.length)??0)!==1?"s":""]}),e.jsxs(S,{variant:"outline",size:"sm",onClick:()=>j([...t.failures,...t.cityFailures??[]]),"data-testid":"button-download-failures",children:[e.jsx($e,{className:"h-3.5 w-3.5 mr-1.5"}),"Download CSV"]})]}),e.jsx("div",{className:"overflow-x-auto -mx-4 px-4 md:mx-0 md:px-0",children:e.jsxs(K,{children:[e.jsx(V,{children:e.jsxs(b,{children:[e.jsx(u,{children:"Item"}),e.jsx(u,{children:"Field"}),e.jsx(u,{children:"Reason"})]})}),e.jsxs(_,{children:[[...t.failures,...t.cityFailures??[]].slice(0,20).map((o,M)=>e.jsxs(b,{"data-testid":`failure-row-${M}`,children:[e.jsxs(m,{className:"font-medium text-sm",children:[e.jsx("span",{className:"block truncate max-w-[180px]",children:o.name||o.listingId}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[o.city,", ",o.state]})]}),e.jsx(m,{className:"text-xs text-muted-foreground",children:o.field}),e.jsx(m,{className:"text-xs text-destructive max-w-[220px] truncate",children:o.reason})]},M)),t.failures.length+(((G=t.cityFailures)==null?void 0:G.length)??0)>
420&&e.jsx(b,{children:e.jsxs(m,{colSpan:3,className:"text-center text-xs text-muted-foreground",children:["…and ",t.failures.length+(((W=t.cityFailures)==null?void 0:W.length)??0)-20," more — download CSV for full list"]})})]})]})})]})]})]})]}),e.jsx(Pe,{open:l,onOpenChange:r,children:e.jsxs(Ee,{children:[e.jsxs(Oe,{children:[e.jsx(qe,{children:"Run Cloudinary Migration?"}),e.jsxs(Ke,{children:["This will download"," ",e.jsxs("strong",{children:[((n==null?void 0:n.cloudinaryCount)??0)+((n==null?void 0:n.cityCloudinaryCount)??0)," Cloudinary image(s)"]})," ","(",(n==null?void 0:n.cloudinaryCount)??0," listing fields, ",(n==null?void 0:n.cityCloudinaryCount)??0," city hero images) into GCS and rewrite the database URLs. The operation is idempotent but may take several minutes. Continue?"]})]}),e.jsxs(Ve,{children:[e.jsx(_e,{"data-testid":"button-confirm-cancel",children:"Cancel"}),e.jsx(Be,{onClick:()=>{r(!1),v.mutate()},"data-testid":"button-confirm-run",children:"Run Migration"})]})]})})]})}function js({enabled:a,dateRange:i}){const{dateFrom:d,dateTo:t}=L(i),{data:s,isLoading:l}=F({queryKey:["/api/admin/dashboard/advertising",d,t],queryFn:()=>fetch(`/api/admin/dashboard/advertising?dateFrom=${encodeURIComponent(d)}&dateTo=${encodeURIComponent(t)}`).then(r=>r.json()),enabled:a});return l||!s?e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx(g,{className:"h-6 w-6 animate-spin"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"grid gap-4 sm:grid-cols-4",children:[e.jsx(x,{children:e.jsxs(h,{className:"p-4 text-center",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"Impressions (Period)"}),e.jsx("p",{className:"text-2xl font-bold tabular-nums","data-testid":"text-meta-impressions",children:f(s.meta.impressions)})]})}),e.jsx(x,{children:e.jsxs(h,{className:"p-4 text-center",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"Reach (Period)"}),e.jsx("p",{className:"text-2xl font-bold tabular-nums","data-testid":"text-meta-reach",children:f(s.meta.reach)})]})}),e.jsx(x,{children:e.jsxs(h,{className:"p-4 text-center",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"Spend (Period)"}),e.jsx("p",{className:"text-2xl font-bold tabular-nums","data-testid":"text-meta-spend",children:T(s.meta.spend)})]})}),e.jsx(x,{children:e.jsxs(h,{className:"p-4 text-center",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"CPC"}),e.jsx("p",{className:"text-2xl font-bold tabular-nums","data-testid":"text-meta-cpc",children:T(s.meta.cpc)})]})})]}),s.campaigns.length>0&&e.jsxs(x,{children:[e.jsx(R,{className:"pb-2",children:e.jsx($,{className:"text-sm font-medium",children:"Campaign Performance (Period)"})}),e.jsx(h,{children:e.jsx("div",{className:"overflow-x-auto -mx-4 px-4 md:mx-0 md:px-0",children:e.jsxs(K,{children:[e.jsx(V,{children:e.jsxs(b,{children:[e.jsx(u,{children:"Campaign"}),e.jsx(u,{className:"text-right",children:"Impressions"}),e.jsx(u,{className:"text-right",children:"Reach"}),e.jsx(u,{className:"text-right",children:"Clicks"}),e.jsx(u,{className:"text-right",children:"Spend"}),e.jsx(u,{className:"text-right",children:"CPC"})]})}),e.jsx(_,{children:s.campaigns.map(r=>e.jsxs(b,{"data-testid":`campaign-row-${r.campaignId}`,children:[e.jsx(m,{className:"font-medium truncate max-w-[200px]",children:r.name}),e.jsx(m,{className:"text-right tabular-nums",children:f(r.impressions)}),e.jsx(m,{className:"text-right tabular-nums",children:f(r.reach)}),e.jsx(m,{className:"text-right tabular-nums",children:f(r.clicks)}),e.jsx(m,{className:"text-right tabular-nums",children:T(r.spend)}),e.jsx(m,{className:"text-right tabular-nums",children:T(r.cpc)})]},r.campaignId))})]})})})]}),e.jsx(re,{title:"Ad Spend vs Visitors",summaryValue:T(s.spendVsVisitors.reduce((r,n)=>r+Number(n.spend),0)),sparklineData:s.spendVsVisitors.map(r=>r.visitors),sparklineColor:"hsl(var(--chart-1))",children:e.jsx(Ge,{title:"Ad Spend vs Site Visitors",data:s.spendVsVisitors,leftKey:"spend",leftName:"Spend ($)",leftColor:"hsl(var(--chart-4))",rightKey:"visitors",rightName:"Visitors",rightColor:"hsl(var(--chart-1))",rightFormatter:r=>`$${Number(r??0).toFixed(0)}`,testId:"chart-spend-vs-visitors"})})]})}function Fs(){const{isAuthenticated:a,isAdmin:i,isLoading:d}
4=De(),[t,s]=I.useState("today"),[l,r]=I.useState(xs);if(d)return e.jsx("div",{className:"flex items-center justify-center min-h-[400px]","data-testid":"loading-command-center",children:e.jsx(g,{className:"h-8 w-8 animate-spin"})});if(!a||!i)return e.jsx(ye,{to:"/"});const n=a&&i;return e.jsxs("div",{className:"p-4 md:p-6 pb-20 md:pb-6 max-w-7xl mx-auto space-y-6","data-testid":"page-command-center",children:[e.jsxs("div",{className:"flex items-center gap-3 flex-wrap justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(Ne,{className:"h-6 w-6 text-muted-foreground"}),e.jsx("h1",{className:"text-2xl font-bold","data-testid":"heading-command-center",children:"Dashboard"}),e.jsx(y,{variant:"secondary",className:"text-xs",children:"Auto-refresh 60s"})]}),e.jsx(es,{value:l,onChange:r})]}),e.jsx(ss,{dateRange:l,enabled:n}),e.jsxs(Me,{value:t,onValueChange:s,"data-testid":"dashboard-tabs",children:[e.jsxs(Ue,{className:"hidden md:inline-flex",children:[e.jsx(A,{value:"today","data-testid":"tab-today",children:"Signup Funnel"}),e.jsx(A,{value:"growth","data-testid":"tab-growth",children:"Growth"}),e.jsx(A,{value:"engagement","data-testid":"tab-engagement",children:"Engagement"}),e.jsx(A,{value:"advertising","data-testid":"tab-advertising",children:"Advertising"}),e.jsx(A,{value:"maintenance","data-testid":"tab-maintenance",children:"Maintenance"})]}),e.jsx(D,{value:"today",className:"mt-4",children:e.jsx(ms,{enabled:n,dateRange:l})}),e.jsx(D,{value:"growth",className:"mt-4",children:e.jsx(hs,{enabled:n,dateRange:l})}),e.jsx(D,{value:"engagement",className:"mt-4",children:e.jsx(ps,{enabled:n,dateRange:l})}),e.jsx(D,{value:"advertising",className:"mt-4",children:e.jsx(js,{enabled:n,dateRange:l})}),e.jsx(D,{value:"maintenance",className:"mt-4",children:e.jsx(gs,{enabled:n&&t==="maintenance"})})]}),e.jsxs("div",{className:"fixed bottom-0 left-0 right-0 z-50 flex md:hidden border-t bg-background","data-testid":"mobile-tab-bar",children:[e.jsxs("button",{onClick:()=>
4s("today"),className:`flex-1 flex flex-col items-center gap-1 py-3 text-xs font-medium transition-colors ${t==="today"?"text-primary":"text-muted-foreground"}`,"data-testid":"mobile-tab-today",children:[e.jsx(be,{className:"h-5 w-5"}),"Signup Funnel"]}),e.jsxs("button",{onClick:()=>s("growth"),className:`flex-1 flex flex-col items-center gap-1 py-3 text-xs font-medium transition-colors ${t==="growth"?"text-primary":"text-muted-foreground"}`,"data-testid":"mobile-tab-growth",children:[e.jsx(O,{className:"h-5 w-5"}),"Growth"]}),e.jsxs("button",{onClick:()=>s("engagement"),className:`flex-1 flex flex-col items-center gap-1 py-3 text-xs font-medium transition-colors ${t==="engagement"?"text-primary":"text-muted-foreground"}`,"data-testid":"mobile-tab-engagement",children:[e.jsx(ve,{className:"h-5 w-5"}),"Engagement"]}),e.jsxs("button",{onClick:()=>s("advertising"),className:`flex-1 flex flex-col items-center gap-1 py-3 text-xs font-medium transition-colors ${t==="advertising"?"text-primary":"text-muted-foreground"}`,"data-testid":"mobile-tab-advertising",children:[e.jsx(we,{className:"h-5 w-5"}),"Advertising"]}),e.jsxs("button",{onClick:()=>s("maintenance"),className:`flex-1 flex flex-col items-center gap-1 py-3 text-xs font-medium transition-colors ${t==="maintenance"?"text-primary":"text-muted-foreground"}`,"data-testid":"mobile-tab-maintenance",children:[e.jsx(Ce,{className:"h-5 w-5"}),"Maintenance"]})]})]})}export{Fs 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.