diff options
| author | Jan-Hendrik Willms <tleilax+github@gmail.com> | 2024-07-08 15:50:03 +0200 |
|---|---|---|
| committer | Jan-Hendrik Willms <tleilax+github@gmail.com> | 2024-07-08 16:24:10 +0200 |
| commit | 58ec440501ee821931706fd12dbd9331b0eaca50 (patch) | |
| tree | 26fbd06d9f3775b16a5f01b549b22a97a454258c /resources | |
| parent | 471197f7abc27b0fdc65e453587a74906922f9d5 (diff) | |
convert oersearch to sfc, re #4302tic-4302
Diffstat (limited to 'resources')
| -rw-r--r-- | resources/assets/javascripts/bootstrap/dialog.js | 15 | ||||
| -rw-r--r-- | resources/assets/javascripts/bootstrap/oer.js | 92 | ||||
| -rw-r--r-- | resources/assets/stylesheets/scss/quicksearch.scss | 44 | ||||
| -rw-r--r-- | resources/vue/components/OERMaterialEditor.vue | 62 | ||||
| -rw-r--r-- | resources/vue/components/Quicksearch.vue | 46 | ||||
| -rw-r--r-- | resources/vue/components/StudipLevelSlider.vue | 21 |
6 files changed, 103 insertions, 177 deletions
diff --git a/resources/assets/javascripts/bootstrap/dialog.js b/resources/assets/javascripts/bootstrap/dialog.js index 58d01fd..58857cb 100644 --- a/resources/assets/javascripts/bootstrap/dialog.js +++ b/resources/assets/javascripts/bootstrap/dialog.js @@ -2,7 +2,14 @@ STUDIP.domReady(function () { STUDIP.Dialog.initialize(); }); -$(document).on('click', '[data-vue-app] [data-dialog-button] .cancel.button', () => { - STUDIP.Dialog.close(); - return false; -}); +document.addEventListener( + 'click', + (event) => { + if (event.target.matches('.studip-dialog [data-vue-app] [data-dialog-button] .cancel.button')) { + STUDIP.Dialog.close(); + event.preventDefault(); + event.stopPropagation(); + } + }, + true +); diff --git a/resources/assets/javascripts/bootstrap/oer.js b/resources/assets/javascripts/bootstrap/oer.js index 3adecbc..ed472b5 100644 --- a/resources/assets/javascripts/bootstrap/oer.js +++ b/resources/assets/javascripts/bootstrap/oer.js @@ -47,95 +47,3 @@ STUDIP.domReady(() => { }); }); - -STUDIP.ready(() => { - if ($('.oercampus_editmaterial').length) { - - STUDIP.Vue.load().then(({createApp}) => { - STUDIP.OER.EditApp = createApp({ - el: '.oercampus_editmaterial', - data() { - return { - name: $('.oercampus_editmaterial input.oername').val(), - logo_url: $('.oercampus_editmaterial .logo_file').data("oldurl"), - customlogo: $('.oercampus_editmaterial .logo_file').data("customlogo"), - filename: $('.oercampus_editmaterial .file.drag-and-drop').data("filename"), - filesize: $('.oercampus_editmaterial .file.drag-and-drop').data("filesize"), - tags: $('.oercampus_editmaterial .oer_tags').data("defaulttags"), - minimumTags: 5 - }; - }, - mounted: function () { - jQuery("#difficulty_slider_edit").slider({ - range: true, - min: 1, - max: 12, - values: [jQuery("#difficulty_start").val(), jQuery("#difficulty_end").val()], - change: function (event, ui) { - jQuery("#difficulty_start").val(ui.values[0]); - jQuery("#difficulty_end").val(ui.values[1]); - } - }); - jQuery('.oercampus_editmaterial').find(':focusable').first().focus(); - }, - methods: { - editName: function () { - this.name = $('.oername').val(); - }, - editImage: function (event) { - let reader = new FileReader(); - let vue = this; - reader.addEventListener("load", function () { - vue.logo_url = reader.result; - vue.customlogo = true; - }, false); - reader.readAsDataURL( - event.target.files.length > 0 - ? event.target.files[0] - : event.dataTransfer.files[0] - ); - }, - dropImage: function (event) { - window.document.getElementById("oer_logo_uploader").files = event.dataTransfer.files; - this.editImage(event); - }, - editFile: function (event) { - this.filename = event.target.files[0].name; - this.filesize = event.target.files[0].size; - if (!this.name) { - this.name = this.filename; - $('.oername').val(this.name); - } - }, - dropFile: function (event) { - window.document.getElementById("oer_file").files = event.dataTransfer.files; - this.editFile(event); - }, - addTag: function () { - if (this.minimumTags < this.tags.length) { - this.minimumTags = this.tags.length + 1; - } else { - this.minimumTags++; - } - }, - removeTag: function (i) { - this.$delete(this.tags, i); - if ((this.minimumTags > this.tags.length) && (this.minimumTags > 5)) { - this.minimumTags--; - } - } - }, - computed: { - displayTags () { - const result = this.tags.concat([]); - while (result.length < this.minimumTags) { - result.push(''); - } - return result; - } - }, - components: { Quicksearch } - }); - }); - } -}); diff --git a/resources/assets/stylesheets/scss/quicksearch.scss b/resources/assets/stylesheets/scss/quicksearch.scss index ef6c372..6687450 100644 --- a/resources/assets/stylesheets/scss/quicksearch.scss +++ b/resources/assets/stylesheets/scss/quicksearch.scss @@ -89,47 +89,3 @@ div.quicksearch_frame { background-position: center center; } } - -.quicksearch_container { - display: inline-flex; - flex-direction: row-reverse; - width: 100%; - - .dropdownmenu { - max-width: 0; - max-height: 0; - overflow: visible; - position: relative; - top: 31px; - z-index: 99999; - - .autocomplete__results { - list-style-type: none; - padding: 1px; - border: 1px solid var(--light-gray-color-40); - background-color: var(--white); - max-height: 275px; - width: 600px; - overflow-x: auto; - overflow-y: hidden; - - > li { - padding: 5px; - cursor: pointer; - display: flex; - align-items: flex-start; - - &:hover, &.autocomplete__result--selected { - background-color: var(--base-color); - color: var(--white); - } - - img { - max-width: 40px; - max-height: 40px; - margin-right: 5px; - } - } - } - } -} diff --git a/resources/vue/components/OERMaterialEditor.vue b/resources/vue/components/OERMaterialEditor.vue index 88b9232..1ad1f86 100644 --- a/resources/vue/components/OERMaterialEditor.vue +++ b/resources/vue/components/OERMaterialEditor.vue @@ -6,7 +6,7 @@ data-secure enctype="multipart/form-data" > - <input type="hidden" :name="csrf.name" :value="csrf.token"> + <input type="hidden" :name="csrf.name" :value="csrf.value"> <input v-if="template?.redirect_url" type="hidden" name="redirect_url" @@ -136,18 +136,18 @@ <div class="oer_tags_container"> <h4>{{ $gettext('Themen (am besten mindestens 5)') }}</h4> <ul class="clean oer_tags"> - <li v-for="(tag, index) in displayTags" :key="index"> + <li v-for="(tag, index) in tags" :key="index"> # <quicksearch name="tags[]" :searchtype="tagSearch" v-model="tags[index]" :autocomplete="true" + v-focus-on-create ></quicksearch> - <a href="#" - @click.prevent="removeTag(index)" + <button class="as-link" @click.prevent="removeTag(index)" :title="$gettext('Thema aus der Liste streichen')"> <studip-icon shape="trash" :size="20" class="text-bottom"></studip-icon> - </a> + </button> </li> </ul> @@ -196,9 +196,12 @@ </fieldset> <footer data-dialog-button> - <button type="button" name="save"> - {{ material.id ? $gettext('Hochladen') : $gettext('Speichern') }} + <button type="submit" name="save" class="button"> + {{ material.id ? $gettext('Speichern') : $gettext('Hochladen') }} </button> + <a :href="URLHelper.getURL('dispatch.php/oer/mymaterial')" class="button cancel"> + {{ $gettext('Abbrechen') }} + </a> </footer> </form> </template> @@ -206,10 +209,25 @@ import Quicksearch from "./Quicksearch.vue"; import StudipIcon from "./StudipIcon.vue"; import StudipLevelSlider from "./StudipLevelSlider.vue"; +import Vue from "vue"; + +let mounted = false; export default { name: "OERMaterialEditor", components: {StudipLevelSlider, StudipIcon, Quicksearch }, + directives: { + ['focus-on-create']: { + bind(el) { + if (mounted) { + Vue.nextTick(() => el.querySelector('input')?.focus()); + } + } + } + }, + mounted () { + mounted = true; + }, props: { material: { type: Object, @@ -287,11 +305,6 @@ export default { return this.template?.image_tmp_name?.length > 0 || this.material.front_image_content_type?.length > 0; }, - displayTags () { - return this.material.tags.concat( - Array(this.minimumTags).fill('') - ).slice(0, this.minimumTags); - }, logoUrl() { return this.template?.image_tmp_name ? STUDIP.URLHelper.getURL('dispatch.php/oer/mymaterial/show_tmp_image') : this.material.logoUrl; }, @@ -299,9 +312,6 @@ export default { return STUDIP.URLHelper; } }, - mounted() { - jQuery('.oercampus_editmaterial').find(':focusable').first().focus(); - }, methods: { editImage(event) { let reader = new FileReader(); @@ -336,12 +346,13 @@ export default { this.tags.push(''); }, removeTag(i) { - this.$delete(this.tags, i); - if ( - this.minimumTags > this.tags.length - && this.minimumTags > 5 - ) { - this.minimumTags--; + this.tags = this.tags.filter((element, index) => index !== i); + } + }, + watch: { + tags(current) { + if (current.length === 0) { + this.tags.push(''); } } } @@ -383,14 +394,5 @@ export default { .oer_tags_container { margin-top: 10px; } - - .level_labels { - display: flex; - justify-content: space-between; - font-size: 0.8em; - color: var(--black); - margin-top: 20px; - } - } </style> diff --git a/resources/vue/components/Quicksearch.vue b/resources/vue/components/Quicksearch.vue index 0f37ae0..cdfdeb0 100644 --- a/resources/vue/components/Quicksearch.vue +++ b/resources/vue/components/Quicksearch.vue @@ -181,3 +181,49 @@ export default { } } </script> +<style lang="scss"> +.quicksearch_container { + align-items: center; + display: inline-flex; + flex-direction: row-reverse; + width: 100%; + + .dropdownmenu { + max-width: 0; + max-height: 0; + overflow: visible; + position: relative; + top: 31px; + z-index: 99999; + + .autocomplete__results { + list-style-type: none; + padding: 1px; + border: 1px solid var(--light-gray-color-40); + background-color: var(--white); + max-height: 275px; + width: 600px; + overflow-x: auto; + overflow-y: hidden; + + > li { + padding: 5px; + cursor: pointer; + display: flex; + align-items: flex-start; + + &:hover, &.autocomplete__result--selected { + background-color: var(--base-color); + color: var(--white); + } + + img { + max-width: 40px; + max-height: 40px; + margin-right: 5px; + } + } + } + } +} +</style> diff --git a/resources/vue/components/StudipLevelSlider.vue b/resources/vue/components/StudipLevelSlider.vue index a1b91e0..ee362e6 100644 --- a/resources/vue/components/StudipLevelSlider.vue +++ b/resources/vue/components/StudipLevelSlider.vue @@ -1,11 +1,16 @@ <template> <div class="level-slider" :style="{width: this.width}"> <div class="level-labels"> - <div>{{ lowerLabel }}</div> - <div>{{ upperLabel }}</div> + <div class="level-label">{{ lowerLabel }}</div> + <div class="level-label">{{ upperLabel }}</div> </div> <div class="level-numbers"> - <div v-for="i in this.maxValue" :key="`level-${i}`">{{ i }}</div> + <div v-for="i in this.maxValue" + :key="`level-${i}`" + class="level-number" + > + {{ i }} + </div> </div> <div ref="slider" class="slider-element"></div> </div> @@ -48,8 +53,6 @@ export default { max: this.maxValue, values: [this.lowerValue, this.upperValue], change: (event, ui) => { - console.log('Updating', ui.values[0], ui.values[1]); - this.$emit('update:lowerValue', ui.values[0]); this.$emit('update:upperValue', ui.values[1]); } @@ -71,10 +74,14 @@ export default { display: flex; justify-content: space-between; } + .level-number { + flex: 0 2ex; + text-align: right; + } .slider-element { - margin-left: 5px; - margin-right: 9px; margin-top: 5px; + margin-left: 0.5ex; + margin-right: 0.5ex; } } </style> |
