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;
$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 @@ if ($allowToEdit) {
(int) $careerId,
(int) $promotionId,
$subscriptionVisibility,
$subscriptionItemId,
$maxSubscriptions
);
@ -259,6 +261,7 @@ if ($allowToEdit) {
$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 @@ if ($allowToEdit) {
(int) $careerId,
(int) $promotionId,
$subscriptionVisibility,
$subscriptionItemId,
$maxSubscriptions
);

@ -306,9 +306,19 @@ if (
[
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(

@ -259,6 +259,7 @@ class Agenda
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 @@ class Agenda
$personalEvent = $em->find(PersonalAgenda::class, $id);
$personalEvent
->setSubscriptionVisibility($subscriptionVisibility)
->setSubscriptionItemId($subscriptionItemId ?: null)
;
$subscription = (new AgendaEventSubscription())
@ -893,6 +895,7 @@ class Agenda
int $careerId = 0,
int $promotionId = 0,
int $subscriptionVisibility = 0,
?int $subscriptionItemId = null,
int $maxSubscriptions = 0
) {
$id = (int) $id;
@ -944,6 +947,7 @@ class Agenda
$personalEvent = $em->find(PersonalAgenda::class, $id);
$personalEvent
->setSubscriptionVisibility($subscriptionVisibility)
->setSubscriptionItemId($subscriptionItemId ?: null)
;
/** @var AgendaEventSubscription $subscription */
@ -1371,10 +1375,22 @@ class Agenda
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 @@ class Agenda
$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 @@ class Agenda
$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 @@ class Agenda
$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 @@ class Agenda
if (api_is_platform_admin()
&& true === api_get_configuration_value('agenda_event_subscriptions')
) {
$form->addHtml('<hr>');
$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 @@ class Agenda
$(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 @@ class Agenda
/** @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 @@ class Agenda
$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();

@ -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 }}<br>" + calEvent.usergroup;
}
html += '</dd>';
if (0 <= calEvent.max_subscriptions) {
if (calEvent.max_subscriptions) {
html += "<dt>{{ 'MaxSubscriptions'|get_lang }}</dt>";
html += '<dd>' + calEvent.max_subscriptions + '</dd>';
}

Loading…
Cancel
Save