Skip to content

Commit

Permalink
Calendar: Allow to set subscription visibility to members of usergrou…
Browse files Browse the repository at this point in the history
…p (class) - refs BT#20637
  • Loading branch information
AngelFQC committed Apr 4, 2023
1 parent ddfe225 commit e92e2c3
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 37 deletions.
4 changes: 4 additions & 0 deletions main/calendar/agenda.php
Original file line number Diff line number Diff line change
Expand Up @@ -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) : [];
Expand All @@ -198,6 +199,7 @@ function add_image_form() {
(int) $careerId,
(int) $promotionId,
$subscriptionVisibility,
$subscriptionItemId,
$maxSubscriptions
);

Expand Down Expand Up @@ -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) : [];
Expand Down Expand Up @@ -315,6 +318,7 @@ function add_image_form() {
(int) $careerId,
(int) $promotionId,
$subscriptionVisibility,
$subscriptionItemId,
$maxSubscriptions
);

Expand Down
12 changes: 11 additions & 1 deletion main/calendar/agenda_js.php
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
121 changes: 88 additions & 33 deletions main/inc/lib/agenda.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -293,6 +294,7 @@ public function addEvent(
$personalEvent = $em->find(PersonalAgenda::class, $id);
$personalEvent
->setSubscriptionVisibility($subscriptionVisibility)
->setSubscriptionItemId($subscriptionItemId ?: null)
;

$subscription = (new AgendaEventSubscription())
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -944,6 +947,7 @@ public function editEvent(
$personalEvent = $em->find(PersonalAgenda::class, $id);
$personalEvent
->setSubscriptionVisibility($subscriptionVisibility)
->setSubscriptionItemId($subscriptionItemId ?: null)
;

/** @var AgendaEventSubscription $subscription */
Expand Down Expand Up @@ -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)
;
Expand Down Expand Up @@ -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
Expand All @@ -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')).")
)
";
}
Expand Down Expand Up @@ -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());
}
}

Expand Down Expand Up @@ -3112,14 +3135,26 @@ public function getForm($params = [])
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')],
Expand All @@ -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');
})
Expand All @@ -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);
}
}
}

Expand Down Expand Up @@ -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();
Expand Down
8 changes: 5 additions & 3 deletions main/template/default/agenda/month.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -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 '';
}
Expand All @@ -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>';
}
Expand Down

0 comments on commit e92e2c3

Please sign in to comment.