PageSourceSearch

https://cycleevmobility.nl/assets/admin.gemeentes-J_2uxqhl.js

js cycleevmobility.nl collected 2026-10-07 06:16:49 UTC 14,725 bytes, 26 lines download raw bytes

1import{r as i,j as e}from"./vendor-react-DJmjAfl2.js";import{ac as b,ae as v,ad as w,e as j,j as p,B as o,L as J}from"./index-x9QNWmN4.js";import{c as Ne,u as X,b as S}from"./vendor-query-B8PBsYdN.js";import{t as d}from"./vendor-sonner-_Iiq5v5b.js";import{g as ye}from"./portal.functions-CNQoqRi1.js";import{C as Y,c as ee}from"./card-Dnaok4nL.js";import{I as u}from"./input-BeTpIO3a.js";import{L as m}from"./label-CQxwAlB-.js";import{T as te}from"./textarea-C8LHgBed.js";import{B as ke}from"./badge-CIl_GgBJ.js";import{S as _,a as O,b as T,c as M,d as g}from"./select-BAbEasbx.js";import{D as ne,a as re,c as le,b as ie,e as ce}from"./dialog-BrFtiTqF.js";import{r as Se,aP as Ce,aJ as _e,l as ae,i as se,z as Oe,e as Te,ab as Me,v as oe,G as Pe,aE as Be}from"./vendor-icons-C-5BG5OA.js";import"./vendor-supabase-DLvwz3tW.js";import"./vendor-radix-zGLEosEN.js";import"./vendor-charts-DUPonvJN.js";import"./vendor-forms-BpJIEFtM.js";import"./data-aeo-BuSp_0My.js";import"./data-faq-VtuDGZ0E.js";import"./data-gemeentes-CX7wwwEd.js";import"./data-blog-4niK8dn0.js";const Ge=b({method:"POST"}).middleware([v]).handler(w("5cfd8562488874460abd886cf0fcd7d1d3559a2d898fa38cfa9a208b1dff0dfe")),Fe=b({method:"POST"}).middleware([v]).handler(w("ff00b688e3d3bd6c5ed2596c3f4e82347f4cfdb14433cd4ab3d1b161a489caa8")),Le=b({method:"POST"}).middleware([v]).handler(w("55445f41d686faf0bc8a446e1fe23c643d56c4d19bf469c6bfbe04d543d43d86")),Ee=b({method:"POST"}).middleware([v]).handler(w("2349ec3cde166d36c40bbce432017ed9c83d36825fc23c8c393bb51ec40eeddc")),Re=b({method:"POST"}).middleware([v]).handler(w("63c180ea15999f502ada56e73fb630a84c7f35b32efc5c081103b17070de022b")),We=b({method:"POST"}).middleware([v]).handler(w("8f86be500a29c8da401fdddd9ac717340751174b2f554c25092af2f6b53d50d7")),de=i.forwardRef(({className:s,...r},l)=>e.jsx("div",{className:"relative w-full overflow-auto",children:e.jsx("table",{ref:l,className:j("w-full caption-bottom text-sm",s),...r})}));de.displayName="Table";const me=i.forwardRef(({className:s,...r},l)=>e.jsx("thead",{ref:l,className:j("[&_tr]:border-b",s),...r}));me.displayName="TableHeader";const xe=i.forwardRef(({className:s,...r},l)=>e.jsx("tbody",{ref:l,className:j("[&_tr:last-child]:border-0",s),...r}));xe.displayName="TableBody";const Ae=i.forwardRef(({className:s,...r},l)=>e.jsx("tfoot",{ref:l,className:j("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",s),...r}));Ae.displayName="TableFooter";const N=i.forwardRef(({className:s,...r},l)=>e.jsx("tr",{ref:l,className:j("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",s),...r}));N.displayName="TableRow";const f=i.forwardRef(({className:s,...r},l)=>e.jsx("th",{ref:l,className:j("h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",s),...r}));f.displayName="TableHead";const h=i.forwardRef(({className:s,...r},l)=>e.jsx("td",{ref:l,className:j("p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",s),...r}));h.displayName="TableCell";const ze=i.forwardRef(({className:s,...r},l)=>e.jsx("caption",{ref:l,className:j("mt-4 text-sm text-muted-foreground",s),...r}));ze.displayName="TableCaption";const C={to_contact:"Nog benaderen",contacted:"Gemaild",in_talks:"In gesprek",contracted:"Gecontracteerd",rejected:"Afgewezen"},$e={to_contact:"bg-slate-500/10 text-slate-700",contacted:"bg-blue-500/10 text-blue-700",in_talks:"bg-amber-500/10 text-amber-700",contracted:"bg-emerald-500/10 text-emerald-700",rejected:"bg-red-500/10 text-red-700"},he=["Groningen","Fryslân","Drenthe","Overijssel","Flevoland","Gelderland","Utrecht","Noord-Holland","Zuid-Holland","Zeeland","Noord-Brabant","Limburg"];function ma(){const s=Ne(),r=p(ye),l=p(Ge),x=p(Fe),n=p(Le),c=p(Ee),t=p(Re),P=p(We),[B,ue]=i.useState("all"),[G,je]=i.useState("all"),[F,pe]=i.useState(""),[z,L]=i.useState(null),[$,K]=i.useState(null),[fe,E]=i.useState(!1),[V,q]=i.useState(!1),{data:D,isLoading:ge}=X({queryKey:["portal-profile"],queryFn:()=>r()}),{data:I,isLoading:H,refetch:be}=X({queryKey:["gemeentes",B,G,F],queryFn:()=>l({data:{status:B,province:G,search:F}}),enabled:!!D?.isAdmin}),Q=S({mutationFn:a=>x({data:a}),onSuccess:()=>{s.invalidateQueries({queryKey:["gemeentes"]}),d.success("Opgeslagen"),L(null),E(!1)},onError:a=>d.error(a.message??"Opslaan mislukt")}),ve=S({mutationFn:a=>n({data:{id:a}}),onSuccess:()=>{s.invalidateQueries({queryKey:["gemeentes"]}),d.success("Verwijderd")}}),R=S({mutationFn:()=>c(),onSuccess:a=>{s.invalidateQueries({queryKey:["gemeentes"]}),d.success(`${a.inserted} gemeentes toegevoegd (${a.total} totaal in lijst)`)},onError:a=>d.error(a.message??"Seed mislukt")}),y=S({mutationFn:a=>t({data:{id:a}}),onSuccess:a=>{s.invalidateQueries({queryKey:["gemeentes"]}),a.email?d.success(`Email gevonden: ${a.email}`):d.info("Geen email gevonden, probeer handmatig")},onError:a=>d.error(a.message??"Scrape mislukt")}),we=async()=>{q(!0);try{let a=0,k=0;for(let Z=0;Z<5;Z+=1){const A=await P({data:{limit:10}});if(k+=A.scraped,a+=A.found,A.scraped===0)break;await be()}d.success(`Batch klaar: ${k} gescraped, ${a} emails gevonden`)}catch(a){d.error(a.message??"Batch mislukt")}finally{q(!1)}};if(ge)return e.jsx("div",{className:"container mx-auto max-w-7xl px-4 py-10",children:"Laden…"});if(!D?.isAdmin)return e.jsxs("div",{className:"container mx-auto max-w-2xl px-4 py-10",children:[e.jsx("p",{children:"Geen admin toegang."}),e.jsx(o,{asChild:!0,variant:"link",children:e.jsx(J,{to:"/portaal",children:"Terug"})})]});const W=I?.counts??{to_contact:0,contacted:0,in_talks:0,contracted:0,rejected:0,total:0},U=I?.rows??[];return e.jsxs("div",{className:"container mx-auto max-w-7xl px-4 py-8",children:[e.jsxs("div",{className:"mb-6 flex items-center justify-between flex-wrap gap-3",children:[e.jsxs("div",{children:[e.jsx(o,{asChild:!0,variant:"ghost",size:"sm",className:"mb-2 -ml-3",children:e.jsxs(J,{to:"/admin",children:[e.jsx(Se,{className:"mr-1 h-4 w-4"})," Admin"]})}),e.jsxs("h1",{className:"font-display text-3xl flex items-center gap-2",children:[e.jsx(Ce,{className:"h-7 w-7"})," PGB / WMO Gemeentes"]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"Outreach-lijst met automatische WMO-email scraping via Firecrawl."})]}),e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[W.total===0&&e.jsxs(o,{onClick:()=>R.mutate(),disabled:R.isPending,children:[e.jsx(_e,{className:"mr-2 h-4 w-4"}),R.isPending?"Bezig…":"Seed 342 gemeentes"]}),e.jsxs(o,{variant:"outline",onClick:we,disabled:V||W.total===0,children:[V?e.jsx(ae,{className:"mr-2 h-4 w-4 animate-spin"}):e.jsx(se,{className:"mr-2 h-4 w-4"}),"Scrape 50 zonder email"]}),e.jsxs(o,{onClick:()=>E(!0),children:[e.jsx(Oe,{className:"mr-2 h-4 w-4"})," Nieuw"]})]})]}),e.jsx("div",{className:"mb-6 grid grid-cols-2 sm:grid-cols-5 ga
1p-3",children:["to_contact","contacted","in_talks","contracted","rejected"].map(a=>e.jsx(Y,{children:e.jsxs(ee,{className:"pt-4",children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:C[a]}),e.jsx("div",{className:"text-2xl font-semibold",children:W[a]??0})]})},a))}),e.jsxs("div",{className:"mb-4 flex gap-2 flex-wrap",children:[e.jsxs("div",{className:"relative flex-1 min-w-[200px]",children:[e.jsx(Te,{className:"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx(u,{placeholder:"Zoek op naam…",value:F,onChange:a=>pe(a.target.value),className:"pl-8"})]}),e.jsxs(_,{value:B,onValueChange:ue,children:[e.jsx(O,{className:"w-[180px]",children:e.jsx(T,{})}),e.jsxs(M,{children:[e.jsx(g,{value:"all",children:"Alle statussen"}),Object.entries(C).map(([a,k])=>e.jsx(g,{value:a,children:k},a))]})]}),e.jsxs(_,{value:G,onValueChange:je,children:[e.jsx(O,{className:"w-[180px]",children:e.jsx(T,{})}),e.jsxs(M,{children:[e.jsx(g,{value:"all",children:"Alle provincies"}),he.map(a=>e.jsx(g,{value:a,children:a},a))]})]})]}),e.jsx(Y,{children:e.jsx(ee,{className:"p-0",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(de,{children:[e.jsx(me,{children:e.jsxs(N,{children:[e.jsx(f,{children:"Gemeente"}),e.jsx(f,{children:"Provincie"}),e.jsx(f,{children:"WMO Email"}),e.jsx(f,{children:"Status"}),e.jsx(f,{className:"text-right",children:"Acties"})]})}),e.jsxs(xe,{children:[H&&e.jsx(N,{children:e.jsx(h,{colSpan:5,className:"text-center py-8",children:"Laden…"})}),!H&&U.length===0&&e.jsx(N,{children:e.jsx(h,{colSpan:5,className:"text-center py-8 text-muted-foreground",children:'Nog geen gemeentes. Klik "Seed 342 gemeentes" om te starten.'})}),U.map(a=>e.jsxs(N,{children:[e.jsxs(h,{children:[e.jsx("div",{className:"font-medium",children:a.name}),a.website_url&&e.jsxs("a",{href:a.website_url,target:"_blank",rel:"noopener noreferrer",className:"text-xs text-muted-foreground hover:underline inline-flex items-center gap-1",children:[a.website_url.replace(/^https?:\/\//,"")," ",e.jsx(Me,{className:"h-3 w-3"})]})]}),e.jsx(h,{className:"text-sm text-muted-foreground",children:a.province??"—"}),e.jsx(h,{children:a.wmo_email?e.jsx("a",{href:`mailto:${a.wmo_email}`,className:"text-sm hover:underline",children:a.wmo_email}):e.jsx("span",{className:"text-xs text-muted-foreground italic",children:"geen email"})}),e.jsx(h,{children:e.jsx(ke,{variant:"secondary",className:$e[a.status],children:C[a.status]})}),e.jsx(h,{className:"text-right",children:e.jsxs("div",{className:"flex gap-1 justify-end",children:[e.jsx(o,{size:"sm",variant:"ghost",onClick:()=>y.mutate(a.id),disabled:y.isPending,title:"Scrape WMO-email",children:y.isPending&&y.variables===a.id?e.jsx(ae,{className:"h-4 w-4 animate-spin"}):e.jsx(se,{className:"h-4 w-4"})}),e.jsx(o,{size:"sm",variant:"ghost",onClick:()=>K(a),title:"Mailtemplate",children:e.jsx(oe,{className:"h-4 w-4"})}),e.jsx(o,{size:"sm",variant:"ghost",onClick:()=>L(a),children:"Bewerk"}),e.jsx(o,{size:"sm",variant:"ghost",onClick:()=>confirm(`Verwijder ${a.name}?`)&&ve.mutate(a.id),children:e.jsx(Pe,{className:"h-4 w-4"})})]})})]},a.id))]})]})})})}),(z||fe)&&e.jsx(Ke,{gemeente:z,onClose:()=>{L(null),E(!1)},onSave:a=>Q.mutate(a),saving:Q.isPending}),$&&e.jsx(Ve,{gemeente:$,onClose:()=>K(null)})]})}function Ke({gemeente:s,onClose:r,onSave:l,saving:x}){const[n,c]=i.useState({name:s?.name??"",province:s?.province??"",website_url:s?.website_url??"",wmo_email:s?.wmo_email??"",contact_page_url:s?.contact_page_url??"",contact_person:s?.contact_person??"",phone:s?.phone??"",status:s?.status??"to_contact",notes:s?.notes??""});return e.jsx(ne,{open:!0,onOpenChange:r,children:e.jsxs(re,{className:"max-w-2xl",children:[e.jsx(le,{children:e.jsx(ie,{children:s?`Bewerk ${s.name}`:"Nieuwe gemeente"})}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(m,{children:"Naam"}),e.jsx(u,{value:n.name,onChange:t=>c({...n,name:t.target.value})})]}),e.jsxs("div",{children:[e.jsx(m,{children:"Provincie"}),e.jsxs(_,{value:n.province,onValueChange:t=>c({...n,province:t}),children:[e.jsx(O,{children:e.jsx(T,{placeholder:"Kies…"})}),e.jsx(M,{children:he.map(t=>e.jsx(g,{value:t,children:t},t))})]})]}),e.jsxs("div",{children:[e.jsx(m,{children:"Status"}),e.jsxs(_,{value:n.status,onValueChange:t=>c({...n,status:t}),children:[e.jsx(O,{children:e.jsx(T,{})}),e.jsx(M,{children:Object.entries(C).map(([t,P])=>e.jsx(g,{value:t,children:P},t))})]})]}),e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(m,{children:"Website"}),e.jsx(u,{value:n.website_url,onChange:t=>c({...n,website_url:t.target.value})})]}),e.jsxs("div",{children:[e.jsx(m,{children:"WMO Email"}),e.jsx(u,{value:n.wmo_email,onChange:t=>c({...n,wmo_email:t.target.value})})]}),e.jsxs("div",{children:[e.jsx(m,{children:"Telefoon"}),e.jsx(u,{value:n.phone,onChange:t=>c({...n,phone:t.target.value})})]}),e.jsxs("div",{children:[e.jsx(m,{children:"Contactpersoon"}),e.jsx(u,{value:n.contact_person,onChange:t=>c({...n,contact_person:t.target.value})})]}),e.jsxs("div",{children:[e.jsx(m,{children:"Contactpagina URL"}),e.jsx(u,{value:n.contact_page_url,onChange:t=>c({...n,contact_page_url:t.target.value})})]}),e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(m,{children:"Notities"}),e.jsx(te,{rows:3,value:n.notes,onChange:t=>c({...n,notes:t.target.value})})]})]}),e.jsxs(ce,{children:[e.jsx(o,{variant:"outline",onClick:r,children:"Annuleren"}),e.jsx(o,{onClick:()=>l({...n,id:s?.id}),disabled:x||!n.name.trim(),children:x?"Opslaan…":"Opslaan"})]})]})})}function Ve({gemeente:s,onClose:r}){const l="Cycle EV Mobility – gecontracteerde leverancier PGB/WMO hulpmiddelen",x=`Geachte medewerker WMO van gemeente ${s.name},
2
3Wij zijn Cycle EV Mobility, een gespecialiseerd bedrijf gevestigd in Amsterdam-Krimpen aan de Lek, en leveren elektrische mobiliteitshulpmiddelen aan cliënten met een PGB of WMO-indicatie:
4
5• Scootmobielen (nieuw en occasion, alle merken)
6• Elektrische brommobielen en microcars (voor mensen zonder rijbewijs)
7• Elektrische fietsen en aangepaste voertuigen
8• Onderhoud, reparatie en accu-service
9
10Wij zouden ons graag als gecontracteerde leverancier bij gemeente ${s.name} aanmelden. Wat wij bieden:
11
12✓ Volledige service: intake, proefrit aan huis, levering, instructie
13✓ Landelijke dekking met eigen bezorgdienst
14✓ Wwft-geregistreerd en volledig transparante prijsstelling
15✓ Garantie en snelle onderhoudsservice
16✓ Ervaring met PGB-administratie en WMO-facturatie
17
18Graag ontvangen wij informatie over uw aanmeldprocedure voor nieuwe hulpmiddelenleveranciers. Ik neem uiteraard ook graag telefonisch contact op voor een korte kennismaking.
19
20Met vriendelijke groet,
21
22Cycle EV Mobility
23Krimpen aan de Lek
24https://cycleevmobility.nl
25[email protected]
26`,n=`mailto:${s.wmo_email??""}?subject=${encodeURIComponent(l)}&body=${encodeURIComponent(x)}`,c=()=>{navigator.clipboard.writeText(x),d.success("Tekst gekopieerd")};return e.jsx(ne,{open:!0,onOpenChange:r,children:e.jsxs(re,{className:"max-w-2xl",children:[e.jsx(le,{children:e.jsxs(ie,{children:["Mailtemplate — ",s.name]})}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx(m,{children:"Onderwerp"}),e.jsx(u,{readOnly:!0,value:l})]}),e.jsxs("div",{children:[e.jsx(m,{children:"Bericht"}),e.jsx(te,{readOnly:!0,value:x,rows:16,className:"font-mono text-xs"})]}),!s.wmo_email&&e.jsx("p",{className:"text-xs text-amber-600",children:'Geen WMO-email bekend. Klik "Scrape WMO-email" op de rij, of vul handmatig in.'})]}),e.jsxs(ce,{children:[e.jsxs(o,{variant:"outline",onClick:c,children:[e.jsx(Be,{className:"mr-2 h-4 w-4"})," Kopieer tekst"]}),e.jsx(o,{asChild:!0,disabled:!s.wmo_email,children:e.jsxs("a",{href:n,children:[e.jsx(oe,{className:"mr-2 h-4 w-4"})," Open in mail"]})})]})]})})}export{ma 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.