aboutsummaryrefslogtreecommitdiff
path: root/resources/vue/components/courseware/CoursewareActivities.vue
blob: a236842c7e06ce96e718dd13f3816614a6a50257 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<template>
    <section class="contentbox">
        <header><h1>{{ $gettext('Aktivitäten') }}</h1></header>
        <section>
            <studip-progress-indicator
                v-show="loading"
                :description="$gettext('Lade Aktivitäten…')"
            />
            <courseware-companion-box
                v-if="filteredActivitiesList.length === 0 && !loading"
                mood="sad"
                :msgCompanion="$gettext('Es wurden keine Aktivitäten gefunden.')"
            />
            <ul class="cw-activities">
                <courseware-activity-item v-for="(item, index) in filteredActivitiesList" :key="index" :item="item" />
            </ul>
        </section>
    </section>
</template>

<script>
import CoursewareActivityItem from './CoursewareActivityItem.vue';
import CoursewareCompanionBox from './layouts/CoursewareCompanionBox.vue';
import StudipProgressIndicator from '../StudipProgressIndicator.vue';

import { mapActions, mapGetters } from 'vuex';

export default {
    name: 'courseware-activities',
    components: {
        CoursewareActivityItem,
        CoursewareCompanionBox,
        StudipProgressIndicator,
    },
    data() {
        return {
            activitiesList: [],
            loading: false
        }
    },
    computed: {
        ...mapGetters({
            userId: 'userId',
            getUserById: 'users/byId',
            context: 'context',
            getStructuralElementById: 'courseware-structural-elements/byId',
            getCoursewareUnitById: 'courseware-units/byId',
            coursewareUnits: 'courseware-units/all',

            typeFilter: 'typeFilter',
            unitFilter: 'unitFilter'
        }),
        filteredActivitiesList() {
            let list = this.activitiesList.slice().sort((a,b) => b.timestamp - a.timestamp);
            if (['edited', 'created', 'answered', 'interacted', 'voided',].includes(this.typeFilter)) {
                list = list.filter(activity => activity.type === this.typeFilter);
            }
            if (this.unitFilter !== 'all') {
                list = list.filter(activity => activity.unitId === this.unitFilter);
            }

            return list;
        },
    },
    mounted() {
        this.getActivities();
    },
    methods: {
        ...mapActions({
            loadCoursewareActivities: 'loadCoursewareActivities',
            loadStructuralElementById: 'courseware-structural-elements/loadById',
        }),

        async loadActivitiesElements(activities) {
            const results = [];
            for (const activity of activities) {
                const structuralElementId = activity.relationships.object.meta["object-id"];
                results.push(this.loadStructuralElementById({id: structuralElementId, options: { include: 'ancestors'} }));
            }
            // activity might contain structural element hidden for current user
            return Promise.all(results).catch(e => { if (e.status !== 403) { console.error(e); } });
        },

        async getActivities() {
            this.loading = true;
            let activities = await this.loadCoursewareActivities({ userId: this.userId, courseId: this.context.id});
            this.activitiesList = [];

            await this.loadActivitiesElements(activities);

            for (const activity of activities) {
                let error = false;
                let username = this.getUserById({ id: activity.relationships.actor.data.id }).attributes['formatted-name'];
                const date = new Date(activity.attributes.mkdate);
                const structuralElementId = activity.relationships.object.meta["object-id"];

                const activityStructuralElement = this.getStructuralElementById({ id: structuralElementId });
                if (activityStructuralElement === undefined || !activityStructuralElement.attributes['can-visit']) {
                    error = true;
                }
                if (!error) {
                    const unitId = activityStructuralElement.relationships?.unit?.data?.id ?? null;
                    const unit = this.getCoursewareUnitById({id: unitId });
                    let options = { year: 'numeric', month: '2-digit', day: '2-digit' };
                    let data = {
                        username: username,
                        timestamp: date.getTime(),
                        readableDate: date.toLocaleString('de-DE', options),
                        type: activity.attributes.verb,
                        title: activity.attributes.title,
                        elementId: structuralElementId,
                        unitId: unitId,
                        unit: unit,
                        contextId: activity.relationships.context.data.id,
                        content: activity.attributes.content
                    }
                    this.activitiesList.push(data);
                }
            }
            this.loading = false;
        }
    }
};
</script>