@vue-skuilder/platform-ui 0.1.40 → 0.2.0

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 (40) hide show
  1. package/dist/assets/{About-BGB7Xnk6.js → About-DZu4NTIu.js} +2 -2
  2. package/dist/assets/{About-BGB7Xnk6.js.map → About-DZu4NTIu.js.map} +1 -1
  3. package/dist/assets/{AdminDashboard-iNWJ0DEZ.js → AdminDashboard-DCmQRZN6.js} +2 -2
  4. package/dist/assets/{AdminDashboard-iNWJ0DEZ.js.map → AdminDashboard-DCmQRZN6.js.map} +1 -1
  5. package/dist/assets/{ClassroomCtrlPanel-DF2rs7CR.js → ClassroomCtrlPanel-CNEQoPZp.js} +2 -2
  6. package/dist/assets/{ClassroomCtrlPanel-DF2rs7CR.js.map → ClassroomCtrlPanel-CNEQoPZp.js.map} +1 -1
  7. package/dist/assets/{Classrooms-Cds87MEv.js → Classrooms-DrUSuX7I.js} +2 -2
  8. package/dist/assets/{Classrooms-Cds87MEv.js.map → Classrooms-DrUSuX7I.js.map} +1 -1
  9. package/dist/assets/{CourseRouter-BmYgrlh9.js → CourseRouter-DWzw8dyy.js} +2 -2
  10. package/dist/assets/{CourseRouter-BmYgrlh9.js.map → CourseRouter-DWzw8dyy.js.map} +1 -1
  11. package/dist/assets/{Courses-D910P_cq.js → Courses-DxcRq-5E.js} +2 -2
  12. package/dist/assets/{Courses-D910P_cq.js.map → Courses-DxcRq-5E.js.map} +1 -1
  13. package/dist/assets/{EloModeration-Bz9h6sZo.js → EloModeration-BDANQSZq.js} +2 -2
  14. package/dist/assets/{EloModeration-Bz9h6sZo.js.map → EloModeration-BDANQSZq.js.map} +1 -1
  15. package/dist/assets/{JoinCode-KxUHyJpf.js → JoinCode-CD-qC0t-.js} +2 -2
  16. package/dist/assets/{JoinCode-KxUHyJpf.js.map → JoinCode-CD-qC0t-.js.map} +1 -1
  17. package/dist/assets/{NewCourseDialog-WAOXxQ3Q.js → NewCourseDialog-BvMq0P3v.js} +2 -2
  18. package/dist/assets/{NewCourseDialog-WAOXxQ3Q.js.map → NewCourseDialog-BvMq0P3v.js.map} +1 -1
  19. package/dist/assets/{ReleaseNotes-1XFtTIvr.js → ReleaseNotes-ChSHK0Pw.js} +2 -2
  20. package/dist/assets/{ReleaseNotes-1XFtTIvr.js.map → ReleaseNotes-ChSHK0Pw.js.map} +1 -1
  21. package/dist/assets/{RequestPasswordReset-bUrIWjSL.js → RequestPasswordReset-DbBbksWK.js} +2 -2
  22. package/dist/assets/{RequestPasswordReset-bUrIWjSL.js.map → RequestPasswordReset-DbBbksWK.js.map} +1 -1
  23. package/dist/assets/{ResetPassword-DVWDFCo3.js → ResetPassword-ByELNYeE.js} +2 -2
  24. package/dist/assets/{ResetPassword-DVWDFCo3.js.map → ResetPassword-ByELNYeE.js.map} +1 -1
  25. package/dist/assets/{Study-D51p-shx.js → Study-C5xTkc5i.js} +2 -2
  26. package/dist/assets/{Study-D51p-shx.js.map → Study-C5xTkc5i.js.map} +1 -1
  27. package/dist/assets/{TagInformation-DkMk7Stg.js → TagInformation-xcQmwCTt.js} +2 -2
  28. package/dist/assets/{TagInformation-DkMk7Stg.js.map → TagInformation-xcQmwCTt.js.map} +1 -1
  29. package/dist/assets/{User-Bp1AnmLz.js → User-Bi_H1hZ6.js} +2 -2
  30. package/dist/assets/{User-Bp1AnmLz.js.map → User-Bi_H1hZ6.js.map} +1 -1
  31. package/dist/assets/{VerifyEmail-Dy1h9JYW.js → VerifyEmail-DkOQwwnD.js} +2 -2
  32. package/dist/assets/{VerifyEmail-Dy1h9JYW.js.map → VerifyEmail-DkOQwwnD.js.map} +1 -1
  33. package/dist/assets/{index-Bu4mzQrw.js → index-uBAgCbRp.js} +4 -4
  34. package/dist/assets/{index-Bu4mzQrw.js.map → index-uBAgCbRp.js.map} +1 -1
  35. package/dist/assets/{server-DoenpmEE.js → server-C80ynHJm.js} +2 -2
  36. package/dist/assets/{server-DoenpmEE.js.map → server-C80ynHJm.js.map} +1 -1
  37. package/dist/index.html +1 -1
  38. package/dist/sw.js +1 -1
  39. package/dist/sw.js.map +1 -1
  40. package/package.json +7 -7
@@ -1,3 +1,3 @@
1
- import{i as e}from"./chunk-D6hFPZc3.js";import{$ as t,C as n,H as r,K as i,M as a,S as o,T as s,Vt as c,W as l,Y as u,_ as d,b as f,f as p,v as m,y as h}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{T as g,v as _}from"./common-ui.es-lR5lAjyE.js";import{T as v,f as y,w as b}from"./dist-leWgtXBf.js";import"./MarkdownRenderer-DoVbFpA6-CvaBjTS8.js";import{k as x}from"./dist-B8xeftM2.js";import{t as S}from"./index-Bu4mzQrw.js";import{t as C}from"./server-DoenpmEE.js";import{t as w}from"./NewCourseDialog-WAOXxQ3Q.js";var T=s({name:`CourseStubCard`,props:{courseId:{type:String,required:!0}},emits:[`refresh`],data(){return{courseConfig:null,questionCount:0,isPrivate:!1,updatePending:!0,addingCourse:!1}},async created(){try{let e=x().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,y(`Attempting to register for ${this.courseId}.`),await(await g()).registerForCourse(this.courseId),this.$emit(`refresh`)},navigateToInfo(){let e=`/q/${this.courseConfig?.name.replaceAll(` `,`_`)}`;this.$router.push(e)}}});function _sfc_render$1(e,a,s,l,u,f){let p=i(`v-icon`),g=i(`v-card-title`),_=i(`v-card-item`),v=i(`v-card-text`),y=i(`v-btn`),b=i(`v-card-actions`),x=i(`v-card`);return!e.updatePending&&e.courseConfig?(r(),m(x,{key:0,"data-cy":`available-course-card`},{default:t(()=>[n(_,null,{default:t(()=>[n(g,{"data-cy":`course-title`},{default:t(()=>[o(c(e.courseConfig.name)+` `,1),e.isPrivate?(r(),m(p,{key:0,icon:`mdi-eye-off`,class:`ml-2`})):h(``,!0)]),_:1})]),_:1}),n(v,null,{default:t(()=>[o(` Questions: `+c(e.questionCount)+` `,1),d(`p`,null,c(e.courseConfig.description),1)]),_:1}),n(b,null,{default:t(()=>[n(y,{color:`primary`,onClick:e.navigateToInfo},{default:t(()=>a[0]||(a[0]=[o(`More Info`)])),_:1},8,[`onClick`]),n(y,{"data-cy":`register-course-button`,loading:e.addingCourse,color:`primary`,onClick:e.registerForCourse},{default:t(()=>a[1]||(a[1]=[o(` Register `)])),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})):h(``,!0)}e(_sfc_render$1,`_sfc_render`);var E=s({name:`CoursesView`,components:{NewCourseDialog:w,CourseStubCard:S(T,[[`render`,_sfc_render$1]])},data(){return{existingCourses:[],registeredCourses:[],awaitingCreateCourse:!1,spinnerMap:{},newCourseDialog:!1,user:null,myQuiltsPanel:0,showAllCourses:!1,coursesPerPage:8}},computed:{availableCourses(){let e=this.existingCourses.filter(e=>!this.registeredCourses.includes(e)),t=this.user?.getUsername();return e.filter(e=>t?e.public||e.creator===t||e.admins.indexOf(t)!==-1||e.moderators.indexOf(t)!==-1:!1)},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 g(),this.refreshData()},methods:{processResponse(){this.newCourseDialog=!1,this.refreshData()},toggleShowMore(){this.showAllCourses=!this.showAllCourses},async refreshData(){console.log(`Pulling user course data...`);try{let e=(await this.user.getCourseRegistrationsDoc()).courses.filter(e=>e.status===`active`||e.status===`maintenance-mode`||e.status===void 0).map(e=>e.courseID);console.log(`userCourseIDs: ${e}`),this.existingCourses=await x().getCoursesDB().getCourseList(),console.log(`existingCourses: \n\t${this.existingCourses.map(e=>e.name).join(`,
1
+ import{i as e}from"./chunk-D6hFPZc3.js";import{$ as t,C as n,H as r,K as i,M as a,S as o,T as s,Vt as c,W as l,Y as u,_ as d,b as f,f as p,v as m,y as h}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{T as g,v as _}from"./common-ui.es-lR5lAjyE.js";import{T as v,f as y,w as b}from"./dist-leWgtXBf.js";import"./MarkdownRenderer-DoVbFpA6-CvaBjTS8.js";import{k as x}from"./dist-B8xeftM2.js";import{t as S}from"./index-uBAgCbRp.js";import{t as C}from"./server-C80ynHJm.js";import{t as w}from"./NewCourseDialog-BvMq0P3v.js";var T=s({name:`CourseStubCard`,props:{courseId:{type:String,required:!0}},emits:[`refresh`],data(){return{courseConfig:null,questionCount:0,isPrivate:!1,updatePending:!0,addingCourse:!1}},async created(){try{let e=x().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,y(`Attempting to register for ${this.courseId}.`),await(await g()).registerForCourse(this.courseId),this.$emit(`refresh`)},navigateToInfo(){let e=`/q/${this.courseConfig?.name.replaceAll(` `,`_`)}`;this.$router.push(e)}}});function _sfc_render$1(e,a,s,l,u,f){let p=i(`v-icon`),g=i(`v-card-title`),_=i(`v-card-item`),v=i(`v-card-text`),y=i(`v-btn`),b=i(`v-card-actions`),x=i(`v-card`);return!e.updatePending&&e.courseConfig?(r(),m(x,{key:0,"data-cy":`available-course-card`},{default:t(()=>[n(_,null,{default:t(()=>[n(g,{"data-cy":`course-title`},{default:t(()=>[o(c(e.courseConfig.name)+` `,1),e.isPrivate?(r(),m(p,{key:0,icon:`mdi-eye-off`,class:`ml-2`})):h(``,!0)]),_:1})]),_:1}),n(v,null,{default:t(()=>[o(` Questions: `+c(e.questionCount)+` `,1),d(`p`,null,c(e.courseConfig.description),1)]),_:1}),n(b,null,{default:t(()=>[n(y,{color:`primary`,onClick:e.navigateToInfo},{default:t(()=>a[0]||(a[0]=[o(`More Info`)])),_:1},8,[`onClick`]),n(y,{"data-cy":`register-course-button`,loading:e.addingCourse,color:`primary`,onClick:e.registerForCourse},{default:t(()=>a[1]||(a[1]=[o(` Register `)])),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})):h(``,!0)}e(_sfc_render$1,`_sfc_render`);var E=s({name:`CoursesView`,components:{NewCourseDialog:w,CourseStubCard:S(T,[[`render`,_sfc_render$1]])},data(){return{existingCourses:[],registeredCourses:[],awaitingCreateCourse:!1,spinnerMap:{},newCourseDialog:!1,user:null,myQuiltsPanel:0,showAllCourses:!1,coursesPerPage:8}},computed:{availableCourses(){let e=this.existingCourses.filter(e=>!this.registeredCourses.includes(e)),t=this.user?.getUsername();return e.filter(e=>t?e.public||e.creator===t||e.admins.indexOf(t)!==-1||e.moderators.indexOf(t)!==-1:!1)},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 g(),this.refreshData()},methods:{processResponse(){this.newCourseDialog=!1,this.refreshData()},toggleShowMore(){this.showAllCourses=!this.showAllCourses},async refreshData(){console.log(`Pulling user course data...`);try{let e=(await this.user.getCourseRegistrationsDoc()).courses.filter(e=>e.status===`active`||e.status===`maintenance-mode`||e.status===void 0).map(e=>e.courseID);console.log(`userCourseIDs: ${e}`),this.existingCourses=await x().getCoursesDB().getCourseList(),console.log(`existingCourses: \n\t${this.existingCourses.map(e=>e.name).join(`,
2
2
  `)}`),this.registeredCourses=this.existingCourses.filter(t=>{let n=!1;return e.forEach(e=>{t.courseID===e&&(n=!0)}),n})}catch(e){console.error(`Error refreshing course data:`,e),_({status:v.error,text:`Failed to load courses: ${e||`Database access error`}`})}},async createCourse(){this.awaitingCreateCourse=!0;let e=await C({type:b.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});_({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()}}}),D={class:`d-flex align-center justify-space-between`},O={"data-cy":`registered-course`,class:`d-flex align-center`};function _sfc_render(e,s,g,_,v,y){let b=i(`v-btn`),x=i(`v-expansion-panel-title`),S=i(`router-link`),C=i(`v-icon`),w=i(`v-card`),T=i(`v-col`),E=i(`v-row`),k=i(`v-expansion-panel-text`),A=i(`v-expansion-panel`),j=i(`v-expansion-panels`),M=i(`course-stub-card`),N=i(`new-course-dialog`),P=i(`v-dialog`),F=i(`v-container`);return r(),m(F,{fluid:``},{default:t(()=>[n(b,a({color:`primary`,fixed:``,location:`bottom right`,icon:`mdi-plus`,size:`large`,class:`mb-4 mr-4`,"data-cy":`create-course-fab`},e.newCourseAttrs,u(e.newCourseAttrs.on)),null,16),n(E,null,{default:t(()=>[n(T,{cols:`12`},{default:t(()=>[n(j,{modelValue:e.myQuiltsPanel,"onUpdate:modelValue":s[0]||(s[0]=t=>e.myQuiltsPanel=t)},{default:t(()=>[n(A,null,{default:t(()=>[n(x,{"data-cy":`registered-quilts-panel`},{default:t(()=>s[3]||(s[3]=[o(`My Registered Quilts`)])),_:1}),n(k,null,{default:t(()=>[n(E,null,{default:t(()=>[(r(!0),f(p,null,l(e.registeredCourses,i=>(r(),m(T,{key:i.courseID,cols:`12`,sm:`6`,md:`4`,lg:`3`},{default:t(()=>[n(w,{variant:`outlined`,density:`compact`,class:`pa-2`},{default:t(()=>[d(`div`,D,[d(`div`,O,[n(S,{to:`/q/${i.name.replaceAll(` `,`_`)}`,class:`text-subtitle-2`,"data-cy":`registered-course-title`},{default:t(()=>[o(c(i.name),1)]),_:2},1032,[`to`]),i.public?h(``,!0):(r(),m(C,{key:0,size:`x-small`,class:`ml-1`},{default:t(()=>s[4]||(s[4]=[o(`mdi-eye-off`)])),_:1}))]),n(b,{size:`x-small`,variant:`text`,color:`error`,"data-cy":`drop-course-button`,loading:e.spinnerMap[i.courseID]!==void 0,onClick:t=>e.dropCourse(i.courseID)},{default:t(()=>s[5]||(s[5]=[o(` Drop `)])),_:2},1032,[`loading`,`onClick`])])]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}),n(T,{cols:`12`,class:`mt-4`},{default:t(()=>[s[6]||(s[6]=d(`h2`,{class:`text-h5 mb-3`},`Available Quilts`,-1)),n(E,null,{default:t(()=>[(r(!0),f(p,null,l(e.displayedAvailableCourses,i=>(r(),m(T,{key:i.courseID,cols:`12`,sm:`6`,md:`4`,lg:`3`},{default:t(()=>[n(M,{"data-cy":`available-course-card`,"course-id":i.courseID,onRefresh:e.refreshData},null,8,[`course-id`,`onRefresh`])]),_:2},1024))),128))]),_:1}),e.hasMoreCourses?(r(),m(E,{key:0,justify:`center`,class:`mt-2`},{default:t(()=>[n(b,{variant:`text`,color:`primary`,"data-cy":`courses-show-more-button`,onClick:e.toggleShowMore},{default:t(()=>[o(c(e.showAllCourses?`Show Less`:`Show More`),1)]),_:1},8,[`onClick`])]),_:1})):h(``,!0)]),_:1})]),_:1}),n(P,{modelValue:e.newCourseDialog,"onUpdate:modelValue":s[2]||(s[2]=t=>e.newCourseDialog=t),fullscreen:``,transition:`dialog-bottom-transition`,scrim:!1},{default:t(()=>[n(N,{onCourseEditingComplete:s[1]||(s[1]=t=>e.processResponse())})]),_:1},8,[`modelValue`])]),_:1})}var k=S(E,[[`render`,_sfc_render],[`__scopeId`,`data-v-ba0ad091`]]);export{k as default};
3
- //# sourceMappingURL=Courses-D910P_cq.js.map
3
+ //# sourceMappingURL=Courses-DxcRq-5E.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Courses-D910P_cq.js","names":[],"sources":["../../src/components/Courses/CourseStubCard.vue","../../src/components/Courses/CourseStubCard.vue","../../src/views/Courses.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-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","<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"],"mappings":"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"}
1
+ {"version":3,"file":"Courses-DxcRq-5E.js","names":[],"sources":["../../src/components/Courses/CourseStubCard.vue","../../src/components/Courses/CourseStubCard.vue","../../src/views/Courses.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-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","<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"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,S as i,T as a,_ as o,v as s,y as c}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{B as l}from"./common-ui.es-lR5lAjyE.js";import{m as u}from"./dist-leWgtXBf.js";import"./MarkdownRenderer-DoVbFpA6-CvaBjTS8.js";import{k as d}from"./dist-B8xeftM2.js";import{t as f}from"./index-Bu4mzQrw.js";import"./CourseWare-BTFRjgBR-Djhqr7kc.js";import"./chess-BbHATAzk-pOrUYAZ0.js";import"./math-B4HbgYf6-Kurre5to.js";import"./piano-DF1g6yaX-BJpKartB.js";import"./sightsing-BFQ7HRig-ain8LgTr.js";import"./typing-BevtfWlp-BKIHTbO9.js";import{t as p}from"./dist-gNsavZQG.js";var m=a({name:`ELOModerator`,components:{CardLoader:l},props:{courseId:{type:String,required:!0}},data(){return{courseDB:null,updatePending:!0,courseConfig:null,cards:[],id1:null,id2:null,elo1:null,elo2:null,viewLookup:p.getView}},async created(){this.courseDB=d().getCourseDB(this.courseId),this.courseConfig=await this.courseDB.getCourseConfig(),await this.getNewCards()},methods:{vote(e){if(!this.elo1||!this.elo2)return;let t=u(this.elo1,this.elo2,e===`a`?1:0,{globalOnly:!0});this.courseDB.updateCardElo(this.cards[0].cardId,t.userElo),this.courseDB.updateCardElo(this.cards[1].cardId,t.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)}}});function _sfc_render(a,l,u,d,f,p){let m=r(`v-col`),h=r(`v-row`),g=r(`v-icon`),_=r(`v-btn`),v=r(`card-loader`),y=r(`v-container`);return a.updatePending?c(``,!0):(n(),s(y,{key:0},{default:e(()=>[t(h,null,{default:e(()=>[t(m,{cols:`12`},{default:e(()=>l[2]||(l[2]=[o(`h1`,null,[i(`Which seems `),o(`em`,null,`harder`),i(`?`)],-1)])),_:1})]),_:1}),t(h,null,{default:e(()=>[t(m,null,{default:e(()=>[t(_,{color:`success`,class:`ma-5`,onClick:l[0]||(l[0]=e=>a.vote(`a`))},{default:e(()=>[t(g,null,{default:e(()=>l[3]||(l[3]=[i(`mdi-check`)])),_:1})]),_:1}),t(v,{class:`ma-2`,qualified_id:a.id1,"view-lookup":a.viewLookup},null,8,[`qualified_id`,`view-lookup`])]),_:1})]),_:1}),t(h,null,{default:e(()=>[t(m,null,{default:e(()=>[t(_,{color:`success`,class:`ma-5`,onClick:l[1]||(l[1]=e=>a.vote(`b`))},{default:e(()=>[t(g,null,{default:e(()=>l[4]||(l[4]=[i(`mdi-check`)])),_:1})]),_:1}),t(v,{class:`ma-2`,qualified_id:a.id2,"view-lookup":a.viewLookup},null,8,[`qualified_id`,`view-lookup`])]),_:1})]),_:1})]),_:1}))}var h=f(m,[[`render`,_sfc_render],[`__scopeId`,`data-v-df68b8b6`]]);export{h as default};
2
- //# sourceMappingURL=EloModeration-Bz9h6sZo.js.map
1
+ import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,S as i,T as a,_ as o,v as s,y as c}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{B as l}from"./common-ui.es-lR5lAjyE.js";import{m as u}from"./dist-leWgtXBf.js";import"./MarkdownRenderer-DoVbFpA6-CvaBjTS8.js";import{k as d}from"./dist-B8xeftM2.js";import{t as f}from"./index-uBAgCbRp.js";import"./CourseWare-BTFRjgBR-Djhqr7kc.js";import"./chess-BbHATAzk-pOrUYAZ0.js";import"./math-B4HbgYf6-Kurre5to.js";import"./piano-DF1g6yaX-BJpKartB.js";import"./sightsing-BFQ7HRig-ain8LgTr.js";import"./typing-BevtfWlp-BKIHTbO9.js";import{t as p}from"./dist-gNsavZQG.js";var m=a({name:`ELOModerator`,components:{CardLoader:l},props:{courseId:{type:String,required:!0}},data(){return{courseDB:null,updatePending:!0,courseConfig:null,cards:[],id1:null,id2:null,elo1:null,elo2:null,viewLookup:p.getView}},async created(){this.courseDB=d().getCourseDB(this.courseId),this.courseConfig=await this.courseDB.getCourseConfig(),await this.getNewCards()},methods:{vote(e){if(!this.elo1||!this.elo2)return;let t=u(this.elo1,this.elo2,e===`a`?1:0,{globalOnly:!0});this.courseDB.updateCardElo(this.cards[0].cardId,t.userElo),this.courseDB.updateCardElo(this.cards[1].cardId,t.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)}}});function _sfc_render(a,l,u,d,f,p){let m=r(`v-col`),h=r(`v-row`),g=r(`v-icon`),_=r(`v-btn`),v=r(`card-loader`),y=r(`v-container`);return a.updatePending?c(``,!0):(n(),s(y,{key:0},{default:e(()=>[t(h,null,{default:e(()=>[t(m,{cols:`12`},{default:e(()=>l[2]||(l[2]=[o(`h1`,null,[i(`Which seems `),o(`em`,null,`harder`),i(`?`)],-1)])),_:1})]),_:1}),t(h,null,{default:e(()=>[t(m,null,{default:e(()=>[t(_,{color:`success`,class:`ma-5`,onClick:l[0]||(l[0]=e=>a.vote(`a`))},{default:e(()=>[t(g,null,{default:e(()=>l[3]||(l[3]=[i(`mdi-check`)])),_:1})]),_:1}),t(v,{class:`ma-2`,qualified_id:a.id1,"view-lookup":a.viewLookup},null,8,[`qualified_id`,`view-lookup`])]),_:1})]),_:1}),t(h,null,{default:e(()=>[t(m,null,{default:e(()=>[t(_,{color:`success`,class:`ma-5`,onClick:l[1]||(l[1]=e=>a.vote(`b`))},{default:e(()=>[t(g,null,{default:e(()=>l[4]||(l[4]=[i(`mdi-check`)])),_:1})]),_:1}),t(v,{class:`ma-2`,qualified_id:a.id2,"view-lookup":a.viewLookup},null,8,[`qualified_id`,`view-lookup`])]),_:1})]),_:1})]),_:1}))}var h=f(m,[[`render`,_sfc_render],[`__scopeId`,`data-v-df68b8b6`]]);export{h as default};
2
+ //# sourceMappingURL=EloModeration-BDANQSZq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EloModeration-Bz9h6sZo.js","names":[],"sources":["../../src/components/Courses/EloModeration.vue","../../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","<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"],"mappings":"inBCmCA,IAAA,EAAe,EAAgB,CAC7B,KAAM,eAEN,WAAY,CACV,WAAA,EACD,CAED,MAAO,CACL,SAAU,CACR,KAAM,OACN,SAAU,GACX,CACF,CAED,MAAO,CACL,MAAO,CACL,SAAU,KACV,cAAe,GACf,aAAc,KACd,MAAO,EAAC,CAMR,IAAK,KACL,IAAK,KACL,KAAM,KACN,KAAM,KACN,WAAY,EAAc,QAC3B,EAGH,MAAM,SAAU,CACd,KAAK,SAAW,GAAc,CAAC,YAAY,KAAK,SAAS,CAEzD,KAAK,aAAgB,MAAM,KAAK,SAAU,iBAAiB,CAC3D,MAAM,KAAK,aAAa,EAG1B,QAAS,CACP,KAAK,EAAc,CACjB,GAAI,CAAC,KAAK,MAAQ,CAAC,KAAK,KAAM,OAE9B,IAAM,EAAS,EAAmB,KAAK,KAAM,KAAK,KAAM,IAAM,IAAM,EAAI,EAAG,CACzE,WAAY,GACb,CAAC,CAEF,KAAK,SAAU,cAAc,KAAK,MAAM,GAAG,OAAQ,EAAO,QAAQ,CAClE,KAAK,SAAU,cAAc,KAAK,MAAM,GAAG,OAAQ,EAAO,QAAQ,CAElE,KAAK,aAAa,EAGpB,MAAM,aAAc,CACb,KAAK,WAEV,KAAK,cAAgB,GACrB,KAAK,MAAQ,MAAM,KAAK,SAAU,uBAAuB,CAIzD,KAAK,IAAM,KACX,KAAK,IAAM,KAEX,KAAK,IAAM,CACT,SAAU,KAAK,SACf,OAAQ,KAAK,MAAM,GAAG,OACvB,CACD,KAAK,IAAM,CACT,SAAU,KAAK,SACf,OAAQ,KAAK,MAAM,GAAG,OACvB,CAED,KAAK,KAAO,KAAK,MAAM,GAAG,IAC1B,KAAK,KAAO,KAAK,MAAM,GAAG,IAE1B,KAAK,cAAgB,KAExB,CACF,CAAC,yIAlHoB,EAAA,cADtB,EAAA,GAAA,GAAA,EACsB,GAAA,CAApB,EAwBc,EAAA,CAzBhB,IAAA,EAAA,CAAA,CAAA,QAAA,MAMY,CAJR,EAIQ,EAAA,KAAA,CANZ,QAAA,MAKc,CAFR,EAEQ,EAAA,CAFD,KAAK,KAAI,CAAA,CAHtB,QAAA,MAI6C,EAAA,KAAA,EAAA,GAAA,CAArC,EAAqC,KAAA,KAAA,CAJ7C,EAIY,eAAY,CAAA,EAAe,KAAA,KAAX,SAAM,CAJlC,EAIuC,IAAC,SAJxC,EAAA,MAAA,EAAA,IAQI,EAOQ,EAAA,KAAA,CAfZ,QAAA,MAcc,CALR,EAKQ,EAAA,KAAA,CAdd,QAAA,MAYgB,CAFR,EAEQ,EAAA,CAFD,MAAM,UAAU,MAAM,OAAQ,QAAK,EAAA,KAAA,EAAA,GAAA,GAAE,EAAA,KAAI,IAAA,IAVxD,QAAA,MAWoC,CAA1B,EAA0B,EAAA,KAAA,CAXpC,QAAA,MAW2B,EAAA,KAAA,EAAA,GAAA,CAX3B,EAWkB,YAAS,CAAA,EAAA,CAX3B,EAAA,MAAA,EAAA,IAaQ,EAA0E,EAAA,CAA7D,MAAM,OAAQ,aAAc,EAAA,IAAM,cAAa,EAAA,qDAbpE,EAAA,MAAA,EAAA,IAiBI,EAOQ,EAAA,KAAA,CAxBZ,QAAA,MAuBc,CALR,EAKQ,EAAA,KAAA,CAvBd,QAAA,MAqBgB,CAFR,EAEQ,EAAA,CAFD,MAAM,UAAU,MAAM,OAAQ,QAAK,EAAA,KAAA,EAAA,GAAA,GAAE,EAAA,KAAI,IAAA,IAnBxD,QAAA,MAoBoC,CAA1B,EAA0B,EAAA,KAAA,CApBpC,QAAA,MAoB2B,EAAA,KAAA,EAAA,GAAA,CApB3B,EAoBkB,YAAS,CAAA,EAAA,CApB3B,EAAA,MAAA,EAAA,IAsBQ,EAA0E,EAAA,CAA7D,MAAM,OAAQ,aAAc,EAAA,IAAM,cAAa,EAAA,qDAtBpE,EAAA,MAAA,EAAA,MAAA,EAAA"}
1
+ {"version":3,"file":"EloModeration-BDANQSZq.js","names":[],"sources":["../../src/components/Courses/EloModeration.vue","../../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","<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"],"mappings":"inBCmCA,IAAA,EAAe,EAAgB,CAC7B,KAAM,eAEN,WAAY,CACV,WAAA,EACD,CAED,MAAO,CACL,SAAU,CACR,KAAM,OACN,SAAU,GACX,CACF,CAED,MAAO,CACL,MAAO,CACL,SAAU,KACV,cAAe,GACf,aAAc,KACd,MAAO,EAAC,CAMR,IAAK,KACL,IAAK,KACL,KAAM,KACN,KAAM,KACN,WAAY,EAAc,QAC3B,EAGH,MAAM,SAAU,CACd,KAAK,SAAW,GAAc,CAAC,YAAY,KAAK,SAAS,CAEzD,KAAK,aAAgB,MAAM,KAAK,SAAU,iBAAiB,CAC3D,MAAM,KAAK,aAAa,EAG1B,QAAS,CACP,KAAK,EAAc,CACjB,GAAI,CAAC,KAAK,MAAQ,CAAC,KAAK,KAAM,OAE9B,IAAM,EAAS,EAAmB,KAAK,KAAM,KAAK,KAAM,IAAM,IAAM,EAAI,EAAG,CACzE,WAAY,GACb,CAAC,CAEF,KAAK,SAAU,cAAc,KAAK,MAAM,GAAG,OAAQ,EAAO,QAAQ,CAClE,KAAK,SAAU,cAAc,KAAK,MAAM,GAAG,OAAQ,EAAO,QAAQ,CAElE,KAAK,aAAa,EAGpB,MAAM,aAAc,CACb,KAAK,WAEV,KAAK,cAAgB,GACrB,KAAK,MAAQ,MAAM,KAAK,SAAU,uBAAuB,CAIzD,KAAK,IAAM,KACX,KAAK,IAAM,KAEX,KAAK,IAAM,CACT,SAAU,KAAK,SACf,OAAQ,KAAK,MAAM,GAAG,OACvB,CACD,KAAK,IAAM,CACT,SAAU,KAAK,SACf,OAAQ,KAAK,MAAM,GAAG,OACvB,CAED,KAAK,KAAO,KAAK,MAAM,GAAG,IAC1B,KAAK,KAAO,KAAK,MAAM,GAAG,IAE1B,KAAK,cAAgB,KAExB,CACF,CAAC,yIAlHoB,EAAA,cADtB,EAAA,GAAA,GAAA,EACsB,GAAA,CAApB,EAwBc,EAAA,CAzBhB,IAAA,EAAA,CAAA,CAAA,QAAA,MAMY,CAJR,EAIQ,EAAA,KAAA,CANZ,QAAA,MAKc,CAFR,EAEQ,EAAA,CAFD,KAAK,KAAI,CAAA,CAHtB,QAAA,MAI6C,EAAA,KAAA,EAAA,GAAA,CAArC,EAAqC,KAAA,KAAA,CAJ7C,EAIY,eAAY,CAAA,EAAe,KAAA,KAAX,SAAM,CAJlC,EAIuC,IAAC,SAJxC,EAAA,MAAA,EAAA,IAQI,EAOQ,EAAA,KAAA,CAfZ,QAAA,MAcc,CALR,EAKQ,EAAA,KAAA,CAdd,QAAA,MAYgB,CAFR,EAEQ,EAAA,CAFD,MAAM,UAAU,MAAM,OAAQ,QAAK,EAAA,KAAA,EAAA,GAAA,GAAE,EAAA,KAAI,IAAA,IAVxD,QAAA,MAWoC,CAA1B,EAA0B,EAAA,KAAA,CAXpC,QAAA,MAW2B,EAAA,KAAA,EAAA,GAAA,CAX3B,EAWkB,YAAS,CAAA,EAAA,CAX3B,EAAA,MAAA,EAAA,IAaQ,EAA0E,EAAA,CAA7D,MAAM,OAAQ,aAAc,EAAA,IAAM,cAAa,EAAA,qDAbpE,EAAA,MAAA,EAAA,IAiBI,EAOQ,EAAA,KAAA,CAxBZ,QAAA,MAuBc,CALR,EAKQ,EAAA,KAAA,CAvBd,QAAA,MAqBgB,CAFR,EAEQ,EAAA,CAFD,MAAM,UAAU,MAAM,OAAQ,QAAK,EAAA,KAAA,EAAA,GAAA,GAAE,EAAA,KAAI,IAAA,IAnBxD,QAAA,MAoBoC,CAA1B,EAA0B,EAAA,KAAA,CApBpC,QAAA,MAoB2B,EAAA,KAAA,EAAA,GAAA,CApB3B,EAoBkB,YAAS,CAAA,EAAA,CApB3B,EAAA,MAAA,EAAA,IAsBQ,EAA0E,EAAA,CAA7D,MAAM,OAAQ,aAAc,EAAA,IAAM,cAAa,EAAA,qDAtBpE,EAAA,MAAA,EAAA,MAAA,EAAA"}
@@ -1,3 +1,3 @@
1
- import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,T as i,Vt as a,b as o,v as s}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{f as c}from"./dist-leWgtXBf.js";import{k as l}from"./dist-B8xeftM2.js";import{t as u}from"./index-Bu4mzQrw.js";var d=i({name:`JoinCode`,props:{classroomId:{type:String,required:!0}},data(){return{classroomCfg:null,classroomDB:null,updatePending:!0}},async created(){this.classroomDB=await l().getClassroomDB(this.classroomId,`teacher`),this.classroomCfg=this.classroomDB.getConfig(),await Promise.all([]),c(`Route loaded w/ (prop) _id: ${this.classroomId}`),c(`Config:
1
+ import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,T as i,Vt as a,b as o,v as s}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{f as c}from"./dist-leWgtXBf.js";import{k as l}from"./dist-B8xeftM2.js";import{t as u}from"./index-uBAgCbRp.js";var d=i({name:`JoinCode`,props:{classroomId:{type:String,required:!0}},data(){return{classroomCfg:null,classroomDB:null,updatePending:!0}},async created(){this.classroomDB=await l().getClassroomDB(this.classroomId,`teacher`),this.classroomCfg=this.classroomDB.getConfig(),await Promise.all([]),c(`Route loaded w/ (prop) _id: ${this.classroomId}`),c(`Config:
2
2
  ${JSON.stringify(this.classroomCfg)}`),this.updatePending=!1},methods:{close(){this.$router.back()}}}),f={key:0,class:`join-code`};function _sfc_render(i,c,l,u,d,p){let m=r(`v-btn`),h=r(`v-progress-circular`),g=r(`v-col`),_=r(`v-row`),v=r(`v-container`);return n(),s(v,{fluid:``,class:`fill-height pa-0`},{default:e(()=>[t(m,{icon:`mdi-close`,color:`red`,variant:`elevated`,class:`close-btn`,onClick:i.close},null,8,[`onClick`]),t(_,{align:`center`,justify:`center`,class:`fill-height`},{default:e(()=>[t(g,{cols:`12`,class:`text-center`},{default:e(()=>[i.updatePending?(n(),s(h,{key:1,indeterminate:``,size:`64`})):(n(),o(`div`,f,a(i.classroomCfg?.joinCode),1))]),_:1})]),_:1})]),_:1})}var p=u(d,[[`render`,_sfc_render]]);export{p as default};
3
- //# sourceMappingURL=JoinCode-KxUHyJpf.js.map
3
+ //# sourceMappingURL=JoinCode-CD-qC0t-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JoinCode-KxUHyJpf.js","names":[],"sources":["../../src/components/Classrooms/JoinCode.vue","../../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","<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"],"mappings":"8PCuBA,IAAA,EAAe,EAAgB,CAC7B,KAAM,WAEN,MAAO,CACL,YAAa,CACX,KAAM,OACN,SAAU,GACX,CACF,CAED,MAAO,CACL,MAAO,CACL,aAAc,KACd,YAAa,KACb,cAAe,GAChB,EAGH,MAAM,SAAU,CAGd,KAAK,YAAc,MAFR,GAAc,CAEG,eAAe,KAAK,YAAa,UAAU,CACvE,KAAK,aAAe,KAAK,YAAY,WAAW,CAChD,MAAM,QAAQ,IAAI,EAAE,CAAC,CACrB,EAAI,+BAA+B,KAAK,cAAc,CACtD,EAAI;MACF,KAAK,UAAU,KAAK,aAAa,GAAG,CACtC,KAAK,cAAgB,IAGvB,QAAS,CACP,OAAQ,CACN,KAAK,QAAQ,MAAM,EAEtB,CACF,CAAC,IA1DF,IAAA,EAQmC,MAAM,mJAPvC,EAac,EAAA,CAbD,MAAA,GAAM,MAAM,qBAD3B,QAAA,MAGqG,CAAjG,EAAiG,EAAA,CAA1F,KAAK,YAAY,MAAM,MAAM,QAAQ,WAAW,MAAM,YAAa,QAAO,EAAA,2BAGjF,EAOQ,EAAA,CAPD,MAAM,SAAS,QAAQ,SAAS,MAAM,gBANjD,QAAA,MAYc,CALR,EAKQ,EAAA,CALD,KAAK,KAAK,MAAM,gBAP7B,QAAA,MAUc,CAFM,EAAA,eACe,GAAA,CAE3B,EAA0E,EAAA,CAXlF,IAAA,EAWoC,cAAA,GAAc,KAAK,SAHnC,GAAA,CAAZ,EAEM,MAFN,EAEM,EADD,EAAA,cAAc,SAAQ,CAAA,EAAA,IATnC,EAAA,MAAA,EAAA,MAAA,EAAA"}
1
+ {"version":3,"file":"JoinCode-CD-qC0t-.js","names":[],"sources":["../../src/components/Classrooms/JoinCode.vue","../../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","<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"],"mappings":"8PCuBA,IAAA,EAAe,EAAgB,CAC7B,KAAM,WAEN,MAAO,CACL,YAAa,CACX,KAAM,OACN,SAAU,GACX,CACF,CAED,MAAO,CACL,MAAO,CACL,aAAc,KACd,YAAa,KACb,cAAe,GAChB,EAGH,MAAM,SAAU,CAGd,KAAK,YAAc,MAFR,GAAc,CAEG,eAAe,KAAK,YAAa,UAAU,CACvE,KAAK,aAAe,KAAK,YAAY,WAAW,CAChD,MAAM,QAAQ,IAAI,EAAE,CAAC,CACrB,EAAI,+BAA+B,KAAK,cAAc,CACtD,EAAI;MACF,KAAK,UAAU,KAAK,aAAa,GAAG,CACtC,KAAK,cAAgB,IAGvB,QAAS,CACP,OAAQ,CACN,KAAK,QAAQ,MAAM,EAEtB,CACF,CAAC,IA1DF,IAAA,EAQmC,MAAM,mJAPvC,EAac,EAAA,CAbD,MAAA,GAAM,MAAM,qBAD3B,QAAA,MAGqG,CAAjG,EAAiG,EAAA,CAA1F,KAAK,YAAY,MAAM,MAAM,QAAQ,WAAW,MAAM,YAAa,QAAO,EAAA,2BAGjF,EAOQ,EAAA,CAPD,MAAM,SAAS,QAAQ,SAAS,MAAM,gBANjD,QAAA,MAYc,CALR,EAKQ,EAAA,CALD,KAAK,KAAK,MAAM,gBAP7B,QAAA,MAUc,CAFM,EAAA,eACe,GAAA,CAE3B,EAA0E,EAAA,CAXlF,IAAA,EAWoC,cAAA,GAAc,KAAK,SAHnC,GAAA,CAAZ,EAEM,MAFN,EAEM,EADD,EAAA,cAAc,SAAQ,CAAA,EAAA,IATnC,EAAA,MAAA,EAAA,MAAA,EAAA"}
@@ -1,2 +1,2 @@
1
- import{s as e}from"./chunk-D6hFPZc3.js";import{$ as t,C as n,H as r,K as i,S as a,T as o,_ as s,v as c}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{T as l,v as u}from"./common-ui.es-lR5lAjyE.js";import{w as d}from"./dist-leWgtXBf.js";import{t as f}from"./index-Bu4mzQrw.js";import{n as p,t as m}from"./server-DoenpmEE.js";var h=e(p()),g=o({name:`NewCourseDialog`,props:{name:{type:String,required:!1,default:``}},emits:[`CourseEditingComplete`],data(){return{mousetrap:new h.default(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`:!0]}},created(){this.mousetrap.bind(`esc`,this.clearFormAndDismiss)},methods:{async submit(){this.updatePending=!0;let e=await l(),t=await m({data:{name:this.courseName,description:this.description,public:this.publicCourse,deleted:this.deleted,creator:e.getUsername(),admins:this.admins,moderators:this.moderators,dataShapes:this.dataShapes,questionTypes:this.questionTypes},type:d.CREATE_COURSE,response:null,user:e.getUsername()});t.response&&t.response.ok?(u({text:`Course ${this.courseName} created.`,status:t.response.status}),this.clearFormAndDismiss()):(u({text:`Failed to create course ${this.courseName}.`,status:t.response.status}),console.warn(`Resp: ${JSON.stringify(t.response)}`)),this.updatePending=!1},clearFormAndDismiss(){this.description=``,this.publicCourse=!1,this.deleted=!1,this.admins=[],this.moderators=[],this.$emit(`CourseEditingComplete`)}}});function _sfc_render(e,o,l,u,d,f){let p=i(`v-card-title`),m=i(`v-spacer`),h=i(`v-icon`),g=i(`v-btn`),_=i(`v-toolbar`),v=i(`v-text-field`),y=i(`v-row`),b=i(`v-textarea`),x=i(`v-radio`),S=i(`v-radio-group`),C=i(`v-container`),w=i(`v-form`),T=i(`v-card`);return r(),c(T,null,{default:t(()=>[n(_,{flat:``,color:`primary`,dark:``},{default:t(()=>[n(p,{class:`text-h6 font-weight-regular`},{default:t(()=>o[3]||(o[3]=[a(` Start a New Quilt `)])),_:1}),n(m),n(g,{icon:``,onClick:e.clearFormAndDismiss},{default:t(()=>[n(h,{icon:`mdi-close`})]),_:1},8,[`onClick`])]),_:1}),n(w,null,{default:t(()=>[n(C,null,{default:t(()=>[n(y,{class:`cols sm md`},{default:t(()=>[n(v,{modelValue:e.courseName,"onUpdate:modelValue":o[0]||(o[0]=t=>e.courseName=t),counter:`30`,rules:e.nameRules,label:`Quilt Name`,required:``,hint:`Short and descriptive`,"data-cy":`course-name-input`},null,8,[`modelValue`,`rules`])]),_:1}),n(y,{class:`cols sm md`},{default:t(()=>[n(b,{modelValue:e.description,"onUpdate:modelValue":o[1]||(o[1]=t=>e.description=t),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}),n(y,{class:`cols sm md`},{default:t(()=>[o[4]||(o[4]=s(`label`,null,`Public or private quilt?`,-1)),n(S,{modelValue:e.publicCourse,"onUpdate:modelValue":o[2]||(o[2]=t=>e.publicCourse=t),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:t(()=>[n(x,{label:`Public`,value:!0,"data-cy":`public-radio`}),n(x,{label:`Private`,value:!1,"data-cy":`private-radio`})]),_:1},8,[`modelValue`])]),_:1}),n(y,{class:`cols sm md`},{default:t(()=>[n(g,{loading:e.updatePending,color:`primary`,"data-cy":`save-course-button`,onClick:e.submit},{default:t(()=>o[5]||(o[5]=[a(` Save Course Changes `)])),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1})]),_:1})}var _=f(g,[[`render`,_sfc_render]]);export{_ as t};
2
- //# sourceMappingURL=NewCourseDialog-WAOXxQ3Q.js.map
1
+ import{s as e}from"./chunk-D6hFPZc3.js";import{$ as t,C as n,H as r,K as i,S as a,T as o,_ as s,v as c}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{T as l,v as u}from"./common-ui.es-lR5lAjyE.js";import{w as d}from"./dist-leWgtXBf.js";import{t as f}from"./index-uBAgCbRp.js";import{n as p,t as m}from"./server-C80ynHJm.js";var h=e(p()),g=o({name:`NewCourseDialog`,props:{name:{type:String,required:!1,default:``}},emits:[`CourseEditingComplete`],data(){return{mousetrap:new h.default(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`:!0]}},created(){this.mousetrap.bind(`esc`,this.clearFormAndDismiss)},methods:{async submit(){this.updatePending=!0;let e=await l(),t=await m({data:{name:this.courseName,description:this.description,public:this.publicCourse,deleted:this.deleted,creator:e.getUsername(),admins:this.admins,moderators:this.moderators,dataShapes:this.dataShapes,questionTypes:this.questionTypes},type:d.CREATE_COURSE,response:null,user:e.getUsername()});t.response&&t.response.ok?(u({text:`Course ${this.courseName} created.`,status:t.response.status}),this.clearFormAndDismiss()):(u({text:`Failed to create course ${this.courseName}.`,status:t.response.status}),console.warn(`Resp: ${JSON.stringify(t.response)}`)),this.updatePending=!1},clearFormAndDismiss(){this.description=``,this.publicCourse=!1,this.deleted=!1,this.admins=[],this.moderators=[],this.$emit(`CourseEditingComplete`)}}});function _sfc_render(e,o,l,u,d,f){let p=i(`v-card-title`),m=i(`v-spacer`),h=i(`v-icon`),g=i(`v-btn`),_=i(`v-toolbar`),v=i(`v-text-field`),y=i(`v-row`),b=i(`v-textarea`),x=i(`v-radio`),S=i(`v-radio-group`),C=i(`v-container`),w=i(`v-form`),T=i(`v-card`);return r(),c(T,null,{default:t(()=>[n(_,{flat:``,color:`primary`,dark:``},{default:t(()=>[n(p,{class:`text-h6 font-weight-regular`},{default:t(()=>o[3]||(o[3]=[a(` Start a New Quilt `)])),_:1}),n(m),n(g,{icon:``,onClick:e.clearFormAndDismiss},{default:t(()=>[n(h,{icon:`mdi-close`})]),_:1},8,[`onClick`])]),_:1}),n(w,null,{default:t(()=>[n(C,null,{default:t(()=>[n(y,{class:`cols sm md`},{default:t(()=>[n(v,{modelValue:e.courseName,"onUpdate:modelValue":o[0]||(o[0]=t=>e.courseName=t),counter:`30`,rules:e.nameRules,label:`Quilt Name`,required:``,hint:`Short and descriptive`,"data-cy":`course-name-input`},null,8,[`modelValue`,`rules`])]),_:1}),n(y,{class:`cols sm md`},{default:t(()=>[n(b,{modelValue:e.description,"onUpdate:modelValue":o[1]||(o[1]=t=>e.description=t),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}),n(y,{class:`cols sm md`},{default:t(()=>[o[4]||(o[4]=s(`label`,null,`Public or private quilt?`,-1)),n(S,{modelValue:e.publicCourse,"onUpdate:modelValue":o[2]||(o[2]=t=>e.publicCourse=t),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:t(()=>[n(x,{label:`Public`,value:!0,"data-cy":`public-radio`}),n(x,{label:`Private`,value:!1,"data-cy":`private-radio`})]),_:1},8,[`modelValue`])]),_:1}),n(y,{class:`cols sm md`},{default:t(()=>[n(g,{loading:e.updatePending,color:`primary`,"data-cy":`save-course-button`,onClick:e.submit},{default:t(()=>o[5]||(o[5]=[a(` Save Course Changes `)])),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1})]),_:1})}var _=f(g,[[`render`,_sfc_render]]);export{_ as t};
2
+ //# sourceMappingURL=NewCourseDialog-BvMq0P3v.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NewCourseDialog-WAOXxQ3Q.js","names":[],"sources":["../../src/components/Courses/NewCourseDialog.vue","../../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","<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"],"mappings":"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"}
1
+ {"version":3,"file":"NewCourseDialog-BvMq0P3v.js","names":[],"sources":["../../src/components/Courses/NewCourseDialog.vue","../../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","<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"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import"./chunk-D6hFPZc3.js";import{H as e,T as t,_ as n,b as r}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{t as i}from"./index-Bu4mzQrw.js";var a=t({name:`ReleaseNotes`});function _sfc_render(t,i,a,o,s,c){return e(),r(`div`,null,i[0]||(i[0]=[n(`h1`,{class:`text-h2 mb-6`},`Release Notes`,-1),n(`h3`,{class:`text-h4 mb-4`},`0.0.1 - April 21`,-1),n(`ul`,null,[n(`li`,null,`Hello world, these are release notes.`)],-1)]))}var o=i(a,[[`render`,_sfc_render]]);export{o as default};
2
- //# sourceMappingURL=ReleaseNotes-1XFtTIvr.js.map
1
+ import"./chunk-D6hFPZc3.js";import{H as e,T as t,_ as n,b as r}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{t as i}from"./index-uBAgCbRp.js";var a=t({name:`ReleaseNotes`});function _sfc_render(t,i,a,o,s,c){return e(),r(`div`,null,i[0]||(i[0]=[n(`h1`,{class:`text-h2 mb-6`},`Release Notes`,-1),n(`h3`,{class:`text-h4 mb-4`},`0.0.1 - April 21`,-1),n(`ul`,null,[n(`li`,null,`Hello world, these are release notes.`)],-1)]))}var o=i(a,[[`render`,_sfc_render]]);export{o as default};
2
+ //# sourceMappingURL=ReleaseNotes-ChSHK0Pw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReleaseNotes-1XFtTIvr.js","names":[],"sources":["../../src/views/ReleaseNotes.vue","../../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","<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"],"mappings":"mJCcA,IAAA,EAAe,EAAgB,CAC7B,KAAM,eACP,CAAC,8CAfA,EAOM,MAAA,KAAA,EAAA,KAAA,EAAA,GAAA,CANJ,EAA2C,KAAA,CAAvC,MAAM,eAAc,CAAC,gBAAa,GAAA,CAEtC,EAA8C,KAAA,CAA1C,MAAM,eAAc,CAAC,mBAAgB,GAAA,CACzC,EAEK,KAAA,KAAA,CADH,EAA8C,KAAA,KAA1C,wCAAqC,CAAA,CAAA,GAAA"}
1
+ {"version":3,"file":"ReleaseNotes-ChSHK0Pw.js","names":[],"sources":["../../src/views/ReleaseNotes.vue","../../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","<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"],"mappings":"mJCcA,IAAA,EAAe,EAAgB,CAC7B,KAAM,eACP,CAAC,8CAfA,EAOM,MAAA,KAAA,EAAA,KAAA,EAAA,GAAA,CANJ,EAA2C,KAAA,CAAvC,MAAM,eAAc,CAAC,gBAAa,GAAA,CAEtC,EAA8C,KAAA,CAA1C,MAAM,eAAc,CAAC,mBAAgB,GAAA,CACzC,EAEK,KAAA,KAAA,CADH,EAA8C,KAAA,KAA1C,wCAAqC,CAAA,CAAA,GAAA"}
@@ -1,2 +1,2 @@
1
- import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,T as i,v as a}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{d as o}from"./common-ui.es-lR5lAjyE.js";import"./dist-leWgtXBf.js";import"./MarkdownRenderer-DoVbFpA6-CvaBjTS8.js";import"./dist-B8xeftM2.js";import{t as s}from"./index-Bu4mzQrw.js";var c=i({name:`RequestPasswordResetView`,components:{RequestPasswordReset:o},methods:{handleSuccess(e){console.log(`Password reset email sent to ${e}`)},goToLogin(){this.$router.push({name:`login`})}}});function _sfc_render(i,o,s,c,l,u){let d=r(`request-password-reset`,!0),f=r(`v-container`);return n(),a(f,{class:`d-flex align-center request-reset`},{default:e(()=>[t(d,{onCancel:i.goToLogin,onSuccess:i.handleSuccess},null,8,[`onCancel`,`onSuccess`])]),_:1})}var l=s(c,[[`render`,_sfc_render],[`__scopeId`,`data-v-111f280a`]]);export{l as default};
2
- //# sourceMappingURL=RequestPasswordReset-bUrIWjSL.js.map
1
+ import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,T as i,v as a}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{d as o}from"./common-ui.es-lR5lAjyE.js";import"./dist-leWgtXBf.js";import"./MarkdownRenderer-DoVbFpA6-CvaBjTS8.js";import"./dist-B8xeftM2.js";import{t as s}from"./index-uBAgCbRp.js";var c=i({name:`RequestPasswordResetView`,components:{RequestPasswordReset:o},methods:{handleSuccess(e){console.log(`Password reset email sent to ${e}`)},goToLogin(){this.$router.push({name:`login`})}}});function _sfc_render(i,o,s,c,l,u){let d=r(`request-password-reset`,!0),f=r(`v-container`);return n(),a(f,{class:`d-flex align-center request-reset`},{default:e(()=>[t(d,{onCancel:i.goToLogin,onSuccess:i.handleSuccess},null,8,[`onCancel`,`onSuccess`])]),_:1})}var l=s(c,[[`render`,_sfc_render],[`__scopeId`,`data-v-111f280a`]]);export{l as default};
2
+ //# sourceMappingURL=RequestPasswordReset-DbBbksWK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RequestPasswordReset-bUrIWjSL.js","names":[],"sources":["../../src/views/RequestPasswordReset.vue","../../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","<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"],"mappings":"sTCUA,IAAA,EAAe,EAAgB,CAC7B,KAAM,2BAEN,WAAY,CACV,qBAAA,EACD,CAED,QAAS,CACP,cAAc,EAAe,CAC3B,QAAQ,IAAI,gCAAgC,IAAQ,EAGtD,WAAY,CACV,KAAK,QAAQ,KAAK,CAAE,KAAM,QAAS,CAAC,EAEvC,CACF,CAAC,sGAzBA,EAEc,EAAA,CAFD,MAAM,oCAAmC,CAAA,CADxD,QAAA,MAE2E,CAAvE,EAAuE,EAAA,CAA9C,SAAQ,EAAA,UAAY,UAAS,EAAA,kDAF1D,EAAA"}
1
+ {"version":3,"file":"RequestPasswordReset-DbBbksWK.js","names":[],"sources":["../../src/views/RequestPasswordReset.vue","../../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","<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"],"mappings":"sTCUA,IAAA,EAAe,EAAgB,CAC7B,KAAM,2BAEN,WAAY,CACV,qBAAA,EACD,CAED,QAAS,CACP,cAAc,EAAe,CAC3B,QAAQ,IAAI,gCAAgC,IAAQ,EAGtD,WAAY,CACV,KAAK,QAAQ,KAAK,CAAE,KAAM,QAAS,CAAC,EAEvC,CACF,CAAC,sGAzBA,EAEc,EAAA,CAFD,MAAM,oCAAmC,CAAA,CADxD,QAAA,MAE2E,CAAvE,EAAuE,EAAA,CAA9C,SAAQ,EAAA,UAAY,UAAS,EAAA,kDAF1D,EAAA"}
@@ -1,2 +1,2 @@
1
- import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,S as i,T as a,v as o}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{s}from"./common-ui.es-lR5lAjyE.js";import"./dist-leWgtXBf.js";import"./MarkdownRenderer-DoVbFpA6-CvaBjTS8.js";import"./dist-B8xeftM2.js";import{t as c}from"./index-Bu4mzQrw.js";var l=a({name:`ResetPasswordView`,components:{ResetPassword:s},methods:{handleComplete(){console.log(`Password reset successfully`)},handleError(e){console.error(`Password reset error:`,e)},goToLogin(){this.$router.push({name:`login`})}}});function _sfc_render(a,s,c,l,u,d){let f=r(`v-btn`),p=r(`reset-password`,!0);return n(),o(p,{onComplete:a.handleComplete,onError:a.handleError},{"success-action":e(()=>[t(f,{color:`primary`,onClick:a.goToLogin},{default:e(()=>s[0]||(s[0]=[i(` Continue to Login `)])),_:1},8,[`onClick`])]),_:1},8,[`onComplete`,`onError`])}var u=c(l,[[`render`,_sfc_render]]);export{u as default};
2
- //# sourceMappingURL=ResetPassword-DVWDFCo3.js.map
1
+ import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,S as i,T as a,v as o}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{s}from"./common-ui.es-lR5lAjyE.js";import"./dist-leWgtXBf.js";import"./MarkdownRenderer-DoVbFpA6-CvaBjTS8.js";import"./dist-B8xeftM2.js";import{t as c}from"./index-uBAgCbRp.js";var l=a({name:`ResetPasswordView`,components:{ResetPassword:s},methods:{handleComplete(){console.log(`Password reset successfully`)},handleError(e){console.error(`Password reset error:`,e)},goToLogin(){this.$router.push({name:`login`})}}});function _sfc_render(a,s,c,l,u,d){let f=r(`v-btn`),p=r(`reset-password`,!0);return n(),o(p,{onComplete:a.handleComplete,onError:a.handleError},{"success-action":e(()=>[t(f,{color:`primary`,onClick:a.goToLogin},{default:e(()=>s[0]||(s[0]=[i(` Continue to Login `)])),_:1},8,[`onClick`])]),_:1},8,[`onComplete`,`onError`])}var u=c(l,[[`render`,_sfc_render]]);export{u as default};
2
+ //# sourceMappingURL=ResetPassword-ByELNYeE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResetPassword-DVWDFCo3.js","names":[],"sources":["../../src/views/ResetPassword.vue","../../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","<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"],"mappings":"wTCcA,IAAA,EAAe,EAAgB,CAC7B,KAAM,oBAEN,WAAY,CACV,cAAA,EACD,CAED,QAAS,CACP,gBAAiB,CACf,QAAQ,IAAI,8BAA8B,EAG5C,YAAY,EAAe,CACzB,QAAQ,MAAM,wBAAyB,EAAM,EAG/C,WAAY,CACV,KAAK,QAAQ,KAAK,CAAE,KAAM,QAAS,CAAC,EAEvC,CACF,CAAC,wFAjCA,EAMiB,EAAA,CANA,WAAU,EAAA,eAAiB,QAAO,EAAA,cACtC,iBAAc,MAGf,CAFR,EAEQ,EAAA,CAFD,MAAM,UAAW,QAAO,EAAA,YAHrC,QAAA,MAKM,EAAA,KAAA,EAAA,GAAA,CALN,EAGgD,sBAE1C,CAAA,EAAA,CALN,EAAA,oBAAA,EAAA"}
1
+ {"version":3,"file":"ResetPassword-ByELNYeE.js","names":[],"sources":["../../src/views/ResetPassword.vue","../../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","<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"],"mappings":"wTCcA,IAAA,EAAe,EAAgB,CAC7B,KAAM,oBAEN,WAAY,CACV,cAAA,EACD,CAED,QAAS,CACP,gBAAiB,CACf,QAAQ,IAAI,8BAA8B,EAG5C,YAAY,EAAe,CACzB,QAAQ,MAAM,wBAAyB,EAAM,EAG/C,WAAY,CACV,KAAK,QAAQ,KAAK,CAAE,KAAM,QAAS,CAAC,EAEvC,CACF,CAAC,wFAjCA,EAMiB,EAAA,CANA,WAAU,EAAA,eAAiB,QAAO,EAAA,cACtC,iBAAc,MAGf,CAFR,EAEQ,EAAA,CAFD,MAAM,UAAW,QAAO,EAAA,YAHrC,QAAA,MAKM,EAAA,KAAA,EAAA,GAAA,CALN,EAGgD,sBAE1C,CAAA,EAAA,CALN,EAAA,oBAAA,EAAA"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./chunk-D6hFPZc3.js";import{$ as t,C as n,H as r,It as i,K as a,S as o,T as s,Vt as c,W as l,_ as u,b as d,f,v as p,y as m}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{I as h,M as g,T as _,o as v,z as y}from"./common-ui.es-lR5lAjyE.js";import{o as b}from"./dist-leWgtXBf.js";import{n as x}from"./MarkdownRenderer-DoVbFpA6-CvaBjTS8.js";import{k as S}from"./dist-B8xeftM2.js";import{t as C}from"./index-Bu4mzQrw.js";import"./CourseWare-BTFRjgBR-Djhqr7kc.js";import"./chess-BbHATAzk-pOrUYAZ0.js";import"./math-B4HbgYf6-Kurre5to.js";import"./piano-DF1g6yaX-BJpKartB.js";import"./sightsing-BFQ7HRig-ain8LgTr.js";import"./typing-BevtfWlp-BKIHTbO9.js";import{t as w}from"./dist-gNsavZQG.js";import{i as T}from"./edit-ui.es-DQ_QxgcF.js";var E=s({name:`SessionConfiguration`,components:{SkMouseTrapToolTip:v,CourseTagFilterWidget:y},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=>{x.removeBinding(e)})},async created(){this.user=await _(),this.timeLimit=this.initialTimeLimit,this.setHotkeys();let[e,t]=await Promise.allSettled([this.getActiveCourses(),this.getActiveClassrooms()]);e.status===`rejected`&&(console.error(`Failed to load courses:`,e.reason),this.courseLoadError=!0),t.status===`rejected`&&(console.error(`Failed to load classrooms:`,t.reason),this.classroomLoadError=!0),this.activeCourses.length===0&&this.activeClasses.length===0&&!this.courseLoadError&&!this.classroomLoadError&&(this.hasRegistrations=!1)},mounted(){document.getElementById(`SelectAll`)?.focus()},unmounted(){this.registeredHotkeys&&this.registeredHotkeys.forEach(e=>{x.removeBinding(e)})},methods:{inc(){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){return b(e.tagFilter)},startSession(){this.registeredHotkeys&&this.registeredHotkeys.forEach(e=>{x.removeBinding(e)});let e=this.activeCourses.filter(e=>e.selected).map(e=>{let t={type:`course`,id:e.courseID};return b(e.tagFilter)&&(t.tagFilter=e.tagFilter),t}),t=this.activeClasses.filter(e=>e.selected).map(e=>({type:`classroom`,id:e.classID})),n=[...e,...t];this.$emit(`initStudySession`,n,this.timeLimit)},async getActiveClassrooms(){let e=await(await _()).getActiveClasses(),t=[];console.log(`Active classes: ${JSON.stringify(e)}`),await Promise.all(e.map(e=>(async e=>{let n=await S().getClassroomDB(e,`student`);t.push({classID:e,name:n.getConfig().name,selected:!0,reviews:0})})(e))),this.activeClasses=t},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,t)=>{let n=await S().getCoursesDB().getCourseConfig(e.courseID),r=await this.user?.getCourseInterface(e.courseID);return(async()=>Promise.all([this.activeCourses[t].name=n.name,this.activeCourses[t].reviews=await r.getScheduledReviewCount()]))()}))},setHotkeys(){let e=[{hotkey:`right`,callback:()=>{this.timeLimit++},command:`Increase time limit`},{hotkey:`left`,callback:()=>{this.timeLimit--},command:`Decrease time limit`}];x.addBinding(e),this.registeredHotkeys=e.map(e=>e.hotkey)}}}),D={key:0},O={class:`session-layout`},k={class:`course-selection-container`},A={class:`course-row-header`},j={class:`course-row-header`},M={class:`course-row-actions`},N={class:`reviews-count`},P={key:0,class:`tag-filter-container`},F={class:`select-all-row mt-3`},I={class:`fixed-controls-container`},L={class:`fixed-controls`},R={class:`mb-5`},z={key:0,class:`filter-summary mb-4`},B={class:`text-caption`},V={key:1,class:`text-h4`},H={key:2,class:`text-h4`};function _sfc_render$1(e,i,s,h,g,_){let v=a(`v-alert`),y=a(`v-checkbox`),b=a(`v-icon`),x=a(`v-btn`),S=a(`CourseTagFilterWidget`),C=a(`v-expand-transition`),w=a(`v-text-field`),T=a(`SkMouseTrapToolTip`),E=a(`router-link`);return e.hasRegistrations||e.courseLoadError||e.classroomLoadError?(r(),d(`div`,D,[i[11]||(i[11]=u(`div`,{"data-cy":`select-quilts-header`,class:`text-h4 mb-4`},`Study Session Setup`,-1)),e.courseLoadError?(r(),p(v,{key:0,type:`warning`,class:`mb-4`},{default:t(()=>i[2]||(i[2]=[o(` Unable to load course data. Some features may be unavailable. `)])),_:1})):m(``,!0),e.classroomLoadError?(r(),p(v,{key:1,type:`warning`,class:`mb-4`},{default:t(()=>i[3]||(i[3]=[o(` Unable to load classroom data. You can still study individual courses. `)])),_:1})):m(``,!0),u(`div`,O,[u(`div`,k,[i[6]||(i[6]=u(`div`,{class:`text-h6 mb-3`},`Select Quilts to Study`,-1)),(r(!0),d(f,null,l(e.activeClasses,t=>(r(),d(`div`,{key:t.classID,class:`course-row`},[u(`div`,A,[n(y,{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`]),i[4]||(i[4]=u(`span`,{class:`reviews-count`},`-`,-1))])]))),128)),(r(!0),d(f,null,l(e.activeCourses,a=>(r(),d(`div`,{key:a.courseID,class:`course-row`},[u(`div`,j,[n(y,{modelValue:a.selected,"onUpdate:modelValue":e=>a.selected=e,"data-cy":`course-checkbox`,label:`q/${a.name}`,"hide-details":``,onClickCapture:e.update},null,8,[`modelValue`,`onUpdate:modelValue`,`label`,`onClickCapture`]),u(`div`,M,[u(`span`,N,c(a.reviews),1),a.selected?(r(),p(x,{key:0,variant:`text`,size:`small`,color:e.hasActiveTagFilter(a)?`primary`:`default`,onClick:t=>e.toggleTagFilter(a.courseID)},{default:t(()=>[n(b,{start:``,size:`small`},{default:t(()=>i[5]||(i[5]=[o(`mdi-filter-variant`)])),_:1}),o(` `+c(e.hasActiveTagFilter(a)?`Filtered`:`Filter`)+` `,1),n(b,{end:``,size:`small`},{default:t(()=>[o(c(e.expandedFilters[a.courseID]?`mdi-chevron-up`:`mdi-chevron-down`),1)]),_:2},1024)]),_:2},1032,[`color`,`onClick`])):m(``,!0)])]),n(C,null,{default:t(()=>[a.selected&&e.expandedFilters[a.courseID]?(r(),d(`div`,P,[n(S,{modelValue:a.tagFilter,"onUpdate:modelValue":e=>a.tagFilter=e,"course-id":a.courseID},null,8,[`modelValue`,`onUpdate:modelValue`,`course-id`])])):m(``,!0)]),_:2},1024)]))),128)),u(`div`,F,[n(y,{id:`SelectAll`,ref:`selectAll`,modelValue:e.allSelected,"onUpdate:modelValue":[i[0]||(i[0]=t=>e.allSelected=t),e.toggleAll],autofocus:``,label:`Select All`,"hide-details":``},null,8,[`modelValue`,`onUpdate:modelValue`])])]),u(`div`,I,[u(`div`,L,[i[10]||(i[10]=u(`div`,{class:`text-h6 mb-3`},`Session Settings`,-1)),u(`div`,R,[n(w,{ref:`numberField`,modelValue:e.timeLimit,"onUpdate:modelValue":i[1]||(i[1]=t=>e.timeLimit=t),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?(r(),d(`div`,z,[n(b,{size:`small`,color:`primary`,class:`mr-1`},{default:t(()=>i[7]||(i[7]=[o(`mdi-filter`)])),_:1}),u(`span`,B,c(e.activeFilterCount)+` course`+c(e.activeFilterCount>1?`s`:``)+` with tag filters `,1)])):m(``,!0),n(T,{hotkey:`enter`,command:`Start Session`,disabled:!e.hasSelectedSources,"highlight-effect":`scale`},{default:t(()=>[n(x,{"data-cy":`start-studying-button`,color:`success`,size:`large`,block:``,class:`start-btn`,disabled:!e.hasSelectedSources,onClick:e.startSession},{default:t(()=>[n(b,{start:``},{default:t(()=>i[8]||(i[8]=[o(`mdi-play`)])),_:1}),i[9]||(i[9]=o(` Start! `))]),_:1},8,[`disabled`,`onClick`])]),_:1},8,[`disabled`])])])])])):!e.courseLoadError&&!e.classroomLoadError?(r(),d(`div`,V,[i[15]||(i[15]=u(`p`,null,`You don't have anything to study!`,-1)),u(`p`,null,[i[13]||(i[13]=o(`Head over to the `)),n(E,{to:`/quilts`},{default:t(()=>i[12]||(i[12]=[o(`Quilts`)])),_:1}),i[14]||(i[14]=o(` page to find something for you.`))])])):(r(),d(`div`,H,i[16]||(i[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)])))}e(_sfc_render$1,`_sfc_render`);var U=C(E,[[`render`,_sfc_render$1],[`__scopeId`,`data-v-c5ff4b5f`]]);function randomInt(e,t){return Math.floor(Math.random()*(t-e+1))+e}var W=s({name:`StudyView`,components:{SessionConfiguration:U,StudySession:g},inject:{router:{from:`router`}},props:{previewCourseID:{type:String,required:!1,default:``},randomPreview:{type:Boolean,required:!1},focusCourseID:{type:String,required:!1,default:``}},data(){return{user:null,studySessionConfig:void 0,previewCourseConfig:void 0,previewMode:!1,sessionTimeLimit:5,inSession:!1,sessionPrepared:!1,sessionError:!1,errorMessage:``,sessionContentSources:[],dataInputFormStore:T(),getViewComponent:e=>w.getView(e),dataLayer:S()}},async created(){this.user=await _(),this.studySessionConfig={likesConfetti:h().config.likesConfetti};let e=``;if(this.randomPreview){let t=await this.user.getCourseRegistrationsDoc(),n=(await S().getCoursesDB().getCourseList()).map(e=>e.courseID),r=n.filter(e=>!t.courses.some(t=>t.courseID===e));e=r.length>0?r[randomInt(0,r.length)]:n[randomInt(0,n.length)]}if(this.previewCourseID&&(this.previewMode=!0,S().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){let t=this.parseTagFilterFromQuery(),n={type:`course`,id:e};b(t)&&(n.tagFilter=t,console.log(`[Study] Tag filter from query params:`,t)),this.initStudySession([n],this.sessionTimeLimit)}},methods:{refreshRoute(){this.router.go(0)},async initStudySession(e,t){console.log(`[Study] starting study session w/ sources: ${JSON.stringify(e)}`),this.sessionContentSources=e,this.sessionTimeLimit=t,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:t}){console.error(`[Study] Session error:`,e,t),this.sessionError=!0,this.errorMessage=e||`An error occurred while preparing your study session.`,this.sessionPrepared=!1},parseTagFilterFromQuery(){let e=this.$route.query.include,t=this.$route.query.exclude,parseParam=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:parseParam(e),exclude:parseParam(t)}}}}),G={key:0},K={key:1},q={key:0,align:`center`},J={class:`text-h5`},Y={key:1},X={key:2},Z={key:0,class:`session-loading`},Q={key:1,class:`session-error`},$={class:`text-subtitle-1 mt-2`};function _sfc_render(e,s,l,f,p,h){let g=a(`SessionConfiguration`),_=a(`v-btn`),v=a(`router-link`),y=a(`v-spacer`),b=a(`v-col`),x=a(`v-row`),S=a(`v-progress-circular`),C=a(`v-container`),w=a(`v-icon`),T=a(`StudySession`);return e.inSession?(r(),d(`div`,K,[e.previewMode&&e.previewCourseConfig?(r(),d(`div`,q,[n(x,null,{default:t(()=>[n(b,null,{default:t(()=>[u(`span`,J,[s[1]||(s[1]=o(` Quilt preview for `)),u(`em`,null,c(e.previewCourseConfig.name),1)]),n(_,{size:`small`,color:`primary`,onClick:e.registerUserForPreviewCourse},{default:t(()=>s[2]||(s[2]=[o(`Join`)])),_:1},8,[`onClick`]),n(v,{to:`/quilts/${e.previewCourseConfig.courseID}`},{default:t(()=>[n(_,{size:`small`,color:`secondary`},{default:t(()=>s[3]||(s[3]=[o(`More info`)])),_:1})]),_:1},8,[`to`]),n(y)]),_:1})]),_:1})])):e.previewMode?(r(),d(`div`,Y,[n(x,null,{default:t(()=>[n(b,null,{default:t(()=>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})])):m(``,!0),e.inSession?(r(),d(`div`,X,[!e.sessionPrepared&&!e.sessionError?(r(),d(`div`,Z,[n(C,{class:`text-center`},{default:t(()=>[n(x,{justify:`center`,align:`center`,style:{"min-height":`50vh`}},{default:t(()=>[n(b,{cols:`12`},{default:t(()=>[n(S,{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})])):m(``,!0),e.sessionError?(r(),d(`div`,Q,[n(C,{class:`text-center`},{default:t(()=>[n(x,{justify:`center`,align:`center`,style:{"min-height":`50vh`}},{default:t(()=>[n(b,{cols:`12`},{default:t(()=>[n(w,{size:`64`,color:`error`},{default:t(()=>s[7]||(s[7]=[o(`mdi-alert-circle`)])),_:1}),s[9]||(s[9]=u(`div`,{class:`text-h5 mt-4 text-error`},`Session Preparation Failed`,-1)),u(`div`,$,c(e.errorMessage||`There was a problem preparing your study session.`),1),n(_,{color:`primary`,class:`mt-6`,onClick:e.refreshRoute},{default:t(()=>s[8]||(s[8]=[o(`Try Again`)])),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1})])):m(``,!0),n(T,{"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:i({"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`])])):m(``,!0)])):(r(),d(`div`,G,[n(g,{"initial-time-limit":e.sessionTimeLimit,onInitStudySession:s[0]||(s[0]=(t,n)=>e.initStudySession(t,n))},null,8,[`initial-time-limit`])]))}var ee=C(W,[[`render`,_sfc_render],[`__scopeId`,`data-v-dcbc1fde`]]);export{ee as default};
2
- //# sourceMappingURL=Study-D51p-shx.js.map
1
+ import{i as e}from"./chunk-D6hFPZc3.js";import{$ as t,C as n,H as r,It as i,K as a,S as o,T as s,Vt as c,W as l,_ as u,b as d,f,v as p,y as m}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{I as h,M as g,T as _,o as v,z as y}from"./common-ui.es-lR5lAjyE.js";import{o as b}from"./dist-leWgtXBf.js";import{n as x}from"./MarkdownRenderer-DoVbFpA6-CvaBjTS8.js";import{k as S}from"./dist-B8xeftM2.js";import{t as C}from"./index-uBAgCbRp.js";import"./CourseWare-BTFRjgBR-Djhqr7kc.js";import"./chess-BbHATAzk-pOrUYAZ0.js";import"./math-B4HbgYf6-Kurre5to.js";import"./piano-DF1g6yaX-BJpKartB.js";import"./sightsing-BFQ7HRig-ain8LgTr.js";import"./typing-BevtfWlp-BKIHTbO9.js";import{t as w}from"./dist-gNsavZQG.js";import{i as T}from"./edit-ui.es-DQ_QxgcF.js";var E=s({name:`SessionConfiguration`,components:{SkMouseTrapToolTip:v,CourseTagFilterWidget:y},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=>{x.removeBinding(e)})},async created(){this.user=await _(),this.timeLimit=this.initialTimeLimit,this.setHotkeys();let[e,t]=await Promise.allSettled([this.getActiveCourses(),this.getActiveClassrooms()]);e.status===`rejected`&&(console.error(`Failed to load courses:`,e.reason),this.courseLoadError=!0),t.status===`rejected`&&(console.error(`Failed to load classrooms:`,t.reason),this.classroomLoadError=!0),this.activeCourses.length===0&&this.activeClasses.length===0&&!this.courseLoadError&&!this.classroomLoadError&&(this.hasRegistrations=!1)},mounted(){document.getElementById(`SelectAll`)?.focus()},unmounted(){this.registeredHotkeys&&this.registeredHotkeys.forEach(e=>{x.removeBinding(e)})},methods:{inc(){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){return b(e.tagFilter)},startSession(){this.registeredHotkeys&&this.registeredHotkeys.forEach(e=>{x.removeBinding(e)});let e=this.activeCourses.filter(e=>e.selected).map(e=>{let t={type:`course`,id:e.courseID};return b(e.tagFilter)&&(t.tagFilter=e.tagFilter),t}),t=this.activeClasses.filter(e=>e.selected).map(e=>({type:`classroom`,id:e.classID})),n=[...e,...t];this.$emit(`initStudySession`,n,this.timeLimit)},async getActiveClassrooms(){let e=await(await _()).getActiveClasses(),t=[];console.log(`Active classes: ${JSON.stringify(e)}`),await Promise.all(e.map(e=>(async e=>{let n=await S().getClassroomDB(e,`student`);t.push({classID:e,name:n.getConfig().name,selected:!0,reviews:0})})(e))),this.activeClasses=t},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,t)=>{let n=await S().getCoursesDB().getCourseConfig(e.courseID),r=await this.user?.getCourseInterface(e.courseID);return(async()=>Promise.all([this.activeCourses[t].name=n.name,this.activeCourses[t].reviews=await r.getScheduledReviewCount()]))()}))},setHotkeys(){let e=[{hotkey:`right`,callback:()=>{this.timeLimit++},command:`Increase time limit`},{hotkey:`left`,callback:()=>{this.timeLimit--},command:`Decrease time limit`}];x.addBinding(e),this.registeredHotkeys=e.map(e=>e.hotkey)}}}),D={key:0},O={class:`session-layout`},k={class:`course-selection-container`},A={class:`course-row-header`},j={class:`course-row-header`},M={class:`course-row-actions`},N={class:`reviews-count`},P={key:0,class:`tag-filter-container`},F={class:`select-all-row mt-3`},I={class:`fixed-controls-container`},L={class:`fixed-controls`},R={class:`mb-5`},z={key:0,class:`filter-summary mb-4`},B={class:`text-caption`},V={key:1,class:`text-h4`},H={key:2,class:`text-h4`};function _sfc_render$1(e,i,s,h,g,_){let v=a(`v-alert`),y=a(`v-checkbox`),b=a(`v-icon`),x=a(`v-btn`),S=a(`CourseTagFilterWidget`),C=a(`v-expand-transition`),w=a(`v-text-field`),T=a(`SkMouseTrapToolTip`),E=a(`router-link`);return e.hasRegistrations||e.courseLoadError||e.classroomLoadError?(r(),d(`div`,D,[i[11]||(i[11]=u(`div`,{"data-cy":`select-quilts-header`,class:`text-h4 mb-4`},`Study Session Setup`,-1)),e.courseLoadError?(r(),p(v,{key:0,type:`warning`,class:`mb-4`},{default:t(()=>i[2]||(i[2]=[o(` Unable to load course data. Some features may be unavailable. `)])),_:1})):m(``,!0),e.classroomLoadError?(r(),p(v,{key:1,type:`warning`,class:`mb-4`},{default:t(()=>i[3]||(i[3]=[o(` Unable to load classroom data. You can still study individual courses. `)])),_:1})):m(``,!0),u(`div`,O,[u(`div`,k,[i[6]||(i[6]=u(`div`,{class:`text-h6 mb-3`},`Select Quilts to Study`,-1)),(r(!0),d(f,null,l(e.activeClasses,t=>(r(),d(`div`,{key:t.classID,class:`course-row`},[u(`div`,A,[n(y,{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`]),i[4]||(i[4]=u(`span`,{class:`reviews-count`},`-`,-1))])]))),128)),(r(!0),d(f,null,l(e.activeCourses,a=>(r(),d(`div`,{key:a.courseID,class:`course-row`},[u(`div`,j,[n(y,{modelValue:a.selected,"onUpdate:modelValue":e=>a.selected=e,"data-cy":`course-checkbox`,label:`q/${a.name}`,"hide-details":``,onClickCapture:e.update},null,8,[`modelValue`,`onUpdate:modelValue`,`label`,`onClickCapture`]),u(`div`,M,[u(`span`,N,c(a.reviews),1),a.selected?(r(),p(x,{key:0,variant:`text`,size:`small`,color:e.hasActiveTagFilter(a)?`primary`:`default`,onClick:t=>e.toggleTagFilter(a.courseID)},{default:t(()=>[n(b,{start:``,size:`small`},{default:t(()=>i[5]||(i[5]=[o(`mdi-filter-variant`)])),_:1}),o(` `+c(e.hasActiveTagFilter(a)?`Filtered`:`Filter`)+` `,1),n(b,{end:``,size:`small`},{default:t(()=>[o(c(e.expandedFilters[a.courseID]?`mdi-chevron-up`:`mdi-chevron-down`),1)]),_:2},1024)]),_:2},1032,[`color`,`onClick`])):m(``,!0)])]),n(C,null,{default:t(()=>[a.selected&&e.expandedFilters[a.courseID]?(r(),d(`div`,P,[n(S,{modelValue:a.tagFilter,"onUpdate:modelValue":e=>a.tagFilter=e,"course-id":a.courseID},null,8,[`modelValue`,`onUpdate:modelValue`,`course-id`])])):m(``,!0)]),_:2},1024)]))),128)),u(`div`,F,[n(y,{id:`SelectAll`,ref:`selectAll`,modelValue:e.allSelected,"onUpdate:modelValue":[i[0]||(i[0]=t=>e.allSelected=t),e.toggleAll],autofocus:``,label:`Select All`,"hide-details":``},null,8,[`modelValue`,`onUpdate:modelValue`])])]),u(`div`,I,[u(`div`,L,[i[10]||(i[10]=u(`div`,{class:`text-h6 mb-3`},`Session Settings`,-1)),u(`div`,R,[n(w,{ref:`numberField`,modelValue:e.timeLimit,"onUpdate:modelValue":i[1]||(i[1]=t=>e.timeLimit=t),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?(r(),d(`div`,z,[n(b,{size:`small`,color:`primary`,class:`mr-1`},{default:t(()=>i[7]||(i[7]=[o(`mdi-filter`)])),_:1}),u(`span`,B,c(e.activeFilterCount)+` course`+c(e.activeFilterCount>1?`s`:``)+` with tag filters `,1)])):m(``,!0),n(T,{hotkey:`enter`,command:`Start Session`,disabled:!e.hasSelectedSources,"highlight-effect":`scale`},{default:t(()=>[n(x,{"data-cy":`start-studying-button`,color:`success`,size:`large`,block:``,class:`start-btn`,disabled:!e.hasSelectedSources,onClick:e.startSession},{default:t(()=>[n(b,{start:``},{default:t(()=>i[8]||(i[8]=[o(`mdi-play`)])),_:1}),i[9]||(i[9]=o(` Start! `))]),_:1},8,[`disabled`,`onClick`])]),_:1},8,[`disabled`])])])])])):!e.courseLoadError&&!e.classroomLoadError?(r(),d(`div`,V,[i[15]||(i[15]=u(`p`,null,`You don't have anything to study!`,-1)),u(`p`,null,[i[13]||(i[13]=o(`Head over to the `)),n(E,{to:`/quilts`},{default:t(()=>i[12]||(i[12]=[o(`Quilts`)])),_:1}),i[14]||(i[14]=o(` page to find something for you.`))])])):(r(),d(`div`,H,i[16]||(i[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)])))}e(_sfc_render$1,`_sfc_render`);var U=C(E,[[`render`,_sfc_render$1],[`__scopeId`,`data-v-c5ff4b5f`]]);function randomInt(e,t){return Math.floor(Math.random()*(t-e+1))+e}var W=s({name:`StudyView`,components:{SessionConfiguration:U,StudySession:g},inject:{router:{from:`router`}},props:{previewCourseID:{type:String,required:!1,default:``},randomPreview:{type:Boolean,required:!1},focusCourseID:{type:String,required:!1,default:``}},data(){return{user:null,studySessionConfig:void 0,previewCourseConfig:void 0,previewMode:!1,sessionTimeLimit:5,inSession:!1,sessionPrepared:!1,sessionError:!1,errorMessage:``,sessionContentSources:[],dataInputFormStore:T(),getViewComponent:e=>w.getView(e),dataLayer:S()}},async created(){this.user=await _(),this.studySessionConfig={likesConfetti:h().config.likesConfetti};let e=``;if(this.randomPreview){let t=await this.user.getCourseRegistrationsDoc(),n=(await S().getCoursesDB().getCourseList()).map(e=>e.courseID),r=n.filter(e=>!t.courses.some(t=>t.courseID===e));e=r.length>0?r[randomInt(0,r.length)]:n[randomInt(0,n.length)]}if(this.previewCourseID&&(this.previewMode=!0,S().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){let t=this.parseTagFilterFromQuery(),n={type:`course`,id:e};b(t)&&(n.tagFilter=t,console.log(`[Study] Tag filter from query params:`,t)),this.initStudySession([n],this.sessionTimeLimit)}},methods:{refreshRoute(){this.router.go(0)},async initStudySession(e,t){console.log(`[Study] starting study session w/ sources: ${JSON.stringify(e)}`),this.sessionContentSources=e,this.sessionTimeLimit=t,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:t}){console.error(`[Study] Session error:`,e,t),this.sessionError=!0,this.errorMessage=e||`An error occurred while preparing your study session.`,this.sessionPrepared=!1},parseTagFilterFromQuery(){let e=this.$route.query.include,t=this.$route.query.exclude,parseParam=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:parseParam(e),exclude:parseParam(t)}}}}),G={key:0},K={key:1},q={key:0,align:`center`},J={class:`text-h5`},Y={key:1},X={key:2},Z={key:0,class:`session-loading`},Q={key:1,class:`session-error`},$={class:`text-subtitle-1 mt-2`};function _sfc_render(e,s,l,f,p,h){let g=a(`SessionConfiguration`),_=a(`v-btn`),v=a(`router-link`),y=a(`v-spacer`),b=a(`v-col`),x=a(`v-row`),S=a(`v-progress-circular`),C=a(`v-container`),w=a(`v-icon`),T=a(`StudySession`);return e.inSession?(r(),d(`div`,K,[e.previewMode&&e.previewCourseConfig?(r(),d(`div`,q,[n(x,null,{default:t(()=>[n(b,null,{default:t(()=>[u(`span`,J,[s[1]||(s[1]=o(` Quilt preview for `)),u(`em`,null,c(e.previewCourseConfig.name),1)]),n(_,{size:`small`,color:`primary`,onClick:e.registerUserForPreviewCourse},{default:t(()=>s[2]||(s[2]=[o(`Join`)])),_:1},8,[`onClick`]),n(v,{to:`/quilts/${e.previewCourseConfig.courseID}`},{default:t(()=>[n(_,{size:`small`,color:`secondary`},{default:t(()=>s[3]||(s[3]=[o(`More info`)])),_:1})]),_:1},8,[`to`]),n(y)]),_:1})]),_:1})])):e.previewMode?(r(),d(`div`,Y,[n(x,null,{default:t(()=>[n(b,null,{default:t(()=>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})])):m(``,!0),e.inSession?(r(),d(`div`,X,[!e.sessionPrepared&&!e.sessionError?(r(),d(`div`,Z,[n(C,{class:`text-center`},{default:t(()=>[n(x,{justify:`center`,align:`center`,style:{"min-height":`50vh`}},{default:t(()=>[n(b,{cols:`12`},{default:t(()=>[n(S,{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})])):m(``,!0),e.sessionError?(r(),d(`div`,Q,[n(C,{class:`text-center`},{default:t(()=>[n(x,{justify:`center`,align:`center`,style:{"min-height":`50vh`}},{default:t(()=>[n(b,{cols:`12`},{default:t(()=>[n(w,{size:`64`,color:`error`},{default:t(()=>s[7]||(s[7]=[o(`mdi-alert-circle`)])),_:1}),s[9]||(s[9]=u(`div`,{class:`text-h5 mt-4 text-error`},`Session Preparation Failed`,-1)),u(`div`,$,c(e.errorMessage||`There was a problem preparing your study session.`),1),n(_,{color:`primary`,class:`mt-6`,onClick:e.refreshRoute},{default:t(()=>s[8]||(s[8]=[o(`Try Again`)])),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1})])):m(``,!0),n(T,{"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:i({"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`])])):m(``,!0)])):(r(),d(`div`,G,[n(g,{"initial-time-limit":e.sessionTimeLimit,onInitStudySession:s[0]||(s[0]=(t,n)=>e.initStudySession(t,n))},null,8,[`initial-time-limit`])]))}var ee=C(W,[[`render`,_sfc_render],[`__scopeId`,`data-v-dcbc1fde`]]);export{ee as default};
2
+ //# sourceMappingURL=Study-C5xTkc5i.js.map