From 42ce67b2faca749d160b2e5240c05937ebc6bdd4 Mon Sep 17 00:00:00 2001 From: Ron Lucke <lucke@elan-ev.de> Date: Tue, 19 Oct 2021 11:27:33 +0000 Subject: [PATCH] Biest #277 --- .../assets/stylesheets/scss/courseware.scss | 17 ++--- .../CoursewareManagerCopySelector.vue | 76 ++++++++++++++++--- 2 files changed, 75 insertions(+), 18 deletions(-) diff --git a/resources/assets/stylesheets/scss/courseware.scss b/resources/assets/stylesheets/scss/courseware.scss index 52ce7b807de..a8a523c57f7 100755 --- a/resources/assets/stylesheets/scss/courseware.scss +++ b/resources/assets/stylesheets/scss/courseware.scss @@ -4196,18 +4196,17 @@ vSelect end margin: 0; list-style: none; } - button { - width: 100%; - border: solid thin $content-color-40; - background-color: $white; - padding: 1em; - margin-bottom: 4px; + .cw-manager-copy-selector-course { color: $base-color; cursor: pointer; - outline: none; + line-height: 2em; + &:hover { - color:$white; - background-color: $base-color; + color: $active-color; + } + + img { + vertical-align: text-bottom; } } } diff --git a/resources/vue/components/courseware/CoursewareManagerCopySelector.vue b/resources/vue/components/courseware/CoursewareManagerCopySelector.vue index a914cde8ed2..602a0b4d2a6 100755 --- a/resources/vue/components/courseware/CoursewareManagerCopySelector.vue +++ b/resources/vue/components/courseware/CoursewareManagerCopySelector.vue @@ -1,25 +1,43 @@ <template> <div class="cw-manager-copy-selector"> <div v-if="sourceEmpty" class="cw-manager-copy-selector-source"> - <button class="hugebutton" @click="selectSource('own'); loadOwnCourseware()"><translate>Aus meine Inhalte kopieren</translate></button> - <button class="hugebutton" @click="selectSource('remote')"><translate>Aus Veranstaltung kopieren</translate></button> + <button class="button" @click="selectSource('own'); loadOwnCourseware()"><translate>Aus meine Inhalte kopieren</translate></button> + <button class="button" @click="selectSource('remote')"><translate>Aus Veranstaltung kopieren</translate></button> </div> <div v-else> <button class="button" @click="reset"><translate>Quelle auswählen</translate></button> + <button v-show="!sourceOwn && hasRemoteCid" class="button" @click="selectNewCourse"><translate>Veranstaltung auswählen</translate></button> <div v-if="sourceRemote"> <h2 v-if="!hasRemoteCid"><translate>Veranstaltungen</translate></h2> <ul v-if="!hasRemoteCid"> - <li v-for="course in courses" :key="course.id" > - <button class="hugebutton" @click="loadRemoteCourseware(course.id)">{{course.attributes.title}}</button> + <li v-for="semester in semesterMap" :key="semester.id"> + <h3>{{semester.attributes.title}}</h3> + <ul> + <li + v-for="course in coursesBySemester(semester)" + :key="course.id" + class="cw-manager-copy-selector-course" + @click="loadRemoteCourseware(course.id)" + > + <studip-icon :shape="getCourseIcon(course)" /> + {{course.attributes.title}} + </li> + </ul> </li> + </ul> <courseware-manager-element - v-if="hasRemoteCid" + v-if="remoteId !== '' && hasRemoteCid" type="remote" :currentElement="remoteElement" @selectElement="setRemoteId" @loadSelf="loadSelf" /> + <courseware-companion-box + v-if="remoteId === '' && hasRemoteCid" + :msgCompanion="$gettext('In dieser Veranstaltung wurden noch keine Inhalte angelegt')" + mood="sad" + /> </div> <div v-if="sourceOwn"> <courseware-manager-element @@ -61,12 +79,14 @@ export default { ownCoursewareInstance: {}, ownId: '', ownElement: {}, + semesterMap: [], }}, computed: { ...mapGetters({ userId: 'userId', structuralElementById: 'courseware-structural-elements/byId', + semesterById: 'semesters/byId', }), sourceEmpty() { return this.source === ''; @@ -80,12 +100,16 @@ export default { hasRemoteCid() { return this.remoteCid !== ''; }, + loadedCourses() { + return this.courses.sort((a, b) => a.attributes.title > b.attributes.title); + } }, methods: { ...mapActions({ loadUsersCourses: 'loadUsersCourses', loadStructuralElement: 'loadStructuralElement', loadRemoteCoursewareStructure: 'loadRemoteCoursewareStructure', + loadSemester: 'semesters/loadById', }), selectSource(source) { this.source = source; @@ -96,7 +120,7 @@ export default { if (this.remoteCoursewareInstance !== null) { this.setRemoteId(this.remoteCoursewareInstance.relationships.root.data.id); } else { - console.debug('can not load'); + this.remoteId = ''; } }, @@ -105,14 +129,17 @@ export default { if (this.ownCoursewareInstance !== null) { this.setOwnId(this.ownCoursewareInstance.relationships.root.data.id); } else { - console.debug('can not load'); + this.ownId = ''; } - }, reset() { this.selectSource(''); this.remoteCid = ''; }, + selectNewCourse() { + this.remoteCid = ''; + this.remoteId = ''; + }, async setRemoteId(target) { this.remoteId = target; await this.loadStructuralElement(this.remoteId); @@ -131,11 +158,42 @@ export default { }, loadSelf(data) { this.$emit('loadSelf', data); + }, + loadSemesterMap() { + let view = this; + let semesters = []; + this.courses.every(course => { + let semId = course.relationships['start-semester'].data.id; + if(!semesters.includes(semId)) { + semesters.push(semId); + } + return true; + }); + semesters.every(semester => { + view.loadSemester({id: semester}).then( () => { + view.semesterMap.push(view.semesterById({id: semester})); + view.semesterMap.sort((a, b) => a.attributes.start < b.attributes.start); + }); + return true; + }); + }, + coursesBySemester(semester) { + return this.loadedCourses.filter(course => { + return course.relationships['start-semester'].data.id === semester.id} + ); + }, + getCourseIcon(course) { + if (course.attributes['course-type'] === 99) { + return 'studygroup'; + } + + return 'seminar'; } }, async mounted() { this.courses = await this.loadUsersCourses(this.userId); + this.loadSemesterMap(); } } -</script> \ No newline at end of file +</script> -- GitLab