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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/assets/{About-BzQmP9L6.js → About-D3O4ft8c.js} +2 -2
  2. package/dist/assets/{About-BzQmP9L6.js.map → About-D3O4ft8c.js.map} +1 -1
  3. package/dist/assets/{AdminDashboard-Btfp3xbX.js → AdminDashboard-DH-Wi1tp.js} +2 -2
  4. package/dist/assets/{AdminDashboard-Btfp3xbX.js.map → AdminDashboard-DH-Wi1tp.js.map} +1 -1
  5. package/dist/assets/{ClassroomCtrlPanel-Del1NMJ0.js → ClassroomCtrlPanel-BZ2Jso_N.js} +2 -2
  6. package/dist/assets/{ClassroomCtrlPanel-Del1NMJ0.js.map → ClassroomCtrlPanel-BZ2Jso_N.js.map} +1 -1
  7. package/dist/assets/{Classrooms-uc9jXghN.js → Classrooms-Dk081Q6U.js} +2 -2
  8. package/dist/assets/{Classrooms-uc9jXghN.js.map → Classrooms-Dk081Q6U.js.map} +1 -1
  9. package/dist/assets/{CourseRouter-DfwtPHs0.js → CourseRouter-BK4PYhtA.js} +2 -2
  10. package/dist/assets/{CourseRouter-DfwtPHs0.js.map → CourseRouter-BK4PYhtA.js.map} +1 -1
  11. package/dist/assets/{Courses-Iub72F0b.js → Courses-DU7lVPoV.js} +2 -2
  12. package/dist/assets/{Courses-Iub72F0b.js.map → Courses-DU7lVPoV.js.map} +1 -1
  13. package/dist/assets/{DataInputFormTester-BL-SAhyy.js → DataInputFormTester-CL0gV9cw.js} +2 -2
  14. package/dist/assets/{DataInputFormTester-BL-SAhyy.js.map → DataInputFormTester-CL0gV9cw.js.map} +1 -1
  15. package/dist/assets/{EloModeration-DK8zrUJv.js → EloModeration-DfSLA79x.js} +2 -2
  16. package/dist/assets/{EloModeration-DK8zrUJv.js.map → EloModeration-DfSLA79x.js.map} +1 -1
  17. package/dist/assets/{JoinCode-CnXEpiOH.js → JoinCode-njKk1YJx.js} +2 -2
  18. package/dist/assets/{JoinCode-CnXEpiOH.js.map → JoinCode-njKk1YJx.js.map} +1 -1
  19. package/dist/assets/{NewCourseDialog-4P2ZrBpL.js → NewCourseDialog-gxkU-IdZ.js} +2 -2
  20. package/dist/assets/{NewCourseDialog-4P2ZrBpL.js.map → NewCourseDialog-gxkU-IdZ.js.map} +1 -1
  21. package/dist/assets/{ReleaseNotes-CH_BZW3D.js → ReleaseNotes-Dp_ykMR1.js} +2 -2
  22. package/dist/assets/{ReleaseNotes-CH_BZW3D.js.map → ReleaseNotes-Dp_ykMR1.js.map} +1 -1
  23. package/dist/assets/{RequestPasswordReset-06j_OmhC.js → RequestPasswordReset-BavuuCBu.js} +2 -2
  24. package/dist/assets/{RequestPasswordReset-06j_OmhC.js.map → RequestPasswordReset-BavuuCBu.js.map} +1 -1
  25. package/dist/assets/{ResetPassword-Bm2btF6K.js → ResetPassword-CA8HHOIy.js} +2 -2
  26. package/dist/assets/{ResetPassword-Bm2btF6K.js.map → ResetPassword-CA8HHOIy.js.map} +1 -1
  27. package/dist/assets/{Study-D3owlaib.js → Study-B4tBks0X.js} +2 -2
  28. package/dist/assets/{Study-D3owlaib.js.map → Study-B4tBks0X.js.map} +1 -1
  29. package/dist/assets/{TagInformation-BpBQo85-.js → TagInformation-CHi7V_t8.js} +2 -2
  30. package/dist/assets/{TagInformation-BpBQo85-.js.map → TagInformation-CHi7V_t8.js.map} +1 -1
  31. package/dist/assets/{User-NjHri3_k.js → User-DbWphbh1.js} +2 -2
  32. package/dist/assets/{User-NjHri3_k.js.map → User-DbWphbh1.js.map} +1 -1
  33. package/dist/assets/{UserStats-B_Oc2Pl5.js → UserStats-rzVY5epq.js} +2 -2
  34. package/dist/assets/{UserStats-B_Oc2Pl5.js.map → UserStats-rzVY5epq.js.map} +1 -1
  35. package/dist/assets/{VerifyEmail-C_CXjeU5.js → VerifyEmail-pMcSlNzF.js} +2 -2
  36. package/dist/assets/{VerifyEmail-C_CXjeU5.js.map → VerifyEmail-pMcSlNzF.js.map} +1 -1
  37. package/dist/assets/{edit-ui.es-BX72VVRb.js → edit-ui.es-DGbs4pNc.js} +2 -2
  38. package/dist/assets/{edit-ui.es-BX72VVRb.js.map → edit-ui.es-DGbs4pNc.js.map} +1 -1
  39. package/dist/assets/{index-BHFq3MXV.js → index-CSo_psn8.js} +3 -3
  40. package/dist/assets/{index-BHFq3MXV.js.map → index-CSo_psn8.js.map} +1 -1
  41. package/dist/assets/index-PISHyq1I.js +3 -0
  42. package/dist/assets/index-PISHyq1I.js.map +1 -0
  43. package/dist/assets/{index-kzKpN32E.css → index-aYts26PW.css} +1 -1
  44. package/dist/assets/{mousetrap-BPMmAIzH.js → mousetrap-DZcUUEaw.js} +2 -2
  45. package/dist/assets/{mousetrap-BPMmAIzH.js.map → mousetrap-DZcUUEaw.js.map} +1 -1
  46. package/dist/index.html +2 -2
  47. package/dist/sw.js +1 -1
  48. package/dist/sw.js.map +1 -1
  49. package/package.json +7 -7
  50. package/dist/assets/index-CfLe2ewO.js +0 -3
  51. package/dist/assets/index-CfLe2ewO.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{d as a,_ as e,r as t,c as o,o as s,w as l,a as n,b as r,e as i}from"./index-CfLe2ewO.js";const d=e(a({name:"AboutView",components:{},data:()=>({type:"Viewable"})}),[["render",function(a,e,d,c,u,b){const f=t("v-btn"),m=t("v-col"),p=t("v-row"),h=t("v-container");return s(),o(h,{class:"about"},{default:l((()=>[n(p,null,{default:l((()=>[n(m,null,{default:l((()=>[e[1]||(e[1]=r("h1",{class:"text-h2 mb-6"},"Todo.",-1)),e[2]||(e[2]=r("p",{class:"text-body-1 mb-4"}," This is a placeholder for the about page. It will be filled in with more information later. ",-1)),n(f,{to:"./notes",variant:"text",color:"primary"},{default:l((()=>e[0]||(e[0]=[i(" Release Notes ")]))),_:1})])),_:1})])),_:1})])),_:1})}]]);export{d as default};
2
- //# sourceMappingURL=About-BzQmP9L6.js.map
1
+ import{d as a,_ as e,r as t,c as o,o as s,w as l,a as n,b as r,e as i}from"./index-PISHyq1I.js";const d=e(a({name:"AboutView",components:{},data:()=>({type:"Viewable"})}),[["render",function(a,e,d,c,u,b){const f=t("v-btn"),m=t("v-col"),p=t("v-row"),h=t("v-container");return s(),o(h,{class:"about"},{default:l((()=>[n(p,null,{default:l((()=>[n(m,null,{default:l((()=>[e[1]||(e[1]=r("h1",{class:"text-h2 mb-6"},"Todo.",-1)),e[2]||(e[2]=r("p",{class:"text-body-1 mb-4"}," This is a placeholder for the about page. It will be filled in with more information later. ",-1)),n(f,{to:"./notes",variant:"text",color:"primary"},{default:l((()=>e[0]||(e[0]=[i(" Release Notes ")]))),_:1})])),_:1})])),_:1})])),_:1})}]]);export{d as default};
2
+ //# sourceMappingURL=About-D3O4ft8c.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"About-BzQmP9L6.js","sources":["../../src/views/About.vue"],"sourcesContent":["<template>\n <v-container class=\"about\">\n <v-row>\n <v-col>\n <h1 class=\"text-h2 mb-6\">Todo.</h1>\n\n <p class=\"text-body-1 mb-4\">\n This is a placeholder for the about page. It will be filled in with more information later.\n </p>\n\n <v-btn :to=\"'./notes'\" variant=\"text\" color=\"primary\"> Release Notes </v-btn>\n </v-col>\n </v-row>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'AboutView',\n components: {},\n data() {\n return {\n type: 'Viewable',\n };\n },\n});\n</script>\n"],"names":["defineComponent","name","components","data","type","_createBlock","_component_v_container","class","default","_createVNode","_component_v_row","_component_v_col","_cache","_createElementVNode","_component_v_btn","to","variant","color","_withCtx","_createTextVNode","_"],"mappings":"0GAmBeA,EAAgB,CAC7BC,KAAM,YACNC,WAAY,CAAA,EACZC,KAAA,KACS,CACLC,KAAM,2HAvBVC,EAYcC,EAAA,CAZDC,MAAM,SAAO,CAD5BC,WAEI,IAUQ,CAVRC,EAUQC,EAAA,KAAA,CAZZF,WAGM,IAQQ,CARRC,EAQQE,EAAA,KAAA,CAXdH,WAIQ,IAAmC,CAAAI,EAAA,KAAAA,EAAA,GAAnCC,EAAmC,KAAA,CAA/BN,MAAM,gBAAe,SAAK,IAAAK,EAAA,KAAAA,EAAA,GAE9BC,EAEI,IAAA,CAFDN,MAAM,oBAAmB,iGAE5B,IAEAE,EAA6EK,EAAA,CAArEC,GAAI,UAAWC,QAAQ,OAAOC,MAAM,WAAA,CAVpDT,QAAAU,GAU8D,IAAeN,EAAA,KAAAA,EAAA,GAAA,CAV7EO,EAU8D,uBAV9DC,EAAA,OAAAA,EAAA,OAAAA,EAAA,OAAAA,EAAA"}
1
+ {"version":3,"file":"About-D3O4ft8c.js","sources":["../../src/views/About.vue"],"sourcesContent":["<template>\n <v-container class=\"about\">\n <v-row>\n <v-col>\n <h1 class=\"text-h2 mb-6\">Todo.</h1>\n\n <p class=\"text-body-1 mb-4\">\n This is a placeholder for the about page. It will be filled in with more information later.\n </p>\n\n <v-btn :to=\"'./notes'\" variant=\"text\" color=\"primary\"> Release Notes </v-btn>\n </v-col>\n </v-row>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'AboutView',\n components: {},\n data() {\n return {\n type: 'Viewable',\n };\n },\n});\n</script>\n"],"names":["defineComponent","name","components","data","type","_createBlock","_component_v_container","class","default","_createVNode","_component_v_row","_component_v_col","_cache","_createElementVNode","_component_v_btn","to","variant","color","_withCtx","_createTextVNode","_"],"mappings":"0GAmBeA,EAAgB,CAC7BC,KAAM,YACNC,WAAY,CAAA,EACZC,KAAA,KACS,CACLC,KAAM,2HAvBVC,EAYcC,EAAA,CAZDC,MAAM,SAAO,CAD5BC,WAEI,IAUQ,CAVRC,EAUQC,EAAA,KAAA,CAZZF,WAGM,IAQQ,CARRC,EAQQE,EAAA,KAAA,CAXdH,WAIQ,IAAmC,CAAAI,EAAA,KAAAA,EAAA,GAAnCC,EAAmC,KAAA,CAA/BN,MAAM,gBAAe,SAAK,IAAAK,EAAA,KAAAA,EAAA,GAE9BC,EAEI,IAAA,CAFDN,MAAM,oBAAmB,iGAE5B,IAEAE,EAA6EK,EAAA,CAArEC,GAAI,UAAWC,QAAQ,OAAOC,MAAM,WAAA,CAVpDT,QAAAU,GAU8D,IAAeN,EAAA,KAAAA,EAAA,GAAA,CAV7EO,EAU8D,uBAV9DC,EAAA,OAAAA,EAAA,OAAAA,EAAA,OAAAA,EAAA"}
@@ -1,2 +1,2 @@
1
- import{d as e,S as s,Z as a,z as r,$ as t,C as l,s as o,g as d,_ as c,r as i,f as u,o as n,b as h,a as m,c as C,h as y,w as p,e as g,t as f}from"./index-CfLe2ewO.js";import{allCourseWare as I}from"./index-BHFq3MXV.js";const v=e({name:"AdminDashboard",components:{CardSearch:t,CardSearchResults:r,CardHistoryViewer:a,CardLoader:s},data:()=>({query:"",selectedCard:null,userId:"",userDB:null,dataLayer:null,adminDB:null,selectedUserId:"",selectedUserReader:null,selectedCourseId:null,userOptions:[],courseOptions:[]}),async created(){this.userDB=await o(),this.userId=this.userDB.getUsername(),this.dataLayer=await d(),this.adminDB=this.dataLayer.getAdminDB(),await this.loadUsers(),await this.loadCourses()},methods:{async loadUsers(){try{const e=await this.adminDB.getUsers();this.userOptions=e.filter((e=>e.name&&!e.name.startsWith("Guest_"))).map((e=>({label:e.name||"Unknown User",value:e.name||""}))).filter((e=>""!==e.value))}catch(e){console.error("Failed to load users:",e)}},async onUserSelected(e){if(e)try{this.selectedUserReader=await this.dataLayer.createUserReaderForUser(e)}catch(s){console.error("Failed to create user reader:",s),this.selectedUserReader=null}else this.selectedUserReader=null},onSearch(e){this.query=e},onCardSelected(e){this.selectedCard=e},async loadCourses(){try{const e=await l.allCourseWare();this.courseOptions=e.filter((e=>e._id)).map((e=>{const s=e.name&&e.name.trim();let a,r;return s&&s!==e._id&&""!==s?(a=s,r=s.toLowerCase()):(a=e._id,r=e._id.toLowerCase()),{label:`📚 ${a}`,value:e._id,sortKey:r}})).sort(((e,s)=>e.sortKey.localeCompare(s.sortKey))),console.log(`Loaded ${this.courseOptions.length} courses for filtering (lightweight mode)`)}catch(e){console.error("Failed to load courses (lightweight):",e),await this.loadCoursesExpensive()}},async loadCoursesExpensive(){try{console.log("Using expensive course loading (full configs)...");const e=this.dataLayer.getAdminDB(),s=await e.getCourses();this.courseOptions=s.filter((e=>e.courseID)).map((e=>{const s=e.name&&e.name.trim(),a=e.creator?` (${e.creator})`:"";let r,t;s&&s!==e.courseID?(r=s,t=s.toLowerCase()):(r=e.courseID,t=e.courseID.toLowerCase());return{label:`${e.public?"🌐":"🔒"} ${r}${a}`,value:e.courseID,sortKey:t}})).sort(((e,s)=>e.sortKey.localeCompare(s.sortKey))),console.log(`Loaded ${this.courseOptions.length} courses for filtering (expensive mode)`)}catch(e){console.error("Failed to load courses (expensive):",e),this.loadCoursesBasic()}},async loadCoursesBasic(){try{console.log("Using fallback course loading (IDs only)"),this.courseOptions=[{label:"⚠️ Course names not available - using IDs only",value:""}]}catch(e){console.error("Failed to load basic courses:",e)}},onCourseFilterChanged(){this.query},getCourseNameById(e){const s=this.courseOptions.find((s=>s.value===e));return s?s.label:e},getSelectedCourseDetails(){return this.selectedCourseId?`ID: ${this.selectedCourseId}`:""},viewLookup:e=>I.getView(e)}}),U={class:"admin-dashboard"},w={key:0,class:"mt-2"},b={key:0,class:"text-caption text-grey-darken-1"};const D=c(v,[["render",function(e,s,a,r,t,l){const o=i("v-card-title"),d=i("v-select"),c=i("v-chip"),I=i("v-card-text"),v=i("v-card"),D=i("card-search"),_=i("card-search-results"),S=i("v-col"),L=i("card-loader"),k=i("v-row"),B=i("card-history-viewer");return n(),u("div",U,[s[4]||(s[4]=h("h1",null,"Admin Dashboard",-1)),m(v,{class:"mb-4"},{default:p((()=>[m(o,null,{default:p((()=>s[2]||(s[2]=[g("User Selection")]))),_:1}),m(I,null,{default:p((()=>[m(d,{modelValue:e.selectedUserId,"onUpdate:modelValue":[s[0]||(s[0]=s=>e.selectedUserId=s),e.onUserSelected],items:e.userOptions,"item-title":"label","item-value":"value",label:"Select User"},null,8,["modelValue","items","onUpdate:modelValue"]),e.selectedUserId?(n(),C(c,{key:0,color:"primary",class:"mt-2"},{default:p((()=>[g(" Viewing data for: "+f(e.selectedUserId),1)])),_:1})):y("",!0)])),_:1})])),_:1}),m(v,{class:"mb-4"},{default:p((()=>[m(o,null,{default:p((()=>s[3]||(s[3]=[g("Search Filters")]))),_:1}),m(I,null,{default:p((()=>[m(d,{modelValue:e.selectedCourseId,"onUpdate:modelValue":[s[1]||(s[1]=s=>e.selectedCourseId=s),e.onCourseFilterChanged],items:e.courseOptions,"item-title":"label","item-value":"value",label:"Filter by Course (optional)",clearable:""},null,8,["modelValue","items","onUpdate:modelValue"]),e.selectedCourseId?(n(),u("div",w,[m(c,{color:"info",class:"mb-1"},{default:p((()=>[g(" 🎯 "+f(e.getCourseNameById(e.selectedCourseId)),1)])),_:1}),e.getSelectedCourseDetails()?(n(),u("div",b,f(e.getSelectedCourseDetails()),1)):y("",!0)])):(n(),C(c,{key:1,color:"warning",class:"mt-2"},{default:p((()=>[g(" ⚠️ Searching ALL "+f(e.courseOptions.length)+" courses (may be slow) ",1)])),_:1}))])),_:1})])),_:1}),m(D,{onSearch:e.onSearch},null,8,["onSearch"]),m(k,null,{default:p((()=>[m(S,{cols:"6"},{default:p((()=>[e.query?(n(),C(_,{key:0,query:e.query,"data-layer":e.dataLayer,"course-filter":e.selectedCourseId,onCardSelected:e.onCardSelected},null,8,["query","data-layer","course-filter","onCardSelected"])):y("",!0)])),_:1}),m(S,{cols:"6"},{default:p((()=>[e.selectedCard?(n(),C(L,{key:0,qualified_id:{courseID:e.selectedCard.courseId,cardID:e.selectedCard.cardId},"view-lookup":e.viewLookup},null,8,["qualified_id","view-lookup"])):y("",!0)])),_:1})])),_:1}),e.selectedCard&&e.selectedUserReader?(n(),C(B,{key:0,"card-id":e.selectedCard.cardId,"course-id":e.selectedCard.courseId,"user-id":e.selectedUserId,"user-d-b":e.selectedUserReader},null,8,["card-id","course-id","user-id","user-d-b"])):y("",!0)])}],["__scopeId","data-v-7409c94e"]]);export{D as default};
2
- //# sourceMappingURL=AdminDashboard-Btfp3xbX.js.map
1
+ import{d as e,S as s,Z as a,z as r,$ as t,C as l,s as o,g as d,_ as c,r as i,f as u,o as n,b as h,a as m,c as C,h as y,w as p,e as g,t as f}from"./index-PISHyq1I.js";import{allCourseWare as I}from"./index-CSo_psn8.js";const v=e({name:"AdminDashboard",components:{CardSearch:t,CardSearchResults:r,CardHistoryViewer:a,CardLoader:s},data:()=>({query:"",selectedCard:null,userId:"",userDB:null,dataLayer:null,adminDB:null,selectedUserId:"",selectedUserReader:null,selectedCourseId:null,userOptions:[],courseOptions:[]}),async created(){this.userDB=await o(),this.userId=this.userDB.getUsername(),this.dataLayer=await d(),this.adminDB=this.dataLayer.getAdminDB(),await this.loadUsers(),await this.loadCourses()},methods:{async loadUsers(){try{const e=await this.adminDB.getUsers();this.userOptions=e.filter((e=>e.name&&!e.name.startsWith("Guest_"))).map((e=>({label:e.name||"Unknown User",value:e.name||""}))).filter((e=>""!==e.value))}catch(e){console.error("Failed to load users:",e)}},async onUserSelected(e){if(e)try{this.selectedUserReader=await this.dataLayer.createUserReaderForUser(e)}catch(s){console.error("Failed to create user reader:",s),this.selectedUserReader=null}else this.selectedUserReader=null},onSearch(e){this.query=e},onCardSelected(e){this.selectedCard=e},async loadCourses(){try{const e=await l.allCourseWare();this.courseOptions=e.filter((e=>e._id)).map((e=>{const s=e.name&&e.name.trim();let a,r;return s&&s!==e._id&&""!==s?(a=s,r=s.toLowerCase()):(a=e._id,r=e._id.toLowerCase()),{label:`📚 ${a}`,value:e._id,sortKey:r}})).sort(((e,s)=>e.sortKey.localeCompare(s.sortKey))),console.log(`Loaded ${this.courseOptions.length} courses for filtering (lightweight mode)`)}catch(e){console.error("Failed to load courses (lightweight):",e),await this.loadCoursesExpensive()}},async loadCoursesExpensive(){try{console.log("Using expensive course loading (full configs)...");const e=this.dataLayer.getAdminDB(),s=await e.getCourses();this.courseOptions=s.filter((e=>e.courseID)).map((e=>{const s=e.name&&e.name.trim(),a=e.creator?` (${e.creator})`:"";let r,t;s&&s!==e.courseID?(r=s,t=s.toLowerCase()):(r=e.courseID,t=e.courseID.toLowerCase());return{label:`${e.public?"🌐":"🔒"} ${r}${a}`,value:e.courseID,sortKey:t}})).sort(((e,s)=>e.sortKey.localeCompare(s.sortKey))),console.log(`Loaded ${this.courseOptions.length} courses for filtering (expensive mode)`)}catch(e){console.error("Failed to load courses (expensive):",e),this.loadCoursesBasic()}},async loadCoursesBasic(){try{console.log("Using fallback course loading (IDs only)"),this.courseOptions=[{label:"⚠️ Course names not available - using IDs only",value:""}]}catch(e){console.error("Failed to load basic courses:",e)}},onCourseFilterChanged(){this.query},getCourseNameById(e){const s=this.courseOptions.find((s=>s.value===e));return s?s.label:e},getSelectedCourseDetails(){return this.selectedCourseId?`ID: ${this.selectedCourseId}`:""},viewLookup:e=>I.getView(e)}}),U={class:"admin-dashboard"},w={key:0,class:"mt-2"},b={key:0,class:"text-caption text-grey-darken-1"};const D=c(v,[["render",function(e,s,a,r,t,l){const o=i("v-card-title"),d=i("v-select"),c=i("v-chip"),I=i("v-card-text"),v=i("v-card"),D=i("card-search"),_=i("card-search-results"),S=i("v-col"),L=i("card-loader"),k=i("v-row"),B=i("card-history-viewer");return n(),u("div",U,[s[4]||(s[4]=h("h1",null,"Admin Dashboard",-1)),m(v,{class:"mb-4"},{default:p((()=>[m(o,null,{default:p((()=>s[2]||(s[2]=[g("User Selection")]))),_:1}),m(I,null,{default:p((()=>[m(d,{modelValue:e.selectedUserId,"onUpdate:modelValue":[s[0]||(s[0]=s=>e.selectedUserId=s),e.onUserSelected],items:e.userOptions,"item-title":"label","item-value":"value",label:"Select User"},null,8,["modelValue","items","onUpdate:modelValue"]),e.selectedUserId?(n(),C(c,{key:0,color:"primary",class:"mt-2"},{default:p((()=>[g(" Viewing data for: "+f(e.selectedUserId),1)])),_:1})):y("",!0)])),_:1})])),_:1}),m(v,{class:"mb-4"},{default:p((()=>[m(o,null,{default:p((()=>s[3]||(s[3]=[g("Search Filters")]))),_:1}),m(I,null,{default:p((()=>[m(d,{modelValue:e.selectedCourseId,"onUpdate:modelValue":[s[1]||(s[1]=s=>e.selectedCourseId=s),e.onCourseFilterChanged],items:e.courseOptions,"item-title":"label","item-value":"value",label:"Filter by Course (optional)",clearable:""},null,8,["modelValue","items","onUpdate:modelValue"]),e.selectedCourseId?(n(),u("div",w,[m(c,{color:"info",class:"mb-1"},{default:p((()=>[g(" 🎯 "+f(e.getCourseNameById(e.selectedCourseId)),1)])),_:1}),e.getSelectedCourseDetails()?(n(),u("div",b,f(e.getSelectedCourseDetails()),1)):y("",!0)])):(n(),C(c,{key:1,color:"warning",class:"mt-2"},{default:p((()=>[g(" ⚠️ Searching ALL "+f(e.courseOptions.length)+" courses (may be slow) ",1)])),_:1}))])),_:1})])),_:1}),m(D,{onSearch:e.onSearch},null,8,["onSearch"]),m(k,null,{default:p((()=>[m(S,{cols:"6"},{default:p((()=>[e.query?(n(),C(_,{key:0,query:e.query,"data-layer":e.dataLayer,"course-filter":e.selectedCourseId,onCardSelected:e.onCardSelected},null,8,["query","data-layer","course-filter","onCardSelected"])):y("",!0)])),_:1}),m(S,{cols:"6"},{default:p((()=>[e.selectedCard?(n(),C(L,{key:0,qualified_id:{courseID:e.selectedCard.courseId,cardID:e.selectedCard.cardId},"view-lookup":e.viewLookup},null,8,["qualified_id","view-lookup"])):y("",!0)])),_:1})])),_:1}),e.selectedCard&&e.selectedUserReader?(n(),C(B,{key:0,"card-id":e.selectedCard.cardId,"course-id":e.selectedCard.courseId,"user-id":e.selectedUserId,"user-d-b":e.selectedUserReader},null,8,["card-id","course-id","user-id","user-d-b"])):y("",!0)])}],["__scopeId","data-v-7409c94e"]]);export{D as default};
2
+ //# sourceMappingURL=AdminDashboard-DH-Wi1tp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminDashboard-Btfp3xbX.js","sources":["../../src/views/AdminDashboard.vue"],"sourcesContent":["<template>\n <div class=\"admin-dashboard\">\n <h1>Admin Dashboard</h1>\n\n <!-- User Selection Section -->\n <v-card class=\"mb-4\">\n <v-card-title>User Selection</v-card-title>\n <v-card-text>\n <v-select\n v-model=\"selectedUserId\"\n :items=\"userOptions\"\n item-title=\"label\"\n item-value=\"value\"\n label=\"Select User\"\n @update:model-value=\"onUserSelected\"\n ></v-select>\n <v-chip v-if=\"selectedUserId\" color=\"primary\" class=\"mt-2\"> Viewing data for: {{ selectedUserId }} </v-chip>\n </v-card-text>\n </v-card>\n\n <!-- Course Filter Section -->\n <v-card class=\"mb-4\">\n <v-card-title>Search Filters</v-card-title>\n <v-card-text>\n <v-select\n v-model=\"selectedCourseId\"\n :items=\"courseOptions\"\n item-title=\"label\"\n item-value=\"value\"\n label=\"Filter by Course (optional)\"\n clearable\n @update:model-value=\"onCourseFilterChanged\"\n ></v-select>\n <div v-if=\"selectedCourseId\" class=\"mt-2\">\n <v-chip color=\"info\" class=\"mb-1\"> 🎯 {{ getCourseNameById(selectedCourseId) }} </v-chip>\n <div v-if=\"getSelectedCourseDetails()\" class=\"text-caption text-grey-darken-1\">\n {{ getSelectedCourseDetails() }}\n </div>\n </div>\n <v-chip v-else color=\"warning\" class=\"mt-2\">\n ⚠️ Searching ALL {{ courseOptions.length }} courses (may be slow)\n </v-chip>\n </v-card-text>\n </v-card>\n\n <!-- Card Search Section -->\n <card-search @search=\"onSearch\" />\n <v-row>\n <v-col cols=\"6\">\n <card-search-results\n v-if=\"query\"\n :query=\"query\"\n :data-layer=\"dataLayer\"\n :course-filter=\"selectedCourseId\"\n @card-selected=\"onCardSelected\"\n />\n </v-col>\n <v-col cols=\"6\">\n <card-loader\n v-if=\"selectedCard\"\n :qualified_id=\"{ courseID: selectedCard.courseId, cardID: selectedCard.cardId }\"\n :view-lookup=\"viewLookup\"\n />\n </v-col>\n </v-row>\n\n <!-- Card History Section -->\n <card-history-viewer\n v-if=\"selectedCard && selectedUserReader\"\n :card-id=\"selectedCard.cardId\"\n :course-id=\"selectedCard.courseId\"\n :user-id=\"selectedUserId\"\n :user-d-b=\"selectedUserReader\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { CardSearch, CardSearchResults, CardHistoryViewer, CardLoader, getCurrentUser } from '@vue-skuilder/common-ui';\nimport { getDataLayer, CourseLookup } from '@vue-skuilder/db';\nimport { allCourseWare } from '@vue-skuilder/courseware';\nimport { UserDBInterface, UserDBReader, DataLayerProvider, AdminDBInterface } from '@vue-skuilder/db';\n\ninterface UserOption {\n label: string;\n value: string;\n}\n\nexport default defineComponent({\n name: 'AdminDashboard',\n components: {\n CardSearch,\n CardSearchResults,\n CardHistoryViewer,\n CardLoader,\n },\n data() {\n return {\n query: '',\n selectedCard: null as { cardId: string; courseId: string } | null,\n userId: '',\n userDB: null as UserDBInterface | null,\n dataLayer: null as DataLayerProvider | null,\n adminDB: null as AdminDBInterface | null,\n selectedUserId: '',\n selectedUserReader: null as UserDBReader | null,\n selectedCourseId: null as string | null,\n userOptions: [] as UserOption[],\n courseOptions: [] as UserOption[],\n };\n },\n async created() {\n this.userDB = await getCurrentUser();\n this.userId = this.userDB.getUsername();\n this.dataLayer = await getDataLayer();\n this.adminDB = this.dataLayer.getAdminDB();\n\n // Load user list for selection\n await this.loadUsers();\n\n // Load available courses\n await this.loadCourses();\n },\n methods: {\n async loadUsers() {\n try {\n const users = await this.adminDB!.getUsers();\n this.userOptions = users\n .filter((user) => user.name && !user.name.startsWith('Guest_'))\n .map((user) => ({\n label: user.name || 'Unknown User',\n value: user.name || '',\n }))\n .filter((option) => option.value !== '');\n } catch (error) {\n console.error('Failed to load users:', error);\n }\n },\n\n async onUserSelected(userId: string) {\n if (!userId) {\n this.selectedUserReader = null;\n return;\n }\n\n try {\n this.selectedUserReader = await this.dataLayer!.createUserReaderForUser(userId);\n } catch (error) {\n console.error('Failed to create user reader:', error);\n this.selectedUserReader = null;\n }\n },\n\n onSearch(query: string) {\n this.query = query;\n },\n\n onCardSelected(card: { cardId: string; courseId: string }) {\n this.selectedCard = card;\n },\n\n async loadCourses() {\n try {\n // Try efficient lookup-only approach first\n // const coursesDB = this.dataLayer!.getCoursesDB();\n\n // Get basic course list from lookup DB (lightweight, just IDs and basic names)\n const lookupCourses = await CourseLookup.allCourseWare();\n\n this.courseOptions = lookupCourses\n .filter((course) => course._id)\n .map((course) => {\n const courseName = course.name && course.name.trim();\n let displayName: string;\n let sortKey: string;\n\n if (courseName && courseName !== course._id && courseName !== '') {\n // Has a real name different from ID\n displayName = courseName;\n sortKey = courseName.toLowerCase();\n } else {\n // No name or name is same as ID - use ID\n displayName = course._id;\n sortKey = course._id.toLowerCase();\n }\n\n // Simple display without expensive metadata lookups\n return {\n label: `📚 ${displayName}`,\n value: course._id,\n sortKey,\n };\n })\n .sort((a, b) => a.sortKey.localeCompare(b.sortKey));\n\n console.log(`Loaded ${this.courseOptions.length} courses for filtering (lightweight mode)`);\n } catch (error) {\n console.error('Failed to load courses (lightweight):', error);\n // Fallback to expensive approach\n await this.loadCoursesExpensive();\n }\n },\n\n async loadCoursesExpensive() {\n try {\n console.log('Using expensive course loading (full configs)...');\n const adminDB = this.dataLayer!.getAdminDB();\n const basicCourseList = await adminDB.getCourses(); // This fetches full configs\n\n this.courseOptions = basicCourseList\n .filter((course) => course.courseID)\n .map((course) => {\n const courseName = course.name && course.name.trim();\n const creator = course.creator ? ` (${course.creator})` : '';\n\n let displayName: string;\n let sortKey: string;\n\n if (courseName && courseName !== course.courseID) {\n // Has a real name different from ID\n displayName = courseName;\n sortKey = courseName.toLowerCase();\n } else {\n // No name or name is same as ID - use ID\n displayName = course.courseID!;\n sortKey = course.courseID!.toLowerCase();\n }\n\n const visibility = course.public ? '🌐' : '🔒';\n\n return {\n label: `${visibility} ${displayName}${creator}`,\n value: course.courseID!,\n sortKey,\n };\n })\n .sort((a, b) => a.sortKey.localeCompare(b.sortKey));\n\n console.log(`Loaded ${this.courseOptions.length} courses for filtering (expensive mode)`);\n } catch (error) {\n console.error('Failed to load courses (expensive):', error);\n // Final fallback\n this.loadCoursesBasic();\n }\n },\n\n async loadCoursesBasic() {\n try {\n // Fallback: just get course IDs from lookup DB (fast)\n console.log('Using fallback course loading (IDs only)');\n // This would need a new method that just gets the lookup docs without full configs\n // For now, we'll show a basic message\n this.courseOptions = [{ label: '⚠️ Course names not available - using IDs only', value: '' }];\n } catch (error) {\n console.error('Failed to load basic courses:', error);\n }\n },\n\n onCourseFilterChanged() {\n // If there's an active search, re-run it with the new filter\n if (this.query) {\n // The CardSearchResults component will automatically re-search with the new filter\n }\n },\n\n getCourseNameById(courseId: string): string {\n const course = this.courseOptions.find((c) => c.value === courseId);\n return course ? course.label : courseId;\n },\n\n getSelectedCourseDetails(): string {\n if (!this.selectedCourseId) return '';\n\n // For now, just return the ID as additional context\n return `ID: ${this.selectedCourseId}`;\n },\n\n viewLookup(viewDescriptor: unknown) {\n return allCourseWare.getView(viewDescriptor);\n },\n },\n});\n</script>\n\n<style scoped>\n.admin-dashboard {\n padding: 2rem;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","name","components","CardSearch","CardSearchResults","CardHistoryViewer","CardLoader","data","query","selectedCard","userId","userDB","dataLayer","adminDB","selectedUserId","selectedUserReader","selectedCourseId","userOptions","courseOptions","created","this","getCurrentUser","getUsername","getDataLayer","getAdminDB","loadUsers","loadCourses","methods","users","getUsers","filter","user","startsWith","map","label","value","option","error","console","onUserSelected","createUserReaderForUser","onSearch","onCardSelected","card","lookupCourses","CourseLookup","allCourseWare","course","_id","courseName","trim","displayName","sortKey","toLowerCase","sort","a","b","localeCompare","log","length","loadCoursesExpensive","basicCourseList","getCourses","courseID","creator","public","loadCoursesBasic","onCourseFilterChanged","getCourseNameById","courseId","find","c","getSelectedCourseDetails","viewLookup","viewDescriptor","getView","_hoisted_1","class","key","_openBlock","_createElementBlock","_cache","_createElementVNode","_createVNode","_component_v_card","default","_component_v_card_title","_createTextVNode","_","_component_v_card_text","_component_v_select","modelValue","_ctx","$event","items","_createBlock","_component_v_chip","color","_withCtx","_toDisplayString","_createCommentVNode","clearable","_hoisted_2","_hoisted_3","_component_card_search","_component_v_row","_component_v_col","cols","_component_card_search_results","_component_card_loader","qualified_id","cardID","cardId","_component_card_history_viewer"],"mappings":"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"}
1
+ {"version":3,"file":"AdminDashboard-DH-Wi1tp.js","sources":["../../src/views/AdminDashboard.vue"],"sourcesContent":["<template>\n <div class=\"admin-dashboard\">\n <h1>Admin Dashboard</h1>\n\n <!-- User Selection Section -->\n <v-card class=\"mb-4\">\n <v-card-title>User Selection</v-card-title>\n <v-card-text>\n <v-select\n v-model=\"selectedUserId\"\n :items=\"userOptions\"\n item-title=\"label\"\n item-value=\"value\"\n label=\"Select User\"\n @update:model-value=\"onUserSelected\"\n ></v-select>\n <v-chip v-if=\"selectedUserId\" color=\"primary\" class=\"mt-2\"> Viewing data for: {{ selectedUserId }} </v-chip>\n </v-card-text>\n </v-card>\n\n <!-- Course Filter Section -->\n <v-card class=\"mb-4\">\n <v-card-title>Search Filters</v-card-title>\n <v-card-text>\n <v-select\n v-model=\"selectedCourseId\"\n :items=\"courseOptions\"\n item-title=\"label\"\n item-value=\"value\"\n label=\"Filter by Course (optional)\"\n clearable\n @update:model-value=\"onCourseFilterChanged\"\n ></v-select>\n <div v-if=\"selectedCourseId\" class=\"mt-2\">\n <v-chip color=\"info\" class=\"mb-1\"> 🎯 {{ getCourseNameById(selectedCourseId) }} </v-chip>\n <div v-if=\"getSelectedCourseDetails()\" class=\"text-caption text-grey-darken-1\">\n {{ getSelectedCourseDetails() }}\n </div>\n </div>\n <v-chip v-else color=\"warning\" class=\"mt-2\">\n ⚠️ Searching ALL {{ courseOptions.length }} courses (may be slow)\n </v-chip>\n </v-card-text>\n </v-card>\n\n <!-- Card Search Section -->\n <card-search @search=\"onSearch\" />\n <v-row>\n <v-col cols=\"6\">\n <card-search-results\n v-if=\"query\"\n :query=\"query\"\n :data-layer=\"dataLayer\"\n :course-filter=\"selectedCourseId\"\n @card-selected=\"onCardSelected\"\n />\n </v-col>\n <v-col cols=\"6\">\n <card-loader\n v-if=\"selectedCard\"\n :qualified_id=\"{ courseID: selectedCard.courseId, cardID: selectedCard.cardId }\"\n :view-lookup=\"viewLookup\"\n />\n </v-col>\n </v-row>\n\n <!-- Card History Section -->\n <card-history-viewer\n v-if=\"selectedCard && selectedUserReader\"\n :card-id=\"selectedCard.cardId\"\n :course-id=\"selectedCard.courseId\"\n :user-id=\"selectedUserId\"\n :user-d-b=\"selectedUserReader\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { CardSearch, CardSearchResults, CardHistoryViewer, CardLoader, getCurrentUser } from '@vue-skuilder/common-ui';\nimport { getDataLayer, CourseLookup } from '@vue-skuilder/db';\nimport { allCourseWare } from '@vue-skuilder/courseware';\nimport { UserDBInterface, UserDBReader, DataLayerProvider, AdminDBInterface } from '@vue-skuilder/db';\n\ninterface UserOption {\n label: string;\n value: string;\n}\n\nexport default defineComponent({\n name: 'AdminDashboard',\n components: {\n CardSearch,\n CardSearchResults,\n CardHistoryViewer,\n CardLoader,\n },\n data() {\n return {\n query: '',\n selectedCard: null as { cardId: string; courseId: string } | null,\n userId: '',\n userDB: null as UserDBInterface | null,\n dataLayer: null as DataLayerProvider | null,\n adminDB: null as AdminDBInterface | null,\n selectedUserId: '',\n selectedUserReader: null as UserDBReader | null,\n selectedCourseId: null as string | null,\n userOptions: [] as UserOption[],\n courseOptions: [] as UserOption[],\n };\n },\n async created() {\n this.userDB = await getCurrentUser();\n this.userId = this.userDB.getUsername();\n this.dataLayer = await getDataLayer();\n this.adminDB = this.dataLayer.getAdminDB();\n\n // Load user list for selection\n await this.loadUsers();\n\n // Load available courses\n await this.loadCourses();\n },\n methods: {\n async loadUsers() {\n try {\n const users = await this.adminDB!.getUsers();\n this.userOptions = users\n .filter((user) => user.name && !user.name.startsWith('Guest_'))\n .map((user) => ({\n label: user.name || 'Unknown User',\n value: user.name || '',\n }))\n .filter((option) => option.value !== '');\n } catch (error) {\n console.error('Failed to load users:', error);\n }\n },\n\n async onUserSelected(userId: string) {\n if (!userId) {\n this.selectedUserReader = null;\n return;\n }\n\n try {\n this.selectedUserReader = await this.dataLayer!.createUserReaderForUser(userId);\n } catch (error) {\n console.error('Failed to create user reader:', error);\n this.selectedUserReader = null;\n }\n },\n\n onSearch(query: string) {\n this.query = query;\n },\n\n onCardSelected(card: { cardId: string; courseId: string }) {\n this.selectedCard = card;\n },\n\n async loadCourses() {\n try {\n // Try efficient lookup-only approach first\n // const coursesDB = this.dataLayer!.getCoursesDB();\n\n // Get basic course list from lookup DB (lightweight, just IDs and basic names)\n const lookupCourses = await CourseLookup.allCourseWare();\n\n this.courseOptions = lookupCourses\n .filter((course) => course._id)\n .map((course) => {\n const courseName = course.name && course.name.trim();\n let displayName: string;\n let sortKey: string;\n\n if (courseName && courseName !== course._id && courseName !== '') {\n // Has a real name different from ID\n displayName = courseName;\n sortKey = courseName.toLowerCase();\n } else {\n // No name or name is same as ID - use ID\n displayName = course._id;\n sortKey = course._id.toLowerCase();\n }\n\n // Simple display without expensive metadata lookups\n return {\n label: `📚 ${displayName}`,\n value: course._id,\n sortKey,\n };\n })\n .sort((a, b) => a.sortKey.localeCompare(b.sortKey));\n\n console.log(`Loaded ${this.courseOptions.length} courses for filtering (lightweight mode)`);\n } catch (error) {\n console.error('Failed to load courses (lightweight):', error);\n // Fallback to expensive approach\n await this.loadCoursesExpensive();\n }\n },\n\n async loadCoursesExpensive() {\n try {\n console.log('Using expensive course loading (full configs)...');\n const adminDB = this.dataLayer!.getAdminDB();\n const basicCourseList = await adminDB.getCourses(); // This fetches full configs\n\n this.courseOptions = basicCourseList\n .filter((course) => course.courseID)\n .map((course) => {\n const courseName = course.name && course.name.trim();\n const creator = course.creator ? ` (${course.creator})` : '';\n\n let displayName: string;\n let sortKey: string;\n\n if (courseName && courseName !== course.courseID) {\n // Has a real name different from ID\n displayName = courseName;\n sortKey = courseName.toLowerCase();\n } else {\n // No name or name is same as ID - use ID\n displayName = course.courseID!;\n sortKey = course.courseID!.toLowerCase();\n }\n\n const visibility = course.public ? '🌐' : '🔒';\n\n return {\n label: `${visibility} ${displayName}${creator}`,\n value: course.courseID!,\n sortKey,\n };\n })\n .sort((a, b) => a.sortKey.localeCompare(b.sortKey));\n\n console.log(`Loaded ${this.courseOptions.length} courses for filtering (expensive mode)`);\n } catch (error) {\n console.error('Failed to load courses (expensive):', error);\n // Final fallback\n this.loadCoursesBasic();\n }\n },\n\n async loadCoursesBasic() {\n try {\n // Fallback: just get course IDs from lookup DB (fast)\n console.log('Using fallback course loading (IDs only)');\n // This would need a new method that just gets the lookup docs without full configs\n // For now, we'll show a basic message\n this.courseOptions = [{ label: '⚠️ Course names not available - using IDs only', value: '' }];\n } catch (error) {\n console.error('Failed to load basic courses:', error);\n }\n },\n\n onCourseFilterChanged() {\n // If there's an active search, re-run it with the new filter\n if (this.query) {\n // The CardSearchResults component will automatically re-search with the new filter\n }\n },\n\n getCourseNameById(courseId: string): string {\n const course = this.courseOptions.find((c) => c.value === courseId);\n return course ? course.label : courseId;\n },\n\n getSelectedCourseDetails(): string {\n if (!this.selectedCourseId) return '';\n\n // For now, just return the ID as additional context\n return `ID: ${this.selectedCourseId}`;\n },\n\n viewLookup(viewDescriptor: unknown) {\n return allCourseWare.getView(viewDescriptor);\n },\n },\n});\n</script>\n\n<style scoped>\n.admin-dashboard {\n padding: 2rem;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","name","components","CardSearch","CardSearchResults","CardHistoryViewer","CardLoader","data","query","selectedCard","userId","userDB","dataLayer","adminDB","selectedUserId","selectedUserReader","selectedCourseId","userOptions","courseOptions","created","this","getCurrentUser","getUsername","getDataLayer","getAdminDB","loadUsers","loadCourses","methods","users","getUsers","filter","user","startsWith","map","label","value","option","error","console","onUserSelected","createUserReaderForUser","onSearch","onCardSelected","card","lookupCourses","CourseLookup","allCourseWare","course","_id","courseName","trim","displayName","sortKey","toLowerCase","sort","a","b","localeCompare","log","length","loadCoursesExpensive","basicCourseList","getCourses","courseID","creator","public","loadCoursesBasic","onCourseFilterChanged","getCourseNameById","courseId","find","c","getSelectedCourseDetails","viewLookup","viewDescriptor","getView","_hoisted_1","class","key","_openBlock","_createElementBlock","_cache","_createElementVNode","_createVNode","_component_v_card","default","_component_v_card_title","_createTextVNode","_","_component_v_card_text","_component_v_select","modelValue","_ctx","$event","items","_createBlock","_component_v_chip","color","_withCtx","_toDisplayString","_createCommentVNode","clearable","_hoisted_2","_hoisted_3","_component_card_search","_component_v_row","_component_v_col","cols","_component_card_search_results","_component_card_loader","qualified_id","cardID","cardId","_component_card_history_viewer"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{d as e,s,m as t,g as a,_ as l,r as o,f as n,h as i,o as r,b as d,a as c,e as u,w as m,t as g,c as C,F as h,n as f}from"./index-CfLe2ewO.js";const v=e({name:"ClassroomCtrlPanel",props:{classroomId:{type:String,required:!0}},data:()=>({classroomCfg:null,classroomDB:null,assignedContent:[],nameRules:[e=>!(e.length>30)||"Course name must be 30 characters or less"],updatePending:!0,addingContent:!1,availableCourses:[],selectedCourse:"",availableTags:[],selectedTags:[]}),computed:{_assignedCourses(){return this.assignedContent.filter((e=>"course"===e.type))},_assignedTags(){return this.assignedContent.filter((e=>"tag"===e.type))}},watch:{async selectedCourse(){if(this.selectedCourse){const e=a().getCourseDB(this.selectedCourse),s=await e.getCourseTagStubs();this.availableTags=s.rows.map((e=>e.doc))}else this.availableTags=[]}},async created(){try{this.classroomDB=await a().getClassroomDB(this.classroomId,"teacher"),this.assignedContent=await this.classroomDB.getAssignedContent(),this.classroomCfg=this.classroomDB.getConfig(),console.log(`[ClassroomCtrlPanel] Route loaded w/ (prop) _id: ${this.classroomId}`),console.log(`[ClassroomCtrlPanel] Config: ${JSON.stringify(this.classroomCfg)}`),this.availableCourses=await a().getCoursesDB().getCourseList(),this.updatePending=!1}catch(e){console.error("[ClassroomCtrlPanel] Error initializing:",e)}},methods:{async assignContent(){if(!this.classroomDB)return;const e=await s();0===this.selectedTags.length?await(this.classroomDB.assignContent?.({assignedOn:t(),activeOn:t(),type:"course",courseID:this.selectedCourse,assignedBy:e.getUsername()})):await Promise.all(this.selectedTags.map((s=>this.classroomDB.assignContent?.({assignedOn:t(),activeOn:t(),type:"tag",courseID:this.selectedCourse,tagID:s,assignedBy:e.getUsername()})))),this.assignedContent=await this.classroomDB.getAssignedContent(),this.addingContent=!1,this.selectedCourse="",this.selectedTags=[],this.availableTags=[]},async removeContent(e){this.classroomDB&&this.classroomDB.removeContent&&(await this.classroomDB.removeContent(e),this.assignedContent=await this.classroomDB.getAssignedContent())},async submit(){this.updatePending=!0}}}),p={key:0},y=["onClick"],D=["onClick"];const _=l(v,[["render",function(e,s,t,a,l,v){const _=o("router-link"),b=o("v-btn"),k=o("v-checkbox"),B=o("v-col"),T=o("v-icon"),w=o("v-fade-transition"),A=o("v-toolbar-title"),I=o("v-spacer"),P=o("v-toolbar"),V=o("v-select"),S=o("v-card-text"),x=o("v-card-actions"),O=o("v-card"),U=o("v-row");return e.updatePending?i("",!0):(r(),n("div",p,[d("h1",null,[c(_,{to:"/classrooms"},{default:m((()=>s[5]||(s[5]=[u("My Classrooms")]))),_:1}),u(" / "+g(e.classroomCfg.name),1)]),d("h3",null,[u(" Join code: "+g(e.classroomCfg.joinCode)+" ",1),c(_,{to:`/classrooms/${e.classroomId}/code`},{default:m((()=>[c(b,{size:"x-small",icon:"mdi-fullscreen",color:"accent",alt:"Make Fullscreen"})])),_:1},8,["to"])]),c(U,null,{default:m((()=>[c(B,{cols:"12",sm:"6",md:"4"},{default:m((()=>[c(k,{modelValue:e.classroomCfg.peerAssist,"onUpdate:modelValue":s[0]||(s[0]=s=>e.classroomCfg.peerAssist=s),label:"Allow peer instruction"},null,8,["modelValue"])])),_:1}),e.classroomDB?(r(),C(B,{key:0,cols:"12"},{default:m((()=>[s[10]||(s[10]=d("h2",null,"Assigned Content:",-1)),s[11]||(s[11]=d("h3",null,"Quilts:",-1)),s[12]||(s[12]=d("ul",null,null,-1)),d("ul",null,[(r(!0),n(h,null,f(e._assignedCourses,(s=>(r(),n("li",{key:s.courseID},[u(g(s.courseID)+" ",1),d("a",{onClick:t=>e.removeContent(s)},"Remove",8,y)])))),128))]),s[13]||(s[13]=d("h3",null,"Tags:",-1)),d("ul",null,[(r(!0),n(h,null,f(e._assignedTags,((s,t)=>(r(),n("li",{key:t},[u(g(s.courseID)+" - "+g(s.tagID)+" ",1),d("a",{onClick:t=>e.removeContent(s)},"Remove",8,D)])))),128))]),c(w,null,{default:m((()=>[e.addingContent?i("",!0):(r(),C(b,{key:0,color:"primary",onClick:s[1]||(s[1]=s=>e.addingContent=!0)},{default:m((()=>[s[7]||(s[7]=u(" Assign New Content ")),c(T,{end:""},{default:m((()=>s[6]||(s[6]=[u("mdi-plus")]))),_:1})])),_:1}))])),_:1}),e.addingContent?(r(),C(O,{key:0},{default:m((()=>[c(P,null,{default:m((()=>[c(A,null,{default:m((()=>s[8]||(s[8]=[u("Add Content")]))),_:1}),c(I),c(b,{icon:"mdi-close",color:"error",onClick:s[2]||(s[2]=s=>e.addingContent=!1)})])),_:1}),c(S,null,{default:m((()=>[c(V,{modelValue:e.selectedCourse,"onUpdate:modelValue":s[3]||(s[3]=s=>e.selectedCourse=s),label:"Select Quilt",items:e.availableCourses,"item-title":"name","item-value":"_id",title:"Select Quilt"},null,8,["modelValue","items"]),c(V,{modelValue:e.selectedTags,"onUpdate:modelValue":s[4]||(s[4]=s=>e.selectedTags=s),label:"Select Tags",items:e.availableTags,"item-title":"name","item-value":"name",multiple:"",chips:"",hint:"","persistent-hint":""},null,8,["modelValue","items"])])),_:1}),c(x,null,{default:m((()=>[""!==e.selectedCourse?(r(),C(b,{key:0,color:"primary",onClick:e.assignContent},{default:m((()=>[u(g(0==e.selectedTags.length?"Add Entire Quilt":"Add Tags")+" ",1),c(T,{end:""},{default:m((()=>s[9]||(s[9]=[u("mdi-plus")]))),_:1})])),_:1},8,["onClick"])):i("",!0)])),_:1})])),_:1})):i("",!0)])),_:1})):i("",!0)])),_:1})]))}]]);export{_ as default};
2
- //# sourceMappingURL=ClassroomCtrlPanel-Del1NMJ0.js.map
1
+ import{d as e,s,m as t,g as a,_ as l,r as o,f as n,h as i,o as r,b as d,a as c,e as u,w as m,t as g,c as C,F as h,n as f}from"./index-PISHyq1I.js";const v=e({name:"ClassroomCtrlPanel",props:{classroomId:{type:String,required:!0}},data:()=>({classroomCfg:null,classroomDB:null,assignedContent:[],nameRules:[e=>!(e.length>30)||"Course name must be 30 characters or less"],updatePending:!0,addingContent:!1,availableCourses:[],selectedCourse:"",availableTags:[],selectedTags:[]}),computed:{_assignedCourses(){return this.assignedContent.filter((e=>"course"===e.type))},_assignedTags(){return this.assignedContent.filter((e=>"tag"===e.type))}},watch:{async selectedCourse(){if(this.selectedCourse){const e=a().getCourseDB(this.selectedCourse),s=await e.getCourseTagStubs();this.availableTags=s.rows.map((e=>e.doc))}else this.availableTags=[]}},async created(){try{this.classroomDB=await a().getClassroomDB(this.classroomId,"teacher"),this.assignedContent=await this.classroomDB.getAssignedContent(),this.classroomCfg=this.classroomDB.getConfig(),console.log(`[ClassroomCtrlPanel] Route loaded w/ (prop) _id: ${this.classroomId}`),console.log(`[ClassroomCtrlPanel] Config: ${JSON.stringify(this.classroomCfg)}`),this.availableCourses=await a().getCoursesDB().getCourseList(),this.updatePending=!1}catch(e){console.error("[ClassroomCtrlPanel] Error initializing:",e)}},methods:{async assignContent(){if(!this.classroomDB)return;const e=await s();0===this.selectedTags.length?await(this.classroomDB.assignContent?.({assignedOn:t(),activeOn:t(),type:"course",courseID:this.selectedCourse,assignedBy:e.getUsername()})):await Promise.all(this.selectedTags.map((s=>this.classroomDB.assignContent?.({assignedOn:t(),activeOn:t(),type:"tag",courseID:this.selectedCourse,tagID:s,assignedBy:e.getUsername()})))),this.assignedContent=await this.classroomDB.getAssignedContent(),this.addingContent=!1,this.selectedCourse="",this.selectedTags=[],this.availableTags=[]},async removeContent(e){this.classroomDB&&this.classroomDB.removeContent&&(await this.classroomDB.removeContent(e),this.assignedContent=await this.classroomDB.getAssignedContent())},async submit(){this.updatePending=!0}}}),p={key:0},y=["onClick"],D=["onClick"];const _=l(v,[["render",function(e,s,t,a,l,v){const _=o("router-link"),b=o("v-btn"),k=o("v-checkbox"),B=o("v-col"),T=o("v-icon"),w=o("v-fade-transition"),A=o("v-toolbar-title"),I=o("v-spacer"),P=o("v-toolbar"),V=o("v-select"),S=o("v-card-text"),x=o("v-card-actions"),O=o("v-card"),U=o("v-row");return e.updatePending?i("",!0):(r(),n("div",p,[d("h1",null,[c(_,{to:"/classrooms"},{default:m((()=>s[5]||(s[5]=[u("My Classrooms")]))),_:1}),u(" / "+g(e.classroomCfg.name),1)]),d("h3",null,[u(" Join code: "+g(e.classroomCfg.joinCode)+" ",1),c(_,{to:`/classrooms/${e.classroomId}/code`},{default:m((()=>[c(b,{size:"x-small",icon:"mdi-fullscreen",color:"accent",alt:"Make Fullscreen"})])),_:1},8,["to"])]),c(U,null,{default:m((()=>[c(B,{cols:"12",sm:"6",md:"4"},{default:m((()=>[c(k,{modelValue:e.classroomCfg.peerAssist,"onUpdate:modelValue":s[0]||(s[0]=s=>e.classroomCfg.peerAssist=s),label:"Allow peer instruction"},null,8,["modelValue"])])),_:1}),e.classroomDB?(r(),C(B,{key:0,cols:"12"},{default:m((()=>[s[10]||(s[10]=d("h2",null,"Assigned Content:",-1)),s[11]||(s[11]=d("h3",null,"Quilts:",-1)),s[12]||(s[12]=d("ul",null,null,-1)),d("ul",null,[(r(!0),n(h,null,f(e._assignedCourses,(s=>(r(),n("li",{key:s.courseID},[u(g(s.courseID)+" ",1),d("a",{onClick:t=>e.removeContent(s)},"Remove",8,y)])))),128))]),s[13]||(s[13]=d("h3",null,"Tags:",-1)),d("ul",null,[(r(!0),n(h,null,f(e._assignedTags,((s,t)=>(r(),n("li",{key:t},[u(g(s.courseID)+" - "+g(s.tagID)+" ",1),d("a",{onClick:t=>e.removeContent(s)},"Remove",8,D)])))),128))]),c(w,null,{default:m((()=>[e.addingContent?i("",!0):(r(),C(b,{key:0,color:"primary",onClick:s[1]||(s[1]=s=>e.addingContent=!0)},{default:m((()=>[s[7]||(s[7]=u(" Assign New Content ")),c(T,{end:""},{default:m((()=>s[6]||(s[6]=[u("mdi-plus")]))),_:1})])),_:1}))])),_:1}),e.addingContent?(r(),C(O,{key:0},{default:m((()=>[c(P,null,{default:m((()=>[c(A,null,{default:m((()=>s[8]||(s[8]=[u("Add Content")]))),_:1}),c(I),c(b,{icon:"mdi-close",color:"error",onClick:s[2]||(s[2]=s=>e.addingContent=!1)})])),_:1}),c(S,null,{default:m((()=>[c(V,{modelValue:e.selectedCourse,"onUpdate:modelValue":s[3]||(s[3]=s=>e.selectedCourse=s),label:"Select Quilt",items:e.availableCourses,"item-title":"name","item-value":"_id",title:"Select Quilt"},null,8,["modelValue","items"]),c(V,{modelValue:e.selectedTags,"onUpdate:modelValue":s[4]||(s[4]=s=>e.selectedTags=s),label:"Select Tags",items:e.availableTags,"item-title":"name","item-value":"name",multiple:"",chips:"",hint:"","persistent-hint":""},null,8,["modelValue","items"])])),_:1}),c(x,null,{default:m((()=>[""!==e.selectedCourse?(r(),C(b,{key:0,color:"primary",onClick:e.assignContent},{default:m((()=>[u(g(0==e.selectedTags.length?"Add Entire Quilt":"Add Tags")+" ",1),c(T,{end:""},{default:m((()=>s[9]||(s[9]=[u("mdi-plus")]))),_:1})])),_:1},8,["onClick"])):i("",!0)])),_:1})])),_:1})):i("",!0)])),_:1})):i("",!0)])),_:1})]))}]]);export{_ as default};
2
+ //# sourceMappingURL=ClassroomCtrlPanel-BZ2Jso_N.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClassroomCtrlPanel-Del1NMJ0.js","sources":["../../src/components/Classrooms/ClassroomCtrlPanel.vue"],"sourcesContent":["<template>\n <div v-if=\"!updatePending\">\n <h1><router-link to=\"/classrooms\">My Classrooms</router-link> / {{ classroomCfg!.name }}</h1>\n\n <h3>\n Join code: {{ classroomCfg!.joinCode }}\n <router-link :to=\"`/classrooms/${classroomId}/code`\">\n <v-btn size=\"x-small\" icon=\"mdi-fullscreen\" color=\"accent\" alt=\"Make Fullscreen\"> </v-btn>\n </router-link>\n </h3>\n <v-row>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-checkbox v-model=\"classroomCfg!.peerAssist\" label=\"Allow peer instruction\"></v-checkbox>\n </v-col>\n <v-col v-if=\"classroomDB\" cols=\"12\">\n <h2>Assigned Content:</h2>\n <h3>Quilts:</h3>\n <ul></ul>\n <ul>\n <li v-for=\"c in _assignedCourses\" :key=\"c.courseID\">\n {{ c.courseID }} <a @click=\"removeContent(c)\">Remove</a>\n </li>\n </ul>\n <h3>Tags:</h3>\n <ul>\n <li v-for=\"(c, i) in _assignedTags\" :key=\"i\">\n {{ c.courseID }} - {{ c.tagID }} <a @click=\"removeContent(c)\">Remove</a>\n </li>\n </ul>\n <v-fade-transition>\n <v-btn v-if=\"!addingContent\" color=\"primary\" @click=\"addingContent = true\">\n Assign New Content\n <v-icon end>mdi-plus</v-icon>\n </v-btn>\n </v-fade-transition>\n <v-card v-if=\"addingContent\">\n <v-toolbar>\n <v-toolbar-title>Add Content</v-toolbar-title>\n <v-spacer></v-spacer>\n <v-btn icon=\"mdi-close\" color=\"error\" @click=\"addingContent = false\"> </v-btn>\n </v-toolbar>\n <v-card-text>\n <v-select\n v-model=\"selectedCourse\"\n label=\"Select Quilt\"\n :items=\"availableCourses\"\n item-title=\"name\"\n item-value=\"_id\"\n title=\"Select Quilt\"\n ></v-select>\n\n <v-select\n v-model=\"selectedTags\"\n label=\"Select Tags\"\n :items=\"availableTags\"\n item-title=\"name\"\n item-value=\"name\"\n multiple\n chips\n hint=\"\"\n persistent-hint\n ></v-select>\n </v-card-text>\n\n <v-card-actions>\n <v-btn v-if=\"selectedCourse !== ''\" color=\"primary\" @click=\"assignContent\">\n {{ selectedTags.length == 0 ? 'Add Entire Quilt' : 'Add Tags' }}\n <v-icon end>mdi-plus</v-icon>\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-col>\n </v-row>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport moment from 'moment';\nimport { TeacherClassroomDBInterface, AssignedContent, AssignedTag, Tag, getDataLayer } from '@vue-skuilder/db';\nimport { ClassroomConfig, CourseConfig } from '@vue-skuilder/common';\nimport { defineComponent } from 'vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'ClassroomCtrlPanel',\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 assignedContent: [] as AssignedContent[],\n nameRules: [\n (value: string): string | boolean => {\n const max = 30;\n return value.length > max ? `Course name must be ${max} characters or less` : true;\n },\n ],\n updatePending: true,\n addingContent: false,\n availableCourses: [] as CourseConfig[],\n selectedCourse: '',\n availableTags: [] as Tag[],\n selectedTags: [] as string[],\n };\n },\n\n computed: {\n _assignedCourses(): AssignedContent[] {\n return this.assignedContent.filter((c) => c.type === 'course');\n },\n _assignedTags(): AssignedTag[] {\n return this.assignedContent.filter((c) => c.type === 'tag') as AssignedTag[];\n },\n },\n\n watch: {\n async selectedCourse() {\n if (this.selectedCourse) {\n // Get course DB from data layer\n const courseDB = getDataLayer().getCourseDB(this.selectedCourse);\n // Get tags from course DB\n const tagResponse = await courseDB.getCourseTagStubs();\n this.availableTags = tagResponse.rows.map((row) => row.doc!);\n } else {\n this.availableTags = [];\n }\n },\n },\n\n async created() {\n try {\n // Get classroom DB from data layer\n this.classroomDB = (await getDataLayer().getClassroomDB(\n this.classroomId,\n 'teacher'\n )) as TeacherClassroomDBInterface;\n this.assignedContent = await this.classroomDB.getAssignedContent();\n this.classroomCfg = this.classroomDB.getConfig();\n\n console.log(`[ClassroomCtrlPanel] Route loaded w/ (prop) _id: ${this.classroomId}`);\n console.log(`[ClassroomCtrlPanel] Config: ${JSON.stringify(this.classroomCfg)}`);\n\n // Get course list from data layer\n this.availableCourses = await getDataLayer().getCoursesDB().getCourseList();\n\n this.updatePending = false;\n } catch (error) {\n console.error('[ClassroomCtrlPanel] Error initializing:', error);\n }\n },\n\n methods: {\n async assignContent() {\n if (!this.classroomDB) return;\n const u = await getCurrentUser();\n\n if (this.selectedTags.length === 0) {\n await this.classroomDB.assignContent?.({\n assignedOn: moment(),\n activeOn: moment(),\n type: 'course',\n courseID: this.selectedCourse,\n assignedBy: u.getUsername(),\n });\n } else {\n await Promise.all(\n this.selectedTags.map((tag) =>\n this.classroomDB!.assignContent?.({\n assignedOn: moment(),\n activeOn: moment(),\n type: 'tag',\n courseID: this.selectedCourse,\n tagID: tag,\n assignedBy: u.getUsername(),\n })\n )\n );\n }\n\n this.assignedContent = await this.classroomDB.getAssignedContent();\n this.addingContent = false;\n this.selectedCourse = '';\n this.selectedTags = [];\n this.availableTags = [];\n },\n\n async removeContent(c: AssignedContent) {\n if (this.classroomDB && this.classroomDB.removeContent) {\n await this.classroomDB.removeContent(c);\n this.assignedContent = await this.classroomDB.getAssignedContent();\n }\n },\n\n async submit() {\n this.updatePending = true;\n },\n },\n});\n</script>\n"],"names":["_sfc_main","defineComponent","name","props","classroomId","type","String","required","data","classroomCfg","classroomDB","assignedContent","nameRules","value","length","updatePending","addingContent","availableCourses","selectedCourse","availableTags","selectedTags","computed","_assignedCourses","this","filter","c","_assignedTags","watch","courseDB","getDataLayer","getCourseDB","tagResponse","getCourseTagStubs","rows","map","row","doc","created","getClassroomDB","getAssignedContent","getConfig","console","log","JSON","stringify","getCoursesDB","getCourseList","error","methods","assignContent","u","getCurrentUser","assignedOn","moment","activeOn","courseID","assignedBy","getUsername","Promise","all","tag","tagID","removeContent","submit","_hoisted_1","key","_hoisted_2","_hoisted_3","_ctx","_createCommentVNode","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_component_router_link","to","default","_cache","_createTextVNode","_","_toDisplayString","joinCode","_withCtx","_component_v_btn","size","icon","color","alt","_component_v_row","_component_v_col","cols","sm","md","_component_v_checkbox","modelValue","peerAssist","$event","label","_createBlock","_Fragment","_renderList","onClick","i","_component_v_fade_transition","_component_v_icon","end","_component_v_card","_component_v_toolbar","_component_v_toolbar_title","_component_v_spacer","_component_v_card_text","_component_v_select","items","title","multiple","chips","hint","_component_v_card_actions"],"mappings":"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"}
1
+ {"version":3,"file":"ClassroomCtrlPanel-BZ2Jso_N.js","sources":["../../src/components/Classrooms/ClassroomCtrlPanel.vue"],"sourcesContent":["<template>\n <div v-if=\"!updatePending\">\n <h1><router-link to=\"/classrooms\">My Classrooms</router-link> / {{ classroomCfg!.name }}</h1>\n\n <h3>\n Join code: {{ classroomCfg!.joinCode }}\n <router-link :to=\"`/classrooms/${classroomId}/code`\">\n <v-btn size=\"x-small\" icon=\"mdi-fullscreen\" color=\"accent\" alt=\"Make Fullscreen\"> </v-btn>\n </router-link>\n </h3>\n <v-row>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-checkbox v-model=\"classroomCfg!.peerAssist\" label=\"Allow peer instruction\"></v-checkbox>\n </v-col>\n <v-col v-if=\"classroomDB\" cols=\"12\">\n <h2>Assigned Content:</h2>\n <h3>Quilts:</h3>\n <ul></ul>\n <ul>\n <li v-for=\"c in _assignedCourses\" :key=\"c.courseID\">\n {{ c.courseID }} <a @click=\"removeContent(c)\">Remove</a>\n </li>\n </ul>\n <h3>Tags:</h3>\n <ul>\n <li v-for=\"(c, i) in _assignedTags\" :key=\"i\">\n {{ c.courseID }} - {{ c.tagID }} <a @click=\"removeContent(c)\">Remove</a>\n </li>\n </ul>\n <v-fade-transition>\n <v-btn v-if=\"!addingContent\" color=\"primary\" @click=\"addingContent = true\">\n Assign New Content\n <v-icon end>mdi-plus</v-icon>\n </v-btn>\n </v-fade-transition>\n <v-card v-if=\"addingContent\">\n <v-toolbar>\n <v-toolbar-title>Add Content</v-toolbar-title>\n <v-spacer></v-spacer>\n <v-btn icon=\"mdi-close\" color=\"error\" @click=\"addingContent = false\"> </v-btn>\n </v-toolbar>\n <v-card-text>\n <v-select\n v-model=\"selectedCourse\"\n label=\"Select Quilt\"\n :items=\"availableCourses\"\n item-title=\"name\"\n item-value=\"_id\"\n title=\"Select Quilt\"\n ></v-select>\n\n <v-select\n v-model=\"selectedTags\"\n label=\"Select Tags\"\n :items=\"availableTags\"\n item-title=\"name\"\n item-value=\"name\"\n multiple\n chips\n hint=\"\"\n persistent-hint\n ></v-select>\n </v-card-text>\n\n <v-card-actions>\n <v-btn v-if=\"selectedCourse !== ''\" color=\"primary\" @click=\"assignContent\">\n {{ selectedTags.length == 0 ? 'Add Entire Quilt' : 'Add Tags' }}\n <v-icon end>mdi-plus</v-icon>\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-col>\n </v-row>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport moment from 'moment';\nimport { TeacherClassroomDBInterface, AssignedContent, AssignedTag, Tag, getDataLayer } from '@vue-skuilder/db';\nimport { ClassroomConfig, CourseConfig } from '@vue-skuilder/common';\nimport { defineComponent } from 'vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'ClassroomCtrlPanel',\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 assignedContent: [] as AssignedContent[],\n nameRules: [\n (value: string): string | boolean => {\n const max = 30;\n return value.length > max ? `Course name must be ${max} characters or less` : true;\n },\n ],\n updatePending: true,\n addingContent: false,\n availableCourses: [] as CourseConfig[],\n selectedCourse: '',\n availableTags: [] as Tag[],\n selectedTags: [] as string[],\n };\n },\n\n computed: {\n _assignedCourses(): AssignedContent[] {\n return this.assignedContent.filter((c) => c.type === 'course');\n },\n _assignedTags(): AssignedTag[] {\n return this.assignedContent.filter((c) => c.type === 'tag') as AssignedTag[];\n },\n },\n\n watch: {\n async selectedCourse() {\n if (this.selectedCourse) {\n // Get course DB from data layer\n const courseDB = getDataLayer().getCourseDB(this.selectedCourse);\n // Get tags from course DB\n const tagResponse = await courseDB.getCourseTagStubs();\n this.availableTags = tagResponse.rows.map((row) => row.doc!);\n } else {\n this.availableTags = [];\n }\n },\n },\n\n async created() {\n try {\n // Get classroom DB from data layer\n this.classroomDB = (await getDataLayer().getClassroomDB(\n this.classroomId,\n 'teacher'\n )) as TeacherClassroomDBInterface;\n this.assignedContent = await this.classroomDB.getAssignedContent();\n this.classroomCfg = this.classroomDB.getConfig();\n\n console.log(`[ClassroomCtrlPanel] Route loaded w/ (prop) _id: ${this.classroomId}`);\n console.log(`[ClassroomCtrlPanel] Config: ${JSON.stringify(this.classroomCfg)}`);\n\n // Get course list from data layer\n this.availableCourses = await getDataLayer().getCoursesDB().getCourseList();\n\n this.updatePending = false;\n } catch (error) {\n console.error('[ClassroomCtrlPanel] Error initializing:', error);\n }\n },\n\n methods: {\n async assignContent() {\n if (!this.classroomDB) return;\n const u = await getCurrentUser();\n\n if (this.selectedTags.length === 0) {\n await this.classroomDB.assignContent?.({\n assignedOn: moment(),\n activeOn: moment(),\n type: 'course',\n courseID: this.selectedCourse,\n assignedBy: u.getUsername(),\n });\n } else {\n await Promise.all(\n this.selectedTags.map((tag) =>\n this.classroomDB!.assignContent?.({\n assignedOn: moment(),\n activeOn: moment(),\n type: 'tag',\n courseID: this.selectedCourse,\n tagID: tag,\n assignedBy: u.getUsername(),\n })\n )\n );\n }\n\n this.assignedContent = await this.classroomDB.getAssignedContent();\n this.addingContent = false;\n this.selectedCourse = '';\n this.selectedTags = [];\n this.availableTags = [];\n },\n\n async removeContent(c: AssignedContent) {\n if (this.classroomDB && this.classroomDB.removeContent) {\n await this.classroomDB.removeContent(c);\n this.assignedContent = await this.classroomDB.getAssignedContent();\n }\n },\n\n async submit() {\n this.updatePending = true;\n },\n },\n});\n</script>\n"],"names":["_sfc_main","defineComponent","name","props","classroomId","type","String","required","data","classroomCfg","classroomDB","assignedContent","nameRules","value","length","updatePending","addingContent","availableCourses","selectedCourse","availableTags","selectedTags","computed","_assignedCourses","this","filter","c","_assignedTags","watch","courseDB","getDataLayer","getCourseDB","tagResponse","getCourseTagStubs","rows","map","row","doc","created","getClassroomDB","getAssignedContent","getConfig","console","log","JSON","stringify","getCoursesDB","getCourseList","error","methods","assignContent","u","getCurrentUser","assignedOn","moment","activeOn","courseID","assignedBy","getUsername","Promise","all","tag","tagID","removeContent","submit","_hoisted_1","key","_hoisted_2","_hoisted_3","_ctx","_createCommentVNode","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_component_router_link","to","default","_cache","_createTextVNode","_","_toDisplayString","joinCode","_withCtx","_component_v_btn","size","icon","color","alt","_component_v_row","_component_v_col","cols","sm","md","_component_v_checkbox","modelValue","peerAssist","$event","label","_createBlock","_Fragment","_renderList","onClick","i","_component_v_fade_transition","_component_v_icon","end","_component_v_card","_component_v_toolbar","_component_v_toolbar_title","_component_v_spacer","_component_v_card_text","_component_v_select","items","title","multiple","chips","hint","_component_v_card_actions"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{d as e,s,l as t,i as a,j as l,k as o,m as r,_ as n,r as i,c as d,o as u,w as c,a as m,e as p,g as h,h as f,T as C,f as g,F as _,n as v,t as y,p as b}from"./index-CfLe2ewO.js";import{s as w,M as A}from"./mousetrap-BPMmAIzH.js";const k=e({emits:["ClassroomEditingComplete"],data(){return{mousetrap:new A(this.$el),peerAssist:!0,name:"",birthYear:void 0,id:"",nameRules:[e=>!(e.length>30)||"Course name must be 30 characters or less"],description:"",banner:void 0,thumb:void 0,updatePending:!1,birthYears:[]}},created(){this.mousetrap.bind("esc",this.clearFormAndDismiss);const e=r().year();this.birthYears.push({text:`< ${e-17} (Adult Students)`,value:0});for(let s=17;s>=6;s--)this.birthYears.push({text:`${e-s} (Grade ${s-5})`,value:e-s});this.birthYears.push({text:`>${e-6} (K or younger)`,value:e-5})},methods:{async submit(){this.updatePending=!0;const e=await s(),r={name:this.name,teachers:[e.getUsername()],students:[],birthYear:this.birthYear,classMeetingSchedule:"",peerAssist:this.peerAssist,joinCode:""};t(`Class Config:\n ${JSON.stringify(r)}`);const n=await w({data:r,type:a.CREATE_CLASSROOM,response:null,user:e.getUsername()});n.response&&n.response.ok?(l({text:`Class created successfully. Join code: ${n.response.joincode}`,status:o.ok}),e.registerForClassroom(n.response.uuid,"teacher")):l({text:"Failed to create class. Please try again.",status:o.error}),this.clearFormAndDismiss(),this.updatePending=!1},clearFormAndDismiss(){this.name="",this.description="",this.$emit("ClassroomEditingComplete")}}});const x=n(e({name:"ClassroomsView",components:{ClassroomEditor:n(k,[["render",function(e,s,t,a,l,o){const r=i("v-card-title"),n=i("v-spacer"),h=i("v-icon"),f=i("v-btn"),C=i("v-toolbar"),g=i("v-text-field"),_=i("v-col"),v=i("v-checkbox"),y=i("v-select"),b=i("v-row"),w=i("v-container"),A=i("v-form"),k=i("v-card");return u(),d(k,null,{default:c((()=>[m(C,{color:"primary"},{default:c((()=>[m(r,{class:"text-h6 font-weight-regular"},{default:c((()=>s[3]||(s[3]=[p("Start a New Class")]))),_:1}),m(n),m(f,{icon:"",onClick:e.clearFormAndDismiss},{default:c((()=>[m(h,null,{default:c((()=>s[4]||(s[4]=[p("mdi-close")]))),_:1})])),_:1},8,["onClick"])])),_:1}),m(A,null,{default:c((()=>[m(w,null,{default:c((()=>[m(b,null,{default:c((()=>[m(_,{cols:"12",sm:"6",md:"4"},{default:c((()=>[m(g,{modelValue:e.name,"onUpdate:modelValue":s[0]||(s[0]=s=>e.name=s),counter:"30",rules:e.nameRules,label:"Class Name",required:"",hint:"Eg: Smith, Chemistry, Period 3"},null,8,["modelValue","rules"])])),_:1}),m(_,{cols:"12",sm:"6",md:"4"},{default:c((()=>[m(v,{modelValue:e.peerAssist,"onUpdate:modelValue":s[1]||(s[1]=s=>e.peerAssist=s),label:"Allow peer instruction"},null,8,["modelValue"])])),_:1}),m(_,{cols:"12",sm:"6",md:"4"},{default:c((()=>[m(y,{modelValue:e.birthYear,"onUpdate:modelValue":s[2]||(s[2]=s=>e.birthYear=s),items:e.birthYears,label:"Approximate Birth Year of Students","item-title":"text","item-value":"value"},null,8,["modelValue","items"])])),_:1}),m(_,{cols:"12",sm:"6",md:"4"},{default:c((()=>[m(f,{loading:e.updatePending,color:"primary",onClick:e.submit},{default:c((()=>s[5]||(s[5]=[p("Create This Class")]))),_:1},8,["loading","onClick"])])),_:1})])),_:1})])),_:1})])),_:1})])),_:1})}]])},beforeRouteEnter(e,s,t){t()},data:()=>({classes:[],joinCode:"",studentClasses:[],teacherClasses:[],spinnerMap:{},newClassDialog:!1,user:null}),created(){this.refreshData()},methods:{async refreshData(){this.$data.user=await s();const e=(await this.user.getUserClassrooms()).registrations,t=[],a=[];e.forEach((async e=>{const s=(await h().getClassroomDB(e.classID,"teacher"==e.registeredAs||"student"==e.registeredAs?e.registeredAs:"student")).getConfig();console.log(`Registered class: ${JSON.stringify(s)}`);const l={_id:e.classID,name:s.name};"student"===e.registeredAs?t.push(l):"teacher"===e.registeredAs&&a.push(l)})),this.studentClasses=t,this.teacherClasses=a},async deleteClass(e){const s=await w({type:a.DELETE_CLASSROOM,user:this.user?.getUsername()||"",classID:e,response:null});s.response&&s.response.ok?l({text:"Class deleted successfully.",status:o.ok}):l({text:"Failed to delete class. Please try again.",status:o.error})},async leaveClass(e){this.spinnerMap[e]=!0,console.log(`Attempting to drop class: ${e}`);const s=await w({type:a.LEAVE_CLASSROOM,data:{classID:e},user:this.user?.getUsername()||"",response:null});s.response&&s.response.ok&&this.user&&await this.user.dropFromClassroom(e),delete this.spinnerMap[e],this.refreshData()},async joinClass(){const e=await w({type:a.JOIN_CLASSROOM,data:{joinCode:this.joinCode,registerAs:"student",user:this.user?.getUsername()||""},user:this.user?.getUsername()||"",response:null});e.response&&e.response.ok?(console.log("Adding registration to userDB..."),this.user?(await registerUserForClassroom(this.user.getUsername(),e.response.id_course,"student"),l({text:`Successfully joined class: ${e.response.course_name}.`,status:o.ok})):l({text:"Failed to join class. [Unknown current user.]",status:o.error})):e.response&&l({text:e.response.errorText,status:o.error}),this.refreshData()},async processResponse(){this.newClassDialog=!this.newClassDialog}}}),[["render",function(e,s,t,a,l,o){const r=i("v-toolbar-title"),n=i("v-toolbar"),h=i("v-list-item-title"),w=i("v-btn"),A=i("v-list-item"),k=i("v-list"),x=i("v-card"),D=i("v-col"),S=i("v-row"),V=i("v-divider"),j=i("v-text-field"),E=i("v-card-text"),U=i("classroom-editor"),M=i("v-dialog"),O=i("v-container");return u(),d(O,{fluid:""},{default:c((()=>[m(S,{class:"pa-4",justify:"space-around"},{default:c((()=>[e.studentClasses.length>0?(u(),d(D,{key:0,cols:"12",sm:"12",md:"4"},{default:c((()=>[m(x,null,{default:c((()=>[m(n,{color:"primary"},{default:c((()=>[m(r,null,{default:c((()=>s[2]||(s[2]=[p("My Classes")]))),_:1})])),_:1}),m(k,null,{default:c((()=>[m(C,{name:"component-fade",mode:"out-in"},{default:c((()=>[(u(!0),g(_,null,v(e.studentClasses,(t=>(u(),d(A,{key:t._id,value:t},{append:c((()=>[m(w,{size:"small",color:"secondary",loading:void 0!==e.spinnerMap[t._id],onClick:s=>e.leaveClass(t._id)},{default:c((()=>s[3]||(s[3]=[p(" Leave this class ")]))),_:2},1032,["loading","onClick"])])),default:c((()=>[m(h,null,{default:c((()=>[p(y(t.name),1)])),_:2},1024)])),_:2},1032,["value"])))),128))])),_:1})])),_:1})])),_:1})])),_:1})):f("",!0),e.teacherClasses.length>0?(u(),d(D,{key:1,cols:"12",sm:"12",md:"4"},{default:c((()=>[m(x,null,{default:c((()=>[m(n,{color:"primary"},{default:c((()=>[m(r,null,{default:c((()=>s[4]||(s[4]=[p("Classes I Manage")]))),_:1})])),_:1}),m(k,null,{default:c((()=>[m(C,{name:"component-fade",mode:"out-in"},{default:c((()=>[(u(!0),g(_,null,v(e.teacherClasses,(t=>(u(),d(A,{key:t._id,value:t},{append:c((()=>[m(w,{size:"small",color:"secondary",loading:void 0!==e.spinnerMap[t._id],to:`/classrooms/${t._id}`},{default:c((()=>s[5]||(s[5]=[p(" Open ")]))),_:2},1032,["loading","to"])])),default:c((()=>[m(h,null,{default:c((()=>[p(y(t.name),1)])),_:2},1024)])),_:2},1032,["value"])))),128))])),_:1})])),_:1})])),_:1})])),_:1})):f("",!0),0===e.studentClasses.length&&0===e.teacherClasses.length?(u(),d(D,{key:2,class:"text-h5 text-center"},{default:c((()=>s[6]||(s[6]=[p(" You are not in any classes! Join your class below if someone has given you a joincode. Or else, start your own! ")]))),_:1})):f("",!0)])),_:1}),m(V,{class:"my-4"}),m(S,{class:"pa-4"},{default:c((()=>[m(D,{cols:"12",sm:"12",md:"8",lg:"6",xl:"6"},{default:c((()=>[m(x,null,{default:c((()=>[m(n,{color:"primary"},{default:c((()=>[m(r,null,{default:c((()=>s[7]||(s[7]=[p("Join a class")]))),_:1})])),_:1}),m(E,null,{default:c((()=>[m(j,{modelValue:e.joinCode,"onUpdate:modelValue":s[0]||(s[0]=s=>e.joinCode=s),label:"Class Code",variant:"outlined"},null,8,["modelValue"]),m(w,{color:"primary",onClick:e.joinClass},{default:c((()=>s[8]||(s[8]=[p("Join")]))),_:1},8,["onClick"])])),_:1})])),_:1})])),_:1})])),_:1}),m(M,{modelValue:e.newClassDialog,"onUpdate:modelValue":s[1]||(s[1]=s=>e.newClassDialog=s),fullscreen:"",transition:"dialog-bottom-transition",scrim:!1},{activator:c((({props:e})=>[m(w,b({color:"primary"},e),{default:c((()=>s[9]||(s[9]=[p("Start a new Class")]))),_:2},1040)])),default:c((()=>[m(U,{onClassroomEditingComplete:e.processResponse},null,8,["onClassroomEditingComplete"])])),_:1},8,["modelValue"])])),_:1})}]]);export{x as default};
2
- //# sourceMappingURL=Classrooms-uc9jXghN.js.map
1
+ import{d as e,s,l as t,i as a,j as l,k as o,m as r,_ as n,r as i,c as d,o as u,w as c,a as m,e as p,g as h,h as f,T as C,f as g,F as _,n as v,t as y,p as b}from"./index-PISHyq1I.js";import{s as w,M as A}from"./mousetrap-DZcUUEaw.js";const k=e({emits:["ClassroomEditingComplete"],data(){return{mousetrap:new A(this.$el),peerAssist:!0,name:"",birthYear:void 0,id:"",nameRules:[e=>!(e.length>30)||"Course name must be 30 characters or less"],description:"",banner:void 0,thumb:void 0,updatePending:!1,birthYears:[]}},created(){this.mousetrap.bind("esc",this.clearFormAndDismiss);const e=r().year();this.birthYears.push({text:`< ${e-17} (Adult Students)`,value:0});for(let s=17;s>=6;s--)this.birthYears.push({text:`${e-s} (Grade ${s-5})`,value:e-s});this.birthYears.push({text:`>${e-6} (K or younger)`,value:e-5})},methods:{async submit(){this.updatePending=!0;const e=await s(),r={name:this.name,teachers:[e.getUsername()],students:[],birthYear:this.birthYear,classMeetingSchedule:"",peerAssist:this.peerAssist,joinCode:""};t(`Class Config:\n ${JSON.stringify(r)}`);const n=await w({data:r,type:a.CREATE_CLASSROOM,response:null,user:e.getUsername()});n.response&&n.response.ok?(l({text:`Class created successfully. Join code: ${n.response.joincode}`,status:o.ok}),e.registerForClassroom(n.response.uuid,"teacher")):l({text:"Failed to create class. Please try again.",status:o.error}),this.clearFormAndDismiss(),this.updatePending=!1},clearFormAndDismiss(){this.name="",this.description="",this.$emit("ClassroomEditingComplete")}}});const x=n(e({name:"ClassroomsView",components:{ClassroomEditor:n(k,[["render",function(e,s,t,a,l,o){const r=i("v-card-title"),n=i("v-spacer"),h=i("v-icon"),f=i("v-btn"),C=i("v-toolbar"),g=i("v-text-field"),_=i("v-col"),v=i("v-checkbox"),y=i("v-select"),b=i("v-row"),w=i("v-container"),A=i("v-form"),k=i("v-card");return u(),d(k,null,{default:c((()=>[m(C,{color:"primary"},{default:c((()=>[m(r,{class:"text-h6 font-weight-regular"},{default:c((()=>s[3]||(s[3]=[p("Start a New Class")]))),_:1}),m(n),m(f,{icon:"",onClick:e.clearFormAndDismiss},{default:c((()=>[m(h,null,{default:c((()=>s[4]||(s[4]=[p("mdi-close")]))),_:1})])),_:1},8,["onClick"])])),_:1}),m(A,null,{default:c((()=>[m(w,null,{default:c((()=>[m(b,null,{default:c((()=>[m(_,{cols:"12",sm:"6",md:"4"},{default:c((()=>[m(g,{modelValue:e.name,"onUpdate:modelValue":s[0]||(s[0]=s=>e.name=s),counter:"30",rules:e.nameRules,label:"Class Name",required:"",hint:"Eg: Smith, Chemistry, Period 3"},null,8,["modelValue","rules"])])),_:1}),m(_,{cols:"12",sm:"6",md:"4"},{default:c((()=>[m(v,{modelValue:e.peerAssist,"onUpdate:modelValue":s[1]||(s[1]=s=>e.peerAssist=s),label:"Allow peer instruction"},null,8,["modelValue"])])),_:1}),m(_,{cols:"12",sm:"6",md:"4"},{default:c((()=>[m(y,{modelValue:e.birthYear,"onUpdate:modelValue":s[2]||(s[2]=s=>e.birthYear=s),items:e.birthYears,label:"Approximate Birth Year of Students","item-title":"text","item-value":"value"},null,8,["modelValue","items"])])),_:1}),m(_,{cols:"12",sm:"6",md:"4"},{default:c((()=>[m(f,{loading:e.updatePending,color:"primary",onClick:e.submit},{default:c((()=>s[5]||(s[5]=[p("Create This Class")]))),_:1},8,["loading","onClick"])])),_:1})])),_:1})])),_:1})])),_:1})])),_:1})}]])},beforeRouteEnter(e,s,t){t()},data:()=>({classes:[],joinCode:"",studentClasses:[],teacherClasses:[],spinnerMap:{},newClassDialog:!1,user:null}),created(){this.refreshData()},methods:{async refreshData(){this.$data.user=await s();const e=(await this.user.getUserClassrooms()).registrations,t=[],a=[];e.forEach((async e=>{const s=(await h().getClassroomDB(e.classID,"teacher"==e.registeredAs||"student"==e.registeredAs?e.registeredAs:"student")).getConfig();console.log(`Registered class: ${JSON.stringify(s)}`);const l={_id:e.classID,name:s.name};"student"===e.registeredAs?t.push(l):"teacher"===e.registeredAs&&a.push(l)})),this.studentClasses=t,this.teacherClasses=a},async deleteClass(e){const s=await w({type:a.DELETE_CLASSROOM,user:this.user?.getUsername()||"",classID:e,response:null});s.response&&s.response.ok?l({text:"Class deleted successfully.",status:o.ok}):l({text:"Failed to delete class. Please try again.",status:o.error})},async leaveClass(e){this.spinnerMap[e]=!0,console.log(`Attempting to drop class: ${e}`);const s=await w({type:a.LEAVE_CLASSROOM,data:{classID:e},user:this.user?.getUsername()||"",response:null});s.response&&s.response.ok&&this.user&&await this.user.dropFromClassroom(e),delete this.spinnerMap[e],this.refreshData()},async joinClass(){const e=await w({type:a.JOIN_CLASSROOM,data:{joinCode:this.joinCode,registerAs:"student",user:this.user?.getUsername()||""},user:this.user?.getUsername()||"",response:null});e.response&&e.response.ok?(console.log("Adding registration to userDB..."),this.user?(await registerUserForClassroom(this.user.getUsername(),e.response.id_course,"student"),l({text:`Successfully joined class: ${e.response.course_name}.`,status:o.ok})):l({text:"Failed to join class. [Unknown current user.]",status:o.error})):e.response&&l({text:e.response.errorText,status:o.error}),this.refreshData()},async processResponse(){this.newClassDialog=!this.newClassDialog}}}),[["render",function(e,s,t,a,l,o){const r=i("v-toolbar-title"),n=i("v-toolbar"),h=i("v-list-item-title"),w=i("v-btn"),A=i("v-list-item"),k=i("v-list"),x=i("v-card"),D=i("v-col"),S=i("v-row"),V=i("v-divider"),j=i("v-text-field"),E=i("v-card-text"),U=i("classroom-editor"),M=i("v-dialog"),O=i("v-container");return u(),d(O,{fluid:""},{default:c((()=>[m(S,{class:"pa-4",justify:"space-around"},{default:c((()=>[e.studentClasses.length>0?(u(),d(D,{key:0,cols:"12",sm:"12",md:"4"},{default:c((()=>[m(x,null,{default:c((()=>[m(n,{color:"primary"},{default:c((()=>[m(r,null,{default:c((()=>s[2]||(s[2]=[p("My Classes")]))),_:1})])),_:1}),m(k,null,{default:c((()=>[m(C,{name:"component-fade",mode:"out-in"},{default:c((()=>[(u(!0),g(_,null,v(e.studentClasses,(t=>(u(),d(A,{key:t._id,value:t},{append:c((()=>[m(w,{size:"small",color:"secondary",loading:void 0!==e.spinnerMap[t._id],onClick:s=>e.leaveClass(t._id)},{default:c((()=>s[3]||(s[3]=[p(" Leave this class ")]))),_:2},1032,["loading","onClick"])])),default:c((()=>[m(h,null,{default:c((()=>[p(y(t.name),1)])),_:2},1024)])),_:2},1032,["value"])))),128))])),_:1})])),_:1})])),_:1})])),_:1})):f("",!0),e.teacherClasses.length>0?(u(),d(D,{key:1,cols:"12",sm:"12",md:"4"},{default:c((()=>[m(x,null,{default:c((()=>[m(n,{color:"primary"},{default:c((()=>[m(r,null,{default:c((()=>s[4]||(s[4]=[p("Classes I Manage")]))),_:1})])),_:1}),m(k,null,{default:c((()=>[m(C,{name:"component-fade",mode:"out-in"},{default:c((()=>[(u(!0),g(_,null,v(e.teacherClasses,(t=>(u(),d(A,{key:t._id,value:t},{append:c((()=>[m(w,{size:"small",color:"secondary",loading:void 0!==e.spinnerMap[t._id],to:`/classrooms/${t._id}`},{default:c((()=>s[5]||(s[5]=[p(" Open ")]))),_:2},1032,["loading","to"])])),default:c((()=>[m(h,null,{default:c((()=>[p(y(t.name),1)])),_:2},1024)])),_:2},1032,["value"])))),128))])),_:1})])),_:1})])),_:1})])),_:1})):f("",!0),0===e.studentClasses.length&&0===e.teacherClasses.length?(u(),d(D,{key:2,class:"text-h5 text-center"},{default:c((()=>s[6]||(s[6]=[p(" You are not in any classes! Join your class below if someone has given you a joincode. Or else, start your own! ")]))),_:1})):f("",!0)])),_:1}),m(V,{class:"my-4"}),m(S,{class:"pa-4"},{default:c((()=>[m(D,{cols:"12",sm:"12",md:"8",lg:"6",xl:"6"},{default:c((()=>[m(x,null,{default:c((()=>[m(n,{color:"primary"},{default:c((()=>[m(r,null,{default:c((()=>s[7]||(s[7]=[p("Join a class")]))),_:1})])),_:1}),m(E,null,{default:c((()=>[m(j,{modelValue:e.joinCode,"onUpdate:modelValue":s[0]||(s[0]=s=>e.joinCode=s),label:"Class Code",variant:"outlined"},null,8,["modelValue"]),m(w,{color:"primary",onClick:e.joinClass},{default:c((()=>s[8]||(s[8]=[p("Join")]))),_:1},8,["onClick"])])),_:1})])),_:1})])),_:1})])),_:1}),m(M,{modelValue:e.newClassDialog,"onUpdate:modelValue":s[1]||(s[1]=s=>e.newClassDialog=s),fullscreen:"",transition:"dialog-bottom-transition",scrim:!1},{activator:c((({props:e})=>[m(w,b({color:"primary"},e),{default:c((()=>s[9]||(s[9]=[p("Start a new Class")]))),_:2},1040)])),default:c((()=>[m(U,{onClassroomEditingComplete:e.processResponse},null,8,["onClassroomEditingComplete"])])),_:1},8,["modelValue"])])),_:1})}]]);export{x as default};
2
+ //# sourceMappingURL=Classrooms-Dk081Q6U.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Classrooms-uc9jXghN.js","sources":["../../src/components/Classrooms/CreateClassroom.vue","../../src/views/Classrooms.vue"],"sourcesContent":["<template>\n <v-card>\n <v-toolbar color=\"primary\">\n <v-card-title class=\"text-h6 font-weight-regular\">Start a New Class</v-card-title>\n <v-spacer></v-spacer>\n <v-btn icon @click=\"clearFormAndDismiss\">\n <v-icon>mdi-close</v-icon>\n </v-btn>\n </v-toolbar>\n <v-form>\n <v-container>\n <v-row>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-text-field\n v-model=\"name\"\n counter=\"30\"\n :rules=\"nameRules\"\n label=\"Class Name\"\n required\n hint=\"Eg: Smith, Chemistry, Period 3\"\n ></v-text-field>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-checkbox v-model=\"peerAssist\" label=\"Allow peer instruction\"></v-checkbox>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-select\n v-model=\"birthYear\"\n :items=\"birthYears\"\n label=\"Approximate Birth Year of Students\"\n item-title=\"text\"\n item-value=\"value\"\n ></v-select>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-btn :loading=\"updatePending\" color=\"primary\" @click=\"submit\">Create This Class</v-btn>\n </v-col>\n </v-row>\n </v-container>\n </v-form>\n </v-card>\n</template>\n\n<script lang=\"ts\">\nimport moment from 'moment';\nimport Mousetrap from 'mousetrap';\nimport { log } from '@vue-skuilder/common';\nimport { Status, ClassroomConfig, CreateClassroom, ServerRequestType } from '@vue-skuilder/common';\nimport serverRequest from '../../server';\nimport { alertUser } from '@vue-skuilder/common-ui';\nimport { defineComponent } from 'vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n emits: ['ClassroomEditingComplete'],\n\n data() {\n return {\n mousetrap: new Mousetrap(this.$el),\n peerAssist: true,\n name: '',\n birthYear: undefined as number | undefined,\n id: '',\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 description: '',\n banner: undefined as Blob | undefined,\n thumb: undefined as Blob | undefined,\n updatePending: false,\n birthYears: [] as Array<{\n text: string;\n value: number;\n }>,\n };\n },\n\n created() {\n this.mousetrap.bind('esc', this.clearFormAndDismiss);\n\n const year: number = moment().year();\n\n this.birthYears.push({\n text: `< ${year - 17} (Adult Students)`,\n value: 0,\n });\n\n for (let age = 17; age >= 6; age--) {\n this.birthYears.push({\n text: `${year - age} (Grade ${age - 5})`,\n value: year - age,\n });\n }\n\n this.birthYears.push({\n text: `>${year - 6} (K or younger)`,\n value: year - 5,\n });\n },\n\n methods: {\n async submit() {\n this.updatePending = true;\n const u = await getCurrentUser();\n\n const config: ClassroomConfig = {\n name: this.name,\n teachers: [u.getUsername()],\n students: [],\n birthYear: this.birthYear,\n classMeetingSchedule: '',\n peerAssist: this.peerAssist,\n joinCode: '',\n };\n\n log(`Class Config:\n ${JSON.stringify(config)}`);\n\n const result = await serverRequest<CreateClassroom>({\n data: config,\n type: ServerRequestType.CREATE_CLASSROOM,\n response: null,\n user: u.getUsername(),\n });\n\n if (result.response && result.response.ok) {\n alertUser({\n text: `Class created successfully. Join code: ${result.response.joincode}`,\n status: Status.ok,\n });\n\n u.registerForClassroom(result.response.uuid, 'teacher');\n } else {\n alertUser({\n text: `Failed to create class. Please try again.`,\n status: Status.error,\n });\n }\n\n this.clearFormAndDismiss();\n this.updatePending = false;\n },\n\n clearFormAndDismiss() {\n this.name = '';\n this.description = '';\n\n this.$emit('ClassroomEditingComplete');\n },\n },\n});\n</script>\n","<template>\n <v-container fluid>\n <v-row class=\"pa-4\" justify=\"space-around\">\n <!-- Student Classes -->\n <v-col v-if=\"studentClasses.length > 0\" cols=\"12\" sm=\"12\" md=\"4\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>My Classes</v-toolbar-title>\n </v-toolbar>\n\n <v-list>\n <transition-group name=\"component-fade\" mode=\"out-in\">\n <v-list-item v-for=\"classroom in studentClasses\" :key=\"classroom._id\" :value=\"classroom\">\n <v-list-item-title>\n {{ classroom.name }}\n </v-list-item-title>\n\n <template #append>\n <v-btn\n size=\"small\"\n color=\"secondary\"\n :loading=\"spinnerMap[classroom._id] !== undefined\"\n @click=\"leaveClass(classroom._id)\"\n >\n Leave this class\n </v-btn>\n </template>\n </v-list-item>\n </transition-group>\n </v-list>\n </v-card>\n </v-col>\n\n <!-- Teacher Classes -->\n <v-col v-if=\"teacherClasses.length > 0\" cols=\"12\" sm=\"12\" md=\"4\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>Classes I Manage</v-toolbar-title>\n </v-toolbar>\n\n <v-list>\n <transition-group name=\"component-fade\" mode=\"out-in\">\n <v-list-item v-for=\"classroom in teacherClasses\" :key=\"classroom._id\" :value=\"classroom\">\n <v-list-item-title>\n {{ classroom.name }}\n </v-list-item-title>\n\n <template #append>\n <v-btn\n size=\"small\"\n color=\"secondary\"\n :loading=\"spinnerMap[classroom._id] !== undefined\"\n :to=\"`/classrooms/${classroom._id}`\"\n >\n Open\n </v-btn>\n </template>\n </v-list-item>\n </transition-group>\n </v-list>\n </v-card>\n </v-col>\n\n <!-- Empty State Message -->\n <v-col v-if=\"studentClasses.length === 0 && teacherClasses.length === 0\" class=\"text-h5 text-center\">\n You are not in any classes! Join your class below if someone has given you a joincode. Or else, start your own!\n </v-col>\n </v-row>\n\n <v-divider class=\"my-4\"></v-divider>\n\n <!-- Join Class Form -->\n <v-row class=\"pa-4\">\n <v-col cols=\"12\" sm=\"12\" md=\"8\" lg=\"6\" xl=\"6\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>Join a class</v-toolbar-title>\n </v-toolbar>\n <v-card-text>\n <v-text-field v-model=\"joinCode\" label=\"Class Code\" variant=\"outlined\"></v-text-field>\n <v-btn color=\"primary\" @click=\"joinClass\">Join</v-btn>\n </v-card-text>\n </v-card>\n </v-col>\n </v-row>\n\n <!-- New Class Dialog -->\n <v-dialog v-model=\"newClassDialog\" fullscreen transition=\"dialog-bottom-transition\" :scrim=\"false\">\n <template #activator=\"{ props }\">\n <v-btn color=\"primary\" v-bind=\"props\">Start a new Class</v-btn>\n </template>\n <classroom-editor @classroom-editing-complete=\"processResponse\" />\n </v-dialog>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { Status, ServerRequestType, JoinClassroom, LeaveClassroom, DeleteClassroom } from '@vue-skuilder/common';\nimport { getDataLayer, UserDBInterface } from '@vue-skuilder/db';\nimport serverRequest from '@pui/server/index';\nimport { alertUser } from '@vue-skuilder/common-ui';\nimport ClassroomEditor from '@pui/components/Classrooms/CreateClassroom.vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\ninterface CourseReg {\n _id: string;\n name: string;\n}\n\nexport default defineComponent({\n name: 'ClassroomsView',\n\n components: {\n ClassroomEditor,\n },\n\n beforeRouteEnter(to, from, next) {\n // todo ?\n // See https://router.vuejs.org/guide/advanced/data-fetching.html#fetching-before-navigation\n // this.refreshData().then(() => {\n // next();\n // });\n next();\n },\n\n data() {\n return {\n classes: [] as string[],\n joinCode: '',\n studentClasses: [] as CourseReg[],\n teacherClasses: [] as CourseReg[],\n spinnerMap: {} as { [index: string]: boolean },\n newClassDialog: false,\n user: null as UserDBInterface | null,\n };\n },\n\n created() {\n this.refreshData();\n },\n\n methods: {\n async refreshData() {\n this.$data.user = await getCurrentUser();\n const registrations = (await this.user!.getUserClassrooms()).registrations;\n const studentClasses: CourseReg[] = [];\n const teacherClasses: CourseReg[] = [];\n\n registrations.forEach(async (reg) => {\n const cfg = (\n await getDataLayer().getClassroomDB(\n reg.classID,\n reg.registeredAs == 'teacher' || reg.registeredAs == 'student' ? reg.registeredAs : 'student'\n )\n ).getConfig();\n console.log(`Registered class: ${JSON.stringify(cfg)}`);\n const regItem = {\n _id: reg.classID,\n name: cfg.name,\n };\n\n if (reg.registeredAs === 'student') {\n studentClasses.push(regItem);\n } else if (reg.registeredAs === 'teacher') {\n teacherClasses.push(regItem);\n }\n });\n\n this.studentClasses = studentClasses;\n this.teacherClasses = teacherClasses;\n },\n\n async deleteClass(classId: string) {\n const result = await serverRequest<DeleteClassroom>({\n type: ServerRequestType.DELETE_CLASSROOM,\n user: this.user?.getUsername() || '',\n classID: classId,\n response: null,\n });\n if (result.response && result.response.ok) {\n alertUser({\n text: `Class deleted successfully.`,\n status: Status.ok,\n });\n } else {\n alertUser({\n text: `Failed to delete class. Please try again.`,\n status: Status.error,\n });\n }\n },\n\n async leaveClass(classID: string) {\n this.spinnerMap[classID] = true;\n console.log(`Attempting to drop class: ${classID}`);\n\n const result = await serverRequest<LeaveClassroom>({\n type: ServerRequestType.LEAVE_CLASSROOM,\n data: {\n classID: classID,\n },\n user: this.user?.getUsername() || '',\n response: null,\n });\n if (result.response && result.response.ok) {\n if (this.user) {\n await this.user!.dropFromClassroom(classID);\n }\n }\n\n delete this.spinnerMap[classID];\n this.refreshData();\n },\n\n async joinClass() {\n const result = await serverRequest<JoinClassroom>({\n type: ServerRequestType.JOIN_CLASSROOM,\n data: {\n joinCode: this.joinCode,\n registerAs: 'student',\n user: this.user?.getUsername() || '',\n },\n user: this.user?.getUsername() || '',\n response: null,\n });\n\n if (result.response && result.response.ok) {\n console.log(`Adding registration to userDB...`);\n if (this.user) {\n await registerUserForClassroom(this.user.getUsername(), result.response!.id_course, 'student');\n alertUser({\n text: `Successfully joined class: ${result.response.course_name}.`,\n status: Status.ok,\n });\n } else {\n alertUser({\n text: `Failed to join class. [Unknown current user.]`,\n status: Status.error,\n });\n }\n } else {\n if (result.response) {\n alertUser({\n text: result.response.errorText!,\n status: Status.error,\n });\n }\n }\n this.refreshData();\n },\n\n async processResponse() {\n this.newClassDialog = !this.newClassDialog;\n },\n },\n});\n</script>\n"],"names":["_sfc_main$1","defineComponent","emits","data","mousetrap","Mousetrap","this","$el","peerAssist","name","birthYear","id","nameRules","value","length","description","banner","thumb","updatePending","birthYears","created","bind","clearFormAndDismiss","year","moment","push","text","age","methods","submit","u","getCurrentUser","config","teachers","getUsername","students","classMeetingSchedule","joinCode","log","JSON","stringify","result","serverRequest","type","ServerRequestType","CREATE_CLASSROOM","response","user","ok","alertUser","joincode","status","Status","registerForClassroom","uuid","error","$emit","components","ClassroomEditor","_createBlock","_component_v_card","default","_createVNode","_component_v_toolbar","color","_component_v_card_title","class","_cache","_createTextVNode","_","_component_v_spacer","_component_v_btn","icon","onClick","_ctx","_withCtx","_component_v_icon","_component_v_form","_component_v_container","_component_v_row","_component_v_col","cols","sm","md","_component_v_text_field","modelValue","$event","counter","rules","label","required","hint","_component_v_checkbox","_component_v_select","items","loading","beforeRouteEnter","to","from","next","classes","studentClasses","teacherClasses","spinnerMap","newClassDialog","refreshData","$data","registrations","getUserClassrooms","forEach","async","reg","cfg","getDataLayer","getClassroomDB","classID","registeredAs","getConfig","console","regItem","_id","deleteClass","classId","DELETE_CLASSROOM","leaveClass","LEAVE_CLASSROOM","dropFromClassroom","joinClass","JOIN_CLASSROOM","registerAs","registerUserForClassroom","id_course","course_name","errorText","processResponse","_openBlock","fluid","justify","key","_component_v_toolbar_title","_component_v_list","_TransitionGroup","mode","_createElementBlock","_Fragment","_renderList","classroom","_component_v_list_item","append","size","_component_v_list_item_title","_toDisplayString","_createCommentVNode","_component_v_divider","lg","xl","_component_v_card_text","variant","_component_v_dialog","fullscreen","transition","scrim","activator","props","_mergeProps","_component_classroom_editor","onClassroomEditingComplete"],"mappings":"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"}
1
+ {"version":3,"file":"Classrooms-Dk081Q6U.js","sources":["../../src/components/Classrooms/CreateClassroom.vue","../../src/views/Classrooms.vue"],"sourcesContent":["<template>\n <v-card>\n <v-toolbar color=\"primary\">\n <v-card-title class=\"text-h6 font-weight-regular\">Start a New Class</v-card-title>\n <v-spacer></v-spacer>\n <v-btn icon @click=\"clearFormAndDismiss\">\n <v-icon>mdi-close</v-icon>\n </v-btn>\n </v-toolbar>\n <v-form>\n <v-container>\n <v-row>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-text-field\n v-model=\"name\"\n counter=\"30\"\n :rules=\"nameRules\"\n label=\"Class Name\"\n required\n hint=\"Eg: Smith, Chemistry, Period 3\"\n ></v-text-field>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-checkbox v-model=\"peerAssist\" label=\"Allow peer instruction\"></v-checkbox>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-select\n v-model=\"birthYear\"\n :items=\"birthYears\"\n label=\"Approximate Birth Year of Students\"\n item-title=\"text\"\n item-value=\"value\"\n ></v-select>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-btn :loading=\"updatePending\" color=\"primary\" @click=\"submit\">Create This Class</v-btn>\n </v-col>\n </v-row>\n </v-container>\n </v-form>\n </v-card>\n</template>\n\n<script lang=\"ts\">\nimport moment from 'moment';\nimport Mousetrap from 'mousetrap';\nimport { log } from '@vue-skuilder/common';\nimport { Status, ClassroomConfig, CreateClassroom, ServerRequestType } from '@vue-skuilder/common';\nimport serverRequest from '../../server';\nimport { alertUser } from '@vue-skuilder/common-ui';\nimport { defineComponent } from 'vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n emits: ['ClassroomEditingComplete'],\n\n data() {\n return {\n mousetrap: new Mousetrap(this.$el),\n peerAssist: true,\n name: '',\n birthYear: undefined as number | undefined,\n id: '',\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 description: '',\n banner: undefined as Blob | undefined,\n thumb: undefined as Blob | undefined,\n updatePending: false,\n birthYears: [] as Array<{\n text: string;\n value: number;\n }>,\n };\n },\n\n created() {\n this.mousetrap.bind('esc', this.clearFormAndDismiss);\n\n const year: number = moment().year();\n\n this.birthYears.push({\n text: `< ${year - 17} (Adult Students)`,\n value: 0,\n });\n\n for (let age = 17; age >= 6; age--) {\n this.birthYears.push({\n text: `${year - age} (Grade ${age - 5})`,\n value: year - age,\n });\n }\n\n this.birthYears.push({\n text: `>${year - 6} (K or younger)`,\n value: year - 5,\n });\n },\n\n methods: {\n async submit() {\n this.updatePending = true;\n const u = await getCurrentUser();\n\n const config: ClassroomConfig = {\n name: this.name,\n teachers: [u.getUsername()],\n students: [],\n birthYear: this.birthYear,\n classMeetingSchedule: '',\n peerAssist: this.peerAssist,\n joinCode: '',\n };\n\n log(`Class Config:\n ${JSON.stringify(config)}`);\n\n const result = await serverRequest<CreateClassroom>({\n data: config,\n type: ServerRequestType.CREATE_CLASSROOM,\n response: null,\n user: u.getUsername(),\n });\n\n if (result.response && result.response.ok) {\n alertUser({\n text: `Class created successfully. Join code: ${result.response.joincode}`,\n status: Status.ok,\n });\n\n u.registerForClassroom(result.response.uuid, 'teacher');\n } else {\n alertUser({\n text: `Failed to create class. Please try again.`,\n status: Status.error,\n });\n }\n\n this.clearFormAndDismiss();\n this.updatePending = false;\n },\n\n clearFormAndDismiss() {\n this.name = '';\n this.description = '';\n\n this.$emit('ClassroomEditingComplete');\n },\n },\n});\n</script>\n","<template>\n <v-container fluid>\n <v-row class=\"pa-4\" justify=\"space-around\">\n <!-- Student Classes -->\n <v-col v-if=\"studentClasses.length > 0\" cols=\"12\" sm=\"12\" md=\"4\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>My Classes</v-toolbar-title>\n </v-toolbar>\n\n <v-list>\n <transition-group name=\"component-fade\" mode=\"out-in\">\n <v-list-item v-for=\"classroom in studentClasses\" :key=\"classroom._id\" :value=\"classroom\">\n <v-list-item-title>\n {{ classroom.name }}\n </v-list-item-title>\n\n <template #append>\n <v-btn\n size=\"small\"\n color=\"secondary\"\n :loading=\"spinnerMap[classroom._id] !== undefined\"\n @click=\"leaveClass(classroom._id)\"\n >\n Leave this class\n </v-btn>\n </template>\n </v-list-item>\n </transition-group>\n </v-list>\n </v-card>\n </v-col>\n\n <!-- Teacher Classes -->\n <v-col v-if=\"teacherClasses.length > 0\" cols=\"12\" sm=\"12\" md=\"4\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>Classes I Manage</v-toolbar-title>\n </v-toolbar>\n\n <v-list>\n <transition-group name=\"component-fade\" mode=\"out-in\">\n <v-list-item v-for=\"classroom in teacherClasses\" :key=\"classroom._id\" :value=\"classroom\">\n <v-list-item-title>\n {{ classroom.name }}\n </v-list-item-title>\n\n <template #append>\n <v-btn\n size=\"small\"\n color=\"secondary\"\n :loading=\"spinnerMap[classroom._id] !== undefined\"\n :to=\"`/classrooms/${classroom._id}`\"\n >\n Open\n </v-btn>\n </template>\n </v-list-item>\n </transition-group>\n </v-list>\n </v-card>\n </v-col>\n\n <!-- Empty State Message -->\n <v-col v-if=\"studentClasses.length === 0 && teacherClasses.length === 0\" class=\"text-h5 text-center\">\n You are not in any classes! Join your class below if someone has given you a joincode. Or else, start your own!\n </v-col>\n </v-row>\n\n <v-divider class=\"my-4\"></v-divider>\n\n <!-- Join Class Form -->\n <v-row class=\"pa-4\">\n <v-col cols=\"12\" sm=\"12\" md=\"8\" lg=\"6\" xl=\"6\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>Join a class</v-toolbar-title>\n </v-toolbar>\n <v-card-text>\n <v-text-field v-model=\"joinCode\" label=\"Class Code\" variant=\"outlined\"></v-text-field>\n <v-btn color=\"primary\" @click=\"joinClass\">Join</v-btn>\n </v-card-text>\n </v-card>\n </v-col>\n </v-row>\n\n <!-- New Class Dialog -->\n <v-dialog v-model=\"newClassDialog\" fullscreen transition=\"dialog-bottom-transition\" :scrim=\"false\">\n <template #activator=\"{ props }\">\n <v-btn color=\"primary\" v-bind=\"props\">Start a new Class</v-btn>\n </template>\n <classroom-editor @classroom-editing-complete=\"processResponse\" />\n </v-dialog>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { Status, ServerRequestType, JoinClassroom, LeaveClassroom, DeleteClassroom } from '@vue-skuilder/common';\nimport { getDataLayer, UserDBInterface } from '@vue-skuilder/db';\nimport serverRequest from '@pui/server/index';\nimport { alertUser } from '@vue-skuilder/common-ui';\nimport ClassroomEditor from '@pui/components/Classrooms/CreateClassroom.vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\ninterface CourseReg {\n _id: string;\n name: string;\n}\n\nexport default defineComponent({\n name: 'ClassroomsView',\n\n components: {\n ClassroomEditor,\n },\n\n beforeRouteEnter(to, from, next) {\n // todo ?\n // See https://router.vuejs.org/guide/advanced/data-fetching.html#fetching-before-navigation\n // this.refreshData().then(() => {\n // next();\n // });\n next();\n },\n\n data() {\n return {\n classes: [] as string[],\n joinCode: '',\n studentClasses: [] as CourseReg[],\n teacherClasses: [] as CourseReg[],\n spinnerMap: {} as { [index: string]: boolean },\n newClassDialog: false,\n user: null as UserDBInterface | null,\n };\n },\n\n created() {\n this.refreshData();\n },\n\n methods: {\n async refreshData() {\n this.$data.user = await getCurrentUser();\n const registrations = (await this.user!.getUserClassrooms()).registrations;\n const studentClasses: CourseReg[] = [];\n const teacherClasses: CourseReg[] = [];\n\n registrations.forEach(async (reg) => {\n const cfg = (\n await getDataLayer().getClassroomDB(\n reg.classID,\n reg.registeredAs == 'teacher' || reg.registeredAs == 'student' ? reg.registeredAs : 'student'\n )\n ).getConfig();\n console.log(`Registered class: ${JSON.stringify(cfg)}`);\n const regItem = {\n _id: reg.classID,\n name: cfg.name,\n };\n\n if (reg.registeredAs === 'student') {\n studentClasses.push(regItem);\n } else if (reg.registeredAs === 'teacher') {\n teacherClasses.push(regItem);\n }\n });\n\n this.studentClasses = studentClasses;\n this.teacherClasses = teacherClasses;\n },\n\n async deleteClass(classId: string) {\n const result = await serverRequest<DeleteClassroom>({\n type: ServerRequestType.DELETE_CLASSROOM,\n user: this.user?.getUsername() || '',\n classID: classId,\n response: null,\n });\n if (result.response && result.response.ok) {\n alertUser({\n text: `Class deleted successfully.`,\n status: Status.ok,\n });\n } else {\n alertUser({\n text: `Failed to delete class. Please try again.`,\n status: Status.error,\n });\n }\n },\n\n async leaveClass(classID: string) {\n this.spinnerMap[classID] = true;\n console.log(`Attempting to drop class: ${classID}`);\n\n const result = await serverRequest<LeaveClassroom>({\n type: ServerRequestType.LEAVE_CLASSROOM,\n data: {\n classID: classID,\n },\n user: this.user?.getUsername() || '',\n response: null,\n });\n if (result.response && result.response.ok) {\n if (this.user) {\n await this.user!.dropFromClassroom(classID);\n }\n }\n\n delete this.spinnerMap[classID];\n this.refreshData();\n },\n\n async joinClass() {\n const result = await serverRequest<JoinClassroom>({\n type: ServerRequestType.JOIN_CLASSROOM,\n data: {\n joinCode: this.joinCode,\n registerAs: 'student',\n user: this.user?.getUsername() || '',\n },\n user: this.user?.getUsername() || '',\n response: null,\n });\n\n if (result.response && result.response.ok) {\n console.log(`Adding registration to userDB...`);\n if (this.user) {\n await registerUserForClassroom(this.user.getUsername(), result.response!.id_course, 'student');\n alertUser({\n text: `Successfully joined class: ${result.response.course_name}.`,\n status: Status.ok,\n });\n } else {\n alertUser({\n text: `Failed to join class. [Unknown current user.]`,\n status: Status.error,\n });\n }\n } else {\n if (result.response) {\n alertUser({\n text: result.response.errorText!,\n status: Status.error,\n });\n }\n }\n this.refreshData();\n },\n\n async processResponse() {\n this.newClassDialog = !this.newClassDialog;\n },\n },\n});\n</script>\n"],"names":["_sfc_main$1","defineComponent","emits","data","mousetrap","Mousetrap","this","$el","peerAssist","name","birthYear","id","nameRules","value","length","description","banner","thumb","updatePending","birthYears","created","bind","clearFormAndDismiss","year","moment","push","text","age","methods","submit","u","getCurrentUser","config","teachers","getUsername","students","classMeetingSchedule","joinCode","log","JSON","stringify","result","serverRequest","type","ServerRequestType","CREATE_CLASSROOM","response","user","ok","alertUser","joincode","status","Status","registerForClassroom","uuid","error","$emit","components","ClassroomEditor","_createBlock","_component_v_card","default","_createVNode","_component_v_toolbar","color","_component_v_card_title","class","_cache","_createTextVNode","_","_component_v_spacer","_component_v_btn","icon","onClick","_ctx","_withCtx","_component_v_icon","_component_v_form","_component_v_container","_component_v_row","_component_v_col","cols","sm","md","_component_v_text_field","modelValue","$event","counter","rules","label","required","hint","_component_v_checkbox","_component_v_select","items","loading","beforeRouteEnter","to","from","next","classes","studentClasses","teacherClasses","spinnerMap","newClassDialog","refreshData","$data","registrations","getUserClassrooms","forEach","async","reg","cfg","getDataLayer","getClassroomDB","classID","registeredAs","getConfig","console","regItem","_id","deleteClass","classId","DELETE_CLASSROOM","leaveClass","LEAVE_CLASSROOM","dropFromClassroom","joinClass","JOIN_CLASSROOM","registerAs","registerUserForClassroom","id_course","course_name","errorText","processResponse","_openBlock","fluid","justify","key","_component_v_toolbar_title","_component_v_list","_TransitionGroup","mode","_createElementBlock","_Fragment","_renderList","classroom","_component_v_list_item","append","size","_component_v_list_item_title","_toDisplayString","_createCommentVNode","_component_v_divider","lg","xl","_component_v_card_text","variant","_component_v_dialog","fullscreen","transition","scrim","activator","props","_mergeProps","_component_classroom_editor","onClassroomEditingComplete"],"mappings":"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"}