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

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 (125) hide show
  1. package/dist/assets/About-C1hlB_VW.js +2 -0
  2. package/dist/assets/About-C1hlB_VW.js.map +1 -0
  3. package/dist/assets/AdminDashboard-BOyrJfAQ.js +2 -0
  4. package/dist/assets/AdminDashboard-BOyrJfAQ.js.map +1 -0
  5. package/dist/assets/ClassroomCtrlPanel-vV8w0uBc.js +2 -0
  6. package/dist/assets/ClassroomCtrlPanel-vV8w0uBc.js.map +1 -0
  7. package/dist/assets/Classrooms-BZmnwuIB.js +3 -0
  8. package/dist/assets/Classrooms-BZmnwuIB.js.map +1 -0
  9. package/dist/assets/CourseRouter-DFPpLiug.js +7 -0
  10. package/dist/assets/CourseRouter-DFPpLiug.js.map +1 -0
  11. package/dist/assets/{CourseRouter-DuzvSsqI.css → CourseRouter-DvfjFpWl.css} +1 -1
  12. package/dist/assets/Courses-CsGfVDf9.css +1 -0
  13. package/dist/assets/Courses-CyWX8Aq4.js +3 -0
  14. package/dist/assets/Courses-CyWX8Aq4.js.map +1 -0
  15. package/dist/assets/DataInputFormTester-DtEEvEZS.js +2 -0
  16. package/dist/assets/DataInputFormTester-DtEEvEZS.js.map +1 -0
  17. package/dist/assets/EloModeration-DgUqPPoO.css +1 -0
  18. package/dist/assets/EloModeration-_LQTP9qx.js +2 -0
  19. package/dist/assets/EloModeration-_LQTP9qx.js.map +1 -0
  20. package/dist/assets/JoinCode-BQeXXd8M.js +3 -0
  21. package/dist/assets/JoinCode-BQeXXd8M.js.map +1 -0
  22. package/dist/assets/JoinCode-DPSfXf5z.css +1 -0
  23. package/dist/assets/MarkdownRenderer-DoVbFpA6-BIbDxYC4.js +53 -0
  24. package/dist/assets/MarkdownRenderer-DoVbFpA6-BIbDxYC4.js.map +1 -0
  25. package/dist/assets/MarkdownRenderer-DoVbFpA6-CQGwEJFh.js +1 -0
  26. package/dist/assets/NewCourseDialog-lQEm3iJe.js +2 -0
  27. package/dist/assets/NewCourseDialog-lQEm3iJe.js.map +1 -0
  28. package/dist/assets/ReleaseNotes-BSxuZ5W7.js +2 -0
  29. package/dist/assets/ReleaseNotes-BSxuZ5W7.js.map +1 -0
  30. package/dist/assets/RequestPasswordReset-GPKssrPH.js +2 -0
  31. package/dist/assets/RequestPasswordReset-GPKssrPH.js.map +1 -0
  32. package/dist/assets/ResetPassword-By7RvJkB.js +2 -0
  33. package/dist/assets/ResetPassword-By7RvJkB.js.map +1 -0
  34. package/dist/assets/Study-R4LCAP7J.css +1 -0
  35. package/dist/assets/Study-yDCrOQ1i.js +2 -0
  36. package/dist/assets/Study-yDCrOQ1i.js.map +1 -0
  37. package/dist/assets/TagInformation-BjkMAGf0.js +2 -0
  38. package/dist/assets/TagInformation-BjkMAGf0.js.map +1 -0
  39. package/dist/assets/User-1-_6oW2W.js +3 -0
  40. package/dist/assets/User-1-_6oW2W.js.map +1 -0
  41. package/dist/assets/UserStats-BW2xTraR.js +2 -0
  42. package/dist/assets/UserStats-BW2xTraR.js.map +1 -0
  43. package/dist/assets/VerifyEmail-B5pYw6N1.js +2 -0
  44. package/dist/assets/VerifyEmail-B5pYw6N1.js.map +1 -0
  45. package/dist/assets/chunk-D6hFPZc3.js +1 -0
  46. package/dist/assets/common-ui-BY2Ut5jf.css +1 -0
  47. package/dist/assets/common-ui.es-Bc_4fHTb.js +1 -0
  48. package/dist/assets/common-ui.es-mrcutgtG.js +38 -0
  49. package/dist/assets/common-ui.es-mrcutgtG.js.map +1 -0
  50. package/dist/assets/dist-BlP52QF6.js +186 -0
  51. package/dist/assets/dist-BlP52QF6.js.map +1 -0
  52. package/dist/assets/dist-C2-hg8GS.js +1 -0
  53. package/dist/assets/dist-CFgc27Ho.js +1 -0
  54. package/dist/assets/dist-CrcJCHFk.js +12 -0
  55. package/dist/assets/dist-CrcJCHFk.js.map +1 -0
  56. package/dist/assets/dist-DkeESCP4.js +353 -0
  57. package/dist/assets/dist-DkeESCP4.js.map +1 -0
  58. package/dist/assets/edit-ui.es-CLyYUxsi.js +36 -0
  59. package/dist/assets/edit-ui.es-CLyYUxsi.js.map +1 -0
  60. package/dist/assets/edit-ui.es-DWg1GnhC.js +1 -0
  61. package/dist/assets/index-CCh27qXk.css +1 -0
  62. package/dist/assets/index-jZbLHVSV.js +4 -0
  63. package/dist/assets/index-jZbLHVSV.js.map +1 -0
  64. package/dist/assets/server-DvlG_kpF.js +2 -0
  65. package/dist/assets/server-DvlG_kpF.js.map +1 -0
  66. package/dist/assets/vue.runtime.esm-bundler-C3q8JS9f.js +4 -0
  67. package/dist/assets/vue.runtime.esm-bundler-C3q8JS9f.js.map +1 -0
  68. package/dist/assets/workbox-window.prod.es5-DBwpKi3B.js +3 -0
  69. package/dist/assets/workbox-window.prod.es5-DBwpKi3B.js.map +1 -0
  70. package/dist/index.html +9 -2
  71. package/dist/sw.js +1 -1
  72. package/dist/sw.js.map +1 -1
  73. package/package.json +9 -11
  74. package/dist/assets/About-C3u52t0d.js +0 -2
  75. package/dist/assets/About-C3u52t0d.js.map +0 -1
  76. package/dist/assets/AdminDashboard-Dz5u2cex.js +0 -2
  77. package/dist/assets/AdminDashboard-Dz5u2cex.js.map +0 -1
  78. package/dist/assets/ClassroomCtrlPanel-Dk6oR2Ns.js +0 -2
  79. package/dist/assets/ClassroomCtrlPanel-Dk6oR2Ns.js.map +0 -1
  80. package/dist/assets/Classrooms-vb9OkpYQ.js +0 -2
  81. package/dist/assets/Classrooms-vb9OkpYQ.js.map +0 -1
  82. package/dist/assets/CourseRouter-Blm2dYn-.js +0 -2
  83. package/dist/assets/CourseRouter-Blm2dYn-.js.map +0 -1
  84. package/dist/assets/Courses-CEw9ARaf.js +0 -2
  85. package/dist/assets/Courses-CEw9ARaf.js.map +0 -1
  86. package/dist/assets/Courses-DQW3kca9.css +0 -1
  87. package/dist/assets/DataInputFormTester-CGzywVuh.js +0 -2
  88. package/dist/assets/DataInputFormTester-CGzywVuh.js.map +0 -1
  89. package/dist/assets/EloModeration-B90G61YI.css +0 -1
  90. package/dist/assets/EloModeration-DAmUYf5F.js +0 -2
  91. package/dist/assets/EloModeration-DAmUYf5F.js.map +0 -1
  92. package/dist/assets/JoinCode-B3oyqgv9.js +0 -2
  93. package/dist/assets/JoinCode-B3oyqgv9.js.map +0 -1
  94. package/dist/assets/JoinCode-DFiral3R.css +0 -1
  95. package/dist/assets/NewCourseDialog-5K53pY-W.js +0 -2
  96. package/dist/assets/NewCourseDialog-5K53pY-W.js.map +0 -1
  97. package/dist/assets/ReleaseNotes-DJQ5CKxz.js +0 -2
  98. package/dist/assets/ReleaseNotes-DJQ5CKxz.js.map +0 -1
  99. package/dist/assets/RequestPasswordReset-1bvNIeyh.js +0 -2
  100. package/dist/assets/RequestPasswordReset-1bvNIeyh.js.map +0 -1
  101. package/dist/assets/ResetPassword-CDlcjyGc.js +0 -2
  102. package/dist/assets/ResetPassword-CDlcjyGc.js.map +0 -1
  103. package/dist/assets/Study-Ci2qFB3t.js +0 -2
  104. package/dist/assets/Study-Ci2qFB3t.js.map +0 -1
  105. package/dist/assets/Study-Cxxw_AYM.css +0 -1
  106. package/dist/assets/TagInformation-CtiIiC9l.js +0 -2
  107. package/dist/assets/TagInformation-CtiIiC9l.js.map +0 -1
  108. package/dist/assets/User-CWCez7if.js +0 -2
  109. package/dist/assets/User-CWCez7if.js.map +0 -1
  110. package/dist/assets/UserStats-BDj614VL.js +0 -2
  111. package/dist/assets/UserStats-BDj614VL.js.map +0 -1
  112. package/dist/assets/VerifyEmail-Bt6Mb6Q3.js +0 -2
  113. package/dist/assets/VerifyEmail-Bt6Mb6Q3.js.map +0 -1
  114. package/dist/assets/edit-ui.es-BE3brRCi.js +0 -2
  115. package/dist/assets/edit-ui.es-BE3brRCi.js.map +0 -1
  116. package/dist/assets/index-C8n-yF4Q.js +0 -3
  117. package/dist/assets/index-C8n-yF4Q.js.map +0 -1
  118. package/dist/assets/index-CfcuevG4.js +0 -3
  119. package/dist/assets/index-CfcuevG4.js.map +0 -1
  120. package/dist/assets/index-DpBS80zR.css +0 -1
  121. package/dist/assets/mousetrap-Ca0hLdT-.js +0 -2
  122. package/dist/assets/mousetrap-Ca0hLdT-.js.map +0 -1
  123. package/dist/assets/workbox-window.prod.es5-p40uij6f.js +0 -2
  124. package/dist/assets/workbox-window.prod.es5-p40uij6f.js.map +0 -1
  125. package/dist/manifest.webmanifest +0 -1
@@ -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,_ as o,v as s}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{t as c}from"./index-jZbLHVSV.js";var l=a({name:`AboutView`,components:{},data(){return{type:`Viewable`}}});function _sfc_render(a,c,l,u,d,f){let p=r(`v-btn`),m=r(`v-col`),h=r(`v-row`),g=r(`v-container`);return n(),s(g,{class:`about`},{default:e(()=>[t(h,null,{default:e(()=>[t(m,null,{default:e(()=>[c[1]||(c[1]=o(`h1`,{class:`text-h2 mb-6`},`Todo.`,-1)),c[2]||(c[2]=o(`p`,{class:`text-body-1 mb-4`},` This is a placeholder for the about page. It will be filled in with more information later. `,-1)),t(p,{to:`./notes`,variant:`text`,color:`primary`},{default:e(()=>c[0]||(c[0]=[i(` Release Notes `)])),_:1})]),_:1})]),_:1})]),_:1})}var u=c(l,[[`render`,_sfc_render]]);export{u as default};
2
+ //# sourceMappingURL=About-C1hlB_VW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"About-C1hlB_VW.js","names":[],"sources":["../../src/views/About.vue","../../src/views/About.vue"],"sourcesContent":["<template>\n <v-container class=\"about\">\n <v-row>\n <v-col>\n <h1 class=\"text-h2 mb-6\">Todo.</h1>\n\n <p class=\"text-body-1 mb-4\">\n This is a placeholder for the about page. It will be filled in with more information later.\n </p>\n\n <v-btn :to=\"'./notes'\" variant=\"text\" color=\"primary\"> Release Notes </v-btn>\n </v-col>\n </v-row>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'AboutView',\n components: {},\n data() {\n return {\n type: 'Viewable',\n };\n },\n});\n</script>\n","<template>\n <v-container class=\"about\">\n <v-row>\n <v-col>\n <h1 class=\"text-h2 mb-6\">Todo.</h1>\n\n <p class=\"text-body-1 mb-4\">\n This is a placeholder for the about page. It will be filled in with more information later.\n </p>\n\n <v-btn :to=\"'./notes'\" variant=\"text\" color=\"primary\"> Release Notes </v-btn>\n </v-col>\n </v-row>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'AboutView',\n components: {},\n data() {\n return {\n type: 'Viewable',\n };\n },\n});\n</script>\n"],"mappings":"+KCmBA,IAAA,EAAe,EAAgB,CAC7B,KAAM,YACN,WAAY,EAAE,CACd,MAAO,CACL,MAAO,CACL,KAAM,WACP,EAEJ,CAAC,4GA1BA,EAYc,EAAA,CAZD,MAAM,QAAO,CAAA,CAD5B,QAAA,MAYY,CAVR,EAUQ,EAAA,KAAA,CAZZ,QAAA,MAWc,CARR,EAQQ,EAAA,KAAA,CAXd,QAAA,MAI2C,aAAnC,EAAmC,KAAA,CAA/B,MAAM,eAAc,CAAC,QAAK,GAAA,cAE9B,EAEI,IAAA,CAFD,MAAM,mBAAkB,CAAC,gGAE5B,GAAA,EAEA,EAA6E,EAAA,CAArE,GAAI,UAAW,QAAQ,OAAO,MAAM,YAVpD,QAAA,MAU6E,EAAA,KAAA,EAAA,GAAA,CAV7E,EAU8D,kBAAe,CAAA,EAAA,CAV7E,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA"}
@@ -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,Vt as o,_ as s,b as c,v as l,y as u}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{B as d,T as f,b as p,c as m,p as h}from"./common-ui.es-mrcutgtG.js";import"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import{k as g,n as _}from"./dist-DkeESCP4.js";import{t as v}from"./index-jZbLHVSV.js";import{g as y}from"./dist-BlP52QF6.js";var b=a({name:`AdminDashboard`,components:{CardSearch:m,CardSearchResults:h,CardHistoryViewer:p,CardLoader:d},data(){return{query:``,selectedCard:null,userId:``,userDB:null,dataLayer:null,adminDB:null,selectedUserId:``,selectedUserReader:null,selectedCourseId:null,userOptions:[],courseOptions:[]}},async created(){this.userDB=await f(),this.userId=this.userDB.getUsername(),this.dataLayer=await g(),this.adminDB=this.dataLayer.getAdminDB(),await this.loadUsers(),await this.loadCourses()},methods:{async loadUsers(){try{this.userOptions=(await this.adminDB.getUsers()).filter(e=>e.name&&!e.name.startsWith(`Guest_`)).map(e=>({label:e.name||`Unknown User`,value:e.name||``})).filter(e=>e.value!==``)}catch(e){console.error(`Failed to load users:`,e)}},async onUserSelected(e){if(!e){this.selectedUserReader=null;return}try{this.selectedUserReader=await this.dataLayer.createUserReaderForUser(e)}catch(e){console.error(`Failed to create user reader:`,e),this.selectedUserReader=null}},onSearch(e){this.query=e},onCardSelected(e){this.selectedCard=e},async loadCourses(){try{this.courseOptions=(await _.allCourseWare()).filter(e=>e._id).map(e=>{let t=e.name&&e.name.trim(),n,r;return t&&t!==e._id&&t!==``?(n=t,r=t.toLowerCase()):(n=e._id,r=e._id.toLowerCase()),{label:`📚 ${n}`,value:e._id,sortKey:r}}).sort((e,t)=>e.sortKey.localeCompare(t.sortKey)),console.log(`Loaded ${this.courseOptions.length} courses for filtering (lightweight mode)`)}catch(e){console.error(`Failed to load courses (lightweight):`,e),await this.loadCoursesExpensive()}},async loadCoursesExpensive(){try{console.log(`Using expensive course loading (full configs)...`),this.courseOptions=(await this.dataLayer.getAdminDB().getCourses()).filter(e=>e.courseID).map(e=>{let t=e.name&&e.name.trim(),n=e.creator?` (${e.creator})`:``,r,i;return t&&t!==e.courseID?(r=t,i=t.toLowerCase()):(r=e.courseID,i=e.courseID.toLowerCase()),{label:`${e.public?`🌐`:`🔒`} ${r}${n}`,value:e.courseID,sortKey:i}}).sort((e,t)=>e.sortKey.localeCompare(t.sortKey)),console.log(`Loaded ${this.courseOptions.length} courses for filtering (expensive mode)`)}catch(e){console.error(`Failed to load courses (expensive):`,e),this.loadCoursesBasic()}},async loadCoursesBasic(){try{console.log(`Using fallback course loading (IDs only)`),this.courseOptions=[{label:`⚠️ Course names not available - using IDs only`,value:``}]}catch(e){console.error(`Failed to load basic courses:`,e)}},onCourseFilterChanged(){this.query},getCourseNameById(e){let t=this.courseOptions.find(t=>t.value===e);return t?t.label:e},getSelectedCourseDetails(){return this.selectedCourseId?`ID: ${this.selectedCourseId}`:``},viewLookup(e){return y.getView(e)}}}),x={class:`admin-dashboard`},S={key:0,class:`mt-2`},C={key:0,class:`text-caption text-grey-darken-1`};function _sfc_render(a,d,f,p,m,h){let g=r(`v-card-title`),_=r(`v-select`),v=r(`v-chip`),y=r(`v-card-text`),b=r(`v-card`),w=r(`card-search`),T=r(`card-search-results`),E=r(`v-col`),D=r(`card-loader`),O=r(`v-row`),k=r(`card-history-viewer`);return n(),c(`div`,x,[d[4]||(d[4]=s(`h1`,null,`Admin Dashboard`,-1)),t(b,{class:`mb-4`},{default:e(()=>[t(g,null,{default:e(()=>d[2]||(d[2]=[i(`User Selection`)])),_:1}),t(y,null,{default:e(()=>[t(_,{modelValue:a.selectedUserId,"onUpdate:modelValue":[d[0]||(d[0]=e=>a.selectedUserId=e),a.onUserSelected],items:a.userOptions,"item-title":`label`,"item-value":`value`,label:`Select User`},null,8,[`modelValue`,`items`,`onUpdate:modelValue`]),a.selectedUserId?(n(),l(v,{key:0,color:`primary`,class:`mt-2`},{default:e(()=>[i(` Viewing data for: `+o(a.selectedUserId),1)]),_:1})):u(``,!0)]),_:1})]),_:1}),t(b,{class:`mb-4`},{default:e(()=>[t(g,null,{default:e(()=>d[3]||(d[3]=[i(`Search Filters`)])),_:1}),t(y,null,{default:e(()=>[t(_,{modelValue:a.selectedCourseId,"onUpdate:modelValue":[d[1]||(d[1]=e=>a.selectedCourseId=e),a.onCourseFilterChanged],items:a.courseOptions,"item-title":`label`,"item-value":`value`,label:`Filter by Course (optional)`,clearable:``},null,8,[`modelValue`,`items`,`onUpdate:modelValue`]),a.selectedCourseId?(n(),c(`div`,S,[t(v,{color:`info`,class:`mb-1`},{default:e(()=>[i(` 🎯 `+o(a.getCourseNameById(a.selectedCourseId)),1)]),_:1}),a.getSelectedCourseDetails()?(n(),c(`div`,C,o(a.getSelectedCourseDetails()),1)):u(``,!0)])):(n(),l(v,{key:1,color:`warning`,class:`mt-2`},{default:e(()=>[i(` ⚠️ Searching ALL `+o(a.courseOptions.length)+` courses (may be slow) `,1)]),_:1}))]),_:1})]),_:1}),t(w,{onSearch:a.onSearch},null,8,[`onSearch`]),t(O,null,{default:e(()=>[t(E,{cols:`6`},{default:e(()=>[a.query?(n(),l(T,{key:0,query:a.query,"data-layer":a.dataLayer,"course-filter":a.selectedCourseId,onCardSelected:a.onCardSelected},null,8,[`query`,`data-layer`,`course-filter`,`onCardSelected`])):u(``,!0)]),_:1}),t(E,{cols:`6`},{default:e(()=>[a.selectedCard?(n(),l(D,{key:0,qualified_id:{courseID:a.selectedCard.courseId,cardID:a.selectedCard.cardId},"view-lookup":a.viewLookup},null,8,[`qualified_id`,`view-lookup`])):u(``,!0)]),_:1})]),_:1}),a.selectedCard&&a.selectedUserReader?(n(),l(k,{key:0,"card-id":a.selectedCard.cardId,"course-id":a.selectedCard.courseId,"user-id":a.selectedUserId,"user-d-b":a.selectedUserReader},null,8,[`card-id`,`course-id`,`user-id`,`user-d-b`])):u(``,!0)])}var w=v(b,[[`render`,_sfc_render],[`__scopeId`,`data-v-7409c94e`]]);export{w as default};
2
+ //# sourceMappingURL=AdminDashboard-BOyrJfAQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminDashboard-BOyrJfAQ.js","names":[],"sources":["../../src/views/AdminDashboard.vue","../../src/views/AdminDashboard.vue"],"sourcesContent":["<template>\n <div class=\"admin-dashboard\">\n <h1>Admin Dashboard</h1>\n\n <!-- User Selection Section -->\n <v-card class=\"mb-4\">\n <v-card-title>User Selection</v-card-title>\n <v-card-text>\n <v-select\n v-model=\"selectedUserId\"\n :items=\"userOptions\"\n item-title=\"label\"\n item-value=\"value\"\n label=\"Select User\"\n @update:model-value=\"onUserSelected\"\n ></v-select>\n <v-chip v-if=\"selectedUserId\" color=\"primary\" class=\"mt-2\"> Viewing data for: {{ selectedUserId }} </v-chip>\n </v-card-text>\n </v-card>\n\n <!-- Course Filter Section -->\n <v-card class=\"mb-4\">\n <v-card-title>Search Filters</v-card-title>\n <v-card-text>\n <v-select\n v-model=\"selectedCourseId\"\n :items=\"courseOptions\"\n item-title=\"label\"\n item-value=\"value\"\n label=\"Filter by Course (optional)\"\n clearable\n @update:model-value=\"onCourseFilterChanged\"\n ></v-select>\n <div v-if=\"selectedCourseId\" class=\"mt-2\">\n <v-chip color=\"info\" class=\"mb-1\"> 🎯 {{ getCourseNameById(selectedCourseId) }} </v-chip>\n <div v-if=\"getSelectedCourseDetails()\" class=\"text-caption text-grey-darken-1\">\n {{ getSelectedCourseDetails() }}\n </div>\n </div>\n <v-chip v-else color=\"warning\" class=\"mt-2\">\n ⚠️ Searching ALL {{ courseOptions.length }} courses (may be slow)\n </v-chip>\n </v-card-text>\n </v-card>\n\n <!-- Card Search Section -->\n <card-search @search=\"onSearch\" />\n <v-row>\n <v-col cols=\"6\">\n <card-search-results\n v-if=\"query\"\n :query=\"query\"\n :data-layer=\"dataLayer\"\n :course-filter=\"selectedCourseId\"\n @card-selected=\"onCardSelected\"\n />\n </v-col>\n <v-col cols=\"6\">\n <card-loader\n v-if=\"selectedCard\"\n :qualified_id=\"{ courseID: selectedCard.courseId, cardID: selectedCard.cardId }\"\n :view-lookup=\"viewLookup\"\n />\n </v-col>\n </v-row>\n\n <!-- Card History Section -->\n <card-history-viewer\n v-if=\"selectedCard && selectedUserReader\"\n :card-id=\"selectedCard.cardId\"\n :course-id=\"selectedCard.courseId\"\n :user-id=\"selectedUserId\"\n :user-d-b=\"selectedUserReader\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { CardSearch, CardSearchResults, CardHistoryViewer, CardLoader, getCurrentUser } from '@vue-skuilder/common-ui';\nimport { getDataLayer, CourseLookup } from '@vue-skuilder/db';\nimport { allCourseWare } from '@vue-skuilder/courseware';\nimport { UserDBInterface, UserDBReader, DataLayerProvider, AdminDBInterface } from '@vue-skuilder/db';\n\ninterface UserOption {\n label: string;\n value: string;\n}\n\nexport default defineComponent({\n name: 'AdminDashboard',\n components: {\n CardSearch,\n CardSearchResults,\n CardHistoryViewer,\n CardLoader,\n },\n data() {\n return {\n query: '',\n selectedCard: null as { cardId: string; courseId: string } | null,\n userId: '',\n userDB: null as UserDBInterface | null,\n dataLayer: null as DataLayerProvider | null,\n adminDB: null as AdminDBInterface | null,\n selectedUserId: '',\n selectedUserReader: null as UserDBReader | null,\n selectedCourseId: null as string | null,\n userOptions: [] as UserOption[],\n courseOptions: [] as UserOption[],\n };\n },\n async created() {\n this.userDB = await getCurrentUser();\n this.userId = this.userDB.getUsername();\n this.dataLayer = await getDataLayer();\n this.adminDB = this.dataLayer.getAdminDB();\n\n // Load user list for selection\n await this.loadUsers();\n\n // Load available courses\n await this.loadCourses();\n },\n methods: {\n async loadUsers() {\n try {\n const users = await this.adminDB!.getUsers();\n this.userOptions = users\n .filter((user) => user.name && !user.name.startsWith('Guest_'))\n .map((user) => ({\n label: user.name || 'Unknown User',\n value: user.name || '',\n }))\n .filter((option) => option.value !== '');\n } catch (error) {\n console.error('Failed to load users:', error);\n }\n },\n\n async onUserSelected(userId: string) {\n if (!userId) {\n this.selectedUserReader = null;\n return;\n }\n\n try {\n this.selectedUserReader = await this.dataLayer!.createUserReaderForUser(userId);\n } catch (error) {\n console.error('Failed to create user reader:', error);\n this.selectedUserReader = null;\n }\n },\n\n onSearch(query: string) {\n this.query = query;\n },\n\n onCardSelected(card: { cardId: string; courseId: string }) {\n this.selectedCard = card;\n },\n\n async loadCourses() {\n try {\n // Try efficient lookup-only approach first\n // const coursesDB = this.dataLayer!.getCoursesDB();\n\n // Get basic course list from lookup DB (lightweight, just IDs and basic names)\n const lookupCourses = await CourseLookup.allCourseWare();\n\n this.courseOptions = lookupCourses\n .filter((course) => course._id)\n .map((course) => {\n const courseName = course.name && course.name.trim();\n let displayName: string;\n let sortKey: string;\n\n if (courseName && courseName !== course._id && courseName !== '') {\n // Has a real name different from ID\n displayName = courseName;\n sortKey = courseName.toLowerCase();\n } else {\n // No name or name is same as ID - use ID\n displayName = course._id;\n sortKey = course._id.toLowerCase();\n }\n\n // Simple display without expensive metadata lookups\n return {\n label: `📚 ${displayName}`,\n value: course._id,\n sortKey,\n };\n })\n .sort((a, b) => a.sortKey.localeCompare(b.sortKey));\n\n console.log(`Loaded ${this.courseOptions.length} courses for filtering (lightweight mode)`);\n } catch (error) {\n console.error('Failed to load courses (lightweight):', error);\n // Fallback to expensive approach\n await this.loadCoursesExpensive();\n }\n },\n\n async loadCoursesExpensive() {\n try {\n console.log('Using expensive course loading (full configs)...');\n const adminDB = this.dataLayer!.getAdminDB();\n const basicCourseList = await adminDB.getCourses(); // This fetches full configs\n\n this.courseOptions = basicCourseList\n .filter((course) => course.courseID)\n .map((course) => {\n const courseName = course.name && course.name.trim();\n const creator = course.creator ? ` (${course.creator})` : '';\n\n let displayName: string;\n let sortKey: string;\n\n if (courseName && courseName !== course.courseID) {\n // Has a real name different from ID\n displayName = courseName;\n sortKey = courseName.toLowerCase();\n } else {\n // No name or name is same as ID - use ID\n displayName = course.courseID!;\n sortKey = course.courseID!.toLowerCase();\n }\n\n const visibility = course.public ? '🌐' : '🔒';\n\n return {\n label: `${visibility} ${displayName}${creator}`,\n value: course.courseID!,\n sortKey,\n };\n })\n .sort((a, b) => a.sortKey.localeCompare(b.sortKey));\n\n console.log(`Loaded ${this.courseOptions.length} courses for filtering (expensive mode)`);\n } catch (error) {\n console.error('Failed to load courses (expensive):', error);\n // Final fallback\n this.loadCoursesBasic();\n }\n },\n\n async loadCoursesBasic() {\n try {\n // Fallback: just get course IDs from lookup DB (fast)\n console.log('Using fallback course loading (IDs only)');\n // This would need a new method that just gets the lookup docs without full configs\n // For now, we'll show a basic message\n this.courseOptions = [{ label: '⚠️ Course names not available - using IDs only', value: '' }];\n } catch (error) {\n console.error('Failed to load basic courses:', error);\n }\n },\n\n onCourseFilterChanged() {\n // If there's an active search, re-run it with the new filter\n if (this.query) {\n // The CardSearchResults component will automatically re-search with the new filter\n }\n },\n\n getCourseNameById(courseId: string): string {\n const course = this.courseOptions.find((c) => c.value === courseId);\n return course ? course.label : courseId;\n },\n\n getSelectedCourseDetails(): string {\n if (!this.selectedCourseId) return '';\n\n // For now, just return the ID as additional context\n return `ID: ${this.selectedCourseId}`;\n },\n\n viewLookup(viewDescriptor: unknown) {\n return allCourseWare.getView(viewDescriptor);\n },\n },\n});\n</script>\n\n<style scoped>\n.admin-dashboard {\n padding: 2rem;\n}\n</style>\n","<template>\n <div class=\"admin-dashboard\">\n <h1>Admin Dashboard</h1>\n\n <!-- User Selection Section -->\n <v-card class=\"mb-4\">\n <v-card-title>User Selection</v-card-title>\n <v-card-text>\n <v-select\n v-model=\"selectedUserId\"\n :items=\"userOptions\"\n item-title=\"label\"\n item-value=\"value\"\n label=\"Select User\"\n @update:model-value=\"onUserSelected\"\n ></v-select>\n <v-chip v-if=\"selectedUserId\" color=\"primary\" class=\"mt-2\"> Viewing data for: {{ selectedUserId }} </v-chip>\n </v-card-text>\n </v-card>\n\n <!-- Course Filter Section -->\n <v-card class=\"mb-4\">\n <v-card-title>Search Filters</v-card-title>\n <v-card-text>\n <v-select\n v-model=\"selectedCourseId\"\n :items=\"courseOptions\"\n item-title=\"label\"\n item-value=\"value\"\n label=\"Filter by Course (optional)\"\n clearable\n @update:model-value=\"onCourseFilterChanged\"\n ></v-select>\n <div v-if=\"selectedCourseId\" class=\"mt-2\">\n <v-chip color=\"info\" class=\"mb-1\"> 🎯 {{ getCourseNameById(selectedCourseId) }} </v-chip>\n <div v-if=\"getSelectedCourseDetails()\" class=\"text-caption text-grey-darken-1\">\n {{ getSelectedCourseDetails() }}\n </div>\n </div>\n <v-chip v-else color=\"warning\" class=\"mt-2\">\n ⚠️ Searching ALL {{ courseOptions.length }} courses (may be slow)\n </v-chip>\n </v-card-text>\n </v-card>\n\n <!-- Card Search Section -->\n <card-search @search=\"onSearch\" />\n <v-row>\n <v-col cols=\"6\">\n <card-search-results\n v-if=\"query\"\n :query=\"query\"\n :data-layer=\"dataLayer\"\n :course-filter=\"selectedCourseId\"\n @card-selected=\"onCardSelected\"\n />\n </v-col>\n <v-col cols=\"6\">\n <card-loader\n v-if=\"selectedCard\"\n :qualified_id=\"{ courseID: selectedCard.courseId, cardID: selectedCard.cardId }\"\n :view-lookup=\"viewLookup\"\n />\n </v-col>\n </v-row>\n\n <!-- Card History Section -->\n <card-history-viewer\n v-if=\"selectedCard && selectedUserReader\"\n :card-id=\"selectedCard.cardId\"\n :course-id=\"selectedCard.courseId\"\n :user-id=\"selectedUserId\"\n :user-d-b=\"selectedUserReader\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { CardSearch, CardSearchResults, CardHistoryViewer, CardLoader, getCurrentUser } from '@vue-skuilder/common-ui';\nimport { getDataLayer, CourseLookup } from '@vue-skuilder/db';\nimport { allCourseWare } from '@vue-skuilder/courseware';\nimport { UserDBInterface, UserDBReader, DataLayerProvider, AdminDBInterface } from '@vue-skuilder/db';\n\ninterface UserOption {\n label: string;\n value: string;\n}\n\nexport default defineComponent({\n name: 'AdminDashboard',\n components: {\n CardSearch,\n CardSearchResults,\n CardHistoryViewer,\n CardLoader,\n },\n data() {\n return {\n query: '',\n selectedCard: null as { cardId: string; courseId: string } | null,\n userId: '',\n userDB: null as UserDBInterface | null,\n dataLayer: null as DataLayerProvider | null,\n adminDB: null as AdminDBInterface | null,\n selectedUserId: '',\n selectedUserReader: null as UserDBReader | null,\n selectedCourseId: null as string | null,\n userOptions: [] as UserOption[],\n courseOptions: [] as UserOption[],\n };\n },\n async created() {\n this.userDB = await getCurrentUser();\n this.userId = this.userDB.getUsername();\n this.dataLayer = await getDataLayer();\n this.adminDB = this.dataLayer.getAdminDB();\n\n // Load user list for selection\n await this.loadUsers();\n\n // Load available courses\n await this.loadCourses();\n },\n methods: {\n async loadUsers() {\n try {\n const users = await this.adminDB!.getUsers();\n this.userOptions = users\n .filter((user) => user.name && !user.name.startsWith('Guest_'))\n .map((user) => ({\n label: user.name || 'Unknown User',\n value: user.name || '',\n }))\n .filter((option) => option.value !== '');\n } catch (error) {\n console.error('Failed to load users:', error);\n }\n },\n\n async onUserSelected(userId: string) {\n if (!userId) {\n this.selectedUserReader = null;\n return;\n }\n\n try {\n this.selectedUserReader = await this.dataLayer!.createUserReaderForUser(userId);\n } catch (error) {\n console.error('Failed to create user reader:', error);\n this.selectedUserReader = null;\n }\n },\n\n onSearch(query: string) {\n this.query = query;\n },\n\n onCardSelected(card: { cardId: string; courseId: string }) {\n this.selectedCard = card;\n },\n\n async loadCourses() {\n try {\n // Try efficient lookup-only approach first\n // const coursesDB = this.dataLayer!.getCoursesDB();\n\n // Get basic course list from lookup DB (lightweight, just IDs and basic names)\n const lookupCourses = await CourseLookup.allCourseWare();\n\n this.courseOptions = lookupCourses\n .filter((course) => course._id)\n .map((course) => {\n const courseName = course.name && course.name.trim();\n let displayName: string;\n let sortKey: string;\n\n if (courseName && courseName !== course._id && courseName !== '') {\n // Has a real name different from ID\n displayName = courseName;\n sortKey = courseName.toLowerCase();\n } else {\n // No name or name is same as ID - use ID\n displayName = course._id;\n sortKey = course._id.toLowerCase();\n }\n\n // Simple display without expensive metadata lookups\n return {\n label: `📚 ${displayName}`,\n value: course._id,\n sortKey,\n };\n })\n .sort((a, b) => a.sortKey.localeCompare(b.sortKey));\n\n console.log(`Loaded ${this.courseOptions.length} courses for filtering (lightweight mode)`);\n } catch (error) {\n console.error('Failed to load courses (lightweight):', error);\n // Fallback to expensive approach\n await this.loadCoursesExpensive();\n }\n },\n\n async loadCoursesExpensive() {\n try {\n console.log('Using expensive course loading (full configs)...');\n const adminDB = this.dataLayer!.getAdminDB();\n const basicCourseList = await adminDB.getCourses(); // This fetches full configs\n\n this.courseOptions = basicCourseList\n .filter((course) => course.courseID)\n .map((course) => {\n const courseName = course.name && course.name.trim();\n const creator = course.creator ? ` (${course.creator})` : '';\n\n let displayName: string;\n let sortKey: string;\n\n if (courseName && courseName !== course.courseID) {\n // Has a real name different from ID\n displayName = courseName;\n sortKey = courseName.toLowerCase();\n } else {\n // No name or name is same as ID - use ID\n displayName = course.courseID!;\n sortKey = course.courseID!.toLowerCase();\n }\n\n const visibility = course.public ? '🌐' : '🔒';\n\n return {\n label: `${visibility} ${displayName}${creator}`,\n value: course.courseID!,\n sortKey,\n };\n })\n .sort((a, b) => a.sortKey.localeCompare(b.sortKey));\n\n console.log(`Loaded ${this.courseOptions.length} courses for filtering (expensive mode)`);\n } catch (error) {\n console.error('Failed to load courses (expensive):', error);\n // Final fallback\n this.loadCoursesBasic();\n }\n },\n\n async loadCoursesBasic() {\n try {\n // Fallback: just get course IDs from lookup DB (fast)\n console.log('Using fallback course loading (IDs only)');\n // This would need a new method that just gets the lookup docs without full configs\n // For now, we'll show a basic message\n this.courseOptions = [{ label: '⚠️ Course names not available - using IDs only', value: '' }];\n } catch (error) {\n console.error('Failed to load basic courses:', error);\n }\n },\n\n onCourseFilterChanged() {\n // If there's an active search, re-run it with the new filter\n if (this.query) {\n // The CardSearchResults component will automatically re-search with the new filter\n }\n },\n\n getCourseNameById(courseId: string): string {\n const course = this.courseOptions.find((c) => c.value === courseId);\n return course ? course.label : courseId;\n },\n\n getSelectedCourseDetails(): string {\n if (!this.selectedCourseId) return '';\n\n // For now, just return the ID as additional context\n return `ID: ${this.selectedCourseId}`;\n },\n\n viewLookup(viewDescriptor: unknown) {\n return allCourseWare.getView(viewDescriptor);\n },\n },\n});\n</script>\n\n<style scoped>\n.admin-dashboard {\n padding: 2rem;\n}\n</style>\n"],"mappings":"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"}
@@ -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,Vt as o,W as s,_ as c,b as l,f as u,v as d,y as f}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{T as p}from"./common-ui.es-mrcutgtG.js";import{E as m}from"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import{k as h}from"./dist-DkeESCP4.js";import{t as g}from"./index-jZbLHVSV.js";var _=a({name:`ClassroomCtrlPanel`,props:{classroomId:{type:String,required:!0}},data(){return{classroomCfg:null,classroomDB:null,assignedContent:[],nameRules:[e=>e.length>30?`Course name must be 30 characters or less`:!0],updatePending:!0,addingContent:!1,availableCourses:[],selectedCourse:``,availableTags:[],selectedTags:[]}},computed:{_assignedCourses(){return this.assignedContent.filter(e=>e.type===`course`)},_assignedTags(){return this.assignedContent.filter(e=>e.type===`tag`)}},watch:{async selectedCourse(){this.selectedCourse?this.availableTags=(await h().getCourseDB(this.selectedCourse).getCourseTagStubs()).rows.map(e=>e.doc):this.availableTags=[]}},async created(){try{this.classroomDB=await h().getClassroomDB(this.classroomId,`teacher`),this.assignedContent=await this.classroomDB.getAssignedContent(),this.classroomCfg=this.classroomDB.getConfig(),console.log(`[ClassroomCtrlPanel] Route loaded w/ (prop) _id: ${this.classroomId}`),console.log(`[ClassroomCtrlPanel] Config: ${JSON.stringify(this.classroomCfg)}`),this.availableCourses=await h().getCoursesDB().getCourseList(),this.updatePending=!1}catch(e){console.error(`[ClassroomCtrlPanel] Error initializing:`,e)}},methods:{async assignContent(){if(!this.classroomDB)return;let e=await p();this.selectedTags.length===0?await this.classroomDB.assignContent?.({assignedOn:m(),activeOn:m(),type:`course`,courseID:this.selectedCourse,assignedBy:e.getUsername()}):await Promise.all(this.selectedTags.map(t=>this.classroomDB.assignContent?.({assignedOn:m(),activeOn:m(),type:`tag`,courseID:this.selectedCourse,tagID:t,assignedBy:e.getUsername()}))),this.assignedContent=await this.classroomDB.getAssignedContent(),this.addingContent=!1,this.selectedCourse=``,this.selectedTags=[],this.availableTags=[]},async removeContent(e){this.classroomDB&&this.classroomDB.removeContent&&(await this.classroomDB.removeContent(e),this.assignedContent=await this.classroomDB.getAssignedContent())},async submit(){this.updatePending=!0}}}),v={key:0},y=[`onClick`],b=[`onClick`];function _sfc_render(a,p,m,h,g,_){let x=r(`router-link`),S=r(`v-btn`),C=r(`v-checkbox`),w=r(`v-col`),T=r(`v-icon`),E=r(`v-fade-transition`),D=r(`v-toolbar-title`),O=r(`v-spacer`),k=r(`v-toolbar`),A=r(`v-select`),j=r(`v-card-text`),M=r(`v-card-actions`),N=r(`v-card`),P=r(`v-row`);return a.updatePending?f(``,!0):(n(),l(`div`,v,[c(`h1`,null,[t(x,{to:`/classrooms`},{default:e(()=>p[5]||(p[5]=[i(`My Classrooms`)])),_:1}),i(` / `+o(a.classroomCfg.name),1)]),c(`h3`,null,[i(` Join code: `+o(a.classroomCfg.joinCode)+` `,1),t(x,{to:`/classrooms/${a.classroomId}/code`},{default:e(()=>[t(S,{size:`x-small`,icon:`mdi-fullscreen`,color:`accent`,alt:`Make Fullscreen`})]),_:1},8,[`to`])]),t(P,null,{default:e(()=>[t(w,{cols:`12`,sm:`6`,md:`4`},{default:e(()=>[t(C,{modelValue:a.classroomCfg.peerAssist,"onUpdate:modelValue":p[0]||(p[0]=e=>a.classroomCfg.peerAssist=e),label:`Allow peer instruction`},null,8,[`modelValue`])]),_:1}),a.classroomDB?(n(),d(w,{key:0,cols:`12`},{default:e(()=>[p[10]||(p[10]=c(`h2`,null,`Assigned Content:`,-1)),p[11]||(p[11]=c(`h3`,null,`Quilts:`,-1)),p[12]||(p[12]=c(`ul`,null,null,-1)),c(`ul`,null,[(n(!0),l(u,null,s(a._assignedCourses,e=>(n(),l(`li`,{key:e.courseID},[i(o(e.courseID)+` `,1),c(`a`,{onClick:t=>a.removeContent(e)},`Remove`,8,y)]))),128))]),p[13]||(p[13]=c(`h3`,null,`Tags:`,-1)),c(`ul`,null,[(n(!0),l(u,null,s(a._assignedTags,(e,t)=>(n(),l(`li`,{key:t},[i(o(e.courseID)+` - `+o(e.tagID)+` `,1),c(`a`,{onClick:t=>a.removeContent(e)},`Remove`,8,b)]))),128))]),t(E,null,{default:e(()=>[a.addingContent?f(``,!0):(n(),d(S,{key:0,color:`primary`,onClick:p[1]||(p[1]=e=>a.addingContent=!0)},{default:e(()=>[p[7]||(p[7]=i(` Assign New Content `)),t(T,{end:``},{default:e(()=>p[6]||(p[6]=[i(`mdi-plus`)])),_:1})]),_:1}))]),_:1}),a.addingContent?(n(),d(N,{key:0},{default:e(()=>[t(k,null,{default:e(()=>[t(D,null,{default:e(()=>p[8]||(p[8]=[i(`Add Content`)])),_:1}),t(O),t(S,{icon:`mdi-close`,color:`error`,onClick:p[2]||(p[2]=e=>a.addingContent=!1)})]),_:1}),t(j,null,{default:e(()=>[t(A,{modelValue:a.selectedCourse,"onUpdate:modelValue":p[3]||(p[3]=e=>a.selectedCourse=e),label:`Select Quilt`,items:a.availableCourses,"item-title":`name`,"item-value":`_id`,title:`Select Quilt`},null,8,[`modelValue`,`items`]),t(A,{modelValue:a.selectedTags,"onUpdate:modelValue":p[4]||(p[4]=e=>a.selectedTags=e),label:`Select Tags`,items:a.availableTags,"item-title":`name`,"item-value":`name`,multiple:``,chips:``,hint:``,"persistent-hint":``},null,8,[`modelValue`,`items`])]),_:1}),t(M,null,{default:e(()=>[a.selectedCourse===``?f(``,!0):(n(),d(S,{key:0,color:`primary`,onClick:a.assignContent},{default:e(()=>[i(o(a.selectedTags.length==0?`Add Entire Quilt`:`Add Tags`)+` `,1),t(T,{end:``},{default:e(()=>p[9]||(p[9]=[i(`mdi-plus`)])),_:1})]),_:1},8,[`onClick`]))]),_:1})]),_:1})):f(``,!0)]),_:1})):f(``,!0)]),_:1})]))}var x=g(_,[[`render`,_sfc_render]]);export{x as default};
2
+ //# sourceMappingURL=ClassroomCtrlPanel-vV8w0uBc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClassroomCtrlPanel-vV8w0uBc.js","names":[],"sources":["../../src/components/Classrooms/ClassroomCtrlPanel.vue","../../src/components/Classrooms/ClassroomCtrlPanel.vue"],"sourcesContent":["<template>\n <div v-if=\"!updatePending\">\n <h1><router-link to=\"/classrooms\">My Classrooms</router-link> / {{ classroomCfg!.name }}</h1>\n\n <h3>\n Join code: {{ classroomCfg!.joinCode }}\n <router-link :to=\"`/classrooms/${classroomId}/code`\">\n <v-btn size=\"x-small\" icon=\"mdi-fullscreen\" color=\"accent\" alt=\"Make Fullscreen\"> </v-btn>\n </router-link>\n </h3>\n <v-row>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-checkbox v-model=\"classroomCfg!.peerAssist\" label=\"Allow peer instruction\"></v-checkbox>\n </v-col>\n <v-col v-if=\"classroomDB\" cols=\"12\">\n <h2>Assigned Content:</h2>\n <h3>Quilts:</h3>\n <ul></ul>\n <ul>\n <li v-for=\"c in _assignedCourses\" :key=\"c.courseID\">\n {{ c.courseID }} <a @click=\"removeContent(c)\">Remove</a>\n </li>\n </ul>\n <h3>Tags:</h3>\n <ul>\n <li v-for=\"(c, i) in _assignedTags\" :key=\"i\">\n {{ c.courseID }} - {{ c.tagID }} <a @click=\"removeContent(c)\">Remove</a>\n </li>\n </ul>\n <v-fade-transition>\n <v-btn v-if=\"!addingContent\" color=\"primary\" @click=\"addingContent = true\">\n Assign New Content\n <v-icon end>mdi-plus</v-icon>\n </v-btn>\n </v-fade-transition>\n <v-card v-if=\"addingContent\">\n <v-toolbar>\n <v-toolbar-title>Add Content</v-toolbar-title>\n <v-spacer></v-spacer>\n <v-btn icon=\"mdi-close\" color=\"error\" @click=\"addingContent = false\"> </v-btn>\n </v-toolbar>\n <v-card-text>\n <v-select\n v-model=\"selectedCourse\"\n label=\"Select Quilt\"\n :items=\"availableCourses\"\n item-title=\"name\"\n item-value=\"_id\"\n title=\"Select Quilt\"\n ></v-select>\n\n <v-select\n v-model=\"selectedTags\"\n label=\"Select Tags\"\n :items=\"availableTags\"\n item-title=\"name\"\n item-value=\"name\"\n multiple\n chips\n hint=\"\"\n persistent-hint\n ></v-select>\n </v-card-text>\n\n <v-card-actions>\n <v-btn v-if=\"selectedCourse !== ''\" color=\"primary\" @click=\"assignContent\">\n {{ selectedTags.length == 0 ? 'Add Entire Quilt' : 'Add Tags' }}\n <v-icon end>mdi-plus</v-icon>\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-col>\n </v-row>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport moment from 'moment';\nimport { TeacherClassroomDBInterface, AssignedContent, AssignedTag, Tag, getDataLayer } from '@vue-skuilder/db';\nimport { ClassroomConfig, CourseConfig } from '@vue-skuilder/common';\nimport { defineComponent } from 'vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'ClassroomCtrlPanel',\n\n props: {\n classroomId: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n classroomCfg: null as ClassroomConfig | null,\n classroomDB: null as TeacherClassroomDBInterface | null,\n assignedContent: [] as AssignedContent[],\n nameRules: [\n (value: string): string | boolean => {\n const max = 30;\n return value.length > max ? `Course name must be ${max} characters or less` : true;\n },\n ],\n updatePending: true,\n addingContent: false,\n availableCourses: [] as CourseConfig[],\n selectedCourse: '',\n availableTags: [] as Tag[],\n selectedTags: [] as string[],\n };\n },\n\n computed: {\n _assignedCourses(): AssignedContent[] {\n return this.assignedContent.filter((c) => c.type === 'course');\n },\n _assignedTags(): AssignedTag[] {\n return this.assignedContent.filter((c) => c.type === 'tag') as AssignedTag[];\n },\n },\n\n watch: {\n async selectedCourse() {\n if (this.selectedCourse) {\n // Get course DB from data layer\n const courseDB = getDataLayer().getCourseDB(this.selectedCourse);\n // Get tags from course DB\n const tagResponse = await courseDB.getCourseTagStubs();\n this.availableTags = tagResponse.rows.map((row) => row.doc!);\n } else {\n this.availableTags = [];\n }\n },\n },\n\n async created() {\n try {\n // Get classroom DB from data layer\n this.classroomDB = (await getDataLayer().getClassroomDB(\n this.classroomId,\n 'teacher'\n )) as TeacherClassroomDBInterface;\n this.assignedContent = await this.classroomDB.getAssignedContent();\n this.classroomCfg = this.classroomDB.getConfig();\n\n console.log(`[ClassroomCtrlPanel] Route loaded w/ (prop) _id: ${this.classroomId}`);\n console.log(`[ClassroomCtrlPanel] Config: ${JSON.stringify(this.classroomCfg)}`);\n\n // Get course list from data layer\n this.availableCourses = await getDataLayer().getCoursesDB().getCourseList();\n\n this.updatePending = false;\n } catch (error) {\n console.error('[ClassroomCtrlPanel] Error initializing:', error);\n }\n },\n\n methods: {\n async assignContent() {\n if (!this.classroomDB) return;\n const u = await getCurrentUser();\n\n if (this.selectedTags.length === 0) {\n await this.classroomDB.assignContent?.({\n assignedOn: moment(),\n activeOn: moment(),\n type: 'course',\n courseID: this.selectedCourse,\n assignedBy: u.getUsername(),\n });\n } else {\n await Promise.all(\n this.selectedTags.map((tag) =>\n this.classroomDB!.assignContent?.({\n assignedOn: moment(),\n activeOn: moment(),\n type: 'tag',\n courseID: this.selectedCourse,\n tagID: tag,\n assignedBy: u.getUsername(),\n })\n )\n );\n }\n\n this.assignedContent = await this.classroomDB.getAssignedContent();\n this.addingContent = false;\n this.selectedCourse = '';\n this.selectedTags = [];\n this.availableTags = [];\n },\n\n async removeContent(c: AssignedContent) {\n if (this.classroomDB && this.classroomDB.removeContent) {\n await this.classroomDB.removeContent(c);\n this.assignedContent = await this.classroomDB.getAssignedContent();\n }\n },\n\n async submit() {\n this.updatePending = true;\n },\n },\n});\n</script>\n","<template>\n <div v-if=\"!updatePending\">\n <h1><router-link to=\"/classrooms\">My Classrooms</router-link> / {{ classroomCfg!.name }}</h1>\n\n <h3>\n Join code: {{ classroomCfg!.joinCode }}\n <router-link :to=\"`/classrooms/${classroomId}/code`\">\n <v-btn size=\"x-small\" icon=\"mdi-fullscreen\" color=\"accent\" alt=\"Make Fullscreen\"> </v-btn>\n </router-link>\n </h3>\n <v-row>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-checkbox v-model=\"classroomCfg!.peerAssist\" label=\"Allow peer instruction\"></v-checkbox>\n </v-col>\n <v-col v-if=\"classroomDB\" cols=\"12\">\n <h2>Assigned Content:</h2>\n <h3>Quilts:</h3>\n <ul></ul>\n <ul>\n <li v-for=\"c in _assignedCourses\" :key=\"c.courseID\">\n {{ c.courseID }} <a @click=\"removeContent(c)\">Remove</a>\n </li>\n </ul>\n <h3>Tags:</h3>\n <ul>\n <li v-for=\"(c, i) in _assignedTags\" :key=\"i\">\n {{ c.courseID }} - {{ c.tagID }} <a @click=\"removeContent(c)\">Remove</a>\n </li>\n </ul>\n <v-fade-transition>\n <v-btn v-if=\"!addingContent\" color=\"primary\" @click=\"addingContent = true\">\n Assign New Content\n <v-icon end>mdi-plus</v-icon>\n </v-btn>\n </v-fade-transition>\n <v-card v-if=\"addingContent\">\n <v-toolbar>\n <v-toolbar-title>Add Content</v-toolbar-title>\n <v-spacer></v-spacer>\n <v-btn icon=\"mdi-close\" color=\"error\" @click=\"addingContent = false\"> </v-btn>\n </v-toolbar>\n <v-card-text>\n <v-select\n v-model=\"selectedCourse\"\n label=\"Select Quilt\"\n :items=\"availableCourses\"\n item-title=\"name\"\n item-value=\"_id\"\n title=\"Select Quilt\"\n ></v-select>\n\n <v-select\n v-model=\"selectedTags\"\n label=\"Select Tags\"\n :items=\"availableTags\"\n item-title=\"name\"\n item-value=\"name\"\n multiple\n chips\n hint=\"\"\n persistent-hint\n ></v-select>\n </v-card-text>\n\n <v-card-actions>\n <v-btn v-if=\"selectedCourse !== ''\" color=\"primary\" @click=\"assignContent\">\n {{ selectedTags.length == 0 ? 'Add Entire Quilt' : 'Add Tags' }}\n <v-icon end>mdi-plus</v-icon>\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-col>\n </v-row>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport moment from 'moment';\nimport { TeacherClassroomDBInterface, AssignedContent, AssignedTag, Tag, getDataLayer } from '@vue-skuilder/db';\nimport { ClassroomConfig, CourseConfig } from '@vue-skuilder/common';\nimport { defineComponent } from 'vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'ClassroomCtrlPanel',\n\n props: {\n classroomId: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n classroomCfg: null as ClassroomConfig | null,\n classroomDB: null as TeacherClassroomDBInterface | null,\n assignedContent: [] as AssignedContent[],\n nameRules: [\n (value: string): string | boolean => {\n const max = 30;\n return value.length > max ? `Course name must be ${max} characters or less` : true;\n },\n ],\n updatePending: true,\n addingContent: false,\n availableCourses: [] as CourseConfig[],\n selectedCourse: '',\n availableTags: [] as Tag[],\n selectedTags: [] as string[],\n };\n },\n\n computed: {\n _assignedCourses(): AssignedContent[] {\n return this.assignedContent.filter((c) => c.type === 'course');\n },\n _assignedTags(): AssignedTag[] {\n return this.assignedContent.filter((c) => c.type === 'tag') as AssignedTag[];\n },\n },\n\n watch: {\n async selectedCourse() {\n if (this.selectedCourse) {\n // Get course DB from data layer\n const courseDB = getDataLayer().getCourseDB(this.selectedCourse);\n // Get tags from course DB\n const tagResponse = await courseDB.getCourseTagStubs();\n this.availableTags = tagResponse.rows.map((row) => row.doc!);\n } else {\n this.availableTags = [];\n }\n },\n },\n\n async created() {\n try {\n // Get classroom DB from data layer\n this.classroomDB = (await getDataLayer().getClassroomDB(\n this.classroomId,\n 'teacher'\n )) as TeacherClassroomDBInterface;\n this.assignedContent = await this.classroomDB.getAssignedContent();\n this.classroomCfg = this.classroomDB.getConfig();\n\n console.log(`[ClassroomCtrlPanel] Route loaded w/ (prop) _id: ${this.classroomId}`);\n console.log(`[ClassroomCtrlPanel] Config: ${JSON.stringify(this.classroomCfg)}`);\n\n // Get course list from data layer\n this.availableCourses = await getDataLayer().getCoursesDB().getCourseList();\n\n this.updatePending = false;\n } catch (error) {\n console.error('[ClassroomCtrlPanel] Error initializing:', error);\n }\n },\n\n methods: {\n async assignContent() {\n if (!this.classroomDB) return;\n const u = await getCurrentUser();\n\n if (this.selectedTags.length === 0) {\n await this.classroomDB.assignContent?.({\n assignedOn: moment(),\n activeOn: moment(),\n type: 'course',\n courseID: this.selectedCourse,\n assignedBy: u.getUsername(),\n });\n } else {\n await Promise.all(\n this.selectedTags.map((tag) =>\n this.classroomDB!.assignContent?.({\n assignedOn: moment(),\n activeOn: moment(),\n type: 'tag',\n courseID: this.selectedCourse,\n tagID: tag,\n assignedBy: u.getUsername(),\n })\n )\n );\n }\n\n this.assignedContent = await this.classroomDB.getAssignedContent();\n this.addingContent = false;\n this.selectedCourse = '';\n this.selectedTags = [];\n this.availableTags = [];\n },\n\n async removeContent(c: AssignedContent) {\n if (this.classroomDB && this.classroomDB.removeContent) {\n await this.classroomDB.removeContent(c);\n this.assignedContent = await this.classroomDB.getAssignedContent();\n }\n },\n\n async submit() {\n this.updatePending = true;\n },\n },\n});\n</script>\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import{i as e,s as t}from"./chunk-D6hFPZc3.js";import{$ as n,C as r,H as i,K as a,M as o,S as s,T as c,Vt as l,W as u,b as d,f,n as p,v as m,y as h}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{T as g,v as _}from"./common-ui.es-mrcutgtG.js";import{E as v,T as y,f as b,w as x}from"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import{k as S}from"./dist-DkeESCP4.js";import{t as C}from"./index-jZbLHVSV.js";import{n as w,t as T}from"./server-DvlG_kpF.js";var E=t(w()),D=c({emits:[`ClassroomEditingComplete`],data(){return{mousetrap:new E.default(this.$el),peerAssist:!0,name:``,birthYear:void 0,id:``,nameRules:[e=>e.length>30?`Course name must be 30 characters or less`:!0],description:``,banner:void 0,thumb:void 0,updatePending:!1,birthYears:[]}},created(){this.mousetrap.bind(`esc`,this.clearFormAndDismiss);let e=v().year();this.birthYears.push({text:`< ${e-17} (Adult Students)`,value:0});for(let t=17;t>=6;t--)this.birthYears.push({text:`${e-t} (Grade ${t-5})`,value:e-t});this.birthYears.push({text:`>${e-6} (K or younger)`,value:e-5})},methods:{async submit(){this.updatePending=!0;let e=await g(),t={name:this.name,teachers:[e.getUsername()],students:[],birthYear:this.birthYear,classMeetingSchedule:``,peerAssist:this.peerAssist,joinCode:``};b(`Class Config:
2
+ ${JSON.stringify(t)}`);let n=await T({data:t,type:x.CREATE_CLASSROOM,response:null,user:e.getUsername()});n.response&&n.response.ok?(_({text:`Class created successfully. Join code: ${n.response.joincode}`,status:y.ok}),e.registerForClassroom(n.response.uuid,`teacher`)):_({text:`Failed to create class. Please try again.`,status:y.error}),this.clearFormAndDismiss(),this.updatePending=!1},clearFormAndDismiss(){this.name=``,this.description=``,this.$emit(`ClassroomEditingComplete`)}}});function _sfc_render$1(e,t,o,c,l,u){let d=a(`v-card-title`),f=a(`v-spacer`),p=a(`v-icon`),h=a(`v-btn`),g=a(`v-toolbar`),_=a(`v-text-field`),v=a(`v-col`),y=a(`v-checkbox`),b=a(`v-select`),x=a(`v-row`),S=a(`v-container`),C=a(`v-form`),w=a(`v-card`);return i(),m(w,null,{default:n(()=>[r(g,{color:`primary`},{default:n(()=>[r(d,{class:`text-h6 font-weight-regular`},{default:n(()=>t[3]||(t[3]=[s(`Start a New Class`)])),_:1}),r(f),r(h,{icon:``,onClick:e.clearFormAndDismiss},{default:n(()=>[r(p,null,{default:n(()=>t[4]||(t[4]=[s(`mdi-close`)])),_:1})]),_:1},8,[`onClick`])]),_:1}),r(C,null,{default:n(()=>[r(S,null,{default:n(()=>[r(x,null,{default:n(()=>[r(v,{cols:`12`,sm:`6`,md:`4`},{default:n(()=>[r(_,{modelValue:e.name,"onUpdate:modelValue":t[0]||(t[0]=t=>e.name=t),counter:`30`,rules:e.nameRules,label:`Class Name`,required:``,hint:`Eg: Smith, Chemistry, Period 3`},null,8,[`modelValue`,`rules`])]),_:1}),r(v,{cols:`12`,sm:`6`,md:`4`},{default:n(()=>[r(y,{modelValue:e.peerAssist,"onUpdate:modelValue":t[1]||(t[1]=t=>e.peerAssist=t),label:`Allow peer instruction`},null,8,[`modelValue`])]),_:1}),r(v,{cols:`12`,sm:`6`,md:`4`},{default:n(()=>[r(b,{modelValue:e.birthYear,"onUpdate:modelValue":t[2]||(t[2]=t=>e.birthYear=t),items:e.birthYears,label:`Approximate Birth Year of Students`,"item-title":`text`,"item-value":`value`},null,8,[`modelValue`,`items`])]),_:1}),r(v,{cols:`12`,sm:`6`,md:`4`},{default:n(()=>[r(h,{loading:e.updatePending,color:`primary`,onClick:e.submit},{default:n(()=>t[5]||(t[5]=[s(`Create This Class`)])),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})}e(_sfc_render$1,`_sfc_render`);var O=c({name:`ClassroomsView`,components:{ClassroomEditor:C(D,[[`render`,_sfc_render$1]])},beforeRouteEnter(e,t,n){n()},data(){return{classes:[],joinCode:``,studentClasses:[],teacherClasses:[],spinnerMap:{},newClassDialog:!1,user:null}},created(){this.refreshData()},methods:{async refreshData(){this.$data.user=await g();let e=(await this.user.getUserClassrooms()).registrations,t=[],n=[];e.forEach(async e=>{let r=(await S().getClassroomDB(e.classID,e.registeredAs==`teacher`||e.registeredAs==`student`?e.registeredAs:`student`)).getConfig();console.log(`Registered class: ${JSON.stringify(r)}`);let i={_id:e.classID,name:r.name};e.registeredAs===`student`?t.push(i):e.registeredAs===`teacher`&&n.push(i)}),this.studentClasses=t,this.teacherClasses=n},async deleteClass(e){let t=await T({type:x.DELETE_CLASSROOM,user:this.user?.getUsername()||``,classID:e,response:null});t.response&&t.response.ok?_({text:`Class deleted successfully.`,status:y.ok}):_({text:`Failed to delete class. Please try again.`,status:y.error})},async leaveClass(e){this.spinnerMap[e]=!0,console.log(`Attempting to drop class: ${e}`);let t=await T({type:x.LEAVE_CLASSROOM,data:{classID:e},user:this.user?.getUsername()||``,response:null});t.response&&t.response.ok&&this.user&&await this.user.dropFromClassroom(e),delete this.spinnerMap[e],this.refreshData()},async joinClass(){let e=await T({type:x.JOIN_CLASSROOM,data:{joinCode:this.joinCode,registerAs:`student`,user:this.user?.getUsername()||``},user:this.user?.getUsername()||``,response:null});e.response&&e.response.ok?(console.log(`Adding registration to userDB...`),this.user?(await registerUserForClassroom(this.user.getUsername(),e.response.id_course,`student`),_({text:`Successfully joined class: ${e.response.course_name}.`,status:y.ok})):_({text:`Failed to join class. [Unknown current user.]`,status:y.error})):e.response&&_({text:e.response.errorText,status:y.error}),this.refreshData()},async processResponse(){this.newClassDialog=!this.newClassDialog}}});function _sfc_render(e,t,c,g,_,v){let y=a(`v-toolbar-title`),b=a(`v-toolbar`),x=a(`v-list-item-title`),S=a(`v-btn`),C=a(`v-list-item`),w=a(`v-list`),T=a(`v-card`),E=a(`v-col`),D=a(`v-row`),O=a(`v-divider`),k=a(`v-text-field`),A=a(`v-card-text`),j=a(`classroom-editor`),M=a(`v-dialog`),N=a(`v-container`);return i(),m(N,{fluid:``},{default:n(()=>[r(D,{class:`pa-4`,justify:`space-around`},{default:n(()=>[e.studentClasses.length>0?(i(),m(E,{key:0,cols:`12`,sm:`12`,md:`4`},{default:n(()=>[r(T,null,{default:n(()=>[r(b,{color:`primary`},{default:n(()=>[r(y,null,{default:n(()=>t[2]||(t[2]=[s(`My Classes`)])),_:1})]),_:1}),r(w,null,{default:n(()=>[r(p,{name:`component-fade`,mode:`out-in`},{default:n(()=>[(i(!0),d(f,null,u(e.studentClasses,a=>(i(),m(C,{key:a._id,value:a},{append:n(()=>[r(S,{size:`small`,color:`secondary`,loading:e.spinnerMap[a._id]!==void 0,onClick:t=>e.leaveClass(a._id)},{default:n(()=>t[3]||(t[3]=[s(` Leave this class `)])),_:2},1032,[`loading`,`onClick`])]),default:n(()=>[r(x,null,{default:n(()=>[s(l(a.name),1)]),_:2},1024)]),_:2},1032,[`value`]))),128))]),_:1})]),_:1})]),_:1})]),_:1})):h(``,!0),e.teacherClasses.length>0?(i(),m(E,{key:1,cols:`12`,sm:`12`,md:`4`},{default:n(()=>[r(T,null,{default:n(()=>[r(b,{color:`primary`},{default:n(()=>[r(y,null,{default:n(()=>t[4]||(t[4]=[s(`Classes I Manage`)])),_:1})]),_:1}),r(w,null,{default:n(()=>[r(p,{name:`component-fade`,mode:`out-in`},{default:n(()=>[(i(!0),d(f,null,u(e.teacherClasses,a=>(i(),m(C,{key:a._id,value:a},{append:n(()=>[r(S,{size:`small`,color:`secondary`,loading:e.spinnerMap[a._id]!==void 0,to:`/classrooms/${a._id}`},{default:n(()=>t[5]||(t[5]=[s(` Open `)])),_:2},1032,[`loading`,`to`])]),default:n(()=>[r(x,null,{default:n(()=>[s(l(a.name),1)]),_:2},1024)]),_:2},1032,[`value`]))),128))]),_:1})]),_:1})]),_:1})]),_:1})):h(``,!0),e.studentClasses.length===0&&e.teacherClasses.length===0?(i(),m(E,{key:2,class:`text-h5 text-center`},{default:n(()=>t[6]||(t[6]=[s(` You are not in any classes! Join your class below if someone has given you a joincode. Or else, start your own! `)])),_:1})):h(``,!0)]),_:1}),r(O,{class:`my-4`}),r(D,{class:`pa-4`},{default:n(()=>[r(E,{cols:`12`,sm:`12`,md:`8`,lg:`6`,xl:`6`},{default:n(()=>[r(T,null,{default:n(()=>[r(b,{color:`primary`},{default:n(()=>[r(y,null,{default:n(()=>t[7]||(t[7]=[s(`Join a class`)])),_:1})]),_:1}),r(A,null,{default:n(()=>[r(k,{modelValue:e.joinCode,"onUpdate:modelValue":t[0]||(t[0]=t=>e.joinCode=t),label:`Class Code`,variant:`outlined`},null,8,[`modelValue`]),r(S,{color:`primary`,onClick:e.joinClass},{default:n(()=>t[8]||(t[8]=[s(`Join`)])),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1})]),_:1}),r(M,{modelValue:e.newClassDialog,"onUpdate:modelValue":t[1]||(t[1]=t=>e.newClassDialog=t),fullscreen:``,transition:`dialog-bottom-transition`,scrim:!1},{activator:n(({props:e})=>[r(S,o({color:`primary`},e),{default:n(()=>t[9]||(t[9]=[s(`Start a new Class`)])),_:2},1040)]),default:n(()=>[r(j,{onClassroomEditingComplete:e.processResponse},null,8,[`onClassroomEditingComplete`])]),_:1},8,[`modelValue`])]),_:1})}var k=C(O,[[`render`,_sfc_render]]);export{k as default};
3
+ //# sourceMappingURL=Classrooms-BZmnwuIB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Classrooms-BZmnwuIB.js","names":[],"sources":["../../src/components/Classrooms/CreateClassroom.vue","../../src/components/Classrooms/CreateClassroom.vue","../../src/views/Classrooms.vue","../../src/views/Classrooms.vue"],"sourcesContent":["<template>\n <v-card>\n <v-toolbar color=\"primary\">\n <v-card-title class=\"text-h6 font-weight-regular\">Start a New Class</v-card-title>\n <v-spacer></v-spacer>\n <v-btn icon @click=\"clearFormAndDismiss\">\n <v-icon>mdi-close</v-icon>\n </v-btn>\n </v-toolbar>\n <v-form>\n <v-container>\n <v-row>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-text-field\n v-model=\"name\"\n counter=\"30\"\n :rules=\"nameRules\"\n label=\"Class Name\"\n required\n hint=\"Eg: Smith, Chemistry, Period 3\"\n ></v-text-field>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-checkbox v-model=\"peerAssist\" label=\"Allow peer instruction\"></v-checkbox>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-select\n v-model=\"birthYear\"\n :items=\"birthYears\"\n label=\"Approximate Birth Year of Students\"\n item-title=\"text\"\n item-value=\"value\"\n ></v-select>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-btn :loading=\"updatePending\" color=\"primary\" @click=\"submit\">Create This Class</v-btn>\n </v-col>\n </v-row>\n </v-container>\n </v-form>\n </v-card>\n</template>\n\n<script lang=\"ts\">\nimport moment from 'moment';\nimport Mousetrap from 'mousetrap';\nimport { log } from '@vue-skuilder/common';\nimport { Status, ClassroomConfig, CreateClassroom, ServerRequestType } from '@vue-skuilder/common';\nimport serverRequest from '../../server';\nimport { alertUser } from '@vue-skuilder/common-ui';\nimport { defineComponent } from 'vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n emits: ['ClassroomEditingComplete'],\n\n data() {\n return {\n mousetrap: new Mousetrap(this.$el),\n peerAssist: true,\n name: '',\n birthYear: undefined as number | undefined,\n id: '',\n nameRules: [\n (value: string): string | boolean => {\n const max = 30;\n if (value.length > max) {\n return `Course name must be ${max} characters or less`;\n } else {\n return true;\n }\n },\n ],\n description: '',\n banner: undefined as Blob | undefined,\n thumb: undefined as Blob | undefined,\n updatePending: false,\n birthYears: [] as Array<{\n text: string;\n value: number;\n }>,\n };\n },\n\n created() {\n this.mousetrap.bind('esc', this.clearFormAndDismiss);\n\n const year: number = moment().year();\n\n this.birthYears.push({\n text: `< ${year - 17} (Adult Students)`,\n value: 0,\n });\n\n for (let age = 17; age >= 6; age--) {\n this.birthYears.push({\n text: `${year - age} (Grade ${age - 5})`,\n value: year - age,\n });\n }\n\n this.birthYears.push({\n text: `>${year - 6} (K or younger)`,\n value: year - 5,\n });\n },\n\n methods: {\n async submit() {\n this.updatePending = true;\n const u = await getCurrentUser();\n\n const config: ClassroomConfig = {\n name: this.name,\n teachers: [u.getUsername()],\n students: [],\n birthYear: this.birthYear,\n classMeetingSchedule: '',\n peerAssist: this.peerAssist,\n joinCode: '',\n };\n\n log(`Class Config:\n ${JSON.stringify(config)}`);\n\n const result = await serverRequest<CreateClassroom>({\n data: config,\n type: ServerRequestType.CREATE_CLASSROOM,\n response: null,\n user: u.getUsername(),\n });\n\n if (result.response && result.response.ok) {\n alertUser({\n text: `Class created successfully. Join code: ${result.response.joincode}`,\n status: Status.ok,\n });\n\n u.registerForClassroom(result.response.uuid, 'teacher');\n } else {\n alertUser({\n text: `Failed to create class. Please try again.`,\n status: Status.error,\n });\n }\n\n this.clearFormAndDismiss();\n this.updatePending = false;\n },\n\n clearFormAndDismiss() {\n this.name = '';\n this.description = '';\n\n this.$emit('ClassroomEditingComplete');\n },\n },\n});\n</script>\n","<template>\n <v-card>\n <v-toolbar color=\"primary\">\n <v-card-title class=\"text-h6 font-weight-regular\">Start a New Class</v-card-title>\n <v-spacer></v-spacer>\n <v-btn icon @click=\"clearFormAndDismiss\">\n <v-icon>mdi-close</v-icon>\n </v-btn>\n </v-toolbar>\n <v-form>\n <v-container>\n <v-row>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-text-field\n v-model=\"name\"\n counter=\"30\"\n :rules=\"nameRules\"\n label=\"Class Name\"\n required\n hint=\"Eg: Smith, Chemistry, Period 3\"\n ></v-text-field>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-checkbox v-model=\"peerAssist\" label=\"Allow peer instruction\"></v-checkbox>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-select\n v-model=\"birthYear\"\n :items=\"birthYears\"\n label=\"Approximate Birth Year of Students\"\n item-title=\"text\"\n item-value=\"value\"\n ></v-select>\n </v-col>\n <v-col cols=\"12\" sm=\"6\" md=\"4\">\n <v-btn :loading=\"updatePending\" color=\"primary\" @click=\"submit\">Create This Class</v-btn>\n </v-col>\n </v-row>\n </v-container>\n </v-form>\n </v-card>\n</template>\n\n<script lang=\"ts\">\nimport moment from 'moment';\nimport Mousetrap from 'mousetrap';\nimport { log } from '@vue-skuilder/common';\nimport { Status, ClassroomConfig, CreateClassroom, ServerRequestType } from '@vue-skuilder/common';\nimport serverRequest from '../../server';\nimport { alertUser } from '@vue-skuilder/common-ui';\nimport { defineComponent } from 'vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n emits: ['ClassroomEditingComplete'],\n\n data() {\n return {\n mousetrap: new Mousetrap(this.$el),\n peerAssist: true,\n name: '',\n birthYear: undefined as number | undefined,\n id: '',\n nameRules: [\n (value: string): string | boolean => {\n const max = 30;\n if (value.length > max) {\n return `Course name must be ${max} characters or less`;\n } else {\n return true;\n }\n },\n ],\n description: '',\n banner: undefined as Blob | undefined,\n thumb: undefined as Blob | undefined,\n updatePending: false,\n birthYears: [] as Array<{\n text: string;\n value: number;\n }>,\n };\n },\n\n created() {\n this.mousetrap.bind('esc', this.clearFormAndDismiss);\n\n const year: number = moment().year();\n\n this.birthYears.push({\n text: `< ${year - 17} (Adult Students)`,\n value: 0,\n });\n\n for (let age = 17; age >= 6; age--) {\n this.birthYears.push({\n text: `${year - age} (Grade ${age - 5})`,\n value: year - age,\n });\n }\n\n this.birthYears.push({\n text: `>${year - 6} (K or younger)`,\n value: year - 5,\n });\n },\n\n methods: {\n async submit() {\n this.updatePending = true;\n const u = await getCurrentUser();\n\n const config: ClassroomConfig = {\n name: this.name,\n teachers: [u.getUsername()],\n students: [],\n birthYear: this.birthYear,\n classMeetingSchedule: '',\n peerAssist: this.peerAssist,\n joinCode: '',\n };\n\n log(`Class Config:\n ${JSON.stringify(config)}`);\n\n const result = await serverRequest<CreateClassroom>({\n data: config,\n type: ServerRequestType.CREATE_CLASSROOM,\n response: null,\n user: u.getUsername(),\n });\n\n if (result.response && result.response.ok) {\n alertUser({\n text: `Class created successfully. Join code: ${result.response.joincode}`,\n status: Status.ok,\n });\n\n u.registerForClassroom(result.response.uuid, 'teacher');\n } else {\n alertUser({\n text: `Failed to create class. Please try again.`,\n status: Status.error,\n });\n }\n\n this.clearFormAndDismiss();\n this.updatePending = false;\n },\n\n clearFormAndDismiss() {\n this.name = '';\n this.description = '';\n\n this.$emit('ClassroomEditingComplete');\n },\n },\n});\n</script>\n","<template>\n <v-container fluid>\n <v-row class=\"pa-4\" justify=\"space-around\">\n <!-- Student Classes -->\n <v-col v-if=\"studentClasses.length > 0\" cols=\"12\" sm=\"12\" md=\"4\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>My Classes</v-toolbar-title>\n </v-toolbar>\n\n <v-list>\n <transition-group name=\"component-fade\" mode=\"out-in\">\n <v-list-item v-for=\"classroom in studentClasses\" :key=\"classroom._id\" :value=\"classroom\">\n <v-list-item-title>\n {{ classroom.name }}\n </v-list-item-title>\n\n <template #append>\n <v-btn\n size=\"small\"\n color=\"secondary\"\n :loading=\"spinnerMap[classroom._id] !== undefined\"\n @click=\"leaveClass(classroom._id)\"\n >\n Leave this class\n </v-btn>\n </template>\n </v-list-item>\n </transition-group>\n </v-list>\n </v-card>\n </v-col>\n\n <!-- Teacher Classes -->\n <v-col v-if=\"teacherClasses.length > 0\" cols=\"12\" sm=\"12\" md=\"4\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>Classes I Manage</v-toolbar-title>\n </v-toolbar>\n\n <v-list>\n <transition-group name=\"component-fade\" mode=\"out-in\">\n <v-list-item v-for=\"classroom in teacherClasses\" :key=\"classroom._id\" :value=\"classroom\">\n <v-list-item-title>\n {{ classroom.name }}\n </v-list-item-title>\n\n <template #append>\n <v-btn\n size=\"small\"\n color=\"secondary\"\n :loading=\"spinnerMap[classroom._id] !== undefined\"\n :to=\"`/classrooms/${classroom._id}`\"\n >\n Open\n </v-btn>\n </template>\n </v-list-item>\n </transition-group>\n </v-list>\n </v-card>\n </v-col>\n\n <!-- Empty State Message -->\n <v-col v-if=\"studentClasses.length === 0 && teacherClasses.length === 0\" class=\"text-h5 text-center\">\n You are not in any classes! Join your class below if someone has given you a joincode. Or else, start your own!\n </v-col>\n </v-row>\n\n <v-divider class=\"my-4\"></v-divider>\n\n <!-- Join Class Form -->\n <v-row class=\"pa-4\">\n <v-col cols=\"12\" sm=\"12\" md=\"8\" lg=\"6\" xl=\"6\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>Join a class</v-toolbar-title>\n </v-toolbar>\n <v-card-text>\n <v-text-field v-model=\"joinCode\" label=\"Class Code\" variant=\"outlined\"></v-text-field>\n <v-btn color=\"primary\" @click=\"joinClass\">Join</v-btn>\n </v-card-text>\n </v-card>\n </v-col>\n </v-row>\n\n <!-- New Class Dialog -->\n <v-dialog v-model=\"newClassDialog\" fullscreen transition=\"dialog-bottom-transition\" :scrim=\"false\">\n <template #activator=\"{ props }\">\n <v-btn color=\"primary\" v-bind=\"props\">Start a new Class</v-btn>\n </template>\n <classroom-editor @classroom-editing-complete=\"processResponse\" />\n </v-dialog>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { Status, ServerRequestType, JoinClassroom, LeaveClassroom, DeleteClassroom } from '@vue-skuilder/common';\nimport { getDataLayer, UserDBInterface } from '@vue-skuilder/db';\nimport serverRequest from '@pui/server/index';\nimport { alertUser } from '@vue-skuilder/common-ui';\nimport ClassroomEditor from '@pui/components/Classrooms/CreateClassroom.vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\ninterface CourseReg {\n _id: string;\n name: string;\n}\n\nexport default defineComponent({\n name: 'ClassroomsView',\n\n components: {\n ClassroomEditor,\n },\n\n beforeRouteEnter(to, from, next) {\n // todo ?\n // See https://router.vuejs.org/guide/advanced/data-fetching.html#fetching-before-navigation\n // this.refreshData().then(() => {\n // next();\n // });\n next();\n },\n\n data() {\n return {\n classes: [] as string[],\n joinCode: '',\n studentClasses: [] as CourseReg[],\n teacherClasses: [] as CourseReg[],\n spinnerMap: {} as { [index: string]: boolean },\n newClassDialog: false,\n user: null as UserDBInterface | null,\n };\n },\n\n created() {\n this.refreshData();\n },\n\n methods: {\n async refreshData() {\n this.$data.user = await getCurrentUser();\n const registrations = (await this.user!.getUserClassrooms()).registrations;\n const studentClasses: CourseReg[] = [];\n const teacherClasses: CourseReg[] = [];\n\n registrations.forEach(async (reg) => {\n const cfg = (\n await getDataLayer().getClassroomDB(\n reg.classID,\n reg.registeredAs == 'teacher' || reg.registeredAs == 'student' ? reg.registeredAs : 'student'\n )\n ).getConfig();\n console.log(`Registered class: ${JSON.stringify(cfg)}`);\n const regItem = {\n _id: reg.classID,\n name: cfg.name,\n };\n\n if (reg.registeredAs === 'student') {\n studentClasses.push(regItem);\n } else if (reg.registeredAs === 'teacher') {\n teacherClasses.push(regItem);\n }\n });\n\n this.studentClasses = studentClasses;\n this.teacherClasses = teacherClasses;\n },\n\n async deleteClass(classId: string) {\n const result = await serverRequest<DeleteClassroom>({\n type: ServerRequestType.DELETE_CLASSROOM,\n user: this.user?.getUsername() || '',\n classID: classId,\n response: null,\n });\n if (result.response && result.response.ok) {\n alertUser({\n text: `Class deleted successfully.`,\n status: Status.ok,\n });\n } else {\n alertUser({\n text: `Failed to delete class. Please try again.`,\n status: Status.error,\n });\n }\n },\n\n async leaveClass(classID: string) {\n this.spinnerMap[classID] = true;\n console.log(`Attempting to drop class: ${classID}`);\n\n const result = await serverRequest<LeaveClassroom>({\n type: ServerRequestType.LEAVE_CLASSROOM,\n data: {\n classID: classID,\n },\n user: this.user?.getUsername() || '',\n response: null,\n });\n if (result.response && result.response.ok) {\n if (this.user) {\n await this.user!.dropFromClassroom(classID);\n }\n }\n\n delete this.spinnerMap[classID];\n this.refreshData();\n },\n\n async joinClass() {\n const result = await serverRequest<JoinClassroom>({\n type: ServerRequestType.JOIN_CLASSROOM,\n data: {\n joinCode: this.joinCode,\n registerAs: 'student',\n user: this.user?.getUsername() || '',\n },\n user: this.user?.getUsername() || '',\n response: null,\n });\n\n if (result.response && result.response.ok) {\n console.log(`Adding registration to userDB...`);\n if (this.user) {\n await registerUserForClassroom(this.user.getUsername(), result.response!.id_course, 'student');\n alertUser({\n text: `Successfully joined class: ${result.response.course_name}.`,\n status: Status.ok,\n });\n } else {\n alertUser({\n text: `Failed to join class. [Unknown current user.]`,\n status: Status.error,\n });\n }\n } else {\n if (result.response) {\n alertUser({\n text: result.response.errorText!,\n status: Status.error,\n });\n }\n }\n this.refreshData();\n },\n\n async processResponse() {\n this.newClassDialog = !this.newClassDialog;\n },\n },\n});\n</script>\n","<template>\n <v-container fluid>\n <v-row class=\"pa-4\" justify=\"space-around\">\n <!-- Student Classes -->\n <v-col v-if=\"studentClasses.length > 0\" cols=\"12\" sm=\"12\" md=\"4\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>My Classes</v-toolbar-title>\n </v-toolbar>\n\n <v-list>\n <transition-group name=\"component-fade\" mode=\"out-in\">\n <v-list-item v-for=\"classroom in studentClasses\" :key=\"classroom._id\" :value=\"classroom\">\n <v-list-item-title>\n {{ classroom.name }}\n </v-list-item-title>\n\n <template #append>\n <v-btn\n size=\"small\"\n color=\"secondary\"\n :loading=\"spinnerMap[classroom._id] !== undefined\"\n @click=\"leaveClass(classroom._id)\"\n >\n Leave this class\n </v-btn>\n </template>\n </v-list-item>\n </transition-group>\n </v-list>\n </v-card>\n </v-col>\n\n <!-- Teacher Classes -->\n <v-col v-if=\"teacherClasses.length > 0\" cols=\"12\" sm=\"12\" md=\"4\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>Classes I Manage</v-toolbar-title>\n </v-toolbar>\n\n <v-list>\n <transition-group name=\"component-fade\" mode=\"out-in\">\n <v-list-item v-for=\"classroom in teacherClasses\" :key=\"classroom._id\" :value=\"classroom\">\n <v-list-item-title>\n {{ classroom.name }}\n </v-list-item-title>\n\n <template #append>\n <v-btn\n size=\"small\"\n color=\"secondary\"\n :loading=\"spinnerMap[classroom._id] !== undefined\"\n :to=\"`/classrooms/${classroom._id}`\"\n >\n Open\n </v-btn>\n </template>\n </v-list-item>\n </transition-group>\n </v-list>\n </v-card>\n </v-col>\n\n <!-- Empty State Message -->\n <v-col v-if=\"studentClasses.length === 0 && teacherClasses.length === 0\" class=\"text-h5 text-center\">\n You are not in any classes! Join your class below if someone has given you a joincode. Or else, start your own!\n </v-col>\n </v-row>\n\n <v-divider class=\"my-4\"></v-divider>\n\n <!-- Join Class Form -->\n <v-row class=\"pa-4\">\n <v-col cols=\"12\" sm=\"12\" md=\"8\" lg=\"6\" xl=\"6\">\n <v-card>\n <v-toolbar color=\"primary\">\n <v-toolbar-title>Join a class</v-toolbar-title>\n </v-toolbar>\n <v-card-text>\n <v-text-field v-model=\"joinCode\" label=\"Class Code\" variant=\"outlined\"></v-text-field>\n <v-btn color=\"primary\" @click=\"joinClass\">Join</v-btn>\n </v-card-text>\n </v-card>\n </v-col>\n </v-row>\n\n <!-- New Class Dialog -->\n <v-dialog v-model=\"newClassDialog\" fullscreen transition=\"dialog-bottom-transition\" :scrim=\"false\">\n <template #activator=\"{ props }\">\n <v-btn color=\"primary\" v-bind=\"props\">Start a new Class</v-btn>\n </template>\n <classroom-editor @classroom-editing-complete=\"processResponse\" />\n </v-dialog>\n </v-container>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { Status, ServerRequestType, JoinClassroom, LeaveClassroom, DeleteClassroom } from '@vue-skuilder/common';\nimport { getDataLayer, UserDBInterface } from '@vue-skuilder/db';\nimport serverRequest from '@pui/server/index';\nimport { alertUser } from '@vue-skuilder/common-ui';\nimport ClassroomEditor from '@pui/components/Classrooms/CreateClassroom.vue';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\ninterface CourseReg {\n _id: string;\n name: string;\n}\n\nexport default defineComponent({\n name: 'ClassroomsView',\n\n components: {\n ClassroomEditor,\n },\n\n beforeRouteEnter(to, from, next) {\n // todo ?\n // See https://router.vuejs.org/guide/advanced/data-fetching.html#fetching-before-navigation\n // this.refreshData().then(() => {\n // next();\n // });\n next();\n },\n\n data() {\n return {\n classes: [] as string[],\n joinCode: '',\n studentClasses: [] as CourseReg[],\n teacherClasses: [] as CourseReg[],\n spinnerMap: {} as { [index: string]: boolean },\n newClassDialog: false,\n user: null as UserDBInterface | null,\n };\n },\n\n created() {\n this.refreshData();\n },\n\n methods: {\n async refreshData() {\n this.$data.user = await getCurrentUser();\n const registrations = (await this.user!.getUserClassrooms()).registrations;\n const studentClasses: CourseReg[] = [];\n const teacherClasses: CourseReg[] = [];\n\n registrations.forEach(async (reg) => {\n const cfg = (\n await getDataLayer().getClassroomDB(\n reg.classID,\n reg.registeredAs == 'teacher' || reg.registeredAs == 'student' ? reg.registeredAs : 'student'\n )\n ).getConfig();\n console.log(`Registered class: ${JSON.stringify(cfg)}`);\n const regItem = {\n _id: reg.classID,\n name: cfg.name,\n };\n\n if (reg.registeredAs === 'student') {\n studentClasses.push(regItem);\n } else if (reg.registeredAs === 'teacher') {\n teacherClasses.push(regItem);\n }\n });\n\n this.studentClasses = studentClasses;\n this.teacherClasses = teacherClasses;\n },\n\n async deleteClass(classId: string) {\n const result = await serverRequest<DeleteClassroom>({\n type: ServerRequestType.DELETE_CLASSROOM,\n user: this.user?.getUsername() || '',\n classID: classId,\n response: null,\n });\n if (result.response && result.response.ok) {\n alertUser({\n text: `Class deleted successfully.`,\n status: Status.ok,\n });\n } else {\n alertUser({\n text: `Failed to delete class. Please try again.`,\n status: Status.error,\n });\n }\n },\n\n async leaveClass(classID: string) {\n this.spinnerMap[classID] = true;\n console.log(`Attempting to drop class: ${classID}`);\n\n const result = await serverRequest<LeaveClassroom>({\n type: ServerRequestType.LEAVE_CLASSROOM,\n data: {\n classID: classID,\n },\n user: this.user?.getUsername() || '',\n response: null,\n });\n if (result.response && result.response.ok) {\n if (this.user) {\n await this.user!.dropFromClassroom(classID);\n }\n }\n\n delete this.spinnerMap[classID];\n this.refreshData();\n },\n\n async joinClass() {\n const result = await serverRequest<JoinClassroom>({\n type: ServerRequestType.JOIN_CLASSROOM,\n data: {\n joinCode: this.joinCode,\n registerAs: 'student',\n user: this.user?.getUsername() || '',\n },\n user: this.user?.getUsername() || '',\n response: null,\n });\n\n if (result.response && result.response.ok) {\n console.log(`Adding registration to userDB...`);\n if (this.user) {\n await registerUserForClassroom(this.user.getUsername(), result.response!.id_course, 'student');\n alertUser({\n text: `Successfully joined class: ${result.response.course_name}.`,\n status: Status.ok,\n });\n } else {\n alertUser({\n text: `Failed to join class. [Unknown current user.]`,\n status: Status.error,\n });\n }\n } else {\n if (result.response) {\n alertUser({\n text: result.response.errorText!,\n status: Status.error,\n });\n }\n }\n this.refreshData();\n },\n\n async processResponse() {\n this.newClassDialog = !this.newClassDialog;\n },\n },\n});\n</script>\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import{i as e,r as t}from"./chunk-D6hFPZc3.js";import{$ as n,C as r,H as i,It as a,K as o,M as s,S as c,T as l,Vt as u,W as d,_ as f,b as p,f as m,t as h,v as g,y as _}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{S as v,T as y,a as b}from"./common-ui.es-mrcutgtG.js";import"./dist-CrcJCHFk.js";import"./MarkdownRenderer-DoVbFpA6-BIbDxYC4.js";import{k as x}from"./dist-DkeESCP4.js";import{t as S}from"./index-jZbLHVSV.js";import{g as C,l as w}from"./dist-BlP52QF6.js";import"./server-DvlG_kpF.js";import{t as T}from"./NewCourseDialog-lQEm3iJe.js";function bind(e,t){return function wrap(){return e.apply(t,arguments)}}var{toString:E}=Object.prototype,{getPrototypeOf:D}=Object,{iterator:O,toStringTag:k}=Symbol,A=(e=>t=>{let n=E.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),kindOfTest=e=>(e=e.toLowerCase(),t=>A(t)===e),typeOfTest=e=>t=>typeof t===e,{isArray:j}=Array,M=typeOfTest(`undefined`);function isBuffer(e){return e!==null&&!M(e)&&e.constructor!==null&&!M(e.constructor)&&F(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}var N=kindOfTest(`ArrayBuffer`);function isArrayBufferView(e){let t;return t=typeof ArrayBuffer<`u`&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&N(e.buffer),t}var P=typeOfTest(`string`),F=typeOfTest(`function`),I=typeOfTest(`number`),isObject=e=>typeof e==`object`&&!!e,isBoolean=e=>e===!0||e===!1,isPlainObject=e=>{if(A(e)!==`object`)return!1;let t=D(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(k in e)&&!(O in e)},isEmptyObject=e=>{if(!isObject(e)||isBuffer(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},ee=kindOfTest(`Date`),te=kindOfTest(`File`),ne=kindOfTest(`Blob`),re=kindOfTest(`FileList`),isStream=e=>isObject(e)&&F(e.pipe),isFormData=e=>{let t;return e&&(typeof FormData==`function`&&e instanceof FormData||F(e.append)&&((t=A(e))===`formdata`||t===`object`&&F(e.toString)&&e.toString()===`[object FormData]`))},ie=kindOfTest(`URLSearchParams`),[ae,oe,se,ce]=[`ReadableStream`,`Request`,`Response`,`Headers`].map(kindOfTest),trim=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,``);function forEach(e,t,{allOwnKeys:n=!1}={}){if(e==null)return;let r,i;if(typeof e!=`object`&&(e=[e]),j(e))for(r=0,i=e.length;r<i;r++)t.call(null,e[r],r,e);else{if(isBuffer(e))return;let i=n?Object.getOwnPropertyNames(e):Object.keys(e),a=i.length,o;for(r=0;r<a;r++)o=i[r],t.call(null,e[o],o,e)}}function findKey(e,t){if(isBuffer(e))return null;t=t.toLowerCase();let n=Object.keys(e),r=n.length,i;for(;r-- >0;)if(i=n[r],t===i.toLowerCase())return i;return null}var L=typeof globalThis<`u`?globalThis:typeof self<`u`?self:window,isContextDefined=e=>!M(e)&&e!==L;function merge(){let{caseless:e,skipUndefined:t}=isContextDefined(this)&&this||{},n={},assignValue=(r,i)=>{let a=e&&findKey(n,i)||i;isPlainObject(n[a])&&isPlainObject(r)?n[a]=merge(n[a],r):isPlainObject(r)?n[a]=merge({},r):j(r)?n[a]=r.slice():(!t||!M(r))&&(n[a]=r)};for(let e=0,t=arguments.length;e<t;e++)arguments[e]&&forEach(arguments[e],assignValue);return n}var extend=(e,t,n,{allOwnKeys:r}={})=>(forEach(t,(t,r)=>{n&&F(t)?e[r]=bind(t,n):e[r]=t},{allOwnKeys:r}),e),stripBOM=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),inherits=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,`super`,{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject=(e,t,n,r)=>{let i,a,o,s={};if(t=t||{},e==null)return t;do{for(i=Object.getOwnPropertyNames(e),a=i.length;a-- >0;)o=i[a],(!r||r(o,e,t))&&!s[o]&&(t[o]=e[o],s[o]=!0);e=n!==!1&&D(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},endsWith=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;let r=e.indexOf(t,n);return r!==-1&&r===n},toArray=e=>{if(!e)return null;if(j(e))return e;let t=e.length;if(!I(t))return null;let n=Array(t);for(;t-- >0;)n[t]=e[t];return n},le=(e=>t=>e&&t instanceof e)(typeof Uint8Array<`u`&&D(Uint8Array)),forEachEntry=(e,t)=>{let n=(e&&e[O]).call(e),r;for(;(r=n.next())&&!r.done;){let n=r.value;t.call(e,n[0],n[1])}},matchAll=(e,t)=>{let n,r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},ue=kindOfTest(`HTMLFormElement`),toCamelCase=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function replacer(e,t,n){return t.toUpperCase()+n}),R=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),de=kindOfTest(`RegExp`),reduceDescriptors=(e,t)=>{let n=Object.getOwnPropertyDescriptors(e),r={};forEach(n,(n,i)=>{let a;(a=t(n,i,e))!==!1&&(r[i]=a||n)}),Object.defineProperties(e,r)},freezeMethods=e=>{reduceDescriptors(e,(t,n)=>{if(F(e)&&[`arguments`,`caller`,`callee`].indexOf(n)!==-1)return!1;let r=e[n];if(F(r)){if(t.enumerable=!1,`writable`in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error(`Can not rewrite read-only method '`+n+`'`)})}})},toObjectSet=(e,t)=>{let n={},define=e=>{e.forEach(e=>{n[e]=!0})};return j(e)?define(e):define(String(e).split(t)),n},noop=()=>{},toFiniteNumber=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function isSpecCompliantForm(e){return!!(e&&F(e.append)&&e[k]===`FormData`&&e[O])}var toJSONObject=e=>{let t=Array(10),visit=(e,n)=>{if(isObject(e)){if(t.indexOf(e)>=0)return;if(isBuffer(e))return e;if(!(`toJSON`in e)){t[n]=e;let r=j(e)?[]:{};return forEach(e,(e,t)=>{let i=visit(e,n+1);!M(i)&&(r[t]=i)}),t[n]=void 0,r}}return e};return visit(e,0)},fe=kindOfTest(`AsyncFunction`),isThenable=e=>e&&(isObject(e)||F(e))&&F(e.then)&&F(e.catch),pe=((e,t)=>e?setImmediate:t?((e,t)=>(L.addEventListener(`message`,({source:n,data:r})=>{n===L&&r===e&&t.length&&t.shift()()},!1),n=>{t.push(n),L.postMessage(e,`*`)}))(`axios@${Math.random()}`,[]):e=>setTimeout(e))(typeof setImmediate==`function`,F(L.postMessage)),me=typeof queueMicrotask<`u`?queueMicrotask.bind(L):typeof process<`u`&&process.nextTick||pe,isIterable=e=>e!=null&&F(e[O]),z={isArray:j,isArrayBuffer:N,isBuffer,isFormData,isArrayBufferView,isString:P,isNumber:I,isBoolean,isObject,isPlainObject,isEmptyObject,isReadableStream:ae,isRequest:oe,isResponse:se,isHeaders:ce,isUndefined:M,isDate:ee,isFile:te,isBlob:ne,isRegExp:de,isFunction:F,isStream,isURLSearchParams:ie,isTypedArray:le,isFileList:re,forEach,merge,extend,trim,stripBOM,inherits,toFlatObject,kindOf:A,kindOfTest,endsWith,toArray,forEachEntry,matchAll,isHTMLForm:ue,hasOwnProperty:R,hasOwnProp:R,reduceDescriptors,freezeMethods,toObjectSet,toCamelCase,noop,toFiniteNumber,findKey,global:L,isContextDefined,isSpecCompliantForm,toJSONObject,isAsyncFn:fe,isThenable,setImmediate:pe,asap:me,isIterable};function AxiosError(e,t,n,r,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=Error().stack,this.message=e,this.name=`AxiosError`,t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),i&&(this.response=i,this.status=i.status?i.status:null)}z.inherits(AxiosError,Error,{toJSON:function toJSON(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:z.toJSONObject(this.config),code:this.code,status:this.status}}});var he=AxiosError.prototype,ge={};[`ERR_BAD_OPTION_VALUE`,`ERR_BAD_OPTION`,`ECONNABORTED`,`ETIMEDOUT`,`ERR_NETWORK`,`ERR_FR_TOO_MANY_REDIRECTS`,`ERR_DEPRECATED`,`ERR_BAD_RESPONSE`,`ERR_BAD_REQUEST`,`ERR_CANCELED`,`ERR_NOT_SUPPORT`,`ERR_INVALID_URL`].forEach(e=>{ge[e]={value:e}}),Object.defineProperties(AxiosError,ge),Object.defineProperty(he,`isAxiosError`,{value:!0}),AxiosError.from=(e,t,n,r,i,a)=>{let o=Object.create(he);z.toFlatObject(e,o,function filter(e){return e!==Error.prototype},e=>e!==`isAxiosError`);let s=e&&e.message?e.message:`Error`,c=t==null&&e?e.code:t;return AxiosError.call(o,s,c,n,r,i),e&&o.cause==null&&Object.defineProperty(o,`cause`,{value:e,configurable:!0}),o.name=e&&e.name||`Error`,a&&Object.assign(o,a),o};function isVisitable(e){return z.isPlainObject(e)||z.isArray(e)}function removeBrackets(e){return z.endsWith(e,`[]`)?e.slice(0,-2):e}function renderKey(e,t,n){return e?e.concat(t).map(function each(e,t){return e=removeBrackets(e),!n&&t?`[`+e+`]`:e}).join(n?`.`:``):t}function isFlatArray(e){return z.isArray(e)&&!e.some(isVisitable)}var _e=z.toFlatObject(z,{},null,function filter(e){return/^is[A-Z]/.test(e)});function toFormData(e,t,n){if(!z.isObject(e))throw TypeError(`target must be an object`);t=t||new FormData,n=z.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function defined(e,t){return!z.isUndefined(t[e])});let r=n.metaTokens,i=n.visitor||defaultVisitor,a=n.dots,o=n.indexes,s=(n.Blob||typeof Blob<`u`&&Blob)&&z.isSpecCompliantForm(t);if(!z.isFunction(i))throw TypeError(`visitor must be a function`);function convertValue(e){if(e===null)return``;if(z.isDate(e))return e.toISOString();if(z.isBoolean(e))return e.toString();if(!s&&z.isBlob(e))throw new AxiosError(`Blob is not supported. Use a Buffer instead.`);return z.isArrayBuffer(e)||z.isTypedArray(e)?s&&typeof Blob==`function`?new Blob([e]):Buffer.from(e):e}function defaultVisitor(e,n,i){let s=e;if(e&&!i&&typeof e==`object`){if(z.endsWith(n,`{}`))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(z.isArray(e)&&isFlatArray(e)||(z.isFileList(e)||z.endsWith(n,`[]`))&&(s=z.toArray(e)))return n=removeBrackets(n),s.forEach(function each(e,r){!(z.isUndefined(e)||e===null)&&t.append(o===!0?renderKey([n],r,a):o===null?n:n+`[]`,convertValue(e))}),!1}return isVisitable(e)?!0:(t.append(renderKey(i,n,a),convertValue(e)),!1)}let c=[],l=Object.assign(_e,{defaultVisitor,convertValue,isVisitable});function build(e,n){if(!z.isUndefined(e)){if(c.indexOf(e)!==-1)throw Error(`Circular reference detected in `+n.join(`.`));c.push(e),z.forEach(e,function each(e,r){(!(z.isUndefined(e)||e===null)&&i.call(t,e,z.isString(r)?r.trim():r,n,l))===!0&&build(e,n?n.concat(r):[r])}),c.pop()}}if(!z.isObject(e))throw TypeError(`data must be an object`);return build(e),t}function encode$1(e){let t={"!":`%21`,"'":`%27`,"(":`%28`,")":`%29`,"~":`%7E`,"%20":`+`,"%00":`\0`};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function replacer(e){return t[e]})}e(encode$1,`encode`);function AxiosURLSearchParams(e,t){this._pairs=[],e&&toFormData(e,this,t)}var ve=AxiosURLSearchParams.prototype;ve.append=function append(e,t){this._pairs.push([e,t])},ve.toString=function toString(e){let t=e?function(t){return e.call(this,t,encode$1)}:encode$1;return this._pairs.map(function each(e){return t(e[0])+`=`+t(e[1])},``).join(`&`)};function encode(e){return encodeURIComponent(e).replace(/%3A/gi,`:`).replace(/%24/g,`$`).replace(/%2C/gi,`,`).replace(/%20/g,`+`)}function buildURL(e,t,n){if(!t)return e;let r=n&&n.encode||encode;z.isFunction(n)&&(n={serialize:n});let i=n&&n.serialize,a;if(a=i?i(t,n):z.isURLSearchParams(t)?t.toString():new AxiosURLSearchParams(t,n).toString(r),a){let t=e.indexOf(`#`);t!==-1&&(e=e.slice(0,t)),e+=(e.indexOf(`?`)===-1?`?`:`&`)+a}return e}var InterceptorManager=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:n?n.synchronous:!1,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){z.forEach(this.handlers,function forEachHandler(t){t!==null&&e(t)})}},B={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},ye={isBrowser:!0,classes:{URLSearchParams:typeof URLSearchParams<`u`?URLSearchParams:AxiosURLSearchParams,FormData:typeof FormData<`u`?FormData:null,Blob:typeof Blob<`u`?Blob:null},protocols:[`http`,`https`,`file`,`blob`,`url`,`data`]},be=t({hasBrowserEnv:()=>V,hasStandardBrowserEnv:()=>xe,hasStandardBrowserWebWorkerEnv:()=>Se,navigator:()=>H,origin:()=>Ce}),V=typeof window<`u`&&typeof document<`u`,H=typeof navigator==`object`&&navigator||void 0,xe=V&&(!H||[`ReactNative`,`NativeScript`,`NS`].indexOf(H.product)<0),Se=typeof WorkerGlobalScope<`u`&&self instanceof WorkerGlobalScope&&typeof self.importScripts==`function`,Ce=V&&window.location.href||`http://localhost`,U={...be,...ye};function toURLEncodedForm(e,t){return toFormData(e,new U.classes.URLSearchParams,{visitor:function(e,t,n,r){return U.isNode&&z.isBuffer(e)?(this.append(t,e.toString(`base64`)),!1):r.defaultVisitor.apply(this,arguments)},...t})}function parsePropPath(e){return z.matchAll(/\w+|\[(\w*)]/g,e).map(e=>e[0]===`[]`?``:e[1]||e[0])}function arrayToObject(e){let t={},n=Object.keys(e),r,i=n.length,a;for(r=0;r<i;r++)a=n[r],t[a]=e[a];return t}function formDataToJSON(e){function buildPath(e,t,n,r){let i=e[r++];if(i===`__proto__`)return!0;let a=Number.isFinite(+i),o=r>=e.length;return i=!i&&z.isArray(n)?n.length:i,o?(z.hasOwnProp(n,i)?n[i]=[n[i],t]:n[i]=t,!a):((!n[i]||!z.isObject(n[i]))&&(n[i]=[]),buildPath(e,t,n[i],r)&&z.isArray(n[i])&&(n[i]=arrayToObject(n[i])),!a)}if(z.isFormData(e)&&z.isFunction(e.entries)){let t={};return z.forEachEntry(e,(e,n)=>{buildPath(parsePropPath(e),n,t,0)}),t}return null}function stringifySafely(e,t,n){if(z.isString(e))try{return(t||JSON.parse)(e),z.trim(e)}catch(e){if(e.name!==`SyntaxError`)throw e}return(n||JSON.stringify)(e)}var W={transitional:B,adapter:[`xhr`,`http`,`fetch`],transformRequest:[function transformRequest(e,t){let n=t.getContentType()||``,r=n.indexOf(`application/json`)>-1,i=z.isObject(e);if(i&&z.isHTMLForm(e)&&(e=new FormData(e)),z.isFormData(e))return r?JSON.stringify(formDataToJSON(e)):e;if(z.isArrayBuffer(e)||z.isBuffer(e)||z.isStream(e)||z.isFile(e)||z.isBlob(e)||z.isReadableStream(e))return e;if(z.isArrayBufferView(e))return e.buffer;if(z.isURLSearchParams(e))return t.setContentType(`application/x-www-form-urlencoded;charset=utf-8`,!1),e.toString();let a;if(i){if(n.indexOf(`application/x-www-form-urlencoded`)>-1)return toURLEncodedForm(e,this.formSerializer).toString();if((a=z.isFileList(e))||n.indexOf(`multipart/form-data`)>-1){let t=this.env&&this.env.FormData;return toFormData(a?{"files[]":e}:e,t&&new t,this.formSerializer)}}return i||r?(t.setContentType(`application/json`,!1),stringifySafely(e)):e}],transformResponse:[function transformResponse(e){let t=this.transitional||W.transitional,n=t&&t.forcedJSONParsing,r=this.responseType===`json`;if(z.isResponse(e)||z.isReadableStream(e))return e;if(e&&z.isString(e)&&(n&&!this.responseType||r)){let n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e,this.parseReviver)}catch(e){if(n)throw e.name===`SyntaxError`?AxiosError.from(e,AxiosError.ERR_BAD_RESPONSE,this,null,this.response):e}}return e}],timeout:0,xsrfCookieName:`XSRF-TOKEN`,xsrfHeaderName:`X-XSRF-TOKEN`,maxContentLength:-1,maxBodyLength:-1,env:{FormData:U.classes.FormData,Blob:U.classes.Blob},validateStatus:function validateStatus(e){return e>=200&&e<300},headers:{common:{Accept:`application/json, text/plain, */*`,"Content-Type":void 0}}};z.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`],e=>{W.headers[e]={}});var we=z.toObjectSet([`age`,`authorization`,`content-length`,`content-type`,`etag`,`expires`,`from`,`host`,`if-modified-since`,`if-unmodified-since`,`last-modified`,`location`,`max-forwards`,`proxy-authorization`,`referer`,`retry-after`,`user-agent`]),Te=e(e=>{let t={},n,r,i;return e&&e.split(`
2
+ `).forEach(function parser(e){i=e.indexOf(`:`),n=e.substring(0,i).trim().toLowerCase(),r=e.substring(i+1).trim(),!(!n||t[n]&&we[n])&&(n===`set-cookie`?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+`, `+r:r)}),t},`default`),G=Symbol(`internals`);function normalizeHeader(e){return e&&String(e).trim().toLowerCase()}function normalizeValue(e){return e===!1||e==null?e:z.isArray(e)?e.map(normalizeValue):String(e)}function parseTokens(e){let t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g,r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}var isValidHeaderName=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function matchHeaderValue(e,t,n,r,i){if(z.isFunction(r))return r.call(this,t,n);if(i&&(t=n),z.isString(t)){if(z.isString(r))return t.indexOf(r)!==-1;if(z.isRegExp(r))return r.test(t)}}function formatHeader(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,n)=>t.toUpperCase()+n)}function buildAccessors(e,t){let n=z.toCamelCase(` `+t);[`get`,`set`,`has`].forEach(r=>{Object.defineProperty(e,r+n,{value:function(e,n,i){return this[r].call(this,t,e,n,i)},configurable:!0})})}var AxiosHeaders=class{constructor(e){e&&this.set(e)}set(e,t,n){let r=this;function setHeader(e,t,n){let i=normalizeHeader(t);if(!i)throw Error(`header name must be a non-empty string`);let a=z.findKey(r,i);(!a||r[a]===void 0||n===!0||n===void 0&&r[a]!==!1)&&(r[a||t]=normalizeValue(e))}let setHeaders=(e,t)=>z.forEach(e,(e,n)=>setHeader(e,n,t));if(z.isPlainObject(e)||e instanceof this.constructor)setHeaders(e,t);else if(z.isString(e)&&(e=e.trim())&&!isValidHeaderName(e))setHeaders(Te(e),t);else if(z.isObject(e)&&z.isIterable(e)){let n={},r,i;for(let t of e){if(!z.isArray(t))throw TypeError(`Object iterator must return a key-value pair`);n[i=t[0]]=(r=n[i])?z.isArray(r)?[...r,t[1]]:[r,t[1]]:t[1]}setHeaders(n,t)}else e!=null&&setHeader(t,e,n);return this}get(e,t){if(e=normalizeHeader(e),e){let n=z.findKey(this,e);if(n){let e=this[n];if(!t)return e;if(t===!0)return parseTokens(e);if(z.isFunction(t))return t.call(this,e,n);if(z.isRegExp(t))return t.exec(e);throw TypeError(`parser must be boolean|regexp|function`)}}}has(e,t){if(e=normalizeHeader(e),e){let n=z.findKey(this,e);return!!(n&&this[n]!==void 0&&(!t||matchHeaderValue(this,this[n],n,t)))}return!1}delete(e,t){let n=this,r=!1;function deleteHeader(e){if(e=normalizeHeader(e),e){let i=z.findKey(n,e);i&&(!t||matchHeaderValue(n,n[i],i,t))&&(delete n[i],r=!0)}}return z.isArray(e)?e.forEach(deleteHeader):deleteHeader(e),r}clear(e){let t=Object.keys(this),n=t.length,r=!1;for(;n--;){let i=t[n];(!e||matchHeaderValue(this,this[i],i,e,!0))&&(delete this[i],r=!0)}return r}normalize(e){let t=this,n={};return z.forEach(this,(r,i)=>{let a=z.findKey(n,i);if(a){t[a]=normalizeValue(r),delete t[i];return}let o=e?formatHeader(i):String(i).trim();o!==i&&delete t[i],t[o]=normalizeValue(r),n[o]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){let t=Object.create(null);return z.forEach(this,(n,r)=>{n!=null&&n!==!1&&(t[r]=e&&z.isArray(n)?n.join(`, `):n)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,t])=>e+`: `+t).join(`
3
+ `)}getSetCookie(){return this.get(`set-cookie`)||[]}get[Symbol.toStringTag](){return`AxiosHeaders`}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){let n=new this(e);return t.forEach(e=>n.set(e)),n}static accessor(e){let t=(this[G]=this[G]={accessors:{}}).accessors,n=this.prototype;function defineAccessor(e){let r=normalizeHeader(e);t[r]||(buildAccessors(n,e),t[r]=!0)}return z.isArray(e)?e.forEach(defineAccessor):defineAccessor(e),this}};AxiosHeaders.accessor([`Content-Type`,`Content-Length`,`Accept`,`Accept-Encoding`,`User-Agent`,`Authorization`]),z.reduceDescriptors(AxiosHeaders.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}}),z.freezeMethods(AxiosHeaders);function transformData(e,t){let n=this||W,r=t||n,i=AxiosHeaders.from(r.headers),a=r.data;return z.forEach(e,function transform(e){a=e.call(n,a,i.normalize(),t?t.status:void 0)}),i.normalize(),a}function isCancel(e){return!!(e&&e.__CANCEL__)}function CanceledError(e,t,n){AxiosError.call(this,e??`canceled`,AxiosError.ERR_CANCELED,t,n),this.name=`CanceledError`}z.inherits(CanceledError,AxiosError,{__CANCEL__:!0});function settle(e,t,n){let r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new AxiosError(`Request failed with status code `+n.status,[AxiosError.ERR_BAD_REQUEST,AxiosError.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function parseProtocol(e){let t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||``}function speedometer(e,t){e=e||10;let n=Array(e),r=Array(e),i=0,a=0,o;return t=t===void 0?1e3:t,function push(s){let c=Date.now(),l=r[a];o||(o=c),n[i]=s,r[i]=c;let u=a,d=0;for(;u!==i;)d+=n[u++],u%=e;if(i=(i+1)%e,i===a&&(a=(a+1)%e),c-o<t)return;let f=l&&c-l;return f?Math.round(d*1e3/f):void 0}}function throttle(e,t){let n=0,r=1e3/t,i,a,invoke=(t,r=Date.now())=>{n=r,i=null,a&&(clearTimeout(a),a=null),e(...t)},throttled=(...e)=>{let t=Date.now(),o=t-n;o>=r?invoke(e,t):(i=e,a||(a=setTimeout(()=>{a=null,invoke(i)},r-o)))},flush=()=>i&&invoke(i);return[throttled,flush]}var progressEventReducer=(e,t,n=3)=>{let r=0,i=speedometer(50,250);return throttle(n=>{let a=n.loaded,o=n.lengthComputable?n.total:void 0,s=a-r,c=i(s),l=a<=o;r=a,e({loaded:a,total:o,progress:o?a/o:void 0,bytes:s,rate:c||void 0,estimated:c&&o&&l?(o-a)/c:void 0,event:n,lengthComputable:o!=null,[t?`download`:`upload`]:!0})},n)},progressEventDecorator=(e,t)=>{let n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},asyncDecorator=e=>(...t)=>z.asap(()=>e(...t)),Ee=U.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,U.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(U.origin),U.navigator&&/(msie|trident)/i.test(U.navigator.userAgent)):()=>!0,De=U.hasStandardBrowserEnv?{write(e,t,n,r,i,a,o){if(typeof document>`u`)return;let s=[`${e}=${encodeURIComponent(t)}`];z.isNumber(n)&&s.push(`expires=${new Date(n).toUTCString()}`),z.isString(r)&&s.push(`path=${r}`),z.isString(i)&&s.push(`domain=${i}`),a===!0&&s.push(`secure`),z.isString(o)&&s.push(`SameSite=${o}`),document.cookie=s.join(`; `)},read(e){if(typeof document>`u`)return null;let t=document.cookie.match(RegExp(`(?:^|; )`+e+`=([^;]*)`));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,``,Date.now()-864e5,`/`)}}:{write(){},read(){return null},remove(){}};function isAbsoluteURL(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function combineURLs(e,t){return t?e.replace(/\/?\/$/,``)+`/`+t.replace(/^\/+/,``):e}function buildFullPath(e,t,n){let r=!isAbsoluteURL(t);return e&&(r||n==0)?combineURLs(e,t):t}var headersToObject=e=>e instanceof AxiosHeaders?{...e}:e;function mergeConfig(e,t){t=t||{};let n={};function getMergedValue(e,t,n,r){return z.isPlainObject(e)&&z.isPlainObject(t)?z.merge.call({caseless:r},e,t):z.isPlainObject(t)?z.merge({},t):z.isArray(t)?t.slice():t}function mergeDeepProperties(e,t,n,r){if(!z.isUndefined(t))return getMergedValue(e,t,n,r);if(!z.isUndefined(e))return getMergedValue(void 0,e,n,r)}function valueFromConfig2(e,t){if(!z.isUndefined(t))return getMergedValue(void 0,t)}function defaultToConfig2(e,t){if(!z.isUndefined(t))return getMergedValue(void 0,t);if(!z.isUndefined(e))return getMergedValue(void 0,e)}function mergeDirectKeys(n,r,i){if(i in t)return getMergedValue(n,r);if(i in e)return getMergedValue(void 0,n)}let r={url:valueFromConfig2,method:valueFromConfig2,data:valueFromConfig2,baseURL:defaultToConfig2,transformRequest:defaultToConfig2,transformResponse:defaultToConfig2,paramsSerializer:defaultToConfig2,timeout:defaultToConfig2,timeoutMessage:defaultToConfig2,withCredentials:defaultToConfig2,withXSRFToken:defaultToConfig2,adapter:defaultToConfig2,responseType:defaultToConfig2,xsrfCookieName:defaultToConfig2,xsrfHeaderName:defaultToConfig2,onUploadProgress:defaultToConfig2,onDownloadProgress:defaultToConfig2,decompress:defaultToConfig2,maxContentLength:defaultToConfig2,maxBodyLength:defaultToConfig2,beforeRedirect:defaultToConfig2,transport:defaultToConfig2,httpAgent:defaultToConfig2,httpsAgent:defaultToConfig2,cancelToken:defaultToConfig2,socketPath:defaultToConfig2,responseEncoding:defaultToConfig2,validateStatus:mergeDirectKeys,headers:(e,t,n)=>mergeDeepProperties(headersToObject(e),headersToObject(t),n,!0)};return z.forEach(Object.keys({...e,...t}),function computeConfigValue(i){let a=r[i]||mergeDeepProperties,o=a(e[i],t[i],i);z.isUndefined(o)&&a!==mergeDirectKeys||(n[i]=o)}),n}var K=e(e=>{let t=mergeConfig({},e),{data:n,withXSRFToken:r,xsrfHeaderName:i,xsrfCookieName:a,headers:o,auth:s}=t;if(t.headers=o=AxiosHeaders.from(o),t.url=buildURL(buildFullPath(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),s&&o.set(`Authorization`,`Basic `+btoa((s.username||``)+`:`+(s.password?unescape(encodeURIComponent(s.password)):``))),z.isFormData(n)){if(U.hasStandardBrowserEnv||U.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if(z.isFunction(n.getHeaders)){let e=n.getHeaders(),t=[`content-type`,`content-length`];Object.entries(e).forEach(([e,n])=>{t.includes(e.toLowerCase())&&o.set(e,n)})}}if(U.hasStandardBrowserEnv&&(r&&z.isFunction(r)&&(r=r(t)),r||r!==!1&&Ee(t.url))){let e=i&&a&&De.read(a);e&&o.set(i,e)}return t},`default`),Oe=typeof XMLHttpRequest<`u`&&function(e){return new Promise(function dispatchXhrRequest(t,n){let r=K(e),i=r.data,a=AxiosHeaders.from(r.headers).normalize(),{responseType:o,onUploadProgress:s,onDownloadProgress:c}=r,onCanceled,l,u,d,f;function done(){d&&d(),f&&f(),r.cancelToken&&r.cancelToken.unsubscribe(onCanceled),r.signal&&r.signal.removeEventListener(`abort`,onCanceled)}let p=new XMLHttpRequest;p.open(r.method.toUpperCase(),r.url,!0),p.timeout=r.timeout;function onloadend(){if(!p)return;let r=AxiosHeaders.from(`getAllResponseHeaders`in p&&p.getAllResponseHeaders());settle(function _resolve(e){t(e),done()},function _reject(e){n(e),done()},{data:!o||o===`text`||o===`json`?p.responseText:p.response,status:p.status,statusText:p.statusText,headers:r,config:e,request:p}),p=null}`onloadend`in p?p.onloadend=onloadend:p.onreadystatechange=function handleLoad(){!p||p.readyState!==4||p.status===0&&!(p.responseURL&&p.responseURL.indexOf(`file:`)===0)||setTimeout(onloadend)},p.onabort=function handleAbort(){p&&(n(new AxiosError(`Request aborted`,AxiosError.ECONNABORTED,e,p)),p=null)},p.onerror=function handleError(t){let r=new AxiosError(t&&t.message?t.message:`Network Error`,AxiosError.ERR_NETWORK,e,p);r.event=t||null,n(r),p=null},p.ontimeout=function handleTimeout(){let t=r.timeout?`timeout of `+r.timeout+`ms exceeded`:`timeout exceeded`,i=r.transitional||B;r.timeoutErrorMessage&&(t=r.timeoutErrorMessage),n(new AxiosError(t,i.clarifyTimeoutError?AxiosError.ETIMEDOUT:AxiosError.ECONNABORTED,e,p)),p=null},i===void 0&&a.setContentType(null),`setRequestHeader`in p&&z.forEach(a.toJSON(),function setRequestHeader(e,t){p.setRequestHeader(t,e)}),z.isUndefined(r.withCredentials)||(p.withCredentials=!!r.withCredentials),o&&o!==`json`&&(p.responseType=r.responseType),c&&([u,f]=progressEventReducer(c,!0),p.addEventListener(`progress`,u)),s&&p.upload&&([l,d]=progressEventReducer(s),p.upload.addEventListener(`progress`,l),p.upload.addEventListener(`loadend`,d)),(r.cancelToken||r.signal)&&(onCanceled=t=>{p&&(n(!t||t.type?new CanceledError(null,e,p):t),p.abort(),p=null)},r.cancelToken&&r.cancelToken.subscribe(onCanceled),r.signal&&(r.signal.aborted?onCanceled():r.signal.addEventListener(`abort`,onCanceled)));let m=parseProtocol(r.url);if(m&&U.protocols.indexOf(m)===-1){n(new AxiosError(`Unsupported protocol `+m+`:`,AxiosError.ERR_BAD_REQUEST,e));return}p.send(i||null)})},composeSignals=(e,t)=>{let{length:n}=e=e?e.filter(Boolean):[];if(t||n){let n=new AbortController,r,onabort=function(e){if(!r){r=!0,unsubscribe();let t=e instanceof Error?e:this.reason;n.abort(t instanceof AxiosError?t:new CanceledError(t instanceof Error?t.message:t))}},i=t&&setTimeout(()=>{i=null,onabort(new AxiosError(`timeout ${t} of ms exceeded`,AxiosError.ETIMEDOUT))},t),unsubscribe=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(e=>{e.unsubscribe?e.unsubscribe(onabort):e.removeEventListener(`abort`,onabort)}),e=null)};e.forEach(e=>e.addEventListener(`abort`,onabort));let{signal:a}=n;return a.unsubscribe=()=>z.asap(unsubscribe),a}},streamChunk=function*(e,t){let n=e.byteLength;if(!t||n<t){yield e;return}let r=0,i;for(;r<n;)i=r+t,yield e.slice(r,i),r=i},readBytes=async function*(e,t){for await(let n of readStream(e))yield*streamChunk(n,t)},readStream=async function*(e){if(e[Symbol.asyncIterator]){yield*e;return}let t=e.getReader();try{for(;;){let{done:e,value:n}=await t.read();if(e)break;yield n}}finally{await t.cancel()}},trackStream=(e,t,n,r)=>{let i=readBytes(e,t),a=0,o,_onFinish=e=>{o||(o=!0,r&&r(e))};return new ReadableStream({async pull(e){try{let{done:t,value:r}=await i.next();if(t){_onFinish(),e.close();return}let o=r.byteLength;n&&n(a+=o),e.enqueue(new Uint8Array(r))}catch(e){throw _onFinish(e),e}},cancel(e){return _onFinish(e),i.return()}},{highWaterMark:2})},ke=64*1024,{isFunction:q}=z,Ae=(({Request:e,Response:t})=>({Request:e,Response:t}))(z.global),{ReadableStream:je,TextEncoder:Me}=z.global,test=(e,...t)=>{try{return!!e(...t)}catch{return!1}},factory=e=>{e=z.merge.call({skipUndefined:!0},Ae,e);let{fetch:t,Request:n,Response:r}=e,i=t?q(t):typeof fetch==`function`,a=q(n),o=q(r);if(!i)return!1;let s=i&&q(je),c=i&&(typeof Me==`function`?(e=>t=>e.encode(t))(new Me):async e=>new Uint8Array(await new n(e).arrayBuffer())),l=a&&s&&test(()=>{let e=!1,t=new n(U.origin,{body:new je,method:`POST`,get duplex(){return e=!0,`half`}}).headers.has(`Content-Type`);return e&&!t}),u=o&&s&&test(()=>z.isReadableStream(new r(``).body)),d={stream:u&&(e=>e.body)};i&&[`text`,`arrayBuffer`,`blob`,`formData`,`stream`].forEach(e=>{!d[e]&&(d[e]=(t,n)=>{let r=t&&t[e];if(r)return r.call(t);throw new AxiosError(`Response type '${e}' is not supported`,AxiosError.ERR_NOT_SUPPORT,n)})});let getBodyLength=async e=>{if(e==null)return 0;if(z.isBlob(e))return e.size;if(z.isSpecCompliantForm(e))return(await new n(U.origin,{method:`POST`,body:e}).arrayBuffer()).byteLength;if(z.isArrayBufferView(e)||z.isArrayBuffer(e))return e.byteLength;if(z.isURLSearchParams(e)&&(e+=``),z.isString(e))return(await c(e)).byteLength},resolveBodyLength=async(e,t)=>z.toFiniteNumber(e.getContentLength())??getBodyLength(t);return async e=>{let{url:i,method:o,data:s,signal:c,cancelToken:f,timeout:p,onDownloadProgress:m,onUploadProgress:h,responseType:g,headers:_,withCredentials:v=`same-origin`,fetchOptions:y}=K(e),b=t||fetch;g=g?(g+``).toLowerCase():`text`;let x=composeSignals([c,f&&f.toAbortSignal()],p),S=null,C=x&&x.unsubscribe&&(()=>{x.unsubscribe()}),w;try{if(h&&l&&o!==`get`&&o!==`head`&&(w=await resolveBodyLength(_,s))!==0){let e=new n(i,{method:`POST`,body:s,duplex:`half`}),t;if(z.isFormData(s)&&(t=e.headers.get(`content-type`))&&_.setContentType(t),e.body){let[t,n]=progressEventDecorator(w,progressEventReducer(asyncDecorator(h)));s=trackStream(e.body,ke,t,n)}}z.isString(v)||(v=v?`include`:`omit`);let t=a&&`credentials`in n.prototype,c={...y,signal:x,method:o.toUpperCase(),headers:_.normalize().toJSON(),body:s,duplex:`half`,credentials:t?v:void 0};S=a&&new n(i,c);let f=await(a?b(S,y):b(i,c)),p=u&&(g===`stream`||g===`response`);if(u&&(m||p&&C)){let e={};[`status`,`statusText`,`headers`].forEach(t=>{e[t]=f[t]});let t=z.toFiniteNumber(f.headers.get(`content-length`)),[n,i]=m&&progressEventDecorator(t,progressEventReducer(asyncDecorator(m),!0))||[];f=new r(trackStream(f.body,ke,n,()=>{i&&i(),C&&C()}),e)}g=g||`text`;let T=await d[z.findKey(d,g)||`text`](f,e);return!p&&C&&C(),await new Promise((t,n)=>{settle(t,n,{data:T,headers:AxiosHeaders.from(f.headers),status:f.status,statusText:f.statusText,config:e,request:S})})}catch(t){throw C&&C(),t&&t.name===`TypeError`&&/Load failed|fetch/i.test(t.message)?Object.assign(new AxiosError(`Network Error`,AxiosError.ERR_NETWORK,e,S),{cause:t.cause||t}):AxiosError.from(t,t&&t.code,e,S)}}},Ne=new Map,getFetch=e=>{let t=e&&e.env||{},{fetch:n,Request:r,Response:i}=t,a=[r,i,n],o=a.length,s,c,l=Ne;for(;o--;)s=a[o],c=l.get(s),c===void 0&&l.set(s,c=o?new Map:factory(t)),l=c;return c};getFetch();var J={http:null,xhr:Oe,fetch:{get:getFetch}};z.forEach(J,(e,t)=>{if(e){try{Object.defineProperty(e,`name`,{value:t})}catch{}Object.defineProperty(e,`adapterName`,{value:t})}});var renderReason=e=>`- ${e}`,isResolvedHandle=e=>z.isFunction(e)||e===null||e===!1;function getAdapter(e,t){e=z.isArray(e)?e:[e];let{length:n}=e,r,i,a={};for(let o=0;o<n;o++){r=e[o];let n;if(i=r,!isResolvedHandle(r)&&(i=J[(n=String(r)).toLowerCase()],i===void 0))throw new AxiosError(`Unknown adapter '${n}'`);if(i&&(z.isFunction(i)||(i=i.get(t))))break;a[n||`#`+o]=i}if(!i){let e=Object.entries(a).map(([e,t])=>`adapter ${e} `+(t===!1?`is not supported by the environment`:`is not available in the build`));throw new AxiosError(`There is no suitable adapter to dispatch the request `+(n?e.length>1?`since :
4
+ `+e.map(renderReason).join(`
5
+ `):` `+renderReason(e[0]):`as no adapter specified`),`ERR_NOT_SUPPORT`)}return i}var Pe={getAdapter,adapters:J};function throwIfCancellationRequested(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new CanceledError(null,e)}function dispatchRequest(e){return throwIfCancellationRequested(e),e.headers=AxiosHeaders.from(e.headers),e.data=transformData.call(e,e.transformRequest),[`post`,`put`,`patch`].indexOf(e.method)!==-1&&e.headers.setContentType(`application/x-www-form-urlencoded`,!1),Pe.getAdapter(e.adapter||W.adapter,e)(e).then(function onAdapterResolution(t){return throwIfCancellationRequested(e),t.data=transformData.call(e,e.transformResponse,t),t.headers=AxiosHeaders.from(t.headers),t},function onAdapterRejection(t){return isCancel(t)||(throwIfCancellationRequested(e),t&&t.response&&(t.response.data=transformData.call(e,e.transformResponse,t.response),t.response.headers=AxiosHeaders.from(t.response.headers))),Promise.reject(t)})}var Fe=`1.13.2`,Y={};[`object`,`boolean`,`number`,`function`,`string`,`symbol`].forEach((e,t)=>{Y[e]=function validator(n){return typeof n===e||`a`+(t<1?`n `:` `)+e}});var Ie={};Y.transitional=function transitional(e,t,n){function formatMessage(e,t){return`[Axios v`+Fe+`] Transitional option '`+e+`'`+t+(n?`. `+n:``)}return(n,r,i)=>{if(e===!1)throw new AxiosError(formatMessage(r,` has been removed`+(t?` in `+t:``)),AxiosError.ERR_DEPRECATED);return t&&!Ie[r]&&(Ie[r]=!0,console.warn(formatMessage(r,` has been deprecated since v`+t+` and will be removed in the near future`))),e?e(n,r,i):!0}},Y.spelling=function spelling(e){return(t,n)=>(console.warn(`${n} is likely a misspelling of ${e}`),!0)};function assertOptions(e,t,n){if(typeof e!=`object`)throw new AxiosError(`options must be an object`,AxiosError.ERR_BAD_OPTION_VALUE);let r=Object.keys(e),i=r.length;for(;i-- >0;){let a=r[i],o=t[a];if(o){let t=e[a],n=t===void 0||o(t,a,e);if(n!==!0)throw new AxiosError(`option `+a+` must be `+n,AxiosError.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new AxiosError(`Unknown option `+a,AxiosError.ERR_BAD_OPTION)}}var X={assertOptions,validators:Y},Z=X.validators,Axios=class{constructor(e){this.defaults=e||{},this.interceptors={request:new InterceptorManager,response:new InterceptorManager}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=Error();let n=t.stack?t.stack.replace(/^.+\n/,``):``;try{e.stack?n&&!String(e.stack).endsWith(n.replace(/^.+\n.+\n/,``))&&(e.stack+=`
6
+ `+n):e.stack=n}catch{}}throw e}}_request(e,t){typeof e==`string`?(t=t||{},t.url=e):t=e||{},t=mergeConfig(this.defaults,t);let{transitional:n,paramsSerializer:r,headers:i}=t;n!==void 0&&X.assertOptions(n,{silentJSONParsing:Z.transitional(Z.boolean),forcedJSONParsing:Z.transitional(Z.boolean),clarifyTimeoutError:Z.transitional(Z.boolean)},!1),r!=null&&(z.isFunction(r)?t.paramsSerializer={serialize:r}:X.assertOptions(r,{encode:Z.function,serialize:Z.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls===void 0?t.allowAbsoluteUrls=!0:t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls),X.assertOptions(t,{baseUrl:Z.spelling(`baseURL`),withXsrfToken:Z.spelling(`withXSRFToken`)},!0),t.method=(t.method||this.defaults.method||`get`).toLowerCase();let a=i&&z.merge(i.common,i[t.method]);i&&z.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`,`common`],e=>{delete i[e]}),t.headers=AxiosHeaders.concat(a,i);let o=[],s=!0;this.interceptors.request.forEach(function unshiftRequestInterceptors(e){typeof e.runWhen==`function`&&e.runWhen(t)===!1||(s=s&&e.synchronous,o.unshift(e.fulfilled,e.rejected))});let c=[];this.interceptors.response.forEach(function pushResponseInterceptors(e){c.push(e.fulfilled,e.rejected)});let l,u=0,d;if(!s){let e=[dispatchRequest.bind(this),void 0];for(e.unshift(...o),e.push(...c),d=e.length,l=Promise.resolve(t);u<d;)l=l.then(e[u++],e[u++]);return l}d=o.length;let f=t;for(;u<d;){let e=o[u++],t=o[u++];try{f=e(f)}catch(e){t.call(this,e);break}}try{l=dispatchRequest.call(this,f)}catch(e){return Promise.reject(e)}for(u=0,d=c.length;u<d;)l=l.then(c[u++],c[u++]);return l}getUri(e){return e=mergeConfig(this.defaults,e),buildURL(buildFullPath(e.baseURL,e.url,e.allowAbsoluteUrls),e.params,e.paramsSerializer)}};z.forEach([`delete`,`get`,`head`,`options`],function forEachMethodNoData(e){Axios.prototype[e]=function(t,n){return this.request(mergeConfig(n||{},{method:e,url:t,data:(n||{}).data}))}}),z.forEach([`post`,`put`,`patch`],function forEachMethodWithData(e){function generateHTTPMethod(t){return function httpMethod(n,r,i){return this.request(mergeConfig(i||{},{method:e,headers:t?{"Content-Type":`multipart/form-data`}:{},url:n,data:r}))}}Axios.prototype[e]=generateHTTPMethod(),Axios.prototype[e+`Form`]=generateHTTPMethod(!0)});var Le=class CancelToken{constructor(e){if(typeof e!=`function`)throw TypeError(`executor must be a function.`);let t;this.promise=new Promise(function promiseExecutor(e){t=e});let n=this;this.promise.then(e=>{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t,r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function reject(){n.unsubscribe(t)},r},e(function cancel(e,r,i){n.reason||(n.reason=new CanceledError(e,r,i),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,abort=t=>{e.abort(t)};return this.subscribe(abort),e.signal.unsubscribe=()=>this.unsubscribe(abort),e.signal}static source(){let e;return{token:new CancelToken(function executor(t){e=t}),cancel:e}}};function spread(e){return function wrap(t){return e.apply(null,t)}}function isAxiosError(e){return z.isObject(e)&&e.isAxiosError===!0}var Q={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Q).forEach(([e,t])=>{Q[t]=e});function createInstance(e){let t=new Axios(e),n=bind(Axios.prototype.request,t);return z.extend(n,Axios.prototype,t,{allOwnKeys:!0}),z.extend(n,t,null,{allOwnKeys:!0}),n.create=function create(t){return createInstance(mergeConfig(e,t))},n}var $=createInstance(W);$.Axios=Axios,$.CanceledError=CanceledError,$.CancelToken=Le,$.isCancel=isCancel,$.VERSION=Fe,$.toFormData=toFormData,$.AxiosError=AxiosError,$.Cancel=$.CanceledError,$.all=function all(e){return Promise.all(e)},$.spread=spread,$.isAxiosError=isAxiosError,$.mergeConfig=mergeConfig,$.AxiosHeaders=AxiosHeaders,$.formToJSON=e=>formDataToJSON(z.isHTMLForm(e)?new FormData(e):e),$.getAdapter=Pe.getAdapter,$.HttpStatusCode=Q,$.default=$;var Re=l({name:`OrchestrationDashboard`,props:{courseId:{type:String,required:!0},isAdmin:{type:Boolean,default:!1}},data(){return{loading:!1,updating:!1,error:null,weights:[],lastUpdate:null,detailsDialog:!1,selectedStrategy:null,selectedStrategyState:null,scatterData:null}},async created(){this.isAdmin&&await this.loadWeights()},methods:{async loadWeights(){this.loading=!0,this.error=null;try{this.weights=(await $.get(`/orchestration/${this.courseId}/weights`)).data.weights}catch(e){this.error=`Failed to load weights: ${e instanceof Error?e.message:String(e)}`}finally{this.loading=!1}},async triggerUpdate(){this.updating=!0,this.error=null;try{let e=await $.post(`/orchestration/${this.courseId}/update`);this.lastUpdate=new Date().toISOString(),await this.loadWeights();let{strategiesUpdated:t,outcomesProcessed:n}=e.data;alert(`Update complete!\n${t} strategies updated\n${n} outcomes processed`)}catch(e){this.error=`Failed to trigger update: ${e&&typeof e==`object`&&`response`in e?e.response?.data?.error:e instanceof Error?e.message:String(e)}`}finally{this.updating=!1}},async showStrategyDetails(e){this.selectedStrategy=this.weights.find(t=>t.strategyId===e)||null,this.selectedStrategyState=null,this.scatterData=null,this.detailsDialog=!0;try{this.selectedStrategyState=(await $.get(`/orchestration/${this.courseId}/strategy/${e}/history`)).data,this.scatterData=(await $.get(`/orchestration/${this.courseId}/strategy/${e}/scatter`)).data}catch(e){this.error=`Failed to load strategy details: ${e instanceof Error?e.message:String(e)}`}},getWeightColor(e){return e<.5?`red`:e<.8?`orange`:e<1.2?`green`:e<1.5?`blue`:`purple`},getConfidenceColor(e){return e<.3?`red`:e<.6?`orange`:e<.8?`blue`:`green`},getGradientColor(e){return e?e>.01?`text-green`:e<-.01?`text-red`:`text-grey`:``}}}),ze={class:`mb-4`},Be={key:0,class:`ml-3 text-caption`},Ve={class:`text-caption`},He={key:1,class:`text-caption text-medium-emphasis`},Ue={key:1,class:`text-caption text-medium-emphasis`},We={key:0,class:`text-caption`},Ge={key:1,class:`text-caption text-medium-emphasis`},Ke={class:`text-h6`},qe={class:`text-h6`},Je={class:`text-h6`},Ye={class:`text-body-2`},Xe={class:`text-body-2`},Ze={class:`text-body-2`},Qe={class:`text-caption`},$e={key:0,class:`mb-2`},et={class:`text-caption`},tt={class:`text-caption`},nt={key:1,class:`text-caption text-center mt-2`};function _sfc_render$2(e,t,s,l,h,v){let y=o(`v-icon`),b=o(`v-chip`),x=o(`v-expansion-panel-title`),S=o(`v-btn`),C=o(`v-card-title`),w=o(`v-progress-linear`),T=o(`v-table`),E=o(`v-card-text`),D=o(`v-card`),O=o(`v-col`),k=o(`v-row`),A=o(`v-spacer`),j=o(`v-card-actions`),M=o(`v-dialog`),N=o(`v-alert`),P=o(`v-expansion-panel-text`),F=o(`v-expansion-panel`),I=o(`v-expansion-panels`);return e.isAdmin?(i(),g(I,{key:0,class:`my-3`},{default:n(()=>[r(F,null,{default:n(()=>[r(x,null,{default:n(()=>[r(y,{start:``},{default:n(()=>t[2]||(t[2]=[c(`mdi-chart-line`)])),_:1}),t[4]||(t[4]=c(` Orchestration Dashboard `)),e.loading?(i(),g(b,{key:0,size:`small`,class:`ml-2`},{default:n(()=>t[3]||(t[3]=[c(`Loading...`)])),_:1})):_(``,!0)]),_:1}),r(P,null,{default:n(()=>[r(D,{flat:``},{default:n(()=>[r(E,null,{default:n(()=>[f(`div`,ze,[r(S,{color:`primary`,loading:e.updating,disabled:e.updating,onClick:e.triggerUpdate},{default:n(()=>[r(y,{start:``},{default:n(()=>t[5]||(t[5]=[c(`mdi-refresh`)])),_:1}),t[6]||(t[6]=c(` Trigger Period Update `))]),_:1},8,[`loading`,`disabled`,`onClick`]),e.lastUpdate?(i(),p(`span`,Be,` Last update: `+u(new Date(e.lastUpdate).toLocaleString()),1)):_(``,!0)]),e.weights.length>0?(i(),g(D,{key:0,class:`mb-4`},{default:n(()=>[r(C,null,{default:n(()=>t[7]||(t[7]=[c(`Current Strategy Weights`)])),_:1}),r(E,null,{default:n(()=>[r(T,{density:`compact`},{default:n(()=>[t[10]||(t[10]=f(`thead`,null,[f(`tr`,null,[f(`th`,null,`Strategy`),f(`th`,null,`Implementation`),f(`th`,null,`Weight`),f(`th`,null,`Confidence`),f(`th`,null,`Samples`),f(`th`,null,`Static`),f(`th`,null,`Actions`)])],-1)),f(`tbody`,null,[(i(!0),p(m,null,d(e.weights,r=>(i(),p(`tr`,{key:r.strategyId},[f(`td`,null,u(r.strategyName),1),f(`td`,null,[f(`code`,Ve,u(r.implementingClass),1)]),f(`td`,null,[r.learnable?(i(),g(b,{key:0,size:`small`,color:e.getWeightColor(r.learnable.weight)},{default:n(()=>[c(u(r.learnable.weight.toFixed(2)),1)]),_:2},1032,[`color`])):(i(),p(`span`,He,`—`))]),f(`td`,null,[r.learnable?(i(),g(w,{key:0,"model-value":r.learnable.confidence*100,height:`8`,color:e.getConfidenceColor(r.learnable.confidence)},null,8,[`model-value`,`color`])):(i(),p(`span`,Ue,`—`))]),f(`td`,null,[r.learnable?(i(),p(`span`,We,u(r.learnable.sampleSize),1)):(i(),p(`span`,Ge,`—`))]),f(`td`,null,[r.staticWeight?(i(),g(y,{key:0,size:`small`,color:`warning`},{default:n(()=>t[8]||(t[8]=[c(` mdi-lock `)])),_:1})):_(``,!0)]),f(`td`,null,[r.learnable?(i(),g(S,{key:0,size:`x-small`,variant:`text`,onClick:t=>e.showStrategyDetails(r.strategyId)},{default:n(()=>t[9]||(t[9]=[c(` Details `)])),_:2},1032,[`onClick`])):_(``,!0)])]))),128))])]),_:1})]),_:1})]),_:1})):_(``,!0),r(M,{modelValue:e.detailsDialog,"onUpdate:modelValue":t[1]||(t[1]=t=>e.detailsDialog=t),"max-width":`1000`},{default:n(()=>[e.selectedStrategy?(i(),g(D,{key:0},{default:n(()=>[r(C,null,{default:n(()=>[c(u(e.selectedStrategy.strategyName)+` `,1),r(b,{size:`small`,class:`ml-2`},{default:n(()=>[c(u(e.selectedStrategy.strategyId),1)]),_:1})]),_:1}),r(E,null,{default:n(()=>[r(D,{class:`mb-4`,variant:`outlined`},{default:n(()=>[r(C,{class:`text-subtitle-1`},{default:n(()=>t[11]||(t[11]=[c(`Current State`)])),_:1}),r(E,null,{default:n(()=>[r(k,null,{default:n(()=>[r(O,{cols:`3`},{default:n(()=>[t[12]||(t[12]=f(`div`,{class:`text-caption text-medium-emphasis`},`Peak Weight`,-1)),f(`div`,Ke,u(e.selectedStrategyState?.currentWeight?.weight.toFixed(3)||`—`),1)]),_:1}),r(O,{cols:`3`},{default:n(()=>[t[13]||(t[13]=f(`div`,{class:`text-caption text-medium-emphasis`},`Confidence`,-1)),f(`div`,qe,u((e.selectedStrategyState?.currentWeight?.confidence*100).toFixed(1)||`—`)+`%`,1)]),_:1}),r(O,{cols:`3`},{default:n(()=>[t[14]||(t[14]=f(`div`,{class:`text-caption text-medium-emphasis`},`Samples`,-1)),f(`div`,Je,u(e.selectedStrategyState?.currentWeight?.sampleSize||0),1)]),_:1}),r(O,{cols:`3`},{default:n(()=>[t[15]||(t[15]=f(`div`,{class:`text-caption text-medium-emphasis`},`Gradient`,-1)),f(`div`,{class:a([`text-h6`,e.getGradientColor(e.selectedStrategyState?.regression?.gradient)])},u(e.selectedStrategyState?.regression?.gradient.toFixed(4)||`—`),3)]),_:1})]),_:1}),e.selectedStrategyState?.regression?(i(),g(k,{key:0},{default:n(()=>[r(O,{cols:`4`},{default:n(()=>[t[16]||(t[16]=f(`div`,{class:`text-caption text-medium-emphasis`},`R²`,-1)),f(`div`,Ye,u(e.selectedStrategyState.regression.rSquared.toFixed(3)),1)]),_:1}),r(O,{cols:`4`},{default:n(()=>[t[17]||(t[17]=f(`div`,{class:`text-caption text-medium-emphasis`},`Intercept`,-1)),f(`div`,Xe,u(e.selectedStrategyState.regression.intercept.toFixed(3)),1)]),_:1}),r(O,{cols:`4`},{default:n(()=>[t[18]||(t[18]=f(`div`,{class:`text-caption text-medium-emphasis`},`Last Computed`,-1)),f(`div`,Ze,u(new Date(e.selectedStrategyState.regression.computedAt).toLocaleString()),1)]),_:1})]),_:1})):_(``,!0)]),_:1})]),_:1}),e.selectedStrategyState?.history?.length?(i(),g(D,{key:0,class:`mb-4`,variant:`outlined`},{default:n(()=>[r(C,{class:`text-subtitle-1`},{default:n(()=>t[19]||(t[19]=[c(`Weight Trajectory (last 10)`)])),_:1}),r(E,null,{default:n(()=>[r(T,{density:`compact`},{default:n(()=>[t[20]||(t[20]=f(`thead`,null,[f(`tr`,null,[f(`th`,null,`Timestamp`),f(`th`,null,`Weight`),f(`th`,null,`Confidence`),f(`th`,null,`Gradient`)])],-1)),f(`tbody`,null,[(i(!0),p(m,null,d(e.selectedStrategyState.history.slice(-10).reverse(),(t,o)=>(i(),p(`tr`,{key:o},[f(`td`,Qe,u(new Date(t.timestamp).toLocaleString()),1),f(`td`,null,[r(b,{size:`x-small`,color:e.getWeightColor(t.weight)},{default:n(()=>[c(u(t.weight.toFixed(3)),1)]),_:2},1032,[`color`])]),f(`td`,null,[r(w,{"model-value":t.confidence*100,height:`6`,color:e.getConfidenceColor(t.confidence)},null,8,[`model-value`,`color`])]),f(`td`,{class:a(e.getGradientColor(t.gradient))},u(t.gradient.toFixed(4)),3)]))),128))])]),_:1})]),_:1})]),_:1})):_(``,!0),e.scatterData?.data?.length?(i(),g(D,{key:1,variant:`outlined`},{default:n(()=>[r(C,{class:`text-subtitle-1`},{default:n(()=>[c(` Recent Observations (`+u(e.scatterData.observations)+`) `,1),r(b,{size:`small`,class:`ml-2`},{default:n(()=>t[21]||(t[21]=[c(`Last 7 days`)])),_:1})]),_:1}),r(E,null,{default:n(()=>[e.scatterData.regression?(i(),p(`div`,$e,[t[22]||(t[22]=f(`strong`,null,`Regression:`,-1)),c(` outcome = `+u(e.scatterData.regression.gradient.toFixed(4))+` × deviation + `+u(e.scatterData.regression.intercept.toFixed(4))+` (R² = `+u(e.scatterData.regression.rSquared.toFixed(3))+`) `,1)])):_(``,!0),r(T,{density:`compact`},{default:n(()=>[t[23]||(t[23]=f(`thead`,null,[f(`tr`,null,[f(`th`,null,`User`),f(`th`,null,`Deviation`),f(`th`,null,`Outcome`),f(`th`,null,`Period End`)])],-1)),f(`tbody`,null,[(i(!0),p(m,null,d(e.scatterData.data.slice(0,20),(e,t)=>(i(),p(`tr`,{key:t},[f(`td`,et,u(e.userId.substring(0,8))+`...`,1),f(`td`,null,[r(b,{size:`x-small`,color:e.deviation>0?`blue`:`orange`},{default:n(()=>[c(u(e.deviation.toFixed(3)),1)]),_:2},1032,[`color`])]),f(`td`,null,[r(b,{size:`x-small`,color:e.outcome>.7?`green`:`red`},{default:n(()=>[c(u(e.outcome.toFixed(3)),1)]),_:2},1032,[`color`])]),f(`td`,tt,u(new Date(e.periodEnd).toLocaleString()),1)]))),128))])]),_:1}),e.scatterData.data.length>20?(i(),p(`div`,nt,` Showing 20 of `+u(e.scatterData.data.length)+` observations `,1)):_(``,!0)]),_:1})]),_:1})):_(``,!0)]),_:1}),r(j,null,{default:n(()=>[r(A),r(S,{onClick:t[0]||(t[0]=t=>e.detailsDialog=!1)},{default:n(()=>t[24]||(t[24]=[c(`Close`)])),_:1})]),_:1})]),_:1})):_(``,!0)]),_:1},8,[`modelValue`]),e.error?(i(),g(N,{key:1,type:`error`,class:`mt-4`},{default:n(()=>[c(u(e.error),1)]),_:1})):_(``,!0)]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})):_(``,!0)}e(_sfc_render$2,`_sfc_render`);var rt=l({name:`CourseInformationWrapper`,components:{CourseInformation:v,MidiConfig:w,UserTagPreferences:b,OrchestrationDashboard:S(Re,[[`render`,_sfc_render$2],[`__scopeId`,`data-v-b32c2c08`]])},props:{courseId:{type:String,required:!0}},data(){return{courseConfig:{},user:null,editMode:`full`,userIsRegistered:!1}},computed:{isPianoCourse(){return this.courseConfig.name?.toLowerCase().includes(`piano`)??!1},isAdmin(){return this.user?.getUsername()===`admin`}},async created(){let e=x();if(this.courseConfig=await e.getCourseDB(this.courseId).getCourseConfig(),this.user=await y(),this.user){let e=await this.user.getCourseRegistrationsDoc();this.userIsRegistered=this.user.getUsername()===`admin`||e.courses.some(e=>e.courseID===this.courseId&&(e.status===`active`||e.status===void 0))}this.editMode=e.isReadOnly()?`readonly`:`full`},methods:{viewLookup(e){return C.getView(e)}}}),it={class:`text-h4 mb-2`},at={key:0},ot={key:1};function _sfc_render$1(e,t,a,s,l,d){let m=o(`router-link`),v=o(`v-btn`),y=o(`v-icon`),b=o(`v-chip`),x=o(`midi-config`),S=o(`orchestration-dashboard`),C=o(`v-expansion-panel-title`),w=o(`user-tag-preferences`),T=o(`v-expansion-panel-text`),E=o(`v-expansion-panel`),D=o(`v-expansion-panels`),O=o(`course-information`);return i(),p(`div`,null,[r(O,{"course-id":e.courseId,"view-lookup-function":e.viewLookup,"edit-mode":e.editMode,"user-is-registered":e.userIsRegistered},{header:n(({courseConfig:e})=>[f(`h1`,it,[r(m,{to:`/q`},{default:n(()=>t[0]||(t[0]=[c(`Quilts`)])),_:1}),c(` / `+u(e.name),1)])]),actions:n(({userIsRegistered:e,courseId:a,editMode:o,register:s,drop:l})=>[r(h,{name:`component-fade`,mode:`out-in`},{default:n(()=>[e?(i(),p(`div`,at,[r(m,{to:`/study/${a}`,class:`me-2`},{default:n(()=>[r(v,{color:`success`,"data-cy":`focused-study-session-btn`},{default:n(()=>t[1]||(t[1]=[c(`Start a study session *`)])),_:1})]),_:2},1032,[`to`]),o===`full`?(i(),g(m,{key:0,to:`/edit/${a}`,class:`me-2`},{default:n(()=>[r(v,{"data-cy":`add-content-btn`,color:`indigo-lighten-1`},{default:n(()=>[r(y,{start:``},{default:n(()=>t[2]||(t[2]=[c(`mdi-plus`)])),_:1}),t[3]||(t[3]=c(` Add content `))]),_:1})]),_:2},1032,[`to`])):_(``,!0),o===`full`?(i(),g(m,{key:1,to:`/courses/${a}/elo`,class:`me-2`},{default:n(()=>[r(v,{color:`green-darken-2`,title:`Rank course content for difficulty`},{default:n(()=>[r(y,{start:``},{default:n(()=>t[4]||(t[4]=[c(`mdi-format-list-numbered`)])),_:1}),t[5]||(t[5]=c(` Arrange `))]),_:1})]),_:2},1032,[`to`])):_(``,!0),o===`full`?(i(),g(v,{key:2,color:`error`,size:`small`,variant:`outlined`,onClick:l},{default:n(()=>t[6]||(t[6]=[c(` Drop this course `)])),_:2},1032,[`onClick`])):_(``,!0)])):(i(),p(`div`,ot,[r(v,{"data-cy":`register-btn`,color:`primary`,class:`me-2`,onClick:s},{default:n(()=>t[7]||(t[7]=[c(`Register`)])),_:2},1032,[`onClick`]),r(m,{to:`/q/${a}/preview`},{default:n(()=>[r(v,{variant:`outlined`,color:`primary`,class:`me-2`},{default:n(()=>t[8]||(t[8]=[c(`Start a trial study session`)])),_:1})]),_:2},1032,[`to`])]))]),_:2},1024)]),"tag-link":n(({tag:e,courseId:t})=>[r(m,{to:`/q/${t}/tags/${e.name}`},{default:n(()=>[r(b,{variant:`tonal`,class:`me-2 mb-2`},{default:n(()=>[c(u(e.name),1)]),_:2},1024)]),_:2},1032,[`to`])]),"additional-content":n(()=>[e.isPianoCourse?(i(),g(x,{key:0,_id:e.courseId,user:e.user,class:`my-3`},null,8,[`_id`,`user`])):_(``,!0),r(S,{"course-id":e.courseId,"is-admin":e.isAdmin},null,8,[`course-id`,`is-admin`]),e.userIsRegistered?(i(),g(D,{key:1,class:`my-3`},{default:n(()=>[r(E,null,{default:n(()=>[r(C,null,{default:n(()=>[r(y,{start:``},{default:n(()=>t[9]||(t[9]=[c(`mdi-tune`)])),_:1}),t[10]||(t[10]=c(` Learning Preferences `))]),_:1}),r(T,null,{default:n(()=>[r(w,{"course-id":e.courseId},null,8,[`course-id`])]),_:1})]),_:1})]),_:1})):_(``,!0)]),_:1},8,[`course-id`,`view-lookup-function`,`edit-mode`,`user-is-registered`])])}e(_sfc_render$1,`_sfc_render`);var st=l({name:`CourseRouter`,components:{CourseInformationWrapper:S(rt,[[`render`,_sfc_render$1],[`__scopeId`,`data-v-aa3214c2`]]),NewCourseDialog:T},props:{query:{type:String,required:!0}},data(){return{courseList:[],courseId:void 0,candidates:[],newCourseDialog:!1,initComplete:!1}},async created(){this.courseList=await x().getCoursesDB().getCourseList(),this.loadQuery()},methods:{update(e){e.courseID&&e.disambiguator&&x().getCoursesDB().disambiguateCourse(e.courseID,e.disambiguator)},loadQuery(e){let t;t=e?e.toLowerCase():this.query.toLowerCase(),this.candidates=this.courseList.filter(e=>{let n=e.name.replaceAll(` `,`_`).toLowerCase();return t===n||t===e.courseID||t===`${n}_(${e.disambiguator})`}),this.candidates.length===1?this.courseId=this.candidates[0].courseID:this.candidates.length===0&&(this.courseId=``),this.initComplete=!0}}}),ct={key:0},lt={class:`text-h3`},ut=[`onClick`];function _sfc_render(e,t,a,l,h,v){let y=o(`course-information-wrapper`),b=o(`v-row`),x=o(`v-divider`),S=o(`v-btn`),C=o(`new-course-dialog`),w=o(`v-dialog`),T=o(`v-container`),E=o(`v-text-field`);return i(),p(`div`,null,[e.initComplete?(i(),p(`div`,ct,[e.courseId!==void 0&&e.courseId!==``?(i(),g(y,{key:0,"course-id":e.courseId},null,8,[`course-id`])):e.candidates.length===0?(i(),g(T,{key:1},{default:n(()=>[r(b,{class:`text-h4`},{default:n(()=>[c(u(e.query),1)]),_:1}),r(x),r(b,{class:`ma-3 text-h5`},{default:n(()=>t[2]||(t[2]=[c(`Nothing here!`)])),_:1}),r(b,{class:`ma-3`},{default:n(()=>[r(w,{modelValue:e.newCourseDialog,"onUpdate:modelValue":t[1]||(t[1]=t=>e.newCourseDialog=t),fullscreen:``,transition:`dialog-bottom-transition`,overlay:!1},{activator:n(({props:e})=>[r(S,s({color:`primary`},e),{default:n(()=>t[3]||(t[3]=[c(`Start a new Quilt`)])),_:2},1040)]),default:n(()=>[r(C,{name:e.query,onCourseEditingComplete:t[0]||(t[0]=t=>e.newCourseDialog=!1)},null,8,[`name`])]),_:1},8,[`modelValue`])]),_:1})]),_:1})):(i(),g(T,{key:2},{default:n(()=>[f(`div`,null,[f(`span`,lt,u(e.query),1),t[5]||(t[5]=c()),t[6]||(t[6]=f(`span`,{class:`text-h5`},`could refer to:`,-1)),r(x),(i(!0),p(m,null,d(e.candidates,(a,o)=>(i(),p(`div`,{key:o,class:`ma-5`},[r(b,{class:`text-h5`},{default:n(()=>[f(`a`,{onClick:t=>e.loadQuery(a.courseID)},u(a.name),9,ut),t[4]||(t[4]=c(` - `)),r(E,{id:`${o}-disambiguator`,modelValue:a.disambiguator,"onUpdate:modelValue":e=>a.disambiguator=e,label:`Disambiguator`,onChange:t=>e.update(a)},null,8,[`id`,`modelValue`,`onUpdate:modelValue`,`onChange`]),c(` `+u(a.description),1)]),_:2},1024)]))),128))])]),_:1}))])):_(``,!0)])}var dt=S(st,[[`render`,_sfc_render]]);export{dt as default};
7
+ //# sourceMappingURL=CourseRouter-DFPpLiug.js.map