From 82aa0db456a3416693508cb8a227aa03b0e4d06e Mon Sep 17 00:00:00 2001
From: Zahdi <ZahdiMohcine20@gmail.com>
Date: Wed, 19 Mar 2025 16:25:40 +0100
Subject: [PATCH] [Progress] adding wishlist generic controller

---
 src/Controller/WhishlistController.php     | 81 ++++++++++++++++++++++
 src/Form/WishlistType.php                  | 29 ++++++++
 templates/whishlist/_delete_form.html.twig |  4 ++
 templates/whishlist/_form.html.twig        |  4 ++
 templates/whishlist/edit.html.twig         | 13 ++++
 templates/whishlist/index.html.twig        | 39 +++++++++++
 templates/whishlist/new.html.twig          | 11 +++
 templates/whishlist/show.html.twig         | 34 +++++++++
 8 files changed, 215 insertions(+)
 create mode 100644 src/Controller/WhishlistController.php
 create mode 100644 src/Form/WishlistType.php
 create mode 100644 templates/whishlist/_delete_form.html.twig
 create mode 100644 templates/whishlist/_form.html.twig
 create mode 100644 templates/whishlist/edit.html.twig
 create mode 100644 templates/whishlist/index.html.twig
 create mode 100644 templates/whishlist/new.html.twig
 create mode 100644 templates/whishlist/show.html.twig

diff --git a/src/Controller/WhishlistController.php b/src/Controller/WhishlistController.php
new file mode 100644
index 00000000..21237de6
--- /dev/null
+++ b/src/Controller/WhishlistController.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace App\Controller;
+
+use App\Entity\Wishlist;
+use App\Form\WishlistType;
+use App\Repository\WishlistRepository;
+use Doctrine\ORM\EntityManagerInterface;
+use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Routing\Attribute\Route;
+
+#[Route('/whishlist')]
+final class WhishlistController extends AbstractController
+{
+    #[Route(name: 'app_whishlist_index', methods: ['GET'])]
+    public function index(WishlistRepository $wishlistRepository): Response
+    {
+        return $this->render('whishlist/index.html.twig', [
+            'wishlists' => $wishlistRepository->findAll(),
+        ]);
+    }
+
+    #[Route('/new', name: 'app_whishlist_new', methods: ['GET', 'POST'])]
+    public function new(Request $request, EntityManagerInterface $entityManager): Response
+    {
+        $wishlist = new Wishlist();
+        $form = $this->createForm(WishlistType::class, $wishlist);
+        $form->handleRequest($request);
+
+        if ($form->isSubmitted() && $form->isValid()) {
+            $entityManager->persist($wishlist);
+            $entityManager->flush();
+
+            return $this->redirectToRoute('app_whishlist_index', [], Response::HTTP_SEE_OTHER);
+        }
+
+        return $this->render('whishlist/new.html.twig', [
+            'wishlist' => $wishlist,
+            'form' => $form,
+        ]);
+    }
+
+    #[Route('/{id}', name: 'app_whishlist_show', methods: ['GET'])]
+    public function show(Wishlist $wishlist): Response
+    {
+        return $this->render('whishlist/show.html.twig', [
+            'wishlist' => $wishlist,
+        ]);
+    }
+
+    #[Route('/{id}/edit', name: 'app_whishlist_edit', methods: ['GET', 'POST'])]
+    public function edit(Request $request, Wishlist $wishlist, EntityManagerInterface $entityManager): Response
+    {
+        $form = $this->createForm(WishlistType::class, $wishlist);
+        $form->handleRequest($request);
+
+        if ($form->isSubmitted() && $form->isValid()) {
+            $entityManager->flush();
+
+            return $this->redirectToRoute('app_whishlist_index', [], Response::HTTP_SEE_OTHER);
+        }
+
+        return $this->render('whishlist/edit.html.twig', [
+            'wishlist' => $wishlist,
+            'form' => $form,
+        ]);
+    }
+
+    #[Route('/{id}', name: 'app_whishlist_delete', methods: ['POST'])]
+    public function delete(Request $request, Wishlist $wishlist, EntityManagerInterface $entityManager): Response
+    {
+        if ($this->isCsrfTokenValid('delete'.$wishlist->getId(), $request->getPayload()->getString('_token'))) {
+            $entityManager->remove($wishlist);
+            $entityManager->flush();
+        }
+
+        return $this->redirectToRoute('app_whishlist_index', [], Response::HTTP_SEE_OTHER);
+    }
+}
diff --git a/src/Form/WishlistType.php b/src/Form/WishlistType.php
new file mode 100644
index 00000000..645c6caa
--- /dev/null
+++ b/src/Form/WishlistType.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Form;
+
+use App\Entity\Wishlist;
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+class WishlistType extends AbstractType
+{
+    public function buildForm(FormBuilderInterface $builder, array $options): void
+    {
+        $builder
+            ->add('name')
+            ->add('deadline', null, [
+                'widget' => 'single_text',
+            ])
+            ->add('isDisabled')
+        ;
+    }
+
+    public function configureOptions(OptionsResolver $resolver): void
+    {
+        $resolver->setDefaults([
+            'data_class' => Wishlist::class,
+        ]);
+    }
+}
diff --git a/templates/whishlist/_delete_form.html.twig b/templates/whishlist/_delete_form.html.twig
new file mode 100644
index 00000000..f5360a00
--- /dev/null
+++ b/templates/whishlist/_delete_form.html.twig
@@ -0,0 +1,4 @@
+<form method="post" action="{{ path('app_whishlist_delete', {'id': wishlist.id}) }}" onsubmit="return confirm('Are you sure you want to delete this item?');">
+    <input type="hidden" name="_token" value="{{ csrf_token('delete' ~ wishlist.id) }}">
+    <button class="btn">Delete</button>
+</form>
diff --git a/templates/whishlist/_form.html.twig b/templates/whishlist/_form.html.twig
new file mode 100644
index 00000000..bf20b98f
--- /dev/null
+++ b/templates/whishlist/_form.html.twig
@@ -0,0 +1,4 @@
+{{ form_start(form) }}
+    {{ form_widget(form) }}
+    <button class="btn">{{ button_label|default('Save') }}</button>
+{{ form_end(form) }}
diff --git a/templates/whishlist/edit.html.twig b/templates/whishlist/edit.html.twig
new file mode 100644
index 00000000..9544c2b2
--- /dev/null
+++ b/templates/whishlist/edit.html.twig
@@ -0,0 +1,13 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}Edit Wishlist{% endblock %}
+
+{% block body %}
+    <h1>Edit Wishlist</h1>
+
+    {{ include('whishlist/_form.html.twig', {'button_label': 'Update'}) }}
+
+    <a href="{{ path('app_whishlist_index') }}">back to list</a>
+
+    {{ include('whishlist/_delete_form.html.twig') }}
+{% endblock %}
diff --git a/templates/whishlist/index.html.twig b/templates/whishlist/index.html.twig
new file mode 100644
index 00000000..60cac94a
--- /dev/null
+++ b/templates/whishlist/index.html.twig
@@ -0,0 +1,39 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}Wishlist index{% endblock %}
+
+{% block body %}
+    <h1>Wishlist index</h1>
+
+    <table class="table">
+        <thead>
+            <tr>
+                <th>Id</th>
+                <th>Name</th>
+                <th>Deadline</th>
+                <th>IsDisabled</th>
+                <th>actions</th>
+            </tr>
+        </thead>
+        <tbody>
+        {% for wishlist in wishlists %}
+            <tr>
+                <td>{{ wishlist.id }}</td>
+                <td>{{ wishlist.name }}</td>
+                <td>{{ wishlist.deadline ? wishlist.deadline|date('Y-m-d H:i:s') : '' }}</td>
+                <td>{{ wishlist.isDisabled ? 'Yes' : 'No' }}</td>
+                <td>
+                    <a href="{{ path('app_whishlist_show', {'id': wishlist.id}) }}">show</a>
+                    <a href="{{ path('app_whishlist_edit', {'id': wishlist.id}) }}">edit</a>
+                </td>
+            </tr>
+        {% else %}
+            <tr>
+                <td colspan="5">no records found</td>
+            </tr>
+        {% endfor %}
+        </tbody>
+    </table>
+
+    <a href="{{ path('app_whishlist_new') }}">Create new</a>
+{% endblock %}
diff --git a/templates/whishlist/new.html.twig b/templates/whishlist/new.html.twig
new file mode 100644
index 00000000..3bbb2c1f
--- /dev/null
+++ b/templates/whishlist/new.html.twig
@@ -0,0 +1,11 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}New Wishlist{% endblock %}
+
+{% block body %}
+    <h1>Create new Wishlist</h1>
+
+    {{ include('whishlist/_form.html.twig') }}
+
+    <a href="{{ path('app_whishlist_index') }}">back to list</a>
+{% endblock %}
diff --git a/templates/whishlist/show.html.twig b/templates/whishlist/show.html.twig
new file mode 100644
index 00000000..3d74ac9f
--- /dev/null
+++ b/templates/whishlist/show.html.twig
@@ -0,0 +1,34 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}Wishlist{% endblock %}
+
+{% block body %}
+    <h1>Wishlist</h1>
+
+    <table class="table">
+        <tbody>
+            <tr>
+                <th>Id</th>
+                <td>{{ wishlist.id }}</td>
+            </tr>
+            <tr>
+                <th>Name</th>
+                <td>{{ wishlist.name }}</td>
+            </tr>
+            <tr>
+                <th>Deadline</th>
+                <td>{{ wishlist.deadline ? wishlist.deadline|date('Y-m-d H:i:s') : '' }}</td>
+            </tr>
+            <tr>
+                <th>IsDisabled</th>
+                <td>{{ wishlist.isDisabled ? 'Yes' : 'No' }}</td>
+            </tr>
+        </tbody>
+    </table>
+
+    <a href="{{ path('app_whishlist_index') }}">back to list</a>
+
+    <a href="{{ path('app_whishlist_edit', {'id': wishlist.id}) }}">edit</a>
+
+    {{ include('whishlist/_delete_form.html.twig') }}
+{% endblock %}
-- 
GitLab