Skip to content
Snippets Groups Projects
Forked from Stud.IP / Stud.IP
4045 commits behind the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
CoursewareRibbonToolbar.vue 4.62 KiB
<template>
    <div
        class="cw-ribbon-tools"
        :class="{ unfold: toolsActive, 'cw-ribbon-tools-consume': consumeMode }"
    >
        <div class="cw-ribbon-tool-content" ref="ribbonContent">
            <div class="cw-ribbon-tool-content-nav">
                <ul>
                    <li 
                        tabindex="0"
                        ref="focusPoint"
                        :class="{ active: showContents }"
                        @click="displayTool('contents')"
                    >
                        <translate>Inhaltsverzeichnis</translate>
                    </li>
                    <li
                        v-if="!consumeMode && showEditMode && canEdit"
                        tabindex="0"
                        :class="{ active: showBlockAdder }"
                        @click="displayTool('blockadder')"
                    >
                        <translate>Elemente hinzufügen</translate>
                    </li>
                    <li 
                        v-if="!consumeMode && displaySettings" 
                        tabindex="0" 
                        :class="{ active: showAdmin }"
                        @click="displayTool('admin')"
                    >
                        <translate>Einstellungen</translate>
                    </li>
                </ul>
                <button :title="textClose" class="cw-tools-hide-button" @click="$emit('deactivate')"></button>
            </div>
            <div class="cw-ribbon-tool">
                <courseware-tools-contents v-if="showContents" />
                <courseware-tools-blockadder v-if="showBlockAdder" @scrollTop="scrollTop"/>
                <courseware-tools-admin v-if="showAdmin" />
            </div>
        </div>
    </div>
</template>
<script>
import CoursewareToolsAdmin from './CoursewareToolsAdmin.vue';
import CoursewareToolsBlockadder from './CoursewareToolsBlockadder.vue';
import CoursewareToolsContents from './CoursewareToolsContents.vue';
import { mapGetters } from 'vuex';

export default {
    name: 'courseware-ribbon-toolbar',
    components: {
        CoursewareToolsAdmin,
        CoursewareToolsBlockadder,
        CoursewareToolsContents,
    },
    props: {
        toolsActive: Boolean,
        canEdit: Boolean,
    },
    data() {
        return {
            showContents: true,
            showAdmin: false,
            showBlockAdder: false,
            textClose: this.$gettext('schließen')
        };
    },
    computed: {
        ...mapGetters({
            userIsTeacher: 'userIsTeacher',
            consumeMode: 'consumeMode',
            containerAdder: 'containerAdder',
            adderStorage: 'blockAdder',
            viewMode: 'viewMode',
            context: 'context',
            userById: 'users/byId',
            userId: 'userId',
        }),
        showEditMode() {
            return this.viewMode === 'edit';
        },
        displaySettings() {
            let user = this.userById({ id: this.userId });
            return this.context.type === 'courses' && (this.isTeacher || ['root', 'admin'].includes(user.attributes.permission));
        },
        isTeacher() {
            return this.userIsTeacher;
        },
    },
    methods: {
        displayTool(tool) {
            this.showContents = false;
            this.showAdmin = false;
            this.showBlockAdder = false;

            switch (tool) {
                case 'contents':
                    this.showContents = true;
                    this.disableContainerAdder();
                    break;
                case 'admin':
                    this.showAdmin = true;
                    this.disableContainerAdder();
                    break;
                case 'blockadder':
                    this.showBlockAdder = true;
                    break;
            }
        },
        disableContainerAdder() {
            if (this.containerAdder !== false) {
                this.$store.dispatch('coursewareContainerAdder', false);
            }
        },
        scrollTop() {
            this.$refs.ribbonContent.scrollTop = 0;
        }
    },
    watch: {
        adderStorage(newValue) {
            if (Object.keys(newValue).length !== 0) {
                this.displayTool('blockadder');
            }
        },
        consumeMode(newValue) {
            if (newValue) {
                this.displayTool('contents');
            }
        },
        containerAdder(newValue) {
            if (newValue === true) {
                this.displayTool('blockadder');
            }
        },
        showEditMode(newValue) {
            if (!newValue) {
                this.displayTool('contents');
            }
        }
    },
};
</script>