From d07ceb55a4bc9f4a31cf74dd5483721d7d0e2fc4 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Thu, 10 Dec 2020 13:14:21 +0100 Subject: [PATCH] Internal: Fix agenda delete event, fix download URL --- public/main/inc/lib/agenda.lib.php | 2 +- .../template/default/agenda/month.html.twig | 32 +- .../Controller/ResourceController.php | 355 +----------------- .../Repository/ResourceRepository.php | 11 +- 4 files changed, 37 insertions(+), 363 deletions(-) diff --git a/public/main/inc/lib/agenda.lib.php b/public/main/inc/lib/agenda.lib.php index e7527b00a9..27ef2703d6 100644 --- a/public/main/inc/lib/agenda.lib.php +++ b/public/main/inc/lib/agenda.lib.php @@ -1660,7 +1660,7 @@ class Agenda ); /** @var CCalendarEventAttachment $attachment */ foreach ($attachmentList as $attachment) { - $url = $repo->getResourceFileDownloadUrl($attachment); + $url = $repo->getResourceFileDownloadUrl($attachment).'?'.api_get_cidreq(); $event['attachment'] .= $icon. Display::url( $attachment->getFilename(), diff --git a/public/main/template/default/agenda/month.html.twig b/public/main/template/default/agenda/month.html.twig index e0d605bb31..015a491b0d 100644 --- a/public/main/template/default/agenda/month.html.twig +++ b/public/main/template/default/agenda/month.html.twig @@ -200,7 +200,6 @@ window.location.replace(url); }*/ } - calendar.refetchEvents(); $('#modalDialogForm').modal('toggle'); } @@ -261,7 +260,6 @@ $("#simple_content").html(calEvent.description); $("#simple_comment").html(calEvent.comment); $("#simple_attachment").html(calEvent.attachment); - $("#calendar_course_info_simple").html(''); if (calEvent.course_name) { @@ -341,7 +339,6 @@ }); var buttons = newDiv.dialog("option", "buttons"); - if (calEvent.has_children == '0') { buttons.push({ text: '{{ "Delete this item" | trans }}', @@ -349,11 +346,11 @@ $.ajax({ url: delete_url, success:function() { - calendar.fullCalendar('removeEvents', - calEvent - ); - calendar.fullCalendar("refetchEvents"); - calendar.fullCalendar("rerenderEvents"); + //calendar.fullCalendar('removeEvents', calEvent); + event.remove(); + calendar.refetchEvents(); + //calendar.fullCalendar('refetchEvents'); + //calendar.fullCalendar('rerenderEvents'); $("#dialog-form").dialog("close"); newDiv.dialog( "destroy" ); } @@ -370,11 +367,11 @@ $.ajax({ url: delete_url+'&delete_all_events=1', success:function() { - calendar.fullCalendar('removeEvents', - calEvent - ); - calendar.fullCalendar('refetchEvents'); - calendar.fullCalendar('rerenderEvents'); + //calendar.fullCalendar('removeEvents', calEvent); + event.remove(); + calendar.refetchEvents(); + //calendar.fullCalendar('refetchEvents'); + //calendar.fullCalendar('rerenderEvents'); $("#dialog-form").dialog('close'); newDiv.dialog( "destroy" ); } @@ -389,17 +386,16 @@ $.ajax({ url: delete_url, success:function() { - calendar.fullCalendar('removeEvents', - calEvent - ); + event.remove(); + calendar.refetchEvents(); + /*calendar.fullCalendar('removeEvents', calEvent); calendar.fullCalendar('refetchEvents'); - calendar.fullCalendar('rerenderEvents'); + calendar.fullCalendar('rerenderEvents');*/ //close modal $('#calendarModal').modal('toggle'); } }); }); - } else { // Simple form $('#simple_start_date').html(startDateToString); diff --git a/src/CoreBundle/Controller/ResourceController.php b/src/CoreBundle/Controller/ResourceController.php index 000883676d..0c7b4b944d 100644 --- a/src/CoreBundle/Controller/ResourceController.php +++ b/src/CoreBundle/Controller/ResourceController.php @@ -5,12 +5,10 @@ namespace Chamilo\CoreBundle\Controller; use Chamilo\CoreBundle\Entity\AbstractResource; -use Chamilo\CoreBundle\Entity\ResourceInterface; use Chamilo\CoreBundle\Entity\ResourceLink; use Chamilo\CoreBundle\Entity\ResourceNode; use Chamilo\CoreBundle\Form\Type\ResourceCommentType; use Chamilo\CoreBundle\Repository\IllustrationRepository; -use Chamilo\CoreBundle\Repository\ResourceRepository; use Chamilo\CoreBundle\Repository\ResourceWithLinkInterface; use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter; use Chamilo\CoreBundle\Traits\ControllerTrait; @@ -31,7 +29,6 @@ use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; -use Symfony\Component\Routing\Router; use Symfony\Component\Routing\RouterInterface; use ZipStream\Option\Archive; use ZipStream\ZipStream; @@ -52,9 +49,10 @@ class ResourceController extends AbstractResourceController implements CourseCon private $fileContentName = 'file_content'; /** + * @deprecated in favor of vue CRUD methods + * * @Route("/{tool}/{type}", name="chamilo_core_resource_index") * - * @deprecated * Example: /document/files (See the 'tool' and the 'resource_type' DB tables.) * For the tool value check the Tool entity. * For the type value check the ResourceType entity. @@ -68,14 +66,6 @@ class ResourceController extends AbstractResourceController implements CourseCon $repository = $this->getRepositoryFromRequest($request); $settings = $repository->getResourceSettings(); - /*$grid = $this->getGrid( - $request, - $repository, - $grid, - $parentResourceNode->getId(), - 'chamilo_core_resource_index' - );*/ - // The base resource node is the course. $id = $parentResourceNode->getId(); @@ -93,325 +83,9 @@ class ResourceController extends AbstractResourceController implements CourseCon } /** - * @deprecated - */ - public function getGrid(Request $request, ResourceRepository $repository, int $resourceNodeId, string $routeName): Grid - { - $class = $repository->getRepository()->getClassName(); - - // The group 'resource' is set in the @GRID\Source annotation in the entity. - $source = new Entity($class, 'resource'); - /** @var ResourceNode $parentNode */ - $parentNode = $repository->getResourceNodeRepository()->find($resourceNodeId); - - $this->denyAccessUnlessGranted( - ResourceNodeVoter::VIEW, - $parentNode, - $this->trans('Unauthorised access to resource') - ); - - $settings = $repository->getResourceSettings(); - $course = $this->getCourse(); - $session = $this->getSession(); - /** @var QueryBuilder $qb */ - $qb = $repository->getResources($this->getUser(), $parentNode, $course, $session, null); - - //$qb->getQuery()->setFetchMode(\Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER); - - // 3. Set QueryBuilder to the source. - $source->initQueryBuilder($qb); - $grid->setSource($source); - - $resourceParams = $this->getResourceParams($request); - - if (0 === $resourceParams['id']) { - $resourceParams['id'] = $resourceNodeId; - } - - $grid->setRouteUrl($this->generateUrl($routeName, $resourceParams)); - - $routeParams = $resourceParams; - $routeParams['id'] = null; - - /** @var Column $titleColumn */ - $titleColumn = $repository->getTitleColumn($grid); - - $titleColumn->setSafe(false); // allows links in the title - - // Title link. - $titleColumn->setTitle($this->trans('Name')); - $titleColumn->manipulateRenderCell( - function ($value, Row $row, $router) use ($routeParams, $settings) { - /** @var Router $router */ - /** @var ResourceInterface $entity */ - $entity = $row->getEntity(); - $resourceNode = $entity->getResourceNode(); - $id = $resourceNode->getId(); - - $myParams = $routeParams; - $myParams['id'] = $id; - unset($myParams[0]); - - $icon = $resourceNode->getIcon().'  '; - - if ($resourceNode->hasResourceFile()) { - // Process node that contains a file, process previews. - if ($resourceNode->isResourceFileAnImage()) { - $url = $router->generate('chamilo_core_resource_view', $myParams); - - return $icon.''.$value.''; - } - - if ($resourceNode->isResourceFileAVideo()) { - $url = $router->generate('chamilo_core_resource_view', $myParams); - - return ' - - '.$icon.' '.$value.''; - } - - $url = $router->generate('chamilo_core_resource_preview', $myParams); - - return $icon. - ''. - $value.''; - } else { - if ($settings->isAllowNodeCreation()) { - $url = $router->generate( - 'chamilo_core_resource_list', - $myParams - ); - } else { - $url = $router->generate('chamilo_core_resource_view_resource', $myParams); - } - - return $icon.''.$value.''; - } - } - ); - - /*if ($grid->hasColumn('filetype')) { - $grid->getColumn('filetype')->manipulateRenderCell( - function ($value, Row $row, $router) { - $entity = $row->getEntity(); - $resourceNode = $entity->getResourceNode(); - - if ($resourceNode->hasResourceFile()) { - $file = $resourceNode->getResourceFile(); - - return $file->getMimeType(); - } - - return $this->trans('Folder'); - } - ); - }*/ - - if ($grid->hasColumn('iid')) { - $grid->setHiddenColumns(['iid']); - } - - // Delete mass action. - if ($this->isGranted(ResourceNodeVoter::DELETE, $parentNode)) { - $routeParams['icon'] = 'far fa-trash-alt'; - $deleteMassAction = new MassAction( - 'Delete', - 'ChamiloCoreBundle:Resource:deleteMass', - true, - $routeParams - ); - $grid->addMassAction($deleteMassAction); - } - - // Info action. - $myRowAction = new RowAction( - $this->trans('Info'), - 'chamilo_core_resource_info', - false, - '_self', - [ - 'class' => 'btn btn-secondary info_action resource_info_row', - 'icon' => 'fa-info-circle', - 'iframe' => false, - ] - ); - - $setNodeParameters = function (RowAction $action, Row $row) use ($routeParams) { - $id = $row->getEntity()->getResourceNode()->getId(); - $routeParams['id'] = $id; - $action->setRouteParameters($routeParams); - $attributes = $action->getAttributes(); - $attributes['data-action'] = $action->getRoute(); - $attributes['data-action-id'] = $action->getRoute().'_'.$id; - $attributes['data-node-id'] = $id; - $attributes['title'] = $this->trans('Info').' '.$row->getEntity()->getResourceName(); - $action->setAttributes($attributes); - - return $action; - }; - - $myRowAction->addManipulateRender($setNodeParameters); - $grid->addRowAction($myRowAction); - - // Download action. - $myRowAction = new RowAction( - $this->trans('Download'), - 'chamilo_core_resource_download', - false, - '_self', - [ - 'class' => 'btn btn-secondary download_action', - 'icon' => 'fa-download', - 'title' => $this->trans('Download'), - ] - ); - - $setNodeDownloadParameters = function (RowAction $action, Row $row) use ($routeParams) { - /** @var ResourceNode $resourceNode */ - $resourceNode = $row->getEntity()->getResourceNode(); - if (false === $resourceNode->hasResourceFile()) { - return null; - } - $id = $row->getEntity()->getResourceNode()->getId(); - $routeParams['id'] = $id; - $action->setRouteParameters($routeParams); - $attributes = $action->getAttributes(); - $action->setAttributes($attributes); - - return $action; - }; - $myRowAction->addManipulateRender($setNodeDownloadParameters); - $grid->addRowAction($myRowAction); - - // Set EDIT/DELETE - $setNodeParameters = function (RowAction $action, Row $row) use ($routeParams) { - $id = $row->getEntity()->getResourceNode()->getId(); - $allowedEdit = $this->isGranted(ResourceNodeVoter::EDIT, $row->getEntity()->getResourceNode()); - - if (false === $allowedEdit) { - return null; - } - - $routeParams['id'] = $id; - - $action->setRouteParameters($routeParams); - $attributes = $action->getAttributes(); - //$attributes['data-action'] = $action->getRoute(); - //$attributes['data-action-id'] = $action->getRoute().'_'.$id; - //$attributes['data-node-id'] = $id; - $action->setAttributes($attributes); - - return $action; - }; - - if ($this->isGranted(ResourceNodeVoter::EDIT, $parentNode)) { - // Enable/Disable - $myRowAction = new RowAction( - '', - 'chamilo_core_resource_change_visibility', - false, - '_self' - ); - - $setVisibleParameters = function (RowAction $action, Row $row) use ($routeParams) { - /** @var AbstractResource $resource */ - $resource = $row->getEntity(); - $resourceNode = $resource->getResourceNode(); - $allowedEdit = $this->isGranted(ResourceNodeVoter::EDIT, $resourceNode); - - if (false === $allowedEdit) { - return null; - } - - $id = $resourceNode->getId(); - $icon = 'fa-eye-slash'; - - if ($this->hasCourse()) { - $link = $resource->getCourseSessionResourceLink($this->getCourse(), $this->getSession()); - } else { - $link = $resource->getFirstResourceLink(); - } - if (null === $link) { - return null; - } - - if (ResourceLink::VISIBILITY_PUBLISHED === $link->getVisibility()) { - $icon = 'fa-eye'; - } - $routeParams['id'] = $id; - $action->setRouteParameters($routeParams); - $attributes = [ - 'class' => 'btn btn-secondary change_visibility', - 'data-id' => $id, - 'icon' => $icon, - ]; - $action->setAttributes($attributes); - - return $action; - }; - - $myRowAction->addManipulateRender($setVisibleParameters); - $grid->addRowAction($myRowAction); - - if ($settings->isAllowResourceEdit()) { - // Edit action. - $myRowAction = new RowAction( - $this->trans('Edit'), - 'chamilo_core_resource_edit', - false, - '_self', - ['class' => 'btn btn-secondary', 'icon' => 'fa fa-pen'] - ); - $myRowAction->addManipulateRender($setNodeParameters); - $grid->addRowAction($myRowAction); - } - - // More action. - /*$myRowAction = new RowAction( - $this->trans('More'), - 'chamilo_core_resource_preview', - false, - '_self', - ['class' => 'btn btn-secondary edit_resource', 'icon' => 'fa fa-ellipsis-h'] - ); - - $myRowAction->addManipulateRender($setNodeParameters); - $grid->addRowAction($myRowAction);*/ - - // Delete action. - $myRowAction = new RowAction( - $this->trans('Delete'), - 'chamilo_core_resource_delete', - true, - '_self', - [ - 'class' => 'btn btn-danger', - //'data_hidden' => true, - ] - ); - $myRowAction->addManipulateRender($setNodeParameters); - $grid->addRowAction($myRowAction); - } - /*$grid->addExport(new CSVExport($this->trans('CSV export'), 'export', ['course' => $courseIdentifier])); - $grid->addExport( - new ExcelExport( - $this->trans('Excel export'), - 'export', - ['course' => $courseIdentifier] - ) - );*/ - - return $grid; - } - - /** + * @deprecated in favor of vue CRUD methods * @Route("/{tool}/{type}/{id}/list", name="chamilo_core_resource_list") * - * @deprecated - * * If node has children show it */ public function listAction(Request $request): Response @@ -423,10 +97,9 @@ class ResourceController extends AbstractResourceController implements CourseCon $repository = $this->getRepositoryFromRequest($request); $settings = $repository->getResourceSettings(); - $grid = $this->getGrid($request, $repository, $grid, $resourceNodeId, 'chamilo_core_resource_list'); + /*$grid = $this->getGrid($request, $repository, $grid, $resourceNodeId, 'chamilo_core_resource_list'); $parentResourceNode = $this->getParentResourceNode($request); - - $this->setBreadCrumb($request, $parentResourceNode); + $this->setBreadCrumb($request, $parentResourceNode);*/ //return $grid->getGridResponse( return $this->render( @@ -443,7 +116,7 @@ class ResourceController extends AbstractResourceController implements CourseCon } /** - * @deprecated + * @deprecated in favor of vue CRUD methods * * @Route("/{tool}/{type}/{id}/new_folder", methods={"GET", "POST"}, name="chamilo_core_resource_new_folder") */ @@ -453,7 +126,7 @@ class ResourceController extends AbstractResourceController implements CourseCon } /** - * @deprecated + * @deprecated in favor of vue CRUD methods * * @Route("/{tool}/{type}/{id}/new", methods={"GET", "POST"}, name="chamilo_core_resource_new") */ @@ -538,7 +211,8 @@ class ResourceController extends AbstractResourceController implements CourseCon } /** - * @deprecated + * @deprecated in favor of vue CRUD methods + * * @Route("/{tool}/{type}/{id}/edit", methods={"GET", "POST"}) */ public function editAction(Request $request, IllustrationRepository $illustrationRepository): Response @@ -852,8 +526,6 @@ class ResourceController extends AbstractResourceController implements CourseCon ]; return $this->render($repository->getTemplates()->getFromAction(__FUNCTION__), $params); - - //return $this->showFile($request, $resourceNode, $mode, $filter); } /** @@ -882,7 +554,7 @@ class ResourceController extends AbstractResourceController implements CourseCon return $this->redirect($url); } - return $this->showFile($request, $resourceNode, 'show', $filter); + return $this->processFile($request, $resourceNode, 'show', $filter); } /** @@ -913,7 +585,7 @@ class ResourceController extends AbstractResourceController implements CourseCon // If resource node has a file just download it. Don't download the children. if ($resourceNode->hasResourceFile()) { // Redirect to download single file. - return $this->showFile($request, $resourceNode, 'download'); + return $this->processFile($request, $resourceNode, 'download'); } $zipName = $resourceNode->getSlug().'.zip'; @@ -996,12 +668,9 @@ class ResourceController extends AbstractResourceController implements CourseCon } /** - * @param string $mode - * @param string $filter - * * @return mixed|StreamedResponse */ - private function showFile(Request $request, ResourceNode $resourceNode, $mode = 'show', $filter = '') + private function processFile(Request $request, ResourceNode $resourceNode, $mode = 'show', $filter = '') { $this->denyAccessUnlessGranted( ResourceNodeVoter::VIEW, diff --git a/src/CoreBundle/Repository/ResourceRepository.php b/src/CoreBundle/Repository/ResourceRepository.php index 2239be5d9c..7b1abbe161 100644 --- a/src/CoreBundle/Repository/ResourceRepository.php +++ b/src/CoreBundle/Repository/ResourceRepository.php @@ -645,7 +645,16 @@ class ResourceRepository extends EntityRepository $referenceType = $referenceType ?? UrlGeneratorInterface::ABSOLUTE_PATH; - return $this->router->generate('chamilo_core_resource_view', $params, $referenceType); + $mode = $params['mode'] ?? 'view'; + // Remove mode from params and sent directly to the controller. + unset($params['mode']); + + switch ($mode) { + case 'download': + return $this->router->generate('chamilo_core_resource_download', $params, $referenceType); + case 'view': + return $this->router->generate('chamilo_core_resource_view', $params, $referenceType); + } } return '';