From 287fe009d68fdc6fcd251d3fe331284236eac9de Mon Sep 17 00:00:00 2001 From: mjansen Date: Wed, 6 Mar 2024 10:58:18 +0100 Subject: [PATCH 01/23] Customizing: Add ILIAS 9 compatible patches --- .gitignore | 4 +- .../classes/class.ilCourseConstants.php | 3 + ...ass.ilCourseMembershipMailNotification.php | 109 ++- .../class.ilCourseParticipantsTableGUI.php | 4 +- .../classes/class.ilCourseRegistrationGUI.php | 377 +++++++- Modules/Course/classes/class.ilObjCourse.php | 43 +- .../Course/classes/class.ilObjCourseGUI.php | 72 +- .../Record/class.ilAdvancedMDRecordGUI.php | 28 +- ....ilAdvancedMDFieldDefinitionGroupBased.php | 4 +- .../class.ilAdvancedMDFieldDefinition.php | 10 +- .../classes/class.ilInfoScreenGUI.php | 9 +- .../classes/class.ilMemberAgreementGUI.php | 50 +- ...lass.ilMembershipRegistrationCodeUtils.php | 11 + .../classes/class.ilParticipant.php | 21 + .../classes/class.ilParticipants.php | 21 + .../classes/class.ilRegistrationGUI.php | 108 ++- .../Object/classes/class.ilObjectListGUI.php | 13 +- .../class.ilTrMatrixTableGUI.php | 25 + Services/User/classes/class.ilObjUser.php | 5 + Services/User/classes/class.ilUserUtil.php | 11 + Services/Utilities/classes/class.ilUtil.php | 56 ++ setup/sql/dbupdate_custom.php | 868 ++++++++++++++++++ 22 files changed, 1785 insertions(+), 67 deletions(-) create mode 100644 setup/sql/dbupdate_custom.php diff --git a/.gitignore b/.gitignore index e2e287305092..e12641e384b4 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,9 @@ /ilias.ini.php /ilias.log /db_template_writer.php -/setup/sql/dbupdate_custom.php +# seminar-patch: begin +#/setup/sql/dbupdate_custom.php +# seminar-patch: end /install_client.php /Services/GlobalScreen/artifacts/global_screen_providers.php /Services/Style/System/data/data.php diff --git a/Modules/Course/classes/class.ilCourseConstants.php b/Modules/Course/classes/class.ilCourseConstants.php index 4bded377c298..96054f807d31 100644 --- a/Modules/Course/classes/class.ilCourseConstants.php +++ b/Modules/Course/classes/class.ilCourseConstants.php @@ -52,6 +52,9 @@ class ilCourseConstants public const IL_CRS_SUBSCRIPTION_CONFIRMATION = 2; public const IL_CRS_SUBSCRIPTION_DIRECT = 3; public const IL_CRS_SUBSCRIPTION_PASSWORD = 4; + // seminar-patch: begin + public const IL_CRS_SUBSCRIPTION_WORKFLOW = 5; + // seminar-patch: end public const IL_CRS_ARCHIVE_DOWNLOAD = 3; public const IL_CRS_ARCHIVE_NONE = 0; } diff --git a/Modules/Course/classes/class.ilCourseMembershipMailNotification.php b/Modules/Course/classes/class.ilCourseMembershipMailNotification.php index dfff47aa79df..fc85df70116a 100644 --- a/Modules/Course/classes/class.ilCourseMembershipMailNotification.php +++ b/Modules/Course/classes/class.ilCourseMembershipMailNotification.php @@ -98,6 +98,9 @@ public function forceSendingMail(bool $a_status): void public function send(): bool { + // seminar-patch: begin + global $DIC; + // seminar-patch: end if ( $this->getRefId() && in_array($this->getType(), array(self::TYPE_ADMISSION_MEMBER))) { @@ -119,6 +122,43 @@ public function send(): bool case self::TYPE_ADMISSION_MEMBER: foreach ($this->getRecipients() as $rcp) { + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + // https://support.iliasnet.de/view.php?id=8725 + $ref_ids = ilObject::_getAllReferences($this->getObjId()); + $ref_id = current($ref_ids); + /** @var ilObjCourse $crs */ + $crs = ilObjectFactory::getInstanceByRefId($ref_id); + + if ($rcp == $DIC->user()->getId()) { + $mail_data_object = new ilParticipantInvitationMailData(); + $mail_data_object->setCourse($crs); + $mail_data_object->setRecipientUserId($rcp); + $api = new ilMailTemplateManagementAPI(); + $api->sendMail( + 'Booking', + 'Buchungsbestätigung bei Selbstbuchung (6.1 / Mail 1)', + ilObjUser::_lookupLanguage($rcp), + $mail_data_object + ); + } elseif ($crs->getSubscriptionType() === ilCourseConstants::IL_CRS_SUBSCRIPTION_WORKFLOW) { + ilBookingProcessesUtils::CourseAdminBooksProcessCourse( + (int) $rcp, + $crs->getRefId(), + $DIC->user()->getId(), + true + ); + } else { + ilBookingProcessesUtils::CourseAdminBooksNonWorkflowCourse( + (int) $rcp, + $crs->getRefId(), + $DIC->user()->getId(), + true + ); + } + continue; + } + // seminar-patch: end $this->initLanguage($rcp); $this->initMail(); $this->setSubject( @@ -140,7 +180,11 @@ public function send(): bool break; case self::TYPE_ACCEPTED_SUBSCRIPTION_MEMBER: - + // seminar-patch: begin + if (!$DIC->settings()->get('mail_crs_member_notification', true)) { + return false; + } + // seminar-patch: end foreach ($this->getRecipients() as $rcp) { $this->initLanguage($rcp); $this->initMail(); @@ -163,7 +207,11 @@ public function send(): bool break; case self::TYPE_REFUSED_SUBSCRIPTION_MEMBER: - + // seminar-patch: begin + if (!$DIC->settings()->get('mail_crs_member_notification', true)) { + return false; + } + // seminar-patch: end foreach ($this->getRecipients() as $rcp) { $this->initLanguage($rcp); $this->initMail(); @@ -183,6 +231,11 @@ public function send(): bool break; case self::TYPE_STATUS_CHANGED: + // seminar-patch: begin + if (!$DIC->settings()->get('mail_crs_member_notification', true)) { + return false; + } + // seminar-patch: end foreach ($this->getRecipients() as $rcp) { $this->initLanguage($rcp); $this->initMail(); @@ -210,7 +263,29 @@ public function send(): bool break; case self::TYPE_DISMISS_MEMBER: - + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + if (!$DIC->settings()->get('mail_crs_member_notification', true)) { + return false; + } + + // https://support.iliasnet.de/view.php?id=8698 + $ref_ids = ilObject::_getAllReferences($this->getObjId()); + $ref_id = current($ref_ids); + /** @var ilObjCourse $crs */ + $crs = ilObjectFactory::getInstanceByRefId($ref_id); + foreach ($this->getRecipients() as $rcp) { + ilBookingProcessesUtils::CourseAdminCancellationNonWorkflow( + (int) $rcp, + $crs->getRefId(), + $DIC->user()->getId(), + '', + true + ); + } + return true; + } + // seminar-patch: end foreach ($this->getRecipients() as $rcp) { $this->initLanguage($rcp); $this->initMail(); @@ -228,7 +303,11 @@ public function send(): bool break; case self::TYPE_BLOCKED_MEMBER: - + // seminar-patch: begin + if (!$DIC->settings()->get('mail_crs_member_notification', true)) { + return false; + } + // seminar-patch: end foreach ($this->getRecipients() as $rcp) { $this->initLanguage($rcp); $this->initMail(); @@ -246,7 +325,11 @@ public function send(): bool break; case self::TYPE_UNBLOCKED_MEMBER: - + // seminar-patch: begin + if (!$DIC->settings()->get('mail_crs_member_notification', true)) { + return false; + } + // seminar-patch: end foreach ($this->getRecipients() as $rcp) { $this->initLanguage($rcp); $this->initMail(); @@ -366,6 +449,11 @@ public function send(): bool break; case self::TYPE_UNSUBSCRIBE_MEMBER: + // seminar-patch: begin + if (!$DIC->settings()->get('mail_crs_member_notification', true)) { + return false; + } + // seminar-patch: end foreach ($this->getRecipients() as $rcp) { $this->initLanguage($rcp); $this->initMail(); @@ -385,7 +473,11 @@ public function send(): bool break; case self::TYPE_SUBSCRIBE_MEMBER: - + // seminar-patch: begin + if (!$DIC->settings()->get('mail_crs_member_notification', true)) { + return false; + } + // seminar-patch: end foreach ($this->getRecipients() as $rcp) { $this->initLanguage($rcp); $this->initMail(); @@ -409,6 +501,11 @@ public function send(): bool break; case self::TYPE_WAITING_LIST_MEMBER: + // seminar-patch: begin + if (!$DIC->settings()->get('mail_crs_member_notification', true)) { + return false; + } + // seminar-patch: end foreach ($this->getRecipients() as $rcp) { $this->initLanguage($rcp); $this->initMail(); diff --git a/Modules/Course/classes/class.ilCourseParticipantsTableGUI.php b/Modules/Course/classes/class.ilCourseParticipantsTableGUI.php index adf928e074c2..d1868650f65c 100644 --- a/Modules/Course/classes/class.ilCourseParticipantsTableGUI.php +++ b/Modules/Course/classes/class.ilCourseParticipantsTableGUI.php @@ -478,7 +478,9 @@ public function parse(): void foreach ($data as $usr_id => $fields) { $usr_id = (int) $usr_id; // #7264: as we get data for all course members filter against user data - if (!$this->checkAcceptance($usr_id) || !in_array($usr_id, $usr_ids)) { + // seminar-patch: begin + if (!in_array($usr_id, $usr_ids)) { + // seminar-patch: end continue; } diff --git a/Modules/Course/classes/class.ilCourseRegistrationGUI.php b/Modules/Course/classes/class.ilCourseRegistrationGUI.php index f84866891232..156e6db0c0d6 100644 --- a/Modules/Course/classes/class.ilCourseRegistrationGUI.php +++ b/Modules/Course/classes/class.ilCourseRegistrationGUI.php @@ -40,7 +40,9 @@ public function executeCommand() $this->tabs->activateTab('leave'); } - if (!$this->access->checkAccess('join', '', $this->getRefId())) { + // seminar-patch: begin + if (!isset($_SESSION['employee_bookings']) && !$this->access->checkAccess('join', '', $this->getRefId())) { + // seminar-patch: end $this->ctrl->setReturn($this->parent_gui, 'infoScreen'); $this->ctrl->returnToParent($this); return; @@ -177,7 +179,13 @@ protected function fillMaxMembers(): void if ( !$free && !$this->container->enabledWaitingList()) { // Disable registration - $this->enableRegistration(false); + // seminar-patch: begin + $this->enableRegistration( + isset($_SESSION['employee_bookings']) && + is_array($_SESSION['employee_bookings']) && + $_SESSION['employee_bookings'] !== [] + ); + // seminar-patch: end $this->tpl->setOnScreenMessage('failure', $this->lng->txt('mem_alert_no_places')); #$alert = $this->lng->txt('mem_alert_no_places'); } elseif ( @@ -264,7 +272,10 @@ protected function fillRegistrationType(): void $sub->setInfo($this->lng->txt('crs_info_reg_confirmation')); $sub->setCols(40); $sub->setRows(5); - if ($this->participants->isSubscriber($this->user->getId())) { + // seminar-patch: begin + if ((!isset($_GET['fallbackCmd']) || $_GET['fallbackCmd'] !== 'book_employees') && + $this->participants->isSubscriber($this->user->getId())) { + // seminar-patch: end $sub_data = $this->participants->getSubscriberData($this->user->getId()); $sub->setValue($sub_data['subject']); $sub->setInfo(''); @@ -284,7 +295,11 @@ protected function addCommandButtons(): void parent::addCommandButtons(); switch ($this->container->getSubscriptionType()) { case ilCourseConstants::IL_CRS_SUBSCRIPTION_CONFIRMATION: - if ($this->participants->isSubscriber($this->user->getId())) { + // seminar-patch: begin + case ilCourseConstants::IL_CRS_SUBSCRIPTION_WORKFLOW: + if ((!isset($_GET['fallbackCmd']) || $_GET['fallbackCmd'] !== 'book_employees') && + $this->participants->isSubscriber($this->user->getId())) { + // seminar-patch: end $this->form->clearCommandButtons(); $this->form->addCommandButton( 'updateSubscriptionRequest', @@ -345,29 +360,84 @@ protected function validate(): bool return true; } - protected function add() + // seminar-patch: begin + protected function add(?int $by_list = null): void + // seminar-patch: end { + // seminar-patch: begin + global $DIC; + $user = $this->user; + $has_list = false; + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + if ($by_list === null && isset($_SESSION['employee_bookings']) && is_array($_SESSION['employee_bookings'])) { + foreach ($_SESSION['employee_bookings'] as $booking) { + $this->add((int) $booking); + } + unset($_SESSION['employee_bookings']); + + $this->ctrl->setParameterByClass( + ilCourseBookingUIHookGUI::class, + 'ref_id', + $this->container->getRefId() + ); + $this->ctrl->redirectByClass( + [ilUIPluginRouterGUI::class, ilCourseBookingUIHookGUI::class], + 'EmployeeBookings' + ); + } elseif ($by_list !== null) { + $user = new ilObjUser($by_list); + } + $has_list = isset($_SESSION['employee_bookings']); + } + // seminar-patch: end // set aggreement accepted $this->setAccepted(true); $free = max(0, $this->container->getSubscriptionMaxMembers() - $this->participants->getCountMembers()); $waiting_list = new ilCourseWaitingList($this->container->getId()); - if ($this->container->isSubscriptionMembershipLimited() && $this->container->enabledWaitingList() && (!$free || $waiting_list->getCountUsers())) { - $waiting_list->addToList($this->user->getId()); + // seminar-patch: begin + if ($this->container->enabledWaitingList() && + (!$free || $waiting_list->getCountUsers()) && ( + $this->container->isSubscriptionMembershipLimited() && + !( + $this->container->getSubscriptionType() === ilCourseConstants::IL_CRS_SUBSCRIPTION_CONFIRMATION || + $this->container->getSubscriptionType() === ilCourseConstants::IL_CRS_SUBSCRIPTION_WORKFLOW + ) + )) { + $waiting_list->addToList($user->getId()); + // seminar-patch: end $info = sprintf( $this->lng->txt('crs_added_to_list'), - $waiting_list->getPosition($this->user->getId()) + $waiting_list->getPosition($user->getId()) ); $this->tpl->setOnScreenMessage('success', $info, true); - $this->participants->sendNotification( - ilCourseMembershipMailNotification::TYPE_NOTIFICATION_ADMINS_REGISTRATION_REQUEST, - $this->user->getId() - ); - $this->participants->sendNotification( - ilCourseMembershipMailNotification::TYPE_WAITING_LIST_MEMBER, - $this->user->getId() - ); + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + ilBookingProcessesUtils::LearnerIsBookedToWaitingList($user->getId(), $this->ref_id); + + if ($has_list) { + $this->ctrl->setParameterByClass( + ilCourseBookingUIHookGUI::class, + 'ref_id', + $this->container->getRefId() + ); + $this->ctrl->redirectByClass( + [ilUIPluginRouterGUI::class, ilCourseBookingUIHookGUI::class], + 'EmployeeBookings' + ); + } + } else { + $this->participants->sendNotification( + ilCourseMembershipMailNotification::TYPE_NOTIFICATION_ADMINS_REGISTRATION_REQUEST, + $user->getId() + ); + $this->participants->sendNotification( + ilCourseMembershipMailNotification::TYPE_WAITING_LIST_MEMBER, + $user->getId() + ); + } + // seminar-patch: end $this->ctrl->setParameterByClass( "ilrepositorygui", "ref_id", @@ -377,21 +447,64 @@ protected function add() } switch ($this->container->getSubscriptionType()) { + // seminar-patch: begin case ilCourseConstants::IL_CRS_SUBSCRIPTION_CONFIRMATION: - $this->participants->addSubscriber($this->user->getId()); - $this->participants->updateSubscriptionTime($this->user->getId(), time()); + $this->participants->addSubscriber($user->getId()); + $this->participants->updateSubscriptionTime($user->getId(), time()); $subject = $this->http->wrapper()->post()->retrieve( 'subject', $this->refinery->kindlyTo()->string() ); - $this->participants->updateSubject($this->user->getId(), $subject); - $this->participants->sendNotification( - ilCourseMembershipMailNotification::TYPE_NOTIFICATION_ADMINS_REGISTRATION_REQUEST, - $this->user->getId() - ); + $this->participants->updateSubject($user->getId(), $subject); + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + if ($by_list === null) { + ilBookingProcessesUtils::LearnerRequestsConfirmationCourse( + $user->getId(), + $this->getContainer()->getRefId() + ); + } else { + $course_participants = ilCourseParticipants::_getInstanceByObjId($this->getContainer()->getId()); + $admins = $course_participants->getAdmins(); + if (in_array($user->getId(), $admins)) { + ilBookingProcessesUtils::CourseAdminBooksConfirmationCourse( + $user->getId(), + $this->getContainer()->getRefId(), + $user->getId() + ); + } else { + ilBookingProcessesUtils::SuperiorBooksConfirmationCourse( + $user->getId(), + $this->getContainer()->getRefId(), + $user->getId() + ); + // AND NOTHING IS GONNA HAPPEN - BY DESIGN! + } + } + } else { + $this->participants->sendNotification( + ilCourseMembershipMailNotification::TYPE_NOTIFICATION_ADMINS_REGISTRATION_REQUEST, + $user->getId() + ); + } + // seminar-patch: end $this->tpl->setOnScreenMessage('success', $this->lng->txt("application_completed"), true); + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + if ($has_list) { + $this->ctrl->setParameterByClass( + ilCourseBookingUIHookGUI::class, + 'ref_id', + $this->container->getRefId() + ); + $this->ctrl->redirectByClass( + [ilUIPluginRouterGUI::class, ilCourseBookingUIHookGUI::class], + 'EmployeeBookings' + ); + } + } + // seminar-patch: end $this->ctrl->setParameterByClass( "ilrepositorygui", "ref_id", @@ -399,35 +512,191 @@ protected function add() ); $this->ctrl->redirectByClass("ilrepositorygui", ""); break; + // seminar-patch: begin + case ilCourseConstants::IL_CRS_SUBSCRIPTION_WORKFLOW: + if (!ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + break; + } + $isSuperior = ilBookingProcessesUtils::isUserSuperior($user->getId()); + $directSuperiorJoin = $isSuperior && $by_list === null; + + if ($directSuperiorJoin) { + ilBookingProcessesUtils::SuperiorBooksProcessCourse( + $user->getId(), + $this->container->getRefId(), + $user->getId() + ); + } else { + $subject = $this->http->wrapper()->post()->retrieve( + 'subject', + $this->refinery->byTrying([ + $this->refinery->kindlyTo()->string(), + $this->refinery->always('') + ]) + ); - default: + if (!$this->participants->isSubscriber($user->getId())) { + $this->participants->addSubscriber($user->getId()); + } + $this->participants->updateSubscriptionTime($user->getId(), time()); + $this->participants->updateSubject($user->getId(), ilUtil::stripSlashes($subject)); + /*$this->participants->sendNotification( + $this->participants->NOTIFY_SUBSCRIPTION_REQUEST, + $ilUser->getId() + );*/ + } + + if (!$directSuperiorJoin) { + if ($by_list === null) { + ilBookingProcessesUtils::LearnerRequestsProcessCourse( + $user->getId(), + $this->getContainer()->getRefId() + ); + } else { + $actor = $DIC->user(); + ilBookingProcessesUtils::SuperiorBooksProcessCourse( + $user->getId(), + $this->getContainer()->getRefId(), + $actor->getId() + ); + } + } + + if ($directSuperiorJoin) { + $this->tpl->setOnScreenMessage('success', $this->lng->txt('crs_subscription_successful'), true); + } else { + $this->tpl->setOnScreenMessage('success', $this->lng->txt('application_completed'), true); + } + + if ($by_list === null) { + if ($has_list) { + $this->ctrl->setParameterByClass( + ilCourseBookingUIHookGUI::class, + 'ref_id', + $this->container->getRefId() + ); + $this->ctrl->redirectByClass( + [ilUIPluginRouterGUI::class, ilCourseBookingUIHookGUI::class], + 'EmployeeBookings' + ); + } + $this->ctrl->setParameterByClass( + ilRepositoryGUI::class, + 'ref_id', + $this->tree->getParentId($this->container->getRefId()) + ); + $this->ctrl->redirectByClass(ilRepositoryGUI::class); + } + break; + // seminar-patch: end + default: + // seminar-patch: begin + $directMembershipProcessTriggered = false; if ($this->container->isSubscriptionMembershipLimited() && $this->container->getSubscriptionMaxMembers()) { $success = $GLOBALS['DIC']['rbacadmin']->assignUserLimited( ilParticipants::getDefaultMemberRole($this->container->getRefId()), - $this->user->getId(), + $user->getId(), $this->container->getSubscriptionMaxMembers(), array(ilParticipants::getDefaultMemberRole($this->container->getRefId())) ); + + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + if ($by_list === null) { + //ilBookingProcessesUtils::bookCourseAsUser($user, $this->getContainer()); + ilBookingProcessesUtils::LearnerRequestsDirectMembershipCourse( + $user->getId(), + $this->getContainer()->getRefId() + ); + $directMembershipProcessTriggered = true; + } else { + $actor = $DIC->user(); + ilBookingProcessesUtils::SuperiorBooksDirectCourse( + $user->getId(), + $this->getContainer()->getRefId(), + $actor->getId() + ); + } + } + // seminar-patch: end if (!$success) { $this->tpl->setOnScreenMessage('failure', $this->lng->txt('crs_subscription_failed_limit')); + // seminar-patch: end + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + if ($has_list) { + $this->tpl->setOnScreenMessage( + 'success', + $this->lng->txt('crs_subscription_failed_limit'), + true + ); + $this->ctrl->setParameterByClass( + ilCourseBookingUIHookGUI::class, + 'ref_id', + $this->container->getRefId() + ); + $this->ctrl->redirectByClass( + [ilUIPluginRouterGUI::class, ilCourseBookingUIHookGUI::class], + 'EmployeeBookings' + ); + } + } + // seminar-patch: end $this->show(); return; } } - $this->participants->add($this->user->getId(), ilParticipants::IL_CRS_MEMBER); - $this->participants->sendNotification(ilCourseMembershipMailNotification::TYPE_NOTIFICATION_ADMINS, $this->user->getId()); - $this->participants->sendNotification(ilCourseMembershipMailNotification::TYPE_SUBSCRIBE_MEMBER, $this->user->getId()); + $this->participants->add($user->getId(), ilParticipants::IL_CRS_MEMBER); + // seminar-patch: end + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + if ($by_list === null) { + //ilBookingProcessesUtils::bookCourseAsUser( $ilUser, $this->getContainer() ); + if (false === $directMembershipProcessTriggered) { + ilBookingProcessesUtils::LearnerRequestsDirectMembershipCourse( + $user->getId(), + $this->getContainer()->getRefId() + ); + } + } else { + //ilBookingProcessesUtils::bookEmployeeAsSuperior($user->getId(), $this->getContainer()->getRefId()); + // TODO: SuperiorBooksDirectMembershipCourse + //ilBookingProcessesUtils::SbookEmployeeAsSuperior($user->getId(), $this->getContainer()->getRefId()); + } + } else { + $this->participants->sendNotification( + ilCourseMembershipMailNotification::TYPE_NOTIFICATION_ADMINS, + $user->getId() + ); + $this->participants->sendNotification( + ilCourseMembershipMailNotification::TYPE_SUBSCRIBE_MEMBER, + $user->getId() + ); + } - ilForumNotification::checkForumsExistsInsert($this->container->getRefId(), $this->user->getId()); + ilForumNotification::checkForumsExistsInsert($this->container->getRefId(), $user->getId()); if ($this->container->getType() == "crs") { - $this->container->checkLPStatusSync($this->user->getId()); + $this->container->checkLPStatusSync($user->getId()); } + // seminar-patch: end $pending_goto = ilSession::get('pending_goto'); if (!$pending_goto) { $this->tpl->setOnScreenMessage('success', $this->lng->txt("crs_subscription_successful"), true); + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + if ($has_list) { + $this->ctrl->setParameterByClass( + ilCourseBookingUIHookGUI::class, + 'ref_id', + $this->container->getRefId() + ); + $this->ctrl->redirectByClass( + [ilUIPluginRouterGUI::class, ilCourseBookingUIHookGUI::class], + 'EmployeeBookings' + ); + } + } + // seminar-patch: end $this->ctrl->returnToParent($this); } else { $tgt = $pending_goto; @@ -450,7 +719,9 @@ protected function initWaitingList(): ilWaitingList return $this->waiting_list; } - protected function isWaitingListActive(): bool + // seminar-patch: begin + protected function isWaitingListActive(bool $out_of_self_subscription = true): bool + // seminar-patch: end { static $active = null; @@ -463,8 +734,50 @@ protected function isWaitingListActive(): bool if (!$this->container->getSubscriptionMaxMembers()) { return $active = false; } - + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking') && + $out_of_self_subscription && $this->container->enabledWaitingList() && ( + $this->container->getSubscriptionType() === ilCourseConstants::IL_CRS_SUBSCRIPTION_CONFIRMATION || + $this->container->getSubscriptionType() === ilCourseConstants::IL_CRS_SUBSCRIPTION_WORKFLOW + )) { + return $active = false; + } + // seminar-patch: end $free = max(0, $this->container->getSubscriptionMaxMembers() - $this->participants->getCountMembers()); return $active = (!$free || $this->getWaitingList()->getCountUsers()); } + // seminar-patch: begin + protected function updateSubscriptionRequest(): void + { + if ($this->container->getSubscriptionType() === ilCourseConstants::IL_CRS_SUBSCRIPTION_WORKFLOW && + ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + $this->initForm(); + if (!$this->validateAgreement()) { + $this->form->setValuesByPost(); + $this->tpl->setOnScreenMessage('failure', $this->lng->txt('crs_agreement_required')); + $this->show(); + return; + } + if (!$this->validateCustomFields()) { + $this->form->setValuesByPost(); + $this->tpl->setOnScreenMessage('failure', $this->lng->txt('fill_out_all_required_fields')); + $this->show(); + return; + } + } + + parent::updateSubscriptionRequest(); + } + + protected function cancelSubscriptionRequest(): void + { + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + ilBookingProcessesUtils::LearnerRetractsConfirmationCourseRequest( + $this->user->getId(), + $this->container->getRefId() + ); + parent::cancelSubscriptionRequest(); + } + } + // seminar-patch: end } diff --git a/Modules/Course/classes/class.ilObjCourse.php b/Modules/Course/classes/class.ilObjCourse.php index 77d04be36f78..f3f062371c4e 100755 --- a/Modules/Course/classes/class.ilObjCourse.php +++ b/Modules/Course/classes/class.ilObjCourse.php @@ -916,6 +916,11 @@ public function delete(): bool 'appointments' => $this->prepareAppointments('delete') ) ); + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + ilBookingProcessesUtils::deleteAllProcessInstancesForCourse($this->getRefId()); + } + // seminar-patch: end return true; } @@ -1661,8 +1666,12 @@ public function register( } $this->getMembersObject()->add($a_user_id, $a_role); - $this->getMembersObject()->sendNotification(ilCourseMembershipMailNotification::TYPE_ADMISSION_MEMBER, $a_user_id); - $this->getMembersObject()->sendNotification(ilCourseMembershipMailNotification::TYPE_NOTIFICATION_ADMINS, $a_user_id); + // seminar-patch: begin + if (!ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + $this->getMembersObject()->sendNotification(ilCourseMembershipMailNotification::TYPE_ADMISSION_MEMBER, $a_user_id); + $this->getMembersObject()->sendNotification(ilCourseMembershipMailNotification::TYPE_NOTIFICATION_ADMINS, $a_user_id); + } + // seminar-patch: end ilForumNotification::checkForumsExistsInsert($this->getRefId(), $a_user_id); } @@ -1779,9 +1788,16 @@ public function handleAutoFill(): void continue; } $this->getMembersObject()->add($user_id, ilParticipants::IL_CRS_MEMBER); - $this->getMembersObject()->sendNotification(ilCourseMembershipMailNotification::TYPE_ADMISSION_MEMBER, $user_id, true); + // seminar-patch: begin + //$this->getMembersObject()->sendNotification(ilCourseMembershipMailNotification::TYPE_ADMISSION_MEMBER, $user_id, true); $waiting_list->removeFromList($user_id); $this->checkLPStatusSync($user_id); + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + ilBookingProcessesUtils::LearnerIsMovedFromWaitingListToCourse($user_id, $this->getRefId()); + } else { + $this->getMembersObject()->sendNotification(ilCourseMembershipMailNotification::TYPE_ADMISSION_MEMBER, $user_id, true); + } + // seminar-patch: end $this->course_logger->info('Assigned user from waiting list to course: ' . $this->getTitle()); $now++; @@ -1858,4 +1874,25 @@ public static function findCoursesWithNotEnoughMembers(): array return $res; } + // seminar-patch: begin + protected ?bool $is_template = null; + + public function isTemplate(): bool + { + if ($this->is_template === null) { + $this->is_template = false; + + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + /** @var ilCourseTemplatesPlugin $plugin */ + $plugin = ilUtil::getPlugin('Services', 'UIComponent', 'uihk', 'CourseBooking'); + $all = $plugin->getCourseTemplatesInstance()->getCoursesWithTemplateStatus(); + if (in_array($this->getId(), $all)) { + $this->is_template = true; + } + } + } + + return $this->is_template; + } + // seminar-patch: end } //END class.ilObjCourse diff --git a/Modules/Course/classes/class.ilObjCourseGUI.php b/Modules/Course/classes/class.ilObjCourseGUI.php index 96ce4a0135f8..4f0ff29424cf 100755 --- a/Modules/Course/classes/class.ilObjCourseGUI.php +++ b/Modules/Course/classes/class.ilObjCourseGUI.php @@ -91,10 +91,13 @@ protected function afterImport(ilObject $new_object): void { $part = ilCourseParticipants::_getInstanceByObjId($new_object->getId()); $part->add($this->user->getId(), ilCourseConstants::CRS_ADMIN); - $part->updateNotification( + // seminar-patch: begin + /*$part->updateNotification( $this->user->getId(), (bool) $this->settings->get('mail_crs_admin_notification', '1') - ); + );*/ + $part->updateNotification($this->user->getId(), true); + // seminar-patch: end parent::afterImport($new_object); } @@ -206,6 +209,9 @@ public function infoScreen(): void $files = ilCourseFile::_readFilesByCourse($this->object->getId()); $info = new ilInfoScreenGUI($this); + // seminar-patch: begin + $info->suppress_object_info = true; + // seminar-patch: end $info->enablePrivateNotes(); $info->enableFeedback(); $info->enableNews(); @@ -360,6 +366,11 @@ public function infoScreen(): void case ilCourseConstants::IL_CRS_SUBSCRIPTION_CONFIRMATION: $txt = $this->lng->txt("crs_info_reg_confirmation"); break; + // seminar-patch: begin + case ilCourseConstants::IL_CRS_SUBSCRIPTION_WORKFLOW: + $txt = $this->lng->txt("crs_subscription_options_workflow"); + break; + // seminar-patch: end case ilCourseConstants::IL_CRS_SUBSCRIPTION_DIRECT: $txt = $this->lng->txt("crs_info_reg_direct"); break; @@ -1115,7 +1126,16 @@ protected function initEditForm(): ilPropertyFormGUI ); $opt->setInfo($this->lng->txt('crs_registration_confirmation_info')); $reg_proc->addOption($opt); - + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + $opt = new ilRadioOption( + $this->lng->txt('crs_subscription_options_workflow'), + ilCourseConstants::IL_CRS_SUBSCRIPTION_WORKFLOW + ); + $opt->setInfo($this->lng->txt('crs_subscription_options_workflow_info')); + $reg_proc->addOption($opt); + } + // seminar-patch: end $opt_self_enrollment_enabled = new ilRadioOption( $this->lng->txt('crs_reg_selfreg'), (string) ilCourseConstants::IL_CRS_SUBSCRIPTION_UNLIMITED @@ -1769,12 +1789,24 @@ public function unsubscribeObject(): void public function performUnsubscribeObject() { $this->checkPermission('leave'); + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + ilBookingProcessesUtils::LearnerLeavesWithSillyRemoveMeFromThatAndThatAndThatCourseThingy( + $this->user->getId(), + $this->ref_id + ); + $this->handleAutoFill(); + } + // seminar-patch: end $this->getObject()->getMembersObject()->delete($this->user->getId()); + // seminar-patch: begin + /* $this->getObject()->getMembersObject()->sendUnsubscribeNotificationToAdmins($this->user->getId()); $this->getObject()->getMembersObject()->sendNotification( ilCourseMembershipMailNotification::TYPE_UNSUBSCRIBE_MEMBER, $this->user->getId() - ); + );*/ + // seminar-patch: end $this->tpl->setOnScreenMessage('success', $this->lng->txt('crs_unsubscribed_from_crs'), true); $this->ctrl->setParameterByClass("ilrepositorygui", "ref_id", $this->tree->getParentId($this->ref_id)); @@ -3112,4 +3144,36 @@ public function setSideColumnReturn(): void { $this->ctrl->setReturn($this, "view"); } + // seminar-patch: begin + protected function handleAutoFill(): void + { + if ($this->object->enabledWaitingList() && $this->object->hasWaitingListAutoFill()) { + $max = $this->object->getSubscriptionMaxMembers(); + $now = ilCourseParticipants::lookupNumberOfMembers($this->object->getRefId()); + if ($max > $now) { + // see assignFromWaitingListObject() + $waiting_list = new ilCourseWaitingList($this->object->getId()); + + foreach ($waiting_list->getUserIds() as $user_id) { + if (!$tmp_obj = ilObjectFactory::getInstanceByObjId($user_id, false)) { + continue; + } + if ($this->object->getMembersObject()->isAssigned($user_id)) { + continue; + } + $this->object->getMembersObject()->add($user_id, ilParticipants::IL_CRS_MEMBER); + //$this->object->getMembersObject()->sendNotification($this->object->getMembersObject()->NOTIFY_ACCEPT_USER,$user_id); + $waiting_list->removeFromList($user_id); + + $this->object->checkLPStatusSync($user_id); + + $now++; + if ($now >= $max) { + break; + } + } + } + } + } + // seminar-patch: end } // END class.ilObjCourseGUI diff --git a/Services/AdvancedMetaData/classes/Record/class.ilAdvancedMDRecordGUI.php b/Services/AdvancedMetaData/classes/Record/class.ilAdvancedMDRecordGUI.php index e7a26aba4fc0..dd5d9cfbef35 100644 --- a/Services/AdvancedMetaData/classes/Record/class.ilAdvancedMDRecordGUI.php +++ b/Services/AdvancedMetaData/classes/Record/class.ilAdvancedMDRecordGUI.php @@ -153,11 +153,24 @@ public function setRefId(int $a_ref_id): void { $this->ref_id = $a_ref_id; } + // seminar-patch: begin + protected bool $form_enable_section_headers = false; + /** @var array{"search_whitelist"?: list}|null */ + protected ?array $form_additional = null; - public function setPropertyForm(ilPropertyFormGUI $form): void - { + /** + * @param array{"search_whitelist"?: list}|null $a_additional + */ + public function setPropertyForm( + ilPropertyFormGUI $form, + bool $a_enable_section_headers = true, + ?array $a_additional = null + ): void { $this->form = $form; + $this->form_enable_section_headers = $a_enable_section_headers; + $this->form_additional = $a_additional; } + // seminar-patch: end /** * Set values for search form @@ -357,13 +370,24 @@ private function parseSearch(): void continue; } + // seminar-patch: begin + if ($this->form_enable_section_headers) { $record_translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId($record->getRecordId()); $section = new ilFormSectionHeaderGUI(); $section->setTitle($record_translations->getTitleForLanguage($this->user->getLanguage())); $section->setInfo($record_translations->getDescriptionForLanguage($this->user->getLanguage())); $this->form->addItem($section); + } + // seminar-patch: end foreach ($fields as $field) { + // seminar-patch: begin + if (is_array($this->form_additional) && array_key_exists('search_whitelist', $this->form_additional)) { + if (!in_array($field->getFieldId(), $this->form_additional['search_whitelist'])) { + continue; + } + } + // seminar-patch: end $field_translations = ilAdvancedMDFieldTranslations::getInstanceByRecordId($record->getRecordId()); $field_form = ilADTFactory::getInstance()->getSearchBridgeForDefinitionInstance( diff --git a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php index 18bc785b7400..87d54aea8beb 100644 --- a/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php +++ b/Services/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php @@ -152,7 +152,9 @@ public function hasComplexOptions(): bool return true; } - protected function getADTForOption(string $a_option): ilADT + // seminar-patch: begin + public function getADTForOption(string $a_option): ilADT + // seminar-patch: end { $adt = ilADTFactory::getInstance()->getInstanceByDefinition($this->getADTGroup()); if (array_key_exists($a_option, $this->complex)) { diff --git a/Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php b/Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php index fc9ea45a447f..0420887ef9f4 100644 --- a/Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php +++ b/Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php @@ -1012,7 +1012,9 @@ protected function parseSearchObjects(array $a_records, array $a_object_types): return $res; } - public function searchSubObjects(ilADTSearchBridge $a_adt_search, int $a_obj_id, string $sub_obj_type): array + // seminar-patch: begin + public function searchSubObjects(ilADTSearchBridge $a_adt_search, ?int $a_obj_id = null, ?string $sub_obj_type = null): array + // seminar-patch: end { $element_id = ilADTActiveRecordByType::SINGLE_COLUMN_NAME; @@ -1032,10 +1034,12 @@ public function searchSubObjects(ilADTSearchBridge $a_adt_search, int $a_obj_id, if (sizeof($objects)) { $res = array(); foreach ($objects as $item) { - if ($item["obj_id"] == $a_obj_id && - $item["sub_type"] == $sub_obj_type) { + // seminar-patch: begin + if ((!$a_obj_id || $item["obj_id"] == $a_obj_id) && + (!$sub_obj_type || $item["sub_type"] == $sub_obj_type)) { $res[] = $item["sub_id"]; } + // seminar-patch: end } return $res; } diff --git a/Services/InfoScreen/classes/class.ilInfoScreenGUI.php b/Services/InfoScreen/classes/class.ilInfoScreenGUI.php index b953069942ea..c304fd500d54 100644 --- a/Services/InfoScreen/classes/class.ilInfoScreenGUI.php +++ b/Services/InfoScreen/classes/class.ilInfoScreenGUI.php @@ -55,6 +55,9 @@ class ilInfoScreenGUI public string $form_action; protected bool $booking_enabled = false; protected bool $availability_enabled = true; + // seminar-patch: begin + public bool $suppress_object_info = false; + // seminar-patch: end protected bool $hidden = false; protected array $section = []; protected array $block_property = []; @@ -425,7 +428,11 @@ public function addObjectSections(): void $ilUser = $this->user; $ilAccess = $this->access; $tree = $this->tree; - + // seminar-patch: begin + if ($this->suppress_object_info) { + return; + } + // seminar-patch: end // resource bookings if ($this->booking_enabled) { $booking_adapter = new ilBookingInfoScreenAdapter($this); diff --git a/Services/Membership/classes/class.ilMemberAgreementGUI.php b/Services/Membership/classes/class.ilMemberAgreementGUI.php index 43227e44f0b7..32143293c205 100644 --- a/Services/Membership/classes/class.ilMemberAgreementGUI.php +++ b/Services/Membership/classes/class.ilMemberAgreementGUI.php @@ -184,8 +184,18 @@ public static function addCustomFields( $cdf->setValue($lng->txt($a_type . '_ps_cdf_info')); $cdf->setRequired(true); } - + // seminar-patch: begin + $numFields = 0; + // seminar-patch: end foreach ($cdf_fields as $field_obj) { + // seminar-patch: begin + if ($a_mode !== 'edit' && + self::shouldHideCertainFields() && + in_array($field_obj->getName(), self::getHiddenFields())) { + continue; + } + $numFields++; + // seminar-patch: end switch ($field_obj->getType()) { case ilCourseDefinedFieldDefinition::IL_CDF_TYPE_SELECT: @@ -246,6 +256,11 @@ public static function addCustomFields( break; } } + // seminar-patch: begin + if ($numFields === 0) { + return $form; + } + // seminar-patch: end if ($a_mode === 'user') { $form->addItem($cdf); } @@ -304,7 +319,11 @@ public static function setCourseDefinedFieldValues( if (!$current_value) { continue; } - + // seminar-patch: begin + if (!$form->getItemByPostVar('cdf_' . $field_obj->getId())) { + continue; + } + // seminar-patch: end switch ($field_obj->getType()) { case ilCourseDefinedFieldDefinition::IL_CDF_TYPE_SELECT: @@ -409,4 +428,31 @@ private function sendInfoMessage(): void $this->tpl->setOnScreenMessage('failure', $message); } } + // seminar-patch: begin + + /** + * @var null|list + */ + protected static ?array $hidden_fields = null; + + public static function shouldHideCertainFields(): bool + { + return count(self::getHiddenFields()) > 0; + } + + /** + * @return list + */ + public static function getHiddenFields(): array + { + global $DIC; + + if (self::$hidden_fields === null) { + $fieldNames = (string) $DIC['ilClientIniFile']->readVariable('seminar', 'hidden_crs_usr_fields'); + self::$hidden_fields = array_filter(array_map('trim', explode(',', $fieldNames))); + } + + return self::$hidden_fields; + } + // seminar-patch: end } diff --git a/Services/Membership/classes/class.ilMembershipRegistrationCodeUtils.php b/Services/Membership/classes/class.ilMembershipRegistrationCodeUtils.php index 6f6fd1aeed9e..c8aeb040e7dc 100644 --- a/Services/Membership/classes/class.ilMembershipRegistrationCodeUtils.php +++ b/Services/Membership/classes/class.ilMembershipRegistrationCodeUtils.php @@ -100,7 +100,18 @@ protected static function useCode(string $a_code, int $a_endnode): void if (in_array(ilObject::_lookupObjId($ref_id), $obj_ids)) { $member_obj = ilObjectFactory::getInstanceByRefId($ref_id, false); if ($member_obj instanceof ilObjCourse) { + // seminar-patch: begin + $part = ilCourseParticipants::_getInstanceByObjId($member_obj->getId()); + $wasAssignedBefore = $part->isAssigned($ilUser->getId()); + // seminar-patch: end $member_obj->register($ilUser->getId(), ilCourseConstants::CRS_MEMBER); + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + if (!$wasAssignedBefore) { + ilBookingProcessesUtils::LearnerLinksIntoCourse($ilUser->getId(), $ref_id); + } + } + // seminar-patch: end } if ($member_obj instanceof ilObjGroup) { $member_obj->register($ilUser->getId(), ilParticipants::IL_GRP_MEMBER, true); diff --git a/Services/Membership/classes/class.ilParticipant.php b/Services/Membership/classes/class.ilParticipant.php index a5b7fe8e0f82..05fc54aced96 100644 --- a/Services/Membership/classes/class.ilParticipant.php +++ b/Services/Membership/classes/class.ilParticipant.php @@ -372,9 +372,30 @@ public function add(int $a_usr_id, int $a_role): bool 'role_id' => $a_role ) ); + // seminar-patch: begin + $this->handleAgreements($a_usr_id); + // seminar-patch: end return true; } + // seminar-patch: begin + protected function handleAgreements(int $a_usr_id): void + { + global $DIC; + if ( + !$DIC['ilClientIniFile']->groupExists('seminar') || + !$DIC['ilClientIniFile']->variableExists('seminar', 'crs_agr_auto_accept') || + 1 === (int) $DIC['ilClientIniFile']->readVariable('seminar', 'crs_agr_auto_accept') + ) { + $agreement = new ilMemberAgreement($a_usr_id, $this->obj_id); + if (!$agreement->isAccepted()) { + $agreement->setAcceptanceTime(time()); + $agreement->setAccepted(true); + $agreement->save(); + } + } + } + // seminar-patch: end public function delete(int $a_usr_id): void { $this->recommended_content_manager->removeObjectRecommendation($a_usr_id, $this->ref_id); diff --git a/Services/Membership/classes/class.ilParticipants.php b/Services/Membership/classes/class.ilParticipants.php index fda13df2676a..3b92e05a8961 100644 --- a/Services/Membership/classes/class.ilParticipants.php +++ b/Services/Membership/classes/class.ilParticipants.php @@ -858,9 +858,30 @@ public function add(int $a_usr_id, int $a_role): bool 'role_id' => $a_role ) ); + // seminar-patch: begin + $this->handleAgreements($a_usr_id); + // seminar-patch: end return true; } + // seminar-patch: begin + protected function handleAgreements(int $a_usr_id): void + { + global $DIC; + if ( + !$DIC['ilClientIniFile']->groupExists('seminar') || + !$DIC['ilClientIniFile']->variableExists('seminar', 'crs_agr_auto_accept') || + 1 === (int) $DIC['ilClientIniFile']->readVariable('seminar', 'crs_agr_auto_accept') + ) { + $agreement = new ilMemberAgreement($a_usr_id, $this->obj_id); + if (!$agreement->isAccepted()) { + $agreement->setAcceptanceTime(time()); + $agreement->setAccepted(true); + $agreement->save(); + } + } + } + // seminar-patch: end /** * @param int[] */ diff --git a/Services/Membership/classes/class.ilRegistrationGUI.php b/Services/Membership/classes/class.ilRegistrationGUI.php index 8c48bd7642b4..382fca8054b7 100644 --- a/Services/Membership/classes/class.ilRegistrationGUI.php +++ b/Services/Membership/classes/class.ilRegistrationGUI.php @@ -127,7 +127,11 @@ protected function leaveWaitingList(): void { $this->getWaitingList()->removeFromList($this->user->getId()); $parent = $this->tree->getParentId($this->container->getRefId()); - + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + ilBookingProcessesUtils::LearnerRetractsFreeFromWaitingList($this->user->getId(), $this->container->getRefId()); + } + // seminar-patch: end $message = sprintf( $this->lng->txt($this->container->getType() . '_removed_from_waiting_list'), $this->container->getTitle() @@ -234,6 +238,13 @@ protected function fillAgreement(): void ilMemberAgreementGUI::addExportFieldInfo($this->form, $this->obj_id, $this->type); ilMemberAgreementGUI::addCustomFields($this->form, $this->obj_id, $this->type); + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + if (strtolower($this->ctrl->getCmdClass() ?? '') !== strtolower(ilCourseBookingUIHookGUI::class)) { + ilMemberAgreementGUI::setCourseDefinedFieldValues($this->form, $this->obj_id, $this->user->getId()); + } + } + // seminar-patch: end // Checkbox agreement if ($this->privacy->confirmationRequired($this->type)) { @@ -260,7 +271,17 @@ protected function showCustomFields(): void $cdf = new ilNonEditableValueGUI($this->lng->txt('ps_crs_user_fields')); $cdf->setValue($this->lng->txt($this->type . '_ps_cdf_info')); $cdf->setRequired(true); + // seminar-patch: begin + $numFields = 0; + // seminar-patch: end foreach ($cdf_fields as $field_obj) { + // seminar-patch: begin + if (ilMemberAgreementGUI::shouldHideCertainFields() && + in_array($field_obj->getName(), ilMemberAgreementGUI::getHiddenFields())) { + continue; + } + $numFields++; + // seminar-patch: end switch ($field_obj->getType()) { case ilCourseDefinedFieldDefinition::IL_CDF_TYPE_SELECT: $select = new ilSelectInputGUI($field_obj->getName(), 'cdf[' . $field_obj->getId() . ']'); @@ -311,6 +332,12 @@ protected function validateCustomFields(): bool $required_fullfilled = true; $value = ''; foreach (ilCourseDefinedFieldDefinition::_getFields($this->container->getId()) as $field_obj) { + // seminar-patch: begin + if (ilMemberAgreementGUI::shouldHideCertainFields() && + in_array($field_obj->getName(), ilMemberAgreementGUI::getHiddenFields())) { + continue; + } + // seminar-patch: end switch ($field_obj->getType()) { case ilCourseDefinedFieldDefinition::IL_CDF_TYPE_SELECT: $cdf_value = $this->http->wrapper()->post()->retrieve( @@ -349,10 +376,29 @@ protected function validateCustomFields(): bool ); break; } - - $course_user_data = new ilCourseUserData($this->user->getId(), $field_obj->getId()); - $course_user_data->setValue($value); - $course_user_data->update(); + // seminar-patch: begin + if (isset($_SESSION['post_vars']) && + is_array($_SESSION['post_vars']) && + array_key_exists('id', $_SESSION['post_vars']) && + is_array($_SESSION['post_vars']['id'])) { + foreach ($_SESSION['post_vars']['id'] as $usr_id) { + $course_user_data = new ilCourseUserData((int) $usr_id, $field_obj->getId()); + $course_user_data->setValue($value); + $course_user_data->update(); + } + } elseif (isset($_SESSION['employee_bookings']) && + is_array($_SESSION['employee_bookings'])) { + foreach ($_SESSION['employee_bookings'] as $usr_id) { + $course_user_data = new ilCourseUserData((int) $usr_id, $field_obj->getId()); + $course_user_data->setValue($value); + $course_user_data->update(); + } + } else { + $course_user_data = new ilCourseUserData($this->user->getId(), $field_obj->getId()); + $course_user_data->setValue($value); + $course_user_data->update(); + } + // seminar-patch: end // #14220 if ($field_obj->isRequired() && $value === "") { @@ -399,16 +445,51 @@ public function show(?ilPropertyFormGUI $form = null): void $this->tpl->setContent($this->form->getHTML()); } + // seminar-patch: begin + public function getHTML(): string + { + return $this->initForm()->getHTML(); + } + + // seminar-patch: end public function join(): void { $form = $this->initForm(); if (!$form->checkInput() || !$this->validate()) { $form->setValuesByPost(); + // seminar-patch: begin if ($this->join_error) { - $this->tpl->setOnScreenMessage('failure', $this->join_error); + $message = $this->join_error; } else { - $this->tpl->setOnScreenMessage('failure', $this->lng->txt('err_check_input')); + $message = $this->lng->txt('err_check_input'); } + + if (isset($_SESSION['post_vars']['id']) || + ( + isset($_SESSION['employee_bookings']) && + is_array($_SESSION['employee_bookings']) + ) + ) { + global $DIC; + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + ilSession::set('EmployeeBookings.confirmBooking.post', $this->http->request()->getParsedBody()); + + $this->tpl->setOnScreenMessage('failure', $message, true); + + $this->ctrl->setParameterByClass( + ilCourseBookingUIHookGUI::class, + 'ref_id', + $this->container->getRefId() + ); + + $this->ctrl->redirectByClass( + [ilUIPluginRouterGUI::class, ilCourseBookingUIHookGUI::class], + 'EmployeeBookings.failedConfirmBooking' + ); + } + } + $this->tpl->setOnScreenMessage('failure', $message); + // seminar-patch: end $this->show($form); return; } @@ -456,18 +537,24 @@ protected function initForm(): ilPropertyFormGUI */ protected function addCommandButtons(): void { + // seminar-patch: begin + $bookingForEmployees = ( + isset($_SESSION['employee_bookings']) && + is_array($_SESSION['employee_bookings']) + ); if ( $this->isRegistrationPossible() && $this->isWaitingListActive() && - !$this->getWaitingList()->isOnList($this->user->getId()) + (!$this->getWaitingList()->isOnList($this->user->getId()) || $bookingForEmployees) ) { $this->form->addCommandButton('join', $this->lng->txt('mem_add_to_wl')); $this->form->addCommandButton('cancel', $this->lng->txt('cancel')); - } elseif ($this->isRegistrationPossible() && !$this->getWaitingList()->isOnList($this->user->getId())) { + } elseif ($this->isRegistrationPossible() && + (!$this->getWaitingList()->isOnList($this->user->getId()) || $bookingForEmployees)) { $this->form->addCommandButton('join', $this->lng->txt('join')); $this->form->addCommandButton('cancel', $this->lng->txt('cancel')); } - if ($this->getWaitingList()->isOnList($this->user->getId())) { + if (!$bookingForEmployees && $this->getWaitingList()->isOnList($this->user->getId())) { $this->tpl->setOnScreenMessage('question', sprintf( $this->lng->txt($this->container->getType() . '_cancel_waiting_list'), $this->container->getTitle() @@ -475,6 +562,7 @@ protected function addCommandButtons(): void $this->form->addCommandButton('leaveWaitingList', $this->lng->txt('leave_waiting_list')); $this->form->addCommandButton('cancel', $this->lng->txt('cancel')); } + // seminar-patch: end } protected function updateSubscriptionRequest(): void diff --git a/Services/Object/classes/class.ilObjectListGUI.php b/Services/Object/classes/class.ilObjectListGUI.php index 50326386cd58..4cf738e0819a 100644 --- a/Services/Object/classes/class.ilObjectListGUI.php +++ b/Services/Object/classes/class.ilObjectListGUI.php @@ -905,7 +905,18 @@ public function getProperties(): array } // END WebDAV Display warning for invisible files and files with special characters } - + // seminar-patch: begin + // user interface plugin slot (not used for HTML transformation?!) + $uip = new ilUIHookProcessor( + 'Services/Object', + 'object_list_gui', + [ + 'object_list_gui' => $this, + 'obj_id' => $this->obj_id + ] + ); + $uip->getHTML(''); + // seminar-patch: end return $props; } diff --git a/Services/Tracking/classes/repository_statistics/class.ilTrMatrixTableGUI.php b/Services/Tracking/classes/repository_statistics/class.ilTrMatrixTableGUI.php index ab0880e509cf..4c9e2e065199 100644 --- a/Services/Tracking/classes/repository_statistics/class.ilTrMatrixTableGUI.php +++ b/Services/Tracking/classes/repository_statistics/class.ilTrMatrixTableGUI.php @@ -17,6 +17,10 @@ * *********************************************************************/ +//seminar-patch: begin +use ILIAS\Plugin\CourseBooking\Controller\LearningProgress\LearningProgressCourseController; + +//seminar-patch: end /** * name table * @author Jörg Lützenkirchen @@ -160,6 +164,27 @@ public function __construct( $this->setExportFormats(array(self::EXPORT_CSV, self::EXPORT_EXCEL)); } + //seminar-patch: begin + public function getSelectedColumns() : array + { + $selected = parent::getSelectedColumns(); + try { + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + global $DIC; + $coreController = new ilCourseBookingUIHookGUI(); + $coreController->setPluginObject(ilCourseBookingPlugin::getInstance()); + if (!$coreController->getPluginObject() || !$coreController->getPluginObject()->isActive()) { + return $selected; + } + $lpCourseController = new LearningProgressCourseController($coreController, $DIC); + $selected = $lpCourseController->modifyMatrixViewSelectedColumns($this->ref_id, $selected); + } + } catch (Throwable $e) { + } + return $selected; + } + //seminar-patch: end + public function initFilter(): void { $item = $this->addFilterItemByMetaType( diff --git a/Services/User/classes/class.ilObjUser.php b/Services/User/classes/class.ilObjUser.php index ded20db64179..335c672a4a25 100755 --- a/Services/User/classes/class.ilObjUser.php +++ b/Services/User/classes/class.ilObjUser.php @@ -1195,6 +1195,11 @@ public function delete(): bool // delete object data parent::delete(); + // seminar-patch: begin + if (ilUtil::hasActivePlugin('Services', 'UIComponent', 'uihk', 'CourseBooking')) { + ilBookingProcessesUtils::deleteAllProcessInstancesForUser($this->getId()); + } + // seminar-patch: end return true; } diff --git a/Services/User/classes/class.ilUserUtil.php b/Services/User/classes/class.ilUserUtil.php index 1dda254092f9..1eed20c5d8f5 100755 --- a/Services/User/classes/class.ilUserUtil.php +++ b/Services/User/classes/class.ilUserUtil.php @@ -204,6 +204,17 @@ public static function getProfileLink(int $a_usr_id): string public static function getStartingPointAsUrl(): string { global $DIC; + // seminar-patch: begin + $authMode = $DIC->user()->getAuthMode() ?? ''; + if (str_starts_with($authMode, 'ldap') && + $DIC['ilClientIniFile']->variableExists('login', 'ldap_starting_point_ref_id')) { + return ilLink::_getStaticLink( + (int) $DIC['ilClientIniFile']->readVariable('login', 'ldap_starting_point_ref_id'), + '', + true + ); + } + // seminar-patch: end $starting_point_repository = new ilUserStartingPointRepository( $DIC['ilUser'], $DIC['ilDB'], diff --git a/Services/Utilities/classes/class.ilUtil.php b/Services/Utilities/classes/class.ilUtil.php index 68d161eb1e5d..b7fd3a4c6e63 100755 --- a/Services/Utilities/classes/class.ilUtil.php +++ b/Services/Utilities/classes/class.ilUtil.php @@ -1480,4 +1480,60 @@ public static function formatSize(int $size, string $a_mode = 'short', ?ilLangua return $result; } + // seminar-patch: begin + /** @var array>>> */ + private static array $activePluginsCheckCache = []; + /** @var array>>> */ + private static array $activePluginsCache = []; + + public static function hasActivePlugin(string $type, string $component, string $slot, string $plugin_class): bool + { + global $DIC; + + if (isset(self::$activePluginsCheckCache[$type][$component][$slot][$plugin_class])) { + return self::$activePluginsCheckCache[$type][$component][$slot][$plugin_class]; + } + + /** @var ilComponentRepository $component_repository */ + $component_repository = $DIC['component.repository']; + + $has_plugin = $component_repository->getComponentByTypeAndName( + $type, + $component + )->getPluginSlotById($slot)->hasPluginName($plugin_class); + + if ($has_plugin) { + $plugin_info = $component_repository->getComponentByTypeAndName( + $type, + $component + )->getPluginSlotById($slot)->getPluginByName($plugin_class); + $has_plugin = $plugin_info->isActive(); + } + + return (self::$activePluginsCheckCache[$type][$component][$slot][$plugin_class] = $has_plugin); + } + + public static function getPlugin(string $type, string $component, string $slot, string $plugin_class): ilPlugin + { + global $DIC; + + if (isset(self::$activePluginsCache[$type][$component][$slot][$plugin_class])) { + return self::$activePluginsCache[$type][$component][$slot][$plugin_class]; + } + + /** @var ilComponentRepository $component_repository */ + $component_repository = $DIC['component.repository']; + /** @var ilComponentFactory $component_factory */ + $component_factory = $DIC['component.factory']; + + $plugin_info = $component_repository->getComponentByTypeAndName( + $type, + $component + )->getPluginSlotById($slot)->getPluginByName($plugin_class); + + $plugin = $component_factory->getPlugin($plugin_info->getId()); + + return (self::$activePluginsCache[$type][$component][$slot][$plugin_class] = $plugin); + } + // seminar-patch: end } diff --git a/setup/sql/dbupdate_custom.php b/setup/sql/dbupdate_custom.php new file mode 100644 index 000000000000..7207181c9de4 --- /dev/null +++ b/setup/sql/dbupdate_custom.php @@ -0,0 +1,868 @@ +<#1> + +<#2> +tableColumnExists('booking_reservation', 'parent_ref_id')) { + $ilDB->addTableColumn('booking_reservation', 'parent_ref_id', array( + "type" => "integer", + "notnull" => false, + "length" => 4 + )); +} +*/ +?> +<#3> +tableColumnExists('crs_settings', 'crs_start')) { + $ilDB->addTableColumn('crs_settings', 'crs_start', array( + "type" => "integer", + "notnull" => false, + "length" => 4 + )); +} +if (!$ilDB->tableColumnExists('crs_settings', 'crs_end')) { + $ilDB->addTableColumn('crs_settings', 'crs_end', array( + "type" => "integer", + "notnull" => false, + "length" => 4 + )); +} +*/ +?> +<#4> +tableColumnExists('crs_settings', 'leave_end')) { + $ilDB->addTableColumn('crs_settings', 'leave_end', array( + "type" => "integer", + "notnull" => false, + "length" => 4 + )); +} +*/ +?> +<#5> +tableColumnExists('crs_settings', 'auto_wait')) { + $ilDB->addTableColumn('crs_settings', 'auto_wait', array( + "type" => "integer", + "notnull" => true, + "length" => 1, + "default" => 0 + )); +} +*/ +?> +<#6> +tableColumnExists('crs_settings', 'min_members')) { + $ilDB->addTableColumn('crs_settings', 'min_members', array( + "type" => "integer", + "notnull" => false, + "length" => 2 + )); +} +*/ +?> +<#7> +getStructure(); +?> +<#8> +tableColumnExists('crs_settings', 'cancel_end_noti')) + { + $ilDB->addTableColumn('crs_settings', 'cancel_end_noti', array( + "type" => "integer", + "notnull" => false, + "length" => 4 + )); + } + */ +?> +<#9> +tableColumnExists('grp_settings', 'registration_min_members')) { + $ilDB->addTableColumn('grp_settings', 'registration_min_members', array( + "type" => "integer", + "notnull" => false, + "length" => 2 + )); +} +*/ +?> +<#10> +tableColumnExists('grp_settings', 'leave_end')) { + $ilDB->addTableColumn('grp_settings', 'leave_end', array( + "type" => "integer", + "notnull" => false, + "length" => 4 + )); +} +*/ +?> +<#11> +tableColumnExists('grp_settings', 'cancel_end_noti')) + { + $ilDB->addTableColumn('grp_settings', 'cancel_end_noti', array( + "type" => "integer", + "notnull" => false, + "length" => 4 + )); + } + */ +?> +<#12> +tableColumnExists('event', 'reg_min_users')) { + $ilDB->addTableColumn('event', 'reg_min_users', array( + "type" => "integer", + "notnull" => false, + "length" => 2 + )); +} +*/ +?> +<#13> +tableColumnExists('obj_members', 'booking_status')) { + $ilDB->addTableColumn( + 'obj_members', + 'booking_status', + array( + 'type' => 'text', + 'notnull' => false, + 'length' => 255 + ) + ); +} +if (!$ilDB->tableColumnExists('obj_members', 'participation_status')) { + $ilDB->addTableColumn( + 'obj_members', + 'participation_status', + array( + 'type' => 'text', + 'notnull' => false, + 'length' => 255, + 'default' => 'not_set' + ) + ); +} +?> +<#14> +tableColumnExists('adv_mdf_definition', 'field_values')) { + $ilDB->modifyTableColumn( + 'adv_mdf_definition', + 'field_values', + array( + 'type' => 'clob' + ) + ); +} +?> +<#15> +manipulateF( + 'UPDATE adv_mdf_definition SET field_type = %s WHERE field_type = %s', + ['integer', 'integer'], + [99, 9] +); +?> +<#16> +tableColumnExists('crs_settings', 'period_time_indication')) { + $ilDB->addTableColumn( + 'crs_settings', + 'period_time_indication', + [ + 'type' => \ilDBConstants::T_INTEGER, + 'notnull' => true, + 'default' => 0 + ] + ); +} +*/ +// END PATCH: 15.01.20 seminar date-duration +?> +<#17> +tableColumnExists('crs_settings', 'period_start')) { + $ilDB->addTableColumn( + 'crs_settings', + 'period_start', + [ + 'type' => \ilDBConstants::T_TIMESTAMP, + 'notnull' => false, + 'default' => null + ] + ); + $ilDB->addTableColumn( + 'crs_settings', + 'period_end', + [ + 'type' => \ilDBConstants::T_TIMESTAMP, + 'notnull' => false, + 'default' => null + ] + ); +} + +$query = 'select obj_id, crs_start, crs_end from crs_settings where crs_start IS NOT NULL or crs_end IS NOT NULL'; +$res = $ilDB->query($query); +while ($row = $res->fetchRow(\ilDBConstants::FETCHMODE_OBJECT)) { + $dtstart = $dtend = null; + if ($row->crs_start != null) { + $start = new DateTime(); + $start->setTimezone(new DateTimeZone('UTC')); + $start->setTimestamp((int) $row->crs_start); + $dtstart = $start->format('Y-m-d'); + } + if ($row->crs_end != null) { + $end = new DateTime(); + $end->setTimezone(new DateTimeZone('UTC')); + $end->setTimestamp((int) $row->crs_end); + $dtend = $end->format('Y-m-d'); + } + + $query = 'update crs_settings set ' . + 'period_start = ' . $ilDB->quote($dtstart, \ilDBConstants::T_TIMESTAMP) . ', ' . + 'period_end = ' . $ilDB->quote($dtend, \ilDBConstants::T_TIMESTAMP) . ' ' . + 'where obj_id = ' . $ilDB->quote($row->obj_id, \ilDBConstants::T_INTEGER); + $ilDB->manipulate($query); + } +} +*/ +// END PATCH: 21.01.20 seminar date-duration +?> +<#18> +tableExists("book_obj_use_book")) { + $fields = array( + "obj_id" => array( + "type" => "integer", + "notnull" => true, + "length" => 4, + "default" => 0 + ), + "book_obj_id" => array( + "type" => "integer", + "notnull" => true, + "length" => 4, + "default" => 0 + ) + ); + $ilDB->createTable("book_obj_use_book", $fields); +} +*/ +?> +<#19> +addPrimaryKey("book_obj_use_book", array("obj_id", "book_obj_id")); +*/ +?> +<#20> +tableColumnExists('booking_reservation', 'context_obj_id')) { + $ilDB->addTableColumn( + 'booking_reservation', + 'context_obj_id', + array( + 'type' => 'integer', + 'length' => 1, + 'notnull' => false, + 'default' => 0 + )); +} +*/ +?> +<#21> +dropTableColumn('booking_reservation', 'context_obj_id'); + +if (!$ilDB->tableColumnExists('booking_reservation', 'context_obj_id')) { + $ilDB->addTableColumn( + 'booking_reservation', + 'context_obj_id', + array( + 'type' => 'integer', + 'length' => 4, + 'notnull' => false, + 'default' => 0 + )); +} +*/ +?> +<#22> +renameTableColumn('book_obj_use_book', "book_obj_id", 'book_ref_id'); +*/ +?> +<#23> +get("default"); + +if (!$ilDB->tableExists('booking_preferences')) { + $query = ' + SELECT od.obj_id, objr.ref_id + FROM object_data od + INNER JOIN object_reference objr ON objr.obj_id = od.obj_id + INNER JOIN tree t ON t.child = objr.ref_id + WHERE od.type = ' . $ilDB->quote('crs', 'text'); + + $res = $ilDB->query($query); + while ($row = $ilDB->fetchAssoc($res)) { + $parentRefId = (int) $row['ref_id']; + $contextObjId = (int) $row['obj_id']; + + $ilDB->manipulateF( + 'UPDATE booking_reservation SET context_obj_id = %s WHERE parent_ref_id = %s', + ['integer', 'integer'], + [$contextObjId, $parentRefId] + ); + } + + if ($globalPoolRefId) { + $query = " + SELECT od.obj_id, " . ((int) $globalPoolRefId) . " + FROM object_data od + INNER JOIN object_reference objr ON objr.obj_id = od.obj_id + INNER JOIN tree t ON t.child = objr.ref_id + LEFT JOIN book_obj_use_book ON book_obj_use_book.obj_id = od.obj_id + WHERE book_obj_use_book.obj_id IS NULL AND od.type = " . $ilDB->quote('crs', 'text'); + + $ilDB->manipulate( + 'INSERT INTO book_obj_use_book (obj_id, book_ref_id)' . + '(' . $query . ')' + ); + } + + + $query = " + SELECT od.obj_id, 'cont_bookings', 1 + FROM object_data od + INNER JOIN object_reference objr ON objr.obj_id = od.obj_id + INNER JOIN tree t ON t.child = objr.ref_id + LEFT JOIN container_settings + ON container_settings.id = od.obj_id + AND container_settings.keyword = " . $ilDB->quote('cont_bookings', 'text') . " + WHERE container_settings.id IS NULL AND od.type = " . $ilDB->quote('crs', 'text'); + + $ilDB->manipulate( + 'INSERT INTO container_settings (id, keyword, value)' . + '(' . $query . ')' + ); +} +*/ +?> +<#24> +get('asked_for_migration', false)) { + echo "
+        Dear Administrator,
+
+        DO NOT REFRESH THIS PAGE UNLESS YOU HAVE READ THE FOLLOWING INSTRUCTIONS
+
+        Did you check the 'Booking Pool for Courses' (see: https://docu.ilias.de/goto_docu_wiki_wpage_5722_1357.html) migration was successful?
+
+        * There should be a record for every existing ILIAS course in table `book_obj_use_book`
+        * There should be a record with `key` = 'cont_bookings' for every existing ILIAS course in table `container_settings`
+        * The `context_obj_id` value (a course `obj_id`) of every existing course record in table `booking_reservation` should match the corresponding course `ref_id` value of the `parent_ref_id` field.
+
+
+        If you try to rerun the update process, this warning will be skipped.
+
+        Best regards,
+        The Test Maintainers
+    
"; + + $setting->set('asked_for_migration', 1); + exit(); +} + +if ($ilDB->tableColumnExists('booking_reservation', 'parent_ref_id')) { + $ilDB->dropTableColumn('booking_reservation', 'parent_ref_id'); +}*/ +?> +<#25> +delete("default");*/ +?> +<#26> +getStructure(); +?> +<#27> +tableExists('adv_md_record_int')) { + $ilDB->createTable('adv_md_record_int', [ + 'record_id' => [ + 'type' => ilDBConstants::T_INTEGER, + 'length' => 4, + 'notnull' => true + ], + 'title' => [ + 'type' => ilDBConstants::T_TEXT, + 'notnull' => false, + 'length' => 128 + ], + 'description' => [ + 'type' => ilDBConstants::T_TEXT, + 'notnull' => false, + 'length' => 4000 + ], + 'lang_code' => [ + 'type' => ilDBConstants::T_TEXT, + 'notnull' => true, + 'length' => 5 + ], + 'lang_default' => [ + 'type' => ilDBConstants::T_INTEGER, + 'length' => 1, + 'notnull' => true + ] + ]); + $ilDB->addPrimaryKey('adv_md_record_int', ['record_id', 'lang_code']); +} +*/ +?> +<#28> + +<#29> +tableExists('adv_md_field_int')) { + $ilDB->createTable('adv_md_field_int', [ + 'field_id' => [ + 'type' => ilDBConstants::T_INTEGER, + 'length' => 4, + 'notnull' => true + ], + 'title' => [ + 'type' => ilDBConstants::T_TEXT, + 'notnull' => false, + 'length' => 128 + ], + 'description' => [ + 'type' => ilDBConstants::T_TEXT, + 'notnull' => false, + 'length' => 4000 + ], + 'lang_code' => [ + 'type' => ilDBConstants::T_TEXT, + 'notnull' => true, + 'length' => 5 + ], + 'lang_default' => [ + 'type' => ilDBConstants::T_INTEGER, + 'length' => 1, + 'notnull' => true + ] + ]); + $ilDB->addPrimaryKey('adv_md_field_int', ['field_id', 'lang_code']); +} +*/ +?> +<#30> +tableColumnExists('adv_md_record_int', 'lang_default')) { + $ilDB->dropTableColumn('adv_md_record_int', 'lang_default'); +} +*/ +?> +<#31> +tableColumnExists('adv_md_field_int', 'lang_default')) { + $ilDB->dropTableColumn('adv_md_field_int', 'lang_default'); +} +*/ +?> +<#32> +tableColumnExists('adv_md_record','lang_default')) { + $ilDB->addTableColumn('adv_md_record', 'lang_default', [ + 'type' => 'text', + 'notnull' => false, + 'length' => 2, + 'default' => '' + ]); + +} +*/ +?> +<#33> +tableExists('adv_md_values_ltext')) { + $ilDB->createTable('adv_md_values_ltext', [ + 'obj_id' => [ + 'type' => 'integer', + 'length' => 4, + 'notnull' => true, + 'default' => 0 + ], + 'sub_type' => [ + 'type' => 'text', + 'length' => 10, + 'notnull' => true, + 'default' => "-" + ], + 'sub_id' => [ + 'type' => 'integer', + 'length' => 4, + 'notnull' => true, + 'default' => 0 + ], + 'field_id' => [ + 'type' => 'integer', + 'length' => 4, + 'notnull' => true, + 'default' => 0 + ], + 'value_index' => [ + 'type' => ilDBConstants::T_TEXT, + 'length' => 16, + 'notnull' => true, + ], + 'value' => [ + 'type' => ilDBConstants::T_TEXT, + 'length' => 4000, + 'notnull' => false + ] + ]); + + $ilDB->addPrimaryKey('adv_md_values_ltext', array('obj_id', 'sub_type', 'sub_id', 'field_id', 'value_index')); +} +*/ +?> +<#34> +tableExists('adv_md_values_enum')) { + $ilDB->createTable('adv_md_values_enum', [ + 'obj_id' => [ + 'type' => 'integer', + 'length' => 4, + 'notnull' => true, + 'default' => 0 + ], + 'sub_type' => [ + 'type' => 'text', + 'length' => 10, + 'notnull' => true, + 'default' => "-" + ], + 'sub_id' => [ + 'type' => 'integer', + 'length' => 4, + 'notnull' => true, + 'default' => 0 + ], + 'field_id' => [ + 'type' => 'integer', + 'length' => 4, + 'notnull' => true, + 'default' => 0 + ], + 'disabled' => [ + 'type' => 'integer', + 'length' => 1, + 'notnull' => true, + 'default' => 0 + ], + 'value_index' => [ + 'type' => ilDBConstants::T_TEXT, + 'length' => 16, + 'notnull' => true, + ] + ]); + + $ilDB->addPrimaryKey('adv_md_values_enum', array('obj_id', 'sub_type', 'sub_id', 'field_id', 'value_index')); +} +*/ +?> +<#35> +query($query); +while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) { + $values = unserialize($row->field_values); + if (!is_array($values)) { + continue; + } + $options = $values; + + $query = 'select * from adv_md_values_text ' . + 'where field_id = ' . $ilDB->quote($row->field_id, ilDBConstants::T_INTEGER); + $val_res = $ilDB->query($query); + while ($val_row = $val_res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) { + + $query = 'select * from adv_md_values_enum ' . + 'where obj_id = ' . $ilDB->quote($val_row->obj_id, ilDBConstants::T_INTEGER) . ' ' . + 'and sub_id = ' . $ilDB->quote($val_row->sub_id, ilDBConstants::T_INTEGER) . ' ' . + 'and sub_type = ' . $ilDB->quote($val_row->sub_type, ilDBConstants::T_TEXT) . ' ' . + 'and field_id = ' . $ilDB->quote($val_row->field_id, ilDBConstants::T_INTEGER); + $exists_res = $ilDB->query($query); + if ($exists_res->numRows()) { + //ilLoggerFactory::getLogger('root')->info('field_id: ' . $val_row->field_id . ' is already migrated'); + continue; + } + $current_values = []; + if (strpos($val_row->value, '~|~') === 0) { + // multi enum + $current_values = explode('~|~', $val_row->value); + array_pop($current_values); + array_shift($current_values); + + } else { + $current_values[] = (string) $val_row->value; + } + //ilLoggerFactory::getLogger('root')->dump($current_values); + $positions = []; + foreach ($current_values as $value) { + if (!strlen(trim($value))) { + continue; + } + $idx = array_search($value, $options); + if ($idx === false) { + continue; + } + $positions[] = $idx; + } + + //ilLoggerFactory::getLogger('root')->dump($positions); + foreach ($positions as $pos) { + + $query = 'insert into adv_md_values_enum (obj_id, sub_type, sub_id, field_id, value_index, disabled) ' . + 'values ( ' . + $ilDB->quote($val_row->obj_id, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($val_row->sub_type, ilDBConstants::T_TEXT) . ', ' . + $ilDB->quote($val_row->sub_id, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($val_row->field_id, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($pos, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($val_row->disabled, ilDBConstants::T_INTEGER) + . ' ) '; + $ilDB->query($query); + } + + } +} +*/ +?> +<#36> +tableExists('adv_mdf_enum')) { + $ilDB->createTable('adv_mdf_enum', [ + 'field_id' => [ + 'type' => ilDBConstants::T_INTEGER, + 'length' => 4, + 'notnull' => true, + ], + 'lang_code' => [ + 'type' => ilDBConstants::T_TEXT, + 'notnull' => true, + 'length' => 5 + ], + 'idx' => [ + 'type' => ilDBConstants::T_INTEGER, + 'length' => 4, + 'notnull' => true, + ], + 'value' => [ + 'type' => ilDBConstants::T_TEXT, + 'length' => 4000, + 'notnull' => true + ] + ]); + $ilDB->addPrimaryKey('adv_mdf_enum', array('field_id', 'lang_code', 'idx')); +} +*/ +?> +<#37> +quote('common', ilDBConstants::T_TEXT) . ' ' . + 'and keyword = ' . $ilDB->quote('language', ilDBConstants::T_TEXT); +$res = $ilDB->query($query); +$default = 'en'; +while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) { + $default = $row->value; +} +$query = 'update adv_md_record set lang_default = ' . $ilDB->quote($default, ilDBConstants::T_TEXT) . ' ' . + 'where lang_default IS NULL'; +$ilDB->query($query); +*/ +?> +<#38> +query($query); +while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) { + $query = 'select * from adv_md_record_int ' . + 'where record_id = ' . $ilDB->quote($row->record_id, ilDBConstants::T_INTEGER) . ' ' . + 'and lang_code = ' . $ilDB->quote($row->lang_default, ilDBConstants::T_TEXT); + $int_res = $ilDB->query($query); + if ($int_res->numRows()) { + continue; + } + $query = 'insert into adv_md_record_int (record_id, title, description, lang_code ) ' . + 'values ( ' . + $ilDB->quote($row->record_id, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($row->title, ilDBConstants::T_TEXT) . ', ' . + $ilDB->quote($row->description, ilDBConstants::T_TEXT) . ', ' . + $ilDB->quote($row->lang_default, ilDBConstants::T_TEXT) . + ')' ; + $ilDB->manipulate($query); +} +*/ +?> +<#39> +query($query); +while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) { + $query = 'select * from adv_md_field_int ' . + 'where field_id = ' . $ilDB->quote($row->field_id, ilDBConstants::T_INTEGER) . ' ' . + 'and lang_code = ' . $ilDB->quote($row->lang_default, ilDBConstants::T_TEXT); + $int_res = $ilDB->query($query); + if ($int_res->numRows()) { + continue; + } + $query = 'insert into adv_md_field_int (field_id, title, description, lang_code ) ' . + 'values ( ' . + $ilDB->quote($row->field_id, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($row->title, ilDBConstants::T_TEXT) . ', ' . + $ilDB->quote($row->description, ilDBConstants::T_TEXT) . ', ' . + $ilDB->quote($row->lang_default, ilDBConstants::T_TEXT) . + ')' ; + $ilDB->manipulate($query); +} +*/ +?> +<#40> +quote(1, ilDBConstants::T_INTEGER) . ' or ' . + 'field_type = ' . $ilDB->quote(8, ilDBConstants::T_INTEGER) . ' ) '; + +$res = $ilDB->query($query); +while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) { + + $values = unserialize($row->field_values); + if (array_key_exists('options', $values)) { + $idx = 0; + foreach ($values['options'] as $option) { + $query = 'insert into adv_mdf_enum (field_id, lang_code, idx, value ) ' . + 'values ( ' . + $ilDB->quote($row->field_id, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($row->lang_default, ilDBConstants::T_TEXT) . ', ' . + $ilDB->quote($idx++, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($option, ilDBConstants::T_TEXT). + ' ) '; + $ilDB->manipulate($query); + } + } + if (array_key_exists('option_translations', $values)) { + foreach ($values['option_translations'] as $lang => $options) { + if ($lang == $row->lang_default) { + continue; + } + $idx = 0; + foreach ($options as $option) { + $query = 'insert into adv_mdf_enum (field_id, lang_code, idx, value ) ' . + 'values ( ' . + $ilDB->quote($row->field_id, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($lang, ilDBConstants::T_TEXT) . ', ' . + $ilDB->quote($idx++, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($option, ilDBConstants::T_TEXT). + ' ) '; + $ilDB->manipulate($query); + } + } + } + if ( + !array_key_exists('options', $values) && + !array_key_exists('options_translations', $values) && + is_array($values) + ) { + $idx = 0; + foreach ($values as $option) { + $query = 'insert into adv_mdf_enum (field_id, lang_code, idx, value ) ' . + 'values ( ' . + $ilDB->quote($row->field_id, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($row->lang_default, ilDBConstants::T_TEXT) . ', ' . + $ilDB->quote($idx++, ilDBConstants::T_INTEGER) . ', ' . + $ilDB->quote($option, ilDBConstants::T_TEXT). + ' ) '; + $ilDB->manipulate($query); + } + } +} +*/ +?> +<#41> +tableColumnExists('adv_md_values_ltext', 'disabled')) { + $ilDB->addTableColumn( + 'adv_md_values_ltext', + 'disabled', + [ + 'type' => ilDBConstants::T_INTEGER, + 'notnull' => true, + 'length' => 1, + 'default' => 0 + ] + ); +} +*/ +?> +<#42> +getStructure(); +?> \ No newline at end of file From eae3cb8867387a00d8f561aaf514bbf5c303e109 Mon Sep 17 00:00:00 2001 From: mjansen Date: Tue, 20 Aug 2024 11:11:15 +0200 Subject: [PATCH 02/23] Customizing: Add workaround for repository plugins in LP settings view See: https://support.iliasnet.de/view.php?id=9325 --- .../class.ilLPCollectionSettingsTableGUI.php | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/Services/Tracking/classes/repository_statistics/class.ilLPCollectionSettingsTableGUI.php b/Services/Tracking/classes/repository_statistics/class.ilLPCollectionSettingsTableGUI.php index 0c18ddde19d3..5cbb92612f23 100644 --- a/Services/Tracking/classes/repository_statistics/class.ilLPCollectionSettingsTableGUI.php +++ b/Services/Tracking/classes/repository_statistics/class.ilLPCollectionSettingsTableGUI.php @@ -202,13 +202,22 @@ protected function fillRow(array $a_set): void ] ); } else { - $lp_settings_link = $this->ctrl->getLinkTargetByClass( - [ - ilRepositoryGUI::class, - $gui_class, - ilLearningProgressGUI::class, - ] - ); + // seminar-patch: begin + global $DIC; + + if ($DIC['objDefinition']->isPlugin($a_set['type'])) { + $lp_settings_link = ilLink::_getLink((int) $a_set['ref_id'], $a_set['type'], ['gotolp' => 1] + ); + } else { + $lp_settings_link = $this->ctrl->getLinkTargetByClass( + [ + ilRepositoryGUI::class, + $gui_class, + ilLearningProgressGUI::class, + ] + ); + } + // seminar-patch: end } $this->ctrl->clearParameterByClass( From bef996600bd07cf863735e8cb7a2700b442ae5ac Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Mon, 9 Sep 2024 17:33:50 +0200 Subject: [PATCH 03/23] MetaData: matching copyright in import/export for 9 (24498) --- .../class.ilMDCopyrightSelectionEntry.php | 92 +++++++------------ .../MetaData/classes/class.ilMDRights.php | 4 +- 2 files changed, 37 insertions(+), 59 deletions(-) diff --git a/Services/MetaData/classes/Settings/Copyright/class.ilMDCopyrightSelectionEntry.php b/Services/MetaData/classes/Settings/Copyright/class.ilMDCopyrightSelectionEntry.php index 5c9342e9a207..2b2c49676a7a 100644 --- a/Services/MetaData/classes/Settings/Copyright/class.ilMDCopyrightSelectionEntry.php +++ b/Services/MetaData/classes/Settings/Copyright/class.ilMDCopyrightSelectionEntry.php @@ -99,10 +99,8 @@ public static function lookupCopyyrightTitle(string $a_cp_string): string return $row->title ?? ''; } - public static function _lookupCopyright( - string $a_cp_string, - bool $for_export = false - ): string { + public static function _lookupCopyright(string $a_cp_string): string + { global $DIC; $renderer = new Renderer( @@ -119,71 +117,51 @@ public static function _lookupCopyright( $entry = $repository->getEntry($entry_id); $components = $renderer->toUIComponents($entry->copyrightData()); - /* - * Take icon out of the render if it comes from a file, to avoid - * file delivery links showing up in export files. - */ - if ($for_export && !$entry->copyrightData()->isImageLink()) { - foreach ($components as $id => $component) { - if ($component instanceof Icon) { - unset($components[$id]); - } - } - } - return $ui_renderer->render($components); } - public static function lookupCopyrightByText(string $copyright_text): int + public static function _lookupCopyrightForExport(string $a_cp_string): string { global $DIC; - $db = $DIC->database(); - $full_name = ''; - $link = ''; - $image_link = ''; - $alt_text = ''; - - //find the image - if (preg_match('/<\s*img((?:.|\n)*?)\/>/i', $copyright_text, $img_matches)) { - if (preg_match('/src\s*=\s*(?:"|\')(.*?)(?:"|\')/i', $img_matches[1], $src_matches)) { - $image_link = strip_tags($src_matches[1]); - } - if (preg_match('/alt\s*=\s*(?:"|\')(.*?)(?:"|\')/i', $img_matches[1], $alt_matches)) { - $alt_text = strip_tags($alt_matches[1]); - } + $repository = new DatabaseRepository($DIC->database()); + + if (!$entry_id = self::_extractEntryId($a_cp_string)) { + return $a_cp_string; } - //find the link - if (preg_match('/<\s*a((?:.|\n)[^<]*?)<\s*\/a>/i', $copyright_text, $link_matches)) { - if (preg_match('/href\s*=\s*(?:"|\')(.*?)(?:"|\')/i', $link_matches[1], $name_matches)) { - $link = strip_tags($name_matches[1]); + $data = $repository->getEntry($entry_id)->copyrightData(); + + return (string) ($data->link() ?? $data->fullName()); + } + + public static function lookupCopyrightFromImport(string $copyright_text): int + { + global $DIC; + + $repository = new DatabaseRepository($DIC->database()); + + // url should be made to match regardless of scheme + $normalized_copyright = str_replace('https://', 'http://', $copyright_text); + + $matches_by_name = null; + foreach ($repository->getAllEntries() as $entry) { + $entry_link = (string) $entry->copyrightData()->link(); + $normalized_link = str_replace('https://', 'http://', $entry_link); + if ($normalized_link !== '' && str_contains($normalized_copyright, $normalized_link)) { + return $entry->id(); } - if (preg_match('/>((?:\n|.)*)/i', $link_matches[1], $href_matches)) { - $full_name = strip_tags($href_matches[1]); + + if ( + is_null($matches_by_name) && + trim($copyright_text) === trim($entry->copyrightData()->fullName()) + ) { + $matches_by_name = $entry->id(); } - } else { - $full_name = strip_tags($copyright_text); } - /* - * Since the icon is not exported if it comes from a file, we have to be a bit - * more lenient with the matching if it's not there. - */ - if ($image_link === '' && $alt_text === '') { - $query = 'SELECT entry_id FROM il_md_cpr_selections ' . - 'WHERE full_name = ' . $db->quote($full_name, ilDBConstants::T_TEXT) . - ' AND link = ' . $db->quote($link, ilDBConstants::T_TEXT); - } else { - $query = 'SELECT entry_id FROM il_md_cpr_selections ' . - 'WHERE full_name = ' . $db->quote($full_name, ilDBConstants::T_TEXT) . - ' AND link = ' . $db->quote($link, ilDBConstants::T_TEXT) . - ' AND image_link = ' . $db->quote($image_link, ilDBConstants::T_TEXT) . - ' AND alt_text = ' . $db->quote($alt_text, ilDBConstants::T_TEXT); - } - $res = $db->query($query); - while ($row = $db->fetchObject($res)) { - return (int) $row->entry_id; + if (!is_null($matches_by_name)) { + return $matches_by_name; } return 0; } diff --git a/Services/MetaData/classes/class.ilMDRights.php b/Services/MetaData/classes/class.ilMDRights.php index 72e039c4051a..31174cb42d92 100644 --- a/Services/MetaData/classes/class.ilMDRights.php +++ b/Services/MetaData/classes/class.ilMDRights.php @@ -230,14 +230,14 @@ public function toXML(ilXmlWriter $writer): void [ 'Language' => $this->getDescriptionLanguageCode() ?: 'en' ], - ilMDCopyrightSelectionEntry::_lookupCopyright($this->getDescription(), true) + ilMDCopyrightSelectionEntry::_lookupCopyrightForExport($this->getDescription()) ); $writer->xmlEndTag('Rights'); } public function parseDescriptionFromImport(string $a_description): void { - $entry_id = ilMDCopyrightSelectionEntry::lookupCopyrightByText($a_description); + $entry_id = ilMDCopyrightSelectionEntry::lookupCopyrightFromImport($a_description); if (!$entry_id) { $this->setDescription($a_description); } else { From acb8a18e525f7a95919468abc0b2e8f5359064c5 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 9 Sep 2024 18:30:06 +0200 Subject: [PATCH 04/23] User: Fix Endless Loop on VCardExport on Portfolio See: https://mantis.ilias.de/view.php?id=41987 --- .../Profile/class.ilPublicUserProfileGUI.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Services/User/classes/Profile/class.ilPublicUserProfileGUI.php b/Services/User/classes/Profile/class.ilPublicUserProfileGUI.php index 34855c4461b2..299684e4301d 100644 --- a/Services/User/classes/Profile/class.ilPublicUserProfileGUI.php +++ b/Services/User/classes/Profile/class.ilPublicUserProfileGUI.php @@ -158,9 +158,15 @@ public function executeCommand(): string $this->tpl->loadStandardTemplate(); switch ($next_class) { + case 'ilbuddysystemgui': + $gui = new ilBuddySystemGUI(); + $this->ctrl->setReturn($this, 'view'); + $this->ctrl->forwardCommand($gui); + break; case 'ilobjportfoliogui': $portfolio_id = $this->getProfilePortfolio(); - if ($portfolio_id) { + if ($portfolio_id + && $cmd !== 'deliverVCard') { $gui = new ilObjPortfolioGUI($portfolio_id); // #11876 $gui->setAdditional($this->getAdditional()); $gui->setPermaLink($this->getUserId(), 'usr'); @@ -168,11 +174,6 @@ public function executeCommand(): string break; } // no break - case 'ilbuddysystemgui': - $gui = new ilBuddySystemGUI(); - $this->ctrl->setReturn($this, 'view'); - $this->ctrl->forwardCommand($gui); - break; default: $ret = $this->$cmd(); $this->tpl->setContent($ret); From 2bd83b43afcfb348caf841f4603176dea2e8246c Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 9 Sep 2024 20:55:42 +0200 Subject: [PATCH 05/23] Test: Fix Loading MultipleChoice & Kprim Questions See: https://mantis.ilias.de/view.php?id=41129 --- .../TestQuestionPool/classes/class.assKprimChoice.php | 10 +++++----- .../classes/class.assMultipleChoice.php | 8 ++++---- .../TestQuestionPool/classes/class.assSingleChoice.php | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Modules/TestQuestionPool/classes/class.assKprimChoice.php b/Modules/TestQuestionPool/classes/class.assKprimChoice.php index 5db1463fcac8..56131f944161 100644 --- a/Modules/TestQuestionPool/classes/class.assKprimChoice.php +++ b/Modules/TestQuestionPool/classes/class.assKprimChoice.php @@ -223,14 +223,14 @@ public function loadFromDb($questionId): void $this->setObjId($data['obj_fi']); - $this->setTitle((string) $data['title']); + $this->setTitle($data['title'] ?? ''); $this->setNrOfTries($data['nr_of_tries']); - $this->setComment((string) $data['description']); + $this->setComment($data['description'] ?? ''); $this->setAuthor($data['author']); $this->setPoints($data['points']); $this->setOwner($data['owner']); $this->setLastChange($data['tstamp']); - $this->setQuestion(ilRTE::_replaceMediaObjectImageSrc((string) $data['question_text'], 1)); + $this->setQuestion(ilRTE::_replaceMediaObjectImageSrc($data['question_text'] ?? '', 1)); $this->setShuffleAnswersEnabled((bool) $data['shuffle_answers']); @@ -290,7 +290,7 @@ private function loadAnswerData($questionId): void $answer->setPosition($data['position']); - $answer->setAnswertext(ilRTE::_replaceMediaObjectImageSrc($data['answertext'], 1)); + $answer->setAnswertext(ilRTE::_replaceMediaObjectImageSrc($data['answertext'] ?? '', 1)); $answer->setImageFile($data['imagefile']); $answer->setThumbPrefix($this->getThumbPrefix()); @@ -693,7 +693,7 @@ protected function calculateReachedPointsForSolution($found_values, $active_id = $points = 0; } } - return (float)$points; + return (float) $points; } public function duplicate(bool $for_test = true, string $title = "", string $author = "", int $owner = -1, $testObjId = null): int diff --git a/Modules/TestQuestionPool/classes/class.assMultipleChoice.php b/Modules/TestQuestionPool/classes/class.assMultipleChoice.php index cafd1ac2bf29..222495315c82 100755 --- a/Modules/TestQuestionPool/classes/class.assMultipleChoice.php +++ b/Modules/TestQuestionPool/classes/class.assMultipleChoice.php @@ -182,14 +182,14 @@ public function loadFromDb($question_id): void $data = $ilDB->fetchAssoc($result); $this->setId($question_id); $this->setObjId($data["obj_fi"]); - $this->setTitle((string) $data["title"]); + $this->setTitle($data["title"] ?? ''); $this->setNrOfTries($data['nr_of_tries']); - $this->setComment((string) $data["description"]); + $this->setComment($data["description"] ?? ''); $this->setOriginalId($data["original_id"]); $this->setAuthor($data["author"]); $this->setPoints($data["points"]); $this->setOwner($data["owner"]); - $this->setQuestion(ilRTE::_replaceMediaObjectImageSrc((string) $data["question_text"], 1)); + $this->setQuestion(ilRTE::_replaceMediaObjectImageSrc($data["question_text"] ?? '', 1)); $shuffle = (is_null($data['shuffle'])) ? true : $data['shuffle']; $this->setShuffle((bool) $shuffle); if ($data['thumb_size'] !== null && $data['thumb_size'] >= self::MINIMUM_THUMB_SIZE) { @@ -223,7 +223,7 @@ public function loadFromDb($question_id): void if (!file_exists($imagefilename)) { $data["imagefile"] = null; } - $data["answertext"] = ilRTE::_replaceMediaObjectImageSrc($data["answertext"], 1); + $data["answertext"] = ilRTE::_replaceMediaObjectImageSrc($data["answertext"] ?? '', 1); $answer = new ASS_AnswerMultipleResponseImage( $data["answertext"], diff --git a/Modules/TestQuestionPool/classes/class.assSingleChoice.php b/Modules/TestQuestionPool/classes/class.assSingleChoice.php index a3f6acf14d8a..de3c5d296328 100755 --- a/Modules/TestQuestionPool/classes/class.assSingleChoice.php +++ b/Modules/TestQuestionPool/classes/class.assSingleChoice.php @@ -180,7 +180,7 @@ public function loadFromDb($question_id): void $data = $ilDB->fetchAssoc($result); $this->setId($question_id); $this->setObjId($data["obj_fi"]); - $this->setTitle((string) $data["title"]); + $this->setTitle($data["title"] ?? ''); $this->setNrOfTries($data['nr_of_tries']); $this->setComment($data["description"] ?? ''); $this->setOriginalId($data["original_id"]); @@ -536,7 +536,7 @@ public function calculateReachedPoints($active_id, $pass = null, $authorizedSolu } } - return (float)$points; + return (float) $points; } public function calculateReachedPointsFromPreviewSession(ilAssQuestionPreviewSession $previewSession) From d6ee95ba1ddc838f6fced79bc8b326db31bd9084 Mon Sep 17 00:00:00 2001 From: Lukas Scharmer Date: Tue, 10 Sep 2024 12:00:57 +0200 Subject: [PATCH 06/23] Chatroom: Bump NPM package version of express --- Modules/Chatroom/chat/package-lock.json | 238 ++++++++++++++++++------ Modules/Chatroom/chat/package.json | 2 +- 2 files changed, 182 insertions(+), 58 deletions(-) diff --git a/Modules/Chatroom/chat/package-lock.json b/Modules/Chatroom/chat/package-lock.json index 5a5f5425602c..ff57fe338434 100644 --- a/Modules/Chatroom/chat/package-lock.json +++ b/Modules/Chatroom/chat/package-lock.json @@ -9,7 +9,7 @@ "version": "2.0.0", "dependencies": { "async": "^3.2", - "express": "^4.19.2", + "express": "^4.20.0", "mysql": "^2.18.1", "node-mysql": "^0.4.2", "node-schedule": "^2.1.0", @@ -89,9 +89,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -101,7 +101,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -124,6 +124,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -437,36 +451,36 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", + "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -493,6 +507,14 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -738,9 +760,12 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/methods": { "version": "1.1.2", @@ -849,9 +874,12 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -884,9 +912,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/process-nextick-args": { "version": "2.0.1", @@ -966,9 +994,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -1007,9 +1035,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", + "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -1020,6 +1048,47 @@ "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-static/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -1317,9 +1386,9 @@ "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" }, "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -1329,7 +1398,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -1347,6 +1416,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "requires": { + "side-channel": "^1.0.6" + } } } }, @@ -1555,36 +1632,36 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", + "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -1605,6 +1682,11 @@ "ms": "2.0.0" } }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1777,9 +1859,9 @@ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" }, "methods": { "version": "1.1.2", @@ -1857,9 +1939,9 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" }, "object-keys": { "version": "1.1.1", @@ -1880,9 +1962,9 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "process-nextick-args": { "version": "2.0.1", @@ -1947,9 +2029,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "requires": { "debug": "2.6.9", "depd": "2.0.0", @@ -1989,14 +2071,56 @@ } }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", + "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + } + } } }, "set-function-length": { diff --git a/Modules/Chatroom/chat/package.json b/Modules/Chatroom/chat/package.json index 9ffec9287b4f..01109f2a883f 100644 --- a/Modules/Chatroom/chat/package.json +++ b/Modules/Chatroom/chat/package.json @@ -4,7 +4,7 @@ "version": "2.0.0", "dependencies": { "async": "^3.2", - "express": "^4.19.2", + "express": "^4.20.0", "mysql": "^2.18.1", "node-mysql": "^0.4.2", "node-schedule": "^2.1.0", From 6d09824fe7cd41d096474023db4425524a965022 Mon Sep 17 00:00:00 2001 From: iszmais <45942348+iszmais@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:04:21 +0200 Subject: [PATCH 07/23] Remove YUI and nodes js from dc (#8033) --- .../DataCollection/classes/class.ilObjDataCollectionGUI.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Modules/DataCollection/classes/class.ilObjDataCollectionGUI.php b/Modules/DataCollection/classes/class.ilObjDataCollectionGUI.php index 0d8c834174aa..559453d992b2 100644 --- a/Modules/DataCollection/classes/class.ilObjDataCollectionGUI.php +++ b/Modules/DataCollection/classes/class.ilObjDataCollectionGUI.php @@ -96,11 +96,6 @@ public function getObjectId(): int private function addJavaScript(): void { - $this->notes->gui()->initJavascript(); - ilYuiUtil::initConnection(); - ilOverlayGUI::initJavascript(); - // # see https://mantis.ilias.de/view.php?id=26463 - $this->tpl->addJavaScript("./Services/UIComponent/Modal/js/Modal.js"); $this->tpl->addJavaScript("Modules/DataCollection/js/datacollection.js"); } From 4a9aeb87a0eb0df0af161d50479678550d6a62ba Mon Sep 17 00:00:00 2001 From: iszmais <45942348+iszmais@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:32:15 +0200 Subject: [PATCH 08/23] fix link shorting (#8037) --- .../classes/Fields/Text/class.ilDclTextRecordRepresentation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/DataCollection/classes/Fields/Text/class.ilDclTextRecordRepresentation.php b/Modules/DataCollection/classes/Fields/Text/class.ilDclTextRecordRepresentation.php index 6240eb39cd48..b69fb00a6da8 100644 --- a/Modules/DataCollection/classes/Fields/Text/class.ilDclTextRecordRepresentation.php +++ b/Modules/DataCollection/classes/Fields/Text/class.ilDclTextRecordRepresentation.php @@ -95,7 +95,7 @@ public function getHTML(bool $link = true, array $options = []): string protected function shortenLink(string $value): string { - $value = preg_replace('/^(https?:\/\/)?(www\.)?(.)/', '', $value); + $value = preg_replace('/^(https?:\/\/)?(www\.)?/', '', $value); $half = (int) ((self::LINK_MAX_LENGTH - 4) / 2); $value = preg_replace('/^(.{' . ($half + 1) . '})(.{4,})(.{' . $half . '})$/', '\1...\3', $value); From 5709c09ff121681fdf61689ac1638c78c1dec3da Mon Sep 17 00:00:00 2001 From: catenglaender <59924129+catenglaender@users.noreply.github.com> Date: Tue, 10 Sep 2024 16:13:28 +0200 Subject: [PATCH 09/23] 9/UI/column-layout grid breakpoint xs to sm (#8024) --- .../050-layout/_layout_breakpoints.scss | 5 +- templates/default/delos.css | 484 +----------------- 2 files changed, 10 insertions(+), 479 deletions(-) diff --git a/templates/default/050-layout/_layout_breakpoints.scss b/templates/default/050-layout/_layout_breakpoints.scss index c88eacfa5782..08a77c733f73 100644 --- a/templates/default/050-layout/_layout_breakpoints.scss +++ b/templates/default/050-layout/_layout_breakpoints.scss @@ -6,7 +6,7 @@ // Extra small screen / phone //** Deprecated `$screen-xs` as of v3.0.1 -$screen-xs: 480px !default; +$screen-xs: 0px !default; //** Deprecated `$screen-xs-min` as of v3.2.0 $screen-xs-min: $screen-xs !default; //** Deprecated `$screen-phone` as of v3.0.1 @@ -56,8 +56,9 @@ $grid-breakpoints: ( } @else if $size == medium { @media screen and (min-width: $screen-sm + 1px) { @content; }; } @else if $size == large { + @warn "You SHOULD NOT use on-screen-size(large) for big layout changes. Please consider using on-screen-size(medium) as your largest breakpoint if possible."; @media screen and (min-width: $screen-md + 1px) { @content; }; } @else { @error("Invalid input for on-screen-size mixin."); } -} \ No newline at end of file +} diff --git a/templates/default/delos.css b/templates/default/delos.css index 8c9b84b71f16..81a96e8abfde 100644 --- a/templates/default/delos.css +++ b/templates/default/delos.css @@ -920,7 +920,7 @@ th { margin-top: var(--bs-gutter-y); } -@media (min-width: 480px) { +@media (min-width: 0px) { .col-xs { flex: 1 0 0%; } @@ -2735,353 +2735,87 @@ input.btn, input.il-link.link-bulky, .il-viewcontrol-pagination .last > .btn-link + .btn-ctrl, .il-viewcontrol-mode > .btn-default + .btn-ctrl, .il-viewcontrol-mode > .btn-link + .btn-ctrl, .il-viewcontrol-sortation .dropdown > .btn-default.btn + .btn-ctrl, -.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element > .btn-default.btn + .btn-ctrl, .il-viewcontrol-section > .btn-ctrl + .btn-default, .il-viewcontrol-section > .btn-default + .btn-default, .il-viewcontrol-section > .btn-link + .btn-default, -.il-viewcontrol-section .il-viewcontrol-section.btn-group > .btn-default + .btn-default, -.il-viewcontrol-section .il-viewcontrol-section.btn-group > .btn-link + .btn-default, -.il-viewcontrol-section.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-default, -.il-viewcontrol-section.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-default, -.il-viewcontrol-section.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-default, -.il-viewcontrol-section.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-default, -.il-viewcontrol-section.il-viewcontrol-pagination > .btn-default + .btn-default, -.il-viewcontrol-section.il-viewcontrol-pagination > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section.dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section.dropdown > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section.last > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section.last > .btn-link + .btn-default, -.il-viewcontrol-section.il-viewcontrol-mode > .btn-default + .btn-default, -.il-viewcontrol-section.il-viewcontrol-mode > .btn-link + .btn-default, .il-viewcontrol-sortation .il-viewcontrol-section.dropdown > .btn-default.btn + .btn-default, -.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-section.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-section > .btn-ctrl + .btn-link, .il-viewcontrol-section > .btn-default + .btn-link, .il-viewcontrol-section > .btn-link + .btn-link, -.il-viewcontrol-section .il-viewcontrol-section.btn-group > .btn-default + .btn-link, -.il-viewcontrol-section .il-viewcontrol-section.btn-group > .btn-link + .btn-link, -.il-viewcontrol-section.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-link, -.il-viewcontrol-section.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-link, -.il-viewcontrol-section.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-link, -.il-viewcontrol-section.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-link, -.il-viewcontrol-section.il-viewcontrol-pagination > .btn-default + .btn-link, -.il-viewcontrol-section.il-viewcontrol-pagination > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section.dropdown > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section.dropdown > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section.last > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section.last > .btn-link + .btn-link, -.il-viewcontrol-section.il-viewcontrol-mode > .btn-default + .btn-link, -.il-viewcontrol-section.il-viewcontrol-mode > .btn-link + .btn-link, .il-viewcontrol-sortation .il-viewcontrol-section.dropdown > .btn-default.btn + .btn-link, +.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element > .btn-default.btn + .btn-ctrl, .il-viewcontrol-section > .btn-ctrl + .btn-default, .il-viewcontrol-section > .btn-default + .btn-default, .il-viewcontrol-section > .btn-link + .btn-default, .il-viewcontrol-sortation .il-viewcontrol-section.dropdown > .btn-default.btn + .btn-default, +.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-section.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-section > .btn-ctrl + .btn-link, .il-viewcontrol-section > .btn-default + .btn-link, .il-viewcontrol-section > .btn-link + .btn-link, .il-viewcontrol-sortation .il-viewcontrol-section.dropdown > .btn-default.btn + .btn-link, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-section.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-section .btn-group > .btn-ctrl + .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-section > .btn-default + .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-section > .btn-link + .btn-default, .il-viewcontrol-section .btn-group > .btn-default + .btn-default, .il-viewcontrol-section .btn-group > .btn-link + .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination > .btn-default + .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.dropdown > .btn-default + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.dropdown > .btn-link + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.dropdown > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.last > .btn-default + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.last > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.last > .btn-link + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.last > .btn-link + .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-mode > .btn-default + .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-mode > .btn-link + .btn-default, -.il-viewcontrol-sortation .il-viewcontrol-section .btn-group.dropdown > .btn-default.btn + .btn-default, -.il-viewcontrol-section .il-viewcontrol-sortation .btn-group.dropdown > .btn-default.btn + .btn-default, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-section .btn-group.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-section .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .btn-group.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-section .btn-group > .btn-ctrl + .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-section > .btn-default + .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-section > .btn-link + .btn-link, .il-viewcontrol-section .btn-group > .btn-default + .btn-link, .il-viewcontrol-section .btn-group > .btn-link + .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination > .btn-default + .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.dropdown > .btn-default + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.dropdown > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.dropdown > .btn-link + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.dropdown > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.last > .btn-default + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.last > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.last > .btn-link + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.last > .btn-link + .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-mode > .btn-default + .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-mode > .btn-link + .btn-link, -.il-viewcontrol-sortation .il-viewcontrol-section .btn-group.dropdown > .btn-default.btn + .btn-link, -.il-viewcontrol-section .il-viewcontrol-sortation .btn-group.dropdown > .btn-default.btn + .btn-link, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-section .btn-group.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-section .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .btn-group.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-pagination__sectioncontrol > .btn-ctrl + .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-section > .btn-default + .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-section > .btn-link + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination__sectioncontrol.btn-group > .btn-default + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination__sectioncontrol.btn-group > .btn-link + .btn-default, .il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-default, .il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination > .btn-default + .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.last > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.last > .btn-link + .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-mode > .btn-default + .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-mode > .btn-link + .btn-default, .il-viewcontrol-sortation .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-default.btn + .btn-default, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination__sectioncontrol.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-pagination__sectioncontrol > .btn-ctrl + .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-section > .btn-default + .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-section > .btn-link + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination__sectioncontrol.btn-group > .btn-default + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination__sectioncontrol.btn-group > .btn-link + .btn-link, .il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-link, .il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination > .btn-default + .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.last > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.last > .btn-link + .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-mode > .btn-default + .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-mode > .btn-link + .btn-link, .il-viewcontrol-sortation .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-default.btn + .btn-link, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination__sectioncontrol.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-pagination__num-of-items > .btn-ctrl + .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-section > .btn-default + .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-section > .btn-link + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination__num-of-items.btn-group > .btn-default + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination__num-of-items.btn-group > .btn-link + .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-default, .il-viewcontrol-pagination__num-of-items > .btn-default + .btn-default, .il-viewcontrol-pagination__num-of-items > .btn-link + .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination > .btn-default + .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.dropdown > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.last > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.last > .btn-link + .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-mode > .btn-default + .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-mode > .btn-link + .btn-default, .il-viewcontrol-sortation .il-viewcontrol-pagination__num-of-items.dropdown > .btn-default.btn + .btn-default, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination__num-of-items.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-pagination__num-of-items > .btn-ctrl + .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-section > .btn-default + .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-section > .btn-link + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination__num-of-items.btn-group > .btn-default + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination__num-of-items.btn-group > .btn-link + .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-link, .il-viewcontrol-pagination__num-of-items > .btn-default + .btn-link, .il-viewcontrol-pagination__num-of-items > .btn-link + .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination > .btn-default + .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.dropdown > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.dropdown > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.last > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.last > .btn-link + .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-mode > .btn-default + .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-mode > .btn-link + .btn-link, .il-viewcontrol-sortation .il-viewcontrol-pagination__num-of-items.dropdown > .btn-default.btn + .btn-link, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination__num-of-items.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-pagination > .btn-ctrl + .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-section > .btn-default + .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-section > .btn-link + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination.btn-group > .btn-default + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination.btn-group > .btn-link + .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-default, .il-viewcontrol-pagination > .btn-default + .btn-default, .il-viewcontrol-pagination > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination.dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination.dropdown > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination.last > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination.last > .btn-link + .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-mode > .btn-default + .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-mode > .btn-link + .btn-default, .il-viewcontrol-sortation .il-viewcontrol-pagination.dropdown > .btn-default.btn + .btn-default, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-pagination > .btn-ctrl + .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-section > .btn-default + .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-section > .btn-link + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination.btn-group > .btn-default + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination.btn-group > .btn-link + .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-link, .il-viewcontrol-pagination > .btn-default + .btn-link, .il-viewcontrol-pagination > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination.dropdown > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination.dropdown > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination.last > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination.last > .btn-link + .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-mode > .btn-default + .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-mode > .btn-link + .btn-link, .il-viewcontrol-sortation .il-viewcontrol-pagination.dropdown > .btn-default.btn + .btn-link, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-pagination .dropdown > .btn-ctrl + .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-section > .btn-default + .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-section > .btn-link + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .dropdown.btn-group > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .dropdown.btn-group > .btn-default + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .dropdown.btn-group > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .dropdown.btn-group > .btn-link + .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination > .btn-default + .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination > .btn-link + .btn-default, .il-viewcontrol-pagination .dropdown > .btn-default + .btn-default, .il-viewcontrol-pagination .dropdown > .btn-link + .btn-default, -.il-viewcontrol-pagination .dropdown.last > .btn-default + .btn-default, -.il-viewcontrol-pagination .dropdown.last > .btn-link + .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-mode > .btn-default + .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-mode > .btn-link + .btn-default, -.il-viewcontrol-sortation .il-viewcontrol-pagination .dropdown > .btn-default.btn + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-sortation .dropdown > .btn-default.btn + .btn-default, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination .dropdown.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-pagination .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .dropdown.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-pagination .dropdown > .btn-ctrl + .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-section > .btn-default + .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-section > .btn-link + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .dropdown.btn-group > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .dropdown.btn-group > .btn-default + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .dropdown.btn-group > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .dropdown.btn-group > .btn-link + .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination > .btn-default + .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination > .btn-link + .btn-link, .il-viewcontrol-pagination .dropdown > .btn-default + .btn-link, .il-viewcontrol-pagination .dropdown > .btn-link + .btn-link, -.il-viewcontrol-pagination .dropdown.last > .btn-default + .btn-link, -.il-viewcontrol-pagination .dropdown.last > .btn-link + .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-mode > .btn-default + .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-mode > .btn-link + .btn-link, -.il-viewcontrol-sortation .il-viewcontrol-pagination .dropdown > .btn-default.btn + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-sortation .dropdown > .btn-default.btn + .btn-link, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination .dropdown.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-pagination .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .dropdown.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-pagination .last > .btn-ctrl + .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-section > .btn-default + .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-section > .btn-link + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .last.btn-group > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .last.btn-group > .btn-default + .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .last.btn-group > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .last.btn-group > .btn-link + .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination > .btn-default + .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination > .btn-link + .btn-default, -.il-viewcontrol-pagination .last.dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .last.dropdown > .btn-link + .btn-default, .il-viewcontrol-pagination .last > .btn-default + .btn-default, .il-viewcontrol-pagination .last > .btn-link + .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-mode > .btn-default + .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-mode > .btn-link + .btn-default, -.il-viewcontrol-sortation .il-viewcontrol-pagination .last.dropdown > .btn-default.btn + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-sortation .last.dropdown > .btn-default.btn + .btn-default, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination .last.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-pagination .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .last.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-pagination .last > .btn-ctrl + .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-section > .btn-default + .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-section > .btn-link + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .last.btn-group > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .last.btn-group > .btn-default + .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .last.btn-group > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .last.btn-group > .btn-link + .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination > .btn-default + .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination > .btn-link + .btn-link, -.il-viewcontrol-pagination .last.dropdown > .btn-default + .btn-link, -.il-viewcontrol-pagination .last.dropdown > .btn-link + .btn-link, .il-viewcontrol-pagination .last > .btn-default + .btn-link, .il-viewcontrol-pagination .last > .btn-link + .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-mode > .btn-default + .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-mode > .btn-link + .btn-link, -.il-viewcontrol-sortation .il-viewcontrol-pagination .last.dropdown > .btn-default.btn + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-sortation .last.dropdown > .btn-default.btn + .btn-link, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination .last.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-pagination .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .last.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-mode > .btn-ctrl + .btn-default, -.il-viewcontrol-mode.il-viewcontrol-section > .btn-default + .btn-default, -.il-viewcontrol-mode.il-viewcontrol-section > .btn-link + .btn-default, -.il-viewcontrol-section .il-viewcontrol-mode.btn-group > .btn-default + .btn-default, -.il-viewcontrol-section .il-viewcontrol-mode.btn-group > .btn-link + .btn-default, -.il-viewcontrol-mode.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-default, -.il-viewcontrol-mode.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-default, -.il-viewcontrol-mode.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-default, -.il-viewcontrol-mode.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-default, -.il-viewcontrol-mode.il-viewcontrol-pagination > .btn-default + .btn-default, -.il-viewcontrol-mode.il-viewcontrol-pagination > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-mode.dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-mode.dropdown > .btn-link + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-mode.last > .btn-default + .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-mode.last > .btn-link + .btn-default, .il-viewcontrol-mode > .btn-default + .btn-default, .il-viewcontrol-mode > .btn-link + .btn-default, .il-viewcontrol-sortation .il-viewcontrol-mode.dropdown > .btn-default.btn + .btn-default, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-mode.l-bar__element > .btn-default.btn + .btn-default, .il-viewcontrol-mode > .btn-ctrl + .btn-link, -.il-viewcontrol-mode.il-viewcontrol-section > .btn-default + .btn-link, -.il-viewcontrol-mode.il-viewcontrol-section > .btn-link + .btn-link, -.il-viewcontrol-section .il-viewcontrol-mode.btn-group > .btn-default + .btn-link, -.il-viewcontrol-section .il-viewcontrol-mode.btn-group > .btn-link + .btn-link, -.il-viewcontrol-mode.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-link, -.il-viewcontrol-mode.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-link, -.il-viewcontrol-mode.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-link, -.il-viewcontrol-mode.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-link, -.il-viewcontrol-mode.il-viewcontrol-pagination > .btn-default + .btn-link, -.il-viewcontrol-mode.il-viewcontrol-pagination > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-mode.dropdown > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-mode.dropdown > .btn-link + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-mode.last > .btn-default + .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-mode.last > .btn-link + .btn-link, .il-viewcontrol-mode > .btn-default + .btn-link, .il-viewcontrol-mode > .btn-link + .btn-link, .il-viewcontrol-sortation .il-viewcontrol-mode.dropdown > .btn-default.btn + .btn-link, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-mode.l-bar__element > .btn-default.btn + .btn-link, .il-viewcontrol-sortation .dropdown > .btn-ctrl + .btn-default.btn, .il-viewcontrol-sortation .dropdown.il-viewcontrol-section > .btn-default + .btn-default.btn, .il-viewcontrol-sortation .dropdown.il-viewcontrol-section > .btn-link + .btn-default.btn, -.il-viewcontrol-section .il-viewcontrol-sortation .dropdown.btn-group > .btn-default + .btn-default.btn, -.il-viewcontrol-sortation .il-viewcontrol-section .dropdown.btn-group > .btn-default + .btn-default.btn, -.il-viewcontrol-section .il-viewcontrol-sortation .dropdown.btn-group > .btn-link + .btn-default.btn, -.il-viewcontrol-sortation .il-viewcontrol-section .dropdown.btn-group > .btn-link + .btn-default.btn, .il-viewcontrol-sortation .dropdown.il-viewcontrol-pagination__sectioncontrol > .btn-default + .btn-default.btn, .il-viewcontrol-sortation .dropdown.il-viewcontrol-pagination__sectioncontrol > .btn-link + .btn-default.btn, .il-viewcontrol-sortation .dropdown.il-viewcontrol-pagination__num-of-items > .btn-default + .btn-default.btn, .il-viewcontrol-sortation .dropdown.il-viewcontrol-pagination__num-of-items > .btn-link + .btn-default.btn, .il-viewcontrol-sortation .dropdown.il-viewcontrol-pagination > .btn-default + .btn-default.btn, .il-viewcontrol-sortation .dropdown.il-viewcontrol-pagination > .btn-link + .btn-default.btn, -.il-viewcontrol-pagination .il-viewcontrol-sortation .dropdown > .btn-default + .btn-default.btn, -.il-viewcontrol-sortation .il-viewcontrol-pagination .dropdown > .btn-default + .btn-default.btn, -.il-viewcontrol-pagination .il-viewcontrol-sortation .dropdown > .btn-link + .btn-default.btn, -.il-viewcontrol-sortation .il-viewcontrol-pagination .dropdown > .btn-link + .btn-default.btn, -.il-viewcontrol-pagination .il-viewcontrol-sortation .dropdown.last > .btn-default + .btn-default.btn, -.il-viewcontrol-sortation .il-viewcontrol-pagination .dropdown.last > .btn-default + .btn-default.btn, -.il-viewcontrol-pagination .il-viewcontrol-sortation .dropdown.last > .btn-link + .btn-default.btn, -.il-viewcontrol-sortation .il-viewcontrol-pagination .dropdown.last > .btn-link + .btn-default.btn, .il-viewcontrol-sortation .dropdown.il-viewcontrol-mode > .btn-default + .btn-default.btn, .il-viewcontrol-sortation .dropdown.il-viewcontrol-mode > .btn-link + .btn-default.btn, .il-viewcontrol-sortation .dropdown > .btn-default.btn + .btn-default.btn, -.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-sortation .dropdown.l-bar__element > .btn-default.btn + .btn-default.btn, -.il-viewcontrol-sortation .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .dropdown.l-bar__element > .btn-default.btn + .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element > .btn-ctrl + .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-section > .btn-default + .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-section > .btn-link + .btn-default.btn, @@ -3105,119 +2839,51 @@ input.btn, input.il-link.link-bulky, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination .l-bar__element.last > .btn-link + .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-mode > .btn-default + .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-mode > .btn-link + .btn-default.btn, -.il-viewcontrol-sortation .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.dropdown > .btn-default.btn + .btn-default.btn, -.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-sortation .l-bar__element.dropdown > .btn-default.btn + .btn-default.btn, -.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element > .btn-default.btn + .btn-default.btn, .ilTableNav > table > tbody > tr > td > .btn-group > .btn-link + .btn-ctrl, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.btn-group > .btn-link + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.btn-group > .btn-link + .btn-link, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group > .btn-link + .btn-default, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group > .btn-link + .btn-link, +.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element > .btn-default.btn + .btn-default.btn, .ilTableNav > table > tbody > tr > td > .btn-group > .btn-link + .btn-ctrl, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.btn-group > .btn-link + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.btn-group > .btn-link + .btn-default, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.btn-group > .btn-link + .btn-link, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.btn-group > .btn-link + .btn-default, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.btn-group > .btn-link + .btn-link, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.btn-group > .btn-link + .btn-default, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.btn-group > .btn-link + .btn-link, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown.btn-group > .btn-link + .btn-default, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown.btn-group > .btn-link + .btn-link, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.btn-group > .btn-link + .btn-default, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.btn-group > .btn-link + .btn-link, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.btn-group > .btn-link + .btn-default, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.btn-group > .btn-link + .btn-link, .il-viewcontrol-sortation .ilTableNav > table > tbody > tr > td > .dropdown.btn-group > .btn-link + .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .ilTableNav > table > tbody > tr > td > .l-bar__element.btn-group > .btn-link + .btn-default.btn, .ilTableNav > table > tbody > tr > td > .dropdown > .btn-default + .btn-ctrl, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.dropdown > .btn-default + .btn-link, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group.dropdown > .btn-default + .btn-default, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group.dropdown > .btn-default + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-default + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.dropdown > .btn-default + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.dropdown > .btn-default + .btn-link, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown > .btn-default + .btn-link, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.dropdown > .btn-default + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.dropdown > .btn-default + .btn-link, -.il-viewcontrol-sortation .ilTableNav > table > tbody > tr > td > .dropdown > .btn-default + .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .ilTableNav > table > tbody > tr > td > .l-bar__element.dropdown > .btn-default + .btn-default.btn, .ilTableNav > table > tbody > tr > td > .navbar-form.dropdown > a + .btn-ctrl, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.navbar-form.dropdown > a + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.navbar-form.dropdown > a + .btn-link, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group.navbar-form.dropdown > a + .btn-default, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group.navbar-form.dropdown > a + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.navbar-form.dropdown > a + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.navbar-form.dropdown > a + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.navbar-form.dropdown > a + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.navbar-form.dropdown > a + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.navbar-form.dropdown > a + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.navbar-form.dropdown > a + .btn-link, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown.navbar-form > a + .btn-default, .il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown.navbar-form > a + .btn-link, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.navbar-form.dropdown > a + .btn-default, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.navbar-form.dropdown > a + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.navbar-form.dropdown > a + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.navbar-form.dropdown > a + .btn-link, -.il-viewcontrol-sortation .ilTableNav > table > tbody > tr > td > .dropdown.navbar-form > a + .btn-default.btn, -.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .ilTableNav > table > tbody > tr > td > .l-bar__element.navbar-form.dropdown > a + .btn-default.btn, .ilTableNav > table > tbody > tr > td > .btn-group > .btn-ctrl + .btn-link, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.btn-group > .btn-default + .btn-link, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.btn-group > .btn-link + .btn-link, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group > .btn-default + .btn-link, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group > .btn-link + .btn-link, +.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .ilTableNav > table > tbody > tr > td > .l-bar__element.navbar-form.dropdown > a + .btn-default.btn, .ilTableNav > table > tbody > tr > td > .btn-group > .btn-ctrl + .btn-link, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.btn-group > .btn-default + .btn-link, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.btn-group > .btn-default + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.btn-group > .btn-link + .btn-link, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.btn-group > .btn-default + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.btn-group > .btn-link + .btn-link, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.btn-group > .btn-default + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.btn-group > .btn-link + .btn-link, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown.btn-group > .btn-default + .btn-link, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown.btn-group > .btn-link + .btn-link, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.btn-group > .btn-default + .btn-link, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.btn-group > .btn-link + .btn-link, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.btn-group > .btn-default + .btn-link, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.btn-group > .btn-link + .btn-link, .il-viewcontrol-sortation .ilTableNav > table > tbody > tr > td > .dropdown.btn-group > .btn-default.btn + .btn-link, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .ilTableNav > table > tbody > tr > td > .l-bar__element.btn-group > .btn-default.btn + .btn-link, .ilTableNav > table > tbody > tr > td > .btn-group > .btn-link + .btn-link, .ilTableNav > table > tbody > tr > td > .btn-group.dropdown > .btn-default + .btn-link, .ilTableNav > table > tbody > tr > td > .btn-group.navbar-form.dropdown > a + .btn-link, .ilTableNav > table > tbody > tr > td > .dropdown > .btn-ctrl + .btn-default, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.dropdown > .btn-link + .btn-default, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group.dropdown > .btn-default + .btn-default, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group.dropdown > .btn-link + .btn-default, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-link + .btn-default, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.dropdown > .btn-link + .btn-default, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.dropdown > .btn-link + .btn-default, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown > .btn-link + .btn-default, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.dropdown > .btn-default + .btn-default, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.dropdown > .btn-link + .btn-default, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.dropdown > .btn-link + .btn-default, -.il-viewcontrol-sortation .ilTableNav > table > tbody > tr > td > .dropdown > .btn-default.btn + .btn-default, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .ilTableNav > table > tbody > tr > td > .l-bar__element.dropdown > .btn-default.btn + .btn-default, .ilTableNav > table > tbody > tr > td > .dropdown.btn-group > .btn-link + .btn-default, .ilTableNav > table > tbody > tr > td > .dropdown > .btn-default + .btn-default, .ilTableNav > table > tbody > tr > td > .dropdown.navbar-form > a + .btn-default, .ilTableNav > table > tbody > tr > td > .navbar-form.dropdown > .btn-ctrl + a, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.navbar-form.dropdown > .btn-default + a, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-section.navbar-form.dropdown > .btn-link + a, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group.navbar-form.dropdown > .btn-default + a, -.il-viewcontrol-section .ilTableNav > table > tbody > tr > td > .btn-group.navbar-form.dropdown > .btn-link + a, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.navbar-form.dropdown > .btn-default + a, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__sectioncontrol.navbar-form.dropdown > .btn-link + a, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.navbar-form.dropdown > .btn-default + a, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination__num-of-items.navbar-form.dropdown > .btn-link + a, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.navbar-form.dropdown > .btn-default + a, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-pagination.navbar-form.dropdown > .btn-link + a, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown.navbar-form > .btn-default + a, .il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .dropdown.navbar-form > .btn-link + a, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.navbar-form.dropdown > .btn-default + a, -.il-viewcontrol-pagination .ilTableNav > table > tbody > tr > td > .last.navbar-form.dropdown > .btn-link + a, -.ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.navbar-form.dropdown > .btn-default + a, .ilTableNav > table > tbody > tr > td > .il-viewcontrol-mode.navbar-form.dropdown > .btn-link + a, -.il-viewcontrol-sortation .ilTableNav > table > tbody > tr > td > .dropdown.navbar-form > .btn-default.btn + a, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .ilTableNav > table > tbody > tr > td > .l-bar__element.navbar-form.dropdown > .btn-default.btn + a, .ilTableNav > table > tbody > tr > td > .navbar-form.dropdown.btn-group > .btn-link + a, .ilTableNav > table > tbody > tr > td > .navbar-form.dropdown > .btn-default + a, @@ -9602,21 +9268,7 @@ td.c-table-data__cell--highlighted { } .il-viewcontrol-section > .btn-default, .il-viewcontrol-section > .btn-link, .il-viewcontrol-section > .btn-ctrl, .il-viewcontrol-sortation .dropdown.il-viewcontrol-section > .btn-default.btn, -.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-section > .btn-default.btn, .il-viewcontrol-section > .btn-default, .il-viewcontrol-section > .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-section > .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-section > .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-section > .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-section > .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-section > .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-section > .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-section > .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-section > .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-section > .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-section > .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-section > .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-section > .btn-link, -.il-viewcontrol-mode.il-viewcontrol-section > .btn-default, -.il-viewcontrol-mode.il-viewcontrol-section > .btn-link, +.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-section > .btn-default.btn, .il-viewcontrol-section .btn-group > .btn-default, .il-viewcontrol-section .btn-group > .btn-link, .il-viewcontrol-section .btn-group > .btn-ctrl, @@ -9624,89 +9276,21 @@ td.c-table-data__cell--highlighted { .il-viewcontrol-sortation .il-viewcontrol-section .dropdown.btn-group > .btn-default.btn, .il-viewcontrol-section .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.btn-group > .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-section .l-bar__element.btn-group > .btn-default.btn, -.il-viewcontrol-section .il-viewcontrol-section.btn-group > .btn-default, -.il-viewcontrol-section .il-viewcontrol-section.btn-group > .btn-link, -.il-viewcontrol-section .btn-group > .btn-default, -.il-viewcontrol-section .btn-group > .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination__sectioncontrol.btn-group > .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination__sectioncontrol.btn-group > .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination__num-of-items.btn-group > .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination__num-of-items.btn-group > .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination.btn-group > .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination.btn-group > .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .dropdown.btn-group > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .dropdown.btn-group > .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .dropdown.btn-group > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .dropdown.btn-group > .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .last.btn-group > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .last.btn-group > .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .last.btn-group > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .last.btn-group > .btn-link, -.il-viewcontrol-section .il-viewcontrol-mode.btn-group > .btn-default, -.il-viewcontrol-section .il-viewcontrol-mode.btn-group > .btn-link, .il-viewcontrol-pagination__sectioncontrol > .btn-default, .il-viewcontrol-pagination__sectioncontrol > .btn-link, .il-viewcontrol-pagination__sectioncontrol > .btn-ctrl, .il-viewcontrol-sortation .dropdown.il-viewcontrol-pagination__sectioncontrol > .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-pagination__sectioncontrol > .btn-default.btn, -.il-viewcontrol-section.il-viewcontrol-pagination__sectioncontrol > .btn-default, -.il-viewcontrol-section.il-viewcontrol-pagination__sectioncontrol > .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__sectioncontrol > .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__sectioncontrol > .btn-link, -.il-viewcontrol-pagination__sectioncontrol > .btn-default, -.il-viewcontrol-pagination__sectioncontrol > .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination__sectioncontrol > .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination__sectioncontrol > .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-pagination__sectioncontrol > .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-pagination__sectioncontrol > .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__sectioncontrol > .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__sectioncontrol > .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__sectioncontrol > .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__sectioncontrol > .btn-link, -.il-viewcontrol-mode.il-viewcontrol-pagination__sectioncontrol > .btn-default, -.il-viewcontrol-mode.il-viewcontrol-pagination__sectioncontrol > .btn-link, .il-viewcontrol-pagination__num-of-items > .btn-default, .il-viewcontrol-pagination__num-of-items > .btn-link, .il-viewcontrol-pagination__num-of-items > .btn-ctrl, .il-viewcontrol-sortation .dropdown.il-viewcontrol-pagination__num-of-items > .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-pagination__num-of-items > .btn-default.btn, -.il-viewcontrol-section.il-viewcontrol-pagination__num-of-items > .btn-default, -.il-viewcontrol-section.il-viewcontrol-pagination__num-of-items > .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__num-of-items > .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination__num-of-items > .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination__num-of-items > .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination__num-of-items > .btn-link, -.il-viewcontrol-pagination__num-of-items > .btn-default, -.il-viewcontrol-pagination__num-of-items > .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-pagination__num-of-items > .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-pagination__num-of-items > .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__num-of-items > .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination__num-of-items > .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__num-of-items > .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination__num-of-items > .btn-link, -.il-viewcontrol-mode.il-viewcontrol-pagination__num-of-items > .btn-default, -.il-viewcontrol-mode.il-viewcontrol-pagination__num-of-items > .btn-link, .il-viewcontrol-pagination > .btn-default, .il-viewcontrol-pagination > .btn-link, .il-viewcontrol-pagination > .btn-ctrl, .il-viewcontrol-sortation .dropdown.il-viewcontrol-pagination > .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-pagination > .btn-default.btn, -.il-viewcontrol-section.il-viewcontrol-pagination > .btn-default, -.il-viewcontrol-section.il-viewcontrol-pagination > .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination > .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-pagination > .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination > .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-pagination > .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination > .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-pagination > .btn-link, -.il-viewcontrol-pagination > .btn-default, -.il-viewcontrol-pagination > .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination > .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-pagination > .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination > .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-pagination > .btn-link, -.il-viewcontrol-mode.il-viewcontrol-pagination > .btn-default, -.il-viewcontrol-mode.il-viewcontrol-pagination > .btn-link, .il-viewcontrol-pagination .dropdown > .btn-default, .il-viewcontrol-pagination .dropdown > .btn-link, .il-viewcontrol-pagination .dropdown > .btn-ctrl, @@ -9714,70 +9298,16 @@ td.c-table-data__cell--highlighted { .il-viewcontrol-sortation .il-viewcontrol-pagination .dropdown > .btn-default.btn, .il-viewcontrol-pagination .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.dropdown > .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination .l-bar__element.dropdown > .btn-default.btn, -.il-viewcontrol-pagination .il-viewcontrol-section.dropdown > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section.dropdown > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.dropdown > .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.dropdown > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.dropdown > .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.dropdown > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.dropdown > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.dropdown > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.dropdown > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination.dropdown > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination.dropdown > .btn-link, -.il-viewcontrol-pagination .dropdown > .btn-default, -.il-viewcontrol-pagination .dropdown > .btn-link, -.il-viewcontrol-pagination .last.dropdown > .btn-default, -.il-viewcontrol-pagination .last.dropdown > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-mode.dropdown > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-mode.dropdown > .btn-link, .il-viewcontrol-pagination .last > .btn-default, .il-viewcontrol-pagination .last > .btn-link, .il-viewcontrol-pagination .last > .btn-ctrl, -.il-viewcontrol-pagination .il-viewcontrol-sortation .dropdown.last > .btn-default.btn, -.il-viewcontrol-sortation .il-viewcontrol-pagination .dropdown.last > .btn-default.btn, .il-viewcontrol-pagination .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.last > .btn-default.btn, .il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .il-viewcontrol-pagination .l-bar__element.last > .btn-default.btn, -.il-viewcontrol-pagination .il-viewcontrol-section.last > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section.last > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.last > .btn-default, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.last > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-section .btn-group.last > .btn-link, -.il-viewcontrol-section .il-viewcontrol-pagination .btn-group.last > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.last > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__sectioncontrol.last > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.last > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination__num-of-items.last > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-pagination.last > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-pagination.last > .btn-link, -.il-viewcontrol-pagination .dropdown.last > .btn-default, -.il-viewcontrol-pagination .dropdown.last > .btn-link, -.il-viewcontrol-pagination .last > .btn-default, -.il-viewcontrol-pagination .last > .btn-link, -.il-viewcontrol-pagination .il-viewcontrol-mode.last > .btn-default, -.il-viewcontrol-pagination .il-viewcontrol-mode.last > .btn-link, .il-viewcontrol-mode > .btn-default, .il-viewcontrol-mode > .btn-link, .il-viewcontrol-mode > .btn-ctrl, .il-viewcontrol-sortation .dropdown.il-viewcontrol-mode > .btn-default.btn, -.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-mode > .btn-default.btn, -.il-viewcontrol-section.il-viewcontrol-mode > .btn-default, -.il-viewcontrol-section.il-viewcontrol-mode > .btn-link, -.il-viewcontrol-section .btn-group.il-viewcontrol-mode > .btn-default, -.il-viewcontrol-section .btn-group.il-viewcontrol-mode > .btn-link, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-mode > .btn-default, -.il-viewcontrol-pagination__sectioncontrol.il-viewcontrol-mode > .btn-link, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-mode > .btn-default, -.il-viewcontrol-pagination__num-of-items.il-viewcontrol-mode > .btn-link, -.il-viewcontrol-pagination.il-viewcontrol-mode > .btn-default, -.il-viewcontrol-pagination.il-viewcontrol-mode > .btn-link, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-mode > .btn-default, -.il-viewcontrol-pagination .dropdown.il-viewcontrol-mode > .btn-link, -.il-viewcontrol-pagination .last.il-viewcontrol-mode > .btn-default, -.il-viewcontrol-pagination .last.il-viewcontrol-mode > .btn-link, -.il-viewcontrol-mode > .btn-default, -.il-viewcontrol-mode > .btn-link { +.il-table-presentation-viewcontrols .l-bar__space-keeper .l-bar__group .l-bar__element.il-viewcontrol-mode > .btn-default.btn { min-height: 1.7rem; min-width: 1.7rem; border-radius: 10px; From 05e0b7a5b3a04e0206839ee6b7685556601bd68d Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Wed, 11 Sep 2024 23:17:02 +0200 Subject: [PATCH 10/23] 41833: Order of style classes is partially ignored in Text(Character) --- .../PC/Paragraph/class.ilPCParagraphGUI.php | 12 ++++-- .../COPage/classes/class.ilPageObjectGUI.php | 38 +++++++++++++++---- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/Services/COPage/PC/Paragraph/class.ilPCParagraphGUI.php b/Services/COPage/PC/Paragraph/class.ilPCParagraphGUI.php index 9518d3d7bf30..cf1d02367549 100755 --- a/Services/COPage/PC/Paragraph/class.ilPCParagraphGUI.php +++ b/Services/COPage/PC/Paragraph/class.ilPCParagraphGUI.php @@ -160,10 +160,16 @@ public static function _getTextCharacteristics( ); $style = new ilObjStyleSheet($a_style_id); - $ti_chars = $style->getCharacteristics("text_inline", false, $a_include_core); + /*$ti_chars = $style->getCharacteristics("text_inline", false, $a_include_core);*/ + $ti_chars = $char_manager->getByTypes( + ["text_inline", "code_inline"], + false, + false + ); + /** @var Style\Content\Characteristic $v */ foreach ($ti_chars as $k => $v) { - if (!$char_manager->isOutdated("text_inline", $v)) { - $chars[] = $v; + if (!$char_manager->isOutdated("text_inline", $v->getCharacteristic())) { + $chars[] = $v->getCharacteristic(); } } } else { diff --git a/Services/COPage/classes/class.ilPageObjectGUI.php b/Services/COPage/classes/class.ilPageObjectGUI.php index 34a1b28a2222..17ad06a72d61 100755 --- a/Services/COPage/classes/class.ilPageObjectGUI.php +++ b/Services/COPage/classes/class.ilPageObjectGUI.php @@ -1769,16 +1769,38 @@ public static function getTinyMenu( }; // character styles - $chars = array( - "Comment" => array("code" => "com", "txt" => $f("Comment", "com")), - "Quotation" => array("code" => "quot", "txt" => $f("Quotation", "quot")), - "Accent" => array("code" => "acc", "txt" => $f("Accent", "acc")), - "Code" => array("code" => "code", "txt" => $f("Code", "code")) - ); - foreach (ilPCParagraphGUI::_getTextCharacteristics($a_style_id) as $c) { + $chars = []; + if ($a_style_id === 0) { + $chars = array( + "Comment" => array("code" => "com", "txt" => $f("Comment", "com")), + "Quotation" => array("code" => "quot", "txt" => $f("Quotation", "quot")), + "Accent" => array("code" => "acc", "txt" => $f("Accent", "acc")), + "Code" => array("code" => "code", "txt" => $f("Code", "code")) + ); + } + foreach (ilPCParagraphGUI::_getTextCharacteristics($a_style_id, true) as $c) { + if (in_array($c, ["Strong", "Important", "Emph"])) { + continue; + } if (!isset($chars[$c])) { $title = $char_manager->getPresentationTitle("text_inline", $c); - $chars[$c] = array("code" => "", "txt" => $title); + switch ($c) { + case "CodeInline": + $chars["Code"] = array("code" => "code", "txt" => $f("Code", "code")); + break; + case "Comment": + $chars["Comment"] = array("code" => "com", "txt" => $f("Comment", "com")); + break; + case "Quotation": + $chars["Quotation"] = array("code" => "quot", "txt" => $f("Quotation", "quot")); + break; + case "Accent": + $chars["Accent"] = array("code" => "acc", "txt" => $f("Accent", "acc")); + break; + default: + $chars[$c] = array("code" => "", "txt" => $title); + break; + } } } $char_formats = []; From d257050ac2061239619845565fe96959fbdeedeb Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Thu, 12 Sep 2024 08:13:17 +0200 Subject: [PATCH 11/23] User: Fix UDF value might be null See: https://mantis.ilias.de/view.php?id=42039 --- Services/User/classes/class.ilObjUser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/User/classes/class.ilObjUser.php b/Services/User/classes/class.ilObjUser.php index c3c6fb7b8c04..c6fb0f6e3a13 100755 --- a/Services/User/classes/class.ilObjUser.php +++ b/Services/User/classes/class.ilObjUser.php @@ -3007,7 +3007,7 @@ public function updateUserDefinedFields(): void { $udata = new ilUserDefinedData($this->getId()); foreach ($this->user_defined_data as $field => $value) { - if ($field != 'usr_id') { + if ($field !== 'usr_id' && $value !== null) { $udata->set($field, $value); } } From 641777c778c71e5d1c4ec6cec5580c774900eb06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Katrin=20Gro=C3=9Fkopf?= Date: Thu, 12 Sep 2024 09:12:00 +0200 Subject: [PATCH 12/23] fix Mantis #41905 --- ...lLanguagesInstalledAndUpdatedObjective.php | 2 +- .../classes/Setup/class.ilSetupLanguage.php | 30 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Services/Language/classes/Setup/class.ilLanguagesInstalledAndUpdatedObjective.php b/Services/Language/classes/Setup/class.ilLanguagesInstalledAndUpdatedObjective.php index 2008242e1061..f85796340a43 100644 --- a/Services/Language/classes/Setup/class.ilLanguagesInstalledAndUpdatedObjective.php +++ b/Services/Language/classes/Setup/class.ilLanguagesInstalledAndUpdatedObjective.php @@ -44,7 +44,7 @@ public function getHash(): string */ protected function getInstallLanguages(): array { - return $this->il_setup_language->getInstalledLanguages() ?? ['en']; + return $this->il_setup_language->getInstalledLanguages() ?: ['en']; } /** diff --git a/Services/Language/classes/Setup/class.ilSetupLanguage.php b/Services/Language/classes/Setup/class.ilSetupLanguage.php index 5ad1a501e7dc..38ea9495ea6f 100755 --- a/Services/Language/classes/Setup/class.ilSetupLanguage.php +++ b/Services/Language/classes/Setup/class.ilSetupLanguage.php @@ -194,18 +194,17 @@ public function installLanguages(array $a_lang_keys, array $a_local_keys) public function getInstalledLanguages(): array { global $ilDB; - - $arr = array(); - - $query = "SELECT * FROM object_data " . + $arr = []; + if ($ilDB instanceof ilDBInterface) { + $query = "SELECT * FROM object_data " . "WHERE type = " . $ilDB->quote("lng", "text") . " " . "AND " . $ilDB->like("description", "text", "installed%"); - $r = $ilDB->query($query); + $r = $ilDB->query($query); - while ($row = $ilDB->fetchObject($r)) { - $arr[] = $row->title; + while ($row = $ilDB->fetchObject($r)) { + $arr[] = $row->title; + } } - return $arr; } @@ -215,18 +214,17 @@ public function getInstalledLanguages(): array public function getInstalledLocalLanguages(): array { global $ilDB; - - $arr = array(); - - $query = "SELECT * FROM object_data " . + $arr = []; + if ($ilDB instanceof ilDBInterface) { + $query = "SELECT * FROM object_data " . "WHERE type = " . $ilDB->quote("lng", "text") . " " . "AND description = " . $ilDB->quote("installed_local", "text"); - $r = $ilDB->query($query); + $r = $ilDB->query($query); - while ($row = $ilDB->fetchObject($r)) { - $arr[] = $row->title; + while ($row = $ilDB->fetchObject($r)) { + $arr[] = $row->title; + } } - return $arr; } From 681929fad34c34b4b154b8b04780152b9d4395bf Mon Sep 17 00:00:00 2001 From: Stefan Meyer Date: Thu, 12 Sep 2024 12:21:42 +0200 Subject: [PATCH 13/23] 0041980: Participants tab of session broken after notification has been activated --- .../Session/classes/class.ilSessionParticipantsTableGUI.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Session/classes/class.ilSessionParticipantsTableGUI.php b/Modules/Session/classes/class.ilSessionParticipantsTableGUI.php index b7d59ad57691..757ff16683e1 100644 --- a/Modules/Session/classes/class.ilSessionParticipantsTableGUI.php +++ b/Modules/Session/classes/class.ilSessionParticipantsTableGUI.php @@ -287,19 +287,19 @@ protected function matchesFilterCriteria(array $a_user_info): bool } switch ($filter) { case 'roles': - if (!in_array($filter_value, $a_user_info['role_ids'])) { + if (!in_array($filter_value, ($a_user_info['role_ids'] ?? []))) { return false; } break; case 'filter_participated': - if (!$a_user_info['participated']) { + if (!($a_user_info['participated'] ?? false)) { return false; } break; case 'filter_registration': - if (!$a_user_info['registered']) { + if (!($a_user_info['registered'] ?? false)) { return false; } break; From e3c7bf03e6605f063b6442911ff544705dbcee7c Mon Sep 17 00:00:00 2001 From: Stefan Meyer Date: Thu, 12 Sep 2024 12:49:37 +0200 Subject: [PATCH 14/23] 0041962: Trash: Info Message on Approach --- Services/Container/classes/class.ilContainerGUI.php | 3 +++ lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 3 files changed, 5 insertions(+) diff --git a/Services/Container/classes/class.ilContainerGUI.php b/Services/Container/classes/class.ilContainerGUI.php index 6b7f390315b2..9c36aac669d4 100644 --- a/Services/Container/classes/class.ilContainerGUI.php +++ b/Services/Container/classes/class.ilContainerGUI.php @@ -2564,6 +2564,9 @@ public function trashObject(): void $this->tabs_gui->activateTab('trash'); + $this->lng->loadLanguageModule('cont'); + $tpl->setOnScreenMessage('info', $this->lng->txt('cont_trash_general_usage')); + $trash_table = new ilTrashTableGUI($this, 'trash', $this->object->getRefId()); $trash_table->init(); $trash_table->parse(); diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 4b722948e2fe..83ebc99de3af 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -6095,6 +6095,7 @@ cont#:#cont_tile_size_3#:#sehr groß (bis zu zwei Kacheln in einer Zeile) cont#:#cont_tile_size_4#:#volle Breite (eine Kachel in einer Zeile) cont#:#cont_tile_view#:#Kacheln cont#:#cont_tile_view_info#:#Untergeordnete Objekte als Kacheln anzeigen. Bilder für diese Kacheln können in den Einstellungen jedes einzelnen Objekts hochgeladen werden. +cont#:#cont_trash_general_usage#:#Um größere Mengen alter, gelöschter Objekte aus dem System zu entfernen, ist es empfehlenswert zunächst die Nicht-Container (etwa Dateien, Glossare, Tests, ..) und so alle Objekte aus den Container-Objekten (Kategorien, Kurse, Gruppen, Lernsequenzen,..) zu entfernen. Die Filter "Typ" und "Gelöscht am" unterstützen den Vorgang. Abschließend löschen Sie dann die Container. contact#:#contact_awrn_ap_contacts#:#Bestätigte Kontakte contact#:#contact_awrn_ap_contacts_info#:#Alle bestätigten Kontakte eines Benutzers werden aufgelistet. contact#:#contact_awrn_req_contacts#:#Kontaktanfragen diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index bb5b10e30b7d..3d7198004b3b 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -6095,6 +6095,7 @@ cont#:#cont_tile_size_3#:#extra large (up to two tiles in a row) cont#:#cont_tile_size_4#:#full (one tile in a row) cont#:#cont_tile_view#:#Tiles cont#:#cont_tile_view_info#:#Objects located within this container are displayed in the form of thumbnail-style tiles. Images for these tiles can be uploaded in the settings of each individual object. +cont#:#cont_trash_general_usage#:#If you want to remove a huge amount of old, deleted objects from the system it is highly advisable to start with non-container objects (i.e. Files, Glossaries, Tests,..) and thus removing all objects from the containers (Categories, Courses, Groups, Learning Sequences,...) . Using the filters "Type" and "Deleted on" helps this process. Then finally remove the containers. contact#:#contact_awrn_ap_contacts#:#Approved Contacts contact#:#contact_awrn_ap_contacts_info#:#All contacts approved by the user are listed. contact#:#contact_awrn_req_contacts#:#Contact Requests From c9ec6c30b8ec7839f74267864ce595213d066325 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 9 Sep 2024 10:20:44 +0200 Subject: [PATCH 15/23] SAML: Don't enforce "Nanny Coding" (copyright: mbecker) --- Services/Saml/classes/class.ilAuthProviderSaml.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/Saml/classes/class.ilAuthProviderSaml.php b/Services/Saml/classes/class.ilAuthProviderSaml.php index e9eb0efbc9be..f977c41cf43c 100644 --- a/Services/Saml/classes/class.ilAuthProviderSaml.php +++ b/Services/Saml/classes/class.ilAuthProviderSaml.php @@ -21,7 +21,7 @@ /** * Class ilAuthProviderSaml */ -final class ilAuthProviderSaml extends ilAuthProvider implements ilAuthProviderAccountMigrationInterface +class ilAuthProviderSaml extends ilAuthProvider implements ilAuthProviderAccountMigrationInterface { private const LOG_COMPONENT = 'auth'; From 7e5f36a7f04bb576d75a93e7e06cf84106a40162 Mon Sep 17 00:00:00 2001 From: iszmais <45942348+iszmais@users.noreply.github.com> Date: Thu, 12 Sep 2024 16:07:45 +0200 Subject: [PATCH 16/23] Remove dc plugin field if no plugins exists (#8063) --- .../class.ilDclBaseFieldRepresentation.php | 21 ++++++++++--------- .../class.ilDclPluginFieldRepresentation.php | 8 ++----- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/Modules/DataCollection/classes/Fields/Base/class.ilDclBaseFieldRepresentation.php b/Modules/DataCollection/classes/Fields/Base/class.ilDclBaseFieldRepresentation.php index c69f22edff04..23b77b4cc754 100644 --- a/Modules/DataCollection/classes/Fields/Base/class.ilDclBaseFieldRepresentation.php +++ b/Modules/DataCollection/classes/Fields/Base/class.ilDclBaseFieldRepresentation.php @@ -135,23 +135,24 @@ public function addFieldCreationForm( string $mode = "create" ): void { $opt = $this->buildFieldCreationInput($dcl, $mode); - - if ($mode != 'create' && $this->getField()->getDatatypeId() == ilDclDatatype::INPUTFORMAT_PLUGIN) { - $new_plugin_title = $opt->getTitle(); - $plugin_name = ilDclFieldFactory::getPluginNameFromFieldModel($this->getField()); - if ($plugin_name !== "DclBase") { - $new_plugin_title .= ': ' . $plugin_name; + if ($opt !== null) { + if ($mode != 'create' && $this->getField()->getDatatypeId() == ilDclDatatype::INPUTFORMAT_PLUGIN) { + $new_plugin_title = $opt->getTitle(); + $plugin_name = ilDclFieldFactory::getPluginNameFromFieldModel($this->getField()); + if ($plugin_name !== "DclBase") { + $new_plugin_title .= ': ' . $plugin_name; + } + $opt->setTitle($new_plugin_title); } - $opt->setTitle($new_plugin_title); - } - $form->addOption($opt); + $form->addOption($opt); + } } /** * Build the creation-input-field */ - protected function buildFieldCreationInput(ilObjDataCollection $dcl, string $mode = 'create'): ilRadioOption + protected function buildFieldCreationInput(ilObjDataCollection $dcl, string $mode = 'create'): ?ilRadioOption { $opt = new ilRadioOption( $this->lng->txt('dcl_' . $this->getField()->getDatatype()->getTitle()), diff --git a/Modules/DataCollection/classes/Fields/Plugin/class.ilDclPluginFieldRepresentation.php b/Modules/DataCollection/classes/Fields/Plugin/class.ilDclPluginFieldRepresentation.php index a388cff183df..b149b597e6fe 100644 --- a/Modules/DataCollection/classes/Fields/Plugin/class.ilDclPluginFieldRepresentation.php +++ b/Modules/DataCollection/classes/Fields/Plugin/class.ilDclPluginFieldRepresentation.php @@ -20,7 +20,7 @@ class ilDclPluginFieldRepresentation extends ilDclBaseFieldRepresentation { - protected function buildFieldCreationInput(ilObjDataCollection $dcl, string $mode = 'create'): ilRadioOption + protected function buildFieldCreationInput(ilObjDataCollection $dcl, string $mode = 'create'): ?ilRadioOption { $opt = parent::buildFieldCreationInput($dcl, $mode); @@ -45,11 +45,7 @@ protected function buildFieldCreationInput(ilObjDataCollection $dcl, string $mod } else { } } else { - $plugin_selection = new ilNonEditableValueGUI( - $this->lng->txt('dcl_plugin_no_hooks_available'), - 'prop_' . ilDclBaseFieldModel::PROP_PLUGIN_HOOK_NAME - ); - $opt->addSubItem($plugin_selection); + return null; } } From 2d5fce5c5113ebc1af1c07b39f8f86e9669d723f Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 9 Sep 2024 08:38:30 +0200 Subject: [PATCH 17/23] HTTP: Fix sending `Set-Cookie` HTTP header See: https://mantis.ilias.de/view.php?id=41226 --- .../Response/Sender/DefaultResponseSenderStrategy.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/HTTP/Response/Sender/DefaultResponseSenderStrategy.php b/src/HTTP/Response/Sender/DefaultResponseSenderStrategy.php index 97caebe438e7..64ea1446ebad 100644 --- a/src/HTTP/Response/Sender/DefaultResponseSenderStrategy.php +++ b/src/HTTP/Response/Sender/DefaultResponseSenderStrategy.php @@ -87,7 +87,14 @@ public function sendResponse(ResponseInterface $response): void //render all headers foreach (array_keys($response->getHeaders()) as $key) { - header("$key: " . $response->getHeaderLine($key)); + // See Mantis #37385. + if (strtolower($key) === 'set-cookie') { + foreach ($response->getHeader($key) as $header) { + header("$key: " . $header, false); + } + } else { + header("$key: " . $response->getHeaderLine($key)); + } } //rewind body stream From 9b0e98984384d72e3eb79bb7e6caca5c9b545540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss-K=C3=A1lm=C3=A1n=20D=C3=A1niel?= Date: Fri, 13 Sep 2024 10:56:31 +0200 Subject: [PATCH 18/23] hun - 20240913 --- lang/ilias_hu.lang | 50 +++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/lang/ilias_hu.lang b/lang/ilias_hu.lang index 43ae625fa5d6..bcd466d10fe8 100644 --- a/lang/ilias_hu.lang +++ b/lang/ilias_hu.lang @@ -20,7 +20,7 @@ * @module language file Hungarian * @modulegroup language * @author Kiss-Kálmán Dániel -* @version 9.x 2024-06-09 +* @version 9.x 2024-09-13 */ // The language file starts beyond the HTML-comment below. DO NOT modify this line! // To edit your language file with a spreadsheet (i.e. Excel or StarCalc) remove all lines @@ -3461,7 +3461,7 @@ common#:#adve_assessment_settings#:#Teszt- és kiértékelés common#:#adve_frm_post_settings#:#Fórumhozzászólások common#:#adve_general_settings#:#Általános beállítások common#:#adve_survey_settings#:#Kérdőív -common#:#agree_date#:#Agreed on###27 08 2024 new variable +common#:#agree_date#:#Elfogadva ekkor: common#:#all#:#Összes common#:#all_global_roles#:#Globális szerepek common#:#all_local_roles#:#Helyi szerepek (összes) @@ -5971,7 +5971,7 @@ common#:#webfolder_dir_info#:#Böngészője nem tud webmappákat megnyitni. Olva common#:#webfolder_index_of#:#%1$s indexe common#:#webfolder_instructions#:#Leírás webmappa használatához common#:#webfolder_instructions_info#:#Azokban a böngészőkben, amelyek nem tudnak webmappákat közvetlenül megnyitni, a webmappa-utasítások láthatók. HTML-kódot és az alábbi dzsókerelemeket használhatja: [WEBFOLDER_TITLE], [WEBFOLDER_URI], [WEBFOLDER_URI], [WEBFOLDER_URI_KONQUEROR], [WEBFOLDER_URI_NAUTILUS], [ADMIN_MAIL], [WINDOWS]...[/WINDOWS], [MAC]...[/MAC], [LINUX]...[/LINUX]. Törölje ki a mezőt, hogy megkapja az alapértelmezett utasításokat! -common#:#webfolder_instructions_text#:#[WINDOWS]

Utasítások Windows rendszerrel történő csatlakozáshoz

  1. Nyissa meg a Fájlkezelőt (például Windows + E billentyűkombináció).
  2. Válassza a 'Hálózati meghajtó csatlakoztatása' opciót.
  3. Adja a meg hálózati csatlakoztatandó mappának az következőt (másolja majd illessze be az URL-t):

    [WEBFOLDER_URI]

  4. Kattintson a 'Befejezés' gombra.
  5. Amennyiben szükséges, adja meg felhasználónevét és jelszavát.
  6. Ezután a hálózati meghajtót a többi meghajtók között megtalálja.

Felhasználóneve és jelszava ugyanaz, mint amivel az ILIAS-ba be tud jelentkezni. Jelszavát a személyes beállításai alatt tudja megváltoztatni.[/WINDOWS][MAC]

Utasítások Mac OS X rendszerrel történő csatlakozáshoz

  1. Nyissa meg a Keresőt (Finder).
  2. Válassza a 'Menj > Kapcsolódás Szerverhez...' menüt.
    Erre a 'Kapcsolódás szerverhez' dialógusablak nyílik meg.
  3. Szerver URL-nek a következő URL-t adja meg:
    [WEBFOLDER_URI]
    és válassza a ’Kapcsolódás’-t.
  4. Adja meg felhasználónevét és jelszavát, majd nyomja meg az 'OK' gombot.

Felhasználóneve és jelszava ugyanaz, mint amivel az ILIAS-ba be tud jelentkezni. Jelszavát a 'Munkaasztal' 'Beállítások' menüben alatt tudja megváltoztatni.[/MAC][LINUX]

Utasítások Linux rendszerhez Konquerorral történő csatlakozáshoz

  1. Indítsa el a Konqueror böngészőt.
  2. Szerver URL-nek a következő URL-t adja meg:
    [WEBFOLDER_URI_KONQUEROR]
    majd nyomja meg az Enter billentyűt.
  3. Adja meg felhasználónevét és jelszavát, majd nyomja meg az 'OK' gombot.

Utasítások Linux rendszerhez Nautilus-szal történő csatlakozáshoz

  1. Indítsa el a Nautilus böngészőt.
  2. Szerver URL-nek a következő URL-t adja meg:
    [WEBFOLDER_URI_NAUTILUS]
    majd nyomja meg az Enter billentyűt..
  3. Adja meg felhasználónevét és jelszavát, majd nyomja meg az 'OK' gombot.

Felhasználóneve és jelszava ugyanaz, mint amivel az ILIAS-ba be tud jelentkezni. Jelszavát a 'Munkaasztal' 'Beállítások' menüben alatt tudja megváltoztatni.[/LINUX]

Tippek & támogatás

  • Ezeket a lépéséket csak egyszer szükséges végrehajtani. Később is elérheti ezt a kapcsolatot.
  • Almappához csatlakozhat, de a mappától felfelé már nem tud lépni.
  • Ha nem sikerül elérnie a hálózati meghajtót, vegye fel a kapcsolatot egy rendszergazdával.
+common#:#webfolder_instructions_text#:#[WINDOWS]

Utasítások Windows rendszerrel történő csatlakozáshoz

  1. Nyissa meg a Fájlkezelőt (például Windows + E billentyűkombináció).
  2. Válassza a 'Hálózati meghajtó csatlakoztatása' opciót.
  3. Adja a meg hálózati csatlakoztatandó mappának az következőt (másolja majd illessze be az URL-t):

    [WEBFOLDER_URI]

  4. Kattintson a 'Befejezés' gombra.
  5. Amennyiben szükséges, adja meg felhasználónevét és jelszavát.
  6. Ezután a hálózati meghajtót a többi meghajtók között megtalálja.

Felhasználóneve és jelszava ugyanaz, mint amivel az ILIAS-ba be tud jelentkezni. Jelszavát a személyes beállításai alatt tudja megváltoztatni.[/WINDOWS][MAC]

Utasítások Mac OS X rendszerrel történő csatlakozáshoz

  1. Nyissa meg a Keresőt (Finder).
  2. Válassza a 'Menj > Kapcsolódás Szerverhez...' menüt.
    Erre a 'Kapcsolódás szerverhez' dialógusablak nyílik meg.
  3. Szerver URL-nek a következő URL-t adja meg:
    [WEBFOLDER_URI]
    és válassza a ’Kapcsolódás’-t.
  4. Adja meg felhasználónevét és jelszavát, majd nyomja meg az 'OK' gombot.

Felhasználóneve és jelszava ugyanaz, mint amivel az ILIAS-ba be tud jelentkezni. Jelszavát a 'Munkaasztal' 'Beállítások' menüben alatt tudja megváltoztatni.[/MAC][LINUX]

Utasítások Linux rendszerhez Konquerorral történő csatlakozáshoz

  1. Indítsa el a Konqueror böngészőt.
  2. Szerver URL-nek a következő URL-t adja meg:
    [WEBFOLDER_URI_KONQUEROR]
    majd nyomja meg az Enter billentyűt.
  3. Adja meg felhasználónevét és jelszavát, majd nyomja meg az 'OK' gombot.

Utasítások Linux rendszerhez Nautilus-szal történő csatlakozáshoz

  1. Indítsa el a Nautilus böngészőt.
  2. Szerver URL-nek a következő URL-t adja meg:
    [WEBFOLDER_URI_NAUTILUS]
    majd nyomja meg az Enter billentyűt..
  3. Adja meg felhasználónevét és jelszavát, majd nyomja meg az 'OK' gombot.

Felhasználóneve és jelszava ugyanaz, mint amivel az ILIAS-ba be tud jelentkezni. Jelszavát a 'Munkaasztal' 'Beállítások' menüben alatt tudja megváltoztatni.[/LINUX]

Tippek & támogatás

  • Ezeket a lépéséket csak egyszer szükséges végrehajtani. Később is elérheti ezt a kapcsolatot.
  • Almappához csatlakozhat, de a mappától felfelé már nem tud lépni.
  • Ha nem sikerül elérnie a hálózati meghajtót, vegye fel a kapcsolatot egy rendszergazdával.
common#:#webfolder_instructions_titletext#:#Megnyitás webmappaként common#:#webfolder_mount_dir_with#:#Nyissa meg webmappaként ezt a lapot Internet Explorerrel, Konquerorral, Nautilusszal, más böngészővel. common#:#webr#:#Weblink @@ -6044,7 +6044,7 @@ cont#:#cont_news_timeline_info#:#Hírek idővonal lapjának bekapcsolása cont#:#cont_news_timeline_landing_page#:#Kezdőoldal cont#:#cont_news_timeline_landing_page_info#:#Az Idővonal lap lesz a kezdőoldal. cont#:#cont_news_timeline_tab#:#Idővonal -cont#:#cont_no_title#:#Empty Title###30 07 2024 new variable +cont#:#cont_no_title#:#Üres cím cont#:#cont_page_type_cont#:#Tartalomtár oldal (kurzusok, csoportok, ...) cont#:#cont_page_type_cstr#:#Kurzus kezdő oldala (tanulási cél nézet) cont#:#cont_path#:#Útvonal @@ -6976,7 +6976,7 @@ content#:#cont_sc_auto_continue_info#:#A felhasználókat az utolsó aktivitásu content#:#cont_sc_auto_review_2004#:#Adatrögzítés befejezése content#:#cont_sc_auto_review_completed#:#ha a korábbi állapot befejezte content#:#cont_sc_auto_review_completed_and_passed#:#ha a korábbi állapot befejezte és sikeresen teljesítette -content#:#cont_sc_auto_review_completed_not_failed_or_passed#:#ha a korábbi állapot befejezte vagy sikeresen teljesítette, de nem nem teljesítette +content#:#cont_sc_auto_review_completed_not_failed_or_passed#:#ha a korábbi állapot befejezte vagy sikeresen teljesítette, de nem nem teljesítette content#:#cont_sc_auto_review_completed_or_passed#:#ha a korábbi állapot befejezte vagy sikeresen teljesítette content#:#cont_sc_auto_review_info_2004#:#A felhasználó nyomkövetési állapotát zároljuk egy fejezetnél/SCO-nál, amikor a fentebbiek közül a kiválasztottra vált. Későbbi látogatások során az állapot már nem módosul.
Válassza a 'soha (megfelel a SCORM specifikációnak)' beállítást, ha a tananyag használja a SCORM 2004 szerinti 'Szekvenálás & Navigáció'-t. content#:#cont_sc_auto_review_no#:#soha (megfelel a SCORM specifikációnak) @@ -7502,8 +7502,8 @@ crs#:#crs_course_period_not_valid#:#A kurzusidőszak nem érvényes. crs#:#crs_course_status_of_users#:#Kurzus teljesítése crs#:#crs_create_date#:#Dátum létrehozása crs#:#crs_custom_user_fields#:#Kurzushoz tartozó felhasználói adatok -crs#:#crs_custom_user_fields_infobox#:#Create additional data fields for course members to fill in when joining. You can show this information as an additional column in the "Members" tab.###30 04 2024 new variable -crs#:#crs_custom_user_fields_table_title#:#Relevant User Data of This Course###18 06 2024 new variable +crs#:#crs_custom_user_fields_infobox#:#További adatmezők létrehozása a kurzustagok számára, amelyeket csatlakozáskor ki kell töltenük. Ezt az információt további oszlopként is megjelenítheti a 'Tagok' lapon. +crs#:#crs_custom_user_fields_table_title#:#A kurzus releváns felhasználói adatai crs#:#crs_dates#:#Dátumok crs#:#crs_deactivate_notification#:#Értesítés kikapcsolása crs#:#crs_delete_objectve_sure#:#Biztos, hogy törli a kiválasztott célokat? @@ -7862,7 +7862,7 @@ crs#:#crs_subject_course_group_notification#:#Napi levél ehhez: %s crs#:#crs_subscribe_member#:#'%s' kurzusra regisztráció crs#:#crs_subscribe_member_body#:#ezúton értesítjük, hogy '%s' kurzusra sikeresen regisztrált. crs#:#crs_subscribe_wl#:#'%s' kurzusra regisztráció -crs#:#crs_subscribe_wl_body#:#ezúton értesítjük, hogy '%s' kurzus várólistájára felkerült. Ön a(z) %s. a listán. A kurzusvezető üzenetet fog küldeni kérésének elfogadásáról vagy elutasításáról. +crs#:#crs_subscribe_wl_body#:#ezúton értesítjük, hogy '%s' kurzus várólistájára felkerült. Ön a(z) %s. a listán. A kurzusvezető üzenetet fog küldeni kérésének elfogadásáról vagy elutasításáról. crs#:#crs_subscriber#:#Csatlakozni kívánó crs#:#crs_subscribers_deleted#:#Törölt csatlakozni kívánó(k) crs#:#crs_subscription#:#Feliratkozás @@ -8855,8 +8855,8 @@ didactic#:#grp_closed_info#:#A csoportot csak tagjaik láthatják. didactic#:#more_translations#:#További fordítások didactic#:#sess_closed#:#Zárt esemény didactic#:#sess_closed_info#:#Az eseményt csak a résztvevőik láthatják. -dpro#:#dpro_accept_usr_agreement_anonymous#:#Declaration of Data Protection###18 06 2024 new variable -dpro#:#dpro_accept_usr_agreement_anonymous_intro#:#Before you proceed to ILIAS you accept the following Declaration of Data Protection.###18 06 2024 new variable +dpro#:#dpro_accept_usr_agreement_anonymous#:#Adatvédelmi Nyilatkozat +dpro#:#dpro_accept_usr_agreement_anonymous_intro#:#Mielőtt továbblép az ILIAS-hoz, elfogadja az alábbi Adatvédelmi Nyilatkozatot. dpro#:#dpro_account_reg_not_possible#:#A regisztráció jelenleg nem lehetséges, mert nincs Adatvédelmi Nyilatkozat. Kérem, további információért keresse a rendszer üzemeltetőjét. dpro#:#dpro_agree_date#:#Adatvédelmi Nyilatkozat elfogadása dpro#:#dpro_last_reset_date#:#Az Adatvédelmi Nyilatkozatot elfogadásait törölték (%s). Csak akkor tegye ezt meg újra, ha módosult az Adatvédelmi Nyilatkozat tartalma és ezért azt újra el kell fogadtatni a felhasználókkal. @@ -9475,7 +9475,7 @@ exc#:#exc_rel_start_latest_lead_text#:#%s a legkésőbbi exc#:#exc_rel_start_lead_text#:#Submit %s nappal a kezdés után exc#:#exc_relative_date#:#Relatív Dátum exc#:#exc_relative_date_info#:#Az összes felhasználónál a feladat megkezdésétől számítjuk a határidőt. -exc#:#exc_relative_date_period#:#Working Time###30 07 2024 new variable +exc#:#exc_relative_date_period#:#Munkaidő exc#:#exc_rem_time_after_start#:#Hátralévő idő exc#:#exc_reminder_cron_ok#:#Emlékeztető kiküldve: exc#:#exc_reminder_end#:#Emlékeztetők vége @@ -9695,7 +9695,7 @@ exp#:#exp_scorm#:#SCORM exp#:#exp_show_print_view#:#Nyomtatási nézet megjelenítése exp#:#exp_xml#:#XML exp#:#export_created#:#Új exportfájl jött létre. -exp#:#export_files_deleted#:#The selected export files have been deleted.###18 06 2024 new variable +exp#:#export_files_deleted#:#A kijelölt exportfájlokat sikeresen törölte. export#:#export_create#:#Létrehozás export#:#export_create_new_file#:#Új exportfájl létrehozása export#:#export_existing#:#Újrafelhasználás @@ -10215,7 +10215,7 @@ grp#:#grp_create_or_use_existing#:#Meglévő vagy új csoporthoz hozzáadja a fe grp#:#grp_created_and_user_been_added#:#A csoportot sikeresen létrehozta és a felhasználót sikeresen hozzáadta. grp#:#grp_custom_user_fields#:#Csoporthoz tartozó felhasználói adatok grp#:#grp_custom_user_fields_infobox#:#Create additional data fields for group members to fill in when they join. You can show this information as an additional column in the "Members" tab.###30 04 2024 new variable -grp#:#grp_custom_user_fields_table_title#:#Relevant User Data of This Group###18 06 2024 new variable +grp#:#grp_custom_user_fields_table_title#:#A csoport releváns felhasználói adatai grp#:#grp_deactivate_notification#:#Értesítés kikapcsolása grp#:#grp_edit_members#:#Résztvevők módosítása grp#:#grp_enable_map#:#Csoporttérkép engedélyezése @@ -10264,7 +10264,7 @@ grp#:#grp_mail_tutors_only_info#:#Csak vezetők használhatják a 'Tagok' lapon grp#:#grp_mail_type#:#Levél küldése tagoknak grp#:#grp_mail_unsubscribe_member_bod#:#ezúton tájékoztatjuk, hogy '%s' csoportból tagságát sikeresen töröltük. grp#:#grp_mail_unsubscribe_member_sub#:#'%s' csoporttagság törlése -grp#:#grp_mail_wl_bod#:#'%s' csoport várólistájára felkerült. Ön a(z) %s. a listán. Üzenetben fogja értesíteni Önt a csoportvezető, amikor kérését elfogadják vagy elutasítják. +grp#:#grp_mail_wl_bod#:#'%s' csoport várólistájára felkerült. Ön a(z) %s. a listán. Üzenetben fogja értesíteni Önt a csoportvezető, amikor kérését elfogadják vagy elutasítják. grp#:#grp_mail_wl_sub#:#'%s' csoportba regisztráció grp#:#grp_map_location#:#Csoporttérkép helye grp#:#grp_map_settings#:#Térképbeállítások @@ -11557,11 +11557,11 @@ mathjax#:#mathjax_limiter#:#Beágyazott határolójelek mathjax#:#mathjax_limiter_info#:#Válassza ki a beágyazott határolójeleket, ahogy azok az Ön MathJax installációjában konfiguráltak. mathjax#:#mathjax_mathjax#:#MathJax mathjax#:#mathjax_polyfill_url#:#Polyfill URJ-je -mathjax#:#mathjax_polyfill_url_desc_line1#:#For MathJax 2 and MathJax 3 with current browsers not needed. -mathjax#:#mathjax_polyfill_url_desc_line2#:#Please remove any reference to polyfill.io! See https://sansec.io/research/polyfill-supply-chain-attack +mathjax#:#mathjax_polyfill_url_desc_line1#:#MathJax 2-höz és 3-hoz nem szükséges +mathjax#:#mathjax_polyfill_url_desc_line2#:#Távolítson el minden polyfill.io hivatkozást! Lásd https://sansec.io/research/polyfill-supply-chain-attack mathjax#:#mathjax_script_url#:#MathJax Script URL-je mathjax#:#mathjax_script_url_desc_line1#:#MathJax 2-höz például %s -mathjax#:#mathjax_script_url_desc_line2#:#Kérem, aktiválja a biztonságos módot, hogy elkerülje a MathJax kódon keresztüli javascript-alapú XSS-támadásokat. MathJax 2 alatt ezt a CDN url-hez a 'Safe' paraméter hozzádásával teheti meg. MathJax 3 alatt egy szkriptet kell beletennie, ami ezt beállítja, mielőtt a MathJax betöltődik. Például: %s +mathjax#:#mathjax_script_url_desc_line2#:#Kérem, aktiválja a biztonságos módot, hogy elkerülje a MathJax kódon keresztüli javascript-alapú XSS-támadásokat. MathJax 2 alatt ezt a CDN url-hez a 'Safe' paraméter hozzádásával teheti meg. MathJax 3 alatt egy szkriptet kell beletennie, ami ezt beállítja, mielőtt a MathJax betöltődik. Például: https://domain/ilias/Services/MathJax/js/cdn-mathjax3-es5-tex-mml-chtml-safe.js mathjax#:#mathjax_server_address#:#Szerver címe mathjax#:#mathjax_server_address_info#:#Például http://localhost:8003 mathjax#:#mathjax_server_cache_cleared#:#A MathJax gyorsítótárát sikeresen ürítette. @@ -12566,7 +12566,7 @@ mme#:#type_separator#:#Elválasztó mme#:#type_separator_info#:#Ennek az elemnek a címe egy szürke sávban fog megjelenni. Amennyiben nem ad meg címet, egy egyszerű vonal fog ott megjelenni. mme#:#type_top_link_item#:#Linkel mme#:#type_top_parent_item#:#Tartalmazza -mme#:#unable_to_render#:#Unable to show '%s' in '%s'.###18 06 2024 new variable +mme#:#unable_to_render#:#'%s' / '%s' nem jeleníthető meg. mob#:#mob_choose_from_pool#:#Választás médiagyűjteményből mob#:#mob_external_url#:#Külső URL mob#:#mob_extract_preview_image#:#Előnézeti kép kicsomagolása @@ -14656,8 +14656,8 @@ registration#:#reg_direct#:#Közvetlen regisztráció registration#:#reg_direct_info#:#Új felhasználó regisztrációkérése automatikusan jóváhagyásra kerül. registration#:#reg_disabled#:#Regisztráció nem lehetséges registration#:#reg_domain#:#Tartomány -registration#:#reg_domain_already_assigned_p#:#The domains '%s' were already entered for another role.###27 08 2024 new variable -registration#:#reg_domain_already_assigned_s#:#The domain '%s' was already entered for another role. ###27 08 2024 new variable +registration#:#reg_domain_already_assigned_p#:#'%s' domainek már másik szerephez hozzá vannak rendelve. +registration#:#reg_domain_already_assigned_s#:#'%s' domain már másik szerephez hozzá van rendelve. registration#:#reg_email#:#Automatikus szerep-összerendelés registration#:#reg_email_domains#:#Az alábbi e-mail cím domain-ek érvényesek: %s registration#:#reg_email_domains_code#:#Regisztrációs kóddal bármely e-mail cím érvényes. @@ -16665,7 +16665,7 @@ survey#:#svy_page_add_question#:#Új %s létrehozása survey#:#svy_page_error#:#Egy kérdés megválaszolásakor egy hiba jelentkezett. További információért keresse meg a kérdést! survey#:#svy_page_errors#:#Kérdések megválaszolásakor hibák jelentkeztek. További információért keresse meg a kérdéseket! survey#:#svy_participant#:#Résztvevő -survey#:#svy_participants#:#Participants###30 07 2024 new variable +survey#:#svy_participants#:#Résztvevők survey#:#svy_participation#:#Részvétel survey#:#svy_please_select_unused_codes#:#Válasszon egy, még el nem használt kódot. survey#:#svy_print_hide_labels#:#Címkék elrejtése @@ -16865,8 +16865,8 @@ tbl#:#tbl_template_created#:#Ezt a nézetet sikeresen mentette. tbl#:#tbl_template_delete#:#Mentett nézet törlése tbl#:#tbl_template_deleted#:#A mentett nézetet sikeresen törölte. tbl#:#tbl_templates#:#Nézet -tos#:#tos_accept_usr_agreement_anonymous#:#Terms of Service###18 06 2024 new variable -tos#:#tos_accept_usr_agreement_anonymous_intro#:#Before you proceed to ILIAS you accept the following Terms of Service.###18 06 2024 new variable +tos#:#tos_accept_usr_agreement_anonymous#:#Szolgáltatási feltételek +tos#:#tos_accept_usr_agreement_anonymous_intro#:#Mielőtt továbblép az ILIAS-hoz, elfogadja az alábbi Szolgáltatási feltételeket tos#:#tos_account_reg_not_possible#:#Nem regisztrálhatja saját magát, mert hiányzik a Szolgáltatási feltételek. További információkért vegye fel a kapcsolatot a rendszerüzemeltetőkkel. tos#:#tos_agree_date#:#Elfogadás időpontja tos#:#tos_agreement#:#Szolgáltatási feltételek @@ -17148,7 +17148,7 @@ tstv#:#tstv_create#:#Tesztigazolás létrehozása tstv#:#tstv_create_info#:#Válasszon ki egy befejezett tesztet, hogy igazolást generáljon hozzá. ui#:#datatable_multiaction_label#:#Tömeges művelet ui#:#datatable_multiactionmodal_actionlabel#:#művelet -ui#:#datatable_multiactionmodal_apply#:#Apply###18 06 2024 new variable +ui#:#datatable_multiactionmodal_apply#:#Alkalmazás ui#:#datatable_multiactionmodal_listentry#:#alakmazás az összes objektumra ui#:#datatable_multiactionmodal_msg#:#Vigyázat! Több objektumra van hatással. ui#:#datatable_multiactionmodal_title#:#Művelet több objektumon. @@ -17211,7 +17211,7 @@ user#:#enable_local_user_administration#:#Helyi ILIAS-fiókok kezelésének enge user#:#enable_local_user_administration_info#:#A 'Helyi ILIAS-fiókok kezelése' lap megjelenik a kategóriáknál és a szervezeti egységeknél. user#:#feedhash#:#Hírcsatorna-hash user#:#has_role#:#Szabály -user#:#info_accessFree_sure#:#Are you sure you want to remove the valid until date from the following accounts?###30 07 2024 new variable +user#:#info_accessFree_sure#:#Biztos, hogy eltávoltja az érvényesség korlátját az alábbi fiókokból? user#:#inform_user_mail_info#:#Email-t küldünk a felhasználónak. Az e-mail tartalma megadható itt: Rendszerbeállítások » ILIAS-fiókok » Beállítások » Új felhasználónak levél. user#:#interests#:#Érdeklődési körök user#:#interests_general#:#Általános érdeklődési kör From 0b0b29a0b1269bee1df27f8c7e665d3b7c28671b Mon Sep 17 00:00:00 2001 From: iszmais <45942348+iszmais@users.noreply.github.com> Date: Fri, 13 Sep 2024 11:43:21 +0200 Subject: [PATCH 19/23] Fix restore condition on upload rebuild (#8048) --- Services/Form/classes/class.ilPropertyFormGUI.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/Form/classes/class.ilPropertyFormGUI.php b/Services/Form/classes/class.ilPropertyFormGUI.php index 90714d15833d..285d296756a8 100644 --- a/Services/Form/classes/class.ilPropertyFormGUI.php +++ b/Services/Form/classes/class.ilPropertyFormGUI.php @@ -1030,7 +1030,7 @@ protected function rebuildUploadedFiles(): void $name = $file[7]; if ($idx2 != "") { - if (!isset($_FILES[$field]["tmp_name"][$idx]) || !$_FILES[$field]["tmp_name"][$idx][$idx2]) { + if (!isset($_FILES[$field]["tmp_name"][$idx][$idx2])) { $_FILES[$field]["tmp_name"][$idx][$idx2] = $full_file; $_FILES[$field]["name"][$idx][$idx2] = $name; $_FILES[$field]["type"][$idx][$idx2] = $type; @@ -1039,7 +1039,7 @@ protected function rebuildUploadedFiles(): void $_FILES[$field]["is_upload"][$idx][$idx2] = false; } } elseif ($idx != "") { - if (!isset($_FILES[$field]["tmp_name"][$idx]) || $_FILES[$field]["tmp_name"][$idx]) { + if (!isset($_FILES[$field]["tmp_name"][$idx])) { $_FILES[$field]["tmp_name"][$idx] = $full_file; $_FILES[$field]["name"][$idx] = $name; $_FILES[$field]["type"][$idx] = $type; @@ -1048,7 +1048,7 @@ protected function rebuildUploadedFiles(): void $_FILES[$field]["is_upload"][$idx] = false; } } else { - if (!$_FILES[$field]["tmp_name"]) { + if (!isset($_FILES[$field]["tmp_name"])) { $_FILES[$field]["tmp_name"] = $full_file; $_FILES[$field]["name"] = $name; $_FILES[$field]["type"] = $type; From 5331066f69b2dff66e749db91d5a0231e795944c Mon Sep 17 00:00:00 2001 From: Lukas Scharmer Date: Fri, 13 Sep 2024 14:42:31 +0200 Subject: [PATCH 20/23] Chatroom: Bump npm package express to v4.21.0 --- Modules/Chatroom/chat/package-lock.json | 197 ++++++++---------------- Modules/Chatroom/chat/package.json | 2 +- 2 files changed, 61 insertions(+), 138 deletions(-) diff --git a/Modules/Chatroom/chat/package-lock.json b/Modules/Chatroom/chat/package-lock.json index ff57fe338434..3271ddebd234 100644 --- a/Modules/Chatroom/chat/package-lock.json +++ b/Modules/Chatroom/chat/package-lock.json @@ -9,7 +9,7 @@ "version": "2.0.0", "dependencies": { "async": "^3.2", - "express": "^4.20.0", + "express": "^4.21.0", "mysql": "^2.18.1", "node-mysql": "^0.4.2", "node-schedule": "^2.1.0", @@ -124,20 +124,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -451,9 +437,9 @@ } }, "node_modules/express": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", - "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -467,7 +453,7 @@ "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", @@ -476,11 +462,11 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", - "serve-static": "1.16.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -548,12 +534,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -572,6 +558,14 @@ "ms": "2.0.0" } }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -934,11 +928,11 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -1035,58 +1029,25 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serve-static": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", - "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/serve-static/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "node_modules/serve-static/node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-static/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static/node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8" } }, "node_modules/set-function-length": { @@ -1416,14 +1377,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "requires": { - "side-channel": "^1.0.6" - } } } }, @@ -1632,9 +1585,9 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "express": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", - "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -1648,7 +1601,7 @@ "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", @@ -1657,11 +1610,11 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", - "serve-static": "1.16.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -1705,12 +1658,12 @@ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -1726,6 +1679,11 @@ "ms": "2.0.0" } }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1981,11 +1939,11 @@ } }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "range-parser": { @@ -2071,55 +2029,20 @@ } }, "serve-static": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", - "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - } + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" } } }, diff --git a/Modules/Chatroom/chat/package.json b/Modules/Chatroom/chat/package.json index 01109f2a883f..c5141b32cd34 100644 --- a/Modules/Chatroom/chat/package.json +++ b/Modules/Chatroom/chat/package.json @@ -4,7 +4,7 @@ "version": "2.0.0", "dependencies": { "async": "^3.2", - "express": "^4.20.0", + "express": "^4.21.0", "mysql": "^2.18.1", "node-mysql": "^0.4.2", "node-schedule": "^2.1.0", From b4aa6d34a423bf13642c1c417704afa9a3abd664 Mon Sep 17 00:00:00 2001 From: Fred Neumann Date: Mon, 16 Sep 2024 08:02:48 +0200 Subject: [PATCH 21/23] new language variable for removing members from a mailing list (#7120) --- Services/Contact/classes/class.ilMailingListsGUI.php | 6 +++--- lang/ilias_de.lang | 2 ++ lang/ilias_en.lang | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Services/Contact/classes/class.ilMailingListsGUI.php b/Services/Contact/classes/class.ilMailingListsGUI.php index 3911b92935d7..2403c7ed33dc 100644 --- a/Services/Contact/classes/class.ilMailingListsGUI.php +++ b/Services/Contact/classes/class.ilMailingListsGUI.php @@ -488,7 +488,7 @@ static function (array $entry): int { ++$counter; } - $tbl->addMultiCommand('confirmDeleteMembers', $this->lng->txt('delete')); + $tbl->addMultiCommand('confirmDeleteMembers', $this->lng->txt('remove')); } else { $tbl->disable('header'); $tbl->disable('footer'); @@ -514,7 +514,7 @@ public function confirmDeleteMembers(): bool $c_gui = new ilConfirmationGUI(); $this->ctrl->setParameter($this, 'ml_id', $this->mlists->getCurrentMailingList()->getId()); $c_gui->setFormAction($this->ctrl->getFormAction($this, 'performDeleteMembers')); - $c_gui->setHeaderText($this->lng->txt('mail_sure_delete_entry')); + $c_gui->setHeaderText($this->lng->txt('mail_sure_remove_user')); $c_gui->setCancel($this->lng->txt('cancel'), 'showMembersList'); $c_gui->setConfirm($this->lng->txt('confirm'), 'performDeleteMembers'); @@ -570,7 +570,7 @@ public function performDeleteMembers(): bool $this->mlists->getCurrentMailingList()->deleteEntry($id); } } - $this->tpl->setOnScreenMessage('success', $this->lng->txt('mail_deleted_entry')); + $this->tpl->setOnScreenMessage('success', $this->lng->txt('mail_success_removed_user')); } else { $this->tpl->setOnScreenMessage('failure', $this->lng->txt('mail_delete_error')); } diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 83ebc99de3af..230cb29aed6b 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -11468,10 +11468,12 @@ mail#:#mail_smtp_user#:#Benutzer mail#:#mail_subject_prefix#:#Mail-Betreff mail#:#mail_subject_prefix_info#:#Sie können hier einen Text eingeben, der der Betreffzeile ausgehender, automatisch generierter E-Mails vorangestellt wird. Es wird empfohlen einen Präfix anzugeben, um Nutzern das Filtern der Nachrichten zu vereinfachen. mail#:#mail_subject_too_long#:#Der Betreff ist zu lang. +mail#:#mail_success_removed_user#:#Benutzer/innen aus der Liste entfernt. mail#:#mail_sure_delete#:#Sind Sie sicher, dass die markierten Mails gelöscht werden sollen? mail#:#mail_sure_delete_entry#:#Sind Sie sicher, dass die markierten Einträge gelöscht werden sollen? mail#:#mail_sure_delete_file#:#Sind Sie sicher, dass die ausgewählten Dateien gelöscht werden sollen? mail#:#mail_sure_delete_folder#:#Der Ordner und sein Inhalt werden unwiderruflich gelöscht! +mail#:#mail_sure_remove_user#:#Möchten Sie die folgenden Benutzer/innen aus der Liste entfernen? mail#:#mail_system_sys_env_from_addr#:#Technische Absendeadresse („SENDER“)###Modified as part of gender mainstreaming activities for ILIAS 8 mail#:#mail_system_sys_env_from_addr_info#:#Tragen Sie hier die technische Absendeadresse („SENDER”-Header) ein. Lassen Sie das Feld leer, wird bei externem Versand die E-Mail-Adresse der absendenden Person („FROM“-Header) genutzt. Andernfalls ist es die Aufgabe der Server-Administration, den Header zu konfigurieren.###Modified as part of gender mainstreaming activities for ILIAS 8 mail#:#mail_system_sys_from_addr#:#„FROM”-Adresse für automatisch versendete E-Mails diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 3d7198004b3b..d83d1d376b03 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -11468,10 +11468,12 @@ mail#:#mail_smtp_user#:#User mail#:#mail_subject_prefix#:#Mail Subject mail#:#mail_subject_prefix_info#:#Enter a text which will be prepended to the subject line of outgoing auto-generated e-mails. The usage of a prefix is recommended, as it makes it easier for users to filter messages. mail#:#mail_subject_too_long#:#The subject is too long. +mail#:#mail_success_removed_user#:#User(s) successfully removed from mailing list. mail#:#mail_sure_delete#:#Are you sure you want to delete the selected mail(s)? mail#:#mail_sure_delete_entry#:#Are you sure you want to delete the following entries? mail#:#mail_sure_delete_file#:#Are you sure you want to delete the selected file(s)? mail#:#mail_sure_delete_folder#:#The folder and its contents will be irrevocably deleted. +mail#:#mail_sure_remove_user#:#Are you sure you want to remove the following user(s) from the members list? mail#:#mail_system_sys_env_from_addr#:#Technical Sender mail#:#mail_system_sys_env_from_addr_info#:#If you leave this field empty, the sender e-mail address will be used if SMTP transfer is enabled. Otherwise it is the server administrator's responsibility to configure this value. mail#:#mail_system_sys_from_addr#:#Sender E-Mail (From) From ebc17ec0fe034e1324c194f64048aae9be577377 Mon Sep 17 00:00:00 2001 From: Michael Jansen Date: Mon, 16 Sep 2024 10:48:36 +0200 Subject: [PATCH 22/23] CI: Fix `php-cs-fixer` config (#7326) Our custom configuration does not work within `PhpStorm` because of deprecation issue: Detected deprecations in use: - Rule "function_typehint_space" is deprecated. Use "type_declaration_spaces" instead. See similar Issues: - https://youtrack.jetbrains.com/issue/WI-70582 - https://youtrack.jetbrains.com/issue/WI-70838 --- CI/PHP-CS-Fixer/code-format.php_cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CI/PHP-CS-Fixer/code-format.php_cs b/CI/PHP-CS-Fixer/code-format.php_cs index 0682aee0c5c3..ee99dc92f0a8 100644 --- a/CI/PHP-CS-Fixer/code-format.php_cs +++ b/CI/PHP-CS-Fixer/code-format.php_cs @@ -24,7 +24,7 @@ return (new PhpCsFixer\Config()) 'strict_param' => false, 'cast_spaces' => true, 'concat_space' => ['spacing' => 'one'], - 'function_typehint_space' => true, + 'type_declaration_spaces' => true, 'function_declaration' => ['closure_fn_spacing' => 'none'], 'binary_operator_spaces' => ['default' => 'single_space'], // 'types_spaces' => ['space' => 'single'], From a132bf8ca08d32a7cb97997913a20b266a8536e7 Mon Sep 17 00:00:00 2001 From: mjansen Date: Tue, 17 Sep 2024 10:37:25 +0200 Subject: [PATCH 23/23] LegalDocuments: Remove obsolete argument on `afterLogin` --- .../classes/class.ilLegalDocumentsAppEventListener.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/LegalDocuments/classes/class.ilLegalDocumentsAppEventListener.php b/Services/LegalDocuments/classes/class.ilLegalDocumentsAppEventListener.php index dd870a37065f..7d9b190a943f 100644 --- a/Services/LegalDocuments/classes/class.ilLegalDocumentsAppEventListener.php +++ b/Services/LegalDocuments/classes/class.ilLegalDocumentsAppEventListener.php @@ -24,7 +24,7 @@ public static function handleEvent(string $a_component, string $a_event, array $ { global $DIC; match ($a_event) { - 'beforeLogout' => $DIC['legalDocuments']->onLogout(ilStartUpGUI::class, new ilObjUser($a_parameter['user_id'])), + 'beforeLogout' => $DIC['legalDocuments']->onLogout(ilStartUpGUI::class), 'afterLogin' => $DIC['legalDocuments']->afterLogin(), default => null, };