@vue-skuilder/platform-ui 0.1.30 → 0.1.31-a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/About-BzQmP9L6.js +2 -0
- package/dist/assets/About-BzQmP9L6.js.map +1 -0
- package/dist/assets/AdminDashboard-Btfp3xbX.js +2 -0
- package/dist/assets/AdminDashboard-Btfp3xbX.js.map +1 -0
- package/dist/assets/AdminDashboard-CWnC_vEI.css +1 -0
- package/dist/assets/ClassroomCtrlPanel-Del1NMJ0.js +2 -0
- package/dist/assets/ClassroomCtrlPanel-Del1NMJ0.js.map +1 -0
- package/dist/assets/Classrooms-uc9jXghN.js +2 -0
- package/dist/assets/Classrooms-uc9jXghN.js.map +1 -0
- package/dist/assets/CourseRouter-DfwtPHs0.js +2 -0
- package/dist/assets/CourseRouter-DfwtPHs0.js.map +1 -0
- package/dist/assets/CourseRouter-DuzvSsqI.css +1 -0
- package/dist/assets/Courses-DQW3kca9.css +1 -0
- package/dist/assets/Courses-Iub72F0b.js +2 -0
- package/dist/assets/Courses-Iub72F0b.js.map +1 -0
- package/dist/assets/DataInputFormTester-BL-SAhyy.js +2 -0
- package/dist/assets/DataInputFormTester-BL-SAhyy.js.map +1 -0
- package/dist/assets/EloModeration-B90G61YI.css +1 -0
- package/dist/assets/EloModeration-DK8zrUJv.js +2 -0
- package/dist/assets/EloModeration-DK8zrUJv.js.map +1 -0
- package/dist/assets/JoinCode-CnXEpiOH.js +2 -0
- package/dist/assets/JoinCode-CnXEpiOH.js.map +1 -0
- package/dist/assets/JoinCode-DFiral3R.css +1 -0
- package/dist/assets/NewCourseDialog-4P2ZrBpL.js +2 -0
- package/dist/assets/NewCourseDialog-4P2ZrBpL.js.map +1 -0
- package/dist/assets/ReleaseNotes-CH_BZW3D.js +2 -0
- package/dist/assets/ReleaseNotes-CH_BZW3D.js.map +1 -0
- package/dist/assets/RequestPasswordReset-06j_OmhC.js +2 -0
- package/dist/assets/RequestPasswordReset-06j_OmhC.js.map +1 -0
- package/dist/assets/RequestPasswordReset-Du5-awJG.css +1 -0
- package/dist/assets/ResetPassword-Bm2btF6K.js +2 -0
- package/dist/assets/ResetPassword-Bm2btF6K.js.map +1 -0
- package/dist/assets/Study-Cxxw_AYM.css +1 -0
- package/dist/assets/Study-D3owlaib.js +2 -0
- package/dist/assets/Study-D3owlaib.js.map +1 -0
- package/dist/assets/TagInformation-BpBQo85-.js +2 -0
- package/dist/assets/TagInformation-BpBQo85-.js.map +1 -0
- package/dist/assets/User-NjHri3_k.js +2 -0
- package/dist/assets/User-NjHri3_k.js.map +1 -0
- package/dist/assets/UserStats-B_Oc2Pl5.js +2 -0
- package/dist/assets/UserStats-B_Oc2Pl5.js.map +1 -0
- package/dist/assets/VerifyEmail-C_CXjeU5.js +2 -0
- package/dist/assets/VerifyEmail-C_CXjeU5.js.map +1 -0
- package/dist/assets/edit-ui.es-BX72VVRb.js +2 -0
- package/dist/assets/edit-ui.es-BX72VVRb.js.map +1 -0
- package/dist/assets/index-BHFq3MXV.js +3 -0
- package/dist/assets/index-BHFq3MXV.js.map +1 -0
- package/dist/assets/index-CfLe2ewO.js +3 -0
- package/dist/assets/index-CfLe2ewO.js.map +1 -0
- package/dist/assets/index-kzKpN32E.css +1 -0
- package/dist/assets/mousetrap-BPMmAIzH.js +2 -0
- package/dist/assets/mousetrap-BPMmAIzH.js.map +1 -0
- package/dist/index.html +2 -2
- package/dist/sw.js +1 -1
- package/dist/sw.js.map +1 -1
- package/package.json +7 -9
- package/src/router.ts +24 -19
- package/src/views/Courses.vue +2 -2
- package/dist/assets/index-B6AxCe1N.js +0 -2
- package/dist/assets/index-B6AxCe1N.js.map +0 -1
- package/dist/assets/index-DPLGnI5s.css +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{N as e}from"./NewCourseDialog-4P2ZrBpL.js";import{d as s,l as t,s as r,g as a,_ as o,r as i,c as l,h as n,o as u,w as c,a as d,e as g,t as C,b as h,i as f,j as p,k as m,p as y,q as v,f as w,F as b,n as _}from"./index-CfLe2ewO.js";import{s as x}from"./mousetrap-BPMmAIzH.js";const D=s({name:"CourseStubCard",props:{courseId:{type:String,required:!0}},emits:["refresh"],data:()=>({courseConfig:null,questionCount:0,isPrivate:!1,updatePending:!0,addingCourse:!1}),async created(){try{const e=a().getCourseDB(this.courseId);this.courseConfig=await e.getCourseConfig(),this.isPrivate=!this.courseConfig.public,this.questionCount=(await e.getCourseInfo()).cardCount,this.updatePending=!1}catch(e){console.error(`Error loading course ${this.courseId}: ${e}`)}},methods:{async registerForCourse(){this.addingCourse=!0,t(`Attempting to register for ${this.courseId}.`),await(await r()).registerForCourse(this.courseId),this.$emit("refresh")},navigateToInfo(){const e=`/q/${this.courseConfig?.name.replaceAll(" ","_")}`;this.$router.push(e)}}});const A=s({name:"CoursesView",components:{NewCourseDialog:e,CourseStubCard:o(D,[["render",function(e,s,t,r,a,o){const f=i("v-icon"),p=i("v-card-title"),m=i("v-card-item"),y=i("v-card-text"),v=i("v-btn"),w=i("v-card-actions"),b=i("v-card");return!e.updatePending&&e.courseConfig?(u(),l(b,{key:0,"data-cy":"available-course-card"},{default:c((()=>[d(m,null,{default:c((()=>[d(p,{"data-cy":"course-title"},{default:c((()=>[g(C(e.courseConfig.name)+" ",1),e.isPrivate?(u(),l(f,{key:0,icon:"mdi-eye-off",class:"ml-2"})):n("",!0)])),_:1})])),_:1}),d(y,null,{default:c((()=>[g(" Questions: "+C(e.questionCount)+" ",1),h("p",null,C(e.courseConfig.description),1)])),_:1}),d(w,null,{default:c((()=>[d(v,{color:"primary",onClick:e.navigateToInfo},{default:c((()=>s[0]||(s[0]=[g("More Info")]))),_:1},8,["onClick"]),d(v,{"data-cy":"register-course-button",loading:e.addingCourse,color:"primary",onClick:e.registerForCourse},{default:c((()=>s[1]||(s[1]=[g(" Register ")]))),_:1},8,["loading","onClick"])])),_:1})])),_:1})):n("",!0)}]])},data:()=>({existingCourses:[],registeredCourses:[],awaitingCreateCourse:!1,spinnerMap:{},newCourseDialog:!1,user:null,myQuiltsPanel:0,showAllCourses:!1,coursesPerPage:8}),computed:{availableCourses(){const e=this.existingCourses.filter((e=>!this.registeredCourses.includes(e))),s=this.user?.getUsername();return e.filter((e=>{if(!s)return!1;return e.public||e.creator===s||-1!==e.admins.indexOf(s)||-1!==e.moderators.indexOf(s)}))},displayedAvailableCourses(){return this.showAllCourses?this.availableCourses:this.availableCourses.slice(0,this.coursesPerPage)},hasMoreCourses(){return this.availableCourses.length>this.coursesPerPage},newCourseAttrs(){return{attrs:{"aria-label":"Create new quilt"},on:{click:()=>this.newCourseDialog=!0}}}},async created(){this.user=await r(),this.refreshData()},methods:{processResponse(){this.newCourseDialog=!1,this.refreshData()},toggleShowMore(){this.showAllCourses=!this.showAllCourses},async refreshData(){console.log("Pulling user course data...");try{const e=(await this.user.getCourseRegistrationsDoc()).courses.filter((e=>"active"===e.status||"maintenance-mode"===e.status||void 0===e.status)).map((e=>e.courseID));console.log(`userCourseIDs: ${e}`),this.existingCourses=await a().getCoursesDB().getCourseList(),console.log(`existingCourses: \n\t${this.existingCourses.map((e=>e.name)).join(",\n\t")}`),this.registeredCourses=this.existingCourses.filter((s=>{let t=!1;return e.forEach((e=>{s.courseID===e&&(t=!0)})),t}))}catch(e){console.error("Error refreshing course data:",e),p({status:m.error,text:`Failed to load courses: ${e||"Database access error"}`})}},async createCourse(){this.awaitingCreateCourse=!0;const e=await x({type:f.CREATE_COURSE,data:{name:"testCourseName",description:"All of these courses will be the same!",public:!0,deleted:!1,creator:this.user.getUsername(),admins:[this.user.getUsername()],moderators:[],dataShapes:[],questionTypes:[]},user:this.user.getUsername(),response:null});p({status:e.response,text:`Course ${JSON.stringify(e)} created`}),this.awaitingCreateCourse=!1},async addCourse(e){this.spinnerMap[e]=!0,console.log(`Attempting to register for ${e}.`),await(this.user?.registerForCourse(e)),delete this.spinnerMap[e],this.refreshData()},async dropCourse(e){this.spinnerMap[e]=!0,console.log(`Attempting to drop ${e}.`),await(this.user?.dropCourse(e)),delete this.spinnerMap[e],this.refreshData()}}}),I={class:"d-flex align-center justify-space-between"},k={"data-cy":"registered-course",class:"d-flex align-center"};const P=o(A,[["render",function(e,s,t,r,a,o){const f=i("v-btn"),p=i("v-expansion-panel-title"),m=i("router-link"),x=i("v-icon"),D=i("v-card"),A=i("v-col"),P=i("v-row"),M=i("v-expansion-panel-text"),$=i("v-expansion-panel"),q=i("v-expansion-panels"),S=i("course-stub-card"),R=i("new-course-dialog"),j=i("v-dialog"),E=i("v-container");return u(),l(E,{fluid:""},{default:c((()=>[d(f,y({color:"primary",fixed:"",location:"bottom right",icon:"mdi-plus",size:"large",class:"mb-4 mr-4","data-cy":"create-course-fab"},e.newCourseAttrs,v(e.newCourseAttrs.on)),null,16),d(P,null,{default:c((()=>[d(A,{cols:"12"},{default:c((()=>[d(q,{modelValue:e.myQuiltsPanel,"onUpdate:modelValue":s[0]||(s[0]=s=>e.myQuiltsPanel=s)},{default:c((()=>[d($,null,{default:c((()=>[d(p,{"data-cy":"registered-quilts-panel"},{default:c((()=>s[3]||(s[3]=[g("My Registered Quilts")]))),_:1}),d(M,null,{default:c((()=>[d(P,null,{default:c((()=>[(u(!0),w(b,null,_(e.registeredCourses,(t=>(u(),l(A,{key:t.courseID,cols:"12",sm:"6",md:"4",lg:"3"},{default:c((()=>[d(D,{variant:"outlined",density:"compact",class:"pa-2"},{default:c((()=>[h("div",I,[h("div",k,[d(m,{to:`/q/${t.name.replaceAll(" ","_")}`,class:"text-subtitle-2","data-cy":"registered-course-title"},{default:c((()=>[g(C(t.name),1)])),_:2},1032,["to"]),t.public?n("",!0):(u(),l(x,{key:0,size:"x-small",class:"ml-1"},{default:c((()=>s[4]||(s[4]=[g("mdi-eye-off")]))),_:1}))]),d(f,{size:"x-small",variant:"text",color:"error","data-cy":"drop-course-button",loading:void 0!==e.spinnerMap[t.courseID],onClick:s=>e.dropCourse(t.courseID)},{default:c((()=>s[5]||(s[5]=[g(" Drop ")]))),_:2},1032,["loading","onClick"])])])),_:2},1024)])),_:2},1024)))),128))])),_:1})])),_:1})])),_:1})])),_:1},8,["modelValue"])])),_:1}),d(A,{cols:"12",class:"mt-4"},{default:c((()=>[s[6]||(s[6]=h("h2",{class:"text-h5 mb-3"},"Available Quilts",-1)),d(P,null,{default:c((()=>[(u(!0),w(b,null,_(e.displayedAvailableCourses,(s=>(u(),l(A,{key:s.courseID,cols:"12",sm:"6",md:"4",lg:"3"},{default:c((()=>[d(S,{"data-cy":"available-course-card","course-id":s.courseID,onRefresh:e.refreshData},null,8,["course-id","onRefresh"])])),_:2},1024)))),128))])),_:1}),e.hasMoreCourses?(u(),l(P,{key:0,justify:"center",class:"mt-2"},{default:c((()=>[d(f,{variant:"text",color:"primary","data-cy":"courses-show-more-button",onClick:e.toggleShowMore},{default:c((()=>[g(C(e.showAllCourses?"Show Less":"Show More"),1)])),_:1},8,["onClick"])])),_:1})):n("",!0)])),_:1})])),_:1}),d(j,{modelValue:e.newCourseDialog,"onUpdate:modelValue":s[2]||(s[2]=s=>e.newCourseDialog=s),fullscreen:"",transition:"dialog-bottom-transition",scrim:!1},{default:c((()=>[d(R,{onCourseEditingComplete:s[1]||(s[1]=s=>e.processResponse())})])),_:1},8,["modelValue"])])),_:1})}],["__scopeId","data-v-ba0ad091"]]);export{P as default};
|
|
2
|
+
//# sourceMappingURL=Courses-Iub72F0b.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Courses-Iub72F0b.js","sources":["../../src/components/Courses/CourseStubCard.vue","../../src/views/Courses.vue"],"sourcesContent":["<template>\n <v-card v-if=\"!updatePending && courseConfig\" data-cy=\"available-course-card\">\n <v-card-item>\n <v-card-title data-cy=\"course-title\">\n {{ courseConfig.name }}\n <v-icon v-if=\"isPrivate\" icon=\"mdi-eye-off\" class=\"ml-2\"></v-icon>\n </v-card-title>\n </v-card-item>\n\n <v-card-text>\n Questions: {{ questionCount }}\n <p>{{ courseConfig.description }}</p>\n </v-card-text>\n\n <v-card-actions>\n <v-btn color=\"primary\" @click=\"navigateToInfo\">More Info</v-btn>\n <v-btn data-cy=\"register-course-button\" :loading=\"addingCourse\" color=\"primary\" @click=\"registerForCourse\">\n Register\n </v-btn>\n </v-card-actions>\n </v-card>\n</template>\n\n<script lang=\"ts\">\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\nimport { CourseConfig, log } from '@vue-skuilder/common';\nimport { getDataLayer } from '@vue-skuilder/db';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'CourseStubCard',\n\n props: {\n courseId: {\n type: String,\n required: true,\n },\n },\n emits: ['refresh'],\n\n data() {\n return {\n courseConfig: null as CourseConfig | null,\n questionCount: 0,\n isPrivate: false,\n updatePending: true,\n addingCourse: false,\n };\n },\n\n async created() {\n try {\n const db = getDataLayer().getCourseDB(this.courseId);\n this.courseConfig = (await db.getCourseConfig())!;\n this.isPrivate = !this.courseConfig.public;\n this.questionCount = (await db.getCourseInfo()).cardCount;\n this.updatePending = false;\n } catch (e) {\n console.error(`Error loading course ${this.courseId}: ${e}`);\n }\n },\n\n methods: {\n async registerForCourse() {\n this.addingCourse = true;\n log(`Attempting to register for ${this.courseId}.`);\n await (await getCurrentUser()).registerForCourse(this.courseId);\n this.$emit('refresh');\n },\n navigateToInfo() {\n const path = `/q/${this.courseConfig?.name.replaceAll(' ', '_')}`;\n this.$router.push(path);\n },\n },\n});\n</script>\n","<template>\n <v-container fluid>\n <!-- Fixed Action Button - Updated position classes -->\n <v-btn\n color=\"primary\"\n fixed\n location=\"bottom right\"\n icon=\"mdi-plus\"\n size=\"large\"\n class=\"mb-4 mr-4\"\n data-cy=\"create-course-fab\"\n v-bind=\"newCourseAttrs\"\n v-on=\"newCourseAttrs.on\"\n />\n\n <!-- Main Content Area -->\n <v-row>\n <!-- My Quilts Panel -->\n <v-col cols=\"12\">\n <v-expansion-panels v-model=\"myQuiltsPanel\">\n <v-expansion-panel>\n <v-expansion-panel-title data-cy=\"registered-quilts-panel\">My Registered Quilts</v-expansion-panel-title>\n <v-expansion-panel-text>\n <v-row>\n <v-col v-for=\"course in registeredCourses\" :key=\"course.courseID\" cols=\"12\" sm=\"6\" md=\"4\" lg=\"3\">\n <v-card variant=\"outlined\" density=\"compact\" class=\"pa-2\">\n <div class=\"d-flex align-center justify-space-between\">\n <div data-cy=\"registered-course\" class=\"d-flex align-center\">\n <router-link\n :to=\"`/q/${course.name.replaceAll(' ', '_')}`\"\n class=\"text-subtitle-2\"\n data-cy=\"registered-course-title\"\n >\n {{ course.name }}\n </router-link>\n <v-icon v-if=\"!course.public\" size=\"x-small\" class=\"ml-1\">mdi-eye-off</v-icon>\n </div>\n <v-btn\n size=\"x-small\"\n variant=\"text\"\n color=\"error\"\n data-cy=\"drop-course-button\"\n :loading=\"spinnerMap[course.courseID] !== undefined\"\n @click=\"dropCourse(course.courseID)\"\n >\n Drop\n </v-btn>\n </div>\n </v-card>\n </v-col>\n </v-row>\n </v-expansion-panel-text>\n </v-expansion-panel>\n </v-expansion-panels>\n </v-col>\n\n <!-- Available Quilts Section -->\n <v-col cols=\"12\" class=\"mt-4\">\n <h2 class=\"text-h5 mb-3\">Available Quilts</h2>\n <v-row>\n <v-col v-for=\"course in displayedAvailableCourses\" :key=\"course.courseID\" cols=\"12\" sm=\"6\" md=\"4\" lg=\"3\">\n <course-stub-card data-cy=\"available-course-card\" :course-id=\"course.courseID\" @refresh=\"refreshData\" />\n </v-col>\n </v-row>\n\n <!-- Show More Button -->\n <v-row v-if=\"hasMoreCourses\" justify=\"center\" class=\"mt-2\">\n <v-btn variant=\"text\" color=\"primary\" data-cy=\"courses-show-more-button\" @click=\"toggleShowMore\">\n {{ showAllCourses ? 'Show Less' : 'Show More' }}\n </v-btn>\n </v-row>\n </v-col>\n </v-row>\n\n <!-- New Course Dialog -->\n <v-dialog v-model=\"newCourseDialog\" fullscreen transition=\"dialog-bottom-transition\" :scrim=\"false\">\n <new-course-dialog @course-editing-complete=\"processResponse()\" />\n </v-dialog>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport NewCourseDialog from '@pui/components/Courses/NewCourseDialog.vue';\nimport CourseStubCard from '@pui/components/Courses/CourseStubCard.vue';\n\nimport serverRequest from '../server';\nimport { ServerRequestType, CourseConfig, Status } from '@vue-skuilder/common';\nimport { alertUser, getCurrentUser } from '@vue-skuilder/common-ui';\nimport { UserDBInterface, getDataLayer } from '@vue-skuilder/db';\n\ntype DBCourseConfig = CourseConfig & {\n courseID: string;\n};\n\nexport default defineComponent({\n name: 'CoursesView',\n\n components: {\n NewCourseDialog,\n CourseStubCard,\n },\n\n data() {\n return {\n existingCourses: [] as DBCourseConfig[],\n registeredCourses: [] as DBCourseConfig[],\n awaitingCreateCourse: false,\n spinnerMap: {} as { [key: string]: boolean },\n newCourseDialog: false,\n user: null as UserDBInterface | null,\n myQuiltsPanel: 0, // Controls expansion panel\n showAllCourses: false,\n coursesPerPage: 8,\n };\n },\n\n computed: {\n availableCourses(): DBCourseConfig[] {\n const availableCourses = this.existingCourses.filter((c) => !this.registeredCourses.includes(c));\n const user = this.user?.getUsername();\n\n const viewableCourses = availableCourses.filter((course) => {\n if (!user) {\n return false;\n }\n const viewable: boolean =\n course.public ||\n course.creator === user ||\n course.admins.indexOf(user) !== -1 ||\n course.moderators.indexOf(user) !== -1;\n\n return viewable;\n });\n\n return viewableCourses;\n },\n displayedAvailableCourses(): DBCourseConfig[] {\n if (this.showAllCourses) {\n return this.availableCourses;\n }\n return this.availableCourses.slice(0, this.coursesPerPage);\n },\n\n hasMoreCourses(): boolean {\n return this.availableCourses.length > this.coursesPerPage;\n },\n\n newCourseAttrs() {\n return {\n attrs: {\n 'aria-label': 'Create new quilt',\n },\n on: {\n click: () => (this.newCourseDialog = true),\n },\n };\n },\n },\n\n async created() {\n this.user = await getCurrentUser();\n this.refreshData();\n },\n\n methods: {\n processResponse(): void {\n this.newCourseDialog = false;\n this.refreshData();\n },\n\n toggleShowMore() {\n this.showAllCourses = !this.showAllCourses;\n },\n\n async refreshData(): Promise<void> {\n console.log(`Pulling user course data...`);\n try {\n const userCourseIDs = (await this.user!.getCourseRegistrationsDoc()).courses\n .filter((c) => {\n return c.status === 'active' || c.status === 'maintenance-mode' || c.status === undefined;\n })\n .map((c) => {\n return c.courseID;\n });\n console.log(`userCourseIDs: ${userCourseIDs}`);\n\n this.existingCourses = (await getDataLayer().getCoursesDB().getCourseList()) as DBCourseConfig[];\n console.log(`existingCourses: \\n\\t${this.existingCourses.map((c) => c.name).join(',\\n\\t')}`);\n\n this.registeredCourses = this.existingCourses.filter((course) => {\n let match: boolean = false;\n userCourseIDs.forEach((id: string) => {\n if (course.courseID === id) {\n match = true;\n }\n });\n return match;\n });\n } catch (e) {\n console.error(`Error refreshing course data:`, e);\n alertUser({\n status: Status.error,\n text: `Failed to load courses: ${e || 'Database access error'}`,\n });\n }\n },\n async createCourse(): Promise<void> {\n this.awaitingCreateCourse = true;\n const resp = await serverRequest({\n type: ServerRequestType.CREATE_COURSE,\n data: {\n name: 'testCourseName',\n description: 'All of these courses will be the same!',\n public: true,\n deleted: false,\n creator: this.user!.getUsername(),\n admins: [this.user!.getUsername()],\n moderators: [],\n dataShapes: [],\n questionTypes: [],\n },\n user: this.user!.getUsername(),\n response: null,\n });\n\n alertUser({\n status: resp.response!,\n text: `Course ${JSON.stringify(resp)} created`,\n });\n this.awaitingCreateCourse = false;\n },\n\n async addCourse(course: string): Promise<void> {\n this.spinnerMap[course] = true;\n console.log(`Attempting to register for ${course}.`);\n await this.user?.registerForCourse(course);\n delete this.spinnerMap[course];\n this.refreshData();\n },\n\n async dropCourse(course: string): Promise<void> {\n this.spinnerMap[course] = true;\n console.log(`Attempting to drop ${course}.`);\n await this.user?.dropCourse(course);\n delete this.spinnerMap[course];\n this.refreshData();\n },\n },\n});\n</script>\n\n<style scoped>\n.component-fade-enter-active,\n.component-fade-leave-active {\n transition: all 0.65s ease;\n}\n.component-fade-enter,\n.component-fade-leave-to {\n opacity: 0;\n}\n.componnent-fade-move {\n transition: transform 1s;\n}\n</style>\n"],"names":["_sfc_main$1","defineComponent","name","props","courseId","type","String","required","emits","data","courseConfig","questionCount","isPrivate","updatePending","addingCourse","created","db","getDataLayer","getCourseDB","this","getCourseConfig","public","getCourseInfo","cardCount","e","console","error","methods","registerForCourse","log","getCurrentUser","$emit","navigateToInfo","path","replaceAll","$router","push","_sfc_main","components","NewCourseDialog","CourseStubCard","_ctx","_createBlock","_component_v_card","key","default","_withCtx","_createVNode","_component_v_card_item","_component_v_card_title","_createTextVNode","_toDisplayString","_component_v_icon","icon","class","_createCommentVNode","_","_component_v_card_text","_createElementVNode","description","_component_v_card_actions","_component_v_btn","color","onClick","_cache","loading","existingCourses","registeredCourses","awaitingCreateCourse","spinnerMap","newCourseDialog","user","myQuiltsPanel","showAllCourses","coursesPerPage","computed","availableCourses","filter","c","includes","getUsername","course","creator","admins","indexOf","moderators","displayedAvailableCourses","slice","hasMoreCourses","length","newCourseAttrs","attrs","on","click","refreshData","processResponse","toggleShowMore","userCourseIDs","getCourseRegistrationsDoc","courses","status","map","courseID","getCoursesDB","getCourseList","join","match","forEach","id","alertUser","Status","text","createCourse","resp","serverRequest","ServerRequestType","CREATE_COURSE","deleted","dataShapes","questionTypes","response","JSON","stringify","addCourse","dropCourse","_hoisted_1","_openBlock","_component_v_container","fluid","_mergeProps","fixed","location","size","_toHandlers","_component_v_row","_component_v_col","cols","_component_v_expansion_panels","modelValue","$event","_component_v_expansion_panel","_component_v_expansion_panel_title","_component_v_expansion_panel_text","_createElementBlock","_Fragment","_renderList","sm","md","lg","variant","density","_hoisted_2","_component_router_link","to","_component_course_stub_card","onRefresh","justify","_component_v_dialog","fullscreen","transition","scrim","_component_new_course_dialog","onCourseEditingComplete"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DataInputForm as e}from"./edit-ui.es-BX72VVRb.js";import{d as t,X as o,O as a,_ as n,r as s,f as r,o as i,c}from"./index-CfLe2ewO.js";import"./index-BHFq3MXV.js";const p=Object.assign({}),d=t({name:"DataInputFormTester",components:{DataInputForm:e},setup:()=>({route:a()}),data:()=>({dataShape:null,cds:null,component:null}),async created(){try{const e=`../${this.route.params.pathMatch}/index.ts`;if(console.log("Looking for module:",e),console.log("Available paths:",Object.keys(p)),!(e in p))throw new Error(`No module found at path: ${e}`);{const t=await p[e](),a=Object.entries(t).find((([e,t])=>{const a="function"==typeof t,n=a&&t.prototype instanceof o;return console.log(`Checking export "${e}":`,{isClass:a,extendsQuestion:n,type:typeof t}),n}));if(!a)throw new Error("No export found extending Question class");this.component=a[1];const n=this.component?.dataShapes[0];n&&(this.dataShape=n)}}catch(e){console.log("[difTester] Error loading component",e)}}}),l={key:1};const u=n(d,[["render",function(e,t,o,a,n,p){const d=s("data-input-form");return i(),r("div",null,[e.component&&e.dataShape?(i(),c(d,{key:0,"data-shape":e.dataShape,"course-cfg":{courseID:"testCourse",name:"testCourseName",description:"All of these courses will be the same!",admins:["admin"],creator:"admin",deleted:!1,moderators:[],public:!0,disambiguator:"testCourseName",questionTypes:[],dataShapes:[]},"preview-component":e.component},null,8,["data-shape","preview-component"])):(i(),r("div",l," No component loaded :/ "))])}]]);export{u as default};
|
|
2
|
+
//# sourceMappingURL=DataInputFormTester-BL-SAhyy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataInputFormTester-BL-SAhyy.js","sources":["../../src/dev/DataInputFormTester.vue"],"sourcesContent":["<template>\n <div>\n <data-input-form\n v-if=\"component && dataShape\"\n :data-shape=\"dataShape\"\n :course-cfg=\"{\n courseID: 'testCourse',\n name: 'testCourseName',\n description: 'All of these courses will be the same!',\n admins: ['admin'],\n creator: 'admin',\n deleted: false,\n moderators: [],\n public: true,\n disambiguator: 'testCourseName',\n questionTypes: [],\n dataShapes: [],\n }\"\n :preview-component=\"component\"\n />\n <div v-else>\n No component loaded :/\n <!--\n\n todo: provide list of Question type components, with router links\n to their DataInputFormTester loaders.\n\n --></div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { DataInputForm } from '@vue-skuilder/edit-ui';\nimport { DataShape } from '../../src/base-course/Interfaces/DataShape';\nimport { useRoute } from 'vue-router';\nimport { Question } from '@vue-skuilder/common-ui';\n\ntype CourseShapes = {\n courseID: string;\n dataShapes: DataShape[];\n};\n\nconst questionModules = import.meta.glob('../**/questions/**/index.ts', {\n // Adding eager: false ensures lazy loading\n eager: false,\n});\n\ntype ModuleExports = {\n [key: string]: unknown;\n};\n\nexport default defineComponent({\n name: 'DataInputFormTester',\n\n components: {\n DataInputForm,\n },\n\n setup() {\n return {\n route: useRoute(),\n };\n },\n\n data() {\n return {\n dataShape: null as DataShape | null,\n cds: null as CourseShapes[] | null,\n component: null as typeof Question | null,\n };\n },\n\n async created() {\n try {\n const q = this.route.params.pathMatch;\n const modulePath = `../${q}/index.ts`;\n\n console.log('Looking for module:', modulePath);\n console.log('Available paths:', Object.keys(questionModules));\n\n if (modulePath in questionModules) {\n const module = (await questionModules[modulePath]()) as ModuleExports;\n\n // Find the Question implementation\n const matchingExport = Object.entries(module).find(([name, exportValue]) => {\n const isClass = typeof exportValue === 'function';\n const extendsQuestion = isClass && exportValue.prototype instanceof Question;\n\n console.log(`Checking export \"${name}\":`, {\n isClass,\n extendsQuestion,\n type: typeof exportValue,\n });\n\n return extendsQuestion;\n });\n\n if (!matchingExport) {\n throw new Error('No export found extending Question class');\n }\n\n this.component = matchingExport[1] as typeof Question;\n\n const ds = this.component?.dataShapes[0];\n if (ds) {\n this.dataShape = ds;\n }\n } else {\n throw new Error(`No module found at path: ${modulePath}`);\n }\n } catch (e) {\n console.log('[difTester] Error loading component', e);\n }\n },\n});\n</script>\n"],"names":["questionModules","Object","assign","_sfc_main","defineComponent","name","components","DataInputForm","setup","route","useRoute","data","dataShape","cds","component","created","modulePath","this","params","pathMatch","console","log","keys","Error","module","matchingExport","entries","find","exportValue","isClass","extendsQuestion","prototype","Question","type","ds","dataShapes","e","_hoisted_1","key","_createElementBlock","_ctx","_createBlock","_component_data_input_form","courseID","_openBlock"],"mappings":"yKA2CA,MAAMA,EAAkBC,OAAAC,OAAA,CAAA,GASxBC,EAAeC,EAAgB,CAC7BC,KAAM,sBAENC,WAAY,CAAAC,cACVA,GAGFC,MAAA,KACS,CACLC,MAAOC,MAIXC,KAAA,KACS,CACLC,UAAW,KACXC,IAAK,KACLC,UAAW,OAIf,aAAMC,GACJ,IACE,MACMC,EAAa,MADTC,KAAKR,MAAMS,OAAOC,qBAM5B,GAHAC,QAAQC,IAAI,sBAAuBL,GACnCI,QAAQC,IAAI,mBAAoBpB,OAAOqB,KAAKtB,MAExCgB,KAAchB,GA4BhB,MAAM,IAAIuB,MAAM,4BAA4BP,KA5BX,CACjC,MAAMQ,QAAgBxB,EAAgBgB,KAGhCS,EAAiBxB,OAAOyB,QAAQF,GAAQG,MAAK,EAAEtB,EAAMuB,MACzD,MAAMC,EAAiC,mBAAhBD,EACjBE,EAAkBD,GAAWD,EAAYG,qBAAqBC,EAQpE,OANAZ,QAAQC,IAAI,oBAAoBhB,MAAU,CACxCwB,UACAC,kBACAG,YAAaL,IAGRE,CAAA,IAGT,IAAKL,EACH,MAAM,IAAIF,MAAM,4CAGlBN,KAAKH,UAAYW,EAAe,GAEhC,MAAMS,EAAKjB,KAAKH,WAAWqB,WAAW,GAClCD,IACFjB,KAAKL,UAAYsB,EAErB,CAGF,OAASE,GACPhB,QAAQC,IAAI,sCAAuCe,EACrD,CACF,IAlHFC,EAAA,CAAAC,IAAA,wFACEC,EA2BM,MAAA,KAAA,CAzBIC,EAAA1B,WAAa0B,iBADrBC,EAiBEC,EAAA,CAnBNJ,IAAA,EAIO,aAAYE,EAAA5B,UACZ,aAAY,CAAA+B,SAAA,2NAaZ,oBAAmBH,EAAA1B,WAAA,KAAA,EAAA,CAAA,aAAA,wBAAA8B,IAEtBL,EAOS,MA3BbF,EAoBgB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.component-fade-enter-active[data-v-df68b8b6],.component-fade-leave-active[data-v-df68b8b6]{-webkit-transition:opacity .5s ease;transition:opacity .5s ease}.component-fade-enter[data-v-df68b8b6],.component-fade-leave-to[data-v-df68b8b6]{opacity:0}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as e,S as s,A as a,g as l,_ as d,r as i,c as o,h as t,o as u,w as r,a as c,b as n,e as h}from"./index-CfLe2ewO.js";import{allCourseWare as f}from"./index-BHFq3MXV.js";const p=d(e({name:"ELOModerator",components:{CardLoader:s},props:{courseId:{type:String,required:!0}},data:()=>({courseDB:null,updatePending:!0,courseConfig:null,cards:[],id1:null,id2:null,elo1:null,elo2:null,viewLookup:f.getView}),async created(){this.courseDB=l().getCourseDB(this.courseId),this.courseConfig=await this.courseDB.getCourseConfig(),await this.getNewCards()},methods:{vote(e){if(!this.elo1||!this.elo2)return;const s=a(this.elo1,this.elo2,"a"===e?1:0,{globalOnly:!0});this.courseDB.updateCardElo(this.cards[0].cardId,s.userElo),this.courseDB.updateCardElo(this.cards[1].cardId,s.cardElo),this.getNewCards()},async getNewCards(){this.courseDB&&(this.updatePending=!0,this.cards=await this.courseDB.getInexperiencedCards(),this.id1=null,this.id2=null,this.id1={courseID:this.courseId,cardID:this.cards[0].cardId},this.id2={courseID:this.courseId,cardID:this.cards[1].cardId},this.elo1=this.cards[0].elo,this.elo2=this.cards[1].elo,this.updatePending=!1)}}}),[["render",function(e,s,a,l,d,f){const p=i("v-col"),_=i("v-row"),g=i("v-icon"),v=i("v-btn"),w=i("card-loader"),m=i("v-container");return e.updatePending?t("",!0):(u(),o(m,{key:0},{default:r((()=>[c(_,null,{default:r((()=>[c(p,{cols:"12"},{default:r((()=>s[2]||(s[2]=[n("h1",null,[h("Which seems "),n("em",null,"harder"),h("?")],-1)]))),_:1})])),_:1}),c(_,null,{default:r((()=>[c(p,null,{default:r((()=>[c(v,{color:"success",class:"ma-5",onClick:s[0]||(s[0]=s=>e.vote("a"))},{default:r((()=>[c(g,null,{default:r((()=>s[3]||(s[3]=[h("mdi-check")]))),_:1})])),_:1}),c(w,{class:"ma-2",qualified_id:e.id1,"view-lookup":e.viewLookup},null,8,["qualified_id","view-lookup"])])),_:1})])),_:1}),c(_,null,{default:r((()=>[c(p,null,{default:r((()=>[c(v,{color:"success",class:"ma-5",onClick:s[1]||(s[1]=s=>e.vote("b"))},{default:r((()=>[c(g,null,{default:r((()=>s[4]||(s[4]=[h("mdi-check")]))),_:1})])),_:1}),c(w,{class:"ma-2",qualified_id:e.id2,"view-lookup":e.viewLookup},null,8,["qualified_id","view-lookup"])])),_:1})])),_:1})])),_:1}))}],["__scopeId","data-v-df68b8b6"]]);export{p as default};
|
|
2
|
+
//# sourceMappingURL=EloModeration-DK8zrUJv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EloModeration-DK8zrUJv.js","sources":["../../src/components/Courses/EloModeration.vue"],"sourcesContent":["<template>\n <v-container v-if=\"!updatePending\">\n <v-row>\n <v-col cols=\"12\">\n <h1>Which seems <em>harder</em>?</h1>\n </v-col>\n </v-row>\n\n <v-row>\n <v-col>\n <v-btn color=\"success\" class=\"ma-5\" @click=\"vote('a')\">\n <v-icon>mdi-check</v-icon>\n </v-btn>\n <card-loader class=\"ma-2\" :qualified_id=\"id1\" :view-lookup=\"viewLookup\" />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col>\n <v-btn color=\"success\" class=\"ma-5\" @click=\"vote('b')\">\n <v-icon>mdi-check</v-icon>\n </v-btn>\n <card-loader class=\"ma-2\" :qualified_id=\"id2\" :view-lookup=\"viewLookup\" />\n </v-col>\n </v-row>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { CardLoader } from '@vue-skuilder/common-ui';\nimport { allCourseWare } from '@vue-skuilder/courseware';\nimport { CourseElo, adjustCourseScores, CourseConfig } from '@vue-skuilder/common';\nimport { CourseDBInterface, getDataLayer, QualifiedCardID } from '@vue-skuilder/db';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'ELOModerator',\n\n components: {\n CardLoader,\n },\n\n props: {\n courseId: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n courseDB: null as CourseDBInterface | null,\n updatePending: true,\n courseConfig: null as CourseConfig | null,\n cards: [] as {\n courseId: string;\n cardId: string;\n elo: CourseElo;\n count: number;\n }[],\n id1: null as QualifiedCardID | null,\n id2: null as QualifiedCardID | null,\n elo1: null as CourseElo | null,\n elo2: null as CourseElo | null,\n viewLookup: allCourseWare.getView,\n };\n },\n\n async created() {\n this.courseDB = getDataLayer().getCourseDB(this.courseId);\n\n this.courseConfig = (await this.courseDB!.getCourseConfig())!;\n await this.getNewCards();\n },\n\n methods: {\n vote(x: 'a' | 'b') {\n if (!this.elo1 || !this.elo2) return;\n\n const scores = adjustCourseScores(this.elo1, this.elo2, x === 'a' ? 1 : 0, {\n globalOnly: true,\n });\n\n this.courseDB!.updateCardElo(this.cards[0].cardId, scores.userElo);\n this.courseDB!.updateCardElo(this.cards[1].cardId, scores.cardElo);\n\n this.getNewCards();\n },\n\n async getNewCards() {\n if (!this.courseDB) return;\n\n this.updatePending = true;\n this.cards = await this.courseDB!.getInexperiencedCards();\n\n // console.log('Comparing:\\n\\t' + JSON.stringify(this.cards));\n\n this.id1 = null;\n this.id2 = null;\n\n this.id1 = {\n courseID: this.courseId,\n cardID: this.cards[0].cardId,\n };\n this.id2 = {\n courseID: this.courseId,\n cardID: this.cards[1].cardId,\n };\n\n this.elo1 = this.cards[0].elo;\n this.elo2 = this.cards[1].elo;\n\n this.updatePending = false;\n },\n },\n});\n</script>\n\n<style scoped>\n.component-fade-enter-active,\n.component-fade-leave-active {\n transition: opacity 0.5s ease;\n}\n.component-fade-enter, .component-fade-leave-to\n/* .component-fade-leave-active below version 2.1.8 */ {\n opacity: 0;\n}\n</style>\n"],"names":["defineComponent","name","components","CardLoader","props","courseId","type","String","required","data","courseDB","updatePending","courseConfig","cards","id1","id2","elo1","elo2","viewLookup","allCourseWare","getView","created","this","getDataLayer","getCourseDB","getCourseConfig","getNewCards","methods","vote","x","scores","adjustCourseScores","globalOnly","updateCardElo","cardId","userElo","cardElo","getInexperiencedCards","courseID","cardID","elo","_ctx","_createCommentVNode","_openBlock","_createBlock","_component_v_container","key","default","_withCtx","_createVNode","_component_v_row","_component_v_col","cols","_cache","_createElementVNode","_createTextVNode","_","_component_v_btn","color","class","onClick","_component_v_icon","_component_card_loader","qualified_id"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as s,g as o,l as e,_ as a,r as t,c as l,o as i,w as r,a as c,f as n,t as d}from"./index-CfLe2ewO.js";const f=s({name:"JoinCode",props:{classroomId:{type:String,required:!0}},data:()=>({classroomCfg:null,classroomDB:null,updatePending:!0}),async created(){const s=o();this.classroomDB=await s.getClassroomDB(this.classroomId,"teacher"),this.classroomCfg=this.classroomDB.getConfig(),await Promise.all([]),e(`Route loaded w/ (prop) _id: ${this.classroomId}`),e(`Config:\n ${JSON.stringify(this.classroomCfg)}`),this.updatePending=!1},methods:{close(){this.$router.back()}}}),g={key:0,class:"join-code"};const m=a(f,[["render",function(s,o,e,a,f,m){const u=t("v-btn"),h=t("v-progress-circular"),p=t("v-col"),C=t("v-row"),v=t("v-container");return i(),l(v,{fluid:"",class:"fill-height pa-0"},{default:r((()=>[c(u,{icon:"mdi-close",color:"red",variant:"elevated",class:"close-btn",onClick:s.close},null,8,["onClick"]),c(C,{align:"center",justify:"center",class:"fill-height"},{default:r((()=>[c(p,{cols:"12",class:"text-center"},{default:r((()=>[s.updatePending?(i(),l(h,{key:1,indeterminate:"",size:"64"})):(i(),n("div",g,d(s.classroomCfg?.joinCode),1))])),_:1})])),_:1})])),_:1})}]]);export{m as default};
|
|
2
|
+
//# sourceMappingURL=JoinCode-CnXEpiOH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JoinCode-CnXEpiOH.js","sources":["../../src/components/Classrooms/JoinCode.vue"],"sourcesContent":["<template>\n <v-container fluid class=\"fill-height pa-0\">\n <!-- Close button in top-right corner -->\n <v-btn icon=\"mdi-close\" color=\"red\" variant=\"elevated\" class=\"close-btn\" @click=\"close\"> </v-btn>\n\n <!-- Main content -->\n <v-row align=\"center\" justify=\"center\" class=\"fill-height\">\n <v-col cols=\"12\" class=\"text-center\">\n <div v-if=\"!updatePending\" class=\"join-code\">\n {{ classroomCfg?.joinCode }}\n </div>\n <v-progress-circular v-else indeterminate size=\"64\"></v-progress-circular>\n </v-col>\n </v-row>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { log } from '@vue-skuilder/common';\nimport { TeacherClassroomDBInterface, getDataLayer } from '@vue-skuilder/db';\nimport { ClassroomConfig } from '@vue-skuilder/common';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'JoinCode',\n\n props: {\n classroomId: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n classroomCfg: null as ClassroomConfig | null,\n classroomDB: null as TeacherClassroomDBInterface | null,\n updatePending: true,\n };\n },\n\n async created() {\n const dl = getDataLayer();\n\n this.classroomDB = await dl.getClassroomDB(this.classroomId, 'teacher');\n this.classroomCfg = this.classroomDB.getConfig();\n await Promise.all([]);\n log(`Route loaded w/ (prop) _id: ${this.classroomId}`);\n log(`Config:\n ${JSON.stringify(this.classroomCfg)}`);\n this.updatePending = false;\n },\n\n methods: {\n close() {\n this.$router.back();\n },\n },\n});\n</script>\n\n<style>\n.close-btn {\n position: fixed;\n top: 80px;\n right: 16px;\n z-index: 100;\n}\n\n.join-code {\n font-size: 8rem;\n font-weight: bold;\n line-height: 1.2;\n letter-spacing: 0.1em;\n}\n\n/* Responsive adjustments */\n@media (max-width: 600px) {\n .join-code {\n font-size: 4rem;\n }\n}\n</style>\n"],"names":["_sfc_main","defineComponent","name","props","classroomId","type","String","required","data","classroomCfg","classroomDB","updatePending","created","dl","getDataLayer","this","getClassroomDB","getConfig","Promise","all","log","JSON","stringify","methods","close","$router","back","key","class","_createBlock","_component_v_container","fluid","default","_withCtx","_createVNode","_component_v_btn","icon","color","variant","onClick","_ctx","_component_v_row","align","justify","_component_v_col","cols","_component_v_progress_circular","indeterminate","size","_openBlock","_createElementBlock","_hoisted_1","_toDisplayString","joinCode","_"],"mappings":"8GAuBA,MAAAA,EAAeC,EAAgB,CAC7BC,KAAM,WAENC,MAAO,CACLC,YAAa,CACXC,KAAMC,OACNC,UAAU,IAIdC,KAAA,KACS,CACLC,aAAc,KACdC,YAAa,KACbC,eAAe,IAInB,aAAMC,GACJ,MAAMC,EAAKC,IAEXC,KAAKL,kBAAoBG,EAAGG,eAAeD,KAAKX,YAAa,WAC7DW,KAAKN,aAAeM,KAAKL,YAAYO,kBAC/BC,QAAQC,IAAI,IAClBC,EAAI,+BAA+BL,KAAKX,eACxCgB,EAAI,gBACFC,KAAKC,UAAUP,KAAKN,iBACtBM,KAAKJ,eAAgB,CACvB,EAEAY,QAAS,CACP,KAAAC,GACET,KAAKU,QAAQC,MACf,QAxDJC,IAAA,EAQmCC,MAAM,gKAPvCC,EAacC,EAAA,CAbDC,MAAA,GAAMH,MAAM,oBAAA,CAD3BI,QAAAC,GAGI,IAAiG,CAAjGC,EAAiGC,EAAA,CAA1FC,KAAK,YAAYC,MAAM,MAAMC,QAAQ,WAAWV,MAAM,YAAaW,QAAOC,EAAAhB,OAAA,KAAA,EAAA,CAAA,YAGjFU,EAOQO,EAAA,CAPDC,MAAM,SAASC,QAAQ,SAASf,MAAM,eAAA,CANjDI,QAAAC,GAOM,IAKQ,CALRC,EAKQU,EAAA,CALDC,KAAK,KAAKjB,MAAM,eAAA,CAP7BI,QAAAC,GAQQ,IAEM,CAFMO,EAAA7B,mBAGZkB,EAA0EiB,EAAA,CAXlFnB,IAAA,EAWoCoB,cAAA,GAAcC,KAAK,SAHnCC,IAAZC,EAEM,MAFNC,EAEMC,EADDZ,EAAA/B,cAAc4C,iBAT3BC,EAAA,OAAAA,EAAA,OAAAA,EAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.close-btn{position:fixed;top:80px;right:16px;z-index:100}.join-code{font-size:8rem;font-weight:700;line-height:1.2;letter-spacing:.1em}@media (max-width: 600px){.join-code{font-size:4rem}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{s as e,M as s}from"./mousetrap-BPMmAIzH.js";import{d as t,s as a,i,j as o,_ as r,r as l,c as d,o as u,w as n,a as c,e as m,b as p}from"./index-CfLe2ewO.js";const h=r(t({name:"NewCourseDialog",props:{name:{type:String,required:!1,default:""}},emits:["CourseEditingComplete"],data(){return{mousetrap:new s(this.$el),id:"",courseName:"",description:"",publicCourse:!1,deleted:!1,admins:[],moderators:[],dataShapes:[],questionTypes:[],banner:void 0,thumb:void 0,updatePending:!1,nameRules:[e=>!(e.length>30)||"Course name must be 30 characters or less"]}},created(){this.mousetrap.bind("esc",this.clearFormAndDismiss)},methods:{async submit(){this.updatePending=!0;const s=await a(),t={name:this.courseName,description:this.description,public:this.publicCourse,deleted:this.deleted,creator:s.getUsername(),admins:this.admins,moderators:this.moderators,dataShapes:this.dataShapes,questionTypes:this.questionTypes},r=await e({data:t,type:i.CREATE_COURSE,response:null,user:s.getUsername()});r.response&&r.response.ok?(o({text:`Course ${this.courseName} created.`,status:r.response.status}),this.clearFormAndDismiss()):(o({text:`Failed to create course ${this.courseName}.`,status:r.response.status}),console.warn(`Resp: ${JSON.stringify(r.response)}`)),this.updatePending=!1},clearFormAndDismiss(){this.description="",this.publicCourse=!1,this.deleted=!1,this.admins=[],this.moderators=[],this.$emit("CourseEditingComplete")}}}),[["render",function(e,s,t,a,i,o){const r=l("v-card-title"),h=l("v-spacer"),b=l("v-icon"),v=l("v-btn"),f=l("v-toolbar"),g=l("v-text-field"),C=l("v-row"),y=l("v-textarea"),_=l("v-radio"),w=l("v-radio-group"),N=l("v-container"),q=l("v-form"),S=l("v-card");return u(),d(S,null,{default:n((()=>[c(f,{flat:"",color:"primary",dark:""},{default:n((()=>[c(r,{class:"text-h6 font-weight-regular"},{default:n((()=>s[3]||(s[3]=[m(" Start a New Quilt ")]))),_:1}),c(h),c(v,{icon:"",onClick:e.clearFormAndDismiss},{default:n((()=>[c(b,{icon:"mdi-close"})])),_:1},8,["onClick"])])),_:1}),c(q,null,{default:n((()=>[c(N,null,{default:n((()=>[c(C,{class:"cols sm md"},{default:n((()=>[c(g,{modelValue:e.courseName,"onUpdate:modelValue":s[0]||(s[0]=s=>e.courseName=s),counter:"30",rules:e.nameRules,label:"Quilt Name",required:"",hint:"Short and descriptive","data-cy":"course-name-input"},null,8,["modelValue","rules"])])),_:1}),c(C,{class:"cols sm md"},{default:n((()=>[c(y,{modelValue:e.description,"onUpdate:modelValue":s[1]||(s[1]=s=>e.description=s),variant:"outlined",counter:"300","auto-grow":"",label:"Quilt Description",hint:"Describe the course. What subject is covered? Who might be interested?","data-cy":"course-description-input"},null,8,["modelValue"])])),_:1}),c(C,{class:"cols sm md"},{default:n((()=>[s[4]||(s[4]=p("label",null,"Public or private quilt?",-1)),c(w,{modelValue:e.publicCourse,"onUpdate:modelValue":s[2]||(s[2]=s=>e.publicCourse=s),required:"",hint:"Private quilts can be shared and collaborated on with other individual users, but will not be accessable without an invitation. A private quilt can be made public later.","persistent-hint":"",inline:"","data-cy":"course-visibility-radio"},{default:n((()=>[c(_,{label:"Public",value:!0,"data-cy":"public-radio"}),c(_,{label:"Private",value:!1,"data-cy":"private-radio"})])),_:1},8,["modelValue"])])),_:1}),c(C,{class:"cols sm md"},{default:n((()=>[c(v,{loading:e.updatePending,color:"primary","data-cy":"save-course-button",onClick:e.submit},{default:n((()=>s[5]||(s[5]=[m(" Save Course Changes ")]))),_:1},8,["loading","onClick"])])),_:1})])),_:1})])),_:1})])),_:1})}]]);export{h as N};
|
|
2
|
+
//# sourceMappingURL=NewCourseDialog-4P2ZrBpL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewCourseDialog-4P2ZrBpL.js","sources":["../../src/components/Courses/NewCourseDialog.vue"],"sourcesContent":["<template>\n <v-card>\n <v-toolbar flat color=\"primary\" dark>\n <v-card-title class=\"text-h6 font-weight-regular\"> Start a New Quilt </v-card-title>\n <v-spacer></v-spacer>\n <v-btn icon @click=\"clearFormAndDismiss\">\n <v-icon icon=\"mdi-close\"></v-icon>\n </v-btn>\n </v-toolbar>\n <v-form>\n <v-container>\n <v-row class=\"cols sm md\">\n <v-text-field\n v-model=\"courseName\"\n counter=\"30\"\n :rules=\"nameRules\"\n label=\"Quilt Name\"\n required\n hint=\"Short and descriptive\"\n data-cy=\"course-name-input\"\n ></v-text-field>\n </v-row>\n <v-row class=\"cols sm md\">\n <v-textarea\n v-model=\"description\"\n variant=\"outlined\"\n counter=\"300\"\n auto-grow\n label=\"Quilt Description\"\n hint=\"Describe the course. What subject is covered? Who might be interested?\"\n data-cy=\"course-description-input\"\n >\n </v-textarea>\n </v-row>\n <v-row class=\"cols sm md\">\n <label>Public or private quilt?</label>\n <v-radio-group\n v-model=\"publicCourse\"\n required\n hint=\"Private quilts can be shared and collaborated on with other individual users, but will not be accessable without an invitation. A private quilt can be made public later.\"\n persistent-hint\n inline\n data-cy=\"course-visibility-radio\"\n >\n <v-radio label=\"Public\" :value=\"true\" data-cy=\"public-radio\"></v-radio>\n <v-radio label=\"Private\" :value=\"false\" data-cy=\"private-radio\"></v-radio>\n </v-radio-group>\n </v-row>\n <v-row class=\"cols sm md\">\n <v-btn :loading=\"updatePending\" color=\"primary\" data-cy=\"save-course-button\" @click=\"submit\">\n Save Course Changes\n </v-btn>\n </v-row>\n </v-container>\n </v-form>\n </v-card>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport Mousetrap from 'mousetrap';\nimport serverRequest from '../../server';\nimport { CourseConfig, CreateCourse, DataShape55, QuestionType55, ServerRequestType } from '@vue-skuilder/common';\nimport { alertUser, getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'NewCourseDialog',\n\n props: {\n name: {\n type: String,\n required: false,\n default: '',\n },\n },\n\n emits: ['CourseEditingComplete'],\n\n data() {\n return {\n mousetrap: new Mousetrap(this.$el),\n id: '',\n courseName: '',\n description: '',\n publicCourse: false,\n deleted: false,\n admins: [] as string[],\n moderators: [] as string[],\n dataShapes: [] as DataShape55[],\n questionTypes: [] as QuestionType55[],\n banner: undefined as Blob | undefined,\n thumb: undefined as Blob | undefined,\n updatePending: false,\n nameRules: [\n (value: string): string | boolean => {\n const max = 30;\n if (value.length > max) {\n return `Course name must be ${max} characters or less`;\n } else {\n return true;\n }\n },\n ],\n };\n },\n\n created() {\n this.mousetrap.bind('esc', this.clearFormAndDismiss);\n },\n\n methods: {\n async submit() {\n this.updatePending = true;\n\n const u = await getCurrentUser();\n\n const config: CourseConfig = {\n name: this.courseName,\n description: this.description,\n public: this.publicCourse,\n deleted: this.deleted,\n creator: u.getUsername(),\n admins: this.admins,\n moderators: this.moderators,\n dataShapes: this.dataShapes,\n questionTypes: this.questionTypes,\n };\n\n const result = await serverRequest<CreateCourse>({\n data: config,\n type: ServerRequestType.CREATE_COURSE,\n response: null,\n user: u.getUsername(),\n });\n\n if (result.response && result.response.ok) {\n alertUser({\n text: `Course ${this.courseName} created.`,\n status: result.response!.status,\n });\n this.clearFormAndDismiss();\n } else {\n alertUser({\n text: `Failed to create course ${this.courseName}.`,\n status: result.response!.status,\n });\n console.warn(`Resp: ${JSON.stringify(result.response)}`);\n }\n\n this.updatePending = false;\n },\n\n clearFormAndDismiss() {\n this.description = '';\n this.publicCourse = false;\n this.deleted = false;\n this.admins = [];\n this.moderators = [];\n\n this.$emit('CourseEditingComplete');\n },\n },\n});\n</script>\n"],"names":["defineComponent","name","props","type","String","required","default","emits","data","mousetrap","Mousetrap","this","$el","id","courseName","description","publicCourse","deleted","admins","moderators","dataShapes","questionTypes","banner","thumb","updatePending","nameRules","value","length","created","bind","clearFormAndDismiss","methods","submit","u","getCurrentUser","config","public","creator","getUsername","result","serverRequest","ServerRequestType","CREATE_COURSE","response","user","ok","alertUser","text","status","console","warn","JSON","stringify","$emit","_createBlock","_component_v_card","_createVNode","_component_v_toolbar","flat","color","dark","_withCtx","_component_v_card_title","class","_cache","_createTextVNode","_","_component_v_spacer","_component_v_btn","icon","onClick","_ctx","_component_v_icon","_component_v_form","_component_v_container","_component_v_row","_component_v_text_field","modelValue","$event","counter","rules","label","hint","_component_v_textarea","variant","_createElementVNode","_component_v_radio_group","inline","_component_v_radio","loading"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as e,_ as s,f as l,o as a,b as t}from"./index-CfLe2ewO.js";const n=s(e({name:"ReleaseNotes"}),[["render",function(e,s,n,o,r,u){return a(),l("div",null,s[0]||(s[0]=[t("h1",{class:"text-h2 mb-6"},"Release Notes",-1),t("h3",{class:"text-h4 mb-4"},"0.0.1 - April 21",-1),t("ul",null,[t("li",null,"Hello world, these are release notes.")],-1)]))}]]);export{n as default};
|
|
2
|
+
//# sourceMappingURL=ReleaseNotes-CH_BZW3D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReleaseNotes-CH_BZW3D.js","sources":["../../src/views/ReleaseNotes.vue"],"sourcesContent":["<template>\n <div>\n <h1 class=\"text-h2 mb-6\">Release Notes</h1>\n\n <h3 class=\"text-h4 mb-4\">0.0.1 - April 21</h3>\n <ul>\n <li>Hello world, these are release notes.</li>\n </ul>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'ReleaseNotes',\n});\n</script>\n\n<style scoped></style>\n"],"names":["defineComponent","name","_createElementBlock","_cache","_createElementVNode","class"],"mappings":"8EAceA,EAAgB,CAC7BC,KAAM,6DAdNC,EAOM,MAAA,KAAAC,EAAA,KAAAA,EAAA,GAAA,CANJC,EAA2C,KAAA,CAAvCC,MAAM,gBAAe,iBAAa,GAEtCD,EAA8C,KAAA,CAA1CC,MAAM,gBAAe,oBAAgB,GACzCD,EAEK,KAAA,KAAA,CADHA,EAA8C,UAA1C,2CAAqC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as e,V as s,_ as o,r as a,c as n,o as t,w as r,a as c}from"./index-CfLe2ewO.js";const d=o(e({name:"RequestPasswordResetView",components:{RequestPasswordReset:s},methods:{handleSuccess(e){console.log(`Password reset email sent to ${e}`)},goToLogin(){this.$router.push({name:"login"})}}}),[["render",function(e,s,o,d,l,u){const i=a("request-password-reset",!0),g=a("v-container");return t(),n(g,{class:"d-flex align-center request-reset"},{default:r((()=>[c(i,{onCancel:e.goToLogin,onSuccess:e.handleSuccess},null,8,["onCancel","onSuccess"])])),_:1})}],["__scopeId","data-v-111f280a"]]);export{d as default};
|
|
2
|
+
//# sourceMappingURL=RequestPasswordReset-06j_OmhC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestPasswordReset-06j_OmhC.js","sources":["../../src/views/RequestPasswordReset.vue"],"sourcesContent":["<template>\n <v-container class=\"d-flex align-center request-reset\">\n <request-password-reset @cancel=\"goToLogin\" @success=\"handleSuccess\" />\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { RequestPasswordReset } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'RequestPasswordResetView',\n\n components: {\n RequestPasswordReset,\n },\n\n methods: {\n handleSuccess(email: string) {\n console.log(`Password reset email sent to ${email}`);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n },\n});\n</script>\n\n<style lang=\"css\" scoped>\n.request-reset {\n max-width: 650px;\n}\n</style>\n"],"names":["defineComponent","name","components","RequestPasswordReset","methods","handleSuccess","email","console","log","goToLogin","this","$router","push","_createBlock","_component_v_container","class","default","_createVNode","_component_request_password_reset","onCancel","_ctx","onSuccess","_"],"mappings":"mGAUeA,EAAgB,CAC7BC,KAAM,2BAENC,WAAY,CAAAC,qBACVA,GAGFC,QAAS,CACP,aAAAC,CAAcC,GACZC,QAAQC,IAAI,gCAAgCF,IAC9C,EAEA,SAAAG,GACEC,KAAKC,QAAQC,KAAK,CAAEX,KAAM,SAC5B,2GAvBFY,EAEcC,EAAA,CAFDC,MAAM,qCAAmC,CADxDC,WAEI,IAAuE,CAAvEC,EAAuEC,EAAA,CAA9CC,SAAQC,EAAAX,UAAYY,UAASD,EAAAf,eAAA,KAAA,EAAA,CAAA,WAAA,iBAF1DiB,EAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.request-reset[data-v-111f280a]{max-width:650px}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as o,W as e,_ as s,r,c as n,o as a,w as t,a as l,e as c}from"./index-CfLe2ewO.js";const d=s(o({name:"ResetPasswordView",components:{ResetPassword:e},methods:{handleComplete(){console.log("Password reset successfully")},handleError(o){console.error("Password reset error:",o)},goToLogin(){this.$router.push({name:"login"})}}}),[["render",function(o,e,s,d,i,m){const p=r("v-btn"),u=r("reset-password",!0);return a(),n(u,{onComplete:o.handleComplete,onError:o.handleError},{"success-action":t((()=>[l(p,{color:"primary",onClick:o.goToLogin},{default:t((()=>e[0]||(e[0]=[c(" Continue to Login ")]))),_:1},8,["onClick"])])),_:1},8,["onComplete","onError"])}]]);export{d as default};
|
|
2
|
+
//# sourceMappingURL=ResetPassword-Bm2btF6K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResetPassword-Bm2btF6K.js","sources":["../../src/views/ResetPassword.vue"],"sourcesContent":["<template>\n <reset-password @complete=\"handleComplete\" @error=\"handleError\">\n <template #success-action>\n <v-btn color=\"primary\" @click=\"goToLogin\">\n Continue to Login\n </v-btn>\n </template>\n </reset-password>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { ResetPassword } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'ResetPasswordView',\n\n components: {\n ResetPassword,\n },\n\n methods: {\n handleComplete() {\n console.log('Password reset successfully');\n },\n\n handleError(error: string) {\n console.error('Password reset error:', error);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n },\n});\n</script>\n"],"names":["defineComponent","name","components","ResetPassword","methods","handleComplete","console","log","handleError","error","goToLogin","this","$router","push","_createBlock","_component_reset_password","onComplete","_ctx","onError","_withCtx","_createVNode","_component_v_btn","color","onClick","default","_cache","_createTextVNode","_"],"mappings":"qGAceA,EAAgB,CAC7BC,KAAM,oBAENC,WAAY,CAAAC,cACVA,GAGFC,QAAS,CACP,cAAAC,GACEC,QAAQC,IAAI,8BACd,EAEA,WAAAC,CAAYC,GACVH,QAAQG,MAAM,wBAAyBA,EACzC,EAEA,SAAAC,GACEC,KAAKC,QAAQC,KAAK,CAAEZ,KAAM,SAC5B,6FA/BFa,EAMiBC,EAAA,CANAC,WAAUC,EAAAZ,eAAiBa,QAAOD,EAAAT,aAAA,CACtC,iBAAcW,GACvB,IAEQ,CAFRC,EAEQC,EAAA,CAFDC,MAAM,UAAWC,QAAON,EAAAP,WAAA,CAHrCc,QAAAL,GAGgD,IAE1CM,EAAA,KAAAA,EAAA,GAAA,CALNC,EAGgD,2BAHhDC,EAAA,GAAA,EAAA,CAAA,eAAAA,EAAA,GAAA,EAAA,CAAA,aAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.session-layout[data-v-c5ff4b5f]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.fixed-controls-container[data-v-c5ff4b5f]{width:100%;margin-bottom:20px}.fixed-controls[data-v-c5ff4b5f]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.time-limit-field[data-v-c5ff4b5f]{width:100%;margin-bottom:16px}.start-btn[data-v-c5ff4b5f]{margin-top:8px;max-height:150px}.course-selection-container[data-v-c5ff4b5f]{width:100%}.course-row[data-v-c5ff4b5f]{border-bottom:1px solid rgba(var(--v-border-color),.12);padding:8px 0}.course-row-header[data-v-c5ff4b5f]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;gap:16px}.course-row-actions[data-v-c5ff4b5f]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px}.reviews-count[data-v-c5ff4b5f]{min-width:32px;text-align:center;color:rgba(var(--v-theme-on-surface),.6)}.tag-filter-container[data-v-c5ff4b5f]{padding:12px 0 12px 32px;background-color:rgba(var(--v-theme-surface-variant),.3);border-radius:4px;margin-top:8px}.select-all-row[data-v-c5ff4b5f]{padding-top:8px;border-top:2px solid rgba(var(--v-border-color),.24)}.filter-summary[data-v-c5ff4b5f]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:8px 12px;background-color:rgba(var(--v-theme-primary),.08);border-radius:4px}@media (min-width: 960px){.session-layout[data-v-c5ff4b5f]{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:40px}.fixed-controls-container[data-v-c5ff4b5f]{width:300px;-ms-flex-negative:0;flex-shrink:0}.fixed-controls[data-v-c5ff4b5f]{position:sticky;top:20px;padding-left:20px}.course-selection-container[data-v-c5ff4b5f]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;border-right:1px solid rgba(0,0,0,.12);padding-right:20px}}.hidden-session[data-v-dcbc1fde]{visibility:hidden;position:absolute;z-index:-1}.session-error[data-v-dcbc1fde]{color:var(--v-error-base)}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as e,I as s,J as t,K as i,g as o,s as r,L as a,_ as l,r as n,f as c,o as d,b as u,c as m,h,w as p,e as g,F as v,n as f,a as y,t as C,M as S,N as w,u as k}from"./index-CfLe2ewO.js";import{useDataInputFormStore as F}from"./edit-ui.es-BX72VVRb.js";import{allCourseWare as b}from"./index-BHFq3MXV.js";const L=e({name:"SessionConfiguration",components:{SkMouseTrapToolTip:t,CourseTagFilterWidget:s},props:{initialTimeLimit:{type:Number,required:!0,default:5}},emits:["initStudySession"],data(){return{registeredHotkeys:[],allSelected:!0,activeCourses:[],activeClasses:[],hasRegistrations:!0,user:null,timeLimit:this.initialTimeLimit,courseLoadError:!1,classroomLoadError:!1,expandedFilters:{}}},computed:{hasSelectedSources(){return this.activeCourses.some((e=>e.selected))||this.activeClasses.some((e=>e.selected))},hasAnyActiveFilter(){return this.activeCourses.some((e=>e.selected&&this.hasActiveTagFilter(e)))},activeFilterCount(){return this.activeCourses.filter((e=>e.selected&&this.hasActiveTagFilter(e))).length}},watch:{timeLimit:{handler(){this.timeLimit<=0&&(this.timeLimit=1)}}},beforeUnmount(){this.registeredHotkeys&&this.registeredHotkeys.forEach((e=>{i.removeBinding(e)}))},async created(){this.user=await r(),this.timeLimit=this.initialTimeLimit,this.setHotkeys();const[e,s]=await Promise.allSettled([this.getActiveCourses(),this.getActiveClassrooms()]);"rejected"===e.status&&(console.error("Failed to load courses:",e.reason),this.courseLoadError=!0),"rejected"===s.status&&(console.error("Failed to load classrooms:",s.reason),this.classroomLoadError=!0),0!==this.activeCourses.length||0!==this.activeClasses.length||this.courseLoadError||this.classroomLoadError||(this.hasRegistrations=!1)},mounted(){document.getElementById("SelectAll")?.focus()},unmounted(){this.registeredHotkeys&&this.registeredHotkeys.forEach((e=>{i.removeBinding(e)}))},methods:{inc(){this.timeLimit=this.timeLimit+1,console.log(`inc to ${this.timeLimit}`)},dec(){this.timeLimit--,console.log(`dec to ${this.timeLimit}`)},update(){console.log(JSON.stringify(this.activeCourses)),console.log(JSON.stringify(this.activeClasses))},toggleAll(){console.log("Toggling all courses"),this.activeCourses.forEach((e=>{e.selected=this.allSelected})),this.activeClasses.forEach((e=>{e.selected=this.allSelected})),console.log(JSON.stringify(this.activeCourses))},toggleTagFilter(e){this.expandedFilters[e]=!this.expandedFilters[e]},hasActiveTagFilter:e=>a(e.tagFilter),startSession(){this.registeredHotkeys&&this.registeredHotkeys.forEach((e=>{i.removeBinding(e)}));const e=[...this.activeCourses.filter((e=>e.selected)).map((e=>{const s={type:"course",id:e.courseID};return a(e.tagFilter)&&(s.tagFilter=e.tagFilter),s})),...this.activeClasses.filter((e=>e.selected)).map((e=>({type:"classroom",id:e.classID})))];this.$emit("initStudySession",e,this.timeLimit)},async getActiveClassrooms(){const e=await(await r()).getActiveClasses(),s=[];console.log(`Active classes: ${JSON.stringify(e)}`),await Promise.all(e.map((e=>(async e=>{const t=await o().getClassroomDB(e,"student");s.push({classID:e,name:t.getConfig().name,selected:!0,reviews:0})})(e)))),this.activeClasses=s},async getActiveCourses(){this.activeCourses=(await this.user.getActiveCourses()).map((e=>({...e,selected:!0,name:"",reviews:0,tagFilter:void 0}))),Promise.all(this.activeCourses.map((async(e,s)=>{const t=await o().getCoursesDB().getCourseConfig(e.courseID),i=await(this.user?.getCourseInterface(e.courseID));return(async()=>Promise.all([this.activeCourses[s].name=t.name,this.activeCourses[s].reviews=await i.getScheduledReviewCount()]))()})))},setHotkeys(){const e=[{hotkey:"right",callback:()=>{this.timeLimit++},command:"Increase time limit"},{hotkey:"left",callback:()=>{this.timeLimit--},command:"Decrease time limit"}];i.addBinding(e),this.registeredHotkeys=e.map((e=>e.hotkey))}}}),I={key:0},D={class:"session-layout"},x={class:"course-selection-container"},E={class:"course-row-header"},_={class:"course-row-header"},T={class:"course-row-actions"},A={class:"reviews-count"},V={key:0,class:"tag-filter-container"},P={class:"select-all-row mt-3"},U={class:"fixed-controls-container"},M={class:"fixed-controls"},$={class:"mb-5"},q={key:0,class:"filter-summary mb-4"},B={class:"text-caption"},H={key:1,class:"text-h4"},R={key:2,class:"text-h4"};function z(e,s){return Math.floor(Math.random()*(s-e+1))+e}const O=e({name:"StudyView",components:{SessionConfiguration:l(L,[["render",function(e,s,t,i,o,r){const a=n("v-alert"),l=n("v-checkbox"),S=n("v-icon"),w=n("v-btn"),k=n("CourseTagFilterWidget"),F=n("v-expand-transition"),b=n("v-text-field"),L=n("SkMouseTrapToolTip"),z=n("router-link");return e.hasRegistrations||e.courseLoadError||e.classroomLoadError?(d(),c("div",I,[s[11]||(s[11]=u("div",{"data-cy":"select-quilts-header",class:"text-h4 mb-4"},"Study Session Setup",-1)),e.courseLoadError?(d(),m(a,{key:0,type:"warning",class:"mb-4"},{default:p((()=>s[2]||(s[2]=[g(" Unable to load course data. Some features may be unavailable. ")]))),_:1})):h("",!0),e.classroomLoadError?(d(),m(a,{key:1,type:"warning",class:"mb-4"},{default:p((()=>s[3]||(s[3]=[g(" Unable to load classroom data. You can still study individual courses. ")]))),_:1})):h("",!0),u("div",D,[u("div",x,[s[6]||(s[6]=u("div",{class:"text-h6 mb-3"},"Select Quilts to Study",-1)),(d(!0),c(v,null,f(e.activeClasses,(t=>(d(),c("div",{key:t.classID,class:"course-row"},[u("div",E,[y(l,{modelValue:t.selected,"onUpdate:modelValue":e=>t.selected=e,label:`Class: ${t.name}`,"hide-details":"",onClickCapture:e.update},null,8,["modelValue","onUpdate:modelValue","label","onClickCapture"]),s[4]||(s[4]=u("span",{class:"reviews-count"},"-",-1))])])))),128)),(d(!0),c(v,null,f(e.activeCourses,(t=>(d(),c("div",{key:t.courseID,class:"course-row"},[u("div",_,[y(l,{modelValue:t.selected,"onUpdate:modelValue":e=>t.selected=e,"data-cy":"course-checkbox",label:`q/${t.name}`,"hide-details":"",onClickCapture:e.update},null,8,["modelValue","onUpdate:modelValue","label","onClickCapture"]),u("div",T,[u("span",A,C(t.reviews),1),t.selected?(d(),m(w,{key:0,variant:"text",size:"small",color:e.hasActiveTagFilter(t)?"primary":"default",onClick:s=>e.toggleTagFilter(t.courseID)},{default:p((()=>[y(S,{start:"",size:"small"},{default:p((()=>s[5]||(s[5]=[g("mdi-filter-variant")]))),_:1}),g(" "+C(e.hasActiveTagFilter(t)?"Filtered":"Filter")+" ",1),y(S,{end:"",size:"small"},{default:p((()=>[g(C(e.expandedFilters[t.courseID]?"mdi-chevron-up":"mdi-chevron-down"),1)])),_:2},1024)])),_:2},1032,["color","onClick"])):h("",!0)])]),y(F,null,{default:p((()=>[t.selected&&e.expandedFilters[t.courseID]?(d(),c("div",V,[y(k,{modelValue:t.tagFilter,"onUpdate:modelValue":e=>t.tagFilter=e,"course-id":t.courseID},null,8,["modelValue","onUpdate:modelValue","course-id"])])):h("",!0)])),_:2},1024)])))),128)),u("div",P,[y(l,{id:"SelectAll",ref:"selectAll",modelValue:e.allSelected,"onUpdate:modelValue":[s[0]||(s[0]=s=>e.allSelected=s),e.toggleAll],autofocus:"",label:"Select All","hide-details":""},null,8,["modelValue","onUpdate:modelValue"])])]),u("div",U,[u("div",M,[s[10]||(s[10]=u("div",{class:"text-h6 mb-3"},"Session Settings",-1)),u("div",$,[y(b,{ref:"numberField",modelValue:e.timeLimit,"onUpdate:modelValue":s[1]||(s[1]=s=>e.timeLimit=s),class:"time-limit-field",variant:"outlined",label:"Study Session Timelimit","prepend-inner-icon":"mdi-clock-outline","prepend-icon":"mdi-minus","append-icon":"mdi-plus",suffix:e.timeLimit>1?"minutes":"minute",mask:"##",type:"number","onClick:prepend":e.dec,"onClick:append":e.inc},null,8,["modelValue","suffix","onClick:prepend","onClick:append"])]),e.hasAnyActiveFilter?(d(),c("div",q,[y(S,{size:"small",color:"primary",class:"mr-1"},{default:p((()=>s[7]||(s[7]=[g("mdi-filter")]))),_:1}),u("span",B,C(e.activeFilterCount)+" course"+C(e.activeFilterCount>1?"s":"")+" with tag filters ",1)])):h("",!0),y(L,{hotkey:"enter",command:"Start Session",disabled:!e.hasSelectedSources,"highlight-effect":"scale"},{default:p((()=>[y(w,{"data-cy":"start-studying-button",color:"success",size:"large",block:"",class:"start-btn",disabled:!e.hasSelectedSources,onClick:e.startSession},{default:p((()=>[y(S,{start:""},{default:p((()=>s[8]||(s[8]=[g("mdi-play")]))),_:1}),s[9]||(s[9]=g(" Start! "))])),_:1},8,["disabled","onClick"])])),_:1},8,["disabled"])])])])])):e.courseLoadError||e.classroomLoadError?(d(),c("div",R,s[16]||(s[16]=[u("p",null,"Unable to load study data due to technical issues.",-1),u("p",null,"Please try refreshing the page or contact support if the problem persists.",-1)]))):(d(),c("div",H,[s[15]||(s[15]=u("p",null,"You don't have anything to study!",-1)),u("p",null,[s[13]||(s[13]=g("Head over to the ")),y(z,{to:"/quilts"},{default:p((()=>s[12]||(s[12]=[g("Quilts")]))),_:1}),s[14]||(s[14]=g(" page to find something for you."))])]))}],["__scopeId","data-v-c5ff4b5f"]]),StudySession:S},inject:{router:{from:"router"}},props:{previewCourseID:{type:String,required:!1,default:""},randomPreview:{type:Boolean,required:!1},focusCourseID:{type:String,required:!1,default:""}},data:()=>({user:null,studySessionConfig:void 0,previewCourseConfig:void 0,previewMode:!1,sessionTimeLimit:5,inSession:!1,sessionPrepared:!1,sessionError:!1,errorMessage:"",sessionContentSources:[],dataInputFormStore:F(),getViewComponent:e=>b.getView(e),dataLayer:o()}),async created(){this.user=await r(),this.studySessionConfig={likesConfetti:w().config.likesConfetti};let e="";if(this.randomPreview){const s=await this.user.getCourseRegistrationsDoc(),t=(await o().getCoursesDB().getCourseList()).map((e=>e.courseID)),i=t.filter((e=>!s.courses.some((s=>s.courseID===e))));e=i.length>0?i[z(0,i.length)]:t[z(0,t.length)]}if(this.previewCourseID&&(this.previewMode=!0,o().getCoursesDB().getCourseList().then((e=>{e.forEach((e=>{e.courseID===this.previewCourseID&&(this.previewCourseConfig=e,this.previewCourseConfig.courseID=e.courseID)}))})),console.log(`[Study] COURSE PREVIEW MODE FOR ${this.previewCourseID}`),await this.user.registerForCourse(this.previewCourseID,!0),e=this.previewCourseID),this.focusCourseID&&(console.log(`[Study] FOCUS study session: ${this.focusCourseID}`),e=this.focusCourseID),e){const s=this.parseTagFilterFromQuery(),t={type:"course",id:e};a(s)&&(t.tagFilter=s,console.log("[Study] Tag filter from query params:",s)),this.initStudySession([t],this.sessionTimeLimit)}},methods:{refreshRoute(){this.router.go(0)},async initStudySession(e,s){console.log(`[Study] starting study session w/ sources: ${JSON.stringify(e)}`),this.sessionContentSources=e,this.sessionTimeLimit=s,this.inSession=!0,this.sessionPrepared=!1,console.log("[Study] Waiting for session-prepared event from StudySession component")},registerUserForPreviewCourse(){this.user.registerForCourse(this.previewCourseConfig.courseID).then((()=>this.router.push(`/quilts/${this.previewCourseConfig.courseID}`)))},handleSessionFinished(){this.refreshRoute()},handleSessionPrepared(){console.log("[Study] Session preparation complete - received session-prepared event"),this.sessionPrepared=!0,this.sessionError=!1,this.errorMessage=""},handleSessionError({message:e,error:s}){console.error("[Study] Session error:",e,s),this.sessionError=!0,this.errorMessage=e||"An error occurred while preparing your study session.",this.sessionPrepared=!1},parseTagFilterFromQuery(){const e=this.$route.query.include,s=this.$route.query.exclude,t=e=>e?Array.isArray(e)?e.flatMap((e=>e?e.split(",").map((e=>e.trim())):[])).filter(Boolean):e.split(",").map((e=>e.trim())).filter(Boolean):[];return{include:t(e),exclude:t(s)}}}}),j={key:0},N={key:1},J={key:0,align:"center"},Q={class:"text-h5"},W={key:1},Y={key:2},G={key:0,class:"session-loading"},K={key:1,class:"session-error"},X={class:"text-subtitle-1 mt-2"};const Z=l(O,[["render",function(e,s,t,i,o,r){const a=n("SessionConfiguration"),l=n("v-btn"),m=n("router-link"),v=n("v-spacer"),f=n("v-col"),S=n("v-row"),w=n("v-progress-circular"),F=n("v-container"),b=n("v-icon"),L=n("StudySession");return e.inSession?(d(),c("div",N,[e.previewMode&&e.previewCourseConfig?(d(),c("div",J,[y(S,null,{default:p((()=>[y(f,null,{default:p((()=>[u("span",Q,[s[1]||(s[1]=g(" Quilt preview for ")),u("em",null,C(e.previewCourseConfig.name),1)]),y(l,{size:"small",color:"primary",onClick:e.registerUserForPreviewCourse},{default:p((()=>s[2]||(s[2]=[g("Join")]))),_:1},8,["onClick"]),y(m,{to:`/quilts/${e.previewCourseConfig.courseID}`},{default:p((()=>[y(l,{size:"small",color:"secondary"},{default:p((()=>s[3]||(s[3]=[g("More info")]))),_:1})])),_:1},8,["to"]),y(v)])),_:1})])),_:1})])):e.previewMode?(d(),c("div",W,[y(S,null,{default:p((()=>[y(f,null,{default:p((()=>s[4]||(s[4]=[u("span",{class:"text-h5"},"... No course was specified for the preview.",-1),u("div",null,"(this shouldn't happen)...",-1)]))),_:1})])),_:1})])):h("",!0),e.inSession?(d(),c("div",Y,[e.sessionPrepared||e.sessionError?h("",!0):(d(),c("div",G,[y(F,{class:"text-center"},{default:p((()=>[y(S,{justify:"center",align:"center",style:{"min-height":"50vh"}},{default:p((()=>[y(f,{cols:"12"},{default:p((()=>[y(w,{size:"70",width:"7",color:"primary",indeterminate:""}),s[5]||(s[5]=u("div",{class:"text-h5 mt-4"},"Preparing your study session...",-1)),s[6]||(s[6]=u("div",{class:"text-subtitle-1 mt-2"},"Getting your learning materials ready",-1))])),_:1})])),_:1})])),_:1})])),e.sessionError?(d(),c("div",K,[y(F,{class:"text-center"},{default:p((()=>[y(S,{justify:"center",align:"center",style:{"min-height":"50vh"}},{default:p((()=>[y(f,{cols:"12"},{default:p((()=>[y(b,{size:"64",color:"error"},{default:p((()=>s[7]||(s[7]=[g("mdi-alert-circle")]))),_:1}),s[9]||(s[9]=u("div",{class:"text-h5 mt-4 text-error"},"Session Preparation Failed",-1)),u("div",X,C(e.errorMessage||"There was a problem preparing your study session."),1),y(l,{color:"primary",class:"mt-6",onClick:e.refreshRoute},{default:p((()=>s[8]||(s[8]=[g("Try Again")]))),_:1},8,["onClick"])])),_:1})])),_:1})])),_:1})])):h("",!0),y(L,{"content-sources":e.sessionContentSources,"session-time-limit":e.sessionTimeLimit,user:e.user,"session-config":e.studySessionConfig,"data-layer":e.dataLayer,"get-view-component":e.getViewComponent,class:k({"hidden-session":!e.sessionPrepared}),onSessionFinished:e.handleSessionFinished,onSessionPrepared:e.handleSessionPrepared,onSessionError:e.handleSessionError},null,8,["content-sources","session-time-limit","user","session-config","data-layer","get-view-component","class","onSessionFinished","onSessionPrepared","onSessionError"])])):h("",!0)])):(d(),c("div",j,[y(a,{"initial-time-limit":e.sessionTimeLimit,onInitStudySession:s[0]||(s[0]=(s,t)=>e.initStudySession(s,t))},null,8,["initial-time-limit"])]))}],["__scopeId","data-v-dcbc1fde"]]);export{Z as default};
|
|
2
|
+
//# sourceMappingURL=Study-D3owlaib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Study-D3owlaib.js","sources":["../../src/components/Study/SessionConfiguration.vue","../../src/views/Study.vue"],"sourcesContent":["<template>\n <div v-if=\"hasRegistrations || courseLoadError || classroomLoadError\">\n <div data-cy=\"select-quilts-header\" class=\"text-h4 mb-4\">Study Session Setup</div>\n\n <!-- Error Messages -->\n <v-alert v-if=\"courseLoadError\" type=\"warning\" class=\"mb-4\">\n Unable to load course data. Some features may be unavailable.\n </v-alert>\n\n <v-alert v-if=\"classroomLoadError\" type=\"warning\" class=\"mb-4\">\n Unable to load classroom data. You can still study individual courses.\n </v-alert>\n\n <div class=\"session-layout\">\n <!-- Left Column: Course Selection -->\n <div class=\"course-selection-container\">\n <div class=\"text-h6 mb-3\">Select Quilts to Study</div>\n\n <!-- Classrooms -->\n <div v-for=\"classroom in activeClasses\" :key=\"classroom.classID\" class=\"course-row\">\n <div class=\"course-row-header\">\n <v-checkbox\n v-model=\"classroom.selected\"\n :label=\"`Class: ${classroom.name}`\"\n hide-details\n @click.capture=\"update\"\n />\n <span class=\"reviews-count\">-</span>\n </div>\n </div>\n\n <!-- Courses -->\n <div v-for=\"course in activeCourses\" :key=\"course.courseID\" class=\"course-row\">\n <div class=\"course-row-header\">\n <v-checkbox\n v-model=\"course.selected\"\n data-cy=\"course-checkbox\"\n :label=\"`q/${course.name}`\"\n hide-details\n @click.capture=\"update\"\n />\n <div class=\"course-row-actions\">\n <span class=\"reviews-count\">{{ course.reviews }}</span>\n <v-btn\n v-if=\"course.selected\"\n variant=\"text\"\n size=\"small\"\n :color=\"hasActiveTagFilter(course) ? 'primary' : 'default'\"\n @click=\"toggleTagFilter(course.courseID)\"\n >\n <v-icon start size=\"small\">mdi-filter-variant</v-icon>\n {{ hasActiveTagFilter(course) ? 'Filtered' : 'Filter' }}\n <v-icon end size=\"small\">\n {{ expandedFilters[course.courseID] ? 'mdi-chevron-up' : 'mdi-chevron-down' }}\n </v-icon>\n </v-btn>\n </div>\n </div>\n\n <!-- Tag Filter Widget (expandable) -->\n <v-expand-transition>\n <div v-if=\"course.selected && expandedFilters[course.courseID]\" class=\"tag-filter-container\">\n <CourseTagFilterWidget v-model=\"course.tagFilter\" :course-id=\"course.courseID\" />\n </div>\n </v-expand-transition>\n </div>\n\n <!-- Select All -->\n <div class=\"select-all-row mt-3\">\n <v-checkbox\n id=\"SelectAll\"\n ref=\"selectAll\"\n v-model=\"allSelected\"\n autofocus\n label=\"Select All\"\n hide-details\n @update:model-value=\"toggleAll\"\n ></v-checkbox>\n </div>\n </div>\n\n <!-- Right Column: Time Configuration and Start Button -->\n <div class=\"fixed-controls-container\">\n <div class=\"fixed-controls\">\n <div class=\"text-h6 mb-3\">Session Settings</div>\n\n <div class=\"mb-5\">\n <v-text-field\n ref=\"numberField\"\n v-model=\"timeLimit\"\n class=\"time-limit-field\"\n variant=\"outlined\"\n label=\"Study Session Timelimit\"\n prepend-inner-icon=\"mdi-clock-outline\"\n prepend-icon=\"mdi-minus\"\n append-icon=\"mdi-plus\"\n :suffix=\"timeLimit > 1 ? 'minutes' : 'minute'\"\n mask=\"##\"\n type=\"number\"\n @click:prepend=\"dec\"\n @click:append=\"inc\"\n />\n </div>\n\n <!-- Filter Summary -->\n <div v-if=\"hasAnyActiveFilter\" class=\"filter-summary mb-4\">\n <v-icon size=\"small\" color=\"primary\" class=\"mr-1\">mdi-filter</v-icon>\n <span class=\"text-caption\">\n {{ activeFilterCount }} course{{ activeFilterCount > 1 ? 's' : '' }} with tag filters\n </span>\n </div>\n\n <SkMouseTrapToolTip\n hotkey=\"enter\"\n command=\"Start Session\"\n :disabled=\"!hasSelectedSources\"\n highlight-effect=\"scale\"\n >\n <v-btn\n data-cy=\"start-studying-button\"\n color=\"success\"\n size=\"large\"\n block\n class=\"start-btn\"\n :disabled=\"!hasSelectedSources\"\n @click=\"startSession\"\n >\n <v-icon start>mdi-play</v-icon>\n Start!\n </v-btn>\n </SkMouseTrapToolTip>\n </div>\n </div>\n </div>\n </div>\n <div v-else-if=\"!courseLoadError && !classroomLoadError\" class=\"text-h4\">\n <p>You don't have anything to study!</p>\n <p>Head over to the <router-link to=\"/quilts\">Quilts</router-link> page to find something for you.</p>\n </div>\n <div v-else class=\"text-h4\">\n <p>Unable to load study data due to technical issues.</p>\n <p>Please try refreshing the page or contact support if the problem persists.</p>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { SkldrMouseTrap, getCurrentUser, SkMouseTrapToolTip, CourseTagFilterWidget } from '@vue-skuilder/common-ui';\nimport { CourseRegistration, UserDBInterface, getDataLayer, ContentSourceID } from '@vue-skuilder/db';\nimport { TagFilter, hasActiveFilter } from '@vue-skuilder/common';\n\nexport interface SessionConfigMetaData {\n selected: boolean;\n name: string;\n reviews: number;\n tagFilter?: TagFilter;\n}\n\n// Extended ContentSourceID that can carry tag filter configuration\nexport interface TagFilteredContentSourceID extends ContentSourceID {\n tagFilter?: TagFilter;\n}\n\nexport default defineComponent({\n name: 'SessionConfiguration',\n\n components: {\n SkMouseTrapToolTip,\n CourseTagFilterWidget,\n },\n\n props: {\n initialTimeLimit: {\n type: Number,\n required: true,\n default: 5,\n },\n },\n\n emits: ['initStudySession'],\n\n data() {\n return {\n registeredHotkeys: [] as (string | string[])[],\n allSelected: true,\n activeCourses: [] as (CourseRegistration & SessionConfigMetaData)[],\n activeClasses: [] as ({ classID: string } & SessionConfigMetaData)[],\n hasRegistrations: true,\n user: null as UserDBInterface | null,\n timeLimit: this.initialTimeLimit,\n courseLoadError: false,\n classroomLoadError: false,\n expandedFilters: {} as Record<string, boolean>,\n };\n },\n\n computed: {\n hasSelectedSources(): boolean {\n return this.activeCourses.some((c) => c.selected) || this.activeClasses.some((c) => c.selected);\n },\n\n hasAnyActiveFilter(): boolean {\n return this.activeCourses.some((c) => c.selected && this.hasActiveTagFilter(c));\n },\n\n activeFilterCount(): number {\n return this.activeCourses.filter((c) => c.selected && this.hasActiveTagFilter(c)).length;\n },\n },\n\n watch: {\n timeLimit: {\n handler() {\n if (this.timeLimit <= 0) {\n this.timeLimit = 1;\n }\n },\n },\n },\n\n beforeUnmount() {\n // Clean up registered hotkeys when component unmounts\n if (this.registeredHotkeys) {\n this.registeredHotkeys.forEach((key) => {\n SkldrMouseTrap.removeBinding(key);\n });\n }\n },\n\n async created() {\n this.user = await getCurrentUser();\n this.timeLimit = this.initialTimeLimit;\n\n this.setHotkeys();\n const [coursesResult, classroomsResult] = await Promise.allSettled([\n this.getActiveCourses(),\n this.getActiveClassrooms(),\n ]);\n\n // Handle course loading failure\n if (coursesResult.status === 'rejected') {\n console.error('Failed to load courses:', coursesResult.reason);\n this.courseLoadError = true;\n }\n\n // Handle classroom loading failure\n if (classroomsResult.status === 'rejected') {\n console.error('Failed to load classrooms:', classroomsResult.reason);\n this.classroomLoadError = true;\n }\n\n if (\n this.activeCourses.length === 0 &&\n this.activeClasses.length === 0 &&\n !this.courseLoadError &&\n !this.classroomLoadError\n ) {\n this.hasRegistrations = false;\n }\n },\n\n mounted() {\n document.getElementById('SelectAll')?.focus();\n },\n\n unmounted() {\n // Clean up registered hotkeys when component unmounts\n if (this.registeredHotkeys) {\n this.registeredHotkeys.forEach((key) => {\n SkldrMouseTrap.removeBinding(key);\n });\n }\n },\n\n methods: {\n inc() {\n this.timeLimit = this.timeLimit + 1;\n console.log(`inc to ${this.timeLimit}`);\n },\n\n dec() {\n this.timeLimit--;\n console.log(`dec to ${this.timeLimit}`);\n },\n\n update() {\n console.log(JSON.stringify(this.activeCourses));\n console.log(JSON.stringify(this.activeClasses));\n },\n\n toggleAll(): void {\n console.log(`Toggling all courses`);\n this.activeCourses.forEach((crs) => {\n crs.selected = this.allSelected;\n });\n this.activeClasses.forEach((cl) => {\n cl.selected = this.allSelected;\n });\n console.log(JSON.stringify(this.activeCourses));\n },\n\n toggleTagFilter(courseID: string): void {\n this.expandedFilters[courseID] = !this.expandedFilters[courseID];\n },\n\n hasActiveTagFilter(course: CourseRegistration & SessionConfigMetaData): boolean {\n return hasActiveFilter(course.tagFilter);\n },\n\n startSession() {\n // Clean up any registered hotkeys before starting session\n if (this.registeredHotkeys) {\n this.registeredHotkeys.forEach((key) => {\n SkldrMouseTrap.removeBinding(key);\n });\n }\n\n // Build sources with optional tag filters\n const selectedCourses: TagFilteredContentSourceID[] = this.activeCourses\n .filter((c) => c.selected)\n .map((c) => {\n const source: TagFilteredContentSourceID = {\n type: 'course',\n id: c.courseID,\n };\n // Only include tagFilter if it has active constraints\n if (hasActiveFilter(c.tagFilter)) {\n source.tagFilter = c.tagFilter;\n }\n return source;\n });\n\n const selectedClassrooms: ContentSourceID[] = this.activeClasses\n .filter((cl) => cl.selected)\n .map((cl) => ({\n type: 'classroom',\n id: cl.classID,\n }));\n\n const allSelectedSources = [...selectedCourses, ...selectedClassrooms];\n this.$emit('initStudySession', allSelectedSources, this.timeLimit);\n },\n\n async getActiveClassrooms() {\n const classes = await (await getCurrentUser()).getActiveClasses();\n const activeClasses: ({ classID: string } & SessionConfigMetaData)[] = [];\n\n console.log(`Active classes: ${JSON.stringify(classes)}`);\n\n await Promise.all(\n classes.map((c) =>\n (async (classID: string) => {\n const classDb = await getDataLayer().getClassroomDB(classID, `student`);\n activeClasses.push({\n classID,\n name: classDb.getConfig().name,\n selected: true,\n reviews: 0,\n });\n })(c)\n )\n );\n this.activeClasses = activeClasses;\n },\n\n async getActiveCourses() {\n this.activeCourses = (await this.user!.getActiveCourses()).map((c) => ({\n ...c,\n selected: true,\n name: '',\n reviews: 0,\n tagFilter: undefined,\n }));\n\n Promise.all(\n this.activeCourses.map(async (c, i) => {\n const cfg = await getDataLayer().getCoursesDB().getCourseConfig(c.courseID);\n const crsInterface = await this.user?.getCourseInterface(c.courseID);\n return (async () => {\n return Promise.all([\n (this.activeCourses[i].name = cfg.name),\n (this.activeCourses[i].reviews = await crsInterface!.getScheduledReviewCount()),\n ]);\n })();\n })\n );\n },\n\n setHotkeys() {\n const hotkeys = [\n {\n hotkey: 'right',\n callback: () => {\n this.timeLimit++;\n },\n command: 'Increase time limit',\n },\n {\n hotkey: 'left',\n callback: () => {\n this.timeLimit--;\n },\n command: 'Decrease time limit',\n },\n ];\n SkldrMouseTrap.addBinding(hotkeys);\n this.registeredHotkeys = hotkeys.map((k) => k.hotkey);\n },\n },\n});\n</script>\n\n<style scoped>\n/* Layout for session configuration */\n.session-layout {\n display: flex;\n flex-direction: column;\n}\n\n/* Fixed controls container */\n.fixed-controls-container {\n width: 100%;\n margin-bottom: 20px;\n}\n\n.fixed-controls {\n display: flex;\n flex-direction: column;\n}\n\n.time-limit-field {\n width: 100%;\n margin-bottom: 16px;\n}\n\n.start-btn {\n margin-top: 8px;\n max-height: 150px;\n}\n\n/* Course selection styles */\n.course-selection-container {\n width: 100%;\n}\n\n.course-row {\n border-bottom: 1px solid rgba(var(--v-border-color), 0.12);\n padding: 8px 0;\n}\n\n.course-row-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.course-row-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.reviews-count {\n min-width: 32px;\n text-align: center;\n color: rgba(var(--v-theme-on-surface), 0.6);\n}\n\n.tag-filter-container {\n padding: 12px 0 12px 32px;\n background-color: rgba(var(--v-theme-surface-variant), 0.3);\n border-radius: 4px;\n margin-top: 8px;\n}\n\n.select-all-row {\n padding-top: 8px;\n border-top: 2px solid rgba(var(--v-border-color), 0.24);\n}\n\n.filter-summary {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n background-color: rgba(var(--v-theme-primary), 0.08);\n border-radius: 4px;\n}\n\n/* Media queries for desktop layout */\n@media (min-width: 960px) {\n .session-layout {\n flex-direction: row;\n gap: 40px;\n }\n\n .fixed-controls-container {\n width: 300px;\n flex-shrink: 0;\n }\n\n .fixed-controls {\n position: sticky;\n top: 20px;\n padding-left: 20px;\n }\n\n .course-selection-container {\n flex-grow: 1;\n border-right: 1px solid rgba(0, 0, 0, 0.12);\n padding-right: 20px;\n }\n}\n</style>\n","<template>\n <div v-if=\"!inSession\">\n <SessionConfiguration\n :initial-time-limit=\"sessionTimeLimit\"\n @init-study-session=\"(sources, timeLimit) => initStudySession(sources, timeLimit)\"\n />\n </div>\n <div v-else>\n <div v-if=\"previewMode && previewCourseConfig\" align=\"center\">\n <v-row>\n <v-col>\n <span class=\"text-h5\">\n Quilt preview for <em>{{ previewCourseConfig.name }}</em>\n </span>\n <v-btn size=\"small\" color=\"primary\" @click=\"registerUserForPreviewCourse\">Join</v-btn>\n <router-link :to=\"`/quilts/${previewCourseConfig.courseID}`\">\n <v-btn size=\"small\" color=\"secondary\">More info</v-btn>\n </router-link>\n <v-spacer></v-spacer>\n </v-col>\n </v-row>\n </div>\n <div v-else-if=\"previewMode\">\n <v-row>\n <v-col>\n <span class=\"text-h5\">... No course was specified for the preview.</span>\n <div>(this shouldn't happen)...</div>\n </v-col>\n </v-row>\n </div>\n\n <!-- Study Session Component (may be in loading state) -->\n <div v-if=\"inSession\">\n <!-- Loading indicator while session is being prepared -->\n <div v-if=\"!sessionPrepared && !sessionError\" class=\"session-loading\">\n <v-container class=\"text-center\">\n <v-row justify=\"center\" align=\"center\" style=\"min-height: 50vh\">\n <v-col cols=\"12\">\n <v-progress-circular size=\"70\" width=\"7\" color=\"primary\" indeterminate></v-progress-circular>\n <div class=\"text-h5 mt-4\">Preparing your study session...</div>\n <div class=\"text-subtitle-1 mt-2\">Getting your learning materials ready</div>\n </v-col>\n </v-row>\n </v-container>\n </div>\n\n <!-- Error state -->\n <div v-if=\"sessionError\" class=\"session-error\">\n <v-container class=\"text-center\">\n <v-row justify=\"center\" align=\"center\" style=\"min-height: 50vh\">\n <v-col cols=\"12\">\n <v-icon size=\"64\" color=\"error\">mdi-alert-circle</v-icon>\n <div class=\"text-h5 mt-4 text-error\">Session Preparation Failed</div>\n <div class=\"text-subtitle-1 mt-2\">\n {{ errorMessage || 'There was a problem preparing your study session.' }}\n </div>\n <v-btn color=\"primary\" class=\"mt-6\" @click=\"refreshRoute\">Try Again</v-btn>\n </v-col>\n </v-row>\n </v-container>\n </div>\n\n <StudySession\n :content-sources=\"sessionContentSources\"\n :session-time-limit=\"sessionTimeLimit\"\n :user=\"user as UserDBInterface\"\n :session-config=\"studySessionConfig\"\n :data-layer=\"dataLayer\"\n :get-view-component=\"getViewComponent\"\n :class=\"{ 'hidden-session': !sessionPrepared }\"\n @session-finished=\"handleSessionFinished\"\n @session-prepared=\"handleSessionPrepared\"\n @session-error=\"handleSessionError\"\n />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport SessionConfiguration from '@pui/components/Study/SessionConfiguration.vue';\nimport { getCurrentUser, useConfigStore } from '@vue-skuilder/common-ui';\nimport { useDataInputFormStore } from '@vue-skuilder/edit-ui';\nimport { CourseConfig, TagFilter, hasActiveFilter } from '@vue-skuilder/common';\nimport { StudySession, type StudySessionConfig } from '@vue-skuilder/common-ui';\nimport { allCourseWare } from '@vue-skuilder/courseware';\nimport { ContentSourceID, UserDBInterface, getDataLayer } from '@vue-skuilder/db';\nimport { defineComponent } from 'vue';\nimport { Router } from 'vue-router';\n\nfunction randomInt(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\nexport default defineComponent({\n name: 'StudyView',\n\n components: {\n SessionConfiguration,\n StudySession,\n },\n\n inject: {\n router: {\n from: 'router',\n },\n },\n\n props: {\n /**\n * If present, user will engage in a study session for the specified (non-registered) course.\n */\n previewCourseID: {\n type: String,\n required: false,\n default: '',\n },\n /**\n * If true, the user will engage in a study session for a\n * random (public) course they are not already registered for.\n */\n randomPreview: {\n type: Boolean,\n required: false,\n },\n /**\n * If present, user will engage in a study session for the specified (registered) course.\n */\n focusCourseID: {\n type: String,\n required: false,\n default: '',\n },\n },\n\n data() {\n return {\n user: null as UserDBInterface | null,\n studySessionConfig: undefined as StudySessionConfig | undefined,\n previewCourseConfig: undefined as CourseConfig | undefined,\n previewMode: false,\n sessionTimeLimit: 5,\n inSession: false,\n sessionPrepared: false,\n sessionError: false,\n errorMessage: '',\n sessionContentSources: [] as ContentSourceID[],\n dataInputFormStore: useDataInputFormStore(),\n getViewComponent: (view_id: string) => allCourseWare.getView(view_id),\n dataLayer: getDataLayer(),\n };\n },\n\n async created() {\n this.user = await getCurrentUser();\n this.studySessionConfig = {\n likesConfetti: useConfigStore().config.likesConfetti,\n };\n\n let singletonStudyCourseID = '';\n\n if (this.randomPreview) {\n const userCourseRegDoc = await this.user.getCourseRegistrationsDoc();\n const allCourseWare = (await getDataLayer().getCoursesDB().getCourseList()).map((r) => r.courseID);\n const unRegisteredCourses = allCourseWare.filter((c) => {\n return !userCourseRegDoc.courses.some((rc) => rc.courseID === c);\n });\n if (unRegisteredCourses.length > 0) {\n singletonStudyCourseID = unRegisteredCourses[randomInt(0, unRegisteredCourses.length)]!;\n } else {\n singletonStudyCourseID = allCourseWare[randomInt(0, allCourseWare.length)]!;\n }\n }\n\n if (this.previewCourseID) {\n this.previewMode = true;\n getDataLayer()\n .getCoursesDB()\n .getCourseList()\n .then((courses) => {\n courses.forEach((c) => {\n if (c.courseID === this.previewCourseID) {\n this.previewCourseConfig = c;\n this.previewCourseConfig!.courseID = c.courseID;\n }\n });\n });\n\n console.log(`[Study] COURSE PREVIEW MODE FOR ${this.previewCourseID}`);\n await this.user!.registerForCourse(this.previewCourseID, true);\n\n singletonStudyCourseID = this.previewCourseID;\n }\n\n if (this.focusCourseID) {\n console.log(`[Study] FOCUS study session: ${this.focusCourseID}`);\n singletonStudyCourseID = this.focusCourseID;\n }\n\n if (singletonStudyCourseID) {\n // Parse tag filter from query params\n const tagFilter = this.parseTagFilterFromQuery();\n const source: ContentSourceID = {\n type: 'course',\n id: singletonStudyCourseID,\n };\n\n if (hasActiveFilter(tagFilter)) {\n source.tagFilter = tagFilter;\n console.log(`[Study] Tag filter from query params:`, tagFilter);\n }\n\n this.initStudySession([source], this.sessionTimeLimit);\n }\n },\n\n methods: {\n refreshRoute() {\n (this.router as Router).go(0);\n },\n\n async initStudySession(sources: ContentSourceID[], timeLimit: number) {\n console.log(`[Study] starting study session w/ sources: ${JSON.stringify(sources)}`);\n\n this.sessionContentSources = sources;\n this.sessionTimeLimit = timeLimit;\n this.inSession = true;\n this.sessionPrepared = false;\n\n // Adding a console log to debug event handling\n console.log('[Study] Waiting for session-prepared event from StudySession component');\n },\n\n registerUserForPreviewCourse() {\n this.user!.registerForCourse(this.previewCourseConfig!.courseID!).then(() =>\n (this.router as Router).push(`/quilts/${this.previewCourseConfig!.courseID!}`)\n );\n },\n\n handleSessionFinished() {\n this.refreshRoute();\n },\n\n handleSessionPrepared() {\n console.log('[Study] Session preparation complete - received session-prepared event');\n this.sessionPrepared = true;\n this.sessionError = false;\n this.errorMessage = '';\n },\n\n handleSessionError({ message, error }) {\n console.error('[Study] Session error:', message, error);\n this.sessionError = true;\n this.errorMessage = message || 'An error occurred while preparing your study session.';\n this.sessionPrepared = false;\n },\n\n /**\n * Parse tag filter from URL query parameters.\n *\n * Supports:\n * - ?include=tagA,tagB&exclude=tagC\n * - Comma-separated values for multiple tags\n *\n * @returns TagFilter parsed from query, or empty filter if no params\n */\n parseTagFilterFromQuery(): TagFilter {\n const includeParam = this.$route.query.include;\n const excludeParam = this.$route.query.exclude;\n\n const parseParam = (param: string | string[] | undefined | null): string[] => {\n if (!param) return [];\n if (Array.isArray(param)) {\n // Handle repeated params: ?include=a&include=b\n return param.flatMap((p) => (p ? p.split(',').map((t) => t.trim()) : [])).filter(Boolean);\n }\n // Handle comma-separated: ?include=a,b\n return param\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n };\n\n return {\n include: parseParam(includeParam as string | string[] | undefined),\n exclude: parseParam(excludeParam as string | string[] | undefined),\n };\n },\n },\n});\n</script>\n\n<style scoped>\n.hidden-session {\n visibility: hidden;\n position: absolute;\n z-index: -1;\n}\n\n.session-error {\n color: var(--v-error-base);\n}\n</style>\n"],"names":["_sfc_main$1","defineComponent","name","components","SkMouseTrapToolTip","CourseTagFilterWidget","props","initialTimeLimit","type","Number","required","default","emits","data","registeredHotkeys","allSelected","activeCourses","activeClasses","hasRegistrations","user","timeLimit","this","courseLoadError","classroomLoadError","expandedFilters","computed","hasSelectedSources","some","c","selected","hasAnyActiveFilter","hasActiveTagFilter","activeFilterCount","filter","length","watch","handler","beforeUnmount","forEach","key","SkldrMouseTrap","removeBinding","created","getCurrentUser","setHotkeys","coursesResult","classroomsResult","Promise","allSettled","getActiveCourses","getActiveClassrooms","status","console","error","reason","mounted","document","getElementById","focus","unmounted","methods","inc","log","dec","update","JSON","stringify","toggleAll","crs","cl","toggleTagFilter","courseID","course","hasActiveFilter","tagFilter","startSession","allSelectedSources","map","source","id","classID","$emit","classes","getActiveClasses","all","classDb","getDataLayer","getClassroomDB","push","getConfig","reviews","async","i","cfg","getCoursesDB","getCourseConfig","crsInterface","getCourseInterface","getScheduledReviewCount","hotkeys","hotkey","callback","command","addBinding","k","_hoisted_1","_hoisted_2","class","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_14","randomInt","min","max","Math","floor","random","_sfc_main","SessionConfiguration","_ctx","_openBlock","_createElementBlock","_cache","_createElementVNode","_createBlock","_component_v_alert","_withCtx","_createTextVNode","_","_createCommentVNode","_Fragment","_renderList","classroom","_createVNode","_component_v_checkbox","modelValue","$event","label","onClickCapture","_toDisplayString","_component_v_btn","variant","size","color","onClick","_component_v_icon","start","end","_component_v_expand_transition","_hoisted_8","_component_CourseTagFilterWidget","ref","autofocus","_component_v_text_field","suffix","mask","_hoisted_13","_component_SkMouseTrapToolTip","disabled","block","_hoisted_16","_hoisted_15","_component_router_link","to","StudySession","inject","router","from","previewCourseID","String","randomPreview","Boolean","focusCourseID","studySessionConfig","previewCourseConfig","previewMode","sessionTimeLimit","inSession","sessionPrepared","sessionError","errorMessage","sessionContentSources","dataInputFormStore","useDataInputFormStore","getViewComponent","view_id","allCourseWare","getView","dataLayer","likesConfetti","useConfigStore","config","singletonStudyCourseID","userCourseRegDoc","getCourseRegistrationsDoc","getCourseList","r","unRegisteredCourses","courses","rc","then","registerForCourse","parseTagFilterFromQuery","initStudySession","refreshRoute","go","sources","registerUserForPreviewCourse","handleSessionFinished","handleSessionPrepared","handleSessionError","message","includeParam","$route","query","include","excludeParam","exclude","parseParam","param","Array","isArray","flatMap","p","split","t","trim","align","_component_v_row","_component_v_col","_component_v_spacer","_component_v_container","justify","style","cols","_component_v_progress_circular","width","indeterminate","_component_StudySession","_normalizeClass","onSessionFinished","onSessionPrepared","onSessionError","_component_SessionConfiguration","onInitStudySession"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as i,B as e,j as t,k as n,g as a,D as o,_ as s,r as d,f as r,o as p,b as l,a as c,e as u,w as g,t as k,c as h,h as m}from"./index-CfLe2ewO.js";import{allCourseWare as f}from"./index-BHFq3MXV.js";const w=i({name:"TagInformation",components:{CourseCardBrowser:e},props:{tagId:{type:String,required:!0},courseId:{type:String,required:!0}},data(){return{snippetModel:"",editingSnippet:!1,snippetSaving:!1,wikiModel:"",editingWiki:!1,wikiSaving:!1,courseDB:null,tag:{course:this.courseId,name:this.tagId,snippet:"",wiki:"",taggedCards:[],docType:o.TAG},course:{courseID:this.courseId,name:"",description:"",public:!1,deleted:!1,dataShapes:[],questionTypes:[],creator:"",admins:[],moderators:[]}}},async created(){this.courseDB=a().getCourseDB(this.courseId),this.tag=await this.courseDB.getTag(this.tagId),this.snippetModel=this.tag.snippet,this.wikiModel=this.tag.wiki,this.course=await this.courseDB.getCourseConfig()},methods:{viewLookup:i=>f.getView(i),editSnippet(){console.log("[TagInformation] EditSnip"),this.editingSnippet=!0,this.$refs.snippetEditor.focus()},editWiki(){console.log("[TagInformation] EditWiki"),this.editingWiki=!0,this.$refs.wikiEditor.focus()},async saveSnippet(){this.snippetSaving=!0;(await this.courseDB.updateTag({...this.tag,snippet:this.snippetModel})).ok?(console.log("[TagInformation] OK"),this.tag.snippet=this.snippetModel,t({text:"Updated applied - thanks!",status:n.ok})):t({text:"error in applying update!",status:n.error}),this.editingSnippet=!1,this.snippetSaving=!1},async saveWiki(){this.wikiSaving=!0;(await this.courseDB.updateTag({...this.tag,wiki:this.wikiModel})).ok?(this.tag.wiki=this.wikiModel,t({text:"Updated applied - thanks!",status:n.ok})):t({text:"error in applying update!",status:n.error}),this.editingWiki=!1,this.wikiSaving=!1},cancelEditSnippet(){console.log("[TagInformation] Cancelling EditSnip"),this.editingSnippet=!1,this.snippetModel=this.tag.snippet},cancelEditWiki(){this.editingWiki=!1,this.wikiModel=this.tag.wiki}}}),y={key:0},v={key:0};const S=s(w,[["render",function(i,e,t,n,a,o){const s=d("router-link"),f=d("v-icon"),w=d("v-progress-circular"),S=d("v-fade-transition"),C=d("v-text-field"),W=d("course-card-browser");return p(),r("div",null,[l("h1",null,[c(s,{to:`/q/${i.course.name}`},{default:g((()=>[u(k(i.course.name),1)])),_:1},8,["to"]),u(" > Tag: "+k(i.tag.name),1)]),e[8]||(e[8]=l("br",null,null,-1)),l("p",null,k(i.tag.taggedCards.length)+" card"+k(1===i.tag.taggedCards.length?"":"s"),1),c(C,{ref:"snippetEditor",modelValue:i.snippetModel,"onUpdate:modelValue":e[0]||(e[0]=e=>i.snippetModel=e),variant:"outlined",readonly:!i.editingSnippet,counter:i.editingSnippet,label:"Brief tag description:",placeholder:"No snippet yet - add one!",type:"text"},{prepend:g((()=>[i.editingSnippet?(p(),r("span",y,[c(f,{color:"primary",onClick:i.saveSnippet},{default:g((()=>e[2]||(e[2]=[u("mdi-content-save")]))),_:1},8,["onClick"])])):(p(),h(f,{key:1,color:"primary",onClick:i.editSnippet},{default:g((()=>e[3]||(e[3]=[u("mdi-pencil")]))),_:1},8,["onClick"]))])),append:g((()=>[i.editingSnippet?(p(),h(f,{key:0,onClick:i.cancelEditSnippet},{default:g((()=>e[4]||(e[4]=[u("mdi-cancel")]))),_:1},8,["onClick"])):m("",!0),c(S,{"leave-absolute":""},{default:g((()=>[i.snippetSaving?(p(),h(w,{key:0,size:"20",color:"info",indeterminate:""})):m("",!0)])),_:1})])),_:1},8,["modelValue","readonly","counter"]),c(C,{ref:"wikiEditor",modelValue:i.wikiModel,"onUpdate:modelValue":e[1]||(e[1]=e=>i.wikiModel=e),variant:"outlined",readonly:!i.editingWiki,counter:i.editingWiki,label:"Extended tag description:",placeholder:"No wiki yet - consider adding one!",textarea:""},{prepend:g((()=>[i.editingWiki?(p(),r("span",v,[c(f,{color:"primary",onClick:i.saveWiki},{default:g((()=>e[5]||(e[5]=[u("mdi-content-save")]))),_:1},8,["onClick"])])):(p(),h(f,{key:1,color:"primary",onClick:i.editWiki},{default:g((()=>e[6]||(e[6]=[u("mdi-pencil")]))),_:1},8,["onClick"]))])),append:g((()=>[i.editingWiki?(p(),h(f,{key:0,onClick:i.cancelEditWiki},{default:g((()=>e[7]||(e[7]=[u("mdi-cancel")]))),_:1},8,["onClick"])):m("",!0),c(S,{"leave-absolute":""},{default:g((()=>[i.wikiSaving?(p(),h(w,{key:0,size:"20",color:"info",indeterminate:""})):m("",!0)])),_:1})])),_:1},8,["modelValue","readonly","counter"]),c(W,{"course-id":i.courseId,"tag-id":i.tagId,"view-lookup-function":i.viewLookup},null,8,["course-id","tag-id","view-lookup-function"])])}]]);export{S as default};
|
|
2
|
+
//# sourceMappingURL=TagInformation-BpBQo85-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TagInformation-BpBQo85-.js","sources":["../../src/components/Courses/TagInformation.vue"],"sourcesContent":["<template>\n <div>\n <!-- todo: -->\n <h1>\n <router-link :to=\"`/q/${course.name}`\">{{ course.name }}</router-link> > Tag: {{ tag.name }}\n </h1>\n <br />\n <p>{{ tag.taggedCards.length }} card{{ tag.taggedCards.length === 1 ? '' : 's' }}</p>\n\n <v-text-field\n ref=\"snippetEditor\"\n v-model=\"snippetModel\"\n variant=\"outlined\"\n :readonly=\"!editingSnippet\"\n :counter=\"editingSnippet\"\n label=\"Brief tag description:\"\n placeholder=\"No snippet yet - add one!\"\n type=\"text\"\n >\n <template #prepend>\n <span v-if=\"editingSnippet\">\n <v-icon color=\"primary\" @click=\"saveSnippet\">mdi-content-save</v-icon>\n </span>\n <v-icon v-else color=\"primary\" @click=\"editSnippet\">mdi-pencil</v-icon>\n </template>\n <template #append>\n <v-icon v-if=\"editingSnippet\" @click=\"cancelEditSnippet\">mdi-cancel</v-icon>\n <v-fade-transition leave-absolute>\n <!-- spinner while awaiting async write of edits -->\n <v-progress-circular v-if=\"snippetSaving\" size=\"20\" color=\"info\" indeterminate></v-progress-circular>\n </v-fade-transition>\n </template>\n </v-text-field>\n\n <v-text-field\n ref=\"wikiEditor\"\n v-model=\"wikiModel\"\n variant=\"outlined\"\n :readonly=\"!editingWiki\"\n :counter=\"editingWiki\"\n label=\"Extended tag description:\"\n placeholder=\"No wiki yet - consider adding one!\"\n textarea\n >\n <template #prepend>\n <span v-if=\"editingWiki\">\n <v-icon color=\"primary\" @click=\"saveWiki\">mdi-content-save</v-icon>\n </span>\n <v-icon v-else color=\"primary\" @click=\"editWiki\">mdi-pencil</v-icon>\n </template>\n <template #append>\n <v-icon v-if=\"editingWiki\" @click=\"cancelEditWiki\">mdi-cancel</v-icon>\n <v-fade-transition leave-absolute>\n <!-- spinner while awaiting async write of edits -->\n <v-progress-circular v-if=\"wikiSaving\" size=\"20\" color=\"info\" indeterminate></v-progress-circular>\n </v-fade-transition>\n </template>\n </v-text-field>\n\n <course-card-browser :course-id=\"courseId\" :tag-id=\"tagId\" :view-lookup-function=\"viewLookup\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { DocType, Tag, getDataLayer, CourseDBInterface } from '@vue-skuilder/db';\nimport { Status, CourseConfig } from '@vue-skuilder/common';\nimport { CourseCardBrowser } from '@vue-skuilder/common-ui';\nimport { alertUser } from '@vue-skuilder/common-ui';\nimport { allCourseWare } from '@vue-skuilder/courseware';\n\nexport default defineComponent({\n name: 'TagInformation',\n\n components: {\n CourseCardBrowser,\n },\n\n props: {\n tagId: {\n type: String,\n required: true,\n },\n courseId: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n snippetModel: '',\n editingSnippet: false,\n snippetSaving: false,\n\n wikiModel: '',\n editingWiki: false,\n wikiSaving: false,\n\n courseDB: null as CourseDBInterface | null,\n\n tag: {\n course: this.courseId,\n name: this.tagId,\n snippet: '',\n wiki: '',\n taggedCards: [],\n docType: DocType.TAG,\n } as Tag,\n\n course: {\n courseID: this.courseId,\n name: '',\n description: '',\n public: false,\n deleted: false,\n dataShapes: [],\n questionTypes: [],\n creator: '',\n admins: [],\n moderators: [],\n } as CourseConfig,\n };\n },\n\n async created() {\n this.courseDB = getDataLayer().getCourseDB(this.courseId);\n this.tag = await this.courseDB.getTag(this.tagId);\n this.snippetModel = this.tag.snippet;\n this.wikiModel = this.tag.wiki;\n this.course = await this.courseDB.getCourseConfig();\n },\n\n methods: {\n viewLookup(x: unknown) {\n return allCourseWare.getView(x);\n },\n\n editSnippet() {\n console.log('[TagInformation] EditSnip');\n this.editingSnippet = true;\n (this.$refs.snippetEditor as HTMLInputElement).focus();\n },\n\n editWiki() {\n console.log('[TagInformation] EditWiki');\n this.editingWiki = true;\n (this.$refs.wikiEditor as HTMLInputElement).focus();\n },\n\n async saveSnippet() {\n this.snippetSaving = true;\n\n const update = await this.courseDB!.updateTag({\n ...this.tag,\n snippet: this.snippetModel,\n });\n\n if (update.ok) {\n console.log('[TagInformation] OK');\n this.tag.snippet = this.snippetModel;\n alertUser({\n text: `Updated applied - thanks!`,\n status: Status.ok,\n });\n } else {\n alertUser({\n text: `error in applying update!`,\n status: Status.error,\n });\n }\n\n this.editingSnippet = false;\n this.snippetSaving = false;\n },\n\n async saveWiki() {\n this.wikiSaving = true;\n\n const update = await this.courseDB!.updateTag({\n ...this.tag,\n wiki: this.wikiModel,\n });\n\n if (update.ok) {\n this.tag.wiki = this.wikiModel;\n alertUser({\n text: `Updated applied - thanks!`,\n status: Status.ok,\n });\n } else {\n alertUser({\n text: `error in applying update!`,\n status: Status.error,\n });\n }\n\n this.editingWiki = false;\n this.wikiSaving = false;\n },\n\n cancelEditSnippet() {\n console.log('[TagInformation] Cancelling EditSnip');\n this.editingSnippet = false;\n this.snippetModel = this.tag.snippet;\n },\n\n cancelEditWiki() {\n this.editingWiki = false;\n this.wikiModel = this.tag.wiki;\n },\n },\n});\n</script>\n"],"names":["_sfc_main","defineComponent","name","components","CourseCardBrowser","props","tagId","type","String","required","courseId","data","snippetModel","editingSnippet","snippetSaving","wikiModel","editingWiki","wikiSaving","courseDB","tag","course","this","snippet","wiki","taggedCards","docType","DocType","TAG","courseID","description","public","deleted","dataShapes","questionTypes","creator","admins","moderators","created","getDataLayer","getCourseDB","getTag","getCourseConfig","methods","viewLookup","x","allCourseWare","getView","editSnippet","console","log","$refs","snippetEditor","focus","editWiki","wikiEditor","saveSnippet","updateTag","ok","alertUser","text","status","Status","error","saveWiki","cancelEditSnippet","cancelEditWiki","_hoisted_1","key","_hoisted_2","_createElementBlock","_createElementVNode","_createVNode","_component_router_link","to","_ctx","default","_withCtx","_createTextVNode","_toDisplayString","_","length","_component_v_text_field","ref","modelValue","$event","variant","readonly","counter","label","placeholder","prepend","_openBlock","_component_v_icon","color","onClick","_cache","_createBlock","append","_createCommentVNode","_component_v_fade_transition","_component_v_progress_circular","size","indeterminate","textarea","_component_course_card_browser"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as e,y as t,g as a,s as n,N as o,O as r,_ as i,r as s,f as l,o as c,c as u,h as d,b as f,a as h,w as m,e as g,t as p,P as b,R as v}from"./index-CfLe2ewO.js";var M={};!function e(t,a,n,o){var r=!!(t.Worker&&t.Blob&&t.Promise&&t.OffscreenCanvas&&t.OffscreenCanvasRenderingContext2D&&t.HTMLCanvasElement&&t.HTMLCanvasElement.prototype.transferControlToOffscreen&&t.URL&&t.URL.createObjectURL),i="function"==typeof Path2D&&"function"==typeof DOMMatrix;function s(){}function l(e){var n=a.exports.Promise,o=void 0!==n?n:t.Promise;return"function"==typeof o?new o(e):(e(s,s),null)}var c,u,d,f,h,m,g=function(e,t){return{transform:function(a){if(e)return a;if(t.has(a))return t.get(a);var n=new OffscreenCanvas(a.width,a.height);return n.getContext("2d").drawImage(a,0,0),t.set(a,n),n},clear:function(){t.clear()}}}(function(){if(!t.OffscreenCanvas)return!1;var e=new OffscreenCanvas(1,1),a=e.getContext("2d");a.fillRect(0,0,1,1);var n=e.transferToImageBitmap();try{a.createPattern(n,"no-repeat")}catch(o){return!1}return!0}(),new Map),p=(d=Math.floor(1e3/60),f={},h=0,"function"==typeof requestAnimationFrame&&"function"==typeof cancelAnimationFrame?(c=function(e){var t=Math.random();return f[t]=requestAnimationFrame((function a(n){h===n||h+d-1<n?(h=n,delete f[t],e()):f[t]=requestAnimationFrame(a)})),t},u=function(e){f[e]&&cancelAnimationFrame(f[e])}):(c=function(e){return setTimeout(e,d)},u=function(e){return clearTimeout(e)}),{frame:c,cancel:u}),b=function(){var t,a,o={};return function(){if(t)return t;if(!n&&r){var i=["var CONFETTI, SIZE = {}, module = {};","("+e.toString()+")(this, module, true, SIZE);","onmessage = function(msg) {"," if (msg.data.options) {"," CONFETTI(msg.data.options).then(function () {"," if (msg.data.callback) {"," postMessage({ callback: msg.data.callback });"," }"," });"," } else if (msg.data.reset) {"," CONFETTI && CONFETTI.reset();"," } else if (msg.data.resize) {"," SIZE.width = msg.data.resize.width;"," SIZE.height = msg.data.resize.height;"," } else if (msg.data.canvas) {"," SIZE.width = msg.data.canvas.width;"," SIZE.height = msg.data.canvas.height;"," CONFETTI = module.exports.create(msg.data.canvas);"," }","}"].join("\n");try{t=new Worker(URL.createObjectURL(new Blob([i])))}catch(s){return void 0!==typeof console&&"function"==typeof console.warn&&console.warn("🎊 Could not load worker",s),null}!function(e){function t(t,a){e.postMessage({options:t||{},callback:a})}e.init=function(t){var a=t.transferControlToOffscreen();e.postMessage({canvas:a},[a])},e.fire=function(n,r,i){if(a)return t(n,null),a;var s=Math.random().toString(36).slice(2);return a=l((function(r){function l(t){t.data.callback===s&&(delete o[s],e.removeEventListener("message",l),a=null,g.clear(),i(),r())}e.addEventListener("message",l),t(n,s),o[s]=l.bind(null,{data:{callback:s}})}))},e.reset=function(){for(var t in e.postMessage({reset:!0}),o)o[t](),delete o[t]}}(t)}return t}}(),v={particleCount:50,angle:90,spread:45,startVelocity:45,decay:.9,gravity:1,drift:0,ticks:200,x:.5,y:.5,shapes:["square","circle"],zIndex:100,colors:["#26ccff","#a25afd","#ff5e7e","#88ff5a","#fcff42","#ffa62d","#ff36ff"],disableForReducedMotion:!1,scalar:1};function M(e,t,a){return function(e,t){return t?t(e):e}(e&&null!=e[t]?e[t]:v[t],a)}function y(e){return e<0?0:Math.floor(e)}function w(e){return parseInt(e,16)}function x(e){return e.map(C)}function C(e){var t=String(e).replace(/[^0-9a-f]/gi,"");return t.length<6&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),{r:w(t.substring(0,2)),g:w(t.substring(2,4)),b:w(t.substring(4,6))}}function I(e){e.width=document.documentElement.clientWidth,e.height=document.documentElement.clientHeight}function S(e){var t=e.getBoundingClientRect();e.width=t.width,e.height=t.height}function k(e,t){t.x+=Math.cos(t.angle2D)*t.velocity+t.drift,t.y+=Math.sin(t.angle2D)*t.velocity+t.gravity,t.velocity*=t.decay,t.flat?(t.wobble=0,t.wobbleX=t.x+10*t.scalar,t.wobbleY=t.y+10*t.scalar,t.tiltSin=0,t.tiltCos=0,t.random=1):(t.wobble+=t.wobbleSpeed,t.wobbleX=t.x+10*t.scalar*Math.cos(t.wobble),t.wobbleY=t.y+10*t.scalar*Math.sin(t.wobble),t.tiltAngle+=.1,t.tiltSin=Math.sin(t.tiltAngle),t.tiltCos=Math.cos(t.tiltAngle),t.random=Math.random()+2);var a=t.tick++/t.totalTicks,n=t.x+t.random*t.tiltCos,o=t.y+t.random*t.tiltSin,r=t.wobbleX+t.random*t.tiltCos,s=t.wobbleY+t.random*t.tiltSin;if(e.fillStyle="rgba("+t.color.r+", "+t.color.g+", "+t.color.b+", "+(1-a)+")",e.beginPath(),i&&"path"===t.shape.type&&"string"==typeof t.shape.path&&Array.isArray(t.shape.matrix))e.fill(function(e,t,a,n,o,r,i){var s=new Path2D(e),l=new Path2D;l.addPath(s,new DOMMatrix(t));var c=new Path2D;return c.addPath(l,new DOMMatrix([Math.cos(i)*o,Math.sin(i)*o,-Math.sin(i)*r,Math.cos(i)*r,a,n])),c}(t.shape.path,t.shape.matrix,t.x,t.y,.1*Math.abs(r-n),.1*Math.abs(s-o),Math.PI/10*t.wobble));else if("bitmap"===t.shape.type){var l=Math.PI/10*t.wobble,c=.1*Math.abs(r-n),u=.1*Math.abs(s-o),d=t.shape.bitmap.width*t.scalar,f=t.shape.bitmap.height*t.scalar,h=new DOMMatrix([Math.cos(l)*c,Math.sin(l)*c,-Math.sin(l)*u,Math.cos(l)*u,t.x,t.y]);h.multiplySelf(new DOMMatrix(t.shape.matrix));var m=e.createPattern(g.transform(t.shape.bitmap),"no-repeat");m.setTransform(h),e.globalAlpha=1-a,e.fillStyle=m,e.fillRect(t.x-d/2,t.y-f/2,d,f),e.globalAlpha=1}else if("circle"===t.shape)e.ellipse?e.ellipse(t.x,t.y,Math.abs(r-n)*t.ovalScalar,Math.abs(s-o)*t.ovalScalar,Math.PI/10*t.wobble,0,2*Math.PI):function(e,t,a,n,o,r,i,s,l){e.save(),e.translate(t,a),e.rotate(r),e.scale(n,o),e.arc(0,0,1,i,s,l),e.restore()}(e,t.x,t.y,Math.abs(r-n)*t.ovalScalar,Math.abs(s-o)*t.ovalScalar,Math.PI/10*t.wobble,0,2*Math.PI);else if("star"===t.shape)for(var p=Math.PI/2*3,b=4*t.scalar,v=8*t.scalar,M=t.x,y=t.y,w=5,x=Math.PI/w;w--;)M=t.x+Math.cos(p)*v,y=t.y+Math.sin(p)*v,e.lineTo(M,y),p+=x,M=t.x+Math.cos(p)*b,y=t.y+Math.sin(p)*b,e.lineTo(M,y),p+=x;else e.moveTo(Math.floor(t.x),Math.floor(t.y)),e.lineTo(Math.floor(t.wobbleX),Math.floor(o)),e.lineTo(Math.floor(r),Math.floor(s)),e.lineTo(Math.floor(n),Math.floor(t.wobbleY));return e.closePath(),e.fill(),t.tick<t.totalTicks}function P(e,a){var i,s=!e,c=!!M(a||{},"resize"),u=!1,d=M(a,"disableForReducedMotion",Boolean),f=r&&!!M(a||{},"useWorker")?b():null,h=s?I:S,m=!(!e||!f)&&!!e.__confetti_initialized,v="function"==typeof matchMedia&&matchMedia("(prefers-reduced-motion)").matches;function w(t,a,r){for(var s,c,u,d,f,m=M(t,"particleCount",y),b=M(t,"angle",Number),v=M(t,"spread",Number),w=M(t,"startVelocity",Number),C=M(t,"decay",Number),I=M(t,"gravity",Number),S=M(t,"drift",Number),P=M(t,"colors",x),T=M(t,"ticks",Number),E=M(t,"shapes"),D=M(t,"scalar"),O=!!M(t,"flat"),B=function(e){var t=M(e,"origin",Object);return t.x=M(t,"x",Number),t.y=M(t,"y",Number),t}(t),F=m,R=[],A=e.width*B.x,N=e.height*B.y;F--;)R.push((s={x:A,y:N,angle:b,spread:v,startVelocity:w,color:P[F%P.length],shape:E[(d=0,f=E.length,Math.floor(Math.random()*(f-d))+d)],ticks:T,decay:C,gravity:I,drift:S,scalar:D,flat:O},c=void 0,u=void 0,c=s.angle*(Math.PI/180),u=s.spread*(Math.PI/180),{x:s.x,y:s.y,wobble:10*Math.random(),wobbleSpeed:Math.min(.11,.1*Math.random()+.05),velocity:.5*s.startVelocity+Math.random()*s.startVelocity,angle2D:-c+(.5*u-Math.random()*u),tiltAngle:(.5*Math.random()+.25)*Math.PI,color:s.color,shape:s.shape,tick:0,totalTicks:s.ticks,decay:s.decay,drift:s.drift,random:Math.random()+2,tiltSin:0,tiltCos:0,wobbleX:0,wobbleY:0,gravity:3*s.gravity,ovalScalar:.6,scalar:s.scalar,flat:s.flat}));return i?i.addFettis(R):(i=function(e,t,a,r,i){var s,c,u=t.slice(),d=e.getContext("2d"),f=l((function(t){function l(){s=c=null,d.clearRect(0,0,r.width,r.height),g.clear(),i(),t()}s=p.frame((function t(){!n||r.width===o.width&&r.height===o.height||(r.width=e.width=o.width,r.height=e.height=o.height),r.width||r.height||(a(e),r.width=e.width,r.height=e.height),d.clearRect(0,0,r.width,r.height),(u=u.filter((function(e){return k(d,e)}))).length?s=p.frame(t):l()})),c=l}));return{addFettis:function(e){return u=u.concat(e),f},canvas:e,promise:f,reset:function(){s&&p.cancel(s),c&&c()}}}(e,R,h,a,r),i.promise)}function C(a){var n=d||M(a,"disableForReducedMotion",Boolean),o=M(a,"zIndex",Number);if(n&&v)return l((function(e){e()}));s&&i?e=i.canvas:s&&!e&&(e=function(e){var t=document.createElement("canvas");return t.style.position="fixed",t.style.top="0px",t.style.left="0px",t.style.pointerEvents="none",t.style.zIndex=e,t}(o),document.body.appendChild(e)),c&&!m&&h(e);var r={width:e.width,height:e.height};function g(){if(f){var t={getBoundingClientRect:function(){if(!s)return e.getBoundingClientRect()}};return h(t),void f.postMessage({resize:{width:t.width,height:t.height}})}r.width=r.height=null}function p(){i=null,c&&(u=!1,t.removeEventListener("resize",g)),s&&e&&(document.body.contains(e)&&document.body.removeChild(e),e=null,m=!1)}return f&&!m&&f.init(e),m=!0,f&&(e.__confetti_initialized=!0),c&&!u&&(u=!0,t.addEventListener("resize",g,!1)),f?f.fire(a,r,p):w(a,r,p)}return C.reset=function(){f&&f.reset(),i&&i.reset()},C}function T(){return m||(m=P(null,{useWorker:!0,resize:!0})),m}a.exports=function(){return T().apply(this,arguments)},a.exports.reset=function(){T().reset()},a.exports.create=P,a.exports.shapeFromPath=function(e){if(!i)throw new Error("path confetti are not supported in this browser");var t,a;"string"==typeof e?t=e:(t=e.path,a=e.matrix);var n=new Path2D(t),o=document.createElement("canvas").getContext("2d");if(!a){for(var r,s,l=1e3,c=l,u=l,d=0,f=0,h=0;h<l;h+=2)for(var m=0;m<l;m+=2)o.isPointInPath(n,h,m,"nonzero")&&(c=Math.min(c,h),u=Math.min(u,m),d=Math.max(d,h),f=Math.max(f,m));r=d-c,s=f-u;var g=Math.min(10/r,10/s);a=[g,0,0,g,-Math.round(r/2+c)*g,-Math.round(s/2+u)*g]}return{type:"path",path:t,matrix:a}},a.exports.shapeFromText=function(e){var t,a=1,n="#000000",o='"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", "EmojiOne Color", "Android Emoji", "Twemoji Mozilla", "system emoji", sans-serif';"string"==typeof e?t=e:(t=e.text,a="scalar"in e?e.scalar:a,o="fontFamily"in e?e.fontFamily:o,n="color"in e?e.color:n);var r=10*a,i=r+"px "+o,s=new OffscreenCanvas(r,r),l=s.getContext("2d");l.font=i;var c=l.measureText(t),u=Math.ceil(c.actualBoundingBoxRight+c.actualBoundingBoxLeft),d=Math.ceil(c.actualBoundingBoxAscent+c.actualBoundingBoxDescent),f=c.actualBoundingBoxLeft+2,h=c.actualBoundingBoxAscent+2;u+=4,d+=4,(l=(s=new OffscreenCanvas(u,d)).getContext("2d")).font=i,l.fillStyle=n,l.fillText(t,f,h);var m=1/a;return{type:"bitmap",bitmap:s.transferToImageBitmap(),matrix:[m,0,0,m,-u*m/2,-d*m/2]}}}(function(){return"undefined"!=typeof window?window:"undefined"!=typeof self?self:this||{}}(),M,!1);const y=M.exports;M.exports.create;const w=e({name:"UserSettings",components:{UserTagPreferences:t},props:{username:{type:String,required:!0}},setup(){const e=o(),t=r(),a=e.config.darkMode,n=e.config.likesConfetti,i=t.path.endsWith("new");return{configStore:e,darkMode:a,likesConfetti:n,route:t,isNewUser:i}},data:()=>({u:{},configLanguages:[{name:"English",code:"en"},{name:"French",code:"fr"}],selectedLanguages:[],registeredCourses:[],selectedCourseId:""}),async created(){this.u=await n(),this.configLanguages.forEach((e=>{console.log("afweatifvwzeatfvwzeta"+e.name)})),await this.loadRegisteredCourses()},methods:{updateDark(){this.configStore.updateDarkMode(this.configStore.config.darkMode)},updateConfetti(){this.configStore.updateLikesConfetti(this.configStore.config.likesConfetti),this.configStore.config.likesConfetti&&y({origin:{x:.5,y:1}})},async loadRegisteredCourses(){try{const e=await this.u.getActiveCourses(),t=a(),n=await Promise.all(e.map((async e=>{try{const a=t.getCourseDB(e.courseID);return await a.getCourseConfig()}catch{return{courseID:e.courseID,name:e.courseID}}})));this.registeredCourses=n.filter(Boolean)}catch(e){console.error("Failed to load registered courses:",e)}},onPreferencesSaved(){console.log("Preferences saved for course:",this.selectedCourseId)}}}),x={class:"text-subtitle-1"};const C=i(w,[["render",function(e,t,a,n,o,r){const i=s("v-alert"),M=s("v-checkbox"),y=s("v-divider"),w=s("v-list-item"),C=s("v-select"),I=s("user-tag-preferences");return c(),l("div",x,[e.isNewUser?(c(),u(i,{key:0,type:"success",class:"text-subtitle-1",variant:"tonal","prepend-icon":"mdi-check"},{default:m((()=>[g(" Welcome, "+p(e.username)+"! Please take a moment to look through these settings: ",1)])),_:1})):d("",!0),t[3]||(t[3]=f("h1",{class:"text-h3"},"Account Settings",-1)),t[4]||(t[4]=f("h2",{class:"text-h4"},"General:",-1)),h(M,{modelValue:e.configStore.config.likesConfetti,"onUpdate:modelValue":[t[0]||(t[0]=t=>e.configStore.config.likesConfetti=t),e.updateConfetti],label:"I like confetti"},null,8,["modelValue","onUpdate:modelValue"]),h(M,{modelValue:e.configStore.config.darkMode,"onUpdate:modelValue":[t[1]||(t[1]=t=>e.configStore.config.darkMode=t),e.updateDark],label:"I like the dark"},null,8,["modelValue","onUpdate:modelValue"]),h(y,{class:"my-6"}),t[5]||(t[5]=f("h2",{class:"text-h4 mb-4"},"Learning Preferences:",-1)),t[6]||(t[6]=f("p",{class:"text-body-2 text-medium-emphasis mb-4"},"Customize how content is presented in your registered courses.",-1)),h(C,{modelValue:e.selectedCourseId,"onUpdate:modelValue":t[2]||(t[2]=t=>e.selectedCourseId=t),items:e.registeredCourses,"item-title":"name","item-value":"courseID",label:"Select a course",variant:"outlined",density:"comfortable",class:"mb-4",style:{"max-width":"400px"}},{item:m((({props:e,item:t})=>[h(w,b(v(e)),{subtitle:m((()=>[g(p(t.raw.courseID),1)])),_:2},1040)])),_:1},8,["modelValue","items"]),e.selectedCourseId?(c(),u(I,{key:1,"course-id":e.selectedCourseId,onPreferencesSaved:e.onPreferencesSaved},null,8,["course-id","onPreferencesSaved"])):d("",!0)])}]]);export{C as default};
|
|
2
|
+
//# sourceMappingURL=User-NjHri3_k.js.map
|