PageSourceSearch

https://diversico.ca/assets/MhmmAdmin-C1yInMAW.js

js diversico.ca collected 2026-10-06 16:34:01 UTC 17,966 bytes, 2 lines download raw bytes

1import{r as d,j as e}from"./react-CYlhr6lt.js";import{u as N}from"./query-D2bhPNQG.js";import{B as f,a5 as T,s as j,o as h}from"./index-BSJUAk0K.js";import{I as m}from"./input-CGyLILCO.js";import{L as p}from"./label-fjYHl3Pf.js";import{T as q}from"./textarea-CUTgEFmD.js";import{T as D,a as I,b,c as y}from"./tabs-DseyemUI.js";import{C as v}from"./card-DXyzrUOe.js";import{u as E,y as P,d as $,a as K}from"./useMhmm-CbJogoyE.js";import{b as O,R as Q,K as _,f as g,d as S,a as L,D as V,B as k,C as Y}from"./ContentStrategistPanel-CUOTjfuy.js";import{b as B}from"./mhmmSlug-wMgr2V5K.js";import{L as A}from"./loader-circle-D5-kVp2X.js";import{E as z}from"./eye-Csgu35oi.js";import{U as F}from"./users-D1Xh16HZ.js";import{H,M as G}from"./mail-C9DsX1qD.js";import{C as J}from"./clock-8T6u8cYH.js";import{E as W}from"./external-link-BDAXirQE.js";import{P as M}from"./plus-C_4gzO3Z.js";import{T as R}from"./trash-2-_aNlzSNB.js";import"./router-BPJsHLZ1.js";import"./supabase-DmZvNk9e.js";import"./index-Vx5jdxqa.js";import"./arrow-up-right-CSX4pJYn.js";import"./arrow-down-right-GAmVGLJt.js";import"./inlineMarkdown-DXqgrGNL.js";import"./sparkles-qYbXxP6o.js";import"./send-jdvn5eyK.js";import"./slugify-BtVDrFAY.js";function X(){const[r,n]=d.useState(30),{data:s,isLoading:c,error:u}=O(r),{data:i=[]}=E(!0),l=d.useMemo(()=>{const t=B(i),o=new Map;for(const x of i){const a=t.get(x.id);a&&o.set(a,x.guest_name?`${x.title} — ${x.guest_name}`:x.title)}return o},[i]);return u?e.jsxs("p",{className:"text-sm text-rose-600",children:["Erreur : ",u.message]}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-slate-900",children:"Performance du podcast"}),e.jsx("p",{className:"text-sm text-slate-500",children:"Audience du portail, épisodes et conversions en abonnés."})]}),e.jsx(Q,{days:r,onChange:n})]}),c||!s?e.jsxs("div",{className:"flex items-center gap-2 text-sm text-slate-500",children:[e.jsx(A,{className:"h-4 w-4 animate-spin"})," Chargement…"]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-5",children:[e.jsx(_,{label:"Vues du portail",value:g(s.totals.views),change:S(s.totals.views,s.previous.views),hint:"vs période précédente",icon:e.jsx(z,{className:"h-4 w-4"})}),e.jsx(_,{label:"Visiteurs uniques",value:g(s.totals.visitors),change:S(s.totals.visitors,s.previous.visitors),hint:"vs période précédente",icon:e.jsx(F,{className:"h-4 w-4"})}),e.jsx(_,{label:"Vues d'épisodes",value:g(s.totals.episode_views),hint:`${g(s.totals.portal_views)} vues d'accueil`,icon:e.jsx(H,{className:"h-4 w-4"})}),e.jsx(_,{label:"Temps moyen",value:L(s.totals.avg_duration_ms),hint:"par page",icon:e.jsx(J,{className:"h-4 w-4"})}),e.jsx(_,{label:"Nouveaux abonnés",value:g(s.subscribers.period),change:S(s.subscribers.period,s.subscribers.previous),hint:`${g(s.subscribers.total)} au total`,icon:e.jsx(G,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"rounded-xl border border-slate-200 bg-white p-4",children:[e.jsx("h3",{className:"mb-3 text-sm font-semibold text-slate-900",children:"Évolution quotidienne"}),e.jsx(V,{data:s.by_day})]}),e.jsxs("div",{className:"overflow-hidden rounded-xl border border-slate-200 bg-white",children:[e.jsx("h3",{className:"border-b border-slate-200 px-4 py-3 text-sm font-semibold text-slate-900",children:"Classement des épisodes"}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"bg-slate-50 text-xs uppercase tracking-wide text-slate-500",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-2 text-left font-medium",children:"Épisode"}),e.jsx("th",{className:"px-3 py-2 text-right font-medium",children:"Vues"}),e.jsx("th",{className:"px-3 py-2 text-right font-medium",children:"Uniques"}),e.jsx("th",{className:"px-3 py-2 text-right font-medium",children:"Temps moyen"}),e.jsx("th",{className:"px-3 py-2 text-right font-medium",children:"Défilement"})]})}),e.jsxs("tbody",{className:"divide-y divide-slate-100",children:[s.by_episode.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:5,className:"px-4 py-6 text-center text-slate-500",children:"Aucune visite d'épisode sur la période."})}),s.by_episode.slice(0,25).map(t=>e.jsxs("tr",{className:"hover:bg-slate-50",children:[e.jsxs("td",{className:"max-w-[320px] px-4 py-2",children:[e.jsx("div",{className:"truncate font-medium text-slate-900",children:l.get(t.
1slug)??t.slug}),e.jsxs("div",{className:"truncate text-xs text-slate-400",children:["/",t.slug]})]}),e.jsx("td",{className:"px-3 py-2 text-right font-semibold",children:g(t.views)}),e.jsx("td",{className:"px-3 py-2 text-right",children:g(t.visitors)}),e.jsx("td",{className:"px-3 py-2 text-right text-xs",children:L(t.avg_duration_ms)}),e.jsxs("td",{className:"px-3 py-2 text-right text-xs",children:[t.avg_scroll_pct," %"]})]},t.slug))]})]})})]}),e.jsxs("div",{className:"grid gap-4 lg:grid-cols-3",children:[e.jsx(k,{title:"Clics d'écoute et CTA",rows:s.listen_clicks.map((t,o)=>({key:`${t.label}-${o}`,label:t.label||"—",value:t.count})),empty:"Aucun clic sortant mesuré"}),e.jsx(k,{title:"Sources de trafic",rows:s.by_referrer.map(t=>({key:t.host??"direct",label:t.host??"direct",value:t.views}))}),e.jsx(k,{title:"Appareils",rows:s.by_device.map(t=>({key:t.device,label:t.device,value:t.views}))})]})]}),e.jsx(Y,{scope:"podcast",days:r})]})}function C(r){const n=r.trim();if(!n)return"";const s=n.match(/[?&]v=([\w-]{6,})/)||n.match(/youtu\.be\/([\w-]{6,})/)||n.match(/embed\/([\w-]{6,})/)||n.match(/shorts\/([\w-]{6,})/);return s?s[1]:/^[\w-]{6,}$/.test(n)?n:""}function Ue(){return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-slate-900",children:"Podcast MHMM"}),e.jsxs("p",{className:"text-sm text-slate-500",children:["Meilleur Humain Meilleur Monde — épisodes, capsules, réglages et abonnés."," ",e.jsxs("a",{className:"inline-flex items-center gap-1 text-blue-600 underline",href:"/mhmm",target:"_blank",rel:"noreferrer",children:["Voir le site ",e.jsx(W,{className:"h-3 w-3"})]})]})]}),e.jsxs(D,{defaultValue:"episodes",children:[e.jsxs(I,{children:[e.jsx(b,{value:"episodes",children:"Épisodes"}),e.jsx(b,{value:"capsules",children:"Capsules"}),e.jsx(b,{value:"settings",children:"Réglages"}),e.jsx(b,{value:"subscribers",children:"Abonnés"}),e.jsx(b,{value:"performance",children:"Performance & stratège IA"})]}),e.jsx(y,{value:"episodes",children:e.jsx(Z,{})}),e.jsx(y,{value:"capsules",children:e.jsx(te,{})}),e.jsx(y,{value:"settings",children:e.jsx(re,{})}),e.jsx(y,{value:"subscribers",children:e.jsx(le,{})}),e.jsx(y,{value:"performance",className:"mt-6",children:e.jsx(X,{})})]})]})}function Z(){const r=N(),{data:n=[],isLoading:s}=E(!0),[c,u]=d.useState(!1),[i,l]=d.useState(""),[t,o]=d.useState("");async function x(){const a=C(i);if(!a)return h.error("Lien ou identifiant YouTube invalide.");if(!t.trim())return h.error("Le titre est requis.");u(!0);const{error:w}=await j.from("mhmm_episodes").insert({youtube_id:a,title:t.trim(),published_at:new Date().toISOString().slice(0,10),is_featured:n.length===0});if(u(!1),w)return h.error(w.message);l(""),o(""),h.success("Épisode ajouté"),r.invalidateQueries({queryKey:["mhmm-episodes"]})}return e.jsxs("div",{className:"mt-4 space-y-4",children:[e.jsxs(v,{className:"space-y-3 p-4",children:[e.jsx("h2",{className:"font-semibold",children:"Ajouter un épisode"}),e.jsxs("div",{className:"grid gap-3 md:grid-cols-[1fr_1fr_auto]",children:[e.jsx(m,{placeholder:"Lien YouTube (ou identifiant)",value:i,onChange:a=>l(a.target.value)}),e.jsx(m,{placeholder:"Titre de l'épisode",value:t,onChange:a=>o(a.target.value)}),e.jsxs(f,{onClick:x,disabled:c,children:[c?e.jsx(A,{className:"mr-2 h-4 w-4 animate-spin"}):e.jsx(M,{className:"mr-2 h-4 w-4"}),"Ajouter"]})]})]}),s?e.jsx("p",{className:"text-sm text-slate-500",children:"Chargement…"}):null,n.map(a=>e.jsx(se,{episode:a},a.id))]})}function ee(){const[r,n]=d.useState([]);return d.useEffect(()=>{let s=!0;return j.from("advisors").select("id, display_name").is("deleted_at",null).eq("is_active",!0).order("display_name").then(({data:c})=>{s&&c&&n(c)}),()=>{s=!1}},[]),r}function se({episode:r}){const n=N(),[s,c]=d.useState(r),[u,i]=d.useState(!1),l=ee();d.useEffect(()=>c(r),[r]);function t(a,w){c(U=>({...U,[a]:w}))}async function o(){i(!0);const{error:a}=await j.from("mhmm_episodes").update({youtube_id:C(s.youtube_id)||s.youtube_id,title:s.title,guest_name:s.guest_name,guest_title:s.guest_title,de
1scription:s.description,published_at:s.published_at,spotify_url:s.spotify_url,apple_url:s.apple_url,is_published:s.is_published,is_featured:s.is_featured,ordre:s.ordre,guest_advisor_id:s.guest_advisor_id}).eq("id",r.id);if(i(!1),a)return h.error(a.message);h.success("Épisode enregistré"),n.invalidateQueries({queryKey:["mhmm-episodes"]})}async function x(){if(!confirm(`Supprimer « ${r.title} » ?`))return;const{error:a}=await j.from("mhmm_episodes").delete().eq("id",r.id);if(a)return h.error(a.message);h.success("Épisode supprimé"),n.invalidateQueries({queryKey:["mhmm-episodes"]})}return e.jsxs(v,{className:"grid gap-4 p-4 md:grid-cols-[200px_1fr]",children:[e.jsx("img",{src:P(s),alt:"",className:"h-28 w-full rounded-md object-cover"}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(p,{children:"Titre"}),e.jsx(m,{value:s.title,onChange:a=>t("title",a.target.value)})]}),e.jsxs("div",{children:[e.jsx(p,{children:"Identifiant / lien YouTube"}),e.jsx(m,{value:s.youtube_id,onChange:a=>t("youtube_id",a.target.value)})]}),e.jsxs("div",{children:[e.jsx(p,{children:"Invité"}),e.jsx(m,{value:s.guest_name??"",onChange:a=>t("guest_name",a.target.value)})]}),e.jsxs("div",{children:[e.jsx(p,{children:"Titre de l'invité"}),e.jsx(m,{value:s.guest_title??"",onChange:a=>t("guest_title",a.target.value)})]}),e.jsxs("div",{children:[e.jsx(p,{children:"Date de diffusion"}),e.jsx(m,{type:"date",value:s.published_at??"",onChange:a=>t("published_at",a.target.value)})]}),e.jsxs("div",{children:[e.jsx(p,{children:"Ordre d'affichage"}),e.jsx(m,{type:"number",value:s.ordre,onChange:a=>t("ordre",Number(a.target.value))})]}),e.jsxs("div",{children:[e.jsx(p,{children:"Lien Spotify"}),e.jsx(m,{value:s.spotify_url??"",onChange:a=>t("spotify_url",a.target.value)})]}),e.jsxs("div",{children:[e.jsx(p,{children:"Lien Apple"}),e.jsx(m,{value:s.apple_url??"",onChange:a=>t("apple_url",a.target.value)})]}),e.jsxs("div",{className:"md:col-span-2",children:[e.jsx(p,{children:"Membre du réseau invité (optionnel)"}),e.jsxs("select",{className:"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm",value:s.guest_advisor_id??"",onChange:a=>t("guest_advisor_id",a.target.value||null),children:[e.jsx("option",{value:"",children:"— Aucun (invité externe) —"}),l.map(a=>e.jsx("option",{value:a.id,children:a.display_name},a.id))]}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"Affiche un encart « Vu dans le podcast » sur la fiche publique du membre."})]})]}),e.jsxs("div",{children:[e.jsx(p,{children:"Description"}),e.jsx(q,{rows:3,value:s.description??"",onChange:a=>t("description",a.target.value)})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-6",children:[e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx(T,{checked:s.is_published,onCheckedChange:a=>t("is_published",a)})," Publié"]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx(T,{checked:s.is_featured,onCheckedChange:a=>t("is_featured",a)})," À la une"]}),e.jsxs("div",{className:"ml-auto flex gap-2",children:[e.jsx(f,{variant:"outline",size:"sm",onClick:x,children:e.jsx(R,{className:"h-4 w-4"})}),e.jsx(f,{size:"sm",onClick:o,disabled:u,children:u?"…":"Enregistrer"})]})]})]})]})}function te(){const r=N(),{data:n=[]}=$(!0),[s,c]=d.useState(""),[u,i]=d.useState("");async function l(){const t=C(s);if(!t)return h.error("Lien ou identifiant YouTube invalide.");if(!u.trim())return h.error("Le titre est requis.");const{error:o}=await j.from("mhmm_capsules").insert({youtube_id:t,title:u.trim()});if(o)return h.error(o.message);c(""),i(""),r.invalidateQueries({queryKey:["mhmm-capsules"]})}return e.jsxs("div",{className:"mt-4 space-y-4",children:[e.jsxs(v,{className:"space-y-3 p-4",children:[e.jsx("h2",{className:"font-semibold",children:"Ajouter une capsule"}),e.jsxs("div",{className:"grid gap-3 md:grid-cols-[1fr_1fr_auto]",children:[e.jsx(m,{placeholder:"Lien YouTube (ou identifiant)",value:s,onChange:t=>c(t.target.value)}),e.jsx(m,{placeholder:"Titre de la capsule",value:u,onChange:t=>i(t.target.value)}),e.jsxs(f,{onClick:l,children:[e.jsx(M,{className:"mr-2 h-4 w-4"}),"Ajouter"]})]})]}),n.map(t=>e.jsx(ae,{capsule:t},t.id))]})}function ae({capsule:r}
1){const n=N(),[s,c]=d.useState(r);d.useEffect(()=>c(r),[r]);async function u(){const{error:l}=await j.from("mhmm_capsules").update({youtube_id:C(s.youtube_id)||s.youtube_id,title:s.title,subtitle:s.subtitle,ordre:s.ordre,is_published:s.is_published}).eq("id",r.id);if(l)return h.error(l.message);h.success("Capsule enregistrée"),n.invalidateQueries({queryKey:["mhmm-capsules"]})}async function i(){if(!confirm(`Supprimer « ${r.title} » ?`))return;const{error:l}=await j.from("mhmm_capsules").delete().eq("id",r.id);if(l)return h.error(l.message);n.invalidateQueries({queryKey:["mhmm-capsules"]})}return e.jsxs(v,{className:"space-y-3 p-4",children:[e.jsxs("div",{className:"grid gap-3 md:grid-cols-4",children:[e.jsxs("div",{children:[e.jsx(p,{children:"Titre"}),e.jsx(m,{value:s.title,onChange:l=>c({...s,title:l.target.value})})]}),e.jsxs("div",{children:[e.jsx(p,{children:"Sous-titre"}),e.jsx(m,{value:s.subtitle??"",onChange:l=>c({...s,subtitle:l.target.value})})]}),e.jsxs("div",{children:[e.jsx(p,{children:"YouTube"}),e.jsx(m,{value:s.youtube_id,onChange:l=>c({...s,youtube_id:l.target.value})})]}),e.jsxs("div",{children:[e.jsx(p,{children:"Ordre"}),e.jsx(m,{type:"number",value:s.ordre,onChange:l=>c({...s,ordre:Number(l.target.value)})})]})]}),e.jsxs("div",{className:"flex items-center gap-6",children:[e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx(T,{checked:s.is_published,onCheckedChange:l=>c({...s,is_published:l})})," Publiée"]}),e.jsxs("div",{className:"ml-auto flex gap-2",children:[e.jsx(f,{variant:"outline",size:"sm",onClick:i,children:e.jsx(R,{className:"h-4 w-4"})}),e.jsx(f,{size:"sm",onClick:u,children:"Enregistrer"})]})]})]})}const ie=[{key:"hero_eyebrow",label:"Surtitre d'accueil"},{key:"hero_title",label:"Titre d'accueil"},{key:"hero_lede",label:"Accroche",textarea:!0},{key:"hero_intro",label:"Introduction",textarea:!0},{key:"youtube_channel_url",label:"Chaîne YouTube (URL)"},{key:"spotify_show_url",label:"Spotify (URL de l'émission)"},{key:"apple_url",label:"Apple Podcasts (URL)"},{key:"spotify_embed_url",label:"Lecteur Spotify intégré (URL embed)"},{key:"calendly_url",label:"Lien de prise de rendez-vous (Calendly)"},{key:"stat_episodes",label:"Statistique — épisodes publiés"},{key:"stat_cadence",label:"Statistique — épisodes par année"},{key:"stat_day",label:"Statistique — jour de parution"}];function re(){const r=N(),{data:n}=K(),[s,c]=d.useState(null);if(d.useEffect(()=>{n&&c(n)},[n]),!s)return e.jsx("p",{className:"mt-4 text-sm text-slate-500",children:"Chargement…"});async function u(){const{error:i}=await j.from("mhmm_settings").update(s).eq("id",!0);if(i)return h.error(i.message);h.success("Réglages enregistrés"),r.invalidateQueries({queryKey:["mhmm-settings"]})}return e.jsxs(v,{className:"mt-4 space-y-4 p-4",children:[e.jsx("div",{className:"grid gap-3 md:grid-cols-2",children:ie.map(({key:i,label:l,textarea:t})=>e.jsxs("div",{className:t?"md:col-span-2":"",children:[e.jsx(p,{children:l}),t?e.jsx(q,{rows:2,value:s[i],onChange:o=>c({...s,[i]:o.target.value})}):e.jsx(m,{value:s[i],onChange:o=>c({...s,[i]:o.target.value})})]},i))}),e.jsx(f,{onClick:u,children:"Enregistrer les réglages"})]})}function le(){const[r,n]=d.useState([]),[s,c]=d.useState(!0);d.useEffect(()=>{(async()=>{const{data:i,error:l}=await j.from("mhmm_subscribers").select("id, email, first_name, source, created_at").order("created_at",{ascending:!1}).limit(500);l&&h.error(l.message),n(i??[]),c(!1)})()},[]);function u(){const i=x=>{let a=String(x??"");return/^[=+\-@\t\r]/.test(a)&&(a=`'${a}`),`"${a.replace(/"/g,'""')}"`},l=["courriel,prenom,source,date",...r.map(x=>[x.email,x.first_name,x.source,x.created_at].map(i).join(","))].join(`
2`),t=URL.createObjectURL(new Blob([l],{type:"text/csv;charset=utf-8"})),o=document.createElement("a");o.href=t,o.download="mhmm-abonnes.csv",o.click(),URL.revokeObjectURL(t)}return e.jsxs(v,{className:"mt-4 space-y-4 p-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("h2",{className:"font-semibold",children:[r.length," abonné(e)s"]}),e.jsx(f,{variant:"outline",size:"sm",onClick:u,disabled:!r.length,children:"Exporter en CSV"})]}),s?e.jsx("p",{className:"text-sm text-slate-500",children:"Chargement…"}):e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"text-left text-slate-500",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-2",children:"Courriel"}),e.jsx("th",{children:"Prénom"}),e.jsx("th",{children:"Source"}),e.jsx("th",{children:"Date"})]})}),e.jsx("tbody",{children:r.map(i=>e.jsxs("tr",{className:"border-t",children:[e.jsx("td",{className:"py-2",children:i.email}),e.jsx("td",{children:i.first_name??"—"}),e.jsx("td",{children:i.source}),e.jsx("td",{children:new Date(i.created_at).toLocaleDateString("fr-CA")})]},i.id))})]})})]})}export{Ue as default,C as parseYoutubeId};

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.