Skip to content
Snippets Groups Projects
CoursewareTextBlock.vue 3.5 KiB
Newer Older
<template>
    <div class="cw-block cw-block-text">
        <courseware-default-block
            :block="block"
            :canEdit="canEdit"
            :isTeacher="isTeacher"
            :preview="false"
            ref="defaultBlock"
Ron Lucke's avatar
Ron Lucke committed
            @showEdit="initCurrent"
            @storeEdit="storeText"
Ron Lucke's avatar
Ron Lucke committed
            @closeEdit="initCurrent"
        >
            <template #content>
                <section class="formatted-content" v-html="currentText" ref="content"></section>
            </template>
            <template v-if="canEdit" #edit>
Ron Lucke's avatar
Ron Lucke committed
                <ckeditor :editor="editor" v-model="currentText" :config="editorConfig" @ready="onReady"></ckeditor>
            </template>
            <template #info><translate>Informationen zum Text-Block</translate></template>
        </courseware-default-block>
    </div>
</template>

<script>
import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
Ron Lucke's avatar
Ron Lucke committed
import { blockMixin } from './block-mixin.js';
import ClassicEditor from '../../../assets/javascripts/chunks/wysiwyg.js'
import { mapActions } from 'vuex';

export default {
    name: 'courseware-text-block',
Ron Lucke's avatar
Ron Lucke committed
    mixins: [blockMixin],
    components: {
        CoursewareDefaultBlock,
    },
    props: {
        block: Object,
        canEdit: Boolean,
        isTeacher: Boolean,
    },
    data() {
        return {
            currentText: '',
            editor: ClassicEditor,
            editorConfig: {
                // The configuration of the editor.
            }
Ron Lucke's avatar
Ron Lucke committed
        text() {    
            return this.block?.attributes?.payload?.text;
        },
Ron Lucke's avatar
Ron Lucke committed
        ckeToolbarTop() {
            const topBar = document.getElementById('top-bar');
            const responsiveContentbar = document.getElementById('responsive-contentbar');
            let top = topBar.clientHeight + topBar.clientTop;
            if (responsiveContentbar) {
                top += responsiveContentbar?.clientHeight + responsiveContentbar?.clientTop;
            } else {
                top += 85;
            }
            
            return top;
        },
Ron Lucke's avatar
Ron Lucke committed
        this.initCurrent();
    },
    methods: {
        ...mapActions({
            updateBlock: 'updateBlockInContainer',
        }),
Ron Lucke's avatar
Ron Lucke committed
        initCurrent() {
            this.currentText = this.text;
Ron Lucke's avatar
Ron Lucke committed
            this.loadMathjax();
Ron Lucke's avatar
Ron Lucke committed
        onReady( editor )  {
            editor.ui.viewportOffset = { top: this.ckeToolbarTop };
            editor.ui.update();
        },
        async storeText() {
            let attributes = this.block.attributes;
            attributes.payload.text = this.currentText;
            await this.updateBlock({
                attributes: attributes,
                blockId: this.block.id,
                containerId: this.block.relationships.container.data.id,
            });
            this.$refs.defaultBlock.displayFeature(false);
Ron Lucke's avatar
Ron Lucke committed
            this.loadMathjax();
Ron Lucke's avatar
Ron Lucke committed
        loadMathjax() {
            let mathjaxP;
            let view = this;

            if (window.MathJax && window.MathJax.Hub) {
                mathjaxP = Promise.resolve(window.MathJax);
            } else if (window.STUDIP && window.STUDIP.loadChunk) {
                mathjaxP = window.STUDIP.loadChunk('mathjax');
            }

            mathjaxP && mathjaxP
            .then(({ Hub }) => {
                Hub.Queue(['Typeset', Hub, view.$refs.content]);
            })
            .catch(() => {
                console.log('Warning: Could not load MathJax.');
            });
Ron Lucke's avatar
Ron Lucke committed
        },
    }