diff --git a/resources/vue/courseware-dashboard-app.js b/resources/vue/courseware-dashboard-app.js index 608341b889703c3f7ed2998724ae3ccd1300ae41..5ddaf344ff17d2edce1784c156e589122c513829 100644 --- a/resources/vue/courseware-dashboard-app.js +++ b/resources/vue/courseware-dashboard-app.js @@ -5,7 +5,7 @@ import CoursewareModule from './store/courseware/courseware.module'; import CoursewareStructureModule from './store/courseware/structure.module'; import axios from 'axios'; -const mountApp = (STUDIP, createApp, element) => { +const mountApp = async (STUDIP, createApp, element) => { const getHttpClient = () => axios.create({ baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true), @@ -42,6 +42,7 @@ const mountApp = (STUDIP, createApp, element) => { 'folders', 'users', 'institutes', + 'institute-memberships', 'semesters', 'sem-classes', 'sem-types', @@ -68,7 +69,7 @@ const mountApp = (STUDIP, createApp, element) => { } store.dispatch('setUserId', STUDIP.USER_ID); - store.dispatch('users/loadById', { id: STUDIP.USER_ID }); + await store.dispatch('users/loadById', { id: STUDIP.USER_ID }); store.dispatch('setHttpClient', httpClient); store.dispatch('coursewareContext', { id: entry_id, diff --git a/resources/vue/courseware-index-app.js b/resources/vue/courseware-index-app.js index 3d95d7dcd81c140e0b62c8bb5d414bf42f96c00f..e39d053b966a6902eaf83a3d326603a80a5302c6 100644 --- a/resources/vue/courseware-index-app.js +++ b/resources/vue/courseware-index-app.js @@ -9,7 +9,7 @@ import Vuex from 'vuex'; import axios from 'axios'; import { mapResourceModules } from '@elan-ev/reststate-vuex'; -const mountApp = (STUDIP, createApp, element) => { +const mountApp = async (STUDIP, createApp, element) => { const getHttpClient = () => axios.create({ baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true), @@ -105,6 +105,7 @@ const mountApp = (STUDIP, createApp, element) => { 'status-groups', 'users', 'institutes', + 'institute-memberships', 'semesters', 'sem-classes', 'sem-types', @@ -117,7 +118,7 @@ const mountApp = (STUDIP, createApp, element) => { store.dispatch('setUrlHelper', STUDIP.URLHelper); store.dispatch('setUserId', STUDIP.USER_ID); - store.dispatch('users/loadById', {id: STUDIP.USER_ID}); + await store.dispatch('users/loadById', {id: STUDIP.USER_ID}); store.dispatch('setHttpClient', httpClient); store.dispatch('coursewareContext', { diff --git a/resources/vue/courseware-manager-app.js b/resources/vue/courseware-manager-app.js index fccea2beb5ea26daad072e0f886bf67e2e78bc8f..8d6454a3a379aa3d5ab887cc2611cc8e5fea2727 100644 --- a/resources/vue/courseware-manager-app.js +++ b/resources/vue/courseware-manager-app.js @@ -6,7 +6,7 @@ import axios from 'axios'; import { mapResourceModules } from '@elan-ev/reststate-vuex'; -const mountApp = (STUDIP, createApp, element) => { +const mountApp = async (STUDIP, createApp, element) => { const getHttpClient = () => axios.create({ baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true), @@ -41,6 +41,7 @@ const mountApp = (STUDIP, createApp, element) => { 'status-groups', 'users', 'institutes', + 'institute-memberships', 'semesters', 'sem-classes', 'sem-types', @@ -69,6 +70,7 @@ const mountApp = (STUDIP, createApp, element) => { store.dispatch('setUrlHelper', STUDIP.URLHelper); store.dispatch('setUserId', STUDIP.USER_ID); + await store.dispatch('users/loadById', {id: STUDIP.USER_ID}); store.dispatch('setHttpClient', httpClient); store.dispatch('coursewareContext', { id: entry_id, diff --git a/resources/vue/store/courseware/courseware.module.js b/resources/vue/store/courseware/courseware.module.js index a211103ffcff4182e934920f26fe034a40fee11b..f8387604d602998502061ccdc51b74f68b17e43c 100644 --- a/resources/vue/store/courseware/courseware.module.js +++ b/resources/vue/store/courseware/courseware.module.js @@ -1075,20 +1075,39 @@ export const actions = { }, async loadTeacherStatus({ dispatch, rootGetters, state, commit, getters }, userId) { - let user = rootGetters['users/byId']({ id: userId }); - if (!user) { - await dispatch('users/loadById', { id: userId }); - user = rootGetters['users/byId']({ id: userId }); - } + const user = rootGetters['users/byId']({ id: userId }); if (user.attributes.permission === 'root') { commit('setUserIsTeacher', true); return; } + if (user.attributes.permission === 'admin') { + await dispatch('courses/loadById', { id: state.context.id }); + const course = rootGetters['courses/byId']({id: state.context.id }); + const instituteId = course.relationships.institute.data.id; + + const parent = { type: 'users', id: `${userId}` }; + const relationship = 'institute-memberships'; + const options = {}; + await dispatch('institute-memberships/loadRelated', { parent, relationship, options }, { root: true }); + const instituteMemberships = rootGetters['institute-memberships/all']; + const instituteMembership = instituteMemberships.filter(membership => membership.relationships.institute.data.id === instituteId); + + if (instituteMembership.length > 0 && instituteMembership[0].attributes.permission === 'admin') { + commit('setUserIsTeacher', true); + return; + } + } const membershipId = `${state.context.id}_${userId}`; + try { + await dispatch('course-memberships/loadById', { id: membershipId }); + } catch (error) { + console.error(`Could not find course membership for ${membershipId}.`); + commit('setUserIsTeacher', false); - await dispatch('course-memberships/loadById', { id: membershipId }); + return false; + } const membership = rootGetters['course-memberships/byId']({ id: membershipId }); if (membership) { let editingLevel = 'tutor';