@vue-skuilder/platform-ui 0.2.35 → 0.2.36

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 (189) hide show
  1. package/dist/assets/{About-BWM7KlDK.js → About-74htcNLT.js} +2 -2
  2. package/dist/assets/{About-BWM7KlDK.js.map → About-74htcNLT.js.map} +1 -1
  3. package/dist/assets/AdminDashboard-B00qno2M.js +2 -0
  4. package/dist/assets/{AdminDashboard-CO2rxkF5.js.map → AdminDashboard-B00qno2M.js.map} +1 -1
  5. package/dist/assets/AdminLearner-SJNtSyJ_.js +2 -0
  6. package/dist/assets/{AdminLearner-CZO2Hlk1.js.map → AdminLearner-SJNtSyJ_.js.map} +1 -1
  7. package/dist/assets/BaseUserDB-CV2ZPZOR.js +1 -0
  8. package/dist/assets/ClassroomCtrlPanel-BSAG3h8B.js +2 -0
  9. package/dist/assets/{ClassroomCtrlPanel-cj6bokz5.js.map → ClassroomCtrlPanel-BSAG3h8B.js.map} +1 -1
  10. package/dist/assets/{Classrooms-BIC1PGz0.js → Classrooms-DXNEbtsM.js} +3 -3
  11. package/dist/assets/{Classrooms-BIC1PGz0.js.map → Classrooms-DXNEbtsM.js.map} +1 -1
  12. package/dist/assets/CouchDBSyncStrategy-BjM7ROXC.js +1 -0
  13. package/dist/assets/CourseRouter-CsVa_92r.js +7 -0
  14. package/dist/assets/{CourseRouter-CMMxD9us.js.map → CourseRouter-CsVa_92r.js.map} +1 -1
  15. package/dist/assets/CourseSyncService-CPU_Ll1h.js +1 -0
  16. package/dist/assets/CourseWare-BTFRjgBR-DBp_fIwH.js +3 -0
  17. package/dist/assets/{CourseWare-BTFRjgBR-C3wi5YHa.js.map → CourseWare-BTFRjgBR-DBp_fIwH.js.map} +1 -1
  18. package/dist/assets/{Courses-Dw7mgMnI.js → Courses-CB6GGtdm.js} +3 -3
  19. package/dist/assets/{Courses-Dw7mgMnI.js.map → Courses-CB6GGtdm.js.map} +1 -1
  20. package/dist/assets/EloModeration-DUBgs-Vh.js +2 -0
  21. package/dist/assets/{EloModeration-COgCrvb8.js.map → EloModeration-DUBgs-Vh.js.map} +1 -1
  22. package/dist/assets/{JoinCode-Fu9Tks7r.js → JoinCode-BBvYapCA.js} +2 -2
  23. package/dist/assets/{JoinCode-Fu9Tks7r.js.map → JoinCode-BBvYapCA.js.map} +1 -1
  24. package/dist/assets/MarkdownRenderer-WG9YrHpe.js +1 -0
  25. package/dist/assets/MarkdownRenderer-borh39Lq.js +53 -0
  26. package/dist/assets/MarkdownRenderer-borh39Lq.js.map +1 -0
  27. package/dist/assets/NewCourseDialog-DBgFVnt3.js +2 -0
  28. package/dist/assets/{NewCourseDialog-C11dSwWM.js.map → NewCourseDialog-DBgFVnt3.js.map} +1 -1
  29. package/dist/assets/PipelineDebugger-BHaqzqZw.js +177 -0
  30. package/dist/assets/PipelineDebugger-BHaqzqZw.js.map +1 -0
  31. package/dist/assets/PouchDataLayerProvider-DxsnSIKd.js +2 -0
  32. package/dist/assets/PouchDataLayerProvider-DxsnSIKd.js.map +1 -0
  33. package/dist/assets/{ReleaseNotes-CeTkuF5d.js → ReleaseNotes-Dg6mLL1C.js} +2 -2
  34. package/dist/assets/{ReleaseNotes-CeTkuF5d.js.map → ReleaseNotes-Dg6mLL1C.js.map} +1 -1
  35. package/dist/assets/RequestPasswordReset-CcFMTnTc.js +2 -0
  36. package/dist/assets/{RequestPasswordReset-vTzfGItp.js.map → RequestPasswordReset-CcFMTnTc.js.map} +1 -1
  37. package/dist/assets/ResetPassword-Dw_cBJU2.js +2 -0
  38. package/dist/assets/{ResetPassword-CmGaVYsI.js.map → ResetPassword-Dw_cBJU2.js.map} +1 -1
  39. package/dist/assets/StaticDataLayerProvider-CtgU3VBh.js +2 -0
  40. package/dist/assets/StaticDataLayerProvider-CtgU3VBh.js.map +1 -0
  41. package/dist/assets/Study-DDsGQCTJ.js +2 -0
  42. package/dist/assets/{Study-CkJvraIv.js.map → Study-DDsGQCTJ.js.map} +1 -1
  43. package/dist/assets/TagInformation-DBLoXA2a.js +2 -0
  44. package/dist/assets/{TagInformation-xZcQ1C1t.js.map → TagInformation-DBLoXA2a.js.map} +1 -1
  45. package/dist/assets/User-DfXUXjFb.js +2 -0
  46. package/dist/assets/User-DfXUXjFb.js.map +1 -0
  47. package/dist/assets/UserDBDebugger-DPqlc4O_.js +23 -0
  48. package/dist/assets/UserDBDebugger-DPqlc4O_.js.map +1 -0
  49. package/dist/assets/UserDBDebugger-xmycWjck.js +1 -0
  50. package/dist/assets/UserStats-C04YVYv7.js +2 -0
  51. package/dist/assets/{UserStats-CioNBbmL.js.map → UserStats-C04YVYv7.js.map} +1 -1
  52. package/dist/assets/VerifyEmail-Y05BSR57.js +2 -0
  53. package/dist/assets/{VerifyEmail-Bh-T9191.js.map → VerifyEmail-Y05BSR57.js.map} +1 -1
  54. package/dist/assets/admin-DcFjvYJw.js +21 -0
  55. package/dist/assets/admin-DcFjvYJw.js.map +1 -0
  56. package/dist/assets/chess-E2uOAyQS-BZi0vihz.js +7 -0
  57. package/dist/assets/{chess-E2uOAyQS-C8213VIQ.js.map → chess-E2uOAyQS-BZi0vihz.js.map} +1 -1
  58. package/dist/assets/chess-Lfm7Fsvs-DgN08Qx9.js +1 -0
  59. package/dist/assets/contentSource-DwznMSMs.js +34 -0
  60. package/dist/assets/contentSource-DwznMSMs.js.map +1 -0
  61. package/dist/assets/defineProperty-y9rbOPYz.js +1 -0
  62. package/dist/assets/dist-BcwaOf54.js +1 -0
  63. package/dist/assets/dist-BsRvt0gH.js +38 -0
  64. package/dist/assets/dist-BsRvt0gH.js.map +1 -0
  65. package/dist/assets/dist-CAHkbl3M.js +18 -0
  66. package/dist/assets/dist-CAHkbl3M.js.map +1 -0
  67. package/dist/assets/dist-CgW7D_Gh.js +1 -0
  68. package/dist/assets/dist-Dnehy0sn.js +1 -0
  69. package/dist/assets/dist-Dp6eBE2S.js +64 -0
  70. package/dist/assets/dist-Dp6eBE2S.js.map +1 -0
  71. package/dist/assets/edit-ui.es-BWqvElsJ.js +1 -0
  72. package/dist/assets/edit-ui.es-UaQFL_My.js +41 -0
  73. package/dist/assets/edit-ui.es-UaQFL_My.js.map +1 -0
  74. package/dist/assets/elo-B5qCwvSC.js +2 -0
  75. package/dist/assets/elo-B5qCwvSC.js.map +1 -0
  76. package/dist/assets/elo-COgu6Hu5.js +2 -0
  77. package/dist/assets/elo-COgu6Hu5.js.map +1 -0
  78. package/dist/assets/elo-Cwa8a3Yo.js +1 -0
  79. package/dist/assets/eloDistance-BV7vfiK5.js +2 -0
  80. package/dist/assets/eloDistance-BV7vfiK5.js.map +1 -0
  81. package/dist/assets/eloDistance-MReQeAuj.js +1 -0
  82. package/dist/assets/french-Dk7YG8Td-CD7Hms2j.js +2 -0
  83. package/dist/assets/{french-Dk7YG8Td-D9eV2DXL.js.map → french-Dk7YG8Td-CD7Hms2j.js.map} +1 -1
  84. package/dist/assets/french-evUMlbbq-nGCjilG6.js +1 -0
  85. package/dist/assets/hierarchyDefinition-DLC5DjaA.js +2 -0
  86. package/dist/assets/hierarchyDefinition-DLC5DjaA.js.map +1 -0
  87. package/dist/assets/{index-NFrxkZjT.css → index-B7mmpKZd.css} +1 -1
  88. package/dist/assets/index-CK-rfSIx.js +4 -0
  89. package/dist/assets/{index-CDxzcoT1.js.map → index-CK-rfSIx.js.map} +1 -1
  90. package/dist/assets/interferenceMitigator-D78KgOxz.js +2 -0
  91. package/dist/assets/interferenceMitigator-D78KgOxz.js.map +1 -0
  92. package/dist/assets/logshim-YQI0WloD.js +2 -0
  93. package/dist/assets/logshim-YQI0WloD.js.map +1 -0
  94. package/dist/assets/math-DR3fXDcX-C9KfHLHP.js +1 -0
  95. package/dist/assets/math-D_8HiEQR-E4QDLrWp.js +34 -0
  96. package/dist/assets/{math-D_8HiEQR-DdtcYQLB.js.map → math-D_8HiEQR-E4QDLrWp.js.map} +1 -1
  97. package/dist/assets/moment-DbT30ZpG.js +5 -0
  98. package/dist/assets/moment-DbT30ZpG.js.map +1 -0
  99. package/dist/assets/piano-BN5Btq91-CnKhyLGE.js +1 -0
  100. package/dist/assets/piano-DF1g6yaX-Ck3BH5EK.js +2 -0
  101. package/dist/assets/{piano-DF1g6yaX-B7f_kt1X.js.map → piano-DF1g6yaX-Ck3BH5EK.js.map} +1 -1
  102. package/dist/assets/pitch-CgGJFkZ1-Dd0LzmEe.js +2 -0
  103. package/dist/assets/{pitch-CgGJFkZ1-CuezrVTg.js.map → pitch-CgGJFkZ1-Dd0LzmEe.js.map} +1 -1
  104. package/dist/assets/pitch-Dn0iNqiS-BxAdpDDb.js +1 -0
  105. package/dist/assets/prescribed-BWO17Gan.js +2 -0
  106. package/dist/assets/prescribed-BWO17Gan.js.map +1 -0
  107. package/dist/assets/relativePriority-DwPMECAp.js +2 -0
  108. package/dist/assets/relativePriority-DwPMECAp.js.map +1 -0
  109. package/dist/assets/server-CqR7xtQy.js +2 -0
  110. package/dist/assets/server-CqR7xtQy.js.map +1 -0
  111. package/dist/assets/{sightsing-BFQ7HRig-CLh3Xcy7.js → sightsing-BFQ7HRig-DV69ELZf.js} +23 -23
  112. package/dist/assets/{sightsing-BFQ7HRig-CLh3Xcy7.js.map → sightsing-BFQ7HRig-DV69ELZf.js.map} +1 -1
  113. package/dist/assets/sightsing-CJX3k0Fd-CG94OiDr.js +1 -0
  114. package/dist/assets/srs-DGscV6W4.js +1 -0
  115. package/dist/assets/srs-DOsG9Y-i.js +2 -0
  116. package/dist/assets/srs-DOsG9Y-i.js.map +1 -0
  117. package/dist/assets/tagRoles-jR-PJAgj.js +2 -0
  118. package/dist/assets/tagRoles-jR-PJAgj.js.map +1 -0
  119. package/dist/assets/typing-BevtfWlp-CvStu5BY.js +2 -0
  120. package/dist/assets/{typing-BevtfWlp-B__x_Ia1.js.map → typing-BevtfWlp-CvStu5BY.js.map} +1 -1
  121. package/dist/assets/typing-k-ojjO7G-AF8vU_q7.js +1 -0
  122. package/dist/assets/userDBKeys-DYLGKnVC.js +4 -0
  123. package/dist/assets/userDBKeys-DYLGKnVC.js.map +1 -0
  124. package/dist/assets/userTagPreference-cZCPqadC.js +2 -0
  125. package/dist/assets/userTagPreference-cZCPqadC.js.map +1 -0
  126. package/dist/assets/validators-lpYAHmRR.js +2 -0
  127. package/dist/assets/validators-lpYAHmRR.js.map +1 -0
  128. package/dist/assets/word-work-BOnRlZgd-CCGZdwyf.js +2 -0
  129. package/dist/assets/{word-work-BOnRlZgd-CxcTzMPz.js.map → word-work-BOnRlZgd-CCGZdwyf.js.map} +1 -1
  130. package/dist/assets/word-work-Dd6tIKrt-BNTSCq5F.js +1 -0
  131. package/dist/assets/{workbox-window.prod.es5-r2bRTooK.js → workbox-window.prod.es5-YsLcd14J.js} +1 -1
  132. package/dist/assets/{workbox-window.prod.es5-r2bRTooK.js.map → workbox-window.prod.es5-YsLcd14J.js.map} +1 -1
  133. package/dist/index.html +17 -7
  134. package/dist/sw.js +1 -1
  135. package/dist/sw.js.map +1 -1
  136. package/package.json +7 -7
  137. package/dist/assets/AdminDashboard-CO2rxkF5.js +0 -2
  138. package/dist/assets/AdminLearner-CZO2Hlk1.js +0 -2
  139. package/dist/assets/ClassroomCtrlPanel-cj6bokz5.js +0 -2
  140. package/dist/assets/CourseRouter-CMMxD9us.js +0 -7
  141. package/dist/assets/CourseWare-BTFRjgBR-C3wi5YHa.js +0 -3
  142. package/dist/assets/EloModeration-COgCrvb8.js +0 -2
  143. package/dist/assets/MarkdownRenderer-U_iPiA2x-DDruDu7E.js +0 -53
  144. package/dist/assets/MarkdownRenderer-U_iPiA2x-DDruDu7E.js.map +0 -1
  145. package/dist/assets/MarkdownRenderer-U_iPiA2x-VCa5mXh1.js +0 -1
  146. package/dist/assets/NewCourseDialog-C11dSwWM.js +0 -2
  147. package/dist/assets/RequestPasswordReset-vTzfGItp.js +0 -2
  148. package/dist/assets/ResetPassword-CmGaVYsI.js +0 -2
  149. package/dist/assets/Study-CkJvraIv.js +0 -2
  150. package/dist/assets/TagInformation-xZcQ1C1t.js +0 -2
  151. package/dist/assets/User-MzKFSneO.js +0 -3
  152. package/dist/assets/User-MzKFSneO.js.map +0 -1
  153. package/dist/assets/UserStats-CioNBbmL.js +0 -2
  154. package/dist/assets/VerifyEmail-Bh-T9191.js +0 -2
  155. package/dist/assets/admin-Dt07rW2C.js +0 -21
  156. package/dist/assets/admin-Dt07rW2C.js.map +0 -1
  157. package/dist/assets/chess-E2uOAyQS-C8213VIQ.js +0 -7
  158. package/dist/assets/chess-Lfm7Fsvs-6ElY3d5h.js +0 -1
  159. package/dist/assets/common-ui.es-B9r6QiWN.js +0 -38
  160. package/dist/assets/common-ui.es-B9r6QiWN.js.map +0 -1
  161. package/dist/assets/common-ui.es-j6sezLNk.js +0 -1
  162. package/dist/assets/dist-BeppzTWu.js +0 -380
  163. package/dist/assets/dist-BeppzTWu.js.map +0 -1
  164. package/dist/assets/dist-C1hpwy00.js +0 -1
  165. package/dist/assets/dist-CKO_fXB-.js +0 -18
  166. package/dist/assets/dist-CKO_fXB-.js.map +0 -1
  167. package/dist/assets/dist-CkRURFlm.js +0 -1
  168. package/dist/assets/dist-V9Xbab2f.js +0 -12
  169. package/dist/assets/dist-V9Xbab2f.js.map +0 -1
  170. package/dist/assets/edit-ui.es-B00e6OcT.js +0 -36
  171. package/dist/assets/edit-ui.es-B00e6OcT.js.map +0 -1
  172. package/dist/assets/edit-ui.es-BGTYLTZO.js +0 -1
  173. package/dist/assets/french-Dk7YG8Td-D9eV2DXL.js +0 -2
  174. package/dist/assets/french-evUMlbbq-DOmp0PEx.js +0 -1
  175. package/dist/assets/index-CDxzcoT1.js +0 -4
  176. package/dist/assets/math-DR3fXDcX-Clr1rrj8.js +0 -1
  177. package/dist/assets/math-D_8HiEQR-DdtcYQLB.js +0 -34
  178. package/dist/assets/piano-BN5Btq91-BO9b38qV.js +0 -1
  179. package/dist/assets/piano-DF1g6yaX-B7f_kt1X.js +0 -2
  180. package/dist/assets/pitch-CgGJFkZ1-CuezrVTg.js +0 -2
  181. package/dist/assets/pitch-Dn0iNqiS-L0LRhcjZ.js +0 -1
  182. package/dist/assets/server-BP-NvFg7.js +0 -2
  183. package/dist/assets/server-BP-NvFg7.js.map +0 -1
  184. package/dist/assets/sightsing-CJX3k0Fd-DiVzeNly.js +0 -1
  185. package/dist/assets/typing-BevtfWlp-B__x_Ia1.js +0 -2
  186. package/dist/assets/typing-k-ojjO7G-Dn4uH4pS.js +0 -1
  187. package/dist/assets/word-work-BOnRlZgd-CxcTzMPz.js +0 -2
  188. package/dist/assets/word-work-Dd6tIKrt-BOmhWlr6.js +0 -1
  189. /package/dist/assets/{common-ui-BY2Ut5jf.css → dist-BY2Ut5jf.css} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"TagInformation-xZcQ1C1t.js","names":[],"sources":["../../src/components/Courses/TagInformation.vue","../../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","<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"],"mappings":"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"}
1
+ {"version":3,"file":"TagInformation-DBLoXA2a.js","names":[],"sources":["../../src/components/Courses/TagInformation.vue","../../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","<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"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import"./chunk-D6hFPZc3.js";import{$ as e,C as t,D as n,H as r,Ht as i,K as a,Rt as o,S as s,T as c,_ as l,b as u,v as d,y as f}from"./vue.runtime.esm-bundler--Fxmd6l9.js";import{r as p}from"./vue-router-HoUBO3s7.js";import"./MarkdownRenderer-borh39Lq.js";import"./moment-DbT30ZpG.js";import{g as m,h,t as g,w as _}from"./dist-BsRvt0gH.js";import"./contentSource-DwznMSMs.js";import"./dist-Dp6eBE2S.js";import"./PipelineDebugger-BHaqzqZw.js";import{d as v}from"./userDBKeys-DYLGKnVC.js";import"./eloDistance-BV7vfiK5.js";import{t as y}from"./index-CK-rfSIx.js";var b=c({name:`UserSettings`,components:{UserTagPreferences:g},props:{username:{type:String,required:!0}},setup(){let e=h(),t=p();return{configStore:e,darkMode:e.config.darkMode,likesConfetti:e.config.likesConfetti,route:t,isNewUser:t.path.endsWith(`new`)}},data(){return{u:{},configLanguages:[{name:`English`,code:`en`},{name:`French`,code:`fr`}],selectedLanguages:[],registeredCourses:[],selectedCourseId:``}},async created(){this.u=await m(),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&&_({origin:{x:.5,y:1}})},async loadRegisteredCourses(){try{let e=await this.u.getActiveCourses(),t=v();this.registeredCourses=(await Promise.all(e.map(async e=>{try{return await t.getCourseDB(e.courseID).getCourseConfig()}catch{return{courseID:e.courseID,name:e.courseID}}}))).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`};function _sfc_render(c,p,m,h,g,_){let v=a(`v-alert`),y=a(`v-checkbox`),b=a(`v-divider`),S=a(`v-list-item`),C=a(`v-select`),w=a(`user-tag-preferences`);return r(),u(`div`,x,[c.isNewUser?(r(),d(v,{key:0,type:`success`,class:`text-subtitle-1`,variant:`tonal`,"prepend-icon":`mdi-check`},{default:e(()=>[s(` Welcome, `+i(c.username)+`! Please take a moment to look through these settings: `,1)]),_:1})):f(``,!0),p[3]||(p[3]=l(`h1`,{class:`text-h3`},`Account Settings`,-1)),p[4]||(p[4]=l(`h2`,{class:`text-h4`},`General:`,-1)),t(y,{modelValue:c.configStore.config.likesConfetti,"onUpdate:modelValue":[p[0]||(p[0]=e=>c.configStore.config.likesConfetti=e),c.updateConfetti],label:`I like confetti`},null,8,[`modelValue`,`onUpdate:modelValue`]),t(y,{modelValue:c.configStore.config.darkMode,"onUpdate:modelValue":[p[1]||(p[1]=e=>c.configStore.config.darkMode=e),c.updateDark],label:`I like the dark`},null,8,[`modelValue`,`onUpdate:modelValue`]),t(b,{class:`my-6`}),p[5]||(p[5]=l(`h2`,{class:`text-h4 mb-4`},`Learning Preferences:`,-1)),p[6]||(p[6]=l(`p`,{class:`text-body-2 text-medium-emphasis mb-4`},`Customize how content is presented in your registered courses.`,-1)),t(C,{modelValue:c.selectedCourseId,"onUpdate:modelValue":p[2]||(p[2]=e=>c.selectedCourseId=e),items:c.registeredCourses,"item-title":`name`,"item-value":`courseID`,label:`Select a course`,variant:`outlined`,density:`comfortable`,class:`mb-4`,style:{"max-width":`400px`}},{item:e(({props:r,item:a})=>[t(S,o(n(r)),{subtitle:e(()=>[s(i(a.raw.courseID),1)]),_:2},1040)]),_:1},8,[`modelValue`,`items`]),c.selectedCourseId?(r(),d(w,{key:1,"course-id":c.selectedCourseId,onPreferencesSaved:c.onPreferencesSaved},null,8,[`course-id`,`onPreferencesSaved`])):f(``,!0)])}var S=y(b,[[`render`,_sfc_render]]);export{S as default};
2
+ //# sourceMappingURL=User-DfXUXjFb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"User-DfXUXjFb.js","names":[],"sources":["../../src/views/User.vue","../../src/views/User.vue"],"sourcesContent":["<template>\n <div class=\"text-subtitle-1\">\n <v-alert v-if=\"isNewUser\" type=\"success\" class=\"text-subtitle-1\" variant=\"tonal\" :prepend-icon=\"'mdi-check'\">\n Welcome, {{ username }}! Please take a moment to look through these settings:\n </v-alert>\n\n <h1 class=\"text-h3\">Account Settings</h1>\n <h2 class=\"text-h4\">General:</h2>\n\n <v-checkbox\n v-model=\"configStore.config.likesConfetti\"\n label=\"I like confetti\"\n @update:model-value=\"updateConfetti\"\n />\n <v-checkbox v-model=\"configStore.config.darkMode\" label=\"I like the dark\" @update:model-value=\"updateDark\" />\n <!-- <h2 class=\"text-h4\">Languages:</h2>\n I am near-fluent or better in the following languages:\n {{ selectedLanguages.toString() }}\n <v-checkbox\n v-for=\"(language, i) in configLanguages\"\n :key=\"i\"\n :label=\"language.name\"\n :value=\"language.code\"\n v-model=\"selectedLanguages\"\n @update:model-value=\"updateLanguage\"\n /> -->\n\n <v-divider class=\"my-6\" />\n\n <h2 class=\"text-h4 mb-4\">Learning Preferences:</h2>\n <p class=\"text-body-2 text-medium-emphasis mb-4\">Customize how content is presented in your registered courses.</p>\n\n <v-select\n v-model=\"selectedCourseId\"\n :items=\"registeredCourses\"\n item-title=\"name\"\n item-value=\"courseID\"\n label=\"Select a course\"\n variant=\"outlined\"\n density=\"comfortable\"\n class=\"mb-4\"\n style=\"max-width: 400px\"\n >\n <template #item=\"{ props, item }\">\n <v-list-item v-bind=\"props\">\n <template #subtitle>\n {{ item.raw.courseID }}\n </template>\n </v-list-item>\n </template>\n </v-select>\n\n <user-tag-preferences\n v-if=\"selectedCourseId\"\n :course-id=\"selectedCourseId\"\n @preferences-saved=\"onPreferencesSaved\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { getCurrentUser, useConfigStore, UserTagPreferences } from '@vue-skuilder/common-ui';\nimport { UserDBInterface, getDataLayer } from '@vue-skuilder/db';\nimport { CourseConfig } from '@vue-skuilder/common';\nimport confetti from 'canvas-confetti';\nimport { defineComponent, PropType } from 'vue';\nimport { useRoute } from 'vue-router';\n\ninterface Language {\n name: string;\n code: string;\n}\n\nexport default defineComponent({\n name: 'UserSettings',\n\n components: {\n UserTagPreferences,\n },\n\n props: {\n username: {\n type: String as PropType<string>,\n required: true,\n },\n },\n\n setup() {\n const configStore = useConfigStore();\n const route = useRoute();\n\n const darkMode = configStore.config.darkMode;\n const likesConfetti = configStore.config.likesConfetti;\n\n const isNewUser = route.path.endsWith('new');\n\n return { configStore, darkMode, likesConfetti, route, isNewUser };\n },\n\n data() {\n return {\n u: {} as UserDBInterface,\n configLanguages: [\n {\n name: 'English',\n code: 'en',\n },\n {\n name: 'French',\n code: 'fr',\n },\n ] as Language[],\n selectedLanguages: [] as string[],\n registeredCourses: [] as CourseConfig[],\n selectedCourseId: '' as string,\n };\n },\n\n async created() {\n this.u = await getCurrentUser();\n this.configLanguages.forEach((l) => {\n console.log(`afweatifvwzeatfvwzeta` + l.name);\n });\n\n // Load registered courses for preferences selector\n await this.loadRegisteredCourses();\n },\n\n methods: {\n updateDark(): void {\n this.configStore.updateDarkMode(this.configStore.config.darkMode);\n },\n\n updateConfetti(): void {\n this.configStore.updateLikesConfetti(this.configStore.config.likesConfetti);\n\n if (this.configStore.config.likesConfetti) {\n confetti({\n origin: {\n x: 0.5,\n y: 1,\n },\n });\n }\n },\n\n async loadRegisteredCourses(): Promise<void> {\n try {\n const activeCourses = await this.u.getActiveCourses();\n const dataLayer = getDataLayer();\n\n // Fetch course configs for display names\n const courseConfigs = await Promise.all(\n activeCourses.map(async (reg) => {\n try {\n const courseDB = dataLayer.getCourseDB(reg.courseID);\n return await courseDB.getCourseConfig();\n } catch {\n // Return minimal config if fetch fails\n return { courseID: reg.courseID, name: reg.courseID } as CourseConfig;\n }\n })\n );\n\n this.registeredCourses = courseConfigs.filter(Boolean);\n } catch (e) {\n console.error('Failed to load registered courses:', e);\n }\n },\n\n onPreferencesSaved(): void {\n // Could show a snackbar or other feedback here\n console.log('Preferences saved for course:', this.selectedCourseId);\n },\n },\n});\n</script>\n\n<style scoped></style>\n","<template>\n <div class=\"text-subtitle-1\">\n <v-alert v-if=\"isNewUser\" type=\"success\" class=\"text-subtitle-1\" variant=\"tonal\" :prepend-icon=\"'mdi-check'\">\n Welcome, {{ username }}! Please take a moment to look through these settings:\n </v-alert>\n\n <h1 class=\"text-h3\">Account Settings</h1>\n <h2 class=\"text-h4\">General:</h2>\n\n <v-checkbox\n v-model=\"configStore.config.likesConfetti\"\n label=\"I like confetti\"\n @update:model-value=\"updateConfetti\"\n />\n <v-checkbox v-model=\"configStore.config.darkMode\" label=\"I like the dark\" @update:model-value=\"updateDark\" />\n <!-- <h2 class=\"text-h4\">Languages:</h2>\n I am near-fluent or better in the following languages:\n {{ selectedLanguages.toString() }}\n <v-checkbox\n v-for=\"(language, i) in configLanguages\"\n :key=\"i\"\n :label=\"language.name\"\n :value=\"language.code\"\n v-model=\"selectedLanguages\"\n @update:model-value=\"updateLanguage\"\n /> -->\n\n <v-divider class=\"my-6\" />\n\n <h2 class=\"text-h4 mb-4\">Learning Preferences:</h2>\n <p class=\"text-body-2 text-medium-emphasis mb-4\">Customize how content is presented in your registered courses.</p>\n\n <v-select\n v-model=\"selectedCourseId\"\n :items=\"registeredCourses\"\n item-title=\"name\"\n item-value=\"courseID\"\n label=\"Select a course\"\n variant=\"outlined\"\n density=\"comfortable\"\n class=\"mb-4\"\n style=\"max-width: 400px\"\n >\n <template #item=\"{ props, item }\">\n <v-list-item v-bind=\"props\">\n <template #subtitle>\n {{ item.raw.courseID }}\n </template>\n </v-list-item>\n </template>\n </v-select>\n\n <user-tag-preferences\n v-if=\"selectedCourseId\"\n :course-id=\"selectedCourseId\"\n @preferences-saved=\"onPreferencesSaved\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { getCurrentUser, useConfigStore, UserTagPreferences } from '@vue-skuilder/common-ui';\nimport { UserDBInterface, getDataLayer } from '@vue-skuilder/db';\nimport { CourseConfig } from '@vue-skuilder/common';\nimport confetti from 'canvas-confetti';\nimport { defineComponent, PropType } from 'vue';\nimport { useRoute } from 'vue-router';\n\ninterface Language {\n name: string;\n code: string;\n}\n\nexport default defineComponent({\n name: 'UserSettings',\n\n components: {\n UserTagPreferences,\n },\n\n props: {\n username: {\n type: String as PropType<string>,\n required: true,\n },\n },\n\n setup() {\n const configStore = useConfigStore();\n const route = useRoute();\n\n const darkMode = configStore.config.darkMode;\n const likesConfetti = configStore.config.likesConfetti;\n\n const isNewUser = route.path.endsWith('new');\n\n return { configStore, darkMode, likesConfetti, route, isNewUser };\n },\n\n data() {\n return {\n u: {} as UserDBInterface,\n configLanguages: [\n {\n name: 'English',\n code: 'en',\n },\n {\n name: 'French',\n code: 'fr',\n },\n ] as Language[],\n selectedLanguages: [] as string[],\n registeredCourses: [] as CourseConfig[],\n selectedCourseId: '' as string,\n };\n },\n\n async created() {\n this.u = await getCurrentUser();\n this.configLanguages.forEach((l) => {\n console.log(`afweatifvwzeatfvwzeta` + l.name);\n });\n\n // Load registered courses for preferences selector\n await this.loadRegisteredCourses();\n },\n\n methods: {\n updateDark(): void {\n this.configStore.updateDarkMode(this.configStore.config.darkMode);\n },\n\n updateConfetti(): void {\n this.configStore.updateLikesConfetti(this.configStore.config.likesConfetti);\n\n if (this.configStore.config.likesConfetti) {\n confetti({\n origin: {\n x: 0.5,\n y: 1,\n },\n });\n }\n },\n\n async loadRegisteredCourses(): Promise<void> {\n try {\n const activeCourses = await this.u.getActiveCourses();\n const dataLayer = getDataLayer();\n\n // Fetch course configs for display names\n const courseConfigs = await Promise.all(\n activeCourses.map(async (reg) => {\n try {\n const courseDB = dataLayer.getCourseDB(reg.courseID);\n return await courseDB.getCourseConfig();\n } catch {\n // Return minimal config if fetch fails\n return { courseID: reg.courseID, name: reg.courseID } as CourseConfig;\n }\n })\n );\n\n this.registeredCourses = courseConfigs.filter(Boolean);\n } catch (e) {\n console.error('Failed to load registered courses:', e);\n }\n },\n\n onPreferencesSaved(): void {\n // Could show a snackbar or other feedback here\n console.log('Preferences saved for course:', this.selectedCourseId);\n },\n },\n});\n</script>\n\n<style scoped></style>\n"],"mappings":"ijBCyEA,IAAA,EAAe,EAAgB,CAC7B,KAAM,eAEN,WAAY,CACV,mBAAA,EACD,CAED,MAAO,CACL,SAAU,CACR,KAAM,OACN,SAAU,GACX,CACF,CAED,OAAQ,CACN,IAAM,EAAc,GAAgB,CAC9B,EAAQ,GAAU,CAOxB,MAAO,CAAE,cAAa,SALL,EAAY,OAAO,SAKJ,cAJV,EAAY,OAAO,cAIM,QAAO,UAFpC,EAAM,KAAK,SAAS,MAAM,CAEqB,EAGnE,MAAO,CACL,MAAO,CACL,EAAG,EAAC,CACJ,gBAAiB,CACf,CACE,KAAM,UACN,KAAM,KACP,CACD,CACE,KAAM,SACN,KAAM,KACP,CACH,CACA,kBAAmB,EAAC,CACpB,kBAAmB,EAAC,CACpB,iBAAkB,GACnB,EAGH,MAAM,SAAU,CACd,KAAK,EAAI,MAAM,GAAgB,CAC/B,KAAK,gBAAgB,QAAS,GAAM,CAClC,QAAQ,IAAI,wBAA0B,EAAE,KAAK,EAC7C,CAGF,MAAM,KAAK,uBAAuB,EAGpC,QAAS,CACP,YAAmB,CACjB,KAAK,YAAY,eAAe,KAAK,YAAY,OAAO,SAAS,EAGnE,gBAAuB,CACrB,KAAK,YAAY,oBAAoB,KAAK,YAAY,OAAO,cAAc,CAEvE,KAAK,YAAY,OAAO,eAC1B,EAAS,CACP,OAAQ,CACN,EAAG,GACH,EAAG,EACJ,CACF,CAAC,EAIN,MAAM,uBAAuC,CAC3C,GAAI,CACF,IAAM,EAAgB,MAAM,KAAK,EAAE,kBAAkB,CAC/C,EAAY,GAAc,CAehC,KAAK,mBAZiB,MAAM,QAAQ,IAClC,EAAc,IAAI,KAAO,IAAQ,CAC/B,GAAI,CAEF,OAAO,MADU,EAAU,YAAY,EAAI,SAAS,CAC9B,iBAAiB,MACjC,CAEN,MAAO,CAAE,SAAU,EAAI,SAAU,KAAM,EAAI,SAAS,GAEvD,CACF,EAEsC,OAAO,QAAQ,OAC/C,EAAG,CACV,QAAQ,MAAM,qCAAsC,EAAE,GAI1D,oBAA2B,CAEzB,QAAQ,IAAI,gCAAiC,KAAK,iBAAiB,EAEtE,CACF,CAAC,IA9KK,MAAM,kBAAiB,mKAA5B,EAwDM,MAxDN,EAwDM,CAvDW,EAAA,WAAA,GAAA,CAAf,EAEU,EAAA,CAJd,IAAA,EAE8B,KAAK,UAAU,MAAM,kBAAkB,QAAQ,QAAS,eAAc,cAFpG,QAAA,MAGe,CAHf,EAEiH,aAClG,EAAG,EAAA,SAAQ,CAAG,0DACzB,EAAA,CAAA,CAAA,CAJJ,EAAA,KAAA,EAAA,GAAA,GAAA,aAMI,EAAyC,KAAA,CAArC,MAAM,UAAS,CAAC,mBAAgB,GAAA,cACpC,EAAiC,KAAA,CAA7B,MAAM,UAAS,CAAC,WAAQ,GAAA,EAE5B,EAIE,EAAA,CAbN,WAUe,EAAA,YAAY,OAAO,cAVlC,sBAAA,CAAA,EAAA,KAAA,EAAA,GAAA,GAUe,EAAA,YAAY,OAAO,cAAa,GAEpB,EAAA,eAAA,CADrB,MAAM,gEAGR,EAA6G,EAAA,CAdjH,WAcyB,EAAA,YAAY,OAAO,SAd5C,sBAAA,CAAA,EAAA,KAAA,EAAA,GAAA,GAcyB,EAAA,YAAY,OAAO,SAAQ,GAA+C,EAAA,WAAA,CAA7C,MAAM,gEAaxD,EAA0B,EAAA,CAAf,MAAM,OAAM,CAAA,aAEvB,EAAmD,KAAA,CAA/C,MAAM,eAAc,CAAC,wBAAqB,GAAA,cAC9C,EAAmH,IAAA,CAAhH,MAAM,wCAAuC,CAAC,iEAA8D,GAAA,EAE/G,EAkBW,EAAA,CAlDf,WAiCe,EAAA,iBAjCf,sBAAA,EAAA,KAAA,EAAA,GAAA,GAAA,EAiCe,iBAAgB,GACxB,MAAO,EAAA,kBACR,aAAW,OACX,aAAW,WACX,MAAM,kBACN,QAAQ,WACR,QAAQ,cACR,MAAM,OACN,MAAA,CAAA,YAAA,QAAwB,GAEb,KAAI,GAKC,CALG,QAAO,UAAI,CAC5B,EAIc,EAhDtB,EAAA,EA4C6B,EAAK,CAAA,CAAA,CACb,SAAQ,MACM,CA9CnC,EAAA,EA8Ce,EAAK,IAAI,SAAQ,CAAA,EAAA,CAAA,CAAA,CA9ChC,EAAA,WAAA,EAAA,6BAqDY,EAAA,kBAAA,GAAA,CADR,EAIE,EAAA,CAxDN,IAAA,EAsDO,YAAW,EAAA,iBACX,mBAAmB,EAAA,gEAvD1B,EAAA,GAAA,GAAA"}
@@ -0,0 +1,23 @@
1
+ import"./chunk-D6hFPZc3.js";import{k as e}from"./PipelineDebugger-BHaqzqZw.js";import{d as t,n,o as r,s as i}from"./userDBKeys-DYLGKnVC.js";function getUserDB(){try{return t().getUserDB()}catch{return e.print(`[UserDB Debug] Data layer not initialized yet.`),null}}function getRawDB(){let t=getUserDB();return t?t.localDB||(e.print(`[UserDB Debug] Unable to access raw database instance.`),null):null}function formatTimestamp(e){return new Date(e).toLocaleString()}var a={showUser(){let t=getUserDB();t&&(console.group(`👤 User Information`),e.print(`Username: ${t.getUsername()}`),e.print(`Logged in: ${t.isLoggedIn()?`Yes ✅`:`No (Guest) ❌`}`),t.getConfig().then(t=>{e.print(`Configuration:`),e.print(JSON.stringify(t,null,2))}).catch(t=>{e.print(`Error loading config: ${t.message}`)}).finally(()=>{console.groupEnd()}))},async showScheduledReviews(t){let n=getUserDB();if(!n){e.print(`[UserDB Debug] Data layer not available`);return}e.print(`[UserDB Debug] Fetching pending reviews${t?` for course: ${t}`:``}...`);try{let r=await n.getPendingReviews(t);if(e.print(`[UserDB Debug] Got ${r.length} reviews`),console.group(`📅 Scheduled Reviews${t?` (${t})`:``}`),e.print(`Total: ${r.length}`),r.length>0){let t=new Map;for(let e of r)t.has(e.courseId)||t.set(e.courseId,[]),t.get(e.courseId).push(e);for(let[n,r]of t){console.group(`Course: ${n} (${r.length} reviews)`);let t=r.sort((e,t)=>{let n=typeof e.reviewTime==`string`?e.reviewTime:e.reviewTime.toISOString(),r=typeof t.reviewTime==`string`?t.reviewTime:t.reviewTime.toISOString();return new Date(n).getTime()-new Date(r).getTime()});for(let n of t.slice(0,10)){let t=typeof n.reviewTime==`string`?n.reviewTime:n.reviewTime.toISOString();e.print(` ${n.cardId.slice(0,12)}... @ ${formatTimestamp(t)} [${n.scheduledFor}/${n.schedulingAgentId}]`)}t.length>10&&e.print(` ... and ${t.length-10} more`),console.groupEnd()}}console.groupEnd()}catch(t){e.print(`Error loading scheduled reviews: ${t.message}`)}},async showCourseRegistrations(){let t=getUserDB();if(t)try{let n=await t.getActiveCourses();console.group(`📚 Course Registrations`),e.print(`Total: ${n.length}`),n.length>0&&console.table(n.map(e=>({courseId:e.courseID,status:e.status||`active`,elo:typeof e.elo==`number`?e.elo.toFixed(0):e.elo?.global?.score?.toFixed(0)||`N/A`}))),console.groupEnd()}catch(t){e.print(`Error loading course registrations: ${t.message}`)}},async showCardHistory(t){let a=getRawDB();if(a)try{let o=(await n(a,i[r.CARDRECORD])).rows.filter(e=>e.doc&&e.doc.cardID===t).map(e=>e.doc);if(console.group(`🎴 Card History: ${t}`),e.print(`Total interactions: ${o.length}`),o.length>0){let t=o.sort((e,t)=>new Date(t.timestamp).getTime()-new Date(e.timestamp).getTime());console.table(t.slice(0,20).map(e=>({time:formatTimestamp(e.timestamp),outcome:e.outcome||`N/A`,duration:e.duration?`${(e.duration/1e3).toFixed(1)}s`:`N/A`,courseId:e.courseId}))),t.length>20&&e.print(`... and ${t.length-20} more interactions`)}console.groupEnd()}catch(t){e.print(`Error loading card history: ${t.message}`)}},async queryByType(t,a=50){let o=getRawDB();if(o)try{let s=i[r[t]];if(!s){e.print(`Unknown document type: ${t}`);return}let c=await n(o,s);if(console.group(`📄 Documents: ${t}`),e.print(`Total: ${c.rows.length}`),e.print(`Prefix: ${s}`),c.rows.length>0){e.print(`Sample documents:`);let t=c.rows.slice(0,Math.min(a,c.rows.length));for(let n of t)e.print(`\n${n.id}:`),e.print(JSON.stringify(n.doc,null,2));c.rows.length>a&&e.print(`\n... and ${c.rows.length-a} more documents`)}console.groupEnd()}catch(t){e.print(`Error querying documents: ${t.message}`)}},async dbInfo(){let t=getRawDB();if(t)try{let n=await t.info();console.group(`ℹ️ Database Information`),e.print(`Database name: ${n.db_name}`),e.print(`Total documents: ${n.doc_count}`),e.print(`Update sequence: ${n.update_seq}`),`disk_size`in n&&e.print(`Disk size: ${(n.disk_size||0)/1024/1024} MB`),e.print(`
2
+ Document counts by type:`);let r=await t.allDocs({include_docs:!1}),a=new Map;for(let e of r.rows){let t=`other`;for(let[n,r]of Object.entries(i))if(e.id.startsWith(r)){t=n;break}a.set(t,(a.get(t)||0)+1)}console.table(Array.from(a.entries()).sort((e,t)=>t[1]-e[1]).map(([e,t])=>({type:e,count:t}))),console.groupEnd()}catch(t){e.print(`Error getting database info: ${t.message}`)}},listDocTypes(){console.group(`📋 Available Document Types`),e.print(`Use with queryByType(type):`);for(let[t,n]of Object.entries(i))e.print(` ${t.padEnd(30)} → prefix: "${n}"`);console.groupEnd()},async export(t=!1){let n=getRawDB(),r=getUserDB();if(!n||!r)return`{}`;try{let a={username:r.getUsername(),loggedIn:r.isLoggedIn(),timestamp:new Date().toISOString()};if(t){let e=await n.allDocs({include_docs:!0});a.documents=e.rows.map(e=>({id:e.id,doc:e.doc})),a.totalDocs=e.rows.length}else{let e=await n.allDocs({include_docs:!1});a.totalDocs=e.rows.length;let t=new Map;for(let n of e.rows){let e=`other`;for(let[t,r]of Object.entries(i))if(n.id.startsWith(r)){e=t;break}t.set(e,(t.get(e)||0)+1)}a.docCounts=Object.fromEntries(t)}let o=JSON.stringify(a,null,2);return e.print(`[UserDB Debug] Database info exported. Copy the returned string or use:`),e.print(` copy(window.skuilder.userdb.export())`),t||e.print(` For full content export: window.skuilder.userdb.export(true)`),o}catch(t){return e.print(`Error exporting database: ${t.message}`),`{}`}},async raw(t){let n=getRawDB();if(n)try{let r=await t(n);e.print(`[UserDB Debug] Query result:`),e.print(r)}catch(t){e.print(`[UserDB Debug] Query error: ${t.message}`)}},help(){e.print(`
3
+ 🔧 UserDB Debug API
4
+
5
+ Commands:
6
+ .showUser() Show current user info and config
7
+ .showScheduledReviews(courseId?) Show scheduled reviews (optionally filter by course)
8
+ .showCourseRegistrations() Show all course registrations
9
+ .showCardHistory(cardId) Show interaction history for a card
10
+ .queryByType(docType, limit?) Query documents by type (e.g., 'SCHEDULED_CARD')
11
+ .listDocTypes() List all available document types
12
+ .dbInfo() Show database info and statistics
13
+ .export(includeContent?) Export database info (true = include all docs)
14
+ .raw(queryFn) Execute raw PouchDB query
15
+ .help() Show this help message
16
+
17
+ Examples:
18
+ window.skuilder.userdb.showUser()
19
+ window.skuilder.userdb.showScheduledReviews('course123')
20
+ window.skuilder.userdb.queryByType('SCHEDULED_CARD', 10)
21
+ window.skuilder.userdb.raw(db => db.allDocs({ limit: 5 }))
22
+ `)}};function mountUserDBDebugger(){if(typeof window>`u`)return;let e=window;e.skuilder=e.skuilder||{},e.skuilder.userdb=a}export{a as n,mountUserDBDebugger as t};
23
+ //# sourceMappingURL=UserDBDebugger-DPqlc4O_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserDBDebugger-DPqlc4O_.js","names":[],"sources":["../../../db/dist/core/UserDBDebugger.mjs"],"sourcesContent":["import \"../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../util/logger.mjs\";\nimport { getDataLayer } from \"../factory.mjs\";\nimport { DocType, DocTypePrefixes } from \"./types/types-legacy.mjs\";\nimport { filterAllDocsByPrefix } from \"../impl/common/userDBKeys.mjs\";\n//#region src/core/UserDBDebugger.ts\n/**\n* Get the user database instance safely\n*/\nfunction getUserDB() {\n\ttry {\n\t\treturn getDataLayer().getUserDB();\n\t} catch {\n\t\tlogger.print(\"[UserDB Debug] Data layer not initialized yet.\");\n\t\treturn null;\n\t}\n}\n/**\n* Get raw PouchDB instance for advanced queries\n* This accesses the internal localDB property\n*/\nfunction getRawDB() {\n\tconst userDB = getUserDB();\n\tif (!userDB) return null;\n\tconst rawDB = userDB.localDB;\n\tif (!rawDB) {\n\t\tlogger.print(\"[UserDB Debug] Unable to access raw database instance.\");\n\t\treturn null;\n\t}\n\treturn rawDB;\n}\n/**\n* Format a timestamp for display\n*/\nfunction formatTimestamp(isoString) {\n\treturn new Date(isoString).toLocaleString();\n}\n/**\n* Console API object exposed on window.skuilder.userdb\n*/\nconst userDBDebugAPI = {\n\tshowUser() {\n\t\tconst userDB = getUserDB();\n\t\tif (!userDB) return;\n\t\tconsole.group(\"👤 User Information\");\n\t\tlogger.print(`Username: ${userDB.getUsername()}`);\n\t\tlogger.print(`Logged in: ${userDB.isLoggedIn() ? \"Yes ✅\" : \"No (Guest) ❌\"}`);\n\t\tuserDB.getConfig().then((config) => {\n\t\t\tlogger.print(\"Configuration:\");\n\t\t\tlogger.print(JSON.stringify(config, null, 2));\n\t\t}).catch((err) => {\n\t\t\tlogger.print(`Error loading config: ${err.message}`);\n\t\t}).finally(() => {\n\t\t\tconsole.groupEnd();\n\t\t});\n\t},\n\tasync showScheduledReviews(courseId) {\n\t\tconst userDB = getUserDB();\n\t\tif (!userDB) {\n\t\t\tlogger.print(\"[UserDB Debug] Data layer not available\");\n\t\t\treturn;\n\t\t}\n\t\tlogger.print(`[UserDB Debug] Fetching pending reviews${courseId ? ` for course: ${courseId}` : \"\"}...`);\n\t\ttry {\n\t\t\tconst reviews = await userDB.getPendingReviews(courseId);\n\t\t\tlogger.print(`[UserDB Debug] Got ${reviews.length} reviews`);\n\t\t\tconsole.group(`📅 Scheduled Reviews${courseId ? ` (${courseId})` : \"\"}`);\n\t\t\tlogger.print(`Total: ${reviews.length}`);\n\t\t\tif (reviews.length > 0) {\n\t\t\t\tconst byCourse = /* @__PURE__ */ new Map();\n\t\t\t\tfor (const review of reviews) {\n\t\t\t\t\tif (!byCourse.has(review.courseId)) byCourse.set(review.courseId, []);\n\t\t\t\t\tbyCourse.get(review.courseId).push(review);\n\t\t\t\t}\n\t\t\t\tfor (const [course, courseReviews] of byCourse) {\n\t\t\t\t\tconsole.group(`Course: ${course} (${courseReviews.length} reviews)`);\n\t\t\t\t\tconst sorted = courseReviews.sort((a, b) => {\n\t\t\t\t\t\tconst timeA = typeof a.reviewTime === \"string\" ? a.reviewTime : a.reviewTime.toISOString();\n\t\t\t\t\t\tconst timeB = typeof b.reviewTime === \"string\" ? b.reviewTime : b.reviewTime.toISOString();\n\t\t\t\t\t\treturn new Date(timeA).getTime() - new Date(timeB).getTime();\n\t\t\t\t\t});\n\t\t\t\t\tfor (const review of sorted.slice(0, 10)) {\n\t\t\t\t\t\tconst reviewTimeStr = typeof review.reviewTime === \"string\" ? review.reviewTime : review.reviewTime.toISOString();\n\t\t\t\t\t\tlogger.print(` ${review.cardId.slice(0, 12)}... @ ${formatTimestamp(reviewTimeStr)} [${review.scheduledFor}/${review.schedulingAgentId}]`);\n\t\t\t\t\t}\n\t\t\t\t\tif (sorted.length > 10) logger.print(` ... and ${sorted.length - 10} more`);\n\t\t\t\t\tconsole.groupEnd();\n\t\t\t\t}\n\t\t\t}\n\t\t\tconsole.groupEnd();\n\t\t} catch (err) {\n\t\t\tlogger.print(`Error loading scheduled reviews: ${err.message}`);\n\t\t}\n\t},\n\tasync showCourseRegistrations() {\n\t\tconst userDB = getUserDB();\n\t\tif (!userDB) return;\n\t\ttry {\n\t\t\tconst registrations = await userDB.getActiveCourses();\n\t\t\tconsole.group(\"📚 Course Registrations\");\n\t\t\tlogger.print(`Total: ${registrations.length}`);\n\t\t\tif (registrations.length > 0) console.table(registrations.map((reg) => ({\n\t\t\t\tcourseId: reg.courseID,\n\t\t\t\tstatus: reg.status || \"active\",\n\t\t\t\telo: typeof reg.elo === \"number\" ? reg.elo.toFixed(0) : reg.elo?.global?.score?.toFixed(0) || \"N/A\"\n\t\t\t})));\n\t\t\tconsole.groupEnd();\n\t\t} catch (err) {\n\t\t\tlogger.print(`Error loading course registrations: ${err.message}`);\n\t\t}\n\t},\n\tasync showCardHistory(cardId) {\n\t\tconst rawDB = getRawDB();\n\t\tif (!rawDB) return;\n\t\ttry {\n\t\t\tconst cardHistories = (await filterAllDocsByPrefix(rawDB, DocTypePrefixes[DocType.CARDRECORD])).rows.filter((row) => row.doc && row.doc.cardID === cardId).map((row) => row.doc);\n\t\t\tconsole.group(`🎴 Card History: ${cardId}`);\n\t\t\tlogger.print(`Total interactions: ${cardHistories.length}`);\n\t\t\tif (cardHistories.length > 0) {\n\t\t\t\tconst sorted = cardHistories.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n\t\t\t\tconsole.table(sorted.slice(0, 20).map((doc) => ({\n\t\t\t\t\ttime: formatTimestamp(doc.timestamp),\n\t\t\t\t\toutcome: doc.outcome || \"N/A\",\n\t\t\t\t\tduration: doc.duration ? `${(doc.duration / 1e3).toFixed(1)}s` : \"N/A\",\n\t\t\t\t\tcourseId: doc.courseId\n\t\t\t\t})));\n\t\t\t\tif (sorted.length > 20) logger.print(`... and ${sorted.length - 20} more interactions`);\n\t\t\t}\n\t\t\tconsole.groupEnd();\n\t\t} catch (err) {\n\t\t\tlogger.print(`Error loading card history: ${err.message}`);\n\t\t}\n\t},\n\tasync queryByType(docType, limit = 50) {\n\t\tconst rawDB = getRawDB();\n\t\tif (!rawDB) return;\n\t\ttry {\n\t\t\tconst prefix = DocTypePrefixes[DocType[docType]];\n\t\t\tif (!prefix) {\n\t\t\t\tlogger.print(`Unknown document type: ${docType}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await filterAllDocsByPrefix(rawDB, prefix);\n\t\t\tconsole.group(`📄 Documents: ${docType}`);\n\t\t\tlogger.print(`Total: ${result.rows.length}`);\n\t\t\tlogger.print(`Prefix: ${prefix}`);\n\t\t\tif (result.rows.length > 0) {\n\t\t\t\tlogger.print(\"Sample documents:\");\n\t\t\t\tconst samples = result.rows.slice(0, Math.min(limit, result.rows.length));\n\t\t\t\tfor (const row of samples) {\n\t\t\t\t\tlogger.print(`\\n${row.id}:`);\n\t\t\t\t\tlogger.print(JSON.stringify(row.doc, null, 2));\n\t\t\t\t}\n\t\t\t\tif (result.rows.length > limit) logger.print(`\\n... and ${result.rows.length - limit} more documents`);\n\t\t\t}\n\t\t\tconsole.groupEnd();\n\t\t} catch (err) {\n\t\t\tlogger.print(`Error querying documents: ${err.message}`);\n\t\t}\n\t},\n\tasync dbInfo() {\n\t\tconst rawDB = getRawDB();\n\t\tif (!rawDB) return;\n\t\ttry {\n\t\t\tconst info = await rawDB.info();\n\t\t\tconsole.group(\"ℹ️ Database Information\");\n\t\t\tlogger.print(`Database name: ${info.db_name}`);\n\t\t\tlogger.print(`Total documents: ${info.doc_count}`);\n\t\t\tlogger.print(`Update sequence: ${info.update_seq}`);\n\t\t\tif (\"disk_size\" in info) logger.print(`Disk size: ${(info.disk_size || 0) / 1024 / 1024} MB`);\n\t\t\tlogger.print(\"\\nDocument counts by type:\");\n\t\t\tconst allDocs = await rawDB.allDocs({ include_docs: false });\n\t\t\tconst typeCounts = /* @__PURE__ */ new Map();\n\t\t\tfor (const row of allDocs.rows) {\n\t\t\t\tlet prefix = \"other\";\n\t\t\t\tfor (const [type, typePrefix] of Object.entries(DocTypePrefixes)) if (row.id.startsWith(typePrefix)) {\n\t\t\t\t\tprefix = type;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ttypeCounts.set(prefix, (typeCounts.get(prefix) || 0) + 1);\n\t\t\t}\n\t\t\tconsole.table(Array.from(typeCounts.entries()).sort((a, b) => b[1] - a[1]).map(([type, count]) => ({\n\t\t\t\ttype,\n\t\t\t\tcount\n\t\t\t})));\n\t\t\tconsole.groupEnd();\n\t\t} catch (err) {\n\t\t\tlogger.print(`Error getting database info: ${err.message}`);\n\t\t}\n\t},\n\tlistDocTypes() {\n\t\tconsole.group(\"📋 Available Document Types\");\n\t\tlogger.print(\"Use with queryByType(type):\");\n\t\tfor (const [type, prefix] of Object.entries(DocTypePrefixes)) logger.print(` ${type.padEnd(30)} → prefix: \"${prefix}\"`);\n\t\tconsole.groupEnd();\n\t},\n\tasync export(includeContent = false) {\n\t\tconst rawDB = getRawDB();\n\t\tconst userDB = getUserDB();\n\t\tif (!rawDB || !userDB) return \"{}\";\n\t\ttry {\n\t\t\tconst data = {\n\t\t\t\tusername: userDB.getUsername(),\n\t\t\t\tloggedIn: userDB.isLoggedIn(),\n\t\t\t\ttimestamp: (/* @__PURE__ */ new Date()).toISOString()\n\t\t\t};\n\t\t\tif (includeContent) {\n\t\t\t\tconst allDocs = await rawDB.allDocs({ include_docs: true });\n\t\t\t\tdata.documents = allDocs.rows.map((row) => ({\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tdoc: row.doc\n\t\t\t\t}));\n\t\t\t\tdata.totalDocs = allDocs.rows.length;\n\t\t\t} else {\n\t\t\t\tconst allDocs = await rawDB.allDocs({ include_docs: false });\n\t\t\t\tdata.totalDocs = allDocs.rows.length;\n\t\t\t\tconst typeCounts = /* @__PURE__ */ new Map();\n\t\t\t\tfor (const row of allDocs.rows) {\n\t\t\t\t\tlet prefix = \"other\";\n\t\t\t\t\tfor (const [type, typePrefix] of Object.entries(DocTypePrefixes)) if (row.id.startsWith(typePrefix)) {\n\t\t\t\t\t\tprefix = type;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ttypeCounts.set(prefix, (typeCounts.get(prefix) || 0) + 1);\n\t\t\t\t}\n\t\t\t\tdata.docCounts = Object.fromEntries(typeCounts);\n\t\t\t}\n\t\t\tconst json = JSON.stringify(data, null, 2);\n\t\t\tlogger.print(\"[UserDB Debug] Database info exported. Copy the returned string or use:\");\n\t\t\tlogger.print(\" copy(window.skuilder.userdb.export())\");\n\t\t\tif (!includeContent) logger.print(\" For full content export: window.skuilder.userdb.export(true)\");\n\t\t\treturn json;\n\t\t} catch (err) {\n\t\t\tlogger.print(`Error exporting database: ${err.message}`);\n\t\t\treturn \"{}\";\n\t\t}\n\t},\n\tasync raw(queryFn) {\n\t\tconst rawDB = getRawDB();\n\t\tif (!rawDB) return;\n\t\ttry {\n\t\t\tconst result = await queryFn(rawDB);\n\t\t\tlogger.print(\"[UserDB Debug] Query result:\");\n\t\t\tlogger.print(result);\n\t\t} catch (err) {\n\t\t\tlogger.print(`[UserDB Debug] Query error: ${err.message}`);\n\t\t}\n\t},\n\thelp() {\n\t\tlogger.print(`\n🔧 UserDB Debug API\n\nCommands:\n .showUser() Show current user info and config\n .showScheduledReviews(courseId?) Show scheduled reviews (optionally filter by course)\n .showCourseRegistrations() Show all course registrations\n .showCardHistory(cardId) Show interaction history for a card\n .queryByType(docType, limit?) Query documents by type (e.g., 'SCHEDULED_CARD')\n .listDocTypes() List all available document types\n .dbInfo() Show database info and statistics\n .export(includeContent?) Export database info (true = include all docs)\n .raw(queryFn) Execute raw PouchDB query\n .help() Show this help message\n\nExamples:\n window.skuilder.userdb.showUser()\n window.skuilder.userdb.showScheduledReviews('course123')\n window.skuilder.userdb.queryByType('SCHEDULED_CARD', 10)\n window.skuilder.userdb.raw(db => db.allDocs({ limit: 5 }))\n`);\n\t}\n};\n/**\n* Mount the debug API on window.skuilder.userdb\n*/\nfunction mountUserDBDebugger() {\n\tif (typeof window === \"undefined\") return;\n\tconst win = window;\n\twin.skuilder = win.skuilder || {};\n\twin.skuilder.userdb = userDBDebugAPI;\n}\n//#endregion\nexport { mountUserDBDebugger, userDBDebugAPI };\n\n//# sourceMappingURL=UserDBDebugger.mjs.map"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import"./moment-DbT30ZpG.js";import"./PipelineDebugger-BHaqzqZw.js";import{t as e}from"./UserDBDebugger-DPqlc4O_.js";export{e as mountUserDBDebugger};
@@ -0,0 +1,2 @@
1
+ import"./chunk-D6hFPZc3.js";import{H as e,Ht as t,S as n,T as r,_ as i,b as a,ut as o,z as s}from"./vue.runtime.esm-bundler--Fxmd6l9.js";import"./MarkdownRenderer-borh39Lq.js";import"./moment-DbT30ZpG.js";import{g as c}from"./dist-BsRvt0gH.js";import"./contentSource-DwznMSMs.js";import"./dist-Dp6eBE2S.js";import"./PipelineDebugger-BHaqzqZw.js";import"./eloDistance-BV7vfiK5.js";var l=r({__name:`UserStats`,setup(r){let l=o(null),u=o([]);return s(async()=>{l.value=await c(),u.value=(await Promise.all([1,7,30].map(e=>l.value.getReviewsForcast(e)))).map(e=>e.length)}),(r,o)=>(e(),a(`div`,null,[o[0]||(o[0]=i(`h2`,null,`Stats!`,-1)),n(` One day: `+t(u.value[0])+` `,1),o[1]||(o[1]=i(`br`,null,null,-1)),n(` Seven day: `+t(u.value[1])+` `,1),o[2]||(o[2]=i(`br`,null,null,-1)),n(` Thirty Day: `+t(u.value[2]),1)]))}});export{l as default};
2
+ //# sourceMappingURL=UserStats-C04YVYv7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserStats-CioNBbmL.js","names":[],"sources":["../../src/components/User/UserStats.vue","../../src/components/User/UserStats.vue"],"sourcesContent":["<template>\n <div>\n <h2>Stats!</h2>\n One day: {{ scheduledReviews[0] }}\n <br />\n Seven day: {{ scheduledReviews[1] }}\n <br />\n Thirty Day: {{ scheduledReviews[2] }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted } from 'vue';\nimport { User } from '@vue-skuilder/db';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nconst user = ref<User | null>(null);\nconst scheduledReviews = ref<number[]>([]);\n\nonMounted(async () => {\n user.value = await getCurrentUser();\n\n // Using Promise.all to handle all forecasts concurrently\n const days = [1, 7, 30];\n const forecasts = await Promise.all(days.map((d) => user.value!.getReviewsForcast(d)));\n scheduledReviews.value = forecasts.map((f) => f.length);\n});\n</script>\n\n<style scoped></style>\n","<template>\n <div>\n <h2>Stats!</h2>\n One day: {{ scheduledReviews[0] }}\n <br />\n Seven day: {{ scheduledReviews[1] }}\n <br />\n Thirty Day: {{ scheduledReviews[2] }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted } from 'vue';\nimport { User } from '@vue-skuilder/db';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nconst user = ref<User | null>(null);\nconst scheduledReviews = ref<number[]>([]);\n\nonMounted(async () => {\n user.value = await getCurrentUser();\n\n // Using Promise.all to handle all forecasts concurrently\n const days = [1, 7, 30];\n const forecasts = await Promise.all(days.map((d) => user.value!.getReviewsForcast(d)));\n scheduledReviews.value = forecasts.map((f) => f.length);\n});\n</script>\n\n<style scoped></style>\n"],"mappings":"mUCgBA,IAAM,EAAO,EAAiB,KAAK,CAC7B,EAAmB,EAAc,EAAE,CAAC,QAE1C,EAAU,SAAY,CACpB,EAAK,MAAQ,MAAM,GAAgB,CAKnC,EAAiB,OADC,MAAM,QAAQ,IADnB,CAAC,EAAG,EAAG,GAAG,CACkB,IAAK,GAAM,EAAK,MAAO,kBAAkB,EAAE,CAAC,CAAC,EACnD,IAAK,GAAM,EAAE,OAAO,EACvD"}
1
+ {"version":3,"file":"UserStats-C04YVYv7.js","names":[],"sources":["../../src/components/User/UserStats.vue","../../src/components/User/UserStats.vue"],"sourcesContent":["<template>\n <div>\n <h2>Stats!</h2>\n One day: {{ scheduledReviews[0] }}\n <br />\n Seven day: {{ scheduledReviews[1] }}\n <br />\n Thirty Day: {{ scheduledReviews[2] }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted } from 'vue';\nimport { User } from '@vue-skuilder/db';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nconst user = ref<User | null>(null);\nconst scheduledReviews = ref<number[]>([]);\n\nonMounted(async () => {\n user.value = await getCurrentUser();\n\n // Using Promise.all to handle all forecasts concurrently\n const days = [1, 7, 30];\n const forecasts = await Promise.all(days.map((d) => user.value!.getReviewsForcast(d)));\n scheduledReviews.value = forecasts.map((f) => f.length);\n});\n</script>\n\n<style scoped></style>\n","<template>\n <div>\n <h2>Stats!</h2>\n One day: {{ scheduledReviews[0] }}\n <br />\n Seven day: {{ scheduledReviews[1] }}\n <br />\n Thirty Day: {{ scheduledReviews[2] }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted } from 'vue';\nimport { User } from '@vue-skuilder/db';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nconst user = ref<User | null>(null);\nconst scheduledReviews = ref<number[]>([]);\n\nonMounted(async () => {\n user.value = await getCurrentUser();\n\n // Using Promise.all to handle all forecasts concurrently\n const days = [1, 7, 30];\n const forecasts = await Promise.all(days.map((d) => user.value!.getReviewsForcast(d)));\n scheduledReviews.value = forecasts.map((f) => f.length);\n});\n</script>\n\n<style scoped></style>\n"],"mappings":"iaCgBA,IAAM,EAAO,EAAiB,KAAK,CAC7B,EAAmB,EAAc,EAAE,CAAC,QAE1C,EAAU,SAAY,CACpB,EAAK,MAAQ,MAAM,GAAgB,CAKnC,EAAiB,OADC,MAAM,QAAQ,IADnB,CAAC,EAAG,EAAG,GAAG,CACkB,IAAK,GAAM,EAAK,MAAO,kBAAkB,EAAE,CAAC,CAAC,EACnD,IAAK,GAAM,EAAE,OAAO,EACvD"}
@@ -0,0 +1,2 @@
1
+ import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,S as i,T as a,v as o}from"./vue.runtime.esm-bundler--Fxmd6l9.js";import"./MarkdownRenderer-borh39Lq.js";import"./moment-DbT30ZpG.js";import{c as s}from"./dist-BsRvt0gH.js";import"./contentSource-DwznMSMs.js";import"./dist-Dp6eBE2S.js";import"./PipelineDebugger-BHaqzqZw.js";import"./eloDistance-BV7vfiK5.js";import{t as c}from"./index-CK-rfSIx.js";var l=a({name:`VerifyEmailView`,components:{VerifyEmail:s},methods:{handleVerified(e){console.log(`User ${e} verified successfully`)},handleError(e){console.error(`Verification error:`,e)},goToLogin(){this.$router.push({name:`login`})},goToHome(){this.$router.push({name:`home`})}}});function _sfc_render(a,s,c,l,u,d){let f=r(`v-btn`),p=r(`verify-email`,!0);return n(),o(p,{onVerified:a.handleVerified,onError:a.handleError},{"success-action":e(()=>[t(f,{color:`primary`,onClick:a.goToLogin},{default:e(()=>s[0]||(s[0]=[i(` Continue to Login `)])),_:1},8,[`onClick`])]),"error-action":e(()=>[t(f,{variant:`text`,onClick:a.goToHome},{default:e(()=>s[1]||(s[1]=[i(` Back to Home `)])),_:1},8,[`onClick`])]),_:1},8,[`onVerified`,`onError`])}var u=c(l,[[`render`,_sfc_render]]);export{u as default};
2
+ //# sourceMappingURL=VerifyEmail-Y05BSR57.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VerifyEmail-Bh-T9191.js","names":[],"sources":["../../src/views/VerifyEmail.vue","../../src/views/VerifyEmail.vue"],"sourcesContent":["<template>\n <verify-email @verified=\"handleVerified\" @error=\"handleError\">\n <template #success-action>\n <v-btn color=\"primary\" @click=\"goToLogin\">\n Continue to Login\n </v-btn>\n </template>\n <template #error-action>\n <v-btn variant=\"text\" @click=\"goToHome\">\n Back to Home\n </v-btn>\n </template>\n </verify-email>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { VerifyEmail } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'VerifyEmailView',\n\n components: {\n VerifyEmail,\n },\n\n methods: {\n handleVerified(username: string) {\n console.log(`User ${username} verified successfully`);\n },\n\n handleError(error: string) {\n console.error('Verification error:', error);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n\n goToHome() {\n this.$router.push({ name: 'home' });\n },\n },\n});\n</script>\n","<template>\n <verify-email @verified=\"handleVerified\" @error=\"handleError\">\n <template #success-action>\n <v-btn color=\"primary\" @click=\"goToLogin\">\n Continue to Login\n </v-btn>\n </template>\n <template #error-action>\n <v-btn variant=\"text\" @click=\"goToHome\">\n Back to Home\n </v-btn>\n </template>\n </verify-email>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { VerifyEmail } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'VerifyEmailView',\n\n components: {\n VerifyEmail,\n },\n\n methods: {\n handleVerified(username: string) {\n console.log(`User ${username} verified successfully`);\n },\n\n handleError(error: string) {\n console.error('Verification error:', error);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n\n goToHome() {\n this.$router.push({ name: 'home' });\n },\n },\n});\n</script>\n"],"mappings":"6TCmBA,IAAA,EAAe,EAAgB,CAC7B,KAAM,kBAEN,WAAY,CACV,YAAA,EACD,CAED,QAAS,CACP,eAAe,EAAkB,CAC/B,QAAQ,IAAI,QAAQ,EAAQ,wBAAyB,EAGvD,YAAY,EAAe,CACzB,QAAQ,MAAM,sBAAuB,EAAM,EAG7C,WAAY,CACV,KAAK,QAAQ,KAAK,CAAE,KAAM,QAAS,CAAC,EAGtC,UAAW,CACT,KAAK,QAAQ,KAAK,CAAE,KAAM,OAAQ,CAAC,EAEtC,CACF,CAAC,sFA1CA,EAWe,EAAA,CAXA,WAAU,EAAA,eAAiB,QAAO,EAAA,cACpC,iBAAc,MAGf,CAFR,EAEQ,EAAA,CAFD,MAAM,UAAW,QAAO,EAAA,YAHrC,QAAA,MAKM,EAAA,KAAA,EAAA,GAAA,CALN,EAGgD,sBAE1C,CAAA,EAAA,CALN,EAAA,oBAOe,eAAY,MAGb,CAFR,EAEQ,EAAA,CAFD,QAAQ,OAAQ,QAAO,EAAA,WARpC,QAAA,MAUM,EAAA,KAAA,EAAA,GAAA,CAVN,EAQ8C,iBAExC,CAAA,EAAA,CAVN,EAAA,oBAAA,EAAA"}
1
+ {"version":3,"file":"VerifyEmail-Y05BSR57.js","names":[],"sources":["../../src/views/VerifyEmail.vue","../../src/views/VerifyEmail.vue"],"sourcesContent":["<template>\n <verify-email @verified=\"handleVerified\" @error=\"handleError\">\n <template #success-action>\n <v-btn color=\"primary\" @click=\"goToLogin\">\n Continue to Login\n </v-btn>\n </template>\n <template #error-action>\n <v-btn variant=\"text\" @click=\"goToHome\">\n Back to Home\n </v-btn>\n </template>\n </verify-email>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { VerifyEmail } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'VerifyEmailView',\n\n components: {\n VerifyEmail,\n },\n\n methods: {\n handleVerified(username: string) {\n console.log(`User ${username} verified successfully`);\n },\n\n handleError(error: string) {\n console.error('Verification error:', error);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n\n goToHome() {\n this.$router.push({ name: 'home' });\n },\n },\n});\n</script>\n","<template>\n <verify-email @verified=\"handleVerified\" @error=\"handleError\">\n <template #success-action>\n <v-btn color=\"primary\" @click=\"goToLogin\">\n Continue to Login\n </v-btn>\n </template>\n <template #error-action>\n <v-btn variant=\"text\" @click=\"goToHome\">\n Back to Home\n </v-btn>\n </template>\n </verify-email>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { VerifyEmail } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'VerifyEmailView',\n\n components: {\n VerifyEmail,\n },\n\n methods: {\n handleVerified(username: string) {\n console.log(`User ${username} verified successfully`);\n },\n\n handleError(error: string) {\n console.error('Verification error:', error);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n\n goToHome() {\n this.$router.push({ name: 'home' });\n },\n },\n});\n</script>\n"],"mappings":"2ZCmBA,IAAA,EAAe,EAAgB,CAC7B,KAAM,kBAEN,WAAY,CACV,YAAA,EACD,CAED,QAAS,CACP,eAAe,EAAkB,CAC/B,QAAQ,IAAI,QAAQ,EAAQ,wBAAyB,EAGvD,YAAY,EAAe,CACzB,QAAQ,MAAM,sBAAuB,EAAM,EAG7C,WAAY,CACV,KAAK,QAAQ,KAAK,CAAE,KAAM,QAAS,CAAC,EAGtC,UAAW,CACT,KAAK,QAAQ,KAAK,CAAE,KAAM,OAAQ,CAAC,EAEtC,CACF,CAAC,sFA1CA,EAWe,EAAA,CAXA,WAAU,EAAA,eAAiB,QAAO,EAAA,cACpC,iBAAc,MAGf,CAFR,EAEQ,EAAA,CAFD,MAAM,UAAW,QAAO,EAAA,YAHrC,QAAA,MAKM,EAAA,KAAA,EAAA,GAAA,CALN,EAGgD,sBAE1C,CAAA,EAAA,CALN,EAAA,oBAOe,eAAY,MAGb,CAFR,EAEQ,EAAA,CAFD,QAAQ,OAAQ,QAAO,EAAA,WARpC,QAAA,MAUM,EAAA,KAAA,EAAA,GAAA,CAVN,EAQ8C,iBAExC,CAAA,EAAA,CAVN,EAAA,oBAAA,EAAA"}