diff --git a/main/calendar/agenda.php b/main/calendar/agenda.php index 2ffd7069661..d3822b22487 100755 --- a/main/calendar/agenda.php +++ b/main/calendar/agenda.php @@ -175,6 +175,7 @@ function add_image_form() { $careerId = $_REQUEST['career_id'] ?? 0; $promotionId = $_REQUEST['promotion_id'] ?? 0; $subscriptionVisibility = (int) ($_REQUEST['subscription_visibility'] ?? 0); + $subscriptionItemId = isset($_REQUEST['subscription_item']) ? (int) $_REQUEST['subscription_item_id'] : null; $maxSubscriptions = (int) ($_REQUEST['max_subscriptions'] ?? 0); $reminders = $notificationCount ? array_map(null, $notificationCount, $notificationPeriod) : []; @@ -198,6 +199,7 @@ function add_image_form() { (int) $careerId, (int) $promotionId, $subscriptionVisibility, + $subscriptionItemId, $maxSubscriptions ); @@ -259,6 +261,7 @@ function add_image_form() { $careerId = $_REQUEST['career_id'] ?? 0; $promotionId = $_REQUEST['promotion_id'] ?? 0; $subscriptionVisibility = (int) ($_REQUEST['subscription_visibility'] ?? 0); + $subscriptionItemId = isset($_REQUEST['subscription_item']) ? (int) $_REQUEST['subscription_item'] : null; $maxSubscriptions = (int) ($_REQUEST['max_subscriptions'] ?? 0); $reminders = $notificationCount ? array_map(null, $notificationCount, $notificationPeriod) : []; @@ -315,6 +318,7 @@ function add_image_form() { (int) $careerId, (int) $promotionId, $subscriptionVisibility, + $subscriptionItemId, $maxSubscriptions ); diff --git a/main/calendar/agenda_js.php b/main/calendar/agenda_js.php index 5eec4c61aa7..68732afc92c 100755 --- a/main/calendar/agenda_js.php +++ b/main/calendar/agenda_js.php @@ -306,9 +306,19 @@ [ AgendaEventSubscription::SUBSCRIPTION_NO => get_lang('No'), AgendaEventSubscription::SUBSCRIPTION_ALL => get_lang('AllUsersOfThePlatform'), + AgendaEventSubscription::SUBSCRIPTION_CLASS => get_lang('UsersInsideClass'), ], [ - 'onchange' => 'document.getElementById(\'max_subscriptions\').disabled = this.value == 0;', + 'onchange' => 'document.getElementById(\'max_subscriptions\').disabled = this.value == 0; document.getElementById(\'form_subscription_item\').disabled = this.value != 2', + ] + ); + $form->addSelectAjax( + 'subscription_item', + get_lang('SocialGroup').' / '.get_lang('Class'), + [], + [ + 'url' => api_get_path(WEB_AJAX_PATH).'usergroup.ajax.php?a=get_class_by_keyword', + 'disabled' => 'disabled', ] ); $form->addNumeric( diff --git a/main/inc/lib/agenda.lib.php b/main/inc/lib/agenda.lib.php index d46c2615050..c3cf73e0a64 100644 --- a/main/inc/lib/agenda.lib.php +++ b/main/inc/lib/agenda.lib.php @@ -259,6 +259,7 @@ public function addEvent( int $careerId = 0, int $promotionId = 0, int $subscriptionVisibility = 0, + ?int $subscriptionItemId = null, int $maxSubscriptions = 0 ) { $start = api_get_utc_datetime($start); @@ -293,6 +294,7 @@ public function addEvent( $personalEvent = $em->find(PersonalAgenda::class, $id); $personalEvent ->setSubscriptionVisibility($subscriptionVisibility) + ->setSubscriptionItemId($subscriptionItemId ?: null) ; $subscription = (new AgendaEventSubscription()) @@ -893,6 +895,7 @@ public function editEvent( int $careerId = 0, int $promotionId = 0, int $subscriptionVisibility = 0, + ?int $subscriptionItemId = null, int $maxSubscriptions = 0 ) { $id = (int) $id; @@ -944,6 +947,7 @@ public function editEvent( $personalEvent = $em->find(PersonalAgenda::class, $id); $personalEvent ->setSubscriptionVisibility($subscriptionVisibility) + ->setSubscriptionItemId($subscriptionItemId ?: null) ; /** @var AgendaEventSubscription $subscription */ @@ -1371,10 +1375,22 @@ public function subscribeCurrentUserToEvent(int $id) return; } - if ($subscription->getInvitees()->count() >= $subscription->getMaxAttendees()) { + if ($subscription->getInvitees()->count() >= $subscription->getMaxAttendees() + && $subscription->getMaxAttendees() > 0 + ) { return; } + if (AgendaEventSubscription::SUBSCRIPTION_CLASS === $personalEvent->getSubscriptionVisibility()) { + $objGroup = new UserGroup(); + $groupList = $objGroup->getUserGroupListByUser($currentUser->getId(), UserGroup::NORMAL_CLASS); + $groupIdList = array_column($groupList, 'id'); + + if (!in_array($personalEvent->getSubscriptionItemId(), $groupIdList)) { + return; + } + } + $subscriber = (new AgendaEventSubscriber()) ->setUser($currentUser) ; @@ -1882,9 +1898,10 @@ public function getPersonalEvents($start, $end) $queryParams['user_id'] = $user_id; $userCondition = "pa.user = :user_id"; + $objGroup = new UserGroup(); + if ($agendaEventSubscriptions) { - $objGroup = new UserGroup(); - $groupList = $objGroup->get_groups_by_user($user_id); + $groupList = $objGroup->getUserGroupListByUser($user_id, UserGroup::NORMAL_CLASS); $userCondition = "( $userCondition @@ -1895,7 +1912,7 @@ public function getPersonalEvents($start, $end) $userCondition .= " OR ( pa.subscriptionVisibility = ".AgendaEventSubscription::SUBSCRIPTION_CLASS." - AND pa.subscriptionItemId IN (".implode(', ', array_keys($groupList)).") + AND pa.subscriptionItemId IN (".implode(', ', array_column($groupList, 'id')).") ) "; } @@ -1941,24 +1958,30 @@ public function getPersonalEvents($start, $end) $event['parent_event_id'] = 0; $event['has_children'] = 0; - if ($agendaCollectiveInvitations) { - $event['collective'] = $row->isCollective(); - $event['invitees'] = self::getInviteesForPersonalEvent($row->getId()); - } - - if ($agendaEventSubscriptions) { - /** @var AgendaEventSubscription $subscription */ + if ($agendaCollectiveInvitations || $agendaEventSubscriptions) { $subscription = $row->getInvitation(); - $subscribers = $subscription->getInvitees(); - $event['subscription_visibility'] = $row->getSubscriptionVisibility(); - $event['max_subscriptions'] = $subscription->getMaxAttendees(); - $event['can_subscribe'] = $subscribers->count() < $subscription->getMaxAttendees(); - $event['user_is_subscribed'] = $subscription->hasUserAsInvitee(api_get_user_entity($user_id)); - $event['count_subscribers'] = $subscribers->count(); + if ($subscription instanceof AgendaEventSubscription) { + $subscribers = $subscription->getInvitees(); + + $event['subscription_visibility'] = $row->getSubscriptionVisibility(); + $event['max_subscriptions'] = $subscription->getMaxAttendees(); + $event['can_subscribe'] = $subscribers->count() < $subscription->getMaxAttendees() + || $subscription->getMaxAttendees() === 0; + $event['user_is_subscribed'] = $subscription->hasUserAsInvitee(api_get_user_entity($user_id)); + $event['count_subscribers'] = $subscribers->count(); - if ($userIsAdmin) { - $event['subscribers'] = self::getInviteesForPersonalEvent($row->getId(), AgendaEventSubscriber::class); + if ($userIsAdmin) { + $event['subscribers'] = self::getInviteesForPersonalEvent($row->getId(), AgendaEventSubscriber::class); + } + + if (AgendaEventSubscription::SUBSCRIPTION_CLASS === $row->getSubscriptionVisibility()) { + $groupInfo = $objGroup->get($row->getSubscriptionItemId()); + $event['usergroup'] = $groupInfo['name']; + } + } else { + $event['collective'] = $row->isCollective(); + $event['invitees'] = self::getInviteesForPersonalEvent($row->getId()); } } @@ -3112,14 +3135,26 @@ public function getForm($params = []) if (api_is_platform_admin() && true === api_get_configuration_value('agenda_event_subscriptions') ) { + $form->addHtml('
'); $form->addSelect( 'subscription_visibility', get_lang('AllowSubscriptions'), [ AgendaEventSubscription::SUBSCRIPTION_NO => get_lang('No'), AgendaEventSubscription::SUBSCRIPTION_ALL => get_lang('AllUsersOfThePlatform'), + AgendaEventSubscription::SUBSCRIPTION_CLASS => get_lang('UsersInsideClass'), + ] + ); + $slctItem = $form->addSelectAjax( + 'subscription_item', + get_lang('SocialGroup').' / '.get_lang('Class'), + [], + [ + 'url' => api_get_path(WEB_AJAX_PATH).'usergroup.ajax.php?a=get_class_by_keyword', + 'disabled' => 'disabled', ] ); + $form->addNumeric( 'max_subscriptions', ['', get_lang('MaxSubscriptionsLeaveEmptyToNotLimit')], @@ -3134,7 +3169,8 @@ public function getForm($params = []) $(function () { $('#add_event_subscription_visibility') .on('change', function () { - $('#max_subscriptions').prop('disabled', this.value == 0); + $('#max_subscriptions').prop('disabled', this.value == 0); + $('#add_event_subscription_item').prop('disabled', this.value != 2); }) .trigger('change'); }) @@ -3159,6 +3195,16 @@ function (array $subscriberInfo) { /** @var AgendaEventSubscription $subscription */ $subscription = $personalEvent->getInvitation(); $params['max_subscriptions'] = $subscription->getMaxAttendees(); + + $groupId = $personalEvent->getSubscriptionItemId(); + + if ($groupId) { + $objUserGroup = new UserGroup(); + + $groupInfo = $objUserGroup->get($groupId); + + $slctItem->addOption($groupInfo['name'], $groupId); + } } } @@ -4835,24 +4881,33 @@ public static function saveCollectiveProperties(array $inviteeUserList, bool $is $event = $em->find('ChamiloCoreBundle:PersonalAgenda', $eventId); - $invitation = new AgendaEventInvitation(); - $invitation->setCreator(api_get_user_entity(api_get_user_id())); + $invitation = $event->getInvitation(); - $event - ->setCollective($isCollective) - ->setInvitation($invitation) - ; + if ($invitation instanceof AgendaEventSubscription) { + return; + } - $em->persist($event); + if (!$invitation) { + $invitation = new AgendaEventInvitation(); + $invitation->setCreator(api_get_user_entity(api_get_user_id())); + + $event->setInvitation($invitation); + } + + $event->setCollective($isCollective); foreach ($inviteeUserList as $inviteeId) { - $invitee = new AgendaEventInvitee(); - $invitee - ->setUser(api_get_user_entity($inviteeId)) - ->setInvitation($invitation) - ; + $userInvitee = api_get_user_entity($inviteeId); - $em->persist($invitee); + if (!$invitation->hasUserAsInvitee($userInvitee)) { + $invitee = new AgendaEventInvitee(); + $invitee + ->setUser($userInvitee) + ->setInvitation($invitation) + ; + + $em->persist($invitee); + } } $em->flush(); diff --git a/main/template/default/agenda/month.tpl b/main/template/default/agenda/month.tpl index b7865a269e5..f14adfcfe80 100755 --- a/main/template/default/agenda/month.tpl +++ b/main/template/default/agenda/month.tpl @@ -1055,7 +1055,9 @@ $(function() { {{ agenda_reminders_js }} function showSubcriptionsContainer (calEvent) { - if (calEvent.invitees.length || !calEvent.subscription_visibility) { + if ((calEvent.invitees && calEvent.invitees.length) + || !calEvent.subscription_visibility + ) { return ''; } @@ -1069,12 +1071,12 @@ $(function() { } if (2 === calEvent.subscription_visibility) { - html += "{{ 'UsersInsideClass'|get_lang }}"; + html += "{{ 'UsersInsideClass'|get_lang }}
" + calEvent.usergroup; } html += ''; - if (0 <= calEvent.max_subscriptions) { + if (calEvent.max_subscriptions) { html += "
{{ 'MaxSubscriptions'|get_lang }}
"; html += '
' + calEvent.max_subscriptions + '
'; }