PageSourceSearch

https://fieldserviceiq.ai/assets/Contractors-B9G7PM8T.js

js fieldserviceiq.ai collected 2026-10-05 13:09:48 UTC 8,757 bytes, 1 lines download raw bytes

1import{u as K,j as e}from"./vendor-data-_Pz25YLs.js";import{r as l,d as R}from"./vendor-react-C5ET9VRQ.js";import{aL as z,w as J,a as G,L as P,B as i,z as U,D as $,ak as W,P as I,f as X,g as Y,h as Z,J as o,I as u,K as ee,N as se,O as ae,Q as te,R as re,e as h,ac as ne,aM as le,i as ie,aN as oe,aO as ce,aP as de,t as me,aF as he,aG as xe,aH as pe,aI as ue,s as je}from"./index-C15KveKt.js";import{C as _,c as A,a as ge,b as fe}from"./card-DKtZ9FmL.js";import{T as ye,a as ve,b as L,c,d as Ne,e as d}from"./table-Dvor-LRC.js";import{I as Ce}from"./ImportDialog-BTm9ElBi.js";import"./alert-B9_6rAqL.js";import{D as we}from"./DeleteConfirmDialog-YJmulAXJ.js";import{M as be}from"./mail-Eg027Dpq.js";import{P as ke}from"./phone-rVKj5xdp.js";import{E as Se}from"./ellipsis-CtRKc9JX.js";import{T as De}from"./trash-2-CeDNviAG.js";import"./progress-DMPUCy8w.js";import"./radio-group-BTN5ycn5.js";import"./FileUpload--5uetGRD.js";import"./storage-Epskv-5y.js";import"./errorLog-Cu-LEhg8.js";import"./external-link-Cg93dYqn.js";import"./circle-check-CpVsBeTs.js";import"./rotate-ccw-wu_NHh5C.js";import"./arrow-right-1_5uTkwB.js";import"./link-2-DXkMtxas.js";import"./circle-x-BVP0aMhf.js";import"./alert-dialog-BRUDnUsG.js";function Ye(){const[M,j]=l.useState(!1),[F,C]=l.useState(!1),[m,g]=l.useState(null),[x,H]=l.useState(""),[a,n]=l.useState({phone:"",company_name:"",skills:[],territory_id:null,notes:""}),[p,f]=l.useState(""),[y,w]=l.useState([]),{updatePartners:O}=z({entityType:"contractor",entityId:void 0}),E=R(),{contractors:b,isLoading:B,createContractor:v,deleteContractor:k}=J(),{jobs:Q}=G(),{data:N}=K({queryKey:["territories"],queryFn:async()=>{const{data:s,error:t}=await je.from("territories").select("id, name").order("name");if(t)throw t;return s}}),S=()=>{n({phone:"",company_name:"",skills:[],territory_id:null,notes:""}),f(""),w([])},V=async s=>{s.preventDefault();const t=await v.mutateAsync(a);t&&y.length>0&&await O.mutateAsync({entityId:t.id,partnerIds:y}),j(!1),S()},D=()=>{var s;p.trim()&&!((s=a.skills)!=null&&s.includes(p.trim()))&&(n({...a,skills:[...a.skills||[],p.trim()]}),f(""))},q=s=>{var t;n({...a,skills:((t=a.skills)==null?void 0:t.filter(r=>r!==s))||[]})},T=b.filter(s=>{var t,r;return s.name.toLowerCase().includes(x.toLowerCase())||((t=s.company_name)==null?void 0:t.toLowerCase().includes(x.toLowerCase()))||((r=s.email)==null?void 0:r.toLowerCase().includes(x.toLowerCase()))});return B?e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx(P,{className:"h-8 w-8 animate-spin text-muted-foreground"})}):e.jsxs("div",{className:"space-y-6 animate-fade-in",children:[e.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:"Contractors"}),e.jsx("p",{className:"text-muted-foreground",children:"Manage your service contractors"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(i,{variant:"outline",onClick:()=>C(!0),children:[e.jsx(U,{className:"mr-2 h-4 w-4"}),"Import"]}),e.jsxs($,{open:M,onOpenChange:s=>{j(s),s||S()},children:[e.jsx(W,{asChild:!0,children:e.jsxs(i,{children:[e.jsx(I,{className:"mr-2 h-4 w-4"}),"Add Contractor"]})}),e.jsxs(X,{className:"max-w-lg max-h-[90vh] overflow-y-auto",children:[e.jsx(Y,{children:e.jsx(Z,{children:"Add Contractor"})}),e.jsxs("form",{onSubmit:V,className:"space-y-4 pt-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"company_name",children:"Company Name"}),e.jsx(u,{id:"company_name",value:a.company_name||"",onChange:s=>n({...a,company_name:s.target.value}),placeholder:"Smith HVAC Services",required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"phone",children:"Phone"}),e.jsx(u,{id:"phone",value:a.phone||"",onChange:s=>n({...a,phone:s.target.value}),placeholder:"(555) 123-4567"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"territory",children:"Territory"}),e.jsxs(ee,{value:a.territory_id||"",onValueChange:s=>n({...a,territory_id:s||null}),children:[e.jsx(se,{children:e.jsx(ae,{placeholder:"Select territory"})}),e.jsx(te,{children:N==null?void 0:N.map(s=>e.jsx(re,{value:s.id,children:s.name},s.id))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{children:"Skills"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(u,{value:p,onChange:s=>
1f(s.target.value),placeholder:"e.g., HVAC, Plumbing",onKeyDown:s=>s.key==="Enter"&&(s.preventDefault(),D())}),e.jsx(i,{type:"button",variant:"outline",onClick:D,children:"Add"})]}),a.skills&&a.skills.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1 mt-2",children:a.skills.map(s=>e.jsxs(h,{variant:"secondary",className:"cursor-pointer",onClick:()=>q(s),children:[s," ×"]},s))})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"notes",children:"Notes"}),e.jsx(ne,{id:"notes",value:a.notes||"",onChange:s=>n({...a,notes:s.target.value}),placeholder:"Additional notes..."})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{children:"Partners"}),e.jsx(le,{value:y,onChange:w,placeholder:"Assign partners..."})]}),e.jsxs(i,{type:"submit",className:"w-full",disabled:v.isPending,children:[v.isPending&&e.jsx(P,{className:"mr-2 h-4 w-4 animate-spin"}),"Add Contractor"]})]})]})]})]})]}),e.jsxs("div",{className:"relative",children:[e.jsx(ie,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(u,{placeholder:"Search contractors...",value:x,onChange:s=>H(s.target.value),className:"pl-10"})]}),b.length===0?e.jsx(_,{children:e.jsxs(A,{className:"flex flex-col items-center justify-center py-12",children:[e.jsx(oe,{className:"h-12 w-12 text-muted-foreground mb-4"}),e.jsx("h3",{className:"text-lg font-medium mb-2",children:"No contractors yet"}),e.jsx("p",{className:"text-muted-foreground text-center mb-4",children:"Add contractors to assign them to jobs and manage your workforce."}),e.jsxs(i,{onClick:()=>j(!0),children:[e.jsx(I,{className:"mr-2 h-4 w-4"}),"Add Contractor"]})]})}):e.jsxs(_,{children:[e.jsx(ge,{children:e.jsxs(fe,{children:["All Contractors (",T.length,")"]})}),e.jsx(A,{children:e.jsxs(ye,{children:[e.jsx(ve,{children:e.jsxs(L,{children:[e.jsx(c,{children:"Contractor"}),e.jsx(c,{children:"Contact"}),e.jsx(c,{children:"Territory"}),e.jsx(c,{children:"Skills"}),e.jsx(c,{children:"Status"}),e.jsx(c,{className:"w-10"})]})}),e.jsx(Ne,{children:T.map(s=>{var t;return e.jsxs(L,{className:"cursor-pointer hover:bg-muted/50",onClick:()=>E(`/contractors/${s.id}`),children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ce,{className:"h-10 w-10",children:e.jsx(de,{className:"bg-primary/10 text-primary",children:s.name.split(" ").map(r=>r[0]).join("")})}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:s.company_name||s.name}),s.company_name&&e.jsx("p",{className:"text-sm text-muted-foreground",children:s.name})]})]})}),e.jsx(d,{children:e.jsxs("div",{className:"space-y-1",children:[s.email&&e.jsxs("div",{className:"flex items-center gap-1 text-sm text-muted-foreground",children:[e.jsx(be,{className:"h-3 w-3"}),s.email]}),s.phone&&e.jsxs("div",{className:"flex items-center gap-1 text-sm text-muted-foreground",children:[e.jsx(ke,{className:"h-3 w-3"}),s.phone]})]})}),e.jsx(d,{children:s.territory?e.jsxs(h,{variant:"outline",children:[e.jsx(me,{className:"h-3 w-3 mr-1"}),s.territory.name]}):e.jsx("span",{className:"text-muted-foreground",children:"—"})}),e.jsx(d,{children:e.jsxs("div",{className:"flex flex-wrap gap-1",children:[(t=s.skills)==null?void 0:t.slice(0,2).map(r=>e.jsx(h,{variant:"secondary",className:"text-xs",children:r},r)),s.skills&&s.skills.length>2&&e.jsxs(h,{variant:"secondary",className:"text-xs",children:["+",s.skills.length-2]})]})}),e.jsx(d,{children:e.jsx(h,{variant:s.is_active?"default":"secondary",children:s.is_active?"Active":"Inactive"})}),e.jsx(d,{children:e.jsxs(he,{children:[e.jsx(xe,{asChild:!0,children:e.jsx(i,{variant:"ghost",size:"icon",className:"h-8 w-8",onClick:r=>r.stopPropagation(),children:e.jsx(Se,{className:"h-4 w-4"})})}),e.jsx(pe,{align:"end",onClick:r=>r.stopPropagation(),children:e.jsxs(ue,{className:"text-destructive focus:text-destructive",onClick:()=>g({id:s.id,name:s.company_name||s.name}),children:[e.jsx(De,{className:"mr-2 h-4 w-4"}),"Delete"]})})]})})]},s.id)})})]})})]}),e.jsx(Ce,{open:F,onOpenChange:C,defaultEntityType:"contractors"}),m&&e.jsx(we,{open:!!m,onOpenChange:s=>{s||g(null)},title:"Delete Contractor",itemName:m.name,linkedItems:[{label:"jobs",count:Q.filter(s=>s.contractor_id===m.id).length}],onConfirm:()=>{k.mutate(m.id,{onSuccess:()=>g(null)})},isPending:k.isPending})]})}
1export{Ye 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.