Skip to content
Snippets Groups Projects
Select Git revision
  • a944dacedff6511310d1c73b9854b450ed8996b2
  • main default protected
  • step-3263
  • feature/plugins-cli
  • feature/vite
  • step-2484-peerreview
  • biest/issue-5051
  • tests/simplify-jsonapi-tests
  • fix/typo-in-1a70031
  • feature/broadcasting
  • database-seeders-and-factories
  • feature/peer-review-2
  • feature-feedback-jsonapi
  • feature/peerreview
  • feature/balloon-plus
  • feature/stock-images-unsplash
  • tic-2588
  • 5.0
  • 5.2
  • biest/unlock-blocks
  • biest-1514
21 results

AdminCourseFilter.class.php

Blame
  • Forked from Stud.IP / Stud.IP
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    CoursewareManagerCopySelector.vue 7.30 KiB
    <template>
        <div class="cw-manager-copy-selector">
            <div v-if="sourceEmpty" class="cw-manager-copy-selector-source">
                <button class="button" @click="selectSource('own'); loadOwnCourseware()"><translate>Aus persönlichen Lernmaterialien 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="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="remoteId !== '' && hasRemoteCid"
                        type="remote"
                        :currentElement="remoteElement"
                        @selectElement="setRemoteId"
                        @loadSelf="loadSelf"
                        @reloadElement="reloadElement"
                    />
                    <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
                        v-if="ownId !== ''"
                        type="own"
                        :currentElement="ownElement"
                        @selectElement="setOwnId"
                        @loadSelf="loadSelf"
                    />
                    <courseware-companion-box
                        v-else
                        :msgCompanion="$gettext('Sie haben noch keine eigenen Inhalte angelegt.')"
                        mood="sad"
                    />
                </div>
            </div>
        </div>
    </template>
    
    <script>
    import CoursewareManagerElement from './CoursewareManagerElement.vue';
    import { mapActions, mapGetters } from 'vuex';
    import CoursewareCompanionBox from './CoursewareCompanionBox.vue';
    
    export default {
        name: 'courseware-manager-copy-selector',
        components:{
            CoursewareManagerElement,
            CoursewareCompanionBox,
        },
        props: {},
        data() {return{
            source: '',
            courses: [],
            remoteCid: '',
            remoteCoursewareInstance: {},
            remoteId: '',
            remoteElement: {},
            ownCoursewareInstance: {},
            ownId: '',
            ownElement: {},
            semesterMap: [],
    
        }},
        computed: {
            ...mapGetters({
                userId: 'userId',
                structuralElementById: 'courseware-structural-elements/byId',
                semesterById: 'semesters/byId',
            }),
            sourceEmpty() {
                return this.source === '';
            },
            sourceOwn() {
                return this.source === 'own';
            },
            sourceRemote() {
                return this.source === 'remote';
            },
            hasRemoteCid() {
                return this.remoteCid !== '';
            },
            loadedCourses() {
                return this.courses.sort((a, b) => a.attributes.title > b.attributes.title);
            }
        },
        methods: {
            ...mapActions({
                loadAnotherCourseware: 'courseware-structure/loadAnotherCourseware',
                loadUsersCourses: 'loadUsersCourses',
                loadStructuralElement: 'loadStructuralElement',
                loadSemester: 'semesters/loadById',
            }),
            selectSource(source) {
                this.source = source;
            },
            async loadRemoteCourseware(cid) {
                this.remoteCid = cid;
                this.remoteCoursewareInstance = await this.loadAnotherCourseware({ id: this.remoteCid, type: 'courses'});
                if (this.remoteCoursewareInstance !== null) {
                    this.setRemoteId(this.remoteCoursewareInstance.relationships.root.data.id);
                } else {
                    this.remoteId = '';
                }
            },
            async loadOwnCourseware() {
                this.ownCoursewareInstance = await this.loadAnotherCourseware({ id: this.userId, type: 'users' });
                if (this.ownCoursewareInstance !== null) {
                    this.setOwnId(this.ownCoursewareInstance.relationships.root.data.id);
                } else {
                    this.ownId = '';
                }
            },
            reset() {
                this.selectSource('');
                this.remoteCid = '';
            },
            selectNewCourse() {
                this.remoteCid = '';
                this.remoteId = '';
            },
            async setRemoteId(target) {
                this.remoteId = target;
                await this.loadStructuralElement(this.remoteId);
                this.initRemote();
            },
            initRemote() {
                this.remoteElement = this.structuralElementById({ id: this.remoteId });
            },
            async setOwnId(target) {
                this.ownId = target;
                await this.loadStructuralElement(this.ownId);
                this.initOwn();
            },
            initOwn() {
                this.ownElement = this.structuralElementById({ id: this.ownId });
            },
            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';
            },
            reloadElement() {
                this.$emit("reloadElement");
            }
        },
        async mounted() {
            this.courses = await this.loadUsersCourses({ userId: this.userId, withCourseware: true });
            this.loadSemesterMap();
        }
    
    }
    </script>