PageSourceSearch

https://dealerhub.360rain.com/assets/users-Bb1TkQao.js

js 360rain.com collected 2026-10-02 15:00:42 UTC 67,171 bytes, 1 lines download raw bytes

1(function(){try{var e=typeof window<`u`?window:typeof global<`u`?global:typeof globalThis<`u`?globalThis:typeof self<`u`?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]=`97e8a012-03a0-42bb-a3f4-e01ac098f081`,e._sentryDebugIdIdentifier=`sentry-dbid-97e8a012-03a0-42bb-a3f4-e01ac098f081`)}catch{}})();import{a as e}from"./rolldown-runtime-eil0g4P7.js";import{Ct as t,Du as n,Ii as r,Is as i,L as a,N as o,Sc as s,Td as c,Tu as l,Vd as u,Xf as d,Yp as f,Z as p,bf as m,go as h,gr as g,l as ee,mi as _,or as te,ql as ne,rd as re,tt as ie,vc as v,vo as y,wi as b,xd as x,zt as S}from"./icons-DpkGVEtF.js";import{$ as C,At as ae,Et as w,Nt as T,Pt as oe,Q as E,X as D,Y as O,Z as se,at as ce,et as k,h as A,m as j,mt as le,n as M,nt as N,p as ue}from"./login-shell-shared-B1ZmoKZI.js";import{t as de}from"./checkbox-B5UdlHdH.js";import{t as P}from"./button-BoQCzBK8.js";import{t as F}from"./badge-BpDlzPjV.js";import{n as I}from"./use-toast-CN4ANMjg.js";import{i as fe}from"./use-auth-D0nfcytn.js";import{i as pe}from"./use-typed-search-ClbyWR1Y.js";import{_ as me,h as he,i as ge,m as _e,o as L,p as R,s as ve,y as z}from"./schemas-CLG243Dt.js";import{t as ye}from"./coerce-By0wHkon.js";import{$r as be,Ai as xe,An as Se,Cn as Ce,Di as B,Dn as we,Ei as V,En as Te,Ni as Ee,Qr as De,Si as H,Sn as Oe,Ti as U,Tn as ke,ai as Ae,bn as je,ci as W,di as Me,gi as Ne,hi as Pe,ki as Fe,li as G,mi as Ie,oi as K,pi as Le,ti as Re,ui as q,wi as J,wn as ze,xi as Be,xn as Ve,yi as He,yn as Ue}from"./full-app-shell-X40U7syq.js";import{a as We,n as Y}from"./phone-utils-DHp4Xk4Q.js";import{t as Ge}from"./phone-input-9dzHsUr9.js";import{t as Ke}from"./contact-operations-DQa1p8ie.js";import{t as qe}from"./file-upload-trigger-CwkENyll.js";import{c as Je,i as X,n as Ye,o as Z,s as Xe,t as Ze}from"./table-2IcqvciT.js";import{t as Qe}from"./account-search-option-content-Bqsiw5Et.js";import{t as $e}from"./google-address-autocomplete-B_S-iZ7u.js";import{t as et}from"./dashboard-page-CfYRbEGv.js";import{t as tt}from"./merge-dialog-B9hbwmEQ.js";import{a as nt}from"./diagnostics-fleet-summary-DJdFt4it.js";var Q=oe();function rt({contact:e,machineCount:t,unassigned:n,onEditContact:i,handleMergeContact:a,setMachineDialogContactId:o}){return(0,Q.jsxs)(`div`,{className:n?`rounded-lg border p-3`:`rounded-md border bg-white p-2 text-sm`,"data-testid":`${n?`unassigned-contact`:`contact-item`}-${e.id}`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,Q.jsxs)(`p`,{className:`font-medium`,children:[e.first,` `,e.last]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Q.jsxs)(P,{variant:`ghost`,size:`icon`,className:`relative -mt-1 size-7`,onClick:()=>o(e.id),title:`Machine alert assignments`,"data-testid":`button-machine-alerts-${e.id}`,children:[(0,Q.jsx)(d,{className:`size-3.5`}),(t??0)>0&&(0,Q.jsx)(`span`,{className:`absolute -top-0.5 -right-0.5 flex h-3.5 min-w-3.5 items-center justify-center rounded-full bg-brand-primary px-0.5 text-2xs leading-none font-semibold text-white`,children:t})]}),(0,Q.jsx)(P,{variant:`ghost`,size:`icon`,className:`-mt-1 size-6`,onClick:()=>i(e),"data-testid":`button-edit-contact-${e.id}`,children:(0,Q.jsx)(r,{className:`size-3`})}),(0,Q.jsx)(P,{variant:`ghost`,size:`icon`,className:`-mt-1 size-7`,onClick:()=>a(e),title:`Merge with another contact`,"data-testid":`button-merge-contact-${e.id}`,children:(0,Q.jsx)(s,{className:`size-4`})})]})]}),e.email&&(0,Q.jsxs)(`p`,{className:`flex items-center gap-1 text-gray-500`,children:[(0,Q.jsx)(y,{className:`size-3`}),` `,e.email]}),e.phone&&(0,Q.jsxs)(`p`,{className:`flex items-center gap-1 text-gray-500`,children:[(0,Q.jsx)(b,{className:`size-3`}),` `,Y(e.phone)]}),(0,Q.jsx)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:e.communication_types?.map(e=>(0,Q.jsx)(F,{variant:`secondary`,className:`text-xs`,children:e.name},e.id))})]})}var $=e(f(),1);function it(e){if(e===`admin`||e===`dealer`||e===`rm`)return e;throw Error(`Invite code management is not available for this role`)}async function at(e){let t=await e.json().catch(()=>({}));if(e.ok)return t;let n=t,r=typeof n.error==`string`&&n.error||typeof n.message==`string`&&n.message||`Invite code request failed`;throw Error(r)}async function ot(e,t=fetch){let n=it(e.role);if(n!==`dealer`&&!e.accountId)throw Error(`Dealer account is required`);let r=n===`dealer`?`/api/dealer/generate-invite`:n===`admin`?`/api/admin/generate-invite`:`/api/rm/generate-invite`,i={expiryDays:2,multiUse:!0,...n===`dealer`?{}:{accountId:e.accountId}};return at(await t(r,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i)}))}async function st(e,t=fetch){return at(await t(it(e.role)===`dealer`?`/api/dealer/deactivate-invite/${e.codeId}`:`/api/admin/deactivate-invite/${e.codeId}`,{method:`POST`,headers:{"Content-Type":`application/json`}}))}function ct({managementData:e,effectiveDealerId:t,user:n}){let{toast:r}=I(),i=T(),[a,o]=(0,$.useState)(null),s=(0,$.useRef)(void 0);(0,$.useEffect)(()=>()=>clearTimeout(s.current),[]);let l=w({mutationFn:()=>ot({role:n?.role,accountId:e?.account?.id??t}),onSuccess:()=>{r({title:`Success`,description:`Invite code generated successfully`}),i.invalidateQueries({queryKey:[`/api/dealer/management`]})},onError:e=>{r({title:`Error`,description:e.message,variant:`destructive`})}}),u=w({mutationFn:e=>st({role:n?.role,codeId:e}),onSuccess:()=>{r({title:`Success`,description:`Invite code deactivated successfully`}),i.invalidateQueries({queryKey:[`/api/dealer/management`]})},onError:e=>{r({title:`Error`,description:e.message,variant:`destructive`})}});return(0,Q.jsxs)(O,{"data-testid":`invite-codes-card`,children:[(0,Q.jsx)(C,{children:(0,Q.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(k,{className:`flex items-center`,children:[(0,Q.jsx)(S,{className:`mr-2 size-5`}),`Invite Codes`]}),(0,Q.jsx)(se,{children:`Manage invite codes for your dealership`})]}),(0,Q.jsx)(P,{onClick:()=>l.mutate(),disabled:l.isPending,size:`sm`,"data-testid":`button-generate-code`,children:l.isPending?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(N,{className:`mr-2`}),`Generating...`]}):`Generate Code`})]})}),(0,Q.jsx)(D,{children:!e?.invite_codes||e.invite_codes.length===0?(0,Q.jsxs)(`div`,{className:`rounded-md bg-gray-50 p-6 text-center`,children:[(0,Q.jsx)(c,{className:`mx-auto mb-2 size-8 text-gray-400`}),(0,Q.jsx)(`p`,{className:`text-gray-500`,children:`No active invite codes. Generate a new code to invite users.`})]}):(0,Q.jsx)(lt,{managementData:e,copiedCodeId:a,handleCopyCode:async(e,t)=>{try{await navigator.clipboard.writeText(e),clearTimeout(s.current),o(t),s.current=setTimeout(()=>
1o(null),3e3),r({title:`Code Copied`,description:`Invite code copied to clipboard`})}catch{r({title:`Copy Failed`,description:`Could not copy the invite code. Try again.`,variant:`destructive`})}},deactivateCodeMutation:u})}),(0,Q.jsx)(E,{children:(0,Q.jsx)(`div`,{className:`text-sm text-gray-500`,children:(0,Q.jsx)(`p`,{children:`Invite codes expire after 2 days. Share with users who want to join your dealership.`})})})]})}function lt({managementData:e,copiedCodeId:t,handleCopyCode:n,deactivateCodeMutation:r}){return(0,Q.jsxs)(Ze,{children:[(0,Q.jsx)(Xe,{children:(0,Q.jsxs)(Je,{children:[(0,Q.jsx)(Z,{children:`Code`}),(0,Q.jsx)(Z,{children:`Status`}),(0,Q.jsx)(Z,{children:`Used`}),(0,Q.jsx)(Z,{children:`Actions`})]})}),(0,Q.jsx)(Ye,{children:e.invite_codes.map(e=>(0,Q.jsx)(ut,{code:e,copiedCodeId:t,handleCopyCode:n,deactivateCodeMutation:r},e.id))})]})}function ut({code:e,copiedCodeId:n,handleCopyCode:r,deactivateCodeMutation:i}){let a=e=>new Date(e)<new Date;return(0,Q.jsxs)(Je,{"data-testid":`invite-code-row-${e.id}`,children:[(0,Q.jsx)(X,{className:`font-mono text-xs`,children:e.code}),(0,Q.jsx)(X,{children:a(e.expires_at)?(0,Q.jsxs)(F,{variant:`destructive`,className:`flex w-fit items-center gap-1`,children:[(0,Q.jsx)(t,{className:`size-3`}),`Expired`]}):e.used_count>0&&!e.multi_use?(0,Q.jsxs)(F,{variant:`secondary`,className:`flex w-fit items-center gap-1`,children:[(0,Q.jsx)(x,{className:`size-3`}),`Used`]}):(0,Q.jsxs)(F,{variant:`outline`,className:`flex w-fit items-center gap-1 bg-green-100 text-green-800`,children:[(0,Q.jsx)(x,{className:`size-3`}),`Active`]})}),(0,Q.jsx)(X,{children:e.used_count}),(0,Q.jsx)(X,{children:(0,Q.jsxs)(`div`,{className:`flex items-center space-x-1`,children:[(0,Q.jsx)(P,{variant:`ghost`,size:`icon`,onClick:()=>r(e.code,e.id),disabled:a(e.expires_at)||e.used_count>0&&!e.multi_use,title:`Copy Code`,"data-testid":`button-copy-code-${e.id}`,children:n===e.id?(0,Q.jsx)(x,{className:`size-4 text-green-600`}):(0,Q.jsx)(l,{className:`size-4`})}),!a(e.expires_at)&&(0,Q.jsxs)(Ue,{children:[(0,Q.jsx)(we,{asChild:!0,children:(0,Q.jsx)(P,{variant:`ghost`,size:`icon`,className:`text-red-500 hover:bg-red-50 hover:text-red-700`,title:`Deactivate Code`,"data-testid":`button-deactivate-code-${e.id}`,children:(0,Q.jsx)(re,{className:`size-4`})})}),(0,Q.jsxs)(Oe,{children:[(0,Q.jsxs)(ke,{children:[(0,Q.jsx)(Te,{children:`Deactivate Invite Code`}),(0,Q.jsxs)(Ce,{children:[`Are you sure you want to deactivate this invite code? This will prevent it from being used for future registrations.`,(0,Q.jsxs)(`div`,{className:`mt-2 flex items-center rounded-md border border-amber-200 bg-amber-50 p-2 text-sm`,children:[(0,Q.jsx)(t,{className:`mr-2 size-4 text-amber-500`}),`This action cannot be undone.`]})]})]}),(0,Q.jsxs)(ze,{children:[(0,Q.jsx)(Ve,{children:`Cancel`}),(0,Q.jsx)(je,{onClick:()=>i.mutate(e.id),className:`bg-red-500 hover:bg-red-600`,children:i.isPending?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(N,{className:`mr-2`}),`Deactivating...`]}):`Deactivate`})]})]})]})]})})]},e.id)}var dt=e=>({headquarters:`Headquarters`,shop_location:`Shop Location`,shop:`Shop Location`,billing:`Billing Address`,shipping:`Shipping Address`,mailing:`Mailing Address`,event:`Event Location`,main_email:`Main Email`,support_email:`Support Email`,phone:`Phone`,email:`Email`,info:`Info`,accounting:`Accounting`})[e?.toLowerCase()]||e||`Location`;function ft({parentLocations:e,getContactsForLocation:t,onEditContact:n,onEditAddress:r,countByContactId:i,handleMergeContact:a,setMachineDialogContactId:o}){return(0,Q.jsx)(Q.Fragment,{children:e.length>0?(0,Q.jsxs)(`div`,{className:`mb-6 space-y-6`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsxs)(`h2`,{className:`flex items-center gap-2 text-xl font-semibold`,children:[(0,Q.jsx)(h,{className:`size-5`}),` Locations`]}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsxs)(P,{variant:`outline`,size:`sm`,onClick:()=>n(null),"data-testid":`button-add-contact`,children:[(0,Q.jsx)(_,{className:`mr-1 size-4`}),`Add Contact`]}),(0,Q.jsxs)(P,{variant:`outline`,size:`sm`,onClick:()=>r({address:null,mode:`location`,parent:null}),"data-testid":`button-add-address`,children:[(0,Q.jsx)(_,{className:`mr-1 size-4`}),`Add Location`]})]})]}),e.map(e=>{let s=t(e.id,e.address_id);return(0,Q.jsx)(pt,{location:e,locationContacts:s,onEditAddress:r,countByContactId:i,onEditContact:n,handleMergeContact:a,setMachineDialogContactId:o},e.id)})]}):(0,Q.jsx)(O,{className:`mb-6`,children:(0,Q.jsx)(D,{className:`py-8`,children:(0,Q.jsxs)(`div`,{className:`text-center text-gray-500`,children:[(0,Q.jsx)(h,{className:`mx-auto mb-2 size-8 opacity-50`}),(0,Q.jsx)(`p`,{className:`mb-4`,children:`No locations configured for this dealership`}),(0,Q.jsxs)(P,{variant:`outline`,size:`sm`,onClick:()=>r({address:null,mode:`location`,parent:null}),"data-testid":`button-add-first-address`,children:[(0,Q.jsx)(_,{className:`mr-1 size-4`}),`Add Location`]})]})})})})}function pt({location:e,locationContacts:t,onEditAddress:i,countByContactId:a,onEditContact:o,handleMergeContact:s,setMachineDialogContactId:c}){return(0,Q.jsxs)(O,{"data-testid":`location-card-${e.id}`,children:[(0,Q.jsxs)(C,{className:`pb-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsxs)(k,{className:`flex items-center gap-2 text-lg`,children:[dt(e.address_type),e.is_primary&&(0,Q.jsx)(F,{variant:`secondary`,className:`text-xs`,children:`Primary`})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[e.label&&(0,Q.jsx)(F,{variant:`outline`,children:e.label}),(0,Q.jsxs)(P,{variant:`ghost`,size:`sm`,className:`h-8`,onClick:()=>i({address:null,mode:`child`,parent:{id:e.id,label:e.label||dt(e.address_type)}}),"data-testid":`button-add-child-address-${e.id}`,children:[(0,Q.jsx)(_,{className:`mr-1 size-4`}),`Add Address`]}),(0,Q.jsx)(P,{variant:`ghost`,size:`icon`,className:`size-8`,onClick:()=>i({address:{...e.address,address_type:e.address_type,is_primary:e.is_primary,label:e.label},mode:`location`,parent:null}),"data-testid":`button-edit-address-${e.id}`,children:(0,Q.jsx)(r,{className:`size-4`})})]})]}),(0,Q.jsxs)(se,{className:`flex items-center gap-1`,children:[(0,Q.jsx)(h,{className:`size-3`}),(e=>
1[e.street,e.city,e.state,e.zip].filter(Boolean).join(`, `)||`No address`)(e.address)]})]}),(0,Q.jsxs)(D,{className:`space-y-4`,children:[(0,Q.jsx)(mt,{location:e,onEditAddress:i}),(0,Q.jsxs)(O,{className:`bg-gray-50`,children:[(0,Q.jsx)(C,{className:`pb-2`,children:(0,Q.jsxs)(k,{className:`flex items-center gap-2 text-sm`,children:[(0,Q.jsx)(n,{className:`size-4`}),` Contacts`]})}),(0,Q.jsx)(D,{children:t.length>0?(0,Q.jsx)(`div`,{className:`grid grid-cols-1 gap-3 md:grid-cols-2`,children:t.map(e=>(0,Q.jsx)(rt,{unassigned:!1,contact:e,machineCount:a.get(e.id)??0,onEditContact:o,handleMergeContact:s,setMachineDialogContactId:c},e.id))}):(0,Q.jsx)(`p`,{className:`text-sm text-gray-500`,children:`No contacts at this location`})})]})]})]},e.id)}function mt({location:e,onEditAddress:t}){let n=e=>[e.street,e.city,e.state,e.zip].filter(Boolean).join(`, `)||`No address`;return(0,Q.jsx)(Q.Fragment,{children:e.children&&e.children.length>0&&(0,Q.jsx)(`div`,{className:`grid grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3`,children:e.children.map(i=>(0,Q.jsxs)(`div`,{className:`group flex items-center gap-2 rounded-md bg-gray-50 p-2 text-sm transition-colors hover:bg-gray-100`,"data-testid":`child-address-${i.id}`,children:[(0,Q.jsx)(ht,{type:i.address_type}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`span`,{className:`block text-xs text-gray-500`,children:dt(i.address_type)}),(0,Q.jsx)(`span`,{className:`block truncate`,children:i.address_type===`phone`&&i.address?.phone?Y(i.address.phone):i.address_type===`email`&&i.address?.email?i.address.email:n(i.address)}),i.address_type===`billing`&&i.address?.email&&(0,Q.jsxs)(`span`,{className:`mt-0.5 flex items-center gap-1 text-xs text-gray-500`,children:[(0,Q.jsx)(y,{className:`size-3`}),` `,i.address.email]}),i.address_type===`billing`&&i.address?.phone&&(0,Q.jsxs)(`span`,{className:`mt-0.5 flex items-center gap-1 text-xs text-gray-500`,children:[(0,Q.jsx)(b,{className:`size-3`}),` `,Y(i.address.phone)]})]}),(0,Q.jsx)(P,{variant:`ghost`,size:`icon`,className:`size-7 flex-shrink-0 opacity-0 transition-opacity group-hover:opacity-100`,onClick:()=>t({address:{...i.address,address_type:i.address_type,is_primary:i.is_primary,label:i.label||null},mode:`child`,parent:{id:e.id,label:e.label||dt(e.address_type)}}),"data-testid":`button-edit-child-address-${i.id}`,children:(0,Q.jsx)(r,{className:`size-3.5`})})]},i.id))})})}function ht({type:e}){let t={phone:b,email:y,billing:m}[e]??h;return(0,Q.jsx)(t,{className:`size-4 text-gray-500`})}function gt({managementData:e,effectiveDealerId:t,logoDialogOpen:n,setLogoDialogOpen:r}){let{toast:a}=I(),o=[`image/jpeg`,`image/png`,`image/gif`,`image/webp`,`image/svg+xml`],[s,c]=(0,$.useState)(null),l=vt(s),u=yt(e.dealer.id||t,()=>{c(null),r(!1)});return(0,Q.jsx)(Me,{open:n,onOpenChange:e=>{r(e),e||c(null)},children:(0,Q.jsxs)(Le,{className:`sm:max-w-sm`,children:[(0,Q.jsxs)(Ne,{children:[(0,Q.jsx)(He,{children:`Company Logo`}),(0,Q.jsx)(Ie,{children:`Upload or update your dealership's logo. Recommended: Square image, PNG or JPG, max 5MB.`})]}),(0,Q.jsxs)(`div`,{className:`flex flex-col items-center gap-4 py-4`,children:[(0,Q.jsx)(_t,{logoPreview:l,managementData:e}),(0,Q.jsx)(`div`,{className:`flex w-full flex-col items-center gap-2`,children:l?(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsxs)(P,{type:`button`,variant:`outline`,onClick:()=>{c(null)},"data-testid":`button-clear-logo-preview`,children:[(0,Q.jsx)(re,{className:`mr-2 size-4`}),`Clear`]}),(0,Q.jsx)(P,{type:`button`,onClick:()=>{s&&u.mutate(s)},disabled:u.isPending,"data-testid":`button-upload-logo-dialog`,children:u.isPending?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(N,{className:`mr-2`}),`Uploading...`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(ie,{className:`mr-2 size-4`}),`Upload Logo`]})})]}):(0,Q.jsx)(qe,{id:`dealer-logo-dialog-file`,accept:o,inputTestId:`input-logo-file-dialog`,maxFiles:1,maxSizeMb:5,onFilesSelected:e=>c(e?.[0]??null),onRejected:e=>a({title:`Logo rejected`,description:e,variant:`destructive`}),children:({open:e,isDisabled:t})=>(0,Q.jsxs)(P,{type:`button`,variant:`outline`,onClick:e,disabled:t,"data-testid":`button-select-logo-dialog`,children:[(0,Q.jsx)(i,{className:`mr-2 size-4`}),`Select Image`]})})})]})]})})}function _t({logoPreview:e,managementData:t}){return(0,Q.jsx)(`div`,{className:`flex size-32 items-center justify-center overflow-hidden rounded-lg border-2 border-dashed border-gray-300 bg-gray-50`,children:e?(0,Q.jsx)(`img`,{src:e,alt:`Logo preview`,className:`size-full object-contain`}):t?.account?.logo_url&&t?.account?.id?(0,Q.jsx)(`img`,{src:`/api/dealer/logo/${t.account.id}`,alt:`Current logo`,className:`size-full object-contain`}):(0,Q.jsxs)(`div`,{className:`flex flex-col items-center text-gray-400`,children:[(0,Q.jsx)(i,{className:`mb-2 size-10`}),(0,Q.jsx)(`span`,{className:`text-sm`,children:`No logo`})]})})}function vt(e){let[t,n]=(0,$.useState)(null);return(0,$.useEffect)(()=>
1{if(!e){n(null);return}let t=URL.createObjectURL(e);return n(t),()=>URL.revokeObjectURL(t)},[e]),t}function yt(e,t){let{toast:n}=I(),r=T();return w({mutationFn:async t=>{let n=`/api/dealer/logo${e?`?dealerId=${e}`:``}`;return Se({url:n,files:[t],field:`logo`})},onSuccess:()=>{n({title:`Success`,description:`Logo uploaded successfully`}),r.invalidateQueries({queryKey:[`/api/dealer/management`]}),t()},onError:e=>{n({title:`Error`,description:e.message,variant:`destructive`})}})}function bt(e){let{managementData:t,setLogoDialogOpen:n}=e,r=t.primary_contact||t.regional_manager;return(0,Q.jsx)(O,{className:`mb-6`,"data-testid":`dealer-header-card`,children:(0,Q.jsx)(D,{className:`pt-6`,children:(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 gap-6 ${r?`lg:grid-cols-2`:``}`,children:[(0,Q.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-4 lg:flex-row lg:gap-6`,children:[(0,Q.jsx)(xt,{managementData:t,onOpen:()=>n(!0)}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(Ct,{managementData:t}),(0,Q.jsx)(Tt,{...e})]})]}),r&&(0,Q.jsx)(Dt,{managementData:t})]})})})}function xt({managementData:e,onOpen:t}){return(0,Q.jsx)(`div`,{className:`flex-shrink-0`,children:(0,Q.jsx)(`button`,{type:`button`,onClick:t,className:`group relative size-24 overflow-hidden rounded-lg border bg-white transition-all hover:border-primary/50 hover:shadow-xs focus:ring-2 focus:ring-primary/50 focus:ring-offset-2 focus:outline-hidden`,"data-testid":`button-logo-container`,children:e.account?.logo_url?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`img`,{src:`/api/dealer/logo/${e.account.id}`,alt:`${e.dealer.company_name} logo`,className:`size-full object-contain`,"data-testid":`img-dealer-logo`}),(0,Q.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center bg-black/40 opacity-0 transition-opacity group-hover:opacity-100`,children:(0,Q.jsx)(r,{className:`size-5 text-white`})})]}):(0,Q.jsxs)(`div`,{className:`flex size-full flex-col items-center justify-center bg-gray-50 transition-colors group-hover:bg-gray-100`,"data-testid":`placeholder-dealer-logo`,children:[(0,Q.jsx)(ie,{className:`mb-1 size-6 text-gray-400 group-hover:text-primary`}),(0,Q.jsx)(`span`,{className:`text-xs font-medium text-gray-500 group-hover:text-primary`,children:`Upload Logo`})]})})})}function St(e){return e?[e.street,e.city,e.state,e.zip].filter(Boolean).join(`, `):``}function Ct({managementData:e}){let t=e.hierarchicalAddresses?.headquarters?.address,n=St(t)||e.dealer.address,r=t?.phone||e.dealer.phone,i=t?.email||e.dealer.email,a=e.account?.website;return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`h1`,{className:`text-2xl font-semibold text-gray-900`,"data-testid":`text-company-name-header`,children:e.dealer.company_name||`Your Dealership`}),a&&(0,Q.jsxs)(De,{children:[(0,Q.jsx)(Re,{asChild:!0,children:(0,Q.jsxs)(`a`,{href:a.startsWith(`http`)?a:`https://${a}`,target:`_blank`,rel:`noopener noreferrer`,className:`mt-1 inline-flex w-full max-w-sm items-center gap-1 text-primary hover:underline`,"data-testid":`link-dealer-website`,children:[(0,Q.jsx)(v,{className:`size-4 flex-shrink-0`}),(0,Q.jsx)(`span`,{className:`truncate`,children:a.replace(/^https?:\/\//,``)}),(0,Q.jsx)(ne,{className:`size-3 flex-shrink-0`})]})}),(0,Q.jsx)(be,{children:a})]}),(0,Q.jsxs)(`div`,{className:`mt-3 flex min-w-0 flex-col gap-2 text-sm text-gray-600 sm:flex-row sm:flex-wrap sm:gap-4`,children:[n&&(0,Q.jsxs)(De,{children:[(0,Q.jsx)(Re,{asChild:!0,children:(0,Q.jsxs)(`span`,{className:`flex max-w-xs cursor-help items-start gap-1`,children:[(0,Q.jsx)(h,{className:`mt-0.5 size-4 flex-shrink-0`}),(0,Q.jsx)(`span`,{className:`truncate`,children:n})]})}),(0,Q.jsx)(be,{children:n})]}),r&&(0,Q.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,Q.jsx)(b,{className:`size-4 flex-shrink-0`}),Y(r)]}),i&&(0,Q.jsxs)(`a`,{href:`mailto:${i}`,title:i,className:`flex max-w-xs items-start gap-1 hover:text-primary`,children:[(0,Q.jsx)(y,{className:`mt-0.5 size-4 flex-shrink-0`}),(0,Q.jsx)(`span`,{className:`truncate`,children:i})]})]})]})}function wt(e){let t=e.hierarchicalAddresses?.headquarters,n=t?.children?.find(e=>e.address_type===`billing`),r=n?{...n.address,address_type:n.address_type,is_primary:n.is_primary,label:n.label||null}:e.addresses.find(e=>e.address_type===`billing`),i=e=>!!(St(e)||e?.email||e?.phone),a=!i(r)&&i(t?.address);return{hq:t,billing:r,useHeadquarters:a,display:a?t?.address:i(r)?r:void 0}}function Tt({managementData:e,user:t,onEditAddress:n}){let{hq:i,billing:a,display:o,useHeadquarters:s}=wt(e);return(0,Q.jsxs)(`div`,{className:`mt-4 border-t pt-3`,"data-testid":`billing-address-section`,children:[(0,Q.jsxs)(`div`,{className:`mb-1 flex items-center justify-between`,children:[(0,Q.jsx)(`h3`,{className:`text-sm font-semibold text-gray-500`,children:`Billing Address & Email`}),[`dealer`,`admin`,`rm`].includes(t.role)&&i&&(0,Q.jsxs)(P,{variant:`ghost`,size:`sm`,className:`h-7 text-xs`,onClick:()=>n({address:a||null,mode:`child`,parent:i?{id:i.id,label:i.label||dt(i.address_type)}:null}),"data-testid":`button-edit-billing`,children:[(0,Q.jsx)(r,{className:`mr-1 size-3.5`}),a?`Edit`:`Add Billing Info`]})]}),o?(0,Q.jsx)(Et,{address:o,headquarters:s}):(0,Q.jsx)(`p`,{className:`text-sm text-amber-600`,"data-testid":`text-no-billing`,children:`No billing address or email on file`})]})}function Et({address:e,headquarters:t}){let n=St(e),r=t?`-hq`:``;return(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[t&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground italic`,"data-testid":`text-billing-hq-fallback-label`,children:`Using headquarters info`}),n&&(0,Q.jsxs)(De,{children:[(0,Q.jsx)(Re,{asChild:!0,children:(0,Q.jsxs)(`p`,{className:`flex max-w-xs cursor-help items-center gap-1 truncate text-sm text-gray-600`,"data-testid":`text-billing-address${r}`,children:[(0,Q.jsx)(h,{className:`size-3.5 flex-shrink-0`}),n]})}),(0,Q.jsx)(be,{children:n})]}),e.email?(0,Q.jsxs)(`p`,{className:`flex items-center gap-1 text-sm text-gray-600`,"data-testid":`text-billing-email${r}`,children:[(0,Q.jsx)(y,{className:`size-3.5 flex-shrink-0`}),(0,Q.jsx)(`a`,{href:`mailto:${e.email}`,className:`truncate hover:text-primary`,children:e.email})]}):!t&&(0,Q.jsxs)(`p`,{className:`flex items-center gap-1 text-sm text-amber-600`,"data-testid":`text-billing-email-missing`,children:[(0,Q.jsx)(y,{className:`size-3.5 flex-shrink-0`}),`No billing email set`]}),e.phone&&(0,Q.jsxs)(`p`,{className:`flex items-center gap-1 text-sm text-gray-600`,"data-testid":`text-billing-phone${r}`,children:[(0,Q.jsx)(b,{className:`size-3.5 flex-shrink-0`}),Y(e.phone)]})]})}function Dt({managementData:e}){let t=e.primary_contact,n=e.regional_manager;return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4 lg:border-l lg:pl-6`,children:[t&&(0,Q.jsx)(Ot,{label:`Primary Contact`,name:`${t.first} ${t.last}`,email:t.email,phone:t.phone,manager:!1}),n&&(0,Q.jsx)(Ot,{label:`Regional Manager`,name:n.name,email:n.email,phone:n.phone,manager:!0})]})}function Ot({label:e,name:t,email:n,phone:r,manager:i}){let o=i?`rm`:`primary-contact`;return(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`mb-2 text-sm font-semibold text-gray-500`,children:e}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Q.jsx)(`div`,{className:`flex size-10 items-center justify-center rounded-full bg-primary/10`,children:(0,Q.jsx)(i?p:a,{className:`size-5 text-primary`})}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`font-medium`,"data-testid":`text-${o}-name`,children:t}),n&&(0,Q.jsxs)(De,{children:[(0,Q.jsx)(Re,{asChild:!0,children:(0,Q.jsx)(`a`,{href:`mailto:${n}`,className:`truncate text-sm text-gray-500 hover:text-primary`,"data-testid":i?`text-rm-email`:`link-primary-contact-email`,children:n})}),(0,Q.jsx)(be,{children:n})]}),r&&(0,Q.jsx)(`p`,{className:`text-sm text-gray-500`,"data-testid":`text-${o}-phone`,children:Y(r)})]})]})]})}var kt=`No RS username`,At=`No YieldCenter phone`;function jt(e){return e?.trim()||null}function Mt(e){return{rsUsername:jt(e.rs_username)??kt,yieldCenterPhone:jt(e.yield_center_phone)?Y(e.yield_center_phone):At,authProviderLabel:e.auth_provider===`yield_center`?`Yield Center`:e.auth_provider===`replit`?`Replit`:jt(e.auth_provider)}}function Nt(e,t){return t?`${e}?dealerId=${t}`:e}function Pt({data:e,addressId:t,dealerId:n,parentAddressId:r}){let i={street:e.street||null,city:e.city||null,state:e.state||null,zip:e.zip||null,country:e.country||null,address_type:e.address_type,label:e.label||null,is_primary:e.is_primary,phone:We(e.phone),email:e.email||null,...t===void 0?{parent_account_address_id:r??null}:{}};return A(t===void 0?`POST`:`PATCH`,Nt(`/api/dealer/addresses${t===void 0?``:`/${t}`}`,n),i)}function Ft(e,t,n){return A(`PATCH`,Nt(`/api/dealer/users/${e}/contact`,n),{contact_id:t})}function It({user:e,contacts:t,currentContactId:n,dealerId:r}){let{toast:i}=I(),a=T(),o=w({mutationFn:t=>Ft(e.id,t,r),onSuccess:()=>{i({title:`Success`,description:`Contact assignment updated`}),a.invalidateQueries({queryKey:[`/api/dealer/management`]})},onError:e=>{i({title:`Error`,description:e.message,variant:`destructive`})}}),s=t.find(e=>e.id===n);return(0,Q.jsxs)(Ae,{value:n?String(n):`none`,onValueChange:e=>{let t=e===`none`?null:parseInt(e);o.mutate(t)},disabled:o.isPending,children:[(0,Q.jsx)(G,{className:`w-45`,"data-testid":`select-user-contact-${e.id}`,children:(0,Q.jsx)(q,{placeholder:`Select contact`,children:o.isPending?(0,Q.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,Q.jsx)(N,{className:`size-3`}),`Updating...`]}):s?`${s.first} ${s.last}`:`No contact`})}),(0,Q.jsxs)(K,{children:[(0,Q.jsx)(W,{value:`none`,children:`No contact`}),t.map(e=>(0,Q.jsxs)(W,{value:String(e.id),children:[e.first,` `,e.last]},e.id))]})]})}function Lt({managementData:e,effectiveDealerId:t}){return(0,Q.jsxs)(O,{"data-testid":`users-card`,children:[(0,Q.jsxs)(C,{children:[(0,Q.jsxs)(k,{className:`flex items-center`,children:[(0,Q.jsx)(o,{className:`mr-2 size-5`}),`Dealer Users`]}),(0,Q.jsx)(se,{children:`Users associated with your dealership`})]}),(0,Q.jsx)(D,{children:!e?.users||e.users.length===0?(0,Q.jsxs)(`div`,{className:`rounded-md bg-gray-50 p-6 text-center`,children:[(0,Q.jsx)(p,{className:`mx-auto mb-2 size-8 text-gray-400`}),(0,Q.jsx)(`p`,{className:`text-gray-500`,children:`No users found for your dealership.`})]}):(0,Q.jsxs)(Ze,{children:[(0,Q.jsx)(Xe,{children:(0,Q.jsxs)(Je,{children:[(0,Q.jsx)(Z,{children:`RS Username`}),(0,Q.jsx)(Z,{children:`Email`}),(0,Q.jsx)(Z,{children:`YieldCenter Phone`}),(0,Q.jsx)(Z,{children:`Assigned Contact`})]})}),(0,Q.jsx)(Ye,{children:e.users.map(n=>{let r=Mt(n),i=!!n.rs_username?.trim(),a=!!n.yield_center_phone?.trim();return(0,Q.jsxs)(Je,{"data-testid":`user-row-${n.id}`,children:[(0,Q.jsx)(X,{children:(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`div`,{children:i?r.rsUsername:(0,Q.jsx)(`span`,{className:`text-muted-foreground italic`,children:r.rsUsername})}),r.authProviderLabel&&(0,Q.jsx)(F,{variant:`secondary`,className:`text-xs`,children:r.authProviderLabel})]})}),(0,Q.jsx)(X,{children:n.email}),(0,Q.jsx)(X,{children:a?r.yieldCenterPhone:(0,Q.jsx)(`span`,{className:`text-muted-foreground italic`,children:r.yieldCenterPhone})}),(0,Q.jsx)(X,{children:(0,Q.jsx)(It,{user:n,contacts:e.contacts||[],currentContactId:n.contact_id,dealerId:t})})]},n.id)})})]})})]})}var Rt=me(e=>e===``||e===void 0?null:e,z().nullable().refine(e=>!e||!!We(e),{message:`Phone number must be a valid E.164 phone number (e.g., +12024561234).`})),zt=he({street:z().optional().or(R(``)),city:z().optional().or(R(``)),state:z().optional().or(R(``)),zip:z(
1).optional().or(R(``)),country:z().optional().or(R(``)),address_type:ge([`billing`,`shipping`,`event`,`main_email`,`support_email`,`shop_location`,`mailing`,`headquarters`,`phone`,`email`,`info`,`accounting`],{error:`Address type is required`}),label:z().optional().or(R(``)),is_primary:ve().default(!1),phone:Rt,email:z().email(`Invalid email`).optional().or(R(``))}),Bt={US:`USA`,"United States":`USA`};function Vt(e){return Bt[e]??e}var Ht=[{value:`USA`,label:`United States`},{value:`Canada`,label:`Canada`},{value:`Mexico`,label:`Mexico`},{value:`Afghanistan`,label:`Afghanistan`},{value:`Albania`,label:`Albania`},{value:`Algeria`,label:`Algeria`},{value:`Argentina`,label:`Argentina`},{value:`Armenia`,label:`Armenia`},{value:`Australia`,label:`Australia`},{value:`Austria`,label:`Austria`},{value:`Azerbaijan`,label:`Azerbaijan`},{value:`Bangladesh`,label:`Bangladesh`},{value:`Belarus`,label:`Belarus`},{value:`Belgium`,label:`Belgium`},{value:`Bolivia`,label:`Bolivia`},{value:`Bosnia and Herzegovina`,label:`Bosnia and Herzegovina`},{value:`Brazil`,label:`Brazil`},{value:`Bulgaria`,label:`Bulgaria`},{value:`Cambodia`,label:`Cambodia`},{value:`Cameroon`,label:`Cameroon`},{value:`Chile`,label:`Chile`},{value:`China`,label:`China`},{value:`Colombia`,label:`Colombia`},{value:`Costa Rica`,label:`Costa Rica`},{value:`Croatia`,label:`Croatia`},{value:`Cuba`,label:`Cuba`},{value:`Cyprus`,label:`Cyprus`},{value:`Czech Republic`,label:`Czech Republic`},{value:`Denmark`,label:`Denmark`},{value:`Dominican Republic`,label:`Dominican Republic`},{value:`Ecuador`,label:`Ecuador`},{value:`Egypt`,label:`Egypt`},{value:`El Salvador`,label:`El Salvador`},{value:`Estonia`,label:`Estonia`},{value:`Ethiopia`,label:`Ethiopia`},{value:`Finland`,label:`Finland`},{value:`France`,label:`France`},{value:`Georgia`,label:`Georgia`},{value:`Germany`,label:`Germany`},{value:`Ghana`,label:`Ghana`},{value:`Greece`,label:`Greece`},{value:`Guatemala`,label:`Guatemala`},{value:`Honduras`,label:`Honduras`},{value:`Hungary`,label:`Hungary`},{value:`Iceland`,label:`Iceland`},{value:`India`,label:`India`},{value:`Indonesia`,label:`Indonesia`},{value:`Iran`,label:`Iran`},{value:`Iraq`,label:`Iraq`},{value:`Ireland`,label:`Ireland`},{value:`Israel`,label:`Israel`},{value:`Italy`,label:`Italy`},{value:`Jamaica`,label:`Jamaica`},{value:`Japan`,label:`Japan`},{value:`Jordan`,label:`Jordan`},{value:`Kazakhstan`,label:`Kazakhstan`},{value:`Kenya`,label:`Kenya`},{value:`Kuwait`,label:`Kuwait`},{value:`Latvia`,label:`Latvia`},{value:`Lebanon`,label:`Lebanon`},{value:`Lithuania`,label:`Lithuania`},{value:`Luxembourg`,label:`Luxembourg`},{value:`Malaysia`,label:`Malaysia`},{value:`Moldova`,label:`Moldova`},{value:`Mongolia`,label:`Mongolia`},{value:`Morocco`,label:`Morocco`},{value:`Myanmar`,label:`Myanmar`},{value:`Nepal`,label:`Nepal`},{value:`Netherlands`,label:`Netherlands`},{value:`New Zealand`,label:`New Zealand`},{value:`Nicaragua`,label:`Nicaragua`},{value:`Nigeria`,label:`Nigeria`},{value:`North Korea`,label:`North Korea`},{value:`Norway`,label:`Norway`},{value:`Pakistan`,label:`Pakistan`},{value:`Panama`,label:`Panama`},{value:`Paraguay`,label:`Paraguay`},{value:`Peru`,label:`Peru`},{value:`Philippines`,label:`Philippines`},{value:`Poland`,label:`Poland`},{value:`Portugal`,label:`Portugal`},{value:`Puerto Rico`,label:`Puerto Rico`},{value:`Qatar`,label:`Qatar`},{value:`Romania`,label:`Romania`},{value:`Russia`,label:`Russia`},{value:`Saudi Arabia`,label:`Saudi Arabia`},{value:`Serbia`,label:`Serbia`},{value:`Singapore`,label:`Singapore`},{value:`Slovakia`,label:`Slovakia`},{value:`Slovenia`,label:`Slovenia`},{value:`South Africa`,label:`South Africa`},{value:`South Korea`,label:`South Korea`},{value:`Spain`,label:`Spain`},{value:`Sri Lanka`,label:`Sri Lanka`},{value:`Sweden`,label:`Sweden`},{value:`Switzerland`,label:`Switzerland`},{value:`Syria`,label:`Syria`},{value:`Taiwan`,label:`Taiwan`},{value:`Tanzania`,label:`Tanzania`},{value:`Thailand`,label:`Thailand`},{value:`Tunisia`,label:`Tunisia`},{value:`Turkey`,label:`Turkey`},{value:`Uganda`,label:`Uganda`},{value:`Ukraine`,label:`Ukraine`},{value:`United Arab Emirates`,label:`United Arab Emirates`},{value:`United Kingdom`,label:`United Kingdom`},{value:`Uruguay`,label:`Uruguay`},{value:`Uzbekistan`,label:`Uzbekistan`},{value:`Venezuela`,label:`Venezuela`},{value:`Vietnam`,label:`Vietnam`},{value:`Yemen`,label:`Yemen`},{value:`Zambia`,label:`Zambia`},{value:`Zimbabwe`,label:`Zimbabwe`}];function Ut({form:e}){return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(V,{children:`Search Address`}),(0,Q.jsx)($e,{onAddressSelect:t=>{e.setValue(`street`,t.street),e.setValue(`city`,t.city),e.setValue(`state`,t.state),e.setValue(`zip`,t.zip),e.setValue(`country`,Vt(t.country))},placeholder:`Type to search for an address...`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Search for an address to auto-fill the fields below, or enter manually.`})]}),(0,Q.jsx)(J,{control:e.control,name:`street`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Street Address`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(M,{placeholder:`123 Main St`,...e,"data-testid":`input-address-street`})}),(0,Q.jsx)(B,{})]})}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,Q.jsx)(J,{control:e.control,name:`city`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`City`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(M,{placeholder:`Springfield`,...e,"data-testid":`input-address-city`})}),(0,Q.jsx)(B,{})]})}),(0,Q.jsx)(J,{control:e.control,name:`state`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`State`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(M,{placeholder:`IL`,...e,"data-testid":`input-address-state`})}),(0,Q.jsx)(B,{})]})})]}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,Q.jsx)(J,{control:e.control,name:`zip`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`ZIP Code`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(M,{placeholder:`62701`,...e,"data-testid":`input-address-zip`})}),(0,Q.jsx)(B,{})]})}),(0,Q.jsx)(J,{control:e.control,name:`country`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Country`}),(0,Q.jsxs)(Ae,{onValueChange:e.onChange,value:e.value||``,children:[(0,Q.jsx)(H,{children:(0,Q.jsx)(G,{"data-testid":`select-address-country`,children:(0,Q.jsx)(q,{placeholder:`Select country`})})}),(0,Q.jsx)(K,{className:`max-h-75`,children:Ht.map(e=>(0,Q.jsx)(W,{value:e.value,children:e.label},e.value))})]}),(0,Q.jsx)(B,{})]})})]})]})}function Wt({open:e,onOpenChange:t,address:n,onSuccess:r,dealerId:i,mode:a=`location`,parentAddressId:o,parentAddressLabel:s}){let{toast:c}=I(),l=T(),u=!!n,d=a===`location`?`headquarters`:`billing`,f=Ee({resolver:xe(zt),defaultValues:Jt(n,d)});(0,$.useEffect)(()=>{e&&f.reset(Jt(n,d))},[e,n,f,d]);let p=w({mutationFn:e=>Pt({data:e,addressId:n?.id,dealerId:i,parentAddressId:o}),onSuccess:()=>{c({title:`Success`,description:u?`Address updated successfully`:a===`child`?`Address added successfully`:`Location created successfully`}
1),l.invalidateQueries({queryKey:[`/api/dealer/management`]}),t(!1),r?.()},onError:e=>c({title:`Error`,description:e.message,variant:`destructive`})}),m=p.isPending,h=e=>p.mutate(e),ee=u?`Edit Address`:a===`location`?`Add New Location`:`Add Address to ${s||`Location`}`;return(0,Q.jsx)(Me,{open:e,onOpenChange:t,children:(0,Q.jsxs)(Le,{className:`sm:max-w-lookup-panel`,"data-testid":`address-dialog`,children:[(0,Q.jsxs)(Ne,{children:[(0,Q.jsx)(He,{"data-testid":`address-dialog-title`,children:ee}),(0,Q.jsx)(Ie,{children:u?`Update the address information below.`:a===`location`?`Add a new headquarters or shop location.`:`Add a billing, shipping, phone, or email address to this location.`})]}),(0,Q.jsx)(Be,{...f,children:(0,Q.jsxs)(`form`,{onSubmit:f.handleSubmit(h),className:`space-y-4`,children:[(0,Q.jsx)(Yt,{form:f,mode:a}),(0,Q.jsx)(Xt,{form:f,mode:a}),(0,Q.jsxs)(Pe,{children:[(0,Q.jsx)(P,{type:`button`,variant:`outline`,onClick:()=>t(!1),disabled:m,"data-testid":`button-address-cancel`,children:`Cancel`}),(0,Q.jsx)(P,{type:`submit`,disabled:m,"data-testid":`button-address-save`,children:m?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(N,{className:`mr-2`}),u?`Updating...`:`Creating...`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(g,{className:`mr-2 size-4`}),u?`Update Address`:`Create Address`]})})]})]})})]})})}var Gt=[`headquarters`,`shop_location`,`billing`,`shipping`,`mailing`,`event`],Kt=[`main_email`,`support_email`,`email`],qt=[`phone`];function Jt(e,t){let n=e??{};return{street:n.street||``,city:n.city||``,state:n.state||``,zip:n.zip||``,country:n.country||`USA`,address_type:n.address_type||t,label:n.label||``,is_primary:n.is_primary||!1,phone:n.phone||``,email:n.email||``}}function Yt({form:e,mode:t}){return(0,Q.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,Q.jsx)(J,{control:e.control,name:`address_type`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Address Type *`}),(0,Q.jsxs)(Ae,{onValueChange:e.onChange,value:e.value,children:[(0,Q.jsx)(H,{children:(0,Q.jsx)(G,{"data-testid":`select-address-type`,children:(0,Q.jsx)(q,{placeholder:`Select type`})})}),(0,Q.jsx)(K,{children:t===`location`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(W,{value:`headquarters`,children:`Headquarters`}),(0,Q.jsx)(W,{value:`shop_location`,children:`Shop Location`})]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(W,{value:`billing`,children:`Billing`}),(0,Q.jsx)(W,{value:`shipping`,children:`Shipping`}),(0,Q.jsx)(W,{value:`phone`,children:`Phone`}),(0,Q.jsx)(W,{value:`email`,children:`Email`}),(0,Q.jsx)(W,{value:`main_email`,children:`Main Email`}),(0,Q.jsx)(W,{value:`support_email`,children:`Support Email`}),(0,Q.jsx)(W,{value:`info`,children:`Info`}),(0,Q.jsx)(W,{value:`accounting`,children:`Accounting`})]})})]}),(0,Q.jsx)(B,{})]})}),(0,Q.jsx)(J,{control:e.control,name:`label`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Label`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(M,{placeholder:`Main Office`,...e,"data-testid":`input-address-label`})}),(0,Q.jsx)(B,{})]})})]})}function Xt({form:e,mode:t}){let n=e.watch(`address_type`),r=Gt.includes(n),i=Kt.includes(n),a=qt.includes(n);return(0,Q.jsxs)(Q.Fragment,{children:[` `,r&&(0,Q.jsx)(Ut,{form:e}),a&&(0,Q.jsx)(J,{control:e.control,name:`phone`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Phone Number *`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(Ge,{value:e.value||``,onChange:e.onChange,placeholder:`(555) 123-4567`,"data-testid":`input-address-phone-only`})}),(0,Q.jsx)(B,{})]})}),i&&(0,Q.jsx)(J,{control:e.control,name:`email`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Email Address *`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(M,{type:`email`,placeholder:`[email protected]`,...e,"data-testid":`input-address-email`})}),(0,Q.jsx)(B,{})]})}),t===`location`&&(0,Q.jsx)(J,{control:e.control,name:`is_primary`,render:({field:e})=>(0,Q.jsxs)(U,{className:`flex flex-row items-start space-y-0 space-x-3 rounded-md border p-4`,children:[(0,Q.jsx)(H,{children:(0,Q.jsx)(de,{checked:e.value,onCheckedChange:e.onChange,"data-testid":`checkbox-address-primary`})}),(0,Q.jsxs)(`div`,{className:`space-y-1 leading-none`,children:[(0,Q.jsx)(V,{children:`Primary Location`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Set this as the primary location for this dealership`})]})]})})]})}function Zt({entityType:e,entityId:t,currentAccountId:n,onAccountChange:r,dealerId:i}){let[a,o]=(0,$.useState)(!1),[s,c]=(0,$.useState)(``),[l,d]=(0,$.useState)(!1),[f,p]=(0,$.useState)(``),[h,g]=(0,$.useState)(!1),[ne,re]=(0,$.useState)(i||null),ie=(0,$.useRef)(null),v=(0,$.useRef)(null),{toast:y}=I(),{user:b}=fe(),x=b?.role,S=x===`admin`||x===`rm`,[C,T]=(0,$.useState)({name:``,email:``,phone:``});(0,$.useEffect)(()=>{let e=e=>{ie.current&&!ie.current.contains(e.target)&&!l&&!h&&o(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[l,h]),(0,$.useEffect)(()=>{a&&v.current&&!l&&!h&&v.current.focus()},[a,l,h]);let oe=(e=``)=>{let t=new URLSearchParams;t.set(`view`,`options`),e&&t.set(`q`,e);let n=t.toString();return`/api/accounts/search${n?`?${n}`:``}`},{data:E=[],isLoading:D}=ae({queryKey:[`/api/accounts/search`,`linked`],enabled:a,queryFn:async()=>{let e=await fetch(oe());if(!e.ok)throw Error(`Failed to fetch linked accounts`);return e.json()}}),{data:O=[],isLoading:se}=ae({queryKey:[`/api/accounts/search`,s],enabled:s.length>=2,queryFn:async()=>{let e=await fetch(oe(s));if(!e.ok)throw Error(`Failed to search accounts`);let t=await e.json();return t.account??t}}),k=s.length>=2?O:E,{data:A,isLoading:le}=ae({queryKey:[`/api/accounts`,n],enabled:!!n,queryFn:async()=>{let e=await fetch(`/api/accounts/${n}`);if(!e.ok)throw Error(`Failed to fetch account`);return e.json()}}),{data:de=[]}=ae({queryKey:[`/api/dealers`,{view:`options`}],enabled:S&&h}),F=w({mutationFn:async e=>{let n=await ue.patch(`/api/contacts/${t}`,{account_id:e});return n.contact??n},onSuccess:e=>{j.invalidateQueries({queryKey:[`/api/dealer/management`]}),j.invalidateQueries({queryKey:[`/api/contacts`]}),j.invalidateQueries({queryKey:[`/api/accounts`]}),r?.(e.account_id??null),o(!1),y({title:`Success`,description:`Account updated successfully`})},onError:e=>{y({title:`Error`,description:e.message,variant:`destructive`})}}),pe=w({mutationFn:async e=>{let t=await fetch(`/api/accounts`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e.name,email:e.email||null,phone:We(e.phone),dealerId:e.dealerId})});if(!t.ok){let e=await t.json();throw Error(e.error||`Failed to create account`)}return t.json()},onSuccess:async t=>{j.invalidateQueries({queryKey:[`/api/accounts/search`]}),j.invalidateQueries({queryKey:[`/api/accounts`]}),e===`contact`&&await F.mutateAsync(t.id),L(),y({title:`Success`,description:`Account "${t.name}" created and linked successfully`})},onError:e=>{y({title:`Error`,description:e.message,variant:`destructive`})}}),me=async t=>{e===`contact`?await F.mutateAsync(t):(r?.(t),o(!1)),c(``)},he=()=>{S&&!i?g(!0):d(!0)},ge=()=>{if(!ne){p(`Please select a dealer first`);return}g(!1),d(!0)},_e=()=>{if(!C.name.trim()){p(`Account name is required`);return}if(C.phone&&!We(C.phone)){p(`Phone number must be a valid E.164 phone number (e.g., +12024561234).`);return}let e=S?ne:void 0;pe.mutate({...C,dealerId:e})},L=()=>{p(``),d(!1),g(!1),T({name:``,email:``,phone:``}),re(i||null),o(!1)},R=F.isPending||pe.isPending;return(0,Q.jsxs)(`div`,{ref:ie,className:`relative w-full space-y-2`,children:[(0,Q.jsx)(Fe,{className:`text-sm font-medium`,children:A?A.name:`Linked A
1ccount`}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>!R&&o(!a),disabled:R,className:ce(`flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background`,`focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden`,`disabled:cursor-not-allowed disabled:opacity-50`,a&&`ring-2 ring-ring ring-offset-2`),"data-testid":`account-linker-trigger`,children:[le&&n?(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:(0,Q.jsx)(N,{label:`Loading...`})}):A?(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,"data-testid":`current-account-display`,children:[(0,Q.jsx)(m,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`font-medium`,"data-testid":`current-account-name`,children:A.name}),A.type&&(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`(`,A.type,`)`]})]}):(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`No account linked - Click to assign`}),(0,Q.jsx)(u,{className:ce(`h-4 w-4 shrink-0 opacity-50 transition-transform`,a&&`rotate-180`)})]}),a&&(0,Q.jsx)(`div`,{className:`mt-1 w-full rounded-md border bg-background shadow-lg`,children:h?(0,Q.jsxs)(`div`,{className:`space-y-3 bg-muted/30 p-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:`Select Dealer`}),(0,Q.jsx)(P,{type:`button`,variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0`,onClick:L,children:(0,Q.jsx)(ee,{className:`h-4 w-4`})})]}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Choose which dealer this new customer account should be linked to.`}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Fe,{htmlFor:`inlineDealerSelect`,className:`text-xs`,children:`Dealer *`}),(0,Q.jsxs)(Ae,{value:ne?.toString()||``,onValueChange:e=>re(parseInt(e)),children:[(0,Q.jsx)(G,{id:`inlineDealerSelect`,className:`h-8 text-sm`,"data-testid":`select-dealer-for-account`,children:(0,Q.jsx)(q,{placeholder:`Select a dealer`})}),(0,Q.jsx)(K,{children:de.map(e=>(0,Q.jsx)(W,{value:e.id.toString(),children:e.company_name},e.id))})]})]}),f&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-xs font-medium text-destructive`,children:f}),(0,Q.jsxs)(`div`,{className:`flex gap-2 pt-1`,children:[(0,Q.jsx)(P,{type:`button`,variant:`outline`,size:`sm`,className:`flex-1`,onClick:L,children:`Cancel`}),(0,Q.jsx)(P,{type:`button`,size:`sm`,className:`flex-1`,onClick:ge,"data-testid":`button-continue-dealer-select`,children:`Continue`})]})]}):l?(0,Q.jsxs)(`div`,{className:`space-y-3 bg-muted/30 p-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:`New Customer Account`}),(0,Q.jsx)(P,{type:`button`,variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0`,onClick:L,children:(0,Q.jsx)(ee,{className:`h-4 w-4`})})]}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`This account will be automatically linked to`,` `,S&&ne?`the selected dealer`:`your dealership`,`.`]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Fe,{htmlFor:`inlineAccountName`,className:`text-xs`,children:`Account Name *`}),(0,Q.jsx)(M,{id:`inlineAccountName`,value:C.name,onChange:e=>T({...C,name:e.target.value}),placeholder:`Company or farm name`,className:`h-8 text-sm`,"data-testid":`input-new-account-name`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Fe,{htmlFor:`inlineAccountEmail`,className:`text-xs`,children:`Email`}),(0,Q.jsx)(M,{id:`inlineAccountEmail`,type:`email`,value:C.email,onChange:e=>T({...C,email:e.target.value}),placeholder:`[email protected]`,className:`h-8 text-sm`,"data-testid":`input-new-account-email`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Fe,{htmlFor:`inlineAccountPhone`,className:`text-xs`,children:`Phone`}),(0,Q.jsx)(Ge,{id:`inlineAccountPhone`,value:C.phone,onChange:e=>T({...C,phone:e}),placeholder:`+1 (555) 123-4567`,className:`h-8 text-sm`,"data-testid":`input-new-account-phone`})]}),f&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-xs font-medium text-destructive`,children:f}),(0,Q.jsxs)(`div`,{className:`flex gap-2 pt-1`,children:[(0,Q.jsx)(P,{type:`button`,variant:`outline`,size:`sm`,className:`flex-1`,onClick:L,disabled:R,"data-testid":`button-cancel-create-account`,children:`Cancel`}),(0,Q.jsx)(P,{type:`button`,size:`sm`,className:`flex-1`,onClick:_e,disabled:R,"data-testid":`button-submit-create-account`,children:R?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(N,{className:`mr-2 h-3 w-3`}),`Creating...`]}):`Create & Link`})]})]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center border-b px-3 py-2`,children:[(0,Q.jsx)(te,{className:`mr-2 h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`input`,{ref:v,type:`text`,placeholder:`Type to search accounts...`,value:s,onChange:e=>c(e.target.value),className:`flex-1 bg-transparent text-sm outline-hidden placeholder:text-muted-foreground`,"data-testid":`account-linker-search`})]}),(0,Q.jsx)(`div`,{className:`max-h-[200px] overflow-y-auto`,children:D||se?(0,Q.jsx)(`div`,{className:`py-6 text-center text-sm text-muted-foreground`,children:(0,Q.jsx)(N,{className:`mx-auto mb-2`,label:`Loading accounts...`})}):k.length===0?(0,Q.jsx)(`div`,{className:`py-6 text-center text-sm text-muted-foreground`,children:s.length>=2?`No accounts found`:`No linked accounts`}):(0,Q.jsx)(`div`,{className:`p-1`,children:k.map(e=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>me(e.id),className:ce(`flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden`,`hover:bg-accent hover:text-accent-foreground`,n===e.id&&`bg-accent`),"data-testid":`account-linker-option-${e.id}`,children:(0,Q.jsx)(Qe,{account:e,selected:n===e.id})},e.id))})}),(0,Q.jsx)(`div`,{className:`border-t p-2`,children:(0,Q.jsxs)(P,{type:`button`,variant:`ghost`,className:`w-full justify-center font-medium text-primary`,onClick:he,"data-testid":`button-create-new-account`,children:[(0,Q.jsx)(_,{className:`mr-2 h-4 w-4`}),`Create New Account`]})})]})})]})}function Qt(e){return{...e,email:e.email||null,phone:We(e.phone),type:e.type||null,contact_method:e.contact_method||null,communication_type_ids:e.communication_type_ids||[]}}function $t(e,t){return{...Qt(e),account_id:t}}function en(e){return Qt(e)}var tn=he({first:z().min(1,`First name is required`),last:z().min(1,`Last name is required`),email:z().email(`Invalid email`).optional().or(R(``)),phone:
1Rt,type:z().optional().or(R(``)),contact_method:z().optional().or(R(``)),address_id:_e().optional().nullable(),communication_type_ids:L(_e()).optional()});function nn({open:e,onOpenChange:t,contact:n,addresses:r,communicationTypes:i,accountId:a,onSuccess:o,dealerId:s,onContactUpdate:c}){let{toast:l}=I(),u=T(),d=!!n,f=Ee({resolver:xe(tn),defaultValues:rn(n)});(0,$.useEffect)(()=>{e&&f.reset(rn(n))},[e,n,f]);let p=w({mutationFn:e=>{if(n)return Ke(`/api/contacts/${n.id}`,`PATCH`,en(e));if(!a)throw Error(`Dealer account is required to create contacts`);return Ke(`/api/contacts`,`POST`,$t(e,a))},onSuccess:()=>{l({title:`Success`,description:`Contact ${d?`updated`:`created`} successfully`}),u.invalidateQueries({queryKey:[`/api/dealer/management`]}),u.invalidateQueries({queryKey:[`/api/customers`]}),u.invalidateQueries({queryKey:[`/api/contacts`]}),t(!1),o?.()},onError:e=>{l({title:`Error`,description:e.message,variant:`destructive`})}}),m=p.isPending,h=e=>p.mutate(e);return(0,Q.jsx)(Me,{open:e,onOpenChange:t,children:(0,Q.jsxs)(Le,{className:`sm:max-w-lg`,"data-testid":`contact-dialog`,children:[(0,Q.jsxs)(Ne,{children:[(0,Q.jsx)(He,{"data-testid":`contact-dialog-title`,children:d?`Edit Contact`:`Add New Contact`}),(0,Q.jsx)(Ie,{children:d?`Update the contact information below.`:`Enter the details for the new contact.`})]}),(0,Q.jsx)(Be,{...f,children:(0,Q.jsxs)(`form`,{onSubmit:f.handleSubmit(h),className:`space-y-4`,children:[(0,Q.jsx)(an,{form:f}),(0,Q.jsx)(on,{form:f,addresses:r,communicationTypes:i}),d&&n&&(0,Q.jsx)(`div`,{className:`border-t pt-4`,children:(0,Q.jsx)(Zt,{entityType:`contact`,entityId:n.id,currentAccountId:n.account_id||null,dealerId:s,onAccountChange:e=>{u.invalidateQueries({queryKey:[`/api/dealer/management`]}),c&&n&&c({...n,account_id:e})}})}),(0,Q.jsxs)(Pe,{children:[(0,Q.jsx)(P,{type:`button`,variant:`outline`,onClick:()=>t(!1),disabled:m,"data-testid":`button-contact-cancel`,children:`Cancel`}),(0,Q.jsx)(P,{type:`submit`,disabled:m,"data-testid":`button-contact-save`,children:m?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(N,{className:`mr-2`}),d?`Updating...`:`Creating...`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(g,{className:`mr-2 size-4`}),d?`Update Contact`:`Create Contact`]})})]})]})})]})})}function rn(e){let t=e??{};return{first:t.first||``,last:t.last||``,email:t.email||``,phone:t.phone||``,type:t.type||``,contact_method:t.contact_method||``,address_id:t.address_id||null,communication_type_ids:t.communication_types?.map(e=>e.id)||[]}}function an({form:e}){return(0,Q.jsxs)(Q.Fragment,{children:[` `,(0,Q.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,Q.jsx)(J,{control:e.control,name:`first`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`First Name *`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(M,{placeholder:`John`,...e,"data-testid":`input-contact-first`})}),(0,Q.jsx)(B,{})]})}),(0,Q.jsx)(J,{control:e.control,name:`last`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Last Name *`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(M,{placeholder:`Doe`,...e,"data-testid":`input-contact-last`})}),(0,Q.jsx)(B,{})]})})]}),(0,Q.jsx)(J,{control:e.control,name:`email`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Email`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(M,{type:`email`,placeholder:`[email protected]`,...e,"data-testid":`input-contact-email`})}),(0,Q.jsx)(B,{})]})}),(0,Q.jsx)(J,{control:e.control,name:`phone`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Phone`}),(0,Q.jsx)(H,{children:(0,Q.jsx)(Ge,{value:e.value||``,onChange:e.onChange,onBlur:e.onBlur,"data-testid":`input-contact-phone`})}),(0,Q.jsx)(B,{})]})})]})}function on({form:e,addresses:t,communicationTypes:n}){let r=e=>{let t=[e.street,e.city,e.state].filter(Boolean).join(`, `)||`No address`;return`${e.label||e.address_type}: ${t}`};return(0,Q.jsxs)(Q.Fragment,{children:[` `,(0,Q.jsx)(J,{control:e.control,name:`contact_method`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Communication Method`}),(0,Q.jsxs)(Ae,{onValueChange:e.onChange,value:e.value||``,children:[(0,Q.jsx)(H,{children:(0,Q.jsx)(G,{"data-testid":`select-contact-method`,children:(0,Q.jsx)(q,{placeholder:`Select method`})})}),(0,Q.jsxs)(K,{children:[(0,Q.jsx)(W,{value:`email`,children:`Email`}),(0,Q.jsx)(W,{value:`phone`,children:`Phone`}),(0,Q.jsx)(W,{value:`text`,children:`Text`})]})]}),(0,Q.jsx)(B,{})]})}),t.length>0&&(0,Q.jsx)(J,{control:e.control,name:`address_id`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Assign to Address`}),(0,Q.jsxs)(Ae,{onValueChange:t=>e.onChange(t===`none`?null:parseInt(t)),value:e.value?String(e.value):`none`,children:[(0,Q.jsx)(H,{children:(0,Q.jsx)(G,{"data-testid":`select-contact-address`,children:(0,Q.jsx)(q,{placeholder:`Select address`})})}),(0,Q.jsxs)(K,{children:[(0,Q.jsx)(W,{value:`none`,children:`No address assignment`}),t.map(e=>(0,Q.jsx)(W,{value:String(e.id),children:r(e)}
1,e.id))]})]}),(0,Q.jsx)(B,{})]})}),n.length>0&&(0,Q.jsx)(J,{control:e.control,name:`communication_type_ids`,render:({field:e})=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:`Communication Topics`}),(0,Q.jsx)(`div`,{className:`grid grid-cols-2 gap-2`,children:n.map(t=>(0,Q.jsxs)(`div`,{className:`flex items-center space-x-2`,children:[(0,Q.jsx)(de,{id:`comm-type-${t.id}`,checked:e.value?.includes(t.id)||!1,onCheckedChange:n=>{let r=e.value||[];n?e.onChange([...r,t.id]):e.onChange(r.filter(e=>e!==t.id))},"data-testid":`checkbox-comm-type-${t.id}`}),(0,Q.jsx)(`label`,{htmlFor:`comm-type-${t.id}`,className:`text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70`,children:t.name})]},t.id))}),(0,Q.jsx)(B,{})]})})]})}function sn({search:e,onSearchChange:t}){return(0,Q.jsxs)(`div`,{className:`relative`,children:[(0,Q.jsx)(te,{className:`absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(M,{type:`search`,placeholder:`Search machines...`,value:e,onChange:e=>t(e.target.value),className:`pl-9`})]})}function cn({contactId:e,isChecked:n,machine:r,onToggle:i}){let a=r.alertContact&&r.alertContact.contactId!==e?r.alertContact:null;return(0,Q.jsxs)(`label`,{className:`flex items-center gap-3 p-3 rounded-md hover:bg-muted/50 cursor-pointer min-h-[44px]`,children:[(0,Q.jsx)(de,{checked:n,onCheckedChange:e=>i(r.vin,e===!0)}),(0,Q.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Q.jsx)(`p`,{className:`text-sm font-medium truncate`,children:r.name&&r.name!==r.vin?r.name:nt(r.vin)}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground truncate`,children:r.vin}),a&&(0,Q.jsxs)(`p`,{className:`text-xs text-amber-600 flex items-center gap-1 mt-0.5`,children:[(0,Q.jsx)(t,{className:`h-3 w-3 shrink-0`}),`Currently: `,a.fullName]})]})]},r.vin)}function ln({contactId:e,machines:t,selectedVins:n,onToggle:r}){return t.length===0?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground p-3 text-center`,children:`No machines found for this account`}):(0,Q.jsx)(Q.Fragment,{children:t.map(t=>(0,Q.jsx)(cn,{contactId:e,isChecked:n.has(t.vin),machine:t,onToggle:r},t.vin))})}function un({contactId:e,filteredMachines:t,machines:n,onToggle:r,selectedVins:i}){return(0,Q.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto overscroll-contain border rounded-md`,"data-testid":`machine-assignment-scroll-region`,children:(0,Q.jsx)(`div`,{className:`p-1`,children:t.length===0&&n.length>0?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground p-3 text-center`,children:`No machines match your search`}):(0,Q.jsx)(ln,{contactId:e,machines:t,selectedVins:i,onToggle:r})})})}function dn({hasChanges:e,isSaving:t,onCancel:n,onSave:r}){return(0,Q.jsxs)(Pe,{className:`gap-2 sm:gap-0`,children:[(0,Q.jsx)(P,{variant:`outline`,onClick:n,disabled:t,children:`Cancel`}),(0,Q.jsx)(P,{onClick:r,disabled:t||!e,children:t?`Saving...`:`Save`})]})}function fn({contactId:e,contactName:t,filteredMachines:n,hasChanges:r,isSaving:i,machines:a,onOpenChange:o,onSearchChange:s,onToggle:c,onSave:l,search:u,selectedVins:f}){return(0,Q.jsxs)(Le,{className:`sm:max-w-lg max-h-[90vh] flex min-h-0 flex-col`,children:[(0,Q.jsxs)(Ne,{children:[(0,Q.jsxs)(He,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(d,{className:`h-4 w-4`}),`Machine Alerts for `,t]}),(0,Q.jsx)(Ie,{children:`Select which machines this contact should receive monitoring alerts for.`})]}),(0,Q.jsx)(sn,{search:u,onSearchChange:s}),(0,Q.jsx)(un,{contactId:e,filteredMachines:n,machines:a,onToggle:c,selectedVins:f}),(0,Q.jsx)(dn,{hasChanges:r,isSaving:i,onCancel:()=>o(!1),onSave:l})]})}function pn({currentVins:e,machines:t,onOpenChange:n,onSave:r,open:i,contactId:a}){let[o,s]=(0,$.useState)(new Set(e)),[c,l]=(0,$.useState)(``);return(0,$.useEffect)(()=>{i&&(s(new Set(e)),l(``))},[i,e]),{filteredMachines:(0,$.useMemo)(()=>{if(!c.trim())return t;let e=c.toLowerCase();return t.filter(t=>t.vin.toLowerCase().includes(e)||t.name?.toLowerCase().includes(e))},[t,c]),hasChanges:(0,$.useMemo)(()=>{let t=new Set(e);return o.size!==t.size||Array.from(o).some(e=>!t.has(e))},[o,e]),search:c,selectedVins:o,setSearch:l,toggleSelection:(e,t)=>{s(n=>{let r=new Set(n);return t?r.add(e):r.delete(e),r})},saveSelection:async()=>{await r(a,Array.from(o))&&n(!1)}}}function mn({open:e,onOpenChange:t,contactId:n,contactName:r,machines:i,currentVins:a,onSave:o,isSaving:s}){let c=pn({contactId:n,currentVins:a,machines:i,onOpenChange:t,onSave:o,open:e});return(0,Q.jsx)(Me,{open:e,onOpenChange:t,children:(0,Q.jsx)(fn,{contactId:n,contactName:r,filteredMachines:c.filteredMachines,hasChanges:c.hasChanges,isSaving:s,machines:i,onOpenChange:t,onSearchChange:c.setSearch,onSave:c.saveSelection,onToggle:c.toggleSelection,search:c.search,selectedVins:c.selectedVins})})}async function hn(e,t){try{return await e(t),!0}catch{return!1}}function gn(e){let t=new Map;for(let n of e){if(!n.alertContact)continue;let e=n.alertContact.contactId,r=t.get(e)??[];r.push(n),t.set(e,r)}return t}function _n(e){return new Map(Array.from(e.entries()).map(([e,t])=>[e,t.length]))}function vn(e,t){return typeof e==`number`?{contactId:e,vins:t??[]}:e}function yn(e){let{toast:t}=I(),n=ae({queryKey:[`/api/machines/metadata`,{contactAccountId:e}],queryFn:()=>ue.get(`/api/machines/metadata?contactAccountId=${e}`),enabled:e!==null}),r=n.data??[],i=(0,$.useMemo)(()=>gn(r),[r]),a=(0,$.useMemo)(()=>_n(i),[i]),o=w({mutationFn:async({contactId:e,vins:t})=>ue.put(`/api/contacts/${e}/monitored-machines`,{vins:t}),onSuccess:()=>{t({title:`Machine alerts updated`}),j.invalidateQueries({queryKey:[`/api/machines/metadata`]}),j.invalidateQueries({predicate:e=>e.queryKey.some(e=>e===`rain-source-assets`)})},onError:e=>{t({title:`Failed to update machine alerts`,description:e.message,variant:`destructive`})}});return{machines:r,machinesByContactId:i,countByContactId:a,saveBatch:((e,t)=>hn(o.mutateAsync,vn(e,t))),isSaving:o.isPending,isLoading:n.isLoading}}function bn(e){return e&&Number.isInteger(e.account_id)&&(e.account_id??0)>0?e.account_id??null:null}var xn=he({dealerId:ye().int().positive().optional()});function Sn(){let{user:e,isAuthenticated:r,isLoading:i}=fe(),[,a]=le(),[o,s]=(0,$.useState)(!1),[l,u]=(0,$.useState)(null),[d,f]=(0,$.useState)(null),[p,m]=(0,$.useState)(null),[h,g]=(0,$.useState)(null),ee=e=>u({contact:e}),_=f,te=m,{toast:ne}=I();T();let{search:re}=pe(xn),ie=re.dealerId??null,v=e?.role===`admin`||e?.role===`rm`?ie:e?.role===`dealer`?e.account_id??null:null;(0,$.useEffect)(()=>
1{if(!i){if(!r){a(`/login`);return}e&&e.role!==`dealer`&&e.role!==`admin`&&e.role!==`rm`&&a(`/access-denied`)}},[i,r,e,a]);let y=v?`/api/dealer/management?dealerId=${v}`:`/api/dealer/management`,{data:b,isLoading:x,error:S}=ae({queryKey:[`/api/dealer/management`,v],queryFn:({signal:e})=>A(`GET`,y,void 0,{signal:e}),enabled:!!e&&r&&!i&&(e.role===`dealer`||(e.role===`admin`||e.role===`rm`)&&!!v),retry:1}),w=(0,$.useMemo)(()=>b?.contacts?b.contacts.filter(e=>!e.address_id):[],[b?.contacts]),{countByContactId:oe}=yn(b?.account?.id??null),E=(0,$.useMemo)(()=>h===null?null:b?.contacts.find(e=>e.id===h)??null,[h,b?.contacts]),{machines:ce,machinesByContactId:j,saveBatch:M,isSaving:ue}=yn(bn(E)),de=(0,$.useMemo)(()=>{if(!b?.hierarchicalAddresses)return[];let{headquarters:e,shops:t}=b.hierarchicalAddresses,n=[];return e&&n.push(e),t?.length&&n.push(...t),n},[b?.hierarchicalAddresses]),P=(0,$.useMemo)(()=>{let e=new Map;for(let t of b?.contacts??[]){if(t.address_id==null)continue;let n=e.get(t.address_id)??[];n.push(t),e.set(t.address_id,n)}return e},[b?.contacts]);return(0,$.useEffect)(()=>{s(!1),u(null),f(null),m(null),g(null)},[v]),i||!e?(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h1`,{className:`mb-6 text-2xl font-semibold`,children:`Manage Dealership`}),(0,Q.jsxs)(`div`,{className:`flex h-48 flex-col items-center justify-center`,children:[(0,Q.jsx)(N,{className:`mb-4 size-8 text-primary`}),(0,Q.jsx)(`p`,{className:`text-sm text-gray-500`,children:`Verifying authentication...`})]})]}):(0,Q.jsxs)(et,{className:`space-y-6`,children:[(0,Q.jsx)(`h1`,{className:`mb-6 text-2xl font-semibold`,"data-testid":`page-title`,children:`Manage Dealership`}),(e.role===`admin`||e.role===`rm`)&&!v?(0,Q.jsx)(O,{className:`mb-6`,children:(0,Q.jsx)(D,{className:`py-8`,children:(0,Q.jsxs)(`div`,{className:`text-center text-gray-500`,children:[(0,Q.jsx)(c,{className:`mx-auto mb-4 size-12 text-amber-500`}),(0,Q.jsx)(`h2`,{className:`mb-2 text-lg font-semibold`,children:`No Dealership Selected`}),(0,Q.jsxs)(`p`,{children:[`Specify a dealership by adding`,` `,(0,Q.jsx)(`code`,{className:`rounded bg-gray-100 px-1`,children:`?dealerId=123`}),` to the URL.`]}),(0,Q.jsx)(`p`,{className:`mt-2 text-sm`,children:`This page is designed for dealer accounts to manage their dealership information.`})]})})}):S?(0,Q.jsx)(O,{className:`mb-6`,children:(0,Q.jsx)(D,{className:`py-8`,children:(0,Q.jsxs)(`div`,{className:`text-center text-red-600`,children:[(0,Q.jsx)(t,{className:`mx-auto mb-4 size-12`}),(0,Q.jsx)(`h2`,{className:`mb-2 text-lg font-semibold`,children:`Failed to Load`}),(0,Q.jsx)(`p`,{children:S.message||`Unable to load dealership information`})]})})}):x||!b?(0,Q.jsx)(`div`,{className:`flex h-48 flex-col items-center justify-center`,children:(0,Q.jsx)(N,{variant:`section`,label:`Loading dealership information...`})}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(bt,{user:e,managementData:b,setLogoDialogOpen:s,onEditAddress:_}),(0,Q.jsx)(ft,{parentLocations:de,getContactsForLocation:(e,t)=>e===t?P.get(e)??[]:[...P.get(e)??[],...P.get(t)??[]],onEditContact:ee,onEditAddress:_,countByContactId:oe,handleMergeContact:te,setMachineDialogContactId:g}),w.length>0&&(0,Q.jsxs)(O,{className:`mb-6`,"data-testid":`unassigned-contacts-card`,children:[(0,Q.jsxs)(C,{children:[(0,Q.jsxs)(k,{className:`flex items-center gap-2 text-lg`,children:[(0,Q.jsx)(n,{className:`size-5`}),` Unassigned Contacts`]}),(0,Q.jsx)(se,{children:`Contacts not linked to a specific location`})]}),(0,Q.jsx)(D,{children:(0,Q.jsx)(`div`,{className:`grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3`,children:w.map(e=>(0,Q.jsx)(rt,{unassigned:!0,contact:e,machineCount:oe.get(e.id)??0,onEditContact:ee,handleMergeContact:te,setMachineDialogContactId:g},e.id))})})]}),(0,Q.jsx)(ct,{managementData:b,effectiveDealerId:v,user:e}),(0,Q.jsx)(Lt,{managementData:b,effectiveDealerId:v}),(0,Q.jsx)(gt,{managementData:b,effectiveDealerId:v,logoDialogOpen:o,setLogoDialogOpen:s},v),(0,Q.jsx)(nn,{open:l!==null,onOpenChange:e=>{e||u(null)},contact:l?.contact,addresses:(b?.addresses||[]).filter(e=>e.address_type===`headquarters`||e.address_type===`shop_location`||e.address_type===`shop`),communicationTypes:b?.communication_types||[],accountId:b?.account?.id??null,onSuccess:()=>{u(null)},dealerId:v,onContactUpdate:e=>u({contact:e})}),(0,Q.jsx)(Wt,{open:d!==null,onOpenChange:e=>{e||f(null)},address:d?.address,onSuccess:()=>f(null),dealerId:v,mode:d?.mode??`location`,parentAddressId:d?.parent?.id,parentAddressLabel:d?.parent?.label}),E&&(0,Q.jsx)(mn,{open:h!==null,onOpenChange:e=>{e||g(null)},contactId:E.id,contactName:`${E.first} ${E.last}`,machines:ce,currentVins:(j.get(E.id)??[]).map(e=>e.vin),onSave:M,isSaving:ue}),p&&(0,Q.jsx)(tt,{open:p!==null,onOpenChange:e=>{e||m(null)},entityType:`contact`,sourceId:p.id,sourceName:`${p.first} ${p.last}`,scopedEntities:b?.contacts||[],onMergeComplete:()=>{m(null)},dealerId:v})]})]})}export{Sn 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.