diff options
| author | Ron Lucke <lucke@elan-ev.de> | 2023-12-14 10:13:46 +0100 |
|---|---|---|
| committer | Ron Lucke <lucke@elan-ev.de> | 2024-07-05 14:06:48 +0000 |
| commit | 8f8a28dcb03d859d409b31932aa084517124f408 (patch) | |
| tree | ee8c7a8df9e7d8504025fa6d4990b3dfbf91ec90 | |
| parent | 6dc273174983e648d602d4ad49d5667550bded9c (diff) | |
fix #889biest-889
| -rw-r--r-- | app/controllers/course/courseware.php | 6 | ||||
| -rw-r--r-- | app/views/course/courseware/comments_overview.php | 3 | ||||
| -rw-r--r-- | app/views/course/courseware/courseware.php | 1 | ||||
| -rw-r--r-- | app/views/course/courseware/index.php | 1 | ||||
| -rw-r--r-- | app/views/course/courseware/tasks.php | 1 | ||||
| -rw-r--r-- | resources/vue/components/courseware/ActivitiesApp.vue | 10 | ||||
| -rw-r--r-- | resources/vue/components/courseware/CoursewareCommentsOverviewDialog.vue | 1 | ||||
| -rw-r--r-- | resources/vue/components/courseware/IndexApp.vue | 6 | ||||
| -rw-r--r-- | resources/vue/components/courseware/ShelfApp.vue | 10 | ||||
| -rw-r--r-- | resources/vue/courseware-activities-app.js | 1 | ||||
| -rw-r--r-- | resources/vue/courseware-comments-app.js | 6 | ||||
| -rw-r--r-- | resources/vue/courseware-index-app.js | 7 | ||||
| -rw-r--r-- | resources/vue/courseware-shelf-app.js | 6 | ||||
| -rw-r--r-- | resources/vue/courseware-tasks-app.js | 13 | ||||
| -rw-r--r-- | resources/vue/store/courseware/courseware-comments.module.js | 59 | ||||
| -rw-r--r-- | resources/vue/store/courseware/courseware-shelf.module.js | 59 | ||||
| -rw-r--r-- | resources/vue/store/courseware/courseware.module.js | 75 |
17 files changed, 93 insertions, 172 deletions
diff --git a/app/controllers/course/courseware.php b/app/controllers/course/courseware.php index f0b873a..897a103 100644 --- a/app/controllers/course/courseware.php +++ b/app/controllers/course/courseware.php @@ -42,6 +42,12 @@ class Course_CoursewareController extends CoursewareController 'adminPerm' => \Feedback::hasAdminPerm(Context::getId()), 'createPerm' => \Feedback::hasCreatePerm(Context::getId()), ]); + + $this->CoursePerms = json_encode([ + 'dozent' => $GLOBALS['perm']->have_studip_perm('dozent', Context::getId()), + 'tutor' => $GLOBALS['perm']->have_studip_perm('tutor', Context::getId()), + 'autor' => $GLOBALS['perm']->have_studip_perm('autor', Context::getId()), + ]); } public function index_action(): void diff --git a/app/views/course/courseware/comments_overview.php b/app/views/course/courseware/comments_overview.php index 358a5e5..ba316f9 100644 --- a/app/views/course/courseware/comments_overview.php +++ b/app/views/course/courseware/comments_overview.php @@ -2,4 +2,5 @@ id="courseware-comments-app" entry-type="courses" entry-id="<?= htmlReady(Context::getId()) ?>" -></div>
\ No newline at end of file + course-perms="<?= htmlReady($CoursePerms) ?>" +></div> diff --git a/app/views/course/courseware/courseware.php b/app/views/course/courseware/courseware.php index 9de924d..6ececc0 100644 --- a/app/views/course/courseware/courseware.php +++ b/app/views/course/courseware/courseware.php @@ -7,6 +7,7 @@ unit-id="<?= htmlReady($unit_id) ?>" licenses='<?= htmlReady($licenses) ?>' feedback-settings='<?= htmlReady($feedback_settings) ?>' + course-perms="<?= htmlReady($CoursePerms) ?>" > </div> <? endif; ?> diff --git a/app/views/course/courseware/index.php b/app/views/course/courseware/index.php index eea4063..eea4002 100644 --- a/app/views/course/courseware/index.php +++ b/app/views/course/courseware/index.php @@ -4,4 +4,5 @@ entry-id="<?= Context::getId() ?>" licenses='<?= $licenses ?>' feedback-settings='<?= htmlReady($feedback_settings) ?>' + course-perms="<?= htmlReady($CoursePerms) ?>" ></div> diff --git a/app/views/course/courseware/tasks.php b/app/views/course/courseware/tasks.php index 7ebd70a..d16bffd 100644 --- a/app/views/course/courseware/tasks.php +++ b/app/views/course/courseware/tasks.php @@ -2,5 +2,6 @@ id="courseware-tasks-app" entry-type="courses" entry-id="<?= htmlReady(Context::getId()) ?>" + course-perms="<?= htmlReady($CoursePerms) ?>" > </div> diff --git a/resources/vue/components/courseware/ActivitiesApp.vue b/resources/vue/components/courseware/ActivitiesApp.vue index cfbce77..2d2f452 100644 --- a/resources/vue/components/courseware/ActivitiesApp.vue +++ b/resources/vue/components/courseware/ActivitiesApp.vue @@ -14,18 +14,12 @@ import CoursewareActivities from './CoursewareActivities.vue'; import CoursewareActivitiesWidgetFilterType from './widgets/CoursewareActivitiesWidgetFilterType.vue'; import CoursewareActivitiesWidgetFilterUnit from './widgets/CoursewareActivitiesWidgetFilterUnit.vue'; -import { mapGetters } from 'vuex'; export default { components: { CoursewareActivities, CoursewareActivitiesWidgetFilterType, CoursewareActivitiesWidgetFilterUnit - }, - computed: { - ...mapGetters({ - userIsTeacher: 'userIsTeacher', - }), - }, + } } -</script>
\ No newline at end of file +</script> diff --git a/resources/vue/components/courseware/CoursewareCommentsOverviewDialog.vue b/resources/vue/components/courseware/CoursewareCommentsOverviewDialog.vue index d157f5b..ba69db4 100644 --- a/resources/vue/components/courseware/CoursewareCommentsOverviewDialog.vue +++ b/resources/vue/components/courseware/CoursewareCommentsOverviewDialog.vue @@ -25,6 +25,7 @@ <courseware-structural-element-feedback v-if="isStructuralElement && isFeedback" :structuralElement="item" + :canEdit="item.attributes['can-edit']" /> </template> </studip-dialog> diff --git a/resources/vue/components/courseware/IndexApp.vue b/resources/vue/components/courseware/IndexApp.vue index 53238b4..59348d3 100644 --- a/resources/vue/components/courseware/IndexApp.vue +++ b/resources/vue/components/courseware/IndexApp.vue @@ -96,6 +96,7 @@ export default { invalidateStructureCache: 'courseware-structure/invalidateCache', loadCoursewareStructure: 'courseware-structure/load', loadStructuralElement: 'loadStructuralElement', + loadTeacherStatus: 'loadTeacherStatus', }), async selectStructuralElement(id) { if (!id) { @@ -128,6 +129,11 @@ export default { } this.structureLoadingState = 'done'; + + if (this.context.type === 'courses') { + this.loadTeacherStatus(); + } + const selectedId = this.$route.params?.id; await this.selectStructuralElement(selectedId); }, diff --git a/resources/vue/components/courseware/ShelfApp.vue b/resources/vue/components/courseware/ShelfApp.vue index 173be71..7ec3685 100644 --- a/resources/vue/components/courseware/ShelfApp.vue +++ b/resources/vue/components/courseware/ShelfApp.vue @@ -64,5 +64,15 @@ export default { } }, + methods: { + ...mapActions({ + loadTeacherStatus: 'loadTeacherStatus' + }), + }, + mounted() { + if (this.inCourseContext) { + this.loadTeacherStatus(); + } + } } </script> diff --git a/resources/vue/courseware-activities-app.js b/resources/vue/courseware-activities-app.js index ee2eb84..3122238 100644 --- a/resources/vue/courseware-activities-app.js +++ b/resources/vue/courseware-activities-app.js @@ -77,7 +77,6 @@ const mountApp = async (STUDIP, createApp, element) => { id: entry_id, type: entry_type, }); - await store.dispatch('loadTeacherStatus', STUDIP.USER_ID); await store.dispatch('loadCourseUnits', entry_id); const app = createApp({ diff --git a/resources/vue/courseware-comments-app.js b/resources/vue/courseware-comments-app.js index 0e9a4ba..a3cfa0d 100644 --- a/resources/vue/courseware-comments-app.js +++ b/resources/vue/courseware-comments-app.js @@ -16,6 +16,7 @@ const mountApp = async (STUDIP, createApp, element) => { let elem = document.getElementById(element.substring(1)); let entry_id = null; let entry_type = null; + let course_perms = null; if (elem !== undefined) { if (elem.attributes !== undefined) { @@ -25,6 +26,9 @@ const mountApp = async (STUDIP, createApp, element) => { if (elem.attributes['entry-id'] !== undefined) { entry_id = elem.attributes['entry-id'].value; } + if (elem.attributes['course-perms'] !== undefined) { + course_perms = JSON.parse(elem.attributes['course-perms'].value); + } } } @@ -57,9 +61,9 @@ const mountApp = async (STUDIP, createApp, element) => { id: entry_id, type: entry_type, }); + store.dispatch('setUserIsTeacher', course_perms.tutor); store.dispatch('setUserId', STUDIP.USER_ID); await store.dispatch('users/loadById', { id: STUDIP.USER_ID }); - await store.dispatch('loadTeacherStatus', STUDIP.USER_ID); const data = await axios(STUDIP.URLHelper.getURL('dispatch.php/course/courseware/comments_overview_data/')); store.commit( diff --git a/resources/vue/courseware-index-app.js b/resources/vue/courseware-index-app.js index 59c0ebc..f76c3bd 100644 --- a/resources/vue/courseware-index-app.js +++ b/resources/vue/courseware-index-app.js @@ -27,6 +27,7 @@ const mountApp = async (STUDIP, createApp, element) => { let entry_type = null; let unit_id = null; let licenses = null; + let course_perms = null; let elem; let feedbackSettings = null; @@ -48,6 +49,10 @@ const mountApp = async (STUDIP, createApp, element) => { unit_id = elem.attributes['unit-id'].value; } + if (elem.attributes['course-perms'] !== undefined) { + course_perms = JSON.parse(elem.attributes['course-perms'].value); + } + // we need a route for License SORM if (elem.attributes['licenses'] !== undefined) { licenses = JSON.parse(elem.attributes['licenses'].value); @@ -154,7 +159,7 @@ const mountApp = async (STUDIP, createApp, element) => { }); if (entry_type === 'courses') { - await store.dispatch('loadTeacherStatus', STUDIP.USER_ID); + store.dispatch('setCoursePerms', course_perms); store.dispatch('loadProgresses'); await store.dispatch('setFeedbackSettings', feedbackSettings); } diff --git a/resources/vue/courseware-shelf-app.js b/resources/vue/courseware-shelf-app.js index a0e7f98..d74bc7a 100644 --- a/resources/vue/courseware-shelf-app.js +++ b/resources/vue/courseware-shelf-app.js @@ -31,6 +31,7 @@ const mountApp = async (STUDIP, createApp, element) => { let entry_type = null; let licenses = null; let feedbackSettings = null; + let course_perms = null; if ((elem = document.getElementById(element.substring(1))) !== undefined) { if (elem.attributes !== undefined) { @@ -48,6 +49,9 @@ const mountApp = async (STUDIP, createApp, element) => { if (elem.attributes['feedback-settings'] !== undefined) { feedbackSettings = JSON.parse(elem.attributes['feedback-settings'].value); } + if (elem.attributes['course-perms'] !== undefined) { + course_perms = JSON.parse(elem.attributes['course-perms'].value); + } } } @@ -96,7 +100,7 @@ const mountApp = async (STUDIP, createApp, element) => { type: entry_type, }); if (entry_type === 'courses') { - await store.dispatch('loadTeacherStatus', STUDIP.USER_ID); + store.dispatch('setCoursePerms', course_perms); await store.dispatch('loadCourseUnits', entry_id); await store.dispatch('setFeedbackSettings', feedbackSettings); } else { diff --git a/resources/vue/courseware-tasks-app.js b/resources/vue/courseware-tasks-app.js index 9c01b71..a5091a2 100644 --- a/resources/vue/courseware-tasks-app.js +++ b/resources/vue/courseware-tasks-app.js @@ -92,6 +92,7 @@ const mountApp = async (STUDIP, createApp, element) => { }); let entry_id = null; let entry_type = null; + let course_perms = null; let elem; if ((elem = document.getElementById(element.substring(1))) !== undefined) { @@ -103,6 +104,10 @@ const mountApp = async (STUDIP, createApp, element) => { if (elem.attributes['entry-id'] !== undefined) { entry_id = elem.attributes['entry-id'].value; } + + if (elem.attributes['course-perms'] !== undefined) { + course_perms = JSON.parse(elem.attributes['course-perms'].value); + } } } @@ -115,6 +120,14 @@ const mountApp = async (STUDIP, createApp, element) => { }); await store.dispatch('loadTeacherStatus', STUDIP.USER_ID); await store.dispatch('tasks/loadTasksOfCourse', { cid: entry_id }); + store.dispatch('setCoursePerms', course_perms); + store.dispatch('setUserIsTeacher', course_perms.tutor); + store.dispatch('courseware-tasks/loadAll', { + options: { + 'filter[cid]': entry_id, + include: 'solver, structural-element, task-feedback, task-group, task-group.lecturer', + }, + }); const app = createApp({ render: (h) => h(RouterView), diff --git a/resources/vue/store/courseware/courseware-comments.module.js b/resources/vue/store/courseware/courseware-comments.module.js index c65ee11..1afed9a 100644 --- a/resources/vue/store/courseware/courseware-comments.module.js +++ b/resources/vue/store/courseware/courseware-comments.module.js @@ -4,7 +4,6 @@ const getDefaultState = () => { httpClient: null, userId: null, userIsTeacher: false, - teacherStatusLoaded: false, typeFilter: 'all', // all, blocks, elements createdFilter: 'all', // all, oneDay, oneWeek unitFilter: 'all', // all or unit id @@ -26,9 +25,6 @@ const getters = { userIsTeacher(state) { return state.userIsTeacher; }, - teacherStatusLoaded(state) { - return state.teacherStatusLoaded; - }, typeFilter(state) { return state.typeFilter; }, @@ -62,55 +58,9 @@ export const actions = { setUnitFilter({ commit }, id) { commit('setUnitFilter', id); }, - // other actions - async loadTeacherStatus({ dispatch, rootGetters, state, commit, getters }, 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); - - return false; - } - const membership = rootGetters['course-memberships/byId']({ id: membershipId }); - if (membership) { - const membershipPermission = membership.attributes.permission; - const isTeacher = membershipPermission === 'dozent' || membershipPermission === 'tutor'; - commit('setUserIsTeacher', isTeacher); - - return true; - } else { - console.error(`Could not find course membership for ${membershipId}.`); - commit('setUserIsTeacher', false); - - return false; - } - }, + setUserIsTeacher({ commit }, isTeacher) { + commit('setUserIsTeacher', isTeacher); + } }; export const mutations = { @@ -133,7 +83,6 @@ export const mutations = { state.unitFilter = data; }, setUserIsTeacher(state, isTeacher) { - state.teacherStatusLoaded = true; state.userIsTeacher = isTeacher; }, }; @@ -143,4 +92,4 @@ export default { actions, mutations, getters, -};
\ No newline at end of file +}; diff --git a/resources/vue/store/courseware/courseware-shelf.module.js b/resources/vue/store/courseware/courseware-shelf.module.js index d907ee4..783116a 100644 --- a/resources/vue/store/courseware/courseware-shelf.module.js +++ b/resources/vue/store/courseware/courseware-shelf.module.js @@ -1,6 +1,7 @@ const getDefaultState = () => { return { context: null, + coursePerms: null, httpClient: null, showCompanionOverlay: false, msgCompanionOverlay: '', @@ -87,6 +88,9 @@ const getters = { userIsTeacher(state) { return state.userIsTeacher; }, + coursePerms(state) { + return state.coursePerms; + }, urlHelper(state) { return state.urlHelper; }, @@ -131,6 +135,9 @@ export const actions = { setContext({ commit }, context) { commit('setContext', context); }, + setCoursePerms({ commit }, perms) { + commit('setCoursePerms', perms); + }, setHttpClient({ commit }, httpClient) { commit('setHttpClient', httpClient); }, @@ -546,52 +553,10 @@ export const actions = { return dispatch('courseware-instances/update', instance, { root: true }); }, - async loadTeacherStatus({ dispatch, rootGetters, state, commit, getters }, 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); + loadTeacherStatus({ commit, getters }) { + const isTeacher = getters.coursePerms['tutor']; - return false; - } - const membership = rootGetters['course-memberships/byId']({ id: membershipId }); - if (membership) { - const membershipPermission = membership.attributes.permission; - commit('setUserIsTeacher', membershipPermission === 'dozent' || membershipPermission === 'tutor'); - - return true; - } else { - console.error(`Could not find course membership for ${membershipId}.`); - commit('setUserIsTeacher', false); - - return false; - } + commit('setUserIsTeacher', isTeacher); }, uploadImageForStructuralElement({ dispatch, state }, { structuralElement, file }) { @@ -746,6 +711,9 @@ export const mutations = { setContext(state, data){ state.context = data; }, + setCoursePerms(state, perms) { + state.coursePerms = perms; + }, setHttpClient(state, data){ state.httpClient = data; }, @@ -789,7 +757,6 @@ export const mutations = { state.exportProgress = exportProgress; }, setUserIsTeacher(state, isTeacher) { - state.teacherStatusLoaded = true; state.userIsTeacher = isTeacher; }, setUrlHelper(state, urlHelper) { diff --git a/resources/vue/store/courseware/courseware.module.js b/resources/vue/store/courseware/courseware.module.js index 784b750..237f12f 100644 --- a/resources/vue/store/courseware/courseware.module.js +++ b/resources/vue/store/courseware/courseware.module.js @@ -22,8 +22,8 @@ const getDefaultState = () => { userId: null, viewMode: 'read', dashboardViewMode: 'default', + coursePerms: null, userIsTeacher: false, - teacherStatusLoaded: false, showStructuralElementEditDialog: false, showStructuralElementAddDialog: false, @@ -184,8 +184,8 @@ const getters = { userIsTeacher(state) { return state.userIsTeacher; }, - teacherStatusLoaded(state) { - return state.teacherStatusLoaded; + coursePerms(state) { + return state.coursePerms; }, pluginManager(state) { return state.pluginManager; @@ -1290,63 +1290,19 @@ export const actions = { ); }, - async loadTeacherStatus({ dispatch, rootGetters, state, commit, getters }, 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); - - return false; - } - const membership = rootGetters['course-memberships/byId']({ id: membershipId }); - if (membership) { - let editingLevel = 'tutor'; - if (getters.courseware.attributes) { - editingLevel = getters.courseware.attributes['editing-permission-level']; - } - const membershipPermission = membership.attributes.permission; + setCoursePerms({ commit }, perms) { + commit('setCoursePerms', perms); + }, - let isTeacher = false; - if (editingLevel === 'dozent') { - isTeacher = membershipPermission === 'dozent'; - } else if (editingLevel === 'tutor') { - isTeacher = membershipPermission === 'dozent' || membershipPermission === 'tutor'; - } - commit('setUserIsTeacher', isTeacher); + setUserIsTeacher({ commit }, isTeacher) { + commit('setUserIsTeacher', isTeacher); + }, - return true; - } else { - console.error(`Could not find course membership for ${membershipId}.`); - commit('setUserIsTeacher', false); + loadTeacherStatus({ commit, getters }) { + const editingLevel = getters.courseware.attributes['editing-permission-level']; + const isTeacher = getters.coursePerms[editingLevel]; - return false; - } + commit('setUserIsTeacher', isTeacher); }, loadFeedback({ dispatch }, blockId) { @@ -1623,10 +1579,13 @@ export const mutations = { }, setUserIsTeacher(state, isTeacher) { - state.teacherStatusLoaded = true; state.userIsTeacher = isTeacher; }, + setCoursePerms(state, perms) { + state.coursePerms = perms; + }, + setPluginManager(state, pluginManager) { state.pluginManager = pluginManager; }, |
