From 51a607419df8243d62f73cdb5e7abce914ea8c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Sch=C3=BCle?= Date: Tue, 1 Dec 2020 12:12:48 +0100 Subject: [PATCH] fix(Courses/EditDialog): preserve memberships after addNewMember MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Id9d52c3971b154feede8bbe4092adc21e92a058b Reviewed-on: http://gerrit.tine20.com/customers/18613 Reviewed-by: Philipp Schüle Tested-by: Philipp Schüle --- tests/tine20/Courses/JsonTest.php | 20 ++++++++++++++++++-- tine20/Courses/Controller/Course.php | 12 +++++++++--- tine20/Courses/js/CourseEditDialog.js | 21 +++++++++++++++------ 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/tests/tine20/Courses/JsonTest.php b/tests/tine20/Courses/JsonTest.php index e76dffdd937..cc4d2b412c0 100644 --- a/tests/tine20/Courses/JsonTest.php +++ b/tests/tine20/Courses/JsonTest.php @@ -228,9 +228,25 @@ public function testUpdateCourseSetAdditionalMemberships($checkWithNoRight = fal $courseUpdated = $this->_json->saveCourse($courseData); self::assertTrue(isset($courseUpdated['members'][0]['additionalGroups'])); if ($checkWithNoRight) { - self::assertEquals([], $courseUpdated['members'][0]['additionalGroups']); + self::assertEquals([], $courseUpdated['members'][0]['additionalGroups'], + print_r($courseUpdated['members'], true)); } else { - self::assertEquals($memberships, $courseUpdated['members'][0]['additionalGroups']); + self::assertEquals($memberships, $courseUpdated['members'][0]['additionalGroups'], + print_r($courseUpdated['members'], true)); + } + + // add new member - assert that this api returns the additionalGroups, too + $result = $this->_json->addNewMember(array( + 'accountFirstName' => 'jams', + 'accountLastName' => 'hot', + ), $courseUpdated); + $teacher = Tinebase_Translation::getTranslation('Courses')->_('Teacher'); + foreach ($result['results'] as $member) { + if (! $checkWithNoRight && strpos($member['name'], $teacher) !== false) { + self::assertEquals($memberships, $member['additionalGroups'], print_r($member, true)); + } else { + self::assertEquals([], $member['additionalGroups'], print_r($member, true)); + } } // remove memberships diff --git a/tine20/Courses/Controller/Course.php b/tine20/Courses/Controller/Course.php index 853f064a61e..ff51c2fd80d 100644 --- a/tine20/Courses/Controller/Course.php +++ b/tine20/Courses/Controller/Course.php @@ -296,9 +296,15 @@ public function getAdditionalGroupMemberships() $groupIds = Courses_Config::getInstance()->get(Courses_Config::ADDITIONAL_GROUP_MEMBERSHIPS, []); $additionalGroups = new Tinebase_Record_RecordSet(Tinebase_Model_Group::class); foreach ($groupIds as $groupId) { - $group = Tinebase_Group::getInstance()->getGroupById($groupId); - $group->members = Tinebase_Group::getInstance()->getGroupMembers($groupId); - $additionalGroups->addRecord($group); + try { + $group = Tinebase_Group::getInstance()->getGroupById($groupId); + $group->members = Tinebase_Group::getInstance()->getGroupMembers($groupId); + $additionalGroups->addRecord($group); + } catch (Tinebase_Exception_Record_NotDefined $ternd) { + if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) Tinebase_Core::getLogger()->notice( + __METHOD__ . '::' . __LINE__ . ' Skipping group: ' + . $ternd->getMessage()); + } } return $additionalGroups; } diff --git a/tine20/Courses/js/CourseEditDialog.js b/tine20/Courses/js/CourseEditDialog.js index d4b748f0f3e..40aea8c4ee9 100644 --- a/tine20/Courses/js/CourseEditDialog.js +++ b/tine20/Courses/js/CourseEditDialog.js @@ -122,7 +122,7 @@ Tine.Courses.CourseEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, { var members = (response.responseText) ? Ext.util.JSON.decode(response.responseText) : response; if (members.results.length > 0) { - this.membersStore.loadData({results: members.results}); + this.loadMembersIntoStore(members.results); } this.hideLoadMask(); }, @@ -132,12 +132,13 @@ Tine.Courses.CourseEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, { */ updateToolbars: function() { }, - + /** - * onRecordLoad + * load members into members store / handle additional groups + * + * @param Array members */ - onRecordLoad: function() { - let members = this.record.get('members') || []; + loadMembersIntoStore: function(members) { if (members.length > 0) { _.each(members, function(member) { _.each(member.additionalGroups, function(groupId) { @@ -146,7 +147,15 @@ Tine.Courses.CourseEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, { }); this.membersStore.loadData({results: members}); } - + }, + + /** + * onRecordLoad + */ + onRecordLoad: function() { + let members = this.record.get('members') || []; + this.loadMembersIntoStore(members); + // only activate import and ok buttons if editing existing course / user has the appropriate right var disabled = ! this.record.get('id') || ! Tine.Tinebase.common.hasRight('manage', 'Admin', 'accounts')