PageSourceSearch

https://doghealthy.netlify.app/_nuxt/CBDeK91b.js

js doghealthy.netlify.app collected 2026-10-03 10:41:05 UTC 17,947 bytes, 1 lines download raw bytes

1import{f as te,D as le,H as se,u as oe,g as ne,q as R,r as p,h as ae,L as j,C as de,w as $,j as l,o as m,a as t,c as b,i as U,b as A,e as ie,d as c,t as x,F as O,l as re,m as d,v as i,I as M,n as T,k as ue,s as pe}from"#entry";import{a as me,_ as be}from"./CJQauOmt.js";import{_ as xe}from"./BRsHvoYg.js";import{u as fe}from"./Dy9pVEbO.js";import"./DKLWY9DJ.js";const ve={class:"mb-4"},ce={key:0,class:"mb-4 text-sm text-red-700 bg-red-50 border border-red-200 rounded-lg px-3 py-2"},ge={key:1,class:"mb-4 text-sm text-green-800 bg-green-50 border border-green-200 rounded-lg px-3 py-2"},_e={key:2,class:"text-slate-600 py-8"},ye={class:"grid sm:grid-cols-2 gap-4"},we={class:"sm:col-span-2"},ke={class:"sm:col-span-2"},he={class:"sm:col-span-2"},Ue={class:"flex items-center gap-2 text-sm text-slate-700 sm:col-span-2"},Ve={class:"flex items-center gap-2 text-sm text-slate-700 sm:col-span-2"},De={class:"flex flex-wrap gap-2"},Se=["disabled"],Ce=["disabled"],Ee={class:"bg-white rounded-xl border border-slate-200 shadow-sm p-6"},Fe={class:"flex flex-wrap items-center justify-between gap-3 mb-4"},Ne={class:"font-semibold text-slate-900"},$e={key:0,class:"mb-5 rounded-lg border border-slate-200 bg-slate-50 p-4 space-y-3"},Ae={class:"text-sm font-semibold text-slate-900"},Me={class:"grid sm:grid-cols-2 gap-3"},Te={class:"sm:col-span-2"},qe={class:"flex items-center gap-2 text-sm text-slate-700"},Be={class:"flex items-center gap-2 text-sm text-slate-700"},Le={class:"flex flex-wrap gap-2"},Ie=["disabled"],Pe=["disabled"],Re={key:1,class:"text-sm text-slate-500"},je={key:2,class:"text-sm text-slate-500"},Oe={key:3,class:"divide-y divide-slate-100"},Ge={class:"font-medium text-slate-900"},He={class:"text-xs text-slate-500"},Ye={key:0},We={class:"flex flex-wrap gap-3 text-sm"},ze=["onClick"],Je=["disabled","onClick"],lt=te({__name:"[id]",setup(Ke){const G=le(),H=se(),g=oe(),Y=ne(),_=R(()=>G.params.id);fe({title:"Edit user — Admin",path:"/admin/users",index:!1});const q=()=>({id:null,name:"",breed:"",gender:"",birth_date:"",weight_kg:null,color:"",microchip_number:"",notes:"",is_active:!0,nfc_tag_enabled:!1}),V=p(!0),w=p(!1),D=p(!1),u=p(""),f=p(""),n=p(null),k=p([]),v=p(1),S=p(0),C=p(!1),E=p(!1),a=p(q()),h=p(!1),F=p(""),W=R(()=>n.value?.full_name||n.value?.email||"Edit user"),z=o=>{if(!o)return"";const e=new Date(o);if(Number.isNaN(e.getTime()))return"";const r=y=>String(y).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())}T${r(e.getHours())}:${r(e.getMinutes())}`},J=o=>{if(!o)return null;const e=new Date(o);return Number.isNaN(e.getTime())?null:e.toISOString()},N=async()=>{C.value=!0;try{const{from:o,to:e}=me(v.value),{data:r,error:y,count:L}=await g.from("doghealthy_dogs").select("id, name, breed, gender, birth_date, weight_kg, color, microchip_number, notes, is_active, nfc_tag_enabled",{count:"exact"}).eq("user_id",_.value).order("created_at",{ascending:!1}).range(o,e);if(y)throw y;k.value=r||[],S.value=L||0}catch(o){u.value=o?.message||"Failed to load dogs",k.value=[],S.value=0}finally{C.value=!1}},I=async()=>{V.value=!0,u.value="",f.value="",E.value=!1,v.value=1;try{const{data:o,error:e}=await g.from("doghealthy_users").select("*").eq("id",_.value).maybeSingle();if(e)throw e;if(!o)throw new Error("User not found");n.value={email:o.email||"",full_name:o.full_name||"",phone:o.phone||"",billing_name:o.billing_name||"",address_line1:o.address_line1||"",address_line2:o.address_line2||"",address_city:o.address_city||"",address_postcode:o.address_postcode||"",subscription_status:o.subscription_status||"",subscription_plan:o.subscription_plan||"",subscription_current_period_end:z(o.subscription_current_period_end),nfc_chip_status:o.nfc_chip_status||"none",nfc_chip_notes:o.nfc_chip_notes||"",is_admin:!!o.is_admin,notify_found_sms:o.notify_found_sms!==!1},await N()}catch(o){u.value=o?.message||"Failed to load user",n.value=null}finally{V.value=!1}},K=async()=>{if(n.value){w.value=!0,u.value="",f.value="";try{const o={email:n.value.email.trim(),full_name:n.value.full_name.trim()||null,phone:n.value.phone.trim()||null,billing_name:n.value.billing_name.trim()||null,address_line1:n.value.address_line1.trim()||null,address_line2:n.value.address_line2.trim()||null,address_city:n.value.address_city.trim()||null,address_postcode:n.value.address_postcode.trim().toUpperCase()||null,address_country:"GB",subscription_status:n.value.subscription_status||null,subscription_plan:n.value.subscription_plan||null,subscription_current_period_end:J(n.value.subscription_current_period_end),nfc_chip_status:n.value.nfc_chip_status||"none",nfc_chip_notes:n.value.nfc_chip_notes.trim()||null,is_admin:n.value.is_admin,notify_found_sms:n.value.notify_found_sms};n.value.nfc_chip_status==="shipped"&&(o.nfc_chip_shipped_at=new Date().toISOString());const{error:e}=await g.from("doghealthy_users").update(o).eq("id",_.value);if(e)throw e;f.value="User saved."}catch(o){u.value=o?.message||"Failed to save user"}finally{w.value=!1}}},Q=async()=>
1{if(!n.value)return;if(Y.user?.id===_.value){u.value="You cannot delete your own admin account.";return}const o=n.value.full_name||n.value.email;if(confirm(`Delete user “${o}” and all their dogs / related data? This cannot be undone.`)){D.value=!0,u.value="";try{const{error:e}=await g.from("doghealthy_users").delete().eq("id",_.value);if(e)throw e;await H.push("/admin/users")}catch(e){u.value=e?.message||"Failed to delete user"}finally{D.value=!1}}},P=o=>{u.value="",f.value="",o?a.value={id:o.id,name:o.name||"",breed:o.breed||"",gender:o.gender||"",birth_date:o.birth_date||"",weight_kg:o.weight_kg,color:o.color||"",microchip_number:o.microchip_number||"",notes:o.notes||"",is_active:o.is_active!==!1,nfc_tag_enabled:!!o.nfc_tag_enabled}:a.value=q(),E.value=!0},B=()=>{E.value=!1,a.value=q()},X=async()=>{const o=a.value.name.trim();if(o){h.value=!0,u.value="",f.value="";try{const e={user_id:_.value,name:o,breed:a.value.breed.trim()||null,gender:a.value.gender||null,birth_date:a.value.birth_date||null,weight_kg:a.value.weight_kg,color:a.value.color.trim()||null,microchip_number:a.value.microchip_number.trim()||null,notes:a.value.notes.trim()||null,is_active:a.value.is_active,nfc_tag_enabled:a.value.nfc_tag_enabled};if(a.value.id){const{error:r}=await g.from("doghealthy_dogs").update(e).eq("id",a.value.id);if(r)throw r;f.value="Dog updated."}else{const{error:r}=await g.from("doghealthy_dogs").insert(e);if(r)throw r;f.value="Dog created.",v.value=1}B(),await N()}catch(e){u.value=e?.message||"Failed to save dog"}finally{h.value=!1}}},Z=async o=>{if(confirm(`Delete dog “${o.name}” and related records? This cannot be undone.`)){F.value=o.id,u.value="";try{const{error:e}=await g.from("doghealthy_dogs").delete().eq("id",o.id);if(e)throw e;f.value=`Deleted ${o.name}.`,a.value.id===o.id&&B(),k.value.length<=1&&v.value>1?v.value-=1:await N()}catch(e){u.value=e?.message||"Failed to delete dog"}finally{F.value=""}}};return ae(I),j(_,I),j(v,()=>{V.value||N()}),(o,e)=>{const r=ie,y=be,L=xe;return m(),de(L,{title:l(W),subtitle:"Edit profile, subscription, shipping and this user’s dogs."},{default:$(()=>[t("div",ve,[A(r,{to:"/admin/users",class:"text-sm text-blue-700 hover:underline"},{default:$(()=>[...e[27]||(e[27]=[c("← All users",-1)])]),_:1})]),l(u)?(m(),b("div",ce,x(l(u)),1)):U("",!0),l(f)?(m(),b("div",ge,x(l(f)),1)):U("",!0),l(V)?(m(),b("div",_e,"Loading…")):l(n)?(m(),b(O,{key:3},[t("form",{class:"bg-white rounded-xl border border-slate-200 shadow-sm p-6 space-y-5 mb-8",onSubmit:re(K,["prevent"])},[t("div",ye,[t("div",null,[e[28]||(e[28]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Email",-1)),d(t("input",{"onUpdate:modelValue":e[0]||(e[0]=s=>l(n).email=s),type:"email",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},null,512),[[i,l(n).email]])]),t("div",null,[e[29]||(e[29]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Full name",-1)),d(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>l(n).full_name=s),type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},null,512),[[i,l(n).full_name]])]),t("div",null,[e[30]||(e[30]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Phone",-1)),d(t("input",{"onUpdate:modelValue":e[2]||(e[2]=s=>l(n).phone=s),type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},null,512),[[i,l(n).phone]])]),t("div",null,[e[31]||(e[31]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Billing / shipping name",-1)),d(t("input",{"onUpdate:modelValue":e[3]||(e[3]=s=>l(n).billing_name=s),type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},null,512),[[i,l(n).billing_name]])]),t("div",we,[e[32]||(e[32]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Address line 1",-1)),d(t("input",{"onUpdate:modelValue":e[4]||(e[4]=s=>l(n).address_line1=s),type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},null,512),[[i,l(n).address_line1]])]),t("div",ke,[e[33]||(e[33]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Address line 2",-1)),d(t("input",{"onUpdate:modelValue":e[5]||(e[5]=s=>l(n).address_line2=s),type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},null,512),[[i,l(n).address_line2]])]),t("div",null,[e[34]||(e[34]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"City",-1)),d(t("input",{"onUpdate:modelValue":e[6]||(e[6]=s=>l(n).address_city=s),type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},null,512),[[i,l(n).address_city]])]),t("div",null,[e[35]||(e[35]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"}
1,"Postcode",-1)),d(t("input",{"onUpdate:modelValue":e[7]||(e[7]=s=>l(n).address_postcode=s),type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm uppercase"},null,512),[[i,l(n).address_postcode]])]),t("div",null,[e[37]||(e[37]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Subscription status",-1)),d(t("select",{"onUpdate:modelValue":e[8]||(e[8]=s=>l(n).subscription_status=s),class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},[...e[36]||(e[36]=[t("option",{value:""},"none",-1),t("option",{value:"active"},"active",-1),t("option",{value:"trialing"},"trialing",-1),t("option",{value:"canceled"},"canceled",-1),t("option",{value:"past_due"},"past_due",-1),t("option",{value:"unpaid"},"unpaid",-1)])],512),[[M,l(n).subscription_status]])]),t("div",null,[e[39]||(e[39]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Subscription plan",-1)),d(t("select",{"onUpdate:modelValue":e[9]||(e[9]=s=>l(n).subscription_plan=s),class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},[...e[38]||(e[38]=[t("option",{value:""},"none",-1),t("option",{value:"monthly"},"monthly",-1),t("option",{value:"yearly"},"yearly",-1)])],512),[[M,l(n).subscription_plan]])]),t("div",null,[e[40]||(e[40]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Period end",-1)),d(t("input",{"onUpdate:modelValue":e[10]||(e[10]=s=>l(n).subscription_current_period_end=s),type:"datetime-local",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},null,512),[[i,l(n).subscription_current_period_end]])]),t("div",null,[e[42]||(e[42]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"NFC chip status",-1)),d(t("select",{"onUpdate:modelValue":e[11]||(e[11]=s=>l(n).nfc_chip_status=s),class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},[...e[41]||(e[41]=[t("option",{value:"none"},"none",-1),t("option",{value:"pending"},"pending",-1),t("option",{value:"shipped"},"shipped",-1),t("option",{value:"cancelled"},"cancelled",-1)])],512),[[M,l(n).nfc_chip_status]])]),t("div",he,[e[43]||(e[43]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"NFC chip notes",-1)),d(t("textarea",{"onUpdate:modelValue":e[12]||(e[12]=s=>l(n).nfc_chip_notes=s),rows:"2",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm"},null,512),[[i,l(n).nfc_chip_notes]])]),t("label",Ue,[d(t("input",{"onUpdate:modelValue":e[13]||(e[13]=s=>l(n).is_admin=s),type:"checkbox",class:"rounded border-slate-300"},null,512),[[T,l(n).is_admin]]),e[44]||(e[44]=c(" Admin role ",-1))]),t("label",Ve,[d(t("input",{"onUpdate:modelValue":e[14]||(e[14]=s=>l(n).notify_found_sms=s),type:"checkbox",class:"rounded border-slate-300"},null,512),[[T,l(n).notify_found_sms]]),e[45]||(e[45]=c(" Found-dog SMS enabled ",-1))])]),t("div",De,[t("button",{type:"submit",class:"px-5 py-2.5 bg-slate-900 hover:bg-slate-800 text-white rounded-lg text-sm font-semibold disabled:opacity-60",disabled:l(w)},x(l(w)?"Saving…":"Save user"),9,Se),t("button",{type:"button",class:"px-5 py-2.5 border border-red-300 text-red-700 rounded-lg text-sm font-semibold hover:bg-red-50 disabled:opacity-60",disabled:l(w)||l(D),onClick:Q},x(l(D)?"Deleting…":"Delete user"),9,Ce)])],32),t("section",Ee,[t("div",Fe,[t("h3",Ne,"Dogs ("+x(l(S))+")",1),t("button",{type:"button",class:"px-3 py-1.5 bg-slate-900 text-white rounded-lg text-sm font-semibold",onClick:e[15]||(e[15]=s=>P())}," Add dog ")]),l(E)?(m(),b("div",$e,[t("h4",Ae,x(l(a).id?"Edit dog":"Add dog"),1),t("div",Me,[t("div",null,[e[46]||(e[46]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Name",-1)),d(t("input",{"onUpdate:modelValue":e[16]||(e[16]=s=>l(a).name=s),required:"",type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm bg-white"},null,512),[[i,l(a).name]])]),t("div",null,[e[47]||(e[47]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Breed",-1)),d(t("input",{"onUpdate:modelValue":e[17]||(e[17]=s=>l(a).breed=s),type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm bg-white"},null,512),[[i,l(a).breed]])]),t("div",null,[e[49]||(e[49]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Gender",-1)),d(t("select",{"onUpdate:modelValue":e[18]||(e[18]=s=>l(a).gender=s),class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm bg-white"},[...e[48]||(e[48]=[t("option",{value:""},"—",-1),t("option",{value:"male"},"male",-1),t("option",{value:"female"},"female",-1),t("option",{value:"unknown"},"unknown",-1)])],512),[[M,l(a).gender]])]),t("div",null,[e[50]||(e[50]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Birth date",-1)),d(t("input",{"onUpdate:modelValue":e[19]||(e[19]=s=>l(a).birth_date=s),type:"date",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm bg-white"},null,512),[[i,l(a).birth_date]])]),t("div",null,[e[51]||(e[51]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Weight (kg)",-1)),d(t("input",{"onUpdate:modelValue":e[20]||(e[20]=s=>l(a).weight_kg=s),type:"number",step:"0.1",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm bg-white"},null,512),[[i,l(a).weight_kg,void 0,{number:!0}]])]),t("div",null,[e[52]||(e[52]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Colour",-1)),d(t("input",{"onUpdate:modelValue":e[21]||(e[21]=s=>l(a).color=s),type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm bg-white"},null,512),[[i,l(a).color]])]),t("div",null,[e[53]||(e[53]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Microchip",-1)),d(t("input",{"onUpdate:modelValue":e[22]||(e[22]=s=>
1l(a).microchip_number=s),type:"text",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm bg-white"},null,512),[[i,l(a).microchip_number]])]),t("div",Te,[e[54]||(e[54]=t("label",{class:"block text-xs font-medium text-slate-600 mb-1"},"Notes",-1)),d(t("textarea",{"onUpdate:modelValue":e[23]||(e[23]=s=>l(a).notes=s),rows:"2",class:"w-full px-3 py-2 border border-slate-300 rounded-lg text-sm bg-white"},null,512),[[i,l(a).notes]])]),t("label",qe,[d(t("input",{"onUpdate:modelValue":e[24]||(e[24]=s=>l(a).is_active=s),type:"checkbox",class:"rounded border-slate-300"},null,512),[[T,l(a).is_active]]),e[55]||(e[55]=c(" Active ",-1))]),t("label",Be,[d(t("input",{"onUpdate:modelValue":e[25]||(e[25]=s=>l(a).nfc_tag_enabled=s),type:"checkbox",class:"rounded border-slate-300"},null,512),[[T,l(a).nfc_tag_enabled]]),e[56]||(e[56]=c(" NFC tag enabled ",-1))])]),t("div",Le,[t("button",{type:"button",class:"px-4 py-2 bg-slate-900 text-white rounded-lg text-sm font-semibold disabled:opacity-60",disabled:l(h)||!l(a).name.trim(),onClick:X},x(l(h)?"Saving…":l(a).id?"Save dog":"Create dog"),9,Ie),t("button",{type:"button",class:"px-4 py-2 border border-slate-300 rounded-lg text-sm font-medium hover:bg-white",disabled:l(h),onClick:B}," Cancel ",8,Pe)])])):U("",!0),l(C)?(m(),b("div",Re,"Loading dogs…")):l(k).length===0?(m(),b("div",je,"No dogs for this user.")):(m(),b("ul",Oe,[(m(!0),b(O,null,ue(l(k),s=>(m(),b("li",{key:s.id,class:"py-3 flex flex-wrap items-center justify-between gap-2"},[t("div",null,[t("p",Ge,x(s.name),1),t("p",He,[c(x(s.breed||"Unknown breed")+" · "+x(s.is_active?"active":"inactive")+" ",1),s.nfc_tag_enabled?(m(),b("span",Ye," · NFC enabled")):U("",!0)])]),t("div",We,[t("button",{type:"button",class:"text-blue-700 font-medium hover:underline",onClick:ee=>P(s)}," Edit ",8,ze),A(r,{to:`/admin/dogs/${s.id}`,class:"text-slate-600 hover:underline"},{default:$(()=>[...e[57]||(e[57]=[c(" Full editor ",-1)])]),_:1},8,["to"]),A(r,{to:`/dogs/${s.id}`,class:"text-slate-600 hover:underline",target:"_blank"},{default:$(()=>[...e[58]||(e[58]=[c(" App view ",-1)])]),_:1},8,["to"]),t("button",{type:"button",class:"text-red-700 font-medium hover:underline disabled:opacity-50",disabled:l(F)===s.id,onClick:ee=>Z(s)},x(l(F)===s.id?"Deleting…":"Delete"),9,Je)])]))),128))])),A(y,{page:l(v),"onUpdate:page":e[26]||(e[26]=s=>pe(v)?v.value=s:null),total:l(S),disabled:l(C)},null,8,["page","total","disabled"])])],64)):U("",!0)]),_:1},8,["title"])}}});export{lt 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.