@vue-skuilder/platform-ui 0.1.31 → 0.1.32-a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/assets/{About-D3O4ft8c.js → About-DoHuqLz9.js} +2 -2
  2. package/dist/assets/{About-D3O4ft8c.js.map → About-DoHuqLz9.js.map} +1 -1
  3. package/dist/assets/{AdminDashboard-DH-Wi1tp.js → AdminDashboard-CT283YB5.js} +2 -2
  4. package/dist/assets/{AdminDashboard-DH-Wi1tp.js.map → AdminDashboard-CT283YB5.js.map} +1 -1
  5. package/dist/assets/{ClassroomCtrlPanel-BZ2Jso_N.js → ClassroomCtrlPanel-BDEDtHY4.js} +2 -2
  6. package/dist/assets/{ClassroomCtrlPanel-BZ2Jso_N.js.map → ClassroomCtrlPanel-BDEDtHY4.js.map} +1 -1
  7. package/dist/assets/{Classrooms-Dk081Q6U.js → Classrooms-BUQy-tP2.js} +2 -2
  8. package/dist/assets/{Classrooms-Dk081Q6U.js.map → Classrooms-BUQy-tP2.js.map} +1 -1
  9. package/dist/assets/{CourseRouter-BK4PYhtA.js → CourseRouter-BZtoKZRD.js} +2 -2
  10. package/dist/assets/{CourseRouter-BK4PYhtA.js.map → CourseRouter-BZtoKZRD.js.map} +1 -1
  11. package/dist/assets/{Courses-DU7lVPoV.js → Courses-CS040Tw7.js} +2 -2
  12. package/dist/assets/{Courses-DU7lVPoV.js.map → Courses-CS040Tw7.js.map} +1 -1
  13. package/dist/assets/{DataInputFormTester-CL0gV9cw.js → DataInputFormTester-pEuS9Phg.js} +2 -2
  14. package/dist/assets/{DataInputFormTester-CL0gV9cw.js.map → DataInputFormTester-pEuS9Phg.js.map} +1 -1
  15. package/dist/assets/{EloModeration-DfSLA79x.js → EloModeration-CeIw0EQK.js} +2 -2
  16. package/dist/assets/{EloModeration-DfSLA79x.js.map → EloModeration-CeIw0EQK.js.map} +1 -1
  17. package/dist/assets/{JoinCode-njKk1YJx.js → JoinCode-ePDmlCCp.js} +2 -2
  18. package/dist/assets/{JoinCode-njKk1YJx.js.map → JoinCode-ePDmlCCp.js.map} +1 -1
  19. package/dist/assets/{NewCourseDialog-gxkU-IdZ.js → NewCourseDialog-CQ7mNlvV.js} +2 -2
  20. package/dist/assets/{NewCourseDialog-gxkU-IdZ.js.map → NewCourseDialog-CQ7mNlvV.js.map} +1 -1
  21. package/dist/assets/{ReleaseNotes-Dp_ykMR1.js → ReleaseNotes-C3ZQbVRo.js} +2 -2
  22. package/dist/assets/{ReleaseNotes-Dp_ykMR1.js.map → ReleaseNotes-C3ZQbVRo.js.map} +1 -1
  23. package/dist/assets/{RequestPasswordReset-BavuuCBu.js → RequestPasswordReset-Br-oJB_m.js} +2 -2
  24. package/dist/assets/{RequestPasswordReset-BavuuCBu.js.map → RequestPasswordReset-Br-oJB_m.js.map} +1 -1
  25. package/dist/assets/{ResetPassword-CA8HHOIy.js → ResetPassword-DHODhs-I.js} +2 -2
  26. package/dist/assets/{ResetPassword-CA8HHOIy.js.map → ResetPassword-DHODhs-I.js.map} +1 -1
  27. package/dist/assets/{Study-B4tBks0X.js → Study-C5YvoMU9.js} +2 -2
  28. package/dist/assets/{Study-B4tBks0X.js.map → Study-C5YvoMU9.js.map} +1 -1
  29. package/dist/assets/{TagInformation-CHi7V_t8.js → TagInformation-dvTAwqm2.js} +2 -2
  30. package/dist/assets/{TagInformation-CHi7V_t8.js.map → TagInformation-dvTAwqm2.js.map} +1 -1
  31. package/dist/assets/{User-DbWphbh1.js → User-BllmMsWt.js} +2 -2
  32. package/dist/assets/{User-DbWphbh1.js.map → User-BllmMsWt.js.map} +1 -1
  33. package/dist/assets/{UserStats-rzVY5epq.js → UserStats-Sf1eBdAQ.js} +2 -2
  34. package/dist/assets/{UserStats-rzVY5epq.js.map → UserStats-Sf1eBdAQ.js.map} +1 -1
  35. package/dist/assets/{VerifyEmail-pMcSlNzF.js → VerifyEmail-D-JmJym5.js} +2 -2
  36. package/dist/assets/{VerifyEmail-pMcSlNzF.js.map → VerifyEmail-D-JmJym5.js.map} +1 -1
  37. package/dist/assets/{edit-ui.es-DGbs4pNc.js → edit-ui.es-1BaJ_I4B.js} +2 -2
  38. package/dist/assets/{edit-ui.es-DGbs4pNc.js.map → edit-ui.es-1BaJ_I4B.js.map} +1 -1
  39. package/dist/assets/index-2oekPD75.js +3 -0
  40. package/dist/assets/index-2oekPD75.js.map +1 -0
  41. package/dist/assets/{index-aYts26PW.css → index-CeD0adOi.css} +1 -1
  42. package/dist/assets/{index-CSo_psn8.js → index-DHivZCyO.js} +3 -3
  43. package/dist/assets/{index-CSo_psn8.js.map → index-DHivZCyO.js.map} +1 -1
  44. package/dist/assets/{mousetrap-DZcUUEaw.js → mousetrap-ChZ3Kuin.js} +2 -2
  45. package/dist/assets/{mousetrap-DZcUUEaw.js.map → mousetrap-ChZ3Kuin.js.map} +1 -1
  46. package/dist/index.html +2 -2
  47. package/dist/sw.js +1 -1
  48. package/dist/sw.js.map +1 -1
  49. package/package.json +6 -6
  50. package/dist/assets/index-PISHyq1I.js +0 -3
  51. package/dist/assets/index-PISHyq1I.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{N as e}from"./NewCourseDialog-gxkU-IdZ.js";import{d as s,l as t,s as r,g as a,_ as o,r as i,c as l,h as n,o as u,w as c,a as d,e as g,t as C,b as h,i as f,j as p,k as m,p as y,q as v,f as w,F as b,n as _}from"./index-PISHyq1I.js";import{s as x}from"./mousetrap-DZcUUEaw.js";const D=s({name:"CourseStubCard",props:{courseId:{type:String,required:!0}},emits:["refresh"],data:()=>({courseConfig:null,questionCount:0,isPrivate:!1,updatePending:!0,addingCourse:!1}),async created(){try{const e=a().getCourseDB(this.courseId);this.courseConfig=await e.getCourseConfig(),this.isPrivate=!this.courseConfig.public,this.questionCount=(await e.getCourseInfo()).cardCount,this.updatePending=!1}catch(e){console.error(`Error loading course ${this.courseId}: ${e}`)}},methods:{async registerForCourse(){this.addingCourse=!0,t(`Attempting to register for ${this.courseId}.`),await(await r()).registerForCourse(this.courseId),this.$emit("refresh")},navigateToInfo(){const e=`/q/${this.courseConfig?.name.replaceAll(" ","_")}`;this.$router.push(e)}}});const A=s({name:"CoursesView",components:{NewCourseDialog:e,CourseStubCard:o(D,[["render",function(e,s,t,r,a,o){const f=i("v-icon"),p=i("v-card-title"),m=i("v-card-item"),y=i("v-card-text"),v=i("v-btn"),w=i("v-card-actions"),b=i("v-card");return!e.updatePending&&e.courseConfig?(u(),l(b,{key:0,"data-cy":"available-course-card"},{default:c((()=>[d(m,null,{default:c((()=>[d(p,{"data-cy":"course-title"},{default:c((()=>[g(C(e.courseConfig.name)+" ",1),e.isPrivate?(u(),l(f,{key:0,icon:"mdi-eye-off",class:"ml-2"})):n("",!0)])),_:1})])),_:1}),d(y,null,{default:c((()=>[g(" Questions: "+C(e.questionCount)+" ",1),h("p",null,C(e.courseConfig.description),1)])),_:1}),d(w,null,{default:c((()=>[d(v,{color:"primary",onClick:e.navigateToInfo},{default:c((()=>s[0]||(s[0]=[g("More Info")]))),_:1},8,["onClick"]),d(v,{"data-cy":"register-course-button",loading:e.addingCourse,color:"primary",onClick:e.registerForCourse},{default:c((()=>s[1]||(s[1]=[g(" Register ")]))),_:1},8,["loading","onClick"])])),_:1})])),_:1})):n("",!0)}]])},data:()=>({existingCourses:[],registeredCourses:[],awaitingCreateCourse:!1,spinnerMap:{},newCourseDialog:!1,user:null,myQuiltsPanel:0,showAllCourses:!1,coursesPerPage:8}),computed:{availableCourses(){const e=this.existingCourses.filter((e=>!this.registeredCourses.includes(e))),s=this.user?.getUsername();return e.filter((e=>{if(!s)return!1;return e.public||e.creator===s||-1!==e.admins.indexOf(s)||-1!==e.moderators.indexOf(s)}))},displayedAvailableCourses(){return this.showAllCourses?this.availableCourses:this.availableCourses.slice(0,this.coursesPerPage)},hasMoreCourses(){return this.availableCourses.length>this.coursesPerPage},newCourseAttrs(){return{attrs:{"aria-label":"Create new quilt"},on:{click:()=>this.newCourseDialog=!0}}}},async created(){this.user=await r(),this.refreshData()},methods:{processResponse(){this.newCourseDialog=!1,this.refreshData()},toggleShowMore(){this.showAllCourses=!this.showAllCourses},async refreshData(){console.log("Pulling user course data...");try{const e=(await this.user.getCourseRegistrationsDoc()).courses.filter((e=>"active"===e.status||"maintenance-mode"===e.status||void 0===e.status)).map((e=>e.courseID));console.log(`userCourseIDs: ${e}`),this.existingCourses=await a().getCoursesDB().getCourseList(),console.log(`existingCourses: \n\t${this.existingCourses.map((e=>e.name)).join(",\n\t")}`),this.registeredCourses=this.existingCourses.filter((s=>{let t=!1;return e.forEach((e=>{s.courseID===e&&(t=!0)})),t}))}catch(e){console.error("Error refreshing course data:",e),p({status:m.error,text:`Failed to load courses: ${e||"Database access error"}`})}},async createCourse(){this.awaitingCreateCourse=!0;const e=await x({type:f.CREATE_COURSE,data:{name:"testCourseName",description:"All of these courses will be the same!",public:!0,deleted:!1,creator:this.user.getUsername(),admins:[this.user.getUsername()],moderators:[],dataShapes:[],questionTypes:[]},user:this.user.getUsername(),response:null});p({status:e.response,text:`Course ${JSON.stringify(e)} created`}),this.awaitingCreateCourse=!1},async addCourse(e){this.spinnerMap[e]=!0,console.log(`Attempting to register for ${e}.`),await(this.user?.registerForCourse(e)),delete this.spinnerMap[e],this.refreshData()},async dropCourse(e){this.spinnerMap[e]=!0,console.log(`Attempting to drop ${e}.`),await(this.user?.dropCourse(e)),delete this.spinnerMap[e],this.refreshData()}}}),I={class:"d-flex align-center justify-space-between"},k={"data-cy":"registered-course",class:"d-flex align-center"};const P=o(A,[["render",function(e,s,t,r,a,o){const f=i("v-btn"),p=i("v-expansion-panel-title"),m=i("router-link"),x=i("v-icon"),D=i("v-card"),A=i("v-col"),P=i("v-row"),M=i("v-expansion-panel-text"),$=i("v-expansion-panel"),q=i("v-expansion-panels"),S=i("course-stub-card"),R=i("new-course-dialog"),j=i("v-dialog"),E=i("v-container");return u(),l(E,{fluid:""},{default:c((()=>[d(f,y({color:"primary",fixed:"",location:"bottom right",icon:"mdi-plus",size:"large",class:"mb-4 mr-4","data-cy":"create-course-fab"},e.newCourseAttrs,v(e.newCourseAttrs.on)),null,16),d(P,null,{default:c((()=>[d(A,{cols:"12"},{default:c((()=>[d(q,{modelValue:e.myQuiltsPanel,"onUpdate:modelValue":s[0]||(s[0]=s=>e.myQuiltsPanel=s)},{default:c((()=>[d($,null,{default:c((()=>[d(p,{"data-cy":"registered-quilts-panel"},{default:c((()=>s[3]||(s[3]=[g("My Registered Quilts")]))),_:1}),d(M,null,{default:c((()=>[d(P,null,{default:c((()=>[(u(!0),w(b,null,_(e.registeredCourses,(t=>(u(),l(A,{key:t.courseID,cols:"12",sm:"6",md:"4",lg:"3"},{default:c((()=>[d(D,{variant:"outlined",density:"compact",class:"pa-2"},{default:c((()=>[h("div",I,[h("div",k,[d(m,{to:`/q/${t.name.replaceAll(" ","_")}`,class:"text-subtitle-2","data-cy":"registered-course-title"},{default:c((()=>[g(C(t.name),1)])),_:2},1032,["to"]),t.public?n("",!0):(u(),l(x,{key:0,size:"x-small",class:"ml-1"},{default:c((()=>s[4]||(s[4]=[g("mdi-eye-off")]))),_:1}))]),d(f,{size:"x-small",variant:"text",color:"error","data-cy":"drop-course-button",loading:void 0!==e.spinnerMap[t.courseID],onClick:s=>e.dropCourse(t.courseID)},{default:c((()=>s[5]||(s[5]=[g(" Drop ")]))),_:2},1032,["loading","onClick"])])])),_:2},1024)])),_:2},1024)))),128))])),_:1})])),_:1})])),_:1})])),_:1},8,["modelValue"])])),_:1}),d(A,{cols:"12",class:"mt-4"},{default:c((()=>[s[6]||(s[6]=h("h2",{class:"text-h5 mb-3"},"Available Quilts",-1)),d(P,null,{default:c((()=>[(u(!0),w(b,null,_(e.displayedAvailableCourses,(s=>(u(),l(A,{key:s.courseID,cols:"12",sm:"6",md:"4",lg:"3"},{default:c((()=>[d(S,{"data-cy":"available-course-card","course-id":s.courseID,onRefresh:e.refreshData},null,8,["course-id","onRefresh"])])),_:2},1024)))),128))])),_:1}),e.hasMoreCourses?(u(),l(P,{key:0,justify:"center",class:"mt-2"},{default:c((()=>[d(f,{variant:"text",color:"primary","data-cy":"courses-show-more-button",onClick:e.toggleShowMore},{default:c((()=>[g(C(e.showAllCourses?"Show Less":"Show More"),1)])),_:1},8,["onClick"])])),_:1})):n("",!0)])),_:1})])),_:1}),d(j,{modelValue:e.newCourseDialog,"onUpdate:modelValue":s[2]||(s[2]=s=>e.newCourseDialog=s),fullscreen:"",transition:"dialog-bottom-transition",scrim:!1},{default:c((()=>[d(R,{onCourseEditingComplete:s[1]||(s[1]=s=>e.processResponse())})])),_:1},8,["modelValue"])])),_:1})}],["__scopeId","data-v-ba0ad091"]]);export{P as default};
2
- //# sourceMappingURL=Courses-DU7lVPoV.js.map
1
+ import{N as e}from"./NewCourseDialog-CQ7mNlvV.js";import{d as s,l as t,s as r,g as a,_ as o,r as i,c as l,h as n,o as u,w as c,a as d,e as g,t as C,b as h,i as f,j as p,k as m,p as y,q as v,f as w,F as b,n as _}from"./index-2oekPD75.js";import{s as x}from"./mousetrap-ChZ3Kuin.js";const D=s({name:"CourseStubCard",props:{courseId:{type:String,required:!0}},emits:["refresh"],data:()=>({courseConfig:null,questionCount:0,isPrivate:!1,updatePending:!0,addingCourse:!1}),async created(){try{const e=a().getCourseDB(this.courseId);this.courseConfig=await e.getCourseConfig(),this.isPrivate=!this.courseConfig.public,this.questionCount=(await e.getCourseInfo()).cardCount,this.updatePending=!1}catch(e){console.error(`Error loading course ${this.courseId}: ${e}`)}},methods:{async registerForCourse(){this.addingCourse=!0,t(`Attempting to register for ${this.courseId}.`),await(await r()).registerForCourse(this.courseId),this.$emit("refresh")},navigateToInfo(){const e=`/q/${this.courseConfig?.name.replaceAll(" ","_")}`;this.$router.push(e)}}});const A=s({name:"CoursesView",components:{NewCourseDialog:e,CourseStubCard:o(D,[["render",function(e,s,t,r,a,o){const f=i("v-icon"),p=i("v-card-title"),m=i("v-card-item"),y=i("v-card-text"),v=i("v-btn"),w=i("v-card-actions"),b=i("v-card");return!e.updatePending&&e.courseConfig?(u(),l(b,{key:0,"data-cy":"available-course-card"},{default:c((()=>[d(m,null,{default:c((()=>[d(p,{"data-cy":"course-title"},{default:c((()=>[g(C(e.courseConfig.name)+" ",1),e.isPrivate?(u(),l(f,{key:0,icon:"mdi-eye-off",class:"ml-2"})):n("",!0)])),_:1})])),_:1}),d(y,null,{default:c((()=>[g(" Questions: "+C(e.questionCount)+" ",1),h("p",null,C(e.courseConfig.description),1)])),_:1}),d(w,null,{default:c((()=>[d(v,{color:"primary",onClick:e.navigateToInfo},{default:c((()=>s[0]||(s[0]=[g("More Info")]))),_:1},8,["onClick"]),d(v,{"data-cy":"register-course-button",loading:e.addingCourse,color:"primary",onClick:e.registerForCourse},{default:c((()=>s[1]||(s[1]=[g(" Register ")]))),_:1},8,["loading","onClick"])])),_:1})])),_:1})):n("",!0)}]])},data:()=>({existingCourses:[],registeredCourses:[],awaitingCreateCourse:!1,spinnerMap:{},newCourseDialog:!1,user:null,myQuiltsPanel:0,showAllCourses:!1,coursesPerPage:8}),computed:{availableCourses(){const e=this.existingCourses.filter((e=>!this.registeredCourses.includes(e))),s=this.user?.getUsername();return e.filter((e=>{if(!s)return!1;return e.public||e.creator===s||-1!==e.admins.indexOf(s)||-1!==e.moderators.indexOf(s)}))},displayedAvailableCourses(){return this.showAllCourses?this.availableCourses:this.availableCourses.slice(0,this.coursesPerPage)},hasMoreCourses(){return this.availableCourses.length>this.coursesPerPage},newCourseAttrs(){return{attrs:{"aria-label":"Create new quilt"},on:{click:()=>this.newCourseDialog=!0}}}},async created(){this.user=await r(),this.refreshData()},methods:{processResponse(){this.newCourseDialog=!1,this.refreshData()},toggleShowMore(){this.showAllCourses=!this.showAllCourses},async refreshData(){console.log("Pulling user course data...");try{const e=(await this.user.getCourseRegistrationsDoc()).courses.filter((e=>"active"===e.status||"maintenance-mode"===e.status||void 0===e.status)).map((e=>e.courseID));console.log(`userCourseIDs: ${e}`),this.existingCourses=await a().getCoursesDB().getCourseList(),console.log(`existingCourses: \n\t${this.existingCourses.map((e=>e.name)).join(",\n\t")}`),this.registeredCourses=this.existingCourses.filter((s=>{let t=!1;return e.forEach((e=>{s.courseID===e&&(t=!0)})),t}))}catch(e){console.error("Error refreshing course data:",e),p({status:m.error,text:`Failed to load courses: ${e||"Database access error"}`})}},async createCourse(){this.awaitingCreateCourse=!0;const e=await x({type:f.CREATE_COURSE,data:{name:"testCourseName",description:"All of these courses will be the same!",public:!0,deleted:!1,creator:this.user.getUsername(),admins:[this.user.getUsername()],moderators:[],dataShapes:[],questionTypes:[]},user:this.user.getUsername(),response:null});p({status:e.response,text:`Course ${JSON.stringify(e)} created`}),this.awaitingCreateCourse=!1},async addCourse(e){this.spinnerMap[e]=!0,console.log(`Attempting to register for ${e}.`),await(this.user?.registerForCourse(e)),delete this.spinnerMap[e],this.refreshData()},async dropCourse(e){this.spinnerMap[e]=!0,console.log(`Attempting to drop ${e}.`),await(this.user?.dropCourse(e)),delete this.spinnerMap[e],this.refreshData()}}}),I={class:"d-flex align-center justify-space-between"},k={"data-cy":"registered-course",class:"d-flex align-center"};const P=o(A,[["render",function(e,s,t,r,a,o){const f=i("v-btn"),p=i("v-expansion-panel-title"),m=i("router-link"),x=i("v-icon"),D=i("v-card"),A=i("v-col"),P=i("v-row"),M=i("v-expansion-panel-text"),$=i("v-expansion-panel"),q=i("v-expansion-panels"),S=i("course-stub-card"),R=i("new-course-dialog"),j=i("v-dialog"),E=i("v-container");return u(),l(E,{fluid:""},{default:c((()=>[d(f,y({color:"primary",fixed:"",location:"bottom right",icon:"mdi-plus",size:"large",class:"mb-4 mr-4","data-cy":"create-course-fab"},e.newCourseAttrs,v(e.newCourseAttrs.on)),null,16),d(P,null,{default:c((()=>[d(A,{cols:"12"},{default:c((()=>[d(q,{modelValue:e.myQuiltsPanel,"onUpdate:modelValue":s[0]||(s[0]=s=>e.myQuiltsPanel=s)},{default:c((()=>[d($,null,{default:c((()=>[d(p,{"data-cy":"registered-quilts-panel"},{default:c((()=>s[3]||(s[3]=[g("My Registered Quilts")]))),_:1}),d(M,null,{default:c((()=>[d(P,null,{default:c((()=>[(u(!0),w(b,null,_(e.registeredCourses,(t=>(u(),l(A,{key:t.courseID,cols:"12",sm:"6",md:"4",lg:"3"},{default:c((()=>[d(D,{variant:"outlined",density:"compact",class:"pa-2"},{default:c((()=>[h("div",I,[h("div",k,[d(m,{to:`/q/${t.name.replaceAll(" ","_")}`,class:"text-subtitle-2","data-cy":"registered-course-title"},{default:c((()=>[g(C(t.name),1)])),_:2},1032,["to"]),t.public?n("",!0):(u(),l(x,{key:0,size:"x-small",class:"ml-1"},{default:c((()=>s[4]||(s[4]=[g("mdi-eye-off")]))),_:1}))]),d(f,{size:"x-small",variant:"text",color:"error","data-cy":"drop-course-button",loading:void 0!==e.spinnerMap[t.courseID],onClick:s=>e.dropCourse(t.courseID)},{default:c((()=>s[5]||(s[5]=[g(" Drop ")]))),_:2},1032,["loading","onClick"])])])),_:2},1024)])),_:2},1024)))),128))])),_:1})])),_:1})])),_:1})])),_:1},8,["modelValue"])])),_:1}),d(A,{cols:"12",class:"mt-4"},{default:c((()=>[s[6]||(s[6]=h("h2",{class:"text-h5 mb-3"},"Available Quilts",-1)),d(P,null,{default:c((()=>[(u(!0),w(b,null,_(e.displayedAvailableCourses,(s=>(u(),l(A,{key:s.courseID,cols:"12",sm:"6",md:"4",lg:"3"},{default:c((()=>[d(S,{"data-cy":"available-course-card","course-id":s.courseID,onRefresh:e.refreshData},null,8,["course-id","onRefresh"])])),_:2},1024)))),128))])),_:1}),e.hasMoreCourses?(u(),l(P,{key:0,justify:"center",class:"mt-2"},{default:c((()=>[d(f,{variant:"text",color:"primary","data-cy":"courses-show-more-button",onClick:e.toggleShowMore},{default:c((()=>[g(C(e.showAllCourses?"Show Less":"Show More"),1)])),_:1},8,["onClick"])])),_:1})):n("",!0)])),_:1})])),_:1}),d(j,{modelValue:e.newCourseDialog,"onUpdate:modelValue":s[2]||(s[2]=s=>e.newCourseDialog=s),fullscreen:"",transition:"dialog-bottom-transition",scrim:!1},{default:c((()=>[d(R,{onCourseEditingComplete:s[1]||(s[1]=s=>e.processResponse())})])),_:1},8,["modelValue"])])),_:1})}],["__scopeId","data-v-ba0ad091"]]);export{P as default};
2
+ //# sourceMappingURL=Courses-CS040Tw7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Courses-DU7lVPoV.js","sources":["../../src/components/Courses/CourseStubCard.vue","../../src/views/Courses.vue"],"sourcesContent":["<template>\n <v-card v-if=\"!updatePending && courseConfig\" data-cy=\"available-course-card\">\n <v-card-item>\n <v-card-title data-cy=\"course-title\">\n {{ courseConfig.name }}\n <v-icon v-if=\"isPrivate\" icon=\"mdi-eye-off\" class=\"ml-2\"></v-icon>\n </v-card-title>\n </v-card-item>\n\n <v-card-text>\n Questions: {{ questionCount }}\n <p>{{ courseConfig.description }}</p>\n </v-card-text>\n\n <v-card-actions>\n <v-btn color=\"primary\" @click=\"navigateToInfo\">More Info</v-btn>\n <v-btn data-cy=\"register-course-button\" :loading=\"addingCourse\" color=\"primary\" @click=\"registerForCourse\">\n Register\n </v-btn>\n </v-card-actions>\n </v-card>\n</template>\n\n<script lang=\"ts\">\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\nimport { CourseConfig, log } from '@vue-skuilder/common';\nimport { getDataLayer } from '@vue-skuilder/db';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'CourseStubCard',\n\n props: {\n courseId: {\n type: String,\n required: true,\n },\n },\n emits: ['refresh'],\n\n data() {\n return {\n courseConfig: null as CourseConfig | null,\n questionCount: 0,\n isPrivate: false,\n updatePending: true,\n addingCourse: false,\n };\n },\n\n async created() {\n try {\n const db = getDataLayer().getCourseDB(this.courseId);\n this.courseConfig = (await db.getCourseConfig())!;\n this.isPrivate = !this.courseConfig.public;\n this.questionCount = (await db.getCourseInfo()).cardCount;\n this.updatePending = false;\n } catch (e) {\n console.error(`Error loading course ${this.courseId}: ${e}`);\n }\n },\n\n methods: {\n async registerForCourse() {\n this.addingCourse = true;\n log(`Attempting to register for ${this.courseId}.`);\n await (await getCurrentUser()).registerForCourse(this.courseId);\n this.$emit('refresh');\n },\n navigateToInfo() {\n const path = `/q/${this.courseConfig?.name.replaceAll(' ', '_')}`;\n this.$router.push(path);\n },\n },\n});\n</script>\n","<template>\n <v-container fluid>\n <!-- Fixed Action Button - Updated position classes -->\n <v-btn\n color=\"primary\"\n fixed\n location=\"bottom right\"\n icon=\"mdi-plus\"\n size=\"large\"\n class=\"mb-4 mr-4\"\n data-cy=\"create-course-fab\"\n v-bind=\"newCourseAttrs\"\n v-on=\"newCourseAttrs.on\"\n />\n\n <!-- Main Content Area -->\n <v-row>\n <!-- My Quilts Panel -->\n <v-col cols=\"12\">\n <v-expansion-panels v-model=\"myQuiltsPanel\">\n <v-expansion-panel>\n <v-expansion-panel-title data-cy=\"registered-quilts-panel\">My Registered Quilts</v-expansion-panel-title>\n <v-expansion-panel-text>\n <v-row>\n <v-col v-for=\"course in registeredCourses\" :key=\"course.courseID\" cols=\"12\" sm=\"6\" md=\"4\" lg=\"3\">\n <v-card variant=\"outlined\" density=\"compact\" class=\"pa-2\">\n <div class=\"d-flex align-center justify-space-between\">\n <div data-cy=\"registered-course\" class=\"d-flex align-center\">\n <router-link\n :to=\"`/q/${course.name.replaceAll(' ', '_')}`\"\n class=\"text-subtitle-2\"\n data-cy=\"registered-course-title\"\n >\n {{ course.name }}\n </router-link>\n <v-icon v-if=\"!course.public\" size=\"x-small\" class=\"ml-1\">mdi-eye-off</v-icon>\n </div>\n <v-btn\n size=\"x-small\"\n variant=\"text\"\n color=\"error\"\n data-cy=\"drop-course-button\"\n :loading=\"spinnerMap[course.courseID] !== undefined\"\n @click=\"dropCourse(course.courseID)\"\n >\n Drop\n </v-btn>\n </div>\n </v-card>\n </v-col>\n </v-row>\n </v-expansion-panel-text>\n </v-expansion-panel>\n </v-expansion-panels>\n </v-col>\n\n <!-- Available Quilts Section -->\n <v-col cols=\"12\" class=\"mt-4\">\n <h2 class=\"text-h5 mb-3\">Available Quilts</h2>\n <v-row>\n <v-col v-for=\"course in displayedAvailableCourses\" :key=\"course.courseID\" cols=\"12\" sm=\"6\" md=\"4\" lg=\"3\">\n <course-stub-card data-cy=\"available-course-card\" :course-id=\"course.courseID\" @refresh=\"refreshData\" />\n </v-col>\n </v-row>\n\n <!-- Show More Button -->\n <v-row v-if=\"hasMoreCourses\" justify=\"center\" class=\"mt-2\">\n <v-btn variant=\"text\" color=\"primary\" data-cy=\"courses-show-more-button\" @click=\"toggleShowMore\">\n {{ showAllCourses ? 'Show Less' : 'Show More' }}\n </v-btn>\n </v-row>\n </v-col>\n </v-row>\n\n <!-- New Course Dialog -->\n <v-dialog v-model=\"newCourseDialog\" fullscreen transition=\"dialog-bottom-transition\" :scrim=\"false\">\n <new-course-dialog @course-editing-complete=\"processResponse()\" />\n </v-dialog>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport NewCourseDialog from '@pui/components/Courses/NewCourseDialog.vue';\nimport CourseStubCard from '@pui/components/Courses/CourseStubCard.vue';\n\nimport serverRequest from '../server';\nimport { ServerRequestType, CourseConfig, Status } from '@vue-skuilder/common';\nimport { alertUser, getCurrentUser } from '@vue-skuilder/common-ui';\nimport { UserDBInterface, getDataLayer } from '@vue-skuilder/db';\n\ntype DBCourseConfig = CourseConfig & {\n courseID: string;\n};\n\nexport default defineComponent({\n name: 'CoursesView',\n\n components: {\n NewCourseDialog,\n CourseStubCard,\n },\n\n data() {\n return {\n existingCourses: [] as DBCourseConfig[],\n registeredCourses: [] as DBCourseConfig[],\n awaitingCreateCourse: false,\n spinnerMap: {} as { [key: string]: boolean },\n newCourseDialog: false,\n user: null as UserDBInterface | null,\n myQuiltsPanel: 0, // Controls expansion panel\n showAllCourses: false,\n coursesPerPage: 8,\n };\n },\n\n computed: {\n availableCourses(): DBCourseConfig[] {\n const availableCourses = this.existingCourses.filter((c) => !this.registeredCourses.includes(c));\n const user = this.user?.getUsername();\n\n const viewableCourses = availableCourses.filter((course) => {\n if (!user) {\n return false;\n }\n const viewable: boolean =\n course.public ||\n course.creator === user ||\n course.admins.indexOf(user) !== -1 ||\n course.moderators.indexOf(user) !== -1;\n\n return viewable;\n });\n\n return viewableCourses;\n },\n displayedAvailableCourses(): DBCourseConfig[] {\n if (this.showAllCourses) {\n return this.availableCourses;\n }\n return this.availableCourses.slice(0, this.coursesPerPage);\n },\n\n hasMoreCourses(): boolean {\n return this.availableCourses.length > this.coursesPerPage;\n },\n\n newCourseAttrs() {\n return {\n attrs: {\n 'aria-label': 'Create new quilt',\n },\n on: {\n click: () => (this.newCourseDialog = true),\n },\n };\n },\n },\n\n async created() {\n this.user = await getCurrentUser();\n this.refreshData();\n },\n\n methods: {\n processResponse(): void {\n this.newCourseDialog = false;\n this.refreshData();\n },\n\n toggleShowMore() {\n this.showAllCourses = !this.showAllCourses;\n },\n\n async refreshData(): Promise<void> {\n console.log(`Pulling user course data...`);\n try {\n const userCourseIDs = (await this.user!.getCourseRegistrationsDoc()).courses\n .filter((c) => {\n return c.status === 'active' || c.status === 'maintenance-mode' || c.status === undefined;\n })\n .map((c) => {\n return c.courseID;\n });\n console.log(`userCourseIDs: ${userCourseIDs}`);\n\n this.existingCourses = (await getDataLayer().getCoursesDB().getCourseList()) as DBCourseConfig[];\n console.log(`existingCourses: \\n\\t${this.existingCourses.map((c) => c.name).join(',\\n\\t')}`);\n\n this.registeredCourses = this.existingCourses.filter((course) => {\n let match: boolean = false;\n userCourseIDs.forEach((id: string) => {\n if (course.courseID === id) {\n match = true;\n }\n });\n return match;\n });\n } catch (e) {\n console.error(`Error refreshing course data:`, e);\n alertUser({\n status: Status.error,\n text: `Failed to load courses: ${e || 'Database access error'}`,\n });\n }\n },\n async createCourse(): Promise<void> {\n this.awaitingCreateCourse = true;\n const resp = await serverRequest({\n type: ServerRequestType.CREATE_COURSE,\n data: {\n name: 'testCourseName',\n description: 'All of these courses will be the same!',\n public: true,\n deleted: false,\n creator: this.user!.getUsername(),\n admins: [this.user!.getUsername()],\n moderators: [],\n dataShapes: [],\n questionTypes: [],\n },\n user: this.user!.getUsername(),\n response: null,\n });\n\n alertUser({\n status: resp.response!,\n text: `Course ${JSON.stringify(resp)} created`,\n });\n this.awaitingCreateCourse = false;\n },\n\n async addCourse(course: string): Promise<void> {\n this.spinnerMap[course] = true;\n console.log(`Attempting to register for ${course}.`);\n await this.user?.registerForCourse(course);\n delete this.spinnerMap[course];\n this.refreshData();\n },\n\n async dropCourse(course: string): Promise<void> {\n this.spinnerMap[course] = true;\n console.log(`Attempting to drop ${course}.`);\n await this.user?.dropCourse(course);\n delete this.spinnerMap[course];\n this.refreshData();\n },\n },\n});\n</script>\n\n<style scoped>\n.component-fade-enter-active,\n.component-fade-leave-active {\n transition: all 0.65s ease;\n}\n.component-fade-enter,\n.component-fade-leave-to {\n opacity: 0;\n}\n.componnent-fade-move {\n transition: transform 1s;\n}\n</style>\n"],"names":["_sfc_main$1","defineComponent","name","props","courseId","type","String","required","emits","data","courseConfig","questionCount","isPrivate","updatePending","addingCourse","created","db","getDataLayer","getCourseDB","this","getCourseConfig","public","getCourseInfo","cardCount","e","console","error","methods","registerForCourse","log","getCurrentUser","$emit","navigateToInfo","path","replaceAll","$router","push","_sfc_main","components","NewCourseDialog","CourseStubCard","_ctx","_createBlock","_component_v_card","key","default","_withCtx","_createVNode","_component_v_card_item","_component_v_card_title","_createTextVNode","_toDisplayString","_component_v_icon","icon","class","_createCommentVNode","_","_component_v_card_text","_createElementVNode","description","_component_v_card_actions","_component_v_btn","color","onClick","_cache","loading","existingCourses","registeredCourses","awaitingCreateCourse","spinnerMap","newCourseDialog","user","myQuiltsPanel","showAllCourses","coursesPerPage","computed","availableCourses","filter","c","includes","getUsername","course","creator","admins","indexOf","moderators","displayedAvailableCourses","slice","hasMoreCourses","length","newCourseAttrs","attrs","on","click","refreshData","processResponse","toggleShowMore","userCourseIDs","getCourseRegistrationsDoc","courses","status","map","courseID","getCoursesDB","getCourseList","join","match","forEach","id","alertUser","Status","text","createCourse","resp","serverRequest","ServerRequestType","CREATE_COURSE","deleted","dataShapes","questionTypes","response","JSON","stringify","addCourse","dropCourse","_hoisted_1","_openBlock","_component_v_container","fluid","_mergeProps","fixed","location","size","_toHandlers","_component_v_row","_component_v_col","cols","_component_v_expansion_panels","modelValue","$event","_component_v_expansion_panel","_component_v_expansion_panel_title","_component_v_expansion_panel_text","_createElementBlock","_Fragment","_renderList","sm","md","lg","variant","density","_hoisted_2","_component_router_link","to","_component_course_stub_card","onRefresh","justify","_component_v_dialog","fullscreen","transition","scrim","_component_new_course_dialog","onCourseEditingComplete"],"mappings":"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"}
1
+ {"version":3,"file":"Courses-CS040Tw7.js","sources":["../../src/components/Courses/CourseStubCard.vue","../../src/views/Courses.vue"],"sourcesContent":["<template>\n <v-card v-if=\"!updatePending && courseConfig\" data-cy=\"available-course-card\">\n <v-card-item>\n <v-card-title data-cy=\"course-title\">\n {{ courseConfig.name }}\n <v-icon v-if=\"isPrivate\" icon=\"mdi-eye-off\" class=\"ml-2\"></v-icon>\n </v-card-title>\n </v-card-item>\n\n <v-card-text>\n Questions: {{ questionCount }}\n <p>{{ courseConfig.description }}</p>\n </v-card-text>\n\n <v-card-actions>\n <v-btn color=\"primary\" @click=\"navigateToInfo\">More Info</v-btn>\n <v-btn data-cy=\"register-course-button\" :loading=\"addingCourse\" color=\"primary\" @click=\"registerForCourse\">\n Register\n </v-btn>\n </v-card-actions>\n </v-card>\n</template>\n\n<script lang=\"ts\">\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\nimport { CourseConfig, log } from '@vue-skuilder/common';\nimport { getDataLayer } from '@vue-skuilder/db';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'CourseStubCard',\n\n props: {\n courseId: {\n type: String,\n required: true,\n },\n },\n emits: ['refresh'],\n\n data() {\n return {\n courseConfig: null as CourseConfig | null,\n questionCount: 0,\n isPrivate: false,\n updatePending: true,\n addingCourse: false,\n };\n },\n\n async created() {\n try {\n const db = getDataLayer().getCourseDB(this.courseId);\n this.courseConfig = (await db.getCourseConfig())!;\n this.isPrivate = !this.courseConfig.public;\n this.questionCount = (await db.getCourseInfo()).cardCount;\n this.updatePending = false;\n } catch (e) {\n console.error(`Error loading course ${this.courseId}: ${e}`);\n }\n },\n\n methods: {\n async registerForCourse() {\n this.addingCourse = true;\n log(`Attempting to register for ${this.courseId}.`);\n await (await getCurrentUser()).registerForCourse(this.courseId);\n this.$emit('refresh');\n },\n navigateToInfo() {\n const path = `/q/${this.courseConfig?.name.replaceAll(' ', '_')}`;\n this.$router.push(path);\n },\n },\n});\n</script>\n","<template>\n <v-container fluid>\n <!-- Fixed Action Button - Updated position classes -->\n <v-btn\n color=\"primary\"\n fixed\n location=\"bottom right\"\n icon=\"mdi-plus\"\n size=\"large\"\n class=\"mb-4 mr-4\"\n data-cy=\"create-course-fab\"\n v-bind=\"newCourseAttrs\"\n v-on=\"newCourseAttrs.on\"\n />\n\n <!-- Main Content Area -->\n <v-row>\n <!-- My Quilts Panel -->\n <v-col cols=\"12\">\n <v-expansion-panels v-model=\"myQuiltsPanel\">\n <v-expansion-panel>\n <v-expansion-panel-title data-cy=\"registered-quilts-panel\">My Registered Quilts</v-expansion-panel-title>\n <v-expansion-panel-text>\n <v-row>\n <v-col v-for=\"course in registeredCourses\" :key=\"course.courseID\" cols=\"12\" sm=\"6\" md=\"4\" lg=\"3\">\n <v-card variant=\"outlined\" density=\"compact\" class=\"pa-2\">\n <div class=\"d-flex align-center justify-space-between\">\n <div data-cy=\"registered-course\" class=\"d-flex align-center\">\n <router-link\n :to=\"`/q/${course.name.replaceAll(' ', '_')}`\"\n class=\"text-subtitle-2\"\n data-cy=\"registered-course-title\"\n >\n {{ course.name }}\n </router-link>\n <v-icon v-if=\"!course.public\" size=\"x-small\" class=\"ml-1\">mdi-eye-off</v-icon>\n </div>\n <v-btn\n size=\"x-small\"\n variant=\"text\"\n color=\"error\"\n data-cy=\"drop-course-button\"\n :loading=\"spinnerMap[course.courseID] !== undefined\"\n @click=\"dropCourse(course.courseID)\"\n >\n Drop\n </v-btn>\n </div>\n </v-card>\n </v-col>\n </v-row>\n </v-expansion-panel-text>\n </v-expansion-panel>\n </v-expansion-panels>\n </v-col>\n\n <!-- Available Quilts Section -->\n <v-col cols=\"12\" class=\"mt-4\">\n <h2 class=\"text-h5 mb-3\">Available Quilts</h2>\n <v-row>\n <v-col v-for=\"course in displayedAvailableCourses\" :key=\"course.courseID\" cols=\"12\" sm=\"6\" md=\"4\" lg=\"3\">\n <course-stub-card data-cy=\"available-course-card\" :course-id=\"course.courseID\" @refresh=\"refreshData\" />\n </v-col>\n </v-row>\n\n <!-- Show More Button -->\n <v-row v-if=\"hasMoreCourses\" justify=\"center\" class=\"mt-2\">\n <v-btn variant=\"text\" color=\"primary\" data-cy=\"courses-show-more-button\" @click=\"toggleShowMore\">\n {{ showAllCourses ? 'Show Less' : 'Show More' }}\n </v-btn>\n </v-row>\n </v-col>\n </v-row>\n\n <!-- New Course Dialog -->\n <v-dialog v-model=\"newCourseDialog\" fullscreen transition=\"dialog-bottom-transition\" :scrim=\"false\">\n <new-course-dialog @course-editing-complete=\"processResponse()\" />\n </v-dialog>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport NewCourseDialog from '@pui/components/Courses/NewCourseDialog.vue';\nimport CourseStubCard from '@pui/components/Courses/CourseStubCard.vue';\n\nimport serverRequest from '../server';\nimport { ServerRequestType, CourseConfig, Status } from '@vue-skuilder/common';\nimport { alertUser, getCurrentUser } from '@vue-skuilder/common-ui';\nimport { UserDBInterface, getDataLayer } from '@vue-skuilder/db';\n\ntype DBCourseConfig = CourseConfig & {\n courseID: string;\n};\n\nexport default defineComponent({\n name: 'CoursesView',\n\n components: {\n NewCourseDialog,\n CourseStubCard,\n },\n\n data() {\n return {\n existingCourses: [] as DBCourseConfig[],\n registeredCourses: [] as DBCourseConfig[],\n awaitingCreateCourse: false,\n spinnerMap: {} as { [key: string]: boolean },\n newCourseDialog: false,\n user: null as UserDBInterface | null,\n myQuiltsPanel: 0, // Controls expansion panel\n showAllCourses: false,\n coursesPerPage: 8,\n };\n },\n\n computed: {\n availableCourses(): DBCourseConfig[] {\n const availableCourses = this.existingCourses.filter((c) => !this.registeredCourses.includes(c));\n const user = this.user?.getUsername();\n\n const viewableCourses = availableCourses.filter((course) => {\n if (!user) {\n return false;\n }\n const viewable: boolean =\n course.public ||\n course.creator === user ||\n course.admins.indexOf(user) !== -1 ||\n course.moderators.indexOf(user) !== -1;\n\n return viewable;\n });\n\n return viewableCourses;\n },\n displayedAvailableCourses(): DBCourseConfig[] {\n if (this.showAllCourses) {\n return this.availableCourses;\n }\n return this.availableCourses.slice(0, this.coursesPerPage);\n },\n\n hasMoreCourses(): boolean {\n return this.availableCourses.length > this.coursesPerPage;\n },\n\n newCourseAttrs() {\n return {\n attrs: {\n 'aria-label': 'Create new quilt',\n },\n on: {\n click: () => (this.newCourseDialog = true),\n },\n };\n },\n },\n\n async created() {\n this.user = await getCurrentUser();\n this.refreshData();\n },\n\n methods: {\n processResponse(): void {\n this.newCourseDialog = false;\n this.refreshData();\n },\n\n toggleShowMore() {\n this.showAllCourses = !this.showAllCourses;\n },\n\n async refreshData(): Promise<void> {\n console.log(`Pulling user course data...`);\n try {\n const userCourseIDs = (await this.user!.getCourseRegistrationsDoc()).courses\n .filter((c) => {\n return c.status === 'active' || c.status === 'maintenance-mode' || c.status === undefined;\n })\n .map((c) => {\n return c.courseID;\n });\n console.log(`userCourseIDs: ${userCourseIDs}`);\n\n this.existingCourses = (await getDataLayer().getCoursesDB().getCourseList()) as DBCourseConfig[];\n console.log(`existingCourses: \\n\\t${this.existingCourses.map((c) => c.name).join(',\\n\\t')}`);\n\n this.registeredCourses = this.existingCourses.filter((course) => {\n let match: boolean = false;\n userCourseIDs.forEach((id: string) => {\n if (course.courseID === id) {\n match = true;\n }\n });\n return match;\n });\n } catch (e) {\n console.error(`Error refreshing course data:`, e);\n alertUser({\n status: Status.error,\n text: `Failed to load courses: ${e || 'Database access error'}`,\n });\n }\n },\n async createCourse(): Promise<void> {\n this.awaitingCreateCourse = true;\n const resp = await serverRequest({\n type: ServerRequestType.CREATE_COURSE,\n data: {\n name: 'testCourseName',\n description: 'All of these courses will be the same!',\n public: true,\n deleted: false,\n creator: this.user!.getUsername(),\n admins: [this.user!.getUsername()],\n moderators: [],\n dataShapes: [],\n questionTypes: [],\n },\n user: this.user!.getUsername(),\n response: null,\n });\n\n alertUser({\n status: resp.response!,\n text: `Course ${JSON.stringify(resp)} created`,\n });\n this.awaitingCreateCourse = false;\n },\n\n async addCourse(course: string): Promise<void> {\n this.spinnerMap[course] = true;\n console.log(`Attempting to register for ${course}.`);\n await this.user?.registerForCourse(course);\n delete this.spinnerMap[course];\n this.refreshData();\n },\n\n async dropCourse(course: string): Promise<void> {\n this.spinnerMap[course] = true;\n console.log(`Attempting to drop ${course}.`);\n await this.user?.dropCourse(course);\n delete this.spinnerMap[course];\n this.refreshData();\n },\n },\n});\n</script>\n\n<style scoped>\n.component-fade-enter-active,\n.component-fade-leave-active {\n transition: all 0.65s ease;\n}\n.component-fade-enter,\n.component-fade-leave-to {\n opacity: 0;\n}\n.componnent-fade-move {\n transition: transform 1s;\n}\n</style>\n"],"names":["_sfc_main$1","defineComponent","name","props","courseId","type","String","required","emits","data","courseConfig","questionCount","isPrivate","updatePending","addingCourse","created","db","getDataLayer","getCourseDB","this","getCourseConfig","public","getCourseInfo","cardCount","e","console","error","methods","registerForCourse","log","getCurrentUser","$emit","navigateToInfo","path","replaceAll","$router","push","_sfc_main","components","NewCourseDialog","CourseStubCard","_ctx","_createBlock","_component_v_card","key","default","_withCtx","_createVNode","_component_v_card_item","_component_v_card_title","_createTextVNode","_toDisplayString","_component_v_icon","icon","class","_createCommentVNode","_","_component_v_card_text","_createElementVNode","description","_component_v_card_actions","_component_v_btn","color","onClick","_cache","loading","existingCourses","registeredCourses","awaitingCreateCourse","spinnerMap","newCourseDialog","user","myQuiltsPanel","showAllCourses","coursesPerPage","computed","availableCourses","filter","c","includes","getUsername","course","creator","admins","indexOf","moderators","displayedAvailableCourses","slice","hasMoreCourses","length","newCourseAttrs","attrs","on","click","refreshData","processResponse","toggleShowMore","userCourseIDs","getCourseRegistrationsDoc","courses","status","map","courseID","getCoursesDB","getCourseList","join","match","forEach","id","alertUser","Status","text","createCourse","resp","serverRequest","ServerRequestType","CREATE_COURSE","deleted","dataShapes","questionTypes","response","JSON","stringify","addCourse","dropCourse","_hoisted_1","_openBlock","_component_v_container","fluid","_mergeProps","fixed","location","size","_toHandlers","_component_v_row","_component_v_col","cols","_component_v_expansion_panels","modelValue","$event","_component_v_expansion_panel","_component_v_expansion_panel_title","_component_v_expansion_panel_text","_createElementBlock","_Fragment","_renderList","sm","md","lg","variant","density","_hoisted_2","_component_router_link","to","_component_course_stub_card","onRefresh","justify","_component_v_dialog","fullscreen","transition","scrim","_component_new_course_dialog","onCourseEditingComplete"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{DataInputForm as e}from"./edit-ui.es-DGbs4pNc.js";import{d as t,X as o,O as a,_ as n,r as s,f as r,o as i,c}from"./index-PISHyq1I.js";import"./index-CSo_psn8.js";const p=Object.assign({}),d=t({name:"DataInputFormTester",components:{DataInputForm:e},setup:()=>({route:a()}),data:()=>({dataShape:null,cds:null,component:null}),async created(){try{const e=`../${this.route.params.pathMatch}/index.ts`;if(console.log("Looking for module:",e),console.log("Available paths:",Object.keys(p)),!(e in p))throw new Error(`No module found at path: ${e}`);{const t=await p[e](),a=Object.entries(t).find((([e,t])=>{const a="function"==typeof t,n=a&&t.prototype instanceof o;return console.log(`Checking export "${e}":`,{isClass:a,extendsQuestion:n,type:typeof t}),n}));if(!a)throw new Error("No export found extending Question class");this.component=a[1];const n=this.component?.dataShapes[0];n&&(this.dataShape=n)}}catch(e){console.log("[difTester] Error loading component",e)}}}),l={key:1};const u=n(d,[["render",function(e,t,o,a,n,p){const d=s("data-input-form");return i(),r("div",null,[e.component&&e.dataShape?(i(),c(d,{key:0,"data-shape":e.dataShape,"course-cfg":{courseID:"testCourse",name:"testCourseName",description:"All of these courses will be the same!",admins:["admin"],creator:"admin",deleted:!1,moderators:[],public:!0,disambiguator:"testCourseName",questionTypes:[],dataShapes:[]},"preview-component":e.component},null,8,["data-shape","preview-component"])):(i(),r("div",l," No component loaded :/ "))])}]]);export{u as default};
2
- //# sourceMappingURL=DataInputFormTester-CL0gV9cw.js.map
1
+ import{DataInputForm as e}from"./edit-ui.es-1BaJ_I4B.js";import{d as t,X as o,O as a,_ as n,r as s,f as r,o as i,c}from"./index-2oekPD75.js";import"./index-DHivZCyO.js";const p=Object.assign({}),d=t({name:"DataInputFormTester",components:{DataInputForm:e},setup:()=>({route:a()}),data:()=>({dataShape:null,cds:null,component:null}),async created(){try{const e=`../${this.route.params.pathMatch}/index.ts`;if(console.log("Looking for module:",e),console.log("Available paths:",Object.keys(p)),!(e in p))throw new Error(`No module found at path: ${e}`);{const t=await p[e](),a=Object.entries(t).find((([e,t])=>{const a="function"==typeof t,n=a&&t.prototype instanceof o;return console.log(`Checking export "${e}":`,{isClass:a,extendsQuestion:n,type:typeof t}),n}));if(!a)throw new Error("No export found extending Question class");this.component=a[1];const n=this.component?.dataShapes[0];n&&(this.dataShape=n)}}catch(e){console.log("[difTester] Error loading component",e)}}}),l={key:1};const u=n(d,[["render",function(e,t,o,a,n,p){const d=s("data-input-form");return i(),r("div",null,[e.component&&e.dataShape?(i(),c(d,{key:0,"data-shape":e.dataShape,"course-cfg":{courseID:"testCourse",name:"testCourseName",description:"All of these courses will be the same!",admins:["admin"],creator:"admin",deleted:!1,moderators:[],public:!0,disambiguator:"testCourseName",questionTypes:[],dataShapes:[]},"preview-component":e.component},null,8,["data-shape","preview-component"])):(i(),r("div",l," No component loaded :/ "))])}]]);export{u as default};
2
+ //# sourceMappingURL=DataInputFormTester-pEuS9Phg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataInputFormTester-CL0gV9cw.js","sources":["../../src/dev/DataInputFormTester.vue"],"sourcesContent":["<template>\n <div>\n <data-input-form\n v-if=\"component && dataShape\"\n :data-shape=\"dataShape\"\n :course-cfg=\"{\n courseID: 'testCourse',\n name: 'testCourseName',\n description: 'All of these courses will be the same!',\n admins: ['admin'],\n creator: 'admin',\n deleted: false,\n moderators: [],\n public: true,\n disambiguator: 'testCourseName',\n questionTypes: [],\n dataShapes: [],\n }\"\n :preview-component=\"component\"\n />\n <div v-else>\n No component loaded :/\n <!--\n\n todo: provide list of Question type components, with router links\n to their DataInputFormTester loaders.\n\n --></div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { DataInputForm } from '@vue-skuilder/edit-ui';\nimport { DataShape } from '../../src/base-course/Interfaces/DataShape';\nimport { useRoute } from 'vue-router';\nimport { Question } from '@vue-skuilder/common-ui';\n\ntype CourseShapes = {\n courseID: string;\n dataShapes: DataShape[];\n};\n\nconst questionModules = import.meta.glob('../**/questions/**/index.ts', {\n // Adding eager: false ensures lazy loading\n eager: false,\n});\n\ntype ModuleExports = {\n [key: string]: unknown;\n};\n\nexport default defineComponent({\n name: 'DataInputFormTester',\n\n components: {\n DataInputForm,\n },\n\n setup() {\n return {\n route: useRoute(),\n };\n },\n\n data() {\n return {\n dataShape: null as DataShape | null,\n cds: null as CourseShapes[] | null,\n component: null as typeof Question | null,\n };\n },\n\n async created() {\n try {\n const q = this.route.params.pathMatch;\n const modulePath = `../${q}/index.ts`;\n\n console.log('Looking for module:', modulePath);\n console.log('Available paths:', Object.keys(questionModules));\n\n if (modulePath in questionModules) {\n const module = (await questionModules[modulePath]()) as ModuleExports;\n\n // Find the Question implementation\n const matchingExport = Object.entries(module).find(([name, exportValue]) => {\n const isClass = typeof exportValue === 'function';\n const extendsQuestion = isClass && exportValue.prototype instanceof Question;\n\n console.log(`Checking export \"${name}\":`, {\n isClass,\n extendsQuestion,\n type: typeof exportValue,\n });\n\n return extendsQuestion;\n });\n\n if (!matchingExport) {\n throw new Error('No export found extending Question class');\n }\n\n this.component = matchingExport[1] as typeof Question;\n\n const ds = this.component?.dataShapes[0];\n if (ds) {\n this.dataShape = ds;\n }\n } else {\n throw new Error(`No module found at path: ${modulePath}`);\n }\n } catch (e) {\n console.log('[difTester] Error loading component', e);\n }\n },\n});\n</script>\n"],"names":["questionModules","Object","assign","_sfc_main","defineComponent","name","components","DataInputForm","setup","route","useRoute","data","dataShape","cds","component","created","modulePath","this","params","pathMatch","console","log","keys","Error","module","matchingExport","entries","find","exportValue","isClass","extendsQuestion","prototype","Question","type","ds","dataShapes","e","_hoisted_1","key","_createElementBlock","_ctx","_createBlock","_component_data_input_form","courseID","_openBlock"],"mappings":"yKA2CA,MAAMA,EAAkBC,OAAAC,OAAA,CAAA,GASxBC,EAAeC,EAAgB,CAC7BC,KAAM,sBAENC,WAAY,CAAAC,cACVA,GAGFC,MAAA,KACS,CACLC,MAAOC,MAIXC,KAAA,KACS,CACLC,UAAW,KACXC,IAAK,KACLC,UAAW,OAIf,aAAMC,GACJ,IACE,MACMC,EAAa,MADTC,KAAKR,MAAMS,OAAOC,qBAM5B,GAHAC,QAAQC,IAAI,sBAAuBL,GACnCI,QAAQC,IAAI,mBAAoBpB,OAAOqB,KAAKtB,MAExCgB,KAAchB,GA4BhB,MAAM,IAAIuB,MAAM,4BAA4BP,KA5BX,CACjC,MAAMQ,QAAgBxB,EAAgBgB,KAGhCS,EAAiBxB,OAAOyB,QAAQF,GAAQG,MAAK,EAAEtB,EAAMuB,MACzD,MAAMC,EAAiC,mBAAhBD,EACjBE,EAAkBD,GAAWD,EAAYG,qBAAqBC,EAQpE,OANAZ,QAAQC,IAAI,oBAAoBhB,MAAU,CACxCwB,UACAC,kBACAG,YAAaL,IAGRE,CAAA,IAGT,IAAKL,EACH,MAAM,IAAIF,MAAM,4CAGlBN,KAAKH,UAAYW,EAAe,GAEhC,MAAMS,EAAKjB,KAAKH,WAAWqB,WAAW,GAClCD,IACFjB,KAAKL,UAAYsB,EAErB,CAGF,OAASE,GACPhB,QAAQC,IAAI,sCAAuCe,EACrD,CACF,IAlHFC,EAAA,CAAAC,IAAA,wFACEC,EA2BM,MAAA,KAAA,CAzBIC,EAAA1B,WAAa0B,iBADrBC,EAiBEC,EAAA,CAnBNJ,IAAA,EAIO,aAAYE,EAAA5B,UACZ,aAAY,CAAA+B,SAAA,2NAaZ,oBAAmBH,EAAA1B,WAAA,KAAA,EAAA,CAAA,aAAA,wBAAA8B,IAEtBL,EAOS,MA3BbF,EAoBgB"}
1
+ {"version":3,"file":"DataInputFormTester-pEuS9Phg.js","sources":["../../src/dev/DataInputFormTester.vue"],"sourcesContent":["<template>\n <div>\n <data-input-form\n v-if=\"component && dataShape\"\n :data-shape=\"dataShape\"\n :course-cfg=\"{\n courseID: 'testCourse',\n name: 'testCourseName',\n description: 'All of these courses will be the same!',\n admins: ['admin'],\n creator: 'admin',\n deleted: false,\n moderators: [],\n public: true,\n disambiguator: 'testCourseName',\n questionTypes: [],\n dataShapes: [],\n }\"\n :preview-component=\"component\"\n />\n <div v-else>\n No component loaded :/\n <!--\n\n todo: provide list of Question type components, with router links\n to their DataInputFormTester loaders.\n\n --></div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { DataInputForm } from '@vue-skuilder/edit-ui';\nimport { DataShape } from '../../src/base-course/Interfaces/DataShape';\nimport { useRoute } from 'vue-router';\nimport { Question } from '@vue-skuilder/common-ui';\n\ntype CourseShapes = {\n courseID: string;\n dataShapes: DataShape[];\n};\n\nconst questionModules = import.meta.glob('../**/questions/**/index.ts', {\n // Adding eager: false ensures lazy loading\n eager: false,\n});\n\ntype ModuleExports = {\n [key: string]: unknown;\n};\n\nexport default defineComponent({\n name: 'DataInputFormTester',\n\n components: {\n DataInputForm,\n },\n\n setup() {\n return {\n route: useRoute(),\n };\n },\n\n data() {\n return {\n dataShape: null as DataShape | null,\n cds: null as CourseShapes[] | null,\n component: null as typeof Question | null,\n };\n },\n\n async created() {\n try {\n const q = this.route.params.pathMatch;\n const modulePath = `../${q}/index.ts`;\n\n console.log('Looking for module:', modulePath);\n console.log('Available paths:', Object.keys(questionModules));\n\n if (modulePath in questionModules) {\n const module = (await questionModules[modulePath]()) as ModuleExports;\n\n // Find the Question implementation\n const matchingExport = Object.entries(module).find(([name, exportValue]) => {\n const isClass = typeof exportValue === 'function';\n const extendsQuestion = isClass && exportValue.prototype instanceof Question;\n\n console.log(`Checking export \"${name}\":`, {\n isClass,\n extendsQuestion,\n type: typeof exportValue,\n });\n\n return extendsQuestion;\n });\n\n if (!matchingExport) {\n throw new Error('No export found extending Question class');\n }\n\n this.component = matchingExport[1] as typeof Question;\n\n const ds = this.component?.dataShapes[0];\n if (ds) {\n this.dataShape = ds;\n }\n } else {\n throw new Error(`No module found at path: ${modulePath}`);\n }\n } catch (e) {\n console.log('[difTester] Error loading component', e);\n }\n },\n});\n</script>\n"],"names":["questionModules","Object","assign","_sfc_main","defineComponent","name","components","DataInputForm","setup","route","useRoute","data","dataShape","cds","component","created","modulePath","this","params","pathMatch","console","log","keys","Error","module","matchingExport","entries","find","exportValue","isClass","extendsQuestion","prototype","Question","type","ds","dataShapes","e","_hoisted_1","key","_createElementBlock","_ctx","_createBlock","_component_data_input_form","courseID","_openBlock"],"mappings":"yKA2CA,MAAMA,EAAkBC,OAAAC,OAAA,CAAA,GASxBC,EAAeC,EAAgB,CAC7BC,KAAM,sBAENC,WAAY,CAAAC,cACVA,GAGFC,MAAA,KACS,CACLC,MAAOC,MAIXC,KAAA,KACS,CACLC,UAAW,KACXC,IAAK,KACLC,UAAW,OAIf,aAAMC,GACJ,IACE,MACMC,EAAa,MADTC,KAAKR,MAAMS,OAAOC,qBAM5B,GAHAC,QAAQC,IAAI,sBAAuBL,GACnCI,QAAQC,IAAI,mBAAoBpB,OAAOqB,KAAKtB,MAExCgB,KAAchB,GA4BhB,MAAM,IAAIuB,MAAM,4BAA4BP,KA5BX,CACjC,MAAMQ,QAAgBxB,EAAgBgB,KAGhCS,EAAiBxB,OAAOyB,QAAQF,GAAQG,MAAK,EAAEtB,EAAMuB,MACzD,MAAMC,EAAiC,mBAAhBD,EACjBE,EAAkBD,GAAWD,EAAYG,qBAAqBC,EAQpE,OANAZ,QAAQC,IAAI,oBAAoBhB,MAAU,CACxCwB,UACAC,kBACAG,YAAaL,IAGRE,CAAA,IAGT,IAAKL,EACH,MAAM,IAAIF,MAAM,4CAGlBN,KAAKH,UAAYW,EAAe,GAEhC,MAAMS,EAAKjB,KAAKH,WAAWqB,WAAW,GAClCD,IACFjB,KAAKL,UAAYsB,EAErB,CAGF,OAASE,GACPhB,QAAQC,IAAI,sCAAuCe,EACrD,CACF,IAlHFC,EAAA,CAAAC,IAAA,wFACEC,EA2BM,MAAA,KAAA,CAzBIC,EAAA1B,WAAa0B,iBADrBC,EAiBEC,EAAA,CAnBNJ,IAAA,EAIO,aAAYE,EAAA5B,UACZ,aAAY,CAAA+B,SAAA,2NAaZ,oBAAmBH,EAAA1B,WAAA,KAAA,EAAA,CAAA,aAAA,wBAAA8B,IAEtBL,EAOS,MA3BbF,EAoBgB"}
@@ -1,2 +1,2 @@
1
- import{d as e,S as s,A as a,g as l,_ as d,r as i,c as o,h as t,o as u,w as r,a as c,b as n,e as h}from"./index-PISHyq1I.js";import{allCourseWare as f}from"./index-CSo_psn8.js";const p=d(e({name:"ELOModerator",components:{CardLoader:s},props:{courseId:{type:String,required:!0}},data:()=>({courseDB:null,updatePending:!0,courseConfig:null,cards:[],id1:null,id2:null,elo1:null,elo2:null,viewLookup:f.getView}),async created(){this.courseDB=l().getCourseDB(this.courseId),this.courseConfig=await this.courseDB.getCourseConfig(),await this.getNewCards()},methods:{vote(e){if(!this.elo1||!this.elo2)return;const s=a(this.elo1,this.elo2,"a"===e?1:0,{globalOnly:!0});this.courseDB.updateCardElo(this.cards[0].cardId,s.userElo),this.courseDB.updateCardElo(this.cards[1].cardId,s.cardElo),this.getNewCards()},async getNewCards(){this.courseDB&&(this.updatePending=!0,this.cards=await this.courseDB.getInexperiencedCards(),this.id1=null,this.id2=null,this.id1={courseID:this.courseId,cardID:this.cards[0].cardId},this.id2={courseID:this.courseId,cardID:this.cards[1].cardId},this.elo1=this.cards[0].elo,this.elo2=this.cards[1].elo,this.updatePending=!1)}}}),[["render",function(e,s,a,l,d,f){const p=i("v-col"),_=i("v-row"),g=i("v-icon"),v=i("v-btn"),w=i("card-loader"),m=i("v-container");return e.updatePending?t("",!0):(u(),o(m,{key:0},{default:r((()=>[c(_,null,{default:r((()=>[c(p,{cols:"12"},{default:r((()=>s[2]||(s[2]=[n("h1",null,[h("Which seems "),n("em",null,"harder"),h("?")],-1)]))),_:1})])),_:1}),c(_,null,{default:r((()=>[c(p,null,{default:r((()=>[c(v,{color:"success",class:"ma-5",onClick:s[0]||(s[0]=s=>e.vote("a"))},{default:r((()=>[c(g,null,{default:r((()=>s[3]||(s[3]=[h("mdi-check")]))),_:1})])),_:1}),c(w,{class:"ma-2",qualified_id:e.id1,"view-lookup":e.viewLookup},null,8,["qualified_id","view-lookup"])])),_:1})])),_:1}),c(_,null,{default:r((()=>[c(p,null,{default:r((()=>[c(v,{color:"success",class:"ma-5",onClick:s[1]||(s[1]=s=>e.vote("b"))},{default:r((()=>[c(g,null,{default:r((()=>s[4]||(s[4]=[h("mdi-check")]))),_:1})])),_:1}),c(w,{class:"ma-2",qualified_id:e.id2,"view-lookup":e.viewLookup},null,8,["qualified_id","view-lookup"])])),_:1})])),_:1})])),_:1}))}],["__scopeId","data-v-df68b8b6"]]);export{p as default};
2
- //# sourceMappingURL=EloModeration-DfSLA79x.js.map
1
+ import{d as e,S as s,A as a,g as l,_ as d,r as i,c as o,h as t,o as u,w as r,a as c,b as n,e as h}from"./index-2oekPD75.js";import{allCourseWare as f}from"./index-DHivZCyO.js";const p=d(e({name:"ELOModerator",components:{CardLoader:s},props:{courseId:{type:String,required:!0}},data:()=>({courseDB:null,updatePending:!0,courseConfig:null,cards:[],id1:null,id2:null,elo1:null,elo2:null,viewLookup:f.getView}),async created(){this.courseDB=l().getCourseDB(this.courseId),this.courseConfig=await this.courseDB.getCourseConfig(),await this.getNewCards()},methods:{vote(e){if(!this.elo1||!this.elo2)return;const s=a(this.elo1,this.elo2,"a"===e?1:0,{globalOnly:!0});this.courseDB.updateCardElo(this.cards[0].cardId,s.userElo),this.courseDB.updateCardElo(this.cards[1].cardId,s.cardElo),this.getNewCards()},async getNewCards(){this.courseDB&&(this.updatePending=!0,this.cards=await this.courseDB.getInexperiencedCards(),this.id1=null,this.id2=null,this.id1={courseID:this.courseId,cardID:this.cards[0].cardId},this.id2={courseID:this.courseId,cardID:this.cards[1].cardId},this.elo1=this.cards[0].elo,this.elo2=this.cards[1].elo,this.updatePending=!1)}}}),[["render",function(e,s,a,l,d,f){const p=i("v-col"),_=i("v-row"),g=i("v-icon"),v=i("v-btn"),w=i("card-loader"),m=i("v-container");return e.updatePending?t("",!0):(u(),o(m,{key:0},{default:r((()=>[c(_,null,{default:r((()=>[c(p,{cols:"12"},{default:r((()=>s[2]||(s[2]=[n("h1",null,[h("Which seems "),n("em",null,"harder"),h("?")],-1)]))),_:1})])),_:1}),c(_,null,{default:r((()=>[c(p,null,{default:r((()=>[c(v,{color:"success",class:"ma-5",onClick:s[0]||(s[0]=s=>e.vote("a"))},{default:r((()=>[c(g,null,{default:r((()=>s[3]||(s[3]=[h("mdi-check")]))),_:1})])),_:1}),c(w,{class:"ma-2",qualified_id:e.id1,"view-lookup":e.viewLookup},null,8,["qualified_id","view-lookup"])])),_:1})])),_:1}),c(_,null,{default:r((()=>[c(p,null,{default:r((()=>[c(v,{color:"success",class:"ma-5",onClick:s[1]||(s[1]=s=>e.vote("b"))},{default:r((()=>[c(g,null,{default:r((()=>s[4]||(s[4]=[h("mdi-check")]))),_:1})])),_:1}),c(w,{class:"ma-2",qualified_id:e.id2,"view-lookup":e.viewLookup},null,8,["qualified_id","view-lookup"])])),_:1})])),_:1})])),_:1}))}],["__scopeId","data-v-df68b8b6"]]);export{p as default};
2
+ //# sourceMappingURL=EloModeration-CeIw0EQK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EloModeration-DfSLA79x.js","sources":["../../src/components/Courses/EloModeration.vue"],"sourcesContent":["<template>\n <v-container v-if=\"!updatePending\">\n <v-row>\n <v-col cols=\"12\">\n <h1>Which seems <em>harder</em>?</h1>\n </v-col>\n </v-row>\n\n <v-row>\n <v-col>\n <v-btn color=\"success\" class=\"ma-5\" @click=\"vote('a')\">\n <v-icon>mdi-check</v-icon>\n </v-btn>\n <card-loader class=\"ma-2\" :qualified_id=\"id1\" :view-lookup=\"viewLookup\" />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col>\n <v-btn color=\"success\" class=\"ma-5\" @click=\"vote('b')\">\n <v-icon>mdi-check</v-icon>\n </v-btn>\n <card-loader class=\"ma-2\" :qualified_id=\"id2\" :view-lookup=\"viewLookup\" />\n </v-col>\n </v-row>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { CardLoader } from '@vue-skuilder/common-ui';\nimport { allCourseWare } from '@vue-skuilder/courseware';\nimport { CourseElo, adjustCourseScores, CourseConfig } from '@vue-skuilder/common';\nimport { CourseDBInterface, getDataLayer, QualifiedCardID } from '@vue-skuilder/db';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'ELOModerator',\n\n components: {\n CardLoader,\n },\n\n props: {\n courseId: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n courseDB: null as CourseDBInterface | null,\n updatePending: true,\n courseConfig: null as CourseConfig | null,\n cards: [] as {\n courseId: string;\n cardId: string;\n elo: CourseElo;\n count: number;\n }[],\n id1: null as QualifiedCardID | null,\n id2: null as QualifiedCardID | null,\n elo1: null as CourseElo | null,\n elo2: null as CourseElo | null,\n viewLookup: allCourseWare.getView,\n };\n },\n\n async created() {\n this.courseDB = getDataLayer().getCourseDB(this.courseId);\n\n this.courseConfig = (await this.courseDB!.getCourseConfig())!;\n await this.getNewCards();\n },\n\n methods: {\n vote(x: 'a' | 'b') {\n if (!this.elo1 || !this.elo2) return;\n\n const scores = adjustCourseScores(this.elo1, this.elo2, x === 'a' ? 1 : 0, {\n globalOnly: true,\n });\n\n this.courseDB!.updateCardElo(this.cards[0].cardId, scores.userElo);\n this.courseDB!.updateCardElo(this.cards[1].cardId, scores.cardElo);\n\n this.getNewCards();\n },\n\n async getNewCards() {\n if (!this.courseDB) return;\n\n this.updatePending = true;\n this.cards = await this.courseDB!.getInexperiencedCards();\n\n // console.log('Comparing:\\n\\t' + JSON.stringify(this.cards));\n\n this.id1 = null;\n this.id2 = null;\n\n this.id1 = {\n courseID: this.courseId,\n cardID: this.cards[0].cardId,\n };\n this.id2 = {\n courseID: this.courseId,\n cardID: this.cards[1].cardId,\n };\n\n this.elo1 = this.cards[0].elo;\n this.elo2 = this.cards[1].elo;\n\n this.updatePending = false;\n },\n },\n});\n</script>\n\n<style scoped>\n.component-fade-enter-active,\n.component-fade-leave-active {\n transition: opacity 0.5s ease;\n}\n.component-fade-enter, .component-fade-leave-to\n/* .component-fade-leave-active below version 2.1.8 */ {\n opacity: 0;\n}\n</style>\n"],"names":["defineComponent","name","components","CardLoader","props","courseId","type","String","required","data","courseDB","updatePending","courseConfig","cards","id1","id2","elo1","elo2","viewLookup","allCourseWare","getView","created","this","getDataLayer","getCourseDB","getCourseConfig","getNewCards","methods","vote","x","scores","adjustCourseScores","globalOnly","updateCardElo","cardId","userElo","cardElo","getInexperiencedCards","courseID","cardID","elo","_ctx","_createCommentVNode","_openBlock","_createBlock","_component_v_container","key","default","_withCtx","_createVNode","_component_v_row","_component_v_col","cols","_cache","_createElementVNode","_createTextVNode","_","_component_v_btn","color","class","onClick","_component_v_icon","_component_card_loader","qualified_id"],"mappings":"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"}
1
+ {"version":3,"file":"EloModeration-CeIw0EQK.js","sources":["../../src/components/Courses/EloModeration.vue"],"sourcesContent":["<template>\n <v-container v-if=\"!updatePending\">\n <v-row>\n <v-col cols=\"12\">\n <h1>Which seems <em>harder</em>?</h1>\n </v-col>\n </v-row>\n\n <v-row>\n <v-col>\n <v-btn color=\"success\" class=\"ma-5\" @click=\"vote('a')\">\n <v-icon>mdi-check</v-icon>\n </v-btn>\n <card-loader class=\"ma-2\" :qualified_id=\"id1\" :view-lookup=\"viewLookup\" />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col>\n <v-btn color=\"success\" class=\"ma-5\" @click=\"vote('b')\">\n <v-icon>mdi-check</v-icon>\n </v-btn>\n <card-loader class=\"ma-2\" :qualified_id=\"id2\" :view-lookup=\"viewLookup\" />\n </v-col>\n </v-row>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { CardLoader } from '@vue-skuilder/common-ui';\nimport { allCourseWare } from '@vue-skuilder/courseware';\nimport { CourseElo, adjustCourseScores, CourseConfig } from '@vue-skuilder/common';\nimport { CourseDBInterface, getDataLayer, QualifiedCardID } from '@vue-skuilder/db';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'ELOModerator',\n\n components: {\n CardLoader,\n },\n\n props: {\n courseId: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n courseDB: null as CourseDBInterface | null,\n updatePending: true,\n courseConfig: null as CourseConfig | null,\n cards: [] as {\n courseId: string;\n cardId: string;\n elo: CourseElo;\n count: number;\n }[],\n id1: null as QualifiedCardID | null,\n id2: null as QualifiedCardID | null,\n elo1: null as CourseElo | null,\n elo2: null as CourseElo | null,\n viewLookup: allCourseWare.getView,\n };\n },\n\n async created() {\n this.courseDB = getDataLayer().getCourseDB(this.courseId);\n\n this.courseConfig = (await this.courseDB!.getCourseConfig())!;\n await this.getNewCards();\n },\n\n methods: {\n vote(x: 'a' | 'b') {\n if (!this.elo1 || !this.elo2) return;\n\n const scores = adjustCourseScores(this.elo1, this.elo2, x === 'a' ? 1 : 0, {\n globalOnly: true,\n });\n\n this.courseDB!.updateCardElo(this.cards[0].cardId, scores.userElo);\n this.courseDB!.updateCardElo(this.cards[1].cardId, scores.cardElo);\n\n this.getNewCards();\n },\n\n async getNewCards() {\n if (!this.courseDB) return;\n\n this.updatePending = true;\n this.cards = await this.courseDB!.getInexperiencedCards();\n\n // console.log('Comparing:\\n\\t' + JSON.stringify(this.cards));\n\n this.id1 = null;\n this.id2 = null;\n\n this.id1 = {\n courseID: this.courseId,\n cardID: this.cards[0].cardId,\n };\n this.id2 = {\n courseID: this.courseId,\n cardID: this.cards[1].cardId,\n };\n\n this.elo1 = this.cards[0].elo;\n this.elo2 = this.cards[1].elo;\n\n this.updatePending = false;\n },\n },\n});\n</script>\n\n<style scoped>\n.component-fade-enter-active,\n.component-fade-leave-active {\n transition: opacity 0.5s ease;\n}\n.component-fade-enter, .component-fade-leave-to\n/* .component-fade-leave-active below version 2.1.8 */ {\n opacity: 0;\n}\n</style>\n"],"names":["defineComponent","name","components","CardLoader","props","courseId","type","String","required","data","courseDB","updatePending","courseConfig","cards","id1","id2","elo1","elo2","viewLookup","allCourseWare","getView","created","this","getDataLayer","getCourseDB","getCourseConfig","getNewCards","methods","vote","x","scores","adjustCourseScores","globalOnly","updateCardElo","cardId","userElo","cardElo","getInexperiencedCards","courseID","cardID","elo","_ctx","_createCommentVNode","_openBlock","_createBlock","_component_v_container","key","default","_withCtx","_createVNode","_component_v_row","_component_v_col","cols","_cache","_createElementVNode","_createTextVNode","_","_component_v_btn","color","class","onClick","_component_v_icon","_component_card_loader","qualified_id"],"mappings":"0LAmCeA,EAAgB,CAC7BC,KAAM,eAENC,WAAY,CAAAC,WACVA,GAGFC,MAAO,CACLC,SAAU,CACRC,KAAMC,OACNC,UAAU,IAIdC,KAAA,KACS,CACLC,SAAU,KACVC,eAAe,EACfC,aAAc,KACdC,MAAO,GAMPC,IAAK,KACLC,IAAK,KACLC,KAAM,KACNC,KAAM,KACNC,WAAYC,EAAcC,UAI9B,aAAMC,GACJC,KAAKZ,SAAWa,IAAeC,YAAYF,KAAKjB,UAEhDiB,KAAKV,mBAAsBU,KAAKZ,SAAUe,wBACpCH,KAAKI,aACb,EAEAC,QAAS,CACP,IAAAC,CAAKC,GACH,IAAKP,KAAKN,OAASM,KAAKL,KAAM,OAE9B,MAAMa,EAASC,EAAmBT,KAAKN,KAAMM,KAAKL,KAAY,MAANY,EAAY,EAAI,EAAG,CACzEG,YAAY,IAGdV,KAAKZ,SAAUuB,cAAcX,KAAKT,MAAM,GAAGqB,OAAQJ,EAAOK,SAC1Db,KAAKZ,SAAUuB,cAAcX,KAAKT,MAAM,GAAGqB,OAAQJ,EAAOM,SAE1Dd,KAAKI,aACP,EAEA,iBAAMA,GACCJ,KAAKZ,WAEVY,KAAKX,eAAgB,EACrBW,KAAKT,YAAcS,KAAKZ,SAAU2B,wBAIlCf,KAAKR,IAAM,KACXQ,KAAKP,IAAM,KAEXO,KAAKR,IAAM,CACTwB,SAAUhB,KAAKjB,SACfkC,OAAQjB,KAAKT,MAAM,GAAGqB,QAExBZ,KAAKP,IAAM,CACTuB,SAAUhB,KAAKjB,SACfkC,OAAQjB,KAAKT,MAAM,GAAGqB,QAGxBZ,KAAKN,KAAOM,KAAKT,MAAM,GAAG2B,IAC1BlB,KAAKL,KAAOK,KAAKT,MAAM,GAAG2B,IAE1BlB,KAAKX,eAAgB,EACvB,uIAhHkB,OAAA8B,EAAA9B,cADtB+B,EAAA,IAAA,IACsBC,IAApBC,EAwBcC,EAAA,CAzBhBC,IAAA,GAAA,CAAAC,QAAAC,GAEI,IAIQ,CAJRC,EAIQC,EAAA,KAAA,CANZH,WAGM,IAEQ,CAFRE,EAEQE,EAAA,CAFDC,KAAK,MAAI,CAHtBL,WAIQ,IAAqCM,EAAA,KAAAA,EAAA,GAAA,CAArCC,EAAqC,KAAA,KAAA,CAJ7CC,EAIY,gBAAYD,EAAe,UAAX,UAJ5BC,EAIuC,OAAC,OAJxCC,EAAA,OAAAA,EAAA,IAQIP,EAOQC,EAAA,KAAA,CAfZH,WASM,IAKQ,CALRE,EAKQE,EAAA,KAAA,CAddJ,WAUQ,IAEQ,CAFRE,EAEQQ,EAAA,CAFDC,MAAM,UAAUC,MAAM,OAAQC,QAAKP,eAAEZ,EAAAb,KAAI,OAAA,CAVxDmB,QAAAC,GAWU,IAA0B,CAA1BC,EAA0BY,EAAA,KAAA,CAXpCd,WAWkB,IAASM,EAAA,KAAAA,EAAA,GAAA,CAX3BE,EAWkB,iBAXlBC,EAAA,OAAAA,EAAA,IAaQP,EAA0Ea,EAAA,CAA7DH,MAAM,OAAQI,aAActB,EAAA3B,IAAM,cAAa2B,EAAAvB,YAAA,KAAA,EAAA,CAAA,eAAA,mBAbpEsC,EAAA,OAAAA,EAAA,IAiBIP,EAOQC,EAAA,KAAA,CAxBZH,WAkBM,IAKQ,CALRE,EAKQE,EAAA,KAAA,CAvBdJ,WAmBQ,IAEQ,CAFRE,EAEQQ,EAAA,CAFDC,MAAM,UAAUC,MAAM,OAAQC,QAAKP,eAAEZ,EAAAb,KAAI,OAAA,CAnBxDmB,QAAAC,GAoBU,IAA0B,CAA1BC,EAA0BY,EAAA,KAAA,CApBpCd,WAoBkB,IAASM,EAAA,KAAAA,EAAA,GAAA,CApB3BE,EAoBkB,iBApBlBC,EAAA,OAAAA,EAAA,IAsBQP,EAA0Ea,EAAA,CAA7DH,MAAM,OAAQI,aAActB,EAAA1B,IAAM,cAAa0B,EAAAvB,YAAA,KAAA,EAAA,CAAA,eAAA,mBAtBpEsC,EAAA,OAAAA,EAAA,OAAAA,EAAA"}
@@ -1,2 +1,2 @@
1
- import{d as s,g as o,l as e,_ as a,r as t,c as l,o as i,w as r,a as c,f as n,t as d}from"./index-PISHyq1I.js";const f=s({name:"JoinCode",props:{classroomId:{type:String,required:!0}},data:()=>({classroomCfg:null,classroomDB:null,updatePending:!0}),async created(){const s=o();this.classroomDB=await s.getClassroomDB(this.classroomId,"teacher"),this.classroomCfg=this.classroomDB.getConfig(),await Promise.all([]),e(`Route loaded w/ (prop) _id: ${this.classroomId}`),e(`Config:\n ${JSON.stringify(this.classroomCfg)}`),this.updatePending=!1},methods:{close(){this.$router.back()}}}),g={key:0,class:"join-code"};const m=a(f,[["render",function(s,o,e,a,f,m){const u=t("v-btn"),h=t("v-progress-circular"),p=t("v-col"),C=t("v-row"),v=t("v-container");return i(),l(v,{fluid:"",class:"fill-height pa-0"},{default:r((()=>[c(u,{icon:"mdi-close",color:"red",variant:"elevated",class:"close-btn",onClick:s.close},null,8,["onClick"]),c(C,{align:"center",justify:"center",class:"fill-height"},{default:r((()=>[c(p,{cols:"12",class:"text-center"},{default:r((()=>[s.updatePending?(i(),l(h,{key:1,indeterminate:"",size:"64"})):(i(),n("div",g,d(s.classroomCfg?.joinCode),1))])),_:1})])),_:1})])),_:1})}]]);export{m as default};
2
- //# sourceMappingURL=JoinCode-njKk1YJx.js.map
1
+ import{d as s,g as o,l as e,_ as a,r as t,c as l,o as i,w as r,a as c,f as n,t as d}from"./index-2oekPD75.js";const f=s({name:"JoinCode",props:{classroomId:{type:String,required:!0}},data:()=>({classroomCfg:null,classroomDB:null,updatePending:!0}),async created(){const s=o();this.classroomDB=await s.getClassroomDB(this.classroomId,"teacher"),this.classroomCfg=this.classroomDB.getConfig(),await Promise.all([]),e(`Route loaded w/ (prop) _id: ${this.classroomId}`),e(`Config:\n ${JSON.stringify(this.classroomCfg)}`),this.updatePending=!1},methods:{close(){this.$router.back()}}}),g={key:0,class:"join-code"};const m=a(f,[["render",function(s,o,e,a,f,m){const u=t("v-btn"),h=t("v-progress-circular"),p=t("v-col"),C=t("v-row"),v=t("v-container");return i(),l(v,{fluid:"",class:"fill-height pa-0"},{default:r((()=>[c(u,{icon:"mdi-close",color:"red",variant:"elevated",class:"close-btn",onClick:s.close},null,8,["onClick"]),c(C,{align:"center",justify:"center",class:"fill-height"},{default:r((()=>[c(p,{cols:"12",class:"text-center"},{default:r((()=>[s.updatePending?(i(),l(h,{key:1,indeterminate:"",size:"64"})):(i(),n("div",g,d(s.classroomCfg?.joinCode),1))])),_:1})])),_:1})])),_:1})}]]);export{m as default};
2
+ //# sourceMappingURL=JoinCode-ePDmlCCp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JoinCode-njKk1YJx.js","sources":["../../src/components/Classrooms/JoinCode.vue"],"sourcesContent":["<template>\n <v-container fluid class=\"fill-height pa-0\">\n <!-- Close button in top-right corner -->\n <v-btn icon=\"mdi-close\" color=\"red\" variant=\"elevated\" class=\"close-btn\" @click=\"close\"> </v-btn>\n\n <!-- Main content -->\n <v-row align=\"center\" justify=\"center\" class=\"fill-height\">\n <v-col cols=\"12\" class=\"text-center\">\n <div v-if=\"!updatePending\" class=\"join-code\">\n {{ classroomCfg?.joinCode }}\n </div>\n <v-progress-circular v-else indeterminate size=\"64\"></v-progress-circular>\n </v-col>\n </v-row>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { log } from '@vue-skuilder/common';\nimport { TeacherClassroomDBInterface, getDataLayer } from '@vue-skuilder/db';\nimport { ClassroomConfig } from '@vue-skuilder/common';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'JoinCode',\n\n props: {\n classroomId: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n classroomCfg: null as ClassroomConfig | null,\n classroomDB: null as TeacherClassroomDBInterface | null,\n updatePending: true,\n };\n },\n\n async created() {\n const dl = getDataLayer();\n\n this.classroomDB = await dl.getClassroomDB(this.classroomId, 'teacher');\n this.classroomCfg = this.classroomDB.getConfig();\n await Promise.all([]);\n log(`Route loaded w/ (prop) _id: ${this.classroomId}`);\n log(`Config:\n ${JSON.stringify(this.classroomCfg)}`);\n this.updatePending = false;\n },\n\n methods: {\n close() {\n this.$router.back();\n },\n },\n});\n</script>\n\n<style>\n.close-btn {\n position: fixed;\n top: 80px;\n right: 16px;\n z-index: 100;\n}\n\n.join-code {\n font-size: 8rem;\n font-weight: bold;\n line-height: 1.2;\n letter-spacing: 0.1em;\n}\n\n/* Responsive adjustments */\n@media (max-width: 600px) {\n .join-code {\n font-size: 4rem;\n }\n}\n</style>\n"],"names":["_sfc_main","defineComponent","name","props","classroomId","type","String","required","data","classroomCfg","classroomDB","updatePending","created","dl","getDataLayer","this","getClassroomDB","getConfig","Promise","all","log","JSON","stringify","methods","close","$router","back","key","class","_createBlock","_component_v_container","fluid","default","_withCtx","_createVNode","_component_v_btn","icon","color","variant","onClick","_ctx","_component_v_row","align","justify","_component_v_col","cols","_component_v_progress_circular","indeterminate","size","_openBlock","_createElementBlock","_hoisted_1","_toDisplayString","joinCode","_"],"mappings":"8GAuBA,MAAAA,EAAeC,EAAgB,CAC7BC,KAAM,WAENC,MAAO,CACLC,YAAa,CACXC,KAAMC,OACNC,UAAU,IAIdC,KAAA,KACS,CACLC,aAAc,KACdC,YAAa,KACbC,eAAe,IAInB,aAAMC,GACJ,MAAMC,EAAKC,IAEXC,KAAKL,kBAAoBG,EAAGG,eAAeD,KAAKX,YAAa,WAC7DW,KAAKN,aAAeM,KAAKL,YAAYO,kBAC/BC,QAAQC,IAAI,IAClBC,EAAI,+BAA+BL,KAAKX,eACxCgB,EAAI,gBACFC,KAAKC,UAAUP,KAAKN,iBACtBM,KAAKJ,eAAgB,CACvB,EAEAY,QAAS,CACP,KAAAC,GACET,KAAKU,QAAQC,MACf,QAxDJC,IAAA,EAQmCC,MAAM,gKAPvCC,EAacC,EAAA,CAbDC,MAAA,GAAMH,MAAM,oBAAA,CAD3BI,QAAAC,GAGI,IAAiG,CAAjGC,EAAiGC,EAAA,CAA1FC,KAAK,YAAYC,MAAM,MAAMC,QAAQ,WAAWV,MAAM,YAAaW,QAAOC,EAAAhB,OAAA,KAAA,EAAA,CAAA,YAGjFU,EAOQO,EAAA,CAPDC,MAAM,SAASC,QAAQ,SAASf,MAAM,eAAA,CANjDI,QAAAC,GAOM,IAKQ,CALRC,EAKQU,EAAA,CALDC,KAAK,KAAKjB,MAAM,eAAA,CAP7BI,QAAAC,GAQQ,IAEM,CAFMO,EAAA7B,mBAGZkB,EAA0EiB,EAAA,CAXlFnB,IAAA,EAWoCoB,cAAA,GAAcC,KAAK,SAHnCC,IAAZC,EAEM,MAFNC,EAEMC,EADDZ,EAAA/B,cAAc4C,iBAT3BC,EAAA,OAAAA,EAAA,OAAAA,EAAA"}
1
+ {"version":3,"file":"JoinCode-ePDmlCCp.js","sources":["../../src/components/Classrooms/JoinCode.vue"],"sourcesContent":["<template>\n <v-container fluid class=\"fill-height pa-0\">\n <!-- Close button in top-right corner -->\n <v-btn icon=\"mdi-close\" color=\"red\" variant=\"elevated\" class=\"close-btn\" @click=\"close\"> </v-btn>\n\n <!-- Main content -->\n <v-row align=\"center\" justify=\"center\" class=\"fill-height\">\n <v-col cols=\"12\" class=\"text-center\">\n <div v-if=\"!updatePending\" class=\"join-code\">\n {{ classroomCfg?.joinCode }}\n </div>\n <v-progress-circular v-else indeterminate size=\"64\"></v-progress-circular>\n </v-col>\n </v-row>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { log } from '@vue-skuilder/common';\nimport { TeacherClassroomDBInterface, getDataLayer } from '@vue-skuilder/db';\nimport { ClassroomConfig } from '@vue-skuilder/common';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'JoinCode',\n\n props: {\n classroomId: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n classroomCfg: null as ClassroomConfig | null,\n classroomDB: null as TeacherClassroomDBInterface | null,\n updatePending: true,\n };\n },\n\n async created() {\n const dl = getDataLayer();\n\n this.classroomDB = await dl.getClassroomDB(this.classroomId, 'teacher');\n this.classroomCfg = this.classroomDB.getConfig();\n await Promise.all([]);\n log(`Route loaded w/ (prop) _id: ${this.classroomId}`);\n log(`Config:\n ${JSON.stringify(this.classroomCfg)}`);\n this.updatePending = false;\n },\n\n methods: {\n close() {\n this.$router.back();\n },\n },\n});\n</script>\n\n<style>\n.close-btn {\n position: fixed;\n top: 80px;\n right: 16px;\n z-index: 100;\n}\n\n.join-code {\n font-size: 8rem;\n font-weight: bold;\n line-height: 1.2;\n letter-spacing: 0.1em;\n}\n\n/* Responsive adjustments */\n@media (max-width: 600px) {\n .join-code {\n font-size: 4rem;\n }\n}\n</style>\n"],"names":["_sfc_main","defineComponent","name","props","classroomId","type","String","required","data","classroomCfg","classroomDB","updatePending","created","dl","getDataLayer","this","getClassroomDB","getConfig","Promise","all","log","JSON","stringify","methods","close","$router","back","key","class","_createBlock","_component_v_container","fluid","default","_withCtx","_createVNode","_component_v_btn","icon","color","variant","onClick","_ctx","_component_v_row","align","justify","_component_v_col","cols","_component_v_progress_circular","indeterminate","size","_openBlock","_createElementBlock","_hoisted_1","_toDisplayString","joinCode","_"],"mappings":"8GAuBA,MAAAA,EAAeC,EAAgB,CAC7BC,KAAM,WAENC,MAAO,CACLC,YAAa,CACXC,KAAMC,OACNC,UAAU,IAIdC,KAAA,KACS,CACLC,aAAc,KACdC,YAAa,KACbC,eAAe,IAInB,aAAMC,GACJ,MAAMC,EAAKC,IAEXC,KAAKL,kBAAoBG,EAAGG,eAAeD,KAAKX,YAAa,WAC7DW,KAAKN,aAAeM,KAAKL,YAAYO,kBAC/BC,QAAQC,IAAI,IAClBC,EAAI,+BAA+BL,KAAKX,eACxCgB,EAAI,gBACFC,KAAKC,UAAUP,KAAKN,iBACtBM,KAAKJ,eAAgB,CACvB,EAEAY,QAAS,CACP,KAAAC,GACET,KAAKU,QAAQC,MACf,QAxDJC,IAAA,EAQmCC,MAAM,gKAPvCC,EAacC,EAAA,CAbDC,MAAA,GAAMH,MAAM,oBAAA,CAD3BI,QAAAC,GAGI,IAAiG,CAAjGC,EAAiGC,EAAA,CAA1FC,KAAK,YAAYC,MAAM,MAAMC,QAAQ,WAAWV,MAAM,YAAaW,QAAOC,EAAAhB,OAAA,KAAA,EAAA,CAAA,YAGjFU,EAOQO,EAAA,CAPDC,MAAM,SAASC,QAAQ,SAASf,MAAM,eAAA,CANjDI,QAAAC,GAOM,IAKQ,CALRC,EAKQU,EAAA,CALDC,KAAK,KAAKjB,MAAM,eAAA,CAP7BI,QAAAC,GAQQ,IAEM,CAFMO,EAAA7B,mBAGZkB,EAA0EiB,EAAA,CAXlFnB,IAAA,EAWoCoB,cAAA,GAAcC,KAAK,SAHnCC,IAAZC,EAEM,MAFNC,EAEMC,EADDZ,EAAA/B,cAAc4C,iBAT3BC,EAAA,OAAAA,EAAA,OAAAA,EAAA"}
@@ -1,2 +1,2 @@
1
- import{s as e,M as s}from"./mousetrap-DZcUUEaw.js";import{d as t,s as a,i,j as o,_ as r,r as l,c as d,o as u,w as n,a as c,e as m,b as p}from"./index-PISHyq1I.js";const h=r(t({name:"NewCourseDialog",props:{name:{type:String,required:!1,default:""}},emits:["CourseEditingComplete"],data(){return{mousetrap:new s(this.$el),id:"",courseName:"",description:"",publicCourse:!1,deleted:!1,admins:[],moderators:[],dataShapes:[],questionTypes:[],banner:void 0,thumb:void 0,updatePending:!1,nameRules:[e=>!(e.length>30)||"Course name must be 30 characters or less"]}},created(){this.mousetrap.bind("esc",this.clearFormAndDismiss)},methods:{async submit(){this.updatePending=!0;const s=await a(),t={name:this.courseName,description:this.description,public:this.publicCourse,deleted:this.deleted,creator:s.getUsername(),admins:this.admins,moderators:this.moderators,dataShapes:this.dataShapes,questionTypes:this.questionTypes},r=await e({data:t,type:i.CREATE_COURSE,response:null,user:s.getUsername()});r.response&&r.response.ok?(o({text:`Course ${this.courseName} created.`,status:r.response.status}),this.clearFormAndDismiss()):(o({text:`Failed to create course ${this.courseName}.`,status:r.response.status}),console.warn(`Resp: ${JSON.stringify(r.response)}`)),this.updatePending=!1},clearFormAndDismiss(){this.description="",this.publicCourse=!1,this.deleted=!1,this.admins=[],this.moderators=[],this.$emit("CourseEditingComplete")}}}),[["render",function(e,s,t,a,i,o){const r=l("v-card-title"),h=l("v-spacer"),b=l("v-icon"),v=l("v-btn"),f=l("v-toolbar"),g=l("v-text-field"),C=l("v-row"),y=l("v-textarea"),_=l("v-radio"),w=l("v-radio-group"),N=l("v-container"),q=l("v-form"),S=l("v-card");return u(),d(S,null,{default:n((()=>[c(f,{flat:"",color:"primary",dark:""},{default:n((()=>[c(r,{class:"text-h6 font-weight-regular"},{default:n((()=>s[3]||(s[3]=[m(" Start a New Quilt ")]))),_:1}),c(h),c(v,{icon:"",onClick:e.clearFormAndDismiss},{default:n((()=>[c(b,{icon:"mdi-close"})])),_:1},8,["onClick"])])),_:1}),c(q,null,{default:n((()=>[c(N,null,{default:n((()=>[c(C,{class:"cols sm md"},{default:n((()=>[c(g,{modelValue:e.courseName,"onUpdate:modelValue":s[0]||(s[0]=s=>e.courseName=s),counter:"30",rules:e.nameRules,label:"Quilt Name",required:"",hint:"Short and descriptive","data-cy":"course-name-input"},null,8,["modelValue","rules"])])),_:1}),c(C,{class:"cols sm md"},{default:n((()=>[c(y,{modelValue:e.description,"onUpdate:modelValue":s[1]||(s[1]=s=>e.description=s),variant:"outlined",counter:"300","auto-grow":"",label:"Quilt Description",hint:"Describe the course. What subject is covered? Who might be interested?","data-cy":"course-description-input"},null,8,["modelValue"])])),_:1}),c(C,{class:"cols sm md"},{default:n((()=>[s[4]||(s[4]=p("label",null,"Public or private quilt?",-1)),c(w,{modelValue:e.publicCourse,"onUpdate:modelValue":s[2]||(s[2]=s=>e.publicCourse=s),required:"",hint:"Private quilts can be shared and collaborated on with other individual users, but will not be accessable without an invitation. A private quilt can be made public later.","persistent-hint":"",inline:"","data-cy":"course-visibility-radio"},{default:n((()=>[c(_,{label:"Public",value:!0,"data-cy":"public-radio"}),c(_,{label:"Private",value:!1,"data-cy":"private-radio"})])),_:1},8,["modelValue"])])),_:1}),c(C,{class:"cols sm md"},{default:n((()=>[c(v,{loading:e.updatePending,color:"primary","data-cy":"save-course-button",onClick:e.submit},{default:n((()=>s[5]||(s[5]=[m(" Save Course Changes ")]))),_:1},8,["loading","onClick"])])),_:1})])),_:1})])),_:1})])),_:1})}]]);export{h as N};
2
- //# sourceMappingURL=NewCourseDialog-gxkU-IdZ.js.map
1
+ import{s as e,M as s}from"./mousetrap-ChZ3Kuin.js";import{d as t,s as a,i,j as o,_ as r,r as l,c as d,o as u,w as n,a as c,e as m,b as p}from"./index-2oekPD75.js";const h=r(t({name:"NewCourseDialog",props:{name:{type:String,required:!1,default:""}},emits:["CourseEditingComplete"],data(){return{mousetrap:new s(this.$el),id:"",courseName:"",description:"",publicCourse:!1,deleted:!1,admins:[],moderators:[],dataShapes:[],questionTypes:[],banner:void 0,thumb:void 0,updatePending:!1,nameRules:[e=>!(e.length>30)||"Course name must be 30 characters or less"]}},created(){this.mousetrap.bind("esc",this.clearFormAndDismiss)},methods:{async submit(){this.updatePending=!0;const s=await a(),t={name:this.courseName,description:this.description,public:this.publicCourse,deleted:this.deleted,creator:s.getUsername(),admins:this.admins,moderators:this.moderators,dataShapes:this.dataShapes,questionTypes:this.questionTypes},r=await e({data:t,type:i.CREATE_COURSE,response:null,user:s.getUsername()});r.response&&r.response.ok?(o({text:`Course ${this.courseName} created.`,status:r.response.status}),this.clearFormAndDismiss()):(o({text:`Failed to create course ${this.courseName}.`,status:r.response.status}),console.warn(`Resp: ${JSON.stringify(r.response)}`)),this.updatePending=!1},clearFormAndDismiss(){this.description="",this.publicCourse=!1,this.deleted=!1,this.admins=[],this.moderators=[],this.$emit("CourseEditingComplete")}}}),[["render",function(e,s,t,a,i,o){const r=l("v-card-title"),h=l("v-spacer"),b=l("v-icon"),v=l("v-btn"),f=l("v-toolbar"),g=l("v-text-field"),C=l("v-row"),y=l("v-textarea"),_=l("v-radio"),w=l("v-radio-group"),N=l("v-container"),q=l("v-form"),S=l("v-card");return u(),d(S,null,{default:n((()=>[c(f,{flat:"",color:"primary",dark:""},{default:n((()=>[c(r,{class:"text-h6 font-weight-regular"},{default:n((()=>s[3]||(s[3]=[m(" Start a New Quilt ")]))),_:1}),c(h),c(v,{icon:"",onClick:e.clearFormAndDismiss},{default:n((()=>[c(b,{icon:"mdi-close"})])),_:1},8,["onClick"])])),_:1}),c(q,null,{default:n((()=>[c(N,null,{default:n((()=>[c(C,{class:"cols sm md"},{default:n((()=>[c(g,{modelValue:e.courseName,"onUpdate:modelValue":s[0]||(s[0]=s=>e.courseName=s),counter:"30",rules:e.nameRules,label:"Quilt Name",required:"",hint:"Short and descriptive","data-cy":"course-name-input"},null,8,["modelValue","rules"])])),_:1}),c(C,{class:"cols sm md"},{default:n((()=>[c(y,{modelValue:e.description,"onUpdate:modelValue":s[1]||(s[1]=s=>e.description=s),variant:"outlined",counter:"300","auto-grow":"",label:"Quilt Description",hint:"Describe the course. What subject is covered? Who might be interested?","data-cy":"course-description-input"},null,8,["modelValue"])])),_:1}),c(C,{class:"cols sm md"},{default:n((()=>[s[4]||(s[4]=p("label",null,"Public or private quilt?",-1)),c(w,{modelValue:e.publicCourse,"onUpdate:modelValue":s[2]||(s[2]=s=>e.publicCourse=s),required:"",hint:"Private quilts can be shared and collaborated on with other individual users, but will not be accessable without an invitation. A private quilt can be made public later.","persistent-hint":"",inline:"","data-cy":"course-visibility-radio"},{default:n((()=>[c(_,{label:"Public",value:!0,"data-cy":"public-radio"}),c(_,{label:"Private",value:!1,"data-cy":"private-radio"})])),_:1},8,["modelValue"])])),_:1}),c(C,{class:"cols sm md"},{default:n((()=>[c(v,{loading:e.updatePending,color:"primary","data-cy":"save-course-button",onClick:e.submit},{default:n((()=>s[5]||(s[5]=[m(" Save Course Changes ")]))),_:1},8,["loading","onClick"])])),_:1})])),_:1})])),_:1})])),_:1})}]]);export{h as N};
2
+ //# sourceMappingURL=NewCourseDialog-CQ7mNlvV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NewCourseDialog-gxkU-IdZ.js","sources":["../../src/components/Courses/NewCourseDialog.vue"],"sourcesContent":["<template>\n <v-card>\n <v-toolbar flat color=\"primary\" dark>\n <v-card-title class=\"text-h6 font-weight-regular\"> Start a New Quilt </v-card-title>\n <v-spacer></v-spacer>\n <v-btn icon @click=\"clearFormAndDismiss\">\n <v-icon icon=\"mdi-close\"></v-icon>\n </v-btn>\n </v-toolbar>\n <v-form>\n <v-container>\n <v-row class=\"cols sm md\">\n <v-text-field\n v-model=\"courseName\"\n counter=\"30\"\n :rules=\"nameRules\"\n label=\"Quilt Name\"\n required\n hint=\"Short and descriptive\"\n data-cy=\"course-name-input\"\n ></v-text-field>\n </v-row>\n <v-row class=\"cols sm md\">\n <v-textarea\n v-model=\"description\"\n variant=\"outlined\"\n counter=\"300\"\n auto-grow\n label=\"Quilt Description\"\n hint=\"Describe the course. What subject is covered? Who might be interested?\"\n data-cy=\"course-description-input\"\n >\n </v-textarea>\n </v-row>\n <v-row class=\"cols sm md\">\n <label>Public or private quilt?</label>\n <v-radio-group\n v-model=\"publicCourse\"\n required\n hint=\"Private quilts can be shared and collaborated on with other individual users, but will not be accessable without an invitation. A private quilt can be made public later.\"\n persistent-hint\n inline\n data-cy=\"course-visibility-radio\"\n >\n <v-radio label=\"Public\" :value=\"true\" data-cy=\"public-radio\"></v-radio>\n <v-radio label=\"Private\" :value=\"false\" data-cy=\"private-radio\"></v-radio>\n </v-radio-group>\n </v-row>\n <v-row class=\"cols sm md\">\n <v-btn :loading=\"updatePending\" color=\"primary\" data-cy=\"save-course-button\" @click=\"submit\">\n Save Course Changes\n </v-btn>\n </v-row>\n </v-container>\n </v-form>\n </v-card>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport Mousetrap from 'mousetrap';\nimport serverRequest from '../../server';\nimport { CourseConfig, CreateCourse, DataShape55, QuestionType55, ServerRequestType } from '@vue-skuilder/common';\nimport { alertUser, getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'NewCourseDialog',\n\n props: {\n name: {\n type: String,\n required: false,\n default: '',\n },\n },\n\n emits: ['CourseEditingComplete'],\n\n data() {\n return {\n mousetrap: new Mousetrap(this.$el),\n id: '',\n courseName: '',\n description: '',\n publicCourse: false,\n deleted: false,\n admins: [] as string[],\n moderators: [] as string[],\n dataShapes: [] as DataShape55[],\n questionTypes: [] as QuestionType55[],\n banner: undefined as Blob | undefined,\n thumb: undefined as Blob | undefined,\n updatePending: false,\n nameRules: [\n (value: string): string | boolean => {\n const max = 30;\n if (value.length > max) {\n return `Course name must be ${max} characters or less`;\n } else {\n return true;\n }\n },\n ],\n };\n },\n\n created() {\n this.mousetrap.bind('esc', this.clearFormAndDismiss);\n },\n\n methods: {\n async submit() {\n this.updatePending = true;\n\n const u = await getCurrentUser();\n\n const config: CourseConfig = {\n name: this.courseName,\n description: this.description,\n public: this.publicCourse,\n deleted: this.deleted,\n creator: u.getUsername(),\n admins: this.admins,\n moderators: this.moderators,\n dataShapes: this.dataShapes,\n questionTypes: this.questionTypes,\n };\n\n const result = await serverRequest<CreateCourse>({\n data: config,\n type: ServerRequestType.CREATE_COURSE,\n response: null,\n user: u.getUsername(),\n });\n\n if (result.response && result.response.ok) {\n alertUser({\n text: `Course ${this.courseName} created.`,\n status: result.response!.status,\n });\n this.clearFormAndDismiss();\n } else {\n alertUser({\n text: `Failed to create course ${this.courseName}.`,\n status: result.response!.status,\n });\n console.warn(`Resp: ${JSON.stringify(result.response)}`);\n }\n\n this.updatePending = false;\n },\n\n clearFormAndDismiss() {\n this.description = '';\n this.publicCourse = false;\n this.deleted = false;\n this.admins = [];\n this.moderators = [];\n\n this.$emit('CourseEditingComplete');\n },\n },\n});\n</script>\n"],"names":["defineComponent","name","props","type","String","required","default","emits","data","mousetrap","Mousetrap","this","$el","id","courseName","description","publicCourse","deleted","admins","moderators","dataShapes","questionTypes","banner","thumb","updatePending","nameRules","value","length","created","bind","clearFormAndDismiss","methods","submit","u","getCurrentUser","config","public","creator","getUsername","result","serverRequest","ServerRequestType","CREATE_COURSE","response","user","ok","alertUser","text","status","console","warn","JSON","stringify","$emit","_createBlock","_component_v_card","_createVNode","_component_v_toolbar","flat","color","dark","_withCtx","_component_v_card_title","class","_cache","_createTextVNode","_","_component_v_spacer","_component_v_btn","icon","onClick","_ctx","_component_v_icon","_component_v_form","_component_v_container","_component_v_row","_component_v_text_field","modelValue","$event","counter","rules","label","hint","_component_v_textarea","variant","_createElementVNode","_component_v_radio_group","inline","_component_v_radio","loading"],"mappings":"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"}
1
+ {"version":3,"file":"NewCourseDialog-CQ7mNlvV.js","sources":["../../src/components/Courses/NewCourseDialog.vue"],"sourcesContent":["<template>\n <v-card>\n <v-toolbar flat color=\"primary\" dark>\n <v-card-title class=\"text-h6 font-weight-regular\"> Start a New Quilt </v-card-title>\n <v-spacer></v-spacer>\n <v-btn icon @click=\"clearFormAndDismiss\">\n <v-icon icon=\"mdi-close\"></v-icon>\n </v-btn>\n </v-toolbar>\n <v-form>\n <v-container>\n <v-row class=\"cols sm md\">\n <v-text-field\n v-model=\"courseName\"\n counter=\"30\"\n :rules=\"nameRules\"\n label=\"Quilt Name\"\n required\n hint=\"Short and descriptive\"\n data-cy=\"course-name-input\"\n ></v-text-field>\n </v-row>\n <v-row class=\"cols sm md\">\n <v-textarea\n v-model=\"description\"\n variant=\"outlined\"\n counter=\"300\"\n auto-grow\n label=\"Quilt Description\"\n hint=\"Describe the course. What subject is covered? Who might be interested?\"\n data-cy=\"course-description-input\"\n >\n </v-textarea>\n </v-row>\n <v-row class=\"cols sm md\">\n <label>Public or private quilt?</label>\n <v-radio-group\n v-model=\"publicCourse\"\n required\n hint=\"Private quilts can be shared and collaborated on with other individual users, but will not be accessable without an invitation. A private quilt can be made public later.\"\n persistent-hint\n inline\n data-cy=\"course-visibility-radio\"\n >\n <v-radio label=\"Public\" :value=\"true\" data-cy=\"public-radio\"></v-radio>\n <v-radio label=\"Private\" :value=\"false\" data-cy=\"private-radio\"></v-radio>\n </v-radio-group>\n </v-row>\n <v-row class=\"cols sm md\">\n <v-btn :loading=\"updatePending\" color=\"primary\" data-cy=\"save-course-button\" @click=\"submit\">\n Save Course Changes\n </v-btn>\n </v-row>\n </v-container>\n </v-form>\n </v-card>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport Mousetrap from 'mousetrap';\nimport serverRequest from '../../server';\nimport { CourseConfig, CreateCourse, DataShape55, QuestionType55, ServerRequestType } from '@vue-skuilder/common';\nimport { alertUser, getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'NewCourseDialog',\n\n props: {\n name: {\n type: String,\n required: false,\n default: '',\n },\n },\n\n emits: ['CourseEditingComplete'],\n\n data() {\n return {\n mousetrap: new Mousetrap(this.$el),\n id: '',\n courseName: '',\n description: '',\n publicCourse: false,\n deleted: false,\n admins: [] as string[],\n moderators: [] as string[],\n dataShapes: [] as DataShape55[],\n questionTypes: [] as QuestionType55[],\n banner: undefined as Blob | undefined,\n thumb: undefined as Blob | undefined,\n updatePending: false,\n nameRules: [\n (value: string): string | boolean => {\n const max = 30;\n if (value.length > max) {\n return `Course name must be ${max} characters or less`;\n } else {\n return true;\n }\n },\n ],\n };\n },\n\n created() {\n this.mousetrap.bind('esc', this.clearFormAndDismiss);\n },\n\n methods: {\n async submit() {\n this.updatePending = true;\n\n const u = await getCurrentUser();\n\n const config: CourseConfig = {\n name: this.courseName,\n description: this.description,\n public: this.publicCourse,\n deleted: this.deleted,\n creator: u.getUsername(),\n admins: this.admins,\n moderators: this.moderators,\n dataShapes: this.dataShapes,\n questionTypes: this.questionTypes,\n };\n\n const result = await serverRequest<CreateCourse>({\n data: config,\n type: ServerRequestType.CREATE_COURSE,\n response: null,\n user: u.getUsername(),\n });\n\n if (result.response && result.response.ok) {\n alertUser({\n text: `Course ${this.courseName} created.`,\n status: result.response!.status,\n });\n this.clearFormAndDismiss();\n } else {\n alertUser({\n text: `Failed to create course ${this.courseName}.`,\n status: result.response!.status,\n });\n console.warn(`Resp: ${JSON.stringify(result.response)}`);\n }\n\n this.updatePending = false;\n },\n\n clearFormAndDismiss() {\n this.description = '';\n this.publicCourse = false;\n this.deleted = false;\n this.admins = [];\n this.moderators = [];\n\n this.$emit('CourseEditingComplete');\n },\n },\n});\n</script>\n"],"names":["defineComponent","name","props","type","String","required","default","emits","data","mousetrap","Mousetrap","this","$el","id","courseName","description","publicCourse","deleted","admins","moderators","dataShapes","questionTypes","banner","thumb","updatePending","nameRules","value","length","created","bind","clearFormAndDismiss","methods","submit","u","getCurrentUser","config","public","creator","getUsername","result","serverRequest","ServerRequestType","CREATE_COURSE","response","user","ok","alertUser","text","status","console","warn","JSON","stringify","$emit","_createBlock","_component_v_card","_createVNode","_component_v_toolbar","flat","color","dark","_withCtx","_component_v_card_title","class","_cache","_createTextVNode","_","_component_v_spacer","_component_v_btn","icon","onClick","_ctx","_component_v_icon","_component_v_form","_component_v_container","_component_v_row","_component_v_text_field","modelValue","$event","counter","rules","label","hint","_component_v_textarea","variant","_createElementVNode","_component_v_radio_group","inline","_component_v_radio","loading"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{d as e,_ as s,f as l,o as a,b as t}from"./index-PISHyq1I.js";const n=s(e({name:"ReleaseNotes"}),[["render",function(e,s,n,o,r,u){return a(),l("div",null,s[0]||(s[0]=[t("h1",{class:"text-h2 mb-6"},"Release Notes",-1),t("h3",{class:"text-h4 mb-4"},"0.0.1 - April 21",-1),t("ul",null,[t("li",null,"Hello world, these are release notes.")],-1)]))}]]);export{n as default};
2
- //# sourceMappingURL=ReleaseNotes-Dp_ykMR1.js.map
1
+ import{d as e,_ as s,f as l,o as a,b as t}from"./index-2oekPD75.js";const n=s(e({name:"ReleaseNotes"}),[["render",function(e,s,n,o,r,u){return a(),l("div",null,s[0]||(s[0]=[t("h1",{class:"text-h2 mb-6"},"Release Notes",-1),t("h3",{class:"text-h4 mb-4"},"0.0.1 - April 21",-1),t("ul",null,[t("li",null,"Hello world, these are release notes.")],-1)]))}]]);export{n as default};
2
+ //# sourceMappingURL=ReleaseNotes-C3ZQbVRo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReleaseNotes-Dp_ykMR1.js","sources":["../../src/views/ReleaseNotes.vue"],"sourcesContent":["<template>\n <div>\n <h1 class=\"text-h2 mb-6\">Release Notes</h1>\n\n <h3 class=\"text-h4 mb-4\">0.0.1 - April 21</h3>\n <ul>\n <li>Hello world, these are release notes.</li>\n </ul>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'ReleaseNotes',\n});\n</script>\n\n<style scoped></style>\n"],"names":["defineComponent","name","_createElementBlock","_cache","_createElementVNode","class"],"mappings":"8EAceA,EAAgB,CAC7BC,KAAM,6DAdNC,EAOM,MAAA,KAAAC,EAAA,KAAAA,EAAA,GAAA,CANJC,EAA2C,KAAA,CAAvCC,MAAM,gBAAe,iBAAa,GAEtCD,EAA8C,KAAA,CAA1CC,MAAM,gBAAe,oBAAgB,GACzCD,EAEK,KAAA,KAAA,CADHA,EAA8C,UAA1C,2CAAqC"}
1
+ {"version":3,"file":"ReleaseNotes-C3ZQbVRo.js","sources":["../../src/views/ReleaseNotes.vue"],"sourcesContent":["<template>\n <div>\n <h1 class=\"text-h2 mb-6\">Release Notes</h1>\n\n <h3 class=\"text-h4 mb-4\">0.0.1 - April 21</h3>\n <ul>\n <li>Hello world, these are release notes.</li>\n </ul>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'ReleaseNotes',\n});\n</script>\n\n<style scoped></style>\n"],"names":["defineComponent","name","_createElementBlock","_cache","_createElementVNode","class"],"mappings":"8EAceA,EAAgB,CAC7BC,KAAM,6DAdNC,EAOM,MAAA,KAAAC,EAAA,KAAAA,EAAA,GAAA,CANJC,EAA2C,KAAA,CAAvCC,MAAM,gBAAe,iBAAa,GAEtCD,EAA8C,KAAA,CAA1CC,MAAM,gBAAe,oBAAgB,GACzCD,EAEK,KAAA,KAAA,CADHA,EAA8C,UAA1C,2CAAqC"}
@@ -1,2 +1,2 @@
1
- import{d as e,V as s,_ as o,r as a,c as n,o as t,w as r,a as c}from"./index-PISHyq1I.js";const d=o(e({name:"RequestPasswordResetView",components:{RequestPasswordReset:s},methods:{handleSuccess(e){console.log(`Password reset email sent to ${e}`)},goToLogin(){this.$router.push({name:"login"})}}}),[["render",function(e,s,o,d,l,u){const i=a("request-password-reset",!0),g=a("v-container");return t(),n(g,{class:"d-flex align-center request-reset"},{default:r((()=>[c(i,{onCancel:e.goToLogin,onSuccess:e.handleSuccess},null,8,["onCancel","onSuccess"])])),_:1})}],["__scopeId","data-v-111f280a"]]);export{d as default};
2
- //# sourceMappingURL=RequestPasswordReset-BavuuCBu.js.map
1
+ import{d as e,V as s,_ as o,r as a,c as n,o as t,w as r,a as c}from"./index-2oekPD75.js";const d=o(e({name:"RequestPasswordResetView",components:{RequestPasswordReset:s},methods:{handleSuccess(e){console.log(`Password reset email sent to ${e}`)},goToLogin(){this.$router.push({name:"login"})}}}),[["render",function(e,s,o,d,l,u){const i=a("request-password-reset",!0),g=a("v-container");return t(),n(g,{class:"d-flex align-center request-reset"},{default:r((()=>[c(i,{onCancel:e.goToLogin,onSuccess:e.handleSuccess},null,8,["onCancel","onSuccess"])])),_:1})}],["__scopeId","data-v-111f280a"]]);export{d as default};
2
+ //# sourceMappingURL=RequestPasswordReset-Br-oJB_m.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RequestPasswordReset-BavuuCBu.js","sources":["../../src/views/RequestPasswordReset.vue"],"sourcesContent":["<template>\n <v-container class=\"d-flex align-center request-reset\">\n <request-password-reset @cancel=\"goToLogin\" @success=\"handleSuccess\" />\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { RequestPasswordReset } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'RequestPasswordResetView',\n\n components: {\n RequestPasswordReset,\n },\n\n methods: {\n handleSuccess(email: string) {\n console.log(`Password reset email sent to ${email}`);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n },\n});\n</script>\n\n<style lang=\"css\" scoped>\n.request-reset {\n max-width: 650px;\n}\n</style>\n"],"names":["defineComponent","name","components","RequestPasswordReset","methods","handleSuccess","email","console","log","goToLogin","this","$router","push","_createBlock","_component_v_container","class","default","_createVNode","_component_request_password_reset","onCancel","_ctx","onSuccess","_"],"mappings":"mGAUeA,EAAgB,CAC7BC,KAAM,2BAENC,WAAY,CAAAC,qBACVA,GAGFC,QAAS,CACP,aAAAC,CAAcC,GACZC,QAAQC,IAAI,gCAAgCF,IAC9C,EAEA,SAAAG,GACEC,KAAKC,QAAQC,KAAK,CAAEX,KAAM,SAC5B,2GAvBFY,EAEcC,EAAA,CAFDC,MAAM,qCAAmC,CADxDC,WAEI,IAAuE,CAAvEC,EAAuEC,EAAA,CAA9CC,SAAQC,EAAAX,UAAYY,UAASD,EAAAf,eAAA,KAAA,EAAA,CAAA,WAAA,iBAF1DiB,EAAA"}
1
+ {"version":3,"file":"RequestPasswordReset-Br-oJB_m.js","sources":["../../src/views/RequestPasswordReset.vue"],"sourcesContent":["<template>\n <v-container class=\"d-flex align-center request-reset\">\n <request-password-reset @cancel=\"goToLogin\" @success=\"handleSuccess\" />\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { RequestPasswordReset } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'RequestPasswordResetView',\n\n components: {\n RequestPasswordReset,\n },\n\n methods: {\n handleSuccess(email: string) {\n console.log(`Password reset email sent to ${email}`);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n },\n});\n</script>\n\n<style lang=\"css\" scoped>\n.request-reset {\n max-width: 650px;\n}\n</style>\n"],"names":["defineComponent","name","components","RequestPasswordReset","methods","handleSuccess","email","console","log","goToLogin","this","$router","push","_createBlock","_component_v_container","class","default","_createVNode","_component_request_password_reset","onCancel","_ctx","onSuccess","_"],"mappings":"mGAUeA,EAAgB,CAC7BC,KAAM,2BAENC,WAAY,CAAAC,qBACVA,GAGFC,QAAS,CACP,aAAAC,CAAcC,GACZC,QAAQC,IAAI,gCAAgCF,IAC9C,EAEA,SAAAG,GACEC,KAAKC,QAAQC,KAAK,CAAEX,KAAM,SAC5B,2GAvBFY,EAEcC,EAAA,CAFDC,MAAM,qCAAmC,CADxDC,WAEI,IAAuE,CAAvEC,EAAuEC,EAAA,CAA9CC,SAAQC,EAAAX,UAAYY,UAASD,EAAAf,eAAA,KAAA,EAAA,CAAA,WAAA,iBAF1DiB,EAAA"}
@@ -1,2 +1,2 @@
1
- import{d as o,W as e,_ as s,r,c as n,o as a,w as t,a as l,e as c}from"./index-PISHyq1I.js";const d=s(o({name:"ResetPasswordView",components:{ResetPassword:e},methods:{handleComplete(){console.log("Password reset successfully")},handleError(o){console.error("Password reset error:",o)},goToLogin(){this.$router.push({name:"login"})}}}),[["render",function(o,e,s,d,i,m){const p=r("v-btn"),u=r("reset-password",!0);return a(),n(u,{onComplete:o.handleComplete,onError:o.handleError},{"success-action":t((()=>[l(p,{color:"primary",onClick:o.goToLogin},{default:t((()=>e[0]||(e[0]=[c(" Continue to Login ")]))),_:1},8,["onClick"])])),_:1},8,["onComplete","onError"])}]]);export{d as default};
2
- //# sourceMappingURL=ResetPassword-CA8HHOIy.js.map
1
+ import{d as o,W as e,_ as s,r,c as n,o as a,w as t,a as l,e as c}from"./index-2oekPD75.js";const d=s(o({name:"ResetPasswordView",components:{ResetPassword:e},methods:{handleComplete(){console.log("Password reset successfully")},handleError(o){console.error("Password reset error:",o)},goToLogin(){this.$router.push({name:"login"})}}}),[["render",function(o,e,s,d,i,m){const p=r("v-btn"),u=r("reset-password",!0);return a(),n(u,{onComplete:o.handleComplete,onError:o.handleError},{"success-action":t((()=>[l(p,{color:"primary",onClick:o.goToLogin},{default:t((()=>e[0]||(e[0]=[c(" Continue to Login ")]))),_:1},8,["onClick"])])),_:1},8,["onComplete","onError"])}]]);export{d as default};
2
+ //# sourceMappingURL=ResetPassword-DHODhs-I.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResetPassword-CA8HHOIy.js","sources":["../../src/views/ResetPassword.vue"],"sourcesContent":["<template>\n <reset-password @complete=\"handleComplete\" @error=\"handleError\">\n <template #success-action>\n <v-btn color=\"primary\" @click=\"goToLogin\">\n Continue to Login\n </v-btn>\n </template>\n </reset-password>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { ResetPassword } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'ResetPasswordView',\n\n components: {\n ResetPassword,\n },\n\n methods: {\n handleComplete() {\n console.log('Password reset successfully');\n },\n\n handleError(error: string) {\n console.error('Password reset error:', error);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n },\n});\n</script>\n"],"names":["defineComponent","name","components","ResetPassword","methods","handleComplete","console","log","handleError","error","goToLogin","this","$router","push","_createBlock","_component_reset_password","onComplete","_ctx","onError","_withCtx","_createVNode","_component_v_btn","color","onClick","default","_cache","_createTextVNode","_"],"mappings":"qGAceA,EAAgB,CAC7BC,KAAM,oBAENC,WAAY,CAAAC,cACVA,GAGFC,QAAS,CACP,cAAAC,GACEC,QAAQC,IAAI,8BACd,EAEA,WAAAC,CAAYC,GACVH,QAAQG,MAAM,wBAAyBA,EACzC,EAEA,SAAAC,GACEC,KAAKC,QAAQC,KAAK,CAAEZ,KAAM,SAC5B,6FA/BFa,EAMiBC,EAAA,CANAC,WAAUC,EAAAZ,eAAiBa,QAAOD,EAAAT,aAAA,CACtC,iBAAcW,GACvB,IAEQ,CAFRC,EAEQC,EAAA,CAFDC,MAAM,UAAWC,QAAON,EAAAP,WAAA,CAHrCc,QAAAL,GAGgD,IAE1CM,EAAA,KAAAA,EAAA,GAAA,CALNC,EAGgD,2BAHhDC,EAAA,GAAA,EAAA,CAAA,eAAAA,EAAA,GAAA,EAAA,CAAA,aAAA"}
1
+ {"version":3,"file":"ResetPassword-DHODhs-I.js","sources":["../../src/views/ResetPassword.vue"],"sourcesContent":["<template>\n <reset-password @complete=\"handleComplete\" @error=\"handleError\">\n <template #success-action>\n <v-btn color=\"primary\" @click=\"goToLogin\">\n Continue to Login\n </v-btn>\n </template>\n </reset-password>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { ResetPassword } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'ResetPasswordView',\n\n components: {\n ResetPassword,\n },\n\n methods: {\n handleComplete() {\n console.log('Password reset successfully');\n },\n\n handleError(error: string) {\n console.error('Password reset error:', error);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n },\n});\n</script>\n"],"names":["defineComponent","name","components","ResetPassword","methods","handleComplete","console","log","handleError","error","goToLogin","this","$router","push","_createBlock","_component_reset_password","onComplete","_ctx","onError","_withCtx","_createVNode","_component_v_btn","color","onClick","default","_cache","_createTextVNode","_"],"mappings":"qGAceA,EAAgB,CAC7BC,KAAM,oBAENC,WAAY,CAAAC,cACVA,GAGFC,QAAS,CACP,cAAAC,GACEC,QAAQC,IAAI,8BACd,EAEA,WAAAC,CAAYC,GACVH,QAAQG,MAAM,wBAAyBA,EACzC,EAEA,SAAAC,GACEC,KAAKC,QAAQC,KAAK,CAAEZ,KAAM,SAC5B,6FA/BFa,EAMiBC,EAAA,CANAC,WAAUC,EAAAZ,eAAiBa,QAAOD,EAAAT,aAAA,CACtC,iBAAcW,GACvB,IAEQ,CAFRC,EAEQC,EAAA,CAFDC,MAAM,UAAWC,QAAON,EAAAP,WAAA,CAHrCc,QAAAL,GAGgD,IAE1CM,EAAA,KAAAA,EAAA,GAAA,CALNC,EAGgD,2BAHhDC,EAAA,GAAA,EAAA,CAAA,eAAAA,EAAA,GAAA,EAAA,CAAA,aAAA"}
@@ -1,2 +1,2 @@
1
- import{d as e,I as s,J as t,K as i,g as o,s as r,L as a,_ as l,r as n,f as c,o as d,b as u,c as m,h,w as p,e as g,F as v,n as f,a as y,t as C,M as S,N as w,u as k}from"./index-PISHyq1I.js";import{useDataInputFormStore as F}from"./edit-ui.es-DGbs4pNc.js";import{allCourseWare as b}from"./index-CSo_psn8.js";const L=e({name:"SessionConfiguration",components:{SkMouseTrapToolTip:t,CourseTagFilterWidget:s},props:{initialTimeLimit:{type:Number,required:!0,default:5}},emits:["initStudySession"],data(){return{registeredHotkeys:[],allSelected:!0,activeCourses:[],activeClasses:[],hasRegistrations:!0,user:null,timeLimit:this.initialTimeLimit,courseLoadError:!1,classroomLoadError:!1,expandedFilters:{}}},computed:{hasSelectedSources(){return this.activeCourses.some((e=>e.selected))||this.activeClasses.some((e=>e.selected))},hasAnyActiveFilter(){return this.activeCourses.some((e=>e.selected&&this.hasActiveTagFilter(e)))},activeFilterCount(){return this.activeCourses.filter((e=>e.selected&&this.hasActiveTagFilter(e))).length}},watch:{timeLimit:{handler(){this.timeLimit<=0&&(this.timeLimit=1)}}},beforeUnmount(){this.registeredHotkeys&&this.registeredHotkeys.forEach((e=>{i.removeBinding(e)}))},async created(){this.user=await r(),this.timeLimit=this.initialTimeLimit,this.setHotkeys();const[e,s]=await Promise.allSettled([this.getActiveCourses(),this.getActiveClassrooms()]);"rejected"===e.status&&(console.error("Failed to load courses:",e.reason),this.courseLoadError=!0),"rejected"===s.status&&(console.error("Failed to load classrooms:",s.reason),this.classroomLoadError=!0),0!==this.activeCourses.length||0!==this.activeClasses.length||this.courseLoadError||this.classroomLoadError||(this.hasRegistrations=!1)},mounted(){document.getElementById("SelectAll")?.focus()},unmounted(){this.registeredHotkeys&&this.registeredHotkeys.forEach((e=>{i.removeBinding(e)}))},methods:{inc(){this.timeLimit=this.timeLimit+1,console.log(`inc to ${this.timeLimit}`)},dec(){this.timeLimit--,console.log(`dec to ${this.timeLimit}`)},update(){console.log(JSON.stringify(this.activeCourses)),console.log(JSON.stringify(this.activeClasses))},toggleAll(){console.log("Toggling all courses"),this.activeCourses.forEach((e=>{e.selected=this.allSelected})),this.activeClasses.forEach((e=>{e.selected=this.allSelected})),console.log(JSON.stringify(this.activeCourses))},toggleTagFilter(e){this.expandedFilters[e]=!this.expandedFilters[e]},hasActiveTagFilter:e=>a(e.tagFilter),startSession(){this.registeredHotkeys&&this.registeredHotkeys.forEach((e=>{i.removeBinding(e)}));const e=[...this.activeCourses.filter((e=>e.selected)).map((e=>{const s={type:"course",id:e.courseID};return a(e.tagFilter)&&(s.tagFilter=e.tagFilter),s})),...this.activeClasses.filter((e=>e.selected)).map((e=>({type:"classroom",id:e.classID})))];this.$emit("initStudySession",e,this.timeLimit)},async getActiveClassrooms(){const e=await(await r()).getActiveClasses(),s=[];console.log(`Active classes: ${JSON.stringify(e)}`),await Promise.all(e.map((e=>(async e=>{const t=await o().getClassroomDB(e,"student");s.push({classID:e,name:t.getConfig().name,selected:!0,reviews:0})})(e)))),this.activeClasses=s},async getActiveCourses(){this.activeCourses=(await this.user.getActiveCourses()).map((e=>({...e,selected:!0,name:"",reviews:0,tagFilter:void 0}))),Promise.all(this.activeCourses.map((async(e,s)=>{const t=await o().getCoursesDB().getCourseConfig(e.courseID),i=await(this.user?.getCourseInterface(e.courseID));return(async()=>Promise.all([this.activeCourses[s].name=t.name,this.activeCourses[s].reviews=await i.getScheduledReviewCount()]))()})))},setHotkeys(){const e=[{hotkey:"right",callback:()=>{this.timeLimit++},command:"Increase time limit"},{hotkey:"left",callback:()=>{this.timeLimit--},command:"Decrease time limit"}];i.addBinding(e),this.registeredHotkeys=e.map((e=>e.hotkey))}}}),I={key:0},D={class:"session-layout"},x={class:"course-selection-container"},E={class:"course-row-header"},_={class:"course-row-header"},T={class:"course-row-actions"},A={class:"reviews-count"},V={key:0,class:"tag-filter-container"},P={class:"select-all-row mt-3"},U={class:"fixed-controls-container"},M={class:"fixed-controls"},$={class:"mb-5"},q={key:0,class:"filter-summary mb-4"},B={class:"text-caption"},H={key:1,class:"text-h4"},R={key:2,class:"text-h4"};function z(e,s){return Math.floor(Math.random()*(s-e+1))+e}const O=e({name:"StudyView",components:{SessionConfiguration:l(L,[["render",function(e,s,t,i,o,r){const a=n("v-alert"),l=n("v-checkbox"),S=n("v-icon"),w=n("v-btn"),k=n("CourseTagFilterWidget"),F=n("v-expand-transition"),b=n("v-text-field"),L=n("SkMouseTrapToolTip"),z=n("router-link");return e.hasRegistrations||e.courseLoadError||e.classroomLoadError?(d(),c("div",I,[s[11]||(s[11]=u("div",{"data-cy":"select-quilts-header",class:"text-h4 mb-4"},"Study Session Setup",-1)),e.courseLoadError?(d(),m(a,{key:0,type:"warning",class:"mb-4"},{default:p((()=>s[2]||(s[2]=[g(" Unable to load course data. Some features may be unavailable. ")]))),_:1})):h("",!0),e.classroomLoadError?(d(),m(a,{key:1,type:"warning",class:"mb-4"},{default:p((()=>s[3]||(s[3]=[g(" Unable to load classroom data. You can still study individual courses. ")]))),_:1})):h("",!0),u("div",D,[u("div",x,[s[6]||(s[6]=u("div",{class:"text-h6 mb-3"},"Select Quilts to Study",-1)),(d(!0),c(v,null,f(e.activeClasses,(t=>(d(),c("div",{key:t.classID,class:"course-row"},[u("div",E,[y(l,{modelValue:t.selected,"onUpdate:modelValue":e=>t.selected=e,label:`Class: ${t.name}`,"hide-details":"",onClickCapture:e.update},null,8,["modelValue","onUpdate:modelValue","label","onClickCapture"]),s[4]||(s[4]=u("span",{class:"reviews-count"},"-",-1))])])))),128)),(d(!0),c(v,null,f(e.activeCourses,(t=>(d(),c("div",{key:t.courseID,class:"course-row"},[u("div",_,[y(l,{modelValue:t.selected,"onUpdate:modelValue":e=>t.selected=e,"data-cy":"course-checkbox",label:`q/${t.name}`,"hide-details":"",onClickCapture:e.update},null,8,["modelValue","onUpdate:modelValue","label","onClickCapture"]),u("div",T,[u("span",A,C(t.reviews),1),t.selected?(d(),m(w,{key:0,variant:"text",size:"small",color:e.hasActiveTagFilter(t)?"primary":"default",onClick:s=>e.toggleTagFilter(t.courseID)},{default:p((()=>[y(S,{start:"",size:"small"},{default:p((()=>s[5]||(s[5]=[g("mdi-filter-variant")]))),_:1}),g(" "+C(e.hasActiveTagFilter(t)?"Filtered":"Filter")+" ",1),y(S,{end:"",size:"small"},{default:p((()=>[g(C(e.expandedFilters[t.courseID]?"mdi-chevron-up":"mdi-chevron-down"),1)])),_:2},1024)])),_:2},1032,["color","onClick"])):h("",!0)])]),y(F,null,{default:p((()=>[t.selected&&e.expandedFilters[t.courseID]?(d(),c("div",V,[y(k,{modelValue:t.tagFilter,"onUpdate:modelValue":e=>t.tagFilter=e,"course-id":t.courseID},null,8,["modelValue","onUpdate:modelValue","course-id"])])):h("",!0)])),_:2},1024)])))),128)),u("div",P,[y(l,{id:"SelectAll",ref:"selectAll",modelValue:e.allSelected,"onUpdate:modelValue":[s[0]||(s[0]=s=>e.allSelected=s),e.toggleAll],autofocus:"",label:"Select All","hide-details":""},null,8,["modelValue","onUpdate:modelValue"])])]),u("div",U,[u("div",M,[s[10]||(s[10]=u("div",{class:"text-h6 mb-3"},"Session Settings",-1)),u("div",$,[y(b,{ref:"numberField",modelValue:e.timeLimit,"onUpdate:modelValue":s[1]||(s[1]=s=>e.timeLimit=s),class:"time-limit-field",variant:"outlined",label:"Study Session Timelimit","prepend-inner-icon":"mdi-clock-outline","prepend-icon":"mdi-minus","append-icon":"mdi-plus",suffix:e.timeLimit>1?"minutes":"minute",mask:"##",type:"number","onClick:prepend":e.dec,"onClick:append":e.inc},null,8,["modelValue","suffix","onClick:prepend","onClick:append"])]),e.hasAnyActiveFilter?(d(),c("div",q,[y(S,{size:"small",color:"primary",class:"mr-1"},{default:p((()=>s[7]||(s[7]=[g("mdi-filter")]))),_:1}),u("span",B,C(e.activeFilterCount)+" course"+C(e.activeFilterCount>1?"s":"")+" with tag filters ",1)])):h("",!0),y(L,{hotkey:"enter",command:"Start Session",disabled:!e.hasSelectedSources,"highlight-effect":"scale"},{default:p((()=>[y(w,{"data-cy":"start-studying-button",color:"success",size:"large",block:"",class:"start-btn",disabled:!e.hasSelectedSources,onClick:e.startSession},{default:p((()=>[y(S,{start:""},{default:p((()=>s[8]||(s[8]=[g("mdi-play")]))),_:1}),s[9]||(s[9]=g(" Start! "))])),_:1},8,["disabled","onClick"])])),_:1},8,["disabled"])])])])])):e.courseLoadError||e.classroomLoadError?(d(),c("div",R,s[16]||(s[16]=[u("p",null,"Unable to load study data due to technical issues.",-1),u("p",null,"Please try refreshing the page or contact support if the problem persists.",-1)]))):(d(),c("div",H,[s[15]||(s[15]=u("p",null,"You don't have anything to study!",-1)),u("p",null,[s[13]||(s[13]=g("Head over to the ")),y(z,{to:"/quilts"},{default:p((()=>s[12]||(s[12]=[g("Quilts")]))),_:1}),s[14]||(s[14]=g(" page to find something for you."))])]))}],["__scopeId","data-v-c5ff4b5f"]]),StudySession:S},inject:{router:{from:"router"}},props:{previewCourseID:{type:String,required:!1,default:""},randomPreview:{type:Boolean,required:!1},focusCourseID:{type:String,required:!1,default:""}},data:()=>({user:null,studySessionConfig:void 0,previewCourseConfig:void 0,previewMode:!1,sessionTimeLimit:5,inSession:!1,sessionPrepared:!1,sessionError:!1,errorMessage:"",sessionContentSources:[],dataInputFormStore:F(),getViewComponent:e=>b.getView(e),dataLayer:o()}),async created(){this.user=await r(),this.studySessionConfig={likesConfetti:w().config.likesConfetti};let e="";if(this.randomPreview){const s=await this.user.getCourseRegistrationsDoc(),t=(await o().getCoursesDB().getCourseList()).map((e=>e.courseID)),i=t.filter((e=>!s.courses.some((s=>s.courseID===e))));e=i.length>0?i[z(0,i.length)]:t[z(0,t.length)]}if(this.previewCourseID&&(this.previewMode=!0,o().getCoursesDB().getCourseList().then((e=>{e.forEach((e=>{e.courseID===this.previewCourseID&&(this.previewCourseConfig=e,this.previewCourseConfig.courseID=e.courseID)}))})),console.log(`[Study] COURSE PREVIEW MODE FOR ${this.previewCourseID}`),await this.user.registerForCourse(this.previewCourseID,!0),e=this.previewCourseID),this.focusCourseID&&(console.log(`[Study] FOCUS study session: ${this.focusCourseID}`),e=this.focusCourseID),e){const s=this.parseTagFilterFromQuery(),t={type:"course",id:e};a(s)&&(t.tagFilter=s,console.log("[Study] Tag filter from query params:",s)),this.initStudySession([t],this.sessionTimeLimit)}},methods:{refreshRoute(){this.router.go(0)},async initStudySession(e,s){console.log(`[Study] starting study session w/ sources: ${JSON.stringify(e)}`),this.sessionContentSources=e,this.sessionTimeLimit=s,this.inSession=!0,this.sessionPrepared=!1,console.log("[Study] Waiting for session-prepared event from StudySession component")},registerUserForPreviewCourse(){this.user.registerForCourse(this.previewCourseConfig.courseID).then((()=>this.router.push(`/quilts/${this.previewCourseConfig.courseID}`)))},handleSessionFinished(){this.refreshRoute()},handleSessionPrepared(){console.log("[Study] Session preparation complete - received session-prepared event"),this.sessionPrepared=!0,this.sessionError=!1,this.errorMessage=""},handleSessionError({message:e,error:s}){console.error("[Study] Session error:",e,s),this.sessionError=!0,this.errorMessage=e||"An error occurred while preparing your study session.",this.sessionPrepared=!1},parseTagFilterFromQuery(){const e=this.$route.query.include,s=this.$route.query.exclude,t=e=>e?Array.isArray(e)?e.flatMap((e=>e?e.split(",").map((e=>e.trim())):[])).filter(Boolean):e.split(",").map((e=>e.trim())).filter(Boolean):[];return{include:t(e),exclude:t(s)}}}}),j={key:0},N={key:1},J={key:0,align:"center"},Q={class:"text-h5"},W={key:1},Y={key:2},G={key:0,class:"session-loading"},K={key:1,class:"session-error"},X={class:"text-subtitle-1 mt-2"};const Z=l(O,[["render",function(e,s,t,i,o,r){const a=n("SessionConfiguration"),l=n("v-btn"),m=n("router-link"),v=n("v-spacer"),f=n("v-col"),S=n("v-row"),w=n("v-progress-circular"),F=n("v-container"),b=n("v-icon"),L=n("StudySession");return e.inSession?(d(),c("div",N,[e.previewMode&&e.previewCourseConfig?(d(),c("div",J,[y(S,null,{default:p((()=>[y(f,null,{default:p((()=>[u("span",Q,[s[1]||(s[1]=g(" Quilt preview for ")),u("em",null,C(e.previewCourseConfig.name),1)]),y(l,{size:"small",color:"primary",onClick:e.registerUserForPreviewCourse},{default:p((()=>s[2]||(s[2]=[g("Join")]))),_:1},8,["onClick"]),y(m,{to:`/quilts/${e.previewCourseConfig.courseID}`},{default:p((()=>[y(l,{size:"small",color:"secondary"},{default:p((()=>s[3]||(s[3]=[g("More info")]))),_:1})])),_:1},8,["to"]),y(v)])),_:1})])),_:1})])):e.previewMode?(d(),c("div",W,[y(S,null,{default:p((()=>[y(f,null,{default:p((()=>s[4]||(s[4]=[u("span",{class:"text-h5"},"... No course was specified for the preview.",-1),u("div",null,"(this shouldn't happen)...",-1)]))),_:1})])),_:1})])):h("",!0),e.inSession?(d(),c("div",Y,[e.sessionPrepared||e.sessionError?h("",!0):(d(),c("div",G,[y(F,{class:"text-center"},{default:p((()=>[y(S,{justify:"center",align:"center",style:{"min-height":"50vh"}},{default:p((()=>[y(f,{cols:"12"},{default:p((()=>[y(w,{size:"70",width:"7",color:"primary",indeterminate:""}),s[5]||(s[5]=u("div",{class:"text-h5 mt-4"},"Preparing your study session...",-1)),s[6]||(s[6]=u("div",{class:"text-subtitle-1 mt-2"},"Getting your learning materials ready",-1))])),_:1})])),_:1})])),_:1})])),e.sessionError?(d(),c("div",K,[y(F,{class:"text-center"},{default:p((()=>[y(S,{justify:"center",align:"center",style:{"min-height":"50vh"}},{default:p((()=>[y(f,{cols:"12"},{default:p((()=>[y(b,{size:"64",color:"error"},{default:p((()=>s[7]||(s[7]=[g("mdi-alert-circle")]))),_:1}),s[9]||(s[9]=u("div",{class:"text-h5 mt-4 text-error"},"Session Preparation Failed",-1)),u("div",X,C(e.errorMessage||"There was a problem preparing your study session."),1),y(l,{color:"primary",class:"mt-6",onClick:e.refreshRoute},{default:p((()=>s[8]||(s[8]=[g("Try Again")]))),_:1},8,["onClick"])])),_:1})])),_:1})])),_:1})])):h("",!0),y(L,{"content-sources":e.sessionContentSources,"session-time-limit":e.sessionTimeLimit,user:e.user,"session-config":e.studySessionConfig,"data-layer":e.dataLayer,"get-view-component":e.getViewComponent,class:k({"hidden-session":!e.sessionPrepared}),onSessionFinished:e.handleSessionFinished,onSessionPrepared:e.handleSessionPrepared,onSessionError:e.handleSessionError},null,8,["content-sources","session-time-limit","user","session-config","data-layer","get-view-component","class","onSessionFinished","onSessionPrepared","onSessionError"])])):h("",!0)])):(d(),c("div",j,[y(a,{"initial-time-limit":e.sessionTimeLimit,onInitStudySession:s[0]||(s[0]=(s,t)=>e.initStudySession(s,t))},null,8,["initial-time-limit"])]))}],["__scopeId","data-v-dcbc1fde"]]);export{Z as default};
2
- //# sourceMappingURL=Study-B4tBks0X.js.map
1
+ import{d as e,I as s,J as t,K as i,g as o,s as r,L as a,_ as l,r as n,f as c,o as d,b as u,c as m,h,w as p,e as g,F as v,n as f,a as y,t as C,M as S,N as w,u as k}from"./index-2oekPD75.js";import{useDataInputFormStore as F}from"./edit-ui.es-1BaJ_I4B.js";import{allCourseWare as b}from"./index-DHivZCyO.js";const L=e({name:"SessionConfiguration",components:{SkMouseTrapToolTip:t,CourseTagFilterWidget:s},props:{initialTimeLimit:{type:Number,required:!0,default:5}},emits:["initStudySession"],data(){return{registeredHotkeys:[],allSelected:!0,activeCourses:[],activeClasses:[],hasRegistrations:!0,user:null,timeLimit:this.initialTimeLimit,courseLoadError:!1,classroomLoadError:!1,expandedFilters:{}}},computed:{hasSelectedSources(){return this.activeCourses.some((e=>e.selected))||this.activeClasses.some((e=>e.selected))},hasAnyActiveFilter(){return this.activeCourses.some((e=>e.selected&&this.hasActiveTagFilter(e)))},activeFilterCount(){return this.activeCourses.filter((e=>e.selected&&this.hasActiveTagFilter(e))).length}},watch:{timeLimit:{handler(){this.timeLimit<=0&&(this.timeLimit=1)}}},beforeUnmount(){this.registeredHotkeys&&this.registeredHotkeys.forEach((e=>{i.removeBinding(e)}))},async created(){this.user=await r(),this.timeLimit=this.initialTimeLimit,this.setHotkeys();const[e,s]=await Promise.allSettled([this.getActiveCourses(),this.getActiveClassrooms()]);"rejected"===e.status&&(console.error("Failed to load courses:",e.reason),this.courseLoadError=!0),"rejected"===s.status&&(console.error("Failed to load classrooms:",s.reason),this.classroomLoadError=!0),0!==this.activeCourses.length||0!==this.activeClasses.length||this.courseLoadError||this.classroomLoadError||(this.hasRegistrations=!1)},mounted(){document.getElementById("SelectAll")?.focus()},unmounted(){this.registeredHotkeys&&this.registeredHotkeys.forEach((e=>{i.removeBinding(e)}))},methods:{inc(){this.timeLimit=this.timeLimit+1,console.log(`inc to ${this.timeLimit}`)},dec(){this.timeLimit--,console.log(`dec to ${this.timeLimit}`)},update(){console.log(JSON.stringify(this.activeCourses)),console.log(JSON.stringify(this.activeClasses))},toggleAll(){console.log("Toggling all courses"),this.activeCourses.forEach((e=>{e.selected=this.allSelected})),this.activeClasses.forEach((e=>{e.selected=this.allSelected})),console.log(JSON.stringify(this.activeCourses))},toggleTagFilter(e){this.expandedFilters[e]=!this.expandedFilters[e]},hasActiveTagFilter:e=>a(e.tagFilter),startSession(){this.registeredHotkeys&&this.registeredHotkeys.forEach((e=>{i.removeBinding(e)}));const e=[...this.activeCourses.filter((e=>e.selected)).map((e=>{const s={type:"course",id:e.courseID};return a(e.tagFilter)&&(s.tagFilter=e.tagFilter),s})),...this.activeClasses.filter((e=>e.selected)).map((e=>({type:"classroom",id:e.classID})))];this.$emit("initStudySession",e,this.timeLimit)},async getActiveClassrooms(){const e=await(await r()).getActiveClasses(),s=[];console.log(`Active classes: ${JSON.stringify(e)}`),await Promise.all(e.map((e=>(async e=>{const t=await o().getClassroomDB(e,"student");s.push({classID:e,name:t.getConfig().name,selected:!0,reviews:0})})(e)))),this.activeClasses=s},async getActiveCourses(){this.activeCourses=(await this.user.getActiveCourses()).map((e=>({...e,selected:!0,name:"",reviews:0,tagFilter:void 0}))),Promise.all(this.activeCourses.map((async(e,s)=>{const t=await o().getCoursesDB().getCourseConfig(e.courseID),i=await(this.user?.getCourseInterface(e.courseID));return(async()=>Promise.all([this.activeCourses[s].name=t.name,this.activeCourses[s].reviews=await i.getScheduledReviewCount()]))()})))},setHotkeys(){const e=[{hotkey:"right",callback:()=>{this.timeLimit++},command:"Increase time limit"},{hotkey:"left",callback:()=>{this.timeLimit--},command:"Decrease time limit"}];i.addBinding(e),this.registeredHotkeys=e.map((e=>e.hotkey))}}}),I={key:0},D={class:"session-layout"},x={class:"course-selection-container"},E={class:"course-row-header"},_={class:"course-row-header"},T={class:"course-row-actions"},A={class:"reviews-count"},V={key:0,class:"tag-filter-container"},P={class:"select-all-row mt-3"},U={class:"fixed-controls-container"},M={class:"fixed-controls"},$={class:"mb-5"},q={key:0,class:"filter-summary mb-4"},B={class:"text-caption"},H={key:1,class:"text-h4"},R={key:2,class:"text-h4"};function z(e,s){return Math.floor(Math.random()*(s-e+1))+e}const O=e({name:"StudyView",components:{SessionConfiguration:l(L,[["render",function(e,s,t,i,o,r){const a=n("v-alert"),l=n("v-checkbox"),S=n("v-icon"),w=n("v-btn"),k=n("CourseTagFilterWidget"),F=n("v-expand-transition"),b=n("v-text-field"),L=n("SkMouseTrapToolTip"),z=n("router-link");return e.hasRegistrations||e.courseLoadError||e.classroomLoadError?(d(),c("div",I,[s[11]||(s[11]=u("div",{"data-cy":"select-quilts-header",class:"text-h4 mb-4"},"Study Session Setup",-1)),e.courseLoadError?(d(),m(a,{key:0,type:"warning",class:"mb-4"},{default:p((()=>s[2]||(s[2]=[g(" Unable to load course data. Some features may be unavailable. ")]))),_:1})):h("",!0),e.classroomLoadError?(d(),m(a,{key:1,type:"warning",class:"mb-4"},{default:p((()=>s[3]||(s[3]=[g(" Unable to load classroom data. You can still study individual courses. ")]))),_:1})):h("",!0),u("div",D,[u("div",x,[s[6]||(s[6]=u("div",{class:"text-h6 mb-3"},"Select Quilts to Study",-1)),(d(!0),c(v,null,f(e.activeClasses,(t=>(d(),c("div",{key:t.classID,class:"course-row"},[u("div",E,[y(l,{modelValue:t.selected,"onUpdate:modelValue":e=>t.selected=e,label:`Class: ${t.name}`,"hide-details":"",onClickCapture:e.update},null,8,["modelValue","onUpdate:modelValue","label","onClickCapture"]),s[4]||(s[4]=u("span",{class:"reviews-count"},"-",-1))])])))),128)),(d(!0),c(v,null,f(e.activeCourses,(t=>(d(),c("div",{key:t.courseID,class:"course-row"},[u("div",_,[y(l,{modelValue:t.selected,"onUpdate:modelValue":e=>t.selected=e,"data-cy":"course-checkbox",label:`q/${t.name}`,"hide-details":"",onClickCapture:e.update},null,8,["modelValue","onUpdate:modelValue","label","onClickCapture"]),u("div",T,[u("span",A,C(t.reviews),1),t.selected?(d(),m(w,{key:0,variant:"text",size:"small",color:e.hasActiveTagFilter(t)?"primary":"default",onClick:s=>e.toggleTagFilter(t.courseID)},{default:p((()=>[y(S,{start:"",size:"small"},{default:p((()=>s[5]||(s[5]=[g("mdi-filter-variant")]))),_:1}),g(" "+C(e.hasActiveTagFilter(t)?"Filtered":"Filter")+" ",1),y(S,{end:"",size:"small"},{default:p((()=>[g(C(e.expandedFilters[t.courseID]?"mdi-chevron-up":"mdi-chevron-down"),1)])),_:2},1024)])),_:2},1032,["color","onClick"])):h("",!0)])]),y(F,null,{default:p((()=>[t.selected&&e.expandedFilters[t.courseID]?(d(),c("div",V,[y(k,{modelValue:t.tagFilter,"onUpdate:modelValue":e=>t.tagFilter=e,"course-id":t.courseID},null,8,["modelValue","onUpdate:modelValue","course-id"])])):h("",!0)])),_:2},1024)])))),128)),u("div",P,[y(l,{id:"SelectAll",ref:"selectAll",modelValue:e.allSelected,"onUpdate:modelValue":[s[0]||(s[0]=s=>e.allSelected=s),e.toggleAll],autofocus:"",label:"Select All","hide-details":""},null,8,["modelValue","onUpdate:modelValue"])])]),u("div",U,[u("div",M,[s[10]||(s[10]=u("div",{class:"text-h6 mb-3"},"Session Settings",-1)),u("div",$,[y(b,{ref:"numberField",modelValue:e.timeLimit,"onUpdate:modelValue":s[1]||(s[1]=s=>e.timeLimit=s),class:"time-limit-field",variant:"outlined",label:"Study Session Timelimit","prepend-inner-icon":"mdi-clock-outline","prepend-icon":"mdi-minus","append-icon":"mdi-plus",suffix:e.timeLimit>1?"minutes":"minute",mask:"##",type:"number","onClick:prepend":e.dec,"onClick:append":e.inc},null,8,["modelValue","suffix","onClick:prepend","onClick:append"])]),e.hasAnyActiveFilter?(d(),c("div",q,[y(S,{size:"small",color:"primary",class:"mr-1"},{default:p((()=>s[7]||(s[7]=[g("mdi-filter")]))),_:1}),u("span",B,C(e.activeFilterCount)+" course"+C(e.activeFilterCount>1?"s":"")+" with tag filters ",1)])):h("",!0),y(L,{hotkey:"enter",command:"Start Session",disabled:!e.hasSelectedSources,"highlight-effect":"scale"},{default:p((()=>[y(w,{"data-cy":"start-studying-button",color:"success",size:"large",block:"",class:"start-btn",disabled:!e.hasSelectedSources,onClick:e.startSession},{default:p((()=>[y(S,{start:""},{default:p((()=>s[8]||(s[8]=[g("mdi-play")]))),_:1}),s[9]||(s[9]=g(" Start! "))])),_:1},8,["disabled","onClick"])])),_:1},8,["disabled"])])])])])):e.courseLoadError||e.classroomLoadError?(d(),c("div",R,s[16]||(s[16]=[u("p",null,"Unable to load study data due to technical issues.",-1),u("p",null,"Please try refreshing the page or contact support if the problem persists.",-1)]))):(d(),c("div",H,[s[15]||(s[15]=u("p",null,"You don't have anything to study!",-1)),u("p",null,[s[13]||(s[13]=g("Head over to the ")),y(z,{to:"/quilts"},{default:p((()=>s[12]||(s[12]=[g("Quilts")]))),_:1}),s[14]||(s[14]=g(" page to find something for you."))])]))}],["__scopeId","data-v-c5ff4b5f"]]),StudySession:S},inject:{router:{from:"router"}},props:{previewCourseID:{type:String,required:!1,default:""},randomPreview:{type:Boolean,required:!1},focusCourseID:{type:String,required:!1,default:""}},data:()=>({user:null,studySessionConfig:void 0,previewCourseConfig:void 0,previewMode:!1,sessionTimeLimit:5,inSession:!1,sessionPrepared:!1,sessionError:!1,errorMessage:"",sessionContentSources:[],dataInputFormStore:F(),getViewComponent:e=>b.getView(e),dataLayer:o()}),async created(){this.user=await r(),this.studySessionConfig={likesConfetti:w().config.likesConfetti};let e="";if(this.randomPreview){const s=await this.user.getCourseRegistrationsDoc(),t=(await o().getCoursesDB().getCourseList()).map((e=>e.courseID)),i=t.filter((e=>!s.courses.some((s=>s.courseID===e))));e=i.length>0?i[z(0,i.length)]:t[z(0,t.length)]}if(this.previewCourseID&&(this.previewMode=!0,o().getCoursesDB().getCourseList().then((e=>{e.forEach((e=>{e.courseID===this.previewCourseID&&(this.previewCourseConfig=e,this.previewCourseConfig.courseID=e.courseID)}))})),console.log(`[Study] COURSE PREVIEW MODE FOR ${this.previewCourseID}`),await this.user.registerForCourse(this.previewCourseID,!0),e=this.previewCourseID),this.focusCourseID&&(console.log(`[Study] FOCUS study session: ${this.focusCourseID}`),e=this.focusCourseID),e){const s=this.parseTagFilterFromQuery(),t={type:"course",id:e};a(s)&&(t.tagFilter=s,console.log("[Study] Tag filter from query params:",s)),this.initStudySession([t],this.sessionTimeLimit)}},methods:{refreshRoute(){this.router.go(0)},async initStudySession(e,s){console.log(`[Study] starting study session w/ sources: ${JSON.stringify(e)}`),this.sessionContentSources=e,this.sessionTimeLimit=s,this.inSession=!0,this.sessionPrepared=!1,console.log("[Study] Waiting for session-prepared event from StudySession component")},registerUserForPreviewCourse(){this.user.registerForCourse(this.previewCourseConfig.courseID).then((()=>this.router.push(`/quilts/${this.previewCourseConfig.courseID}`)))},handleSessionFinished(){this.refreshRoute()},handleSessionPrepared(){console.log("[Study] Session preparation complete - received session-prepared event"),this.sessionPrepared=!0,this.sessionError=!1,this.errorMessage=""},handleSessionError({message:e,error:s}){console.error("[Study] Session error:",e,s),this.sessionError=!0,this.errorMessage=e||"An error occurred while preparing your study session.",this.sessionPrepared=!1},parseTagFilterFromQuery(){const e=this.$route.query.include,s=this.$route.query.exclude,t=e=>e?Array.isArray(e)?e.flatMap((e=>e?e.split(",").map((e=>e.trim())):[])).filter(Boolean):e.split(",").map((e=>e.trim())).filter(Boolean):[];return{include:t(e),exclude:t(s)}}}}),j={key:0},N={key:1},J={key:0,align:"center"},Q={class:"text-h5"},W={key:1},Y={key:2},G={key:0,class:"session-loading"},K={key:1,class:"session-error"},X={class:"text-subtitle-1 mt-2"};const Z=l(O,[["render",function(e,s,t,i,o,r){const a=n("SessionConfiguration"),l=n("v-btn"),m=n("router-link"),v=n("v-spacer"),f=n("v-col"),S=n("v-row"),w=n("v-progress-circular"),F=n("v-container"),b=n("v-icon"),L=n("StudySession");return e.inSession?(d(),c("div",N,[e.previewMode&&e.previewCourseConfig?(d(),c("div",J,[y(S,null,{default:p((()=>[y(f,null,{default:p((()=>[u("span",Q,[s[1]||(s[1]=g(" Quilt preview for ")),u("em",null,C(e.previewCourseConfig.name),1)]),y(l,{size:"small",color:"primary",onClick:e.registerUserForPreviewCourse},{default:p((()=>s[2]||(s[2]=[g("Join")]))),_:1},8,["onClick"]),y(m,{to:`/quilts/${e.previewCourseConfig.courseID}`},{default:p((()=>[y(l,{size:"small",color:"secondary"},{default:p((()=>s[3]||(s[3]=[g("More info")]))),_:1})])),_:1},8,["to"]),y(v)])),_:1})])),_:1})])):e.previewMode?(d(),c("div",W,[y(S,null,{default:p((()=>[y(f,null,{default:p((()=>s[4]||(s[4]=[u("span",{class:"text-h5"},"... No course was specified for the preview.",-1),u("div",null,"(this shouldn't happen)...",-1)]))),_:1})])),_:1})])):h("",!0),e.inSession?(d(),c("div",Y,[e.sessionPrepared||e.sessionError?h("",!0):(d(),c("div",G,[y(F,{class:"text-center"},{default:p((()=>[y(S,{justify:"center",align:"center",style:{"min-height":"50vh"}},{default:p((()=>[y(f,{cols:"12"},{default:p((()=>[y(w,{size:"70",width:"7",color:"primary",indeterminate:""}),s[5]||(s[5]=u("div",{class:"text-h5 mt-4"},"Preparing your study session...",-1)),s[6]||(s[6]=u("div",{class:"text-subtitle-1 mt-2"},"Getting your learning materials ready",-1))])),_:1})])),_:1})])),_:1})])),e.sessionError?(d(),c("div",K,[y(F,{class:"text-center"},{default:p((()=>[y(S,{justify:"center",align:"center",style:{"min-height":"50vh"}},{default:p((()=>[y(f,{cols:"12"},{default:p((()=>[y(b,{size:"64",color:"error"},{default:p((()=>s[7]||(s[7]=[g("mdi-alert-circle")]))),_:1}),s[9]||(s[9]=u("div",{class:"text-h5 mt-4 text-error"},"Session Preparation Failed",-1)),u("div",X,C(e.errorMessage||"There was a problem preparing your study session."),1),y(l,{color:"primary",class:"mt-6",onClick:e.refreshRoute},{default:p((()=>s[8]||(s[8]=[g("Try Again")]))),_:1},8,["onClick"])])),_:1})])),_:1})])),_:1})])):h("",!0),y(L,{"content-sources":e.sessionContentSources,"session-time-limit":e.sessionTimeLimit,user:e.user,"session-config":e.studySessionConfig,"data-layer":e.dataLayer,"get-view-component":e.getViewComponent,class:k({"hidden-session":!e.sessionPrepared}),onSessionFinished:e.handleSessionFinished,onSessionPrepared:e.handleSessionPrepared,onSessionError:e.handleSessionError},null,8,["content-sources","session-time-limit","user","session-config","data-layer","get-view-component","class","onSessionFinished","onSessionPrepared","onSessionError"])])):h("",!0)])):(d(),c("div",j,[y(a,{"initial-time-limit":e.sessionTimeLimit,onInitStudySession:s[0]||(s[0]=(s,t)=>e.initStudySession(s,t))},null,8,["initial-time-limit"])]))}],["__scopeId","data-v-dcbc1fde"]]);export{Z as default};
2
+ //# sourceMappingURL=Study-C5YvoMU9.js.map