Просмотр исходного кода

sélection des jeux pour un événement

garthh 3 недель назад
Родитель
Сommit
9222b68eae

+ 69 - 0
assets/controllers/game_toggle_controller.js

@@ -0,0 +1,69 @@
+import { Controller } from '@hotwired/stimulus';
+
+export default class extends Controller {
+  static values = {
+    eventId: String,       // UUIDv7 de l'événement
+    gameId: String   // UUIDv7 du jeu
+  }
+
+  connect() {
+    console.log("Stimulus: toggle game actif");
+    this.element.addEventListener('click', this.toggleGame.bind(this));
+  }
+
+  async toggleGame(event) {
+    event.preventDefault();
+
+    const eventId = this.eventIdValue;
+    const gameId = this.gameIdValue;
+
+    if (!eventId || !gameId) {
+      console.error("UUID manquant pour event ou game");
+      return;
+    }
+
+    const url = `/admin/event/${eventId}/configure/game/toggle/`;
+    console.log(gameId);
+
+    try {
+      const response = await fetch(url, {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+          'X-Requested-With': 'XMLHttpRequest',
+          //'X-CSRF-TOKEN': this.getCsrfToken() TODO: remettre en place si néccesaire ?
+        },
+        body: JSON.stringify({ gameId: gameId })
+      });
+
+      if (!response.ok) {
+        console.error("Erreur HTTP :", response.status);
+        return;
+      }
+
+      const data = await response.json();
+      const cell = this.element;
+
+      if (!cell) {
+        console.error("Élément <div> introuvable");
+        return;
+      }
+
+      if (data.status === "DISABLE") {
+        cell.classList.add('is-div-disabled');
+      } else if (data.status === "ENABLE") {
+        cell.classList.remove('is-div-disabled');
+      } else {
+        console.warn("Statut de réponse inattendu :", data.status);
+      }
+
+    } catch (error) {
+      console.error("Erreur réseau :", error);
+    }
+  }
+
+  getCsrfToken() {
+    const token = document.querySelector('meta[name="csrf-token"]');
+    return token ? token.content : '';
+  }
+}

+ 5 - 7
assets/controllers/gamemaster-toggle_controller.js

@@ -31,7 +31,7 @@ export default class extends Controller {
         headers: {
           'Content-Type': 'application/json',
           'X-Requested-With': 'XMLHttpRequest',
-          //'X-CSRF-TOKEN': this.getCsrfToken()
+          //'X-CSRF-TOKEN': this.getCsrfToken() TODO: remettre en place si néccesaire ?
         },
         body: JSON.stringify({ gamemasterId: gamemasterId })
       });
@@ -42,19 +42,17 @@ export default class extends Controller {
       }
 
       const data = await response.json();
-      const article = this.element.querySelector('article.media');
+      const cell = this.element;
 
-      if (!article) {
+      if (!cell) {
         console.error("Élément <article> introuvable");
         return;
       }
 
       if (data.status === "DISABLE") {
-        article.style.filter = "grayscale(1)";
-        article.style.opacity = "0.3";
+        cell.classList.add('is-div-disabled');
       } else if (data.status === "ENABLE") {
-        article.style.filter = "none";
-        article.style.opacity = "1";
+        cell.classList.remove('is-div-disabled');
       } else {
         console.warn("Statut de réponse inattendu :", data.status);
       }

+ 5 - 0
assets/styles/app.css

@@ -43,6 +43,10 @@
   margin-bottom: 100vh;
 }
 
+.is-div-disabled {
+    filter: grayscale(1) opacity(0.3);
+}
+
 /* Styles pour les plannings */
 
 /* Style par défaut pour les cellules
@@ -97,6 +101,7 @@
 
 
 
+
 /* Base styles for all planning cells */
 
 :root {

+ 1 - 0
config/packages/routing.yaml

@@ -3,6 +3,7 @@ framework:
         # Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
         # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
         #default_uri: http://localhost
+        default_uri: '%env(APP_URL)%'
 
 when@prod:
     framework:

+ 42 - 1
src/Controller/Admin/EventConfig/GameController.php

@@ -5,6 +5,7 @@ namespace App\Controller\Admin\EventConfig;
 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\Routing\Requirement\Requirement;
 use Symfony\Component\Routing\Attribute\Route;
 use Doctrine\ORM\EntityManagerInterface;
@@ -24,17 +25,57 @@ final class GameController extends AbstractController
         // lister tous les jeux de tous les MJ pour trouver ceux qui ne sont pas assignés
         foreach($event->getGamemastersAssigned() as $gamemaster) {
             foreach($gamemaster->getGamesCanMaster() as $game) {
+                // Si le jeu n'est pas dans les jeux joués
                 if (!in_array($game, $gamesPlayed->toArray())) {
-                    $gamesNotPlayed[] = $game;
+                    // et s'il n'est pas déjà dans les jeux pas joués
+                    if (!in_array($game, $gamesNotPlayed)) {
+                        $gamesNotPlayed[] = $game;
+                    }
                 }
             }
         }
 
+        $allGames = array_merge($gamesPlayed->toArray(), $gamesNotPlayed);
+
         return $this->render('admin/event/config/game.html.twig', [
             'gamesPlayed' => $gamesPlayed,
             'gamesNotPlayed' => $gamesNotPlayed,
+            'allGames' => $allGames,
             'event' => $event,
         ]);
     }
 
+    #[Route('/admin/event/{id}/configure/game/toggle/', name: 'app_admin_event_config_game_toggle', requirements: ['id' => Requirement::UUID_V7], methods: ['POST'])]
+    public function toggle(?Event $event, Request $request, GameRepository $repository, EntityManagerInterface $entityManager): JsonResponse
+    {
+        // Récupération du MJ
+        $data = json_decode($request->getContent(), true);
+        $gameID = $data['gameId'] ?? null;
+        if (!$gameID) {
+            return new JsonResponse(['success' => false]);
+        }
+        $game = $repository->findByStrID($gameID);
+        
+        if (in_array($game, $event->getGameAssigned()->toArray()))
+        {
+            // Enlever le jeu de la liste
+            $event->removeGameAssigned($game);
+            // marquer la réponse
+            $state='DISABLE';
+
+        } else {
+            // Ajouter le jeu à la liste
+            $event->addGameAssigned($game);
+            // Ajouter les jeux spécifiques à ce MJ dans les jeux de l'événement
+            // marquer la réponse
+            $state='ENABLE';
+
+        }
+        $entityManager->persist($event);
+        $entityManager->flush();
+
+        return new JsonResponse(['success' => true, 'status' => $state]);
+
+    }
+
 }

+ 3 - 2
src/Controller/Admin/EventConfig/GamemasterController.php

@@ -61,11 +61,12 @@ final class GamemasterController extends AbstractController
             // Ajouter le MJ à la liste
             $event->addGamemastersAssigned($gamemaster);
             // Ajouter les jeux spécifiques à ce MJ dans les jeux de l'événement
-            foreach($gamemaster->getGamesCanMaster() as $game) {
+            // Désactivé le 08/08/2025 -> géré dans JS jeux
+            /*foreach($gamemaster->getGamesCanMaster() as $game) {
                 if (!in_array($game, $event->getGameAssigned()->toArray())) {
                     $event->addGameAssigned($game);
                 }
-            }
+            }*/
             // marquer la réponse
             $state='ENABLE';
 

+ 5 - 47
templates/admin/event/config/game.html.twig

@@ -42,14 +42,14 @@
           </article>
     {% else %}
       <div class="content">
-        <h3 class="title is-3">Assignez les jeux</h3>
-        <p>Cliquez sur les jeux à supprimer de cet événement.  <em class="has-text-danger">Fonctionnalité en cours de développement.</em></p>
+        <h3 class="title is-3">Jeux proposés</h3>
+        <p>Seuls les jeux colorisés seront proposés pour cet événement. Cliquez sur les jeux pour les ajouter ou les supprimer aux jeux proposés.</p>
       </div>
-      <div class="fixed-grid has-6-cols-fullhd has-6-cols-widescreen has-4-cols-desktop has-4-cols-tablet has-2-cols-mobile">
+      <div class="fixed-grid has-6-cols-fullhd has-4-cols-widescreen has-4-cols-desktop has-4-cols-tablet has-2-cols-mobile">
         <div class="grid is-col-min-12">
-          {% for game in gamesPlayed %}
+          {% for game in allGames %}
 
-          <div class="cell">
+          <div class="cell {% if game in gamesNotPlayed %}is-div-disabled{% endif %}" data-game-toggle-game-id-value="{{ game.id }}" data-game-toggle-event-id-value="{{ event.id}}" {{ stimulus_controller('game-toggle') }}>
             
             <div class="card">
               <div class="card-image">
@@ -81,48 +81,6 @@
         </div>
       </div>
 
-            <div class="content">
-        <h3 class="title is-3">Autres jeux disponibles</h3>
-        <p>Cliquez sur les jeux à ajouter à cet événement.  <em class="has-text-danger">Fonctionnalité en cours de développement.</em></p>
-      </div>
-
-      <div class="grid is-col-min-12">
-        {% for game in gamesNotPlayed %}
-
-        <div class="cell">
-          
-          <div class="card">
-            <div class="card-image">
-            <figure class="image is-3by1">
-
-                {% if game.picture %}
-                <img src="/images/games/{{ game.picture }}"  />
-                {% else %}
-                <img src="/images/games/placeholder.webp"  />
-                {% endif %}
-
-            </figure>
-            </div>
-            <div class="card-content">
-              <div class="content text-limit-height">
-                <p>
-                  <strong>{{ game.name }}</strong>
-                  <br/>
-                  {% for genre in game.genre %}<span class="tag is-info is-light">{{ genre.genre }}</span> {% endfor %}
-                  
-                  
-                </p>
-              </div>
-            </div>
-          </div>
-          
-        </div>
-        {% endfor %}
-      </div>
-
-
-
-
     {% endif %}
  
     </div>

+ 2 - 2
templates/admin/event/config/gamemaster.html.twig

@@ -40,8 +40,8 @@
         {% for gamemaster in gamemasters %}
 
         <div class="cell">
-          <div class="box" data-gamemaster-toggle-gamemaster-id-value="{{ gamemaster.id }}" data-gamemaster-toggle-event-id-value="{{ event.id }}" {{ stimulus_controller('gamemaster-toggle') }}>
-          <article class="media"{% if gamemaster not in event.getGamemastersAssigned %} style="filter:grayscale(1) opacity(0.3);"{% endif %}>
+          <div class="box {% if gamemaster not in event.getGamemastersAssigned %} is-div-disabled{% endif %}" data-gamemaster-toggle-gamemaster-id-value="{{ gamemaster.id }}" data-gamemaster-toggle-event-id-value="{{ event.id }}" {{ stimulus_controller('gamemaster-toggle') }}>
+          <article class="media">
             <figure class="media-left">
               <p class="image is-64x64">
                 {% if gamemaster.picture %}