Loading .gitignore +1 −0 Changes for .gitignore: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ vendor api/vendor node_modules frontend/node_modules frontend/dist ###> friendsofphp/php-cs-fixer ### /.php-cs-fixer.php /.php-cs-fixer.cache Loading api/src/Dto/UtilisateurInscriptionInput.php +4 −2 Changes for api/src/Dto/UtilisateurInscriptionInput.php: 4 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -12,12 +12,14 @@ class UtilisateurInscriptionInput #[Groups(['user:register'])] public string $email; #[Groups(['user:register'])] public ?string $username; #[Assert\NotBlank] #[Assert\Length(min: 4)] #[Groups(['user:register'])] public string $plainPassword; #[Assert\NotBlank] #[Groups(['user:register'])] public string $typeConnexion; public ?string $typeConnexion; } api/src/Entity/AbstractUser.php +1 −0 Changes for api/src/Entity/AbstractUser.php: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ abstract class AbstractUser implements UserInterface, PasswordAuthenticatedUserI protected ?int $id = null; #[ORM\Column(length: 180, unique: true, nullable: true)] #[Groups(['user:read', 'user:create', 'user:update'])] protected ?string $username = null; #[Assert\NotBlank] Loading api/src/State/UtilisateurInscriptionProcessor.php +10 −4 Changes for api/src/State/UtilisateurInscriptionProcessor.php: 10 added lines, 4 removed lines. Original line number Diff line number Diff line Loading @@ -24,12 +24,18 @@ class UtilisateurInscriptionProcessor implements ProcessorInterface /** @var UtilisateurInscriptionInput $data */ $user = new User(); $user->setEmail($data->email); if(!$data->username){ $user->setUsername($data->email); } else { $user->setUsername($data->username); } $user->setPassword($this->hasher->hashPassword($user, $data->plainPassword)); $roleUser = $this->em->getRepository(Role::class)->findOneBy(['code' => 'ROLE_USER']); if ($roleUser) { $user->addRole($roleUser); } /** @TODO: Gérer le role par défaut */ // $roleUser = $this->em->getRepository(Role::class)->findOneBy(['code' => 'ROLE_USER']); // if ($roleUser) { // $user->addRole($roleUser); // } $this->em->persist($user); $this->em->flush(); Loading frontend/src/components/RoleEditDrawer.vue 0 → 100644 +113 −0 Changes for frontend/src/components/RoleEditDrawer.vue: 113 added lines, 0 removed lines. Original line number Diff line number Diff line <template> <q-drawer :model-value="modelValue" @update:model-value="emit('update:modelValue', $event)" side="right" :width="900" bordered overlay elevated > <!-- Header --> <div class="q-pa-md text-h6"> Role {{role?.libelle}} <div class="text-caption text-grey"> {{role?.code}} </div> </div> <!-- Content --> <q-card flat bordered class="q-mx-md q-my-sm"> <q-card-section> <q-input v-model="draft.code" label="Code" outlined @keyup.enter="saveDraft" /> <q-input v-model="draft.libelle" label="Libellé" outlined class="q-mt-md" @keyup.enter="saveDraft" /> </q-card-section> <q-card-actions align="right"> <q-btn flat label="Annuler" color="primary" @click="close" /> <q-btn label="Enregistrer" color="primary" @click="saveDraft" /> <q-btn v-if="role && role['@id'] !== 'new'" label="Supprimer" color="negative" @click="deleteRole(role)" /> </q-card-actions> </q-card> </q-drawer> </template> <script setup> import { computed, ref, watch } from 'vue' import { useRoleStore } from '@/stores/roleStore' const props = defineProps({ modelValue: Boolean, role: Object }) const emit = defineEmits(['update:modelValue']) const roleStore = useRoleStore() const draft = ref({ '@id': null, id: null, code: null, libelle: null, }) const resetDraft = () => { draft.value['@id'] = null draft.value.id = null draft.value.code = null draft.value.libelle = null } watch(() => props.role, (newRole) => { if(newRole) { draft.value['@id'] = newRole['@id'] draft.value.id = newRole.id draft.value.code = newRole.code draft.value.libelle = newRole.libelle } else { resetDraft() } }) function startCreate() { resetDraft() draft.value['@id'] = 'new' draft.value.resourceClass = null draft.value.resourceId = null } function close() { emit('update:modelValue', false) } async function saveDraft() { if(draft.value['@id'] === 'new') { console.log('create') // Create role await roleStore.createRole(draft.value) } else{ const roleBase = roleStore.roles.find(r => r['@id'] === draft.value['@id']) console.log(draft.value, roleBase) await roleStore.patchRole( { code: draft.value.code, libelle: draft.value.libelle, }, draft.value.id ) } resetDraft() close() } async function deleteRole(role) { await roleStore.deleteRole(role.id) } </script> No newline at end of file Loading
.gitignore +1 −0 Changes for .gitignore: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ vendor api/vendor node_modules frontend/node_modules frontend/dist ###> friendsofphp/php-cs-fixer ### /.php-cs-fixer.php /.php-cs-fixer.cache Loading
api/src/Dto/UtilisateurInscriptionInput.php +4 −2 Changes for api/src/Dto/UtilisateurInscriptionInput.php: 4 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -12,12 +12,14 @@ class UtilisateurInscriptionInput #[Groups(['user:register'])] public string $email; #[Groups(['user:register'])] public ?string $username; #[Assert\NotBlank] #[Assert\Length(min: 4)] #[Groups(['user:register'])] public string $plainPassword; #[Assert\NotBlank] #[Groups(['user:register'])] public string $typeConnexion; public ?string $typeConnexion; }
api/src/Entity/AbstractUser.php +1 −0 Changes for api/src/Entity/AbstractUser.php: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ abstract class AbstractUser implements UserInterface, PasswordAuthenticatedUserI protected ?int $id = null; #[ORM\Column(length: 180, unique: true, nullable: true)] #[Groups(['user:read', 'user:create', 'user:update'])] protected ?string $username = null; #[Assert\NotBlank] Loading
api/src/State/UtilisateurInscriptionProcessor.php +10 −4 Changes for api/src/State/UtilisateurInscriptionProcessor.php: 10 added lines, 4 removed lines. Original line number Diff line number Diff line Loading @@ -24,12 +24,18 @@ class UtilisateurInscriptionProcessor implements ProcessorInterface /** @var UtilisateurInscriptionInput $data */ $user = new User(); $user->setEmail($data->email); if(!$data->username){ $user->setUsername($data->email); } else { $user->setUsername($data->username); } $user->setPassword($this->hasher->hashPassword($user, $data->plainPassword)); $roleUser = $this->em->getRepository(Role::class)->findOneBy(['code' => 'ROLE_USER']); if ($roleUser) { $user->addRole($roleUser); } /** @TODO: Gérer le role par défaut */ // $roleUser = $this->em->getRepository(Role::class)->findOneBy(['code' => 'ROLE_USER']); // if ($roleUser) { // $user->addRole($roleUser); // } $this->em->persist($user); $this->em->flush(); Loading
frontend/src/components/RoleEditDrawer.vue 0 → 100644 +113 −0 Changes for frontend/src/components/RoleEditDrawer.vue: 113 added lines, 0 removed lines. Original line number Diff line number Diff line <template> <q-drawer :model-value="modelValue" @update:model-value="emit('update:modelValue', $event)" side="right" :width="900" bordered overlay elevated > <!-- Header --> <div class="q-pa-md text-h6"> Role {{role?.libelle}} <div class="text-caption text-grey"> {{role?.code}} </div> </div> <!-- Content --> <q-card flat bordered class="q-mx-md q-my-sm"> <q-card-section> <q-input v-model="draft.code" label="Code" outlined @keyup.enter="saveDraft" /> <q-input v-model="draft.libelle" label="Libellé" outlined class="q-mt-md" @keyup.enter="saveDraft" /> </q-card-section> <q-card-actions align="right"> <q-btn flat label="Annuler" color="primary" @click="close" /> <q-btn label="Enregistrer" color="primary" @click="saveDraft" /> <q-btn v-if="role && role['@id'] !== 'new'" label="Supprimer" color="negative" @click="deleteRole(role)" /> </q-card-actions> </q-card> </q-drawer> </template> <script setup> import { computed, ref, watch } from 'vue' import { useRoleStore } from '@/stores/roleStore' const props = defineProps({ modelValue: Boolean, role: Object }) const emit = defineEmits(['update:modelValue']) const roleStore = useRoleStore() const draft = ref({ '@id': null, id: null, code: null, libelle: null, }) const resetDraft = () => { draft.value['@id'] = null draft.value.id = null draft.value.code = null draft.value.libelle = null } watch(() => props.role, (newRole) => { if(newRole) { draft.value['@id'] = newRole['@id'] draft.value.id = newRole.id draft.value.code = newRole.code draft.value.libelle = newRole.libelle } else { resetDraft() } }) function startCreate() { resetDraft() draft.value['@id'] = 'new' draft.value.resourceClass = null draft.value.resourceId = null } function close() { emit('update:modelValue', false) } async function saveDraft() { if(draft.value['@id'] === 'new') { console.log('create') // Create role await roleStore.createRole(draft.value) } else{ const roleBase = roleStore.roles.find(r => r['@id'] === draft.value['@id']) console.log(draft.value, roleBase) await roleStore.patchRole( { code: draft.value.code, libelle: draft.value.libelle, }, draft.value.id ) } resetDraft() close() } async function deleteRole(role) { await roleStore.deleteRole(role.id) } </script> No newline at end of file