{"version":3,"sources":["webpack:///./src/views/seminars/components/ElementControls.vue?ccc4","webpack:///./src/views/seminars/components/ElementControls.vue","webpack:///./src/views/seminars/components/ElementControls.vue?2da1","webpack:///./src/views/seminars/components/ElementControls.vue?04ac","webpack:///./src/views/seminars/components/WatchFeedback.vue?b95d","webpack:///./src/views/seminars/components/WatchFeedback.vue","webpack:///./src/views/seminars/components/WatchFeedback.vue?f5f1","webpack:///./src/views/seminars/components/WatchFeedback.vue?d412","webpack:///../../../src/components/VGrid/VCol.ts"],"names":["render","_vm","this","_h","$createElement","_c","_self","staticClass","VBtn","attrs","loading","on","prev","VIcon","_v","_s","$t","VSpacer","callNext","isLast","VDialog","model","value","callback","$$v","endDialog","expression","VCard","toDash","$event","_e","staticRenderFns","emptySubmissionElements","Map","ElementControls","elementStatus","element","seminar","submissions","filter","x","elementId","id","displaySnackbar","isComplete","next","type","reqScore","requiredScore","bestScore","subs","map","score","sort","a","b","some","skipped","msg","i18n","t","toString","numReq","requiredSubmissions","numSub","length","numReqShared","rateableSubmissions","requiredNumShared","numShared","isShared","sharedSubmissions","m","has","submitEmpty","submit","console","log","route","$router","push","Vue","__decorate","Prop","default","Getter","Action","Component","component","videos","VCol","_l","video","i","key","rateFeedback","_f","createdAt","WatchFeedbackElement","one","users","find","username","email","api","get","Error","post","seminarId","submission","addSubmission","d","rateFeedbackVideo","getVideos","Watch","immediate","components","VideoSubmission","breakpoints","breakpointProps","reduce","props","val","Boolean","String","Number","offsetProps","upperFirst","orderProps","propMap","col","Object","keys","offset","order","breakpointClass","prop","className","breakpoint","replace","toLowerCase","cache","extend","name","functional","cols","alignSelf","validator","str","includes","tag","h","data","children","cacheKey","parent","classList","forEach","hasColClasses","startsWith","set","mergeData","class"],"mappings":"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","file":"assets/js/chunk-48bfba55.1477abfc.js","sourcesContent":["import { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\n\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"d-flex mt-12 mb-4\"},[_c(VBtn,{attrs:{\"elevation\":\"0\",\"disabled\":_vm.loading},on:{\"click\":_vm.prev}},[_c(VIcon,{attrs:{\"left\":\"\"}},[_vm._v(\"mdi-chevron-left\")]),_c('span',[_vm._v(_vm._s(_vm.$t(\"seminars.prev\")))])],1),_c(VSpacer),_c(VBtn,{attrs:{\"elevation\":\"0\",\"color\":\"primary\",\"loading\":_vm.loading,\"disabled\":_vm.loading},on:{\"click\":_vm.callNext}},[_c('span',[_vm._v(_vm._s(_vm.isLast ? _vm.$t(\"seminars.finish\") : _vm.$t(\"seminars.next\")))]),_c(VIcon,{attrs:{\"right\":\"\"}},[_vm._v(\" \"+_vm._s(_vm.isLast ? \"mdi-check\" : \"mdi-chevron-right\")+\" \")])],1)],1),(_vm.isLast)?_c(VDialog,{attrs:{\"max-width\":\"400px\"},model:{value:(_vm.endDialog),callback:function ($$v) {_vm.endDialog=$$v},expression:\"endDialog\"}},[_c(VCard,{attrs:{\"outlined\":\"\"}},[_c(VCardTitle,[_vm._v(_vm._s(_vm.$t(\"seminars.done\")))]),_c(VCardText,[_vm._v(\" \"+_vm._s(_vm.$t(\"seminars.doneText\"))+\" \")]),_c(VCardActions,[_c(VSpacer),_c(VBtn,{attrs:{\"elevation\":\"0\"},on:{\"click\":_vm.toDash}},[_c('span',[_vm._v(_vm._s(_vm.$t(\"seminars.back\")))])]),_c(VBtn,{attrs:{\"color\":\"primary\",\"elevation\":\"0\"},on:{\"click\":function($event){_vm.endDialog = false}}},[_c('span',[_vm._v(\"OK\")])])],1)],1)],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport Vue from \"vue\";\r\nimport { Action, Getter } from \"vuex-class\";\r\nimport { Component, Prop } from \"vue-property-decorator\";\r\n\r\nimport { Seminar, SeminarElement } from \"@/core/models\";\r\nimport { elementStatus } from \"@/core/utils/seminars\";\r\nimport i18n from \"@/core/plugins/i18n\";\r\n\r\nconst emptySubmissionElements = new Map([\r\n [\"read_text\", \"/api/Submissions/ReadText\"],\r\n [\"watch_video\", \"/api/Submissions/WatchVideo\"],\r\n]);\r\n\r\n@Component\r\nexport default class ElementControls extends Vue {\r\n @Prop({ default: () => false }) isLast!: boolean;\r\n @Prop({ default: () => {} }) submit!: () => Promise;\r\n\r\n @Getter(\"seminars/selected\") seminar?: Seminar;\r\n @Getter(\"seminars/element\") element!: SeminarElement;\r\n\r\n @Getter(\"profile/id\") userId!: string;\r\n\r\n @Action(\"seminars/next\") next!: () => void;\r\n @Action(\"seminars/prev\") prev!: () => void;\r\n @Action(\"seminars/skip\") skip!: (el: SeminarElement) => void;\r\n @Action(\"seminars/submitEmpty\") submitEmpty!: (el: SeminarElement) => void;\r\n\r\n @Action(\"displaySnackbar\") displaySnackbar!: (m: string) => void;\r\n\r\n loading = false;\r\n endDialog = false;\r\n\r\n get isComplete() {\r\n return elementStatus(this.element, this.seminar) === \"completed\";\r\n }\r\n\r\n get subs() {\r\n return (\r\n this.seminar?.submissions?.filter(x => x.elementId === this.element.id) ||\r\n []\r\n );\r\n }\r\n\r\n async callNext() {\r\n // no element\r\n if (!this.element) return this.displaySnackbar(\"Element not found\");\r\n\r\n // element completed\r\n if (this.isComplete) {\r\n if (this.isLast) this.endDialog = true;\r\n return this.next();\r\n }\r\n\r\n // specific to vr_training\r\n if (this.element.type === \"vr_training\") {\r\n const reqScore = this.element.requiredScore;\r\n const bestScore =\r\n this.subs\r\n .map(x => (x as any).score as number)\r\n .sort((a, b) => b - a)[0] || 0;\r\n if (bestScore < reqScore)\r\n return this.displaySnackbar(\r\n \"You need to reach the required score in order to proceed\",\r\n );\r\n else return this.next();\r\n }\r\n\r\n // specific to give_feedback\r\n if (this.element.type === \"give_feedback\") {\r\n if (this.subs.some(x => !x.skipped)) return this.next();\r\n\r\n const msg = i18n.t(\"seminars.submissions.giveFeedbackInfo\").toString();\r\n return this.displaySnackbar(msg);\r\n }\r\n\r\n // specific to video_presentations\r\n if (this.element.type === \"video_presentation\") {\r\n const subs = this.subs.filter(x => !x.skipped);\r\n const numReq = this.element.requiredSubmissions || 1;\r\n const numSub = subs?.length || 0;\r\n const numReqShared = this.element.rateableSubmissions\r\n ? this.element.requiredNumShared || 0\r\n : -1;\r\n const numShared = subs?.filter(x => x.isShared).length || 0;\r\n\r\n // requirements not met\r\n if (numReq > numSub || numReqShared > numShared) {\r\n const submissions = numReq - numSub;\r\n const sharedSubmissions =\r\n numReqShared === -1 ? 0 : numReqShared - numShared;\r\n const m = this.$t(\"seminars.video_presentation.error\", {\r\n submissions,\r\n sharedSubmissions,\r\n }).toString();\r\n this.displaySnackbar(m);\r\n return;\r\n }\r\n // req. met\r\n else {\r\n if (this.isLast) this.endDialog = true;\r\n return this.next();\r\n }\r\n }\r\n\r\n // elements that require empty submissions\r\n if (emptySubmissionElements.has(this.element.type)) {\r\n this.submitEmpty(this.element);\r\n this.next();\r\n }\r\n // elements that need to be submitted\r\n else {\r\n this.loading = true;\r\n try {\r\n await this.submit();\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n this.loading = false;\r\n }\r\n\r\n // if is last - show dialog\r\n if (this.isLast) this.endDialog = true;\r\n }\r\n\r\n toDash() {\r\n const id = this.seminar?.id;\r\n if (!id) return this.displaySnackbar(\"Could not go back to dashboard\");\r\n const route = `/seminars/dashboard/${id}`;\r\n this.$router.push(route);\r\n }\r\n}\r\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--15-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--15-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ElementControls.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--15-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--15-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ElementControls.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./ElementControls.vue?vue&type=template&id=2aa2dd0e&\"\nimport script from \"./ElementControls.vue?vue&type=script&lang=ts&\"\nexport * from \"./ElementControls.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/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","import { VCol } from 'vuetify/lib/components/VGrid';\n\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h3',[_vm._v(_vm._s(_vm.$t(\"seminars.watch_feedback.title\")))]),_c('p',[_vm._v(_vm._s(_vm.$t(\"seminars.watch_feedback.text\")))]),(_vm.videos.length > 0)?_c(VCol,{attrs:{\"cols\":\"12\",\"md\":\"8\"}},_vm._l((_vm.videos),function(video,i){return _c('div',{key:i,staticClass:\"mb-4\"},[_c('VideoSubmission',{attrs:{\"id\":(\"watch_feedback_\" + i),\"seminar\":_vm.seminar,\"submission\":video},on:{\"rate\":_vm.rateFeedback}})],1)}),0):_c('div',[_vm._v(_vm._s(_vm.$t(\"seminars.watch_feedback.no_feedback\")))]),(_vm.skipped)?_c('div',[_c('h4',{staticClass:\"mt-4\"},[_vm._v(\" This task was skipped on \"+_vm._s(_vm._f(\"formatwithtime\")(_vm.skipped.createdAt))+\". \")])]):_vm._e(),_c('ElementControls',{attrs:{\"submit\":_vm.submit}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport Vue from \"vue\";\r\nimport { Action, Getter } from \"vuex-class\";\r\nimport { Component, Prop, Watch } from \"vue-property-decorator\";\r\n\r\nimport {\r\n RateVideoAction,\r\n Seminar,\r\n SeminarElement,\r\n SimpleUser,\r\n Submission,\r\n} from \"@/core/models\";\r\nimport api from \"@/core/utils/api\";\r\nimport VideoSubmission from \"./VideoSubmission.vue\";\r\nimport ElementControls from \"./ElementControls.vue\";\r\n\r\n@Component({ components: { VideoSubmission, ElementControls } })\r\nexport default class WatchFeedbackElement extends Vue {\r\n @Prop({ default: () => ({} as SeminarElement) }) element!: SeminarElement;\r\n\r\n @Getter(\"profile/id\") userId!: string;\r\n\r\n @Getter(\"seminars/users\") users!: SimpleUser[];\r\n @Getter(\"seminars/selected\") seminar?: Seminar;\r\n\r\n @Action(\"seminars/next\") next!: () => void;\r\n @Action(\"seminars/addSubmission\") addSubmission!: (s: Submission) => void;\r\n @Action(\"seminars/rateFeedbackVideo\") rateFeedbackVideo!: (d: any) => void;\r\n\r\n user(id: string) {\r\n const one = this.users.find(x => x.id === id);\r\n if (!one) return \"Seminar owner\";\r\n return `${one.username} (${one.email})`;\r\n }\r\n\r\n get skipped() {\r\n return this.seminar?.submissions?.find(\r\n x => x.skipped && x.elementId === this.element.id,\r\n );\r\n }\r\n\r\n videos: Submission[] = [];\r\n loading = false;\r\n async getVideos() {\r\n if (!this.seminar) return;\r\n this.loading = true;\r\n try {\r\n this.videos = (await api.get(\r\n `/api/Elements/Feedback/${this.seminar.id}`,\r\n )) as Submission[];\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n this.loading = false;\r\n }\r\n\r\n async submit() {\r\n if (!this.videos.length) throw new Error(\"no_video\");\r\n const submission = (await api.post(\"/api/Submissions/WatchFeedback\", {\r\n elementId: this.element.id,\r\n seminarId: this.element.seminarId,\r\n })) as Submission;\r\n this.addSubmission(submission);\r\n this.next();\r\n }\r\n\r\n rateFeedback(d: RateVideoAction) {\r\n if (!this.seminar) return;\r\n this.rateFeedbackVideo({ ...d, seminarId: this.seminar.id });\r\n }\r\n\r\n @Watch(\"seminar\", { immediate: true })\r\n seminarUpdated() {\r\n this.getVideos();\r\n }\r\n}\r\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--15-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--15-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WatchFeedback.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--15-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--15-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WatchFeedback.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./WatchFeedback.vue?vue&type=template&id=13f7a9d6&\"\nimport script from \"./WatchFeedback.vue?vue&type=script&lang=ts&\"\nexport * from \"./WatchFeedback.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/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","import './VGrid.sass'\n\nimport Vue, { VNode, PropOptions } from 'vue'\nimport mergeData from '../../util/mergeData'\nimport { upperFirst } from '../../util/helpers'\n\n// no xs\nconst breakpoints = ['sm', 'md', 'lg', 'xl']\n\nconst breakpointProps = (() => {\n return breakpoints.reduce((props, val) => {\n props[val] = {\n type: [Boolean, String, Number],\n default: false,\n }\n return props\n }, {} as Dictionary)\n})()\n\nconst offsetProps = (() => {\n return breakpoints.reduce((props, val) => {\n props['offset' + upperFirst(val)] = {\n type: [String, Number],\n default: null,\n }\n return props\n }, {} as Dictionary)\n})()\n\nconst orderProps = (() => {\n return breakpoints.reduce((props, val) => {\n props['order' + upperFirst(val)] = {\n type: [String, Number],\n default: null,\n }\n return props\n }, {} as Dictionary)\n})()\n\nconst propMap = {\n col: Object.keys(breakpointProps),\n offset: Object.keys(offsetProps),\n order: Object.keys(orderProps),\n}\n\nfunction breakpointClass (type: keyof typeof propMap, prop: string, val: boolean | string | number) {\n let className = type\n if (val == null || val === false) {\n return undefined\n }\n if (prop) {\n const breakpoint = prop.replace(type, '')\n className += `-${breakpoint}`\n }\n // Handling the boolean style prop when accepting [Boolean, String, Number]\n // means Vue will not convert to sm: true for us.\n // Since the default is false, an empty string indicates the prop's presence.\n if (type === 'col' && (val === '' || val === true)) {\n // .col-md\n return className.toLowerCase()\n }\n // .order-md-6\n className += `-${val}`\n return className.toLowerCase()\n}\n\nconst cache = new Map()\n\nexport default Vue.extend({\n name: 'v-col',\n functional: true,\n props: {\n cols: {\n type: [Boolean, String, Number],\n default: false,\n },\n ...breakpointProps,\n offset: {\n type: [String, Number],\n default: null,\n },\n ...offsetProps,\n order: {\n type: [String, Number],\n default: null,\n },\n ...orderProps,\n alignSelf: {\n type: String,\n default: null,\n validator: (str: any) => ['auto', 'start', 'end', 'center', 'baseline', 'stretch'].includes(str),\n },\n tag: {\n type: String,\n default: 'div',\n },\n },\n render (h, { props, data, children, parent }): VNode {\n // Super-fast memoization based on props, 5x faster than JSON.stringify\n let cacheKey = ''\n for (const prop in props) {\n cacheKey += String((props as any)[prop])\n }\n let classList = cache.get(cacheKey)\n\n if (!classList) {\n classList = []\n // Loop through `col`, `offset`, `order` breakpoint props\n let type: keyof typeof propMap\n for (type in propMap) {\n propMap[type].forEach(prop => {\n const value: string | number | boolean = (props as any)[prop]\n const className = breakpointClass(type, prop, value)\n if (className) classList!.push(className)\n })\n }\n\n const hasColClasses = classList.some(className => className.startsWith('col-'))\n\n classList.push({\n // Default to .col if no other col-{bp}-* classes generated nor `cols` specified.\n col: !hasColClasses || !props.cols,\n [`col-${props.cols}`]: props.cols,\n [`offset-${props.offset}`]: props.offset,\n [`order-${props.order}`]: props.order,\n [`align-self-${props.alignSelf}`]: props.alignSelf,\n })\n\n cache.set(cacheKey, classList)\n }\n\n return h(props.tag, mergeData(data, { class: classList }), children)\n },\n})\n"],"sourceRoot":""}