Skip to content
Snippets Groups Projects
Select Git revision
  • 80a8a75ea6070650b86d4f6aa008bfb65b22f513
  • 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

AdminCourseFilter.class.php

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.
    CoursewareCodeBlock.vue 3.54 KiB
    <template>
        <div class="cw-block cw-block-code">
            <courseware-default-block
                :block="block"
                :canEdit="canEdit"
                :isTeacher="isTeacher"
                :preview="true"
                @showEdit="initCurrentData"
                @storeEdit="storeBlock"
                @closeEdit="initCurrentData"
            >
                <template #content>
                    <pre v-show="currentContent !== ''"  v-highlightjs="currentContent"><code ref="code" :class="[currentLang]"></code></pre>
                    <div v-show="currentLang !== ''" class="code-lang">
                        <span>{{ currentLang }}</span>
                    </div>
                </template>
                <template v-if="canEdit" #edit>
                    <form class="default" @submit.prevent="">
                        <label>
                            <translate>Sprache</translate>
                            <input type="text" v-model="currentLang" />
                        </label>
                        <label>
                            <translate>Quelltext</translate>
                            <textarea v-model="currentContent"></textarea>
                        </label>
                    </form>
                </template>
                <template #info>
                    <p><translate>Informationen zum Quelltext-Block</translate></p>
                </template>
            </courseware-default-block>
        </div>
    </template>
    
    <script>
    import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
    import { blockMixin } from './block-mixin.js';
    import hljs from 'highlight.js';
    
    import { mapActions } from 'vuex';
    
    export default {
        name: 'courseware-code-block',
        mixins: [blockMixin],
        components: {
            CoursewareDefaultBlock,
        },
        props: {
            block: Object,
            canEdit: Boolean,
            isTeacher: Boolean,
        },
        data() {
            return {
                currentLang: '',
                currentContent: '',
            };
        },
        computed: {
            content() {
                return this.block?.attributes?.payload?.content;
            },
            lang() {
                return this.block?.attributes?.payload?.lang;
            },
        },
        directives: {
            highlightjs: {
                deep: true,
                bind(el, binding) {
                    let targets = el.querySelectorAll('code');
                    targets.forEach((target) => {
                        if (binding.value) {
                            target.innerHTML = binding.value;
                        }
                        hljs.highlightBlock(target);
                    });
                },
                componentUpdated(el, binding) {
                    let targets = el.querySelectorAll('code');
                    targets.forEach((target) => {
                        if (binding.value) {
                            target.innerHTML = binding.value;
                            hljs.highlightBlock(target);
                        }
                    });
                },
            },
        },
        mounted() {
            this.initCurrentData();
        },
        methods: {
            ...mapActions({
                updateBlock: 'updateBlockInContainer',
            }),
            initCurrentData() {
                this.currentLang = this.lang;
                this.currentContent = this.content;
            },
            storeBlock() {
                let attributes = {};
                attributes.payload = {};
                attributes.payload.lang = this.currentLang;
                attributes.payload.content = this.currentContent;
    
                this.updateBlock({
                    attributes: attributes,
                    blockId: this.block.id,
                    containerId: this.block.relationships.container.data.id,
                });
            },
        },
    };
    </script>