@vue-skuilder/platform-ui 0.1.33 → 0.1.34

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 (63) hide show
  1. package/dist/assets/{About-C1rcp0Ex.js → About-BpqIdlZQ.js} +2 -2
  2. package/dist/assets/{About-C1rcp0Ex.js.map → About-BpqIdlZQ.js.map} +1 -1
  3. package/dist/assets/{AdminDashboard-BOHgXD45.js → AdminDashboard-BObO6egG.js} +2 -2
  4. package/dist/assets/{AdminDashboard-BOHgXD45.js.map → AdminDashboard-BObO6egG.js.map} +1 -1
  5. package/dist/assets/{ClassroomCtrlPanel-ezMgP7A3.js → ClassroomCtrlPanel-lgN6cdTd.js} +2 -2
  6. package/dist/assets/{ClassroomCtrlPanel-ezMgP7A3.js.map → ClassroomCtrlPanel-lgN6cdTd.js.map} +1 -1
  7. package/dist/assets/{Classrooms-CdN-ogiI.js → Classrooms-BWoQ4i1_.js} +2 -2
  8. package/dist/assets/{Classrooms-CdN-ogiI.js.map → Classrooms-BWoQ4i1_.js.map} +1 -1
  9. package/dist/assets/{CourseRouter-BKHj3HHh.js → CourseRouter-CODD0Qm5.js} +2 -2
  10. package/dist/assets/{CourseRouter-BKHj3HHh.js.map → CourseRouter-CODD0Qm5.js.map} +1 -1
  11. package/dist/assets/{Courses-DTsQz202.js → Courses-ClDdLQUO.js} +2 -2
  12. package/dist/assets/{Courses-DTsQz202.js.map → Courses-ClDdLQUO.js.map} +1 -1
  13. package/dist/assets/{DataInputFormTester-BC2ZDakI.js → DataInputFormTester-ywHjm2yC.js} +2 -2
  14. package/dist/assets/{DataInputFormTester-BC2ZDakI.js.map → DataInputFormTester-ywHjm2yC.js.map} +1 -1
  15. package/dist/assets/{EloModeration-DqViuzI8.js → EloModeration-B6LM11G_.js} +2 -2
  16. package/dist/assets/{EloModeration-DqViuzI8.js.map → EloModeration-B6LM11G_.js.map} +1 -1
  17. package/dist/assets/{JoinCode-BjbhKTgK.js → JoinCode-DgPD_OFL.js} +2 -2
  18. package/dist/assets/{JoinCode-BjbhKTgK.js.map → JoinCode-DgPD_OFL.js.map} +1 -1
  19. package/dist/assets/{NewCourseDialog-4YsIKoUU.js → NewCourseDialog-DhwvBT3y.js} +2 -2
  20. package/dist/assets/{NewCourseDialog-4YsIKoUU.js.map → NewCourseDialog-DhwvBT3y.js.map} +1 -1
  21. package/dist/assets/{ReleaseNotes-BYXN8IZ4.js → ReleaseNotes-DtwDIIfH.js} +2 -2
  22. package/dist/assets/{ReleaseNotes-BYXN8IZ4.js.map → ReleaseNotes-DtwDIIfH.js.map} +1 -1
  23. package/dist/assets/{RequestPasswordReset-Zxt4oKHx.js → RequestPasswordReset-DBv0XCIk.js} +2 -2
  24. package/dist/assets/{RequestPasswordReset-Zxt4oKHx.js.map → RequestPasswordReset-DBv0XCIk.js.map} +1 -1
  25. package/dist/assets/{ResetPassword-rAc69I0Q.js → ResetPassword-BtBplqsQ.js} +2 -2
  26. package/dist/assets/{ResetPassword-rAc69I0Q.js.map → ResetPassword-BtBplqsQ.js.map} +1 -1
  27. package/dist/assets/{Study-DJlTc-ZH.js → Study-D9W1DKes.js} +2 -2
  28. package/dist/assets/{Study-DJlTc-ZH.js.map → Study-D9W1DKes.js.map} +1 -1
  29. package/dist/assets/{TagInformation-CSUtrZy7.js → TagInformation-DgUkKxoU.js} +2 -2
  30. package/dist/assets/{TagInformation-CSUtrZy7.js.map → TagInformation-DgUkKxoU.js.map} +1 -1
  31. package/dist/assets/{User-D2R6CphB.js → User-DorFkRx_.js} +2 -2
  32. package/dist/assets/{User-D2R6CphB.js.map → User-DorFkRx_.js.map} +1 -1
  33. package/dist/assets/{UserStats-BgnHXg6C.js → UserStats-ck9Oh4qt.js} +2 -2
  34. package/dist/assets/{UserStats-BgnHXg6C.js.map → UserStats-ck9Oh4qt.js.map} +1 -1
  35. package/dist/assets/{VerifyEmail-BLfciV-4.js → VerifyEmail-BYt5xfhm.js} +2 -2
  36. package/dist/assets/{VerifyEmail-BLfciV-4.js.map → VerifyEmail-BYt5xfhm.js.map} +1 -1
  37. package/dist/assets/{common-ui.es-I814CYyx.js → common-ui.es-BrXWBn7p.js} +6 -6
  38. package/dist/assets/common-ui.es-BrXWBn7p.js.map +1 -0
  39. package/dist/assets/common-ui.es-DKUQOgQx.js +1 -0
  40. package/dist/assets/dist-5cG6aSxW.js +1 -0
  41. package/dist/assets/{dist-DkeESCP4.js → dist-CzLl7g6t.js} +11 -10
  42. package/dist/assets/dist-CzLl7g6t.js.map +1 -0
  43. package/dist/assets/{dist-BwVFN4Xe.js → dist-D5-LrzD6.js} +3 -3
  44. package/dist/assets/{dist-BwVFN4Xe.js.map → dist-D5-LrzD6.js.map} +1 -1
  45. package/dist/assets/dist-y6_rrqhr.js +1 -0
  46. package/dist/assets/{edit-ui.es-Cs9EI-Ey.js → edit-ui.es-C9MhXwkt.js} +2 -2
  47. package/dist/assets/{edit-ui.es-Cs9EI-Ey.js.map → edit-ui.es-C9MhXwkt.js.map} +1 -1
  48. package/dist/assets/edit-ui.es-DT9CMaNG.js +1 -0
  49. package/dist/assets/{index-DotoyByQ.css → index-C8gy3Ea0.css} +1 -1
  50. package/dist/assets/{index-CF-NaZ2k.js → index-DUZItsH-.js} +4 -4
  51. package/dist/assets/{index-CF-NaZ2k.js.map → index-DUZItsH-.js.map} +1 -1
  52. package/dist/assets/{server-Cl1ZnRx7.js → server-Db_WegNj.js} +2 -2
  53. package/dist/assets/{server-Cl1ZnRx7.js.map → server-Db_WegNj.js.map} +1 -1
  54. package/dist/index.html +4 -4
  55. package/dist/sw.js +1 -1
  56. package/dist/sw.js.map +1 -1
  57. package/package.json +8 -8
  58. package/dist/assets/common-ui.es-B6tKmOxI.js +0 -1
  59. package/dist/assets/common-ui.es-I814CYyx.js.map +0 -1
  60. package/dist/assets/dist-BjDnRspm.js +0 -1
  61. package/dist/assets/dist-CFgc27Ho.js +0 -1
  62. package/dist/assets/dist-DkeESCP4.js.map +0 -1
  63. package/dist/assets/edit-ui.es-C_I54ckd.js +0 -1
@@ -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-I814CYyx.js";import{T as v,f as y,w as b}from"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import{k as x}from"./dist-DkeESCP4.js";import{t as S}from"./index-CF-NaZ2k.js";import{t as C}from"./server-Cl1ZnRx7.js";import{t as w}from"./NewCourseDialog-4YsIKoUU.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-BrXWBn7p.js";import{T as v,f as y,w as b}from"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import{k as x}from"./dist-CzLl7g6t.js";import{t as S}from"./index-DUZItsH-.js";import{t as C}from"./server-Db_WegNj.js";import{t as w}from"./NewCourseDialog-DhwvBT3y.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-DTsQz202.js.map
3
+ //# sourceMappingURL=Courses-ClDdLQUO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Courses-DTsQz202.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-ClDdLQUO.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{H as e,K as t,T as n,b as r,v as i}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{G as a,m as o}from"./common-ui.es-I814CYyx.js";import"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import"./dist-DkeESCP4.js";import{t as s}from"./index-CF-NaZ2k.js";import"./dist-BwVFN4Xe.js";import{n as c}from"./edit-ui.es-Cs9EI-Ey.js";var l=Object.assign({}),u=n({name:`DataInputFormTester`,components:{DataInputForm:c},setup(){return{route:a()}},data(){return{dataShape:null,cds:null,component:null}},async created(){try{let e=`../${this.route.params.pathMatch}/index.ts`;if(console.log(`Looking for module:`,e),console.log(`Available paths:`,Object.keys(l)),e in l){let t=await l[e](),n=Object.entries(t).find(([e,t])=>{let n=typeof t==`function`,r=n&&t.prototype instanceof o;return console.log(`Checking export "${e}":`,{isClass:n,extendsQuestion:r,type:typeof t}),r});if(!n)throw Error(`No export found extending Question class`);this.component=n[1];let r=this.component?.dataShapes[0];r&&(this.dataShape=r)}else throw Error(`No module found at path: ${e}`)}catch(e){console.log(`[difTester] Error loading component`,e)}}}),d={key:1};function _sfc_render(n,a,o,s,c,l){let u=t(`data-input-form`);return e(),r(`div`,null,[n.component&&n.dataShape?(e(),i(u,{key:0,"data-shape":n.dataShape,"course-cfg":{courseID:`testCourse`,name:`testCourseName`,description:`All of these courses will be the same!`,admins:[`admin`],creator:`admin`,deleted:!1,moderators:[],public:!0,disambiguator:`testCourseName`,questionTypes:[],dataShapes:[]},"preview-component":n.component},null,8,[`data-shape`,`preview-component`])):(e(),r(`div`,d,` No component loaded :/ `))])}var f=s(u,[[`render`,_sfc_render]]);export{f as default};
2
- //# sourceMappingURL=DataInputFormTester-BC2ZDakI.js.map
1
+ import"./chunk-D6hFPZc3.js";import{H as e,K as t,T as n,b as r,v as i}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{G as a,m as o}from"./common-ui.es-BrXWBn7p.js";import"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import"./dist-CzLl7g6t.js";import{t as s}from"./index-DUZItsH-.js";import"./dist-D5-LrzD6.js";import{n as c}from"./edit-ui.es-C9MhXwkt.js";var l=Object.assign({}),u=n({name:`DataInputFormTester`,components:{DataInputForm:c},setup(){return{route:a()}},data(){return{dataShape:null,cds:null,component:null}},async created(){try{let e=`../${this.route.params.pathMatch}/index.ts`;if(console.log(`Looking for module:`,e),console.log(`Available paths:`,Object.keys(l)),e in l){let t=await l[e](),n=Object.entries(t).find(([e,t])=>{let n=typeof t==`function`,r=n&&t.prototype instanceof o;return console.log(`Checking export "${e}":`,{isClass:n,extendsQuestion:r,type:typeof t}),r});if(!n)throw Error(`No export found extending Question class`);this.component=n[1];let r=this.component?.dataShapes[0];r&&(this.dataShape=r)}else throw Error(`No module found at path: ${e}`)}catch(e){console.log(`[difTester] Error loading component`,e)}}}),d={key:1};function _sfc_render(n,a,o,s,c,l){let u=t(`data-input-form`);return e(),r(`div`,null,[n.component&&n.dataShape?(e(),i(u,{key:0,"data-shape":n.dataShape,"course-cfg":{courseID:`testCourse`,name:`testCourseName`,description:`All of these courses will be the same!`,admins:[`admin`],creator:`admin`,deleted:!1,moderators:[],public:!0,disambiguator:`testCourseName`,questionTypes:[],dataShapes:[]},"preview-component":n.component},null,8,[`data-shape`,`preview-component`])):(e(),r(`div`,d,` No component loaded :/ `))])}var f=s(u,[[`render`,_sfc_render]]);export{f as default};
2
+ //# sourceMappingURL=DataInputFormTester-ywHjm2yC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataInputFormTester-BC2ZDakI.js","names":[],"sources":["../../src/dev/DataInputFormTester.vue","../../src/dev/DataInputFormTester.vue"],"sourcesContent":["<template>\n <div>\n <data-input-form\n v-if=\"component && dataShape\"\n :data-shape=\"dataShape\"\n :course-cfg=\"{\n courseID: 'testCourse',\n name: 'testCourseName',\n description: 'All of these courses will be the same!',\n admins: ['admin'],\n creator: 'admin',\n deleted: false,\n moderators: [],\n public: true,\n disambiguator: 'testCourseName',\n questionTypes: [],\n dataShapes: [],\n }\"\n :preview-component=\"component\"\n />\n <div v-else>\n No component loaded :/\n <!--\n\n todo: provide list of Question type components, with router links\n to their DataInputFormTester loaders.\n\n --></div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { DataInputForm } from '@vue-skuilder/edit-ui';\nimport { DataShape } from '../../src/base-course/Interfaces/DataShape';\nimport { useRoute } from 'vue-router';\nimport { Question } from '@vue-skuilder/common-ui';\n\ntype CourseShapes = {\n courseID: string;\n dataShapes: DataShape[];\n};\n\nconst questionModules = import.meta.glob('../**/questions/**/index.ts', {\n // Adding eager: false ensures lazy loading\n eager: false,\n});\n\ntype ModuleExports = {\n [key: string]: unknown;\n};\n\nexport default defineComponent({\n name: 'DataInputFormTester',\n\n components: {\n DataInputForm,\n },\n\n setup() {\n return {\n route: useRoute(),\n };\n },\n\n data() {\n return {\n dataShape: null as DataShape | null,\n cds: null as CourseShapes[] | null,\n component: null as typeof Question | null,\n };\n },\n\n async created() {\n try {\n const q = this.route.params.pathMatch;\n const modulePath = `../${q}/index.ts`;\n\n console.log('Looking for module:', modulePath);\n console.log('Available paths:', Object.keys(questionModules));\n\n if (modulePath in questionModules) {\n const module = (await questionModules[modulePath]()) as ModuleExports;\n\n // Find the Question implementation\n const matchingExport = Object.entries(module).find(([name, exportValue]) => {\n const isClass = typeof exportValue === 'function';\n const extendsQuestion = isClass && exportValue.prototype instanceof Question;\n\n console.log(`Checking export \"${name}\":`, {\n isClass,\n extendsQuestion,\n type: typeof exportValue,\n });\n\n return extendsQuestion;\n });\n\n if (!matchingExport) {\n throw new Error('No export found extending Question class');\n }\n\n this.component = matchingExport[1] as typeof Question;\n\n const ds = this.component?.dataShapes[0];\n if (ds) {\n this.dataShape = ds;\n }\n } else {\n throw new Error(`No module found at path: ${modulePath}`);\n }\n } catch (e) {\n console.log('[difTester] Error loading component', e);\n }\n },\n});\n</script>\n","<template>\n <div>\n <data-input-form\n v-if=\"component && dataShape\"\n :data-shape=\"dataShape\"\n :course-cfg=\"{\n courseID: 'testCourse',\n name: 'testCourseName',\n description: 'All of these courses will be the same!',\n admins: ['admin'],\n creator: 'admin',\n deleted: false,\n moderators: [],\n public: true,\n disambiguator: 'testCourseName',\n questionTypes: [],\n dataShapes: [],\n }\"\n :preview-component=\"component\"\n />\n <div v-else>\n No component loaded :/\n <!--\n\n todo: provide list of Question type components, with router links\n to their DataInputFormTester loaders.\n\n --></div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { DataInputForm } from '@vue-skuilder/edit-ui';\nimport { DataShape } from '../../src/base-course/Interfaces/DataShape';\nimport { useRoute } from 'vue-router';\nimport { Question } from '@vue-skuilder/common-ui';\n\ntype CourseShapes = {\n courseID: string;\n dataShapes: DataShape[];\n};\n\nconst questionModules = import.meta.glob('../**/questions/**/index.ts', {\n // Adding eager: false ensures lazy loading\n eager: false,\n});\n\ntype ModuleExports = {\n [key: string]: unknown;\n};\n\nexport default defineComponent({\n name: 'DataInputFormTester',\n\n components: {\n DataInputForm,\n },\n\n setup() {\n return {\n route: useRoute(),\n };\n },\n\n data() {\n return {\n dataShape: null as DataShape | null,\n cds: null as CourseShapes[] | null,\n component: null as typeof Question | null,\n };\n },\n\n async created() {\n try {\n const q = this.route.params.pathMatch;\n const modulePath = `../${q}/index.ts`;\n\n console.log('Looking for module:', modulePath);\n console.log('Available paths:', Object.keys(questionModules));\n\n if (modulePath in questionModules) {\n const module = (await questionModules[modulePath]()) as ModuleExports;\n\n // Find the Question implementation\n const matchingExport = Object.entries(module).find(([name, exportValue]) => {\n const isClass = typeof exportValue === 'function';\n const extendsQuestion = isClass && exportValue.prototype instanceof Question;\n\n console.log(`Checking export \"${name}\":`, {\n isClass,\n extendsQuestion,\n type: typeof exportValue,\n });\n\n return extendsQuestion;\n });\n\n if (!matchingExport) {\n throw new Error('No export found extending Question class');\n }\n\n this.component = matchingExport[1] as typeof Question;\n\n const ds = this.component?.dataShapes[0];\n if (ds) {\n this.dataShape = ds;\n }\n } else {\n throw new Error(`No module found at path: ${modulePath}`);\n }\n } catch (e) {\n console.log('[difTester] Error loading component', e);\n }\n },\n});\n</script>\n"],"mappings":"8XC2CA,IAAM,EAAkB,OAAA,OAAA,EAAA,CAGtB,CAMF,EAAe,EAAgB,CAC7B,KAAM,sBAEN,WAAY,CACV,cAAA,EACD,CAED,OAAQ,CACN,MAAO,CACL,MAAO,GAAU,CAClB,EAGH,MAAO,CACL,MAAO,CACL,UAAW,KACX,IAAK,KACL,UAAW,KACZ,EAGH,MAAM,SAAU,CACd,GAAI,CAEF,IAAM,EAAa,MADT,KAAK,MAAM,OAAO,UACD,WAK3B,GAHA,QAAQ,IAAI,sBAAuB,EAAW,CAC9C,QAAQ,IAAI,mBAAoB,OAAO,KAAK,EAAgB,CAAC,CAEzD,KAAc,EAAiB,CACjC,IAAM,EAAU,MAAM,EAAgB,IAAa,CAG7C,EAAiB,OAAO,QAAQ,EAAO,CAAC,MAAM,CAAC,EAAM,KAAiB,CAC1E,IAAM,EAAU,OAAO,GAAgB,WACjC,EAAkB,GAAW,EAAY,qBAAqB,EAQpE,OANA,QAAQ,IAAI,oBAAoB,EAAK,IAAK,CACxC,UACA,kBACA,KAAM,OAAO,EACd,CAAC,CAEK,GACP,CAEF,GAAI,CAAC,EACH,MAAU,MAAM,2CAA2C,CAG7D,KAAK,UAAY,EAAe,GAEhC,IAAM,EAAK,KAAK,WAAW,WAAW,GAClC,IACF,KAAK,UAAY,QAGnB,MAAU,MAAM,4BAA4B,IAAa,OAEpD,EAAG,CACV,QAAQ,IAAI,sCAAuC,EAAE,GAG1D,CAAC,IAnHF,IAAA,EAAA,yEACE,EA2BM,MAAA,KAAA,CAzBI,EAAA,WAAa,EAAA,WAAA,GAAA,CADrB,EAiBE,EAAA,CAnBN,IAAA,EAIO,aAAY,EAAA,UACZ,aAAY,oOAYZ,CACA,oBAAmB,EAAA,4DAEtB,EAOS,MA3Bb,EAoBgB,2BAEV,EAAA,CAAA"}
1
+ {"version":3,"file":"DataInputFormTester-ywHjm2yC.js","names":[],"sources":["../../src/dev/DataInputFormTester.vue","../../src/dev/DataInputFormTester.vue"],"sourcesContent":["<template>\n <div>\n <data-input-form\n v-if=\"component && dataShape\"\n :data-shape=\"dataShape\"\n :course-cfg=\"{\n courseID: 'testCourse',\n name: 'testCourseName',\n description: 'All of these courses will be the same!',\n admins: ['admin'],\n creator: 'admin',\n deleted: false,\n moderators: [],\n public: true,\n disambiguator: 'testCourseName',\n questionTypes: [],\n dataShapes: [],\n }\"\n :preview-component=\"component\"\n />\n <div v-else>\n No component loaded :/\n <!--\n\n todo: provide list of Question type components, with router links\n to their DataInputFormTester loaders.\n\n --></div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { DataInputForm } from '@vue-skuilder/edit-ui';\nimport { DataShape } from '../../src/base-course/Interfaces/DataShape';\nimport { useRoute } from 'vue-router';\nimport { Question } from '@vue-skuilder/common-ui';\n\ntype CourseShapes = {\n courseID: string;\n dataShapes: DataShape[];\n};\n\nconst questionModules = import.meta.glob('../**/questions/**/index.ts', {\n // Adding eager: false ensures lazy loading\n eager: false,\n});\n\ntype ModuleExports = {\n [key: string]: unknown;\n};\n\nexport default defineComponent({\n name: 'DataInputFormTester',\n\n components: {\n DataInputForm,\n },\n\n setup() {\n return {\n route: useRoute(),\n };\n },\n\n data() {\n return {\n dataShape: null as DataShape | null,\n cds: null as CourseShapes[] | null,\n component: null as typeof Question | null,\n };\n },\n\n async created() {\n try {\n const q = this.route.params.pathMatch;\n const modulePath = `../${q}/index.ts`;\n\n console.log('Looking for module:', modulePath);\n console.log('Available paths:', Object.keys(questionModules));\n\n if (modulePath in questionModules) {\n const module = (await questionModules[modulePath]()) as ModuleExports;\n\n // Find the Question implementation\n const matchingExport = Object.entries(module).find(([name, exportValue]) => {\n const isClass = typeof exportValue === 'function';\n const extendsQuestion = isClass && exportValue.prototype instanceof Question;\n\n console.log(`Checking export \"${name}\":`, {\n isClass,\n extendsQuestion,\n type: typeof exportValue,\n });\n\n return extendsQuestion;\n });\n\n if (!matchingExport) {\n throw new Error('No export found extending Question class');\n }\n\n this.component = matchingExport[1] as typeof Question;\n\n const ds = this.component?.dataShapes[0];\n if (ds) {\n this.dataShape = ds;\n }\n } else {\n throw new Error(`No module found at path: ${modulePath}`);\n }\n } catch (e) {\n console.log('[difTester] Error loading component', e);\n }\n },\n});\n</script>\n","<template>\n <div>\n <data-input-form\n v-if=\"component && dataShape\"\n :data-shape=\"dataShape\"\n :course-cfg=\"{\n courseID: 'testCourse',\n name: 'testCourseName',\n description: 'All of these courses will be the same!',\n admins: ['admin'],\n creator: 'admin',\n deleted: false,\n moderators: [],\n public: true,\n disambiguator: 'testCourseName',\n questionTypes: [],\n dataShapes: [],\n }\"\n :preview-component=\"component\"\n />\n <div v-else>\n No component loaded :/\n <!--\n\n todo: provide list of Question type components, with router links\n to their DataInputFormTester loaders.\n\n --></div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { DataInputForm } from '@vue-skuilder/edit-ui';\nimport { DataShape } from '../../src/base-course/Interfaces/DataShape';\nimport { useRoute } from 'vue-router';\nimport { Question } from '@vue-skuilder/common-ui';\n\ntype CourseShapes = {\n courseID: string;\n dataShapes: DataShape[];\n};\n\nconst questionModules = import.meta.glob('../**/questions/**/index.ts', {\n // Adding eager: false ensures lazy loading\n eager: false,\n});\n\ntype ModuleExports = {\n [key: string]: unknown;\n};\n\nexport default defineComponent({\n name: 'DataInputFormTester',\n\n components: {\n DataInputForm,\n },\n\n setup() {\n return {\n route: useRoute(),\n };\n },\n\n data() {\n return {\n dataShape: null as DataShape | null,\n cds: null as CourseShapes[] | null,\n component: null as typeof Question | null,\n };\n },\n\n async created() {\n try {\n const q = this.route.params.pathMatch;\n const modulePath = `../${q}/index.ts`;\n\n console.log('Looking for module:', modulePath);\n console.log('Available paths:', Object.keys(questionModules));\n\n if (modulePath in questionModules) {\n const module = (await questionModules[modulePath]()) as ModuleExports;\n\n // Find the Question implementation\n const matchingExport = Object.entries(module).find(([name, exportValue]) => {\n const isClass = typeof exportValue === 'function';\n const extendsQuestion = isClass && exportValue.prototype instanceof Question;\n\n console.log(`Checking export \"${name}\":`, {\n isClass,\n extendsQuestion,\n type: typeof exportValue,\n });\n\n return extendsQuestion;\n });\n\n if (!matchingExport) {\n throw new Error('No export found extending Question class');\n }\n\n this.component = matchingExport[1] as typeof Question;\n\n const ds = this.component?.dataShapes[0];\n if (ds) {\n this.dataShape = ds;\n }\n } else {\n throw new Error(`No module found at path: ${modulePath}`);\n }\n } catch (e) {\n console.log('[difTester] Error loading component', e);\n }\n },\n});\n</script>\n"],"mappings":"8XC2CA,IAAM,EAAkB,OAAA,OAAA,EAAA,CAGtB,CAMF,EAAe,EAAgB,CAC7B,KAAM,sBAEN,WAAY,CACV,cAAA,EACD,CAED,OAAQ,CACN,MAAO,CACL,MAAO,GAAU,CAClB,EAGH,MAAO,CACL,MAAO,CACL,UAAW,KACX,IAAK,KACL,UAAW,KACZ,EAGH,MAAM,SAAU,CACd,GAAI,CAEF,IAAM,EAAa,MADT,KAAK,MAAM,OAAO,UACD,WAK3B,GAHA,QAAQ,IAAI,sBAAuB,EAAW,CAC9C,QAAQ,IAAI,mBAAoB,OAAO,KAAK,EAAgB,CAAC,CAEzD,KAAc,EAAiB,CACjC,IAAM,EAAU,MAAM,EAAgB,IAAa,CAG7C,EAAiB,OAAO,QAAQ,EAAO,CAAC,MAAM,CAAC,EAAM,KAAiB,CAC1E,IAAM,EAAU,OAAO,GAAgB,WACjC,EAAkB,GAAW,EAAY,qBAAqB,EAQpE,OANA,QAAQ,IAAI,oBAAoB,EAAK,IAAK,CACxC,UACA,kBACA,KAAM,OAAO,EACd,CAAC,CAEK,GACP,CAEF,GAAI,CAAC,EACH,MAAU,MAAM,2CAA2C,CAG7D,KAAK,UAAY,EAAe,GAEhC,IAAM,EAAK,KAAK,WAAW,WAAW,GAClC,IACF,KAAK,UAAY,QAGnB,MAAU,MAAM,4BAA4B,IAAa,OAEpD,EAAG,CACV,QAAQ,IAAI,sCAAuC,EAAE,GAG1D,CAAC,IAnHF,IAAA,EAAA,yEACE,EA2BM,MAAA,KAAA,CAzBI,EAAA,WAAa,EAAA,WAAA,GAAA,CADrB,EAiBE,EAAA,CAnBN,IAAA,EAIO,aAAY,EAAA,UACZ,aAAY,oOAYZ,CACA,oBAAmB,EAAA,4DAEtB,EAOS,MA3Bb,EAoBgB,2BAEV,EAAA,CAAA"}
@@ -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-I814CYyx.js";import{m as u}from"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import{k as d}from"./dist-DkeESCP4.js";import{t as f}from"./index-CF-NaZ2k.js";import{g as p}from"./dist-BwVFN4Xe.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-DqViuzI8.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-BrXWBn7p.js";import{m as u}from"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import{k as d}from"./dist-CzLl7g6t.js";import{t as f}from"./index-DUZItsH-.js";import{g as p}from"./dist-D5-LrzD6.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-B6LM11G_.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EloModeration-DqViuzI8.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":"0YCmCA,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-B6LM11G_.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":"0YCmCA,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-CrcJCHFk.js";import{k as l}from"./dist-DkeESCP4.js";import{t as u}from"./index-CF-NaZ2k.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-CrcJCHFk.js";import{k as l}from"./dist-CzLl7g6t.js";import{t as u}from"./index-DUZItsH-.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-BjbhKTgK.js.map
3
+ //# sourceMappingURL=JoinCode-DgPD_OFL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JoinCode-BjbhKTgK.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-DgPD_OFL.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-I814CYyx.js";import{w as d}from"./dist-CrcJCHFk.js";import{t as f}from"./index-CF-NaZ2k.js";import{n as p,t as m}from"./server-Cl1ZnRx7.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-4YsIKoUU.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-BrXWBn7p.js";import{w as d}from"./dist-CrcJCHFk.js";import{t as f}from"./index-DUZItsH-.js";import{n as p,t as m}from"./server-Db_WegNj.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-DhwvBT3y.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NewCourseDialog-4YsIKoUU.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-DhwvBT3y.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-CF-NaZ2k.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-BYXN8IZ4.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-DUZItsH-.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-DtwDIIfH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReleaseNotes-BYXN8IZ4.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-DtwDIIfH.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-I814CYyx.js";import"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import"./dist-DkeESCP4.js";import{t as s}from"./index-CF-NaZ2k.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-Zxt4oKHx.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-BrXWBn7p.js";import"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import"./dist-CzLl7g6t.js";import{t as s}from"./index-DUZItsH-.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-DBv0XCIk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RequestPasswordReset-Zxt4oKHx.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-DBv0XCIk.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-I814CYyx.js";import"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import"./dist-DkeESCP4.js";import{t as c}from"./index-CF-NaZ2k.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-rAc69I0Q.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-BrXWBn7p.js";import"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import"./dist-CzLl7g6t.js";import{t as c}from"./index-DUZItsH-.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-BtBplqsQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResetPassword-rAc69I0Q.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-BtBplqsQ.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"}