@vue-skuilder/platform-ui 0.1.32-c → 0.1.32-e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/assets/{About-h5EHhy4v.js → About-C3u52t0d.js} +2 -2
  2. package/dist/assets/{About-h5EHhy4v.js.map → About-C3u52t0d.js.map} +1 -1
  3. package/dist/assets/{AdminDashboard-D_fVbmrH.js → AdminDashboard-Dz5u2cex.js} +2 -2
  4. package/dist/assets/{AdminDashboard-D_fVbmrH.js.map → AdminDashboard-Dz5u2cex.js.map} +1 -1
  5. package/dist/assets/{ClassroomCtrlPanel-FbHAe4-P.js → ClassroomCtrlPanel-Dk6oR2Ns.js} +2 -2
  6. package/dist/assets/{ClassroomCtrlPanel-FbHAe4-P.js.map → ClassroomCtrlPanel-Dk6oR2Ns.js.map} +1 -1
  7. package/dist/assets/{Classrooms-vh8viQEf.js → Classrooms-vb9OkpYQ.js} +2 -2
  8. package/dist/assets/{Classrooms-vh8viQEf.js.map → Classrooms-vb9OkpYQ.js.map} +1 -1
  9. package/dist/assets/{CourseRouter-CLHejMqU.js → CourseRouter-Blm2dYn-.js} +2 -2
  10. package/dist/assets/{CourseRouter-CLHejMqU.js.map → CourseRouter-Blm2dYn-.js.map} +1 -1
  11. package/dist/assets/{Courses-C8vz1OnP.js → Courses-CEw9ARaf.js} +2 -2
  12. package/dist/assets/{Courses-C8vz1OnP.js.map → Courses-CEw9ARaf.js.map} +1 -1
  13. package/dist/assets/{DataInputFormTester-I-3fAMti.js → DataInputFormTester-CGzywVuh.js} +2 -2
  14. package/dist/assets/{DataInputFormTester-I-3fAMti.js.map → DataInputFormTester-CGzywVuh.js.map} +1 -1
  15. package/dist/assets/{EloModeration-BfwQvQSb.js → EloModeration-DAmUYf5F.js} +2 -2
  16. package/dist/assets/{EloModeration-BfwQvQSb.js.map → EloModeration-DAmUYf5F.js.map} +1 -1
  17. package/dist/assets/{JoinCode-DsGel8Y3.js → JoinCode-B3oyqgv9.js} +2 -2
  18. package/dist/assets/{JoinCode-DsGel8Y3.js.map → JoinCode-B3oyqgv9.js.map} +1 -1
  19. package/dist/assets/{NewCourseDialog-It5vAHy2.js → NewCourseDialog-5K53pY-W.js} +2 -2
  20. package/dist/assets/{NewCourseDialog-It5vAHy2.js.map → NewCourseDialog-5K53pY-W.js.map} +1 -1
  21. package/dist/assets/{ReleaseNotes-BmQaqGVQ.js → ReleaseNotes-DJQ5CKxz.js} +2 -2
  22. package/dist/assets/{ReleaseNotes-BmQaqGVQ.js.map → ReleaseNotes-DJQ5CKxz.js.map} +1 -1
  23. package/dist/assets/{RequestPasswordReset-gQA8qclC.js → RequestPasswordReset-1bvNIeyh.js} +2 -2
  24. package/dist/assets/{RequestPasswordReset-gQA8qclC.js.map → RequestPasswordReset-1bvNIeyh.js.map} +1 -1
  25. package/dist/assets/{ResetPassword-HrFGsY46.js → ResetPassword-CDlcjyGc.js} +2 -2
  26. package/dist/assets/{ResetPassword-HrFGsY46.js.map → ResetPassword-CDlcjyGc.js.map} +1 -1
  27. package/dist/assets/{Study-DxtuUrKA.js → Study-Ci2qFB3t.js} +2 -2
  28. package/dist/assets/{Study-DxtuUrKA.js.map → Study-Ci2qFB3t.js.map} +1 -1
  29. package/dist/assets/{TagInformation-CYa7JfpS.js → TagInformation-CtiIiC9l.js} +2 -2
  30. package/dist/assets/{TagInformation-CYa7JfpS.js.map → TagInformation-CtiIiC9l.js.map} +1 -1
  31. package/dist/assets/{User-DLpxsu4d.js → User-CWCez7if.js} +2 -2
  32. package/dist/assets/{User-DLpxsu4d.js.map → User-CWCez7if.js.map} +1 -1
  33. package/dist/assets/{UserStats-Brxm4GwS.js → UserStats-BDj614VL.js} +2 -2
  34. package/dist/assets/{UserStats-Brxm4GwS.js.map → UserStats-BDj614VL.js.map} +1 -1
  35. package/dist/assets/{VerifyEmail-Ct0v0woa.js → VerifyEmail-Bt6Mb6Q3.js} +2 -2
  36. package/dist/assets/{VerifyEmail-Ct0v0woa.js.map → VerifyEmail-Bt6Mb6Q3.js.map} +1 -1
  37. package/dist/assets/{edit-ui.es-Dw6tBRhZ.js → edit-ui.es-BE3brRCi.js} +2 -2
  38. package/dist/assets/{edit-ui.es-Dw6tBRhZ.js.map → edit-ui.es-BE3brRCi.js.map} +1 -1
  39. package/dist/assets/index-C8n-yF4Q.js +3 -0
  40. package/dist/assets/index-C8n-yF4Q.js.map +1 -0
  41. package/dist/assets/{index-C-tLE4oV.js → index-CfcuevG4.js} +3 -3
  42. package/dist/assets/{index-C-tLE4oV.js.map → index-CfcuevG4.js.map} +1 -1
  43. package/dist/assets/{mousetrap-CgghW1lz.js → mousetrap-Ca0hLdT-.js} +2 -2
  44. package/dist/assets/{mousetrap-CgghW1lz.js.map → mousetrap-Ca0hLdT-.js.map} +1 -1
  45. package/dist/index.html +1 -1
  46. package/dist/sw.js +1 -1
  47. package/dist/sw.js.map +1 -1
  48. package/package.json +6 -6
  49. package/dist/assets/index-B94BKO5k.js +0 -3
  50. package/dist/assets/index-B94BKO5k.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Study-DxtuUrKA.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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"}
1
+ {"version":3,"file":"Study-Ci2qFB3t.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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"}
@@ -1,2 +1,2 @@
1
- import{d as i,V as e,k as t,m as n,h as a,D as o,_ as s,r as d,i as r,o as p,b as l,a as c,e as u,w as g,t as k,c as h,j as m}from"./index-B94BKO5k.js";import{allCourseWare as f}from"./index-C-tLE4oV.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-CYa7JfpS.js.map
1
+ import{d as i,V as e,k as t,m as n,h as a,D as o,_ as s,r as d,i as r,o as p,b as l,a as c,e as u,w as g,t as k,c as h,j as m}from"./index-C8n-yF4Q.js";import{allCourseWare as f}from"./index-CfcuevG4.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-CtiIiC9l.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TagInformation-CYa7JfpS.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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"}
1
+ {"version":3,"file":"TagInformation-CtiIiC9l.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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"}
@@ -1,2 +1,2 @@
1
- import{d as e,v as t,h as a,g as n,M as o,O as r,_ as i,r as s,i as l,o as c,c as u,j as d,b as f,a as h,w as m,e as g,t as p,P as b,Q as v}from"./index-B94BKO5k.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,A=[],R=e.width*B.x,z=e.height*B.y;F--;)A.push((s={x:R,y:z,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(A):(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,A,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-DLpxsu4d.js.map
1
+ import{d as e,v as t,h as a,g as n,M as o,O as r,_ as i,r as s,i as l,o as c,c as u,j as d,b as f,a as h,w as m,e as g,t as p,P as b,Q as v}from"./index-C8n-yF4Q.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,A=[],R=e.width*B.x,z=e.height*B.y;F--;)A.push((s={x:R,y:z,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(A):(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,A,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-CWCez7if.js.map