فهرست منبع

corrections sur le planning

garthh 2 روز پیش
والد
کامیت
85f7f0ba5a

+ 20 - 6
assets/styles/app.css

@@ -86,13 +86,12 @@ body.is-dark-mode .planning-cell {
   display: flex;
   align-items: center;
   justify-content: center;
-  height: 3rem;
+  height: 4rem;
   padding: 0.5rem;
   box-sizing: border-box;
   overflow: hidden;
   white-space: nowrap;
   text-overflow: ellipsis;
-  text-align: center;
   /*background-color: #ffffff;*/
   font-size: 0.95rem;
   transition: background-color 0.2s ease;
@@ -153,8 +152,9 @@ body.is-dark-mode .planning-cell {
 }
 
 .planning-cell-game {
-  border: none;
-  width: 98%;
+  border: solid 0.2rem transparent;
+  background-color: transparent;
+  width: 100%;
   color: black;
   position: absolute;
   top: 0rem;
@@ -171,5 +171,19 @@ body.is-dark-mode .planning-cell {
 }
 
 .planning-cell-game .card {
-  border-left: 3px solid blue;
-}
+  /*border-left: solid 0.2rem blue;
+  border-top: solid 0.2rem blue;*/
+  background-color: hsl(204, 70%, 96%);
+  padding: 0.2rem;
+  overflow: hidden;
+}
+
+.planning-cell-game .card-header {
+  border: none;
+  box-shadow: none;
+}
+
+.planning-cell-game img {
+  border: 1px solid white;
+}
+

+ 28 - 16
src/Controller/PartyController.php

@@ -31,16 +31,18 @@ final class PartyController extends AbstractController
         ]);
     }
 
-    #[Route('/party/delete/{id}', name: 'app_party_delete', requirements: ['id' => '\d+'], methods: ['GET'])]
+    // supprimer une partie
+    #[Route('/party/delete/{id}', name: 'app_party_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
     public function delete(?Party $party, EntityManager $manager, SlotRepository $slotRepository): Response
     {
-        // Seuls gestionnaires (MANAGER), admin (ADMIN)
+        // Seuls admin (ADMIN)
         $user = $this->getUser();
-        if (!in_array('ROLE_ADMIN', $roles) && !in_array('ROLE_MANAGER', $roles)) {}
+        if (!in_array('ROLE_ADMIN', $roles)) {}
 
     }
 
-    #[Route('/party/validate/{id}', name: 'app_party_delete', requirements: ['id' => '\d+'], methods: ['GET'])]
+    // valider une partie proposée par un MJ
+    #[Route('/party/validate/{id}', name: 'app_party_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
     public function validate(?Party $party, EntityManager $manager, SlotRepository $slotRepository): Response
     {
         // Seuls gestionnaires (MANAGER), admin (ADMIN)
@@ -49,6 +51,10 @@ final class PartyController extends AbstractController
             
     }
 
+    // modifier une partie
+
+
+    // ajouter une partie
     #[Route('/party/add/{id}', name: 'app_party_add', requirements: ['id' => '\d+'], methods: ['GET','POST'])]
     public function add(?Slot $slot, Request $request, SlotRepository $slotRepository, GamemasterRepository $gamemasterRepository, GameRepository $gameRepository, EntityManagerInterface $manager): Response
     {
@@ -86,29 +92,35 @@ final class PartyController extends AbstractController
 
         $form->handleRequest($request);
         if ($form->isSubmitted() && $form->isValid()) {
+
             // Ajouter les slots séléctionnés
             $slotsString = $request->request->get('party_slots');
             $gamemasterSelectedId = $request->request->get('party_gamemaster');
             $gamemasterSelected = $gamemasterRepository->findByStrID($gamemasterSelectedId);
             $gameSelectedId = $request->request->get('party_game');
             $gameSelected = $gameRepository->findByStrID($gameSelectedId);
-            $new_slots = explode("|", $slotsString);
-            foreach($new_slots as $add_this_slot) {
-                $add_this_slot_obj = $slotRepository->findById($add_this_slot);
-                $party->addSlot($add_this_slot_obj);
-            }
-            $party->setStartOn(clone $party->getSlots()[0]->getStartOn());
-            $party->setEndOn(clone $party->getSlots()->last()->getEndOn());
 
+            if ($gameSelected && $gamemasterSelected) {
+                $new_slots = explode("|", $slotsString);
+                foreach($new_slots as $add_this_slot) {
+                    $add_this_slot_obj = $slotRepository->findById($add_this_slot);
+                    $party->addSlot($add_this_slot_obj);
+                }
+                $party->setStartOn(clone $party->getSlots()[0]->getStartOn());
+                $party->setEndOn(clone $party->getSlots()->last()->getEndOn());
 
 
-            $party->setGamemaster($gamemasterSelected);
-            $party->setGame($gameSelected);
 
-            $manager->persist($party);
-            $manager->flush();
+                $party->setGamemaster($gamemasterSelected);
+                $party->setGame($gameSelected);
 
-            $this->addFlash('success', 'Partie ajoutée au planning');
+                $manager->persist($party);
+                $manager->flush();
+
+                $this->addFlash('success', 'Partie ajoutée au planning.');
+            } else {
+                $this->addFlash('danger', 'Pas de MJ ou de jeu sélectionné.');
+            }
             return $this->redirectToRoute('app_main'); // @todo: à modifier !
 
         }

+ 5 - 0
src/Entity/Slot.php

@@ -107,6 +107,11 @@ class Slot
         return $this->unavailable;
     }
 
+    public function isAvailable(): ?bool
+    {
+        return !$this->unavailable;
+    }
+
     public function setUnavailable(?bool $unavailable): static
     {
         $this->unavailable = $unavailable;

+ 12 - 1
templates/admin/event/config/index.html.twig

@@ -56,7 +56,7 @@
             <div class="level-item has-text-centered">
               {% if event.getSlots()|length > 0 %}
               <div>
-                <p class="title">{{ event.getSlots()|length }}</p>
+                <p class="title">{{ event.getSlots()|filter(slot => slot.isAvailable())|length }}</p>
                 <p class="heading">slots</p>
                 </div>
               {% else %}
@@ -93,6 +93,17 @@
                 <p class="heading has-text-danger">Aucune partie</p>
               {% endif %}
             </div>
+            <div class="level-item has-text-centered">
+              {% if event.getSlots()|length > 0 %}
+              <div>
+                {% set tx = event.getSlots()|filter(slot => slot.getParty() is not null)|length / event.getSlots()|filter(slot => slot.isAvailable())|length * 100 %}
+                <p class="title">{{ tx|round }}</p>
+                <p class="heading">% occupé</p>
+                </div>
+              {% else %}
+                <p class="heading has-text-danger">Aucun slot</p>
+              {% endif %}
+            </div>
           </div>
         </div>
       </div>

+ 22 - 17
templates/components/Planning.html.twig

@@ -49,28 +49,33 @@
                             {% if thisSlot == thisSlot.party.slots[0] and thisSlot.party.isValidated %}
                                 {# Premier slot d'une partie ou partie non validée #}
                                 <div class="cell planning-cell planning-cell-game-parent">
-                                    <div class="planning-cell-game" style="height: {{ thisSlot.party.slots|length * 3 }}rem !important">
+                                    <div class="planning-cell-game" style="height: {{ thisSlot.party.slots|length * 4 }}rem !important">
                                       {# Carte "jeu" DEBUT #}
-                                        <div class="card" style="height: {{ thisSlot.party.slots|length * 3 }}rem !important">
-                                            {% if pathFullSlot %}<a href="{{ path(pathFullSlot, {id: thisSlot.id}) }}">{% endif %}
+                                        <div class="card" style="height: {{ thisSlot.party.slots|length * 4 - 0.7 }}rem !important">
+                                            
                                                 <div class="card-header">
-                                                    {{ thisSlot.party.game.name }}
-                                                </div>
-                                                <div class="card-image">
-                                                    <figure class="image is-3by1">
-                                                        {% if thisSlot.party.game.picture %}
-                                                        <img src="/images/games/{{ thisSlot.party.game.picture }}"  />
-                                                        {% else %}
-                                                        <img src="/images/games/placeholder.webp"  />
-                                                        {% endif %}
-                                                    </figure>
+                                                    <div class="media">
+                                                        <div class="media-left">
+                                                            <figure class="image is-48x48">
+                                                                {% if thisSlot.party.gamemaster.picture %}
+                                                                <img class="is-rounded" src="/images/gamemasters/{{ thisSlot.party.gamemaster.picture }}"  />
+                                                                {% else %}
+                                                                <twig:ux:icon name="bi:person-fill"/>
+                                                                {% endif %}
+                                                            </figure>
+                                                        </div>
+                                                    </div>
+                                                        <div class="media-content">
+                                                            {% if pathFullSlot %}<a href="{{ path(pathFullSlot, {id: thisSlot.id}) }}">{% endif %}<span class="title is-6">{{ thisSlot.party.game.name }}</span>{% if pathFullSlot %}</a>{% endif %}<br/>
+                                                            <small class="hax-text-grey-light">@{{ thisSlot.party.gamemaster.preferedName }}</small>
+                                                        </div>
+
                                                 </div>
                                                 <div class="card-content">
-                                                    <div class="content">
-                                                    
-                                                    </div>
+                                                    <small>{{ thisSlot.party.game.description }}</small>
                                                 </div>
-                                            {% if pathFullSlot %}</a>{% endif %}
+
+                                            
                                         </div>                             
                                       {# Carte "jeu" FIN #}
                                     </div>