aboutsummaryrefslogtreecommitdiff
path: root/resources/vue/store/ContentModulesStore.js
blob: fe01ebd84fe534e7431b5da93e0e685279e497d3 (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
export default {
    namespaced: true,

    state: () => ({
        categories: [],
        filterCategory: null,
        highlighted: [],
        modules: [],
        userId: null,
        view: 'tiles',
    }),
    getters: {
        getModuleById: (state) => (moduleId) => {
            return state.modules.find(module => module.id === moduleId);
        },
    },
    mutations: {
        setCategories(state, categories) {
            state.categories = categories;
        },
        setFilterCategory(state, category) {
            state.filterCategory = category;
        },
        setHighlighted(state, highlighted) {
            state.highlighted = highlighted;
        },
        setModule(state, module) {
            let modules = state.modules.filter(m => m.id !== module.id);
            modules.push(module);

            state.modules = modules;
        },
        setModules(state, modules) {
            state.modules = modules;
        },
        setUserId(state, userId) {
            state.userId = userId;
        },
        setView(state, view) {
            state.view = view;
        },
    },
    actions: {
        changeView({ commit, state }, view) {
            commit('setView', view);

            const documentId = `${state.userId}_CONTENTMODULES_TILED_DISPLAY`;

            const data = {
                id: documentId,
                type: 'config-values',
                attributes: { value: view === 'tiles' }
            };

            return STUDIP.jsonapi.withPromises().patch(`config-values/${documentId}`, { data: { data } }) ;
        },
        exchangeModules({ commit, }, modules) {
            const order = modules.filter(module => module.active)
                .sort((a, b) => a.position - b.position)
                .map(module => module.id);
            return $.post(
                STUDIP.URLHelper.getURL('dispatch.php/course/contentmodules/reorder'),
                { order }
            ).then((output) => {
                commit('setModules', modules);

                return output;
            });
        },
        setModuleActive({ commit, getters }, { moduleId, active }) {
            const module = getters.getModuleById(moduleId);
            module.active = active;

            return $.post(
                STUDIP.URLHelper.getURL('dispatch.php/course/contentmodules/trigger'),
                {
                    moduleclass: module.moduleclass,
                    plugin_id: module.id,
                    active: module.active ? 1 : 0
                }
            ).done((output) => {
                module.position = output.position;
                commit('setModule', module);

                return output;
            });
        },
        setModuleVisible({ commit, getters }, { moduleId, visible }) {
            const module = getters.getModuleById(moduleId);

            return $.post(
                STUDIP.URLHelper.getURL('dispatch.php/course/contentmodules/change_visibility'),
                {
                    moduleclass: module.moduleclass,
                    plugin_id: module.id,
                    visible: visible ? 1 : 0,
                }
            ).done((output) => {
                module.visibility = output.visibility;
                commit('setModule', module);
            });
        },
        swapModules({ dispatch, state }, { moduleA, moduleB }) {
            let modules = state.modules.map(module => {
                if (module.id === moduleA.id) {
                    return {
                        ...moduleA,
                        position: moduleB.position,
                    };
                }

                if (module.id === moduleB.id) {
                    return {
                        ...moduleB,
                        position: moduleA.position,
                    };
                }

                return module;
            });
            return dispatch('exchangeModules', modules);
        },
    }
}