1import{aF as f,r as m,aD as w,j as e,al as g,am as p,x as n,a4 as y,an as N,ao as C,ap as S,X as b,ar as T,as as D,at as F,au as O,av as i,aB as _,aw as q,J,O as k,P as E,T as Q,ax as V,l,h as u}from"./index-f--GfbGy.js";import{u as x}from"./useMutation-XnENKeHJ.js";import{T as z}from"./trash-2-fBtMVbd8.js";function A(){const c=f(),[h,d]=m.useState(!1),[a,r]=m.useState({name:"",entity:"contacts",filters:"{}"}),{data:o=[]}=w({queryKey:["crm-saved-views"],queryFn:async()=>{const{data:s,error:t}=await l.from("crm_saved_views").select("*").order("created_at",{ascending:!1});if(t)throw t;return s??[]}}),v=x({mutationFn:async()=>{let s={};try{s=JSON.parse(a.filters||"{}")}catch{throw new Error("Filters must be valid JSON")}const{error:t}=await l.from("crm_saved_views").insert({name:a.name,entity:a.entity,filters:s});if(t)throw t},onSuccess:()=>{d(!1),r({name:"",entity:"contacts",filters:"{}"}),c.invalidateQueries({queryKey:["crm-saved-views"]}),u.success("View saved")},onError:s=>u.error(s.message)}),j=x({mutationFn:async s=>{const{error:t}=await l.from("crm_saved_views").delete().eq("id",s);if(t)throw t},onSuccess:()=>c.invalidateQueries({queryKey:["crm-saved-views"]})});return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold",children:"Saved views"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Reusable filtered lists across CRM records."})]}),e.jsxs(g,{open:h,onOpenChange:d,children:[e.jsx(p,{asChild:!0,children:e.jsxs(n,{children:[e.jsx(y,{className:"size-4 me-1"}),"New view"]})}),e.jsxs(N,{children:[e.jsx(C,{children:e.jsx(S,{children:"New saved view"})}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(b,{placeholder:"Name",value:a.name,onChange:s=>r({...a,name:s.target.value})}),e.jsxs(T,{value:a.entity,onValueChange:s=>r({...a,entity:s}),children:[e.jsx(D,{children:e.jsx(F,{})}),e.jsxs(O,{children:[e.jsx(i,{value:"contacts",children:"Contacts"}),e.jsx(i,{value:"companies",children:"Companies"}),e.jsx(i,{value:"deals",children:"Deals"}),e.jsx(i,{value:"tasks",children:"Tasks"})]})]}),e.jsx(_,{placeholder:'Filters (JSON, e.g. {"status":"open"})',rows:6,value:a.filters,onChange:s=>r({...a,filters:s.target.value})})]}),e.jsx(q,{children:e.jsx(n,{onClick:()=>v.mutate(),disabled:!a.name,children:"Save"})})]})]})]}),e.jsxs(J,{children:[e.jsx(k,{children:e.jsx(E,{children:"All views"})}),e.jsx(Q,{children:o.length===0?e.jsx("div",{className:"text-sm text-muted-foreground",children:"No saved views."}):e.jsx("div",{className:"space-y-2",children:o.map(s=>e.jsxs("div",{className:"flex items-start justify-between gap-4 border rounded-lg p-3",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("span",{className:"font-medium",children:s.name}),e.jsx(V,{variant:"secondary",children:s.entity})]}),e.jsx("pre",{className:"text-xs text-muted-foreground overflow-x-auto",children:JSON.stringify(s.filters,null,2)})]}),e.jsx(n,{size:"icon",variant:"ghost",onClick:()=>j.mutate(s.id),children:e.jsx(z,{className:"size-4"})})]},s.id))})})]})]})}export{A 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.