Vue.component('tt-resolver', { props: { value: {type: Number, required: true}, reference: {type: String, required: true}, }, data() { return { window: window, loading: true, text: '', } }, template: `
Loading...
{{ text }} `, async created() { const entry = await axios.get(window.TT_CONFIG['BASE_PATH'] + '/' + this.reference + '/getById?id=' + this.value); this.text = entry.data.name ?? entry.data.title ?? entry.data.text ?? '[E] Key not found'; this.loading = false; } }) Vue.component('tt-positions-manager', { props: { value: {type: [Array, String], required: false}, config: {type: Object, required: true}, groupMode: {type: Boolean, default: false}, }, data() { return { window: window, positions: this.value, formData: {}, groupName: '', selectedIndex: null, } }, template: `
{{ field.label }} Aktionen
`, methods: { updateField(key, value) { this.$set(this.formData, key, value); }, defaultValidateForm(formData) { console.log(this.config["validateFormOptions"], formData); for (const field of this.config["validateFormOptions"]) { if (!(formData[field.key] || formData[field.key + '_text'])) { window.notify('error', field.message); return false; } } return true; }, async saveEntry() { if (this.config.hasOwnProperty('validateFormOptions') && !this.defaultValidateForm(this.formData)) return; else if (this.config.validateForm && !await this.config.validateForm(this.formData)) return; if (this.selectedIndex === null) this.positions.push(this.formData); else this.$set(this.positions, this.selectedIndex, this.formData); if (this.config.customOrdering) { this.positions.sort((a, b) => a[this.config.customOrdering] - b[this.config.customOrdering]); } this.$emit('input', this.positions); this.resetForm(); }, addGroup() { this.positions.push({_group: this.groupName}); this.groupName = ''; }, editEntry(index) { this.selectedIndex = index; this.formData = {...this.positions[index]}; }, deleteEntry(index) { this.positions.splice(index, 1); this.$emit('input', this.positions); }, resetForm() { this.formData = {}; this.selectedIndex = null; }, formatFieldValue(value, field) { if (field.formatter) return field.formatter(value); return value; }, }, //TODO: cleanup created() { if (this.config["customMethods"]) Object.assign(this, this.config.customMethods); if (!this.positions) this.positions = []; if (typeof this.positions === 'string') { try { this.positions = JSON.parse(this.positions); } catch (e) { console.error(e); this.positions = []; } } }, computed: { groupedPositions() { const groups = {}; for (const position of this.positions) { const group = position._group ?? 'Keine Gruppe'; if (!groups[group]) groups[group] = []; if (Object.keys(position).length !== 1) groups[group].push(position); } return groups; }, positionsToRender() { return this.groupMode ? this.groupedPositions : { '': this.positions }; }, allGroups() { return Object.keys(this.groupedPositions); } }, watch: { value: { handler() { this.positions = this.value; }, deep: true } } });