Merge branch 'master' of github.com:chamilo/chamilo-lms

pull/5665/head
Yannick Warnier 1 year ago
commit 8b192484be
  1. 7
      assets/css/app.scss
  2. 2
      assets/css/scss/_exercise.scss
  3. 29
      assets/css/scss/atoms/_color_picker.scss
  4. 1
      assets/css/scss/index.scss
  5. 251
      assets/vue/components/admin/ColorThemePreview.vue
  6. 28
      assets/vue/components/basecomponents/BaseColorPicker.vue
  7. 241
      assets/vue/views/admin/AdminConfigureColors.vue
  8. 2
      public/main/template/default/gradebook/custom_certificate.html.twig
  9. 5
      src/CoreBundle/Controller/PermissionsController.php
  10. 5
      src/CoreBundle/DataFixtures/PermissionFixtures.php
  11. 3
      src/CoreBundle/DataFixtures/SettingsCurrentFixtures.php
  12. 4
      src/CoreBundle/Entity/Permission.php
  13. 15
      src/CoreBundle/Entity/PermissionRelRole.php
  14. 4
      src/CoreBundle/Migrations/Schema/V200/Version20201216122012.php
  15. 30
      src/CoreBundle/Migrations/Schema/V200/Version20230215072918.php
  16. 7
      src/CoreBundle/Migrations/Schema/V200/Version20240709222700.php
  17. 1
      src/CoreBundle/Repository/PermissionRelRoleRepository.php
  18. 1
      src/CoreBundle/Repository/PermissionRepository.php
  19. 7
      src/CoreBundle/ServiceHelper/PermissionServiceHelper.php

@ -272,12 +272,7 @@
@apply w-auto;
}
// Forms
input {
appearance: auto !important;
border-width: 1px !important;
}
// Form
.has-error input, .has-error select {
border-color: red !important;
}

@ -295,7 +295,7 @@
}
.feedback-red {
@apply text-danger line-through;
@apply text-error line-through;
}
.question-list-description-block {

@ -0,0 +1,29 @@
.color-picker {
@apply flex flex-col justify-center gap-0 relative;
label {
@apply absolute -top-2.5 left-2 text-caption px-1 bg-white text-primary z-[2] max-w-full truncate;
}
input[type="color"] {
@apply h-auto w-12 cursor-pointer p-2 bg-white border-support-3 border border-r-0 transition-none;
}
.p-inputgroup .p-inputtext {
@apply w-24 transition-none grow-0 shrink-0;
}
&:hover {
input[type="color"],
.p-inputgroup .p-inputtext {
@apply border-primary;
}
}
&:has(.p-inputtext:focus) {
input[type="color"],
input[type="color"] {
@apply border-primary;
}
}
}

@ -19,6 +19,7 @@
@import "atoms/buttons";
@import "atoms/calendar";
@import "atoms/checkbox";
@import "atoms/color_picker";
@import "atoms/divider";
@import "atoms/dropdown";
@import "atoms/fieldset";

@ -0,0 +1,251 @@
<script setup>
import { provide, ref } from "vue"
import { useI18n } from "vue-i18n"
import BaseInputDate from "../basecomponents/BaseInputDate.vue"
import BaseButton from "../basecomponents/BaseButton.vue"
import BaseMenu from "../basecomponents/BaseMenu.vue"
import BaseDialogConfirmCancel from "../basecomponents/BaseDialogConfirmCancel.vue"
import BaseDropdown from "../basecomponents/BaseDropdown.vue"
import BaseRadioButtons from "../basecomponents/BaseRadioButtons.vue"
import BaseCheckbox from "../basecomponents/BaseCheckbox.vue"
import BaseInputText from "../basecomponents/BaseInputText.vue"
import BaseToggleButton from "../basecomponents/BaseToggleButton.vue"
const { t } = useI18n()
// properties for example components
const menu = ref("menu")
const menuItems = [{ label: t("Item 1") }, { label: t("Item 2") }, { label: t("Item 3") }]
const toggle = (event) => {
menu.value.toggle(event)
}
const dropdown = ref("")
const checkbox1 = ref(true)
const checkbox2 = ref(false)
const radioButtons = [
{ label: t("Value 1"), value: "value1" },
{ label: t("Value 2"), value: "value2" },
{ label: t("Value 3"), value: "value3" },
]
const radioValue = ref("value1")
const isDialogVisible = ref(false)
const toggleState = ref(true)
// needed for course tool
const isSorting = ref(false)
const isCustomizing = ref(false)
provide("isSorting", isSorting)
provide("isCustomizing", isCustomizing)
</script>
<template>
<div class="admin-colors__settings-preview">
<h6>{{ t("You can see examples of how chamilo will look here") }}</h6>
<div>
<p class="mb-3 text-lg">{{ t("Buttons") }}</p>
<div class="flex flex-row flex-wrap mb-3">
<BaseButton
:label="t('Primary')"
class="mr-2 mb-2"
icon="eye-on"
type="primary"
/>
<BaseButton
:label="t('Primary alternative')"
class="mr-2 mb-2"
icon="eye-on"
type="primary-alternative"
/>
<BaseButton
:label="t('Secondary')"
class="mr-2 mb-2"
icon="eye-on"
type="secondary"
/>
<BaseButton
:label="t('Tertiary')"
class="mr-2 mb-2"
icon="eye-on"
type="black"
/>
</div>
<div class="flex flex-row flex-wrap mb-3">
<BaseButton
:label="t('Success')"
class="mr-2 mb-2"
icon="send"
type="success"
/>
<BaseButton
:label="t('Info')"
class="mr-2 mb-2"
icon="send"
type="info"
/>
<BaseButton
:label="t('Warning')"
class="mr-2 mb-2"
icon="send"
type="warning"
/>
<BaseButton
:label="t('Danger')"
class="mr-2 mb-2"
icon="delete"
type="danger"
/>
</div>
<div class="flex flex-row flex-wrap mb-3">
<BaseButton
:label="t('Disabled')"
class="mr-2 mb-2"
disabled
icon="eye-on"
type="primary"
/>
<BaseButton
class="mr-2 mb-2"
icon="cog"
only-icon
type="primary"
/>
</div>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Dropdowns") }}</p>
<div class="flex flex-row gap-3">
<BaseButton
class="mr-3 mb-2"
icon="cog"
only-icon
popup-identifier="menu"
type="primary"
@click="toggle"
/>
<BaseMenu
id="menu"
ref="menu"
:model="menuItems"
/>
<BaseDropdown
v-model="dropdown"
:label="t('Dropdown')"
:options="[
{
label: t('Option 1'),
value: 'option_1',
},
{
label: t('Option 2'),
value: 'option_2',
},
{
label: t('Option 3'),
value: 'option_3',
},
]"
class="w-36"
input-id="dropdown"
name="dropdown"
option-label="label"
option-value="value"
/>
</div>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Checkbox and radio buttons") }}</p>
<div class="flex flex-col md:flex-row gap-3 md:gap-5">
<BaseRadioButtons
v-model="radioValue"
:initial-value="radioValue"
:options="radioButtons"
name="radio"
/>
<div>
<BaseCheckbox
id="check1"
v-model="checkbox1"
:label="t('Checkbox 1')"
name="checkbox1"
/>
<BaseCheckbox
id="check2"
v-model="checkbox2"
:label="t('Checkbox 2')"
name="checkbox2"
/>
</div>
</div>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Toggle") }}</p>
<BaseToggleButton
:model-value="toggleState"
:off-label="t('Show all')"
:on-label="t('Hide all')"
off-icon="eye-on"
on-icon="eye-off"
size="normal"
without-borders
@update:model-value="toggleState = !toggleState"
/>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Forms") }}</p>
<BaseInputText
:label="t('This is the default form')"
:model-value="null"
/>
<BaseInputText
:is-invalid="true"
:label="t('This is a form with an error')"
:model-value="null"
/>
<BaseInputDate
id="date"
:label="t('Date')"
class="w-32"
/>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Dialogs") }}</p>
<BaseButton
:label="t('Show dialog')"
icon="eye-on"
type="black"
@click="isDialogVisible = true"
/>
<BaseDialogConfirmCancel
:is-visible="isDialogVisible"
:title="t('Dialog example')"
@confirm-clicked="isDialogVisible = false"
@cancel-clicked="isDialogVisible = false"
/>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Some more elements") }}</p>
<div class="course-tool cursor-pointer">
<div class="course-tool__link hover:primary-gradient hover:bg-primary-gradient/10">
<span
aria-hidden="true"
class="course-tool__icon mdi mdi-bookshelf"
/>
</div>
<p class="course-tool__title">{{ t("Documents") }}</p>
</div>
</div>
</div>
</template>

@ -1,38 +1,27 @@
<template>
<div class="flex flex-col justify-center gap-0">
<p
<div class="color-picker">
<label
v-if="label"
class="text-body-2 mb-1.5"
v-text="label"
/>
<div class="flex flex-row gap-2 h-10">
<InputGroup>
<input
:value="hexColor"
class="h-12 w-12 cursor-pointer rounded-lg"
type="color"
@input="inputColorPicked($event.target.value)"
/>
<BaseInputText
label=""
class="w-32"
input-class="mb-0"
<InputText
:invalid="inputHexError !== ''"
:model-value="inputText"
:error-text="inputHexError"
:is-invalid="inputHexError !== ''"
:form-submitted="inputHexError !== ''"
@update:model-value="inputColorPickedFromInputText"
/>
</div>
</InputGroup>
<small
v-if="error"
class="text-danger h-4"
class="p-error"
>
{{ error }}
</small>
<div
v-else
class="h-4"
></div>
</div>
</template>
@ -40,7 +29,8 @@
import Color from "colorjs.io"
import { computed, onMounted, ref, watch } from "vue"
import { useI18n } from "vue-i18n"
import BaseInputText from "./BaseInputText.vue"
import InputGroup from "primevue/inputgroup"
import InputText from "primevue/inputtext"
const { t } = useI18n()

@ -213,208 +213,7 @@
<BaseDivider layout="vertical" />
<div class="admin-colors__settings-preview">
<h6>{{ t('You can see examples of how chamilo will look here') }}</h6>
<div>
<p class="mb-3 text-lg">{{ t('Buttons') }}</p>
<div class="flex flex-row flex-wrap mb-3">
<BaseButton
:label="t('Primary')"
class="mr-2 mb-2"
icon="eye-on"
type="primary"
/>
<BaseButton
:label="t('Primary alternative')"
class="mr-2 mb-2"
icon="eye-on"
type="primary-alternative"
/>
<BaseButton
:label="t('Secondary')"
class="mr-2 mb-2"
icon="eye-on"
type="secondary"
/>
<BaseButton
:label="t('Tertiary')"
class="mr-2 mb-2"
icon="eye-on"
type="black"
/>
</div>
<div class="flex flex-row flex-wrap mb-3">
<BaseButton
:label="t('Success')"
class="mr-2 mb-2"
icon="send"
type="success"
/>
<BaseButton
:label="t('Info')"
class="mr-2 mb-2"
icon="send"
type="info"
/>
<BaseButton
:label="t('Warning')"
class="mr-2 mb-2"
icon="send"
type="warning"
/>
<BaseButton
:label="t('Danger')"
class="mr-2 mb-2"
icon="delete"
type="danger"
/>
</div>
<div class="flex flex-row flex-wrap mb-3">
<BaseButton
:label="t('Disabled')"
class="mr-2 mb-2"
disabled
icon="eye-on"
type="primary"
/>
<BaseButton
class="mr-2 mb-2"
icon="cog"
only-icon
type="primary"
/>
</div>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Dropdowns") }}</p>
<div class="flex flex-row gap-3">
<BaseButton
class="mr-3 mb-2"
icon="cog"
only-icon
popup-identifier="menu"
type="primary"
@click="toggle"
/>
<BaseMenu
id="menu"
ref="menu"
:model="menuItems"
/>
<BaseDropdown
v-model="dropdown"
:label="t('Dropdown')"
:options="[
{
label: t('Option 1'),
value: 'option_1',
},
{
label: t('Option 2'),
value: 'option_2',
},
{
label: t('Option 3'),
value: 'option_3',
},
]"
class="w-36"
input-id="dropdown"
name="dropdown"
option-label="label"
option-value="value"
/>
</div>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Checkbox and radio buttons") }}</p>
<div class="flex flex-col md:flex-row gap-3 md:gap-5">
<BaseRadioButtons
v-model="radioValue"
:initial-value="radioValue"
:options="radioButtons"
name="radio"
/>
<div>
<BaseCheckbox
id="check1"
v-model="checkbox1"
:label="t('Checkbox 1')"
name="checkbox1"
/>
<BaseCheckbox
id="check2"
v-model="checkbox2"
:label="t('Checkbox 2')"
name="checkbox2"
/>
</div>
</div>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Toggle") }}</p>
<BaseToggleButton
:model-value="toggleState"
:off-label="t('Show all')"
:on-label="t('Hide all')"
off-icon="eye-on"
on-icon="eye-off"
size="normal"
without-borders
@update:model-value="toggleState = !toggleState"
/>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Forms") }}</p>
<BaseInputText
:label="t('This is the default form')"
:model-value="null"
/>
<BaseInputText
:is-invalid="true"
:label="t('This is a form with an error')"
:model-value="null"
/>
<BaseInputDate
id="date"
:label="t('Date')"
class="w-32"
/>
</div>
<div>
<p class="mb-3 text-lg">{{ t("Dialogs") }}</p>
<BaseButton
:label="t('Show dialog')"
icon="eye-on"
type="black"
@click="isDialogVisible = true"
/>
<BaseDialogConfirmCancel
:is-visible="isDialogVisible"
:title="t('Dialog example')"
@confirm-clicked="isDialogVisible = false"
@cancel-clicked="isDialogVisible = false"
/>
</div>
<div>
<p class="mb-3 text-lg">{{ t('Some more elements') }}</p>
<div class="course-tool cursor-pointer">
<div class="course-tool__link hover:primary-gradient hover:bg-primary-gradient/10">
<span
aria-hidden="true"
class="course-tool__icon mdi mdi-bookshelf"
/>
</div>
<p class="course-tool__title">{{ t('Documents') }}</p>
</div>
</div>
</div>
<ColorThemePreview />
</div>
</div>
</div>
@ -423,23 +222,17 @@
<script setup>
import BaseButton from "../../components/basecomponents/BaseButton.vue"
import { useI18n } from "vue-i18n"
import BaseMenu from "../../components/basecomponents/BaseMenu.vue"
import { provide, ref, watch } from "vue"
import BaseCheckbox from "../../components/basecomponents/BaseCheckbox.vue"
import BaseRadioButtons from "../../components/basecomponents/BaseRadioButtons.vue"
import BaseDialogConfirmCancel from "../../components/basecomponents/BaseDialogConfirmCancel.vue"
import { ref, watch } from "vue"
import BaseInputText from "../../components/basecomponents/BaseInputText.vue"
import BaseColorPicker from "../../components/basecomponents/BaseColorPicker.vue"
import { useTheme } from "../../composables/theme"
import { useNotification } from "../../composables/notification"
import BaseDropdown from "../../components/basecomponents/BaseDropdown.vue"
import BaseInputDate from "../../components/basecomponents/BaseInputDate.vue"
import BaseToggleButton from "../../components/basecomponents/BaseToggleButton.vue"
import Color from "colorjs.io"
import themeService from "../../services/colorThemeService"
import BaseDivider from "../../components/basecomponents/BaseDivider.vue"
import SectionHeader from "../../components/layout/SectionHeader.vue"
import ColorThemeSelector from "../../components/platform/ColorThemeSelector.vue"
import ColorThemePreview from "../../components/admin/ColorThemePreview.vue"
import colorThemeService from "../../services/colorThemeService"
const { t } = useI18n()
@ -642,34 +435,6 @@ function checkColorContrast(background, foreground, textErrorRef) {
}
}
// properties for example components
const menu = ref("menu")
const menuItems = [{ label: t("Item 1") }, { label: t("Item 2") }, { label: t("Item 3") }]
const toggle = (event) => {
menu.value.toggle(event)
}
const dropdown = ref("")
const checkbox1 = ref(true)
const checkbox2 = ref(false)
const radioButtons = [
{ label: t("Value 1"), value: "value1" },
{ label: t("Value 2"), value: "value2" },
{ label: t("Value 3"), value: "value3" },
]
const radioValue = ref("value1")
const isDialogVisible = ref(false)
const toggleState = ref(true)
// needed for course tool
const isSorting = ref(false)
const isCustomizing = ref(false)
provide("isSorting", isSorting)
provide("isCustomizing", isCustomizing)
async function onClickChangeColorTheme() {
if (selectedTheme.value) {
await colorThemeService.changePlatformColorTheme(selectedTheme.value)

@ -80,7 +80,7 @@
{% endif %}
<br />
<p style="color:#40ad49; font-size: 16px;">
Berlin/Paris, {{ 'The'|trans }}
{{ 'The'|trans }}
<span style="font-weight: bold; color: #672290;">{{ certificate_generated_date_no_time }}</span>
<br />
{{ 'The platform team'|trans|raw }}

@ -11,6 +11,7 @@ use Chamilo\CoreBundle\Form\PermissionType;
use Chamilo\CoreBundle\Repository\PermissionRelRoleRepository;
use Chamilo\CoreBundle\Repository\PermissionRepository;
use Chamilo\CoreBundle\ServiceHelper\PermissionServiceHelper;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
@ -50,7 +51,7 @@ class PermissionsController extends AbstractController
$permRelRole->setRoleCode($role);
}
$permRelRole->setChangeable(true);
$permRelRole->setUpdatedAt(new \DateTime());
$permRelRole->setUpdatedAt(new DateTime());
$em->persist($permRelRole);
} else {
if ($permRelRole) {
@ -79,7 +80,7 @@ class PermissionsController extends AbstractController
return $this->render('@ChamiloCore/Permission/index.html.twig', [
'permissions' => $permissions,
'forms' => $forms,
'roles' => $roles
'roles' => $roles,
]);
}

@ -8,6 +8,7 @@ namespace Chamilo\CoreBundle\DataFixtures;
use Chamilo\CoreBundle\Entity\Permission;
use Chamilo\CoreBundle\Entity\PermissionRelRole;
use DateTime;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Bundle\FixturesBundle\FixtureGroupInterface;
use Doctrine\Persistence\ObjectManager;
@ -40,12 +41,12 @@ class PermissionFixtures extends Fixture implements FixtureGroupInterface
$manager->flush();
foreach ($roles as $roleName => $roleCode) {
if (in_array($roleCode, $permissionsMapping[$permData['slug']])) {
if (\in_array($roleCode, $permissionsMapping[$permData['slug']])) {
$permRelRole = new PermissionRelRole();
$permRelRole->setPermission($permission);
$permRelRole->setRoleCode($roleName);
$permRelRole->setChangeable(true);
$permRelRole->setUpdatedAt(new \DateTime());
$permRelRole->setUpdatedAt(new DateTime());
$manager->persist($permRelRole);
}
}

@ -2135,9 +2135,8 @@ class SettingsCurrentFixtures extends Fixture implements FixtureGroupInterface
[
'name' => 'access_to_personal_file_for_all',
'title' => 'Access to personal file for all',
'comment' => "Allows all users to access, view, and manage their personal files within the system.",
'comment' => 'Allows all users to access, view, and manage their personal files within the system.',
],
],
'language' => [
[

@ -11,7 +11,6 @@ use Doctrine\ORM\Mapping as ORM;
use Stringable;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity(repositoryClass: PermissionRepository::class)]
#[ORM\Table(name: 'permission')]
/**
@ -49,6 +48,7 @@ class Permission implements Stringable
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
@ -60,6 +60,7 @@ class Permission implements Stringable
public function setSlug(string $slug): self
{
$this->slug = $slug;
return $this;
}
@ -71,6 +72,7 @@ class Permission implements Stringable
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}

@ -7,14 +7,15 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Entity;
use Chamilo\CoreBundle\Repository\PermissionRelRoleRepository;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity(repositoryClass: PermissionRelRoleRepository::class)]
#[ORM\Table(name: 'permission_rel_role')]
/**
* The PermissionRelRole entity makes the link between roles
* (defined in security.yaml) and permissions (defined by the
* The PermissionRelRole entity makes the link between roles
* (defined in security.yaml) and permissions (defined by the
* Permission entity) to define which user role can do what.
*/
class PermissionRelRole
@ -36,7 +37,7 @@ class PermissionRelRole
private bool $changeable;
#[ORM\Column(type: 'datetime')]
private \DateTime $updatedAt;
private DateTime $updatedAt;
public function getId(): ?int
{
@ -51,6 +52,7 @@ class PermissionRelRole
public function setPermission(Permission $permission): self
{
$this->permission = $permission;
return $this;
}
@ -62,6 +64,7 @@ class PermissionRelRole
public function setRoleCode(string $roleCode): self
{
$this->roleCode = $roleCode;
return $this;
}
@ -73,17 +76,19 @@ class PermissionRelRole
public function setChangeable(bool $changeable): self
{
$this->changeable = $changeable;
return $this;
}
public function getUpdatedAt(): \DateTime
public function getUpdatedAt(): DateTime
{
return $this->updatedAt;
}
public function setUpdatedAt(\DateTime $updatedAt): self
public function setUpdatedAt(DateTime $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
}

@ -71,7 +71,7 @@ final class Version20201216122012 extends AbstractMigrationChamilo
$this->entityManager->persist($resource);
if ($counter % self::BATCH_SIZE === 0) {
if (0 === $counter % self::BATCH_SIZE) {
$this->entityManager->flush();
}
@ -128,7 +128,7 @@ final class Version20201216122012 extends AbstractMigrationChamilo
;
$this->entityManager->persist($rootItem);
if ($counter % self::BATCH_SIZE === 0) {
if (0 === $counter % self::BATCH_SIZE) {
$this->entityManager->flush();
}

@ -50,21 +50,23 @@ final class Version20230215072918 extends AbstractMigrationChamilo
if (!empty($items)) {
foreach ($items as $item) {
$sessionId = $item['session_id'] ?? 0;
$userId = $item['to_user_id'] ?? 0;
$session = $sessionRepo->find($sessionId);
$user = $userRepo->find($userId);
$item = new CLpRelUser();
$item
->setUser($user)
->setCourse($course)
->setLp($lp)
;
if (!empty($session)) {
$item->setSession($session);
if (!($item['to_user_id'] === NULL || $item['to_user_id'] === 0)) {
$sessionId = $item['session_id'] ?? 0;
$userId = $item['to_user_id'] ?? 0;
$session = $sessionRepo->find($sessionId);
$user = $userRepo->find($userId);
$item = new CLpRelUser();
$item
->setUser($user)
->setCourse($course)
->setLp($lp)
;
if (!empty($session)) {
$item->setSession($session);
}
$this->entityManager->persist($item);
$this->entityManager->flush();
}
$this->entityManager->persist($item);
$this->entityManager->flush();
}
}
}

@ -10,6 +10,7 @@ use Chamilo\CoreBundle\DataFixtures\PermissionFixtures;
use Chamilo\CoreBundle\Entity\Permission;
use Chamilo\CoreBundle\Entity\PermissionRelRole;
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
use DateTime;
use Doctrine\DBAL\Schema\Schema;
final class Version20240709222700 extends AbstractMigrationChamilo
@ -42,11 +43,11 @@ final class Version20240709222700 extends AbstractMigrationChamilo
}
foreach ($roles as $roleName => $roleCode) {
if (in_array($roleCode, $permissionsMapping[$permData['slug']])) {
if (\in_array($roleCode, $permissionsMapping[$permData['slug']])) {
$permissionRelRoleRepository = $this->entityManager->getRepository(PermissionRelRole::class);
$existingRelation = $permissionRelRoleRepository->findOneBy([
'permission' => $permission,
'roleCode' => $roleName
'roleCode' => $roleName,
]);
if ($existingRelation) {
@ -57,7 +58,7 @@ final class Version20240709222700 extends AbstractMigrationChamilo
$permissionRelRole->setPermission($permission);
$permissionRelRole->setRoleCode($roleName);
$permissionRelRole->setChangeable(true);
$permissionRelRole->setUpdatedAt(new \DateTime());
$permissionRelRole->setUpdatedAt(new DateTime());
$this->entityManager->persist($permissionRelRole);
$this->entityManager->flush();

@ -19,5 +19,4 @@ class PermissionRelRoleRepository extends ServiceEntityRepository
{
parent::__construct($registry, PermissionRelRole::class);
}
}

@ -19,5 +19,4 @@ class PermissionRepository extends ServiceEntityRepository
{
parent::__construct($registry, Permission::class);
}
}

@ -21,7 +21,7 @@ class PermissionServiceHelper
$roles = $this->parameterBag->get('security.role_hierarchy.roles');
return array_filter(array_keys($roles), function ($role) {
return !str_starts_with($role, 'ROLE_CURRENT_') && $role !== 'ROLE_ANONYMOUS';
return !str_starts_with($role, 'ROLE_CURRENT_') && 'ROLE_ANONYMOUS' !== $role;
});
}
@ -34,10 +34,11 @@ class PermissionServiceHelper
->andWhere('prr.changeable = :changeable')
->setParameter('permissionSlug', $permissionSlug)
->setParameter('roles', $roles)
->setParameter('changeable', true);
->setParameter('changeable', true)
;
$results = $queryBuilder->getQuery()->getResult();
return count($results) > 0;
return \count($results) > 0;
}
}

Loading…
Cancel
Save