moodle_local_treestudyplan/amd/build/treestudyplan-components.min.js.map
2024-05-10 15:22:52 +02:00

1 line
28 KiB
Plaintext

{"version":3,"file":"treestudyplan-components.min.js","sources":["../src/treestudyplan-components.js"],"sourcesContent":["/*eslint no-var: \"error\"*/\n/*eslint no-console: \"off\"*/\n/*eslint-disable no-trailing-spaces */\n/*eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n\nimport {load_strings} from './util/string-helper';\nimport {format_date, studyplanDates, studyplanTiming} from './util/date-helper';\nimport FitTextVue from './util/fittext-vue';\n\n\nexport default {\n\n install(Vue/*,options*/){\n Vue.use(FitTextVue);\n\n let strings = load_strings({\n studyplancard: {\n open: \"open\",\n noenddate: \"noenddate\",\n idnumber: \"studyplan_idnumber\",\n description: \"studyplan_description\",\n completed: \"completed\",\n details: \"studyplan_details\",\n suspended: \"suspended\",\n },\n details: {\n details: \"studyplan_details\",\n },\n extrafields: {\n show: \"show@core\"\n },\n prevnext: {\n prev: \"prev@core\",\n previous: \"previous@core\",\n next: \"next@core\",\n select: \"selectanoptions@core\",\n }\n });\n // Create new eventbus for interaction between item components\n const ItemEventBus = new Vue();\n\n Vue.component('s-studyplan-card', {\n props: {\n value: {\n type: Object,\n },\n open: {\n type: Boolean\n },\n ignoresuspend: {\n type: Boolean,\n default: false,\n },\n },\n data() {\n return {\n text: strings.studyplancard\n };\n },\n computed: {\n timeless() {\n const plan = this.value;\n if (!plan.pages || plan.pages.length == 0 || plan.pages[0].timeless) {\n return true;\n } else {\n return false;\n }\n },\n timing(){\n return studyplanTiming(this.value);\n },\n dates(){\n const dates = studyplanDates(this.value);\n return {\n start: format_date(dates.start),\n end: (dates.end)?format_date(dates.end):this.text.noenddate,\n };\n },\n suspended() {\n return (this.value.suspended && !this.ignoresuspend);\n }\n \n },\n methods: {\n onOpenClick(e) {\n this.$emit('open',e);\n }\n },\n template: `\n <b-card\n :class=\"'s-studyplan-card timing-' + timing + (suspended?' s-suspended':'')\"\n >\n <template #header></template>\n \n <div class='s-studyplan-card-content'>\n <div class='s-studyplan-card-icon'><img :src='value.icon'></div>\n <div class='s-studyplan-card-info'>\n <div class='s-studyplan-card-titlebar'>\n <b-card-title>\n <a class='title' v-if='open && !suspended' \n href='#' @click.prevent='onOpenClick($event)'>{{value.name}}</a>\n <template v-else>{{value.name}}</template>\n <div v-if=\"suspended\" class='text-danger'\n ><fittext maxsize=\"12pt\">{{text.suspended}}</fittext></div>\n </b-card-title>\n <div class='s-studyplan-card-titleslot'><slot name='title'></slot></div>\n </div> \n <div class='s-studyplan-card-idnumber' v-if='value.idnumber'>\n {{ text.idnumber }}: {{ value.idnumber }}\n </div>\n <s-progress-bar \n v-if='!suspended && value.progress !== undefined && value.progress !== null'\n v-model=\"value.progress\"\n ></s-progress-bar>\n </div>\n \n </div>\n <slot></slot>\n <template #footer>\n <span v-if=\"!timeless\" :class=\"'t-timing-'+timing\" v-html=\"dates.start + ' - '+ dates.end\"></span>\n <span class=\"s-studyplan-card-buttons\">\n <slot name='footer'></slot>\n <s-studyplan-details \n v-model=\"value\" \n v-if=\"value.description\"\n ><i class='fa fa-info-circle'></i></s-studyplan-details>\n <b-button style=\"float:right;\" v-if='open && !suspended' variant='primary'\n @click.prevent='onOpenClick($event)'>{{ text.open }}</b-button>\n </span>\n </template>\n </b-card>\n `,\n });\n\n Vue.component('s-progress-bar', {\n props: {\n value: {\n type: Number, \n },\n min: {\n type: Number,\n default() { return 0;}\n },\n max: {\n type: Number,\n default() { return 1;}\n }\n },\n data() {\n return {\n text: strings.studyplancard\n };\n },\n computed: {\n width_completed() {\n if(this.value) {\n const v = ( (this.value - this.min) / (this.max - this.min));\n return v * 100;\n } else {\n return 0;\n }\n },\n width_incomplete() {\n if(this.value) {\n const v = ( (this.value - this.min) / (this.max - this.min));\n return (1-v) * 100;\n } else {\n return 100;\n }\n },\n percentage_complete() {\n if(this.value) {\n const v = ( (this.value - this.min) / (this.max - this.min));\n return Math.round(v * 100) + \"%\";\n } else {\n return \"0%\";\n }\n }\n },\n template: `\n <div class='s-studyplan-card-progress' >\n <div class=\"s-studyplan-card-progressbar\"\n ><span v-if=\"width_completed > 0\"\n :style=\"{width: width_completed+'%'}\"\n class='s-studyplan-card-progress-segment s-studyplan-card-progress-completed'\n ></span\n ><span :style=\"{width: width_incomplete+'%'}\"\n class='s-studyplan-card-progress-segment s-studyplan-card-progress-incomplete'\n ></span\n ></div>\n <div class=\"s-studyplan-card-progresstext\">\n {{ percentage_complete}} {{ text.completed.toLowerCase() }} \n </div>\n </div>\n `,\n });\n\n\n\n /*\n * S-STUDYLINE-HEADER-HEADING\n * The only reasing this is not a simple empty div, is the fact that the header height\n * needs to match that of the period headers\n */\n Vue.component('s-studyline-header-heading', {\n props: {\n identifier: {\n type: Number, // Page reference.\n default() { return 0;}\n }\n },\n data() {\n return {\n layerHeights: {}\n };\n },\n created() {\n // Listener for the signal that a new connection was made and needs to be drawn\n // Sent by the incoming item - By convention, outgoing items are responsible for drawing the lines\n ItemEventBus.$on('headerHeightChange', this.onHeaderHeightChange);\n },\n computed: {\n\n },\n methods: {\n onHeaderHeightChange(newheight,identifier){\n if (this.identifier == identifier) {\n if(this.$refs.main){\n this.$refs.main.style.height = `${newheight}px`;\n }\n }\n }\n },\n template: `\n <div class=\"s-studyline-header-heading\" ref=\"main\" :data-id=\"identifier\"><slot></slot></div>\n `,\n });\n\n Vue.component('s-studyline-header-period', {\n props: {\n value: {\n type: Object, // dict with layer as index\n },\n identifier: {\n type: Number, // Page reference.\n default() { return 0;}\n },\n mode: {\n type: String,\n default: \"view\",\n }\n },\n mounted() {\n const self=this;\n if(self.value.period == 1){\n self.resizeListener = new ResizeObserver(() => {\n if(self.$refs.main){\n const size = self.$refs.main.getBoundingClientRect();\n ItemEventBus.$emit('headerHeightChange', size.height, self.identifier);\n }\n }).observe(self.$refs.main);\n }\n },\n unmounted() {\n if(this.resizeListener) {\n this.resizeListener.disconnect();\n }\n },\n computed: {\n startdate(){\n return format_date(this.value.startdate);\n },\n enddate(){\n return format_date(this.value.enddate);\n },\n current(){\n if( this.value && this.value.startdate && this.value.enddate){\n const now = new Date();\n const pstart = new Date(this.value.startdate);\n const pend = new Date(this.value.enddate);\n return (now >= pstart && now < pend);\n }\n else {\n return false;\n }\n }\n\n },\n data() {\n return {\n };\n },\n template: `\n <div :class=\"'s-studyline-header-period '\" ref=\"main\" :data-id=\"identifier\"\n ><p><abbr :id=\"'s-period-'+value.id\" :title=\"value.fullname\">{{ value.shortname }}</abbr>\n <b-tooltip\n :target=\"'s-period-'+value.id\" triggers=\"hover\"\n >{{ value.fullname }}<br>\n <span class=\"s-studyline-header-period-datespan\">\n <span class=\"date\">{{ startdate }}</span> - <span class=\"date\">{{ enddate }}</span>\n </span>\n </b-tooltip>\n <slot></slot\n ><p v-if=\"value.startdate > 0\" \n class=\"s-studyline-header-period-datespan small\">\n <span class=\"date\">{{ startdate }}</span>\n - <span class=\"date\" v-if=\"this.value.enddate > 0\">{{ enddate }}</span><span class=\"date\" v-else>&infin;</span>\n </p>\n <div v-if=\"current && mode == 'view'\" class='s-studyline-period-highlight'></div>\n </div>\n `,\n });\n\n\n Vue.component('s-studyplan-details', {\n props: {\n value: {\n type: Object, \n },\n variant: {\n type: String,\n default() { return \"info\"; }\n },\n pill: {\n type: Boolean,\n default() { return false; }\n },\n size: {\n type: String,\n default() { return \"\";}\n }\n },\n data() {\n return {\n text: strings.details,\n };\n },\n template: `\n <span>\n <b-button \n :size=\"size\"\n :pill=\"pill\"\n :variant=\"variant\" \n v-b-modal=\"'modal-description-'+value.id\"\n ><slot><i class='fa fa-info-circle'></i>\n {{ text.details}}</slot>\n </b-button>\n <b-modal\n :title=\"value.name\"\n scrollable\n centered\n ok-only\n content-class=\"s-studyplan-details\"\n :id=\"'modal-description-'+value.id\"\n >\n <b-container>\n <b-row>\n <b-col cols=\"4\"><img :src='value.icon'></b-col>\n <b-col cols=\"8\" class=\"pl-1\">\n <span v-html=\"value.description\"></span>\n </b-col>\n </b-row>\n </b-container>\n </b-modal>\n </span>\n `,\n });\n\n Vue.component('s-course-extrafields', {\n props: {\n value: {\n type: Array, \n },\n variant: {\n type: String,\n default() { return \"info\"; }\n },\n position: {\n type: String,\n default() { return \"below\"; }\n },\n size: {\n type: String,\n default() { return \"\";}\n }\n },\n data() {\n return {\n text: strings.extrafields,\n };\n },\n computed: {\n fields() {\n const fields = [];\n for (const ix in this.value) {\n const field = this.value[ix];\n if (field.position == this.position && field.value && field.value.length > 0) {\n fields.push(field);\n }\n }\n return fields;\n },\n },\n methods: {\n displaydate(field) {\n return format_date(field.value,false);\n },\n },\n template: `\n <div :class=\"'s-course-extrafields ' + ((fields.length>0)?position:'empty')\">\n <table v-if=\"fields.length > 0\">\n <tr v-for=\"field in fields\">\n <td><span class='title' v-if='field.title'>{{ field.title}}</span></td>\n <td>\n <span v-if='field.type == \"date\"' class=\"value date\">{{ displaydate(field) }}</span>\n <span v-else-if='field.type == \"checkbox\"' \n :class=\"'value ' + (field.checked?'true':'false')\">{{ field.value }}</span>\n <span v-else-if='field.type == \"textarea\"'>\n <a class='text-info' href='#' v-b-modal=\"field.courseid+'_'+field.fieldname\">{{text.show}}...</a>\n <b-modal\n :id=\"field.courseid+'_'+field.fieldname\"\n :title=\"field.title\"\"\n scrollable\n centered\n ok-only\n ><span v-html=\"field.value\"></span\n ></b-modal>\n </span>\n <span v-else class=\"value\"><span v-html=\"field.value\"></span></span>\n </td>\n </tr>\n </table>\n </div>\n `,\n });\n\n Vue.component('s-prevnext-selector', {\n props: {\n value: {\n type: Object, \n default() { return null;}\n },\n options: {\n type: Array,\n },\n grouped: {\n type: Boolean,\n default: false,\n },\n titlefield: {\n type: String,\n default: \"title\",\n },\n labelfield: {\n type: String,\n default: \"label\",\n },\n optionsfield: {\n type: String,\n default: \"options\",\n },\n defaultselectable: {\n type: Boolean,\n default: false,\n },\n variant: {\n type: String,\n default: \"\",\n },\n arrows: {\n type: Boolean,\n default: false,\n },\n },\n data() {\n return {\n text: strings.prevnext,\n };\n },\n computed: {\n fields() {\n const f = [];\n if(this.defaultselectable) {\n f.push(null);\n }\n if (this.grouped) {\n for ( const gix in this.options) {\n const group = this.options[gix];\n for ( const ix in group[this.optionsfield]) {\n const v = group[this.optionsfield][ix];\n f.push(v);\n }\n }\n } else {\n for ( const ix in this.options) {\n const v = this.options[ix];\n f.push(v);\n }\n }\n return f;\n },\n bubblevalue: {\n get() { return (this.value)?this.value:null;},\n set(v) { this.$emit('input',(v)?v:null);},\n }\n },\n methods: {\n atFirst() {\n if (this.fields.length > 0) {\n return this.fields[0] == this.value;\n }\n return true; // Since it disables the button, do so if pressing it would make no sense.\n },\n atLast() {\n if (this.fields.length > 0) {\n const l = this.fields.length -1;\n return this.fields[l] == this.value;\n }\n return true; // Since it disables the button, do so if pressing it would make no sense.\n },\n prev() {\n if (this.fields.length > 0) {\n const index = this.fields.indexOf(this.value);\n if (index > 0) {\n this.$emit(\"input\",this.fields[index -1]);\n this.$emit(\"change\",this.fields[index -1]);\n }\n }\n },\n next() {\n if (this.fields.length > 0) {\n const index = this.fields.indexOf(this.value);\n const l = this.fields.length -1;\n if (index >= 0 && index < l) {\n this.$emit(\"input\",this.fields[index + 1]);\n this.$emit(\"change\",this.fields[index + 1]);\n }\n }\n },\n selectedchanged(value) {\n this.$emit(\"change\",value);\n }\n },\n template: `\n <div :class=\"'s-prevnext-selector '\">\n <b-button :variant='variant' @click=\"prev\" :disabled=\"atFirst()\"\n ><i v-if='arrows' class='fa fa-caret-left s-prevnext-arrow'></i\n ><template v-else>{{text.prev}}</template></b-button>\n <b-form-select v-model=\"bubblevalue\"\n @change='selectedchanged'\n >\n <b-form-select-option \n :disabled=\"!defaultselectable\"\n :value=\"null\"\n :class=\"(defaultselectable)?'font-italic text-primary ':'font-italic'\"\n ><slot name=\"defaultlabel\">{{text.select}}</slot></b-form-select-option>\n </b-form-select-option-group>\n <template v-if=\"grouped\">\n <template v-for=\"(g,gi) in this.options\">\n <b-form-select-option-group\n v-if=\"g[optionsfield] && g[optionsfield].length > 0\"\n :label=\"g[labelfield]\"\n >\n <b-form-select-option \n v-for=\"(o,i) in g[optionsfield]\" \n :key=\"i\"\n :value=\"o\"\n ><slot :value=\"o\">{{o[titlefield]}}</slot></b-form-select-option>\n </b-form-select-option-group>\n </template>\n </template>\n <template v-else>\n <b-form-select-option \n v-for=\"(o,i) in this.options\" \n :key=\"i\"\n :value=\"o\"\n ><slot :value=\"o\">{{o[titlefield]}}</slot></b-form-select-option>\n </template>\n </b-form-select>\n <b-button :variant='variant' @click=\"next\" :disabled=\"atLast()\"\n ><i v-if='arrows' class='fa fa-caret-right s-prevnext-arrow'></i\n ><template v-else>{{text.next}}</template></b-button>\n </div>\n `,\n });\n\n\n }\n};"],"names":["install","Vue","use","FitTextVue","strings","studyplancard","open","noenddate","idnumber","description","completed","details","suspended","extrafields","show","prevnext","prev","previous","next","select","ItemEventBus","component","props","value","type","Object","Boolean","ignoresuspend","default","data","text","computed","timeless","plan","this","pages","length","timing","dates","start","end","methods","onOpenClick","e","$emit","template","Number","min","max","width_completed","width_incomplete","percentage_complete","v","Math","round","identifier","layerHeights","created","$on","onHeaderHeightChange","newheight","$refs","main","style","height","mode","String","mounted","self","period","resizeListener","ResizeObserver","size","getBoundingClientRect","observe","unmounted","disconnect","startdate","enddate","current","now","Date","pstart","pend","variant","pill","Array","position","fields","ix","field","push","displaydate","options","grouped","titlefield","labelfield","optionsfield","defaultselectable","arrows","f","gix","group","bubblevalue","get","set","atFirst","atLast","l","index","indexOf","selectedchanged"],"mappings":"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"}