Skip to content
Snippets Groups Projects
Commit d9792e42 authored by Ron Lucke's avatar Ron Lucke Committed by David Siegfried
Browse files

fix #3908

Closes #3908

Merge request studip/studip!2775
parent 4aba8064
No related branches found
No related tags found
No related merge requests found
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
confirmClass="accept" confirmClass="accept"
:closeText="$gettext('Schließen')" :closeText="$gettext('Schließen')"
closeClass="cancel" closeClass="cancel"
height="470" height="540"
width="870" width="870"
@close="$emit('close')" @close="$emit('close')"
@confirm="storeLayout" @confirm="storeLayout"
...@@ -23,12 +23,8 @@ ...@@ -23,12 +23,8 @@
<label v-if="showPreviewImage"> <label v-if="showPreviewImage">
<button class="button" @click="deleteImage">{{ $gettext('Bild löschen') }}</button> <button class="button" @click="deleteImage">{{ $gettext('Bild löschen') }}</button>
</label> </label>
<courseware-companion-box <courseware-companion-box v-if="uploadFileError" :msgCompanion="uploadFileError" mood="sad" />
v-if="uploadFileError" <template v-if="!showPreviewImage">
:msgCompanion="uploadFileError"
mood="sad"
/>
<label v-if="!showPreviewImage">
<img <img
v-if="currentFile" v-if="currentFile"
:src="uploadImageURL" :src="uploadImageURL"
...@@ -36,9 +32,27 @@ ...@@ -36,9 +32,27 @@
:alt="$gettext('Vorschaubild')" :alt="$gettext('Vorschaubild')"
/> />
<div v-else class="cw-structural-element-image-preview-placeholder"></div> <div v-else class="cw-structural-element-image-preview-placeholder"></div>
<label>
{{ $gettext('Bild hochladen') }} {{ $gettext('Bild hochladen') }}
<input class="cw-file-input" ref="upload_image" type="file" accept="image/*" @change="checkUploadFile" /> <input
class="cw-file-input"
ref="upload_image"
type="file"
accept="image/*"
@change="checkUploadFile"
/>
</label> </label>
{{ $gettext('oder') }}
<br />
<button class="button" type="button" @click="showStockImageSelector = true">
{{ $gettext('Aus dem Bilderpool auswählen') }}
</button>
<StockImageSelector
v-if="showStockImageSelector"
@close="showStockImageSelector = false"
@select="onSelectStockImage"
/>
</template>
</form> </form>
<form class="default cw-unit-item-dialog-layout-content-settings" @submit.prevent=""> <form class="default cw-unit-item-dialog-layout-content-settings" @submit.prevent="">
<label> <label>
...@@ -62,13 +76,9 @@ ...@@ -62,13 +76,9 @@
class="cw-vs-select" class="cw-vs-select"
> >
<template #open-indicator="selectAttributes"> <template #open-indicator="selectAttributes">
<span v-bind="selectAttributes" <span v-bind="selectAttributes"><studip-icon shape="arr_1down" :size="10" /></span>
><studip-icon shape="arr_1down" :size="10"
/></span>
</template>
<template #no-options>
{{ $gettext('Es steht keine Auswahl zur Verfügung') }}.
</template> </template>
<template #no-options> {{ $gettext('Es steht keine Auswahl zur Verfügung') }}. </template>
<template #selected-option="{ name, hex }"> <template #selected-option="{ name, hex }">
<span class="vs__option-color" :style="{ 'background-color': hex }"></span <span class="vs__option-color" :style="{ 'background-color': hex }"></span
><span>{{ name }}</span> ><span>{{ name }}</span>
...@@ -96,19 +106,19 @@ ...@@ -96,19 +106,19 @@
<script> <script>
import CoursewareCompanionBox from '../layouts/CoursewareCompanionBox.vue'; import CoursewareCompanionBox from '../layouts/CoursewareCompanionBox.vue';
import StockImageSelector from '../../stock-images/SelectorDialog.vue';
import colorMixin from '@/vue/mixins/courseware/colors.js'; import colorMixin from '@/vue/mixins/courseware/colors.js';
import { mapActions, mapGetters } from 'vuex'; import { mapActions, mapGetters } from 'vuex';
export default { export default {
name: 'courseware-unit-item-dialog-layout', name: 'courseware-unit-item-dialog-layout',
components: { components: {
CoursewareCompanionBox CoursewareCompanionBox,
StockImageSelector,
}, },
props: { props: {
unit: Object, unit: Object,
unitElement: Object unitElement: Object,
}, },
mixins: [colorMixin], mixins: [colorMixin],
data() { data() {
...@@ -120,18 +130,26 @@ export default { ...@@ -120,18 +130,26 @@ export default {
uploadImageURL: null, uploadImageURL: null,
currentRootLayout: 'default', currentRootLayout: 'default',
loadingInstance: false, loadingInstance: false,
} showStockImageSelector: false,
selectedStockImage: null,
};
}, },
computed: { computed: {
...mapGetters({ ...mapGetters({
context: 'context', context: 'context',
instanceById: 'courseware-instances/byId', instanceById: 'courseware-instances/byId',
userId: 'userId' userId: 'userId',
}), }),
colors() { colors() {
return this.mixinColors.filter(color => color.darkmode); return this.mixinColors.filter((color) => color.darkmode);
}, },
image() { image() {
if (this.selectedStockImage) {
return this.selectedStockImage.attributes['download-urls'].small
}
if (this.uploadImageURL) {
return this.uploadImageURL;
}
return this.currentElement.relationships?.image?.meta?.['download-url'] ?? null; return this.currentElement.relationships?.image?.meta?.['download-url'] ?? null;
}, },
...@@ -144,11 +162,10 @@ export default { ...@@ -144,11 +162,10 @@ export default {
} else { } else {
return this.instanceById({ id: 'user_' + this.context.id + '_' + this.unit.id }); return this.instanceById({ id: 'user_' + this.context.id + '_' + this.unit.id });
} }
}, },
inCourseContext() { inCourseContext() {
return this.context.type === 'courses'; return this.context.type === 'courses';
} },
}, },
methods: { methods: {
...mapActions({ ...mapActions({
...@@ -162,6 +179,7 @@ export default { ...@@ -162,6 +179,7 @@ export default {
uploadImageForStructuralElement: 'uploadImageForStructuralElement', uploadImageForStructuralElement: 'uploadImageForStructuralElement',
deleteImageForStructuralElement: 'deleteImageForStructuralElement', deleteImageForStructuralElement: 'deleteImageForStructuralElement',
storeCoursewareSettings: 'storeCoursewareSettings', storeCoursewareSettings: 'storeCoursewareSettings',
setStockImageForStructuralElement: 'setStockImageForStructuralElement',
}), }),
async loadUnitInstance() { async loadUnitInstance() {
const context = { type: this.context.type, id: this.context.id, unit: this.unit.id }; const context = { type: this.context.type, id: this.context.id, unit: this.unit.id };
...@@ -192,11 +210,13 @@ export default { ...@@ -192,11 +210,13 @@ export default {
this.$emit('close'); this.$emit('close');
await this.loadStructuralElement(this.currentElement.id); await this.loadStructuralElement(this.currentElement.id);
if ( if (
this.unitElement.relationships['edit-blocker'].data !== null this.unitElement.relationships['edit-blocker'].data !== null &&
&& this.unitElement.relationships['edit-blocker'].data?.id !== this.userId this.unitElement.relationships['edit-blocker'].data?.id !== this.userId
) { ) {
this.companionWarning({ this.companionWarning({
info: this.$gettext('Ihre Änderungen konnten nicht gespeichert werden, die Daten werden bereits von einem anderen Nutzer bearbeitet.') info: this.$gettext(
'Ihre Änderungen konnten nicht gespeichert werden, die Daten werden bereits von einem anderen Nutzer bearbeitet.'
),
}); });
return false; return false;
} else { } else {
...@@ -207,14 +227,21 @@ export default { ...@@ -207,14 +227,21 @@ export default {
this.uploadImageForStructuralElement({ this.uploadImageForStructuralElement({
structuralElement: this.currentElement, structuralElement: this.currentElement,
file: this.currentFile, file: this.currentFile,
}).then(() => { })
this.loadStructuralElement(this.currentElement.id) .then(() => {
}).catch((error) => { this.loadStructuralElement(this.currentElement.id);
})
.catch((error) => {
console.error(error); console.error(error);
this.companionWarning({ this.companionWarning({
info: this.$gettext('Beim Hochladen der Bilddatei ist ein Fehler aufgetretten.') info: this.$gettext('Beim Hochladen der Bilddatei ist ein Fehler aufgetretten.'),
}); });
}); });
} else if (this.selectedStockImage) {
await this.setStockImageForStructuralElement({
structuralElement: this.currentElement,
stockImage: this.selectedStockImage,
});
} else if (this.deletingPreviewImage) { } else if (this.deletingPreviewImage) {
await this.deleteImageForStructuralElement(this.currentElement); await this.deleteImageForStructuralElement(this.currentElement);
this.currentElement.relationships.image = { data: null }; this.currentElement.relationships.image = { data: null };
...@@ -233,13 +260,21 @@ export default { ...@@ -233,13 +260,21 @@ export default {
instance: currentInstance, instance: currentInstance,
}); });
} }
},
onSelectStockImage(stockImage) {
if (this.$refs?.upload_image) {
this.$refs.upload_image.value = null;
} }
this.selectedStockImage = stockImage;
this.showStockImageSelector = false;
this.deletingPreviewImage = false;
},
}, },
async mounted() { async mounted() {
this.loadingInstance = true; this.loadingInstance = true;
await this.loadUnitInstance(); await this.loadUnitInstance();
this.loadingInstance = false; this.loadingInstance = false;
this.initData(); this.initData();
} },
} };
</script> </script>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment