From 05c23574fa38acdde784c5c11af4a1c236fc62aa Mon Sep 17 00:00:00 2001 From: Christian Beeznest Date: Tue, 3 Jun 2025 00:33:41 -0500 Subject: [PATCH 1/3] Course: Add support for resource sequencing in course and session views - refs rna-22586 --- .../components/course/CatalogueCourseCard.vue | 37 +++- .../course/CatalogueRequirementModal.vue | 69 +++++++ .../components/course/NextCourseSequence.vue | 97 ++++++++++ assets/vue/services/courseService.js | 14 ++ assets/vue/views/course/CourseHome.vue | 17 +- .../default/admin/resource_sequence.html.twig | 2 +- .../Admin/IndexBlocksController.php | 10 +- .../Controller/CourseController.php | 54 ++++++ .../Repository/SequenceResourceRepository.php | 170 +++++++++++++++++- 9 files changed, 448 insertions(+), 22 deletions(-) create mode 100644 assets/vue/components/course/CatalogueRequirementModal.vue create mode 100644 assets/vue/components/course/NextCourseSequence.vue diff --git a/assets/vue/components/course/CatalogueCourseCard.vue b/assets/vue/components/course/CatalogueCourseCard.vue index e6af0d7d39f..daf8fb47f95 100644 --- a/assets/vue/components/course/CatalogueCourseCard.vue +++ b/assets/vue/components/course/CatalogueCourseCard.vue @@ -121,7 +121,7 @@
+ import Rating from "primevue/rating" import Button from "primevue/button" -import { computed, ref } from "vue" +import { computed, onMounted, ref } from "vue" import courseRelUserService from "../../services/courseRelUserService" import { useRoute, useRouter } from "vue-router" import { useNotification } from "../../composables/notification" import Dialog from "primevue/dialog" import { usePlatformConfig } from "../../store/platformConfig" +import CatalogueRequirementModal from "./CatalogueRequirementModal.vue" +import courseService from "../../services/courseService" const platformConfigStore = usePlatformConfig() const showDescriptionDialog = ref(false) +const showDependenciesModal = ref(false) +const hasDependencies = ref(false) const allowDescription = computed( () => platformConfigStore.getSetting("course.show_courses_descriptions_in_catalog") !== "false", @@ -333,4 +350,16 @@ const showInfoPopup = computed(() => { } return value === "course_description_popup" }) + +onMounted(async () => { + try { + const { sequenceList: list } = await courseService.getNextCourse( + props.course.id, + props.course.sessionId || 0 + ) + hasDependencies.value = list.length > 0 + } catch (e) { + console.warn(`[CatalogueCourseCard] Failed to load dependencies for course ${props.course.id}`, e) + } +}) diff --git a/assets/vue/components/course/CatalogueRequirementModal.vue b/assets/vue/components/course/CatalogueRequirementModal.vue new file mode 100644 index 00000000000..4af59c0e7e1 --- /dev/null +++ b/assets/vue/components/course/CatalogueRequirementModal.vue @@ -0,0 +1,69 @@ + + + diff --git a/assets/vue/components/course/NextCourseSequence.vue b/assets/vue/components/course/NextCourseSequence.vue new file mode 100644 index 00000000000..044e7c2f3fb --- /dev/null +++ b/assets/vue/components/course/NextCourseSequence.vue @@ -0,0 +1,97 @@ + + + diff --git a/assets/vue/services/courseService.js b/assets/vue/services/courseService.js index 9e1bd779516..cee94c30245 100644 --- a/assets/vue/services/courseService.js +++ b/assets/vue/services/courseService.js @@ -204,4 +204,18 @@ export default { return [] } }, + + /** + * Gets the next course in the sequence if available and validated. + * @param {number} courseId - The current course ID. + * @param {number=} sessionId - Optional session ID. + * @returns {Promise<{ available: boolean, nextCourse: object|null }>} + */ + getNextCourse: async (courseId, sessionId = 0) => { + const { data } = await api.get(`/course/${courseId}/next-course`, { + params: { sid: sessionId }, + }) + + return data + }, } diff --git a/assets/vue/views/course/CourseHome.vue b/assets/vue/views/course/CourseHome.vue index c0edd3c4063..32d51370594 100644 --- a/assets/vue/views/course/CourseHome.vue +++ b/assets/vue/views/course/CourseHome.vue @@ -143,10 +143,18 @@ - +
+
+ +
+ +
+ +
+
'item-resource-sequence', - 'url' => $this->generateUrl('legacy_main', [ - 'name' => 'admin/resource_sequence.php', - 'query' => ['type' => SequenceResource::COURSE_TYPE], - ]), + 'url' => $this->generateUrl('legacy_main', ['name' => 'admin/resource_sequence.php', 'type' => SequenceResource::COURSE_TYPE]), 'label' => $this->translator->trans('Resources sequencing'), ]; @@ -827,10 +824,7 @@ private function getItemsSessions(): array ]; $items[] = [ 'class' => 'item-resource-sequence', - 'url' => $this->generateUrl('legacy_main', [ - 'name' => 'admin/resource_sequence.php', - 'query' => ['type' => SequenceResource::SESSION_TYPE], - ]), + 'url' => $this->generateUrl('legacy_main', ['name' => 'admin/resource_sequence.php', 'type' => SequenceResource::SESSION_TYPE]), 'label' => $this->translator->trans('Resources sequencing'), ]; $items[] = [ diff --git a/src/CoreBundle/Controller/CourseController.php b/src/CoreBundle/Controller/CourseController.php index 70f368851a5..f90801a028d 100644 --- a/src/CoreBundle/Controller/CourseController.php +++ b/src/CoreBundle/Controller/CourseController.php @@ -9,6 +9,7 @@ use Chamilo\CoreBundle\Entity\Course; use Chamilo\CoreBundle\Entity\CourseRelUser; use Chamilo\CoreBundle\Entity\ExtraField; +use Chamilo\CoreBundle\Entity\SequenceResource; use Chamilo\CoreBundle\Entity\Session; use Chamilo\CoreBundle\Entity\SessionRelUser; use Chamilo\CoreBundle\Entity\Tag; @@ -22,6 +23,7 @@ use Chamilo\CoreBundle\Repository\LegalRepository; use Chamilo\CoreBundle\Repository\Node\CourseRepository; use Chamilo\CoreBundle\Repository\Node\IllustrationRepository; +use Chamilo\CoreBundle\Repository\SequenceResourceRepository; use Chamilo\CoreBundle\Repository\TagRepository; use Chamilo\CoreBundle\Security\Authorization\Voter\CourseVoter; use Chamilo\CoreBundle\Service\CourseService; @@ -50,7 +52,10 @@ use Exception; use Exercise; use ExtraFieldValue; +use Fhaculty\Graph\Graph; +use Graphp\GraphViz\GraphViz; use Symfony\Bridge\Doctrine\Attribute\MapEntity; +use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; @@ -256,6 +261,55 @@ public function indexJson( ] ); } + #[Route('/{courseId}/next-course', name: 'chamilo_course_next_course')] + public function getNextCourse( + int $courseId, + Request $request, + SequenceResourceRepository $repo, + Security $security, + SettingsManager $settingsManager, + EntityManagerInterface $em + ): JsonResponse { + if ('true' !== $settingsManager->getSetting('course.resource_sequence_show_dependency_in_course_intro', true)) { + return new JsonResponse([]); + } + + $sessionId = $request->query->getInt('sid'); + $user = $security->getUser(); + $userId = $user->getId(); + + $sequences = $repo->getDependents($courseId, SequenceResource::COURSE_TYPE); + if (empty($sequences)) { + return new JsonResponse([]); + } + + $checked = $repo->checkDependentsForUser( + $sequences, + SequenceResource::COURSE_TYPE, + $userId, + $sessionId + ); + + $isUnlocked = $repo->checkSequenceAreCompleted($checked); + + $sequenceResource = $repo->findRequirementForResource($courseId, SequenceResource::COURSE_TYPE); + $graphImage = null; + + if ($sequenceResource && $sequenceResource->hasGraph()) { + $graph = $sequenceResource->getSequence()->getUnSerializeGraph(); + if ($graph !== null) { + $graph->setAttribute('graphviz.node.fontname', 'arial'); + $graphviz = new GraphViz(); + $graphImage = $graphviz->createImageSrc($graph); + } + } + + return new JsonResponse([ + 'sequenceList' => array_values($checked), + 'allowSubscription' => $isUnlocked, + 'graph' => $graphImage, + ]); + } /** * Redirects the page to a tool, following the tools settings. diff --git a/src/CoreBundle/Repository/SequenceResourceRepository.php b/src/CoreBundle/Repository/SequenceResourceRepository.php index e0fc1b74268..ec553051ac8 100644 --- a/src/CoreBundle/Repository/SequenceResourceRepository.php +++ b/src/CoreBundle/Repository/SequenceResourceRepository.php @@ -11,6 +11,7 @@ use Chamilo\CoreBundle\Entity\GradebookCategory; use Chamilo\CoreBundle\Entity\SequenceResource; use Chamilo\CoreBundle\Entity\Session; +use Chamilo\CoreBundle\Entity\SessionRelCourse; use Chamilo\CoreBundle\Entity\SessionRelUser; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; @@ -259,8 +260,8 @@ public function checkRequirementsForUser(array $sequences, int $type, int $userI $course = $sessionCourse->getCourse(); $categories = $gradebookCategoryRepo->findBy( [ - 'courseCode' => $course->getCode(), - 'sessionId' => $resource->getId(), + 'course' => $course, + 'session' => $resource, 'isRequirement' => true, ] ); @@ -316,12 +317,14 @@ public function checkRequirementsForUser(array $sequences, int $type, int $userI public function checkCourseRequirements(int $userId, Course $course, int $sessionId = 0): bool { $em = $this->getEntityManager(); - + $session = $sessionId > 0 + ? $em->getRepository(Session::class)->find($sessionId) + : null; $gradebookCategoryRepo = $em->getRepository(GradebookCategory::class); $categories = $gradebookCategoryRepo->findBy( [ - 'courseCode' => $course->getCode(), - 'sessionId' => $sessionId, + 'course' => $course, + 'session' => $session, 'isRequirement' => true, ] ); @@ -364,6 +367,11 @@ public function checkCourseRequirements(int $userId, Course $course, int $sessio public function checkSequenceAreCompleted(array $sequences) { foreach ($sequences as $sequence) { + + if (!isset($sequence['requirements'])) { + continue; + } + $status = true; foreach ($sequence['requirements'] as $item) { @@ -414,4 +422,156 @@ protected function findVerticesEdges(Vertices $verticesEdges, int $type) return $sessionVertices; } + + public function getDependents(int $resourceId, int $type): array + { + return $this->getRequirementsOrDependents($resourceId, $type, 'dependents'); + } + + public function checkDependentsForUser(array $sequences, int $type, int $userId, int $sessionId = 0): array + { + return $this->checkRequirementsOrDependentsForUser( + $sequences, + $type, + 'dependents', + $userId, + $sessionId + ); + } + + private function getRequirementsOrDependents(int $resourceId, int $resourceType, string $itemType): array + { + $em = $this->getEntityManager(); + + $sequencesResource = $this->findBy(['resourceId' => $resourceId, 'type' => $resourceType]); + $result = []; + + foreach ($sequencesResource as $sequenceResource) { + if (!$sequenceResource->hasGraph()) { + continue; + } + + $sequence = $sequenceResource->getSequence(); + $graph = $sequence->getUnSerializeGraph(); + $vertex = $graph->getVertex($resourceId); + + $edges = $itemType === 'requirements' + ? $vertex->getVerticesEdgeFrom() + : $vertex->getVerticesEdgeTo(); + + $sequenceInfo = [ + 'name' => $sequence->getTitle(), + $itemType => [], + ]; + + foreach ($edges as $edge) { + $vertexId = $edge->getId(); + $resource = null; + + switch ($resourceType) { + case SequenceResource::SESSION_TYPE: + $resource = $em->getRepository(Session::class)->find($vertexId); + break; + case SequenceResource::COURSE_TYPE: + $resource = $em->getRepository(Course::class)->find($vertexId); + break; + } + + if (null === $resource) { + continue; + } + + $sequenceInfo[$itemType][$vertexId] = $resource; + } + + $result[$sequence->getId()] = $sequenceInfo; + } + + return $result; + } + + private function checkRequirementsOrDependentsForUser( + array $sequences, + int $resourceType, + string $itemType, + int $userId, + int $sessionId = 0 + ): array { + $sequenceList = []; + $em = $this->getEntityManager(); + $gradebookCategoryRepo = $em->getRepository(GradebookCategory::class); + + $sessionUserList = []; + $checkOnlySameSession = true; //api_get_configuration_value('course_sequence_valid_only_in_same_session'); + + if (SequenceResource::COURSE_TYPE === $resourceType) { + if ($checkOnlySameSession) { + $sessionUserList = [$sessionId]; + } else { + $sessions = $em->getRepository(SessionRelUser::class)->findBy(['user' => $userId]); + foreach ($sessions as $sessionRelUser) { + $sessionUserList[] = $sessionRelUser->getSession()->getId(); + } + } + } + + foreach ($sequences as $sequenceId => $sequence) { + $item = ['name' => $sequence['name'], $itemType => []]; + + foreach ($sequence[$itemType] as $resource) { + switch ($resourceType) { + case SequenceResource::SESSION_TYPE: + $id = $resource->getId(); + $resourceItem = ['name' => $resource->getName(), 'status' => true]; + + /* @var SessionRelCourse $sessionCourse */ + foreach ($resource->getCourses() as $sessionCourse) { + $course = $sessionCourse->getCourse(); + $session = $sessionCourse->getSession(); + $categories = $gradebookCategoryRepo->findBy([ + 'course' => $course, + 'session' => $session, + 'isRequirement' => true, + ]); + + foreach ($categories as $category) { + $resourceItem['status'] = $resourceItem['status'] && Category::userFinishedCourse( + $userId, + $category + ); + } + } + break; + + case SequenceResource::COURSE_TYPE: + $id = $resource->getId(); + $status = $this->checkCourseRequirements($userId, $resource, $sessionId); + + if (!$status) { + foreach (SessionManager::get_session_by_course($id) as $session) { + if (in_array($session['id'], $sessionUserList)) { + $status = $this->checkCourseRequirements($userId, $resource, $session['id']); + if ($status) break; + } + } + } + + $resourceItem = [ + 'name' => $resource->getTitle(), + 'code' => $resource->getCode(), + 'status' => $status, + ]; + break; + } + + if (!empty($id)) { + $item[$itemType][$id] = $resourceItem; + } + } + + $sequenceList[$sequenceId] = $item; + } + + return $sequenceList; + } } From f9d8f5e0af83fc255eae0148f7982f1c0b0e0951 Mon Sep 17 00:00:00 2001 From: Christian Beeznest Date: Sun, 8 Jun 2025 23:30:16 -0500 Subject: [PATCH 2/3] Admin: Add sequence dependency check for sessions and courses with UI integration - refs BT#22586 --- .../components/basecomponents/ChamiloIcons.js | 1 + .../components/course/CatalogueCourseCard.vue | 64 +++++------- .../course/CatalogueRequirementModal.vue | 44 ++++----- assets/vue/components/course/CourseCard.vue | 95 ++++++++++++------ .../components/course/NextCourseSequence.vue | 2 +- .../components/session/SessionCardSimple.vue | 38 ++++--- .../session/SessionCategoryView.vue | 51 +++++----- .../components/session/SessionListView.vue | 98 +++++++++++++++++++ .../course/useCourseRequirementStatus.js | 52 ++++++++++ assets/vue/services/courseService.js | 16 ++- assets/vue/views/course/CourseHome.vue | 11 ++- public/main/session/resume_session.php | 5 +- .../Controller/CourseController.php | 41 +++++--- .../PlatformConfigurationController.php | 2 + .../DataFixtures/SettingsCurrentFixtures.php | 10 ++ .../Repository/SequenceResourceRepository.php | 9 +- .../Settings/CourseSettingsSchema.php | 2 + .../Settings/SessionSettingsSchema.php | 7 ++ 18 files changed, 385 insertions(+), 163 deletions(-) create mode 100644 assets/vue/components/session/SessionListView.vue create mode 100644 assets/vue/composables/course/useCourseRequirementStatus.js diff --git a/assets/vue/components/basecomponents/ChamiloIcons.js b/assets/vue/components/basecomponents/ChamiloIcons.js index 3a1cf24c5e2..35f5502170b 100644 --- a/assets/vue/components/basecomponents/ChamiloIcons.js +++ b/assets/vue/components/basecomponents/ChamiloIcons.js @@ -144,4 +144,5 @@ export const chamiloIconToClass = { "clear-all": "mdi mdi-broom", "qrcode": "mdi mdi-qrcode", "minus": "mdi mdi-minus", + "shield-check": "mdi mdi-shield-check", } diff --git a/assets/vue/components/course/CatalogueCourseCard.vue b/assets/vue/components/course/CatalogueCourseCard.vue index daf8fb47f95..7b057bc07c1 100644 --- a/assets/vue/components/course/CatalogueCourseCard.vue +++ b/assets/vue/components/course/CatalogueCourseCard.vue @@ -132,7 +132,7 @@
-
+
- -
+
@@ -420,6 +422,9 @@ async function updateDisplayOrder(htmlItem, newIndex) { } const isAllowedToEdit = ref(false) +const showCourseSequence = computed(() => { + return platformConfigStore.getSetting("course.resource_sequence_show_dependency_in_course_intro") === "true" +}) onMounted(async () => { isAllowedToEdit.value = await checkIsAllowedToEdit() diff --git a/public/main/session/resume_session.php b/public/main/session/resume_session.php index 1df62218e25..1b9070a948d 100644 --- a/public/main/session/resume_session.php +++ b/public/main/session/resume_session.php @@ -7,10 +7,9 @@ use Chamilo\CoreBundle\Entity\SessionRelCourse; use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser; use Chamilo\CoreBundle\Framework\Container; -use Chamilo\CoreBundle\Repository\SequenceRepository; use Chamilo\CoreBundle\Component\Utils\ActionIcon; use Chamilo\CoreBundle\Component\Utils\ObjectIcon; -use Chamilo\CoreBundle\Component\Utils\StateIcon; +use Chamilo\CoreBundle\Repository\SequenceResourceRepository; $cidReset = true; require_once __DIR__.'/../inc/global.inc.php'; @@ -373,7 +372,7 @@ $userListToShow .= $table->toHtml(); } -/** @var SequenceRepository $repo */ +/** @var SequenceResourceRepository $repo */ $repo = $em->getRepository(SequenceResource::class); $requirementAndDependencies = $repo->getRequirementAndDependencies( $sessionId, diff --git a/src/CoreBundle/Controller/CourseController.php b/src/CoreBundle/Controller/CourseController.php index 43c927a8127..c75f4825acf 100644 --- a/src/CoreBundle/Controller/CourseController.php +++ b/src/CoreBundle/Controller/CourseController.php @@ -270,29 +270,38 @@ public function getNextCourse( SettingsManager $settingsManager, EntityManagerInterface $em ): JsonResponse { - if ('true' !== $settingsManager->getSetting('course.resource_sequence_show_dependency_in_course_intro', true)) { - return new JsonResponse([]); - } - $sessionId = $request->query->getInt('sid'); + $useDependents = $request->query->getBoolean('dependents', false); $user = $security->getUser(); $userId = $user->getId(); - $sequences = $repo->getDependents($courseId, SequenceResource::COURSE_TYPE); - if (empty($sequences)) { - return new JsonResponse([]); - } + if ($useDependents) { + $sequences = $repo->getDependents($courseId, SequenceResource::COURSE_TYPE); + $checked = $repo->checkDependentsForUser($sequences, SequenceResource::COURSE_TYPE, $userId, $sessionId); + $isUnlocked = $repo->checkSequenceAreCompleted($checked); + $sequenceResource = $repo->findRequirementForResource($courseId, SequenceResource::COURSE_TYPE); + } else { + $sequences = $repo->getRequirements($courseId, SequenceResource::COURSE_TYPE); + + $hasValidRequirement = false; + foreach ($sequences as $sequence) { + foreach ($sequence['requirements'] ?? [] as $resource) { + if ($resource instanceof Course) { + $hasValidRequirement = true; + break 2; + } + } + } - $checked = $repo->checkDependentsForUser( - $sequences, - SequenceResource::COURSE_TYPE, - $userId, - $sessionId - ); + if (!$hasValidRequirement) { + return new JsonResponse([]); + } - $isUnlocked = $repo->checkSequenceAreCompleted($checked); + $checked = $repo->checkRequirementsForUser($sequences, SequenceResource::COURSE_TYPE, $userId, $sessionId); + $isUnlocked = $repo->checkSequenceAreCompleted($checked); + $sequenceResource = $repo->findRequirementForResource($courseId, SequenceResource::COURSE_TYPE); + } - $sequenceResource = $repo->findRequirementForResource($courseId, SequenceResource::COURSE_TYPE); $graphImage = null; if ($sequenceResource && $sequenceResource->hasGraph()) { diff --git a/src/CoreBundle/Controller/PlatformConfigurationController.php b/src/CoreBundle/Controller/PlatformConfigurationController.php index da6cb16dc26..bec3ba37f69 100644 --- a/src/CoreBundle/Controller/PlatformConfigurationController.php +++ b/src/CoreBundle/Controller/PlatformConfigurationController.php @@ -110,6 +110,8 @@ public function list(SettingsManager $settingsManager): Response 'course.show_courses_descriptions_in_catalog', 'session.session_automatic_creation_user_id', 'session.session_list_view_remaining_days', + 'session.user_session_display_mode', + 'course.resource_sequence_show_dependency_in_course_intro', ]; $user = $this->userHelper->getCurrent(); diff --git a/src/CoreBundle/DataFixtures/SettingsCurrentFixtures.php b/src/CoreBundle/DataFixtures/SettingsCurrentFixtures.php index ac9d2df7475..4bd8709d7dd 100644 --- a/src/CoreBundle/DataFixtures/SettingsCurrentFixtures.php +++ b/src/CoreBundle/DataFixtures/SettingsCurrentFixtures.php @@ -114,6 +114,11 @@ public static function getExistingSettings(): array ], ], 'session' => [ + [ + 'name' => 'user_session_display_mode', + 'title' => 'My Sessions display mode', + 'comment' => 'Choose how the "My Sessions" page is displayed: as a modern visual block (card) view or the classic list style.', + ], [ 'name' => 'session_list_view_remaining_days', 'title' => 'Show remaining days in My Sessions', @@ -248,6 +253,11 @@ public static function getExistingSettings(): array ], ], 'course' => [ + [ + 'name' => 'course_sequence_valid_only_in_same_session', + 'title' => 'Validate prerequisites only within the same session', + 'comment' => 'When enabled, a course will be considered validated only if passed within the current session. If disabled, courses passed in other sessions will also unlock dependent courses.', + ], [ 'name' => 'access_url_specific_files', 'title' => 'Enable URL-specific files', diff --git a/src/CoreBundle/Repository/SequenceResourceRepository.php b/src/CoreBundle/Repository/SequenceResourceRepository.php index ec553051ac8..a23c85f273c 100644 --- a/src/CoreBundle/Repository/SequenceResourceRepository.php +++ b/src/CoreBundle/Repository/SequenceResourceRepository.php @@ -13,6 +13,7 @@ use Chamilo\CoreBundle\Entity\Session; use Chamilo\CoreBundle\Entity\SessionRelCourse; use Chamilo\CoreBundle\Entity\SessionRelUser; +use Chamilo\CoreBundle\Settings\SettingsManager; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; use Fhaculty\Graph\Set\Vertices; @@ -21,8 +22,10 @@ class SequenceResourceRepository extends ServiceEntityRepository { - public function __construct(ManagerRegistry $registry) - { + public function __construct( + ManagerRegistry $registry, + private readonly SettingsManager $settingsManager + ) { parent::__construct($registry, SequenceResource::class); } @@ -502,7 +505,7 @@ private function checkRequirementsOrDependentsForUser( $gradebookCategoryRepo = $em->getRepository(GradebookCategory::class); $sessionUserList = []; - $checkOnlySameSession = true; //api_get_configuration_value('course_sequence_valid_only_in_same_session'); + $checkOnlySameSession = $this->settingsManager->getSetting('course.course_sequence_valid_only_in_same_session', true); if (SequenceResource::COURSE_TYPE === $resourceType) { if ($checkOnlySameSession) { diff --git a/src/CoreBundle/Settings/CourseSettingsSchema.php b/src/CoreBundle/Settings/CourseSettingsSchema.php index 3bd07f202d4..538800315bd 100644 --- a/src/CoreBundle/Settings/CourseSettingsSchema.php +++ b/src/CoreBundle/Settings/CourseSettingsSchema.php @@ -109,6 +109,7 @@ public function buildSettings(AbstractSettingsBuilder $builder): void 'course_student_info' => '', 'course_catalog_settings' => '', 'resource_sequence_show_dependency_in_course_intro' => 'false', + 'course_sequence_valid_only_in_same_session' => 'false', 'course_catalog_display_in_home' => 'false', 'course_creation_form_set_course_category_mandatory' => 'false', 'course_creation_form_hide_course_code' => 'false', @@ -302,6 +303,7 @@ public function buildForm(FormBuilderInterface $builder): void ] ) ->add('resource_sequence_show_dependency_in_course_intro', YesNoType::class) + ->add('course_sequence_valid_only_in_same_session', YesNoType::class) ->add('course_catalog_display_in_home', YesNoType::class) ->add('course_creation_form_set_course_category_mandatory', YesNoType::class) ->add('course_creation_form_hide_course_code', YesNoType::class) diff --git a/src/CoreBundle/Settings/SessionSettingsSchema.php b/src/CoreBundle/Settings/SessionSettingsSchema.php index 6f8b9c39827..e610cee22d5 100644 --- a/src/CoreBundle/Settings/SessionSettingsSchema.php +++ b/src/CoreBundle/Settings/SessionSettingsSchema.php @@ -83,6 +83,7 @@ public function buildSettings(AbstractSettingsBuilder $builder): void 'enable_auto_reinscription' => 'false', 'enable_session_replication' => 'false', 'session_list_view_remaining_days' => 'false', + 'user_session_display_mode' => 'card', ] ) ; @@ -209,6 +210,12 @@ public function buildForm(FormBuilderInterface $builder): void ->add('session_model_list_field_ordered_by_id', YesNoType::class) ->add('duplicate_specific_session_content_on_session_copy', YesNoType::class) ->add('session_list_view_remaining_days', YesNoType::class) + ->add('user_session_display_mode', ChoiceType::class, [ + 'choices' => [ + 'Card (visual blocks)' => 'card', + 'List (classic)' => 'list', + ], + ]) ; $this->updateFormFieldsFromSettingsInfo($builder); From 5313f00b6809bbd5eb35185b84710f62efb535e4 Mon Sep 17 00:00:00 2001 From: Christian Beeznest Date: Wed, 18 Jun 2025 21:08:47 -0500 Subject: [PATCH 3/3] Session: Check course requirement and UI integration - refs #22586 --- .../session/CatalogueSessionCard.vue | 54 +- composer.lock | 848 +++++++++--------- .../Repository/SequenceResourceRepository.php | 38 +- symfony.lock | 9 - 4 files changed, 499 insertions(+), 450 deletions(-) diff --git a/assets/vue/components/session/CatalogueSessionCard.vue b/assets/vue/components/session/CatalogueSessionCard.vue index 27f4a420074..1c00eb97228 100644 --- a/assets/vue/components/session/CatalogueSessionCard.vue +++ b/assets/vue/components/session/CatalogueSessionCard.vue @@ -159,7 +159,16 @@ class="flex justify-between items-center border-b pb-1" > {{ item.title }} +
+ diff --git a/composer.lock b/composer.lock index 96786947629..e2c949199e7 100644 --- a/composer.lock +++ b/composer.lock @@ -775,21 +775,20 @@ "issues": "https://github.com/Behat/Transliterator/issues", "source": "https://github.com/Behat/Transliterator/tree/v1.5.0" }, - "abandoned": true, "time": "2022-03-30T09:27:43+00:00" }, { "name": "brick/math", - "version": "0.13.1", + "version": "0.12.3", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04" + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/fc7ed316430118cc7836bf45faff18d5dfc8de04", - "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04", + "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", "shasum": "" }, "require": { @@ -828,7 +827,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.13.1" + "source": "https://github.com/brick/math/tree/0.12.3" }, "funding": [ { @@ -836,7 +835,7 @@ "type": "github" } ], - "time": "2025-03-29T13:50:30+00:00" + "time": "2025-02-28T13:11:00+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -2109,16 +2108,16 @@ }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.4.2", + "version": "3.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9" + "reference": "e858ce0f5c12b266dce7dce24834448355155da7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5a6ac7120c2924c4c070a869d08b11ccf9e277b9", - "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/e858ce0f5c12b266dce7dce24834448355155da7", + "reference": "e858ce0f5c12b266dce7dce24834448355155da7", "shasum": "" }, "require": { @@ -2132,6 +2131,7 @@ "composer/semver": "^3.0", "doctrine/coding-standard": "^12", "doctrine/orm": "^2.6 || ^3", + "doctrine/persistence": "^2.0 || ^3", "phpstan/phpstan": "^1.4 || ^2", "phpstan/phpstan-deprecation-rules": "^1 || ^2", "phpstan/phpstan-phpunit": "^1 || ^2", @@ -2174,7 +2174,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.2" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.1" }, "funding": [ { @@ -2190,7 +2190,7 @@ "type": "tidelift" } ], - "time": "2025-03-11T17:36:26+00:00" + "time": "2025-01-27T22:48:22+00:00" }, { "name": "doctrine/event-manager", @@ -2626,16 +2626,16 @@ }, { "name": "doctrine/orm", - "version": "2.20.3", + "version": "2.20.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "17d28b5c4cac212ca92730d9a26e32a0b1516126" + "reference": "19912de9270fa6abb3d25a1a37784af6b818d534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/17d28b5c4cac212ca92730d9a26e32a0b1516126", - "reference": "17d28b5c4cac212ca92730d9a26e32a0b1516126", + "url": "https://api.github.com/repos/doctrine/orm/zipball/19912de9270fa6abb3d25a1a37784af6b818d534", + "reference": "19912de9270fa6abb3d25a1a37784af6b818d534", "shasum": "" }, "require": { @@ -2662,14 +2662,14 @@ }, "require-dev": { "doctrine/annotations": "^1.13 || ^2", - "doctrine/coding-standard": "^9.0.2 || ^13.0", + "doctrine/coding-standard": "^9.0.2 || ^12.0", "phpbench/phpbench": "^0.16.10 || ^1.0", "phpstan/extension-installer": "~1.1.0 || ^1.4", "phpstan/phpstan": "~1.4.10 || 2.0.3", "phpstan/phpstan-deprecation-rules": "^1 || ^2", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", "psr/log": "^1 || ^2 || ^3", - "squizlabs/php_codesniffer": "3.12.0", + "squizlabs/php_codesniffer": "3.7.2", "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0" @@ -2722,9 +2722,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.20.3" + "source": "https://github.com/doctrine/orm/tree/2.20.2" }, - "time": "2025-05-02T17:07:53+00:00" + "time": "2025-02-04T19:17:01+00:00" }, { "name": "doctrine/persistence", @@ -3728,28 +3728,28 @@ }, { "name": "google/cloud-core", - "version": "v1.62.3", + "version": "v1.62.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-core.git", - "reference": "0c19d76e7f3b6810c4f2cc1330c693af2681c601" + "reference": "824a617d5c2b1b571673d1111856f5c2f064a0fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/0c19d76e7f3b6810c4f2cc1330c693af2681c601", - "reference": "0c19d76e7f3b6810c4f2cc1330c693af2681c601", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/824a617d5c2b1b571673d1111856f5c2f064a0fd", + "reference": "824a617d5c2b1b571673d1111856f5c2f064a0fd", "shasum": "" }, "require": { "google/auth": "^1.34", "google/gax": "^1.36.0", - "guzzlehttp/guzzle": "^6.5.8||^7.4.4", + "guzzlehttp/guzzle": "^6.5.8|^7.4.4", "guzzlehttp/promises": "^1.4||^2.0", "guzzlehttp/psr7": "^2.6", - "monolog/monolog": "^2.9||^3.0", + "monolog/monolog": "^2.9|^3.0", "php": "^8.0", - "psr/http-message": "^1.0||^2.0", - "rize/uri-template": "~0.3||~0.4" + "psr/http-message": "^1.0|^2.0", + "rize/uri-template": "~0.3" }, "require-dev": { "erusev/parsedown": "^1.6", @@ -3788,22 +3788,22 @@ ], "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", "support": { - "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.62.3" + "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.62.1" }, - "time": "2025-05-20T19:49:54+00:00" + "time": "2025-02-22T00:57:16+00:00" }, { "name": "google/cloud-storage", - "version": "v1.48.1", + "version": "v1.48.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-storage.git", - "reference": "509b095c3ea44db92c9e62a94b5773563c831821" + "reference": "e2d7a59290ab7fb69208c45058efa3946edbb793" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-storage/zipball/509b095c3ea44db92c9e62a94b5773563c831821", - "reference": "509b095c3ea44db92c9e62a94b5773563c831821", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-storage/zipball/e2d7a59290ab7fb69208c45058efa3946edbb793", + "reference": "e2d7a59290ab7fb69208c45058efa3946edbb793", "shasum": "" }, "require": { @@ -3845,22 +3845,22 @@ ], "description": "Cloud Storage Client for PHP", "support": { - "source": "https://github.com/googleapis/google-cloud-php-storage/tree/v1.48.1" + "source": "https://github.com/googleapis/google-cloud-php-storage/tree/v1.48.0" }, - "time": "2025-05-20T19:49:54+00:00" + "time": "2025-04-18T20:49:28+00:00" }, { "name": "google/common-protos", - "version": "4.12.1", + "version": "4.12.0", "source": { "type": "git", "url": "https://github.com/googleapis/common-protos-php.git", - "reference": "70c4eb1abab5484a23c17a43b0d455259f5d8c1b" + "reference": "96f6873c65fb0289fcdb6ac3d5239f9c9e5750b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/70c4eb1abab5484a23c17a43b0d455259f5d8c1b", - "reference": "70c4eb1abab5484a23c17a43b0d455259f5d8c1b", + "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/96f6873c65fb0289fcdb6ac3d5239f9c9e5750b0", + "reference": "96f6873c65fb0289fcdb6ac3d5239f9c9e5750b0", "shasum": "" }, "require": { @@ -3904,22 +3904,22 @@ "google" ], "support": { - "source": "https://github.com/googleapis/common-protos-php/tree/v4.12.1" + "source": "https://github.com/googleapis/common-protos-php/tree/v4.12.0" }, - "time": "2025-05-20T19:49:54+00:00" + "time": "2025-04-18T20:49:28+00:00" }, { "name": "google/gax", - "version": "v1.36.1", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/googleapis/gax-php.git", - "reference": "afdac3bc38a3b17d70668115d7b1a97289ac4d72" + "reference": "140599cf5eae2432363ce6198e9fdff851625a7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/gax-php/zipball/afdac3bc38a3b17d70668115d7b1a97289ac4d72", - "reference": "afdac3bc38a3b17d70668115d7b1a97289ac4d72", + "url": "https://api.github.com/repos/googleapis/gax-php/zipball/140599cf5eae2432363ce6198e9fdff851625a7a", + "reference": "140599cf5eae2432363ce6198e9fdff851625a7a", "shasum": "" }, "require": { @@ -3961,9 +3961,9 @@ ], "support": { "issues": "https://github.com/googleapis/gax-php/issues", - "source": "https://github.com/googleapis/gax-php/tree/v1.36.1" + "source": "https://github.com/googleapis/gax-php/tree/v1.36.0" }, - "time": "2025-05-20T19:50:43+00:00" + "time": "2024-12-11T02:47:43+00:00" }, { "name": "google/grpc-gcp", @@ -4056,16 +4056,16 @@ }, { "name": "google/protobuf", - "version": "v4.31.1", + "version": "v4.30.2", "source": { "type": "git", "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "2b028ce8876254e2acbeceea7d9b573faad41864" + "reference": "a4c4d8565b40b9f76debc9dfeb221412eacb8ced" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/2b028ce8876254e2acbeceea7d9b573faad41864", - "reference": "2b028ce8876254e2acbeceea7d9b573faad41864", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/a4c4d8565b40b9f76debc9dfeb221412eacb8ced", + "reference": "a4c4d8565b40b9f76debc9dfeb221412eacb8ced", "shasum": "" }, "require": { @@ -4094,9 +4094,9 @@ "proto" ], "support": { - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.31.1" + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.30.2" }, - "time": "2025-05-28T18:52:35+00:00" + "time": "2025-03-26T18:01:50+00:00" }, { "name": "graphp/algorithms", @@ -5450,16 +5450,16 @@ }, { "name": "laminas/laminas-escaper", - "version": "2.17.0", + "version": "2.16.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-escaper.git", - "reference": "df1ef9503299a8e3920079a16263b578eaf7c3ba" + "reference": "9cf1f5317ca65b4fd5c6a3c2855e24a187b288c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/df1ef9503299a8e3920079a16263b578eaf7c3ba", - "reference": "df1ef9503299a8e3920079a16263b578eaf7c3ba", + "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/9cf1f5317ca65b4fd5c6a3c2855e24a187b288c8", + "reference": "9cf1f5317ca65b4fd5c6a3c2855e24a187b288c8", "shasum": "" }, "require": { @@ -5507,20 +5507,20 @@ "type": "community_bridge" } ], - "time": "2025-05-06T19:29:36+00:00" + "time": "2025-02-17T12:40:19+00:00" }, { "name": "laminas/laminas-feed", - "version": "2.23.1", + "version": "2.23.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-feed.git", - "reference": "7c6755695cdca18f983d8a116bfa6a55439b1a94" + "reference": "23807e692b3174750b426143bd93572b71b6739a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-feed/zipball/7c6755695cdca18f983d8a116bfa6a55439b1a94", - "reference": "7c6755695cdca18f983d8a116bfa6a55439b1a94", + "url": "https://api.github.com/repos/laminas/laminas-feed/zipball/23807e692b3174750b426143bd93572b71b6739a", + "reference": "23807e692b3174750b426143bd93572b71b6739a", "shasum": "" }, "require": { @@ -5587,20 +5587,20 @@ "type": "community_bridge" } ], - "time": "2025-05-13T09:35:51+00:00" + "time": "2024-10-09T10:53:30+00:00" }, { "name": "laminas/laminas-filter", - "version": "2.41.0", + "version": "2.40.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-filter.git", - "reference": "eaa00111231bf6669826ae84d3abe85b94477585" + "reference": "9b32ba7c45a302ed349bf42061308e854d56e75b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-filter/zipball/eaa00111231bf6669826ae84d3abe85b94477585", - "reference": "eaa00111231bf6669826ae84d3abe85b94477585", + "url": "https://api.github.com/repos/laminas/laminas-filter/zipball/9b32ba7c45a302ed349bf42061308e854d56e75b", + "reference": "9b32ba7c45a302ed349bf42061308e854d56e75b", "shasum": "" }, "require": { @@ -5666,7 +5666,7 @@ "type": "community_bridge" } ], - "time": "2025-05-05T02:02:31+00:00" + "time": "2025-01-06T21:36:57+00:00" }, { "name": "laminas/laminas-permissions-acl", @@ -9912,20 +9912,20 @@ }, { "name": "ramsey/uuid", - "version": "4.8.1", + "version": "4.7.6", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28" + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28", - "reference": "fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -9934,23 +9934,26 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "captainhook/captainhook": "^5.25", + "captainhook/captainhook": "^5.10", "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "ergebnis/composer-normalize": "^2.47", - "mockery/mockery": "^1.6", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.6", - "php-mock/php-mock-mockery": "^1.5", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpbench/phpbench": "^1.2.14", - "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "^2.1", - "phpstan/phpstan-mockery": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^9.6", - "slevomat/coding-standard": "^8.18", - "squizlabs/php_codesniffer": "^3.13" + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -9985,9 +9988,19 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.8.1" + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, - "time": "2025-06-01T06:28:46+00:00" + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" }, { "name": "rize/uri-template", @@ -10805,37 +10818,36 @@ }, { "name": "stof/doctrine-extensions-bundle", - "version": "v1.14.0", + "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/stof/StofDoctrineExtensionsBundle.git", - "reference": "bdf3eb10baeb497ac5985b8f78a6cf55862c2662" + "reference": "bf00701bff3f2b7c4bf6d963101c9ea6968d694f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stof/StofDoctrineExtensionsBundle/zipball/bdf3eb10baeb497ac5985b8f78a6cf55862c2662", - "reference": "bdf3eb10baeb497ac5985b8f78a6cf55862c2662", + "url": "https://api.github.com/repos/stof/StofDoctrineExtensionsBundle/zipball/bf00701bff3f2b7c4bf6d963101c9ea6968d694f", + "reference": "bf00701bff3f2b7c4bf6d963101c9ea6968d694f", "shasum": "" }, "require": { - "gedmo/doctrine-extensions": "^3.20.0", - "php": "^8.1", - "symfony/cache": "^6.4 || ^7.0", - "symfony/config": "^6.4 || ^7.0", - "symfony/dependency-injection": "^6.4 || ^7.0", - "symfony/event-dispatcher": "^6.4 || ^7.0", - "symfony/http-kernel": "^6.4 || ^7.0", - "symfony/translation-contracts": "^2.5 || ^3.5" + "gedmo/doctrine-extensions": "^3.15.0", + "php": "^7.4 || ^8.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "phpstan/phpstan": "^2.1", - "phpstan/phpstan-deprecation-rules": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpstan/phpstan-symfony": "^2.0", - "symfony/mime": "^6.4 || ^7.0", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-deprecation-rules": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.5", + "phpstan/phpstan-symfony": "^1.3", + "symfony/mime": "^5.4 || ^6.0 || ^7.0", "symfony/phpunit-bridge": "^v6.4.1 || ^7.0.1", - "symfony/security-core": "^6.4 || ^7.0" + "symfony/security-core": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "doctrine/doctrine-bundle": "to use the ORM extensions", @@ -10880,9 +10892,9 @@ ], "support": { "issues": "https://github.com/stof/StofDoctrineExtensionsBundle/issues", - "source": "https://github.com/stof/StofDoctrineExtensionsBundle/tree/v1.14.0" + "source": "https://github.com/stof/StofDoctrineExtensionsBundle/tree/v1.13.0" }, - "time": "2025-05-01T08:00:32+00:00" + "time": "2025-01-07T08:10:54+00:00" }, { "name": "sunra/php-simple-html-dom-parser", @@ -11033,16 +11045,16 @@ }, { "name": "symfony/cache", - "version": "v6.4.21", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "d1abcf763a7414f2e572f676f22da7a06c8cd9ee" + "reference": "95af448bb7c3d8db02f7b4f5cbf3cb7a6ff1e432" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d1abcf763a7414f2e572f676f22da7a06c8cd9ee", - "reference": "d1abcf763a7414f2e572f676f22da7a06c8cd9ee", + "url": "https://api.github.com/repos/symfony/cache/zipball/95af448bb7c3d8db02f7b4f5cbf3cb7a6ff1e432", + "reference": "95af448bb7c3d8db02f7b4f5cbf3cb7a6ff1e432", "shasum": "" }, "require": { @@ -11109,7 +11121,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.21" + "source": "https://github.com/symfony/cache/tree/v6.4.20" }, "funding": [ { @@ -11125,20 +11137,20 @@ "type": "tidelift" } ], - "time": "2025-04-08T08:21:20+00:00" + "time": "2025-03-08T15:51:34+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.6.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868" + "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868", - "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", + "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", "shasum": "" }, "require": { @@ -11152,7 +11164,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" } }, "autoload": { @@ -11185,7 +11197,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.1" }, "funding": [ { @@ -11201,7 +11213,7 @@ "type": "tidelift" } ], - "time": "2025-03-13T15:25:07+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/clock", @@ -11279,16 +11291,16 @@ }, { "name": "symfony/config", - "version": "v6.4.22", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "af5917a3b1571f54689e56677a3f06440d2fe4c7" + "reference": "4e55e7e4ffddd343671ea972216d4509f46c22ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/af5917a3b1571f54689e56677a3f06440d2fe4c7", - "reference": "af5917a3b1571f54689e56677a3f06440d2fe4c7", + "url": "https://api.github.com/repos/symfony/config/zipball/4e55e7e4ffddd343671ea972216d4509f46c22ef", + "reference": "4e55e7e4ffddd343671ea972216d4509f46c22ef", "shasum": "" }, "require": { @@ -11334,7 +11346,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.22" + "source": "https://github.com/symfony/config/tree/v6.4.14" }, "funding": [ { @@ -11350,20 +11362,20 @@ "type": "tidelift" } ], - "time": "2025-05-14T06:00:01+00:00" + "time": "2024-11-04T11:33:53+00:00" }, { "name": "symfony/console", - "version": "v6.4.22", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "7d29659bc3c9d8e9a34e2c3414ef9e9e003e6cf3" + "reference": "2e4af9c952617cc3f9559ff706aee420a8464c36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/7d29659bc3c9d8e9a34e2c3414ef9e9e003e6cf3", - "reference": "7d29659bc3c9d8e9a34e2c3414ef9e9e003e6cf3", + "url": "https://api.github.com/repos/symfony/console/zipball/2e4af9c952617cc3f9559ff706aee420a8464c36", + "reference": "2e4af9c952617cc3f9559ff706aee420a8464c36", "shasum": "" }, "require": { @@ -11428,7 +11440,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.22" + "source": "https://github.com/symfony/console/tree/v6.4.20" }, "funding": [ { @@ -11444,7 +11456,7 @@ "type": "tidelift" } ], - "time": "2025-05-07T07:05:04+00:00" + "time": "2025-03-03T17:16:38+00:00" }, { "name": "symfony/css-selector", @@ -11513,16 +11525,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v6.4.22", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "8cb11f833d1f5bfbb2df97dfc23c92b4d42c18d9" + "reference": "c49796a9184a532843e78e50df9e55708b92543a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8cb11f833d1f5bfbb2df97dfc23c92b4d42c18d9", - "reference": "8cb11f833d1f5bfbb2df97dfc23c92b4d42c18d9", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/c49796a9184a532843e78e50df9e55708b92543a", + "reference": "c49796a9184a532843e78e50df9e55708b92543a", "shasum": "" }, "require": { @@ -11574,7 +11586,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.22" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.20" }, "funding": [ { @@ -11590,20 +11602,20 @@ "type": "tidelift" } ], - "time": "2025-05-17T07:35:26+00:00" + "time": "2025-03-13T09:55:08+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { @@ -11616,7 +11628,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" } }, "autoload": { @@ -11641,7 +11653,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { @@ -11657,20 +11669,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v6.4.22", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "b880cebd0689a466cc4afef30009a54162c003c4" + "reference": "7205dbc642bac2ecbf108fadbf9a04aa08290a2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b880cebd0689a466cc4afef30009a54162c003c4", - "reference": "b880cebd0689a466cc4afef30009a54162c003c4", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/7205dbc642bac2ecbf108fadbf9a04aa08290a2a", + "reference": "7205dbc642bac2ecbf108fadbf9a04aa08290a2a", "shasum": "" }, "require": { @@ -11749,7 +11761,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.22" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.20" }, "funding": [ { @@ -11765,7 +11777,7 @@ "type": "tidelift" } ], - "time": "2025-05-09T14:04:38+00:00" + "time": "2025-02-28T20:55:44+00:00" }, { "name": "symfony/doctrine-messenger", @@ -11915,16 +11927,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.22", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "ce765a2d28b3cce61de1fb916e207767a73171d1" + "reference": "aa3bcf4f7674719df078e61cc8062e5b7f752031" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/ce765a2d28b3cce61de1fb916e207767a73171d1", - "reference": "ce765a2d28b3cce61de1fb916e207767a73171d1", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/aa3bcf4f7674719df078e61cc8062e5b7f752031", + "reference": "aa3bcf4f7674719df078e61cc8062e5b7f752031", "shasum": "" }, "require": { @@ -11970,7 +11982,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.22" + "source": "https://github.com/symfony/error-handler/tree/v6.4.20" }, "funding": [ { @@ -11986,7 +11998,7 @@ "type": "tidelift" } ], - "time": "2025-05-28T12:00:15+00:00" + "time": "2025-03-01T13:00:38+00:00" }, { "name": "symfony/event-dispatcher", @@ -12070,16 +12082,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.6.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", "shasum": "" }, "require": { @@ -12093,7 +12105,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" } }, "autoload": { @@ -12126,7 +12138,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" }, "funding": [ { @@ -12142,7 +12154,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/expression-language", @@ -12340,16 +12352,16 @@ }, { "name": "symfony/flex", - "version": "v2.7.1", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "4ae50d368415a06820739e54d38a4a29d6df9155" + "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/4ae50d368415a06820739e54d38a4a29d6df9155", - "reference": "4ae50d368415a06820739e54d38a4a29d6df9155", + "url": "https://api.github.com/repos/symfony/flex/zipball/8ce1acd9842abe0e9b4c4a0bd3f259859516c018", + "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018", "shasum": "" }, "require": { @@ -12388,7 +12400,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.7.1" + "source": "https://github.com/symfony/flex/tree/v2.5.0" }, "funding": [ { @@ -12404,20 +12416,20 @@ "type": "tidelift" } ], - "time": "2025-05-28T14:22:54+00:00" + "time": "2025-03-03T07:50:46+00:00" }, { "name": "symfony/form", - "version": "v6.4.22", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "2e2e32b7cc9e543a3f739b4968611a44ef17a2de" + "reference": "3929e2a60a828f39df6765fb49d224cc629fa529" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/2e2e32b7cc9e543a3f739b4968611a44ef17a2de", - "reference": "2e2e32b7cc9e543a3f739b4968611a44ef17a2de", + "url": "https://api.github.com/repos/symfony/form/zipball/3929e2a60a828f39df6765fb49d224cc629fa529", + "reference": "3929e2a60a828f39df6765fb49d224cc629fa529", "shasum": "" }, "require": { @@ -12485,7 +12497,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.4.22" + "source": "https://github.com/symfony/form/tree/v6.4.20" }, "funding": [ { @@ -12501,20 +12513,20 @@ "type": "tidelift" } ], - "time": "2025-05-04T06:52:29+00:00" + "time": "2025-03-27T10:21:45+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.4.22", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "b1de19b2083484d0ce945977f6c6484e9e493a2e" + "reference": "51418a20079cb25af3fcb8fa8ae1ed82f7fdd1ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/b1de19b2083484d0ce945977f6c6484e9e493a2e", - "reference": "b1de19b2083484d0ce945977f6c6484e9e493a2e", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/51418a20079cb25af3fcb8fa8ae1ed82f7fdd1ce", + "reference": "51418a20079cb25af3fcb8fa8ae1ed82f7fdd1ce", "shasum": "" }, "require": { @@ -12634,7 +12646,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.22" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.20" }, "funding": [ { @@ -12650,20 +12662,20 @@ "type": "tidelift" } ], - "time": "2025-05-14T07:14:36+00:00" + "time": "2025-03-23T16:46:24+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v6.4.21", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "f66d6585c6ece946239317c339f8b2860dfdf2db" + "reference": "28e9fb12a6784c64b1b5e6fc92853bb7a3c4bf05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/f66d6585c6ece946239317c339f8b2860dfdf2db", - "reference": "f66d6585c6ece946239317c339f8b2860dfdf2db", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/28e9fb12a6784c64b1b5e6fc92853bb7a3c4bf05", + "reference": "28e9fb12a6784c64b1b5e6fc92853bb7a3c4bf05", "shasum": "" }, "require": { @@ -12703,7 +12715,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v6.4.21" + "source": "https://github.com/symfony/html-sanitizer/tree/v6.4.18" }, "funding": [ { @@ -12719,7 +12731,7 @@ "type": "tidelift" } ], - "time": "2025-03-31T07:29:45+00:00" + "time": "2025-01-17T13:18:31+00:00" }, { "name": "symfony/http-client", @@ -12816,16 +12828,16 @@ }, { "name": "symfony/http-client-contracts", - "version": "v3.6.0", + "version": "v3.5.2", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "75d7043853a42837e68111812f4d964b01e5101c" + "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", - "reference": "75d7043853a42837e68111812f4d964b01e5101c", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645", + "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645", "shasum": "" }, "require": { @@ -12838,7 +12850,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" } }, "autoload": { @@ -12874,7 +12886,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2" }, "funding": [ { @@ -12890,20 +12902,20 @@ "type": "tidelift" } ], - "time": "2025-04-29T11:18:49+00:00" + "time": "2024-12-07T08:49:48+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.22", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "6b7c97fe1ddac8df3cc9ba6410c8abc683e148ae" + "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6b7c97fe1ddac8df3cc9ba6410c8abc683e148ae", - "reference": "6b7c97fe1ddac8df3cc9ba6410c8abc683e148ae", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0492d6217e5ab48f51fca76f64cf8e78919d0db", + "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db", "shasum": "" }, "require": { @@ -12951,7 +12963,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.22" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.18" }, "funding": [ { @@ -12967,20 +12979,20 @@ "type": "tidelift" } ], - "time": "2025-05-11T15:36:20+00:00" + "time": "2025-01-09T15:48:56+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.22", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "15c105b839a7cfa1bc0989c091bfb6477f23b673" + "reference": "6be6db31bc74693ce5516e1fd5e5ff1171005e37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/15c105b839a7cfa1bc0989c091bfb6477f23b673", - "reference": "15c105b839a7cfa1bc0989c091bfb6477f23b673", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6be6db31bc74693ce5516e1fd5e5ff1171005e37", + "reference": "6be6db31bc74693ce5516e1fd5e5ff1171005e37", "shasum": "" }, "require": { @@ -13065,7 +13077,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.22" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.20" }, "funding": [ { @@ -13081,20 +13093,20 @@ "type": "tidelift" } ], - "time": "2025-05-29T07:23:40+00:00" + "time": "2025-03-28T13:27:10+00:00" }, { "name": "symfony/intl", - "version": "v6.4.22", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "aaecb52f18a6f95766a239ca0a6cc0df983d92cc" + "reference": "b1d5e8d82615b60f229216edfee0b59e2ef66da6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/aaecb52f18a6f95766a239ca0a6cc0df983d92cc", - "reference": "aaecb52f18a6f95766a239ca0a6cc0df983d92cc", + "url": "https://api.github.com/repos/symfony/intl/zipball/b1d5e8d82615b60f229216edfee0b59e2ef66da6", + "reference": "b1d5e8d82615b60f229216edfee0b59e2ef66da6", "shasum": "" }, "require": { @@ -13148,7 +13160,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.4.22" + "source": "https://github.com/symfony/intl/tree/v6.4.15" }, "funding": [ { @@ -13164,20 +13176,20 @@ "type": "tidelift" } ], - "time": "2025-05-04T12:02:38+00:00" + "time": "2024-11-08T15:28:48+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.21", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "ada2809ccd4ec27aba9fc344e3efdaec624c6438" + "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/ada2809ccd4ec27aba9fc344e3efdaec624c6438", - "reference": "ada2809ccd4ec27aba9fc344e3efdaec624c6438", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", + "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", "shasum": "" }, "require": { @@ -13228,7 +13240,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.21" + "source": "https://github.com/symfony/mailer/tree/v6.4.18" }, "funding": [ { @@ -13244,20 +13256,20 @@ "type": "tidelift" } ], - "time": "2025-04-26T23:47:35+00:00" + "time": "2025-01-24T15:27:15+00:00" }, { "name": "symfony/messenger", - "version": "v6.4.21", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "f99fbe6a4727ea504eb9ecc9f76e1ed61d2d6f33" + "reference": "5f3843b8f867569009d4cd6cbba35b3c7a33ac63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/f99fbe6a4727ea504eb9ecc9f76e1ed61d2d6f33", - "reference": "f99fbe6a4727ea504eb9ecc9f76e1ed61d2d6f33", + "url": "https://api.github.com/repos/symfony/messenger/zipball/5f3843b8f867569009d4cd6cbba35b3c7a33ac63", + "reference": "5f3843b8f867569009d4cd6cbba35b3c7a33ac63", "shasum": "" }, "require": { @@ -13315,7 +13327,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v6.4.21" + "source": "https://github.com/symfony/messenger/tree/v6.4.19" }, "funding": [ { @@ -13331,20 +13343,20 @@ "type": "tidelift" } ], - "time": "2025-04-27T13:27:38+00:00" + "time": "2025-02-26T07:27:03+00:00" }, { "name": "symfony/mime", - "version": "v6.4.21", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "fec8aa5231f3904754955fad33c2db50594d22d1" + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/fec8aa5231f3904754955fad33c2db50594d22d1", - "reference": "fec8aa5231f3904754955fad33c2db50594d22d1", + "url": "https://api.github.com/repos/symfony/mime/zipball/ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", "shasum": "" }, "require": { @@ -13400,7 +13412,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.21" + "source": "https://github.com/symfony/mime/tree/v6.4.19" }, "funding": [ { @@ -13416,7 +13428,7 @@ "type": "tidelift" } ], - "time": "2025-04-27T13:27:38+00:00" + "time": "2025-02-17T21:23:52+00:00" }, { "name": "symfony/monolog-bridge", @@ -13580,16 +13592,16 @@ }, { "name": "symfony/notifier", - "version": "v6.4.21", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/notifier.git", - "reference": "ece4caf82ee43b3f2ce543959272707c846011a3" + "reference": "c46321b53391088861bf627cd9e24873d216cf00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/notifier/zipball/ece4caf82ee43b3f2ce543959272707c846011a3", - "reference": "ece4caf82ee43b3f2ce543959272707c846011a3", + "url": "https://api.github.com/repos/symfony/notifier/zipball/c46321b53391088861bf627cd9e24873d216cf00", + "reference": "c46321b53391088861bf627cd9e24873d216cf00", "shasum": "" }, "require": { @@ -13638,7 +13650,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/notifier/tree/v6.4.21" + "source": "https://github.com/symfony/notifier/tree/v6.4.13" }, "funding": [ { @@ -13654,7 +13666,7 @@ "type": "tidelift" } ], - "time": "2025-04-27T13:58:34+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/options-resolver", @@ -13797,7 +13809,7 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.32.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", @@ -13855,7 +13867,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -13875,16 +13887,16 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.32.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { @@ -13938,7 +13950,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -13954,11 +13966,11 @@ "type": "tidelift" } ], - "time": "2024-09-10T14:38:51+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.32.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -14019,7 +14031,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -14172,7 +14184,7 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.32.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", @@ -14228,7 +14240,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -14248,16 +14260,16 @@ }, { "name": "symfony/polyfill-php84", - "version": "v1.32.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "000df7860439609837bbe28670b0be15783b7fbf" + "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf", - "reference": "000df7860439609837bbe28670b0be15783b7fbf", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/e5493eb51311ab0b1cc2243416613f06ed8f18bd", + "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd", "shasum": "" }, "require": { @@ -14304,7 +14316,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.31.0" }, "funding": [ { @@ -14320,11 +14332,11 @@ "type": "tidelift" } ], - "time": "2025-02-20T12:04:08+00:00" + "time": "2024-09-09T12:04:04+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.32.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", @@ -14383,7 +14395,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" }, "funding": [ { @@ -14755,16 +14767,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.22", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "1f5234e8457164a3a0038a4c0a4ba27876a9c670" + "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/1f5234e8457164a3a0038a4c0a4ba27876a9c670", - "reference": "1f5234e8457164a3a0038a4c0a4ba27876a9c670", + "url": "https://api.github.com/repos/symfony/routing/zipball/e9bfc94953019089acdfb9be51c1b9142c4afa68", + "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68", "shasum": "" }, "require": { @@ -14818,7 +14830,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.22" + "source": "https://github.com/symfony/routing/tree/v6.4.18" }, "funding": [ { @@ -14834,20 +14846,20 @@ "type": "tidelift" } ], - "time": "2025-04-27T16:08:38+00:00" + "time": "2025-01-09T08:51:02+00:00" }, { "name": "symfony/runtime", - "version": "v6.4.22", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "832c3ce3b810509815050434ccb7ead68d06395b" + "reference": "4facd4174f45cd37c65860403412b67c7381136a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/832c3ce3b810509815050434ccb7ead68d06395b", - "reference": "832c3ce3b810509815050434ccb7ead68d06395b", + "url": "https://api.github.com/repos/symfony/runtime/zipball/4facd4174f45cd37c65860403412b67c7381136a", + "reference": "4facd4174f45cd37c65860403412b67c7381136a", "shasum": "" }, "require": { @@ -14897,7 +14909,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v6.4.22" + "source": "https://github.com/symfony/runtime/tree/v6.4.14" }, "funding": [ { @@ -14913,7 +14925,7 @@ "type": "tidelift" } ], - "time": "2025-05-07T21:15:03+00:00" + "time": "2024-11-05T16:39:55+00:00" }, { "name": "symfony/security-acl", @@ -14999,16 +15011,16 @@ }, { "name": "symfony/security-bundle", - "version": "v6.4.22", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "671ab5339a1e53923bfb8069bf984a47a412f612" + "reference": "181d1fcf5f88ef8212ed7f6434e5ff51c9d7dff3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/671ab5339a1e53923bfb8069bf984a47a412f612", - "reference": "671ab5339a1e53923bfb8069bf984a47a412f612", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/181d1fcf5f88ef8212ed7f6434e5ff51c9d7dff3", + "reference": "181d1fcf5f88ef8212ed7f6434e5ff51c9d7dff3", "shasum": "" }, "require": { @@ -15091,7 +15103,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v6.4.22" + "source": "https://github.com/symfony/security-bundle/tree/v6.4.13" }, "funding": [ { @@ -15107,20 +15119,20 @@ "type": "tidelift" } ], - "time": "2025-05-09T21:27:20+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/security-core", - "version": "v6.4.22", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "110483f4e0106cf4bb63ed0479f6a5d09ab24a9e" + "reference": "0ae7ae716968e00287ab9b7768405e0dc9cad109" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/110483f4e0106cf4bb63ed0479f6a5d09ab24a9e", - "reference": "110483f4e0106cf4bb63ed0479f6a5d09ab24a9e", + "url": "https://api.github.com/repos/symfony/security-core/zipball/0ae7ae716968e00287ab9b7768405e0dc9cad109", + "reference": "0ae7ae716968e00287ab9b7768405e0dc9cad109", "shasum": "" }, "require": { @@ -15177,7 +15189,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.4.22" + "source": "https://github.com/symfony/security-core/tree/v6.4.18" }, "funding": [ { @@ -15193,7 +15205,7 @@ "type": "tidelift" } ], - "time": "2025-05-20T14:15:13+00:00" + "time": "2025-01-22T20:59:03+00:00" }, { "name": "symfony/security-csrf", @@ -15265,16 +15277,16 @@ }, { "name": "symfony/security-http", - "version": "v6.4.22", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "786c8eeee44b07419264ede2a795e8f490113dc2" + "reference": "a57bb00b01036865e6c08d0c8540df429534df19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/786c8eeee44b07419264ede2a795e8f490113dc2", - "reference": "786c8eeee44b07419264ede2a795e8f490113dc2", + "url": "https://api.github.com/repos/symfony/security-http/zipball/a57bb00b01036865e6c08d0c8540df429534df19", + "reference": "a57bb00b01036865e6c08d0c8540df429534df19", "shasum": "" }, "require": { @@ -15333,7 +15345,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.4.22" + "source": "https://github.com/symfony/security-http/tree/v6.4.19" }, "funding": [ { @@ -15349,20 +15361,20 @@ "type": "tidelift" } ], - "time": "2025-05-09T07:11:47+00:00" + "time": "2025-01-28T19:24:43+00:00" }, { "name": "symfony/serializer", - "version": "v6.4.22", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "b836df93e9ea07d1d3ada58a679ef205d54b64d1" + "reference": "a221b2f6066af304d760cff7a26f201b4fab4aef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/b836df93e9ea07d1d3ada58a679ef205d54b64d1", - "reference": "b836df93e9ea07d1d3ada58a679ef205d54b64d1", + "url": "https://api.github.com/repos/symfony/serializer/zipball/a221b2f6066af304d760cff7a26f201b4fab4aef", + "reference": "a221b2f6066af304d760cff7a26f201b4fab4aef", "shasum": "" }, "require": { @@ -15431,7 +15443,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v6.4.22" + "source": "https://github.com/symfony/serializer/tree/v6.4.19" }, "funding": [ { @@ -15447,20 +15459,20 @@ "type": "tidelift" } ], - "time": "2025-05-12T08:02:50+00:00" + "time": "2025-02-24T08:42:36+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { @@ -15478,7 +15490,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" } }, "autoload": { @@ -15514,7 +15526,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { @@ -15530,7 +15542,7 @@ "type": "tidelift" } ], - "time": "2025-04-25T09:37:31+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/stopwatch", @@ -15596,16 +15608,16 @@ }, { "name": "symfony/string", - "version": "v6.4.21", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "73e2c6966a5aef1d4892873ed5322245295370c6" + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/73e2c6966a5aef1d4892873ed5322245295370c6", - "reference": "73e2c6966a5aef1d4892873ed5322245295370c6", + "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", "shasum": "" }, "require": { @@ -15662,7 +15674,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.21" + "source": "https://github.com/symfony/string/tree/v6.4.15" }, "funding": [ { @@ -15678,20 +15690,20 @@ "type": "tidelift" } ], - "time": "2025-04-18T15:23:29+00:00" + "time": "2024-11-13T13:31:12+00:00" }, { "name": "symfony/translation", - "version": "v6.4.22", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "7e3b3b7146c6fab36ddff304a8041174bf6e17ad" + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/7e3b3b7146c6fab36ddff304a8041174bf6e17ad", - "reference": "7e3b3b7146c6fab36ddff304a8041174bf6e17ad", + "url": "https://api.github.com/repos/symfony/translation/zipball/3b9bf9f33997c064885a7bfc126c14b9daa0e00e", + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e", "shasum": "" }, "require": { @@ -15757,7 +15769,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.22" + "source": "https://github.com/symfony/translation/tree/v6.4.19" }, "funding": [ { @@ -15773,20 +15785,20 @@ "type": "tidelift" } ], - "time": "2025-05-29T07:06:44+00:00" + "time": "2025-02-13T10:18:43+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.6.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { @@ -15799,7 +15811,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" } }, "autoload": { @@ -15835,7 +15847,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, "funding": [ { @@ -15851,20 +15863,20 @@ "type": "tidelift" } ], - "time": "2024-09-27T08:32:26+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/twig-bridge", - "version": "v6.4.22", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "04ab306a2f2c9dbd46f4363383812954f704af9d" + "reference": "bb423dfaa51b6d88b1d64197ae695a0c8ac73778" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/04ab306a2f2c9dbd46f4363383812954f704af9d", - "reference": "04ab306a2f2c9dbd46f4363383812954f704af9d", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/bb423dfaa51b6d88b1d64197ae695a0c8ac73778", + "reference": "bb423dfaa51b6d88b1d64197ae695a0c8ac73778", "shasum": "" }, "require": { @@ -15944,7 +15956,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.22" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.20" }, "funding": [ { @@ -15960,7 +15972,7 @@ "type": "tidelift" } ], - "time": "2025-05-16T08:23:44+00:00" + "time": "2025-03-28T13:08:36+00:00" }, { "name": "symfony/twig-bundle", @@ -16122,16 +16134,16 @@ }, { "name": "symfony/validator", - "version": "v6.4.22", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "4c5fbccb2d8f64017c8dada6473701a5c8539716" + "reference": "9314555aceb8d8ce8abda81e1e47e439258d9309" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/4c5fbccb2d8f64017c8dada6473701a5c8539716", - "reference": "4c5fbccb2d8f64017c8dada6473701a5c8539716", + "url": "https://api.github.com/repos/symfony/validator/zipball/9314555aceb8d8ce8abda81e1e47e439258d9309", + "reference": "9314555aceb8d8ce8abda81e1e47e439258d9309", "shasum": "" }, "require": { @@ -16199,7 +16211,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.22" + "source": "https://github.com/symfony/validator/tree/v6.4.20" }, "funding": [ { @@ -16215,20 +16227,20 @@ "type": "tidelift" } ], - "time": "2025-05-29T07:03:46+00:00" + "time": "2025-03-14T14:22:58+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.21", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "22560f80c0c5cd58cc0bcaf73455ffd81eb380d5" + "reference": "4ad10cf8b020e77ba665305bb7804389884b4837" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/22560f80c0c5cd58cc0bcaf73455ffd81eb380d5", - "reference": "22560f80c0c5cd58cc0bcaf73455ffd81eb380d5", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/4ad10cf8b020e77ba665305bb7804389884b4837", + "reference": "4ad10cf8b020e77ba665305bb7804389884b4837", "shasum": "" }, "require": { @@ -16284,7 +16296,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.21" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.18" }, "funding": [ { @@ -16300,20 +16312,20 @@ "type": "tidelift" } ], - "time": "2025-04-09T07:34:50+00:00" + "time": "2025-01-17T11:26:11+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.22", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "f28cf841f5654955c9f88ceaf4b9dc29571988a9" + "reference": "998df255e9e6a15a36ae35e9c6cd818c17cf92a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f28cf841f5654955c9f88ceaf4b9dc29571988a9", - "reference": "f28cf841f5654955c9f88ceaf4b9dc29571988a9", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/998df255e9e6a15a36ae35e9c6cd818c17cf92a2", + "reference": "998df255e9e6a15a36ae35e9c6cd818c17cf92a2", "shasum": "" }, "require": { @@ -16361,7 +16373,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.22" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.20" }, "funding": [ { @@ -16377,20 +16389,20 @@ "type": "tidelift" } ], - "time": "2025-05-14T13:00:13+00:00" + "time": "2025-03-13T09:55:08+00:00" }, { "name": "symfony/web-link", - "version": "v6.4.22", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/web-link.git", - "reference": "8595204221c4307b5fd30644a225b0b952082b18" + "reference": "4d188b64bb9a9c5e2e4d20c8d5fdce6bbbb32c94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-link/zipball/8595204221c4307b5fd30644a225b0b952082b18", - "reference": "8595204221c4307b5fd30644a225b0b952082b18", + "url": "https://api.github.com/repos/symfony/web-link/zipball/4d188b64bb9a9c5e2e4d20c8d5fdce6bbbb32c94", + "reference": "4d188b64bb9a9c5e2e4d20c8d5fdce6bbbb32c94", "shasum": "" }, "require": { @@ -16444,7 +16456,7 @@ "push" ], "support": { - "source": "https://github.com/symfony/web-link/tree/v6.4.22" + "source": "https://github.com/symfony/web-link/tree/v6.4.13" }, "funding": [ { @@ -16460,7 +16472,7 @@ "type": "tidelift" } ], - "time": "2025-05-16T08:23:44+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/webpack-encore-bundle", @@ -16537,16 +16549,16 @@ }, { "name": "symfony/yaml", - "version": "v6.4.21", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "f01987f45676778b474468aa266fe2eda1f2bc7e" + "reference": "28ee818fce4a73ac1474346b94e4b966f665c53f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/f01987f45676778b474468aa266fe2eda1f2bc7e", - "reference": "f01987f45676778b474468aa266fe2eda1f2bc7e", + "url": "https://api.github.com/repos/symfony/yaml/zipball/28ee818fce4a73ac1474346b94e4b966f665c53f", + "reference": "28ee818fce4a73ac1474346b94e4b966f665c53f", "shasum": "" }, "require": { @@ -16589,7 +16601,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.21" + "source": "https://github.com/symfony/yaml/tree/v6.4.20" }, "funding": [ { @@ -16605,7 +16617,7 @@ "type": "tidelift" } ], - "time": "2025-04-04T09:48:44+00:00" + "time": "2025-02-27T20:15:30+00:00" }, { "name": "symfonycasts/reset-password-bundle", @@ -16982,7 +16994,7 @@ }, { "name": "twig/cssinliner-extra", - "version": "v3.21.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/cssinliner-extra.git", @@ -17035,7 +17047,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.20.0" }, "funding": [ { @@ -17051,16 +17063,16 @@ }, { "name": "twig/extra-bundle", - "version": "v3.21.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896" + "reference": "9df5e1dbb6a68c0665ae5603f6f2c20815647876" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/62d1cf47a1aa009cbd07b21045b97d3d5cb79896", - "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/9df5e1dbb6a68c0665ae5603f6f2c20815647876", + "reference": "9df5e1dbb6a68c0665ae5603f6f2c20815647876", "shasum": "" }, "require": { @@ -17109,7 +17121,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.21.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.20.0" }, "funding": [ { @@ -17121,11 +17133,11 @@ "type": "tidelift" } ], - "time": "2025-02-19T14:29:33+00:00" + "time": "2025-02-08T09:47:15+00:00" }, { "name": "twig/inky-extra", - "version": "v3.21.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/inky-extra.git", @@ -17179,7 +17191,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/inky-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/inky-extra/tree/v3.20.0" }, "funding": [ { @@ -17195,7 +17207,7 @@ }, { "name": "twig/intl-extra", - "version": "v3.21.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", @@ -17243,7 +17255,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.20.0" }, "funding": [ { @@ -17259,16 +17271,16 @@ }, { "name": "twig/twig", - "version": "v3.21.1", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d" + "reference": "3468920399451a384bef53cf7996965f7cd40183" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/3468920399451a384bef53cf7996965f7cd40183", + "reference": "3468920399451a384bef53cf7996965f7cd40183", "shasum": "" }, "require": { @@ -17322,7 +17334,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.21.1" + "source": "https://github.com/twigphp/Twig/tree/v3.20.0" }, "funding": [ { @@ -17334,7 +17346,7 @@ "type": "tidelift" } ], - "time": "2025-05-03T07:21:55+00:00" + "time": "2025-02-13T08:34:43+00:00" }, { "name": "vich/uploader-bundle", @@ -18085,16 +18097,16 @@ }, { "name": "behat/gherkin", - "version": "v4.14.0", + "version": "v4.12.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "34c9b59c59355a7b4c53b9f041c8dbd1c8acc3b4" + "reference": "cc3a7e224b36373be382b53ef02ede0f1807bb58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/34c9b59c59355a7b4c53b9f041c8dbd1c8acc3b4", - "reference": "34c9b59c59355a7b4c53b9f041c8dbd1c8acc3b4", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/cc3a7e224b36373be382b53ef02ede0f1807bb58", + "reference": "cc3a7e224b36373be382b53ef02ede0f1807bb58", "shasum": "" }, "require": { @@ -18102,13 +18114,13 @@ "php": "8.1.* || 8.2.* || 8.3.* || 8.4.*" }, "require-dev": { - "cucumber/gherkin-monorepo": "dev-gherkin-v32.1.1", + "cucumber/cucumber": "dev-gherkin-24.1.0", "friendsofphp/php-cs-fixer": "^3.65", - "mikey179/vfsstream": "^1.6", "phpstan/extension-installer": "^1", "phpstan/phpstan": "^2", "phpstan/phpstan-phpunit": "^2", "phpunit/phpunit": "^10.5", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", "symfony/yaml": "^5.4 || ^6.4 || ^7.0" }, "suggest": { @@ -18121,8 +18133,8 @@ } }, "autoload": { - "psr-4": { - "Behat\\Gherkin\\": "src/" + "psr-0": { + "Behat\\Gherkin": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -18148,9 +18160,9 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.14.0" + "source": "https://github.com/Behat/Gherkin/tree/v4.12.0" }, - "time": "2025-05-23T15:06:40+00:00" + "time": "2025-02-26T14:28:23+00:00" }, { "name": "behat/mink", @@ -19430,16 +19442,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.27", + "version": "1.12.25", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162" + "reference": "e310849a19e02b8bfcbb63147f495d8f872dd96f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3a6e423c076ab39dfedc307e2ac627ef579db162", - "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e310849a19e02b8bfcbb63147f495d8f872dd96f", + "reference": "e310849a19e02b8bfcbb63147f495d8f872dd96f", "shasum": "" }, "require": { @@ -19484,7 +19496,7 @@ "type": "github" } ], - "time": "2025-05-21T20:51:45+00:00" + "time": "2025-04-27T12:20:45+00:00" }, { "name": "phpstan/phpstan-doctrine", @@ -19951,16 +19963,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.23", + "version": "9.6.22", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95" + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", - "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", "shasum": "" }, "require": { @@ -19971,7 +19983,7 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.1", + "myclabs/deep-copy": "^1.12.1", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=7.3", @@ -20034,7 +20046,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.23" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22" }, "funding": [ { @@ -20045,20 +20057,12 @@ "url": "https://github.com/sebastianbergmann", "type": "github" }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], - "time": "2025-05-02T06:40:34+00:00" + "time": "2024-12-05T13:48:26+00:00" }, { "name": "psalm/plugin-symfony", @@ -21219,16 +21223,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.13.0", + "version": "3.12.2", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "65ff2489553b83b4597e89c3b8b721487011d186" + "reference": "6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/65ff2489553b83b4597e89c3b8b721487011d186", - "reference": "65ff2489553b83b4597e89c3b8b721487011d186", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa", + "reference": "6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa", "shasum": "" }, "require": { @@ -21299,7 +21303,7 @@ "type": "thanks_dev" } ], - "time": "2025-05-11T03:36:00+00:00" + "time": "2025-04-13T04:10:18+00:00" }, { "name": "symfony/browser-kit", @@ -21768,16 +21772,16 @@ }, { "name": "symplify/easy-coding-standard", - "version": "12.5.20", + "version": "12.5.16", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4" + "reference": "3e99ec9bd64528cedb7f7e0a9e892a1c3c803935" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4", - "reference": "bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/3e99ec9bd64528cedb7f7e0a9e892a1c3c803935", + "reference": "3e99ec9bd64528cedb7f7e0a9e892a1c3c803935", "shasum": "" }, "require": { @@ -21813,7 +21817,7 @@ ], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.20" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.16" }, "funding": [ { @@ -21825,7 +21829,7 @@ "type": "github" } ], - "time": "2025-05-30T11:42:07+00:00" + "time": "2025-04-28T07:01:07+00:00" }, { "name": "theofidry/alice-data-fixtures", @@ -22164,7 +22168,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -22189,7 +22193,7 @@ "ext-zip": "*", "ext-zlib": "*" }, - "platform-dev": {}, + "platform-dev": [], "platform-overrides": { "php": "8.2" }, diff --git a/src/CoreBundle/Repository/SequenceResourceRepository.php b/src/CoreBundle/Repository/SequenceResourceRepository.php index a23c85f273c..bae9a8b3144 100644 --- a/src/CoreBundle/Repository/SequenceResourceRepository.php +++ b/src/CoreBundle/Repository/SequenceResourceRepository.php @@ -273,7 +273,10 @@ public function checkRequirementsForUser(array $sequences, int $type, int $userI if (!empty($userId)) { $resourceItem['status'] = $resourceItem['status'] && Category::userFinishedCourse( $userId, - $category + $category, + true, + $course->getId(), + $resource->getId() ); } } @@ -324,13 +327,19 @@ public function checkCourseRequirements(int $userId, Course $course, int $sessio ? $em->getRepository(Session::class)->find($sessionId) : null; $gradebookCategoryRepo = $em->getRepository(GradebookCategory::class); - $categories = $gradebookCategoryRepo->findBy( - [ + $categories = $gradebookCategoryRepo->findBy([ + 'course' => $course, + 'session' => $session, + 'isRequirement' => true, + ]); + + if (empty($categories) && $sessionId > 0) { + $categories = $gradebookCategoryRepo->findBy([ 'course' => $course, - 'session' => $session, + 'session' => null, 'isRequirement' => true, - ] - ); + ]); + } if (empty($categories)) { return false; @@ -341,16 +350,12 @@ public function checkCourseRequirements(int $userId, Course $course, int $sessio $userFinishedCourse = Category::userFinishedCourse( $userId, $category, - true + true, + $course->getId(), + $sessionId ); - if (0 === $sessionId) { - if (!$userFinishedCourse) { - $status = false; - - break; - } - } elseif (!$userFinishedCourse) { + if (!$userFinishedCourse) { $status = false; break; @@ -540,7 +545,10 @@ private function checkRequirementsOrDependentsForUser( foreach ($categories as $category) { $resourceItem['status'] = $resourceItem['status'] && Category::userFinishedCourse( $userId, - $category + $category, + true, + $course->getId(), + $sessionId ); } } diff --git a/symfony.lock b/symfony.lock index 1895379ebbf..cc59e142d31 100644 --- a/symfony.lock +++ b/symfony.lock @@ -40,15 +40,6 @@ "ref": "64d8583af5ea57b7afa4aba4b159907f3a148b05" } }, - "doctrine/deprecations": { - "version": "1.1", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "1.0", - "ref": "87424683adc81d7dc305eefec1fced883084aab9" - } - }, "doctrine/doctrine-bundle": { "version": "2.14", "recipe": {