diff --git a/resources/assets/stylesheets/scss/courseware.scss b/resources/assets/stylesheets/scss/courseware.scss index eb3a9eaca46ad63ed85d4dd65460dd2583bb935a..ad7337257637e795b101c867d5674f2a13448711 100644 --- a/resources/assets/stylesheets/scss/courseware.scss +++ b/resources/assets/stylesheets/scss/courseware.scss @@ -2987,25 +2987,6 @@ b e f o r e a f t e r b l o c k b e f o r e a f t e r b l o c k e n d * * * * * * * * * * * * * * * * * * * */ -/* * * * * * * * * * -c h a r t b l o c k -* * * * * * * * * */ - -.cw-block-chart { - .cw-block-chart-item-remove { - float: right; - margin-right: 5px; - cursor: pointer; - img { - vertical-align: text-top; - } - } -} - -/* * * * * * * * * * * * * * -c h a r t b l o c k e n d -* * * * * * * * * * * * * */ - /* * * * * * * * * c o d e b l o c k * * * * * * * * */ @@ -3240,119 +3221,119 @@ c a n v a s b l o c k } .cw-canvasblock-toolbar { - border: solid thin $content-color-40; + border: solid thin var(--content-color-40); border-bottom: none; - } - .cw-canvasblock-buttonset { - display: inline-block; - padding: 5px; - margin-right: 0.5em; - } - - .cw-canvasblock-tool-selected-text { - cursor: text; - } - - button { - cursor: pointer; - user-select: none; - border: solid thin $content-color-40; - height: 32px; - width: 32px; - background-color: white; - background-position: center; - background-repeat: no-repeat; - background-size: 24px 24px; - - &.cw-canvasblock-color { - $colors: ( - white: #ffffff, - blue: #3498db, - green: #2ecc71, - purple: #9b59b6, - red: #e74c3c, - yellow: #fed330, - orange: #f39c12, - grey: #95a5a6, - darkgrey: #34495e, - black: #000000, - ); - - @each $name, $color in $colors { - &.#{"" + $name} { - background-color: $color; + .cw-canvasblock-buttonset { + display: inline-block; + padding: 5px; + margin-right: 0.5em; + + button { + cursor: pointer; + user-select: none; + border: solid thin var(--content-color-40); + height: 32px; + width: 32px; + background-color: var(--white); + background-position: center; + background-repeat: no-repeat; + background-size: 24px 24px; + + &.cw-canvasblock-color { + $colors: ( + white: #ffffff, + blue: #3498db, + green: #2ecc71, + purple: #9b59b6, + red: #e74c3c, + yellow: #fed330, + orange: #f39c12, + grey: #95a5a6, + darkgrey: #34495e, + black: #000000, + ); + + @each $name, $color in $colors { + &.#{"" + $name} { + background-color: $color; + } + } + + &.selected-color { + border: solid 2px var(--black); + } + } + + &.cw-canvasblock-reset { + @include background-icon(refresh, clickable, 24); + } + + &.cw-canvasblock-size { + @include background-icon(stop, clickable); + + &.cw-canvasblock-size-small { + background-size: 8px 7px; + } + &.cw-canvasblock-size-normal { + background-size: 16px 14px; + } + &.cw-canvasblock-size-large { + background-size: 22px 20px; + } + &.cw-canvasblock-size-huge { + background-size: 26px 24px; + } + &.selected-size { + border: solid 2px var(--black); + } + } + + &.cw-canvasblock-tool { + &.cw-canvasblock-tool-pen { + @include background-icon(comment, clickable); + } + + &.cw-canvasblock-tool-text { + vertical-align: top; + font-size: 22px; + color: var(--base-color); + font-weight: 600; + } + + &.selected-tool { + border: solid 2px var(--black); + } + } + + &.cw-canvasblock-undo { + @include background-icon(arr_2left, clickable, 24); + } + + &.cw-canvasblock-download { + @include background-icon(download, clickable, 24); + } + &.cw-canvasblock-store { + @include background-icon(upload, clickable, 24); + } + &.cw-canvasblock-show-all { + @include background-icon(group2, clickable, 24); + &.selected-view { + border: solid 2px var(--black); + } + } + &.cw-canvasblock-show-own { + @include background-icon(person, clickable, 24); + &.selected-view { + border: solid 2px var(--black); + } } } - - &.selected-color { - border: solid 2px $black; - } - } - - &.cw-canvasblock-reset { - @include background-icon(refresh, clickable, 24); - } - - &.cw-canvasblock-size { - @include background-icon(stop, clickable); - - &.cw-canvasblock-size-small { - background-size: 8px 7px; - } - &.cw-canvasblock-size-normal { - background-size: 16px 14px; - } - &.cw-canvasblock-size-large { - background-size: 22px 20px; - } - &.cw-canvasblock-size-huge { - background-size: 26px 24px; - } - &.selected-size { - border: solid 2px $black; - } - } - - &.cw-canvasblock-tool { - &.cw-canvasblock-tool-pen { - @include background-icon(comment, clickable); - } - - &.cw-canvasblock-tool-text { - vertical-align: top; - font-size: 22px; - color: $base-color; - font-weight: 600; - } - - &.selected-tool { - border: solid 2px $black; - } - } - - &.cw-canvasblock-undo { - @include background-icon(arr_2left, clickable, 24); } + } - &.cw-canvasblock-download { - @include background-icon(download, clickable, 24); - } - &.cw-canvasblock-store { - @include background-icon(upload, clickable, 24); - } - &.cw-canvasblock-show-all { - @include background-icon(group2, clickable, 24); - &.selected-view { - border: solid 2px $black; - } - } - &.cw-canvasblock-show-own { - @include background-icon(person, clickable, 24); - &.selected-view { - border: solid 2px $black; - } - } + .cw-canvasblock-tool-selected-text { + cursor: text; } } /* * * * * * * * * * * * * * * diff --git a/resources/assets/stylesheets/scss/select.scss b/resources/assets/stylesheets/scss/select.scss index f7a44410fa1151e5a1fd26a1f1bfded48f8bc377..ff30ef5973418ba19a83ce40468c1e2ad11b945a 100644 --- a/resources/assets/stylesheets/scss/select.scss +++ b/resources/assets/stylesheets/scss/select.scss @@ -1,5 +1,6 @@ .studip-v-select, .studip-v-select-detachted-ul { max-width: 48em; + margin-top: 0.5ex; .vs__option-with-icon{ padding-left: 8px; @@ -8,19 +9,23 @@ .vs__option-color { border: solid thin $content-color-40; padding-left: 20px; - height: 20px; + height: 16px; margin-right: 4px; } .vs__dropdown-toggle { - border: solid thin $content-color-40; - border-radius: 0; + max-height: 32px; + padding: 0 0 5px; } .vs__dropdown-menu, &.vs__dropdown-menu { border-radius: 0; } + .vs__actions { + align-items: end; + } + &.studip-v-select-drop-up { border-bottom: solid thin $content-color-40; border-top: none; @@ -36,3 +41,8 @@ z-index: 3002; } } + +form.default .studip-v-select .vs__selected { + padding: 0; + margin: 2px 2px 0; +} \ No newline at end of file diff --git a/resources/vue/components/courseware/CoursewareAudioBlock.vue b/resources/vue/components/courseware/CoursewareAudioBlock.vue index 77e3166a5905260de18270027b35b9dd137e5165..afa164feb11fbffd3a750d2cc0aa46bd104c0c48 100644 --- a/resources/vue/components/courseware/CoursewareAudioBlock.vue +++ b/resources/vue/components/courseware/CoursewareAudioBlock.vue @@ -43,7 +43,7 @@ </div> </div> <div v-if="emptyAudio" class="cw-audio-empty"> - <p><translate>Es ist keine Audio-Datei verfügbar</translate></p> + <p>{{ $gettext('Es ist keine Audio-Datei verfügbar') }}</p> </div> <div v-show="currentSource === 'studip_folder'" class="cw-audio-playlist-wrapper" :class="[!showRecorder && emptyAudio ? 'empty' : '']"> <ul v-show="hasPlaylist" class="cw-audio-playlist" :class="[showRecorder ? 'with-recorder' : '']"> @@ -71,45 +71,45 @@ :title="enableRecorderTitle" @click="enableRecorder" > - <translate>Aufnahme aktivieren</translate> + {{ $gettext('Aufnahme aktivieren') }} </button> <button v-show="userRecorderEnabled && !isRecording && !newRecording" class="button" @click="startRecording" > - <translate>Aufnahme starten</translate> + {{ $gettext('Aufnahme starten') }} </button> <button v-show="newRecording && !isRecording" class="button" @click="startRecording" > - <translate>Aufnahme wiederholen</translate> + {{ $gettext('Aufnahme wiederholen') }} </button> <button v-show="isRecording" class="button" @click="stopRecording" > - <translate>Aufnahme beenden</translate> + {{ $gettext('Aufnahme beenden') }} </button> <button v-show="newRecording && !isRecording" class="button" @click="resetRecorder" > - <translate>Aufnahme löschen</translate> + {{ $gettext('Aufnahme löschen') }} </button> <button v-show="newRecording && !isRecording" class="button" @click="storeRecording" > - <translate>Aufnahme speichern</translate> + {{ $gettext('Aufnahme speichern') }} </button> <span v-show="isRecording"> - <translate>Aufnahme läuft</translate>: {{seconds2time(timer)}} + {{ $gettext('Aufnahme läuft') }}: {{seconds2time(timer)}} </span> </div> </div> @@ -117,23 +117,23 @@ <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Überschrift</translate> + {{ $gettext('Überschrift') }} <input type="text" v-model="currentTitle" /> </label> <label> - <translate>Quelle</translate> + {{ $gettext('Quelle') }} <select v-model="currentSource"> - <option value="studip_file"><translate>Dateibereich Datei</translate></option> - <option value="studip_folder"><translate>Dateibereich Ordner</translate></option> - <option value="web"><translate>Web-Adresse</translate></option> + <option value="studip_file">{{ $gettext('Dateibereich Datei') }}</option> + <option value="studip_folder">{{ $gettext('Dateibereich Ordner') }}</option> + <option value="web">{{ $gettext('Web-Adresse') }}</option> </select> </label> <label v-show="currentSource === 'web'"> - <translate>URL</translate> + {{ $gettext('URL') }} <input type="text" v-model="currentWebUrl" /> </label> <label v-show="currentSource === 'studip_file'"> - <translate>Datei</translate> + {{ $gettext('Datei') }} <courseware-file-chooser v-model="currentFileId" :isAudio="true" @@ -141,24 +141,24 @@ /> </label> <label v-show="currentSource === 'studip_folder'"> - <translate>Ordner</translate> + {{ $gettext('Ordner') }} <courseware-folder-chooser v-model="currentFolderId" allowUserFolders /> </label> <label v-show="currentSource === 'studip_folder'"> - <translate>Audio Aufnahmen zulassen</translate> + {{ $gettext('Audio Aufnahmen zulassen') }} <span class="tooltip tooltip-icon" :data-tooltip="$gettext('Um Aufnahmen zu ermöglichen, muss ein Ordner ausgewählt werden.')" ></span> <select v-model="currentRecorderEnabled" :disabled="!folderSelected"> - <option :value="true"><translate>Ja</translate></option> - <option :value="false"><translate>Nein</translate></option> + <option :value="true">{{ $gettext('Ja') }}</option> + <option :value="false">{{ $gettext('Nein') }}</option> </select> </label> </form> </template> <template #info> - <p><translate>Informationen zum Audio-Block</translate></p> + <p>{{ $gettext('Informationen zum Audio-Block') }}</p> </template> </courseware-default-block> </div> diff --git a/resources/vue/components/courseware/CoursewareBeforeAfterBlock.vue b/resources/vue/components/courseware/CoursewareBeforeAfterBlock.vue index f714f25bc4a7668135777950f4aeae1618b43d47..2770387ad7aeb12246048fbf91dd11a106a04cc3 100644 --- a/resources/vue/components/courseware/CoursewareBeforeAfterBlock.vue +++ b/resources/vue/components/courseware/CoursewareBeforeAfterBlock.vue @@ -11,68 +11,94 @@ > <template #content> <TwentyTwenty v-if="!isEmpty" :before="currentBeforeUrl" :after="currentAfterUrl" /> + <courseware-companion-box + v-if="isEmpty && editMode" + :msgCompanion="$gettext('Bitte wählen Sie ein Vorher- und ein Nachher-Bild aus.')" + mood="pointing" + /> </template> <template v-if="canEdit" #edit> - <form class="default" @submit.prevent=""> - <label> - <translate>Quelle vorher</translate> - <select v-model="currentBeforeSource"> - <option value="studip"><translate>Dateibereich</translate></option> - <option value="web"><translate>Web-Adresse</translate></option> - </select> - </label> - <label v-if="currentBeforeSource === 'web'"> - <translate>URL</translate>: - <input type="text" v-model="currentBeforeWebUrl" /> - </label> - <label v-if="currentBeforeSource === 'studip'"> - <translate>Datei</translate> - <courseware-file-chooser - v-model="currentBeforeFileId" - :isImage="true" - @selectFile="updateCurrentBeforeFile" - /> - </label> - <label> - <translate>Quelle nachher</translate> - <select v-model="currentAfterSource"> - <option value="studip"><translate>Dateibereich</translate></option> - <option value="web"><translate>Web-Adresse</translate></option> - </select> - </label> - <label v-if="currentAfterSource === 'web'"> - <translate>URL</translate> - <input type="text" v-model="currentAfterWebUrl" /> - </label> - <label v-if="currentAfterSource === 'studip'"> - <translate>Datei</translate> - <courseware-file-chooser - v-model="currentAfterFileId" - :isImage="true" - @selectFile="updateCurrentAfterFile" - /> - </label> - </form> + <courseware-tabs> + <courseware-tab + :index="0" + :name="$gettext('Vorher')" + :selected="true" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Quelle') }} + <select v-model="currentBeforeSource"> + <option value="studip">{{ $gettext('Dateibereich') }}</option> + <option value="web">{{ $gettext('Web-Adresse') }}</option> + </select> + </label> + <label v-if="currentBeforeSource === 'web'"> + {{ $gettext('URL') }} + <input type="text" v-model="currentBeforeWebUrl" /> + </label> + <label v-if="currentBeforeSource === 'studip'"> + {{ $gettext('Bilddatei') }} + <courseware-file-chooser + v-model="currentBeforeFileId" + :isImage="true" + @selectFile="updateCurrentBeforeFile" + /> + </label> + </form> + </courseware-tab> + <courseware-tab + :index="1" + :name="$gettext('Nachher')" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Quelle') }} + <select v-model="currentAfterSource"> + <option value="studip">{{ $gettext('Dateibereich') }}</option> + <option value="web">{{ $gettext('Web-Adresse') }}</option> + </select> + </label> + <label v-if="currentAfterSource === 'web'"> + {{ $gettext('URL') }} + <input type="text" v-model="currentAfterWebUrl" /> + </label> + <label v-if="currentAfterSource === 'studip'"> + {{ $gettext('Bilddatei') }} + <courseware-file-chooser + v-model="currentAfterFileId" + :isImage="true" + @selectFile="updateCurrentAfterFile" + /> + </label> + </form> + </courseware-tab> + </courseware-tabs> </template> - <template #info><translate>Informationen zum Bildvergleich-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Bildvergleich-Block') }}</template> </courseware-default-block> </div> </template> <script> +import CoursewareCompanionBox from './CoursewareCompanionBox.vue'; import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue'; import CoursewareFileChooser from './CoursewareFileChooser.vue'; +import CoursewareTabs from './CoursewareTabs.vue'; +import CoursewareTab from './CoursewareTab.vue'; import { blockMixin } from './block-mixin.js'; import TwentyTwenty from 'vue-twentytwenty'; import 'vue-twentytwenty/dist/vue-twentytwenty.css'; -import { mapActions } from 'vuex'; +import { mapActions, mapGetters } from 'vuex'; export default { name: 'courseware-before-after-block', mixins: [blockMixin], components: { + CoursewareCompanionBox, CoursewareDefaultBlock, CoursewareFileChooser, + CoursewareTabs, + CoursewareTab, TwentyTwenty, }, props: { @@ -95,6 +121,9 @@ export default { }; }, computed: { + ...mapGetters({ + viewMode: 'viewMode' + }), beforeSource() { return this.block?.attributes?.payload?.before_source; }, @@ -114,7 +143,7 @@ export default { return this.block?.attributes?.payload?.after_web_url; }, currentBeforeUrl() { - if (this.currentBeforeSource === 'studip'&& this.currentBeforeFile?.meta) { + if (this.currentBeforeSource === 'studip' && this.currentBeforeFile?.meta) { return this.currentBeforeFile.meta['download-url']; } else if (this.currentBeforeSource === 'web') { return this.currentBeforeWebUrl; @@ -123,7 +152,7 @@ export default { } }, currentAfterUrl() { - if (this.currentAfterSource === 'studip'&& this.currentAfterFile?.meta) { + if (this.currentAfterSource === 'studip' && this.currentAfterFile?.meta) { return this.currentAfterFile.meta['download-url']; } else if (this.currentAfterSource === 'web') { return this.currentAfterWebUrl; @@ -131,6 +160,12 @@ export default { return ''; } }, + isEmpty() { + return this.currentBeforeUrl === '' || this.currentAfterUrl === ''; + }, + editMode() { + return this.viewMode === 'edit'; + } }, mounted() { this.loadFileRefs(this.block.id).then((response) => { diff --git a/resources/vue/components/courseware/CoursewareBiographyAchievementsBlock.vue b/resources/vue/components/courseware/CoursewareBiographyAchievementsBlock.vue index a5e49556031d7961bae0812e5cfbf3d7ba5d9cd4..b59b85aa9643195fcfdec269d301295c7c737bfb 100644 --- a/resources/vue/components/courseware/CoursewareBiographyAchievementsBlock.vue +++ b/resources/vue/components/courseware/CoursewareBiographyAchievementsBlock.vue @@ -16,21 +16,21 @@ </div> <div class="cw-block-biography-details"> <h3> - <translate>Titel</translate>: {{currentData.title}} + {{ $gettext('Titel') }}: {{currentData.title}} </h3> <h4> - <span v-show="currentData.type !== 'membership'"><translate>Datum</translate>:</span> - <span v-show="currentData.type === 'membership'"><translate>Startdatum</translate>:</span> + <span v-show="currentData.type !== 'membership'">{{ $gettext('Datum') }}:</span> + <span v-show="currentData.type === 'membership'">{{ $gettext('Startdatum') }}:</span> {{ getReadableDate(currentData.date) }} </h4> <h4 v-show="hasEndDate"> - <translate>Enddatum</translate>: {{ getReadableDate(currentData.end_date)}} + {{ $gettext('Enddatum') }}: {{ getReadableDate(currentData.end_date)}} </h4> <h4 v-show="hasParticipation"> - <translate>Beteiligung</translate>: <span v-html="currentData.role"></span> + {{ $gettext('Beteiligung') }}: <span v-html="currentData.role"></span> </h4> <div> - <h4><translate>Beschreibung</translate>:</h4> + <h4>{{ $gettext('Beschreibung') }}:</h4> <p v-html="currentData.description"></p> </div> </div> @@ -39,40 +39,40 @@ <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Type</translate> + {{ $gettext('Type') }} <select v-model="currentData.type"> - <option value="certificate"><translate>Zertifikat</translate></option> - <option value="accreditation"><translate>Akkreditierung</translate></option> - <option value="award"><translate>Auszeichnung</translate></option> - <option value="book"><translate>Buch</translate></option> - <option value="publication"><translate>Veröffentlichung</translate></option> - <option value="membership"><translate>Mitgliedschaft</translate></option> + <option value="certificate">{{ $gettext('Zertifikat') }}</option> + <option value="accreditation">{{ $gettext('Akkreditierung') }}</option> + <option value="award">{{ $gettext('Auszeichnung') }}</option> + <option value="book">{{ $gettext('Buch') }}</option> + <option value="publication">{{ $gettext('Veröffentlichung') }}</option> + <option value="membership">{{ $gettext('Mitgliedschaft') }}</option> </select> </label> <label> - <translate>Titel</translate> + {{ $gettext('Titel') }} <input type="text" v-model="currentData.title"> </label> <label> - <span v-show="!hasEndDate"><translate>Datum</translate></span> - <span v-show="hasEndDate"><translate>Startdatum</translate></span> + <template v-if="!hasEndDate">{{ $gettext('Datum') }}</template> + <template v-else>{{ $gettext('Startdatum') }}</template> <input type="date" v-model="currentData.date" /> </label> <label v-show="hasEndDate"> - <translate>Enddatum</translate> + {{ $gettext('Enddatum') }} <input type="date" v-model="currentData.end_date" /> </label> <label v-show="hasParticipation"> - <translate>Beteiligung</translate> + {{ $gettext('Beteiligung') }} <input type="text" v-model="currentData.role"> </label> <div class="label-text"> - <translate>Beschreibung</translate> + {{ $gettext('Beschreibung') }} </div> <studip-wysiwyg v-model="currentData.description"></studip-wysiwyg> </form> </template> - <template #info><translate>Informationen zum Erfolge-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Erfolge-Block') }}</template> </courseware-default-block> </div> </template> diff --git a/resources/vue/components/courseware/CoursewareBiographyCareerBlock.vue b/resources/vue/components/courseware/CoursewareBiographyCareerBlock.vue index fb20809899ac1d0ee3388e8b8a658758d6af089b..6fd855067bf82f8199ce2d72a35dc8331459bc92 100644 --- a/resources/vue/components/courseware/CoursewareBiographyCareerBlock.vue +++ b/resources/vue/components/courseware/CoursewareBiographyCareerBlock.vue @@ -28,13 +28,13 @@ <article> <header>{{ getItemTypeName(item.type) }}</header> <div v-if="item.type === 'school'"> - <p><translate>Bezeichnung der Qualifikation</translate>: {{ item.qualification }}</p> - <p><translate>Hauptfächer / Schwerpunkt</translate>: {{ item.focus }}</p> - <p><translate>berufliche Fähigkeiten</translate>: {{ item.skills }}</p> + <p>{{ $gettext('Bezeichnung der Qualifikation') }}: {{ item.qualification }}</p> + <p>{{ $gettext('Hauptfächer / Schwerpunkt') }}: {{ item.focus }}</p> + <p>{{ $gettext('berufliche Fähigkeiten') }}: {{ item.skills }}</p> </div> <div v-if="item.type === 'experience'"> - <p><translate>Name des Arbeitgebers</translate>: {{ item.employer }}</p> - <p><translate>Beruf / Funktion</translate>: {{ item.job }}</p> + <p>{{ $gettext('Name des Arbeitgebers') }}: {{ item.employer }}</p> + <p>{{ $gettext('Beruf / Funktion') }}: {{ item.job }}</p> </div> </article> </div> @@ -44,15 +44,15 @@ <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Zeitliche Sortierung</translate> + {{ $gettext('Zeitliche Sortierung') }} <select v-model="currentSort"> - <option value="none"><translate>Keine</translate></option> - <option value="asc"><translate>Aufsteigend</translate></option> - <option value="desc"><translate>Absteigend</translate></option> + <option value="none">{{ $gettext('Keine') }}</option> + <option value="asc">{{ $gettext('Aufsteigend') }}</option> + <option value="desc">{{ $gettext('Absteigend') }}</option> </select> </label> </form> - <button class="button add" @click="addItem"><translate>Ereignis hinzufügen</translate></button> + <button class="button add" @click="addItem">{{ $gettext('Ereignis hinzufügen') }}</button> <courseware-tabs v-if="currentItems.length > 0" :setSelected="setItemTab" @@ -67,59 +67,59 @@ canBeEmpty > <form class="default" @submit.prevent=""> - <label> - <translate>Startdatum</translate> + <label class="col-1"> + {{ $gettext('Startdatum') }} <input type="date" v-model="item.date" required /> </label> - <label> - <translate>Enddatum</translate> + <label class="col-1"> + {{ $gettext('Enddatum') }} <input type="date" v-model="item.enddate" /> </label> <label> - <translate>Art</translate> + {{ $gettext('Art') }} <select v-model="item.type"> - <option value="school"><translate>Schul- und Berufsbildung</translate></option> - <option value="experience"><translate>Berufserfahrung</translate></option> + <option value="school">{{ $gettext('Schul- und Berufsbildung') }}</option> + <option value="experience">{{ $gettext('Berufserfahrung') }}</option> </select> </label> <div v-show="item.type === 'school'"> <label> - <translate>Bezeichnung der Qualifikation</translate> + {{ $gettext('Bezeichnung der Qualifikation') }} <input type="text" v-model="item.qualification" /> </label> <label> - <translate>Hauptfächer / Schwerpunkt</translate> + {{ $gettext('Hauptfächer / Schwerpunkt') }} <input type="text" v-model="item.focus" /> </label> <label> - <translate>berufliche Fähigkeiten</translate> + {{ $gettext('berufliche Fähigkeiten') }} <input type="text" v-model="item.skills" /> </label> </div> <div v-show="item.type === 'experience'"> <label> - <translate>Name des Arbeitgebers</translate> + {{ $gettext('Name des Arbeitgebers') }} <input type="text" v-model="item.employer" /> </label> <label> - <translate>Beruf / Funktion</translate> + {{ $gettext('Beruf / Funktion') }} <input type="text" v-model="item.job" /> </label> </div> <label> - <translate>Beschreibung</translate> + {{ $gettext('Beschreibung') }} <textarea v-model="item.description" /> </label> <label v-if="currentItems.length > 1"> <button class="button trash" @click="removeItem(index)"> - <translate>Ereignis entfernen</translate> + {{ $gettext('Ereignis entfernen') }} </button> </label> </form> </courseware-tab> </courseware-tabs> </template> - <template #info><translate>Informationen zum Karriere-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Karriere-Block') }}</template> </courseware-default-block> </div> </template> diff --git a/resources/vue/components/courseware/CoursewareBiographyGoalsBlock.vue b/resources/vue/components/courseware/CoursewareBiographyGoalsBlock.vue index ab21b7aa1bae76cd88d824b8d2c36ee4b01c96fc..8e352796ca31c97626e2a32626d3fe628e637c17 100644 --- a/resources/vue/components/courseware/CoursewareBiographyGoalsBlock.vue +++ b/resources/vue/components/courseware/CoursewareBiographyGoalsBlock.vue @@ -21,21 +21,21 @@ <template v-if="canEdit" #edit> <form class="default"> <label for="type"> - <span><translate>Ziel</translate></span> + {{ $gettext('Ziel') }} <select name="type" class="type" v-model="currentData.type"> - <option value="personal"><translate>Persönliches Ziel</translate></option> - <option value="school"><translate>Schulisches Ziel</translate></option> - <option value="academic"><translate>Akademisches Ziel</translate></option> - <option value="professional"><translate>Berufliches Ziel</translate></option> + <option value="personal">{{ $gettext('Persönliches Ziel') }}</option> + <option value="school">{{ $gettext('Schulisches Ziel') }}</option> + <option value="academic">{{ $gettext('Akademisches Ziel') }}</option> + <option value="professional">{{ $gettext('Berufliches Ziel') }}</option> </select> </label> <div class="label-text"> - <translate>Beschreibung</translate> + {{ $gettext('>Beschreibung') }} </div> <studip-wysiwyg v-model="currentData.description"></studip-wysiwyg> </form> </template> - <template #info><translate>Informationen zum Ziele-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Ziele-Block') }}</template> </courseware-default-block> </div> </template> diff --git a/resources/vue/components/courseware/CoursewareBiographyPersonalInformationBlock.vue b/resources/vue/components/courseware/CoursewareBiographyPersonalInformationBlock.vue index 14ba1be9acc1a59610df4a7d5cf3284aceec48e4..28e5ffc7994b7d4e234f4c64f145f33f98f1587b 100644 --- a/resources/vue/components/courseware/CoursewareBiographyPersonalInformationBlock.vue +++ b/resources/vue/components/courseware/CoursewareBiographyPersonalInformationBlock.vue @@ -15,16 +15,16 @@ <h2>{{currentData.name}}</h2> </div> <div class="cw-block-biography-details cw-block-biography-personal-information-details"> - <span><translate>Geburtsort</translate>:</span> + <span>{{ $gettext('Geburtsort') }}:</span> <span>{{currentData.birthplace}}</span> - <span><translate>Geburtsdatum</translate>:</span> + <span>{{ $gettext('Geburtsdatum') }}:</span> <span>{{ getReadableDate(currentData.birthday) }}</span> - <span><translate>Geschlecht</translate>:</span> + <span>{{ $gettext('Geschlecht') }}:</span> <span>{{displayGenderText(currentData.gender)}}</span> - <span><translate>Familienstand</translate>:</span> + <span>{{ $gettext('Familienstand') }}:</span> <span>{{ displayStatusText(currentData.status) }}</span> </div> </div> @@ -32,20 +32,20 @@ <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Name</translate> + {{ $gettext('Name') }} <input type="text" v-model="currentData.name"> </label> <label> - <translate>Geburtsort</translate> + {{ $gettext('Geburtsort') }} <input type="text" v-model="currentData.birthplace"> </label> <label> - <translate>Geburtsdatum</translate> + {{ $gettext('Geburtsdatum') }} <input type="date" v-model="currentData.birthday" /> </label> <label> - <translate>Geschlecht</translate> - <select v-model="currentData.gender"> + {{ $gettext('Geschlecht') }} + <select v-model="currentData.gender"> <option value="none">{{ displayGenderText('none') }}</option> <option value="male">{{ displayGenderText('male') }}</option> <option value="female">{{ displayGenderText('female') }}</option> @@ -53,20 +53,20 @@ </select> </label> <label> - <translate>Familienstand</translate> - <select v-model="currentData.status"> - <option value="none">{{ displayStatusText('none') }}</option> - <option value="single">{{ displayStatusText('single') }}</option> - <option value="married">{{ displayStatusText('married') }}</option> - <option value="widowed">{{ displayStatusText('widowed') }}</option> - <option value="divorced">{{ displayStatusText('divorced') }}</option> - <option value="registered-civil-partnership">{{ displayStatusText('registered-civil-partnership') }}</option> - <option value="annulled-civil-partnership">{{ displayStatusText('annulled-civil-partnership') }}</option> - </select> + {{ $gettext('Familienstand') }} + <select v-model="currentData.status"> + <option value="none">{{ displayStatusText('none') }}</option> + <option value="single">{{ displayStatusText('single') }}</option> + <option value="married">{{ displayStatusText('married') }}</option> + <option value="widowed">{{ displayStatusText('widowed') }}</option> + <option value="divorced">{{ displayStatusText('divorced') }}</option> + <option value="registered-civil-partnership">{{ displayStatusText('registered-civil-partnership') }}</option> + <option value="annulled-civil-partnership">{{ displayStatusText('annulled-civil-partnership') }}</option> + </select> </label> </form> </template> - <template #info><translate>Informationen zum Persönlichen-Informationen-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Persönlichen-Informationen-Block') }}</template> </courseware-default-block> </div> </template> diff --git a/resources/vue/components/courseware/CoursewareBlockEdit.vue b/resources/vue/components/courseware/CoursewareBlockEdit.vue index a218ab52c4ebcc304518a92b45cb5b272568ff2b..e78008b70e20418a0cdb2895a5dfe9a3deada01c 100644 --- a/resources/vue/components/courseware/CoursewareBlockEdit.vue +++ b/resources/vue/components/courseware/CoursewareBlockEdit.vue @@ -1,13 +1,13 @@ <template> <section class="cw-block-edit"> - <header><translate>Bearbeiten</translate></header> + <header>{{ $gettext('Bearbeiten') }}</header> <div class="cw-block-features-content"> <div @click="deactivateToolbar(); exitHandler = true;"> <slot name="edit" /> </div> <div class="cw-button-box"> - <button class="button accept" @click="$emit('store'); exitHandler = false;"><translate>Speichern</translate></button> - <button class="button cancel" @click="$emit('close'); exitHandler = false;"><translate>Abbrechen</translate></button> + <button class="button accept" @click="$emit('store'); exitHandler = false;">{{ $gettext('Speichern') }}</button> + <button class="button cancel" @click="$emit('close'); exitHandler = false;">{{ $gettext('Abbrechen') }}</button> </div> </div> </section> diff --git a/resources/vue/components/courseware/CoursewareBlockFeedback.vue b/resources/vue/components/courseware/CoursewareBlockFeedback.vue index 443745e00459b692b72b7973deb9a51ac0f803f4..88ac2d7747c085b18cc949e74327d17f79df0d0e 100644 --- a/resources/vue/components/courseware/CoursewareBlockFeedback.vue +++ b/resources/vue/components/courseware/CoursewareBlockFeedback.vue @@ -19,7 +19,7 @@ /> <div v-if="userIsTeacher" class="cw-block-feedback-create"> <textarea v-model="feedbackText" :placeholder="placeHolder" spellcheck="true"></textarea> - <button class="button" @click="postFeedback"><translate>Senden</translate></button> + <button class="button" @click="postFeedback">{{ $gettext('Senden') }}</button> </div> </div> </section> diff --git a/resources/vue/components/courseware/CoursewareBlockInfo.vue b/resources/vue/components/courseware/CoursewareBlockInfo.vue index 5ef6e975d49b822feef298d0c069f11773143a3f..17a716553cc6eae88bb8348f1cb5958a6d06d2c7 100644 --- a/resources/vue/components/courseware/CoursewareBlockInfo.vue +++ b/resources/vue/components/courseware/CoursewareBlockInfo.vue @@ -1,30 +1,30 @@ <template> <section class="cw-block-info"> - <header><translate>Informationen</translate></header> + <header>{{ $gettext('Informationen') }}</header> <div class="cw-block-features-content cw-block-info-content"> <table class="cw-block-info-table"> <tr> - <td><translate>Blockbeschreibung</translate></td> + <td>{{ $gettext('Blockbeschreibung') }}</td> <td><slot name="info" /></td> </tr> <tr> - <td><translate>Block wurde erstellt von</translate></td> + <td>{{ $gettext('Block wurde erstellt von') }}</td> <td>{{ owner }}</td> </tr> <tr> - <td><translate>Block wurde erstellt am</translate>:</td> + <td>{{ $gettext('Block wurde erstellt am') }}:</td> <td><iso-date :date="block.attributes.mkdate" /></td> </tr> <tr> - <td><translate>Zuletzt bearbeitet von</translate>:</td> + <td>{{ $gettext('Zuletzt bearbeitet von') }}:</td> <td>{{ editor }}</td> </tr> <tr> - <td><translate>Zuletzt bearbeitet am</translate>:</td> + <td>{{ $gettext('Zuletzt bearbeitet am') }}:</td> <td><iso-date :date="block.attributes.chdate" /></td> </tr> </table> - <button class="button" @click="$emit('close')"><translate>Schließen</translate></button> + <button class="button" @click="$emit('close')">{{ $gettext('Schließen') }}</button> </div> </section> </template> diff --git a/resources/vue/components/courseware/CoursewareCanvasBlock.vue b/resources/vue/components/courseware/CoursewareCanvasBlock.vue index e1ea7e87cb564b376125b3bdcd07f37fdfba1a67..e7257988a7137517986375fdaa77818fa21d4044 100644 --- a/resources/vue/components/courseware/CoursewareCanvasBlock.vue +++ b/resources/vue/components/courseware/CoursewareCanvasBlock.vue @@ -99,47 +99,62 @@ /> <div class="cw-canvasblock-hints"> <div v-show="write" class="messagebox messagebox_info cw-canvasblock-text-info"> - <translate>Texteingabe mit Enter-Taste bestätigen</translate> + {{ $gettext('Texteingabe mit Enter-Taste bestätigen') }} </div> </div> </template> <template v-if="canEdit" #edit> - <form class="default" @submit.prevent=""> - <label> - <translate>Überschrift</translate> - <input type="text" v-model="currentTitle" /> - </label> - <label> - <translate>Hintergrundbild</translate> - <select v-model="currentImage"> - <option value="true"><translate>Ja</translate></option> - <option value="false"><translate>Nein</translate></option> - </select> - </label> - <label v-if="currentImage === 'true'"> - <translate>Bilddatei</translate> - <courseware-file-chooser - v-model="currentFileId" - :isImage="true" - @selectFile="updateCurrentFile" - /> - </label> - <label> - <translate>Speicherort</translate> - <courseware-folder-chooser v-model="currentUploadFolderId" :unchoose="true"/> - </label> - <label> - <translate>Werte anderer Nutzer anzeigen</translate> - <select v-model="currentShowUserData"> - <option value="off"><translate>deaktiviert</translate></option> - <option value="teacher"><translate>nur für Lehrende</translate></option> - <option value="all"><translate>für alle</translate></option> - </select> - </label> - </form> + <courseware-tabs> + <courseware-tab + :index="0" + :name="$gettext('Grunddaten')" + :selected="true" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Überschrift') }} + <input type="text" v-model="currentTitle" /> + </label> + <label> + {{ $gettext('Hintergrundbild') }} + <select v-model="currentImage"> + <option value="true">{{ $gettext('Ja') }}</option> + <option value="false">{{ $gettext('Nein') }}</option> + </select> + </label> + <label v-if="currentImage === 'true'"> + {{ $gettext('Bilddatei') }} + <courseware-file-chooser + v-model="currentFileId" + :isImage="true" + @selectFile="updateCurrentFile" + /> + </label> + </form> + </courseware-tab> + <courseware-tab + :index="1" + :name="$gettext('Einstellungen')" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Speicherort') }} + <courseware-folder-chooser v-model="currentUploadFolderId" :unchoose="true"/> + </label> + <label> + {{ $gettext('Werte anderer Nutzer anzeigen') }} + <select v-model="currentShowUserData"> + <option value="off">{{ $gettext('deaktiviert') }}</option> + <option value="teacher">{{ $gettext('nur für Lehrende') }}</option> + <option value="all">{{ $gettext('für alle') }}</option> + </select> + </label> + </form> + </courseware-tab> + </courseware-tabs> </template> <template #info> - <p><translate>Informationen zum Leinwand-Block</translate></p> + <p>{{ $gettext('Informationen zum Leinwand-Block') }}</p> </template> </courseware-default-block> </div> @@ -149,6 +164,8 @@ import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue'; import CoursewareFileChooser from './CoursewareFileChooser.vue'; import CoursewareFolderChooser from './CoursewareFolderChooser.vue'; +import CoursewareTabs from './CoursewareTabs.vue'; +import CoursewareTab from './CoursewareTab.vue'; import { blockMixin } from './block-mixin.js'; import { mapActions, mapGetters } from 'vuex'; @@ -159,6 +176,8 @@ export default { CoursewareDefaultBlock, CoursewareFileChooser, CoursewareFolderChooser, + CoursewareTabs, + CoursewareTab, }, props: { block: Object, diff --git a/resources/vue/components/courseware/CoursewareChartBlock.vue b/resources/vue/components/courseware/CoursewareChartBlock.vue index 96726bf9e5812bafbcbc19ac4e7794b5735c4907..4d1c6dd09fcbe2bcc3250fd06733ed3006cd79fa 100644 --- a/resources/vue/components/courseware/CoursewareChartBlock.vue +++ b/resources/vue/components/courseware/CoursewareChartBlock.vue @@ -14,70 +14,91 @@ </template> <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> - <label> - <translate>Beschriftung</translate> + <label class="col-3"> + {{ $gettext('Beschriftung') }} <input type="text" v-model="currentLabel" @focusout="buildChart" /> </label> - <label> - <translate>Typ</translate> - <select v-model="currentType"> - <option value="bar"><translate>Säulendiagramm</translate></option> - <option value="horizontalBar"><translate>Balkendiagramm</translate></option> - <option value="pie"><translate>Kreisdiagramm</translate></option> - <option value="doughnut"><translate>Ringdiagramm</translate></option> - <option value="polarArea"><translate>Polardiagramm</translate></option> - <option value="line"><translate>Liniendiagramm</translate></option> - </select> + <label class="col-3"> + {{ $gettext('Typ') }} + <studip-select + v-model="currentType" + :options="chartTypes" + :reduce="chartTypes => chartTypes.value" + :clearable="false" + @option:selected="buildChart" + > + <template #open-indicator="selectAttributes"> + <span v-bind="selectAttributes"><studip-icon shape="arr_1down" :size="10"/></span> + </template> + <template #selected-option="{name}"> + <span>{{name}}</span> + </template> + <template #option="{name}"> + <span>{{name}}</span> + </template> + </studip-select> </label> - <fieldset v-for="(item, index) in currentContent" :key="index"> - <legend> - <translate>Datensatz</translate> {{ index + 1 }} - <span - v-if="!onlyRecord" - class="cw-block-chart-item-remove" - :title="textRecordRemove" - @click="removeItem(index)"> - <studip-icon shape="trash" /> - </span> - </legend> - <label> - <translate>Wert</translate> - <input type="number" v-model="item.value" @change="buildChart" /> - </label> - <label> - <translate>Bezeichnung</translate> - <input type="text" v-model="item.label" @focusout="buildChart" /> - </label> - <label> - <translate>Farbe</translate> - <studip-select - :options="colors" - :reduce="colors => colors.value" - label="rgb" - :clearable="false" - v-model="item.color" - @option:selected="buildChart" - > - <template #open-indicator="selectAttributes"> - <span v-bind="selectAttributes"><studip-icon shape="arr_1down" size="10"/></span> - </template> - <template #no-options> - <translate>Es steht keine Auswahl zur Verfügung.</translate> - </template> - <template #selected-option="{name, rgb}"> - <span class="vs__option-color" :style="{'background-color': 'rgb(' + rgb + ')'}"></span><span>{{name}}</span> - </template> - <template #option="{name, rgb}"> - <span class="vs__option-color" :style="{'background-color': 'rgb(' + rgb + ')'}"></span><span>{{name}}</span> - </template> - </studip-select> - </label> - </fieldset> </form> - <button class="button add" @click="addItem"><translate>Datensatz hinzufügen</translate></button> + <button class="button add" @click="addItem">{{ $gettext('Datensatz hinzufügen') }}</button> + <courseware-tabs + v-if="currentContent.length > 0" + :setSelected="setItemTab" + @selectTab="setItemTab = (parseInt($event.name.replace($gettext('Datensatz') + ' ', ''), 10) - 1)" + > + <courseware-tab + v-for="(item, index) in currentContent" + :key="index" + :index="index" + :name="$gettext('Datensatz') + ' ' + (index + 1).toString()" + :selected="index === 0" + canBeEmpty + > + <form class="default" @submit.prevent=""> + <label class="col-1"> + {{ $gettext('Wert') }} + <input type="number" v-model="item.value" @change="buildChart" /> + </label> + <label class="col-2"> + {{ $gettext('Farbe') }} + <studip-select + :options="colors" + :reduce="colors => colors.value" + label="rgb" + :clearable="false" + v-model="item.color" + @option:selected="buildChart" + > + <template #open-indicator="selectAttributes"> + <span v-bind="selectAttributes"><studip-icon shape="arr_1down" :size="10"/></span> + </template> + <template #no-options> + {{ $gettext('Es steht keine Auswahl zur Verfügung.') }} + </template> + <template #selected-option="{name, rgb}"> + <span class="vs__option-color" :style="{'background-color': 'rgb(' + rgb + ')'}"></span><span>{{name}}</span> + </template> + <template #option="{name, rgb}"> + <span class="vs__option-color" :style="{'background-color': 'rgb(' + rgb + ')'}"></span><span>{{name}}</span> + </template> + </studip-select> + </label> + <label class="col-3"> + {{ $gettext('Bezeichnung') }} + <input type="text" v-model="item.label" @focusout="buildChart" /> + </label> + <button + v-if="currentContent.length > 1" + class="button trash" + @click="removeItem(index)" + > + {{ $gettext('Datensatz entfernen') }} + </button> + </form> + </courseware-tab> + </courseware-tabs> </template> <template #info> - <p><translate>Informationen zum Diagramm-Block</translate></p> + <p>{{ $gettext('Informationen zum Diagramm-Block') }}</p> </template> </courseware-default-block> </div> @@ -85,16 +106,21 @@ <script> import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue'; +import CoursewareTabs from './CoursewareTabs.vue'; +import CoursewareTab from './CoursewareTab.vue'; +import StudipIcon from '../StudipIcon.vue'; import { blockMixin } from './block-mixin.js'; import Chart from 'chart.js'; import { mapActions } from 'vuex'; -import StudipIcon from '../StudipIcon.vue'; + export default { name: 'courseware-chart-block', mixins: [blockMixin], components: { CoursewareDefaultBlock, + CoursewareTabs, + CoursewareTab, StudipIcon, }, props: { @@ -120,7 +146,16 @@ export default { { name:this.$gettext('Hellgrau'), value: 'lightgrey', rgb: '149, 165, 166' }, { name:this.$gettext('Schwarz'), value: 'black', rgb: '0, 0, 0' }, ], + chartTypes: [ + { name: this.$gettext('Säulendiagramm'), value: 'bar'}, + { name: this.$gettext('Balkendiagramm'), value: 'horizontalBar'}, + { name: this.$gettext('Kreisdiagramm'), value: 'pie'}, + { name: this.$gettext('Ringdiagramm'), value: 'doughnut'}, + { name: this.$gettext('Polardiagramm'), value: 'polarArea'}, + { name: this.$gettext('Liniendiagramm'), value: 'line'}, + ], textRecordRemove: this.$gettext('Datensatz entfernen'), + setItemTab: 0, }; }, computed: { @@ -148,6 +183,7 @@ export default { this.currentContent = this.content; this.currentLabel = this.label; this.currentType = this.type; + this.setItemTab = 0; }, storeBlock() { let attributes = {}; @@ -165,6 +201,7 @@ export default { addItem() { this.currentContent.push({ value: '0', label: '', color: 'blue' }); + this.$nextTick(() => { this.setItemTab = this.currentContent.length - 1; }); }, removeItem(recordIndex) { @@ -172,6 +209,7 @@ export default { return !(index === recordIndex); }); this.buildChart(); + this.$nextTick(() => { this.setItemTab = 0; }); }, buildChart() { diff --git a/resources/vue/components/courseware/CoursewareCodeBlock.vue b/resources/vue/components/courseware/CoursewareCodeBlock.vue index db383735a4284d9d75e7110da20986a0a42e9cf5..3ed8d226368f27f78940b161765e26bec640dfcc 100644 --- a/resources/vue/components/courseware/CoursewareCodeBlock.vue +++ b/resources/vue/components/courseware/CoursewareCodeBlock.vue @@ -18,17 +18,17 @@ <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Sprache</translate> + {{ $gettext('Sprache') }} <input type="text" v-model="currentLang" /> </label> <label> - <translate>Quelltext</translate> + {{ $gettext('Quelltext') }} <textarea v-model="currentContent"></textarea> </label> </form> </template> <template #info> - <p><translate>Informationen zum Quelltext-Block</translate></p> + <p>{{ $gettext('Informationen zum Quelltext-Block') }}</p> </template> </courseware-default-block> </div> diff --git a/resources/vue/components/courseware/CoursewareConfirmBlock.vue b/resources/vue/components/courseware/CoursewareConfirmBlock.vue index 2a3f9b5a4dd26abcf1c015f456283ff2bb23d58b..d3d04dd00767981dfa9488ffa512bebd80101ce0 100644 --- a/resources/vue/components/courseware/CoursewareConfirmBlock.vue +++ b/resources/vue/components/courseware/CoursewareConfirmBlock.vue @@ -12,7 +12,7 @@ > <template #content> <div class="cw-block-title"> - <translate>Bestätigung</translate> + {{ $gettext('Bestätigung') }} </div> <div class="cw-block-confirm-content"> <div class="cw-block-confirm-checkbox"> @@ -27,12 +27,12 @@ <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Text</translate> + {{ $gettext('Text') }} <input type="text" v-model="currentText" /> </label> </form> </template> - <template #info><translate>Informationen zum Bestätigungs-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Bestätigungs-Block') }}</template> </courseware-default-block> </div> </template> diff --git a/resources/vue/components/courseware/CoursewareDateBlock.vue b/resources/vue/components/courseware/CoursewareDateBlock.vue index 21623f755796d8359714c5733d5243e2a8597668..1361b60a9779d6f7cf57d770f6e527c8547cee8c 100644 --- a/resources/vue/components/courseware/CoursewareDateBlock.vue +++ b/resources/vue/components/courseware/CoursewareDateBlock.vue @@ -14,37 +14,37 @@ <div class="cw-date-countdown-digit" data-countdown="days"> <div class="cw-date-countdown-number">{{ countdownDays }}</div> <div v-show="countdownDays === '01'" class="cw-date-countdown-label-sg"> - <translate>Tag</translate> + {{ $gettext('Tag') }} </div> <div v-show="countdownDays !== '01'" class="cw-date-countdown-label-pl"> - <translate>Tage</translate> + {{ $gettext('Tage') }} </div> </div> <div class="cw-date-countdown-digit" data-countdown="hours"> <div class="cw-date-countdown-number">{{ countdownHours }}</div> <div v-show="countdownHours === '01'" class="cw-date-countdown-label-sg"> - <translate>Stunde</translate> + {{ $gettext('Stunde') }} </div> <div v-show="countdownHours !== '01'" class="cw-date-countdown-label-pl"> - <translate>Stunden</translate> + {{ $gettext('Stunden') }} </div> </div> <div class="cw-date-countdown-digit" data-countdown="minutes"> <div class="cw-date-countdown-number">{{ countdownMinutes }}</div> <div v-show="countdownMinutes === '01'" class="cw-date-countdown-label-sg"> - <translate>Minute</translate> + {{ $gettext('Minute') }} </div> <div v-show="countdownMinutes !== '01'" class="cw-date-countdown-label-pl"> - <translate>Minuten</translate> + {{ $gettext('Minuten') }} </div> </div> <div class="cw-date-countdown-digit" data-countdown="seconds"> <div class="cw-date-countdown-number">{{ countdownSeconds }}</div> <div v-show="countdownSeconds === '01'" class="cw-date-countdown-label-sg"> - <translate>Sekunde</translate> + {{ $gettext('Sekunde') }} </div> <div v-show="countdownSeconds !== '01'" class="cw-date-countdown-label-pl"> - <translate>Sekunden</translate> + {{ $gettext('Sekunden') }} </div> </div> </div> @@ -61,23 +61,23 @@ <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Datum</translate> + {{ $gettext('Datum') }} <input type="date" v-model="currentDate" @change="computeTimestamp" /> </label> <label> - <translate>Uhrzeit</translate> + {{ $gettext('Uhrzeit') }} <input type="time" v-model="currentTime" @change="computeTimestamp" /> </label> <label> - <translate>Layout</translate> + {{ $gettext('Layout') }} <select v-model="currentStyle"> - <option value="countdown"><translate>Countdown</translate></option> - <option value="date"><translate>Datum</translate></option> + <option value="countdown">{{ $gettext('Countdown') }}</option> + <option value="date">{{ $gettext('Datum') }}</option> </select> </label> </form> </template> - <template #info><translate>Informationen zum Termin-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Termin-Block') }}</template> </courseware-default-block> </div> </template> diff --git a/resources/vue/components/courseware/CoursewareDialogCardsBlock.vue b/resources/vue/components/courseware/CoursewareDialogCardsBlock.vue index 9c14597aaa45b089ef38ae222ee8e53831c035ff..4df490b4c73df2e92d555379a51b76d60d72c28d 100644 --- a/resources/vue/components/courseware/CoursewareDialogCardsBlock.vue +++ b/resources/vue/components/courseware/CoursewareDialogCardsBlock.vue @@ -56,7 +56,7 @@ </div> </template> <template v-if="canEdit" #edit> - <button class="button add" @click="addCard"><translate>Karte hinzufügen</translate></button> + <button class="button add" @click="addCard">{{ $gettext('Karte hinzufügen') }}</button> <courseware-tabs v-if="currentCards.length > 0" :setSelected="setCardTab" @@ -72,7 +72,7 @@ > <form class="default" @submit.prevent=""> <label> - <translate>Bild Vorderseite</translate>: + {{ $gettext('Bild Vorderseite') }}: <courseware-file-chooser v-model="card.front_file_id" :isImage="true" @@ -81,11 +81,11 @@ /> </label> <label> - <translate>Text Vorderseite</translate>: + {{ $gettext('Text Vorderseite') }}: <input type="text" v-model="card.front_text" /> </label> <label> - <translate>Bild Rückseite</translate>: + {{ $gettext('Bild Rückseite') }}: <courseware-file-chooser v-model="card.back_file_id" :isImage="true" @@ -94,12 +94,12 @@ /> </label> <label> - <translate>Text Rückseite</translate>: + {{ $gettext('Text Rückseite') }}: <input type="text" v-model="card.back_text" /> </label> <label v-if="!onlyCard"> <button class="button trash" @click="removeCard(index)"> - <translate>Karte entfernen</translate> + {{ $gettext('Karte entfernen') }} </button> </label> </form> @@ -107,7 +107,7 @@ </courseware-tabs> </template> <template #info> - <p><translate>Informationen zum Lernkarten-Block</translate></p> + <p>{{ $gettext('Informationen zum Lernkarten-Block') }}</p> </template> </courseware-default-block> </div> diff --git a/resources/vue/components/courseware/CoursewareDownloadBlock.vue b/resources/vue/components/courseware/CoursewareDownloadBlock.vue index 403de4b0f9bd0e250b6aa3e361b0017300242f26..e642e79af1a699986a9c80f6be8cece384896c7c 100644 --- a/resources/vue/components/courseware/CoursewareDownloadBlock.vue +++ b/resources/vue/components/courseware/CoursewareDownloadBlock.vue @@ -35,41 +35,63 @@ </div> <div v-else class="cw-block-download-content"> <div class="cw-block-download-file-item-not-available"> - <span class="cw-block-file-info cw-block-file-icon-none"> - <translate>Datei ist nicht verfügbar</translate> - </span> + <span class="cw-block-file-info cw-block-file-icon-none"> + {{ $gettext('Datei ist nicht verfügbar') }} + </span> </div> </div> </template> <template v-if="canEdit" #edit> - <form class="default" @submit.prevent=""> - <label> - <translate>Überschrift</translate> - <input type="text" v-model="currentTitle" /> - </label> - <label> - <translate>Datei</translate> - <courseware-file-chooser v-model="currentFileId" @selectFile="updateCurrentFile" /> - </label> - <label> - <translate>Infobox vor Download</translate> - <input type="text" v-model="currentInfo" /> - </label> - <label> - <translate>Infobox nach Download</translate> - <input type="text" v-model="currentSuccess" /> - </label> - <label> - <translate>Fortschritt erst beim Herunterladen</translate> - <select v-model="currentGrade"> - <option value="false"><translate>Nein</translate></option> - <option value="true"><translate>Ja</translate></option> - </select> - </label> - </form> + <courseware-tabs> + <courseware-tab + :index="0" + :name="$gettext('Datei')" + :selected="true" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Überschrift') }} + <input type="text" v-model="currentTitle" /> + </label> + <label> + {{ $gettext('Datei') }} + <courseware-file-chooser v-model="currentFileId" @selectFile="updateCurrentFile" /> + </label> + </form> + </courseware-tab> + <courseware-tab + :index="1" + :name="$gettext('Infobox')" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Infobox vor Download') }} + <input type="text" v-model="currentInfo" /> + </label> + <label> + {{ $gettext('Infobox nach Download') }} + <input type="text" v-model="currentSuccess" /> + </label> + </form> + </courseware-tab> + <courseware-tab + :index="2" + :name="$gettext('Fortschritt')" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Fortschritt erst beim Herunterladen') }} + <select v-model="currentGrade"> + <option value="false">{{ $gettext('Nein') }}</option> + <option value="true">{{ $gettext('Ja') }}</option> + </select> + </label> + </form> + </courseware-tab> + </courseware-tabs> </template> <template #info> - <p><translate>Informationen zum Download-Block</translate></p> + <p>{{ $gettext('Informationen zum Download-Block') }}</p> </template> </courseware-default-block> </div> @@ -78,6 +100,8 @@ <script> import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue'; import CoursewareFileChooser from './CoursewareFileChooser.vue'; +import CoursewareTabs from './CoursewareTabs.vue'; +import CoursewareTab from './CoursewareTab.vue'; import { blockMixin } from './block-mixin.js'; import { mapActions, mapGetters } from 'vuex'; @@ -87,6 +111,8 @@ export default { components: { CoursewareDefaultBlock, CoursewareFileChooser, + CoursewareTabs, + CoursewareTab, }, props: { block: Object, diff --git a/resources/vue/components/courseware/CoursewareEmbedBlock.vue b/resources/vue/components/courseware/CoursewareEmbedBlock.vue index 8ee8808fb926903db199cf86dbd63b1452506fb3..59457ce17145598be0916f4227d683e03f5f9f55 100644 --- a/resources/vue/components/courseware/CoursewareEmbedBlock.vue +++ b/resources/vue/components/courseware/CoursewareEmbedBlock.vue @@ -11,7 +11,7 @@ > <template #content> <div v-if="currentTitle !== ''" class="cw-block-title">{{ currentTitle }}</div> - <div v-if="oembedData !== null"> + <template v-if="oembedData"> <div v-if="oembedData.type === 'rich' || oembedData.type === 'video'" v-html="oembedData.html" @@ -26,37 +26,37 @@ <div v-if="oembedData.type === 'link' && oembedData.provider_name === 'DeviantArt'"> <img :src="oembedData.fullsize_url" /> </div> - </div> - <div class="cw-block-embed-info" v-if="oembedData !== null"> - <span class="cw-block-embed-title">{{ oembedData.title }}</span> - <span class="cw-block-embed-author-name"> - <translate>erstellt von</translate> - <a :href="oembedData.author_url" target="_blank">{{ oembedData.author_name }}</a></span - > - <span class="cw-block-embed-source"> - <translate>veröffentlicht auf</translate> - <a :href="oembedData.provider_url" target="_blank">{{ oembedData.provider_name }}</a></span - > - </div> + <div class="cw-block-embed-info"> + <span class="cw-block-embed-title">{{ oembedData.title }}</span> + <span class="cw-block-embed-author-name"> + {{ $gettext('erstellt von') }} + <a :href="oembedData.author_url" target="_blank">{{ oembedData.author_name }}</a></span + > + <span class="cw-block-embed-source"> + {{ $gettext('veröffentlicht auf') }} + <a :href="oembedData.provider_url" target="_blank">{{ oembedData.provider_name }}</a></span + > + </div> + </template> </template> <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Überschrift</translate> + {{ $gettext('Überschrift') }} <input type="text" v-model="currentTitle" /> </label> <label> - <translate>Quelle</translate> + {{ $gettext('Quelle') }} <select v-model="currentSource"> <option v-for="(value, key) in endPoints" :key="key" :value="key">{{ key }}</option> </select> </label> <label> - <translate>URL</translate> + {{ $gettext('URL') }} <input type="text" v-model="currentUrl" /> </label> - <label v-if="currentSource === 'youtube'"> - <translate>Startpunkt wählen</translate> + <label v-if="currentSource === 'youtube'" class="col-1"> + {{ $gettext('Startpunkt') }} <input type="time" v-model="currentStartTime" @@ -66,8 +66,8 @@ @change="updateTime" /> </label> - <label v-if="currentSource === 'youtube'"> - <translate>Endpunkt wählen</translate> + <label v-if="currentSource === 'youtube'" class="col-1"> + {{ $gettext('Endpunkt') }} <input type="time" v-model="currentEndTime" @@ -80,7 +80,7 @@ </form> </template> <template #info> - <p><translate>Informationen zum Embed-Block</translate></p> + <p>{{ $gettext('Informationen zum Embed-Block') }}</p> </template> </courseware-default-block> </div> @@ -181,14 +181,14 @@ export default { this.currentStartTime = this.startTime; this.currentEndTime = this.endTime; this.oembedData = this.oembed; - if (this.oembedData !== null) { + if (this.oembedData) { this.updateTime(); this.calcContentHeight(); } }, recalculateContentHeight(data){ if (this.$parent._uid === data.uid) { - if (this.oembedData !== null) { + if (this.oembedData) { this.calcContentHeight(); } } diff --git a/resources/vue/components/courseware/CoursewareIframeBlock.vue b/resources/vue/components/courseware/CoursewareIframeBlock.vue index 57c5c098b144ad6c7e5ef109c7ead10b8e4b342e..e1aa21e5b5d5415739593d2e214f013fb10e437e 100644 --- a/resources/vue/components/courseware/CoursewareIframeBlock.vue +++ b/resources/vue/components/courseware/CoursewareIframeBlock.vue @@ -22,82 +22,104 @@ <div v-if="currentCcInfo" class="cw-block-iframe-cc-data"> <span class="cw-block-iframe-cc" :class="['cw-block-iframe-cc-' + currentCcInfo]"></span> <div class="cw-block-iframe-cc-infos"> - <p v-if="currentCcWork !== ''"><translate>Werk</translate> {{ currentCcWork }}</p> - <p v-if="currentCcAuthor !== ''"><translate>Autor</translate> {{ currentCcAuthor }}</p> - <p v-if="currentCcBase !== ''"><translate>Lizenz der Plattform</translate> {{ currentCcBase }}</p> + <p v-if="currentCcWork">{{ $gettext('Werk') }}: {{ currentCcWork }}</p> + <p v-if="currentCcAuthor">{{ $gettext('Autor') }}: {{ currentCcAuthor }}</p> + <p v-if="currentCcBase">{{ $gettext('Lizenz der Plattform') }}: {{ currentCcBase }}</p> </div> </div> <div v-show="!currentUrl.includes('http')" :style="{ height: currentHeight + 'px' }"></div> </template> <template v-if="canEdit" #edit> - <form class="default" @submit.prevent=""> - <label> - <translate>Titel</translate> - <input type="text" v-model="currentTitle" /> - </label> - <label> - <translate>URL</translate> - <input type="text" v-model="currentUrl" @change="setProtocol" /> - </label> - <label> - <translate>Höhe</translate> - <input type="number" v-model="currentHeight" min="0" /> - </label> - <label> - <translate>Nutzerspezifische ID übergeben</translate> - <select v-model="currentSubmitUserId"> - <option value="false"><translate>Nein</translate></option> - <option value="true"><translate>Ja</translate></option> - </select> - </label> + <courseware-tabs> + <courseware-tab + :index="0" + :name="$gettext('Grunddaten')" + :selected="true" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Titel') }} + <input type="text" v-model="currentTitle" /> + </label> + <label> + {{ $gettext('URL') }} + <input type="text" v-model="currentUrl" @change="setProtocol" /> + </label> + <label> + {{ $gettext('Höhe') }} + <input type="number" v-model="currentHeight" min="0" /> + </label> + </form> + </courseware-tab> + <courseware-tab + :index="1" + :name="$gettext('Nutzerspezifische ID')" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Nutzerspezifische ID übergeben') }} + <select v-model="currentSubmitUserId"> + <option value="false">{{ $gettext('Nein') }}</option> + <option value="true">{{ $gettext('Ja') }}</option> + </select> + </label> - <label v-if="currentSubmitUserId === 'true'"> - <translate>Name des Übergabeparameters</translate> - <input type="text" v-model="currentSubmitParam" /> - </label> - <label v-if="currentSubmitUserId === 'true'"> - <translate>Zufallszeichen für Verschlüsselung (Salt)</translate> - <input type="text" v-model="currentSalt" /> - </label> - <label> - <translate>Creative Commons Angaben</translate> - <select v-model="currentCcInfo"> - <option value="false"><translate>Keine</translate></option> - <option value="by">(by) <translate>Namensnennung</translate></option> - <option value="by-sa"> - (by-sa) <translate>Namensnennung & Weitergabe unter gleichen Bedingungen</translate> - </option> - <option value="by-nc"> - (by-nc) <translate>Namensnennung & Nicht kommerziell</translate> - </option> - <option value="by-nd"> - (by-nd) <translate>Namensnennung & Keine Bearbeitung</translate> - </option> - <option value="by-nc-nd"> - (by-nc-nd) <translate>Namensnennung & Nicht kommerziell & Keine Bearbeitung</translate> - </option> - <option value="by-nc-sa"> - (by-nc-sa) - <translate>Namensnennung & Nicht kommerziell & Weitergabe unter gleichen Bedingungen</translate> - </option> - </select> - </label> - <label v-if="currentCcInfo !== 'false'"> - CC <translate>Werk</translate> - <input type="text" v-model="currentCcWork" /> - </label> - <label v-if="currentCcInfo !== 'false'"> - CC <translate>Author</translate> - <input type="text" v-model="currentCcAuthor" /> - </label> - <label v-if="currentCcInfo !== 'false'"> - CC <translate>Lizenz der Plattform</translate> - <input type="text" v-model="currentCcBase" /> - </label> - </form> + <label v-if="currentSubmitUserId === 'true'"> + {{ $gettext('Name des Übergabeparameters') }} + <input type="text" v-model="currentSubmitParam" /> + </label> + <label v-if="currentSubmitUserId === 'true'"> + {{ $gettext('Zufallszeichen für Verschlüsselung (Salt)') }} + <input type="text" v-model="currentSalt" /> + </label> + </form> + </courseware-tab> + <courseware-tab + :index="2" + :name="$gettext('Creative Commons')" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Creative Commons Lizenz') }} + <select v-model="currentCcInfo"> + <option value="false">{{ $gettext('Keine') }}</option> + <option value="by">(by) {{ $gettext('Namensnennung') }}</option> + <option value="by-sa"> + (by-sa) {{ $gettext('Namensnennung & Weitergabe unter gleichen Bedingungen') }} + </option> + <option value="by-nc"> + (by-nc) {{ $gettext('Namensnennung & Nicht kommerziell') }} + </option> + <option value="by-nd"> + (by-nd) {{ $gettext('Namensnennung & Keine Bearbeitung') }} + </option> + <option value="by-nc-nd"> + (by-nc-nd) {{ $gettext('Namensnennung & Nicht kommerziell & Keine Bearbeitung') }} + </option> + <option value="by-nc-sa"> + (by-nc-sa) + {{ $gettext('Namensnennung & Nicht kommerziell & Weitergabe unter gleichen Bedingungen') }} + </option> + </select> + </label> + <label v-if="currentCcInfo !== 'false'"> + CC {{ $gettext('Werk') }} + <input type="text" v-model="currentCcWork" /> + </label> + <label v-if="currentCcInfo !== 'false'"> + CC {{ $gettext('Author') }} + <input type="text" v-model="currentCcAuthor" /> + </label> + <label v-if="currentCcInfo !== 'false'"> + CC {{ $gettext('Lizenz der Plattform') }} + <input type="text" v-model="currentCcBase" /> + </label> + </form> + </courseware-tab> + </courseware-tabs> </template> <template #info> - <p><translate>Informationen zum IFrame-Block</translate></p> + <p>{{ $gettext('Informationen zum IFrame-Block') }}</p> </template> </courseware-default-block> </div> @@ -105,6 +127,8 @@ <script> import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue'; +import CoursewareTabs from './CoursewareTabs.vue'; +import CoursewareTab from './CoursewareTab.vue'; import { blockMixin } from './block-mixin.js'; import { mapActions, mapGetters } from 'vuex'; import md5 from 'md5'; @@ -114,6 +138,8 @@ export default { mixins: [blockMixin], components: { CoursewareDefaultBlock, + CoursewareTabs, + CoursewareTab, }, props: { block: Object, diff --git a/resources/vue/components/courseware/CoursewareImageMapBlock.vue b/resources/vue/components/courseware/CoursewareImageMapBlock.vue index a3dd875eef15678a8ec11b6fd70524b87c467b3f..cfcd8f769dee4ac6b1fdcda68e456cdb47679773 100644 --- a/resources/vue/components/courseware/CoursewareImageMapBlock.vue +++ b/resources/vue/components/courseware/CoursewareImageMapBlock.vue @@ -71,7 +71,7 @@ <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Bilddatei</translate> + {{ $gettext('Bilddatei') }} <courseware-file-chooser v-model="currentFileId" :isImage="true" @@ -79,9 +79,9 @@ /> </label> <label> - <a class="button add" @click="addShape('arc')"><translate>Kreis hinzufügen</translate></a> - <a class="button add" @click="addShape('ellipse')"><translate>Oval hinzufügen</translate></a> - <a class="button add" @click="addShape('rect')"><translate>Rechteck hinzufügen</translate></a> + <a class="button add" @click="addShape('arc')">{{ $gettext('Kreis hinzufügen') }}</a> + <a class="button add" @click="addShape('ellipse')">{{ $gettext('Oval hinzufügen') }}</a> + <a class="button add" @click="addShape('rect')">{{ $gettext('Rechteck hinzufügen') }}</a> </label> <courseware-tabs v-if="currentShapes.length > 0"> <courseware-tab @@ -92,8 +92,8 @@ :icon="shape.title === '' ? 'link-extern' : ''" :selected="index === 0" > - <label> - <translate>Farbe</translate> + <label class="col-2"> + {{ $gettext('Farbe') }} <studip-select :options="colors" label="name" @@ -106,7 +106,7 @@ <span v-bind="selectAttributes"><studip-icon shape="arr_1down" size="10"/></span> </template> <template #no-options> - <translate>Es steht keine Auswahl zur Verfügung.</translate> + {{ $gettext('Es steht keine Auswahl zur Verfügung.') }} </template> <template #selected-option="{name, rgba}"> <span class="vs__option-color" :style="{'background-color': rgba}"></span><span>{{name}}</span> @@ -116,38 +116,8 @@ </template> </studip-select> </label> - <label v-if="shape.type === 'arc'" class="cw-block-image-map-dimensions"> - X: <input type="number" v-model="shape.data.centerX" @change="drawScreen" /> Y: - <input type="number" v-model="shape.data.centerY" @change="drawScreen" /> - <translate>Radius</translate> - <input type="number" v-model="shape.data.radius" @change="drawScreen" /> - </label> - <label v-if="shape.type === 'rect'" class="cw-block-image-map-dimensions"> - X: <input type="number" v-model="shape.data.X" @change="drawScreen" /> Y: - <input type="number" v-model="shape.data.Y" @change="drawScreen" /> - <translate>Höhe</translate> - <input type="number" v-model="shape.data.height" @change="drawScreen" /> - <translate>Breite</translate> - <input type="number" v-model="shape.data.width" @change="drawScreen" /> - </label> - <label v-if="shape.type === 'ellipse'" class="cw-block-image-map-dimensions"> - X: <input type="number" v-model="shape.data.X" @change="drawScreen" /> Y: - <input type="number" v-model="shape.data.Y" @change="drawScreen" /> - <translate>Radius</translate> X: - <input type="number" v-model="shape.data.radiusX" @change="drawScreen" /> - <translate>Radius</translate> Y: - <input type="number" v-model="shape.data.radiusY" @change="drawScreen" /> - </label> - <label> - <translate>Bezeichnung</translate> - <input type="text" v-model="shape.title" /> - </label> - <label> - <translate>Beschriftung</translate> - <input type="text" v-model="shape.data.text" @change="drawScreen" /> - </label> - <label> - <translate>Textfarbe</translate> + <label class="col-2"> + {{ $gettext('Textfarbe') }} <studip-select :options="colors" label="name" @@ -160,7 +130,7 @@ <span v-bind="selectAttributes"><studip-icon shape="arr_1down" size="10"/></span> </template> <template #no-options> - <translate>Es steht keine Auswahl zur Verfügung.</translate> + {{ $gettext('Es steht keine Auswahl zur Verfügung.') }} </template> <template #selected-option="{name, rgba}"> <span class="vs__option-color" :style="{'background-color': rgba}"></span><span>{{name}}</span> @@ -170,23 +140,83 @@ </template> </studip-select> </label> - <label> - <translate>Art des Links</translate> + <br> + <template v-if="shape.type === 'arc'"> + <label class="col-1"> + X + <input type="number" v-model="shape.data.centerX" @change="drawScreen" /> + </label> + <label class="col-1"> + Y + <input type="number" v-model="shape.data.centerY" @change="drawScreen" /> + </label> + <label class="col-1"> + {{ $gettext('Radius') }} + <input type="number" v-model="shape.data.radius" @change="drawScreen" /> + </label> + </template> + <template v-if="shape.type === 'rect'"> + <label class="col-1"> + X + <input type="number" v-model="shape.data.X" @change="drawScreen" /> + </label> + <label class="col-1"> + Y + <input type="number" v-model="shape.data.Y" @change="drawScreen" /> + </label> + <label class="col-1"> + {{ $gettext('Höhe') }} + <input type="number" v-model="shape.data.height" @change="drawScreen" /> + </label> + <label class="col-1"> + {{ $gettext('Breite') }} + <input type="number" v-model="shape.data.width" @change="drawScreen" /> + </label> + </template> + <template v-if="shape.type === 'ellipse'"> + <label class="col-1"> + X + <input type="number" v-model="shape.data.X" @change="drawScreen" /> + </label> + <label class="col-1"> + Y + <input type="number" v-model="shape.data.Y" @change="drawScreen" /> + </label> + <label class="col-1"> + {{ $gettext('Radius') }} X + <input type="number" v-model="shape.data.radiusX" @change="drawScreen" /> + </label> + <label class="col-1"> + {{ $gettext('Radius') }} Y + <input type="number" v-model="shape.data.radiusY" @change="drawScreen" /> + </label> + </template> + <label class="col-4"> + {{ $gettext('Bezeichnung') }} + <input type="text" v-model="shape.title" /> + </label> + <label class="col-4"> + {{ $gettext('Beschriftung') }} + <input type="text" v-model="shape.data.text" @change="drawScreen" /> + </label> + <br> + <label class="col-2"> + {{ $gettext('Art des Links') }} <select v-model="shape.link_type"> - <option value="internal"><translate>Interner Link</translate></option> - <option value="external"><translate>Externer Link</translate></option> + <option value="internal">{{ $gettext('Interner Link') }}</option> + <option value="external">{{ $gettext('Externer Link') }}</option> </select> </label> - <label v-if="shape.link_type === 'internal'"> - <translate>Ziel des Links</translate> + <label v-if="shape.link_type === 'internal'" class="col-2"> + {{ $gettext('Ziel des Links') }} <select v-model="shape.target_internal" @change="drawScreen"> <option v-for="(el, index) in courseware" :key="index" :value="el.id"> {{ el.attributes.title }} </option> </select> </label> - <label v-if="shape.link_type === 'external'"> - <translate>Ziel des Links</translate> + <label v-if="shape.link_type === 'external'" class="col-2"> + {{ $gettext('Ziel des Links') }} <input type="text" placeholder="https://www.studip.de" @@ -199,7 +229,7 @@ </label> <label> <a class="button cancel" @click="removeShape(index)" - ><translate>Form entfernen</translate></a + >{{ $gettext('Form entfernen') }}</a > </label> </courseware-tab> @@ -207,7 +237,7 @@ </form> </template> <template #info> - <p><translate>Informationen zum Verweissensitive-Grafik-Block</translate></p> + <p>{{ $gettext('Informationen zum Verweissensitive-Grafik-Block') }}</p> </template> </courseware-default-block> </div> diff --git a/resources/vue/components/courseware/CoursewareKeyPointBlock.vue b/resources/vue/components/courseware/CoursewareKeyPointBlock.vue index b495431d6c95c2cfb267a86855f029cd2c8b1708..687ea0b589e28cabbda4c1db99f3d2be867b3032 100644 --- a/resources/vue/components/courseware/CoursewareKeyPointBlock.vue +++ b/resources/vue/components/courseware/CoursewareKeyPointBlock.vue @@ -17,8 +17,8 @@ </template> <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> - <label for="cw-keypoint-content"> - <translate>Merksatz</translate> + <label class="col-4"> + {{ $gettext('Merksatz') }} <input type="text" name="cw-keypoint-content" @@ -27,9 +27,9 @@ spellcheck="true" /> </label> - - <label for="cw-keypoint-color"> - <translate>Farbe</translate> + <br> + <label class="col-2"> + {{ $gettext('Farbe') }} <studip-select :options="colors" label="icon" @@ -41,7 +41,7 @@ <span v-bind="selectAttributes"><studip-icon shape="arr_1down" size="10"/></span> </template> <template #no-options> - <translate>Es steht keine Auswahl zur Verfügung.</translate> + {{ $gettext('Es steht keine Auswahl zur Verfügung.') }} </template> <template #selected-option="{name, hex}"> <span class="vs__option-color" :style="{'background-color': hex}"></span><span>{{name}}</span> @@ -51,15 +51,14 @@ </template> </studip-select> </label> - - <label for="cw-keypoint-icons"> - <translate>Icon</translate> + <label class="col-2"> + {{ $gettext('Icon') }} <studip-select :options="icons" :clearable="false" v-model="currentIcon"> <template #open-indicator="selectAttributes"> <span v-bind="selectAttributes"><studip-icon shape="arr_1down" size="10"/></span> </template> <template #no-options> - <translate>Es steht keine Auswahl zur Verfügung.</translate> + {{ $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> @@ -72,7 +71,7 @@ </form> </template> <template #info> - <p><translate>Informationen zum Merksatz-Block</translate></p> + <p>{{ $gettext('Informationen zum Merksatz-Block') }}</p> </template> </courseware-default-block> </div> diff --git a/resources/vue/components/courseware/CoursewareLinkBlock.vue b/resources/vue/components/courseware/CoursewareLinkBlock.vue index 9d65163c55edb662c9e5e880400fa14778696a5e..f2c8cf931497d6cb750fa01fee18dfb688dc76d2 100644 --- a/resources/vue/components/courseware/CoursewareLinkBlock.vue +++ b/resources/vue/components/courseware/CoursewareLinkBlock.vue @@ -30,22 +30,22 @@ <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Titel</translate> + {{ $gettext('Titel') }} <input type="text" v-model="currentTitle" /> </label> <label> - <translate>Art des Links</translate> + {{ $gettext('Art des Links') }} <select v-model="currentType"> - <option value="external"><translate>Extern</translate></option> - <option value="internal"><translate>Intern</translate></option> + <option value="external">{{ $gettext('Extern') }}</option> + <option value="internal">{{ $gettext('Intern') }}</option> </select> </label> <label v-show="currentType === 'external'"> - <translate>URL</translate> + {{ $gettext('URL') }} <input type="text" v-model="currentUrl" @change="fixUrl" /> </label> <label v-show="currentType === 'internal'"> - <translate>Seite</translate> + {{ $gettext('Seite') }} <select v-model="currentTarget"> <option v-for="(el, index) in courseware" :key="index" :value="el.id"> {{ el.attributes.title }} @@ -55,7 +55,7 @@ </form> </template> <template #info> - <p><translate>Informationen zum Link-Block</translate></p> + <p>{{ $gettext('Informationen zum Link-Block') }}</p> </template> </courseware-default-block> </div> diff --git a/resources/vue/components/courseware/CoursewareTableOfContentsBlock.vue b/resources/vue/components/courseware/CoursewareTableOfContentsBlock.vue index c55399b71a71db65a4453ed8b596d0c8e5992695..e495323787acdc8fd245593c415ad30e96169306 100644 --- a/resources/vue/components/courseware/CoursewareTableOfContentsBlock.vue +++ b/resources/vue/components/courseware/CoursewareTableOfContentsBlock.vue @@ -77,20 +77,20 @@ <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> <label> - <translate>Überschrift</translate> + {{ $gettext('Überschrift') }} <input type="text" v-model="currentTitle" /> </label> <label> - <translate>Layout</translate> + {{ $gettext('Layout') }} <select v-model="currentStyle"> - <option value="list"><translate>Liste</translate></option> - <option value="list-details"><translate>Liste mit Beschreibung</translate></option> - <option value="tiles"><translate>Kacheln</translate></option> + <option value="list">{{ $gettext('Liste') }}</option> + <option value="list-details">{{ $gettext('Liste mit Beschreibung') }}</option> + <option value="tiles">{{ $gettext('Kacheln') }}</option> </select> </label> </form> </template> - <template #info><translate>Informationen zum Inhaltsverzeichnis-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Inhaltsverzeichnis-Block') }}</template> </courseware-default-block> </div> </template> diff --git a/resources/vue/components/courseware/CoursewareTextBlock.vue b/resources/vue/components/courseware/CoursewareTextBlock.vue index 5a6f87111da57fb21f51eb66bc145a432665a570..7367cf82c680018515e746ff2d43c0ac9f37b25d 100644 --- a/resources/vue/components/courseware/CoursewareTextBlock.vue +++ b/resources/vue/components/courseware/CoursewareTextBlock.vue @@ -16,7 +16,7 @@ <template v-if="canEdit" #edit> <ckeditor :editor="editor" v-model="currentText" :config="editorConfig" @ready="onReady"></ckeditor> </template> - <template #info><translate>Informationen zum Text-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Text-Block') }}</template> </courseware-default-block> </div> </template> diff --git a/resources/vue/components/courseware/CoursewareTimelineBlock.vue b/resources/vue/components/courseware/CoursewareTimelineBlock.vue index 31a678c76e7830fc5b4c020d145077145d8fee91..1cc5d4d9204f522545bab1dd42528eb5c0f948f4 100644 --- a/resources/vue/components/courseware/CoursewareTimelineBlock.vue +++ b/resources/vue/components/courseware/CoursewareTimelineBlock.vue @@ -35,27 +35,26 @@ </template> <template v-if="canEdit" #edit> <form class="default" @submit.prevent=""> - <label> - <translate>Zeitliche Sortierung</translate> + <label class="col-2"> + {{ $gettext('Zeitliche Sortierung') }} <select v-model="currentSort"> - <option value="none"><translate>Keine</translate></option> - <option value="asc"><translate>Aufsteigend</translate></option> - <option value="desc"><translate>Absteigend</translate></option> + <option value="none">{{ $gettext('Keine') }}</option> + <option value="asc">{{ $gettext('Aufsteigend') }}</option> + <option value="desc">{{ $gettext('Absteigend') }}</option> </select> </label> - - <label> - <translate>Zeitangabe</translate> + <label class="col-2"> + {{ $gettext('Zeitangabe') }} <select v-model="currentDateFormat"> - <option value="year"><translate>Jahr</translate></option> - <option value="date"><translate>Datum</translate></option> - <option value="time"><translate>Zeit</translate></option> - <option value="datetime"><translate>Datum und Zeit</translate></option> - <option value="none"><translate>Keine</translate></option> + <option value="year">{{ $gettext('Jahr') }}</option> + <option value="date">{{ $gettext('Datum') }}</option> + <option value="time">{{ $gettext('Zeit') }}</option> + <option value="datetime">{{ $gettext('Datum und Zeit') }}</option> + <option value="none">{{ $gettext('Keine') }}</option> </select> </label> </form> - <button class="button add" @click="addItem"><translate>Ereignis hinzufügen</translate></button> + <button class="button add" @click="addItem">{{ $gettext('Ereignis hinzufügen') }}</button> <courseware-tabs v-if="currentItems.length > 0" :setSelected="setItemTab" @@ -70,16 +69,18 @@ canBeEmpty > <form class="default" @submit.prevent=""> - <label> - <translate>Titel</translate> + <label class="col-4"> + {{ $gettext('Titel') }} <input type="text" v-model="item.title" /> </label> - <label> - <translate>Beschreibung</translate> + <label class="col-4"> + + {{ $gettext('Beschreibung') }} <textarea v-model="item.description" /> </label> - <label> - <translate>Farbe</translate> + <br> + <label class="col-2"> + {{ $gettext('Farbe') }} <studip-select :options="colors" label="icon" @@ -91,7 +92,7 @@ <span v-bind="selectAttributes"><studip-icon shape="arr_1down" size="10"/></span> </template> <template #no-options> - <translate>Es steht keine Auswahl zur Verfügung.</translate> + {{ $gettext('Es steht keine Auswahl zur Verfügung.') }} </template> <template #selected-option="{name, hex}"> <span class="vs__option-color" :style="{'background-color': hex}"></span><span>{{name}}</span> @@ -101,14 +102,14 @@ </template> </studip-select> </label> - <label> - <translate>Icon</translate> + <label class="col-2"> + {{ $gettext('Icon') }} <studip-select :options="icons" :clearable="false" v-model="item.icon"> <template #open-indicator="selectAttributes"> <span v-bind="selectAttributes"><studip-icon shape="arr_1down" size="10"/></span> </template> <template #no-options> - <translate>Es steht keine Auswahl zur Verfügung.</translate> + {{ $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> @@ -118,24 +119,25 @@ </template> </studip-select> </label> - <label> - <translate>Datum</translate> + <br> + <label class="col-1"> + {{ $gettext('Datum') }} <input type="date" v-model="item.date" required/> </label> - <label> - <translate>Zeit</translate> + <label class="col-1"> + {{ $gettext('Zeit') }} <input type="time" v-model="item.time" /> </label> <label v-if="currentItems.length > 1"> <button class="button trash" @click="removeItem(index)"> - <translate>Ereignis entfernen</translate> + {{ $gettext('Ereignis entfernen') }} </button> </label> </form> </courseware-tab> </courseware-tabs> </template> - <template #info><translate>Informationen zum Zeitstrahl-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Zeitstrahl-Block') }}</template> </courseware-default-block> </div> </template> diff --git a/resources/vue/components/courseware/CoursewareTypewriterBlock.vue b/resources/vue/components/courseware/CoursewareTypewriterBlock.vue index 14c7072034478e232663690a45bcfae748337ac4..234f2aa5907cb96abe5189156f67f85b15c5be52 100644 --- a/resources/vue/components/courseware/CoursewareTypewriterBlock.vue +++ b/resources/vue/components/courseware/CoursewareTypewriterBlock.vue @@ -22,45 +22,45 @@ </div> </template> <template v-if="canEdit" #edit> - <label class="cw-typewriter-content-label"> - <translate>Text</translate> - <textarea v-model="currentText" name="cw-typewriter-content" class="cw-typewriter-content"></textarea> - </label> - - <label class="cw-typewriter-speed-label"> - <translate>Geschwindigkeit</translate> - <select v-model="currentSpeed" class="cw-typewriter-speed" name="cw-typewriter-speed" @change="restartTyping"> - <option value="0"><translate>Langsam</translate></option> - <option value="1"><translate>Normal</translate></option> - <option value="2"><translate>Schnell</translate></option> - <option value="3"><translate>Sehr schnell</translate></option> - </select> - </label> - - <label class="cw-typewriter-font-label"> - <translate>Schriftart</translate> - <select v-model="currentFont" class="cw-typewriter-font" name="cw-typewriter-font"> - <option value="font-default"><translate>Standard</translate></option> - <option value="font-typewriter">Lucida Sans Typewriter</option> - <option value="font-trebuchet">Trebuchet MS</option> - <option value="font-tahoma">Tahoma</option> - <option value="font-georgia">Georgia</option> - <option value="font-narrow">Arial Narrow</option> - </select> - </label> - - <label class="cw-typewriter-size-label"> - <translate>Schriftgröße</translate> - <select v-model="currentSize" class="cw-typewriter-size" name="cw-typewriter-size"> - <option value="size-default">100%</option> - <option value="size-tall">125%</option> - <option value="size-grande">150%</option> - <option value="size-huge">200%</option> - </select> - </label> + <form class="default" @submit.prevent=""> + <label class="col-4"> + {{ $gettext('Text') }} + <textarea v-model="currentText" /> + </label> + <br> + <label class="col-1"> + {{ $gettext('Geschwindigkeit') }} + <select v-model="currentSpeed" @change="restartTyping"> + <option value="0">{{ $gettext('Langsam') }}</option> + <option value="1">{{ $gettext('Normal') }}</option> + <option value="2">{{ $gettext('Schnell') }}</option> + <option value="3">{{ $gettext('Sehr schnell') }}</option> + </select> + </label> + <label class="col-1"> + {{ $gettext('Schriftart') }} + <select v-model="currentFont"> + <option value="font-default">{{ $gettext('Standard') }}</option> + <option value="font-typewriter">Lucida Sans Typewriter</option> + <option value="font-trebuchet">Trebuchet MS</option> + <option value="font-tahoma">Tahoma</option> + <option value="font-georgia">Georgia</option> + <option value="font-narrow">Arial Narrow</option> + </select> + </label> + <label class="col-1"> + {{ $gettext('Schriftgröße') }} + <select v-model="currentSize"> + <option value="size-default">100%</option> + <option value="size-tall">125%</option> + <option value="size-grande">150%</option> + <option value="size-huge">200%</option> + </select> + </label> + </form> </template> <template #info> - <p><translate>Informationen zum Schreibmaschinen-Block</translate></p> + <p>{{ $gettext('Informationen zum Schreibmaschinen-Block') }}</p> </template> </courseware-default-block> </div> diff --git a/resources/vue/components/courseware/CoursewareVideoBlock.vue b/resources/vue/components/courseware/CoursewareVideoBlock.vue index 40f7e9679dcd202622716b551495e00ef777e79d..66c3cf289a1bd42ff60908cfcc9b993bb514ea96 100644 --- a/resources/vue/components/courseware/CoursewareVideoBlock.vue +++ b/resources/vue/components/courseware/CoursewareVideoBlock.vue @@ -21,54 +21,70 @@ /> </template> <template v-if="canEdit" #edit> - <form class="default" @submit.prevent=""> - <label> - <translate>Überschrift</translate> - <input type="text" v-model="currentTitle" /> - </label> - <label> - <translate>Quelle</translate> - <select v-model="currentSource"> - <option value="studip"><translate>Dateibereich</translate></option> - <option value="web"><translate>Web-Adresse</translate></option> - </select> - </label> - <label v-show="currentSource === 'web'"> - <translate>URL</translate> - <input type="text" v-model="currentWebUrl" /> - </label> - <label v-show="currentSource === 'studip'"> - <translate>Datei</translate> - <courseware-file-chooser - v-model="currentFileId" - :isVideo="true" - @selectFile="updateCurrentFile" - /> - </label> - <label> - <translate>Seitenverhältnis</translate> - <select v-model="currentAspect"> - <option value="169">16:9</option> - <option value="43">4:3</option> - </select> - </label> - <label> - <translate>Video startet automatisch</translate> - <select v-model="currentAutoplay"> - <option value="disabled"><translate>Nein</translate></option> - <option value="enabled"><translate>Ja</translate></option> - </select> - </label> - <label> - <translate>Contextmenü</translate> - <select v-model="currentContextMenu"> - <option value="enabled"><translate>Erlauben</translate></option> - <option value="disabled"><translate>Verhindern</translate></option> - </select> - </label> - </form> + <courseware-tabs> + <courseware-tab + :index="0" + :name="$gettext('Grunddaten')" + :selected="true" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Überschrift') }} + <input type="text" v-model="currentTitle" /> + </label> + <label> + {{ $gettext('Quelle') }} + <select v-model="currentSource"> + <option value="studip">{{ $gettext('Dateibereich') }}</option> + <option value="web">{{ $gettext('Web-Adresse') }}</option> + </select> + </label> + <label v-show="currentSource === 'web'"> + {{ $gettext('URL') }} + <input type="text" v-model="currentWebUrl" /> + </label> + <label v-show="currentSource === 'studip'"> + {{ $gettext('Datei') }} + <courseware-file-chooser + v-model="currentFileId" + :isVideo="true" + @selectFile="updateCurrentFile" + /> + </label> + + </form> + </courseware-tab> + <courseware-tab + :index="1" + :name="$gettext('Video Einstellungen')" + > + <form class="default" @submit.prevent=""> + <label> + {{ $gettext('Seitenverhältnis') }} + <select v-model="currentAspect"> + <option value="169">16:9</option> + <option value="43">4:3</option> + </select> + </label> + <label> + {{ $gettext('Video startet automatisch') }} + <select v-model="currentAutoplay"> + <option value="disabled">{{ $gettext('Nein') }}</option> + <option value="enabled">{{ $gettext('Ja') }}</option> + </select> + </label> + <label> + {{ $gettext('Contextmenü') }} + <select v-model="currentContextMenu"> + <option value="enabled">{{ $gettext('Erlauben') }}</option> + <option value="disabled">{{ $gettext('Verhindern') }}</option> + </select> + </label> + </form> + </courseware-tab> + </courseware-tabs> </template> - <template #info><translate>Informationen zum Video-Block</translate></template> + <template #info>{{ $gettext('Informationen zum Video-Block') }}</template> </courseware-default-block> </div> </template> @@ -76,6 +92,8 @@ <script> import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue'; import CoursewareFileChooser from './CoursewareFileChooser.vue'; +import CoursewareTabs from './CoursewareTabs.vue'; +import CoursewareTab from './CoursewareTab.vue'; import { blockMixin } from './block-mixin.js'; import { mapActions, mapGetters } from 'vuex'; @@ -85,6 +103,8 @@ export default { components: { CoursewareDefaultBlock, CoursewareFileChooser, + CoursewareTabs, + CoursewareTab, }, props: { block: Object,