PageSourceSearch

https://awt.com.tn/assets/AdminBookingsPage-CfKsZ5Ln.js

js awt.com.tn collected 2026-10-05 22:40:48 UTC 42,609 bytes, 26 lines download raw bytes

1import{a4 as at,b4 as nt,ae as rt,r as o,a5 as _,j as e,a3 as K,aa as M,a8 as ce,V as me,X as it,b0 as ot,M as lt,b5 as Ce,aj as Pe,ak as $e,al as Ue,am as Ve,an as Be,aA as ct}from"./index-CPYhWteh.js";import{s as dt,A as mt,C as ut,a as xt,b as gt,c as ft,d as pt}from"./adminSearch-BubMzQkB.js";import{D as ht,c as bt,p as _t,A as jt,P as Nt}from"./contactSorting-NRecl9Ta.js";import{S as vt,a as wt,b as yt,c as kt,d as St}from"./sheet-tuGdaN6H.js";import{A as Ct,a as It,b as Tt,c as Dt,d as Et,e as At,f as Mt,g as Ft}from"./alert-dialog-Q-iF4H5j.js";import{R as Lt}from"./rotate-cw-BPP4L5Ol.js";import{I as Rt}from"./inbox-DLqKcI0H.js";import{S as zt}from"./sparkles-N_gJmw47.js";import{C as Ie}from"./calendar-days-jF9WKncQ.js";import{T as Te}from"./triangle-alert-vxJZWrCP.js";import{T as Pt,H as $t}from"./tag-B3zYip2O.js";import{F as Ut}from"./filter-BEaWGUhW.js";import{B as De}from"./building-2-C-IYutl-.js";import{C as Oe}from"./chevron-right-C2svFpew.js";import{V as Y}from"./video-DWdzMKhN.js";import{C as Ee}from"./calendar-clock-BQcRYRhF.js";import{U as Vt,C as Bt}from"./user-DwpF6L8N.js";import{D as Ot}from"./download-Bk7r2Ne9.js";import{H as Gt}from"./history-By2loEXt.js";import{C as Ht}from"./chevron-left-BgVVxFTu.js";import"./index-NXSl9Sqc.js";/**
2 * @license lucide-react v0.462.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const qt=at("CircleUserRound",[["path",{d:"M18 20a6 6 0 0 0-12 0",key:"1qehca"}],["circle",{cx:"12",cy:"10",r:"4",key:"1h16sb"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),Ae=s=>s==="new"||s==="pending";function te(s,n){switch(s){case"confirm":return Ae(n);case"decline":return Ae(n);case"send_confirmation":return n==="confirmed"}}function Me(s,n,i){return s!=="confirmed"?!1:n==="online"?i==="ready":!0}function Kt(s,n){return s!=="online"?!1:n!=="ready"}const Yt={not_required:"Aucun lien Meet requis",pending:"Génération du lien Meet en cours",ready:"Lien Google Meet prêt",failed:"Échec de génération du lien Meet"};function Qt(s){return s&&s.trim()!==""?s.trim():"primary"}function Jt(s){const n=Qt(s);return n==="primary"?"Calendrier principal du connecteur":n}function Xt(s,n){return te(s,n)?s==="confirm"?"confirmed":s==="decline"?"declined":n:null}const Wt={new:"Nouvelle",pending:"En attente",confirmed:"Confirmée",declined:"Refusée",cancelled:"Annulée",completed:"Terminée"},Zt={new:0,pending:0,confirmed:1,completed:2,declined:3,cancelled:3};function es(s,n){return"booking_declined_mock"}const ts="upcoming_confirmed",ss=["upcoming_confirmed","awaiting","today","issues","all"],Fe={upcoming_confirmed:"À venir confirmées",awaiting:"À traiter",today:"Aujourd’hui",issues:"Problèmes",all:"Toutes"},as={upcoming_confirmed:"Aucune réservation confirmée à venir.",awaiting:"Aucune nouvelle demande à traiter.",today:"Aucune réservation pour aujourd’hui.",issues:"Aucun point bloquant détecté.",all:"Aucune réservation à afficher."},Ge=s=>{const n=new Date(s);return n.setHours(0,0,0,0),n},ns=(s,n)=>{if(!s)return!1;const i=new Date(s);return i.getFullYear()===n.getFullYear()&&i.getMonth()===n.getMonth()&&i.getDate()===n.getDate()},rs=(s,n)=>!!(s.meet_status==="failed"||s.status==="confirmed"&&s.meeting_format==="online"&&(s.meet_status!=="ready"||!s.meet_url)||s.status==="confirmed"&&!s.confirmation_email_sent_at||s.status==="confirmed"&&s.scheduled_at&&new Date(s.scheduled_at).getTime()<Ge(n).getTime()),Q=(s,n,i)=>{switch(n){case"all":return!0;case"awaiting":return s.status==="new"||s.status==="pending";case"upcoming_confirmed":return s.status!=="confirmed"||!s.scheduled_at?!1:new Date(s.scheduled_at).getTime()>=Ge(i).getTime();case"today":return ns(s.scheduled_at,i);case"issues":return rs(s,i)}},is=(s,n)=>{const i={upcoming_confirmed:0,awaiting:0,today:0,issues:0,all:s.length};for(const m of s)Q(m,"upcoming_confirmed",n)&&i.upcoming_confirmed++,Q(m,"awaiting",n)&&i.awaiting++,Q(m,"today",
6n)&&i.today++,Q(m,"issues",n)&&i.issues++;return i},os=(s,n,i)=>{const m=[...s];return n==="upcoming_confirmed"||n==="today"?(m.sort((c,u)=>{const x=c.scheduled_at?new Date(c.scheduled_at).getTime():Number.POSITIVE_INFINITY,g=u.scheduled_at?new Date(u.scheduled_at).getTime():Number.POSITIVE_INFINITY;return x!==g?x-g:u.created_at.localeCompare(c.created_at)}),m):(m.sort((c,u)=>{const x=i[c.status]??5,g=i[u.status]??5;return x!==g?x-g:u.created_at.localeCompare(c.created_at)}),m)},ls={new:"bg-amber-50 text-amber-800 border-amber-200",pending:"bg-amber-50 text-amber-800 border-amber-200",confirmed:"bg-emerald-50 text-emerald-800 border-emerald-200",declined:"bg-rose-50 text-rose-800 border-rose-200",cancelled:"bg-slate-100 text-slate-700 border-slate-200",completed:"bg-slate-100 text-slate-700 border-slate-200"},Le=({status:s})=>e.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-[10.5px] font-medium uppercase tracking-wide ${ls[s]}`,"data-testid":`booking-status-${s}`,children:Wt[s]}),cs=({format:s})=>s==="online"?e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-[11px] px-2 py-0.5 rounded-full bg-[hsl(213,40%,94%)] text-[hsl(213,64%,22%)] ring-1 ring-inset ring-[hsl(213,40%,86%)] font-medium",children:[e.jsx(Y,{className:"h-3 w-3"})," En ligne"]}):e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-[11px] px-2 py-0.5 rounded-full bg-[hsl(41,78%,93%)] text-[hsl(33,70%,30%)] ring-1 ring-inset ring-[hsl(41,60%,82%)] font-medium",children:[e.jsx(me,{className:"h-3 w-3"})," Présentiel"]}),ee=s=>s?new Date(s).toLocaleString("fr-FR",{weekday:"short",day:"2-digit",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit"}):"—",ds=s=>s?new Date(s).toLocaleDateString("fr-FR",{day:"2-digit",month:"short",year:"numeric"}):"—",Re=s=>s?new Date(s).toLocaleDateString("fr-FR",{day:"2-digit",month:"2-digit",year:"numeric"}):"—",ms=s=>s?new Date(s).toLocaleTimeString("fr-FR",{hour:"2-digit",minute:"2-digit"}):"",de=({label:s,testId:n,value:i,onChange:m,Icon:c,options:u,width:x="w-[150px]"})=>e.jsxs("div",{className:"relative inline-flex",children:[e.jsxs(Pe,{value:i,onValueChange:m,children:[e.jsx($e,{className:x,"aria-label":s,children:e.jsxs("span",{className:"flex items-center gap-2 min-w-0",children:[e.jsx(c,{size:13,"aria-hidden":!0,className:"text-[hsl(213,30%,55%)] shrink-0"}),e.jsx(Ue,{})]})}),e.jsx(Ve,{children:u.map(g=>e.jsx(Be,{value:g.value,children:g.label},g.value))})]}),e.jsx("select",{value:i,onChange:g=>m(g.target.value),"aria-hidden":"true",tabIndex:-1,"data-testid":n,className:"sr-only pointer-events-none",children:u.map(g=>e.jsx("option",{value:g.value,children:g.label},g.value))})]}),H=({label:s,sortKey:n,current:i,dir:m,onSort:c})=>{const u=i===n,x=u?m==="asc"?ct:ft:pt;return e.jsxs("button",{type:"button",onClick:()=>c(n),"aria-sort":u?m==="asc"?"ascending":"descending":"none","data-testid":`booking-sort-${n}`,"data-active":u?"true":"false",className:`group/sort inline-flex items-center gap-1.5 -ml-1 px-1 py-0.5 rounded transition-colors hover:text-[hsl(213,64%,22%)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(213,64%,22%)]/30 ${u?"text-[hsl(213,64%,22%)]":""}`,children:[e.jsx("span",{children:s}),e.jsx(x,{size:11,"aria-hidden":!0,className:`transition-opacity ${u?"opacity-100":"opacity-40 group-hover/sort:opacity-80"}`})]})},q=({label:s,value:n,Icon:i,accent:m,testId:c})=>e.jsxs("div",{"data-testid":c,className:"flex items-center gap-3 rounded-xl border border-[hsl(214,22%,91%)] bg-card px-4 py-3 transition-shadow hover:shadow-sm",children:[e.jsx("div",{className:`shrink-0 size-9 rounded-lg flex items-center justify-center ${m}`,"aria-hidden":!0,children:e.jsx(i,{size:16})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[11px] uppercase tracking-[0.14em] text-muted-foreground font-medium",children:s}),e.jsx("div",{className:"text-xl font-semibold leading-tight tracking-tight text-[hsl(213,64%,22%)] tabular-nums","data-testid":`${c}-value`,children:n})]})]}),us=({page:s,pageCount:n,pageSize:i,rangeStart:m,rangeEnd:c,total:u,onPageChange:x,onPageSizeChange:g})=>{const I=s>1,T=s<n;return e.jsxs("nav",{role:"navigation","aria-label":"Pagination","data-testid":"bookings-p
6agination",className:"flex flex-col gap-3 rounded-xl border border-[hsl(214,22%,91%)] bg-card px-3 py-2.5 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3 text-xs text-muted-foreground",children:[e.jsxs("span",{className:"tabular-nums","data-testid":"bookings-pagination-range",children:[m,"–",c," sur ",u," réservation",u>1?"s":""]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:"bookings-page-size",className:"hidden sm:inline",children:"Par page"}),e.jsxs(Pe,{value:String(i),onValueChange:v=>g(Number(v)),children:[e.jsx($e,{id:"bookings-page-size",className:"h-8 w-[78px] text-xs","aria-label":"Réservations par page","data-testid":"bookings-page-size",children:e.jsx(Ue,{})}),e.jsx(Ve,{children:Nt.map(v=>e.jsx(Be,{value:String(v),className:"text-xs",children:v},v))})]})]})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2 sm:justify-end",children:[e.jsxs("span",{className:"text-xs text-muted-foreground tabular-nums",children:["Page ",e.jsx("span",{className:"font-semibold text-foreground",children:s})," / ",n]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(K,{type:"button",variant:"outline",size:"icon",className:"h-8 w-8",onClick:()=>x(1),disabled:!I,"aria-label":"Première page",children:e.jsx(xt,{className:"h-4 w-4"})}),e.jsx(K,{type:"button",variant:"outline",size:"icon",className:"h-8 w-8",onClick:()=>x(Math.max(1,s-1)),disabled:!I,"aria-label":"Page précédente",children:e.jsx(Ht,{className:"h-4 w-4"})}),e.jsx(K,{type:"button",variant:"outline",size:"icon",className:"h-8 w-8",onClick:()=>x(Math.min(n,s+1)),disabled:!T,"aria-label":"Page suivante",children:e.jsx(Oe,{className:"h-4 w-4"})}),e.jsx(K,{type:"button",variant:"outline",size:"icon",className:"h-8 w-8",onClick:()=>x(n),disabled:!T,"aria-label":"Dernière page",children:e.jsx(gt,{className:"h-4 w-4"})})]})]})]})},ze={new:0,pending:1,confirmed:2,declined:3,cancelled:4,completed:5},xs=(s,n,i,m)=>{let c=0;if(i==="scheduled_at"){const u=s.scheduled_at?new Date(s.scheduled_at).getTime():Number.POSITIVE_INFINITY,x=n.scheduled_at?new Date(n.scheduled_at).getTime():Number.POSITIVE_INFINITY;c=u-x}else i==="created_at"?c=new Date(s.created_at).getTime()-new Date(n.created_at).getTime():i==="status"?c=(ze[s.status]??9)-(ze[n.status]??9):i==="reference"?c=(s.reference??"").localeCompare(n.reference??"","fr",{numeric:!0,sensitivity:"base"}):i==="contact_name"&&(c=s.contact_name.localeCompare(n.contact_name,"fr",{sensitivity:"base"}));return c===0&&i!=="created_at"&&(c=new Date(s.created_at).getTime()-new Date(n.created_at).getTime(),c=-c),m==="asc"?c:-c},Ls=()=>{const{toast:s}=nt(),{user:n}=rt(),[i,m]=o.useState([]),[c,u]=o.useState([]),[x,g]=o.useState(!0),[I,T]=o.useState(!1),[v,He]=o.useState(""),[k,qe]=o.useState(ts),[D,ue]=o.useState("all"),[F,Ke]=o.useState("all"),[L,Ye]=o.useState("all"),[R,Qe]=o.useState(""),[z,Je]=o.useState(""),[se,ae]=o.useState(null),[xe,ge]=o.useState([]),[fe,pe]=o.useState([]),[E,J]=o.useState(""),[ne,he]=o.useState(null),[be,_e]=o.useState(!1),[h,P]=o.useState(null),[X,je]=o.useState(!1),[Ne,W]=o.useState(null),[Xe,We]=o.useState(null),[S,$]=o.useState(null),C=o.useCallback(async()=>{var f;T(!0);const{data:t,error:r}=await _.from("bookings").select("id, reference, status, subject, description, meeting_format, scheduled_at, scheduled_date, scheduled_time, meeting_location, meeting_link, contact_name, contact_company, contact_email, contact_phone, attachment_path, attachment_name, created_at, meet_status, meet_url, meet_error, google_calendar_event_id, google_calendar_event_link, confirmation_email_sent_at").order("created_at",{ascending:!1}).limit(500);if(r){s({title:"Erreur de chargement",description:r.message,variant:"destructive"}),m([]),g(!1),T(!1);return}const d=(t??[]).map(j=>j.id);let l={};if(d.length>0){const{data:j}=await _.from("booking_assigned_experts").select("booking_id, expert_id").in("booking_id",d);for(const Se of j??[])(l[f=Se.booking_id]??(l[f]=[])).push(Se.expert_id)}const p=(t??[]).map(j=>({...j,status:j.status,meeting_format:j.meeting_format,meet_status:j.meet_status??"not_required",expert_ids:l[j.id]??[]}));m(p),g(!1),T(!1)},[s]),ve=o.useCallback(async()=>{const{data:t}=await _.from("booking_experts").select("id, name").order("display_order",{ascending:!0});u(t??[])},[]);o.useEffect(()=>{ve(),C(),(async()=>{var t;try{const{data:r}=await _.auth.getSession(),d=(t=r.session)==null?void 0:t.access_token;if(!d)return;const p=await fetch("https://qhiwrcgbinsvxecpldql.supabase.co/functions/v1/generate-meet-link",{method:"GET",headers:{Authorization:`Bearer ${d}`,apikey:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InFoaXdyY2diaW5zdnhlY3BsZHFsIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzcxMTU1MjgsImV4cCI6MjA5MjY5MTUyOH0.ljOFqdQAqyv6FsXWxSryKMpkJxgLtKk3XVIB0uCskQU"}});if(!p.ok)return;const f=await p.json();f&&typeof f.calendar_host=="string"&&We(f.calendar_host)}catch{}})()},[ve,C]);const a=o.useMemo(()=>i.find(t=>
6t.id===se)??null,[i,se]),A=o.useCallback(async t=>{const[{data:r},{data:d}]=await Promise.all([_.from("booking_status_events").select("id, action, old_status, new_status, admin_message, created_at").eq("booking_id",t).order("created_at",{ascending:!1}),_.from("email_send_log").select("id, template_name, recipient_email, status, created_at").eq("booking_id",t).order("created_at",{ascending:!1})]);ge(r??[]),pe(d??[])},[]);o.useEffect(()=>{if(!a){ge([]),pe([]),W(null),J("");return}A(a.id),J(""),$(t=>t&&t.bookingId===a.id?t:null),a.attachment_path?_.storage.from("booking-attachments").createSignedUrl(a.attachment_path,60*10).then(({data:t,error:r})=>{W(r?null:(t==null?void 0:t.signedUrl)??null)}):W(null)},[a,A]);const Z=o.useMemo(()=>new Date,[i]),U=o.useMemo(()=>{const t=new Map;for(const r of c)t.set(r.id,r.name);return t},[c]),re=v.trim(),ie=o.useMemo(()=>{const t=i.filter(r=>{if(!Q(r,k,Z))return!1;if(D==="awaiting"){if(r.status!=="new"&&r.status!=="pending")return!1}else if(D!=="all"&&r.status!==D)return!1;if(L!=="all"&&r.meeting_format!==L||F!=="all"&&!r.expert_ids.includes(F)||R&&r.scheduled_date&&r.scheduled_date<R||z&&r.scheduled_date&&r.scheduled_date>z)return!1;if(re){const d=r.expert_ids.map(p=>U.get(p)??p).join(" ");if(dt([{value:r.reference,weight:3,kind:"reference"},{value:r.contact_name,weight:2},{value:r.contact_email,weight:2,kind:"email"},{value:r.contact_company,weight:1.5},{value:r.subject,weight:1.5},{value:d,weight:1}],re)===0)return!1}return!0});return os(t,k,Zt)},[i,re,k,D,L,F,R,z,Z,U]),V=o.useMemo(()=>is(i,Z),[i,Z]),B=o.useMemo(()=>{let t=0,r=0,d=0;for(const l of i)l.status==="new"||l.status==="pending"?t++:l.status==="confirmed"?r++:l.status==="declined"&&d++;return{awaiting:t,confirmed:r,declined:d}},[i]),O=o.useMemo(()=>({total:i.length,confirmed:B.confirmed,awaiting:V.awaiting,today:V.today,issues:V.issues}),[i.length,B.confirmed,V]),[N,Ze]=o.useState("created_at"),[w,we]=o.useState("desc"),[ye,ke]=o.useState(1),[oe,et]=o.useState(ht),y=o.useMemo(()=>N==="created_at"&&w==="desc"?ie:[...ie].sort((t,r)=>xs(t,r,N,w)),[ie,N,w]),b=o.useMemo(()=>bt(y.length,oe,ye),[y.length,oe,ye]),tt=o.useMemo(()=>_t(y,b.page,b.pageSize),[y,b.page,b.pageSize]);o.useEffect(()=>{ke(1)},[k,v,D,L,F,R,z,N,w,oe]);const G=t=>{N===t?we(r=>r==="asc"?"desc":"asc"):(Ze(t),we(t==="created_at"||t==="scheduled_at"?"desc":"asc"))},le=o.useCallback(async t=>{_e(!0);try{const{data:r,error:d}=await _.functions.invoke("generate-meet-link",{body:{booking_id:t}});if(d)return s({title:"Échec génération du lien Meet",description:d.message??"Erreur inconnue",variant:"destructive"}),{ok:!1,error:d.message};if(r!=null&&r.error){const l=r.detail??r.error;return s({title:"Échec génération du lien Meet",description:String(l),variant:"destructive"}),{ok:!1,error:String(l)}}return s({title:"Lien Google Meet généré"}),await C(),await A(t),{ok:!0}}finally{_e(!1)}},[s,C,A]),st=o.useCallback(async t=>{if(a){if(!te(t,a.status)){s({title:"Action impossible",description:"Cette action n'est pas autorisée pour ce statut.",variant:"destructive"});return}if(t==="send_confirmation"&&!Me(a.status,a.meeting_format,a.meet_status)){s({title:"Lien Meet requis",description:"Le lien Google Meet doit être généré avant l'envoi de l'email de confirmation.",variant:"destructive"});return}je(!0),he(t);try{const r=Xt(t,a.status),d=a.status;if(r!==d){const{error:l}=await _.from("bookings").update({status:r,...t==="confirm"?{confirmed_at:new Date().toISOString(),confirmed_by:(n==null?void 0:n.id)??null}:{},...t==="decline"?{declined_reason:E.trim()||null}:{}}).eq("id",a.id);if(l)throw l}if(await _.from("booking_status_events").insert({booking_id:a.id,actor_admin_id:(n==null?void 0:n.id)??null,old_status:d,new_status:r,action:t,admin_message:E.trim()||null}),t==="decline"){const l=es("decline",a.meeting_format);await _.from("email_send_log").insert({message_id:`mock-${a.id}-${Date.now()}`,template_name:l,recipient_email:a.contact_email,booking_id:a.id,status:"mocked",subject:`[${l}] ${a.reference??a.id}`,payload:{reference:a.reference,format:a.meeting_format,admin_message:E.trim()||null}})}if(t==="send_confirmation"){const{data:l,error:p}=await _.functions.invoke("send-booking-confirmation",{body:{booking_id:a.id,admin_message:E.trim()||null}});
6if(p||l!=null&&l.error){const f=(l==null?void 0:l.error)??(p==null?void 0:p.message)??"send_failed",j=f==="email_infra_not_ready"?"Email non envoyé — domaine d'envoi non configuré.":f==="meet_not_ready"?"Le lien Google Meet n'est pas encore prêt.":`Échec d'envoi : ${f}`;s({title:"Email non envoyé",description:j,variant:"destructive"})}else s({title:"Email de confirmation envoyé"})}t==="confirm"&&a.meeting_format==="online"&&await le(a.id),t==="confirm"?(s({title:"Réservation confirmée"}),$({bookingId:a.id,action:"confirm"})):t==="decline"&&(s({title:"Réservation refusée"}),$({bookingId:a.id,action:"decline"})),J(""),await C(),await A(a.id)}catch(r){s({title:"Erreur",description:(r==null?void 0:r.message)??String(r),variant:"destructive"})}finally{je(!1),he(null),P(null)}}},[a,E,n==null?void 0:n.id,s,C,A,le]);return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("header",{className:"flex flex-col md:flex-row md:items-end md:justify-between gap-4 mb-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold tracking-tight text-[hsl(213,64%,22%)]",children:"Réservations"}),e.jsxs("p",{className:"text-sm text-muted-foreground mt-1","data-testid":"bookings-subtitle",children:["Pilotage des demandes de rendez-vous reçues depuis le site public · ",i.length," réservation",i.length>1?"s":""," au total"]})]}),e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:e.jsxs(K,{variant:"outline",disabled:I,"aria-busy":I,onClick:async()=>{await C(),s({title:"Réservations actualisées",description:"La liste a été synchronisée avec le serveur."})},className:"gap-2","data-testid":"bookings-refresh",children:[I?e.jsx(M,{size:16,className:"animate-spin","aria-hidden":!0}):e.jsx(Lt,{size:16,"aria-hidden":!0}),"Actualiser"]})})]}),e.jsxs("section",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-3","aria-label":"Indicateurs clés","data-testid":"bookings-kpis",children:[e.jsx(q,{label:"Total",value:O.total,Icon:Rt,accent:"bg-[hsl(213,40%,94%)] text-[hsl(213,64%,22%)]",testId:"bookings-kpi-total"}),e.jsx(q,{label:"Confirmées",value:O.confirmed,Icon:ce,accent:"bg-emerald-50 text-emerald-700",testId:"bookings-kpi-confirmed"}),e.jsx(q,{label:"À traiter",value:O.awaiting,Icon:zt,accent:"bg-amber-50 text-amber-700",testId:"bookings-kpi-awaiting"}),e.jsx(q,{label:"Aujourd’hui",value:O.today,Icon:Ie,accent:"bg-[hsl(213,64%,22%)] text-white",testId:"bookings-kpi-today"}),e.jsx(q,{label:"Problèmes",value:O.issues,Icon:Te,accent:"bg-rose-50 text-rose-700",testId:"bookings-kpi-issues"})]}),e.jsx("div",{className:"flex flex-wrap items-center gap-1.5","data-testid":"bookings-quick-views",children:ss.map(t=>{const r=k===t,d=V[t];return e.jsxs("button",{type:"button",onClick:()=>qe(t),"data-testid":`bookings-quickview-${t}`,"data-active":r?"true":"false","aria-pressed":r,className:`inline-flex items-center gap-2 h-8 px-3 rounded-full border text-xs transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(213,64%,22%)]/40 focus-visible:ring-offset-2 focus-visible:ring-offset-background ${r?"border-[hsl(213,64%,22%)] bg-[hsl(213,64%,22%)] text-white shadow-sm":"border-input bg-background hover:bg-muted/50 text-foreground"}`,children:[e.jsx("span",{className:"font-medium",children:Fe[t]}),e.jsx("span",{"data-testid":`bookings-quickview-${t}-count`,className:`text-[10px] tabular-nums px-1.5 h-4 inline-flex items-center rounded-full ${r?"bg-white/20 text-white":"bg-muted text-muted-foreground"}`,children:d})]},t)})}),e.jsxs("div",{className:"rounded-2xl border border-[hsl(214,22%,91%)] bg-gradient-to-b from-card to-[hsl(213,30%,99%)] p-2 md:p-2.5 shadow-[0_1px_0_hsl(213,30%,96%),0_8px_24px_-16px_hsl(213,40%,40%/0.18)]","data-testid":"bookings-filters",children:[e.jsxs("div",{className:`
7            admin-filter-bar
8            flex flex-col lg:flex-row gap-2
9            [&_button[role=combobox]]:h-9
10            [&_button[role=combobox]]:rounded-lg
11            [&_button[role=combobox]]:border-[hsl(214,22%,90%)]
12            [&_button[role=combobox]]:bg-card
13            [&_button[role=combobox]]:text-[13px]
14            [&_button[role=combobox]]:font-medium
15            [&_button[role=combobox]]:text-foreground/85
16            [&_button[role=combobox]]:shadow-none
17            [&_button[role=combobox]]:transition-colors
18            [&_button[role=combobox]:hover]:bg-[hsl(213,30%,98%)]
19            [&_button[role=combobox]:hover]:border-[hsl(213,40%,82%)]
20            [&_button[role=combobox]:focus-visible]:ring-2
21            [&_button[role=combobox]:focus-visible]:ring-[hsl(213,64%,22%)]/25
22            [&_button[role=combobox]:focus-visible]:ring-offset-0
23            [&_button[role=combobox][data-state=open]]:border-[hsl(213,64%,22%)]
24            [&_button[role=combobox][data-state=open]]:ring-2
25            [&_button[role=combobox][data-state=open]]:ring-[hsl(213,64%,22%)]/15
26          `,children:[e.jsx("div",{className:"flex-1 min-w-[260px]",children:e.jsx(mt,{value:v,onChange:He,placeholder:"Référence, nom, email, société, sujet…",ariaLabel:"Rechercher une réservation",inputTestId:"bookings-search",shortcutHint:"/"})}),e.jsx("div",{className:"hidden lg:block w-px self-stretch my-1 bg-[hsl(214,22%,92%)]","aria-hidden":!0}),e.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[e.jsx(de,{label:"Filtrer par statut",testId:"bookings-status-filter",value:D,onChange:t=>ue(t),Icon:ut,width:"w-[160px]",options:[{value:"all",label:"Tous statuts"},{value:"awaiting",label:`À traiter (${B.awaiting})`},{value:"confirmed",label:`Confirmées (${B.confirmed})`},{value:"declined",label:`Refusées (${B.declined})`},{value:"cancelled",label:"Annulées"},{value:"completed",label:"Terminées"}]}),e.jsx(de,{label:"Filtrer par expert",testId:"bookings-expert-filter",value:F,onChange:Ke,Icon:qt,width:"w-[160px]",options:[{value:"all",label:"Tous experts"},...c.map(t=>({value:t.id,label:t.name}))]}),e.jsx(de,{label:"Filtrer par format",testId:"bookings-format-filter",value:L,onChange:t=>Ye(t),Icon:Pt,width:"w-[140px]",options:[{value:"all",label:"Tous formats"},{value:"online",label:"En ligne"},{value:"onsite",label:"Présentiel"}]}),e.jsxs("div",{className:"inline-flex items-center gap-1.5 h-9 rounded-lg border border-[hsl(214,22%,90%)] bg-card px-2 text-[12px]",children:[e.jsx(Ie,{size:13,"aria-hidden":!0,className:"text-[hsl(213,30%,55%)]"}),e.jsx("input",{type:"date",value:R,onChange:t=>Qe(t.target.value),"aria-label":"Du",className:"bg-transparent border-0 outline-none text-foreground/85 w-[120px]","data-testid":"bookings-date-from"}),e.jsx("span",{className:"text-muted-foreground",children:"→"}),e.jsx("input",{type:"date",value:z,onChange:t=>Je(t.target.value),"aria-label":"Au",className:"bg-transparent border-0 outline-none text-foreground/85 w-[120px]","data-testid":"bookings-date-to"})]})]})]}),e.jsxs("div",{className:"mt-2 flex items-center gap-2 text-[11px] text-muted-foreground","data-testid":"bookings-results-meta",children:[e.jsx(Ut,{size:11,"aria-hidden":!0}),x?"Chargement…":`${y.length} résultat${y.length>1?"s":""} affiché${y.length>1?"s":""} · vue : ${Fe[k]}`]})]}),e.jsx("div",{className:"rounded-2xl border border-[hsl(214,22%,91%)] bg-card overflow-x-auto shadow-[0_1px_0_hsl(213,30%,96%)]",children:e.jsxs("table",{className:"w-full text-xs","data-testid":"bookings-table",children:[e.jsx("thead",{className:"bg-[hsl(213,30%,98%)] text-[10.5px] uppercase tracking-[0.12em] text-muted-foreground",children:e.jsxs("tr",{children:[e.jsx("th",{className:"text-left font-semibold px-3 py-2.5 w-[44px]","aria-label":"Numéro",children:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx($t,{size:11,"aria-hidden":!0})," #"]})}),e.jsx("th",{className:"text-left font-semibold px-3 py-2.5",children:e.jsx(H,{label:"Référence",sortKey:"reference",current:N,dir:w,onSort:G})}),e.jsx("th",{className:"text-left font-semibold px-3 py-2.5",children:e.jsx(H,{label:"Statut",sortKey:"status",current:N,dir:w,onSort:G})}),e.jsx("th",{className:"text-left font-semibold px-3 py-2.5",children:e.jsx(H,{label:"RDV",sortKey:"scheduled_at",current:N,dir:w,onSort:G})}),e.jsx("th",{className:"text-left font-semibold px-3 py-2.5",children:"Format"}),e.jsx("th",{className:"text-left font-semibold px-3 py-2.5",children:"Expert(s)"}),e.jsx("th",{className:"text-left font-semibold px-3 py-2.5",children:e.jsx(H,{label:"Contact",sortKey:"c
26ontact_name",current:N,dir:w,onSort:G})}),e.jsx("th",{className:"text-left font-semibold px-3 py-2.5",children:"Sujet"}),e.jsx("th",{className:"text-left font-semibold px-3 py-2.5",children:e.jsx(H,{label:"Reçue le",sortKey:"created_at",current:N,dir:w,onSort:G})}),e.jsx("th",{className:"text-left font-semibold px-3 py-2.5 w-[56px]",children:"Actions"})]})}),e.jsxs("tbody",{children:[x&&e.jsx("tr",{children:e.jsxs("td",{colSpan:10,className:"px-3 py-10 text-center text-muted-foreground",children:[e.jsx(M,{className:"h-4 w-4 animate-spin inline mr-2"})," Chargement…"]})}),!x&&y.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:10,className:"px-3 py-10 text-center text-muted-foreground","data-testid":"bookings-empty-state",children:as[k]})}),!x&&tt.map((t,r)=>{const d=(b.page-1)*b.pageSize+r+1,l=t.id===se,p=t.status==="confirmed"&&t.meeting_format==="online"&&t.meet_status!=="ready"||t.meet_status==="failed"||t.status==="confirmed"&&!t.confirmation_email_sent_at;return e.jsxs("tr",{onClick:()=>ae(t.id),className:`border-t border-border cursor-pointer transition-colors hover:bg-muted/40 ${l?"bg-[hsl(213,40%,97%)]":p?"bg-rose-50/40":""}`,"data-testid":`booking-row-${t.id}`,"data-selected":l?"true":"false","data-row-index":d,children:[e.jsx("td",{className:"px-3 py-3 align-top text-[11px] tabular-nums text-muted-foreground",children:d}),e.jsx("td",{className:"px-3 py-3 font-mono text-[11px] align-top whitespace-nowrap",children:t.reference??t.id.slice(0,8)}),e.jsx("td",{className:"px-3 py-3 align-top",children:e.jsx(Le,{status:t.status})}),e.jsx("td",{className:"px-3 py-3 align-top whitespace-nowrap",children:t.scheduled_at?e.jsxs("div",{className:"leading-tight",children:[e.jsx("div",{className:"text-foreground font-medium",children:Re(t.scheduled_at)}),e.jsx("div",{className:"text-[11px] text-muted-foreground",children:ms(t.scheduled_at)})]}):e.jsx("span",{className:"text-muted-foreground",children:"—"})}),e.jsx("td",{className:"px-3 py-3 align-top",children:e.jsx(cs,{format:t.meeting_format})}),e.jsx("td",{className:"px-3 py-3 align-top text-[12px] text-foreground/85 max-w-[160px]",children:t.expert_ids.length>0?e.jsx("div",{className:"space-y-0.5 leading-tight",children:t.expert_ids.map(f=>e.jsx("div",{className:"truncate",title:U.get(f)??f,children:U.get(f)??f},f))}):e.jsx("span",{className:"text-muted-foreground",children:"—"})}),e.jsxs("td",{className:"px-3 py-3 align-top",children:[e.jsx("div",{className:"font-medium text-foreground leading-tight",children:t.contact_name}),t.contact_company&&e.jsxs("div",{className:"text-[11px] text-muted-foreground inline-flex items-center gap-1 mt-0.5",children:[e.jsx(De,{size:10,"aria-hidden":!0})," ",t.contact_company]}),e.jsx("div",{className:"text-[11px] text-muted-foreground truncate max-w-[220px] mt-0.5",title:t.contact_email,children:t.contact_email})]}),e.jsx("td",{className:"px-3 py-3 align-top max-w-[240px]",children:e.jsx("div",{className:"truncate text-foreground/90",title:t.subject,children:t.subject})}),e.jsx("td",{className:"px-3 py-3 align-top text-[11px] whitespace-nowrap text-muted-foreground",children:Re(t.created_at)}),e.jsx("td",{className:"px-3 py-3 align-top",children:e.jsx("button",{type:"button",onClick:f=>{f.stopPropagation(),ae(t.id)},"aria-label":"Ouvrir la réservation",title:"Ouvrir",className:"inline-flex items-center justify-center h-8 w-8 rounded-md text-muted-foreground hover:text-[hsl(213,64%,22%)] hover:bg-[hsl(213,40%,94%)] transition-colors","data-testid":`booking-open-${t.id}`,children:e.jsx(Oe,{className:"h-4 w-4","aria-hidden":!0})})})]},t.id)})]})]})}),!x&&y.length>0&&e.jsx(us,{page:b.page,pageCount:b.pageCount,pageSize:b.pageSize,rangeStart:b.rangeStart,rangeEnd:b.rangeEnd,total:b.total,onPageChange:ke,onPageSizeChange:et}),e.jsx(vt,{open:!!a,onOpenChange:t=>{t||ae(null)},children:e.jsx(wt,{side:"right",className:"w-full sm:max-w-xl flex flex-col p-0","data-testid":"booking-detail-drawer",children:a&&e.jsxs(e.Fragment,{children:[e.jsx(yt,{className:"p-6 pb-4 border-b bg-muted/30",children:e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx(kt,{className:"font-mono text-2xl tracking-tight","data-testid":"booking-drawer-reference",children:a.reference??a.id.slice(0,8)}),e.jsxs(St,{className:"mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs",children:[e.jsx("span",{className:"inline-flex items-center gap-1",children:a.meeting_format==="online"?e.jsxs(e.Fragment,{children:[e.jsx(Y,{className:"h-3.5 w-3.5"})," En ligne"]}):e.jsxs(e.Fragment,{children:[e.jsx(me,{className:"h-3.5 w-3.5"})," Présentiel"]})}),e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(Ee,{className:"h-3.5 w-3.5"}),ee(a.scheduled_at)]}),e.jsxs("span",{className:"text-muted-foreground",children:["Reçue le ",ds(a.created_at)]})]})]}),e.jsx(Le,{status:a.status})]})}),e.jsxs("div",{className:"flex-1 overflow-y-auto px-6 py-5 space-y-6",children:[S&&S.bookingId===a.id&&e.jsxs("div",{className:`rounded-md border px-3 py-2.5 text-[13px] flex items-start gap-2 ${S.action==="confirm"?"bg-emerald-50 border-emerald-200 text-emerald-900":"bg-rose-50 border-rose-200 text-rose-900"}`,"data-testid":`booking-action-notice-${S.action}`,children:[e.jsx(ce,{className:"h-4 w-4 mt-0.5 shrink-0 opacity-80","aria-hidden":!0}),e.jsxs("div",{className:"flex-1 space-y-1.5",children:[e.jsx("p",{children:S.action==="confirm"?"Cette réservation est maintenant confirmée. Elle n’apparaît plus dans le filtre « À traiter ».":"Cette réservation est maintenant refusée. Elle n’apparaît plus dans le filtre « À traiter »."}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 pt-0.5",children:[e.jsx("button",{type:"button",onClick:()=>{ue(S.action==="confirm"?"confirmed":"declined"),$(null)},className:"inline-flex items-center gap-1 text-[12px] px-2.5 h-7 rounded-md border border-current/30 bg-background/60 hover:bg-background","data-testid":"booking-action-notice-cta",children:S.action==="confirm"?"Voir les réservations confirmées":"Voir les réservations refusées"}),e.jsx("button",{type:"button",onClick:()=>$(null),className:"text-[11.5px] underline underline-offset-2 opacity-75 hover:opacity-100",children:"Fermer"})]})]})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"Rendez-vous"}),e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Ee,{className:"h-4 w-4 text-muted-foreground"}),ee(a.scheduled_at)]}),e.jsx("div",{className:"flex items-center gap-2 text-sm",children:a.meeting_format==="online"?e.jsxs(e.Fragment,{children:[e.jsx(Y,{className:"h-4 w-4 text-muted-foreground"}),"En ligne"]}):e.jsxs(e.Fragment,{children:[e.jsx(me,{className:"h-4 w-4 text-muted-foreground"}),"Présentiel",a.meeting_location&&e.jsxs("span",{className:"text-muted-foreground",children:["— ",a.meeting_location]})]})}),e.jsxs("div",{className:"text-sm",children:[e.jsx("span",{className:"text-muted-foreground",children:"Expert(s) : "}),a.expert_ids.length>0?a.expert_ids.map(t=>U.get(t)??t).join(", "):"—"]})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"Contact"}),e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Vt,{className:"h-4 w-4 text-muted-foreground"}),a.contact_name]}),a.contact_company&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(De,{className:"h-4 w-4 text-muted-foreground"}),a.contact_company]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(jt,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("a",{href:`mailto:${a.contact_email}`,className:"underline underline-offset-2",children:a.contact_email})]}),a.contact_phone&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(it,{className:"h-4 w-4 text-muted-foreground"}),a.contact_phone]})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"Demande"}),e.jsx("div",{className:"text-sm font-medium",children:a.subject}),a.description&&e.jsx("p",{className:"text-sm whitespace-pre-wrap text-muted-foreground",children:a.description})]}),a.attachment_path&&e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"Pièce jointe"}),Ne?e.jsxs("a",{href:Ne,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-2 px-3 py-2 text-sm rounded-md border hover:bg-muted/50 transition-colors","data-testid":"booking-attachment-download",children:[e.jsx(Ot,{className:"h-4 w-4"}),a.attachment_name??"Télécharger"]}):e.jsx("div",{className:"text-xs text-muted-foreground",children:"Génération du lien sécurisé…"})]}),e.jsxs("section",{className:"space-y-3 p-4 rounded-lg border bg-muted/20","data-testid":"booking-decision-panel",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"Décision"}),e.jsx(ot,{placeholder:"Message interne / message à inclure dans l'email (optionnel)…",value:E,onChange:t=>J(t.target.value),rows:3,"data-testid":"booking-admin-message"}),a.meeting_format==="online"&&e.jsxs("div",{className:"rounded-md border bg-background p-3 space-y-2","data-testid":"booking-meet-panel",children:[(()=>{const t=a.status!=="confirmed",r=t?"Confirmez d'abord la réservation":Yt[a.meet_status],d=t?"bg-slate-100 text-slate-700 border-slate-200":a.meet_status==="ready"?"bg-emerald-50 text-emerald-800 border-emerald-200":a.meet_status==="failed"?"bg-rose-50 text-rose-800 border-rose-200":a.meet_status==="pending"?"bg-amber-50 text-amber-800 border-amber-200":"bg-slate-100 text-slate-700 border-slate-200",l=!t&&Kt(a.meeting_format,a.meet_status);return e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Y,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"font-medium",children:"Google Meet"}),e.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-[11px] font-medium ${d}`,"data-testid":`booking-meet-status-${a.meet_status}`,children:r})]}),l&&e.jsxs("button",{type:"button",onClick:()=>le(a.id),disabled:be||X,className:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md border hover:bg-muted/50 disabled:opacity-50 disabled:cursor-not-allowed transition-colors","data-testid":"booking-generate-meet-btn",children:[be?e.jsx(M,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(Y,{className:"h-3.5 w-3.5"}),a.meet_status==="failed"?"Réessayer":"Générer le lien Meet"]})]})})(),a.meet_url&&a.meet_status==="ready"&&e.jsx("a",{href:a.meet_url,target:"_blank",rel:"noopener noreferrer",className:"block text-xs underline underline-offset-2 break-all","data-testid":"booking-meet-url",children:a.meet_url}),a.meet_status==="failed"&&a.meet_error&&e.jsx("p",{className:"text-[11px] text-rose-700 break-words",children:a.meet_error}),a.google_calendar_event_link&&e.jsx("a",{href:a.google_calendar_event_link,target:"_blank",rel:"noopener noreferrer",className:"text-[11px] text-muted-foreground underline",children:"Voir l'événement Calendar"}),e.jsxs("p",{className:"pt-1 text-[10px] uppercase tracking-wider text-muted-foreground
26/80 font-mono","data-testid":"booking-meet-calendar-host",children:["Calendar host : ",Jt(Xe)]}),e.jsxs("p",{className:"text-[10px] text-muted-foreground/70 font-mono break-all","data-testid":"booking-meet-debug",children:["debug · booking_id=",a.id," · meet_status=",a.meet_status," · has_meet_url=",a.meet_url?"true":"false"," · gcal_event_id=",a.google_calendar_event_id?"true":"false"]})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2",children:[e.jsxs("button",{type:"button",disabled:!te("confirm",a.status)||X,onClick:()=>P({action:"confirm",label:a.meeting_format==="online"?"Confirmer + générer le lien Meet":"Confirmer la réservation"}),className:"inline-flex items-center justify-center gap-2 px-3 py-2 text-sm rounded-md bg-emerald-600 text-white hover:bg-emerald-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors","data-testid":"booking-confirm-btn",children:[ne==="confirm"?e.jsx(M,{className:"h-4 w-4 animate-spin"}):e.jsx(ce,{className:"h-4 w-4"}),"Confirmer"]}),e.jsxs("button",{type:"button",disabled:!te("decline",a.status)||X,onClick:()=>P({action:"decline",label:"Refuser la demande"}),className:"inline-flex items-center justify-center gap-2 px-3 py-2 text-sm rounded-md bg-rose-600 text-white hover:bg-rose-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors","data-testid":"booking-decline-btn",children:[ne==="decline"?e.jsx(M,{className:"h-4 w-4 animate-spin"}):e.jsx(Bt,{className:"h-4 w-4"}),"Refuser"]})]}),(()=>{const t=Me(a.status,a.meeting_format,a.meet_status),r=a.status!=="confirmed"?"Confirmez d'abord la réservation.":a.meeting_format==="online"&&a.meet_status!=="ready"?"Le lien Google Meet doit être généré avant l'envoi.":null;return e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",disabled:!t||X,onClick:()=>P({action:"send_confirmation",label:"Envoyer l'email de confirmation"}),className:"w-full inline-flex items-center justify-center gap-2 px-3 py-2 text-sm rounded-md border hover:bg-muted/50 disabled:opacity-50 disabled:cursor-not-allowed transition-colors","data-testid":"booking-send-confirmation-btn",title:r??void 0,children:[ne==="send_confirmation"?e.jsx(M,{className:"h-4 w-4 animate-spin"}):e.jsx(lt,{className:"h-4 w-4"}),"Envoyer la confirmation",a.confirmation_email_sent_at?" (renvoyer)":""]}),!t&&r&&e.jsx("p",{className:"text-[11px] text-muted-foreground",children:r})]})})(),(a.status==="declined"||a.status==="confirmed")&&e.jsxs("p",{className:"flex items-start gap-1.5 text-[11px] text-muted-foreground",children:[e.jsx(Te,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),a.status==="declined"?"Cette demande a été refusée. Le statut ne peut plus être modifié.":"Cette demande est confirmée. Le refus n'est plus autorisé."]})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground inline-flex items-center gap-1.5",children:[e.jsx(Gt,{className:"h-3.5 w-3.5"})," Historique"]}),xe.length===0&&fe.length===0?e.jsx("p",{className:"text-xs text-muted-foreground",children:"Aucune action enregistrée pour le moment."}):e.jsxs("ul",{className:"space-y-1.5 text-xs","data-testid":"booking-history",children:[xe.map(t=>e.jsxs("li",{className:"flex items-start gap-2 p-2 rounded border bg-background",children:[e.jsx(Ce,{variant:"outline",className:"text-[10px]",children:t.action}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"text-muted-foreground",children:[t.old_status," → ",t.new_status]}),t.admin_message&&e.jsx("div",{className:"italic mt-0.5",children:t.admin_message})]}),e.jsx("span",{className:"text-muted-foreground whitespace-nowrap",children:ee(t.created_at)})]},t.id)),fe.map(t=>e.jsxs("li",{className:"flex items-start gap-2 p-2 rounded border bg-background",children:[e.jsx(Ce,{variant:"outline",className:"text-[10px]",children:"email"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{children:t.template_name}),e.jsxs("div",{className:"text-muted-foreground",children:["→ ",t.recipient_email," · ",t.status]})]}),e.jsx("span",{className:"text-muted-foreground whitespace-nowrap",children:ee(t.created_at)})]},t.id))]})]})]})]})})}),e.jsx(Ct,{open:!!h,onOpenChange:t=>{t||P(null)},children:e.jsxs(It,{children:[e.jsxs(Tt,{children:[e.jsx(Dt,{children:h==null?void 0:h.label}),e.jsx(Et,{children:(h==null?void 0:h.action)==="decline"?"Cette action refusera la demande et notifiera le contact. Elle est irréversible.":(h==null?void 0:h.action)==="confirm"?(a==null?void 0:a.meeting_format)==="online"?"La réservation sera confirmée puis un lien Google Meet sera généré automatiquement."
26:"La réservation sera marquée comme confirmée.":"Un email de confirmation réel sera envoyé au client."})]}),e.jsxs(At,{children:[e.jsx(Mt,{children:"Annuler"}),e.jsx(Ft,{onClick:t=>{t.preventDefault(),h&&st(h.action)},"data-testid":"booking-confirm-action",children:"Confirmer"})]})]})})]})};export{Ls 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.