Skip to content
Snippets Groups Projects
CoursewareKeyPointBlock.vue 6.8 KiB
Newer Older
    <div class="cw-block cw-block-keypoint">
        <courseware-default-block
            :block="block"
            :canEdit="canEdit"
            :isTeacher="isTeacher"
            :preview="true"
Ron Lucke's avatar
Ron Lucke committed
            @showEdit="initCurrentData"
Ron Lucke's avatar
Ron Lucke committed
            @storeEdit="storeBlock"
Ron Lucke's avatar
Ron Lucke committed
            @closeEdit="initCurrentData"
        >
            <template #content>
                <div class="cw-keypoint-content" :class="['cw-keypoint-' + currentColor]">
                    <studip-icon v-if="currentIcon" :size="48" :shape="currentIcon" :role="currentRole" />
                    <p class="cw-keypoint-sentence">{{ currentText }}</p>
                </div>
            </template>
            <template v-if="canEdit" #edit>
                <form class="default" @submit.prevent="">
                    <label class="col-4">
                        {{ $gettext('Merksatz') }}
                        <input
                            type="text"
                            name="cw-keypoint-content"
                            class="cw-keypoint-set-content"
                            v-model="currentText"
                            spellcheck="true"
                        />
                    </label>
                    <label class="col-2">
                        {{ $gettext('Farbe') }}
                            :options="colors"
                            label="icon"
                            :clearable="false"
                            :reduce="(option) => option.icon"
                            v-model="currentColor"
                        >
                            <template #open-indicator="selectAttributes">
Ron Lucke's avatar
Ron Lucke committed
                                <span v-bind="selectAttributes"><studip-icon shape="arr_1down" :size="10" /></span>
                            <template #no-options>
                                {{ $gettext('Es steht keine Auswahl zur Verfügung.') }}
                            <template #selected-option="{ name, hex }">
                                <span class="vs__option-color" :style="{ 'background-color': hex }"></span
                                ><span>{{ name }}</span>
                            <template #option="{ name, hex }">
                                <span class="vs__option-color" :style="{ 'background-color': hex }"></span
                                ><span>{{ name }}</span>
                    <label class="col-2">
                        {{ $gettext('Icon') }}
                        <studip-select :options="icons" :clearable="false" v-model="currentIcon">
                            <template #open-indicator="selectAttributes">
Ron Lucke's avatar
Ron Lucke committed
                                <span v-bind="selectAttributes"><studip-icon shape="arr_1down" :size="10" /></span>
                            <template #no-options>
                                {{ $gettext('Es steht keine Auswahl zur Verfügung.') }}
                            </template>
                            <template #selected-option="option">
                                <studip-icon :shape="option.label" />
                                <span class="vs__option-with-icon">{{ option.label }}</span>
                            </template>
                            <template #option="option">
                                <studip-icon :shape="option.label" />
                                <span class="vs__option-with-icon">{{ option.label }}</span>
                    </label>
                </form>
            </template>
            <template #info>
                <p>{{ $gettext('Informationen zum Merksatz-Block') }}</p>
            </template>
        </courseware-default-block>
    </div>
</template>

<script>
import BlockComponents from './block-components.js';
import blockMixin from '@/vue/mixins/courseware/block.js';
import colorMixin from '@/vue/mixins/courseware/colors.js';
import contentIconsMixin from '@/vue/mixins/courseware/content-icons.js';
import { mapActions } from 'vuex';

export default {
    name: 'courseware-key-point-block',
    mixins: [blockMixin, colorMixin, contentIconsMixin],
    components: Object.assign(BlockComponents, {}),
    props: {
        block: Object,
        canEdit: Boolean,
        isTeacher: Boolean,
    },
    data() {
        return {
            currentText: '',
            currentColor: '',
            currentIcon: '',
        };
    },
    computed: {
        file() {
            return `icons/${this.color}/${this.icon}.svg`;
        },
        icons() {
            return this.contentIcons;
            return this.mixinColors.filter(
                (color) => color.icon && color.class !== 'white' && color.class !== 'studip-lightblue'
        },
        text() {
            return this.block?.attributes?.payload?.text;
        },
        color() {
            return this.block?.attributes?.payload?.color;
        },
        icon() {
            return this.block?.attributes?.payload?.icon;
        },
        currentRole() {
            switch (this.currentColor) {
                case 'black':
                    return 'info';

                case 'grey':
                    return 'inactive';

                case 'green':
                    return 'status-green';

                case 'red':
                    return 'status-red';

                case 'white':
                    return 'info_alt';

                case 'yellow':
                    return 'status-yellow';

                case 'blue':
                    return 'clickable';
            }
    },
    methods: {
        ...mapActions({
            updateBlock: 'updateBlockInContainer',
        }),
        initCurrentData() {
            this.currentText = this.text;
            this.currentColor = this.color;
            this.currentIcon = this.icon;
        },
        storeBlock() {
            let attributes = {};
            attributes.payload = {};
            attributes.payload.text = this.currentText;
            attributes.payload.color = this.currentColor;
            attributes.payload.icon = this.currentIcon;

            this.updateBlock({
                attributes: attributes,
                blockId: this.block.id,
                containerId: this.block.relationships.container.data.id,
            });
        },
    },
    mounted() {
        this.initCurrentData();
    },
};
</script>
<style scoped lang="scss">
@import '../../../../assets/stylesheets/scss/courseware/blocks/keypoint.scss';
</style>