PageSourceSearch

https://app.stewdy.com/_nuxt/CMwGBO0t.js

js stewdy.com collected 2026-09-25 14:33:39 UTC 32,800 bytes, 16 lines download raw bytes

1import{e as we,a as _e,u as Ce,f as Je}from"./DkVf9n4u.js";import{w as Be,d as Oe,l as m,m as e,p as d,y as v,F as D,A as N,r as T,J as E,K as $,T as Z,B as M,W as ye,H as he,v as i,f as be,k as p}from"./CIUMbBtW.js";import{u as Re}from"./DKmkRsWh.js";import{_ as He}from"./DSYtdbKx.js";import{_ as Ge}from"./DlAUqK2U.js";import{w as We}from"./CBP7X1jw.js";import"./B4nZWk6_.js";const Ke=()=>{const f=Ce("useTeacherDashboard"),x=we(),{user:q}=_e(),j=async()=>{const{data:l,error:n}=await x.auth.getSession(),o=l.session?.access_token;if(n||!o)throw new Error("Session expirée");return{Authorization:`Bearer ${o}`}},A=async()=>{try{if(!q.value)return f.error("❌ Aucun utilisateur connecté"),null;f.log("🔍 Recherche de l'ID enseignant pour l'utilisateur:",q.value.id);const{data:l,error:n}=await x.from("users").select("id").eq("id",q.value.id).single();return n||!l?(f.error("❌ Erreur récupération utilisateur:",n),null):(f.log("✅ ID enseignant trouvé:",l.id),l.id)}catch(l){return f.error("❌ Erreur getCurrentTeacherId:",l),null}};return{getCurrentTeacherId:A,getTeacherStats:async()=>{try{const l=await A();if(!l)throw new Error("Aucun enseignant trouvé");f.log("🔍 Recherche des élèves pour l'enseignant:",l);const{data:n,error:o}=await x.from("classes").select("id").eq("professeur_principal_id",l);if(o)return f.error("❌ Erreur récupération classes:",o),null;if(!n||n.length===0)return{total_students:0,active_students:0,pending_students:0,students_with_accounts:0};const b=n.map(C=>C.id),{data:u,error:c}=await x.from("eleves").select("status, created_at").in("classe_id",b);if(c)return f.error("❌ Erreur récupération stats élèves:",c),null;f.log("📊 Élèves trouvés:",u);const g=u.length,k=u.filter(C=>C.status==="active").length,z=u.filter(C=>C.status==="pending").length,L=u.filter(C=>C.status==="active"||C.status==="pending").length,S={total_students:g,active_students:k,pending_students:z,students_with_accounts:L};return f.log("✅ Stats calculées:",S),S}catch(l){return f.error("❌ Erreur getTeacherStats:",l),null}},getTeacherStudents:async()=>{try{const l=await A();if(!l)throw new Error("Aucun enseignant trouvé");const{data:n,error:o}=await x.from("classes").select("id").eq("professeur_principal_id",l);if(o)return f.error("❌ Erreur récupération classes:",o),[];if(!n||n.length===0)return[];const b=n.map(g=>g.id),{data:u,error:c}=await x.from("eleves").select(`
2          user_id,
3          status,
4          created_at,
5          classe_id,
6          last_connection,
7          quizzes_passed,
8          users!eleves_user_id_fkey(
9            firstname,
10            lastname,
11            email
12          ),
13          niveaux!eleves_niveau_id_fkey(
14            nom
15          )
16        `).in("classe_id",b).order("created_at",{ascending:!1});return c?(f.error("❌ Erreur récupération élèves:",c),[]):u.map(g=>({id:g.user_id,full_name:`${g.users?.firstname||""} ${g.users?.lastname||""}`.trim(),email:g.users?.email,level:g.niveaux?.nom||"",status:g.status,classe_id:g.classe_id,created_at:g.created_at,last_connection:g.last_connection,quizzes_passed:g.quizzes_passed||0}))}catch(l){return f.error("❌ Erreur getTeacherStudents:",l),[]}},getStudentsData:async l=>{try{const n=await A();if(!n)throw new Error("Aucun enseignant trouvé");const o=new URLSearchParams({teacherId:n});l?.limit!=null&&o.set("limit",String(l.limit)),l?.after&&o.set("after",l.after),l?.search&&o.set("search",l.search),l?.level&&o.set("level",l.level),l?.status&&o.set("status",l.status),l?.class&&o.set("class",l.class);const b=await fetch(`/api/teachers/students?${o.toString()}`,{headers:await j()});if(!b.ok){const k=await b.json();throw new Error(k.statusMessage||"Erreur lors de la récupération des données")}const u=await b.json(),c=u.students??[],g=u.pagination;return{success:!0,data:{children:c,pendingCredentials:[],stats:{total:g?.total??c.length??0,active:c.filter(k=>k.status==="active").length??0,pending:c.filter(k=>k.status==="pending").length??0,withEmail:c.filter(k=>k.email).length??0,neverConnected:u.neverConnected},pagination:g}}}catch(n){return f.error("Erreur lors de la récupération des données élèves:",
16n),{success:!1,error:n.message,data:{students:[],pendingCredentials:[],stats:{total:0,active:0,pending:0,withEmail:0}}}}},createStudent:async l=>{try{const n=await A();if(!n)throw new Error("Aucun enseignant trouvé");const o=await fetch("/api/teachers/students/create",{method:"POST",headers:{"Content-Type":"application/json",...await j()},body:JSON.stringify({teacherId:n,...l})});if(!o.ok){const u=await o.json();throw new Error(u.statusMessage||"Erreur lors de la création de l'élève")}return{success:!0,data:(await o.json()).data}}catch(n){return f.error("❌ Erreur lors de la création de l'élève:",n),{success:!1,error:n.message}}},updateStudent:async(l,n)=>{try{const o=await fetch(`/api/students/${l}/update`,{method:"PATCH",headers:{"Content-Type":"application/json",...await j()},body:JSON.stringify(n)});if(!o.ok){const u=await o.json();throw new Error(u.statusMessage||"Erreur lors de la modification de l'élève")}return{success:!0,data:(await o.json()).data}}catch(o){return f.error("❌ Erreur lors de la modification de l'élève:",o),{success:!1,error:o.message}}},deleteStudent:async l=>{try{const n=await fetch(`/api/students/${l}/delete`,{method:"DELETE",headers:await j()});if(!n.ok){const o=await n.json();throw new Error(o.statusMessage||"Erreur lors de la suppression de l'élève")}return{success:!0}}catch(n){return f.error("❌ Erreur lors de la suppression de l'élève:",n),{success:!1,error:n.message}}},resetStudentPassword:async(l,n="manual")=>{try{const o=await fetch(`/api/students/${l}/reset-password`,{method:"POST",headers:{"Content-Type":"application/json",...await j()},body:JSON.stringify({communicationMode:n})});if(!o.ok){const u=await o.json();throw new Error(u.statusMessage||"Erreur lors de la réinitialisation du mot de passe")}return{success:!0,data:(await o.json()).data}}catch(o){return f.error("❌ Erreur lors de la réinitialisation du mot de passe:",o),{success:!1,error:o.message}}}}},Qe={key:0,class:"flex justify-center items-center py-12"},Ze={key:1},Xe={class:"grid grid-cols-1 md:grid-cols-1 gap-6 mb-6"},Ye={class:"bg-white rounded-xl p-6 shadow-sm"},et={class:"flex items-center justify-between"},tt={class:"text-lg font-bold text-gray-800"},st={class:"bg-red-100 p-3 rounded-full"},at={key:0,class:"mb-6"},rt={class:"bg-yellow-50 border border-yellow-200 rounded-lg p-4"},lt={class:"flex items-center mb-3"},ot={class:"text-sm font-medium text-yellow-800"},nt={class:"space-y-2"},it={class:"flex items-center gap-3"},ut={class:"w-8 h-8 bg-yellow-100 rounded-full flex items-center justify-center"},dt={class:"text-sm font-medium text-gray-900"},ct={class:"text-xs text-gray-600"},mt={class:"flex items-center gap-2"},vt={class:"text-xs text-gray-500"},pt=["onClick"],gt={class:"bg-white rounded-xl p-4 shadow-sm"},ft={class:"flex flex-col sm:flex-row gap-3"},xt={class:"flex-1"},yt={class:"relative"},ht=["value"],bt=["value"],wt={key:1,class:"flex flex-wrap items-center justify-between gap-4 rounded-lg border border-gray-200 bg-gray-50/50 px-4 py-3"},_t={class:"flex items-center gap-4"},Ct={class:"text-sm text-gray-600"},kt={class:"flex items-center gap-2 text-sm text-gray-600"},Et=["value"],St=["value"],Tt={class:"flex items-center gap-2"},Mt=["disabled"],jt={class:"text-sm text-gray-600"},At=["disabled"],It={class:"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden relative"},Dt={key:0,class:"absolute inset-0 bg-white/70 z-10 flex items-center justify-center rounded-lg"},Nt={class:"overflow-x-auto"},$t={class:"w-full"},Pt={class:"bg-gray-50 border-b border-gray-200"},Vt={class:"py-2 px-4 text-xs font-medium text-gray-900 text-left"},zt={class:"py-2 px-4 text-xs font-medium text-gray-900 text-left"},Lt={class:"py-2 px-4 text-xs font-medium text-gray-900 text-left"},Ut={class:"py-2 px-4 text-xs font-medium text-gray-900 text-left"},qt={class:"py-2 px-4 text-xs font-medium text-gray-900 text-left"},Ft={class:"divide-y divide-gray-200"},Jt={class:"py-3 px-4"},Bt={class:"flex items-center gap-3"},Ot={class:"w-8 h-8 bg-primary-100 rounded-full flex items-center justify-center"},Rt={class:"text-sm font-medium text-gray-900"},Ht={class:"py-3 px-4"}
16,Gt={class:"bg-blue-100 text-blue-800 text-xs rounded-full px-2 py-1"},Wt={class:"py-3 px-4"},Kt={class:"flex items-center gap-2"},Qt={class:"text-sm text-gray-600"},Zt=["onClick","disabled"],Xt={class:"py-3 px-4"},Yt={class:"flex items-center gap-2"},es={class:"text-sm text-gray-600"},ts={class:"flex items-center gap-1"},ss=["onClick","title"],as=["onClick","disabled"],rs={class:"py-3 px-4"},ls={class:"py-3 px-4"},os={class:"flex items-center gap-2"},ns={class:"text-sm text-gray-600"},is={class:"py-3 px-4"},us={class:"flex items-center gap-2"},ds=["onClick"],cs={key:1,class:"py-8 text-center"},ms={class:"w-10 h-10 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-3"},vs={key:2,class:"fixed inset-0 z-50 overflow-y-auto"},ps={class:"modal-overlay-shell"},gs={class:"relative inline-block w-full max-w-2xl p-6 my-8 overflow-hidden text-left align-middle transition-all transform bg-white shadow-xl rounded-2xl"},fs={class:"flex justify-between items-center mb-6"},xs={class:"space-y-6"},ys={class:"space-y-4"},hs={class:"grid grid-cols-2 gap-4"},bs=["value"],ws={class:"space-y-4"},_s={class:"space-y-3"},Cs={class:"flex items-start gap-3"},ks={class:"flex items-start gap-3"},Es={class:"flex gap-3 mt-8 justify-end"},Ss={key:3,class:"fixed inset-0 z-50 overflow-y-auto"},Ts={class:"modal-overlay-shell"},Ms={class:"relative inline-block w-full max-w-2xl p-6 my-8 overflow-hidden text-left align-middle transition-all transform bg-white shadow-xl rounded-2xl"},js={class:"flex justify-between items-center mb-6"},As={class:"space-y-4"},Is={class:"grid grid-cols-2 gap-4"},Ds=["value"],Ns={class:"flex gap-3 mt-8 justify-end"},$s={key:4,class:"fixed inset-0 z-50 overflow-y-auto"},Ps={class:"modal-overlay-shell"},Vs={class:"relative inline-block w-full max-w-md p-6 my-8 overflow-hidden text-left align-middle transition-all transform bg-white shadow-xl rounded-2xl"},zs={class:"flex items-center mb-4"},Ls={class:"flex-shrink-0"},Us={class:"mt-2"},qs={class:"text-sm text-gray-600"},Fs={class:"mt-6 flex gap-3 justify-end"},Js={key:5,class:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50"},Bs={class:"relative inline-block w-full max-w-md p-6 my-8 overflow-hidden text-left align-middle transition-all transform bg-white shadow-xl rounded-2xl"},Os={class:"flex items-center mb-4"},Rs={class:"flex-shrink-0"},Hs={class:"ml-3"},Gs={class:"text-lg font-semibold text-gray-900"},Ws={class:"mt-2"},Ks={class:"text-sm text-gray-600"},Qs={__name:"index",setup(f){const x=Ce("page:dashboard/teacher/students/index"),{getStudentsData:q,createStudent:j,updateStudent:A,deleteStudent:ne}=Ke(),{success:F,error:_}=Re(),X=i(!0),Y=i(!1),P=i([]),V=i([]),l=i({total:0,active:0,pending:0,withEmail:0,neverConnected:void 0}),n=[10,20,50],o=i(20),b=i([]),u=i(0),c=i(null),g=i(""),k=i(""),z=i(""),L=i(""),S=i(null),C=i("asc"),J=i(!1),B=i(!1),O=i(!1),ie=i(!1),te=i(!1),se=i(null),ue=i(""),de=i(""),y=i({firstname:"",lastname:"",email:"",level:"",communicationMode:"manual"}),w=i({id:"",firstname:"",lastname:"",email:"",level:""}),ee=i(null),R=i({}),H=i([]),ce=i(!1),ae=i([]),re=i(!1),me=be(()=>{let a=P.value;return S.value&&(a=[...a].sort((t,r)=>{let s,h;switch(S.value){case"eleve":s=(t.fullName||t.full_name||"").toLowerCase(),h=(r.fullName||r.full_name||"").toLowerCase();break;case"niveau":s=(t.level||"").toLowerCase(),h=(r.level||"").toLowerCase();break;case"identifiant":s=(t.studentId||t.email||"").toLowerCase(),h=(r.studentId||r.email||"").toLowerCase();break;case"statut":s=t.status||"",h=r.status||"";break;case"derniere_connexion":s=t.last_connection_raw?new Date(t.last_connection_raw).getTime():0,h=r.last_connection_raw?new Date(r.last_connection_raw).getTime():0;break;default:return 0}return s<h?C.value==="asc"?-1:1:s>h?C.value==="asc"?1:-1:0})),a}),G=a=>{S.value===a?C.value=C.value==="asc"?"desc":"asc":(S.value=a,C.value="asc")},W=a=>S.value!==a?"ph:arrows-down-up":C.value==="asc"?"ph:arrow-up":"ph:arrow-down",ke=async()=>{ce.value=!0;try{const a=await fetch("/api/niveaux");if(a.ok){const t=await a.json();t.success?(H.value=t.data,x.log("✅ Niveaux chargés:",H.value.length)):(x.error("Erreur API niveaux:",t),_("Erreur lors du chargement des niveaux"))}else x.error("Erreur HTTP niveaux:",a.status),_("Impossible de charger les niveaux depuis la base de données")}catch(a){x.error("Erreur lors du chargement des niveaux:",a),_("Erreur de connexion lors du chargement des niveaux")}finally{ce.value=!1}},Ee=async()=>{re.value=!0;try{const{userProfile:a}=_e(),t=a.value?.user?.id;if(!t){re.value=!1;return}const r=we(),{data:s,error:h}=await r.from("classes").select("id, nom").eq("professeur_principal_id",t).order("nom",{ascending:!0}),Le=!h&&Array.isArray(s)?s:[],{data:oe,error:Ue}=await r.from("professeur_classes").select("classe_id").eq("professeur_id",t);let fe=[];if(!Ue&&Array.isArray(oe)&&oe.length){const I=[...new Set(oe.map(U=>
16U.classe_id).filter(Boolean))];if(I.length){const{data:U,error:Fe}=await r.from("classes").select("id, nom").in("id",I);fe=!Fe&&Array.isArray(U)?U:[]}}const xe=new Map;for(const I of[...Le,...fe])xe.set(I.id,I);const qe=Array.from(xe.values()).sort((I,U)=>(I.nom||"").localeCompare(U.nom||""));ae.value=qe,x.log("✅ Classes chargées:",ae.value.length)}catch(a){x.error("Erreur lors du chargement des classes:",a),_("Erreur lors du chargement des classes")}finally{re.value=!1}},ve=i(!0),K=async a=>{a?.useTableLoading;try{ve.value?X.value=!0:Y.value=!0;const t=u.value>0?b.value[u.value-1]??null:null,r=await q({limit:o.value,after:t||void 0,search:g.value||void 0,level:k.value||void 0,status:z.value||void 0,class:L.value||void 0});if(r.success&&r.data){P.value=r.data.children||[],V.value=r.data.pendingCredentials||[],l.value={total:r.data.stats?.total??0,active:r.data.stats?.active??0,pending:r.data.stats?.pending??0,withEmail:r.data.stats?.withEmail??0,neverConnected:r.data.stats?.neverConnected};const s=r.data.pagination;if(s){c.value=s;const h=s.nextCursor;h!=null&&(b.value[u.value]=h,b.value=b.value.slice(0,u.value+1))}else c.value=null}else P.value=[],V.value=[],c.value=null}catch(t){x.error("❌ Erreur lors du chargement:",t),_("Erreur lors du chargement des données")}finally{X.value=!1,Y.value=!1,ve.value=!1}},pe=()=>{u.value=0,b.value=[]},Q=()=>{pe(),K({useTableLoading:!0})},Se=()=>{c.value?.hasMore&&(u.value++,K({useTableLoading:!0}))},Te=()=>{u.value>0&&(u.value--,K({useTableLoading:!0}))},Me=a=>{o.value=a,pe(),K({useTableLoading:!0})};We(g,Q,{debounce:350}),Be([k,z,L],Q);const je=be(()=>l.value.neverConnected!==void 0&&l.value.neverConnected!==null?l.value.neverConnected:P.value.filter(a=>a.status==="pending"||!a.lastConnection||a.lastConnection==="Jamais"||a.lastConnection==="Never").length),Ae=a=>{switch(a){case"active":return"Déjà connecté";case"pending":return"Jamais connecté";case"inactive":return"Inactif";default:return a}},Ie=a=>Ae(a),le=async(a,t)=>{if(a)try{await navigator.clipboard.writeText(a),F(t)}catch{_("Erreur lors de la copie")}},De=a=>{R.value[a]=!R.value[a]},Ne=async()=>{try{if(!y.value.firstname||!y.value.lastname||!y.value.level){_("Veuillez remplir tous les champs obligatoires");return}const a=await j(y.value);a.success?(F("Élève créé avec succès"),J.value=!1,ze(),await Q()):_(a.error||"Erreur lors de la création")}catch(a){x.error("❌ Erreur création élève:",a),_("Erreur lors de la création de l'élève")}},$e=async()=>{try{if(!w.value.firstname||!w.value.lastname||!w.value.level){_("Veuillez remplir tous les champs obligatoires");return}const a=await A(w.value.id,{firstname:w.value.firstname,lastname:w.value.lastname,email:w.value.email,level:w.value.level});a.success?(F("Élève modifié avec succès"),B.value=!1,await Q()):_(a.error||"Erreur lors de la modification")}catch(a){x.error("❌ Erreur modification élève:",a),_("Erreur lors de la modification de l'élève")}},Pe=async()=>{try{if(!ee.value)return;const a=await ne(ee.value.id);a.success?(F("Élève supprimé avec succès"),O.value=!1,ee.value=null,await Q()):_(a.error||"Erreur lors de la suppression")}catch(a){x.error("❌ Erreur suppression élève:",a),_("Erreur lors de la suppression de l'élève")}},Ve=a=>{se.value={id:a.id,fullName:a.fullName||a.full_name,studentId:a.studentId||(a.id?`STU${a.id.slice(-6).toUpperCase()}`:""),email:a.email,level:a.level,status:a.status,password:a.password,quizzesPassed:a.quizzesPassed||a.quizPassed||0,lastConnection:a.lastConnection,passwordChanged:a.passwordChanged,parentName:a.parentName,classe:a.classe||(a.className?{id:a.classe_id,nom:a.className,niveau:a.classLevel}:null)},te.value=!0},ze=()=>{y.value={firstname:"",lastname:"",email:"",level:"",communicationMode:"manual"}},ge=()=>{ie.value=!1,ue.value="",de.value=""};return Oe(async()=>{await ke(),await Ee(),await K()}),(a,t)=>{const r=Je;return p(),m("div",null,[t[65]||(t[65]=e("div",{class:"mb-6"},[e("h1",{class:"text-xl font-semibold text-gray-900"},"Mes élèves"),e("p",{class:"text-sm text-gray-600 mt-1"},"Gérez les comptes de vos élèves")],-1)),X.value?(p(),m("div",Qe,[...t[30]||(t[30]=[e("div",{class:"animate-spin rounded-full h-8 w-8 border-b-2 border-primary"},null,-1)])])):(p(),m("div",Ze,[e("div",Xe,[e("div",Ye,[e("div",et,[e("div",null,[e("h3",tt,d(je.value)+"/"+d(l.value.total),1),t[31]||(t[31]=e("p",{class:"text-sm text-gray-500"},"Jamais connectés",-1))]),e("div",st,[v(r,{name:"ph:x-circle",class:"w-6 h-6 text-red-600"})])])])]),V.value.length>
160?(p(),m("div",at,[e("div",rt,[e("div",lt,[v(r,{name:"ph:warning",class:"w-5 h-5 text-yellow-600 mr-2"}),e("h3",ot,d(V.value.length)+" identifiant(s) en attente de transmission ",1)]),e("div",nt,[(p(!0),m(D,null,N(V.value,s=>(p(),m("div",{key:s.id,class:"flex items-center justify-between bg-white rounded p-3 border border-yellow-200"},[e("div",it,[e("div",ut,[v(r,{name:"ph:graduation-cap",class:"w-4 h-4 text-yellow-600"})]),e("div",null,[e("p",dt,d(s.full_name),1),e("p",ct,d(s.niveau)+" • "+d(s.email||"Aucun email"),1)])]),e("div",mt,[e("span",vt,"Mot de passe: "+d(s.password),1),e("button",{onClick:h=>le(s.password,"Mot de passe copié"),class:"text-gray-400 hover:text-gray-600",title:"Copier le mot de passe"},[v(r,{name:"ph:copy",class:"w-3 h-3"})],8,pt)])]))),128))])])])):T("",!0),e("div",gt,[e("div",ft,[e("div",xt,[e("div",yt,[v(r,{name:"ph:magnifying-glass",class:"absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-4 h-4"}),E(e("input",{"onUpdate:modelValue":t[0]||(t[0]=s=>g.value=s),type:"text",placeholder:"Rechercher un élève...",class:"w-full pl-10 pr-4 py-2 text-sm border border-gray-200 rounded-lg focus:outline-none focus:ring-1 focus:ring-primary-500 focus:border-primary-500"},null,512),[[$,g.value]])])]),E(e("select",{"onUpdate:modelValue":t[1]||(t[1]=s=>k.value=s),class:"px-3 py-2 text-sm border border-gray-200 rounded-lg focus:outline-none focus:ring-1 focus:ring-primary-500 focus:border-primary-500"},[t[32]||(t[32]=e("option",{value:""},"Tous les niveaux",-1)),(p(!0),m(D,null,N(H.value,s=>(p(),m("option",{key:s.id,value:s.nom},d(s.nom),9,ht))),128))],512),[[Z,k.value]]),E(e("select",{"onUpdate:modelValue":t[2]||(t[2]=s=>z.value=s),class:"px-3 py-2 text-sm border border-gray-200 rounded-lg focus:outline-none focus:ring-1 focus:ring-primary-500 focus:border-primary-500"},[...t[33]||(t[33]=[e("option",{value:""},"Tous les statuts",-1),e("option",{value:"active"},"Déjà connecté",-1),e("option",{value:"pending"},"Jamais connecté",-1)])],512),[[Z,z.value]]),E(e("select",{"onUpdate:modelValue":t[3]||(t[3]=s=>L.value=s),class:"px-3 py-2 text-sm border border-gray-200 rounded-lg focus:outline-none focus:ring-1 focus:ring-primary-500 focus:border-primary-500"},[t[34]||(t[34]=e("option",{value:""},"Toutes les classes",-1)),(p(!0),m(D,null,N(ae.value,s=>(p(),m("option",{key:s.id,value:s.id},d(s.nom),9,bt))),128))],512),[[Z,L.value]])])]),c.value&&c.value.total>0?(p(),m("div",wt,[e("div",_t,[e("span",Ct,d(u.value*c.value.limit+1)+"–"+d(u.value*c.value.limit+P.value.length)+" sur "+d(c.value.total)+" élève"+d(c.value.total>1?"s":""),1),e("label",kt,[t[35]||(t[35]=e("span",null,"Par page",-1)),e("select",{value:o.value,class:"rounded-md border border-gray-300 bg-white px-2 py-1.5 text-sm focus:border-primary-500 focus:ring-1 focus:ring-primary-500",onChange:t[4]||(t[4]=s=>Me(Number(s.target.value)))},[(p(),m(D,null,N(n,s=>e("option",{key:s,value:s},d(s),9,St)),64))],40,Et)])]),e("div",Tt,[e("button",{type:"button",class:"rounded-md border border-gray-300 bg-white px-3 py-1.5 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50",disabled:u.value<=0,onClick:Te}," Précédent ",8,Mt),e("span",jt," Page "+d(u.value+1)+" / "+d(Math.max(1,Math.ceil(c.value.total/c.value.limit))),1),e("button",{type:"button",class:"rounded-md border border-gray-300 bg-white px-3 py-1.5 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50",disabled:!c.value.hasMore,onClick:Se}," Suivant ",8,At)])])):T("",!0),e("div",It,[Y.value?(p(),m("div",Dt,[...t[36]||(t[36]=[e("div",{class:"animate-spin rounded-full h-8 w-8 border-b-2 border-primary-600"},null,-1)])])):T("",!0),e("div",Nt,[e("table",$t,[e("thead",Pt,[e("tr",null,[e("th",Vt,[e("button",{onClick:t[5]||(t[5]=s=>G("eleve")),class:"flex items-center gap-1 hover:text-primary-600 transition-colors"},[t[37]||(t[37]=e("span",null,"Élève",-1)),v(r,{name:W("eleve"),class:M(["w-3 h-3",S.value==="eleve"?"text-primary-600":"text-gray-400"])},null,8,["name","class"])])]),e("th",zt,[e("button",{onClick:t[6]||(t[6]=s=>G("niveau")),class:"flex items-center gap-1 hover:text-primary-600 transition-colors"},[t[38]||(t[38]=e("span",null,"Niveau",-1)),v(r,{name:W("niveau"),class:M(["w-3 h-3",S.value==="niveau"?"text-primary-600":"text-gray-400"])},null,8,["name","class"])])]),e("th",Lt,[e("button",{onClick:t[7]||(t[7]=s=>G("identifiant")),class:"flex items-center gap-1 hover:text-primary-600 transition-colors"},[t[39]||(t[39]=e("span",null,"Identifiant",-1)),v(r,{name:W("identifiant"),class:M(["w-3 h-3",S.value==="identifiant"?"text-primary-600":"text-gray-400"])},null,8,["name","class"])])]),t[42]||(t[42]=e("th",{class:"py-2 px-4 text-xs font-medium text-gray-900 text-left"},"Mot de passe",-1)),e("th",Ut,[e("button",{onClick:t[8]||(t[8]=s=>G("statut")),class:"flex items-center gap-1 hover:text-primary-600 transition-colors"},[t[40]||(t[40]=e("span",null,"Statut",-1)),v(r,{name:W("statut"),class:M(["w-3 h-3",S.value==="statut"?"text-primary-600":"text-gray-400"])},null,8,["name","class"])])]),e("th",qt,[e("button",{onClick:t[9]||(t[9]=s=>G("derniere_connexion")),class:"flex items-center gap-1 hover:text-primary-600 transition-colors"},[t[41]||(t[41]=e("span",null,"Dernière connexion",-1)),v(r,{name:W("derniere_connexion"),
16class:M(["w-3 h-3",S.value==="derniere_connexion"?"text-primary-600":"text-gray-400"])},null,8,["name","class"])])]),t[43]||(t[43]=e("th",{class:"py-2 px-4 text-xs font-medium text-gray-900 text-left"},"Actions",-1))])]),e("tbody",Ft,[(p(!0),m(D,null,N(me.value,s=>(p(),m("tr",{key:s.id,class:"hover:bg-gray-50"},[e("td",Jt,[e("div",Bt,[e("div",Ot,[v(r,{name:"ph:graduation-cap",class:"w-4 h-4 text-primary-600"})]),e("div",null,[e("p",Rt,d(s.fullName||s.full_name),1)])])]),e("td",Ht,[e("span",Gt,d(s.level),1)]),e("td",Wt,[e("div",Kt,[e("span",Qt,d(s.studentId||(s.id?`STU${s.id.slice(-6).toUpperCase()}`:"N/A")),1),e("button",{onClick:h=>le(s.studentId,"Identifiant copié"),disabled:!s.studentId,class:M(s.studentId?"text-gray-400 hover:text-gray-600":"text-gray-200 cursor-not-allowed")},[v(r,{name:"ph:copy",class:"w-3 h-3"})],10,Zt)])]),e("td",Xt,[e("div",Yt,[e("span",es,d(R.value[s.id]?s.password:"••••••••"),1),e("div",ts,[e("button",{onClick:h=>De(s.id),class:"text-gray-400 hover:text-gray-600",title:R.value[s.id]?"Masquer":"Afficher"},[v(r,{name:R.value[s.id]?"ph:eye-slash":"ph:eye",class:"w-3 h-3"},null,8,["name"])],8,ss),e("button",{onClick:h=>le(s.password,"Mot de passe copié"),disabled:!s.password,class:M(s.password?"text-gray-400 hover:text-gray-600":"text-gray-200 cursor-not-allowed"),title:"Copier le mot de passe"},[v(r,{name:"ph:copy",class:"w-3 h-3"})],10,as)])])]),e("td",rs,[e("span",{class:M([{"bg-green-100 text-green-800":s.status==="active","bg-amber-100 text-amber-800":s.status==="pending","bg-red-100 text-red-800":s.status==="inactive"},"text-xs rounded-full px-2 py-1"])},d(Ie(s.status)),3)]),e("td",ls,[e("div",os,[v(r,{name:"ph:clock",class:"w-3 h-3 text-gray-400"}),e("span",ns,d(s.lastConnection),1)])]),e("td",is,[e("div",us,[e("button",{onClick:h=>Ve(s),class:"text-gray-400 hover:text-gray-600"},[v(r,{name:"ph:eye",class:"w-3 h-3"})],8,ds)])])]))),128))])])]),me.value.length===0?(p(),m("div",cs,[e("div",ms,[v(r,{name:"ph:users",class:"w-5 h-5 text-gray-400"})]),t[44]||(t[44]=e("h3",{class:"text-base font-medium text-gray-900 mb-1"},"Aucun élève trouvé",-1)),t[45]||(t[45]=e("p",{class:"text-sm text-gray-600"},"Aucun élève ne correspond à vos critères de recherche",-1))])):T("",!0)])])),v(He,{"is-open":te.value,student:se.value,"read-only":!0,onClose:t[10]||(t[10]=()=>{te.value=!1,se.value=null})},null,8,["is-open","student"]),J.value?(p(),m("div",vs,[e("div",ps,[e("div",{class:"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity",onClick:t[11]||(t[11]=s=>J.value=!1)}),e("div",gs,[e("div",fs,[t[46]||(t[46]=e("h3",{class:"text-lg font-semibold text-gray-900"},"Ajouter un élève",-1)),e("button",{onClick:t[12]||(t[12]=s=>J.value=!1),class:"text-gray-400 hover:text-gray-600"},[v(r,{name:"ph:x",class:"w-5 h-5"})])]),e("div",xs,[e("div",ys,[t[52]||(t[52]=e("h4",{class:"text-sm font-medium text-gray-900 mb-3"},"Informations de base",-1)),e("div",hs,[e("div",null,[t[47]||(t[47]=e("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"Prénom *",-1)),E(e("input",{"onUpdate:modelValue":t[13]||(t[13]=s=>y.value.firstname=s),type:"text",class:"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-primary focus:border-primary"},null,512),[[$,y.value.firstname]])]),e("div",null,[t[48]||(t[48]=e("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"Nom *",-1)),E(e("input",{"onUpdate:modelValue":t[14]||(t[14]=s=>y.value.lastname=s),type:"text",class:"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-primary focus:border-primary"},null,512),[[$,y.value.lastname]])])]),e("div",null,[t[49]||(t[49]=e("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"Email",-1)),E(e("input",{"onUpdate:modelValue":t[15]||(t[15]=s=>y.value.email=s),type:"email",class:"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-primary focus:border-primary"},null,512),[[$,y.value.email]])]),e("div",null,[t[51]||(t[51]=e("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"Niveau *",-1)),E(e("select",{"onUpdate:modelValue":t[16]||(t[16]=s=>y.value.level=s),class:"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-primary focus:border-primary"}
16,[t[50]||(t[50]=e("option",{value:""},"Sélectionner un niveau",-1)),(p(!0),m(D,null,N(H.value,s=>(p(),m("option",{key:s.id,value:s.nom},d(s.nom),9,bs))),128))],512),[[Z,y.value.level]])])]),e("div",ws,[t[55]||(t[55]=e("h4",{class:"text-sm font-medium text-gray-900 mb-3"},"Mode de communication",-1)),e("div",_s,[e("label",Cs,[E(e("input",{"onUpdate:modelValue":t[17]||(t[17]=s=>y.value.communicationMode=s),type:"radio",value:"email",class:"mt-1"},null,512),[[ye,y.value.communicationMode]]),t[53]||(t[53]=e("div",null,[e("p",{class:"text-sm font-medium text-gray-900"},"Envoi automatique par email"),e("p",{class:"text-xs text-gray-600"},"Les identifiants seront envoyés par email à l'adresse fournie")],-1))]),e("label",ks,[E(e("input",{"onUpdate:modelValue":t[18]||(t[18]=s=>y.value.communicationMode=s),type:"radio",value:"manual",class:"mt-1"},null,512),[[ye,y.value.communicationMode]]),t[54]||(t[54]=e("div",null,[e("p",{class:"text-sm font-medium text-gray-900"},"Transmission manuelle"),e("p",{class:"text-xs text-gray-600"},"Les identifiants seront disponibles dans le dashboard")],-1))])])])]),e("div",Es,[e("button",{onClick:t[19]||(t[19]=s=>J.value=!1),class:"px-4 py-2 border border-gray-300 rounded-lg text-gray-700 hover:bg-gray-50 transition-colors text-sm"}," Annuler "),e("button",{onClick:Ne,class:"px-4 py-2 bg-primary-500 text-white rounded-lg hover:bg-primary-600 transition-colors text-sm"}," Ajouter ")])])])])):T("",!0),B.value?(p(),m("div",Ss,[e("div",Ts,[e("div",{class:"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity",onClick:t[20]||(t[20]=s=>B.value=!1)}),e("div",Ms,[e("div",js,[t[56]||(t[56]=e("h3",{class:"text-lg font-semibold text-gray-900"},"Modifier l'élève",-1)),e("button",{onClick:t[21]||(t[21]=s=>B.value=!1),class:"text-gray-400 hover:text-gray-600"},[v(r,{name:"ph:x",class:"w-5 h-5"})])]),e("div",As,[e("div",Is,[e("div",null,[t[57]||(t[57]=e("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"Prénom *",-1)),E(e("input",{"onUpdate:modelValue":t[22]||(t[22]=s=>w.value.firstname=s),type:"text",class:"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-primary focus:border-primary"},null,512),[[$,w.value.firstname]])]),e("div",null,[t[58]||(t[58]=e("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"Nom *",-1)),E(e("input",{"onUpdate:modelValue":t[23]||(t[23]=s=>w.value.lastname=s),type:"text",class:"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-primary focus:border-primary"},null,512),[[$,w.value.lastname]])])]),e("div",null,[t[59]||(t[59]=e("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"Email",-1)),E(e("input",{"onUpdate:modelValue":t[24]||(t[24]=s=>w.value.email=s),type:"email",class:"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-primary focus:border-primary"},null,512),[[$,w.value.email]])]),e("div",null,[t[61]||(t[61]=e("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"Niveau *",-1)),E(e("select",{"onUpdate:modelValue":t[25]||(t[25]=s=>w.value.level=s),class:"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-primary focus:border-primary"},[t[60]||(t[60]=e("option",{value:""},"Sélectionner un niveau",-1)),(p(!0),m(D,null,N(H.value,s=>(p(),m("option",{key:s.id,value:s.nom},d(s.nom),9,Ds))),128))],512),[[Z,w.value.level]])])]),e("div",Ns,[e("button",{onClick:t[26]||(t[26]=s=>B.value=!1),class:"px-4 py-2 border border-gray-300 rounded-lg text-gray-700 hover:bg-gray-50 transition-colors text-sm"}," Annuler "),e("button",{onClick:$e,class:"px-4 py-2 bg-primary-500 text-white rounded-lg hover:bg-primary-600 transition-colors text-sm"}," Modifier ")])])])])):T("",!0),O.value?(p(),m("div",$s,[e("div",Ps,[e("div",{class:"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity",onClick:t[27]||
16(t[27]=s=>O.value=!1)}),e("div",Vs,[e("div",zs,[e("div",Ls,[v(r,{name:"ph:warning",class:"w-6 h-6 text-red-500"})]),t[62]||(t[62]=e("div",{class:"ml-3"},[e("h3",{class:"text-lg font-semibold text-gray-900"},"Supprimer l'élève")],-1)),e("button",{onClick:t[28]||(t[28]=s=>O.value=!1),class:"ml-auto text-gray-400 hover:text-gray-600"},[v(r,{name:"ph:x",class:"w-5 h-5"})])]),e("div",Us,[e("p",qs,[t[63]||(t[63]=he(" Êtes-vous sûr de vouloir supprimer l'élève ",-1)),e("strong",null,d(ee.value?.full_name),1),t[64]||(t[64]=he(" ? Cette action est irréversible. ",-1))])]),e("div",Fs,[e("button",{onClick:t[29]||(t[29]=s=>O.value=!1),class:"px-4 py-2 border border-gray-300 rounded-lg text-gray-700 hover:bg-gray-50 transition-colors text-sm"}," Annuler "),e("button",{onClick:Pe,class:"px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors text-sm"}," Supprimer ")])])])])):T("",!0),ie.value?(p(),m("div",Js,[e("div",Bs,[e("div",Os,[e("div",Rs,[v(r,{name:"ph:warning",class:"w-6 h-6 text-red-500"})]),e("div",Hs,[e("h3",Gs,d(ue.value),1)]),e("button",{onClick:ge,class:"ml-auto text-gray-400 hover:text-gray-600"},[v(r,{name:"ph:x",class:"w-5 h-5"})])]),e("div",Ws,[e("p",Ks,d(de.value),1)]),e("div",{class:"mt-6 flex justify-end"},[e("button",{onClick:ge,class:"px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors text-sm"}," Fermer ")])])])):T("",!0)])}}},ra=Ge(Qs,[["__scopeId","data-v-82f71114"]]);export{ra 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.