aboutsummaryrefslogtreecommitdiff
path: root/resources/vue/mixins/ContentModulesMixin.js
blob: 32a0faf3f679d41e3c465e7f21a75c7a28510f11 (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import draggable from 'vuedraggable';
import { mapActions, mapState } from 'vuex';

export default {
    components: {
        draggable,
    },
    props: {
        rangeType: String,
    },
    data: () => ({
        order: [],
    }),
    computed: {
        ...mapState('contentmodules', [
            'categories',
            'filterCategory',
            'highlighted',
            'modules',
            'view',
        ]),
        activeModules: {
            get() {
                return this.sortedModules.filter(module => module.active);
            },
            set(modules) {
                this.sortedModules = [...modules, ...this.inactiveModules];
            }
        },
        inactiveModules() {
            return this.sortedModules.filter(module => !module.active);
        },
        sortedModules: {
            get() {
                return Object.values(this.modules)
                    .filter(module => {
                        return this.filterCategory === null
                            || this.filterCategory === module.category;
                    })
                    .sort(function (a, b) {
                        if (a.active && !b.active) {
                            return -1;
                        } else if (!a.active && b.active) {
                            return 1;
                        } else if (a.active) {
                            return a.position - b.position;
                        } else {
                            return a.displayname.localeCompare(b.displayname);
                        }
                    });
            },
            set(modules) {
                let position = 0;
                for (const key in modules) {
                    modules[key].position = position++;
                }
                this.exchangeModules(modules).then((output) => {
                    if (output.tabs) {
                        $('.tabs_wrapper').replaceWith(output.tabs);
                    }
                });
            },
        },
    },
    methods: {
        ...mapActions('contentmodules', [
            'changeView',
            'exchangeModules',
            'setModuleActive',
            'setModuleVisible',
            'swapModules',
        ]),
        keyboardHandler(event, module) {
            const activeIndex = this.activeModules.findIndex(m => m.id === module.id);

            let otherModule = null;
            if (event.key === 'ArrowUp' && activeIndex > 0) {
                otherModule = this.activeModules[activeIndex - 1];
            } else if (event.key === 'ArrowDown' && activeIndex !== this.activeModules.length - 1) {
                otherModule = this.activeModules[activeIndex + 1];
            }

            if (otherModule === null) {
                return;
            }

            event.preventDefault();

            this.swapModules({
                moduleA: module,
                moduleB: otherModule,
            }).then((output) => {
                if (output.tabs) {
                    $('.tabs_wrapper').replaceWith(output.tabs);
                }
            }).then(() => {
                this.$nextTick(() => {
                    this.$refs[`draghandle-${module.id}`][0].focus();
                });
            });
        },
        toggleModuleActivation(module) {
            module.pulse = true;
            this.setModuleActive({
                moduleId: module.id,
                active: !module.active,
            }).then((output) => {
                if (output.tabs) {
                    $('.tabs_wrapper').replaceWith(output.tabs);
                }
                module.pulse = false;
            });
        },
        toggleModuleVisibility(module) {
            this.setModuleVisible({
                moduleId: module.id,
                visible: module.visibility === 'tutor',
            }).then((output) => {
                if (output.tabs) {
                    $('.tabs_wrapper').replaceWith(output.tabs);
                }
            });
        },
        getRenameURL(module) {
            return STUDIP.URLHelper.getURL(`dispatch.php/course/contentmodules/rename/${module.id}`);
        },
        getDescriptionURL(module) {
            return STUDIP.URLHelper.getURL(`dispatch.php/course/contentmodules/info/${module.id}`);
        },
        getModuleCSSClasses(module, active= null) {
            let classes = [];
            classes.push(module.pulse ? 'pulse' : '');

            if (!(active ?? module.active)) {
                classes.push('inactive');
            } else {
                classes.push(module.visibility === 'tutor' ? 'visibility-invisible' : 'visibility-visible');
            }


            return classes.join(' ');
        },
        showVisibilityToggle(module) {
            return this.rangeType !== 'Institute'
                && module.active
                && !module.mandatory;
        }
    },
};