Skip to content
Snippets Groups Projects
I18nTextarea.vue 6.97 KiB
Newer Older
<template>
    <div class="i18n_group" v-if="languages.length > 1">
        <div class="i18n"
             v-if="selectedLanguage !== null"
             :data-lang="selectedLanguage.name"
             :data-icon="'url(' + assetsURL + 'images/languages/' + selectedLanguage.picture + ')'">
                   :name="nameOfInput(selectedLanguage.id)"
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
                   v-model="currentText"
                   :required="required && defaultLanguage === selectedLanguage.id"
                   v-bind="$attrs"
                   v-on="$listeners"
                   v-if="type === 'text'">
            <textarea :name="nameOfInput(selectedLanguage.id)"
                      v-bind="$attrs"
                      v-on="$listeners"
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
                      v-model="currentText"
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
                      :required="required && defaultLanguage === selectedLanguage.id"
                      v-else-if="type === 'textarea'"></textarea>
            <studip-wysiwyg :name="nameOfInput(selectedLanguage.id)"
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
                            v-model="currentText"
                            v-bind="$attrs"
                            v-on="$listeners"
                            :required="required && defaultLanguage === selectedLanguage.id"
        </div>
        <input type="hidden"
               v-for="language in otherLanguages"
               :key="`hidden-${language.id}`"
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
               v-model="currentText"
               :required="required && defaultLanguage === language.id"
               :name="nameOfInput(language.id)">
                @change="selectLanguage"
                :aria-label="$gettext('Sprache des Textfeldes auswählen.')"
                :style="'background-image: url(' + assetsURL + 'images/languages/' + selectedLanguage.picture + ')'">
            <option v-for="language in languages" :value="language.id" :key="`option-${language.id}`">
                {{language.name}}
            </option>
        </select>
    </div>
    <div v-else>
        <input type=text
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
               v-model="currentText"
               v-bind="$attrs"
               v-on="$listeners"
               :required="required"
               v-if="type === 'text'">
        <textarea :name="name"
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
                  v-model="currentText"
                  v-bind="$attrs"
                  v-on="$listeners"
                  :required="required"
                  v-else-if="type === 'textarea'"></textarea>
        <studip-wysiwyg :name="name"
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
                        v-model="currentText"
                        v-bind="$attrs"
                        v-on="$listeners"
                        :required="required"
    </div>
</template>

<script>
import StudipWysiwyg from './StudipWysiwyg.vue';
export default {
    name: 'i18n-textarea',
    components: {
        StudipWysiwyg
    },
    props: {
        name: {
            type: String,
            required: false
        },
        wysiwyg: {
            type: Boolean,
            required: false,
            default: false
        },
        type: {
            type: String,
            required: false,
            default: "text"
        },
        value: {
            required: false,
            default: ""
        },
        required: {
            type: Boolean,
            required: false,
            default: false
        }
    },
    data () {
        return {
            selectedLanguage: {},
            values: {}
        };
    },
    mounted () {
        for (let i in this.languages) {
            this.selectedLanguage = this.languages[i];
            break;
        }
        let jsonvalue = false;
        try {
            jsonvalue = JSON.parse(this.value);
        } catch (except) {
        }
        if (jsonvalue !== false) {
            this.values = jsonvalue;
        } else {
            let values = {};
            values[this.selectedLanguage.id] = this.value;
            this.values = values;
        }
        this.$emit('selectlanguage', this.selectedLanguage.id);
    },
    methods: {
        selectLanguage (e) {
            for (let i in this.languages) {
                if (e.target.value === this.languages[i].id) {
                    this.selectedLanguage = this.languages[i];
                    this.$emit('selectlanguage', this.languages[i].id);
                        if (typeof this.$refs.inputfield.focus === "function") {
                            this.$refs.inputfield.focus();
                        } else if (typeof this.$refs.inputfield.prefill === 'function') {
                            this.$refs.inputfield.prefill();
                    break;
                }
            }
        },
        nameOfInput (language_id) {
            return this.name + (this.defaultLanguage === language_id ? '' : '_i18n[' + language_id + ']')
        }
    },
    computed: {
        assetsURL () {
            return STUDIP.ASSETS_URL;
        },
        defaultLanguage () {
            return this.languages[0].id;
        },
        languages () {
            let languages = [];
            let language = {};
            for (let i in STUDIP.CONTENT_LANGUAGES) {
                if (STUDIP.INSTALLED_LANGUAGES[STUDIP.CONTENT_LANGUAGES[i]] !== undefined) {
                    language = STUDIP.INSTALLED_LANGUAGES[STUDIP.CONTENT_LANGUAGES[i]];
                    language.id = STUDIP.CONTENT_LANGUAGES[i];
                    languages.push(language);
                }
            }
            return languages;
            return this.languages.filter(language => language.id !== this.selectedLanguage.id);
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
        },
        currentText: {
            get () {
                return this.values[this.selectedLanguage.id] ?? '';
            },
            set (newValue) {
                this.values[this.selectedLanguage.id] = newValue;
            },
        },
    },
    inheritAttrs: false,
    watch: {
        values: {
            handler(newValue, oldValue) {
                this.$emit('input', newValue[this.defaultLanguage]);
                let input_all = {};
                for (let i in this.languages) {
                    let name = this.nameOfInput(this.languages[i].id);
                    let value = newValue[this.languages[i].id];

                    if (this.type === 'wysiwyg' && value !== null) {
                        value = STUDIP.wysiwyg.markAsHtml(value);
                    }

                    input_all[name] = value;
                }
                this.$emit('allinputs', input_all);
            },
            deep: true
        }
    }
}
</script>