aboutsummaryrefslogtreecommitdiff
path: root/resources/vue
diff options
context:
space:
mode:
authorRon Lucke <lucke@elan-ev.de>2023-12-14 10:13:46 +0100
committerRon Lucke <lucke@elan-ev.de>2024-07-05 14:06:48 +0000
commit8f8a28dcb03d859d409b31932aa084517124f408 (patch)
treeee8c7a8df9e7d8504025fa6d4990b3dfbf91ec90 /resources/vue
parent6dc273174983e648d602d4ad49d5667550bded9c (diff)
fix #889biest-889
Diffstat (limited to 'resources/vue')
-rw-r--r--resources/vue/components/courseware/ActivitiesApp.vue10
-rw-r--r--resources/vue/components/courseware/CoursewareCommentsOverviewDialog.vue1
-rw-r--r--resources/vue/components/courseware/IndexApp.vue6
-rw-r--r--resources/vue/components/courseware/ShelfApp.vue10
-rw-r--r--resources/vue/courseware-activities-app.js1
-rw-r--r--resources/vue/courseware-comments-app.js6
-rw-r--r--resources/vue/courseware-index-app.js7
-rw-r--r--resources/vue/courseware-shelf-app.js6
-rw-r--r--resources/vue/courseware-tasks-app.js13
-rw-r--r--resources/vue/store/courseware/courseware-comments.module.js59
-rw-r--r--resources/vue/store/courseware/courseware-shelf.module.js59
-rw-r--r--resources/vue/store/courseware/courseware.module.js75
12 files changed, 82 insertions, 171 deletions
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;
},