Calendar: Allow to set subscription visibility to members of usergroup (class) - refs BT#20637

pull/4668/head
Angel Fernando Quiroz Campos 2 years ago
parent ddfe225166
commit e92e2c30b2
  1. 4
      main/calendar/agenda.php
  2. 12
      main/calendar/agenda_js.php
  3. 121
      main/inc/lib/agenda.lib.php
  4. 8
      main/template/default/agenda/month.tpl

@ -175,6 +175,7 @@ if ($allowToEdit) {
$careerId = $_REQUEST['career_id'] ?? 0; $careerId = $_REQUEST['career_id'] ?? 0;
$promotionId = $_REQUEST['promotion_id'] ?? 0; $promotionId = $_REQUEST['promotion_id'] ?? 0;
$subscriptionVisibility = (int) ($_REQUEST['subscription_visibility'] ?? 0); $subscriptionVisibility = (int) ($_REQUEST['subscription_visibility'] ?? 0);
$subscriptionItemId = isset($_REQUEST['subscription_item']) ? (int) $_REQUEST['subscription_item_id'] : null;
$maxSubscriptions = (int) ($_REQUEST['max_subscriptions'] ?? 0); $maxSubscriptions = (int) ($_REQUEST['max_subscriptions'] ?? 0);
$reminders = $notificationCount ? array_map(null, $notificationCount, $notificationPeriod) : []; $reminders = $notificationCount ? array_map(null, $notificationCount, $notificationPeriod) : [];
@ -198,6 +199,7 @@ if ($allowToEdit) {
(int) $careerId, (int) $careerId,
(int) $promotionId, (int) $promotionId,
$subscriptionVisibility, $subscriptionVisibility,
$subscriptionItemId,
$maxSubscriptions $maxSubscriptions
); );
@ -259,6 +261,7 @@ if ($allowToEdit) {
$careerId = $_REQUEST['career_id'] ?? 0; $careerId = $_REQUEST['career_id'] ?? 0;
$promotionId = $_REQUEST['promotion_id'] ?? 0; $promotionId = $_REQUEST['promotion_id'] ?? 0;
$subscriptionVisibility = (int) ($_REQUEST['subscription_visibility'] ?? 0); $subscriptionVisibility = (int) ($_REQUEST['subscription_visibility'] ?? 0);
$subscriptionItemId = isset($_REQUEST['subscription_item']) ? (int) $_REQUEST['subscription_item'] : null;
$maxSubscriptions = (int) ($_REQUEST['max_subscriptions'] ?? 0); $maxSubscriptions = (int) ($_REQUEST['max_subscriptions'] ?? 0);
$reminders = $notificationCount ? array_map(null, $notificationCount, $notificationPeriod) : []; $reminders = $notificationCount ? array_map(null, $notificationCount, $notificationPeriod) : [];
@ -315,6 +318,7 @@ if ($allowToEdit) {
(int) $careerId, (int) $careerId,
(int) $promotionId, (int) $promotionId,
$subscriptionVisibility, $subscriptionVisibility,
$subscriptionItemId,
$maxSubscriptions $maxSubscriptions
); );

@ -306,9 +306,19 @@ if (
[ [
AgendaEventSubscription::SUBSCRIPTION_NO => get_lang('No'), AgendaEventSubscription::SUBSCRIPTION_NO => get_lang('No'),
AgendaEventSubscription::SUBSCRIPTION_ALL => get_lang('AllUsersOfThePlatform'), 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( $form->addNumeric(

@ -259,6 +259,7 @@ class Agenda
int $careerId = 0, int $careerId = 0,
int $promotionId = 0, int $promotionId = 0,
int $subscriptionVisibility = 0, int $subscriptionVisibility = 0,
?int $subscriptionItemId = null,
int $maxSubscriptions = 0 int $maxSubscriptions = 0
) { ) {
$start = api_get_utc_datetime($start); $start = api_get_utc_datetime($start);
@ -293,6 +294,7 @@ class Agenda
$personalEvent = $em->find(PersonalAgenda::class, $id); $personalEvent = $em->find(PersonalAgenda::class, $id);
$personalEvent $personalEvent
->setSubscriptionVisibility($subscriptionVisibility) ->setSubscriptionVisibility($subscriptionVisibility)
->setSubscriptionItemId($subscriptionItemId ?: null)
; ;
$subscription = (new AgendaEventSubscription()) $subscription = (new AgendaEventSubscription())
@ -893,6 +895,7 @@ class Agenda
int $careerId = 0, int $careerId = 0,
int $promotionId = 0, int $promotionId = 0,
int $subscriptionVisibility = 0, int $subscriptionVisibility = 0,
?int $subscriptionItemId = null,
int $maxSubscriptions = 0 int $maxSubscriptions = 0
) { ) {
$id = (int) $id; $id = (int) $id;
@ -944,6 +947,7 @@ class Agenda
$personalEvent = $em->find(PersonalAgenda::class, $id); $personalEvent = $em->find(PersonalAgenda::class, $id);
$personalEvent $personalEvent
->setSubscriptionVisibility($subscriptionVisibility) ->setSubscriptionVisibility($subscriptionVisibility)
->setSubscriptionItemId($subscriptionItemId ?: null)
; ;
/** @var AgendaEventSubscription $subscription */ /** @var AgendaEventSubscription $subscription */
@ -1371,10 +1375,22 @@ class Agenda
return; return;
} }
if ($subscription->getInvitees()->count() >= $subscription->getMaxAttendees()) { if ($subscription->getInvitees()->count() >= $subscription->getMaxAttendees()
&& $subscription->getMaxAttendees() > 0
) {
return; 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()) $subscriber = (new AgendaEventSubscriber())
->setUser($currentUser) ->setUser($currentUser)
; ;
@ -1882,9 +1898,10 @@ class Agenda
$queryParams['user_id'] = $user_id; $queryParams['user_id'] = $user_id;
$userCondition = "pa.user = :user_id"; $userCondition = "pa.user = :user_id";
$objGroup = new UserGroup();
if ($agendaEventSubscriptions) { if ($agendaEventSubscriptions) {
$objGroup = new UserGroup(); $groupList = $objGroup->getUserGroupListByUser($user_id, UserGroup::NORMAL_CLASS);
$groupList = $objGroup->get_groups_by_user($user_id);
$userCondition = "( $userCondition = "(
$userCondition $userCondition
@ -1895,7 +1912,7 @@ class Agenda
$userCondition .= " $userCondition .= "
OR ( OR (
pa.subscriptionVisibility = ".AgendaEventSubscription::SUBSCRIPTION_CLASS." 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 @@ class Agenda
$event['parent_event_id'] = 0; $event['parent_event_id'] = 0;
$event['has_children'] = 0; $event['has_children'] = 0;
if ($agendaCollectiveInvitations) { if ($agendaCollectiveInvitations || $agendaEventSubscriptions) {
$event['collective'] = $row->isCollective();
$event['invitees'] = self::getInviteesForPersonalEvent($row->getId());
}
if ($agendaEventSubscriptions) {
/** @var AgendaEventSubscription $subscription */
$subscription = $row->getInvitation(); $subscription = $row->getInvitation();
$subscribers = $subscription->getInvitees();
$event['subscription_visibility'] = $row->getSubscriptionVisibility(); if ($subscription instanceof AgendaEventSubscription) {
$event['max_subscriptions'] = $subscription->getMaxAttendees(); $subscribers = $subscription->getInvitees();
$event['can_subscribe'] = $subscribers->count() < $subscription->getMaxAttendees();
$event['user_is_subscribed'] = $subscription->hasUserAsInvitee(api_get_user_entity($user_id)); $event['subscription_visibility'] = $row->getSubscriptionVisibility();
$event['count_subscribers'] = $subscribers->count(); $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) { if ($userIsAdmin) {
$event['subscribers'] = self::getInviteesForPersonalEvent($row->getId(), AgendaEventSubscriber::class); $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 @@ class Agenda
if (api_is_platform_admin() if (api_is_platform_admin()
&& true === api_get_configuration_value('agenda_event_subscriptions') && true === api_get_configuration_value('agenda_event_subscriptions')
) { ) {
$form->addHtml('<hr>');
$form->addSelect( $form->addSelect(
'subscription_visibility', 'subscription_visibility',
get_lang('AllowSubscriptions'), get_lang('AllowSubscriptions'),
[ [
AgendaEventSubscription::SUBSCRIPTION_NO => get_lang('No'), AgendaEventSubscription::SUBSCRIPTION_NO => get_lang('No'),
AgendaEventSubscription::SUBSCRIPTION_ALL => get_lang('AllUsersOfThePlatform'), 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( $form->addNumeric(
'max_subscriptions', 'max_subscriptions',
['', get_lang('MaxSubscriptionsLeaveEmptyToNotLimit')], ['', get_lang('MaxSubscriptionsLeaveEmptyToNotLimit')],
@ -3134,7 +3169,8 @@ class Agenda
$(function () { $(function () {
$('#add_event_subscription_visibility') $('#add_event_subscription_visibility')
.on('change', function () { .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'); .trigger('change');
}) })
@ -3159,6 +3195,16 @@ class Agenda
/** @var AgendaEventSubscription $subscription */ /** @var AgendaEventSubscription $subscription */
$subscription = $personalEvent->getInvitation(); $subscription = $personalEvent->getInvitation();
$params['max_subscriptions'] = $subscription->getMaxAttendees(); $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 @@ class Agenda
$event = $em->find('ChamiloCoreBundle:PersonalAgenda', $eventId); $event = $em->find('ChamiloCoreBundle:PersonalAgenda', $eventId);
$invitation = new AgendaEventInvitation(); $invitation = $event->getInvitation();
$invitation->setCreator(api_get_user_entity(api_get_user_id()));
$event if ($invitation instanceof AgendaEventSubscription) {
->setCollective($isCollective) return;
->setInvitation($invitation) }
;
$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) { foreach ($inviteeUserList as $inviteeId) {
$invitee = new AgendaEventInvitee(); $userInvitee = api_get_user_entity($inviteeId);
$invitee
->setUser(api_get_user_entity($inviteeId))
->setInvitation($invitation)
;
$em->persist($invitee); if (!$invitation->hasUserAsInvitee($userInvitee)) {
$invitee = new AgendaEventInvitee();
$invitee
->setUser($userInvitee)
->setInvitation($invitation)
;
$em->persist($invitee);
}
} }
$em->flush(); $em->flush();

@ -1055,7 +1055,9 @@ $(function() {
{{ agenda_reminders_js }} {{ agenda_reminders_js }}
function showSubcriptionsContainer (calEvent) { function showSubcriptionsContainer (calEvent) {
if (calEvent.invitees.length || !calEvent.subscription_visibility) { if ((calEvent.invitees && calEvent.invitees.length)
|| !calEvent.subscription_visibility
) {
return ''; return '';
} }
@ -1069,12 +1071,12 @@ $(function() {
} }
if (2 === calEvent.subscription_visibility) { if (2 === calEvent.subscription_visibility) {
html += "{{ 'UsersInsideClass'|get_lang }}"; html += "{{ 'UsersInsideClass'|get_lang }}<br>" + calEvent.usergroup;
} }
html += '</dd>'; html += '</dd>';
if (0 <= calEvent.max_subscriptions) { if (calEvent.max_subscriptions) {
html += "<dt>{{ 'MaxSubscriptions'|get_lang }}</dt>"; html += "<dt>{{ 'MaxSubscriptions'|get_lang }}</dt>";
html += '<dd>' + calEvent.max_subscriptions + '</dd>'; html += '<dd>' + calEvent.max_subscriptions + '</dd>';
} }

Loading…
Cancel
Save