1import{w as N,l as o,m as l,q as s,u as d,B as u,F as x,v as k,J as i,aa as y,ac as b,K as p,p as _,y as W,e as w,b as Z,r as A,D as B,ab as I}from"./vue-vendor-B52ivs5F.js";import{u as q,b as E,c as V}from"./query-vendor-Ab0nfCYP.js";import{t as h,d as U}from"./index-NM9cAr_v.js";import{_ as ee}from"./ConfirmDialog-CguVS9_-.js";import{z as te,A as ae,B as se,C as re,D as oe}from"./certification-sNUmTbUZ.js";import{L as Q,ak as L,a5 as P,X as le,I as de}from"./ui-vendor-D-1UBobO.js";import"./date-vendor-HBGOQ70J.js";import"./twilio-DAuME2Y9.js";import"./charts-D4hDxUnJ.js";import"./socket-CzTGKfeH.js";const ne={class:"p-6"},ie={key:0,class:"py-16 text-center"},ce={class:"mb-4 flex flex-wrap items-center gap-1 border-b border-gray-200 dark:border-gray-800"},ue=["onClick"],pe={class:"ml-1 text-xs text-gray-400"},me=["disabled"],ye={key:0,class:"rounded-lg border border-gray-200 bg-white p-10 text-center dark:border-gray-700 dark:bg-gray-800"},ge={key:1,class:"rounded-lg border border-gray-200 bg-white p-5 dark:border-gray-700 dark:bg-gray-800"},xe={class:"mb-5 flex flex-wrap items-center gap-3"},be={class:"mb-3 flex items-start gap-3"},he={class:"mt-2 text-sm font-medium text-gray-400"},ve={class:"flex-1 space-y-2"},fe=["onUpdate:modelValue"],ke={class:"flex flex-wrap items-center gap-2"},_e=["onUpdate:modelValue"],we=["value"],Ce=["onUpdate:modelValue"],De={class:"flex shrink-0 items-center gap-2 text-sm text-gray-600 dark:text-gray-400"},Te=["onUpdate:modelValue","placeholder"],Ve={class:"flex shrink-0 items-center gap-2 text-sm text-gray-600 dark:text-gray-400"},Ue=["onUpdate:modelValue","placeholder"],$e=["onClick"],Me={key:0,class:"space-y-2 pl-7"},Se=["name","checked","onChange","aria-label"],ze=["onUpdate:modelValue","placeholder"],Fe={class:"w-16 shrink-0 text-xs font-medium text-teal-600 dark:text-teal-400"},Ne=["onClick","disabled"],Ae=["onClick"],Be={key:1,class:"pl-7 text-sm text-gray-500 dark:text-gray-400"},Ee={class:"flex flex-wrap items-center gap-3"},Qe=["disabled"],Le={key:0,class:"text-sm text-amber-600 dark:text-amber-400"},Ze={__name:"Tests",setup(Pe){const K=[{value:"multiple_choice",label:"Multiple choice"},{value:"link",label:"Link (e.g. screen recording URL)"},{value:"file",label:"File upload"}],O=q(),{data:J,isLoading:j}=E({queryKey:["admin","certification","tests"],queryFn:te}),{data:$}=E({queryKey:["admin","certification","settings"],queryFn:ae}),M=w(()=>$.value?.max_file_mb||25),S=w(()=>($.value?.accepted_file_types||[]).join(", ")),g=w(()=>J.value?.results||[]),n=A(1),v=A(!1),c=Z({title:"",questions:[]}),H=t=>g.value.find(e=>e.day===t),R=w(()=>c.questions.some(t=>t.type&&t.type!=="multiple_choice"));N(g,t=>{t.length&&!t.some(e=>e.day===n.value)&&(n.value=t[t.length-1].day)}),N([g,n],()=>{const t=H(n.value);c.title=t?.title||`Day ${n.value} Test`,c.questions=JSON.parse(JSON.stringify(t?.questions||[])).map(e=>({...e,type:e.type||"multiple_choice",hint:e.hint||"",max_file_mb:e.max_file_mb??null,accepted_types:(e.accepted_types||[]).join(", "),options:e.options||[]}))},{immediate:!0});const X=()=>{c.questions.push({text:"",type:"multiple_choice",hint:"",max_file_mb:null,accepted_types:"",options:[{text:"",is_correct:!0},{text:"",is_correct:!1}]})},Y=(t,e)=>{t.options.forEach((a,m)=>{a.is_correct=m===e})},C=()=>O.invalidateQueries({queryKey:["admin","certification","tests"]}),D=V({mutationFn:se,onSuccess:t=>{h.success(t.message||"Test saved"),C()},onError:t=>h.error(U(t,"Could not save the test"))}),z=V({mutationFn:re,onSuccess:t=>{h.success(t.message||"Day added"),t.test?.day&&(n.value=t.test.day),C()},onError:t=>h.error(U(t,"Could not add a day"))}),F=V({mutationFn:oe,onSuccess:t=>{h.success(t.message||"Day removed"),v.value=!1,C()},onError:t=>h.error(U(t,"Could not remove the day"))}),G=()=>{D.mutate({day:n.value,title:c.title,questions:c.questions.map(t=>({...t,options:t.type==="multiple_choice"?t.options:[],max_file_mb:t.type==="file"&&t.max_file_mb||null,accepted_types:t.type==="file"?t.accepted_types||"":[]}))})};return(t,e)=>(o(),l("div",ne,[e[12]||(e[12]=s("div",{class:"mb-6"},[s("h1",{class:"text-2xl font-bold text-gray-900 dark:text-white"},"Certification Tests"),s("p",{class:"mt-1 text-sm text-gray-600 dark:text-gray-400"}," Add or remove days to change the length of the programme. Multiple-choice questions are marked automatically; link and file questions send the day to your review queue instead. ")],-1)),d(j)?(o(),l("div",ie,[u(d(Q),{size:24,class:"mx-auto animate-spin text-teal-500"})])):(o(),l(x,{key:1},[s("div",ce,[(o(!0),l(x,null,k(g.value,a=>
1(o(),l("button",{key:a.day,type:"button",class:B(["border-b-2 px-4 py-2.5 text-sm transition-colors",n.value===a.day?"border-teal-500 font-medium text-gray-900 dark:text-white":"border-transparent text-gray-500 hover:text-gray-800 dark:hover:text-white"]),onClick:m=>n.value=a.day},[i(" Day "+p(a.day)+" ",1),s("span",pe,"("+p(a.questions?.length||0)+")",1)],10,ue))),128)),s("button",{type:"button",onClick:e[0]||(e[0]=a=>d(z).mutate()),disabled:d(z).isPending.value,class:"ml-2 rounded-lg px-3 py-1.5 text-sm font-medium text-teal-600 transition-colors hover:bg-teal-50 disabled:opacity-50 dark:text-teal-400 dark:hover:bg-teal-500/10"},[u(d(L),{size:15,class:"mr-1 inline"}),e[5]||(e[5]=i(" Add day ",-1))],8,me)]),g.value.length?(o(),l("div",ge,[s("div",xe,[y(s("input",{"onUpdate:modelValue":e[1]||(e[1]=a=>c.title=a),type:"text",placeholder:"Test title",class:"w-full max-w-md rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-teal-500 focus:outline-none dark:border-gray-600 dark:bg-gray-900 dark:text-white"},null,512),[[b,c.title]]),g.value.length>1?(o(),l("button",{key:0,type:"button",onClick:e[2]||(e[2]=a=>v.value=!0),class:"ml-auto rounded-lg px-3 py-2 text-sm font-medium text-red-600 transition-colors hover:bg-red-50 dark:hover:bg-red-500/10"},[u(d(P),{size:15,class:"mr-1 inline"}),i(" Delete Day "+p(n.value),1)])):_("",!0)]),(o(!0),l(x,null,k(c.questions,(a,m)=>(o(),l("div",{key:m,class:"mb-4 rounded-lg border border-gray-200 p-4 dark:border-gray-700"},[s("div",be,[s("span",he,p(m+1)+".",1),s("div",ve,[y(s("textarea",{"onUpdate:modelValue":r=>a.text=r,rows:"2",placeholder:"Question text",class:"w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-teal-500 focus:outline-none dark:border-gray-600 dark:bg-gray-900 dark:text-white"},null,8,fe),[[b,a.text]]),s("div",ke,[y(s("select",{"onUpdate:modelValue":r=>a.type=r,class:"rounded-lg border border-gray-300 px-3 py-1.5 text-sm focus:border-teal-500 focus:outline-none dark:border-gray-600 dark:bg-gray-900 dark:text-white"},[(o(),l(x,null,k(K,r=>s("option",{key:r.value,value:r.value},p(r.label),9,we)),64))],8,_e),[[I,a.type]]),y(s("input",{"onUpdate:modelValue":r=>a.hint=r,type:"text",placeholder:"Hint shown to the student (optional)",class:"min-w-56 flex-1 rounded-lg border border-gray-300 px-3 py-1.5 text-sm focus:border-teal-500 focus:outline-none dark:border-gray-600 dark:bg-gray-900 dark:text-white"},null,8,Ce),[[b,a.hint]]),a.type==="file"?(o(),l(x,{key:0},[s("label",De,[e[7]||(e[7]=i(" Max size ",-1)),y(s("input",{"onUpdate:modelValue":r=>a.max_file_mb=r,type:"number",min:"1",placeholder:String(M.value),class:"w-20 rounded-lg border border-gray-300 px-2 py-1.5 text-sm focus:border-teal-500 focus:outline-none dark:border-gray-600 dark:bg-gray-900 dark:text-white"},null,8,Te),[[b,a.max_file_mb,void 0,{number:!0}]]),e[8]||(e[8]=i(" MB ",-1))]),s("label",Ve,[e[9]||(e[9]=i(" Accepts ",-1)),y(s("input",{"onUpdate:modelValue":r=>a.accepted_types=r,type:"text",placeholder:S.value,title:"Comma-separated extensions, e.g. mp4, mov",class:"w-44 rounded-lg border border-gray-300 px-2 py-1.5 text-sm focus:border-teal-500 focus:outline-none dark:border-gray-600 dark:bg-gray-900 dark:text-white"},null,8,Ue),[[b,a.accepted_types]])])],64)):_("",!0)])]),s("button",{type:"button",onClick:r=>c.questions.splice(m,1),class:"mt-1 rounded-lg p-2 text-gray-400 hover:bg-red-50 hover:text-red-600 dark:hover:bg-red-500/20"},[u(d(P),{size:16})],8,$e)]),a.type==="multiple_choice"?(o(),l("div",Me,[e[10]||(e[10]=s("div",{class:"flex items-center gap-3 pb-1"},[s("span",{class:"w-4 shrink-0 text-center text-[10px] font-bold text-teal-600 dark:text-teal-400"}," â "),s("p",{class:"text-xs font-medium text-gray-500 dark:text-gray-400"},[i(" Tick the "),s("span",{class:"font-semibold text-teal-600 dark:text-teal-400"},"correct"),i(" answer â students must pick it to pass. It is not a default selection. ")])],-1)),(o(!0),l(x,null,k(a.options,(r,f)=>(o(),l("div",{key:f,class:"flex items-center gap-3"},[s("input",{type:"radio",name:`correct-${m}`,checked:r.is_correct,onChange:T=>Y(a,f),class:"h-4 w-4 shrink-0 accent-teal-500","aria-label":`Mar
1k option ${f+1} as the correct answer`,title:"Mark as the correct answer"},null,40,Se),y(s("input",{"onUpdate:modelValue":T=>r.text=T,type:"text",placeholder:r.is_correct?"Correct answer text":"Option text",class:B(["flex-1 rounded-lg border px-3 py-1.5 text-sm focus:outline-none dark:bg-gray-900 dark:text-white",r.is_correct?"border-teal-500 dark:border-teal-500":"border-gray-300 focus:border-teal-500 dark:border-gray-600"])},null,10,ze),[[b,r.text]]),s("span",Fe,p(r.is_correct?"Correct":""),1),s("button",{type:"button",onClick:T=>a.options.splice(f,1),disabled:a.options.length<=2,class:"rounded-lg p-1.5 text-gray-400 hover:bg-red-50 hover:text-red-600 disabled:cursor-not-allowed disabled:opacity-30 dark:hover:bg-red-500/20"},[u(d(le),{size:14})],8,Ne)]))),128)),s("button",{type:"button",onClick:r=>a.options.push({text:"",is_correct:!1}),class:"text-sm font-medium text-teal-600 hover:underline dark:text-teal-400"}," + Add option ",8,Ae)])):(o(),l("p",Be,[u(d(de),{size:14,class:"mr-1 inline"}),i(" "+p(a.type==="file"?`The student uploads a ${a.accepted_types||S.value} file, up to ${a.max_file_mb||M.value}MB. This day goes to your review queue instead of auto-approving.`:"The student pastes a link. This day goes to your review queue instead of auto-approving."),1)]))]))),128)),s("div",Ee,[s("button",{type:"button",onClick:X,class:"rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50 dark:border-gray-600 dark:text-gray-200 dark:hover:bg-gray-700"},[u(d(L),{size:16,class:"mr-1 inline"}),e[11]||(e[11]=i(" Add question ",-1))]),s("button",{type:"button",onClick:G,disabled:d(D).isPending.value,class:"rounded-lg bg-teal-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-teal-700 disabled:opacity-50"},[d(D).isPending.value?(o(),W(d(Q),{key:0,size:16,class:"mr-2 inline animate-spin"})):_("",!0),i(" Save Day "+p(n.value),1)],8,Qe),R.value?(o(),l("p",Le," This day needs manual review â students won't be auto-approved. ")):_("",!0)])])):(o(),l("div",ye,[...e[6]||(e[6]=[s("p",{class:"text-sm text-gray-600 dark:text-gray-400"}," No test days yet. Add one to start building the programme. ",-1)])]))],64)),u(ee,{modelValue:v.value,"onUpdate:modelValue":e[3]||(e[3]=a=>v.value=a),title:`Delete Day ${n.value}
1?`,message:"New enrolments skip this day. Students already on it keep it and can still sit it, so the remaining days are not renumbered â the day numbers will show a gap.","confirm-text":"Delete",variant:"danger",icon:"trash",loading:d(F).isPending.value,onConfirm:e[4]||(e[4]=a=>d(F).mutate(n.value))},null,8,["modelValue","title","loading"])]))}};export{Ze 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.