Skip to content
Snippets Groups Projects
Select Git revision
  • 54e6a1d0caf1474544fe789ed401f55cbc3cc5b3
  • main default protected
  • step-3263
  • feature/plugins-cli
  • feature/vite
  • step-2484-peerreview
  • biest/issue-5051
  • tests/simplify-jsonapi-tests
  • fix/typo-in-1a70031
  • feature/broadcasting
  • database-seeders-and-factories
  • feature/peer-review-2
  • feature-feedback-jsonapi
  • feature/peerreview
  • feature/balloon-plus
  • feature/stock-images-unsplash
  • tic-2588
  • 5.0
  • 5.2
  • biest/unlock-blocks
  • biest-1514
21 results

CoursewareRibbon.vue

Blame
  • Forked from Stud.IP / Stud.IP
    Source project has a limited visibility.
    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>