PageSourceSearch

https://learning-platform-v01.web.app/assets/CourseList-7ORYMK2I.js

js learning-platform-v01.web.app collected 2026-10-03 12:28:22 UTC 10,225 bytes, 1 lines download raw bytes

1import{z,H as j,P as B,J as S,e as I,o as i,c as b,a as e,K as Z,t as U,b as f,f as R,x as k,d as N,w as V,Q as T,r as g,B as Q,C as F,D as L,A as H,E,F as M,v as O,k as J}from"./index-TPFOTxwY.js";import{u as P}from"./useFirestore-Cxql7iMT.js";import{u as K,_ as W}from"./CourseForm-X-lnMqpn.js";import{_ as G}from"./CourseFormModal-3OXUG_85.js";import"./_commonjsHelpers-C4iS2aBk.js";const X={class:"card hover:shadow-lg transition-shadow"},Y={class:"relative"},ee=["src","alt"],te={class:"p-4"},se={class:"text-xl font-semibold mb-2"},le={class:"text-primary-600 text-sm mb-4"},oe={key:0,class:"text-gray-500 text-xs mb-2 italic"},re={style:{"word-wrap":"break-word"}},ae={class:"mt-4 flex justify-between items-center"},ne={__name:"CourseCard",props:{course:{type:Object,required:!0}},emits:["refresh","delete","edit"],setup(p,{emit:A}){const c=p,$=z(),{isAdmin:a}=j();P("courses");const{currentLanguage:w}=B(),C=S(()=>{switch(c.course.status){case"completed":return"bg-green-100 text-green-800";case"enrolled":return"bg-yellow-100 text-yellow-800";default:return"bg-gray-100 text-gray-800"}});S(()=>new Date(c.course.updatedAt).toLocaleDateString());const n=S(()=>{var t;const m=w.value;return((t=c.course.translatedTitles)==null?void 0:t[m])||c.course.title||c.course.courseName}),u=S(()=>{var t;const m=w.value;return((t=c.course.translatedDescriptions)==null?void 0:t[m])||c.course.description||c.course.courseDescription}),h=m=>{const t="https://learning-platform-v01.web.app/launch/",x=m.id,y="window.open(`"+t+"${new URLSearchParams( window.location.search).get('companyId')}/"+x+"`,'_blank');";navigator.clipboard.writeText(y).then(()=>{$.success("Script copied to clipboard")}).catch(s=>{console.error("Failed to copy: ",s)})};return(m,t)=>{const x=I("router-link");return i(),b("div",X,[e("div",Y,[e("img",{src:p.course.thumbnail||"/images/placeholder-course.jpg",alt:p.course.courseName,class:"w-full h-48 object-cover rounded-t-lg"},null,8,ee),e("span",{class:Z([C.value,"absolute top-4 right-4 px-2 py-1 rounded-full text-xs font-medium capitalize"])},U(p.course.status),3)]),e("div",te,[e("h3",se,U(n.value),1),e("p",le,U(u.value),1),p.course.originalFilename&&f(a)?(i(),b("p",oe,[t[3]||(t[3]=R(" Source file: ")),e("span",re,U(p.course.originalFilename),1)])):k("",!0),e("div",ae,[f(a)?(i(),b("button",{key:0,onClick:t[0]||(t[0]=y=>m.$emit("delete",p.course.id)),class:"text-red-600 hover:text-red-800 rounded-lg px-4 py-2 hover:bg-primary-50 hover:underline focus:outline-none"},t[4]||(t[4]=[e("i",{class:"fas fa-trash"},null,-1)]))):k("",!0),f(a)?(i(),b("button",{key:1,onClick:t[1]||(t[1]=y=>m.$emit("edit",p.course)),class:"text-primary-500 rounded-lg px-4 py-2 hover:bg-primary-50 hover:underline hover:text-primary-600 focus:outline-none"},t[5]||(t[5]=[e("i",{class:"fas fa-edit"},null,-1)]))):k("",!0),N(x,{class:"text-primary-500 rounded-lg px-4 py-2 hover:bg-primary-50 hover:underline hover:text-primary-600 focus:outline-none",to:`/launch/admin/${p.course.id}`,target:"_blank",rel:"noopener"},{default:V(()=>t[6]||(t[6]=[e("i",{class:"fas fa-eye"},null,-1)])),_:1},8,["to"]),f(a)?(i(),T(x,{key:2,class:"text-primary-500 rounded-lg px-4 py-2 hover:bg-primary-50 hover:underline hover:text-primary-600 focus:outline-none",to:`/reports/course/${p.course.id}`},{default:V(()=>t[7]||(t[7]=[e("i",{class:"fas fa-chart-line"},null,-1)])),_:1},8,["to"])):k("",!0),e("button",{onClick:t[2]||(t[2]=y=>h(p.course)),class:"text-primary-500 rounded-lg px-4 py-2 hover:bg-primary-50 hover:underline hover:text-primary-600 focus:outline-none"},t[8]||(t[8]=[e("i",{class:"fas fa-copy"},null,-1)]))])])])}}},ie={class:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4"},ue={class:"bg-white rounded-lg max-w-md w-full p-6"},de={class:"flex justify-end space-x-4 mt-6"},ce=["disabled"],pe=["disabled"],me={__name:"CourseUploadModal",emits:["close","upload-complete"],setup(p,{emit:A}){const c=A,{uploadCourse:$,loading:a,error:w,progress:C}=K(),n=g(""),u=g(""),h=g(null),m=g(null),t=(y,s)=>{const o=y.target.files[0];if(o)if(s==="course"){if(!o.name.endsWith(".zip")){alert("Please upload a ZIP file"),y.target.value="";return}h.value=o}else m.value=o},x=async()=>
1{if(!h.value){alert("Please select a course file");return}try{await $({title:n.value,description:u.value,courseFile:h.value,thumbnail:m.value}),c("upload-complete"),c("close")}catch(y){console.error("Error uploading course:",y)}};return(y,s)=>(i(),b("div",ie,[e("div",ue,[s[11]||(s[11]=e("h2",{class:"text-2xl font-bold mb-4"},"Upload Course",-1)),e("form",{onSubmit:Q(x,["prevent"]),class:"space-y-4"},[e("div",null,[s[5]||(s[5]=e("label",{class:"block text-sm font-medium text-primary-700 mb-1"},"Title",-1)),F(e("input",{type:"text","onUpdate:modelValue":s[0]||(s[0]=o=>n.value=o),required:"",class:"input-field"},null,512),[[L,n.value]])]),e("div",null,[s[6]||(s[6]=e("label",{class:"block text-sm font-medium text-primary-700 mb-1"},"Description",-1)),F(e("textarea",{"onUpdate:modelValue":s[1]||(s[1]=o=>u.value=o),required:"",rows:"3",class:"input-field"},null,512),[[L,u.value]])]),e("div",null,[s[7]||(s[7]=e("label",{class:"block text-sm font-medium text-primary-700 mb-1"},"Course File (ZIP)",-1)),e("input",{type:"file",onChange:s[2]||(s[2]=o=>t(o,"course")),required:"",class:"input-field",accept:".zip"},null,32),s[8]||(s[8]=e("p",{class:"text-sm text-primary-500 mt-1"}," Upload your course package as a ZIP file ",-1))]),e("div",null,[s[9]||(s[9]=e("label",{class:"block text-sm font-medium text-primary-700 mb-1"},"Thumbnail (optional)",-1)),e("input",{type:"file",onChange:s[3]||(s[3]=o=>t(o,"thumbnail")),class:"input-field",accept:"image/*"},null,32),s[10]||(s[10]=e("p",{class:"text-sm text-primary-500 mt-1"}," Recommended size: 1280x720px ",-1))]),f(a)||f(w)?(i(),T(W,{key:0,progress:f(C),error:f(w)},null,8,["progress","error"])):k("",!0),e("div",de,[e("button",{type:"button",onClick:s[4]||(s[4]=o=>c("close")),class:"btn-secondary-admin",disabled:f(a)}," Cancel ",8,ce),e("button",{type:"submit",class:"btn-primary-admin",disabled:f(a)},U(f(a)?"Uploading...":"Upload Course"),9,pe)])],32)])]))}},fe={class:"bg-white rounded-lg shadow p-4 flex flex-col md:flex-row gap-4"},ve={class:"flex-1"},be={class:"w-full md:w-48"},ye=["value"],xe={__name:"CourseFilters",props:{filters:{type:Object,required:!0}},emits:["update:filters"],setup(p,{emit:A}){const c=p,$=A,a=g({...c.filters});H(a,C=>{$("update:filters",C)},{deep:!0});const w=[{value:"all",label:"All Courses"},{value:"active",label:"Active"},{value:"draft",label:"Draft"}];return(C,n)=>(i(),b("div",fe,[e("div",ve,[n[2]||(n[2]=e("label",{class:"block text-sm font-medium text-primary-700 mb-1"},"Search",-1)),F(e("input",{type:"text","onUpdate:modelValue":n[0]||(n[0]=u=>a.value.search=u),placeholder:"Search courses...",class:"input-field"},null,512),[[L,a.value.search]])]),e("div",be,[n[3]||(n[3]=e("label",{class:"block text-sm font-medium text-primary-700 mb-1"},"Status",-1)),F(e("select",{"onUpdate:modelValue":n[1]||(n[1]=u=>a.value.status=u),class:"input-field"},[(i(),b(M,null,O(w,u=>e("option",{key:u.value,value:u.value},U(u.label),9,ye)),64))],512),[[E,a.value.status]])])]))}},ge={class:"container mx-auto px-4 py-8"},we={class:"flex justify-between items-center mb-8"},Ce={class:"mb-6 flex flex-col sm:flex-row gap-4"},he={class:"flex-1"},ke={class:"relative"},$e={class:"w-full sm:w-48"},De={key:0,class:"text-center py-8"},Ue={key:1,class:"bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded"},Ae={key:2,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6"},je={__name:"CourseList",setup(p){const{isAdmin:A}=j(),{documents:c,loading:$,error:a,fetchDocuments:w,deleteDocument:C}=P("courses"),n=g(!1),u=g(!1),h=g(null),m=g(""),t=g("titleAsc"),x=g({status:"all",search:""}),y=S(()=>{let d=[...c.value];const l=m.value.toLowerCase().trim();l&&(d=d.filter(r=>r.title&&r.title.toLowerCase().includes(l)||r.description&&r.description.toLowerCase().includes(l)||r.originalFilename&&r.originalFilename.toLowerCase().includes(l)));const v=r=>r&&r.toDate?r.toDate():new Date(r);switch(t.value){case"titleDesc":d.sort((r,D)=>(D.title||"").localeCompare(r.title||""));break;case"updatedNewest":d.sort((r,D)=>v(D.updatedAt)-v(r.updatedAt));break;case"updatedOldest":d.sort((r,D)=>v(r.updatedAt)-v(D.updatedAt));break;default:d.sort((r,D)=>(r.title||"").localeCompare(D.title||""))}return d}),s=d=>{x.value=d},o=async()=>{const d=[];x.value.status!=="all"&&d.push(where("status","==",x.value.status)),await w(d)},_=d=>{h.value=d,u.value=!0},q=async d=>{try{await C(d),o()}catch(l){console.error("Error deleting course:",l)}};return J(o),(d,l)=>
1(i(),b("div",ge,[e("div",we,[l[5]||(l[5]=e("h1",{class:"text-3xl font-bold"},"All Courses",-1)),f(A)?(i(),b("button",{key:0,onClick:l[0]||(l[0]=v=>n.value=!0),class:"btn-primary-admin"}," Upload Course ")):k("",!0)]),e("div",Ce,[e("div",he,[e("div",ke,[F(e("input",{"onUpdate:modelValue":l[1]||(l[1]=v=>m.value=v),type:"text",placeholder:"Search by title, description, or filename...",class:"w-full p-2 pl-10 border border-gray-300 rounded-lg"},null,512),[[L,m.value]]),l[6]||(l[6]=e("i",{class:"fas fa-search text-gray-400 absolute left-3 top-3"},null,-1))])]),e("div",$e,[F(e("select",{"onUpdate:modelValue":l[2]||(l[2]=v=>t.value=v),class:"w-full p-2 border border-gray-300 rounded-lg"},l[7]||(l[7]=[e("option",{value:"titleAsc"},"Title (A-Z)",-1),e("option",{value:"titleDesc"},"Title (Z-A)",-1),e("option",{value:"updatedNewest"},"Recently Updated",-1),e("option",{value:"updatedOldest"},"Oldest Updated",-1)]),512),[[E,t.value]])])]),N(xe,{filters:x.value,"onUpdate:filters":s,class:"mb-8",style:{display:"none"}},null,8,["filters"]),f($)?(i(),b("div",De,l[8]||(l[8]=[e("div",{class:"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto"},null,-1)]))):f(a)?(i(),b("div",Ue,U(f(a)),1)):(i(),b("div",Ae,[(i(!0),b(M,null,O(y.value,v=>(i(),T(ne,{key:v.id,course:v,onEdit:_,onDelete:q,onRefresh:o},null,8,["course"]))),128))])),n.value?(i(),T(me,{key:3,onClose:l[3]||(l[3]=v=>n.value=!1),onUploadComplete:o})):k("",!0),u.value?(i(),T(G,{key:4,course:h.value,onClose:l[4]||(l[4]=v=>u.value=!1),onSave:o},null,8,["course"])):k("",!0)]))}};export{je 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.