diff --git a/.changes/unreleased/Feature-20230906-155212.yaml b/.changes/unreleased/Feature-20230906-155212.yaml new file mode 100644 index 000000000..c894bbf72 --- /dev/null +++ b/.changes/unreleased/Feature-20230906-155212.yaml @@ -0,0 +1,6 @@ +kind: Feature +body: Use the CRUD controller for center entity + add the isActive property to be + able to mask instances of Center that are no longer in use. +time: 2023-09-06T15:52:12.561065323+02:00 +custom: + Issue: "" diff --git a/src/Bundle/ChillMainBundle/Controller/CenterController.php b/src/Bundle/ChillMainBundle/Controller/CenterController.php index 1cc129e5d..fef36c11b 100644 --- a/src/Bundle/ChillMainBundle/Controller/CenterController.php +++ b/src/Bundle/ChillMainBundle/Controller/CenterController.php @@ -11,178 +11,22 @@ declare(strict_types=1); namespace Chill\MainBundle\Controller; +use Chill\MainBundle\CRUD\Controller\CRUDController; use Chill\MainBundle\Entity\Center; use Chill\MainBundle\Form\CenterType; -use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Chill\MainBundle\Pagination\PaginatorInterface; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\HttpFoundation\Request; /** * Class CenterController. */ -class CenterController extends AbstractController +class CenterController extends CRUDController { - /** - * Creates a new Center entity. - */ - public function createAction(Request $request) + protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator) { - $center = new Center(); - $form = $this->createCreateForm($center); - $form->handleRequest($request); + $query->addOrderBy('e.name', 'ASC'); - if ($form->isValid()) { - $em = $this->getDoctrine()->getManager(); - $em->persist($center); - $em->flush(); - - return $this->redirect($this->generateUrl('admin_center')); - } - - return $this->render('@ChillMain/Center/new.html.twig', [ - 'entity' => $center, - 'form' => $form->createView(), - ]); - } - - /** - * Displays a form to edit an existing Center entity. - * - * @param mixed $id - */ - public function editAction($id) - { - $em = $this->getDoctrine()->getManager(); - - $center = $em->getRepository(\Chill\MainBundle\Entity\Center::class)->find($id); - - if (!$center) { - throw $this->createNotFoundException('Unable to find Center entity.'); - } - - $editForm = $this->createEditForm($center); - - return $this->render('@ChillMain/Center/edit.html.twig', [ - 'entity' => $center, - 'edit_form' => $editForm->createView(), - ]); - } - - /** - * Lists all Center entities. - */ - public function indexAction() - { - $em = $this->getDoctrine()->getManager(); - - $entities = $em->getRepository(\Chill\MainBundle\Entity\Center::class)->findAll(); - - usort($entities, fn (Center $a, Center $b) => $a->getName() <=> $b->getName()); - - return $this->render('@ChillMain/Center/index.html.twig', [ - 'entities' => $entities, - ]); - } - - /** - * Displays a form to create a new Center entity. - */ - public function newAction() - { - $center = new Center(); - $form = $this->createCreateForm($center); - - return $this->render('@ChillMain/Center/new.html.twig', [ - 'entity' => $center, - 'form' => $form->createView(), - ]); - } - - /** - * Finds and displays a Center entity. - * - * @param mixed $id - */ - public function showAction($id) - { - $em = $this->getDoctrine()->getManager(); - - $center = $em->getRepository(\Chill\MainBundle\Entity\Center::class)->find($id); - - if (!$center) { - throw $this->createNotFoundException('Unable to find Center entity.'); - } - - return $this->render('@ChillMain/Center/show.html.twig', [ - 'entity' => $center, - ]); - } - - /** - * Edits an existing Center entity. - * - * @param mixed $id - */ - public function updateAction(Request $request, $id) - { - $em = $this->getDoctrine()->getManager(); - - $center = $em->getRepository(\Chill\MainBundle\Entity\Center::class)->find($id); - - if (!$center) { - throw $this->createNotFoundException('Unable to find Center entity.'); - } - - $editForm = $this->createEditForm($center); - $editForm->handleRequest($request); - - if ($editForm->isValid()) { - $em->flush(); - - return $this->redirect($this->generateUrl('admin_center_edit', ['id' => $id])); - } - - return $this->render('@ChillMain/Center/edit.html.twig', [ - 'entity' => $center, - 'edit_form' => $editForm->createView(), - ]); - } - - /** - * Creates a form to create a Center entity. - * - * @param Center $center The entity - * - * @return \Symfony\Component\Form\Form The form - */ - private function createCreateForm(Center $center) - { - $form = $this->createForm(CenterType::class, $center, [ - 'action' => $this->generateUrl('admin_center_create'), - 'method' => 'POST', - ]); - - $form->add('submit', SubmitType::class, ['label' => 'Create']); - - return $form; - } - - /** - * Creates a form to edit a Center entity. - * - * @param Center $center The entity - * - * @return \Symfony\Component\Form\Form The form - */ - private function createEditForm(Center $center) - { - $form = $this->createForm(CenterType::class, $center, [ - 'action' => $this->generateUrl('admin_center_update', ['id' => $center->getId()]), - 'method' => 'PUT', - ]); - - $form->add('submit', SubmitType::class, ['label' => 'Update']); - - return $form; + return parent::orderQuery($action, $query, $request, $paginator); } } diff --git a/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php b/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php index c86a69be2..a8ac588f1 100644 --- a/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php +++ b/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\MainBundle\DependencyInjection; use Chill\MainBundle\Controller\AddressApiController; +use Chill\MainBundle\Controller\CenterController; use Chill\MainBundle\Controller\CivilityApiController; use Chill\MainBundle\Controller\CivilityController; use Chill\MainBundle\Controller\CountryController; @@ -44,6 +45,7 @@ use Chill\MainBundle\Doctrine\DQL\Unaccent; use Chill\MainBundle\Doctrine\ORM\Hydration\FlatHierarchyEntityHydrator; use Chill\MainBundle\Doctrine\Type\NativeDateIntervalType; use Chill\MainBundle\Doctrine\Type\PointType; +use Chill\MainBundle\Entity\Center; use Chill\MainBundle\Entity\Civility; use Chill\MainBundle\Entity\Country; use Chill\MainBundle\Entity\GeographicalUnitLayer; @@ -53,6 +55,7 @@ use Chill\MainBundle\Entity\LocationType; use Chill\MainBundle\Entity\Regroupment; use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\UserJob; +use Chill\MainBundle\Form\CenterType; use Chill\MainBundle\Form\CivilityType; use Chill\MainBundle\Form\CountryType; use Chill\MainBundle\Form\LanguageType; @@ -524,6 +527,27 @@ class ChillMainExtension extends Extension implements ], ], ], + [ + 'class' => Center::class, + 'name' => 'center', + 'base_path' => '/admin/center', + 'form_class' => CenterType::class, + 'controller' => CenterController::class, + 'actions' => [ + 'index' => [ + 'role' => 'ROLE_ADMIN', + 'template' => '@ChillMain/Admin/Center/index.html.twig', + ], + 'new' => [ + 'role' => 'ROLE_ADMIN', + 'template' => '@ChillMain/Admin/Center/new.html.twig', + ], + 'edit' => [ + 'role' => 'ROLE_ADMIN', + 'template' => '@ChillMain/Admin/Center/edit.html.twig', + ], + ], + ], ], 'apis' => [ [ diff --git a/src/Bundle/ChillMainBundle/Entity/Center.php b/src/Bundle/ChillMainBundle/Entity/Center.php index 0d5402409..5e72f43a2 100644 --- a/src/Bundle/ChillMainBundle/Entity/Center.php +++ b/src/Bundle/ChillMainBundle/Entity/Center.php @@ -48,6 +48,11 @@ class Center implements HasCenterInterface */ private string $name = ''; + /** + * @ORM\Column(type="boolean") + */ + private bool $isActive = true; + /** * @var Collection * @ORM\ManyToMany(targetEntity=Regroupment::class, mappedBy="centers") @@ -121,6 +126,11 @@ class Center implements HasCenterInterface return $this->regroupments; } + public function getIsActive(): bool + { + return $this->isActive; + } + /** * @param $name * @@ -132,4 +142,11 @@ class Center implements HasCenterInterface return $this; } + + public function setIsActive(bool $isActive): self + { + $this->isActive = $isActive; + + return $this; + } } diff --git a/src/Bundle/ChillMainBundle/Form/CenterType.php b/src/Bundle/ChillMainBundle/Form/CenterType.php index ff758ca49..864d0a877 100644 --- a/src/Bundle/ChillMainBundle/Form/CenterType.php +++ b/src/Bundle/ChillMainBundle/Form/CenterType.php @@ -11,7 +11,10 @@ declare(strict_types=1); namespace Chill\MainBundle\Form; +use Chill\MainBundle\Entity\Center; +use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -21,24 +24,18 @@ class CenterType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { $builder - ->add('name', TextType::class); + ->add('name', TextType::class, [ + 'label' => 'Nom', + ]) + ->add('isActive', CheckboxType::class, [ + 'label' => 'Actif ?', + 'required' => false, + ]); } - /** - * @param OptionsResolverInterface $resolver - */ public function configureOptions(OptionsResolver $resolver) { - $resolver->setDefaults([ - 'data_class' => \Chill\MainBundle\Entity\Center::class, - ]); - } - - /** - * @return string - */ - public function getBlockPrefix() - { - return 'chill_mainbundle_center'; + $resolver + ->setDefault('class', Center::class); } } diff --git a/src/Bundle/ChillMainBundle/Form/Type/PickCenterType.php b/src/Bundle/ChillMainBundle/Form/Type/PickCenterType.php index 83e957623..882b9f4fa 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/PickCenterType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/PickCenterType.php @@ -61,6 +61,8 @@ class PickCenterType extends AbstractType { $centers = $this->getReachableCenters($options['role'], $options['scopes']); + $centersActive = array_filter($centers, fn (Center $c) => $c->getIsActive()); + if (count($centers) <= 1) { $multiple = $options['choice_options']['multiple'] ?? false; $builder->add('center', HiddenType::class); @@ -75,7 +77,7 @@ class PickCenterType extends AbstractType $options['choice_options'], [ 'class' => Center::class, - 'choices' => $centers, + 'choices' => $centersActive, ] ) ); diff --git a/src/Bundle/ChillMainBundle/Form/UserType.php b/src/Bundle/ChillMainBundle/Form/UserType.php index f8485aa99..4119a3ed0 100644 --- a/src/Bundle/ChillMainBundle/Form/UserType.php +++ b/src/Bundle/ChillMainBundle/Form/UserType.php @@ -67,6 +67,7 @@ class UserType extends AbstractType 'class' => Center::class, 'query_builder' => static function (EntityRepository $er) { $qb = $er->createQueryBuilder('c'); + $qb->where($qb->expr()->eq('c.isActive', 'true')); $qb->addOrderBy('c.name'); return $qb; diff --git a/src/Bundle/ChillMainBundle/Repository/CenterRepository.php b/src/Bundle/ChillMainBundle/Repository/CenterRepository.php index eaa0a6b1e..f8646811e 100644 --- a/src/Bundle/ChillMainBundle/Repository/CenterRepository.php +++ b/src/Bundle/ChillMainBundle/Repository/CenterRepository.php @@ -29,9 +29,12 @@ final class CenterRepository implements CenterRepositoryInterface return $this->repository->find($id, $lockMode, $lockVersion); } + /** + * @return Center[] + */ public function findActive(): array { - return $this->findAll(); + return $this->repository->findBy(['isActive' => true], ['name' => 'ASC']); } /** diff --git a/src/Bundle/ChillMainBundle/Resources/views/Admin/Center/edit.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Admin/Center/edit.html.twig new file mode 100644 index 000000000..4d55c480c --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/views/Admin/Center/edit.html.twig @@ -0,0 +1,11 @@ +{% extends '@ChillMain/CRUD/Admin/index.html.twig' %} + +{% block title %} + {% include('@ChillMain/CRUD/_edit_title.html.twig') %} +{% endblock %} + +{% block admin_content %} + {% embed '@ChillMain/CRUD/_edit_content.html.twig' %} + {% block content_form_actions_save_and_show %}{% endblock %} + {% endembed %} +{% endblock admin_content %} diff --git a/src/Bundle/ChillMainBundle/Resources/views/Admin/Center/index.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Admin/Center/index.html.twig new file mode 100644 index 000000000..27c19c504 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/views/Admin/Center/index.html.twig @@ -0,0 +1,39 @@ +{% extends '@ChillMain/CRUD/Admin/index.html.twig' %} + +{% block admin_content %} + {% embed '@ChillMain/CRUD/_index.html.twig' %} + {% block table_entities_thead_tr %} + {{ 'Label'|trans }} + {{ 'Active'|trans }} +   + {% endblock %} + + {% block table_entities_tbody %} + {% for entity in entities %} + + {{ entity.name }} + + {% if entity.isActive %} + + {% else %} + + {% endif %} + + + + + + {% endfor %} + {% endblock %} + + {% block actions_before %} +
  • + {{'Back to the admin'|trans}} +
  • + {% endblock %} + {% endembed %} +{% endblock %} diff --git a/src/Bundle/ChillMainBundle/Resources/views/Admin/Center/new.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Admin/Center/new.html.twig new file mode 100644 index 000000000..7c204dddd --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/views/Admin/Center/new.html.twig @@ -0,0 +1,11 @@ +{% extends '@ChillMain/CRUD/Admin/index.html.twig' %} + +{% block title %} + {% include('@ChillMain/CRUD/_new_title.html.twig') %} +{% endblock %} + +{% block admin_content %} + {% embed '@ChillMain/CRUD/_new_content.html.twig' %} + {% block content_form_actions_save_and_show %}{% endblock %} + {% endembed %} +{% endblock admin_content %} diff --git a/src/Bundle/ChillMainBundle/Resources/views/Center/edit.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Center/edit.html.twig deleted file mode 100644 index 1894a1402..000000000 --- a/src/Bundle/ChillMainBundle/Resources/views/Center/edit.html.twig +++ /dev/null @@ -1,23 +0,0 @@ -{% extends '@ChillMain/Admin/layoutWithVerticalMenu.html.twig' %} - -{% block title %}{{ 'Center edit'|trans }}{% endblock %} - -{% block admin_content -%} -

    {{ 'Center edit'|trans }}

    - - {{ form_start(edit_form) }} - {{ form_row(edit_form.name) }} - - - - {{ form_end(edit_form) }} -{% endblock %} diff --git a/src/Bundle/ChillMainBundle/Resources/views/Center/index.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Center/index.html.twig deleted file mode 100644 index cb2da8a62..000000000 --- a/src/Bundle/ChillMainBundle/Resources/views/Center/index.html.twig +++ /dev/null @@ -1,50 +0,0 @@ -{% extends '@ChillMain/CRUD/Admin/index.html.twig' %} - -{% block title %}{{ 'Center list'|trans }}{% endblock %} - -{% block admin_content -%} - {% embed '@ChillMain/CRUD/_index.html.twig' %} - - {% block index_header %} -

    {{ 'Center list'|trans }}

    - {% endblock %} - - {% block filter_order %}{% endblock %} - - {% block table_entities_thead_tr %} - id - {{ 'Name'|trans }} - {{ 'Actions'|trans }} - {% endblock %} - - {% block table_entities_tbody %} - {% for entity in entities %} - - {{ entity.id }} - {{ entity.name }} - - - - - {% endfor %} - {% endblock %} - - {% block pagination %}{% endblock %} - - {% block list_actions %} - - {% endblock list_actions %} - - {% endembed %} -{% endblock %} diff --git a/src/Bundle/ChillMainBundle/Resources/views/Center/new.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Center/new.html.twig deleted file mode 100644 index cc64b37c2..000000000 --- a/src/Bundle/ChillMainBundle/Resources/views/Center/new.html.twig +++ /dev/null @@ -1,23 +0,0 @@ -{% extends '@ChillMain/Admin/layoutWithVerticalMenu.html.twig' %} - -{% block title %}{{ 'Center creation'|trans }}{% endblock %} - -{% block admin_content -%} -

    {{ 'Center creation'|trans }}

    - - {{ form_start(form) }} - {{ form_row(form.name) }} - - - - {{ form_end(form) }} -{% endblock %} diff --git a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/AdminUserMenuBuilder.php b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/AdminUserMenuBuilder.php index 7bd23c81f..8e2ccb7c6 100644 --- a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/AdminUserMenuBuilder.php +++ b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/AdminUserMenuBuilder.php @@ -49,7 +49,7 @@ class AdminUserMenuBuilder implements LocalMenuBuilderInterface ]); $menu->addChild('Center list', [ - 'route' => 'admin_center', + 'route' => 'chill_crud_center_index', ])->setExtras(['order' => 1010]); $menu->addChild('Regroupements des centres', [ diff --git a/src/Bundle/ChillMainBundle/Serializer/Normalizer/CenterNormalizer.php b/src/Bundle/ChillMainBundle/Serializer/Normalizer/CenterNormalizer.php index e0b2a3e96..578fc4ce2 100644 --- a/src/Bundle/ChillMainBundle/Serializer/Normalizer/CenterNormalizer.php +++ b/src/Bundle/ChillMainBundle/Serializer/Normalizer/CenterNormalizer.php @@ -63,6 +63,7 @@ class CenterNormalizer implements DenormalizerInterface, NormalizerInterface 'id' => $center->getId(), 'type' => 'center', 'name' => $center->getName(), + 'isActive' => $center->getIsActive() ]; } diff --git a/src/Bundle/ChillMainBundle/config/routes.yaml b/src/Bundle/ChillMainBundle/config/routes.yaml index d25f2aaff..5bbc381d1 100644 --- a/src/Bundle/ChillMainBundle/config/routes.yaml +++ b/src/Bundle/ChillMainBundle/config/routes.yaml @@ -10,10 +10,6 @@ chill_main_admin_scope: resource: "@ChillMainBundle/config/routes/scope.yaml" prefix: "{_locale}/admin/scope" -chill_main_admin: - resource: "@ChillMainBundle/config/routes/center.yaml" - prefix: "{_locale}/admin/center" - chill_main_exports: resource: "@ChillMainBundle/config/routes/exports.yaml" prefix: "{_locale}/exports" diff --git a/src/Bundle/ChillMainBundle/migrations/Version20230906134410.php b/src/Bundle/ChillMainBundle/migrations/Version20230906134410.php new file mode 100644 index 000000000..ac18c9c29 --- /dev/null +++ b/src/Bundle/ChillMainBundle/migrations/Version20230906134410.php @@ -0,0 +1,36 @@ +addSql('ALTER TABLE centers ADD isActive BOOLEAN DEFAULT true NOT NULL'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE centers DROP isActive'); + } +} diff --git a/src/Bundle/ChillMainBundle/translations/messages.fr.yml b/src/Bundle/ChillMainBundle/translations/messages.fr.yml index 6a6136a41..6cbb1fef4 100644 --- a/src/Bundle/ChillMainBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillMainBundle/translations/messages.fr.yml @@ -425,6 +425,12 @@ crud: add_new: Ajouter un regroupement title_new: Nouveau regroupement title_edit: Modifier un regroupement + center: + index: + title: Liste des centres + add_new: Ajouter un centre + title_new: Nouveau centre + title_edit: Modifier un centre No entities: Aucun élément diff --git a/src/Bundle/ChillPersonBundle/Controller/PersonApiController.php b/src/Bundle/ChillPersonBundle/Controller/PersonApiController.php index 505f307e6..78dfc268c 100644 --- a/src/Bundle/ChillPersonBundle/Controller/PersonApiController.php +++ b/src/Bundle/ChillPersonBundle/Controller/PersonApiController.php @@ -13,6 +13,7 @@ namespace Chill\PersonBundle\Controller; use Chill\MainBundle\CRUD\Controller\ApiController; use Chill\MainBundle\Entity\Address; +use Chill\MainBundle\Entity\Center; use Chill\PersonBundle\Config\ConfigPersonAltNamesHelper; use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation; use Chill\PersonBundle\Entity\Person; @@ -56,7 +57,7 @@ class PersonApiController extends ApiController ['showCenters' => $this->showCenters, 'centers' => $centers], Response::HTTP_OK, [], - ['gropus' => ['read']] + ['groups' => ['read']] ); } diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/Person.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/Person.vue index 16a76c780..46d78b77c 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/Person.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/Person.vue @@ -329,12 +329,13 @@ export default { if (this.action !== 'create') { this.loadData(); } else { - console.log('show centers', this.showCenters); + // console.log('show centers', this.showCenters); getCentersForPersonCreation() .then(params => { - this.config.centers = params.centers; + this.config.centers = params.centers.filter(c => c.isActive); this.showCenters = params.showCenters; - console.log('show centers inside', this.showCenters); + // console.log('centers', this.config.centers) + // console.log('show centers inside', this.showCenters); if (this.showCenters && this.config.centers.length === 1) { this.person.center = this.config.centers[0]; }