PageSourceSearch

https://dentistnearme.co.ke/assets/admin.quotes-Bd4XwgmT.js

js dentistnearme.co.ke collected 2026-10-08 22:50:39 UTC 5,167 bytes, 1 lines download raw bytes

1import{r as m,aW as w,o as C,a as f,j as t,B as a,C as b,x as k,N as S,M as Q,t as s}from"./index-C9V-IBQO.js";import{A as D}from"./AdminShell-DYYp9qFp.js";import{T}from"./textarea-lWUejwvV.js";import{D as _,a as z,b as E,c as A,e as L}from"./dialog-BsFdSch_.js";import{a as M,b as K,c as F}from"./quotes.functions-CKSLqWPV.js";import{T as P,E as U}from"./ui-qsCSI2eq.js";import{T as B}from"./trash-2-9RbGDzdL.js";import"./sheet-URGZ6ged.js";import"./index-D6nAWitr.js";import"./UserMenu-DB_KVfOT.js";import"./index-BdQq_4o_.js";import"./index-BRm3Z55v.js";import"./shield-mXoVCqQU.js";import"./loader-circle-As6X5pwJ.js";import"./calendar-D73HMnOc.js";import"./shield-check-xMW9IlJh.js";import"./users-CGL5lOcT.js";import"./star-BV8OmdJ6.js";import"./file-text-DIHB5ifw.js";import"./handshake-DD7WSdWn.js";import"./shopping-bag-B0-AmAft.js";import"./briefcase-DPabQzI6.js";import"./upload-BHeMCKv9.js";import"./trending-up-CPzFXv4M.js";function de(){const[i,d]=m.useState("new"),l=w(),{data:u=[],isLoading:g}=C(F(i)),x=f(M),v=f(K),[c,n]=m.useState(null),[p,h]=m.useState(""),r=async(e,o)=>{try{await x({data:{id:e,status:o}}),s.success("Updated"),l.invalidateQueries({queryKey:["admin-quotes"]})}catch(j){s.error(j instanceof Error?j.message:"Update failed")}},y=async()=>{if(c)try{await x({data:{id:c.id,admin_notes:p}}),s.success("Note saved"),n(null),l.invalidateQueries({queryKey:["admin-quotes"]})}catch(e){s.error(e instanceof Error?e.message:"Save failed")}},N=async e=>{if(confirm("Delete this quote request?"))try{await v({data:{id:e}}),s.success("Deleted"),l.invalidateQueries({queryKey:["admin-quotes"]})}catch(o){s.error(o instanceof Error?o.message:"Delete failed")}};return t.jsxs(D,{title:"Quote requests",subtitle:"Leads from the Get-a-Quote form",children:[t.jsx("div",{className:"flex flex-wrap gap-2",children:["new","contacted","won","lost","archived","all"].map(e=>t.jsx(a,{size:"sm",variant:i===e?"default":"outline",onClick:()=>d(e),className:"capitalize",children:e},e))}),g?t.jsx("div",{className:"mt-6",children:t.jsx(P,{})}):u.length===0?t.jsx("div",{className:"mt-6",children:t.jsx(U,{illustration:"leads",title:i==="new"?"No new quote requests":"Nothing here",description:i==="new"?"Leads from the Get-a-Quote form will appear here so you can follow up fast.":"Try another status to see historical leads.",primaryCta:i!=="new"?{label:"See new",onClick:()=>d("new")}:void 0,secondaryCta:{label:"Manage jobs board",to:"/admin/jobs"}})}):t.jsx("div",{className:"mt-6 space-y-3",children:u.map(e=>t.jsxs(b,{className:"p-5",children:[t.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[t.jsxs("div",{className:"min-w-0",children:[t.jsx("div",{className:"font-display text-lg font-semibold",children:e.specialty}),t.jsx("div",{className:"mt-1 text-sm font-medium",children:e.name}),t.jsxs("div",{className:"mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground",children:[t.jsxs("a",{className:"inline-flex items-center gap-1 hover:text-primary",href:`tel:${e.phone}`,children:[t.jsx(k,{className:"h-3.5 w-3.5"}),e.phone]}),e.email&&t.jsxs("a",{className:"inline-flex items-center gap-1 hover:text-primary",href:`mailto:${e.email}`,children:[t.jsx(S,{className:"h-3.5 w-3.5"}),e.email]}),e.location&&t.jsxs("span",{className:"inline-flex items-center gap-1",children:[t.jsx(Q,{className:"h-3.5 w-3.5"}),e.location]}),e.budget_kes!=null&&t.jsxs("span",{children:["KES ",e.budget_kes.toLocaleString()]})]}),e.target_clinic_name&&t.jsxs("p",{className:"mt-1 text-xs text-primary",children:["For: ",e.target_clinic_name]}),e.notes&&t.jsx("p",{className:"mt-3 whitespace-pre-wrap rounded-md bg-muted p-3 text-sm",children:e.notes}),e.admin_notes&&t.jsxs("p",{className:"mt-2 rounded-md bg-amber-500/10 p-2 text-xs text-amber-700 dark:text-amber-300",children:["Admin: ",e.admin_notes]}),t.jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:new Date(e.created_at).toLocaleString()})]}),t.jsx("span",{className:"rounded-full bg-primary/10 px-2.5 py-0.5 text-xs font-medium capitalize text-primary",children:e.status})]}),t.jsxs("div",{className:"mt-4 flex flex-wrap gap-2",children:[e.status!=="contacted"&&t.jsx(a,{size:"sm",variant:"outline",onClick:()=>
1r(e.id,"contacted"),children:"Mark contacted"}),e.status!=="won"&&t.jsx(a,{size:"sm",variant:"outline",onClick:()=>r(e.id,"won"),children:"Won"}),e.status!=="lost"&&t.jsx(a,{size:"sm",variant:"outline",onClick:()=>r(e.id,"lost"),children:"Lost"}),e.status!=="archived"&&t.jsx(a,{size:"sm",variant:"outline",onClick:()=>r(e.id,"archived"),children:"Archive"}),t.jsx(a,{size:"sm",variant:"outline",onClick:()=>{n(e),h(e.admin_notes??"")},children:"Add note"}),t.jsx(a,{size:"sm",variant:"outline",onClick:()=>N(e.id),children:t.jsx(B,{className:"h-3.5 w-3.5"})})]})]},e.id))}),t.jsx(_,{open:!!c,onOpenChange:e=>!e&&n(null),children:t.jsxs(z,{children:[t.jsx(E,{children:t.jsx(A,{children:"Internal note"})}),t.jsx(T,{rows:6,value:p,onChange:e=>h(e.target.value)}),t.jsxs(L,{children:[t.jsx(a,{variant:"outline",onClick:()=>n(null),children:"Cancel"}),t.jsx(a,{onClick:y,children:"Save"})]})]})})]})}export{de as component};

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.