Calendar: Allow edit event - refs BT#18894

pull/3927/head
Angel Fernando Quiroz Campos 4 years ago
parent b57eb713f1
commit fedcadfab7
  1. 43
      assets/vue/views/ccalendarevent/List.vue
  2. 25
      src/CoreBundle/Controller/Api/UpdateCCalendarEventAction.php
  3. 9
      src/CoreBundle/Security/Authorization/Voter/CCalendarEventVoter.php
  4. 5
      src/CourseBundle/Entity/CCalendarEvent.php

@ -41,6 +41,7 @@
<p>{{ item.endDate }}</p>
</q-card-section>
<q-card-actions align="right" class="text-primary">
<q-btn flat color="primary" v-if="isEventEditable" label="Edit" @click="dialog = true" />
<q-btn v-close-popup flat label="Close"/>
</q-card-actions>
</q-card>
@ -83,6 +84,7 @@ export default {
const item = ref({});
const dialog = ref(false);
const dialogShow = ref(false);
const isEventEditable = ref(false);
const store = useStore();
const route = useRoute();
@ -99,11 +101,9 @@ export default {
addEvent: {
text: 'Add event',
click: function () {
item.value = {};
item.value['parentResourceNodeId'] = currentUser.value.resourceNode['id'];
if (!!!item.value['collective']) {
item.value['collective'] = false;
}
item.value['collective'] = false;
dialog.value = true;
}
@ -122,14 +122,31 @@ export default {
eventClick(EventClickArg) {
let event = EventClickArg.event;
item.value['@id'] = event.extendedProps['@id'];
item.value['title'] = event.title;
item.value['startDate'] = event.startStr;
item.value['endDate'] = event.endStr;
item.value['collective'] = event.extendedProps.collective;
item.value['parentResourceNodeId'] = event.extendedProps.resourceNode.creator.id;
item.value['content'] = event.extendedProps.content;
isEventEditable.value = event.extendedProps.resourceNode.creator.id === currentUser.value.resourceNode['id'];
if (!isEventEditable.value
&& event.extendedProps.collective
&& event.extendedProps.resourceLinkListFromEntity
) {
const resourceLink = event.extendedProps.resourceLinkListFromEntity.find(linkEntity => linkEntity.user.id === currentUser.value.id);
if (resourceLink) {
isEventEditable.value = true;
}
}
dialogShow.value = true;
},
dateClick(info) {
item.value['@id'] = null;
item.value['allDay'] = info.allDay;
item.value['startDate'] = info.dateStr;
item.value['endDate'] = info.dateStr;
@ -138,6 +155,7 @@ export default {
dialog.value = true;
},
select(info) {
item.value['@id'] = null;
item.value['allDay'] = info.allDay;
item.value['startDate'] = info.startStr;
item.value['endDate'] = info.endStr;
@ -157,10 +175,9 @@ export default {
successCallback(
Array.prototype.slice.call(events)
.map(event => ({
title: event.title,
...event,
start: event.startDate,
end: event.endDate,
collective: event.collective
}))
)
})
@ -172,7 +189,7 @@ export default {
calendarApi.refetchEvents();
}
return {calendarOptions, dialog, item, dialogShow, reFetch};
return {calendarOptions, dialog, item, dialogShow, reFetch, isEventEditable};
},
computed: {
...mapFields('ccalendarevent', {
@ -192,7 +209,14 @@ export default {
const createForm = this.$refs.createForm;
createForm.v$.$touch();
if (!createForm.v$.$invalid) {
this.create(createForm.v$.item.$model);
let itemModel = createForm.v$.item.$model;
if (itemModel['@id']) {
this.updateItem(itemModel);
} else {
this.create(itemModel);
}
this.reFetch();
this.dialog = false;
}
@ -201,7 +225,8 @@ export default {
create: 'create',
deleteItem: 'del',
reset: 'resetShow',
retrieve: 'loadWithQuery'
retrieve: 'loadWithQuery',
updateItem: 'update'
}),
},
servicePrefix

@ -0,0 +1,25 @@
<?php
/* For licensing terms, see /license.txt */
declare(strict_types=1);
namespace Chamilo\CoreBundle\Controller\Api;
use Chamilo\CourseBundle\Entity\CCalendarEvent;
use Chamilo\CourseBundle\Repository\CCalendarEventRepository;
use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpFoundation\Request;
class UpdateCCalendarEventAction extends BaseResourceFileAction
{
public function __invoke(
CCalendarEvent $calendarEvent,
Request $request,
CCalendarEventRepository $repo,
EntityManager $em
): CCalendarEvent {
$this->handleUpdateRequest($calendarEvent, $repo, $request, $em);
return $calendarEvent;
}
}

@ -73,6 +73,15 @@ class CCalendarEventVoter extends Voter
case self::VIEW:
return true;
case self::EDIT:
if ($event->isCollective()) {
$links = $event->getResourceLinkEntityList();
foreach ($links as $link) {
if ($link->getUser() === $user) {
return true;
}
}
}
case self::DELETE:
if ($event->getCreator() === $user) {
return true;

@ -11,6 +11,7 @@ use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use Chamilo\CoreBundle\Controller\Api\CreateCCalendarEventAction;
use Chamilo\CoreBundle\Controller\Api\UpdateCCalendarEventAction;
use Chamilo\CoreBundle\Entity\AbstractResource;
use Chamilo\CoreBundle\Entity\ResourceInterface;
use Chamilo\CoreBundle\Entity\Room;
@ -47,6 +48,8 @@ use Symfony\Component\Validator\Constraints as Assert;
'security' => "is_granted('VIEW', object)",
],
'put' => [
'controller' => UpdateCCalendarEventAction::class,
'deserialize' => false,
'security' => "is_granted('EDIT', object)",
],
'delete' => [
@ -60,7 +63,7 @@ use Symfony\Component\Validator\Constraints as Assert;
'groups' => ['calendar_event:write'],
],
normalizationContext: [
'groups' => ['calendar_event:read'],
'groups' => ['calendar_event:read', 'resource_node:read'],
],
)]

Loading…
Cancel
Save