\r\n\r\n\r\n**********************/\r\n\r\nimport axios from 'axios';\r\n\r\nexport const refreshPageMixin = {\r\n data() {\r\n return {\r\n currentHash: '{{POST_BUILD_ENTERS_HASH_HERE}}',\r\n token: localStorage.getItem('user-token'),\r\n hashChanged: false,\r\n newHash: ''\r\n }\r\n },\r\n mounted() {\r\n // let url = this.$publicUrl + 'version.js';\r\n let url = 'version.json';\r\n this.initVersionCheck(url, 1000 * 30);\r\n },\r\n methods: {\r\n initVersionCheck(url, frequency = 2000 ) { // 1000 * 60 * 2\r\n setInterval(() => {\r\n console.log(\"version check...\");\r\n this.checkVersion(url);\r\n }, frequency);\r\n },\r\n async checkVersion(url) {\r\n try {\r\n const fileResponse = await axios.create({\r\n baseURL: this.$publicUrl,\r\n headers: {\r\n 'Authorization': 'JWT ' + this.token,\r\n 'Content-type': 'application/json'\r\n }\r\n }).get(url + '?t=' + new Date().getTime());\r\n\r\n this.newHash = fileResponse.data.hash;\r\n\r\n this.hashChanged = this.hasHashChanged(this.currentHash, this.newHash);\r\n } catch (error) {\r\n this.loading = false;\r\n if (!error.response) {\r\n this.errorStatus = 'Error: Network Error'\r\n } else {\r\n this.errorStatus = error.response.data.message;\r\n }\r\n }\r\n },\r\n hasHashChanged(currentHash, newHash) {\r\n if (!currentHash || currentHash === '{{POST_BUILD_ENTERS_HASH_HERE}}') {\r\n return true;\r\n }\r\n\r\n return currentHash !== newHash;\r\n },\r\n reloadApp() {\r\n this.currentHash = this.newHash;\r\n window.location.reload();\r\n }\r\n }\r\n};","
\r\n \r\n\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n Ny version!\r\n \r\n \r\n\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n Uppdatera\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./NewVersion.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./NewVersion.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NewVersion.vue?vue&type=template&id=b02d53d0&scoped=true&\"\nimport script from \"./NewVersion.vue?vue&type=script&lang=js&\"\nexport * from \"./NewVersion.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NewVersion.vue?vue&type=style&index=0&id=b02d53d0&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b02d53d0\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',[_c('v-btn',{staticClass:\"grey--text text--lighten-1\",attrs:{\"depressed\":\"\",\"text\":\"\"},on:{\"click\":function($event){return _vm.loadVersionHistory()}}},[_vm._v(\" v\"+_vm._s(_vm.version)+\" \"+_vm._s(_vm.errorStatus)+\" \")])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","
\r\n \r\n \r\n v{{version}} {{errorStatus}}\r\n \r\n \r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VersionNumber.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VersionNumber.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VersionNumber.vue?vue&type=template&id=027e7ccd&\"\nimport script from \"./VersionNumber.vue?vue&type=script&lang=js&\"\nexport * from \"./VersionNumber.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.$store.state.groups.group_id!=null && _vm.$store.state.groups.course_id!=null)?_c('v-snackbar',{attrs:{\"timeout\":-1,\"value\":true,\"bottom\":\"\",\"right\":\"\",\"max-width\":\"100px\"}},[_c('v-container',{staticStyle:{\"max-width\":\"300px\"},attrs:{\"start\":\"\",\"pa-0\":\"\",\"ma-0\":\"\"}},[_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function({ on }){return [_c('v-btn',_vm._g({attrs:{\"icon\":\"\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.$router.push('/Grupp/' + _vm.$store.state.groups.group_id)}}},on),[_c('v-icon',[_vm._v(\"arrow_back\")])],1)]}}],null,false,936122018)},[_c('span',[_vm._v(\" Tillbaka till gruppen \")])]),_vm._v(\" Kursgrupp Grupp-id: \"+_vm._s(_vm.$store.state.groups.group_id)),_c('br'),_c('br'),_c('h2',[_vm._v(\"Utdelningsschema (post: \"+_vm._s(_vm.pageId)+\")\")]),_c('v-row',{attrs:{\"pa-0\":\"\"}},[_c('v-col',{attrs:{\"cols\":\"12\"}},[[_vm._v(\" Aktiv tid: \"),_c('i',[_vm._v(\"Beräknas enligt räknemodell (se pdf med kurspoäng mot viktning mot studietakt etc...).\")]),_c('br')]],2),_c('v-col',{attrs:{\"cols\":\"12\"}},[_c('v-checkbox',{attrs:{\"label\":\"Aktiveras enligt viktningsfaktor.\",\"true-value\":true,\"false-value\":false},model:{value:(_vm.item['postActivatesByCourseGoal']),callback:function ($$v) {_vm.$set(_vm.item, 'postActivatesByCourseGoal', $$v)},expression:\"item['postActivatesByCourseGoal']\"}}),_c('v-checkbox',{attrs:{\"label\":\"Aktiveras enligt manuell tid.\",\"true-value\":false,\"false-value\":true},model:{value:(_vm.item['postActivatesByCourseGoal']),callback:function ($$v) {_vm.$set(_vm.item, 'postActivatesByCourseGoal', $$v)},expression:\"item['postActivatesByCourseGoal']\"}}),(_vm.item['postActivatesByCourseGoal']==false)?[(_vm.item.StartDate)?[_c('date-chip',{attrs:{\"date\":_vm.item['StartDate'],\"tooltip\":'Startar: ' + _vm.item['StartDate'],\"type\":\"Begins\",\"icon\":\"mdi-clock-start\"}})]:_vm._e(),(_vm.item.EndDate)?[_c('date-chip',{attrs:{\"date\":_vm.item['EndDate'],\"tooltip\":'Slutar: ' + _vm.item['EndDate'],\"type\":\"Ends\",\"icon\":\"mdi-clock-end\"}})]:_vm._e()]:_vm._e()],2),_c('v-col',{attrs:{\"cols\":\"12\"}},[_c('i',[_vm._v(\"Här ställer man in hur/när den specifika sidan skall delas ut till gruppen. \"),_c('br'),_c('br'),_c('strong',[_vm._v(\"Default\")]),_vm._v(\" är att posten aktiveras enligt den viktningsfaktor som är inställd för delmålet.\")])]),_c('v-col',{attrs:{\"cols\":\"12\"}},[(_vm.item.CDate)?[_c('date-chip',{attrs:{\"date\":_vm.item['CDate'],\"tooltip\":'Skapad: ' + _vm.item['CDate'] + ' av user-id:' + _vm.item['CreatedBy'],\"type\":\"Basic\"}})]:_vm._e(),(_vm.item.EDate)?[_c('date-chip',{attrs:{\"date\":_vm.item['EDate'],\"tooltip\":'Modifierad: ' + _vm.item['EDate'] + ' av user-id:' + _vm.item['ModifiedBy'],\"type\":\"Modified\",\"icon\":'update'}})]:_vm._e()],2)],1)],1)],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","
\r\n \r\n \r\n \r\n \r\n \r\n \r\n arrow_back\r\n \r\n \r\n \r\n Tillbaka till gruppen\r\n \r\n \r\n Kursgrupp\r\n Grupp-id: {{ $store.state.groups.group_id }}
\r\n \r\n
\r\n Utdelningsschema (post: {{pageId}})
\r\n \r\n \r\n \r\n Aktiv tid: Beräknas enligt räknemodell (se pdf med kurspoäng mot viktning mot studietakt etc...).\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Här ställer man in hur/när den specifika sidan skall delas ut till gruppen.
Default är att posten aktiveras enligt den viktningsfaktor som är inställd för delmålet.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./courseGroupOverlay.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./courseGroupOverlay.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./courseGroupOverlay.vue?vue&type=template&id=ca821550&\"\nimport script from \"./courseGroupOverlay.vue?vue&type=script&lang=js&\"\nexport * from \"./courseGroupOverlay.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.crumbs)?_c('div',[_c('v-breadcrumbs',{attrs:{\"items\":_vm.crumbs},scopedSlots:_vm._u([{key:\"item\",fn:function({ item }){return [_c('v-breadcrumbs-item',{staticClass:\"text-subtitle-2 crumb-item\",attrs:{\"to\":item.to,\"disabled\":item.disabled,\"exact\":\"\"}},[_vm._v(\" \"+_vm._s(item.text)+\" \")])]}}],null,false,4273900223)})],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","
\r\n\r\n \r\n \r\n \r\n \r\n \r\n {{ item.text }}\r\n \r\n \r\n \r\n\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MyMessage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MyMessage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MyMessage.vue?vue&type=template&id=03bcbaf8&scoped=true&\"\nimport script from \"./MyMessage.vue?vue&type=script&lang=js&\"\nexport * from \"./MyMessage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MyMessage.vue?vue&type=style&index=0&id=03bcbaf8&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"03bcbaf8\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-footer',{staticClass:\"myapp-footer\"},[_c('v-container',{attrs:{\"fluid\":\"\"}},[_c('v-row',{attrs:{\"no-gutters\":\"\",\"justify\":\"center\"}},[_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"10\",\"md\":\"8\"}},[_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_c('v-col',{staticClass:\"mb-8\",attrs:{\"cols\":\"12\",\"sm\":\"4\"}},[[_c('div',{staticStyle:{\"display\":\"block\"}},[_c('img',{staticClass:\"valiweb_logo mt-2 ml-1\",style:('display:inline-block;width:' + _vm.logo_width + 'px;'),attrs:{\"src\":_vm.logo_img,\"alt\":_vm.logo_alt}})])]],2),_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"8\"}},[_c('img',{staticClass:\"mt-2 ml-1\",style:('display:inline-block;width:' + _vm.logo_width + 'px;'),attrs:{\"src\":_vm.logo_img_2,\"alt\":\"Yrkeslärare ikoner 1\"}}),_c('img',{staticClass:\"mt-2 ml-1\",style:('display:inline-block;width:' + _vm.logo_width + 'px;'),attrs:{\"src\":_vm.logo_img_3,\"alt\":\"Yrkeslärare ikoner 2\"}})]),_c('v-col',{staticClass:\"pa-2\",attrs:{\"cols\":\"12\",\"md\":\"4\"}},[_c('ContentArea',{attrs:{\"TheKey\":\"Yrk.Footer.LeftText\"},scopedSlots:_vm._u([{key:\"DefaultContent\",fn:function(){return [_vm._v(\" Skellefteå Kommun\"),_c('br'),_vm._v(\" ValiWeb / Kanal, Bäckgatan 2\"),_c('br'),_vm._v(\" 931 85 Skellefteå\"),_c('br'),_c('br')]},proxy:true}])})],1),_c('v-col',{staticClass:\"pa-2\",attrs:{\"cols\":\"6\",\"sm\":\"5\"}},[_c('ContentArea',{attrs:{\"TheKey\":\"Yrk.Footer.MiddleText\"},scopedSlots:_vm._u([{key:\"DefaultContent\",fn:function(){return [_vm._v(\"ValiWeb gör behörighetsprövning i yrkesämnen. För information om ansökan till utbildning samt grundläggande behörighet, se respektive lärosätes hemsida.\")]},proxy:true}])})],1),_c('v-col',{staticClass:\"pa-2\",attrs:{\"cols\":\"6\",\"sm\":\"3\"}},[_c('ul',{staticClass:\"ml-4\"},[_c('li',{staticClass:\"pb-2\"},[_c('a',{attrs:{\"href\":_vm.$root.$publicUrl + 'kontakt',\"title\":\"Kontakt\"},on:{\"click\":function($event){$event.preventDefault();return _vm.$router.push('/kontakt');}}},[_vm._v(\"Kontakt\")]),_c('br')]),_c('li',{staticClass:\"py-2\"},[_c('a',{attrs:{\"href\":_vm.$root.$publicUrl + 'info',\"title\":\"Allmän info\"},on:{\"click\":function($event){$event.preventDefault();return _vm.$router.push('/info');}}},[_vm._v(\"Allmän info\")]),_c('br')]),_c('li',{staticClass:\"py-2\"},[_c('a',{attrs:{\"href\":_vm.$root.$publicUrl + 'FAQ',\"title\":\"FAQ\"},on:{\"click\":function($event){$event.preventDefault();return _vm.$router.push('/FAQ');}}},[_vm._v(\"FAQ\")]),_c('br')]),_c('li',{staticClass:\"py-2\"},[_c('a',{attrs:{\"href\":'https://yrkadmin.valiweb.nu',\"title\":\"Admin\"}},[_vm._v(\"Admin\")]),_c('br')])])])],1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","
\r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MyFooter.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MyFooter.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./MyFooter.vue?vue&type=template&id=8b0f68ac&scoped=true&\"\nimport script from \"./MyFooter.vue?vue&type=script&lang=ts&\"\nexport * from \"./MyFooter.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./MyFooter.vue?vue&type=style&index=0&id=8b0f68ac&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"8b0f68ac\",\n null\n \n)\n\nexport default component.exports","
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ item.icon }}\r\n \r\n \r\n {{ item.name }}\r\n \r\n \r\n \r\n \r\n {{ sub.icon }}\r\n \r\n {{ sub.name }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ item.icon }}\r\n \r\n \r\n {{ item.name }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
![]()
\r\n
\r\n Validering sedan 2005\r\n
\r\n
\r\n \r\n\r\n \r\n \r\n {{$store.state.everything.apptitle}}
\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {{\r\n $store.state.everything.courseEditor.currentValiFormSubmission.FirstName\r\n }}\r\n {{\r\n $store.state.everything.courseEditor.currentValiFormSubmission.LastName\r\n }}\r\n \r\n \r\n Granskar kurs för\r\n {{\r\n $store.state.everything.courseEditor.currentValiFormSubmission.FirstName\r\n }}\r\n {{\r\n $store.state.everything.courseEditor.currentValiFormSubmission.LastName\r\n }}
Id:{{ $store.state.everything.courseEditor.mentorViewCourseAsUser\r\n }}
Akt:\r\n {{ $store.state.everything.courseEditor.currentValiFormSubmission.Id }}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n Hem\r\n \r\n \r\n Hem\r\n \r\n\r\n \r\n \r\n \r\n Kontakt\r\n \r\n \r\n Kontakt\r\n \r\n \r\n \r\n \r\n Logga ut\r\n \r\n \r\n Logga ut\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n edit\r\n \r\n \r\n {{ !$store.state.everything.isPageEditActivated?'Aktivera redigering':'Stäng redigering' }}\r\n \r\n \r\n \r\n \r\n help_outline\r\n \r\n \r\n Kom igång\r\n \r\n\r\n \r\n \r\n \r\n \r\n 0\">notifications_active\r\n notifications_none\r\n \r\n \r\n \r\n \r\n Meddelanden & Aviseringar\r\n \r\n \r\n \r\n \r\n warning{{ item[\"Title\"] }}\r\n comment{{\r\n item[\"SenderFirstName\"] + \" \" + item[\"SenderLastName\"]\r\n }}\r\n \r\n \r\n \r\n {{\r\n timeProgressed(\r\n $store.state.notices.notifications.serverDateTime,\r\n item.CDate\r\n )\r\n }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n comment{{ noticeCopy }}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {{ initialsOfUser }}\r\n \r\n \r\n \r\n Min profil\r\n \r\n \r\n\r\n \r\n \r\n \r\n Toggle\r\n \r\n \r\n Toggle\r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n Tillbaka\r\n navigate_before\r\n \r\n \r\n Kursmeny\r\n menu\r\n \r\n \r\n Framåt\r\n navigate_next\r\n \r\n \r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n close\r\n \r\n \r\n Stäng \r\n \r\n Dialog med\r\n {{ $store.state.notices.notifications.targetUserName }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Inga meddelanden. Påbörja en dialog!
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n send\r\n \r\n Skicka \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n skicka meddelandet som epost för att uppmärksamma mottagaren?'\" :choiceOK=\"'Ja'\" :choiceNO=\"'Nej'\" v-on:confirm=\"confirmedToSendLastMessageAsEmail()\" v-on:closeDialog='$store.commit(\"setSendMessageAsEmailConfirmDialog\", false);' />\r\n\r\n \r\n \r\n På {{hostName}} använder vi kakor (cookies) för att webbplatsen ska\r\n fungera på bästa sätt. Genom att surfa vidare godkänner du att vi\r\n använder dem.\r\n Vad är kakor?\r\n
\r\n \r\n \r\n \r\n Jag förstår\r\n \r\n
\r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n Sparar\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n {{ item.title }}\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=49b88288&scoped=true&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=49b88288&prod&lang=css&\"\nimport style1 from \"./App.vue?vue&type=style&index=1&id=49b88288&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"49b88288\",\n null\n \n)\n\nexport default component.exports","\r\nimport Vue from \"vue\";\r\nimport Router from \"vue-router\";\r\nimport axios from 'axios'\r\nimport store from \"./store\";\r\nimport Default from \"./views/dynamic/Default.vue\";\r\n\r\nVue.use(Router);\r\n\r\nconst router = new Router({\r\n mode: \"history\",\r\n base: process.env.BASE_URL,\r\n routes: [\r\n {\r\n path: \"/login\",\r\n name: \"Login\",\r\n component: () => import(\"./views/Login.vue\"),\r\n props: true,\r\n meta: {\r\n requiresAuth: false,\r\n breadCrumbs: {\r\n to: \"/\", // hyperlink\r\n text: \"Logga in\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/password-recovery\",\r\n name: \"Glömt Lösenord\",\r\n component: () => import(\"./views/PasswordRecovery.vue\"),\r\n props: true,\r\n meta: {\r\n requiresAuth: false,\r\n breadCrumbs: {\r\n to: \"/password-recovery\", // hyperlink\r\n text: \"Glömt lösenord\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/admin/migrate-content\",\r\n name: \"Migrate content\",\r\n component: () => import(\"./views/admin/MigrateContent.vue\"),\r\n props: true,\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/admin/migrate-content\", // hyperlink\r\n text: \"Migrate content\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/password-recovery/:id\",\r\n name: \"Återställning av lösenord\",\r\n component: () => import(\"./views/PasswordRecovery.vue\"),\r\n props: true,\r\n meta: {\r\n requiresAuth: false,\r\n breadCrumbs: {\r\n to: \"/password-recovery\", // hyperlink\r\n text: \"Återställning av lösenord\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/\",\r\n name: \"home\",\r\n component: () =>\r\n import(\"./views/Home.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/\", // hyperlink\r\n text: \"Hem\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/KursLista\",\r\n name: \"KursLista\",\r\n component: () =>\r\n import(\"./views/ListCourses.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/KursLista\", // hyperlink\r\n text: \"Kurslista\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Yrkeslista\",\r\n name: \"Yrkeslista\",\r\n component: () =>\r\n import(\"./views/ListTrades.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Yrkeslista\", // hyperlink\r\n text: \"Yrkeslista\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Yrkeslista/:id\",\r\n name: \"Yrkeslista/:id\",\r\n component: () =>\r\n import(\"./views/ListTrades.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Yrkeslista\", // hyperlink\r\n text: \"Yrkeslista\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/grupplista\",\r\n name: \"grupplista\",\r\n component: () =>\r\n import(\"./views/GroupList.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/grupplista\", // hyperlink\r\n text: \"Grupplista\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/grupp/:group_id\",\r\n name: \"grupp/:group_id\",\r\n component: () =>\r\n import(\"./views/GroupEdit.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/grupp\", // hyperlink\r\n text: \"Grupp\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/grupp/:group_id/kurs/:id\",\r\n name: \"grupp/:group_id/kurs/:id\",\r\n component: () =>\r\n import(\"./views/EditCourse.vue\"),\r\n// import(\"./views/EditGroupCourse.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Grupp/Kursöversikt\", // hyperlink\r\n text: \"Grupp/Kursöversikt\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/grupp/:group_id/kurs/:id/post/:id2\",\r\n name: \"grupp/:group_id/kurs/:id/post/:id2\",\r\n component: () =>\r\n import(\"./views/EditCoursePart.vue\"),\r\n// import(\"./views/EditGroupCourse.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Grupp/Kurs/Delmål\", // hyperlink\r\n text: \"Grupp/Kurs/Delmål\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/MyCourses\",\r\n name: \"Mina kurser\",\r\n component: () =>\r\n import(\"./views/MyCourses.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/MyCourses\", // hyperlink\r\n text: \"Mina kurser\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Anvandare\",\r\n name: \"Användare\",\r\n component: () =>\r\n import(\"./views/ListUsers.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Anvandare\", // hyperlink\r\n text: \"Användare\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Anvandare/:id\",\r\n name: \"Användare/\",\r\n component: () =>\r\n import(\"./views/EditUser.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Anvandare\", // hyperlink\r\n text: \"Användare\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Akter\",\r\n name: \"Akter\",\r\n component: () =>\r\n import(/* webpackChunkName: \"home\" */ \"./views/ListFiles.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Akter\", // hyperlink\r\n text: \"Akter\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Akter/:id\",\r\n name: \"EditFile\",\r\n component: () =>\r\n import(\"./views/EditFile.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Akter\", // hyperlink\r\n text: \"Akter\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/MinProfil\",\r\n name: \"MinProfil\",\r\n component: () =>\r\n import(\"./views/MyProfile.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/MinProfil\", // hyperlink\r\n text: \"Min Profil\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/about\",\r\n name: \"about\",\r\n // route level code-splitting\r\n // this generates a separate chunk (about.[hash].js) for this route\r\n // which is lazy-loaded when the route is visited.\r\n component: () =>\r\n import(\"./views/About.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/about\", // hyperlink\r\n text: \"About\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/kurs/:id\",\r\n name: \"kurs\",\r\n // route level code-splitting\r\n // this generates a separate chunk (about.[hash].js) for this route\r\n // which is lazy-loaded when the route is visited.\r\n component: () => import(\"./views/EditCourse.vue\"),\r\n props: true,\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: [ \r\n {\r\n to: \"/kurs\", // hyperlink\r\n text: \"Kurs\", // crumb text\r\n },\r\n {\r\n text: \"\", // crumb text\r\n }\r\n ],\r\n },\r\n },\r\n {\r\n path: \"/kurs/:id/post/:id2\",\r\n name: \"/delmoment\",\r\n // route level code-splitting\r\n // this generates a separate chunk (about.[hash].js) for this route\r\n // which is lazy-loaded when the route is visited.\r\n component: () => import(\"./views/EditCoursePart.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/delmoment\", // hyperlink\r\n text: \"Delmoment\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Profiling\",\r\n name: \"Profiling\",\r\n component: () =>\r\n import( \"./views/Profiling.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Profiling\", // hyperlink\r\n text: \"Kartläggning\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step1\",\r\n name: \"Profiling Step 1\",\r\n component: () =>\r\n import( \"./views/profiling/Step1.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step1\", // hyperlink\r\n text: \"Kartläggning - Steg 1\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step1/:id\",\r\n name: \"Profiling Step 1 with id\",\r\n component: () =>\r\n import( \"./views/profiling/Step1.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step1\", // hyperlink\r\n text: \"Kartläggning - Steg 1\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step1_1\",\r\n name: \"Profiling Step 1.1\",\r\n component: () =>\r\n import( \"./views/profiling/Step1_1.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step1\", // hyperlink\r\n text: \"Kartläggning - Steg 1.1\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step1_1/:id\",\r\n name: \"Profiling Step 1.1 with id\",\r\n component: () =>\r\n import( \"./views/profiling/Step1_1.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step1_1\", // hyperlink\r\n text: \"Kartläggning - Steg 1.1\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step2\",\r\n name: \"Profiling Step 2\",\r\n component: () =>\r\n import( \"./views/profiling/Step2.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step2\", // hyperlink\r\n text: \"Kartläggning - Steg 2\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step2/:id\",\r\n name: \"Profiling Step 2 with id\",\r\n component: () =>\r\n import( \"./views/profiling/Step2.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step2\", // hyperlink\r\n text: \"Kartläggning - Steg 2\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step3\",\r\n name: \"Profiling Step 3\",\r\n component: () =>\r\n import( \"./views/profiling/Step3.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step3\", // hyperlink\r\n text: \"Kartläggning - Steg 3\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step3/:id\",\r\n name: \"Profiling Step 3 with id \",\r\n component: () =>\r\n import( \"./views/profiling/Step3.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step3\", // hyperlink\r\n text: \"Kartläggning - Steg 3\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step3/:id/reference/:reference\",\r\n name: \"Profiling Step 3 with id and reference\",\r\n component: () =>\r\n import( \"./views/profiling/Step3.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step3\", // hyperlink\r\n text: \"Kartläggning - Steg 3\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step4/:id\",\r\n name: \"Profiling Step 4 with id \",\r\n component: () =>\r\n import( \"./views/profiling/Step4.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step4\", // hyperlink\r\n text: \"Kartläggning - Steg 4\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/profiling/Step5/:id\",\r\n name: \"Profiling Step 5 with id \",\r\n component: () =>\r\n import( \"./views/profiling/Step5.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/profiling/Step5\", // hyperlink\r\n text: \"Kartläggning - Steg 5\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Profiling/Validation/:id\",\r\n name: \"Validation\",\r\n component: () =>\r\n import( \"./views/profiling/Validation.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Profiling/Validation\", // hyperlink\r\n text: \"Validering\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Todo\",\r\n name: \"To do\",\r\n component: () =>\r\n import(\"./views/TaskList.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Todo\", // hyperlink\r\n text: \"Todo\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Todo/:id\",\r\n name: \"To do/\",\r\n component: () =>\r\n import(\"./views/EditTask.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/Todo\", // hyperlink\r\n text: \"Todo\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/Registrering\",\r\n name: \"Registrering\",\r\n component: () =>\r\n import(\"./views/UserRegistration.vue\"),\r\n meta: {\r\n requiresAuth: false,\r\n breadCrumbs: {\r\n to: \"/Registrering\", // hyperlink\r\n text: \"Registrering\", // crumb text\r\n },\r\n },\r\n }, \r\n {\r\n path: \"/anvanda-webbplatsen\",\r\n name: \"Anvanda webbplatsen\",\r\n component: () =>\r\n import(\"./views/om-webbplatsen/AnvandaWebbplatsen.vue\"),\r\n meta: {\r\n requiresAuth: false,\r\n breadCrumbs: {\r\n to: \"/anvanda-webbplatsen\", // hyperlink\r\n text: \"Använda webbplatsen\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/versioner\",\r\n name: \"Versionshistorik\",\r\n component: () =>\r\n import(\"./views/om-webbplatsen/Versionshistorik.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/versioner\", // hyperlink\r\n text: \"Versionshistorik\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/koder\",\r\n name: \"Koder\",\r\n component: () =>\r\n import(/* webpackChunkName: \"home\" */ \"./views/RegistrationCodes.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/koder\", // hyperlink\r\n text: \"Koder\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/studietakt\",\r\n name: \"Studietakt\",\r\n component: () =>\r\n import(/* webpackChunkName: \"home\" */ \"./views/Studietakt.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/studietakt\", // hyperlink\r\n text: \"Studietakt\", // crumb text\r\n },\r\n },\r\n },\r\n {\r\n path: \"/statistik\",\r\n name: \"Statistik\",\r\n component: () =>\r\n import(/* webpackChunkName: \"home\" */ \"./views/Statistics.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/statistik\", // hyperlink\r\n text: \"Statistik\", // crumb text\r\n },\r\n },\r\n },\r\n /* {\r\n path: \"/pp\",\r\n name: \"pp\",\r\n component: () =>\r\n import(\"./views/PP.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/pp\", \r\n text: \"pp\", \r\n },\r\n },\r\n },\r\n {\r\n path: \"/sp\",\r\n name: \"sp\",\r\n component: () =>\r\n import(\"./views/SP.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/sp\", // hyperlink\r\n text: \"sp\", // crumb text\r\n },\r\n },\r\n },*/\r\n {\r\n path: \"/404\",\r\n name: \"404\",\r\n component: () => import(\"./views/NotFound.vue\"),\r\n meta: {\r\n requiresAuth: false,\r\n breadCrumbs: {\r\n to: \"/404\", // hyperlink\r\n text: \"Not found\", // crumb text\r\n },\r\n },\r\n },\r\n /* {\r\n path: \"/dummy\",\r\n name: \"dummy\",\r\n component: () =>\r\n import( \"./views/NotFound.vue\"),\r\n meta: {\r\n requiresAuth: true,\r\n breadCrumbs: {\r\n to: \"/404\", // hyperlink\r\n text: \"Not found\", // crumb text\r\n },\r\n },\r\n },*/\r\n\r\n /*\r\n {\r\n path: \"*\",\r\n component: () => import(\"./views/NotFound.vue\"),\r\n meta: {\r\n requiresAuth: false,\r\n breadCrumbs: {\r\n to: \"/404\", // hyperlink\r\n text: \"Not found\", // crumb text\r\n },\r\n },\r\n },*/\r\n ],\r\n scrollBehavior() {\r\n //scrollBehavior (to, from, savedPosition) {\r\n return { x: 0, y: 0 };\r\n },\r\n});\r\n\r\nexport default router;\r\n\r\nasync function getBackendPageResult(router, to) {\r\n return new Promise((resolve, reject) => {\r\n console.log(\"getBackendPageResult running...\");\r\n var fd = new FormData();\r\n fd.append('data', JSON.stringify({TheKey: to.path}));\r\n \r\n axios\r\n .post(window.serverUrl + \"/api/backend/get_page_if_exists.php\", fd)\r\n .then((response) => {\r\n console.log(\"get_page_if_exists result got!!\");\r\n JSON.stringify(response, null, 4);\r\n\r\n if (response.status === 200) {\r\n if (response.data && response.data.length != 0) {\r\n var pageItem = response.data[0];\r\n var pageToAdd = \r\n {\r\n path: pageItem.Key,\r\n name: pageItem.Title,\r\n component: Default,\r\n meta: {\r\n keywords: pageItem.Keywords,\r\n description: pageItem.Description,\r\n header: pageItem.Header,\r\n requiresAuth: false,\r\n breadCrumbs: {\r\n to: pageItem.Key, // hyperlink\r\n text: pageItem.Title, // crumb text\r\n },\r\n },\r\n }\r\n router.addRoutes([pageToAdd]);\r\n router.options.routes.push(pageToAdd);\r\n router.push(pageItem.Key);\r\n console.log(\"adding rout!\");\r\n resolve();\r\n } else {\r\n console.log(\"not found in db!\");\r\n resolve();\r\n }\r\n \r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n\r\nrouter.beforeEach( async(to, from, next) => {\r\n //store.commit(\"setRouteDenied\", null);\r\n //console.log(router);\r\n\r\n \r\n await Vue.nextTick();\r\n var existsInRouter = true;\r\n var resolveResult = router.resolve(to.path);\r\n //existsInRouter = router.options.routes.find((emp) => emp.path.toLowerCase() === to.path.toLowerCase());\r\n \r\n\r\n //console.log(\"exists: \", resolveResult);\r\n\r\n if(resolveResult.resolved.matched.length == 0) {\r\n //console.log(\"doesn't exist!\", to.path);\r\n \r\n //console.log(\"checkExistsinDb\");\r\n var hasJustAddedPageToRouter = await getBackendPageResult(router, to);\r\n // resolve again now that we maybe added a new route:\r\n resolveResult = router.resolve(to.path);\r\n if (resolveResult.resolved.matched.length == 0) {\r\n existsInRouter = false;\r\n }\r\n }\r\n\r\n if(store.state.everything.courseEditor.isEditing==true) {\r\n let courseId = from.params.id; \r\n let coursePartId = from.params.id2?from.params.id2:-1;\r\n \r\n store.dispatch(\"closeCourseEdit\", {CourseId: courseId, CoursePartId: coursePartId}).then(() => {\r\n console.log(\"Course unlocked for any user to claim.\")\r\n });\r\n }\r\n \r\n //console.log(\"userid: \", store.state.everything.user);\r\n if (store.state.everything.user.user_id == 0 && localStorage.getItem(\"user-token\")) {\r\n store.dispatch(\"setUser\", to).then(\r\n () => {\r\n //console.log(\"Setta user!\");\r\n //console.log(\"routeDenied is: \" + store.state.error.routeDenied);\r\n if (store.state.everything.error.routeDenied == null) {\r\n if (store.state.everything.user.user_id == 0) {\r\n next(\"/login\");\r\n } else {\r\n next();\r\n }\r\n } else {\r\n // Send user to login page\r\n //router.push('/login')\r\n // next(false);\r\n if(from.path!='/login') {\r\n console.log(\"Fel token - skickar användaren till login-sidan!\");\r\n var tmpTitle = localStorage.getItem(\"apptitle\"); // preserve app title\r\n localStorage.clear();\r\n if (tmpTitle) {\r\n localStorage.setItem(\"apptitle\", tmpTitle);\r\n }\r\n next(\"/login\");\r\n } else {\r\n console.log(\"Redan på login sidan...\");\r\n next();\r\n }\r\n \r\n }\r\n },\r\n (error) => {\r\n // eslint-disable-line no-unused-vars\r\n console.error(\r\n \"Got nothing from server. Check internet connection and try again.\"\r\n );\r\n next();\r\n }\r\n );\r\n } else {\r\n\r\n if (to.matched.some((record) => record.meta.requiresAuth)) {\r\n if (from.name == \"kurs\" || from.name == \"/delmoment\") {\r\n if (to.name != \"kurs\" && to.name != \"/delmoment\") {\r\n localStorage.removeItem(\"mentorViewCourseAsUser\");\r\n }\r\n }\r\n // console.log(\"Need to set user?\");\r\n if (!localStorage.getItem(\"user-token\")) {\r\n // console.log(\"Not even logged in.\")\r\n \r\n if (to == \"/password-recorvery\" || to == \"/login\") {\r\n // Pages that work without login\r\n next();\r\n //return false;\r\n } else {\r\n next(\"/login\");\r\n //return false;\r\n }\r\n }\r\n \r\n store.dispatch(\"setUser\", to).then(\r\n () => {\r\n // console.log(\"Setting user!\");\r\n //console.log(\"routeDenied is: \" + store.state.error.routeDenied);\r\n if (store.state.everything.error.routeDenied == null) {\r\n if (store.state.everything.user.user_id == 0) {\r\n next(\"/login\");\r\n } else {\r\n next();\r\n }\r\n } else {\r\n // Send user to login page\r\n //router.push('/login')\r\n // next(false);\r\n if(from.path!='/login') {\r\n console.log(\"Fel token - skickar användaren till login-sidan!\");\r\n var tmpTitle = localStorage.getItem(\"apptitle\"); // preserve app title\r\n localStorage.clear();\r\n if (tmpTitle) {\r\n localStorage.setItem(\"apptitle\", tmpTitle);\r\n }\r\n next(\"/login\");\r\n } else {\r\n console.log(\"Redan på login sidan...\");\r\n next();\r\n }\r\n \r\n }\r\n },\r\n (error) => {\r\n // eslint-disable-line no-unused-vars\r\n console.error(\r\n \"Got nothing from server. Check internet connection and try again.\"\r\n );\r\n next();\r\n }\r\n );\r\n } else {\r\n next();\r\n }\r\n }\r\n\r\n if((store.state.everything.apptitle == \"ValiWeb Yrkeslärare\" || store.state.everything.apptitle == \"ValiWeb Yrkeslärare Test\") && to.path==\"/\") {\r\n next(\"/Profiling\");\r\n }\r\n \r\n if (!existsInRouter) {\r\n next(\"/404\");\r\n }\r\n next();\r\n});\r\n","\r\nimport Vue from 'vue'\r\n//import Vuetify from 'vuetify'\r\nimport vuetify from '@/plugins/vuetify' // path to vuetify export\r\nimport App from './App.vue'\r\nimport store from './store'\r\nimport router from './router'\r\n//import './registerServiceWorker'\r\nimport VueYouTubeEmbed from 'vue-youtube-embed'\r\nimport DatetimePicker from 'vuetify-datetime-picker'\r\n\r\nimport VueCookies from 'vue-cookies'\r\nimport axios from 'axios'\r\n\r\n\r\nwindow.serverUrl = process.env.NODE_ENV === 'production'\r\n? 'https://vux.valiweb.nu/kursmodul' \r\n: 'http://localhost:3000';\r\n\r\nVue.prototype.$publicUrl = process.env.NODE_ENV === 'production'\r\n? 'https://vux.valiweb.nu/kursmodul/' \r\n: 'http://localhost:8080/';\r\n\r\n// Defined apptitle\r\n\r\n// denna raden finns redan i storen...\r\ndocument.title = store.state.everything.apptitle;\r\n\r\nif (window.location.hostname.indexOf(\"skelleftea.valiweb.nu\") > -1) { \r\n store.state.everything.apptitle = \"ValiWeb Skellefteå\";\r\n document.title = \"ValiWeb Skellefteå\";\r\n Vue.prototype.$publicUrl = 'https://skelleftea.valiweb.nu/kursmodul/';\r\n window.serverUrl = 'https://skelleftea.valiweb.nu/kursmodul';\r\n}\r\n\r\nif (window.location.hostname.indexOf(\"y.valiweb.nu\") > -1) { \r\n store.state.everything.apptitle = \"ValiWeb Yrkeslärare\";\r\n document.title = \"ValiWeb Yrkeslärare\";\r\n Vue.prototype.$publicUrl = 'https://y.valiweb.nu/kursmodul/';\r\n window.serverUrl = 'https://y.valiweb.nu/kursmodul';\r\n}\r\n\r\nif (window.location.hostname.indexOf(\"yrk.valiweb.nu\") > -1) { \r\n store.state.everything.apptitle = \"ValiWeb Yrkeslärare\";\r\n document.title = \"ValiWeb Yrkeslärare\";\r\n Vue.prototype.$publicUrl = 'https://yrk.valiweb.nu/kursmodul/';\r\n window.serverUrl = 'https://yrk.valiweb.nu/kursmodul';\r\n}\r\n\r\nif (window.location.hostname.indexOf(\"yrk-test.valiweb.nu\") > -1) { \r\n store.state.everything.apptitle = \"ValiWeb Yrkeslärare Test\";\r\n document.title = \"ValiWeb Yrkeslärare Test\";\r\n Vue.prototype.$publicUrl = 'https://yrk-test.valiweb.nu/kursmodul/';\r\n window.serverUrl = 'https://yrk-test.valiweb.nu/kursmodul';\r\n}\r\n\r\nif (window.location.hostname.indexOf(\"vux-test.valiweb.nu\") > -1) { \r\n store.state.everything.apptitle = \"ValiWeb VUX Test\";\r\n document.title = \"ValiWeb VUX Test\";\r\n Vue.prototype.$publicUrl = 'https://vux-test.valiweb.nu/kursmodul/';\r\n window.serverUrl = 'https://vux-test.valiweb.nu/kursmodul';\r\n}\r\n\r\n//store.state.everything.apptitle = \"ValiWeb Skellefteå\"; // debug\r\n // store.state.everything.apptitle = \"ValiWeb Yrkeslärare\"; // debug\r\n\r\n/*\r\nwindow.serverUrl = process.env.NODE_ENV === 'production'\r\n? 'http://localhost:8888/kursmodul' \r\n: 'http://localhost:3000'\r\n\r\nVue.prototype.$publicUrl = process.env.NODE_ENV === 'production'\r\n? 'http://localhost:8888/kursmodul/' \r\n: 'http://localhost:8080/'\r\n*/\r\n\r\n/*\r\nif (location.protocol == 'https:')\r\n{\r\n // window.serverUrl = 'https://kursmodul.valiweb.nu' \r\n window.serverUrl = 'https://vux.valiweb.nu/kursmodul'\r\n}\r\n\r\nwindow.serverUrl = 'https://vux.valiweb.nu/kursmodul'\r\n*/\r\n\r\n/*\r\nwindow.serverUrl = process.env.NODE_ENV === 'production'\r\n? 'http://localhost:8888' \r\n: 'http://localhost:3000'\r\n*/\r\n\r\nVue.use(VueYouTubeEmbed)\r\nVue.use(DatetimePicker)\r\n//Vue.use(VTiptap)\r\nVue.use(VueCookies)\r\n\r\n// set default config\r\nVue.$cookies.config('7d')\r\n\r\n// set global cookie\r\n// Vue.$cookies.set('SameSite','None; Secure')\r\nVue.$cookies.set(\"use_path_argument\", \"value\", null, null, null, null, \"Lax\");\r\n\r\nVue.$cookies.set('promo_shown', '1')\r\nVue.$cookies.set('theme', 'default')\r\n//Set-Cookie: promo_shown=1; SameSite=Lax\r\n\r\nimport \"@/assets/_global.scss\"\r\n\r\nVue.config.productionTip = false\r\n\r\nVue.prototype.$course_id = {value: 41284};\r\n\r\nconst token = localStorage.getItem('user-token');\r\n\r\nif (token) {\r\n //axios.defaults.headers.common['Authorization'] = token\r\n // axios.defaults.headers.common['Authorization'] = \"Bearer \" + localStorage.getItem('user-token');\r\n // axios.defaults.withCredentials = true\r\n axios.defaults.headers.common['Authorization'] = localStorage.getItem('user-token');\r\n}\r\n\r\n// axios.defaults.withCredentials = true\r\n\r\naxios.defaults.params = {};\r\n\r\naxios.defaults.params[\"AppTitle\"] = store.state.everything.apptitle;\r\naxios.interceptors.request.use(function (config) {\r\n var today = new Date();\r\n var date = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate();\r\n var time = today.getHours() + \":\" + today.getMinutes() + \":\" + today.getSeconds();\r\n var dateTime = date+'T'+time;\r\n //config.params = \"{dt: \" + dateTime + \"}\";\r\n config.params[\"dt\"] = dateTime;\r\n \r\n return config;\r\n}, function (error) {\r\n return Promise.reject(error);\r\n});\r\n\r\n/*\r\naxios.interceptors.request.use(config => {\r\n console.log(config)\r\n var today = new Date();\r\n var date = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate();\r\n var time = today.getHours() + \":\" + today.getMinutes() + \":\" + today.getSeconds();\r\n var dateTime = date+'T'+time;\r\n\r\n config.params = \"{dt: hej}'\r\n // &dt=curDtAndTime\r\n \r\n // config.headers['key'] = '123ABD'\r\n return config\r\n})\r\n*/\r\n\r\n// Cross domain PHP session authorized API requests with Axios\r\n\r\n/*\r\naxios.interceptors.request.use(\r\n (config) => {\r\n console.log(\"intercept.\")\r\n let token = localStorage.getItem('authtoken');\r\n console.log(\"intercept.\")\r\n if (token) {\r\n config.headers['Authorization'] = `Bearer ${ token }`;\r\n }\r\n\r\n return config;\r\n }, \r\n\r\n (error) => {\r\n console.log(\"intercept ERR.\")\r\n return Promise.reject(error);\r\n }\r\n);\r\n*/\r\n\r\nVue.mixin ({\r\n methods: {\r\n timePassed(date_now, date_then) {\r\n date_now = new Date(date_now)\r\n date_then = new Date(date_then)\r\n // console.log(date_now)\r\n // console.log(date_then)\r\n // get total seconds between the times\r\n var delta = Math.abs(date_now - date_then) / 1000;\r\n // console.log(\"Delta: \" + delta)\r\n\r\n // calculate (and subtract) whole days\r\n var days = Math.floor(delta / 86400);\r\n delta -= days * 86400;\r\n\r\n // calculate (and subtract) whole hours\r\n var hours = Math.floor(delta / 3600) % 24;\r\n delta -= hours * 3600;\r\n\r\n // calculate (and subtract) whole minutes\r\n var minutes = Math.floor(delta / 60) % 60;\r\n delta -= minutes * 60;\r\n\r\n // what's left is seconds\r\n var seconds = delta % 60; \r\n let o = {days: days, hours: hours, minutes: minutes, seconds: seconds}\r\n // console.log(o)\r\n return o\r\n },\r\n timeProgressed(date_now, date_then) {\r\n let t = this.timePassed(date_now, date_then)\r\n if(t.days>7) {\r\n return date_then\r\n } \r\n else if(t.days>0) {\r\n return t.days + \"d\"\r\n }\r\n else if(t.hours>0) {\r\n return t.hours + \"h \" + t.minutes + \"min\"\r\n }\r\n else if(t.minutes>0) {\r\n return t.minutes + \"min\"\r\n }\r\n else if(t.seconds>0) {\r\n return t.seconds + \"s\"\r\n }\r\n }\r\n }\r\n})\r\n\r\n// fix vue tree list to be able to select parent in combination when selecting a child.\r\nVue.config.warnHandler = function (msg, vm, trace) {\r\n if (msg !== 'Invalid prop: custom validator check failed for prop \"selectionType\".') {\r\n const hasConsole = typeof console !== 'undefined';\r\n if (hasConsole && !Vue.config.silent) {\r\n console.error(`[Vue warn]: ${msg}${trace}`);\r\n }\r\n }\r\n}\r\n\r\nnew Vue({\r\n router,\r\n store,\r\n vuetify,\r\n render: h => h(App)\r\n}).$mount('#app')\r\n\r\n//Vue.prototype.$current_course_id = 1234\r\n","import Vue from \"vue\";\r\nimport axios from \"axios\";\r\n\r\nconst state = {\r\n count: 0,\r\n error: {\r\n routeDenied: null,\r\n },\r\n apptitle: localStorage.getItem(\"apptitle\")?localStorage.getItem(\"apptitle\"):\"ValiWeb VUX\",\r\n courseEditor: {\r\n currentCourseId: null,\r\n currCoursePostId: -1,\r\n courseData: null,\r\n courseMentors: null,\r\n mentorsLoaded: false,\r\n currentCourseEditedById: null,\r\n currentCourseEditedByUsername: null,\r\n currentCourseEditedSaveTime: null,\r\n showCourseSettings: false,\r\n showCoursePartSettings: false,\r\n showCourseNav: false,\r\n userExamId: null,\r\n userExamData: null,\r\n userExamAutoResult: null,\r\n userExamQuestCnt: null,\r\n timeToResetByIdle: null, // debug-var\r\n defaultMinutesToIdle: 55,\r\n isEditing: false,\r\n previewState: true,\r\n currentValiFormSubmission: null,\r\n mentorViewCourseAsUser: null,\r\n navBack: null,\r\n navForward: null,\r\n reloadCourseMenu: null,\r\n editingUser:null,\r\n pages: {\r\n total: 0,\r\n current: 0,\r\n },\r\n },\r\n isPageEditActivated: false,\r\n isSaving:false,\r\n user: {\r\n user_id: localStorage.getItem(\"user_id\")?localStorage.getItem(\"user_id\"):0,\r\n username: \"\",\r\n realname: \"\",\r\n userData: [],\r\n isValidator: true,\r\n userPerm: {\r\n editCourse: false,\r\n },\r\n notices: [],\r\n unreadNotices: 0,\r\n taskList: [],\r\n },\r\n debugRegisterUserData: {\r\n code: \"VALVOUSK\",\r\n userName: \"info@morningdewmedia.com\",\r\n firstName: \"Sven\",\r\n lastName: \"Svensson\",\r\n adress: \"Fisk 13\",\r\n postnr: \"91333\",\r\n city: \"Holmsund\",\r\n cellPhone: \"0701234567\",\r\n phone: \"4321\",\r\n orgnr: \"8404251234\",\r\n email: \"feedback@morningdewmedia.com\",\r\n email2: \"feedback@morningdewmedia.com\",\r\n password: \"1234\",\r\n password2: \"1234\",\r\n workplace: \"Nada\",\r\n preferredLocale: \"SE\",\r\n interests: [4,8,10],\r\n gdpr_consent: true,\r\n },\r\n translations: [] \r\n};\r\nconst getters = {\r\n};\r\nconst mutations = {\r\n /* changeName (state, payload) {\r\n state.user.fullName = payload\r\n }, */\r\n setAppTitle(state, i) {\r\n state.apptitle = i;\r\n localStorage.setItem(\"apptitle\", i);\r\n },\r\n setPageEditActivation(state, i) {\r\n state.isPageEditActivated = i;\r\n },\r\n setCurrPostId(state, i) {\r\n state.courseEditor.currCoursePostId = i;\r\n },\r\n setShowCourseSettings(state, i) {\r\n state.courseEditor.showCourseSettings = i;\r\n },\r\n setShowCoursePartSettings(state, i) {\r\n state.courseEditor.showCoursePartSettings = i;\r\n },\r\n setCourseNavBack(state, i) {\r\n state.courseEditor.navBack = i;\r\n },\r\n setCourseNavForward(state, i) {\r\n state.courseEditor.navForward = i;\r\n },\r\n setCourseData(state, i) {\r\n state.courseEditor.courseData = i;\r\n },\r\n setTimeToResetByIdle(state, newT) {\r\n state.courseEditor.timeToResetByIdle = newT;\r\n },\r\n updateCourseEditedLastTime(state) {\r\n var today = new Date();\r\n var date =\r\n today.getFullYear() +\r\n \"-\" +\r\n (today.getMonth() + 1) +\r\n \"-\" +\r\n today.getDate();\r\n var time =\r\n today.getHours() + \":\" + today.getMinutes() + \":\" + today.getSeconds();\r\n var now = date + \" \" + time;\r\n state.courseEditor.currentCourseEditedSaveTime = now;\r\n },\r\n resetCourseEditedSaveTime(state) {\r\n state.courseEditor.currentCourseEditedSaveTime = null;\r\n state.courseEditor.timeToResetByIdle = null;\r\n },\r\n setCurrentCourseId(state, newId) {\r\n // console.log(\"Course is set to:\" + newId)\r\n state.courseEditor.currentCourseId = newId;\r\n },\r\n setUserId(state, newId) {\r\n // console.log(\"Set store state user Id to:\" + newId)\r\n state.user.user_id = newId;\r\n },\r\n setUserName(state, newName) {\r\n // console.log(\"Set store state user Id to:\" + newId)\r\n state.user.username = newName;\r\n },\r\n setUserData(state, i) {\r\n state.user.userData = i;\r\n },\r\n setEditCourse(state, canEditCourse) {\r\n // console.log(\"Set store state permission to edit course:\" + canEditCourse)\r\n state.user.userPerm.editCourse = canEditCourse;\r\n },\r\n setCourseIsEditedBy(state, obj) {\r\n state.courseEditor.currentCourseEditedById = obj.userId;\r\n state.courseEditor.currentCourseEditedByUsername = obj.username;\r\n // console.log(\"Course is edited by id: \" + state.courseEditor.currentCourseEditedById + \" | \" + state.courseEditor.currentCourseEditedByUsername)\r\n if (state.courseEditor.currentCourseEditedById == state.user.user_id) {\r\n //console.log(\"The Editor is YOU!\")\r\n state.courseEditor.previewState = false;\r\n\r\n // Reset lastSavedTime\r\n var today = new Date();\r\n var date =\r\n today.getFullYear() +\r\n \"-\" +\r\n (today.getMonth() + 1) +\r\n \"-\" +\r\n today.getDate();\r\n var time =\r\n today.getHours() +\r\n \":\" +\r\n today.getMinutes() +\r\n \":\" +\r\n today.getSeconds();\r\n var now = date + \" \" + time;\r\n\r\n var timeDiff = state.courseEditor.defaultMinutesToIdle * 60000; // milliseconds = 15 min * 60,0000\r\n // var timeDiff = 0.1 * 60000\r\n var timeToIdle = now;\r\n timeToIdle = Date.parse(timeToIdle) - timeDiff;\r\n\r\n this.commit(\"setTimeToResetByIdle\", timeToIdle);\r\n this.commit(\"updateCourseEditedLastTime\");\r\n }\r\n },\r\n setValiFormSubmission(state, i) {\r\n state.courseEditor.currentValiFormSubmission = i;\r\n },\r\n setUserValidator(state, isValidator) {\r\n // console.log(\"Set store state permission to edit course:\" + canEditCourse)\r\n state.user.isValidator = isValidator;\r\n },\r\n addNumber(state, newNumber) {\r\n // console.log(newNumber)\r\n state.count = newNumber;\r\n },\r\n setEditorPreviewState(state, isOn) {\r\n // console.log(\"Setting preview state: \" + isOn)\r\n state.courseEditor.previewState = isOn; // !state.courseEditor.previewState\r\n },\r\n setUserExamId(state, i) {\r\n // console.log(\"Set UserExam Id:\" + i)\r\n state.courseEditor.userExamId = i;\r\n },\r\n setUserExamData(state, i) {\r\n state.courseEditor.userExamData = i;\r\n },\r\n setUserExamDataStatus(state, i) {\r\n state.courseEditor.userExamData[i.index].Status = i.status;\r\n },\r\n setUserExamDataUserCanEdit(state, i) {\r\n state.courseEditor.userExamData[i.index].UserCanEdit = i.userCanEdit;\r\n },\r\n setUserExamAutoResult(state, i) {\r\n state.courseEditor.userExamAutoResult = i;\r\n },\r\n addToUserExamAutoResult(state, i) {\r\n state.courseEditor.userExamAutoResult += i;\r\n },\r\n setUserExamQuestionCount(state, i) {\r\n state.courseEditor.userExamQuestCnt = i;\r\n },\r\n addCoursePart(state, i) {\r\n state.courseEditor.courseData[\"CourseParts\"].push(i);\r\n },\r\n setNotices(state, i) {\r\n /* console.log(state.user.notices) */\r\n state.user.notices = i;\r\n /* console.log(state.user.notices) */\r\n },\r\n addNotices(state, i) {\r\n for (let cnt = 0; cnt < i.length; cnt++) {\r\n state.user.notices.unshift(i[cnt]);\r\n }\r\n },\r\n setRealName(state, i) {\r\n state.user.realname = i;\r\n },\r\n setUnreadNotices(state, i) {\r\n state.user.unreadNotices = i;\r\n },\r\n setMentorViewCourseAsUser(state, i) {\r\n state.courseEditor.mentorViewCourseAsUser = i;\r\n },\r\n setRouteDenied(state, i) {\r\n state.error.routeDenied = i;\r\n },\r\n setTotalPages(state, i) {\r\n state.courseEditor.pages.total = i;\r\n },\r\n setCurrentPage(state, i) {\r\n state.courseEditor.pages.current = i;\r\n },\r\n setShowCourseNav(state, i) {\r\n // console.log(\"SETTING COURSENAV in Store to:\" + i)\r\n state.courseEditor.showCourseNav = i;\r\n },\r\n setTaskList(state, i) {\r\n state.user.taskList = i;\r\n },\r\n setTaskListAtPos(state, i) {\r\n state.user.taskList[i[\"Pos\"]][\"CompletedDate\"] = i[\"CompletedDate\"];\r\n state.user.taskList[i[\"Pos\"]][\"CompletedByUserId\"] =\r\n i[\"CompletedByUserId\"];\r\n },\r\n addTaskListItem(state, i) {\r\n state.user.taskList.push(i);\r\n },\r\n setMentors(state, i) {\r\n state.courseEditor.courseMentors = i;\r\n },\r\n setEditingUser(state, i) {\r\n state.courseEditor.editingUser = i\r\n },\r\n removeTasks(state, rows) {\r\n for(let cnt=0;cnt
x.Id === rows[cnt].Id);\r\n state.user.taskList.splice(ix,1);\r\n }\r\n },\r\n reloadCourseMenu(state, i) {\r\n console.log(\"Reloading course menu (store)... \" + i + \" \");\r\n state.courseEditor.reloadCourseMenu = i;\r\n },\r\n setUseMentorText(state, i) {\r\n console.log(\"Set New UseMentorText: \" + i);\r\n state.courseEditor.courseData['FooterMentorCopy']['UseCustomText'] = i;\r\n },\r\n setIsEditing(state, i) {\r\n state.courseEditor.isEditing = i;\r\n },\r\n setIsSaving(state, i) {\r\n state.isSaving = i;\r\n },\r\n setTranslations(state, i) {\r\n state.translations = i;\r\n },\r\n setTranslationIndex(state, i) {\r\n // console.log(\"setting index: \", i.index);\r\n state.translations[i.index] = i.obj;\r\n },\r\n setTranslationAtIndex(state, i) {\r\n // console.log(\"setting index: \", i.index);\r\n state.translations[i.index].Content = i.Content;\r\n state.translations[i.index].CreationDate = i.CreationDate;\r\n state.translations[i.index].ModificationDate = i.ModificationDate;\r\n // console.log(\"Data som ska settas: \", i);\r\n },\r\n addTranslation(state, i) {\r\n state.translations.push(i);\r\n },\r\n /*\r\n setMentorsLoaded(state, i) {\r\n state.courseEditor.mentorsLoaded = i\r\n }\r\n*/\r\n\r\n};\r\nconst actions = {\r\n setPageEditActivation({ commit }, iValue) {\r\n commit(\"setPageEditActivation\", iValue);\r\n },\r\n setUser({ commit }, i_routerTo) {\r\n return new Promise((resolve, reject) => {\r\n var token = localStorage.getItem(\"user-token\");\r\n\r\n if(!token) {\r\n resolve();\r\n return;\r\n }\r\n\r\n let accessData = new Object();\r\n \r\n // console.log(\"Set USER in store\");\r\n // console.log(i_routerTo[\"name\"]);\r\n // console.log(\"Id: \" + i_routerTo.params.id);\r\n // console.log(\"Reset Denied!\");\r\n commit(\"setRouteDenied\", null); // reset so we don't show errors\r\n\r\n if (i_routerTo[\"name\"] == \"kurs\" || i_routerTo[\"name\"] == \"/delmoment\") {\r\n // console.log(\"Is user eligable for the course-id:\" + i_routerTo.params.id)\r\n accessData.CourseId = i_routerTo.params.id;\r\n }\r\n\r\n var postData = {\r\n token: token,\r\n access: accessData\r\n }\r\n\r\n var fd = new FormData();\r\n fd.append(\"req\", \"auth_user\");\r\n fd.append(\"data\", JSON.stringify(postData));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/auth.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n // console.log(\"Re-Authorize user on refresh.\");\r\n // console.log(response.data)\r\n\r\n if (response.status === 200) {\r\n if (response.data.status == \"OK\") {\r\n // console.log(response.data.data)\r\n localStorage.user_id = response.data.data[\"Id\"];\r\n localStorage.username = response.data.data[\"Username\"];\r\n localStorage.userType = response.data.data[\"RelatedUserType\"];\r\n localStorage.submissionId = response.data.data[\"SubmissionId\"];\r\n\r\n commit(\"setUserData\", response.data.data); // contains all user data, except password\r\n /*\r\n let a = {\r\n Id: response.data.data[\"SubmissionId\"]\r\n }\r\n commit(\"setValiFormSubmission\", a);\r\n */\r\n\r\n // console.log(response.data.data)\r\n\r\n // Prevent normal users from accessing certain pages!\r\n\r\n if (response.data.data[\"RelatedUserType\"] == 1) {\r\n // console.log(\"page: \" + i_routerTo[\"name\"]);\r\n if (\r\n i_routerTo[\"name\"] == \"KursLista\" ||\r\n i_routerTo[\"name\"] == \"Akter\" ||\r\n i_routerTo[\"name\"] == \"Akter/\" ||\r\n i_routerTo[\"name\"] == \"Användare\" ||\r\n i_routerTo[\"name\"] == \"Användare/\" ||\r\n i_routerTo[\"name\"] == \"To do\" ||\r\n i_routerTo[\"name\"] == \"To do/\" ||\r\n i_routerTo[\"name\"] == \"Versionshistorik\"\r\n ) {\r\n console.log(\"Normal user should NOT have access to this page...\");\r\n\r\n commit(\"setRouteDenied\", \"Du har tyvärr ingen behörighet till sidan.\");\r\n\r\n resolve();\r\n return;\r\n }\r\n }\r\n \r\n if(response.data.data.RelatedUserType==1) {\r\n if (response.data.CourseAccess !== undefined) {\r\n if (response.data.CourseAccess == 0) {\r\n // console.log(\"Du har inte behörighet till kurs med id:\" + i_routerTo.params.id);\r\n commit(\"setRouteDenied\", \"Du har tyvärr ingen behörighet till kurs med id:\" + i_routerTo.params.id);\r\n resolve();\r\n return;\r\n }\r\n } \r\n /* else {\r\n commit(\"setRouteDenied\", null); // reset so we don't show errors\r\n }\r\n */ \r\n } \r\n\r\n // localStorage.post_id = -1 // reset since we are NOT editing a sub-post\r\n // console.log(\"User Exam Id from server:\")\r\n // console.log(response.data[\"userExamId\"])\r\n if (response.data[\"userExamId\"] != null) {\r\n commit(\"setUserExamId\", response.data[\"userExamId\"]);\r\n }\r\n\r\n // this.$store.state.user.user_id = response.data.data[\"Id\"]\r\n commit(\"setUserId\", response.data.data[\"Id\"]);\r\n commit(\"setUserName\", response.data.data[\"Username\"]);\r\n commit(\r\n \"setRealName\",\r\n response.data.data[\"FirstName\"] +\r\n \" \" +\r\n response.data.data[\"LastName\"]\r\n );\r\n\r\n commit(\"setUserValidator\", true); // init var\r\n commit(\"setEditCourse\", false); // init var\r\n\r\n // Set userPermissions (Show or hide certain UI elements, depending on userType)\r\n if (response.data.data[\"RelatedUserType\"] == 2 || response.data.data[\"RelatedUserType\"] == 3) {\r\n // Superadmin / Webadmin\r\n commit(\"setEditCourse\", true);\r\n commit(\"setUserValidator\", false);\r\n } \r\n else if(response.data.data[\"RelatedUserType\"] == 4) {\r\n commit(\"setUserValidator\", false);\r\n\r\n if(response.data.CanEdit=='1') {\r\n commit(\"setEditCourse\", true);\r\n } else {\r\n commit(\"setEditCourse\", false);\r\n }\r\n }\r\n\r\n // console.log(response.data.data)\r\n /* localStorage.setItem(\"user-token\", JSON.stringify(response.data.data)); */\r\n // router.push('/Validering')\r\n resolve();\r\n } else {\r\n // console.log(\"FAIL...\" + response.data.result);\r\n localStorage.removeItem(\"user-token\");\r\n localStorage.removeItem(\"username\");\r\n localStorage.removeItem(\"avatar\");\r\n delete axios.defaults.headers.common[\"Authorization\"];\r\n\r\n commit(\"setRouteDenied\", response.data.result);\r\n\r\n resolve();\r\n }\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n reject();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n\r\n /*\r\n axios\r\n .get(`${state.api}user`)\r\n .then(response => {\r\n commit('setUserData', response.data);\r\n resolve();\r\n })\r\n .catch(() => {\r\n reject();\r\n });\r\n */\r\n });\r\n }, // setUser END\r\n activateCourseEdit({ commit, state }) {\r\n return new Promise((resolve, reject) => {\r\n // check if course is locked by other user\r\n var fd = new FormData();\r\n fd.append(\"req\", \"lock_course_for_editing\");\r\n\r\n let postData = {\r\n CourseId: state.courseEditor.currentCourseId,\r\n CoursePartId: state.courseEditor.currCoursePostId\r\n };\r\n\r\n fd.append(\"data\", JSON.stringify(postData));\r\n\r\n // const vm = this\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/course_lock.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n // console.log(response)\r\n\r\n if (response.status === 200) {\r\n if (response.data.status == \"OK\") {\r\n commit(\"setEditorPreviewState\", false);\r\n commit(\"setIsEditing\", true);\r\n\r\n commit(\"setCourseIsEditedBy\", {\r\n userId: state.user.user_id,\r\n username: state.user.username,\r\n });\r\n //commit(\"updateCourseEditedLastTime\");\r\n\r\n resolve();\r\n } else {\r\n \r\n console.log(response.data.data);\r\n\r\n commit(\"setCourseIsEditedBy\", {\r\n userId: response.data.data.RelatedUserId,\r\n username: response.data.data.Username,\r\n });\r\n // console.log(\"Noooo\")\r\n resolve();\r\n }\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n });\r\n }, // activateCourseEditing END\r\n closeCourseEdit({ commit, state }, vm) {\r\n let courseId = -1;\r\n let coursePartId = -1;\r\n\r\n if(vm) {\r\n courseId = vm.CourseId;\r\n coursePartId = vm.CoursePartId;\r\n } else {\r\n courseId = state.courseEditor.currentCourseId;\r\n coursePartId = state.courseEditor.currCoursePostId;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n let err = false;\r\n commit(\"setCourseIsEditedBy\", { userId: null, username: null });\r\n commit(\"setEditorPreviewState\", true);\r\n commit(\"setIsEditing\", false);\r\n commit(\"setShowCoursePartSettings\", false);\r\n commit(\"resetCourseEditedSaveTime\");\r\n\r\n var fd = new FormData();\r\n fd.append(\"req\", \"close_course_for_editing\");\r\n\r\n let postData = {\r\n CourseId: courseId,\r\n CoursePartId: coursePartId\r\n };\r\n\r\n fd.append(\"data\", JSON.stringify(postData));\r\n\r\n // const vm = this\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/course_lock.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n // console.log(response)\r\n\r\n if (response.status === 200) {\r\n resolve();\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n err = true;\r\n });\r\n if (err) reject();\r\n });\r\n }, // activateCourseEditing END\r\n updateIdleTime({ commit, state }, vm) {\r\n return new Promise((resolve) => {\r\n if (state.courseEditor.previewState == false) {\r\n var today = new Date();\r\n var date =\r\n today.getFullYear() +\r\n \"-\" +\r\n (today.getMonth() + 1) +\r\n \"-\" +\r\n today.getDate();\r\n var time =\r\n today.getHours() +\r\n \":\" +\r\n today.getMinutes() +\r\n \":\" +\r\n today.getSeconds();\r\n var now = date + \" \" + time;\r\n\r\n var timeDiff = state.courseEditor.defaultMinutesToIdle * 60000; // milliseconds = 15 min * 60,0000\r\n // var timeDiff = 0.1 * 60000\r\n var timeToIdle = now;\r\n timeToIdle = Date.parse(timeToIdle) - timeDiff;\r\n commit(\"setTimeToResetByIdle\", timeToIdle);\r\n\r\n if (state.courseEditor.currentCourseEditedSaveTime != null) {\r\n // console.log(\"Eval if user is idle.\");\r\n if (\r\n Date.parse(state.courseEditor.currentCourseEditedSaveTime) <\r\n Date.parse(now) - timeDiff\r\n ) {\r\n // You have been idle for too long, Kick user from editing ;)\r\n commit(\"setShowCoursePartSettings\", false);\r\n vm.$store.dispatch(\"closeCourseEdit\").then(() => {\r\n // console.log(\"Coffee break sent you to preview-mode.\");\r\n // vm.$snackbar.show(\"Redigering stängdes pga inaktivitet.\", {duration: -1})\r\n vm.$toast(\"Redigering stängdes pga inaktivitet.\");\r\n });\r\n }\r\n }\r\n }\r\n\r\n resolve();\r\n });\r\n },\r\n loadCourse({ commit, state }) {\r\n return new Promise((resolve, reject) => {\r\n var fd = new FormData();\r\n fd.append(\"req\", \"get_course\");\r\n\r\n let postData = {\r\n UserId: state.user.user_id,\r\n CourseId: state.courseEditor.currentCourseId\r\n };\r\n\r\n postData.RelatedUserType = 1;\r\n \r\n if (state.user.userPerm.editCourse == true) {\r\n // Only admins will get MentorMaterial\r\n postData.RelatedUserType = 2;\r\n }\r\n\r\n fd.append(\"data\", JSON.stringify(postData));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/course_data.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n // console.log(response.data.data)\r\n\r\n if (response.status === 200) {\r\n // Is Locked?\r\n let courseData = response.data.data[0];\r\n\r\n // Is user surfing the course overview page?\r\n\r\n if(state.courseEditor.currCoursePostId == -1) {\r\n // setup who is editing this course (if anyone)\r\n if (courseData[\"LockedByUserId\"] != null) {\r\n let lockData = {\r\n userId: courseData[\"LockedByUserId\"],\r\n username: courseData[\"LockedByUsername\"],\r\n };\r\n commit(\"setCourseIsEditedBy\", lockData);\r\n // commit(\"setIsEditing\", true);\r\n /*\r\n if(response.data.IsEditing==true) {\r\n // console.log(\"Du är redaktör för denna post just NU!\");\r\n this.$store.dispatch(\"setCourseEditing\").then(\r\n (response) => {\r\n // console.log(\"preview state is: \" + this.$store.state.everything.courseEditor.previewState);\r\n },\r\n (error) => {\r\n console.log(error.response);\r\n }\r\n );\r\n }\r\n */\r\n\r\n } else {\r\n commit(\"setCourseIsEditedBy\", { userId: null, username: null });\r\n commit(\"setEditorPreviewState\", true);\r\n commit(\"setIsEditing\", false);\r\n }\r\n \r\n }\r\n\r\n // SETUP ACTIVE MENU ITEM in PartCourseMenu (App-root)\r\n // console.log(\"curr-post:\" + state.courseEditor.currCoursePostId)\r\n\r\n var nId = state.courseEditor.currCoursePostId;\r\n // console.log(courseData['CourseParts'])\r\n\r\n let foundNavPos = false;\r\n let totalPages = 1; // include the course overview as page 1\r\n let currPage = 1;\r\n\r\n if (nId == -1) {\r\n foundNavPos = true;\r\n }\r\n\r\n /*\r\n let a = courseData['CourseParts'].map(function(x) {return x.Id; }).indexOf(nId)\r\n\r\n if(a!=-1) {\r\n console.log(\"page is: \" + a)\r\n courseData['CourseParts'][a].active = true\r\n foundNavPos = true\r\n currPage += a+1\r\n }\r\n */\r\n\r\n // if(foundNavPos == false) {\r\n for (let cnt = 0; cnt < courseData[\"CourseParts\"].length; cnt++) {\r\n totalPages++;\r\n // console.log(totalPages)\r\n\r\n if (!foundNavPos) {\r\n currPage++;\r\n }\r\n\r\n let blocksWithPost = courseData[\"CourseParts\"][cnt][\r\n \"Blocks\"\r\n ].filter((x) => x.PostType !== null);\r\n // console.log(\"B with posts: \" + blocksWithPost.length)\r\n totalPages += blocksWithPost.length;\r\n\r\n if (courseData[\"CourseParts\"][cnt].Id == nId) {\r\n // console.log(\"page is: \" + nId)\r\n courseData[\"CourseParts\"][cnt].active = true;\r\n foundNavPos = true;\r\n }\r\n\r\n // let o = courseData['CourseParts'][cnt][\"Blocks\"].map(function(x) {return x.PostId; }).indexOf(nId)\r\n\r\n if (!foundNavPos) {\r\n // let o = courseData['CourseParts'][cnt][\"Blocks\"].map(function(x) {return x.PostId; }).indexOf(nId)\r\n // console.log(courseData['CourseParts'][cnt][\"Blocks\"])\r\n let postCnt = 0;\r\n\r\n for (let cnt2 = 0; cnt2 < blocksWithPost.length; cnt2++) {\r\n postCnt++;\r\n // console.log(\"postcnt: \" + postCnt)\r\n if (blocksWithPost[cnt2].PostId == nId) {\r\n courseData[\"CourseParts\"][cnt].active = true; // PartCourse\r\n blocksWithPost[cnt2].active = true; // Actual post\r\n foundNavPos = true;\r\n currPage += postCnt;\r\n }\r\n }\r\n\r\n if (!foundNavPos) {\r\n currPage += postCnt;\r\n }\r\n\r\n /*\r\n let blocksWithPost = courseData['CourseParts'][cnt][\"Blocks\"].filter(x => x.PostType!==null)\r\n let nrOfPosts = courseData['CourseParts'][cnt][\"Blocks\"].filter(x => x.PostType!==null).length\r\n\r\n console.log(\"Blocks w posts:\")\r\n console.log(blocksWithPost)\r\n console.log(\"Amount of posts: \" + nrOfPosts)\r\n\r\n if(o!=-1) {\r\n // console.log(\"post is:\" + o)\r\n courseData['CourseParts'][cnt].active = true // PartCourse\r\n courseData['CourseParts'][cnt][\"Blocks\"][o].active = true // Actual post\r\n foundNavPos = true\r\n currPage += o+1\r\n // break\r\n } else {\r\n if(!foundNavPos) {\r\n currPage += nrOfPosts\r\n }\r\n }\r\n */\r\n }\r\n // console.log(\"Currpage: \" + currPage)\r\n }\r\n // }\r\n\r\n commit(\"setTotalPages\", totalPages);\r\n commit(\"setCurrentPage\", currPage);\r\n\r\n /* console.log(\"found nav? \" + foundNavPos)\r\n console.log(\"Pages: \" + totalPages)\r\n console.log(\"CurrPage: \" + currPage)\r\n */\r\n\r\n commit(\"setCourseData\", courseData);\r\n\r\n // console.log(courseData)\r\n\r\n // Setup Page Navigation Forward / Backward.\r\n this.dispatch(\"setPageNavDirections\")\r\n .then(() => {\r\n // console.log(\"Coffee break while setting up pageNavDirections...\");\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n\r\n resolve();\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n });\r\n },\r\n setPageNavDirections({ commit, state }) {\r\n let cp = state.courseEditor.courseData[\"CourseParts\"];\r\n let prevId = false;\r\n let currIdSetCnt = false;\r\n let nextId = false;\r\n // console.log(\"vm.id:\" + vm.id)\r\n\r\n // vm.id bytes ut mot state.courseEditor.currCoursePostId (eftersom vi redan har detta variabel i STORE)\r\n if (state.courseEditor.currCoursePostId == -1) {\r\n // this.$store.commit(\"setCurrPostId\", i_postId)\r\n // this.$router.push('/kurs/' + this.$store.state.courseEditor.currentCourseId + '/post/' + i_postId)\r\n if (state.courseEditor.courseData[\"CourseParts\"].length != 0) {\r\n nextId = state.courseEditor.courseData[\"CourseParts\"][0][\"Id\"];\r\n }\r\n\r\n prevId = false;\r\n // prevId =\r\n } else {\r\n // console.log(\"in\")\r\n // First find where we are atm.\r\n for (let cnt = 0; cnt < cp.length; cnt++) {\r\n let a = cp[cnt];\r\n /* console.log(\"cnt:\" + cnt)\r\n console.log(\"currIdSetCnt:\" + currIdSetCnt)\r\n console.log(\"compare ids\" + a[\"Id\"] + \" vs \" + state.courseEditor.currCoursePostId) */\r\n\r\n if (a[\"Id\"] == state.courseEditor.currCoursePostId) {\r\n currIdSetCnt = cnt;\r\n // console.log(\"(a)Found currId at cnt:\" + currIdSetCnt)\r\n if (cnt == 0) {\r\n // console.log(\"First - prevId = \" + state.courseEditor.currentCourseId)\r\n prevId = state.courseEditor.currentCourseId;\r\n }\r\n } else if (currIdSetCnt !== false) {\r\n // console.log(\"(a)Set nextId:\" + a[\"Id\"])\r\n nextId = a[\"Id\"];\r\n break;\r\n } else {\r\n if (prevId === false) {\r\n // console.log(\"(a)PrevId set:\" + a[\"Id\"])\r\n prevId = a[\"Id\"];\r\n }\r\n }\r\n\r\n if (currIdSetCnt === false) {\r\n // console.log(\"(a)PrevId set:\" + a[\"Id\"])\r\n prevId = a[\"Id\"];\r\n }\r\n\r\n // console.log(cp[cnt])\r\n\r\n for (let cnt2 = 0; cnt2 < a[\"Blocks\"].length; cnt2++) {\r\n let b = a[\"Blocks\"][cnt2];\r\n // console.log(b)\r\n\r\n if (b[\"BlockType\"] == \"Post\") {\r\n //console.log(\"Block is Post with PostID:\" + b[\"PostId\"])\r\n if (b[\"PostId\"] == state.courseEditor.currCoursePostId) {\r\n currIdSetCnt = cnt2;\r\n // console.log(\"(b)Found currId: \" + b[\"PostId\"] + \" at cnt2:\" + currIdSetCnt)\r\n } else if (currIdSetCnt !== false) {\r\n // console.log(\"(b)Set nextId:\" + b[\"PostId\"])\r\n nextId = b[\"PostId\"];\r\n break;\r\n }\r\n\r\n if (currIdSetCnt === false) {\r\n // console.log(\"PrevId set:\" + b[\"PostId\"])\r\n prevId = b[\"PostId\"];\r\n // console.log(\"prevId set to \" + prevId)\r\n }\r\n }\r\n }\r\n\r\n if (prevId && nextId) break;\r\n }\r\n }\r\n\r\n /* console.log(\"CourseId: \" + state.courseEditor.currentCourseId)\r\n console.log(\"PostId: \" + state.courseEditor.currCoursePostId)\r\n console.log(\"PrevId: \" + prevId)\r\n console.log(\"NextId: \" + nextId) */\r\n\r\n commit(\"setCourseNavBack\", prevId);\r\n commit(\"setCourseNavForward\", nextId);\r\n },\r\n activateUserExam({ commit, state }) {\r\n return new Promise((resolve, reject) => {\r\n // console.log(\"wohooohaaa!\")\r\n var fd = new FormData();\r\n fd.append(\"req\", \"get_user_exam\");\r\n\r\n let postData = {\r\n UserExamId: state.courseEditor.userExamId,\r\n UserId: state.user.user_id,\r\n Username: state.user.username,\r\n CourseId: state.courseEditor.currentCourseId,\r\n };\r\n\r\n fd.append(\"data\", JSON.stringify(postData));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/user_exam.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n // console.log(\"User EXAM DATA ABOUT TO BE SET\")\r\n // console.log(response.data.data)\r\n\r\n if (response.status === 200) {\r\n // console.log(\"Done fetching userExam.\")\r\n commit(\"setUserExamData\", response.data.data);\r\n /* \r\n if(Array.isArray(response.data.data)) {\r\n if(response.data.data[0] !== undefined) { // [\"ResultFromAutoCorrect\"]\r\n commit(\"setUserExamAutoResult\", response.data.data[0][\"ResultFromAutoCorrect\"])\r\n }\r\n }\r\n */\r\n\r\n resolve();\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n }); // end of return promise\r\n },\r\n updateCoursePartData({ state }, vm) {\r\n return new Promise((resolve) => {\r\n // console.log(\"updatingCoursePart...\")\r\n // console.log(vm.post)\r\n for (\r\n let cnt = 0;\r\n cnt < state.courseEditor.courseData[\"CourseParts\"].length;\r\n cnt++\r\n ) {\r\n let a = state.courseEditor.courseData[\"CourseParts\"][cnt];\r\n /* console.log(a[\"Id\"])\r\n console.log(a)\r\n console.log(\"compare with post id: \" + vm.post.Id) */\r\n if (a[\"Id\"] == vm.post.Id) {\r\n state.courseEditor.courseData[\"CourseParts\"][cnt][\"Name\"] =\r\n vm.post.Name;\r\n console.log(\"CoursePart name update: \" + vm.post.Name);\r\n // console.log(\"Blocks in store: \")\r\n // console.log(state.courseEditor.courseData[\"CourseParts\"][cnt][\"Blocks\"])\r\n\r\n // console.log(\"New BlockData from vm: \")\r\n // console.log(vm.blockData)\r\n for (\r\n let b = 0;\r\n b <\r\n state.courseEditor.courseData[\"CourseParts\"][cnt][\"Blocks\"]\r\n .length;\r\n b++\r\n ) {\r\n let ba =\r\n state.courseEditor.courseData[\"CourseParts\"][cnt][\"Blocks\"][b];\r\n ba[\"Title\"] = vm.blockData[b][\"title\"];\r\n ba[\"PostName\"] = vm.blockData[b][\"title\"];\r\n // console.log(\"New title is: \" + vm.blockData[b][\"title\"])\r\n }\r\n } else {\r\n // Editing a post - post title to store data.\r\n for (\r\n let c = 0;\r\n c <\r\n state.courseEditor.courseData[\"CourseParts\"][cnt][\"Blocks\"]\r\n .length;\r\n c++\r\n ) {\r\n let ca =\r\n state.courseEditor.courseData[\"CourseParts\"][cnt][\"Blocks\"][c];\r\n if (ca[\"PostId\"] == vm.post.Id) {\r\n ca[\"Title\"] = vm.post[\"Name\"];\r\n ca[\"PostName\"] = vm.post[\"Name\"];\r\n }\r\n }\r\n }\r\n }\r\n resolve();\r\n });\r\n },\r\n updateCourseData({ state }, vm) {\r\n return new Promise((resolve) => {\r\n state.courseEditor.courseData[\"Name\"] = vm.courseData[0][\"name\"];\r\n state.courseEditor.courseData[\"Settings\"] = JSON.parse(JSON.stringify(vm.courseData[0][\"Settings\"]));\r\n resolve();\r\n });\r\n },\r\n loadFile({ state }) {\r\n return new Promise((resolve, reject) => {\r\n var fd = new FormData();\r\n fd.append(\"req\", \"get_user_exam\");\r\n\r\n let postData = {\r\n UserExamId: state.courseEditor.userExamId,\r\n UserId: state.user.user_id,\r\n Username: state.user.username,\r\n CourseId: state.courseEditor.currentCourseId,\r\n };\r\n\r\n fd.append(\"data\", JSON.stringify(postData));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/user_exam.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n // console.log(response.data.data)\r\n\r\n if (response.status === 200) {\r\n console.log(\"Done fetching userExam.\");\r\n // commit(\"setUserExamData\", response.data.data)\r\n\r\n resolve();\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n }); // end of return promise\r\n },\r\n makeCourseImageBlockIfNotExists({ state }) {\r\n return new Promise((resolve, reject) => {\r\n var fd = new FormData();\r\n fd.append(\"req\", \"makeCourseImageBlockIfNotExists\");\r\n\r\n let postData = {\r\n CourseId: state.courseEditor.currentCourseId,\r\n };\r\n\r\n fd.append(\"data\", JSON.stringify(postData));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/course_admin.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n\r\n if (response.status === 200) {\r\n resolve();\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n });\r\n },\r\n getTasks({ commit, state }, i) {\r\n return new Promise((resolve, reject) => {\r\n var fd = new FormData();\r\n fd.append(\"req\", \"get_tasks\");\r\n\r\n let postData = {\r\n UserId: state.user.user_id,\r\n Condition: null,\r\n isTrash:0\r\n };\r\n\r\n if(i.trash==1) {\r\n postData.isTrash = 1;\r\n }\r\n\r\n if(i.condition !== undefined) {\r\n postData.Condition = i.condition;\r\n }\r\n\r\n if(i.courseId !== undefined) {\r\n postData.CourseId = i.course_id;\r\n }\r\n\r\n fd.append(\"data\", JSON.stringify(postData));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/tasks.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n\r\n if (response.status === 200) {\r\n if (response.data) {\r\n // console.log(response.data.data)\r\n commit(\"setTaskList\", response.data.data);\r\n }\r\n resolve();\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n });\r\n },\r\n createTask({ commit, state }, o) {\r\n return new Promise((resolve, reject) => {\r\n // Find task and update it accordingly\r\n var fd = new FormData();\r\n fd.append(\"req\", \"create_task\");\r\n\r\n // console.log(\"Skapa task:\")\r\n // console.log(o)\r\n\r\n let postData = {\r\n Task: o.task,\r\n };\r\n\r\n fd.append(\"data\", JSON.stringify(postData));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/tasks.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n\r\n if (response.status === 200) {\r\n // console.log(response)\r\n resolve(response.data.createTask.data[\"Id\"]);\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n });\r\n },\r\n updateTask({ commit, state }, o) {\r\n return new Promise((resolve, reject) => {\r\n // let task = o.task\r\n // let context = o.context\r\n\r\n // Find task and update it accordingly\r\n var fd = new FormData();\r\n fd.append(\"req\", \"update_task\");\r\n\r\n let orgNr = state.user.userData.NationalRegistrationNumber;\r\n orgNr = orgNr.substring(0,6);\r\n\r\n let postData = {\r\n UserId: state.user.user_id,\r\n UserRealName: state.user.realname,\r\n NationalRegistrationNumber: orgNr,\r\n CourseName: o.courseName,\r\n Task: o.task,\r\n };\r\n\r\n if (o.task.SetCompleted == 1) {\r\n if (o.task[\"TaskType\"] == 1) {\r\n postData.EventStartDate = o.eventStartDate;\r\n }\r\n }\r\n\r\n fd.append(\"data\", JSON.stringify(postData));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/tasks.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n\r\n if (response.status === 200) {\r\n // console.log(response)\r\n if (response.data) {\r\n // console.log(\"After save task: \");\r\n // console.log(response.data)\r\n\r\n /*\r\n let elementPos = null;\r\n //Insert new task in taskList\r\n if (o.task.SetCompleted == 1) {\r\n if (o.task[\"TaskType\"] == 1) {\r\n commit(\"addTaskListItem\", response.data.createTask.data);\r\n }\r\n\r\n // Find old task and update its completedDate etc\r\n \r\n elementPos = state.user.taskList\r\n .map(function(x) {\r\n return x.Id;\r\n })\r\n .indexOf(o.task[\"Id\"]);\r\n \r\n \r\n let a = {\r\n Pos: elementPos,\r\n CompletedDate: response.data.data[\"CompletedDate\"],\r\n CompletedByUserId: response.data.data[\"CompletedByUserId\"],\r\n };\r\n\r\n commit(\"setTaskListAtPos\", a);\r\n \r\n } else if (o.task.SetCompleted == 0) {\r\n elementPos = state.user.taskList\r\n .map(function(x) {\r\n return x.Id;\r\n })\r\n .indexOf(o.task[\"Id\"]);\r\n\r\n let a = {\r\n Pos: elementPos,\r\n CompletedDate: null,\r\n CompletedByUserId: null,\r\n };\r\n\r\n commit(\"setTaskListAtPos\", a);\r\n \r\n }\r\n */\r\n }\r\n resolve();\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n });\r\n },\r\n gotoUserExamAsMentor({ commit, state }, i) {\r\n // Goto user_exam as mentor\r\n let targetPath = \"/kurs/\" + i.obj.CourseId;\r\n\r\n // console.log(\"set aprtcourse id to:\" + i.obj.CoursePartId)\r\n if (i.obj.CoursePartId != null) {\r\n targetPath += \"/post/\" + i.obj.CoursePartId;\r\n commit(\"setCurrPostId\", i.obj.CoursePartId);\r\n } else {\r\n commit(\"setCurrPostId\", -1);\r\n }\r\n\r\n // console.log(i.obj)\r\n\r\n var subObj = {\r\n Id: i.obj.SubmissionId,\r\n RelatedUserID: i.obj.UserId,\r\n FirstName: i.obj.FirstName,\r\n LastName: i.obj.LastName,\r\n };\r\n\r\n commit(\"setCurrentCourseId\", i.obj.CourseId);\r\n\r\n commit(\"setMentorViewCourseAsUser\", i.obj.UserId);\r\n commit(\"setValiFormSubmission\", subObj);\r\n\r\n localStorage.mentorViewCourseAsUser = i.obj.UserId;\r\n localStorage.setItem(\"valiFormSubmission\", JSON.stringify(subObj));\r\n\r\n // console.log(i.route)\r\n if (targetPath == i.route.path) {\r\n // console.log(\"Already here!\")\r\n i.router.go();\r\n } else {\r\n i.router.push(targetPath);\r\n }\r\n },\r\n getMentors({ commit, state }) {\r\n return new Promise((resolve, reject) => {\r\n let dt = {\r\n CourseId: state.courseEditor.courseData[\"Id\"],\r\n PostType: \"course\",\r\n UserId: state.user.userData.Id\r\n };\r\n\r\n var fd = new FormData();\r\n fd.append(\"req\", \"get_mentors\");\r\n fd.append(\"data\", JSON.stringify(dt));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/mentors.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n\r\n if (response.status === 200) {\r\n commit(\"setMentors\", response.data.data);\r\n /* console.log(\"Mentors set.\")\r\n console.log(state.courseEditor.courseMentors) */\r\n resolve();\r\n }\r\n reject();\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n });\r\n },\r\n addFooterMentorCopy({ commit, state }) {\r\n return new Promise((resolve, reject) => {\r\n let dt = {\r\n CourseId: state.courseEditor.courseData[\"Id\"],\r\n UserId: state.user.userData.Id\r\n };\r\n\r\n var fd = new FormData();\r\n fd.append(\"req\", \"addFooterMentorCopy\");\r\n fd.append(\"data\", JSON.stringify(dt));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/course_data.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n\r\n if (response.status === 200) {\r\n if(response.data.data!=='undefined') { // New footer-row created\r\n resolve({reloadPage: true});\r\n }\r\n resolve();\r\n }\r\n reject();\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n });\r\n },\r\n setCourseEditing({commit, state}) {\r\n return new Promise((resolve, reject) => {\r\n console.log(\"Set post edit mode.\");\r\n\r\n commit(\"setEditorPreviewState\", false);\r\n commit(\"setIsEditing\", true);\r\n commit(\"setCourseIsEditedBy\", {\r\n userId: state.user.user_id,\r\n username: state.user.username,\r\n });\r\n resolve();\r\n });\r\n },\r\n logout({commit, state}, i) {\r\n\r\n var fd = new FormData();\r\n fd.append(\"req\", \"log_out\");\r\n fd.append(\"data\", JSON.stringify({ token: localStorage.getItem(\"user-token\") }));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/login.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n\r\n if (response.status === 200) {\r\n console.log(\"You logged out from the server.\");\r\n commit('setPageEditActivation', false);\r\n commit(\"setServerDateTime\", null);\r\n commit(\"setUserId\", 0);\r\n commit(\"setNotices\", []); \r\n commit(\"setCorrespondance\", null);\r\n \r\n localStorage.removeItem(\"user-token\");\r\n delete axios.defaults.headers.common[\"Authorization\"];\r\n var tmpTitle = localStorage.getItem(\"apptitle\"); // preserve app title\r\n localStorage.clear();\r\n if (tmpTitle) {\r\n localStorage.setItem(\"apptitle\", tmpTitle);\r\n }\r\n \r\n i.toast(\"Du är nu utloggad!\");\r\n i.router.push('/Login');\r\n\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n });\r\n\r\n // $router.push({ path: '/login', query: { logout: 'true' } });\r\n },\r\n insertTranslationContent({ commit, state }, i) {\r\n return new Promise((resolve, reject) => {\r\n commit(\"addTranslation\", i);\r\n let index = state.translations.map(item => item.Key).indexOf(i.Key);\r\n resolve(index);\r\n });\r\n },\r\n setTranslationFromLocalStorage({commit, state}, iObj) {\r\n return new Promise((resolve, reject) => {\r\n // let index = state.translations.map(item => item.Key).indexOf(i.Key);\r\n let data = [];\r\n let locText = localStorage.getItem(\"translations\");\r\n let obj = null;\r\n let i = -1;\r\n\r\n if(locText) {\r\n data = JSON.parse(locText);\r\n obj = data.find(o => o.Key === iObj.Key);\r\n\r\n if(obj!=null) {\r\n // console.log(\"obj found:\", obj);\r\n i = state.translations.map(item => item.Key).indexOf(iObj.Key);\r\n // console.log(\"setting from localStore to store index: \", i);\r\n \r\n var g = {};\r\n g.index = i;\r\n g.Content = obj.Content;\r\n g.CreationDate = obj.CreationDate;\r\n g.ModificationDate = obj.ModificationDate;\r\n\r\n // console.log(g);\r\n\r\n commit(\"setTranslationAtIndex\", g);\r\n // console.log(\"Store after:\", state.translations);\r\n // console.log(\"ret true...\");\r\n\r\n resolve(true);\r\n }\r\n resolve(false);\r\n }\r\n\r\n resolve(false);\r\n });\r\n },\r\n setTranslationFromServer({commit, state}, iObj) {\r\n return new Promise((resolve, reject) => {\r\n \r\n // LOCALSTORAGE\r\n\r\n let data = [];\r\n let locText = localStorage.getItem(\"translations\");\r\n let obj = null;\r\n let i = -1;\r\n let locIndex = -1;\r\n\r\n if(locText) {\r\n data = JSON.parse(locText);\r\n // obj = data.find(o => o.Key === iObj.Key);\r\n locIndex = data.map(item => item.Key).indexOf(iObj.Key);\r\n }\r\n\r\n if(locIndex === -1) {\r\n //console.log(\"Adding obj to localStorage!\");\r\n data.push(iObj);\r\n } else {\r\n //console.log(\"Updating obj in localStorage!\");\r\n data[locIndex] = iObj;\r\n }\r\n\r\n let setTrans = localStorage.setItem(\"translations\", JSON.stringify(data));\r\n\r\n // STORE\r\n i = state.translations.map(item => item.Key).indexOf(iObj.Key);\r\n // console.log(\"Setting translation data from server to store index: \", i);\r\n \r\n var g = {};\r\n g.index = i;\r\n g.Content = iObj.Content;\r\n g.CreationDate = iObj.CreationDate;\r\n g.ModificationDate = iObj.ModificationDate;\r\n\r\n commit(\"setTranslationAtIndex\", g);\r\n // console.log(\"Store after:\", state.translations);\r\n // console.log(\"ret true...\");\r\n\r\n resolve(true);\r\n });\r\n },\r\n updateTranslationContent({ commit, state }, i) {\r\n let index = state.translations.map(item => item.Key).indexOf(i.Key);\r\n // console.log(\"Updating translation-index: \", index);\r\n\r\n var g = {};\r\n g.index = index;\r\n g.Content = i.Content;\r\n g.CreationDate = i.CreationDate;\r\n g.ModificationDate = i.ModificationDate;\r\n\r\n commit(\"setTranslationContentAtIndex\", g);\r\n \r\n let data = [];\r\n let locText = localStorage.getItem(\"translations\");\r\n let obj = null;\r\n\r\n if(locText) {\r\n data = JSON.parse(locText);\r\n }\r\n\r\n var tObj = {};\r\n tObj.Content = i.Content;\r\n tObj.CreationDate = i.CreationDate;\r\n tObj.ModificationDate = i.ModificationDate;\r\n\r\n let locIndex = data.map(item => item.Key).indexOf(i.Key);\r\n\r\n if(locIndex === -1) {\r\n //console.log(\"Adding obj to localStorage!\");\r\n data.push(tObj);\r\n } else {\r\n //console.log(\"Updating obj in localStorage!\");\r\n data[locIndex] = tObj;\r\n }\r\n\r\n let setTrans = localStorage.setItem(\"translations\", JSON.stringify(data));\r\n \r\n },\r\n courseProgressUpdate({ commit, state }, i) {\r\n return new Promise((resolve, reject) => {\r\n let dt = {\r\n CourseId: state.courseEditor.courseData[\"Id\"],\r\n CoursePartId: state.courseEditor.currCoursePostId\r\n };\r\n\r\n var fd = new FormData();\r\n fd.append(\"req\", \"updateCourseProgressVideoPlay\");\r\n fd.append(\"data\", JSON.stringify(dt));\r\n\r\n axios\r\n .post(window.serverUrl + \"/api/backend/course_progress.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n\r\n if (response.status === 200) {\r\n if(response.data.addedProgress) {\r\n // update the progressbar\r\n //console.log(\"wohoo\");\r\n let progress_percent = response.data.data[0].progress_percent;\r\n // console.log(progress_percent);\r\n state.courseEditor.courseData.progress_percent = progress_percent;\r\n // console.log(state.courseEditor.courseData);\r\n }\r\n resolve();\r\n }\r\n reject();\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n });\r\n }\r\n\r\n \r\n};\r\nexport default { namespaced: false, state, getters, mutations, actions };","import Vue from \"vue\";\r\nimport axios from \"axios\";\r\n\r\nconst state = {\r\n notifications: {\r\n active: true,\r\n showNoticeCenter: false,\r\n showDialogMenu: false,\r\n dialogMenuPos: { x: 0, y: 0 },\r\n sendEmail: false,\r\n message: \"\",\r\n title: \"\",\r\n targetUserId: null,\r\n targetUserEmail: null,\r\n targetUserName: null,\r\n correspondance: null,\r\n serverDateTime: null,\r\n sendMessageAsEmailConfirmDialog:false,\r\n messageIdToEmail:null,\r\n },\r\n};\r\nconst getters = {\r\n};\r\nconst mutations = {\r\n setShowNoticeCenter(state, i) {\r\n state.notifications.showNoticeCenter = i;\r\n },\r\n setMessage(state, i) {\r\n state.notifications.message = i;\r\n },\r\n setMessageTitle(state, i) {\r\n state.notifications.title = i;\r\n },\r\n setMessageTargetUserId(state, i) {\r\n state.notifications.targetUserId = i;\r\n },\r\n setMessageTargetUserEmail(state, i) {\r\n state.notifications.targetUserEmail = i;\r\n },\r\n setMessageTargetUserName(state, i) {\r\n state.notifications.targetUserName = i;\r\n },\r\n setMessageSendEmail(state, i) {\r\n state.notifications.sendEmail = i;\r\n },\r\n setCorrespondance(state, i) {\r\n state.notifications.correspondance = i;\r\n },\r\n addCorrespondance(state, i) {\r\n // console.log(\"Push new notice to array...\")\r\n // console.log(state.notifications.correspondance)\r\n if (state.notifications.correspondance == null) {\r\n state.notifications.correspondance = [];\r\n }\r\n state.notifications.correspondance.push(i);\r\n // console.log(state.notifications.correspondance)\r\n },\r\n removeCorrespondanceMessage(state, i) {\r\n let n = state.notifications.correspondance\r\n .map((item) => item.Id)\r\n .indexOf(i); // find index of your object\r\n state.notifications.correspondance.splice(n, 1);\r\n },\r\n setServerDateTime(state, i) {\r\n state.notifications.serverDateTime = i;\r\n },\r\n setShowDialogMenu(state, i) {\r\n state.notifications.showDialogMenu = i;\r\n },\r\n setDialogMenuPos(state, i) {\r\n state.notifications.dialogMenuPos = i;\r\n },\r\n setSendMessageAsEmailConfirmDialog(state, i) {\r\n state.notifications.sendMessageAsEmailConfirmDialog = i;\r\n },\r\n setMessageIdToEmail(state, i) {\r\n state.notifications.messageIdToEmail = i;\r\n }\r\n};\r\nconst actions = {\r\n checkNotices({ commit, state }, vm) {\r\n return new Promise((resolve, reject) => {\r\n //console.log(\"Check notifications in store.\")\r\n \r\n //Get notices from date -> state.notifications.serverDateTime\r\n /* if (state.notifications.serverDateTime != null) {\r\n console.log(\"Last checked:\" + state.notifications.serverDateTime);\r\n }\r\n */\r\n\r\n let postData = {\r\n UserId: this.state.everything.user.user_id,\r\n FromUserId: null,\r\n LastDate: state.notifications.serverDateTime,\r\n };\r\n \r\n var fd = new FormData();\r\n fd.append(\"req\", \"get_notices\");\r\n fd.append(\"data\", JSON.stringify(postData));\r\n \r\n axios\r\n .post(window.serverUrl + \"/api/backend/notifications.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n \r\n if (response.status === 200) {\r\n \r\n if(response.data.status==\"OK\") {\r\n // console.log(\"Done fetching notices.\")\r\n if (response.data.data.length > 0) {\r\n // console.log(\"New messages arrived!\");\r\n \r\n for(let i=0;i {\r\n console.log(e);\r\n reject();\r\n });\r\n }); // end of ret promise\r\n },\r\n markReadNotices({ commit, state }) {\r\n return new Promise((resolve, reject) => {\r\n\r\n let noticesToMark = [];\r\n console.log(\"Check for new notifications in store.\");\r\n // console.log(this.state.everything.user.notices)\r\n \r\n if (this.state.everything.user.notices === 0) {\r\n resolve();\r\n return;\r\n }\r\n \r\n for (let cnt = 0; cnt < this.state.everything.user.notices.length; cnt++) {\r\n if (this.state.everything.user.notices[cnt][\"ShowedDate\"] == undefined) {\r\n noticesToMark.push({ Id: this.state.everything.user.notices[cnt][\"Id\"] });\r\n }\r\n }\r\n \r\n if (noticesToMark.length == 0) {\r\n resolve();\r\n return;\r\n }\r\n \r\n // console.log(\"List of Notices to mark:\");\r\n // console.log(noticesToMark);\r\n \r\n var fd = new FormData();\r\n fd.append(\"req\", \"mark_read_notices\");\r\n \r\n let postData = noticesToMark;\r\n\r\n // console.log(postData);\r\n // return;\r\n \r\n fd.append(\"data\", JSON.stringify(postData));\r\n \r\n axios\r\n .post(window.serverUrl + \"/api/backend/notifications.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n \r\n if (response.status === 200) {\r\n let data = response.data.data;\r\n // console.log(response.data);\r\n if (data.length > 0) {\r\n for (let cnt = 0; cnt < data.length; cnt++) { \r\n let o = data[cnt];\r\n var elementPos = this.state.everything.user.notices.findIndex(x => x.Id == o[\"Id\"]);\r\n \r\n this.state.everything.user.notices[elementPos][\"ShowedDate\"] = data[cnt][\"ShowedDate\"];\r\n this.state.everything.user.notices[elementPos][\"Showed\"] = data[cnt][\"Showed\"];\r\n\r\n let loc_notices = localStorage.getItem(\"Notices\");\r\n loc_notices = JSON.parse(loc_notices);\r\n loc_notices[elementPos][\"ShowedDate\"] = data[cnt][\"ShowedDate\"];\r\n loc_notices[elementPos][\"Showed\"] = data[cnt][\"Showed\"];\r\n\r\n localStorage.setItem(\"Notices\", JSON.stringify(loc_notices));\r\n }\r\n \r\n commit(\"setUnreadNotices\", 0);\r\n }\r\n \r\n resolve();\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n }); // end of ret promise\r\n },\r\n getCorrespondance({ commit, state }, i_id) {\r\n return new Promise((resolve, reject) => {\r\n // console.log(\"------------------------------\");\r\n // console.log(\"Check correspondance in store.\");\r\n \r\n var fd = new FormData();\r\n fd.append(\"req\", \"get_notices\");\r\n \r\n // console.log(\"My UserId is:\" + this.state.everything.user.user_id)\r\n \r\n let postData = {\r\n UserId: i_id,\r\n FromUserId: this.state.everything.user.user_id,\r\n IsChat: true,\r\n LastDate: \"\"\r\n };\r\n \r\n // fetch only NEW messages\r\n if (state.notifications.correspondance != null) {\r\n if (state.notifications.correspondance.length > 0) {\r\n let i = state.notifications.correspondance.length - 1;\r\n // console.log(\"Latest message: \" + state.notifications.correspondance[i].CDate)\r\n postData.LastDate = state.notifications.correspondance[i].CDate;\r\n }\r\n }\r\n \r\n // console.log(\"My UserId is:\" + this.state.everything.user.user_id)\r\n // console.log(postData)\r\n \r\n fd.append(\"data\", JSON.stringify(postData));\r\n \r\n axios\r\n .post(window.serverUrl + \"/api/backend/notifications.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n \r\n if (response.status === 200) {\r\n // console.log(\"Done fetching correspondance.\")\r\n // console.log(response.data.data)\r\n if (response.data.datetime !== false) {\r\n //console.log(\"SetServerDateTIme: \", response.data.datetime);\r\n commit(\"setServerDateTime\", response.data.datetime);\r\n // console.log(\"Server time set to: \" + state.notifications.serverDateTime)\r\n }\r\n \r\n if (state.notifications.correspondance != null) {\r\n if (response.data.data.length > 0) {\r\n // console.log(\"New message!\")\r\n for (let a = 0; a < response.data.data.length; a++) {\r\n // console.log(response.data.data[a])\r\n commit(\"addCorrespondance\", response.data.data[a]);\r\n // console.log(state.notifications.correspondance)\r\n }\r\n \r\n resolve({ updateScroll: true });\r\n } else {\r\n // console.log(\"No new messages!\")\r\n resolve({ updateScroll: false });\r\n }\r\n } else {\r\n // console.log(\"Set initial messages.\")\r\n if (response.data.data.length > 0) {\r\n commit(\"setCorrespondance\", response.data.data);\r\n resolve({ updateScroll: true });\r\n } else {\r\n commit(\"setCorrespondance\", null);\r\n resolve({ updateScroll: false });\r\n }\r\n \r\n }\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve({ updateScroll: false });\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n }); // end of ret promise\r\n },\r\n sendMessage({ commit, state }, i_postData) {\r\n return new Promise((resolve, reject) => {\r\n var fd = new FormData();\r\n fd.append(\"req\", \"write_notice\");\r\n \r\n commit(\"setMessageTitle\", i_postData.Title);\r\n commit(\"setMessage\", i_postData.Message);\r\n commit(\"setMessageTargetUserId\", i_postData.UserId);\r\n // this.$store.commit(\"setMessageTargetUserEmail\", \"\")\r\n // commit(\"setMessageTargetUserName\", \"\");\r\n commit(\"setMessageSendEmail\", i_postData.SendAsEmail);\r\n \r\n /*\r\n let postData = {\r\n SendAsNotification: true,\r\n FromUserId: fromUserId,\r\n UserId: state.notifications.targetUserId,\r\n Title: state.notifications.title,\r\n Message: state.notifications.message,\r\n SubmissionId: null,\r\n CourseId: null,\r\n SendAsEmail: state.notifications.sendEmail,\r\n SendToCourseMentors: sendToCourseMentors\r\n }\r\n \r\n */\r\n \r\n // console.log(i_postData);\r\n \r\n fd.append(\"data\", JSON.stringify(i_postData));\r\n \r\n axios\r\n .post(window.serverUrl + \"/api/backend/notifications.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n \r\n // console.log(response.data.addNoticeStatus.data)\r\n // console.log(state.notifications.message);\r\n \r\n if (response.status === 200) {\r\n\r\n if (i_postData.SendToCourseMentors != true) {\r\n let d = response.data.addNoticeStatus.data;\r\n d.Message = state.notifications.message;\r\n d.FromUserId = i_postData.FromUserId;\r\n d.ToUserId = state.notifications.targetUserId;\r\n commit(\"addCorrespondance\", d);\r\n }\r\n\r\n if(response.data.addNoticeStatus.recipientOnlineStatus) {\r\n if(response.data.addNoticeStatus.recipientOnlineStatus.data.length === 0) {\r\n console.log(\"User NOT online!\"); \r\n // Show dialog - Användaren är inte online, vill du skicka meddelandet som epost för att uppmärksamma mottagaren?\r\n // Message is not sent directly if user is offline.\r\n commit(\"setMessageIdToEmail\", response.data.addNoticeStatus.data.Id);\r\n commit(\"setSendMessageAsEmailConfirmDialog\", true);\r\n } else {\r\n console.log(\"User IS online!\");\r\n }\r\n console.log(response.data.addNoticeStatus.recipientOnlineStatus.data);\r\n }\r\n \r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n }\r\n resolve();\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n }); // promise-end\r\n }, // sendMessage-end\r\n sendLastMessageAsEmail({commit, state}) {\r\n return new Promise((resolve, reject) => {\r\n var fd = new FormData();\r\n fd.append(\"req\", \"send_notice_via_email\");\r\n\r\n let postData = {\r\n Id: state.notifications.messageIdToEmail\r\n };\r\n\r\n fd.append(\"data\", JSON.stringify(postData));\r\n \r\n axios\r\n .post(window.serverUrl + \"/api/backend/notifications.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n\r\n commit(\"setMessageIdToEmail\", null);\r\n\r\n if (response.status === 200) {\r\n // console.log(response);\r\n resolve();\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n\r\n });\r\n },\r\n showMessageDialog({ commit, state }, i_obj) {\r\n if (i_obj.id == -1) {\r\n i_obj.scope.$toast.warning(\"Systemmeddelanden går ej att svara på!\");\r\n return;\r\n }\r\n console.log(\"Öppnar dialog! [DEBUG TEs†] \")\r\n \r\n // console.log(i_obj);\r\n // console.log(\"new id: \" + i_obj.id)\r\n // console.log(\"curr id: \" + state.notifications.targetUserId)\r\n if (i_obj.id != state.notifications.targetUserId) {\r\n // console.log(\"reset messages.\")\r\n commit(\"setCorrespondance\", null); // reset dialog if we open a new userChat\r\n }\r\n \r\n commit(\"setShowNoticeCenter\", true);\r\n commit(\"setMessageTargetUserId\", i_obj.id);\r\n commit(\"setMessageTargetUserName\", i_obj.name);\r\n \r\n this.dispatch(\"getCorrespondance\", i_obj.id).then(\r\n () => {\r\n var e = document.getElementById(\"message-container\");\r\n e.scrollTop = e.scrollHeight;\r\n },\r\n (error) => {\r\n console.log(error);\r\n }\r\n );\r\n },\r\n removeNote({ commit, state }, i) {\r\n return new Promise((resolve, reject) => {\r\n // let task = o.task\r\n \r\n var fd = new FormData();\r\n fd.append(\"req\", \"remove_notice\");\r\n \r\n let postData = {\r\n UserId: this.state.everything.user.user_id,\r\n Id: i.Id,\r\n };\r\n \r\n fd.append(\"data\", JSON.stringify(postData));\r\n \r\n axios\r\n .post(window.serverUrl + \"/api/backend/notifications.php\", fd)\r\n .then((response) => {\r\n JSON.stringify(response, null, 4);\r\n \r\n if (response.status === 200) {\r\n // console.log(response);\r\n commit(\"removeCorrespondanceMessage\", i.Id);\r\n resolve();\r\n } else {\r\n console.log(\"Error loading data from backend.\");\r\n resolve();\r\n }\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n reject();\r\n });\r\n });\r\n }\r\n};\r\n\r\nexport default { namespaced: false, state, getters, mutations, actions };","const state = {\r\n};\r\nconst getters = {\r\n};\r\nconst mutations = {\r\n};\r\nconst actions = {\r\n};\r\n\r\nexport default { namespaced: false, state, getters, mutations, actions };","// import Vue from \"vue\";\r\nimport axios from \"axios\";\r\n\r\nconst state = {\r\n users: [],\r\n};\r\nconst getters = {\r\n};\r\nconst mutations = {\r\n addUser(state, i) {\r\n state.users.push(i);\r\n }\r\n};\r\nconst actions = {\r\n getPreLoadedUser({commit, state}, user_id) {\r\n return new Promise((resolve, reject) => {\r\n // console.log(\"is :\" + user_id + \" preloaded? \");\r\n let ix = state.users.findIndex(x => x.Id === user_id);\r\n if(ix != -1) {\r\n // console.log(\"User exists! \");\r\n resolve(state.users[ix]);\r\n } else {\r\n // console.log(\"User did not exist! Add to store! \");\r\n \r\n let dataToServer= {\r\n UserId: this.state.everything.user.user_id,\r\n Id: user_id // the user we want to access\r\n }\r\n\r\n var fd = new FormData()\r\n fd.append('req', 'get_user')\r\n fd.append('data', JSON.stringify(dataToServer) )\r\n\r\n axios.post(window.serverUrl + '/api/backend/userdata.php', fd)\r\n .then(response => {\r\n JSON.stringify(response, null, 4)\r\n\r\n if(response.status === 200) {\r\n commit(\"addUser\", response.data.data[0]);\r\n resolve(response.data.data[0])\r\n }\r\n })\r\n .catch(e => {\r\n console.log(e)\r\n reject();\r\n })\r\n }\r\n\r\n });\r\n\r\n }\r\n};\r\n\r\nexport default { namespaced: false, state, getters, mutations, actions };","import Vue from \"vue\";\r\nimport * as axios from \"axios\";\r\n\r\nconst state = {\r\n group_id: null,\r\n course_id: null\r\n};\r\nconst getters = {\r\n};\r\nconst mutations = {\r\n setGroupId(state, i) {\r\n state.group_id = i;\r\n },\r\n setGroupCourseId(state, i) {\r\n state.course_id = i;\r\n },\r\n};\r\nconst actions = {\r\n setActiveGroup({ commit, state }, data) {\r\n return new Promise((resolve, reject) => {\r\n commit(\"setGroupId\", data.Id);\r\n console.log(\"Group is is: \" + state.group_id);\r\n resolve();\r\n });\r\n },\r\n setActiveGroupCourse({ commit, state }, data) {\r\n return new Promise((resolve, reject) => {\r\n commit(\"setGroupCourseId\", data.Id);\r\n resolve();\r\n });\r\n }\r\n};\r\n\r\nexport default { namespaced: false, state, getters, mutations, actions };","import Vue from \"vue\";\r\nimport Vuex from \"vuex\"; /* , { Store } */\r\n\r\nimport everything from \"./models/everything\";\r\nimport notices from \"./models/notices\";\r\nimport profiling from \"./models/profiling\";\r\nimport preloaded_data from \"./models/preloaded_data\";\r\nimport groups from \"./models/groups\";\r\n\r\nVue.use(Vuex);\r\n\r\nexport default new Vuex.Store({\r\n namespaced: false,\r\n modules: {\r\n everything,\r\n notices,\r\n profiling,\r\n preloaded_data,\r\n groups\r\n },\r\n strict: false\r\n});","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + (chunkId === 177 ? \"home\" : chunkId) + \".\" + {\"25\":\"94d8c58f\",\"77\":\"594e1ee6\",\"88\":\"0e21e286\",\"99\":\"82d39d61\",\"107\":\"1bac61b8\",\"109\":\"127e1206\",\"117\":\"2afa1148\",\"135\":\"beb24fac\",\"159\":\"ddd3e8fa\",\"177\":\"22cce417\",\"229\":\"5f4b5204\",\"234\":\"4dd8d537\",\"289\":\"090f7099\",\"290\":\"dbbc11bb\",\"291\":\"f1408a98\",\"306\":\"7c559e5e\",\"327\":\"cb838d96\",\"339\":\"b5b1891d\",\"342\":\"e9fe4624\",\"375\":\"b9372e35\",\"376\":\"1577758e\",\"426\":\"ab16fe74\",\"491\":\"78cfd108\",\"497\":\"92d2ef45\",\"539\":\"21aa4d78\",\"551\":\"f70d3ba2\",\"606\":\"b02da556\",\"624\":\"23ec216a\",\"664\":\"70aa9c06\",\"685\":\"c570ce90\",\"700\":\"b4c2f70d\",\"724\":\"fe858bd5\",\"738\":\"231da4f6\",\"752\":\"674ab042\",\"767\":\"97a67df9\",\"776\":\"8e8e9738\",\"777\":\"ce823fa1\",\"779\":\"e3adf42d\",\"791\":\"e9e65d50\",\"844\":\"17ef9520\",\"902\":\"f3306ed0\",\"929\":\"93dcf553\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + (chunkId === 177 ? \"home\" : chunkId) + \".\" + {\"25\":\"1223c546\",\"77\":\"75397069\",\"88\":\"191d78df\",\"99\":\"c055aa4b\",\"109\":\"30141133\",\"117\":\"bb41db04\",\"135\":\"5eca5c0d\",\"177\":\"f7f216c8\",\"234\":\"062fc46d\",\"290\":\"2b722a9c\",\"291\":\"2b722a9c\",\"339\":\"62fb168b\",\"375\":\"20a6ae91\",\"426\":\"a5520d3a\",\"551\":\"b00a0e94\",\"664\":\"ee7e130e\",\"700\":\"2ace380d\",\"724\":\"3ebeeca7\",\"738\":\"9f12626f\",\"752\":\"77329840\",\"767\":\"75397069\",\"776\":\"e451ac1d\",\"844\":\"1981edf1\",\"902\":\"4704c897\",\"929\":\"f2b9be2a\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"kursmodul:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/kursmodul/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t143: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"25\":1,\"77\":1,\"88\":1,\"99\":1,\"109\":1,\"117\":1,\"135\":1,\"177\":1,\"234\":1,\"290\":1,\"291\":1,\"339\":1,\"375\":1,\"426\":1,\"551\":1,\"664\":1,\"700\":1,\"724\":1,\"738\":1,\"752\":1,\"767\":1,\"776\":1,\"844\":1,\"902\":1,\"929\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkkursmodul\"] = self[\"webpackChunkkursmodul\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(7049); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_vm","callback","showDialog","expression","_c","attrs","staticClass","isYrk","bollar","submit_image","type","happy_image","_e","domProps","_t","cancel","on","$event","confirm","_v","_s","choiceOK","staticRenderFns","render","name","components","props","title","required","message","choiceNO","asyncMode","default","persistent","loading","require","data","isLoading","alert_image","alert_email_image","watch","immediate","handler","mounted","methods","clickOutsideDialog","component","scopedSlots","_u","fn","date","tooltip","compressDate","icon","created","computed","chipColor","compDate","dateTooltip","files","file","showFile","isAllowedToDeleteFile","linkTextColor","blipp","extras","window","getExtension","shortName","confirmDeleteFile","class","showColorMenu","menu","style","width","setEditorColor","textColor","$$v","includes","key","staticStyle","text","value","model","selectedHeading","toolbar","editor","can","chain","focus","setHorizontalRule","triggerButtonBtn","nativeOn","onKeydown","showLinkDialog","urlToLink","urlTarget","linkUnderline","showImageDialog","urlToImage","showYoutubeDialog","youtubeUrl","v","youtubeWidth","insertYoutubeAndCloseDialog","$emit","showIconPicker","addIcon","insertButtonAndCloseDialog","showButtonDialog","CustomParagraph","Paragraph","marks","CustomLink","Mark","priority","keepOnSplit","onCreate","this","options","protocols","forEach","registerCustomProtocol","onDestroy","reset","inclusive","autolink","addOptions","openOnClick","linkOnPaste","HTMLAttributes","target","rel","validate","undefined","addAttributes","href","parseHTML","tag","renderHTML","mergeAttributes","addCommands","setLink","attributes","setMark","setMeta","run","toggleLink","toggleMark","extendEmptyMarkRange","unsetLink","unsetMark","addPasteRules","markPasteRule","find","filter","link","isLink","map","index","start","getAttributes","match","addProseMirrorPlugins","Plugin","PluginKey","handleClick","view","pos","event","closest","ctrlKey","aElement","open","getAttribute","preventDefault","stopPropagation","handleDoubleClick","handlePaste","slice","state","selection","empty","textContent","content","node","item","commands","CustomItalic","Italic","group","CustomIcon","Node","inline","draggable","selectable","allowGapCursor","exitable","spanning","atom","isolating","contenteditable","addFigure","insertContent","command","tr","dispatch","$to","posAfter","end","nodeAfter","setSelection","TextSelection","create","doc","parent","contentMatch","defaultType","insert","scrollIntoView","CustomButton","filterIcons","iconType","filteredIcons","searchIcon","selectedIcon","allIcons","isDisabled","typeChanged","clearIcon","saveIcon","apply","close","updatePreview","btnRounded","btnSize","bgColorTransparent","bgColor","textColorStandard","iconText","buttonResult","IconPicker","url","mutatableValue","sampleButton","swatches","iconColor","getButtonString","cont","onSelectIcon","EditorContent","CustomButtonDialog","disabled","hideToolbar","disableToolbar","dense","outlined","rounded","mention","mentionItems","errorMessages","placeholder","extensions","emits","hadLink","youtubeHeight","Bold","BulletList","Document","Dropcursor","color","Heading","History","ListItem","OrderedList","HorizontalRule","Text","HardBreak","Underline","Highlight","TextStyle","Color","Image","Youtube","height","controls","nocookie","allowFullscreen","autoplay","endTime","loop","modestBranding","onSelectionUpdate","onUpdate","onBlur","onFocus","beforeDestroy","selectedColorBorder","opacity","console","triggerLinkBtn","removeLinkAndCloseDialog","insertLinkAndCloseDialog","extendMarkRange","insertImageAndCloseDialog","src","getHeading","level","setHeading","rgbaToHex","rgbToHex","setPickerColor","hexColor","category","tooltipResult","weight","sort","weightId","weightStr","weightTooltip","str","_self","$store","everything","isPageEditActivated","TheKey","txtFieldLostFocus","hadData","storeContent","ref","ConfirmDialog","MyTipTap","replace","isZoned","dateWhenDataWasChangedOnInput","theEditor","isSaving","selectedLink","unsubscribeFromStore","showContentAreaButton","lastSaveTime","timedSaveTrigger","lastContent","lastFetched","creationDate","modificationDate","localReplace","returnVal","clearTimeout","evalLoadContent","Key","Content","CreationDate","ModificationDate","avatar","fetchKeyData","fd","DefaultContent","axios","then","JSON","catch","saveKeyData","obj","getLocalStorage","setLocalStorage","hasChanges","proxy","ContentArea","Vue","Vuetify","VIcon","VSnackbar","VBtn","VProgressLinear","VuetifyToast","x","y","classes","timeout","dismissable","multiLine","vertical","queueable","showClose","closeText","closeIcon","closeColor","slot","shorts","custom","warning","save","property","opts","theme","dark","themes","light","primary","secondary","accent","error","info","success","background","btn_col","customProperties","icons","iconfont","$vuetify","breakpoint","lgAndUp","courseMenuExpanded","isSkea","ske_logo","app_logo_alt","yrk_logo","route","GoTo","noticeStyleObj","initialsOfUser","isCoursePage","canNavBack","gotoPrevCoursePage","checkNavForward","gotoNextCoursePage","goTo","notices","notifications","showNoticeCenter","_l","confirmedToSendLastMessageAsEmail","cookie_consent","$set","showCoursePartList","BackToCourse","userData","goal","active","post_cnt","GetPostNavClass","postBlock","GetCoursePartNavClass","OpenCoursePart","Category","CourseGoalId","courseEditor","previewState","sortCourseDialog","saveSortedCourseParts","onDragCoursePartFinished","Id","WeightChip","WeightCategoryChip","ContentText","sortedCoursePartItems","scrollMenu","isCourseHome","loadCourse","updateCourse","scope","localStorage","PreparePostBlocks","i_blocks","blockArr","FixPostIcon","i_block","ToggleShowCourseParts","AddCoursePart","UserId","SortNr","PostType","Shareable","Name","Blocks","showSortPartCourse","CourseId","SortedItems","d","refreshPageMixin","currentHash","token","getItem","hashChanged","newHash","initVersionCheck","frequency","setInterval","log","checkVersion","async","fileResponse","baseURL","$publicUrl","headers","get","Date","getTime","hash","hasHashChanged","response","errorStatus","reloadApp","location","reload","mixins","serverUrl","ready","cloudysky","rocket","version","loadVersionHistory","DateChip","id","postActivatesByCourseGoal","pageId","invertedPostActivates","set","postActivatesByCourseGoalsChanged","crumbs","paths","breadcrumb","path","selectedItem","openValiFormSubmission","openCourse","openTask","removeNote","FileListButtons","messageMenu","userExamId","postId","showRemoveBtn","removeNoteDialog","bgCol","isLight","senderName","LR","isSender","sentDate","weekday","month","updated","showMenu","showDialogMenu","getDayName","year","day","getMonthName","openUser","RelatedUserID","o","selectItem","unSelectItem","showRemoveButton","openConfirmRemoveNote","setReplyToMessage","getFileUrl","logo_img","String","logo_alt","logo_width","Number","logo_img_2","logo_img_3","NewVersion","VersionNumber","CourseGroupOverlay","BreadCrumb","MyFooter","isLocalhost","mainNavListComputed","ok","list","n","split","join","routeError","menuWidth","noticeCopy","noticesInPageTitle","isSurfingCourse","getAvatarClass","tmp","hostName","drawer","courseNavDrawer","current_course_id","app_logo","app_logo_width","valiweb_logo","balls_img_1","balls_img_2","listGrpModel","mainNavigationList","requireLogin","userTypeAccess","mobile","subLinks","params","logout","bottomMenuActiveBtn","courseLoaded","checkNotices","hasNotices","unreadNoticesCnt","noticeStatus","dialogMenu","dialogMenuX","dialogMenuY","dialogMenuItems","canViewCourseAsMentor","checkNewVersionOnContent","a","e","u","$route","setTimeout","self","clearInterval","handleScroll","mainMenuClicked","dialogMenuClick","itemAvailable","query","router","toast","PageName","pageName","showUserName","getAvatar","getUsername","targetRoute","push","isValidationPage","canNavForward","swapMenu","fetchNotices","updateTitleNotices","document","markNoticesAsRead","sendMessage","SendAsNotification","FromUserId","Title","Message","SubmissionId","SendAsEmail","SendToCourseMentors","openMessage","playSnd","snd","playPromise","cookieAccept","checkKeyPress","mainMenuExpandIcon","togglePlatform","setThemeParams","checkForUpdatedContent","tData","translations","Router","mode","base","process","routes","meta","requiresAuth","breadCrumbs","to","scrollBehavior","getBackendPageResult","Promise","resolve","reject","FormData","append","stringify","status","length","pageItem","pageToAdd","Default","keywords","Keywords","description","Description","header","Header","addRoutes","beforeEach","from","next","existsInRouter","resolveResult","resolved","matched","store","courseId","coursePartId","id2","CoursePartId","tmpTitle","clear","setItem","some","record","removeItem","hostname","indexOf","VueYouTubeEmbed","DatetimePicker","VueCookies","config","today","getFullYear","getMonth","getDate","time","getHours","getMinutes","getSeconds","dateTime","timePassed","date_now","date_then","delta","Math","abs","days","floor","hours","minutes","seconds","timeProgressed","t","msg","vm","trace","hasConsole","vuetify","h","App","$mount","count","routeDenied","apptitle","currentCourseId","currCoursePostId","courseData","courseMentors","mentorsLoaded","currentCourseEditedById","currentCourseEditedByUsername","currentCourseEditedSaveTime","showCourseSettings","showCoursePartSettings","showCourseNav","userExamData","userExamAutoResult","userExamQuestCnt","timeToResetByIdle","defaultMinutesToIdle","isEditing","currentValiFormSubmission","mentorViewCourseAsUser","navBack","navForward","reloadCourseMenu","editingUser","pages","total","current","user","user_id","username","realname","isValidator","userPerm","editCourse","unreadNotices","taskList","debugRegisterUserData","code","userName","firstName","lastName","adress","postnr","city","cellPhone","phone","orgnr","email","email2","password","password2","workplace","preferredLocale","interests","gdpr_consent","getters","mutations","setAppTitle","i","setPageEditActivation","setCurrPostId","setShowCourseSettings","setShowCoursePartSettings","setCourseNavBack","setCourseNavForward","setCourseData","setTimeToResetByIdle","newT","updateCourseEditedLastTime","now","resetCourseEditedSaveTime","setCurrentCourseId","newId","setUserId","setUserName","newName","setUserData","setEditCourse","canEditCourse","setCourseIsEditedBy","userId","timeDiff","timeToIdle","parse","commit","setValiFormSubmission","setUserValidator","addNumber","newNumber","setEditorPreviewState","isOn","setUserExamId","setUserExamData","setUserExamDataStatus","Status","setUserExamDataUserCanEdit","UserCanEdit","userCanEdit","setUserExamAutoResult","addToUserExamAutoResult","setUserExamQuestionCount","addCoursePart","setNotices","addNotices","cnt","unshift","setRealName","setUnreadNotices","setMentorViewCourseAsUser","setRouteDenied","setTotalPages","setCurrentPage","setShowCourseNav","setTaskList","setTaskListAtPos","addTaskListItem","setMentors","setEditingUser","removeTasks","rows","ix","findIndex","splice","setUseMentorText","setIsEditing","setIsSaving","setTranslations","setTranslationIndex","setTranslationAtIndex","addTranslation","actions","iValue","setUser","i_routerTo","accessData","Object","postData","access","userType","submissionId","RelatedUserType","CourseAccess","CanEdit","result","activateCourseEdit","RelatedUserId","Username","closeCourseEdit","err","updateIdleTime","$toast","lockData","nId","foundNavPos","totalPages","currPage","blocksWithPost","postCnt","cnt2","PostId","setPageNavDirections","cp","prevId","currIdSetCnt","nextId","b","activateUserExam","UserExamId","updateCoursePartData","post","ba","blockData","c","ca","updateCourseData","loadFile","makeCourseImageBlockIfNotExists","getTasks","Condition","isTrash","trash","condition","course_id","createTask","Task","task","updateTask","orgNr","NationalRegistrationNumber","substring","UserRealName","CourseName","courseName","SetCompleted","EventStartDate","eventStartDate","gotoUserExamAsMentor","targetPath","subObj","FirstName","LastName","go","getMentors","dt","addFooterMentorCopy","reloadPage","setCourseEditing","insertTranslationContent","setTranslationFromLocalStorage","iObj","locText","g","setTranslationFromServer","locIndex","updateTranslationContent","tObj","courseProgressUpdate","addedProgress","progress_percent","namespaced","dialogMenuPos","sendEmail","targetUserId","targetUserEmail","targetUserName","correspondance","serverDateTime","sendMessageAsEmailConfirmDialog","messageIdToEmail","setShowNoticeCenter","setMessage","setMessageTitle","setMessageTargetUserId","setMessageTargetUserEmail","setMessageTargetUserName","setMessageSendEmail","setCorrespondance","addCorrespondance","removeCorrespondanceMessage","setServerDateTime","setShowDialogMenu","setDialogMenuPos","setSendMessageAsEmailConfirmDialog","setMessageIdToEmail","LastDate","ToUserId","oldNotices","datetime","markReadNotices","noticesToMark","elementPos","loc_notices","getCorrespondance","i_id","IsChat","CDate","updateScroll","i_postData","addNoticeStatus","recipientOnlineStatus","sendLastMessageAsEmail","showMessageDialog","i_obj","getElementById","scrollTop","scrollHeight","users","addUser","getPreLoadedUser","dataToServer","group_id","setGroupId","setGroupCourseId","setActiveGroup","setActiveGroupCourse","Vuex","modules","profiling","preloaded_data","groups","strict","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","deferred","O","chunkIds","notFulfilled","Infinity","fulfilled","j","keys","every","r","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","all","reduce","promises","miniCssF","globalThis","Function","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","script","needAttach","scripts","getElementsByTagName","s","createElement","charset","nc","setAttribute","onScriptComplete","prev","onerror","onload","doneFns","parentNode","removeChild","bind","head","appendChild","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","onLinkComplete","errorType","realHref","Error","request","insertBefore","nextSibling","findStylesheet","existingLinkTags","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","promise","loadingEnded","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}