PageSourceSearch

https://www.wiim.immo/_nuxt/BFDzdDk2.js

js wiim.immo collected 2026-10-09 22:59:54 UTC 17,505 bytes, 1 lines download raw bytes

1import me from"./BlUlAP2D.js";import{_ as ce}from"./BA4VewZY.js";import{_ as pe}from"./DxOG0pT0.js";import{e as ge,u as xe,h as J,f as j,g as be,c as s,a as t,b as p,w as v,m as W,d as m,t as n,i as x,j as U,v as q,F as M,r as D,l as f,k as _,p as k,s as X,o as r,A as ke,n as Y,_ as he,q as B}from"./D8644rYh.js";import{u as ve}from"./MRLRowXz.js";import{u as fe,c as ye,a as Z}from"./umGG1dom.js";const _e={class:"space-y-5"},we={class:"flex items-center gap-2.5"},Ce={class:"grid h-8 w-8 place-items-center rounded-lg bg-primary-600/10 text-primary-600 dark:bg-primary-400/15 dark:text-primary-300"},Le=["value"],Ee={class:"md:col-span-2 flex items-center gap-3"},Se={key:0,class:"text-sm text-danger",role:"alert"},Ae={class:"flex flex-wrap items-center justify-between gap-3"},$e={class:"flex items-center gap-2.5"},Ue={class:"grid h-8 w-8 place-items-center rounded-lg bg-primary-600/10 text-primary-600 dark:bg-primary-400/15 dark:text-primary-300"},Me={key:0,class:"mt-4 grid gap-2 sm:grid-cols-2 lg:grid-cols-[1.4fr_1fr_1fr_auto]"},De=["value"],Ve={class:"inline-flex h-9 items-center gap-2 text-sm text-dark dark:text-white/80"},Fe={key:1,class:"mt-4 text-sm text-danger",role:"alert"},Re={key:2,class:"mt-4 text-sm text-grey-text dark:text-white/60"},Te={key:3,class:"mt-4 text-sm text-grey-text dark:text-white/60"},Pe={key:4,class:"mt-4 text-sm text-grey-text dark:text-white/60"},ze={key:5,class:"overflow-x-auto"},je={class:"w-full text-sm mt-3 min-w-[1000px]"},qe={class:"py-2"},Be=["title","onClick"],Ie=["title"],Ne=["title"],Oe={class:"pr-3"},He={key:0,class:"inline-flex items-center rounded-full bg-primary-600/10 dark:bg-primary-400/15 px-2 py-0.5 text-xs font-medium text-primary-600 dark:text-primary-300"},We={key:1,class:"text-xs text-grey-text dark:text-white/40"},Ze={class:"text-right tabular-nums whitespace-nowrap"},Ge={class:"font-semibold text-dark dark:text-white"},Ke={class:"text-grey-text dark:text-white/50"},Qe={class:"whitespace-nowrap px-3 text-grey-text dark:text-white/70"},Je={class:"pr-3"},Xe={key:0,class:"text-xs text-grey-text dark:text-white/40"},Ye=["title"],et={class:"text-right whitespace-nowrap"},tt=["disabled","onClick"],at=["disabled","onClick"],it=["disabled","onClick"],st={key:6,class:"mt-3 flex items-center justify-between gap-2 text-sm"},rt={class:"tabular-nums text-grey-text dark:text-white/60"},lt={key:7,class:"mt-3 text-xs text-grey-text dark:text-white/50"},nt={class:"font-display text-lg font-semibold text-dark dark:text-white"},ot={class:"text-primary-600 dark:text-primary-300"},dt={class:"block"},ut={class:"block"},mt={class:"block"},ct=["value"],pt={key:0,class:"text-sm text-danger",role:"alert"},gt={class:"flex justify-end gap-2 pt-2"},G=50,_t=ge({__name:"liens",setup(xt){xe({title:"Admin · Liens courts"});const w=ve(),L=fe(),{data:V}=J("admin-liens-campaigns",()=>w("/admin/marketing/campaigns"),{server:!1}),{data:E,error:ee,refresh:I}=J("admin-liens-links",()=>w("/admin/marketing/links"),{server:!1});function te(i,e){const l=[];let d=null;try{d=new URL(i.target_url)}catch{d=null}!d||d.protocol!=="https:"?l.push({label:"Cible non https",detail:"La cible doit être une URL https absolue."}):d.hostname!=="wiim.immo"&&!d.hostname.endsWith(".wiim.immo")&&l.push({label:"Cible externe",detail:`La cible pointe hors de wiim.immo (${d.hostname}).`}),i.campaign||l.push({label:"Sans campagne",detail:"Lien non rattaché : ses clics ne remontent dans aucune campagne."});const h=d?.searchParams.get("utm_campaign");return h&&i.campaign?.utm_campaign&&h!==i.campaign.utm_campaign&&l.push({label:"UTM différent",detail:`utm_campaign de la cible (${h}) différent de la clé de la campagne (${i.campaign.utm_campaign}).`}),i.disabled_at&&i.clicks.recent>0&&l.push({label:"Désactivé, encore cliqué",detail:`${i.clicks.recent} clic(s) humain(s) sur les 7 derniers jours : le lien circule encore.`}),i.campaign&&e.some($=>$.id!==i.id&&$.campaign?.id===i.campaign?.id&&$.target_url===i.target_url)&&l.push({label:"Doublon",detail:"Un autre lien de la même campagne pointe vers la même cible."}),l}const ae=B(()=>{const i=E.value??[];return i.map(e=>({...e,anomalies:te(e,i)})).sort((e,l)=>l.created_at.localeCompare(e.created_at))}),F=k(""),C=k(""),S=k(""),R=k(!1),T=B(()=>{const i=F.value.toLowerCase();return ae.value.filter(e=>!(i&&![e.code,e.label??"",e.target_url].some(l=>l.toLowerCase().includes(i))||(C.value==="none"?e.campaign:C.value&&e.campaign?.id!==C.value)||S.value==="active"&&e.disabled_at||S.value==="disabled"&&!e.disabled_at||R.value&&!e.anomalies.length))}),g=k(1),P=B(()=>Math.max(1,Math.ceil(T.value.length/G))),ie=B(()=>T.value.slice((g.value-1)*G,g.value*G));j([F,C,S,R],()=>{g.value=1}),j(P,i=>{g.value>i&&(g.value=i)});const K=i=>`wiim.immo/go/${i}`,se=i=>new Date(i).toLocaleDateString("fr-FR",{day:"2-digit",month:"2-digit",year:"numeric",timeZone:"Europe/Paris"});function re(i){ye(L,`https://${K(i.code)}`,"Lien copié.")}const o=k(!1),b=k(null),c=X({label:"",target_url:"",campaign_id:""}),A=k("");function le(i){b.value=i,c.label=i.label??"",c.target_url=i.target_url,c.campaign_id=i.campaign?.id??"",A.value=""}function N(){o.value||(b.value=null)}async function ne(){if(!(!b.value||o.value)){o.value=!0,A.value="";try{await w(`/admin/marketing/links/${b.value.id}`,{method:"PATCH",body:{label:c.label||null,target_url:c.target_url,campaign_id:c.campaign_id||null}}),b.value=null,L.success("Lien modifié."),await I()}catch(i){A.value=Z(i,"Modification impossible.")}finally{o.value=!1}}}async function Q(i,e){if(!o.value){o.value=!0;try{await i(),L.success(e),await I()}catch(l){L.error(Z(l,"Action impossible."))}finally{o.value=!1}}}function oe(i){const e=!i.disabled_at,l=e?`Désactiver /go/${i.code} ? Il renverra vers la home sans compter de clic.`:`Réactiver /go/${i.code} ?`;confirm(l)&&Q(()=>w(`/admin/marketing/links/${i.id}`,{method:"PATCH",body:{disabled:e}}
1),e?"Lien désactivé.":"Lien réactivé.")}function de(i){confirm(`Supprimer définitivement /go/${i.code} ? Aucun clic n'a été enregistré.`)&&Q(()=>w(`/admin/marketing/links/${i.id}`,{method:"DELETE"}),"Lien supprimé.")}const u=X({label:"",target_url:"",campaign_id:""}),z=k("");let O="";j(()=>u.campaign_id,i=>{const e=(V.value??[]).find(h=>h.id===i);if(!e)return;const l=new URLSearchParams({utm_source:e.channel||"shortlink",utm_medium:"shortlink"});e.utm_campaign&&l.set("utm_campaign",e.utm_campaign);const d=`https://www.wiim.immo/webinaire?${l.toString()}`;(!u.target_url||u.target_url===O)&&(u.target_url=d),O=d});async function ue(){if(!o.value){o.value=!0,z.value="";try{await w("/admin/marketing/links",{method:"POST",body:{target_url:u.target_url,campaign_id:u.campaign_id||void 0,label:u.label||void 0}}),u.label="",u.target_url="",u.campaign_id="",O="",L.success("Lien créé."),await I()}catch(i){z.value=Z(i,"Création impossible : URL en https requise.")}finally{o.value=!1}}}function H(i){i.key==="Escape"&&b.value&&N()}return j(()=>!!b.value,i=>{i?document.addEventListener("keydown",H):document.removeEventListener("keydown",H)}),be(()=>document.removeEventListener("keydown",H)),(i,e)=>{const l=me,d=ce,h=pe,$=he;return r(),s("div",_e,[e[34]||(e[34]=t("div",null,[t("h1",{class:"font-display text-2xl font-bold text-dark dark:text-white"},"Liens courts"),t("p",{class:"text-sm text-grey-text dark:text-white/60 mt-0.5"},"wiim.immo/go/CODE : SMS, prints, QR, posts. Clics humains, robots exclus.")],-1)),p(h,null,{default:v(()=>[t("div",we,[t("span",Ce,[p(l,{name:"solar:add-circle-linear",class:"h-4 w-4"})]),e[12]||(e[12]=t("div",null,[t("h2",{class:"font-display font-semibold text-dark dark:text-white"},"Créer un lien"),t("p",{class:"text-xs text-grey-text dark:text-white/50"},"Choisir une campagne préremplit la cible avec ses UTM ; complétez ou remplacez, la saisie manuelle n'est jamais écrasée.")],-1))]),t("form",{class:"mt-4 grid gap-2 md:grid-cols-2",onSubmit:W(ue,["prevent"])},[x(t("input",{"onUpdate:modelValue":e[0]||(e[0]=a=>u.label=a),type:"text",maxlength:"120",placeholder:"Libellé (ex. Flyer salon Marseille)",class:"h-10 rounded-lg border border-gray-300 dark:border-white/15 bg-white dark:bg-ink px-3 text-sm text-dark dark:text-white"},null,512),[[U,u.label,void 0,{trim:!0}]]),x(t("select",{"onUpdate:modelValue":e[1]||(e[1]=a=>u.campaign_id=a),class:"h-10 rounded-lg border border-gray-300 dark:border-white/15 bg-white dark:bg-ink px-3 text-sm text-dark dark:text-white"},[e[13]||(e[13]=t("option",{value:""},"Sans campagne",-1)),(r(!0),s(M,null,D(f(V)??[],a=>(r(),s("option",{key:a.id,value:a.id},n(a.name),9,Le))),128))],512),[[q,u.campaign_id]]),x(t("input",{"onUpdate:modelValue":e[2]||(e[2]=a=>u.target_url=a),type:"url",required:"",placeholder:"https://wiim.immo/wiim-deal",class:"h-10 rounded-lg border border-gray-300 dark:border-white/15 bg-white dark:bg-ink px-3 text-sm text-dark dark:text-white md:col-span-2"},null,512),[[U,u.target_url]]),t("div",Ee,[p(d,{size:"sm",type:"submit",disabled:o.value},{default:v(()=>[...e[14]||(e[14]=[m("Créer le lien",-1)])]),_:1},8,["disabled"]),z.value?(r(),s("p",Se,n(z.value),1)):_("",!0)])],32)]),_:1}),p(h,null,{default:v(()=>[t("div",Ae,[t("div",$e,[t("span",Ue,[p(l,{name:"solar:link-round-angle-linear",class:"h-4 w-4"})]),e[15]||(e[15]=t("div",null,[t("h2",{class:"font-display font-semibold text-dark dark:text-white"},"Liens courts /go"),t("p",{class:"text-xs text-grey-text dark:text-white/50"},"wiim.immo/go/CODE : clics humains / total (bots inclus)")],-1))])]),f(E)?(r(),s("div",Me,[x(t("input",{"onUpdate:modelValue":e[3]||(e[3]=a=>F.value=a),type:"search",placeholder:"Rechercher : code, libellé, cible","aria-label":"Rechercher un lien",class:"h-9 rounded-lg border border-gray-300 dark:border-white/15 bg-white dark:bg-ink px-3 text-sm text-dark dark:text-white"},null,512),[[U,F.value,void 0,{trim:!0}]]),x(t("select",{"onUpdate:modelValue":e[4]||(e[4]=a=>C.value=a),"aria-label":"Filtrer les liens par campagne",class:"h-9 rounded-lg border border-gray-300 dark:border-white/15 bg-white dark:bg-ink px-3 text-sm text-dark dark:text-white"},[e[16]||(e[16]=t("option",{value:""},"Toutes les campagnes",-1)),e[17]||(e[17]=t("option",{value:"none"},"Sans campagne",-1)),(r(!0),s(M,null,D(f(V)??[],a=>(r(),s("option",{key:a.id,value:a.id},n(a.name),9,De))),128))],512),[[q,C.value]]),x(t("select",{"onUpdate:modelValue":e[5]||(e[5]=a=>S.value=a),"aria-label":"Filtrer les liens par état",class:"h-9 rounded-lg border border-gray-300 dark:border-white/15 bg-white dark:bg-ink px-3 text-sm text-dark dark:text-white"},[...e[18]||(e[18]=[t("option",{value:""},"Actifs et désactivés",-1),t("option",{value:"active"},"Actifs",-1),t("option",{value:"disabled"},"Désactivés",-1)])],512),[[q,S.value]]),t("label",Ve,[x(t("input",{"onUpdate:modelValue":e[6]||(e[6]=a=>
1R.value=a),type:"checkbox",class:"h-4 w-4 rounded border-gray-300 text-primary-600 focus:ring-primary-500"},null,512),[[ke,R.value]]),e[19]||(e[19]=m(" Anomalies seulement ",-1))])])):_("",!0),f(ee)?(r(),s("p",Fe,"Impossible de charger les liens.")):f(E)?f(E).length?T.value.length?(r(),s("div",ze,[t("table",je,[e[21]||(e[21]=t("thead",null,[t("tr",{class:"text-left text-[11px] uppercase tracking-wider text-grey-text dark:text-white/45"},[t("th",{class:"py-2 font-semibold"},"Code"),t("th",{class:"font-semibold"},"Libellé"),t("th",{class:"font-semibold"},"Cible"),t("th",{class:"font-semibold"},"Campagne"),t("th",{class:"text-right font-semibold"},[m("Clics"),t("span",{class:"ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full bg-gray-200 dark:bg-white/10 text-[10px] font-bold normal-case text-grey-text dark:text-white/70 cursor-help",title:"Clics humains / total : les robots qui ouvrent le lien pour l'aperçu (LinkedIn, WhatsApp) sont comptés dans le total mais exclus des humains."},"i")]),t("th",{class:"font-semibold"},"Créé le"),t("th",{class:"font-semibold"},"État"),t("th",{class:"font-semibold"},"Anomalie"),t("th")])],-1)),t("tbody",null,[(r(!0),s(M,null,D(ie.value,a=>(r(),s("tr",{key:a.id,class:Y(["border-t border-gray-100 dark:border-white/5",a.disabled_at?"opacity-60":""])},[t("td",qe,[t("button",{type:"button",class:"inline-flex items-center gap-1 rounded-md bg-primary-600/10 dark:bg-primary-400/15 px-2 py-0.5 text-xs font-semibold text-primary-600 dark:text-primary-300 hover:bg-primary-600/20 dark:hover:bg-primary-400/25",title:`Copier ${K(a.code)}`,onClick:y=>re(a)},[m(" /go/"+n(a.code),1),p(l,{name:"solar:copy-linear",class:"h-3.5 w-3.5"})],8,Be)]),t("td",{class:"max-w-[160px] truncate pr-3 text-dark dark:text-white",title:a.label??""},n(a.label||"·"),9,Ie),t("td",{class:"max-w-[220px] truncate pr-3 text-grey-text dark:text-white/70",title:a.target_url},n(a.target_url),9,Ne),t("td",Oe,[a.campaign?(r(),s("span",He,n(a.campaign.name),1)):(r(),s("span",We,"aucune"))]),t("td",Ze,[t("span",Ge,n(a.clicks.human),1),e[20]||(e[20]=m()),t("span",Ke,"/ "+n(a.clicks.total),1)]),t("td",Qe,n(se(a.created_at)),1),t("td",null,[t("span",{class:Y(["inline-flex px-2 py-0.5 rounded-full text-xs font-medium",a.disabled_at?"bg-gray-100 text-gray-600 dark:bg-white/10 dark:text-white/60":"bg-primary-600/10 text-primary-600 dark:bg-primary-400/15 dark:text-primary-300"])},n(a.disabled_at?"Désactivé":"Actif"),3)]),t("td",Je,[a.anomalies.length?(r(!0),s(M,{key:1},D(a.anomalies,y=>(r(),s("span",{key:y.label,class:"mr-1 inline-flex cursor-help rounded-full bg-amber-100 px-2 py-0.5 text-xs font-medium text-amber-800 dark:bg-amber-400/15 dark:text-amber-300",title:y.detail},n(y.label),9,Ye))),128)):(r(),s("span",Xe,"·"))]),t("td",et,[t("button",{type:"button",class:"text-xs font-medium text-primary-600 dark:text-primary-300 hover:underline disabled:opacity-50",disabled:o.value,onClick:y=>le(a)},"Modifier",8,tt),t("button",{type:"button",class:"ml-3 text-xs font-medium text-grey-text dark:text-white/70 hover:underline disabled:opacity-50",disabled:o.value,onClick:y=>oe(a)},n(a.disabled_at?"Réactiver":"Désactiver"),9,at),a.clicks.total?_("",!0):(r(),s("button",{key:0,type:"button",class:"ml-3 text-xs font-medium text-danger hover:underline disabled:opacity-50",disabled:o.value,onClick:y=>de(a)},"Supprimer",8,it))])],2))),128))])])])):(r(),s("p",Pe,"Aucun lien pour ces filtres.")):(r(),s("p",Te,"Aucun lien pour l'instant.")):(r(),s("p",Re,"Chargement…")),P.value>1?(r(),s("div",st,[p(d,{variant:"ghost",size:"sm",disabled:g.value<=1,onClick:e[7]||(e[7]=a=>g.value-=1)},{default:v(()=>[...e[22]||(e[22]=[m("Précédent",-1)])]),_:1},8,["disabled"]),t("span",rt,"Page "+n(g.value)+" / "+n(P.value)+" · "+n(T.value.length)+" liens",1),p(d,{variant:"ghost",size:"sm",disabled:g.value>=P.value,onClick:e[8]||(e[8]=a=>g.value+=1)},{default:v(()=>[...e[23]||(e[23]=[m("Suivant",-1)])]),_:1},8,["disabled"])])):_("",!0),f(E)?(r(),s("p",lt,[e[25]||(e[25]=m(" Les liens nominatifs envoyés par SMS (un par destinataire) ne figurent pas ici : ils se suivent dans la campagne SMS correspondante (",-1)),p($,{to:"/admin/sms",class:"underline hover:text-primary-600 dark:hover:text-primary-300"},{default:v(()=>[...e[24]||(e[24]=[m("page SMS",-1)])]),_:1}),e[26]||(e[26]=m("). ",-1))])):_("",!0)]),_:1}),b.value?(r(),s("div",{key:0,class:"fixed inset-0 z-50 grid place-items-center bg-black/50 p-4",onClick:W(N,["self"])},[t("form",{role:"dialog","aria-modal":"true","aria-label":"Modifier le lien court",class:"w-full max-w-md 
1space-y-3 rounded-2xl bg-white dark:bg-ink-800 border border-gray-200 dark:border-white/10 p-6 shadow-2xl",onSubmit:W(ne,["prevent"])},[t("h3",nt,[e[27]||(e[27]=m("Modifier ",-1)),t("code",ot,"/go/"+n(b.value.code),1)]),e[33]||(e[33]=t("p",{class:"text-xs text-grey-text dark:text-white/50"},"Le code ne change pas : les supports déjà envoyés ou imprimés restent valides.",-1)),t("label",dt,[e[28]||(e[28]=t("span",{class:"block text-sm font-medium text-dark dark:text-gray-200 mb-1.5"},"Libellé",-1)),x(t("input",{"onUpdate:modelValue":e[9]||(e[9]=a=>c.label=a),type:"text",maxlength:"120",placeholder:"ex. Flyer salon Marseille",class:"w-full h-10 rounded-lg border border-gray-300 dark:border-white/15 bg-white dark:bg-ink px-3 text-sm text-dark dark:text-white"},null,512),[[U,c.label,void 0,{trim:!0}]])]),t("label",ut,[e[29]||(e[29]=t("span",{class:"block text-sm font-medium text-dark dark:text-gray-200 mb-1.5"},"Cible",-1)),x(t("input",{"onUpdate:modelValue":e[10]||(e[10]=a=>c.target_url=a),type:"url",required:"",placeholder:"https://wiim.immo/wiim-deal",class:"w-full h-10 rounded-lg border border-gray-300 dark:border-white/15 bg-white dark:bg-ink px-3 text-sm text-dark dark:text-white"},null,512),[[U,c.target_url,void 0,{trim:!0}]])]),t("label",mt,[e[31]||(e[31]=t("span",{class:"block text-sm font-medium text-dark dark:text-gray-200 mb-1.5"},"Campagne",-1)),x(t("select",{"onUpdate:modelValue":e[11]||(e[11]=a=>c.campaign_id=a),class:"w-full h-10 rounded-lg border border-gray-300 dark:border-white/15 bg-white dark:bg-ink px-3 text-sm text-dark dark:text-white"},[e[30]||(e[30]=t("option",{value:""},"Aucune",-1)),(r(!0),s(M,null,D(f(V)??[],a=>(r(),s("option",{key:a.id,value:a.id},n(a.name),9,ct))),128))],512),[[q,c.campaign_id]])]),A.value?(r(),s("p",pt,n(A.value),1)):_("",!0),t("div",gt,[p(d,{variant:"ghost",size:"sm",type:"button",disabled:o.value,onClick:N},{default:v(()=>[...e[32]||(e[32]=[m("Annuler",-1)])]),_:1},8,["disabled"]),p(d,{size:"sm",type:"submit",disabled:o.value},{default:v(()=>[m(n(o.value?"Enregistrement…":"Enregistrer"),1)]),_:1},8,["disabled"])])],32)])):_("",!0)])}}});export{_t 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.