]> Raphaël G. Git Repositories - airbundle/commitdiff
Add new location controller
authorRaphaël Gertz <git@rapsys.eu>
Wed, 27 Nov 2019 01:09:43 +0000 (02:09 +0100)
committerRaphaël Gertz <git@rapsys.eu>
Wed, 27 Nov 2019 01:10:50 +0000 (02:10 +0100)
Add location index template
Add defulat policy template

Controller/LocationController.php [new file with mode: 0644]
Resources/views/default/policy.html.twig [new file with mode: 0644]
Resources/views/location/index.html.twig [new file with mode: 0644]

diff --git a/Controller/LocationController.php b/Controller/LocationController.php
new file mode 100644 (file)
index 0000000..e692ade
--- /dev/null
@@ -0,0 +1,231 @@
+<?php
+
+namespace Rapsys\AirBundle\Controller;
+
+use Symfony\Component\HttpFoundation\Request;
+
+class LocationController extends DefaultController {
+
+       public function index(Request $request = null) {
+               $title = 'title';
+               $section = 'section';
+               $calendar = 'toto';
+               //Create the form according to the FormType created previously.
+               //And give the proper parameters
+               $form = $this->createForm('Rapsys\AirBundle\Form\ApplicationType', null, [
+                       // To set the action use $this->generateUrl('route_identifier')
+                       'action' => $this->generateUrl('rapsys_air_location'),
+                       'method' => 'POST',
+                       'attr' => [ 'class' => 'form_col' ]
+               ]);
+               return $this->render('@RapsysAir/location/index.html.twig', ['title' => $title, 'section' => $section, 'form' => $form->createView(), 'calendar' => $calendar]+$this->context);
+       }
+
+       public function show(Request $request, $id) {
+       }
+
+       public function toto(Request $request) {
+               //Prevent non-admin to access here
+               $this->denyAccessUnlessGranted('ROLE_GUEST', null, 'Unable to access this page without ROLE_GUEST!');
+
+               //Set section
+               $section = $this->translator->trans('Admin');
+
+               //Set title
+               $title = $section.' - '.$this->translator->trans($this->config['site']['title']);
+
+               header('Content-Type: text/plain');
+               var_dump('TODO');
+               exit;
+               //Create the form according to the FormType created previously.
+               //And give the proper parameters
+               $form = $this->createForm('Rapsys\AirBundle\Form\ApplicationType', null, [
+                       // To set the action use $this->generateUrl('route_identifier')
+                       'action' => $this->generateUrl('rapsys_air_admin'),
+                       'method' => 'POST',
+                       'attr' => [ 'class' => 'form_col' ]
+               ]);
+
+               //Get doctrine
+               $doctrine = $this->getDoctrine();
+
+               //Handle request
+               if ($request->isMethod('POST')) {
+                       // Refill the fields in case the form is not valid.
+                       $form->handleRequest($request);
+
+                       if ($form->isValid()) {
+                               //Get data
+                               $data = $form->getData();
+
+                               //Get manager
+                               $manager = $doctrine->getManager();
+
+                               //Protect session fetching
+                               try {
+                                       $session = $doctrine->getRepository(Session::class)->findOneByLocationSlotDate($data['location'], $data['slot'], $data['date']);
+                               //Catch no session case
+                               } catch (\Doctrine\ORM\NoResultException $e) {
+                                       //Create the session
+                                       $session = new Session();
+                                       $session->setLocation($data['location']);
+                                       $session->setSlot($data['slot']);
+                                       $session->setDate($data['date']);
+                                       $session->setCreated(new \DateTime('now'));
+                                       $session->setUpdated(new \DateTime('now'));
+                                       $manager->persist($session);
+                                       //Flush to get the ids
+                                       #$manager->flush();
+                               }
+
+                               //Init application
+                               $application = false;
+
+                               //Protect application fetching
+                               try {
+                                       //TODO: handle admin case where we provide a user in extra
+                                       $application = $doctrine->getRepository(Application::class)->findOneBySessionUser($session, $this->getUser());
+
+                                       //Add error message to mail field
+                                       $form->get('slot')->addError(new FormError($this->translator->trans('Application already exists')));
+                               //Catch no application cases
+                               //XXX: combine these catch when php 7.1 is available
+                               } catch (\Doctrine\ORM\NoResultException $e) {
+                               //Catch invalid argument because session is not already persisted
+                               } catch(\Doctrine\ORM\ORMInvalidArgumentException $e) {
+                               }
+
+                               //Create new application if none found
+                               if (!$application) {
+                                       //Create the application
+                                       $application = new Application();
+                                       $application->setSession($session);
+                                       //TODO: handle admin case where we provide a user in extra
+                                       $application->setUser($this->getUser());
+                                       $application->setCreated(new \DateTime('now'));
+                                       $application->setUpdated(new \DateTime('now'));
+                                       $manager->persist($application);
+
+                                       //Flush to get the ids
+                                       $manager->flush();
+
+                                       //Add notice in flash message
+                                       $this->addFlash('notice', $this->translator->trans('Application request the %date% for %location% on the slot %slot% saved', ['%location%' => $data['location']->getTitle(), '%slot%' => $data['slot']->getTitle(), '%date%' => $data['date']->format('Y-m-d')]));
+
+                                       //Redirect to cleanup the form
+                                       return $this->redirectToRoute('rapsys_air_admin');
+                               }
+                       }
+               }
+
+               //Compute period
+               $period = new \DatePeriod(
+                       //Start from first monday of week
+                       new \DateTime('Monday this week'),
+                       //Iterate on each day
+                       new \DateInterval('P1D'),
+                       //End with next sunday and 4 weeks
+                       new \DateTime('Monday this week + 5 week')
+               );
+
+               //Fetch sessions
+               $sessions = $doctrine->getRepository(Session::class)->findByDatePeriod($period);
+
+               //Init calendar
+               $calendar = [];
+               
+               //Init month
+               $month = null;
+
+               //Iterate on each day
+               foreach($period as $date) {
+                       //Init day in calendar
+                       $calendar[$Ymd = $date->format('Ymd')] = [
+                               'title' => $date->format('d'),
+                               'class' => [],
+                               'sessions' => []
+                       ];
+                       //Append month for first day of month
+                       if ($month != $date->format('m')) {
+                               $month = $date->format('m');
+                               $calendar[$Ymd]['title'] .= '/'.$month;
+                       }
+                       //Deal with today
+                       if ($date->format('U') == ($today = strtotime('today'))) {
+                               $calendar[$Ymd]['title'] .= '/'.$month;
+                               $calendar[$Ymd]['current'] = true;
+                               $calendar[$Ymd]['class'][] =  'current';
+                       }
+                       //Disable passed days
+                       if ($date->format('U') < $today) {
+                               $calendar[$Ymd]['disabled'] = true;
+                               $calendar[$Ymd]['class'][] =  'disabled';
+                       }
+                       //Set next month days
+                       if ($date->format('m') > date('m')) {
+                               $calendar[$Ymd]['next'] = true;
+                               $calendar[$Ymd]['class'][] =  'next';
+                       }
+                       //Iterate on each session to find the one of the day
+                       foreach($sessions as $session) {
+                               if (($sessionYmd = $session->getDate()->format('Ymd')) == $Ymd) {
+                                       //Count number of application
+                                       $count = count($session->getApplications());
+
+                                       //Compute classes
+                                       $class = [];
+                                       if ($session->getApplication()) {
+                                               $class[] = 'granted';
+                                       } elseif ($count == 0) {
+                                               $class[] = 'orphaned';
+                                       } elseif ($count > 1) {
+                                               $class[] = 'disputed';
+                                       } else {
+                                               $class[] = 'pending';
+                                       }
+
+                                       //Add the session
+                                       $calendar[$Ymd]['sessions'][$session->getSlot()->getId().$session->getLocation()->getId()] = [
+                                               'id' => $session->getId(),
+                                               'title' => ($count > 1?'['.$count.'] ':'').$session->getSlot()->getTitle().' '.$session->getLocation()->getTitle(),
+                                               'class' => $class
+                                       ];
+                               }
+                       }
+
+                       //Sort sessions
+                       ksort($calendar[$Ymd]['sessions']);
+               }
+
+               return $this->render('@RapsysAir/admin/index.html.twig', ['title' => $title, 'section' => $section, 'form' => $form->createView(), 'calendar' => $calendar]);
+       }
+
+       public function tata(Request $request, $id) {
+               /*header('Content-Type: text/plain');
+               var_dump($calendar);
+               exit;*/
+
+               //Set section
+               $section = $this->translator->trans('Session %id%', ['%id%' => $id]);
+
+               //Set title
+               $title = $section.' - '.$this->translator->trans($this->config['site']['title']);
+
+               //Create the form according to the FormType created previously.
+               //And give the proper parameters
+               /*$form = $this->createForm('Rapsys\AirBundle\Form\ApplicationType', null, [
+                       // To set the action use $this->generateUrl('route_identifier')
+                       'action' => $this->generateUrl('rapsys_air_admin'),
+                       'method' => 'POST',
+                       'attr' => [ 'class' => 'form_col' ]
+               ]);*/
+
+               //Get doctrine
+               $doctrine = $this->getDoctrine();
+
+               //Fetch session
+               $session = $doctrine->getRepository(Session::class)->findOneById($id);
+
+               return $this->render('@RapsysAir/admin/session.html.twig', ['title' => $title, 'section' => $section, /*'form' => $form->createView(),*/ 'session' => $session]);
+       }
+}
diff --git a/Resources/views/default/policy.html.twig b/Resources/views/default/policy.html.twig
new file mode 100644 (file)
index 0000000..0f3c3bc
--- /dev/null
@@ -0,0 +1,87 @@
+{% extends '@RapsysAir/body.html.twig' %}
+{% block content %}
+       <section id="policy">
+               <h2><a href="{{ path('rapsys_air_index') }}">{{ section }}</a></h2>
+               <section>
+                       <h3>Guest</h3>
+                       <section class="panel">
+                               <h4>Prerequisite</h4>
+                               <dl class="grid">
+                                       <dt>Who</dt>
+                                       <dd>Anyone</dd>
+                               </dl>
+                               <dl class="grid">
+                                       <dt>Residence</dt>
+                                       <dd>Anywhere</dt>
+                               </dl>
+                               <dl class="grid">
+                                       <dt>Skill</dt>
+                                       <dd>Basic tango ballroom organisation</dd>
+                                       <dd>Basic tango music programming</dd>
+                                       <dd>Basic french communication</dd>
+                               </dl>
+                       </section>
+                       <section>
+                               <h4>Hardware</h4>
+                               <dl>
+                                       <dt>Music</dt>
+                                       <dd></dd>
+                               </dl>
+                               <p>
+                                       Matériel à prévoir :
+                                       - Une sono de 200W (Ibiza 8) ou suppérieure
+                                       - Un lecteur avec 4h d'autonomie (téléphone/baladeur)
+                                       - Câble
+                                       - Flacon de talc
+                                       - Corde
+                                       - Balais selon le lieu
+
+                                       Préparation à remplir :
+                                       - Une liste de lecture de 4h déconnectée
+                                       - Assister un dj pour une soirée sur place
+                                       - Répétition générale à la maison
+
+                                       Les limitations :
+                                       - première soirée sur low spot en semaine
+                                       - représentation unique à Opéra en semaine
+                               </p>
+                       </section>
+               </section>
+               <section>
+               <h3>Regular</h3>
+               <p>
+                       Les conditions à remplir :
+                       - Une sono de 250W (Ibiza 10) ou suppérieure
+                       - Un lecteur avec 6h d'autonomie (téléphone/baladeur)
+                       - Câble
+                       - Flacon de talc
+                       - Corde avec fanions
+                       - Balais
+
+                       Préparation à remplir :
+                       - Une liste de lecture de 6h déconnectée
+                       - Un renouvellement une fois par mois de la liste de lecture
+                       - Avoir assisté un dj pour une soirée sur place
+                       - Avoir fait une répétition générale à la maison
+
+                       Les limitations :
+                       - première soirée sur low spot
+                       - représentation à Opéra en semaine
+               </p>
+               </section>
+               <section>
+               <h3>Senior</h3>
+               <p>
+
+                       - Une playlist hors ligne (mise à jour tous les mois)
+                       - Un système de lecture de musique (
+                       - Une sono de 200W (Ibiza 8) ou suppérieure
+
+                       Les limitations :
+                       - répétition sur un low spot préalable
+                       - représentation unique à Opéra
+               </p>
+               </section>
+               <p>{{ 'Welcome to the outdoor space reservation system'|trans }}</p>
+       </section>
+{% endblock %}
diff --git a/Resources/views/location/index.html.twig b/Resources/views/location/index.html.twig
new file mode 100644 (file)
index 0000000..5863c76
--- /dev/null
@@ -0,0 +1,58 @@
+{% extends '@RapsysAir/body.html.twig' %}
+{% block content %}
+<section id="dashboard">
+TODO:
+       <h2>{% trans %}Dashboard{% endtrans %}</h2>
+       <div class="panel">
+               {% if calendar is defined and calendar %}
+                       <table class="grid">
+                               <tbody>
+                                       <tr>
+                                               {% for date, day in calendar %}
+                                                       <td class="{{ ['cell', 'seventh']|merge(day.class)|join(' ') }}">
+                                                               <h3>{{ day.title }}</h3>
+                                                               {% if day.sessions is not empty %}
+                                                                       <ul>
+                                                                               {% for session in day.sessions %}
+                                                                                       <li class="{{ ['session']|merge(session.class)|join(' ') }}">
+                                                                                               <a href="{{ path('rapsys_air_session', {'id': session.id}) }}" title="{{ session.title }}">{{ session.title }}</a>
+                                                                                       </li>
+                                                                               {% endfor %}
+                                                                       </ul>
+                                                               {% endif %}
+                                                       </td>
+                                                       {% if loop.index % 7 == 0 and not loop.last %}
+                                                               </tr>
+                                                               <tr>
+                                                       {% endif %}
+                                               {% endfor %}
+                                       </tr>
+                               </tbody>
+                       </table>
+               {% endif %}
+               <div>
+               {{ form_start(form) }}
+
+                       <header>{{ form_errors(form) }}</header>
+
+                       <section>
+                               {{ form_row(form.location) }}
+
+                               {{ form_row(form.date) }}
+
+                               {{ form_row(form.slot) }}
+                       </section>
+
+                       {{ form_row(form.submit) }}
+
+                       {# Render CSRF token etc .#}
+                       <footer style="display:none">
+                               {{ form_rest(form) }}
+                       </footer>
+
+               {{ form_end(form) }}
+               </div>
+       </div>
+       {# dump(calendar) #}
+</section>
+{% endblock %}