From d0c04219588ac0766299a5c0af33e19e5cdd902e Mon Sep 17 00:00:00 2001 From: Marcus Eibrink-Lunzenauer <lunzenauer@elan-ev.de> Date: Tue, 12 Oct 2021 09:06:28 +0200 Subject: [PATCH] =?UTF-8?q?Courseware:=20vollst=C3=A4ndiges=20paginiertes?= =?UTF-8?q?=20Nachladen=20ohne=20hartes=20Limit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 14 +- .../vue/store/courseware/courseware.module.js | 146 +++++++++++------- 2 files changed, 97 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8afa2eff2d6..58a18e7567c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@babel/plugin-transform-runtime": "^7.12.1", "@babel/preset-env": "^7.12.1", "@babel/register": "^7.12.1", - "@elan-ev/reststate-vuex": "~1.0.4", + "@elan-ev/reststate-vuex": "~1.0.5", "@fullcalendar/core": "^4.3.1", "@fullcalendar/daygrid": "^4.3.0", "@fullcalendar/interaction": "^4.3.0", @@ -1142,9 +1142,9 @@ "dev": true }, "node_modules/@elan-ev/reststate-vuex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@elan-ev/reststate-vuex/-/reststate-vuex-1.0.5.tgz", - "integrity": "sha512-WDXJOocwxgMPHvW7veGhjcyhDXBtzhQA/TylSNTd7iDNpCItTyT2Y+gFoJBm8o+JpvYRdanH56GRHwiqidgNJQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@elan-ev/reststate-vuex/-/reststate-vuex-1.0.6.tgz", + "integrity": "sha512-hj1MCzPx9dF2jhQ2rstTBqg4WGNT+cvfIBBpCgsAE9CSrroZlL0Gdb6+3XVnM9cOKQi7NdAnTy6b/FMC5+rlaw==", "dev": true, "dependencies": { "@elan-ev/reststate-client": "^1.0.0" @@ -15219,9 +15219,9 @@ "dev": true }, "@elan-ev/reststate-vuex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@elan-ev/reststate-vuex/-/reststate-vuex-1.0.5.tgz", - "integrity": "sha512-WDXJOocwxgMPHvW7veGhjcyhDXBtzhQA/TylSNTd7iDNpCItTyT2Y+gFoJBm8o+JpvYRdanH56GRHwiqidgNJQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@elan-ev/reststate-vuex/-/reststate-vuex-1.0.6.tgz", + "integrity": "sha512-hj1MCzPx9dF2jhQ2rstTBqg4WGNT+cvfIBBpCgsAE9CSrroZlL0Gdb6+3XVnM9cOKQi7NdAnTy6b/FMC5+rlaw==", "dev": true, "requires": { "@elan-ev/reststate-client": "^1.0.0" diff --git a/resources/vue/store/courseware/courseware.module.js b/resources/vue/store/courseware/courseware.module.js index 3323ed421d5..aa3e7eb7f64 100755 --- a/resources/vue/store/courseware/courseware.module.js +++ b/resources/vue/store/courseware/courseware.module.js @@ -204,11 +204,14 @@ export const actions = { type: 'courseware-blocks', id: block_id, }; - const relationship = 'file-refs'; - return dispatch('courseware-blocks/loadRelated', { parent, relationship }, { root: true }).then(() => { - const refs = rootGetters['courseware-blocks/related']({ + return dispatch('loadRelatedPaginated', { + type: 'file-refs', + parent, + relationship, + }).then(() => { + const refs = rootGetters['file-refs/related']({ parent, relationship, }); @@ -804,36 +807,61 @@ export const actions = { context.commit('cwManagerFilingDataSet', msg); }, - loadUsersCourses({ dispatch, rootGetters, state }, userId) { + async loadRelatedPaginated({ dispatch, rootGetters }, { type, parent, relationship, options }) { + const limit = 100; + let offset = 0; + + do { + const optionsWithPages = { + ...options, + 'page[offset]': offset++, + 'page[limit]': limit, + }; + await dispatch( + `${type}/loadRelated`, + { + parent, + relationship, + options: optionsWithPages, + resetRelated: false + }, + { root: true } + ); + } while (rootGetters[`${type}/all`].length < rootGetters[`${type}/lastMeta`].page.total); + }, + + async loadUsersCourses({ dispatch, rootGetters, state }, userId) { const parent = { type: 'users', id: userId, }; const relationship = 'course-memberships'; - const options = { - include: 'course', - 'page[limit]': 10000, + include: 'course' }; + await dispatch('loadRelatedPaginated', { + type: 'course-memberships', + parent, + relationship, + options + }); - return dispatch('course-memberships/loadRelated', { parent, relationship, options }, { root: true }).then( - () => { - const memberships = rootGetters['course-memberships/related']({ - parent, - relationship, - }); - let courses = []; - memberships.forEach((membership) => { - if ( - membership.attributes.permission === 'dozent' && - state.context.id !== membership.relationships.course.data.id - ) { - courses.push(rootGetters['courses/related']({ parent: membership, relationship: 'course' })); - } - }); - return courses; + const memberships = rootGetters['course-memberships/related']({ + parent, + relationship, + }); + + let courses = []; + memberships.forEach((membership) => { + if ( + membership.attributes.permission === 'dozent' && + state.context.id !== membership.relationships.course.data.id + ) { + courses.push(rootGetters['courses/related']({ parent: membership, relationship: 'course' })); } - ); + }); + + return courses; }, loadRemoteCoursewareStructure({ dispatch, rootGetters }, { rangeId, rangeType }) { @@ -859,47 +887,48 @@ export const actions = { ); }, - loadTeacherStatus({ dispatch, rootGetters, state, commit, getters }, userId) { + async loadTeacherStatus({ dispatch, rootGetters, state, commit, getters }, userId) { const parent = { type: 'users', id: userId, }; const relationship = 'course-memberships'; - const options = { include: 'course', - 'page[limit]': 10000, }; + await dispatch('loadRelatedPaginated', { + type: 'course-memberships', + parent, + relationship, + options + }); - return dispatch('course-memberships/loadRelated', { parent, relationship, options }, { root: true }).then( - () => { - const memberships = rootGetters['course-memberships/related']({ - parent, - relationship, - }); - let isTeacher = false; - memberships.forEach((membership) => { - if (getters.courseware.attributes['editing-permission-level'] === 'dozent') { - if ( - membership.attributes.permission === 'dozent' && - state.context.id === membership.relationships.course.data.id - ) { - isTeacher = true; - } - } - if (getters.courseware.attributes['editing-permission-level'] === 'tutor') { - if ( - (membership.attributes.permission === 'dozent' || - membership.attributes.permission === 'tutor') && - state.context.id === membership.relationships.course.data.id - ) { - isTeacher = true; - } - } - }); - return commit('setUserIsTeacher', isTeacher); + const memberships = rootGetters['course-memberships/related']({ + parent, + relationship, + }); + let isTeacher = false; + memberships.forEach((membership) => { + if (getters.courseware.attributes['editing-permission-level'] === 'dozent') { + if ( + membership.attributes.permission === 'dozent' && + state.context.id === membership.relationships.course.data.id + ) { + isTeacher = true; + } } - ); + if (getters.courseware.attributes['editing-permission-level'] === 'tutor') { + if ( + (membership.attributes.permission === 'dozent' || + membership.attributes.permission === 'tutor') && + state.context.id === membership.relationships.course.data.id + ) { + isTeacher = true; + } + } + }); + + return commit('setUserIsTeacher', isTeacher); }, loadFeedback({ dispatch }, blockId) { @@ -909,7 +938,12 @@ export const actions = { include: 'user', }; - return dispatch('courseware-block-feedback/loadRelated', { parent, relationship, options }, { root: true }); + return dispatch('loadRelatedPaginated', { + type: 'course-block-feedback', + parent, + relationship, + options + }); }, async createFeedback({ dispatch }, { blockId, feedback }) { -- GitLab