Fix toggle visibility for resource links - refs BT#22283

pull/5960/head
Angel Fernando Quiroz Campos 8 months ago
parent 0b68242f61
commit 749fa7fcb0
No known key found for this signature in database
GPG Key ID: B284841AE3E562CD
  1. 25
      assets/vue/services/linkService.js
  2. 7
      assets/vue/views/documents/DocumentsList.vue
  3. 7
      assets/vue/views/links/LinksList.vue
  4. 5
      public/main/announcements/announcements.php
  5. 6
      public/main/calendar/agenda_list.php
  6. 11
      public/main/exercise/exercise.php
  7. 2
      public/main/forum/forumfunction.inc.php
  8. 14
      public/main/inc/lib/AnnouncementManager.php
  9. 9
      public/main/inc/lib/agenda.lib.php
  10. 14
      public/main/inc/lib/link.lib.php
  11. 6
      public/main/link/link.php
  12. 7
      public/main/lp/learnpath.class.php
  13. 6
      public/main/work/work.php
  14. 11
      src/CoreBundle/Controller/Api/UpdateVisibilityDocument.php
  15. 11
      src/CoreBundle/Controller/Api/UpdateVisibilityLink.php
  16. 11
      src/CoreBundle/Controller/Api/UpdateVisibilityLinkCategory.php
  17. 6
      src/CoreBundle/Repository/ResourceRepository.php
  18. 2
      tests/CourseBundle/Repository/CDocumentRepositoryTest.php

@ -1,5 +1,6 @@
import { ENTRYPOINT } from "../config/entrypoint"
import axios from "axios"
import baseService from "./baseService"
export default {
/**
@ -45,14 +46,16 @@ export default {
},
/**
* @param {Number|String} linkId
* @param {Boolean} visible
* @param {number} linkId
* @param {boolean} visible
* @param {number} cid
* @param {number} sid
* @returns {Promise<Object>}
*/
toggleLinkVisibility: async (linkId, visible) => {
const endpoint = `${ENTRYPOINT}links/${linkId}/toggle_visibility`
const response = await axios.put(endpoint, { visible })
toggleLinkVisibility: async (linkId, visible, cid, sid) => {
const endpoint = `${ENTRYPOINT}links/${linkId}/toggle_visibility?cid=${cid}&sid=${sid}`
return response.data
return baseService.put(endpoint, { visible })
},
/**
@ -123,11 +126,13 @@ export default {
},
/**
* @param {Number|String} categoryId
* @param {Boolean} visible
* @param {number} categoryId
* @param {boolean} visible
* @param {number} cid
* @param {number} sid
*/
toggleCategoryVisibility: async (categoryId, visible) => {
const endpoint = `${ENTRYPOINT}link_categories/${categoryId}/toggle_visibility`
toggleCategoryVisibility: async (categoryId, visible, cid, sid) => {
const endpoint = `${ENTRYPOINT}link_categories/${categoryId}/toggle_visibility?cid=${cid}&sid=${sid}`
const response = await axios.put(endpoint, { visible })
return response.data

@ -420,6 +420,7 @@ import { useCidReq } from "../../composables/cidReq"
import { useDatatableList } from "../../composables/datatableList"
import { useFormatDate } from "../../composables/formatDate"
import axios from "axios"
import baseService from "../../services/baseService"
import DocumentEntry from "../../components/documents/DocumentEntry.vue"
import BaseButton from "../../components/basecomponents/BaseButton.vue"
import BaseToolbar from "../../components/basecomponents/BaseToolbar.vue"
@ -691,9 +692,9 @@ function btnChangeVisibilityOnClick(item) {
folderParams.id = item["@id"]
axios.put(item["@id"] + "/toggle_visibility").then((response) => {
item.resourceLinkListFromEntity = response.data.resourceLinkListFromEntity
})
baseService
.put(item["@id"] + `/toggle_visibility?cid=${cid}&sid=${sid}`, {})
.then((data) => (item.resourceLinkListFromEntity = data.resourceLinkListFromEntity))
}
function btnEditOnClick(item) {

@ -346,7 +346,12 @@ async function deleteCategory() {
async function toggleCategoryVisibility(category) {
const visibility = toggleVisibilityProperty(category.info.visible)
try {
const updatedLinkCategory = await linkService.toggleCategoryVisibility(category.info.id, isVisible(visibility))
const updatedLinkCategory = await linkService.toggleCategoryVisibility(
category.info.id,
isVisible(visibility),
cid,
sid,
)
category.info.visible = visibilityFromBoolean(updatedLinkCategory.linkCategoryVisible)
notifications.showSuccessNotification(t("Visibility of category changed"))
} catch (error) {

@ -348,9 +348,10 @@ switch ($action) {
api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $announcement_id)
) {
AnnouncementManager::change_visibility_announcement(
$_course,
$announcement_id,
$status
$status,
$course,
$session
);
Display::addFlash(Display::return_message(get_lang('The visibility has been changed.')));
header('Location: '.$homeUrl);

@ -92,12 +92,14 @@ $tpl->assign('is_allowed_to_edit', api_is_allowed_to_edit());
if (api_is_allowed_to_edit()) {
if ('change_visibility' === $action) {
$courseInfo = api_get_course_info();
$course = api_get_course_entity();
$session = api_get_session_entity();
$courseCondition = '';
// This happens when list agenda is not inside a course
if (('course' === $type || 'session' === $type) && !empty($courseInfo)) {
if (('course' === $type || 'session' === $type) && $course) {
// For course and session event types
// Just needs course ID
$agenda->changeVisibility($_GET['id'], $_GET['visibility'], $courseInfo);
$agenda->changeVisibility($_GET['id'], $_GET['visibility'], $course, $session);
} else {
$courseCondition = '&'.api_get_cidreq();
}

@ -36,8 +36,10 @@ $is_allowedToEdit = api_is_allowed_to_edit(null, true);
$is_tutor = api_is_allowed_to_edit(true);
$is_tutor_course = api_is_course_tutor();
$courseInfo = api_get_course_info();
$courseId = $courseInfo['real_id'];
$sessionId = api_get_session_id();
$courseEntity = api_get_course_entity();
$courseId = $courseEntity->getId();
$sessionEntity = api_get_session_entity();
$sessionId = $sessionEntity?->getId() ?: 0;
$isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(
api_get_user_id(),
$courseInfo
@ -89,7 +91,6 @@ if ($is_allowedToEdit && !empty($action)) {
switch ($action) {
case 'add_shortcut':
$repo = Container::getShortcutRepository();
$courseEntity = api_get_course_entity(api_get_course_int_id());
$user = api_get_user_entity();
$repo->addShortCut($exerciseEntity, $user, $courseEntity, api_get_session_entity());
@ -127,7 +128,7 @@ if ($is_allowedToEdit && !empty($action)) {
// Teacher change exercise
break;
}
$exerciseRepo->setVisibilityPublished($exerciseEntity);
$exerciseRepo->setVisibilityPublished($exerciseEntity, $courseEntity, $sessionEntity);
Display::addFlash(Display::return_message(get_lang('The visibility has been changed.'), 'confirmation'));
break;
@ -137,7 +138,7 @@ if ($is_allowedToEdit && !empty($action)) {
break;
}
$exerciseRepo->setVisibilityDraft($exerciseEntity);
$exerciseRepo->setVisibilityDraft($exerciseEntity, $courseEntity, $sessionEntity);
Display::addFlash(Display::return_message(get_lang('The visibility has been changed.'), 'confirmation'));
break;

@ -129,7 +129,7 @@ function handleForum($url)
case 'invisible':
if (null !== $resource) {
if ('visible' === $action) {
$repo->setVisibilityPublished($resource);
$repo->setVisibilityPublished($resource, $course, $session);
} else {
$repo->setVisibilityPending($resource);
}

@ -3,8 +3,10 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\AbstractResource;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\ExtraField as ExtraFieldEntity;
use Chamilo\CoreBundle\Entity\ExtraFieldValues;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
@ -215,24 +217,18 @@ class AnnouncementManager
/**
* This functions switches the visibility a course resource
* using the visibility field in 'item_property'.
*
* @param array $courseInfo
* @param int $id
* @param string $status
*
* @return bool False on failure, True on success
*/
public static function change_visibility_announcement($courseInfo, $id, $status)
public static function change_visibility_announcement($id, $status, ?Course $course, ?Session $session): bool
{
$repo = Container::getAnnouncementRepository();
$announcement = $repo->find($id);
if ($announcement) {
switch ($status) {
case 'invisible':
$repo->setVisibilityDraft($announcement);
$repo->setVisibilityDraft($announcement, $course, $session);
break;
case 'visible':
$repo->setVisibilityPublished($announcement);
$repo->setVisibilityPublished($announcement, $course, $session);
break;
}
}

@ -3,6 +3,7 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Session as SessionEntity;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CourseBundle\Entity\CCalendarEvent;
use Chamilo\CourseBundle\Entity\CCalendarEventAttachment;
@ -2249,8 +2250,8 @@ class Agenda
public static function changeVisibility(
$id,
$visibility,
$courseInfo,
$userId = null
?Course $course,
?SessionEntity $session,
) {
$id = (int) $id;
@ -2261,9 +2262,9 @@ class Agenda
if ($event) {
if (0 === $visibility) {
$repo->setVisibilityDraft($event);
$repo->setVisibilityDraft($event, $course, $session);
} else {
$repo->setVisibilityPublished($event);
$repo->setVisibilityPublished($event, $course, $session);
}
}

@ -2,6 +2,8 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CourseBundle\Entity\CLink;
use Chamilo\CourseBundle\Entity\CLinkCategory;
@ -677,7 +679,7 @@ class Link extends Model
/**
* Changes the visibility of a link.
*/
public static function setVisible($id, $scope)
public static function setVisible($id, $scope, ?Course $course, ?Session $session)
{
if (TOOL_LINK == $scope) {
/*api_item_property_update(
@ -691,14 +693,14 @@ class Link extends Model
/** @var CLink $link */
$link = $repo->find($id);
if ($link) {
$repo->setVisibilityPublished($link);
$repo->setVisibilityPublished($link, $course, $session);
}
} elseif (TOOL_LINK_CATEGORY == $scope) {
$repo = Container::getLinkCategoryRepository();
/** @var CLink $link */
$link = $repo->find($id);
if ($link) {
$repo->setVisibilityPublished($link);
$repo->setVisibilityPublished($link, $course, $session);
}
/*api_item_property_update(
$_course,
@ -711,21 +713,21 @@ class Link extends Model
Display::addFlash(Display::return_message(get_lang('The visibility has been changed.')));
}
public static function setInvisible($id, $scope)
public static function setInvisible($id, $scope, ?Course $course, ?Session $session)
{
if (TOOL_LINK == $scope) {
$repo = Container::getLinkRepository();
/** @var CLink $link */
$link = $repo->find($id);
if ($link) {
$repo->setVisibilityDraft($link);
$repo->setVisibilityDraft($link, $course, $session);
}
} elseif (TOOL_LINK_CATEGORY == $scope) {
$repo = Container::getLinkCategoryRepository();
/** @var CLinkCategory $link */
$link = $repo->find($id);
if ($link) {
$repo->setVisibilityDraft($link);
$repo->setVisibilityDraft($link, $course, $session);
}
}
Display::addFlash(Display::return_message(get_lang('The visibility has been changed.')));

@ -49,6 +49,8 @@ $nameTools = get_lang('Links');
$course_id = api_get_course_int_id();
$session_id = api_get_session_id();
$courseInfo = api_get_course_info();
$course = api_get_course_entity();
$session = api_get_session_entity();
if ('addlink' === $action) {
$nameTools = '';
@ -168,14 +170,14 @@ switch ($action) {
break;
case 'visible':
// Here we edit a category
Link::setVisible($id, $scope);
Link::setVisible($id, $scope, $course, $session);
header('Location: '.$linkListUrl);
exit;
break;
case 'invisible':
// Here we edit a category
Link::setInvisible($id, $scope);
Link::setInvisible($id, $scope, $course, $session);
header('Location: '.$linkListUrl);
exit;

@ -3347,10 +3347,13 @@ class learnpath
$visibility = (int) $visibility;
$course = api_get_course_entity();
$session = api_get_session_entity();
if (1 === $visibility) {
$repo->setVisibilityPublished($resource);
$repo->setVisibilityPublished($resource, $course, $session);
} else {
$repo->setVisibilityDraft($resource);
$repo->setVisibilityDraft($resource, $course, $session);
self::toggleCategoryPublish($id, 0);
}

@ -17,6 +17,8 @@ $courseInfo = api_get_course_info();
$user_id = api_get_user_id();
$sessionId = api_get_session_id();
$groupId = api_get_group_id();
$course = api_get_course_entity();
$session = api_get_session_entity();
// Section (for the tabs)
$this_section = SECTION_COURSES;
@ -252,7 +254,7 @@ switch ($action) {
api_not_allowed();
}
$repo->setVisibilityPublished($studentPublication);
$repo->setVisibilityPublished($studentPublication, $course, $session);
/*api_item_property_update(
$courseInfo,
@ -283,7 +285,7 @@ switch ($action) {
api_not_allowed();
}
$repo->setVisibilityDraft($studentPublication);
$repo->setVisibilityDraft($studentPublication, $course, $session);
/*
api_item_property_update(
$courseInfo,

@ -6,6 +6,7 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Controller\Api;
use Chamilo\CoreBundle\ServiceHelper\CidReqHelper;
use Chamilo\CourseBundle\Entity\CDocument;
use Chamilo\CourseBundle\Repository\CDocumentRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@ -14,9 +15,17 @@ use Symfony\Component\HttpKernel\Attribute\AsController;
#[AsController]
class UpdateVisibilityDocument extends AbstractController
{
public function __construct(
private readonly CidReqHelper $cidReqHelper,
) {}
public function __invoke(CDocument $document, CDocumentRepository $repo): CDocument
{
$repo->toggleVisibilityPublishedDraft($document);
$repo->toggleVisibilityPublishedDraft(
$document,
$this->cidReqHelper->getCourseEntity(),
$this->cidReqHelper->getSessionEntity()
);
return $document;
}

@ -6,6 +6,7 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Controller\Api;
use Chamilo\CoreBundle\ServiceHelper\CidReqHelper;
use Chamilo\CourseBundle\Entity\CLink;
use Chamilo\CourseBundle\Repository\CLinkRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@ -14,9 +15,17 @@ use Symfony\Component\HttpKernel\Attribute\AsController;
#[AsController]
class UpdateVisibilityLink extends AbstractController
{
public function __construct(
private readonly CidReqHelper $cidReqHelper,
) {}
public function __invoke(CLink $link, CLinkRepository $repo): CLink
{
$repo->toggleVisibilityPublishedDraft($link);
$repo->toggleVisibilityPublishedDraft(
$link,
$this->cidReqHelper->getCourseEntity(),
$this->cidReqHelper->getSessionEntity()
);
$link->toggleVisibility();
return $link;

@ -6,6 +6,7 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Controller\Api;
use Chamilo\CoreBundle\ServiceHelper\CidReqHelper;
use Chamilo\CourseBundle\Entity\CLinkCategory;
use Chamilo\CourseBundle\Repository\CLinkCategoryRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@ -14,9 +15,17 @@ use Symfony\Component\HttpKernel\Attribute\AsController;
#[AsController]
class UpdateVisibilityLinkCategory extends AbstractController
{
public function __construct(
private readonly CidReqHelper $cidReqHelper,
) {}
public function __invoke(CLinkCategory $linkCategory, CLinkCategoryRepository $repo): CLinkCategory
{
$repo->toggleVisibilityPublishedDraft($linkCategory);
$repo->toggleVisibilityPublishedDraft(
$linkCategory,
$this->cidReqHelper->getCourseEntity(),
$this->cidReqHelper->getSessionEntity()
);
$linkCategory->toggleVisibility();
return $linkCategory;

@ -585,18 +585,18 @@ abstract class ResourceRepository extends ServiceEntityRepository
}
}
public function toggleVisibilityPublishedDraft(AbstractResource $resource): void
public function toggleVisibilityPublishedDraft(AbstractResource $resource, ?Course $course, ?Session $session): void
{
$firstLink = $resource->getFirstResourceLink();
if (ResourceLink::VISIBILITY_PUBLISHED === $firstLink->getVisibility()) {
$this->setVisibilityDraft($resource);
$this->setVisibilityDraft($resource, $course, $session);
return;
}
if (ResourceLink::VISIBILITY_DRAFT === $firstLink->getVisibility()) {
$this->setVisibilityPublished($resource);
$this->setVisibilityPublished($resource, $course, $session);
}
}

@ -1089,7 +1089,7 @@ class CDocumentRepositoryTest extends AbstractApiTest
$this->assertSame(ResourceLink::VISIBILITY_PUBLISHED, $link->getVisibility());
$documentId = $document->getIid();
$url = '/api/documents/'.$documentId.'/toggle_visibility';
$url = '/api/documents/'.$documentId.'/toggle_visibility?cid='.$course->getId();
// Not logged in.
$client->request('PUT', $url);

Loading…
Cancel
Save