From 8254db7e31bfcb399d0231e9638ee8b286801d56 Mon Sep 17 00:00:00 2001 From: Malte Berg Date: Thu, 14 Mar 2024 16:07:00 +0100 Subject: [PATCH 01/15] add ifNot helper --- helpers/handlebars/helpers/index.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/helpers/handlebars/helpers/index.js b/helpers/handlebars/helpers/index.js index 9da6398386..56b7ee8876 100644 --- a/helpers/handlebars/helpers/index.js +++ b/helpers/handlebars/helpers/index.js @@ -132,6 +132,12 @@ const helpers = () => ({ } return opts.inverse(this); }, + ifNot: (value, opts) => { + if (!value) { + return opts.fn(this); + } + return opts.inverse(this); + }, ifvalue: (conditional, options) => { if (options.hash.value === conditional) { return options.fn(this); From 06fb5ee8df1d8c052dbca0ee73482157b3d66c72 Mon Sep 17 00:00:00 2001 From: Malte Berg Date: Thu, 14 Mar 2024 16:14:01 +0100 Subject: [PATCH 02/15] add disabled and hidden fields --- views/courses/create-course.hbs | 130 +++++++++++++++++++------------- 1 file changed, 77 insertions(+), 53 deletions(-) diff --git a/views/courses/create-course.hbs b/views/courses/create-course.hbs index 9d55d424ac..bf6502a69e 100644 --- a/views/courses/create-course.hbs +++ b/views/courses/create-course.hbs @@ -54,6 +54,10 @@ {{/if}} + {{#if syncedWithGroup}} + + {{/if}} +
@@ -105,7 +109,7 @@
+ {{#if syncedWithGroup}} + + {{/if}} {{$t "courses.global.input.noCourseTeacher"}}
- + {{#each substitutions}} {{/each}} + {{#if syncedWithGroup}} + + {{/if}}
@@ -141,16 +152,21 @@
- {{> "lib/forms/form-date-input" label=($t "courses.add.label.timeSpan") id="startDate" class="startDate" - value=course.startDate dataTestId="date_start"}} - {{$t - "courses.global.input.invalidTimeError"}} + {{> "lib/forms/form-date-input" label=($t "courses.add.label.timeSpan") id="startDate" class="startDate" + value=course.startDate dataTestId="date_start" disabled=@root.syncedWithGroup}} + {{#if syncedWithGroup}} + + {{/if}} + + {{$t "courses.global.input.invalidTimeError"}} +
-
- {{> "lib/forms/form-date-input" label=($t "global.label.to") id="untilDate" - class="untilDate" - value=course.untilDate}} + {{> "lib/forms/form-date-input" label=($t "global.label.to") id="untilDate" class="untilDate" + value=course.untilDate disabled=@root.syncedWithGroup}} + {{#if syncedWithGroup}} + + {{/if}}
@@ -180,52 +196,60 @@

{{$t "global.headline.youAlmostMadeIt"}}

{{$t "courses.add.text.addStudentsOrClasses"}}
{{$t "courses.add.text.doItNowOrLaterInSettings"}}

-
- - + + {{#each ../classesAndGroups}} + - {{/each}} - -
-
- - + {{#if this.year}} + ({{this.year.name}}) + {{/if}} + {{/if}} + + {{/each}} + + {{#if ../syncedWithGroup}} + + {{/if}} +
+ +
+ + + {{#if ../syncedWithGroup}} + + {{/if}}
{{else}}

{{$t "courses.add.headline.addStudents"}}

From 1c5626f12dce9d9c2f660e5910f13bd2d884bbd5 Mon Sep 17 00:00:00 2001 From: Malte Berg Date: Thu, 14 Mar 2024 16:14:37 +0100 Subject: [PATCH 03/15] hide button --- views/courses/create-course.hbs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/views/courses/create-course.hbs b/views/courses/create-course.hbs index bf6502a69e..62b6aa493a 100644 --- a/views/courses/create-course.hbs +++ b/views/courses/create-course.hbs @@ -193,8 +193,8 @@
{{#userHasPermission "STUDENT_LIST"}} -

{{$t "global.headline.youAlmostMadeIt"}}

-

{{$t "courses.add.text.addStudentsOrClasses"}}
{{$t "courses.add.text.doItNowOrLaterInSettings"}}

+

{{$t "global.headline.youAlmostMadeIt"}}

+

{{$t "courses.add.text.addStudentsOrClasses"}}
{{$t "courses.add.text.doItNowOrLaterInSettings"}}

@@ -278,7 +278,9 @@
From eb07b0103e4d936341fdb96431ce64f52a89cccc Mon Sep 17 00:00:00 2001 From: Malte Berg Date: Thu, 14 Mar 2024 16:16:50 +0100 Subject: [PATCH 04/15] add group sync --- controllers/courses.js | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/controllers/courses.js b/controllers/courses.js index f66781c828..79f5e2be26 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -194,13 +194,20 @@ const editCourseHandler = (req, res, next) => { .get(`/courses/${req.params.courseId}/userPermissions/${res.locals.currentUser._id}`); } + const syncedWithGroup = req.params.groupId; + let groupPromise; + if (syncedWithGroup) { + groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedWithGroup}`); + } + Promise.all([ coursePromise, classesAndGroupsPromise, teachersPromise, studentsPromise, scopePermissions, - ]).then(([course, _classesAndGroups, _teachers, _students, _scopePermissions]) => { + groupPromise, + ]).then(([course, _classesAndGroups, _teachers, _students, _scopePermissions, group]) => { // these 3 might not change anything because hooks allow just ownSchool results by now, but to be sure: let classesAndGroups = []; if (FEATURE_GROUPS_IN_COURSE_ENABLED) { @@ -278,7 +285,13 @@ const editCourseHandler = (req, res, next) => { const classAndGroupIdsOfCourse = [...(course.classIds || []), ...(course.groupIds || [])]; - const syncedElementIds = course.syncedWithGroup ? getSyncedElementIds( + if (syncedWithGroup) { + course.name = group.name; + course.teacherIds = getUserIdsByRole(group.users, 'teacher'); + course.userIds = getUserIdsByRole(group.users, 'student'); + } + + const syncedElements = (course.syncedWithGroup || syncedWithGroup) ? getSyncedElements( course, classesAndGroups, classAndGroupIdsOfCourse, @@ -286,6 +299,7 @@ const editCourseHandler = (req, res, next) => { substitutions, students, res, + syncedWithGroup, ) : {}; if (req.params.courseId) { @@ -546,6 +560,19 @@ router.post('/', (req, res, next) => { req.body.untilDate = untilDate.toDate(); } + if (typeof req.body.teacherIds === 'string') { + req.body.teacherIds = stringToArr(req.body.teacherIds); + } + if (typeof req.body.substitutionIds === 'string') { + req.body.substitutionIds = stringToArr(req.body.substitutionIds); + } + if (typeof req.body.classIds === 'string') { + req.body.classIds = stringToArr(req.body.classIds); + } + if (typeof req.body.userIds === 'string') { + req.body.userIds = stringToArr(req.body.userIds); + } + req.body.features = []; OPTIONAL_COURSE_FEATURES.forEach((feature) => { if (req.body[feature] === 'true') { @@ -569,6 +596,7 @@ router.post('/', (req, res, next) => { }); router.get('/add/', editCourseHandler); +router.get('/:groupId/sync', editCourseHandler); /* * Single Course @@ -793,16 +821,16 @@ router.patch('/:courseId', async (req, res, next) => { } if (typeof req.body.teacherIds === 'string') { - req.body.teacherIds = req.body.teacherIds.split(','); + req.body.teacherIds = stringToArr(req.body.teacherIds); } if (typeof req.body.substitutionIds === 'string') { - req.body.substitutionIds = req.body.substitutionIds.split(','); + req.body.substitutionIds = stringToArr(req.body.substitutionIds); } if (typeof req.body.classIds === 'string') { - req.body.classIds = req.body.classIds.split(','); + req.body.classIds = stringToArr(req.body.classIds); } if (typeof req.body.userIds === 'string') { - req.body.userIds = req.body.userIds.split(','); + req.body.userIds = stringToArr(req.body.userIds); } const startDate = timesHelper.dateStringToMoment(req.body.startDate); From 17bc9a57238ed08c1db01d662197598f3529fdeb Mon Sep 17 00:00:00 2001 From: Malte Berg Date: Thu, 14 Mar 2024 16:17:51 +0100 Subject: [PATCH 05/15] add group sync --- controllers/courses.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/controllers/courses.js b/controllers/courses.js index 79f5e2be26..837b0144a2 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -39,12 +39,19 @@ const filterStudents = (ctx, s) => ( ? s.filter(({ selected }) => selected) : s ); +const getUserIdsByRole = (users, role) => users.filter((u) => u.role === role).map((u) => u.id); + const selectedElementIdsToString = (arr = []) => { const txt = arr.filter((obj) => obj.selected).map((obj) => (obj.id !== undefined ? obj.id : obj._id)).join(','); return txt; }; -const getSyncedElementIds = ( +const stringToArr = (str = '') => { + const arr = str.trim() === '' ? [] : str.split(','); + return arr; +}; + +const getSyncedElements = ( course, classesAndGroups, classAndGroupIdsOfCourse, @@ -52,6 +59,7 @@ const getSyncedElementIds = ( substitutions, students, res, + syncedWithGroup, ) => { const startDate = course.startDate ? timesHelper.formatDate(course.startDate, 'DD.MM.YYYY') : undefined; const untilDate = course.untilDate ? timesHelper.formatDate(course.untilDate, 'DD.MM.YYYY') : undefined; @@ -63,6 +71,7 @@ const getSyncedElementIds = ( studentsSelected: selectedElementIdsToString(filterStudents(res, markSelected(students, course.userIds))), startDate, untilDate, + syncedWithGroup, }; return selectedElements; @@ -318,7 +327,7 @@ const editCourseHandler = (req, res, next) => { students: filterStudents(res, markSelected(students, course.userIds)), scopePermissions: _scopePermissions, schoolData: res.locals.currentSchoolData, - ...syncedElementIds, + ...syncedElements, }); } return res.render('courses/create-course', { @@ -330,18 +339,13 @@ const editCourseHandler = (req, res, next) => { course, colors, classesAndGroups: markSelected(classesAndGroups, classAndGroupIdsOfCourse), - teachers: markSelected( - teachers, - course.teacherIds, - ), - substitutions: markSelected( - substitutions, - course.substitutionIds, - ), + teachers: markSelected(teachers, course.teacherIds), + substitutions: markSelected(substitutions, course.substitutionIds), students: filterStudents(res, markSelected(students, course.userIds)), redirectUrl: req.query.redirectUrl || '/courses', schoolData: res.locals.currentSchoolData, pageTitle: res.$t('courses.add.headline.addCourse'), + ...syncedElements, }); }).catch(next); }; From a7ccb27755b9b71b413201705e719add431054e9 Mon Sep 17 00:00:00 2001 From: Malte Berg Date: Fri, 15 Mar 2024 13:26:35 +0100 Subject: [PATCH 06/15] remove duplicated code --- controllers/courses.js | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/controllers/courses.js b/controllers/courses.js index 837b0144a2..4a8ade91dc 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -46,9 +46,13 @@ const selectedElementIdsToString = (arr = []) => { return txt; }; -const stringToArr = (str = '') => { - const arr = str.trim() === '' ? [] : str.split(','); - return arr; +const strToPropsArray = (props, keys) => { + keys.forEach((key) => { + if (typeof props[key] === 'string') { + props[key] = props[key].trim() ? props[key].split(',') : []; + } + }); + return props; }; const getSyncedElements = ( @@ -205,6 +209,7 @@ const editCourseHandler = (req, res, next) => { const syncedWithGroup = req.params.groupId; let groupPromise; + // TODO: check for FeatureFlag if (syncedWithGroup) { groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedWithGroup}`); } @@ -294,7 +299,7 @@ const editCourseHandler = (req, res, next) => { const classAndGroupIdsOfCourse = [...(course.classIds || []), ...(course.groupIds || [])]; - if (syncedWithGroup) { + if (syncedWithGroup && group) { course.name = group.name; course.teacherIds = getUserIdsByRole(group.users, 'teacher'); course.userIds = getUserIdsByRole(group.users, 'student'); @@ -564,18 +569,8 @@ router.post('/', (req, res, next) => { req.body.untilDate = untilDate.toDate(); } - if (typeof req.body.teacherIds === 'string') { - req.body.teacherIds = stringToArr(req.body.teacherIds); - } - if (typeof req.body.substitutionIds === 'string') { - req.body.substitutionIds = stringToArr(req.body.substitutionIds); - } - if (typeof req.body.classIds === 'string') { - req.body.classIds = stringToArr(req.body.classIds); - } - if (typeof req.body.userIds === 'string') { - req.body.userIds = stringToArr(req.body.userIds); - } + const keys = ['teacherIds', 'substitutionIds', 'classIds', 'userIds']; + req.body = strToPropsArray(req.body, keys); req.body.features = []; OPTIONAL_COURSE_FEATURES.forEach((feature) => { @@ -824,18 +819,8 @@ router.patch('/:courseId', async (req, res, next) => { req.body.substitutionIds = []; } - if (typeof req.body.teacherIds === 'string') { - req.body.teacherIds = stringToArr(req.body.teacherIds); - } - if (typeof req.body.substitutionIds === 'string') { - req.body.substitutionIds = stringToArr(req.body.substitutionIds); - } - if (typeof req.body.classIds === 'string') { - req.body.classIds = stringToArr(req.body.classIds); - } - if (typeof req.body.userIds === 'string') { - req.body.userIds = stringToArr(req.body.userIds); - } + const keys = ['teacherIds', 'substitutionIds', 'classIds', 'userIds']; + req.body = strToPropsArray(req.body, keys); const startDate = timesHelper.dateStringToMoment(req.body.startDate); const untilDate = timesHelper.dateStringToMoment(req.body.untilDate); From bea8f245771f3054201adf211c909c61c38e5174 Mon Sep 17 00:00:00 2001 From: Malte Berg Date: Fri, 15 Mar 2024 14:45:53 +0100 Subject: [PATCH 07/15] change syncedWithGroup --- controllers/courses.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/controllers/courses.js b/controllers/courses.js index 4a8ade91dc..b723d77720 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -207,10 +207,11 @@ const editCourseHandler = (req, res, next) => { .get(`/courses/${req.params.courseId}/userPermissions/${res.locals.currentUser._id}`); } - const syncedWithGroup = req.params.groupId; + let syncedWithGroup; let groupPromise; // TODO: check for FeatureFlag - if (syncedWithGroup) { + if (req.params.groupId) { + syncedWithGroup = req.params.groupId; groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedWithGroup}`); } From 2833c409f4d79ee496cb7a05c82b08f7023f4415 Mon Sep 17 00:00:00 2001 From: Malte Berg Date: Fri, 15 Mar 2024 14:47:08 +0100 Subject: [PATCH 08/15] change syncedWithGroup --- controllers/courses.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/courses.js b/controllers/courses.js index b723d77720..a5b7699ff2 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -209,7 +209,7 @@ const editCourseHandler = (req, res, next) => { let syncedWithGroup; let groupPromise; - // TODO: check for FeatureFlag + // TODO: check for FeatureFlag: if(req.params.groupId && FEATURE_FLAG)) if (req.params.groupId) { syncedWithGroup = req.params.groupId; groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedWithGroup}`); From 92e1416e8b0b02132b0e3f054c89b2ea99e52cc6 Mon Sep 17 00:00:00 2001 From: Igor Richter Date: Mon, 18 Mar 2024 11:58:24 +0100 Subject: [PATCH 09/15] add feature flag check --- controllers/courses.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/controllers/courses.js b/controllers/courses.js index a5b7699ff2..34ccd035ec 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -209,8 +209,7 @@ const editCourseHandler = (req, res, next) => { let syncedWithGroup; let groupPromise; - // TODO: check for FeatureFlag: if(req.params.groupId && FEATURE_FLAG)) - if (req.params.groupId) { + if (req.params.groupId && Configuration.get('FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED')) { syncedWithGroup = req.params.groupId; groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedWithGroup}`); } From 60d0c4a470b253d474e44a7f7d65f1460cbfea35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20=C3=96hlerking?= Date: Mon, 18 Mar 2024 16:46:16 +0100 Subject: [PATCH 10/15] fix query --- controllers/courses.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controllers/courses.js b/controllers/courses.js index 34ccd035ec..4cbe7ac1e6 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -209,8 +209,8 @@ const editCourseHandler = (req, res, next) => { let syncedWithGroup; let groupPromise; - if (req.params.groupId && Configuration.get('FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED')) { - syncedWithGroup = req.params.groupId; + if (Configuration.get('FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED') && req.query.syncWithGroup) { + syncedWithGroup = req.query.syncWithGroup; groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedWithGroup}`); } From 3109be181eecea3c08ce3f902c469657d2168be6 Mon Sep 17 00:00:00 2001 From: Igor Richter Date: Tue, 19 Mar 2024 15:27:44 +0100 Subject: [PATCH 11/15] change variable name --- controllers/courses.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/controllers/courses.js b/controllers/courses.js index 34ccd035ec..36b0d8703b 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -63,7 +63,7 @@ const getSyncedElements = ( substitutions, students, res, - syncedWithGroup, + syncedGroupId, ) => { const startDate = course.startDate ? timesHelper.formatDate(course.startDate, 'DD.MM.YYYY') : undefined; const untilDate = course.untilDate ? timesHelper.formatDate(course.untilDate, 'DD.MM.YYYY') : undefined; @@ -75,7 +75,7 @@ const getSyncedElements = ( studentsSelected: selectedElementIdsToString(filterStudents(res, markSelected(students, course.userIds))), startDate, untilDate, - syncedWithGroup, + syncedGroupId, }; return selectedElements; @@ -207,11 +207,11 @@ const editCourseHandler = (req, res, next) => { .get(`/courses/${req.params.courseId}/userPermissions/${res.locals.currentUser._id}`); } - let syncedWithGroup; + let syncedGroupId; let groupPromise; if (req.params.groupId && Configuration.get('FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED')) { - syncedWithGroup = req.params.groupId; - groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedWithGroup}`); + syncedGroupId = req.params.groupId; + groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedGroupId}`); } Promise.all([ @@ -299,13 +299,13 @@ const editCourseHandler = (req, res, next) => { const classAndGroupIdsOfCourse = [...(course.classIds || []), ...(course.groupIds || [])]; - if (syncedWithGroup && group) { + if (syncedGroupId && group) { course.name = group.name; course.teacherIds = getUserIdsByRole(group.users, 'teacher'); course.userIds = getUserIdsByRole(group.users, 'student'); } - const syncedElements = (course.syncedWithGroup || syncedWithGroup) ? getSyncedElements( + const syncedElements = (course.syncedGroupId || syncedGroupId) ? getSyncedElements( course, classesAndGroups, classAndGroupIdsOfCourse, @@ -313,7 +313,7 @@ const editCourseHandler = (req, res, next) => { substitutions, students, res, - syncedWithGroup, + syncedGroupId, ) : {}; if (req.params.courseId) { From f1fb5462b03d527894109714c82ed35c50069ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20=C3=96hlerking?= Date: Mon, 25 Mar 2024 14:55:57 +0100 Subject: [PATCH 12/15] Revert "change variable name" This reverts commit 3109be18 --- controllers/courses.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/controllers/courses.js b/controllers/courses.js index bc2e7c6a25..34ccd035ec 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -63,7 +63,7 @@ const getSyncedElements = ( substitutions, students, res, - syncedGroupId, + syncedWithGroup, ) => { const startDate = course.startDate ? timesHelper.formatDate(course.startDate, 'DD.MM.YYYY') : undefined; const untilDate = course.untilDate ? timesHelper.formatDate(course.untilDate, 'DD.MM.YYYY') : undefined; @@ -75,7 +75,7 @@ const getSyncedElements = ( studentsSelected: selectedElementIdsToString(filterStudents(res, markSelected(students, course.userIds))), startDate, untilDate, - syncedGroupId, + syncedWithGroup, }; return selectedElements; @@ -207,11 +207,11 @@ const editCourseHandler = (req, res, next) => { .get(`/courses/${req.params.courseId}/userPermissions/${res.locals.currentUser._id}`); } - let syncedGroupId; + let syncedWithGroup; let groupPromise; - if (Configuration.get('FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED') && req.query.syncWithGroup) { - syncedGroupId = req.query.syncWithGroup; - groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedGroupId}`); + if (req.params.groupId && Configuration.get('FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED')) { + syncedWithGroup = req.params.groupId; + groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedWithGroup}`); } Promise.all([ @@ -299,13 +299,13 @@ const editCourseHandler = (req, res, next) => { const classAndGroupIdsOfCourse = [...(course.classIds || []), ...(course.groupIds || [])]; - if (syncedGroupId && group) { + if (syncedWithGroup && group) { course.name = group.name; course.teacherIds = getUserIdsByRole(group.users, 'teacher'); course.userIds = getUserIdsByRole(group.users, 'student'); } - const syncedElements = (course.syncedGroupId || syncedGroupId) ? getSyncedElements( + const syncedElements = (course.syncedWithGroup || syncedWithGroup) ? getSyncedElements( course, classesAndGroups, classAndGroupIdsOfCourse, @@ -313,7 +313,7 @@ const editCourseHandler = (req, res, next) => { substitutions, students, res, - syncedGroupId, + syncedWithGroup, ) : {}; if (req.params.courseId) { From 12ec4461c5a633dbed4fb77800d43c6dbd5bad24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20=C3=96hlerking?= Date: Mon, 25 Mar 2024 15:00:25 +0100 Subject: [PATCH 13/15] fix variable name --- controllers/courses.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/controllers/courses.js b/controllers/courses.js index 34ccd035ec..13792cd76c 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -207,11 +207,11 @@ const editCourseHandler = (req, res, next) => { .get(`/courses/${req.params.courseId}/userPermissions/${res.locals.currentUser._id}`); } - let syncedWithGroup; + let syncedGroupId; let groupPromise; - if (req.params.groupId && Configuration.get('FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED')) { - syncedWithGroup = req.params.groupId; - groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedWithGroup}`); + if (req.params.syncedGroupId && Configuration.get('FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED')) { + syncedGroupId = req.params.syncedGroupId; + groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedGroupId}`); } Promise.all([ @@ -299,13 +299,13 @@ const editCourseHandler = (req, res, next) => { const classAndGroupIdsOfCourse = [...(course.classIds || []), ...(course.groupIds || [])]; - if (syncedWithGroup && group) { + if (syncedGroupId && group) { course.name = group.name; course.teacherIds = getUserIdsByRole(group.users, 'teacher'); course.userIds = getUserIdsByRole(group.users, 'student'); } - const syncedElements = (course.syncedWithGroup || syncedWithGroup) ? getSyncedElements( + const syncedElements = (course.syncedWithGroup || syncedGroupId) ? getSyncedElements( course, classesAndGroups, classAndGroupIdsOfCourse, @@ -313,7 +313,7 @@ const editCourseHandler = (req, res, next) => { substitutions, students, res, - syncedWithGroup, + syncedGroupId, ) : {}; if (req.params.courseId) { From 1115dbf20013cd370be70ef514c9149d381b3184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20=C3=96hlerking?= Date: Wed, 27 Mar 2024 09:43:54 +0100 Subject: [PATCH 14/15] fix query and env --- config/default.schema.json | 5 +++++ controllers/courses.js | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/config/default.schema.json b/config/default.schema.json index ff0addccd7..0e05b0952e 100644 --- a/config/default.schema.json +++ b/config/default.schema.json @@ -607,6 +607,11 @@ "type": "boolean", "default": true, "description": "Uses the v3 api over the v1 api for systems" + }, + "FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED": { + "type": "boolean", + "default": false, + "description": "Enables the synchronization of courses with linked groups during provisioning." } }, "allOf": [ diff --git a/controllers/courses.js b/controllers/courses.js index 13792cd76c..d1687adfb8 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -209,8 +209,8 @@ const editCourseHandler = (req, res, next) => { let syncedGroupId; let groupPromise; - if (req.params.syncedGroupId && Configuration.get('FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED')) { - syncedGroupId = req.params.syncedGroupId; + if (req.query.syncedGroupId && Configuration.get('FEATURE_SCHULCONNEX_COURSE_SYNC_ENABLED')) { + syncedGroupId = req.query.syncedGroupId; groupPromise = api(req, { version: 'v3' }).get(`/groups/${syncedGroupId}`); } From 18fac68be0a6cea14e111e0f752229d1bae26117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20=C3=96hlerking?= Date: Wed, 27 Mar 2024 15:34:55 +0100 Subject: [PATCH 15/15] fix unused endpoint and #ifNot --- controllers/courses.js | 1 - helpers/handlebars/helpers/index.js | 6 ------ views/courses/create-course.hbs | 4 ++-- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/controllers/courses.js b/controllers/courses.js index d1687adfb8..7073e7f72e 100644 --- a/controllers/courses.js +++ b/controllers/courses.js @@ -595,7 +595,6 @@ router.post('/', (req, res, next) => { }); router.get('/add/', editCourseHandler); -router.get('/:groupId/sync', editCourseHandler); /* * Single Course diff --git a/helpers/handlebars/helpers/index.js b/helpers/handlebars/helpers/index.js index 56b7ee8876..9da6398386 100644 --- a/helpers/handlebars/helpers/index.js +++ b/helpers/handlebars/helpers/index.js @@ -132,12 +132,6 @@ const helpers = () => ({ } return opts.inverse(this); }, - ifNot: (value, opts) => { - if (!value) { - return opts.fn(this); - } - return opts.inverse(this); - }, ifvalue: (conditional, options) => { if (options.hash.value === conditional) { return options.fn(this); diff --git a/views/courses/create-course.hbs b/views/courses/create-course.hbs index 62b6aa493a..c170004088 100644 --- a/views/courses/create-course.hbs +++ b/views/courses/create-course.hbs @@ -278,9 +278,9 @@
- {{#ifNot ../syncedWithGroup}} + {{#unless @root.syncedWithGroup}} {{$t "courses.add.link.addAnotherCourse"}} - {{/ifNot}} + {{/unless}} {{$t "courses.add.link.courseOverview"}}