{"version":3,"sources":["webpack:///./src/views/seminars/components/ElementControls.vue?db56","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?bcae","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.441c885a.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 type { 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<void>;\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=27a29d28&\"\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 type {\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=84a3b30c&\"\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<PropOptions>)\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<PropOptions>)\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<PropOptions>)\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 <v-col sm></v-col> 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<string, any[]>()\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":""}