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('