Select Git revision
CoursewareRibbon.vue
Forked from
Stud.IP / Stud.IP
Source project has a limited visibility.
-
Ron Lucke authored
Closes #3361 Merge request studip/studip!2293
Ron Lucke authoredCloses #3361 Merge request studip/studip!2293
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
CoursewareRibbon.vue 5.66 KiB
<template>
<div :class="{ 'cw-ribbon-wrapper-consume': consumeMode }" :id="isContentBar ? 'contentbar' : null" >
<div v-show="stickyRibbon" class="cw-ribbon-sticky-top"></div>
<header class="cw-ribbon" :class="{ 'cw-ribbon-sticky': stickyRibbon, 'cw-ribbon-consume': consumeMode }">
<div class="cw-ribbon-wrapper-left">
<nav class="cw-ribbon-nav" :class="buttonsClass">
<slot name="buttons" />
</nav>
<nav class="cw-ribbon-breadcrumb">
<ul>
<slot v-if="breadcrumbFallback" name="breadcrumbFallback" />
<slot v-else name="breadcrumbList" />
</ul>
</nav>
</div>
<div class="cw-ribbon-wrapper-right">
<button
v-if="showToolbarButton"
class="cw-ribbon-button cw-ribbon-button-menu"
:title="textRibbon.toolbar"
@click.prevent="activeToolbar"
>
</button>
<slot name="menu" />
</div>
<div v-if="consumeMode" class="cw-ribbon-consume-bottom"></div>
<courseware-ribbon-toolbar
v-if="showTools"
:toolsActive="unfold"
:stickyRibbon="stickyRibbon"
:class="{ 'cw-ribbon-tools-sticky': stickyRibbon }"
:style="{ height: toolbarHeight + 'px' }"
:canEdit="canEdit"
@deactivate="deactivateToolbar"
@blockAdded="$emit('blockAdded')"
/>
</header>
<div v-if="stickyRibbon" class="cw-ribbon-sticky-bottom"></div>
<div v-if="stickyRibbon" class="cw-ribbon-sticky-spacer"></div>
</div>
</template>
<script>
import CoursewareRibbonToolbar from './CoursewareRibbonToolbar.vue';
import { mapActions, mapGetters } from 'vuex';
export default {
name: 'courseware-ribbon',
components: {
CoursewareRibbonToolbar,
},
props: {
canEdit: Boolean,
showToolbarButton: {
default: true,
type: Boolean
},
showModeSwitchButton: {
default: true,
type: Boolean
},
buttonsClass: String,
isContentBar: {
type: Boolean,
default: false
}
},
data() {
return {
readModeActive: false,
stickyRibbon: false,
textRibbon: {
toolbar: this.$gettext('Inhaltsverzeichnis'),
fullscreen_on: this.$gettext('Fokusmodus einschalten'),
fullscreen_off: this.$gettext('Fokusmodus ausschalten'),
},
unfold: false,
showTools: false,
};
},
computed: {
...mapGetters({
consumeMode: 'consumeMode',
toolsActive: 'showToolbar'
}),
breadcrumbFallback() {
return window.outerWidth < 1200;
},
toolbarHeight() {
if (this.stickyRibbon) {
return parseInt(window.innerHeight * 0.75);
} else {
return parseInt(Math.min(window.innerHeight * 0.75, window.innerHeight - 197));
}
}
},
methods: {
...mapActions({
coursewareConsumeMode: 'coursewareConsumeMode',
coursewareSelectedToolbarItem: 'coursewareSelectedToolbarItem',
coursewareViewMode: 'coursewareViewMode',
coursewareShowToolbar: 'coursewareShowToolbar'
}),
toggleConsumeMode() {
STUDIP.eventBus.emit('toggle-focus-mode', !this.consumeMode);
if (!this.consumeMode) {
document.body.classList.add('consuming_mode');
this.coursewareConsumeMode(true);
this.coursewareSelectedToolbarItem('contents');
this.coursewareViewMode('read');
} else {
this.coursewareConsumeMode(false);
document.body.classList.remove('consuming_mode');
}
},
activeToolbar() {
this.coursewareShowToolbar(true);
},
deactivateToolbar() {
this.coursewareShowToolbar(false);
},
handleScroll() {
if (window.outerWidth > 767) {
this.stickyRibbon = window.scrollY > 128 && !this.consumeMode;
} else {
this.stickyRibbon = window.scrollY > 75 && !this.consumeMode;
}
},
},
mounted() {
window.addEventListener('scroll', this.handleScroll);
if (this.isContentBar) {
STUDIP.eventBus.emit('courseware-contentbar-mounted', this);
}
this.globalOn('switch-focus-mode', (state) => {
if (state !== this.consumeMode) {
this.toggleConsumeMode();
}
});
},
beforeDestroy() {
STUDIP.eventBus.off('switch-focus-mode');
},
watch: {
toolsActive(newState, oldState) {
let view = this;
if(newState) {
this.showTools = true;
setTimeout(() => {view.unfold = true}, 10);
} else {
this.unfold = false;
setTimeout(() => {
if(!view.toolsActive) {
view.showTools = false;
}
}, 800);
}
},
consumeMode(newState) {
if (newState) {
document.body.classList.add('consuming_mode');
} else {
document.body.classList.remove('consuming_mode');
}
}
}
};
</script>