/*eslint no-var: "error"*/ /*eslint no-console: "off"*/ /*eslint-disable no-trailing-spaces */ /*eslint-env es6*/ // Put this file in path/to/plugin/amd/src import {load_strings} from './string-helper'; export default { studyplanTiming(a) { const now = new Date().getTime(); let timing = 'future'; if(new Date(a.startdate).getTime() < now){ if(a.enddate && now > new Date(a.enddate).getTime()) { timing = 'past'; } else { timing = 'present'; } } return timing; }, install(Vue/*,options*/){ let strings = load_strings({ studyplancard: { open: "open", noenddate: "noenddate", } }); // Create new eventbus for interaction between item components const ItemEventBus = new Vue(); Vue.component('s-studyplan-card', { props: { value: { type: Object, }, open: { type: Boolean } }, data() { return { text: strings.studyplancard }; }, computed: { timing(){ const now = new Date().getTime(); const startdate = new Date(this.value.pages[0].startdate).getTime(); const enddate = new Date(this.value.pages[0].enddate).getTime(); let timing = 'future'; if(startdate < now){ if(this.value.pages[0].enddate && now > enddate) { timing = 'past'; } else { timing = 'present'; } } return timing; }, startdate(){ const opts = { year: 'numeric', month: 'short', day: 'numeric' }; return new Date(this.value.pages[0].startdate).toLocaleDateString(document.documentElement.lang,opts); }, enddate(){ if(this.value.enddate){ const opts = { year: 'numeric', month: 'short', day: 'numeric' }; return new Date(this.value.pages[0].enddate).toLocaleDateString(document.documentElement.lang,opts); } else { return this.text.noenddate; } } }, methods: { onOpenClick(e) { this.$emit('open',e); } }, template: ` {{value.name}} {{ value.description }} `, }); /* * S-STUDYLINE-HEADER-HEADING * The only reasing this is not a simple empty div, is the fact that the header height * needs to match that of the period headers */ Vue.component('s-studyline-header-heading', { props: { }, data() { return { layerHeights: {} }; }, created() { // Listener for the signal that a new connection was made and needs to be drawn // Sent by the incoming item - By convention, outgoing items are responsible for drawing the lines ItemEventBus.$on('headerHeightChange', this.onHeaderHeightChange); }, computed: { }, methods: { onHeaderHeightChange(newheight){ console.info("Height change event to",newheight); this.$refs.main.style.height = `${newheight}px`; } }, template: `
`, }); Vue.component('s-studyline-header-period', { props: { value: { type: Object, // dict with layer as index }, }, mounted() { const self=this; if(self.value.period == 1){ self.resizeListener = new ResizeObserver(() => { if(self.$refs.main){ const size = self.$refs.main.getBoundingClientRect(); ItemEventBus.$emit('headerHeightChange', size.height); } }).observe(self.$refs.main); } }, unmounted() { if(this.resizeListener) { this.resizeListener.disconnect(); } }, computed: { }, data() { return { }; }, template: `
{{ value.shortname }}
`, }); } };