From 6916af8cd10a35322d05f2c7006e4ef78d7a21d9 Mon Sep 17 00:00:00 2001 From: Andi Date: Mon, 14 Jul 2014 19:25:54 +0200 Subject: [PATCH 01/42] genauere Installationsanweisung --- INSTALL.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index d213aec..ddbd8c1 100755 --- a/INSTALL.md +++ b/INSTALL.md @@ -10,9 +10,11 @@ Diese Anleitung geht davon aus das du SSH-Zugriff auf deinen Server hast. Wenn du Calcifer auf einem Shared-Hosting-Anbieter installieren willst, so ist dies auch möglich, aber etwas komplizierter und wird irgendwann später beschrieben. - 1. Das [Repo](https://phablab.krautspace.de/diffusion/C/calcifer.git) irgendwo hin clonen - 2. In das calcifer Verzeichnis wechseln. - 3. composer install - 4. Im Verzeichnis app/config die Datei parameters.yml.dist nach parameters.yml kopieren und anpassen. - 5. Dann die Tabellen erstellen: php app/console doctrine:schema:create - 6. Zum Schluss must du noch deinen Webserver [konfigurieren](http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html) und dann ist calcifer auch schon erreichbar. \ No newline at end of file +1. Das [Repo](https://phablab.krautspace.de/diffusion/C/calcifer.git) irgendwo hin clonen +2. In das calcifer Verzeichnis wechseln. +3. Abhängigkeiten installieren + 1. composer herunterladen ```curl -sS https://getcomposer.org/installer | php``` + 2. Installation ausführen: ```php composer.phar install``` +4. Im Verzeichnis app/config die Datei parameters.yml.dist nach parameters.yml kopieren und anpassen. +5. Dann die Tabellen erstellen: php app/console doctrine:schema:create +6. Zum Schluss must du noch deinen Webserver [konfigurieren](http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html) und dann ist calcifer auch schon erreichbar. From 12e7dafe0d5f86ae11cbc9d0a38e9ff75eb5c15b Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sat, 19 Jul 2014 09:25:09 +0200 Subject: [PATCH 02/42] Introduced a BaseEntity for more easy access to all the properties. --- .../CalciferBundle/Entity/BaseEntity.php | 58 +++++ .../Bundle/CalciferBundle/Entity/Event.php | 201 +----------------- .../Bundle/CalciferBundle/Entity/Location.php | 118 +--------- .../CalciferBundle/Entity/RepeatEvent.php | 23 ++ .../Bundle/CalciferBundle/Entity/Tag.php | 69 +----- 5 files changed, 97 insertions(+), 372 deletions(-) create mode 100755 src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php create mode 100755 src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php b/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php new file mode 100755 index 0000000..db1bf2b --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php @@ -0,0 +1,58 @@ +$name; + } else { + throw new \Exception("Property {$name} does not Exists"); + } + } + + public function __set($name,$value) { + if (property_exists($this,$name)) { + $this->$name = $value; + return $this; + } else { + throw new \Exception("Property {$name} does not Exists"); + } + } +} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php index 82dfc4e..88049ed 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php @@ -11,51 +11,42 @@ use Doctrine\ORM\PersistentCollection; * @ORM\Table(name="events") * @ORM\Entity */ -class Event +class Event extends BaseEntity { - /** - * @var integer - * - * @ORM\Column(name="id", type="integer") - * @ORM\Id - * @ORM\GeneratedValue(strategy="AUTO") - */ - private $id; - /** * @var \DateTime * * @ORM\Column(name="startdate", type="datetimetz") */ - private $startdate; + protected $startdate; /** * @var \DateTime * * @ORM\Column(name="enddate", type="datetimetz", nullable=true) */ - private $enddate; + protected $enddate; /** * @var string * * @ORM\Column(name="summary", type="string", length=255) */ - private $summary; + protected $summary; /** * @var string * * @ORM\Column(name="description", type="text", nullable=true) */ - private $description; + protected $description; /** * @var string * * @ORM\Column(name="locations_id", type="integer", nullable=true) */ - private $locations_id; + protected $locations_id; /** * @var Location @@ -63,14 +54,14 @@ class Event * @ORM\ManyToOne(targetEntity="Location") * @ORM\JoinColumn(name="locations_id", referencedColumnName="id") */ - private $location; + protected $location; /** * @var string * * @ORM\Column(name="url", type="string", length=255, nullable=true) */ - private $url; + protected $url; /** * @var array @@ -81,179 +72,7 @@ class Event * inverseJoinColumns={@ORM\JoinColumn(name="tags_id", referencedColumnName="id")} * ) */ - private $tags = []; - - /** - * @var string - * - * @ORM\Column(name="slug", type="string", length=255,options={"default" = ""}) - */ - private $slug = ''; - - /** - * @param string $slug - */ - public function setSlug($slug) - { - $this->slug = $slug; - } - - /** - * @return string - */ - public function getSlug() - { - return $this->slug; - } - - - /** - * Get id - * - * @return integer - */ - public function getId() - { - return $this->id; - } - - /** - * Set startdate - * - * @param \DateTime $startdate - * @return Event - */ - public function setStartdate($startdate) - { - $this->startdate = $startdate; - - return $this; - } - - /** - * Get startdate - * - * @return \DateTime - */ - public function getStartdate() - { - return $this->startdate; - } - - /** - * Set enddate - * - * @param \DateTime $enddate - * @return Event - */ - public function setEnddate($enddate) - { - $this->enddate = $enddate; - - return $this; - } - - /** - * Get enddate - * - * @return \DateTime - */ - public function getEnddate() - { - return $this->enddate; - } - - /** - * Set summary - * - * @param string $summary - * @return Event - */ - public function setSummary($summary) - { - $this->summary = $summary; - - return $this; - } - - /** - * Get summary - * - * @return string - */ - public function getSummary() - { - return $this->summary; - } - - /** - * Set description - * - * @param string $description - * @return Event - */ - public function setDescription($description) - { - $this->description = $description; - - return $this; - } - - /** - * Get description - * - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * Set location - * - * @param string $locations_id - * @return Event - */ - public function setLocationsID($locations_id) - { - $this->locations_id = $locations_id; - - return $this; - } - - /** - * Get location - * - * @return string - */ - public function getLocationsID() - { - return $this->locations_id; - } - - /** - * Set url - * - * @param string $url - * @return Event - */ - public function setUrl($url) - { - $this->url = $url; - - return $this; - } - - /** - * Get url - * - * @return string - */ - public function getUrl() - { - return $this->url; - } + protected $tags = []; /** * @param \Hackspace\Bundle\CalciferBundle\Entity\Location $location @@ -303,7 +122,7 @@ class Event if (count($this->tags) > 0) { $tags = []; foreach ($this->tags as $tag) { - $tags[] = $tag->getName(); + $tags[] = $tag->name; } return implode(',',$tags); } else { diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php b/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php index 8d3b6a2..af10407 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php @@ -10,138 +10,28 @@ use Doctrine\ORM\Mapping as ORM; * @ORM\Table(name="locations") * @ORM\Entity */ -class Location +class Location extends BaseEntity { - /** - * @var integer - * - * @ORM\Column(name="id", type="integer") - * @ORM\Id - * @ORM\GeneratedValue(strategy="AUTO") - */ - private $id; - /** * @var string * * @ORM\Column(name="name", type="string", length=255) */ - private $name; + protected $name; /** * @var float * * @ORM\Column(name="lon", type="float", nullable=true) */ - private $lon; + protected $lon; /** * @var float * * @ORM\Column(name="lat", type="float", nullable=true) */ - private $lat; - - /** - * @var string - * - * @ORM\Column(name="slug", type="string", length=255,options={"default" = ""}) - */ - private $slug = ''; - - /** - * @param string $slug - */ - public function setSlug($slug) - { - $this->slug = $slug; - } - - /** - * @return string - */ - public function getSlug() - { - return $this->slug; - } + protected $lat; - /** - * Get id - * - * @return integer - */ - public function getId() - { - return $this->id; - } - - /** - * Set name - * - * @param string $name - * @return Location - */ - public function setName($name) - { - $this->name = $name; - - return $this; - } - - /** - * Get name - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Set lon - * - * @param float $lon - * @return Location - */ - public function setLon($lon) - { - $this->lon = $lon; - - return $this; - } - - /** - * Get lon - * - * @return float - */ - public function getLon() - { - return $this->lon; - } - - /** - * Set lat - * - * @param float $lat - * @return Location - */ - public function setLat($lat) - { - $this->lat = $lat; - - return $this; - } - - /** - * Get lat - * - * @return float - */ - public function getLat() - { - return $this->lat; - } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php new file mode 100755 index 0000000..aa4818d --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php @@ -0,0 +1,23 @@ +slug = $slug; - } - - /** - * @return string - */ - public function getSlug() - { - return $this->slug; - } - - /** - * Get id - * - * @return integer - */ - public function getId() - { - return $this->id; - } - - /** - * Set name - * - * @param string $name - * @return Tag - */ - public function setName($name) - { - $this->name = $name; - - return $this; - } - - /** - * Get name - * - * @return string - */ - public function getName() - { - return $this->name; - } + protected $name; } From 92a21d3b693e933ab212fb65c5bcace9346e75a0 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sat, 19 Jul 2014 09:25:51 +0200 Subject: [PATCH 03/42] Extracted a common function for insert and update to put all the stuff from the request into the entity. --- .../Controller/EventController.php | 142 ++++++------------ 1 file changed, 43 insertions(+), 99 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php index 18dd67d..fe58d16 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php @@ -59,76 +59,8 @@ class EventController extends Controller public function createAction(Request $request) { $entity = new Event(); - $entity->setDescription($request->get('description')); - $entity->setSummary($request->get('summary')); - $entity->setUrl($request->get('url')); - $startdate = $request->get('startdate'); - $startdate = new \DateTime($startdate); - $entity->setStartdate($startdate); - $entity->setSlug(\URLify::filter($entity->getSummary(),255,'de')); - $enddate = $request->get('enddate'); - if (strlen($enddate) > 0) { - $enddate = new \DateTime($enddate); - $entity->setenddate($enddate); - } - - $location = $request->get('location'); - $location_lat = $request->get('location_lat'); - $location_lon = $request->get('location_lon'); - if (strlen($location) > 0) { - // check if the location already exists - /** @var EntityManager $em */ - $em = $this->getDoctrine()->getManager(); - $repo = $em->getRepository('CalciferBundle:Location'); - $results = $repo->findBy(['name' => $location]); - if (count($results) > 0) { - $location_obj = $results[0]; - if (strlen($location_lat) > 0) { - $location_obj->setLat($location_lat); - } - if (strlen($location_lon) > 0) { - $location_obj->setLon($location_lon); - } - $em->persist($location_obj); - $em->flush(); - $entity->setLocation($results[0]); - } else { - $location_obj = new Location(); - $location_obj->setName($location); - if (strlen($location_lat) > 0) { - $location_obj->setLat($location_lat); - } - if (strlen($location_lon) > 0) { - $location_obj->setLon($location_lon); - } - $location_obj->setSlug(\URLify::filter($location_obj->getName(),255,'de')); - $em->persist($location_obj); - $em->flush(); - $entity->setLocation($location_obj); - } - } - - $tags = $request->get('tags'); - if (strlen($tags) > 0) { - $tags = explode(',',$tags); - $em = $this->getDoctrine()->getManager(); - $repo = $em->getRepository('CalciferBundle:Tag'); - foreach ($tags as $tag) { - $tag = trim($tag); - $results = $repo->findBy(['name' => $tag]); - if (count($results) > 0) { - $entity->addTag($results[0]); - } else { - $tag_obj = new Tag(); - $tag_obj->setName($tag); - $tag_obj->setSlug(\URLify::filter($tag_obj->getName(),255,'de')); - $em->persist($tag_obj); - $em->flush(); - $entity->addTag($tag_obj); - } - } - } + $em = $this->saveEvent($request, $entity); if ($entity->isValid()) { @@ -136,7 +68,7 @@ class EventController extends Controller $em->persist($entity); $em->flush(); - return $this->redirect($this->generateUrl('_show', array('slug' => $entity->getSlug()))); + return $this->redirect($this->generateUrl('_show', array('slug' => $entity->slug))); } return array( @@ -236,18 +168,42 @@ class EventController extends Controller throw $this->createNotFoundException('Unable to find Event entity.'); } - $entity->setDescription($request->get('description')); - $entity->setSummary($request->get('summary')); - $entity->setUrl($request->get('url')); + $em = $this->saveEvent($request, $entity); + + + if ($entity->isValid()) { + $em = $this->getDoctrine()->getManager(); + $em->persist($entity); + $em->flush(); + + return $this->redirect($this->generateUrl('_show', array('slug' => $entity->slug))); + } + + return array( + 'entity' => $entity, + + ); + } + + /** + * @param Request $request + * @param $entity + * @return EntityManager + */ + public function saveEvent(Request $request, Event $entity) + { + $entity->description = $request->get('description'); + $entity->summary = $request->get('summary'); + $entity->url = $request->get('url'); $startdate = $request->get('startdate'); $startdate = new \DateTime($startdate); - $entity->setStartdate($startdate); - $entity->setSlug(\URLify::filter($entity->getSummary(),255,'de')); + $entity->startdate = $startdate; + $entity->slug = \URLify::filter($entity->summary, 255, 'de'); $enddate = $request->get('enddate'); if (strlen($enddate) > 0) { $enddate = new \DateTime($enddate); - $entity->setenddate($enddate); + $entity->enddate = $enddate; } $location = $request->get('location'); @@ -262,24 +218,24 @@ class EventController extends Controller if (count($results) > 0) { $location_obj = $results[0]; if (strlen($location_lat) > 0) { - $location_obj->setLat($location_lat); + $location_obj->lat = $location_lat; } if (strlen($location_lon) > 0) { - $location_obj->setLon($location_lon); + $location_obj->lon = $location_lon; } $em->persist($location_obj); $em->flush(); $entity->setLocation($results[0]); } else { $location_obj = new Location(); - $location_obj->setName($location); + $location_obj->name = $location; if (strlen($location_lat) > 0) { - $location_obj->setLat($location_lat); + $location_obj->lat = $location_lat; } if (strlen($location_lon) > 0) { - $location_obj->setLon($location_lon); + $location_obj->lon = $location_lon; } - $location_obj->setSlug(\URLify::filter($location_obj->getName(),255,'de')); + $location_obj->slug = \URLify::filter($location_obj->name, 255, 'de'); $em->persist($location_obj); $em->flush(); $entity->setLocation($location_obj); @@ -288,7 +244,7 @@ class EventController extends Controller $tags = $request->get('tags'); if (strlen($tags) > 0) { - $tags = explode(',',$tags); + $tags = explode(',', $tags); $em = $this->getDoctrine()->getManager(); $repo = $em->getRepository('CalciferBundle:Tag'); foreach ($tags as $tag) { @@ -298,27 +254,15 @@ class EventController extends Controller $entity->addTag($results[0]); } else { $tag_obj = new Tag(); - $tag_obj->setName($tag); - $tag_obj->setSlug(\URLify::filter($tag_obj->getName(),255,'de')); + $tag_obj->name = $tag; + $tag_obj->slug = \URLify::filter($tag_obj->getName(), 255, 'de'); $em->persist($tag_obj); $em->flush(); $entity->addTag($tag_obj); } } + return $em; } - - - if ($entity->isValid()) { - $em = $this->getDoctrine()->getManager(); - $em->persist($entity); - $em->flush(); - - return $this->redirect($this->generateUrl('_show', array('slug' => $entity->getSlug()))); - } - - return array( - 'entity' => $entity, - - ); + return $em; } } From 6f0b6eabef6a2e38e597881eb1fa89cfee4a5bc9 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sat, 19 Jul 2014 09:26:54 +0200 Subject: [PATCH 04/42] Reformated the code. --- .../Resources/views/Event/event_box.html.twig | 17 +++++++++++------ .../Resources/views/Event/event_form.html.twig | 2 +- .../Resources/views/Event/show.html.twig | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig index 1bcb28d..e40664c 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig @@ -1,25 +1,31 @@
-

{{ entity.summary }} +

{{ entity.summary }}

- Bearbeiten + Bearbeiten

- {{ entity.startdate.format('Y-m-d H:i') }} + {{ entity.startdate.format('Y-m-d H:i') }}

{% if entity.location is not null %}

- {{ entity.location.name }} + {{ entity.location.name }}

{% endif %} {% if entity.tags|length > 0 %} {% endif %} @@ -37,6 +43,5 @@ {% else %}

{{ entity.description|markdown }}

{% endif %} -
\ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig index 83be9d6..f48ab4d 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig @@ -1,4 +1,4 @@ -
+
diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig index b91fabd..27728ae 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig @@ -18,6 +18,6 @@ {% block body -%}
- {{ include('CalciferBundle:Event:event_box.html.twig') }} + {{ include('CalciferBundle:Event:event_box.html.twig',{'entity' : entity}) }}
{% endblock %} From 8f66f5896597e9f848c5d4745284219c3bdb25a1 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sat, 19 Jul 2014 20:07:07 +0200 Subject: [PATCH 05/42] Finaly got the routing right. --- .../Controller/LocationController.php | 76 ++++++++---------- .../Controller/TagController.php | 78 ++++++++----------- 2 files changed, 67 insertions(+), 87 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php index 32efe75..5f614de 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php @@ -2,6 +2,7 @@ namespace Hackspace\Bundle\CalciferBundle\Controller; +use Doctrine\Common\Annotations\Annotation\Required; use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\QueryBuilder; @@ -35,11 +36,11 @@ class LocationController extends Controller /** * Finds and displays a Event entity. * - * @Route("/{slug}(?!\.ics)", name="location_show") + * @Route("/{slug}.{format}", name="location_show", defaults={"format" = "html"}) * @Method("GET") * @Template("CalciferBundle:Event:index.html.twig") */ - public function showAction($slug) + public function showAction($slug,$format) { /** @var EntityManager $em */ $em = $this->getDoctrine()->getManager(); @@ -67,52 +68,41 @@ class LocationController extends Controller ->andWhere('e.locations_id = :location') ->orderBy('e.startdate') ->setParameter('startdate',$now) - ->setParameter('location',$location->getId()); + ->setParameter('location',$location->id); $entities = $qb->getQuery()->execute(); - return array( - 'entities' => $entities, - 'location' => $location, - ); - } + if ($format == 'ics') { + $calendar = new Calendar(); + $calendar->setProdId('-//My Company//Cool Calendar App//EN'); - /** - * Finds and displays a Event entity. - * - * @Route("/{slug}\.ics", name="location_show_ics") - * @Method("GET") - */ - public function showActionICS($slug) - { - $results = $this->showAction(str_replace('.ics','',$slug)); - $entities = $results['entities']; + foreach ($entities as $entity) { + /** @var Event $entity */ + $event = new CalendarEvent(); + $event->setStart($entity->startdate); + $event->setEnd($entity->enddate); + $event->setSummary($entity->summary); + $event->setDescription($entity->description); + $location = new \Jsvrcek\ICS\Model\Description\Location(); + $location->setName($entity->getLocation()->name); + $event->setLocations([$location]); + $calendar->addEvent($event); + } - $calendar = new Calendar(); - $calendar->setProdId('-//My Company//Cool Calendar App//EN'); + $calendarExport = new CalendarExport(new CalendarStream, new Formatter()); + $calendarExport->addCalendar($calendar); - foreach($entities as $entity) { - /** @var Event $entity */ - $event = new CalendarEvent(); - $event->setStart($entity->getStartdate()); - if ($entity->getEnddate() instanceof DateTime) - $event->setEnd($entity->getEnddate()); - $event->setSummary($entity->getSummary()); - $event->setDescription($entity->getDescription()); - $location = new \Jsvrcek\ICS\Model\Description\Location(); - $location->setName($entity->getLocation()->getName()); - $event->setLocations([$location]); - $calendar->addEvent($event); + //output .ics formatted text + $result = $calendarExport->getStream(); + + $response = new Response($result); + $response->headers->set('Content-Type', 'text/calendar'); + + return $response; + } else { + return array( + 'entities' => $entities, + 'location' => $location, + ); } - - $calendarExport = new CalendarExport(new CalendarStream, new Formatter()); - $calendarExport->addCalendar($calendar); - - //output .ics formatted text - $result = $calendarExport->getStream(); - - $response = new Response($result); - $response->headers->set('Content-Type', 'text/calendar'); - - return $response; } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php index b6128d9..ce4e9a7 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php @@ -35,11 +35,11 @@ class TagController extends Controller /** * Finds and displays a Event entity. * - * @Route("/{slug}(?!\.ics)", name="tag_show") + * @Route("/{slug}.{format}", defaults={"format" = "html"}, name="tag_show") * @Method("GET") * @Template("CalciferBundle:Event:index.html.twig") */ - public function showAction($slug) + public function showAction($slug, $format) { /** @var EntityManager $em */ $em = $this->getDoctrine()->getManager(); @@ -55,60 +55,50 @@ class TagController extends Controller } $now = new \DateTime(); - $now->setTime(0,0,0); + $now->setTime(0, 0, 0); /** @var QueryBuilder $qb */ $qb = $em->createQueryBuilder(); - $qb ->select(array('e')) + $qb->select(array('e')) ->from('CalciferBundle:Event', 'e') ->join('e.tags', 't', 'WITH', $qb->expr()->in('t.id', $tag->getId())) ->where('e.startdate >= :startdate') ->orderBy('e.startdate') - ->setParameter('startdate',$now); + ->setParameter('startdate', $now); $entities = $qb->getQuery()->execute(); - return array( - 'entities' => $entities, - 'tag' => $tag, - ); - } + if ($format == 'ics') { + $calendar = new Calendar(); + $calendar->setProdId('-//My Company//Cool Calendar App//EN'); - /** - * Finds and displays a Event entity. - * - * @Route("/{slug}.ics", name="tag_show_ics") - * @Method("GET") - */ - public function showActionICS($slug) - { - $results = $this->showAction(str_replace('.ics','',$slug)); - $entities = $results['entities']; + foreach ($entities as $entity) { + /** @var Event $entity */ + $event = new CalendarEvent(); + $event->setStart($entity->startdate); + $event->setEnd($entity->enddate); + $event->setSummary($entity->summary); + $event->setDescription($entity->description); + $location = new \Jsvrcek\ICS\Model\Description\Location(); + $location->setName($entity->getLocation()->name); + $event->setLocations([$location]); + $calendar->addEvent($event); + } - $calendar = new Calendar(); - $calendar->setProdId('-//My Company//Cool Calendar App//EN'); + $calendarExport = new CalendarExport(new CalendarStream, new Formatter()); + $calendarExport->addCalendar($calendar); - foreach($entities as $entity) { - /** @var Event $entity */ - $event = new CalendarEvent(); - $event->setStart($entity->getStartdate()); - $event->setEnd($entity->getEnddate()); - $event->setSummary($entity->getSummary()); - $event->setDescription($entity->getDescription()); - $location = new \Jsvrcek\ICS\Model\Description\Location(); - $location->setName($entity->getLocation()->getName()); - $event->setLocations([$location]); - $calendar->addEvent($event); + //output .ics formatted text + $result = $calendarExport->getStream(); + + $response = new Response($result); + $response->headers->set('Content-Type', 'text/calendar'); + + return $response; + } else { + return array( + 'entities' => $entities, + 'tag' => $tag, + ); } - - $calendarExport = new CalendarExport(new CalendarStream, new Formatter()); - $calendarExport->addCalendar($calendar); - - //output .ics formatted text - $result = $calendarExport->getStream(); - - $response = new Response($result); - $response->headers->set('Content-Type', 'text/calendar'); - - return $response; } } From 881f0a7de20d66592373217c05a80db5316a529b Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 20 Jul 2014 09:49:01 +0200 Subject: [PATCH 06/42] Completed the repeating event model. --- .../CalciferBundle/Entity/RepeatEvent.php | 58 ++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php index aa4818d..ccd9e66 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php @@ -11,13 +11,67 @@ use Doctrine\ORM\PersistentCollection; * @ORM\Table(name="repeat_events") * @ORM\Entity */ -class RepeatEvent extends Event +class RepeatEvent extends BaseEntity { + /** + * @var \DateTime + * + * @ORM\Column(name="startdate", type="datetimetz") + */ + protected $nextdate; + + /** + * @var integer + * + * @ORM\Column(name="duration", type="integer", nullable=true) + */ + protected $duration; + /** * @var string * * @ORM\Column(name="name", type="string", length=255) */ - private $repeat_pattern = ''; + protected $repeat_pattern = ''; + + /** + * @var string + * + * @ORM\Column(name="summary", type="string", length=255) + */ + protected $summary; + + /** + * @var string + * + * @ORM\Column(name="description", type="text", nullable=true) + */ + protected $description; + + /** + * @var Location + * + * @ORM\ManyToOne(targetEntity="Location") + * @ORM\JoinColumn(name="locations_id", referencedColumnName="id") + */ + protected $location; + + /** + * @var string + * + * @ORM\Column(name="url", type="string", length=255, nullable=true) + */ + protected $url; + + /** + * @var array + * + * @ORM\ManyToMany(targetEntity="Tag") + * @ORM\JoinTable(name="repeat_events2tags", + * joinColumns={@ORM\JoinColumn(name="repeat_events_id", referencedColumnName="id")}, + * inverseJoinColumns={@ORM\JoinColumn(name="tags_id", referencedColumnName="id")} + * ) + */ + protected $tags = []; } \ No newline at end of file From e9f6dcfdae345e34daec52f281589218ed410e59 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 20 Jul 2014 09:49:57 +0200 Subject: [PATCH 07/42] Renamed RepeatEvent to RepeatingEvent --- .../Entity/{RepeatEvent.php => RepeatingEvent.php} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/Hackspace/Bundle/CalciferBundle/Entity/{RepeatEvent.php => RepeatingEvent.php} (93%) diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php similarity index 93% rename from src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php rename to src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php index ccd9e66..75675be 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatEvent.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php @@ -11,7 +11,7 @@ use Doctrine\ORM\PersistentCollection; * @ORM\Table(name="repeat_events") * @ORM\Entity */ -class RepeatEvent extends BaseEntity +class RepeatingEvent extends BaseEntity { /** * @var \DateTime From cbaec8676a42f3aafc6d0dd201372eec3baae525 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 22 Jul 2014 21:47:53 +0200 Subject: [PATCH 08/42] Use the magic method and not the getter. --- .../Bundle/CalciferBundle/Controller/EventController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php index fe58d16..ead80bc 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php @@ -255,7 +255,7 @@ class EventController extends Controller } else { $tag_obj = new Tag(); $tag_obj->name = $tag; - $tag_obj->slug = \URLify::filter($tag_obj->getName(), 255, 'de'); + $tag_obj->slug = \URLify::filter($tag_obj->name, 255, 'de'); $em->persist($tag_obj); $em->flush(); $entity->addTag($tag_obj); From eb3f98f06c6caa57f0f236dea72a1b680659a9aa Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 22 Jul 2014 21:49:50 +0200 Subject: [PATCH 09/42] Updated the install. --- INSTALL.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index ddbd8c1..4918334 100755 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,6 +15,7 @@ Diese Anleitung geht davon aus das du SSH-Zugriff auf deinen Server hast. Wenn d 3. Abhängigkeiten installieren 1. composer herunterladen ```curl -sS https://getcomposer.org/installer | php``` 2. Installation ausführen: ```php composer.phar install``` -4. Im Verzeichnis app/config die Datei parameters.yml.dist nach parameters.yml kopieren und anpassen. 5. Dann die Tabellen erstellen: php app/console doctrine:schema:create +6. Cache löschen ```php app/console cache:clear --env=prod --no-debug``` +7. Assets dumpen ```php app/console assetic:dump --env=prod --no-debug``` 6. Zum Schluss must du noch deinen Webserver [konfigurieren](http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html) und dann ist calcifer auch schon erreichbar. From 484ab2762f9726e52229b9b1a2fa12c4def4e3fc Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 22 Jul 2014 21:50:52 +0200 Subject: [PATCH 10/42] Removed the assets --- web/css/a7b77f2.css | 460 -------------------------------------------- web/css/c57d364.css | 42 ---- web/css/f9f8a0d.css | 417 --------------------------------------- 3 files changed, 919 deletions(-) delete mode 100644 web/css/a7b77f2.css delete mode 100644 web/css/c57d364.css delete mode 100644 web/css/f9f8a0d.css diff --git a/web/css/a7b77f2.css b/web/css/a7b77f2.css deleted file mode 100644 index 75c07c6..0000000 --- a/web/css/a7b77f2.css +++ /dev/null @@ -1,460 +0,0 @@ -/* line 1, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker { - box-shadow: 0px 5px 15px -5px rgba(0, 0, 0, 0.506); - background: #FFFFFF; - border-bottom: 1px solid #BBBBBB; - border-left: 1px solid #CCCCCC; - border-right: 1px solid #CCCCCC; - border-top: 1px solid #CCCCCC; - color: #333333; - font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif; - padding: 8px; - padding-left: 0px; - padding-top: 2px; - position: absolute; - z-index: 9999; - -moz-box-sizing: border-box; - box-sizing: border-box; - display: none; -} - -/* line 20, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker iframe { - position: absolute; - left: 0; - top: 0; - width: 75px; - height: 210px; - background: transparent; - border: none; -} - -/*For IE8 or lower*/ -/* line 31, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker button { - border: none !important; -} - -/* line 35, assetic_compassiP1C2P.scss */ -.xdsoft_noselect { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -/* line 45, assetic_compassiP1C2P.scss */ -.xdsoft_noselect::selection { - background: transparent; -} - -/* line 49, assetic_compassiP1C2P.scss */ -.xdsoft_noselect::-moz-selection { - background: transparent; -} - -/* line 53, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker.xdsoft_inline { - display: inline-block; - position: static; - box-shadow: none; -} - -/* line 59, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker * { - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0px; - margin: 0px; -} - -/* line 66, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker, .xdsoft_datetimepicker .xdsoft_timepicker { - display: none; -} - -/* line 70, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker.active, .xdsoft_datetimepicker .xdsoft_timepicker.active { - display: block; -} - -/* line 74, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker { - width: 224px; - float: left; - margin-left: 8px; -} - -/* line 80, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker { - width: 58px; - float: left; - text-align: center; - margin-left: 8px; - margin-top: 0px; -} - -/* line 88, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker.active + .xdsoft_timepicker { - margin-top: 8px; - margin-bottom: 3px; -} - -/* line 93, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_mounthpicker { - position: relative; - text-align: center; -} - -/* line 98, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_prev, .xdsoft_datetimepicker .xdsoft_next, .xdsoft_datetimepicker .xdsoft_today_button { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozQjRCQjRGREU4MkNFMzExQjRDQkIyRDJDOTdBRUI1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCQjg0OUYyNTZDODAxMUUzQjMwM0IwMERBNUU0ODQ5NSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCQjg0OUYyNDZDODAxMUUzQjMwM0IwMERBNUU0ODQ5NSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI5NzE3MjFBN0E2Q0UzMTFBQjJEQjgzMDk5RTNBNTdBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjNCNEJCNEZERTgyQ0UzMTFCNENCQjJEMkM5N0FFQjUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+aQvATgAAAfVJREFUeNrsmr1OwzAQxzGtkPjYEAuvVGAvfQIGRKADE49gdLwDDwBiZ2RhQUKwICQkWLsgFiRQuIBTucFJ/XFp4+hO+quqnZ4uvzj2nV2RpukCW/22yAgYNINmc7du7DcghCjrkqgOKjF1znpt6rZ0AGWQj7TvCU8d9UM+QAGDrhdyc2Bnc1WVVPBev9V8lBnY+rDwncWZThG4xk4lmxtJy2AHgoY/FySgbSBPwPZ8mEXbQx3aDERb0EbYAYFC7pcAtAvkMWwC0D3NX58S9D/YnoGC7nPWr3Dg9JTbtuHhDShBT8D2CBSK/iIEvVXxpuxSgh7DdgwUTL4iA92zmJb6lKB/YTsECmV+IgK947AGDIqgQ/LojsO135Hn51l2cWlov0JdGNrPUceueXRwilSVgkUyom9Rd6gbLfYTDeO+1v6orn0InTogYDGUkYLO3/wc9BdqqTCKP1Tfi+oTIaCBIL2TES+GTyruT9S61p6BHam+99DFEAgLFklYsIBHwSI9QY80H5ta+1rB/6ovaKihBJeEJbgLbBlQgl+j3lDPqA2tfQV1j3pVn8s+oKHGTSVJ+FqDLeR5bCqJ2E/BCycsoLZETXaKGs7rhKVt+9HZScrZNMi88V8P7LlDbvOZYaJVpMMmBCT4n0o8dTBoNgbdWPsRYACs3r7XyNfbnAAAAABJRU5ErkJggg=="); -} - -/* line 102, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_prev { - float: left; - background-position: -20px 0px; -} - -/* line 107, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_today_button { - float: left; - background-position: -70px 0px; - margin-left: 5px; -} - -/* line 113, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_next { - float: right; - background-position: 0px 0px; -} - -/* line 121, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_next, .xdsoft_datetimepicker .xdsoft_prev, .xdsoft_datetimepicker .xdsoft_today_button { - background-color: transparent; - background-repeat: no-repeat; - border: 0px none currentColor; - cursor: pointer; - display: block; - height: 30px; - opacity: 0.5; - outline: medium none currentColor; - overflow: hidden; - padding: 0px; - position: relative; - text-indent: 100%; - white-space: nowrap; - width: 20px; -} - -/* line 139, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_next { - float: none; - background-position: -40px -15px; - height: 15px; - width: 30px; - display: block; - margin-left: 14px; - margin-top: 7px; -} - -/* line 149, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev { - background-position: -40px 0px; - margin-bottom: 7px; - margin-top: 0px; -} - -/* line 155, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box { - height: 151px; - overflow: hidden; - border-bottom: 1px solid #DDDDDD; -} - -/* line 161, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div { - background: #F5F5F5; - border-top: 1px solid #DDDDDD; - color: #666666; - font-size: 12px; - text-align: center; - border-collapse: collapse; - cursor: pointer; - border-bottom-width: 0px; - height: 25px; - line-height: 25px; -} - -/* line 174, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div:first-child { - border-top-width: 0px; -} - -/* line 180, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_today_button:hover, -.xdsoft_datetimepicker .xdsoft_next:hover, -.xdsoft_datetimepicker .xdsoft_prev:hover { - opacity: 1; -} - -/* line 184, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label { - display: inline; - position: relative; - z-index: 9999; - margin: 0; - padding: 5px 3px; - font-size: 14px; - line-height: 20px; - font-weight: bold; - background-color: #fff; - float: left; - width: 182px; - text-align: center; - cursor: pointer; -} - -/* line 200, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label:hover { - text-decoration: underline; -} - -/* line 204, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select { - border: 1px solid #ccc; - position: absolute; - right: 0px; - top: 30px; - z-index: 101; - display: none; - background: #fff; - max-height: 160px; - overflow-y: hidden; -} - -/* line 216, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_monthselect { - right: -7px; -} - -/* line 220, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_yearselect { - right: 2px; -} - -/* line 224, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover { - color: #fff; - background: #ff8000; -} - -/* line 229, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option { - padding: 2px 10px 2px 5px; -} - -/* line 233, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current { - background: #33AAFF; - box-shadow: #178FE5 0px 1px 3px 0px inset; - color: #fff; - font-weight: 700; -} - -/* line 240, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_month { - width: 90px; - text-align: right; -} - -/* line 245, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar { - clear: both; -} - -/* line 249, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_year { - width: 56px; -} - -/* line 253, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar table { - border-collapse: collapse; - width: 100%; -} - -/* line 259, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td > div { - padding-right: 5px; -} - -/* line 263, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - height: 25px; -} - -/* line 267, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td, .xdsoft_datetimepicker .xdsoft_calendar th { - width: 14.2857142%; - background: #F5F5F5; - border: 1px solid #DDDDDD; - color: #666666; - font-size: 12px; - text-align: right; - padding: 0px; - border-collapse: collapse; - cursor: pointer; - height: 25px; -} - -/* line 280, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - background: #F1F1F1; -} - -/* line 284, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_today { - color: #33AAFF; -} - -/* line 290, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default, -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_current { - background: #33AAFF; - box-shadow: #178FE5 0px 1px 3px 0px inset; - color: #fff; - font-weight: 700; -} - -/* line 299, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month, -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled, -.xdsoft_datetimepicker .xdsoft_time_box > div > div.xdsoft_disabled { - opacity: 0.5; -} - -/* line 303, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month.xdsoft_disabled { - opacity: 0.2; -} - -/* line 308, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div:hover { - color: #fff !important; - background: #ff8000 !important; - box-shadow: none !important; -} - -/* line 315, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_disabled:hover { - color: inherit !important; - background: inherit !important; - /*box-shadow: inherit !important;*/ -} - -/* line 321, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - font-weight: 700; - text-align: center; - color: #999; - cursor: default; -} - -/* line 328, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_copyright { - color: #ccc !important; - font-size: 10px; - clear: both; - float: none; - margin-left: 8px; -} - -/* line 336, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_copyright a { - color: #eee !important; -} - -/* line 340, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_copyright a:hover { - color: #aaa !important; -} - -/* line 344, assetic_compassiP1C2P.scss */ -.xdsoft_time_box { - position: relative; - border: 1px solid #ccc; -} - -/* line 349, assetic_compassiP1C2P.scss */ -.xdsoft_scrollbar > .xdsoft_scroller { - background: #ccc !important; - height: 20px; - border-radius: 3px; -} - -/* line 355, assetic_compassiP1C2P.scss */ -.xdsoft_scrollbar { - position: absolute; - width: 7px; - right: 0px; - top: 0px; - bottom: 0px; - cursor: pointer; -} - -/* line 364, assetic_compassiP1C2P.scss */ -.xdsoft_scroller_box { - position: relative; -} - -/* line 2, assetic_compass09ABip.scss */ -.event.box h2 { - padding: 0.5rem; -} -/* line 4, assetic_compass09ABip.scss */ -.event.box h2 a, .event.box h2 a:hover, .event.box h2 a:visited { - color: #ffffff; -} -/* line 9, assetic_compass09ABip.scss */ -.event.box .startdate, .event.box .location, .event.box .url, .event.box .edit { - /*float: left;*/ - display: inline; - margin: 0; - margin-right: 0.5rem; - margin-bottom: 0.5rem; -} -/* line 17, assetic_compass09ABip.scss */ -.event.box ul.tags { - padding-left: 0; - /*float: left;*/ - margin: 0; - margin-right: 0.5rem; - margin-bottom: 0.5rem; - display: inline; -} -/* line 24, assetic_compass09ABip.scss */ -.event.box ul.tags li { - list-style-type: none; - /*float: left;*/ - display: inline; - margin-right: 0.5rem; -} - -/* line 35, assetic_compass09ABip.scss */ -form .ui.form .field .attached-label > input, form .ui.form .field .attached-label > textarea { - margin-bottom: 2rem; -} - -/* line 41, assetic_compass09ABip.scss */ -#map { - height: 20rem; -} diff --git a/web/css/c57d364.css b/web/css/c57d364.css deleted file mode 100644 index b46e4da..0000000 --- a/web/css/c57d364.css +++ /dev/null @@ -1,42 +0,0 @@ -/* line 2, assetic_compasscXEbLP.scss */ -.event.box h2 { - padding: 0.5rem; -} -/* line 4, assetic_compasscXEbLP.scss */ -.event.box h2 a, .event.box h2 a:hover, .event.box h2 a:visited { - color: #ffffff; -} -/* line 9, assetic_compasscXEbLP.scss */ -.event.box .startdate, .event.box .location, .event.box .url, .event.box .edit { - /*float: left;*/ - display: inline; - margin: 0; - margin-right: 0.5rem; - margin-bottom: 0.5rem; -} -/* line 17, assetic_compasscXEbLP.scss */ -.event.box ul.tags { - padding-left: 0; - /*float: left;*/ - margin: 0; - margin-right: 0.5rem; - margin-bottom: 0.5rem; - display: inline; -} -/* line 24, assetic_compasscXEbLP.scss */ -.event.box ul.tags li { - list-style-type: none; - /*float: left;*/ - display: inline; - margin-right: 0.5rem; -} - -/* line 35, assetic_compasscXEbLP.scss */ -form .ui.form .field .attached-label > input, form .ui.form .field .attached-label > textarea { - margin-bottom: 2rem; -} - -/* line 41, assetic_compasscXEbLP.scss */ -#map { - height: 20rem; -} diff --git a/web/css/f9f8a0d.css b/web/css/f9f8a0d.css deleted file mode 100644 index 84ac2bf..0000000 --- a/web/css/f9f8a0d.css +++ /dev/null @@ -1,417 +0,0 @@ -/* line 1, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker { - box-shadow: 0px 5px 15px -5px rgba(0, 0, 0, 0.506); - background: #FFFFFF; - border-bottom: 1px solid #BBBBBB; - border-left: 1px solid #CCCCCC; - border-right: 1px solid #CCCCCC; - border-top: 1px solid #CCCCCC; - color: #333333; - font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif; - padding: 8px; - padding-left: 0px; - padding-top: 2px; - position: absolute; - z-index: 9999; - -moz-box-sizing: border-box; - box-sizing: border-box; - display: none; -} - -/* line 20, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker iframe { - position: absolute; - left: 0; - top: 0; - width: 75px; - height: 210px; - background: transparent; - border: none; -} - -/*For IE8 or lower*/ -/* line 31, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker button { - border: none !important; -} - -/* line 35, assetic_compassQzxHpj.scss */ -.xdsoft_noselect { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -/* line 45, assetic_compassQzxHpj.scss */ -.xdsoft_noselect::selection { - background: transparent; -} - -/* line 49, assetic_compassQzxHpj.scss */ -.xdsoft_noselect::-moz-selection { - background: transparent; -} - -/* line 53, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker.xdsoft_inline { - display: inline-block; - position: static; - box-shadow: none; -} - -/* line 59, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker * { - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0px; - margin: 0px; -} - -/* line 66, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker, .xdsoft_datetimepicker .xdsoft_timepicker { - display: none; -} - -/* line 70, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker.active, .xdsoft_datetimepicker .xdsoft_timepicker.active { - display: block; -} - -/* line 74, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker { - width: 224px; - float: left; - margin-left: 8px; -} - -/* line 80, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker { - width: 58px; - float: left; - text-align: center; - margin-left: 8px; - margin-top: 0px; -} - -/* line 88, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker.active + .xdsoft_timepicker { - margin-top: 8px; - margin-bottom: 3px; -} - -/* line 93, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_mounthpicker { - position: relative; - text-align: center; -} - -/* line 98, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_prev, .xdsoft_datetimepicker .xdsoft_next, .xdsoft_datetimepicker .xdsoft_today_button { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozQjRCQjRGREU4MkNFMzExQjRDQkIyRDJDOTdBRUI1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCQjg0OUYyNTZDODAxMUUzQjMwM0IwMERBNUU0ODQ5NSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCQjg0OUYyNDZDODAxMUUzQjMwM0IwMERBNUU0ODQ5NSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI5NzE3MjFBN0E2Q0UzMTFBQjJEQjgzMDk5RTNBNTdBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjNCNEJCNEZERTgyQ0UzMTFCNENCQjJEMkM5N0FFQjUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+aQvATgAAAfVJREFUeNrsmr1OwzAQxzGtkPjYEAuvVGAvfQIGRKADE49gdLwDDwBiZ2RhQUKwICQkWLsgFiRQuIBTucFJ/XFp4+hO+quqnZ4uvzj2nV2RpukCW/22yAgYNINmc7du7DcghCjrkqgOKjF1znpt6rZ0AGWQj7TvCU8d9UM+QAGDrhdyc2Bnc1WVVPBev9V8lBnY+rDwncWZThG4xk4lmxtJy2AHgoY/FySgbSBPwPZ8mEXbQx3aDERb0EbYAYFC7pcAtAvkMWwC0D3NX58S9D/YnoGC7nPWr3Dg9JTbtuHhDShBT8D2CBSK/iIEvVXxpuxSgh7DdgwUTL4iA92zmJb6lKB/YTsECmV+IgK947AGDIqgQ/LojsO135Hn51l2cWlov0JdGNrPUceueXRwilSVgkUyom9Rd6gbLfYTDeO+1v6orn0InTogYDGUkYLO3/wc9BdqqTCKP1Tfi+oTIaCBIL2TES+GTyruT9S61p6BHam+99DFEAgLFklYsIBHwSI9QY80H5ta+1rB/6ovaKihBJeEJbgLbBlQgl+j3lDPqA2tfQV1j3pVn8s+oKHGTSVJ+FqDLeR5bCqJ2E/BCycsoLZETXaKGs7rhKVt+9HZScrZNMi88V8P7LlDbvOZYaJVpMMmBCT4n0o8dTBoNgbdWPsRYACs3r7XyNfbnAAAAABJRU5ErkJggg=="); -} - -/* line 102, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_prev { - float: left; - background-position: -20px 0px; -} - -/* line 107, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_today_button { - float: left; - background-position: -70px 0px; - margin-left: 5px; -} - -/* line 113, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_next { - float: right; - background-position: 0px 0px; -} - -/* line 121, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_next, .xdsoft_datetimepicker .xdsoft_prev, .xdsoft_datetimepicker .xdsoft_today_button { - background-color: transparent; - background-repeat: no-repeat; - border: 0px none currentColor; - cursor: pointer; - display: block; - height: 30px; - opacity: 0.5; - outline: medium none currentColor; - overflow: hidden; - padding: 0px; - position: relative; - text-indent: 100%; - white-space: nowrap; - width: 20px; -} - -/* line 139, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_next { - float: none; - background-position: -40px -15px; - height: 15px; - width: 30px; - display: block; - margin-left: 14px; - margin-top: 7px; -} - -/* line 149, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev { - background-position: -40px 0px; - margin-bottom: 7px; - margin-top: 0px; -} - -/* line 155, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box { - height: 151px; - overflow: hidden; - border-bottom: 1px solid #DDDDDD; -} - -/* line 161, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div { - background: #F5F5F5; - border-top: 1px solid #DDDDDD; - color: #666666; - font-size: 12px; - text-align: center; - border-collapse: collapse; - cursor: pointer; - border-bottom-width: 0px; - height: 25px; - line-height: 25px; -} - -/* line 174, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div:first-child { - border-top-width: 0px; -} - -/* line 180, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_today_button:hover, -.xdsoft_datetimepicker .xdsoft_next:hover, -.xdsoft_datetimepicker .xdsoft_prev:hover { - opacity: 1; -} - -/* line 184, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label { - display: inline; - position: relative; - z-index: 9999; - margin: 0; - padding: 5px 3px; - font-size: 14px; - line-height: 20px; - font-weight: bold; - background-color: #fff; - float: left; - width: 182px; - text-align: center; - cursor: pointer; -} - -/* line 200, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label:hover { - text-decoration: underline; -} - -/* line 204, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select { - border: 1px solid #ccc; - position: absolute; - right: 0px; - top: 30px; - z-index: 101; - display: none; - background: #fff; - max-height: 160px; - overflow-y: hidden; -} - -/* line 216, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_monthselect { - right: -7px; -} - -/* line 220, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_yearselect { - right: 2px; -} - -/* line 224, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover { - color: #fff; - background: #ff8000; -} - -/* line 229, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option { - padding: 2px 10px 2px 5px; -} - -/* line 233, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current { - background: #33AAFF; - box-shadow: #178FE5 0px 1px 3px 0px inset; - color: #fff; - font-weight: 700; -} - -/* line 240, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_month { - width: 90px; - text-align: right; -} - -/* line 245, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar { - clear: both; -} - -/* line 249, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_year { - width: 56px; -} - -/* line 253, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar table { - border-collapse: collapse; - width: 100%; -} - -/* line 259, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td > div { - padding-right: 5px; -} - -/* line 263, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - height: 25px; -} - -/* line 267, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td, .xdsoft_datetimepicker .xdsoft_calendar th { - width: 14.2857142%; - background: #F5F5F5; - border: 1px solid #DDDDDD; - color: #666666; - font-size: 12px; - text-align: right; - padding: 0px; - border-collapse: collapse; - cursor: pointer; - height: 25px; -} - -/* line 280, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - background: #F1F1F1; -} - -/* line 284, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_today { - color: #33AAFF; -} - -/* line 290, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default, -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_current { - background: #33AAFF; - box-shadow: #178FE5 0px 1px 3px 0px inset; - color: #fff; - font-weight: 700; -} - -/* line 299, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month, -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled, -.xdsoft_datetimepicker .xdsoft_time_box > div > div.xdsoft_disabled { - opacity: 0.5; -} - -/* line 303, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month.xdsoft_disabled { - opacity: 0.2; -} - -/* line 308, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div:hover { - color: #fff !important; - background: #ff8000 !important; - box-shadow: none !important; -} - -/* line 315, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_disabled:hover { - color: inherit !important; - background: inherit !important; - /*box-shadow: inherit !important;*/ -} - -/* line 321, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - font-weight: 700; - text-align: center; - color: #999; - cursor: default; -} - -/* line 328, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_copyright { - color: #ccc !important; - font-size: 10px; - clear: both; - float: none; - margin-left: 8px; -} - -/* line 336, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_copyright a { - color: #eee !important; -} - -/* line 340, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_copyright a:hover { - color: #aaa !important; -} - -/* line 344, assetic_compassQzxHpj.scss */ -.xdsoft_time_box { - position: relative; - border: 1px solid #ccc; -} - -/* line 349, assetic_compassQzxHpj.scss */ -.xdsoft_scrollbar > .xdsoft_scroller { - background: #ccc !important; - height: 20px; - border-radius: 3px; -} - -/* line 355, assetic_compassQzxHpj.scss */ -.xdsoft_scrollbar { - position: absolute; - width: 7px; - right: 0px; - top: 0px; - bottom: 0px; - cursor: pointer; -} - -/* line 364, assetic_compassQzxHpj.scss */ -.xdsoft_scroller_box { - position: relative; -} From 68d3ff6f1e1188908657172becd46bc64d78398c Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Thu, 24 Jul 2014 08:38:33 +0200 Subject: [PATCH 11/42] Use the magic method __get Fixes #3 --- .../Bundle/CalciferBundle/Controller/TagController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php index ce4e9a7..2f46fd3 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php @@ -61,7 +61,7 @@ class TagController extends Controller $qb = $em->createQueryBuilder(); $qb->select(array('e')) ->from('CalciferBundle:Event', 'e') - ->join('e.tags', 't', 'WITH', $qb->expr()->in('t.id', $tag->getId())) + ->join('e.tags', 't', 'WITH', $qb->expr()->in('t.id', $tag->id)) ->where('e.startdate >= :startdate') ->orderBy('e.startdate') ->setParameter('startdate', $now); @@ -79,7 +79,7 @@ class TagController extends Controller $event->setSummary($entity->summary); $event->setDescription($entity->description); $location = new \Jsvrcek\ICS\Model\Description\Location(); - $location->setName($entity->getLocation()->name); + $location->setName($entity->location->name); $event->setLocations([$location]); $calendar->addEvent($event); } From 4eb53a8ceb4c33bb9abc2612326ccd721e541b72 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Mon, 28 Jul 2014 22:11:02 +0200 Subject: [PATCH 12/42] Extracted the tag functions into a trait, so it can be used by events and repeating events. --- .../Bundle/CalciferBundle/Entity/Event.php | 37 +---------- .../CalciferBundle/Entity/RepeatingEvent.php | 6 +- .../Bundle/CalciferBundle/Entity/TagTrait.php | 61 +++++++++++++++++++ 3 files changed, 67 insertions(+), 37 deletions(-) create mode 100755 src/Hackspace/Bundle/CalciferBundle/Entity/TagTrait.php diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php index 88049ed..baf4b4a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php @@ -3,7 +3,6 @@ namespace Hackspace\Bundle\CalciferBundle\Entity; use Doctrine\ORM\Mapping as ORM; -use Doctrine\ORM\PersistentCollection; /** * Event @@ -13,6 +12,8 @@ use Doctrine\ORM\PersistentCollection; */ class Event extends BaseEntity { + use TagTrait; + /** * @var \DateTime * @@ -92,41 +93,7 @@ class Event extends BaseEntity return $this->location; } - public function getTags() { - return $this->tags; - } - - public function hasTag(Tag $tag) { - if ($this->tags instanceof PersistentCollection) { - return $this->tags->contains($tag); - } elseif (is_array($this->tags)) { - return in_array($tag,$this->tags); - } else { - return false; - } - - } - - public function addTag(Tag $tag) { - /** @var PersistentCollection $this->tags */ - if (!$this->hasTag($tag)) { - $this->tags[] = $tag; - } - } - public function isValid() { return true; } - - public function getTagsAsText() { - if (count($this->tags) > 0) { - $tags = []; - foreach ($this->tags as $tag) { - $tags[] = $tag->name; - } - return implode(',',$tags); - } else { - return ''; - } - } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php index 75675be..4dc64fe 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php @@ -13,6 +13,8 @@ use Doctrine\ORM\PersistentCollection; */ class RepeatingEvent extends BaseEntity { + use TagTrait; + /** * @var \DateTime * @@ -67,8 +69,8 @@ class RepeatingEvent extends BaseEntity * @var array * * @ORM\ManyToMany(targetEntity="Tag") - * @ORM\JoinTable(name="repeat_events2tags", - * joinColumns={@ORM\JoinColumn(name="repeat_events_id", referencedColumnName="id")}, + * @ORM\JoinTable(name="repeating_events2tags", + * joinColumns={@ORM\JoinColumn(name="repeating_events_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="tags_id", referencedColumnName="id")} * ) */ diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/TagTrait.php b/src/Hackspace/Bundle/CalciferBundle/Entity/TagTrait.php new file mode 100755 index 0000000..952d990 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/TagTrait.php @@ -0,0 +1,61 @@ +tags; + } + + public function clearTags() + { + if ($this->tags instanceof PersistentCollection) { + $this->tags->clear(); + } elseif (is_array($this->tags)) { + $this->tags = []; + } + } + + public function hasTag(Tag $tag) + { + if ($this->tags instanceof PersistentCollection) { + return $this->tags->contains($tag); + } elseif (is_array($this->tags)) { + return in_array($tag, $this->tags); + } else { + return false; + } + + } + + public function addTag(Tag $tag) + { + if (!$this->hasTag($tag)) { + $this->tags[] = $tag; + } + } + + public function getTagsAsText() + { + if (count($this->tags) > 0) { + $tags = []; + foreach ($this->tags as $tag) { + $tags[] = $tag->name; + } + return implode(',', $tags); + } else { + return ''; + } + } +} \ No newline at end of file From 51af913608c7b66f72c850d93ddcb382eb4d8a30 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Mon, 28 Jul 2014 22:11:55 +0200 Subject: [PATCH 13/42] Clear all the tags before adding them again. Fixes #4 --- .../Bundle/CalciferBundle/Controller/EventController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php index ead80bc..023f6b2 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php @@ -247,6 +247,7 @@ class EventController extends Controller $tags = explode(',', $tags); $em = $this->getDoctrine()->getManager(); $repo = $em->getRepository('CalciferBundle:Tag'); + $entity->clearTags(); foreach ($tags as $tag) { $tag = trim($tag); $results = $repo->findBy(['name' => $tag]); From 7719e760ecb73e9452893624055393eab7698509 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Mon, 28 Jul 2014 22:12:51 +0200 Subject: [PATCH 14/42] Finish the model for the repeating events. referencing #5 --- .../CalciferBundle/Entity/RepeatingEvent.php | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php index 4dc64fe..639974a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php @@ -8,7 +8,7 @@ use Doctrine\ORM\PersistentCollection; /** * RepeatEvent * - * @ORM\Table(name="repeat_events") + * @ORM\Table(name="repeating_events") * @ORM\Entity */ class RepeatingEvent extends BaseEntity @@ -18,7 +18,7 @@ class RepeatingEvent extends BaseEntity /** * @var \DateTime * - * @ORM\Column(name="startdate", type="datetimetz") + * @ORM\Column(name="nextdate", type="datetimetz") */ protected $nextdate; @@ -32,9 +32,9 @@ class RepeatingEvent extends BaseEntity /** * @var string * - * @ORM\Column(name="name", type="string", length=255) + * @ORM\Column(name="repeating_pattern", type="string", length=255) */ - protected $repeat_pattern = ''; + protected $repeating_pattern = ''; /** * @var string @@ -76,4 +76,16 @@ class RepeatingEvent extends BaseEntity */ protected $tags = []; + public function getFormatedRepeatPattern() { + switch($this->repeating_pattern) { + case 'PD7': + return 'Wöchentlich'; + case 'PD14': + return 'Alle 2 Wochen'; + case 'PM1': + return 'Monatlich'; + default: + return $this->repeating_pattern; + } + } } \ No newline at end of file From 90b6f5244600e0b6515cb62b77c0058d3de3ab81 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Mon, 28 Jul 2014 22:15:06 +0200 Subject: [PATCH 15/42] Implement the GUI for the repeating events. referencing #4 --- .../Controller/RepeatingEventController.php | 262 ++++++++++++++++++ .../Resources/assets/js/repeating_events.js | 6 + .../views/RepeatingEvent/edit.html.twig | 37 +++ .../views/RepeatingEvent/index.html.twig | 65 +++++ .../views/RepeatingEvent/new.html.twig | 35 +++ .../repeating_event_form.html.twig | 166 +++++++++++ .../Resources/views/navigation.html.twig | 1 + 7 files changed, 572 insertions(+) create mode 100755 src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php create mode 100755 src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/repeating_events.js create mode 100755 src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig create mode 100755 src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig create mode 100755 src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig create mode 100755 src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php new file mode 100755 index 0000000..db41dca --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php @@ -0,0 +1,262 @@ +getDoctrine()->getManager(); + + /** @var EntityRepository $repo */ + $repo = $em->getRepository('CalciferBundle:RepeatingEvent'); + + $entities = $repo->findAll(); + + return [ + 'entities' => $entities, + ]; + } + + /** + * Displays a form to create a repeating event + * + * @Route("/neu", name="repeating_event_new") + * @Method("GET") + * @Template() + */ + public function newAction() + { + $entity = new RepeatingEvent(); + + return [ + 'entity' => $entity, + ]; + } + + /** + * Creates a repeating event + * + * @Route("/neu", name="repeating_event_create") + * @Method("POST") + * @Template("CalciferBundle:RepeatingEvent:new.html.twig") + */ + public function createAction(Request $request) + { + $entity = new RepeatingEvent(); + $this->fillEntity($request, $entity); + if ($this->validateRepeatingEvent($entity)) { + $ret = $this->saveRepeatingEvent($request, $entity); + if ($entity->id > 0) { + return $this->redirect($this->generateUrl('repeating_event_show')); + } else { + throw new \Exception('Could not save repeating event?!?'); + } + } + return [ + 'entity' => $entity, + ]; + + } + + /** + * Displays a form to edit a repeating event + * + * @Route("/{slug}/bearbeiten",name="repeating_event_edit") + * @Method("GET") + * @Template() + */ + public function editAction($slug) + { + /** @var EntityManager $em */ + $em = $this->getDoctrine()->getManager(); + + /** @var EntityRepository $repo */ + $repo = $em->getRepository('CalciferBundle:RepeatingEvent'); + + /** @var Event $entity */ + $entity = $repo->findOneBy(['slug' => $slug]); + + if (!$entity) { + throw $this->createNotFoundException('Unable to find RepeatingEvent entity.'); + } + + return array( + 'entity' => $entity, + ); + } + + /** + * Updates a repeating event + * + * @Route("/{slug}/bearbeiten",name="repeating_event_update") + * @Method("POST") + * @Template("CalciferBundle:RepeatingEvent:edit.html.twig") + */ + public function updateAction(Request $request, $slug) + { + /** @var EntityManager $em */ + $em = $this->getDoctrine()->getManager(); + + /** @var EntityRepository $repo */ + $repo = $em->getRepository('CalciferBundle:RepeatingEvent'); + + /** @var Event $entity */ + $entity = $repo->findOneBy(['slug' => $slug]); + + if (!$entity) { + throw $this->createNotFoundException('Unable to find RepeatingEvent entity.'); + } + + $this->fillEntity($request, $entity); + if ($this->validateRepeatingEvent($entity)) { + $ret = $this->saveRepeatingEvent($request, $entity); + if ($entity->id > 0) { + return $this->redirect($this->generateUrl('repeating_event_show')); + } else { + throw new \Exception('Could not save repeating event?!?'); + } + } + return [ + 'entity' => $entity, + ]; + } + + private function fillEntity(Request $request, RepeatingEvent $entity) + { + $fields = [ + 'duration', + 'repeating_pattern', + 'summary', + 'description', + 'url', + ]; + foreach ($fields as $field) { + $entity->$field = $request->get($field); + } + if (strlen($entity->duration) == 0) + $entity->duration = null; + $nextdate = $request->get('nextdate'); + $nextdate = new \DateTime($nextdate); + $entity->nextdate = $nextdate; + + } + + private function validateRepeatingEvent(RepeatingEvent $entity) + { + $fields = [ + 'nextdate', + 'repeating_pattern', + 'summary', + ]; + foreach ($fields as $field) { + if ((is_null($entity->$field)) && (strlen($entity->$field) > 0)) + return false; + } + return true; + } + + private function saveRepeatingEvent(Request $request, RepeatingEvent $entity) + { + $location = $request->get('location'); + $location_lat = $request->get('location_lat'); + $location_lon = $request->get('location_lon'); + if (strlen($location) > 0) { + // check if the location already exists + /** @var EntityManager $em */ + $em = $this->getDoctrine()->getManager(); + $repo = $em->getRepository('CalciferBundle:Location'); + $results = $repo->findBy(['name' => $location]); + if (count($results) > 0) { + $location_obj = $results[0]; + if (strlen($location_lat) > 0) { + $location_obj->lat = $location_lat; + } + if (strlen($location_lon) > 0) { + $location_obj->lon = $location_lon; + } + $em->persist($location_obj); + $em->flush(); + $entity->location = $results[0]; + } else { + $location_obj = new Location(); + $location_obj->name = $location; + if (strlen($location_lat) > 0) { + $location_obj->lat = $location_lat; + } + if (strlen($location_lon) > 0) { + $location_obj->lon = $location_lon; + } + $location_obj->slug = \URLify::filter($location_obj->name, 255, 'de'); + $em->persist($location_obj); + $em->flush(); + $entity->location = $location_obj; + } + } else { + $entity->location = null; + } + + $tags = $request->get('tags'); + if (strlen($tags) > 0) { + $tags = explode(',', $tags); + $em = $this->getDoctrine()->getManager(); + $repo = $em->getRepository('CalciferBundle:Tag'); + $entity->clearTags(); + foreach ($tags as $tag) { + $tag = trim($tag); + $results = $repo->findBy(['name' => $tag]); + if (count($results) > 0) { + $entity->addTag($results[0]); + } else { + $tag_obj = new Tag(); + $tag_obj->name = $tag; + $tag_obj->slug = \URLify::filter($tag_obj->name, 255, 'de'); + $em->persist($tag_obj); + $em->flush(); + $entity->addTag($tag_obj); + } + } + } else { + $entity->clearTags(); + } + + $entity->slug = \URLify::filter($entity->summary,255,'de'); + + $em = $this->getDoctrine()->getManager(); + $em->persist($entity); + $em->flush(); + + return $entity; + + } +} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/repeating_events.js b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/repeating_events.js new file mode 100755 index 0000000..3ffdf0e --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/repeating_events.js @@ -0,0 +1,6 @@ +$(document).ready(function(){ + $('.ui.dropdown.selection') + .dropdown() + .dropdown('set value',$('.ui.dropdown.selection input[type=hidden]').val()) + ; +}); diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig new file mode 100755 index 0000000..25f2f34 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig @@ -0,0 +1,37 @@ +{% extends 'CalciferBundle::layout.html.twig' %} + +{% block css %} + {% stylesheets filter="compass" + "@CalciferBundle/Resources/assets/css/jquery.datetimepicker.scss" + "@CalciferBundle/Resources/assets/css/events.scss" + "@CalciferBundle/Resources/assets/css/leaflet.scss" + %} + + {% endstylesheets %} +{% endblock %} + +{% block javascripts %} + {% javascripts + "@CalciferBundle/Resources/assets/js/jquery.datetimepicker.js" + "@CalciferBundle/Resources/assets/js/repeating_events.js" + "@CalciferBundle/Resources/assets/js/events.js" + "@CalciferBundle/Resources/assets/js/leaflet.js" + %} + + {% endjavascripts %} +{% endblock %} + +{% block body -%} +
+
+

Wiederholenden Termin bearbeiten

+
+
+ +
+
+ {{ include('CalciferBundle:RepeatingEvent:repeating_event_form.html.twig',{'entity':entity}) }} +
+
+ +{% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig new file mode 100755 index 0000000..ce108c5 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig @@ -0,0 +1,65 @@ +{% extends 'CalciferBundle::layout.html.twig' %} + +{% block css %} + {% stylesheets filter="compass" + "@CalciferBundle/Resources/assets/css/events.scss" %} + + {% endstylesheets %} +{% endblock %} + +{% block javascripts %} + {% javascripts + "@CalciferBundle/Resources/assets/js/events.js" %} + + {% endjavascripts %} +{% endblock %} + +{% block body -%} +
+
+

+ Wiederholende Termine +

+
+
+ +
+
+ + + + + + + + + + + {% for entity in entities %} + + + + + + + {% endfor %} + + + + + + +
ZusammenfassungNächstes DatumWiederholungsmusterAktionen
+ {{ entity.summary }} + + {{ entity.nextdate.format('Y-m-d H:i') }} + + {{ entity.getFormatedRepeatPattern() }} + + Bearbeiten +
Neuen wiederholenden Termin anlegen
+
+ +
+ +{% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig new file mode 100755 index 0000000..22b9509 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig @@ -0,0 +1,35 @@ +{% extends 'CalciferBundle::layout.html.twig' %} + +{% block css %} + {% stylesheets filter="compass" + "@CalciferBundle/Resources/assets/css/jquery.datetimepicker.scss" + "@CalciferBundle/Resources/assets/css/events.scss" + "@CalciferBundle/Resources/assets/css/leaflet.scss" %} + + {% endstylesheets %} +{% endblock %} + +{% block javascripts %} + {% javascripts + "@CalciferBundle/Resources/assets/js/jquery.datetimepicker.js" + "@CalciferBundle/Resources/assets/js/repeating_events.js" + "@CalciferBundle/Resources/assets/js/events.js" + "@CalciferBundle/Resources/assets/js/leaflet.js" %} + + {% endjavascripts %} +{% endblock %} + +{% block body -%} +
+
+

Wiederholenden Termin erstellen

+
+
+ +
+
+ {{ include('CalciferBundle:RepeatingEvent:repeating_event_form.html.twig') }} +
+
+ +{% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig new file mode 100755 index 0000000..801665d --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig @@ -0,0 +1,166 @@ + +
+
+ + +
+ + + + +
+ +
+
+
+
+ + +
+ + +
+ Hier gibst du bitte die Dauer der Veranstaltung in Minuten an. +
+
+
+ +
+ + +
+ +
+ +
+ +
+ + +
+ + +
+ +
+
+
+ +
+ + +
+ + +
Du kannst hier Markdown + benutzen. +
+
+
+ +
+ + +
+ + +
+
+ +
+ + +
+ + + + + +
+ Du kannst zu diesem Ort auch Geokoordinaten hinterlegen.
+ {% if entity.location.lat|default(0) > 0 %}Folgende Koordinaten sind angegeben: lat:{{ entity.location.lat }}, lon:{{ entity.location.lon }}{% endif %} +
+ +
+
+ +
+ + +
+ + + +
Du kannst hier kommasepariert Tags angeben. +
+
+
+ + +
+ + \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/navigation.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/navigation.html.twig index c2e4ce9..3991996 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/navigation.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/navigation.html.twig @@ -3,6 +3,7 @@
\ No newline at end of file From 95cf63a46bda37d399dddf97ca55f5e2ee31d705 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Mon, 28 Jul 2014 22:50:25 +0200 Subject: [PATCH 16/42] Created a command to generate events from repeating events via cron. Fixes #5 --- .../Command/GenerateEventsCommand.php | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php diff --git a/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php b/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php new file mode 100755 index 0000000..fa7f97e --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php @@ -0,0 +1,79 @@ +setName('calcifer:events:generate') + ->setDescription('Generate events from repeating events') + ->addOption('duration', 'd', InputOption::VALUE_OPTIONAL, 'The duration you want to generate events into the future. Default is 2 monts','2 months') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $duration = \DateInterval::createFromDateString($input->getOption('duration')); + if ($duration instanceof \DateInterval) { + $now = new \DateTime(); + $end = new \DateTime(); + $end->add($duration); + $output->writeln(sprintf("Generating Dates from %s to %s",$now->format('Y-m-d'),$end->format('Y-m-d'))); + $output->writeln("Fetching repeating events"); + $entityManager = $this->getContainer()->get('doctrine')->getManager(); + $repo = $entityManager->getRepository('CalciferBundle:RepeatingEvent'); + $entities = $repo->findAll(); + foreach($entities as $entity) { + /** @var RepeatingEvent $entity */ + $period = new \DatePeriod($entity->nextdate,new \DateInterval($entity->repeating_pattern),$end); + foreach($period as $date) { + /** @var \DateTime $date */ + $output->writeln(sprintf("Creating Event %s for %s",$entity->summary,$date->format('Y-m-d H:i'))); + $event = new Event(); + $event->location = $entity->location; + $event->startdate = $date; + if ($entity->duration > 0) { + $duration = new \DateInterval("PT".$duration.'H'); + /** @var \DateTime $enddate */ + $enddate = clone $date; + $enddate->add($duration); + $entity->enddate = $enddate; + } + $event->summary = $entity->summary; + $event->description = $entity->description; + $event->url = $entity->url; + $entityManager->persist($event); + $entityManager->flush(); + $event->slug = \URLify::filter($event->id . '-' . $event->summary,255,'de'); + $entityManager->persist($event); + $entityManager->flush(); + foreach($entity->getTags() as $tag) { + $event->addTag($tag); + } + $entityManager->persist($event); + $entityManager->flush(); + } + } + } else { + $output->writeln('Invalid duration'); + } + + } +} From f4acf98688ccc3bde5a848c9511b101b43a72e2e Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Mon, 28 Jul 2014 22:52:48 +0200 Subject: [PATCH 17/42] Use the right repeating pattern. --- .../views/RepeatingEvent/repeating_event_form.html.twig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig index 801665d..c3eb044 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig @@ -48,9 +48,9 @@
From 6d6b1ad7082524a1c0fea7befcbff56c75911a22 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Mon, 28 Jul 2014 23:03:14 +0200 Subject: [PATCH 18/42] Updated the install to include instructions on how to get the repeating events running. referencing #5 --- INSTALL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/INSTALL.md b/INSTALL.md index 4918334..e38a646 100755 --- a/INSTALL.md +++ b/INSTALL.md @@ -18,4 +18,5 @@ Diese Anleitung geht davon aus das du SSH-Zugriff auf deinen Server hast. Wenn d 5. Dann die Tabellen erstellen: php app/console doctrine:schema:create 6. Cache löschen ```php app/console cache:clear --env=prod --no-debug``` 7. Assets dumpen ```php app/console assetic:dump --env=prod --no-debug``` +8. Einen täglichen Cronjob anlegen, der die wiederholenden Termine anlegt: ```php app/console calcifer:events:generate``` 6. Zum Schluss must du noch deinen Webserver [konfigurieren](http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html) und dann ist calcifer auch schon erreichbar. From 0ef2977199cb2e3daf3ce1103fc81ff8859757a1 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Mon, 28 Jul 2014 23:10:12 +0200 Subject: [PATCH 19/42] Update the repeating patterns. --- .../Bundle/CalciferBundle/Entity/RepeatingEvent.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php index 639974a..4858ddf 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php @@ -78,11 +78,11 @@ class RepeatingEvent extends BaseEntity public function getFormatedRepeatPattern() { switch($this->repeating_pattern) { - case 'PD7': + case 'P7D': return 'Wöchentlich'; - case 'PD14': + case 'P14D': return 'Alle 2 Wochen'; - case 'PM1': + case 'P1M': return 'Monatlich'; default: return $this->repeating_pattern; From 9947bf1e22cda69be199334459557f4a0d97ec87 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 29 Jul 2014 15:08:08 +0200 Subject: [PATCH 20/42] Add properties for better code completion. --- .../Bundle/CalciferBundle/Entity/BaseEntity.php | 5 +++++ src/Hackspace/Bundle/CalciferBundle/Entity/Event.php | 8 ++++++++ .../Bundle/CalciferBundle/Entity/RepeatingEvent.php | 9 +++++++++ 3 files changed, 22 insertions(+) diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php b/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php index db1bf2b..ed3a198 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php @@ -12,6 +12,11 @@ use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\PersistentCollection; /** + * A baseclass for all other entities + * + * @property integer $id + * @property string $slug + * * @ORM\MappedSuperclass */ abstract class BaseEntity { diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php index baf4b4a..4e33540 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php @@ -7,6 +7,14 @@ use Doctrine\ORM\Mapping as ORM; /** * Event * + * @property \DateTime $startdate + * @property \DateTime $enddate + * @property string $summary + * @property string $description + * @property Location $location + * @property string $url + * @property array $tags + * * @ORM\Table(name="events") * @ORM\Entity */ diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php index 4858ddf..d7a6bcd 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php @@ -8,6 +8,15 @@ use Doctrine\ORM\PersistentCollection; /** * RepeatEvent * + * @property \DateTime $nextdate + * @property integer $duration + * @property string $repeating_pattern + * @property string $summary + * @property string $description + * @property Location $location + * @property string $url + * @property array $tags + * * @ORM\Table(name="repeating_events") * @ORM\Entity */ From d1edb8e908d575d83a3448b363d6083b4923d6ae Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 29 Jul 2014 15:08:56 +0200 Subject: [PATCH 21/42] Set the nextdate so the repeating dates will not be generated over and over again. --- .../CalciferBundle/Command/GenerateEventsCommand.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php b/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php index fa7f97e..f697a78 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php +++ b/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php @@ -9,6 +9,7 @@ namespace Hackspace\Bundle\CalciferBundle\Command; +use Doctrine\ORM\EntityManager; use Hackspace\Bundle\CalciferBundle\Entity\Event; use Hackspace\Bundle\CalciferBundle\Entity\RepeatingEvent; use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; @@ -37,12 +38,14 @@ class GenerateEventsCommand extends ContainerAwareCommand $end->add($duration); $output->writeln(sprintf("Generating Dates from %s to %s",$now->format('Y-m-d'),$end->format('Y-m-d'))); $output->writeln("Fetching repeating events"); + /** @var EntityManager $entityManager */ $entityManager = $this->getContainer()->get('doctrine')->getManager(); $repo = $entityManager->getRepository('CalciferBundle:RepeatingEvent'); $entities = $repo->findAll(); foreach($entities as $entity) { /** @var RepeatingEvent $entity */ $period = new \DatePeriod($entity->nextdate,new \DateInterval($entity->repeating_pattern),$end); + $event = null; foreach($period as $date) { /** @var \DateTime $date */ $output->writeln(sprintf("Creating Event %s for %s",$entity->summary,$date->format('Y-m-d H:i'))); @@ -50,7 +53,7 @@ class GenerateEventsCommand extends ContainerAwareCommand $event->location = $entity->location; $event->startdate = $date; if ($entity->duration > 0) { - $duration = new \DateInterval("PT".$duration.'H'); + $duration = new \DateInterval("PT".$entity->duration.'H'); /** @var \DateTime $enddate */ $enddate = clone $date; $enddate->add($duration); @@ -70,6 +73,12 @@ class GenerateEventsCommand extends ContainerAwareCommand $entityManager->persist($event); $entityManager->flush(); } + if (!is_null($event)) { + $entity->nextdate = $event->startdate; + $entity->nextdate->add(new \DateInterval($entity->repeating_pattern)); + $entityManager->persist($entity); + $entityManager->flush(); + } } } else { $output->writeln('Invalid duration'); From 12895cb822a648ab74d76650c82c2e4c4fb7612f Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 29 Jul 2014 15:11:59 +0200 Subject: [PATCH 22/42] Change the instruction to create the schemas. --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index e38a646..1256929 100755 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,7 +15,7 @@ Diese Anleitung geht davon aus das du SSH-Zugriff auf deinen Server hast. Wenn d 3. Abhängigkeiten installieren 1. composer herunterladen ```curl -sS https://getcomposer.org/installer | php``` 2. Installation ausführen: ```php composer.phar install``` -5. Dann die Tabellen erstellen: php app/console doctrine:schema:create +5. Dann die Tabellen erstellen: ```php app/console doctrine:schema:update --force``` 6. Cache löschen ```php app/console cache:clear --env=prod --no-debug``` 7. Assets dumpen ```php app/console assetic:dump --env=prod --no-debug``` 8. Einen täglichen Cronjob anlegen, der die wiederholenden Termine anlegt: ```php app/console calcifer:events:generate``` From 60090ad6199bd63c383d571c0901e52e97cdbfb9 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 29 Jul 2014 15:15:11 +0200 Subject: [PATCH 23/42] Remove generated assets from code. --- web/js/73cfd50.js | 1472 --------------------------------------------- web/js/e306c7e.js | 56 -- 2 files changed, 1528 deletions(-) delete mode 100644 web/js/73cfd50.js delete mode 100644 web/js/e306c7e.js diff --git a/web/js/73cfd50.js b/web/js/73cfd50.js deleted file mode 100644 index c979ce3..0000000 --- a/web/js/73cfd50.js +++ /dev/null @@ -1,1472 +0,0 @@ -/** - * @preserve jQuery DateTimePicker plugin v2.3.0 - * @homepage http://xdsoft.net/jqplugins/datetimepicker/ - * (c) 2014, Chupurnov Valeriy. - */ -(function( $ ) { - 'use strict'; - var default_options = { - i18n:{ - bg:{ // Bulgarian - months:[ - "Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември" - ], - dayOfWeek:[ - "Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" - ] - }, - fa:{ // Persian/Farsi - months:[ - 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند' - ], - dayOfWeek:[ - 'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه' - ] - }, - ru:{ // Russian - months:[ - 'Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь' - ], - dayOfWeek:[ - "Вск", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" - ] - }, - en:{ // English - months: [ - "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" - ], - dayOfWeek: [ - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" - ] - }, - el:{ // Ελληνικά - months: [ - "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος" - ], - dayOfWeek: [ - "Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ" - ] - }, - de:{ // German - months:[ - 'Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember' - ], - dayOfWeek:[ - "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa" - ] - }, - nl:{ // Dutch - months:[ - "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december" - ], - dayOfWeek:[ - "zo", "ma", "di", "wo", "do", "vr", "za" - ] - }, - tr:{ // Turkish - months:[ - "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık" - ], - dayOfWeek:[ - "Paz", "Pts", "Sal", "Çar", "Per", "Cum", "Cts" - ] - }, - fr:{ //French - months:[ - "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre" - ], - dayOfWeek:[ - "Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam" - ] - }, - es:{ // Spanish - months: [ - "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" - ], - dayOfWeek: [ - "Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb" - ] - }, - th:{ // Thai - months:[ - 'มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน','กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม' - ], - dayOfWeek:[ - 'อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.' - ] - }, - pl:{ // Polish - months: [ - "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień" - ], - dayOfWeek: [ - "nd", "pn", "wt", "śr", "cz", "pt", "sb" - ] - }, - pt:{ // Portuguese - months: [ - "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro" - ], - dayOfWeek: [ - "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab" - ] - }, - ch:{ // Simplified Chinese - months: [ - "一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月" - ], - dayOfWeek: [ - "日", "一","二","三","四","五","六" - ] - }, - se:{ // Swedish - months: [ - "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September","Oktober", "November", "December" - ], - dayOfWeek: [ - "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör" - ] - }, - kr:{ // Korean - months: [ - "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" - ], - dayOfWeek: [ - "일", "월", "화", "수", "목", "금", "토" - ] - }, - it:{ // Italian - months: [ - "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre" - ], - dayOfWeek: [ - "Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab" - ] - }, - da:{ // Dansk - months: [ - "January", "Februar", "Marts", "April", "Maj", "Juni", "July", "August", "September", "Oktober", "November", "December" - ], - dayOfWeek: [ - "Søn", "Man", "Tir", "ons", "Tor", "Fre", "lør" - ] - }, - no:{ // Norwegian - months: [ - "Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember" - ], - dayOfWeek: [ - "Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør" - ] - }, - ja:{ // Japanese - months: [ - "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" - ], - dayOfWeek: [ - "日", "月", "火", "水", "木", "金", "土" - ] - }, - vi:{ // Vietnamese - months: [ - "Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12" - ], - dayOfWeek: [ - "CN", "T2", "T3", "T4", "T5", "T6", "T7" - ] - }, - sl:{ // Slovenščina - months: [ - "Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December" - ], - dayOfWeek: [ - "Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob" - ] - }, - cs:{ // Čeština - months: [ - "Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec" - ], - dayOfWeek: [ - "Ne", "Po", "Út", "St", "Čt", "Pá", "So" - ] - }, - hu:{ // Hungarian - months: [ - "Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December" - ], - dayOfWeek: [ - "Va", "Hé", "Ke", "Sze", "Cs", "Pé", "Szo" - ] - } - }, - value:'', - lang:'en', - - format: 'Y/m/d H:i', - formatTime: 'H:i', - formatDate: 'Y/m/d', - - startDate: false, // new Date(), '1986/12/08', '-1970/01/05','-1970/01/05', - - step:60, - monthChangeSpinner:true, - closeOnDateSelect:false, - closeOnWithoutClick:true, - closeOnInputClick: true, - - timepicker:true, - datepicker:true, - - minDate:false, - maxDate:false, - minTime:false, - maxTime:false, - - allowTimes:[], - opened:false, - initTime:true, - inline:false, - - onSelectDate:function() {}, - onSelectTime:function() {}, - onChangeMonth:function() {}, - onChangeDateTime:function() {}, - onShow:function() {}, - onClose:function() {}, - onGenerate:function() {}, - - withoutCopyright:true, - - inverseButton:false, - hours12:false, - next: 'xdsoft_next', - prev : 'xdsoft_prev', - dayOfWeekStart:0, - - timeHeightInTimePicker:25, - timepickerScrollbar:true, - - todayButton:true, // 2.1.0 - defaultSelect:true, // 2.1.0 - - scrollMonth:true, - scrollTime:true, - scrollInput:true, - - lazyInit:false, - - mask:false, - validateOnBlur:true, - allowBlank:true, - - yearStart:1950, - yearEnd:2050, - - style:'', - id:'', - - fixed: false, - - roundTime:'round', // ceil, floor - className:'', - - weekends : [], - yearOffset:0, - beforeShowDay: null - }; - - // fix for ie8 - if ( !Array.prototype.indexOf ) { - Array.prototype.indexOf = function(obj, start) { - for (var i = (start || 0), j = this.length; i < j; i++) { - if (this[i] === obj) { return i; } - } - return -1; - } - } - - Date.prototype.countDaysInMonth = function(){ - return new Date(this.getFullYear(), this.getMonth()+1, 0).getDate(); - }; - - $.fn.xdsoftScroller = function( _percent ) { - return this.each(function() { - var timeboxparent = $(this); - if( !$(this).hasClass('xdsoft_scroller_box') ) { - var pointerEventToXY = function( e ) { - var out = {x:0, y:0}; - if( e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel' ) { - var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; - out.x = touch.pageX; - out.y = touch.pageY; - }else if (e.type == 'mousedown' || e.type == 'mouseup' || e.type == 'mousemove' || e.type == 'mouseover'|| e.type=='mouseout' || e.type=='mouseenter' || e.type=='mouseleave') { - out.x = e.pageX; - out.y = e.pageY; - } - return out; - }, - move = 0, - timebox = timeboxparent.children().eq(0), - parentHeight = timeboxparent[0].clientHeight, - height = timebox[0].offsetHeight, - scrollbar = $('
'), - scroller = $('
'), - maximumOffset = 100, - start = false; - - scrollbar.append(scroller); - - timeboxparent.addClass('xdsoft_scroller_box').append(scrollbar); - scroller.on('mousedown.xdsoft_scroller',function ( event ) { - if( !parentHeight ) - timeboxparent.trigger('resize_scroll.xdsoft_scroller',[_percent]); - var pageY = event.pageY, - top = parseInt(scroller.css('margin-top')), - h1 = scrollbar[0].offsetHeight; - $(document.body).addClass('xdsoft_noselect'); - $([document.body,window]).on('mouseup.xdsoft_scroller',function arguments_callee() { - $([document.body,window]).off('mouseup.xdsoft_scroller',arguments_callee) - .off('mousemove.xdsoft_scroller',move) - .removeClass('xdsoft_noselect'); - }); - $(document.body).on('mousemove.xdsoft_scroller',move = function(event) { - var offset = event.pageY-pageY+top; - if( offset<0 ) - offset = 0; - if( offset+scroller[0].offsetHeight>h1 ) - offset = h1-scroller[0].offsetHeight; - timeboxparent.trigger('scroll_element.xdsoft_scroller',[maximumOffset?offset/maximumOffset:0]); - }); - }); - - timeboxparent - .on('scroll_element.xdsoft_scroller',function( event,percent ) { - if( !parentHeight ) - timeboxparent.trigger('resize_scroll.xdsoft_scroller',[percent,true]); - percent = percent>1?1:(percent<0||isNaN(percent))?0:percent; - scroller.css('margin-top',maximumOffset*percent); - timebox.css('marginTop',-parseInt((height-parentHeight)*percent)) - }) - .on('resize_scroll.xdsoft_scroller',function( event,_percent,noTriggerScroll ) { - parentHeight = timeboxparent[0].clientHeight; - height = timebox[0].offsetHeight; - var percent = parentHeight/height, - sh = percent*scrollbar[0].offsetHeight; - if( percent>1 ) - scroller.hide(); - else{ - scroller.show(); - scroller.css('height',parseInt(sh>10?sh:10)); - maximumOffset = scrollbar[0].offsetHeight-scroller[0].offsetHeight; - if( noTriggerScroll!==true ) - timeboxparent.trigger('scroll_element.xdsoft_scroller',[_percent?_percent:Math.abs(parseInt(timebox.css('marginTop')))/(height-parentHeight)]); - } - }); - timeboxparent.mousewheel&&timeboxparent.mousewheel(function(event, delta, deltaX, deltaY) { - var top = Math.abs(parseInt(timebox.css('marginTop'))); - timeboxparent.trigger('scroll_element.xdsoft_scroller',[(top-delta*20)/(height-parentHeight)]); - event.stopPropagation(); - return false; - }); - timeboxparent.on('touchstart',function( event ) { - start = pointerEventToXY(event); - }); - timeboxparent.on('touchmove',function( event ) { - if( start ) { - var coord = pointerEventToXY(event), top = Math.abs(parseInt(timebox.css('marginTop'))); - timeboxparent.trigger('scroll_element.xdsoft_scroller',[(top-(coord.y-start.y))/(height-parentHeight)]); - event.stopPropagation(); - event.preventDefault(); - start = pointerEventToXY(event); - } - }); - timeboxparent.on('touchend touchcancel',function( event ) { - start = false; - }); - } - timeboxparent.trigger('resize_scroll.xdsoft_scroller',[_percent]); - }); - }; - $.fn.datetimepicker = function( opt ) { - var KEY0 = 48, - KEY9 = 57, - _KEY0 = 96, - _KEY9 = 105, - CTRLKEY = 17, - DEL = 46, - ENTER = 13, - ESC = 27, - BACKSPACE = 8, - ARROWLEFT = 37, - ARROWUP = 38, - ARROWRIGHT = 39, - ARROWDOWN = 40, - TAB = 9, - F5 = 116, - AKEY = 65, - CKEY = 67, - VKEY = 86, - ZKEY = 90, - YKEY = 89, - ctrlDown = false, - options = ($.isPlainObject(opt)||!opt)?$.extend(true,{},default_options,opt):$.extend({},default_options), - - lazyInitTimer = 0, - - lazyInit = function( input ){ - input - .on('open.xdsoft focusin.xdsoft mousedown.xdsoft',function initOnActionCallback(event) { - if( input.is(':disabled')||input.is(':hidden')||!input.is(':visible')||input.data( 'xdsoft_datetimepicker') ) - return; - - clearTimeout(lazyInitTimer); - - lazyInitTimer = setTimeout(function() { - - if( !input.data( 'xdsoft_datetimepicker') ) - createDateTimePicker(input); - - input - .off('open.xdsoft focusin.xdsoft mousedown.xdsoft',initOnActionCallback) - .trigger('open.xdsoft'); - },100); - - }); - }, - - createDateTimePicker = function( input ) { - - var datetimepicker = $('
'), - xdsoft_copyright = $(''), - datepicker = $('
'), - mounth_picker = $('
'), - calendar = $('
'), - timepicker = $('
'), - timeboxparent = timepicker.find('.xdsoft_time_box').eq(0), - timebox = $('
'), - scrollbar = $('
'), - scroller = $('
'), - monthselect =$('
'), - yearselect =$('
'); - - //constructor lego - mounth_picker - .find('.xdsoft_month span') - .after(monthselect); - mounth_picker - .find('.xdsoft_year span') - .after(yearselect); - - mounth_picker - .find('.xdsoft_month,.xdsoft_year') - .on('mousedown.xdsoft',function(event) { - mounth_picker - .find('.xdsoft_select') - .hide(); - - var select = $(this).find('.xdsoft_select').eq(0), - val = 0, - top = 0; - - if( _xdsoft_datetime.currentTime ) - val = _xdsoft_datetime.currentTime[$(this).hasClass('xdsoft_month')?'getMonth':'getFullYear'](); - - select.show(); - - for(var items = select.find('div.xdsoft_option'),i = 0;i6 ) - options.dayOfWeekStart = 0; - else - options.dayOfWeekStart = parseInt(options.dayOfWeekStart); - - if( !options.timepickerScrollbar ) - scrollbar.hide(); - - if( options.minDate && /^-(.*)$/.test(options.minDate) ){ - options.minDate = _xdsoft_datetime.strToDateTime(options.minDate).dateFormat( options.formatDate ); - } - - if( options.maxDate && /^\+(.*)$/.test(options.maxDate) ) { - options.maxDate = _xdsoft_datetime.strToDateTime(options.maxDate).dateFormat( options.formatDate ); - } - - mounth_picker - .find('.xdsoft_today_button') - .css('visibility',!options.todayButton?'hidden':'visible'); - - if( options.mask ) { - var e, - getCaretPos = function ( input ) { - try{ - if ( document.selection && document.selection.createRange ) { - var range = document.selection.createRange(); - return range.getBookmark().charCodeAt(2) - 2; - }else - if ( input.setSelectionRange ) - return input.selectionStart; - }catch(e) { - return 0; - } - }, - setCaretPos = function ( node,pos ) { - node = (typeof node == "string" || node instanceof String) ? document.getElementById(node) : node; - if(!node) { - return false; - }else if(node.createTextRange) { - var textRange = node.createTextRange(); - textRange.collapse(true); - textRange.moveEnd(pos); - textRange.moveStart(pos); - textRange.select(); - return true; - }else if(node.setSelectionRange) { - node.setSelectionRange(pos,pos); - return true; - } - return false; - }, - isValidValue = function ( mask,value ) { - var reg = mask - .replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g,'\\$1') - .replace(/_/g,'{digit+}') - .replace(/([0-9]{1})/g,'{digit$1}') - .replace(/\{digit([0-9]{1})\}/g,'[0-$1_]{1}') - .replace(/\{digit[\+]\}/g,'[0-9_]{1}'); - return RegExp(reg).test(value); - }; - input.off('keydown.xdsoft'); - switch(true) { - case ( options.mask===true ): - - options.mask = options.format - .replace(/Y/g,'9999') - .replace(/F/g,'9999') - .replace(/m/g,'19') - .replace(/d/g,'39') - .replace(/H/g,'29') - .replace(/i/g,'59') - .replace(/s/g,'59'); - - case ( $.type(options.mask) == 'string' ): - - if( !isValidValue( options.mask,input.val() ) ) - input.val(options.mask.replace(/[0-9]/g,'_')); - - input.on('keydown.xdsoft',function( event ) { - var val = this.value, - key = event.which; - - switch(true) { - case (( key>=KEY0&&key<=KEY9 )||( key>=_KEY0&&key<=_KEY9 ))||(key==BACKSPACE||key==DEL): - var pos = getCaretPos(this), - digit = ( key!=BACKSPACE&&key!=DEL )?String.fromCharCode((_KEY0 <= key && key <= _KEY9)? key-KEY0 : key):'_'; - - if( (key==BACKSPACE||key==DEL)&&pos ) { - pos--; - digit='_'; - } - - while( /[^0-9_]/.test(options.mask.substr(pos,1))&&pos0 ) - pos+=( key==BACKSPACE||key==DEL )?-1:1; - - val = val.substr(0,pos)+digit+val.substr(pos+1); - if( $.trim(val)=='' ){ - val = options.mask.replace(/[0-9]/g,'_'); - }else{ - if( pos==options.mask.length ) - break; - } - - pos+=(key==BACKSPACE||key==DEL)?0:1; - while( /[^0-9_]/.test(options.mask.substr(pos,1))&&pos0 ) - pos+=(key==BACKSPACE||key==DEL)?-1:1; - - if( isValidValue( options.mask,val ) ) { - this.value = val; - setCaretPos(this,pos); - }else if( $.trim(val)=='' ) - this.value = options.mask.replace(/[0-9]/g,'_'); - else{ - input.trigger('error_input.xdsoft'); - } - break; - case ( !!~([AKEY,CKEY,VKEY,ZKEY,YKEY].indexOf(key))&&ctrlDown ): - case !!~([ESC,ARROWUP,ARROWDOWN,ARROWLEFT,ARROWRIGHT,F5,CTRLKEY,TAB,ENTER].indexOf(key)): - return true; - } - event.preventDefault(); - return false; - }); - break; - } - } - if( options.validateOnBlur ) { - input - .off('blur.xdsoft') - .on('blur.xdsoft', function() { - if( options.allowBlank && !$.trim($(this).val()).length ) { - $(this).val(null); - datetimepicker.data('xdsoft_datetime').empty(); - }else if( !Date.parseDate( $(this).val(), options.format ) ) { - $(this).val((_xdsoft_datetime.now()).dateFormat( options.format )); - datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val()); - } - else{ - datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val()); - } - datetimepicker.trigger('changedatetime.xdsoft'); - }); - } - options.dayOfWeekStartPrev = (options.dayOfWeekStart==0)?6:options.dayOfWeekStart-1; - - datetimepicker - .trigger('xchange.xdsoft') - .trigger('afterOpen.xdsoft') - }; - - datetimepicker - .data('options',options) - .on('mousedown.xdsoft',function( event ) { - event.stopPropagation(); - event.preventDefault(); - yearselect.hide(); - monthselect.hide(); - return false; - }); - - var scroll_element = timepicker.find('.xdsoft_time_box'); - scroll_element.append(timebox); - scroll_element.xdsoftScroller(); - - datetimepicker.on('afterOpen.xdsoft',function() { - scroll_element.xdsoftScroller(); - }); - - datetimepicker - .append(datepicker) - .append(timepicker); - - if( options.withoutCopyright!==true ) - datetimepicker - .append(xdsoft_copyright); - - datepicker - .append(mounth_picker) - .append(calendar); - - $('body').append(datetimepicker); - - var _xdsoft_datetime = new function() { - var _this = this; - _this.now = function() { - var d = new Date(); - if( options.yearOffset ) - d.setFullYear(d.getFullYear()+options.yearOffset); - return d; - }; - - _this.currentTime = this.now(); - _this.isValidDate = function (d) { - if ( Object.prototype.toString.call(d) !== "[object Date]" ) - return false; - return !isNaN(d.getTime()); - }; - - _this.setCurrentTime = function( dTime) { - _this.currentTime = (typeof dTime == 'string')? _this.strToDateTime(dTime) : _this.isValidDate(dTime) ? dTime: _this.now(); - datetimepicker.trigger('xchange.xdsoft'); - }; - - _this.empty = function() { - _this.currentTime = null; - }; - - _this.getCurrentTime = function( dTime) { - return _this.currentTime; - }; - - _this.nextMonth = function() { - var month = _this.currentTime.getMonth()+1; - if( month==12 ) { - _this.currentTime.setFullYear(_this.currentTime.getFullYear()+1); - month = 0; - } - _this.currentTime.setDate( - Math.min( - Date.daysInMonth[month], - _this.currentTime.getDate() - ) - ); - _this.currentTime.setMonth(month); - options.onChangeMonth&&options.onChangeMonth.call&&options.onChangeMonth.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - datetimepicker.trigger('xchange.xdsoft'); - return month; - }; - - _this.prevMonth = function() { - var month = _this.currentTime.getMonth()-1; - if( month==-1 ) { - _this.currentTime.setFullYear(_this.currentTime.getFullYear()-1); - month = 11; - } - _this.currentTime.setDate( - Math.min( - Date.daysInMonth[month], - _this.currentTime.getDate() - ) - ); - _this.currentTime.setMonth(month); - options.onChangeMonth&&options.onChangeMonth.call&&options.onChangeMonth.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - datetimepicker.trigger('xchange.xdsoft'); - return month; - }; - - _this.strToDateTime = function( sDateTime ) { - if( sDateTime && sDateTime instanceof Date && _this.isValidDate(sDateTime) ) - return sDateTime; - - var tmpDate = [],timeOffset,currentTime; - - if( ( tmpDate = /^(\+|\-)(.*)$/.exec(sDateTime) ) && ( tmpDate[2]=Date.parseDate(tmpDate[2], options.formatDate) ) ) { - timeOffset = tmpDate[2].getTime()-(tmpDate[2].getTimezoneOffset())*60000; - currentTime = new Date((_xdsoft_datetime.now()).getTime()+parseInt(tmpDate[1]+'1')*timeOffset); - }else - currentTime = sDateTime?Date.parseDate(sDateTime, options.format):_this.now(); - - if( !_this.isValidDate(currentTime) ) - currentTime = _this.now(); - - return currentTime; - }; - - _this.strtodate = function( sDate ) { - if( sDate && sDate instanceof Date && _this.isValidDate(sDate) ) - return sDate; - - var currentTime = sDate?Date.parseDate(sDate, options.formatDate):_this.now(); - if( !_this.isValidDate(currentTime) ) - currentTime = _this.now(); - - return currentTime; - }; - - _this.strtotime = function( sTime ) { - if( sTime && sTime instanceof Date && _this.isValidDate(sTime) ) - return sTime; - - var currentTime = sTime?Date.parseDate(sTime, options.formatTime):_this.now(); - if( !_this.isValidDate(currentTime) ) - currentTime = _this.now(); - - return currentTime; - }; - - _this.str = function() { - return _this.currentTime.dateFormat(options.format); - }; - }; - mounth_picker - .find('.xdsoft_today_button') - .on('mousedown.xdsoft',function() { - datetimepicker.data('changed',true); - _xdsoft_datetime.setCurrentTime(0); - datetimepicker.trigger('afterOpen.xdsoft'); - }).on('dblclick.xdsoft',function(){ - input.val( _xdsoft_datetime.str() ); - datetimepicker.trigger('close.xdsoft'); - }); - mounth_picker - .find('.xdsoft_prev,.xdsoft_next') - .on('mousedown.xdsoft',function() { - var $this = $(this), - timer = 0, - stop = false; - - (function arguments_callee1(v) { - var month = _xdsoft_datetime.currentTime.getMonth(); - if( $this.hasClass( options.next ) ) { - _xdsoft_datetime.nextMonth(); - }else if( $this.hasClass( options.prev ) ) { - _xdsoft_datetime.prevMonth(); - } - if (options.monthChangeSpinner) { - !stop&&(timer = setTimeout(arguments_callee1,v?v:100)); - } - })(500); - - $([document.body,window]).on('mouseup.xdsoft',function arguments_callee2() { - clearTimeout(timer); - stop = true; - $([document.body,window]).off('mouseup.xdsoft',arguments_callee2); - }); - }); - - timepicker - .find('.xdsoft_prev,.xdsoft_next') - .on('mousedown.xdsoft',function() { - var $this = $(this), - timer = 0, - stop = false, - period = 110; - (function arguments_callee4(v) { - var pheight = timeboxparent[0].clientHeight, - height = timebox[0].offsetHeight, - top = Math.abs(parseInt(timebox.css('marginTop'))); - if( $this.hasClass(options.next) && (height-pheight)- options.timeHeightInTimePicker>=top ) { - timebox.css('marginTop','-'+(top+options.timeHeightInTimePicker)+'px') - }else if( $this.hasClass(options.prev) && top-options.timeHeightInTimePicker>=0 ) { - timebox.css('marginTop','-'+(top-options.timeHeightInTimePicker)+'px') - } - timeboxparent.trigger('scroll_element.xdsoft_scroller',[Math.abs(parseInt(timebox.css('marginTop'))/(height-pheight))]); - period= ( period>10 )?10:period-10; - !stop&&(timer = setTimeout(arguments_callee4,v?v:period)); - })(500); - $([document.body,window]).on('mouseup.xdsoft',function arguments_callee5() { - clearTimeout(timer); - stop = true; - $([document.body,window]) - .off('mouseup.xdsoft',arguments_callee5); - }); - }); - - var xchangeTimer = 0; - // base handler - generating a calendar and timepicker - datetimepicker - .on('xchange.xdsoft',function( event ) { - clearTimeout(xchangeTimer); - xchangeTimer = setTimeout(function(){ - var table = '', - start = new Date(_xdsoft_datetime.currentTime.getFullYear(),_xdsoft_datetime.currentTime.getMonth(),1, 12, 0, 0), - i = 0, - today = _xdsoft_datetime.now(); - - while( start.getDay()!=options.dayOfWeekStart ) - start.setDate(start.getDate()-1); - - //generate calendar - table+=''; - - // days - for(var j = 0; j<7; j++) { - table+=''; - } - - table+=''; - table+=''; - var maxDate = false, minDate = false; - - if( options.maxDate!==false ) { - maxDate = _xdsoft_datetime.strtodate(options.maxDate); - maxDate = new Date(maxDate.getFullYear(),maxDate.getMonth(),maxDate.getDate(),23,59,59,999); - } - - if( options.minDate!==false ) { - minDate = _xdsoft_datetime.strtodate(options.minDate); - minDate = new Date(minDate.getFullYear(),minDate.getMonth(),minDate.getDate()); - } - - var d,y,m,classes = [],customDateSettings; - - while( i<_xdsoft_datetime.currentTime.countDaysInMonth()||start.getDay()!=options.dayOfWeekStart||_xdsoft_datetime.currentTime.getMonth()==start.getMonth() ) { - classes = []; - i++; - - d = start.getDate(); y = start.getFullYear(); m = start.getMonth(); - - classes.push('xdsoft_date'); - - if ( options.beforeShowDay && options.beforeShowDay.call ) { - customDateSettings = options.beforeShowDay.call(datetimepicker, start); - } else { - customDateSettings = null; - } - - if( ( maxDate!==false && start > maxDate )||( minDate!==false && start < minDate )||(customDateSettings && customDateSettings[0] === false) ){ - classes.push('xdsoft_disabled'); - } - - if ( customDateSettings && customDateSettings[1] != "" ) { - classes.push(customDateSettings[1]); - } - - if( _xdsoft_datetime.currentTime.getMonth()!=m ) classes.push('xdsoft_other_month'); - - if( (options.defaultSelect||datetimepicker.data('changed')) && _xdsoft_datetime.currentTime.dateFormat( options.formatDate )==start.dateFormat( options.formatDate ) ) { - classes.push('xdsoft_current'); - } - - if( today.dateFormat( options.formatDate )==start.dateFormat( options.formatDate ) ) { - classes.push('xdsoft_today'); - } - - if( start.getDay()==0||start.getDay()==6||~options.weekends.indexOf(start.dateFormat( options.formatDate )) ) { - classes.push('xdsoft_weekend'); - } - - if(options.beforeShowDay && typeof options.beforeShowDay == 'function') { - classes.push(options.beforeShowDay(start)) - } - - table+=''; - - if( start.getDay()==options.dayOfWeekStartPrev ) { - table+=''; - } - - start.setDate(d+1); - } - table+='
'+options.i18n[options.lang].dayOfWeek[(j+options.dayOfWeekStart)>6?0:j+options.dayOfWeekStart]+'
'+ - '
'+d+'
'+ - '
'; - - calendar.html(table); - - mounth_picker.find('.xdsoft_label span').eq(0).text(options.i18n[options.lang].months[_xdsoft_datetime.currentTime.getMonth()]); - mounth_picker.find('.xdsoft_label span').eq(1).text(_xdsoft_datetime.currentTime.getFullYear()); - - // generate timebox - var time = '', - h = '', - m ='', - line_time = function line_time( h,m ) { - var now = _xdsoft_datetime.now(); - now.setHours(h); - h = parseInt(now.getHours()); - now.setMinutes(m); - m = parseInt(now.getMinutes()); - - classes = []; - if( (options.maxTime!==false&&_xdsoft_datetime.strtotime(options.maxTime).getTime()now.getTime())) - classes.push('xdsoft_disabled'); - if( (options.initTime||options.defaultSelect||datetimepicker.data('changed')) && parseInt(_xdsoft_datetime.currentTime.getHours())==parseInt(h)&&(options.step>59||Math[options.roundTime](_xdsoft_datetime.currentTime.getMinutes()/options.step)*options.step==parseInt(m))) { - if( options.defaultSelect||datetimepicker.data('changed')) { - classes.push('xdsoft_current'); - } else if( options.initTime ) { - classes.push('xdsoft_init_time'); - } - } - if( parseInt(today.getHours())==parseInt(h)&&parseInt(today.getMinutes())==parseInt(m)) - classes.push('xdsoft_today'); - time+= '
'+now.dateFormat(options.formatTime)+'
'; - }; - - if( !options.allowTimes || !$.isArray(options.allowTimes) || !options.allowTimes.length ) { - for( var i=0,j=0;i<(options.hours12?12:24);i++ ) { - for( j=0;j<60;j+=options.step ) { - h = (i<10?'0':'')+i; - m = (j<10?'0':'')+j; - line_time( h,m ); - } - } - }else{ - for( var i=0;i'+i+'
'; - } - yearselect.children().eq(0) - .html(opt); - - for( i = 0,opt = '';i<= 11;i++ ) { - opt+='
'+options.i18n[options.lang].months[i]+'
'; - } - monthselect.children().eq(0).html(opt); - $(datetimepicker) - .trigger('generate.xdsoft'); - },10); - event.stopPropagation(); - }) - .on('afterOpen.xdsoft',function() { - if( options.timepicker ) { - var classType; - if( timebox.find('.xdsoft_current').length ) { - classType = '.xdsoft_current'; - } else if( timebox.find('.xdsoft_init_time').length ) { - classType = '.xdsoft_init_time'; - } - - if( classType ) { - var pheight = timeboxparent[0].clientHeight, - height = timebox[0].offsetHeight, - top = timebox.find(classType).index()*options.timeHeightInTimePicker+1; - if( (height-pheight)1||(options.closeOnDateSelect===true||( options.closeOnDateSelect===0&&!options.timepicker )))&&!options.inline ) { - datetimepicker.trigger('close.xdsoft'); - } - - if( options.onSelectDate && options.onSelectDate.call ) { - options.onSelectDate.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - } - - datetimepicker.data('changed',true); - datetimepicker.trigger('xchange.xdsoft'); - datetimepicker.trigger('changedatetime.xdsoft'); - setTimeout(function(){ - timerclick = 0; - },200); - }); - - timebox - .on('click.xdsoft', 'div', function (xdevent) { - xdevent.stopPropagation(); // NAJ: Prevents closing of Pop-ups, Modals and Flyouts - var $this = $(this), - currentTime = _xdsoft_datetime.currentTime; - if( $this.hasClass('xdsoft_disabled') ) - return false; - currentTime.setHours($this.data('hour')); - currentTime.setMinutes($this.data('minute')); - datetimepicker.trigger('select.xdsoft',[currentTime]); - - datetimepicker.data('input').val( _xdsoft_datetime.str() ); - - !options.inline&&datetimepicker.trigger('close.xdsoft'); - - if( options.onSelectTime&&options.onSelectTime.call ) { - options.onSelectTime.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - } - datetimepicker.data('changed',true); - datetimepicker.trigger('xchange.xdsoft'); - datetimepicker.trigger('changedatetime.xdsoft'); - }); - - datetimepicker.mousewheel&&datepicker.mousewheel(function(event, delta, deltaX, deltaY) { - if( !options.scrollMonth ) - return true; - if( delta<0 ) - _xdsoft_datetime.nextMonth(); - else - _xdsoft_datetime.prevMonth(); - return false; - }); - - datetimepicker.mousewheel&&timeboxparent.unmousewheel().mousewheel(function(event, delta, deltaX, deltaY) { - if( !options.scrollTime ) - return true; - var pheight = timeboxparent[0].clientHeight, - height = timebox[0].offsetHeight, - top = Math.abs(parseInt(timebox.css('marginTop'))), - fl = true; - if( delta<0 && (height-pheight)-options.timeHeightInTimePicker>=top ) { - timebox.css('marginTop','-'+(top+options.timeHeightInTimePicker)+'px'); - fl = false; - }else if( delta>0&&top-options.timeHeightInTimePicker>=0 ) { - timebox.css('marginTop','-'+(top-options.timeHeightInTimePicker)+'px'); - fl = false; - } - timeboxparent.trigger('scroll_element.xdsoft_scroller',[Math.abs(parseInt(timebox.css('marginTop'))/(height-pheight))]); - event.stopPropagation(); - return fl; - }); - - var triggerAfterOpen = false; - datetimepicker - .on('changedatetime.xdsoft',function() { - if( options.onChangeDateTime&&options.onChangeDateTime.call ) { - var $input = datetimepicker.data('input'); - options.onChangeDateTime.call(datetimepicker, _xdsoft_datetime.currentTime, $input); - $input.trigger('change'); - } - }) - .on('generate.xdsoft',function() { - if( options.onGenerate&&options.onGenerate.call ) - options.onGenerate.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - if( triggerAfterOpen ){ - datetimepicker.trigger('afterOpen.xdsoft'); - triggerAfterOpen = false; - } - }) - .on( 'click.xdsoft', function( xdevent ) - { - xdevent.stopPropagation(); // Prevents closing of Pop-ups, Modals and Flyouts in Bootstrap - }); - - var current_time_index = 0; - input.mousewheel&&input.mousewheel(function( event, delta, deltaX, deltaY ) { - if( !options.scrollInput ) - return true; - if( !options.datepicker && options.timepicker ) { - current_time_index = timebox.find('.xdsoft_current').length?timebox.find('.xdsoft_current').eq(0).index():0; - if( current_time_index+delta>=0&¤t_time_index+delta$(window).height()+$(window).scrollTop() ) - top = offset.top-datetimepicker[0].offsetHeight+1; - if (top < 0) - top = 0; - if( left+datetimepicker[0].offsetWidth>$(window).width() ) - left = offset.left-datetimepicker[0].offsetWidth+datetimepicker.data('input')[0].offsetWidth; - } - datetimepicker.css({ - left:left, - top:top, - position: position - }); - }; - datetimepicker - .on('open.xdsoft', function() { - var onShow = true; - if( options.onShow&&options.onShow.call) { - onShow = options.onShow.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - } - if( onShow!==false ) { - datetimepicker.show(); - setPos(); - $(window) - .off('resize.xdsoft',setPos) - .on('resize.xdsoft',setPos); - - if( options.closeOnWithoutClick ) { - $([document.body,window]).on('mousedown.xdsoft',function arguments_callee6() { - datetimepicker.trigger('close.xdsoft'); - $([document.body,window]).off('mousedown.xdsoft',arguments_callee6); - }); - } - } - }) - .on('close.xdsoft', function( event ) { - var onClose = true; - if( options.onClose&&options.onClose.call ) { - onClose=options.onClose.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - } - if( onClose!==false&&!options.opened&&!options.inline ) { - datetimepicker.hide(); - } - event.stopPropagation(); - }) - .data('input',input); - - var timer = 0, - timer1 = 0; - - datetimepicker.data('xdsoft_datetime',_xdsoft_datetime); - datetimepicker.setOptions(options); - - function getCurrentValue(){ - - var ct = false; - - if (options.startDate instanceof Date && !isNaN(options.startDate.valueOf())) { - ct = options.startDate; - } else if (!ct && options.startDate!==false) { - ct = _xdsoft_datetime.strToDateTime(options.startDate); - } else if (!ct) { - ct = options.value?options.value:(input&&input.val&&input.val())?input.val():''; - ct = Date.parseDate(ct, options.format); - } - - if ( ct && _xdsoft_datetime.isValidDate(ct) ) { - datetimepicker.data('changed',true); - } else { - ct = ''; - } - - return ct?ct:0; - } - - _xdsoft_datetime.setCurrentTime( getCurrentValue() ); - - input - .data( 'xdsoft_datetimepicker',datetimepicker ) - .on('open.xdsoft focusin.xdsoft mousedown.xdsoft',function(event) { - if( input.is(':disabled')||input.is(':hidden')||!input.is(':visible')||(input.data('xdsoft_datetimepicker').is(':visible') && options.closeOnInputClick) ) - return; - clearTimeout(timer); - timer = setTimeout(function() { - if( input.is(':disabled')||input.is(':hidden')||!input.is(':visible') ) - return; - - triggerAfterOpen = true; - _xdsoft_datetime.setCurrentTime(getCurrentValue()); - - datetimepicker.trigger('open.xdsoft'); - },100); - }) - .on('keydown.xdsoft',function( event ) { - var val = this.value, - key = event.which; - switch(true) { - case !!~([ENTER].indexOf(key)): - var elementSelector = $("input:visible,textarea:visible"); - datetimepicker.trigger('close.xdsoft'); - elementSelector.eq(elementSelector.index(this) + 1).focus(); - return false; - case !!~[TAB].indexOf(key): - datetimepicker.trigger('close.xdsoft'); - return true; - } - }); - }, - destroyDateTimePicker = function( input ) { - var datetimepicker = input.data('xdsoft_datetimepicker'); - if( datetimepicker ) { - datetimepicker.data('xdsoft_datetime',null); - datetimepicker.remove(); - input - .data( 'xdsoft_datetimepicker',null ) - .off( 'open.xdsoft focusin.xdsoft focusout.xdsoft mousedown.xdsoft blur.xdsoft keydown.xdsoft' ); - $(window).off('resize.xdsoft'); - $([window,document.body]).off('mousedown.xdsoft'); - input.unmousewheel&&input.unmousewheel(); - } - }; - $(document) - .off('keydown.xdsoftctrl keyup.xdsoftctrl') - .on('keydown.xdsoftctrl',function(e) { - if ( e.keyCode == CTRLKEY ) - ctrlDown = true; - }) - .on('keyup.xdsoftctrl',function(e) { - if ( e.keyCode == CTRLKEY ) - ctrlDown = false; - }); - return this.each(function() { - var datetimepicker; - if( datetimepicker = $(this).data('xdsoft_datetimepicker') ) { - if( $.type(opt) === 'string' ) { - switch(opt) { - case 'show': - $(this).select().focus(); - datetimepicker.trigger( 'open.xdsoft' ); - break; - case 'hide': - datetimepicker.trigger('close.xdsoft'); - break; - case 'destroy': - destroyDateTimePicker($(this)); - break; - case 'reset': - this.value = this.defaultValue; - if(!this.value || !datetimepicker.data('xdsoft_datetime').isValidDate(Date.parseDate(this.value, options.format))) - datetimepicker.data('changed',false); - datetimepicker.data('xdsoft_datetime').setCurrentTime(this.value); - break; - } - }else{ - datetimepicker - .setOptions(opt); - } - return 0; - }else - if( ($.type(opt) !== 'string') ){ - if( !options.lazyInit||options.open||options.inline ){ - createDateTimePicker($(this)); - }else - lazyInit($(this)); - } - }); - }; - $.fn.datetimepicker.defaults = default_options; -})( jQuery ); - -/* - * Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net) - * - * Licensed under the MIT License (LICENSE.txt). - * - * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. - * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. - * Thanks to: Seamus Leahy for adding deltaX and deltaY - * - * Version: 3.1.3 - * - * Requires: 1.2.2+ - */ -(function(factory) {if(typeof define==='function'&&define.amd) {define(['jquery'],factory)}else if(typeof exports==='object') {module.exports=factory}else{factory(jQuery)}}(function($) {var toFix=['wheel','mousewheel','DOMMouseScroll','MozMousePixelScroll'];var toBind='onwheel'in document||document.documentMode>=9?['wheel']:['mousewheel','DomMouseScroll','MozMousePixelScroll'];var lowestDelta,lowestDeltaXY;if($.event.fixHooks) {for(var i=toFix.length;i;) {$.event.fixHooks[toFix[--i]]=$.event.mouseHooks}}$.event.special.mousewheel={setup:function() {if(this.addEventListener) {for(var i=toBind.length;i;) {this.addEventListener(toBind[--i],handler,false)}}else{this.onmousewheel=handler}},teardown:function() {if(this.removeEventListener) {for(var i=toBind.length;i;) {this.removeEventListener(toBind[--i],handler,false)}}else{this.onmousewheel=null}}};$.fn.extend({mousewheel:function(fn) {return fn?this.bind("mousewheel",fn):this.trigger("mousewheel")},unmousewheel:function(fn) {return this.unbind("mousewheel",fn)}});function handler(event) {var orgEvent=event||window.event,args=[].slice.call(arguments,1),delta=0,deltaX=0,deltaY=0,absDelta=0,absDeltaXY=0,fn;event=$.event.fix(orgEvent);event.type="mousewheel";if(orgEvent.wheelDelta) {delta=orgEvent.wheelDelta}if(orgEvent.detail) {delta=orgEvent.detail*-1}if(orgEvent.deltaY) {deltaY=orgEvent.deltaY*-1;delta=deltaY}if(orgEvent.deltaX) {deltaX=orgEvent.deltaX;delta=deltaX*-1}if(orgEvent.wheelDeltaY!==undefined) {deltaY=orgEvent.wheelDeltaY}if(orgEvent.wheelDeltaX!==undefined) {deltaX=orgEvent.wheelDeltaX*-1}absDelta=Math.abs(delta);if(!lowestDelta||absDelta0?'floor':'ceil';delta=Math[fn](delta/lowestDelta);deltaX=Math[fn](deltaX/lowestDeltaXY);deltaY=Math[fn](deltaY/lowestDeltaXY);args.unshift(event,delta,deltaX,deltaY);return($.event.dispatch||$.event.handle).apply(this,args)}})); - - -// Parse and Format Library -//http://www.xaprb.com/blog/2005/12/12/javascript-closures-for-runtime-efficiency/ -/* - * Copyright (C) 2004 Baron Schwartz - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation, version 2.1. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - */ -Date.parseFunctions={count:0};Date.parseRegexes=[];Date.formatFunctions={count:0};Date.prototype.dateFormat=function(b){if(b=="unixtime"){return parseInt(this.getTime()/1000);}if(Date.formatFunctions[b]==null){Date.createNewFormat(b);}var a=Date.formatFunctions[b];return this[a]();};Date.createNewFormat=function(format){var funcName="format"+Date.formatFunctions.count++;Date.formatFunctions[format]=funcName;var code="Date.prototype."+funcName+" = function() {return ";var special=false;var ch="";for(var i=0;i 0) {";var regex="";var special=false;var ch="";for(var i=0;i 0 && z > 0){\nvar doyDate = new Date(y,0);\ndoyDate.setDate(z);\nm = doyDate.getMonth();\nd = doyDate.getDate();\n}";code+="if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n{return new Date(y, m, d, h, i, s);}\nelse if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n{return new Date(y, m, d, h, i);}\nelse if (y > 0 && m >= 0 && d > 0 && h >= 0)\n{return new Date(y, m, d, h);}\nelse if (y > 0 && m >= 0 && d > 0)\n{return new Date(y, m, d);}\nelse if (y > 0 && m >= 0)\n{return new Date(y, m);}\nelse if (y > 0)\n{return new Date(y);}\n}return null;}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$");eval(code);};Date.formatCodeToRegex=function(b,a){switch(b){case"D":return{g:0,c:null,s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};case"j":case"d":return{g:1,c:"d = parseInt(results["+a+"], 10);\n",s:"(\\d{1,2})"};case"l":return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"};case"S":return{g:0,c:null,s:"(?:st|nd|rd|th)"};case"w":return{g:0,c:null,s:"\\d"};case"z":return{g:1,c:"z = parseInt(results["+a+"], 10);\n",s:"(\\d{1,3})"};case"W":return{g:0,c:null,s:"(?:\\d{2})"};case"F":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+a+"].substring(0, 3)], 10);\n",s:"("+Date.monthNames.join("|")+")"};case"M":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+a+"]], 10);\n",s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};case"n":case"m":return{g:1,c:"m = parseInt(results["+a+"], 10) - 1;\n",s:"(\\d{1,2})"};case"t":return{g:0,c:null,s:"\\d{1,2}"};case"L":return{g:0,c:null,s:"(?:1|0)"};case"Y":return{g:1,c:"y = parseInt(results["+a+"], 10);\n",s:"(\\d{4})"};case"y":return{g:1,c:"var ty = parseInt(results["+a+"], 10);\ny = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"};case"a":return{g:1,c:"if (results["+a+"] == 'am') {\nif (h == 12) { h = 0; }\n} else { if (h < 12) { h += 12; }}",s:"(am|pm)"};case"A":return{g:1,c:"if (results["+a+"] == 'AM') {\nif (h == 12) { h = 0; }\n} else { if (h < 12) { h += 12; }}",s:"(AM|PM)"};case"g":case"G":case"h":case"H":return{g:1,c:"h = parseInt(results["+a+"], 10);\n",s:"(\\d{1,2})"};case"i":return{g:1,c:"i = parseInt(results["+a+"], 10);\n",s:"(\\d{2})"};case"s":return{g:1,c:"s = parseInt(results["+a+"], 10);\n",s:"(\\d{2})"};case"O":return{g:0,c:null,s:"[+-]\\d{4}"};case"T":return{g:0,c:null,s:"[A-Z]{3}"};case"Z":return{g:0,c:null,s:"[+-]\\d{1,5}"};default:return{g:0,c:null,s:String.escape(b)};}};Date.prototype.getTimezone=function(){return this.toString().replace(/^.*? ([A-Z]{3}) [0-9]{4}.*$/,"$1").replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,"$1$2$3");};Date.prototype.getGMTOffset=function(){return(this.getTimezoneOffset()>0?"-":"+")+String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset())/60),2,"0")+String.leftPad(Math.abs(this.getTimezoneOffset())%60,2,"0");};Date.prototype.getDayOfYear=function(){var a=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var b=0;bOpenStreetMap contributors' - }).addTo(map); - - map.setView([51.505, -0.09], 0); - - L.Icon.Default.imagePath = '/css/images'; - var popup = L.popup(); - - var marker = L.marker(); - - function onMapClick(e) { - marker - .setLatLng(e.latlng) - //.setContent("You clicked the map at " + e.latlng.toString()) - .addTo(map); - } - - map.on('click', onMapClick); - - $('.geo.chooser').modal('setting', { - closable: false, - onApprove: function () { - var coords = marker.getLatLng(); - $('input[name=location_lat]').val(coords.lat); - $('input[name=location_lon]').val(coords.lng); - $('input[name=location]').css('margin-bottom','3.2rem'); - $('span.coords').text('Folgende Koordinaten sind angegeben: lat:' +coords.lat + ', lon:' + coords.lng); - }, - onDeny: function () { - - }, - onVisible: function () { - map.invalidateSize(true); - map.locate({setView: true}); - } - }).modal('attach events', '.add_geo', 'show'); -}); diff --git a/web/js/e306c7e.js b/web/js/e306c7e.js deleted file mode 100644 index 93d9060..0000000 --- a/web/js/e306c7e.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Created by tim on 06.07.14. - */ - -// initializing with settings - -function addGeoCoordinates(ev) { - return false; -} -var map = null; -$(document).ready(function () { - $('.icon.link').popup(); - jQuery('input[type=datetime]').datetimepicker({lang: 'de', format: 'Y-m-d H:i'}); - - $('.add_geo').click(addGeoCoordinates); - map = L.map('map'); - - // add an OpenStreetMap tile layer - L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { - attribution: '© OpenStreetMap contributors' - }).addTo(map); - - map.setView([51.505, -0.09], 0); - - L.Icon.Default.imagePath = '/css/images'; - var popup = L.popup(); - - var marker = L.marker(); - - function onMapClick(e) { - marker - .setLatLng(e.latlng) - //.setContent("You clicked the map at " + e.latlng.toString()) - .addTo(map); - } - - map.on('click', onMapClick); - - $('.geo.chooser').modal('setting', { - closable: false, - onApprove: function () { - var coords = marker.getLatLng(); - $('input[name=location_lat]').val(coords.lat); - $('input[name=location_lon]').val(coords.lng); - $('input[name=location]').css('margin-bottom','3.2rem'); - $('span.coords').text('Folgende Koordinaten sind angegeben: lat:' +coords.lat + ', lon:' + coords.lng); - }, - onDeny: function () { - - }, - onVisible: function () { - map.invalidateSize(true); - map.locate({setView: true}); - } - }).modal('attach events', '.add_geo', 'show'); -}); From 0691e1e5373af999161bd179949aa4a27d1dcf48 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 29 Jul 2014 15:31:05 +0200 Subject: [PATCH 24/42] Only set an enddate if one is available --- .../Bundle/CalciferBundle/Controller/LocationController.php | 3 ++- .../Bundle/CalciferBundle/Controller/TagController.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php index 5f614de..3815bfd 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php @@ -79,7 +79,8 @@ class LocationController extends Controller /** @var Event $entity */ $event = new CalendarEvent(); $event->setStart($entity->startdate); - $event->setEnd($entity->enddate); + if ($entity->enddate instanceof \DateTime) + $event->setEnd($entity->enddate); $event->setSummary($entity->summary); $event->setDescription($entity->description); $location = new \Jsvrcek\ICS\Model\Description\Location(); diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php index 2f46fd3..bcb0a40 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php @@ -75,7 +75,8 @@ class TagController extends Controller /** @var Event $entity */ $event = new CalendarEvent(); $event->setStart($entity->startdate); - $event->setEnd($entity->enddate); + if ($entity->enddate instanceof \DateTime) + $event->setEnd($entity->enddate); $event->setSummary($entity->summary); $event->setDescription($entity->description); $location = new \Jsvrcek\ICS\Model\Description\Location(); From e9b10802d1c213a848d33cb9f0a77cb86511e67a Mon Sep 17 00:00:00 2001 From: andibraeu Date: Tue, 29 Jul 2014 22:47:20 +0200 Subject: [PATCH 25/42] support sqlite database path in config --- app/config/config.yml | 2 +- app/config/parameters.yml.dist | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/config/config.yml b/app/config/config.yml index ad67c1d..a9fdf65 100755 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -60,7 +60,7 @@ doctrine: charset: UTF8 # if using pdo_sqlite as your database driver, add the path in parameters.yml # e.g. database_path: "%kernel.root_dir%/data/data.db3" - # path: "%database_path%" + path: "%database_path%" orm: auto_generate_proxy_classes: "%kernel.debug%" diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist index ebdabb5..8b735b7 100644 --- a/app/config/parameters.yml.dist +++ b/app/config/parameters.yml.dist @@ -5,6 +5,7 @@ parameters: database_name: symfony database_user: root database_password: ~ + database_path: "%kernel.root_dir%/ffcal.sqlite3" mailer_transport: smtp mailer_host: 127.0.0.1 From b9a4af7b82ec0f88777878ab4d03b1fb1ee02995 Mon Sep 17 00:00:00 2001 From: andibraeu Date: Tue, 29 Jul 2014 22:53:30 +0200 Subject: [PATCH 26/42] Install instructions tell about database options --- INSTALL.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/INSTALL.md b/INSTALL.md index 1256929..ba121f3 100755 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,6 +15,8 @@ Diese Anleitung geht davon aus das du SSH-Zugriff auf deinen Server hast. Wenn d 3. Abhängigkeiten installieren 1. composer herunterladen ```curl -sS https://getcomposer.org/installer | php``` 2. Installation ausführen: ```php composer.phar install``` + - für MySQL wähle pdo_mysql als Datenbanktreiber + - für SQLite ist pdo_sqlite zu nutzen, dabei ist der Pfad anzugeben. Der Standardpfad legt die Datei ffcal.sqlite3 im Verzeichnis app an. 5. Dann die Tabellen erstellen: ```php app/console doctrine:schema:update --force``` 6. Cache löschen ```php app/console cache:clear --env=prod --no-debug``` 7. Assets dumpen ```php app/console assetic:dump --env=prod --no-debug``` From bf2ddbea4ac761a1fa6a3b12707dd1aba9e5d325 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 29 Jul 2014 16:15:10 +0200 Subject: [PATCH 27/42] Added postgresql to the manual and choose a more generic sqlite database name. --- INSTALL.md | 3 ++- app/config/parameters.yml.dist | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) mode change 100644 => 100755 app/config/parameters.yml.dist diff --git a/INSTALL.md b/INSTALL.md index ba121f3..bff3671 100755 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,8 +15,9 @@ Diese Anleitung geht davon aus das du SSH-Zugriff auf deinen Server hast. Wenn d 3. Abhängigkeiten installieren 1. composer herunterladen ```curl -sS https://getcomposer.org/installer | php``` 2. Installation ausführen: ```php composer.phar install``` + - für PostgreSQL wähl pdo_pgsql als Datenbanktreiber - für MySQL wähle pdo_mysql als Datenbanktreiber - - für SQLite ist pdo_sqlite zu nutzen, dabei ist der Pfad anzugeben. Der Standardpfad legt die Datei ffcal.sqlite3 im Verzeichnis app an. + - für SQLite ist pdo_sqlite zu nutzen, dabei ist der Pfad anzugeben. Der Standardpfad legt die Datei calcifer.sqlite3 im Verzeichnis app an. 5. Dann die Tabellen erstellen: ```php app/console doctrine:schema:update --force``` 6. Cache löschen ```php app/console cache:clear --env=prod --no-debug``` 7. Assets dumpen ```php app/console assetic:dump --env=prod --no-debug``` diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist old mode 100644 new mode 100755 index 8b735b7..64d8e1c --- a/app/config/parameters.yml.dist +++ b/app/config/parameters.yml.dist @@ -5,7 +5,7 @@ parameters: database_name: symfony database_user: root database_password: ~ - database_path: "%kernel.root_dir%/ffcal.sqlite3" + database_path: "%kernel.root_dir%/calcifer.sqlite3" mailer_transport: smtp mailer_host: 127.0.0.1 From f554de91ba1a5c6cce2d7785a3aea667597683f7 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Wed, 30 Jul 2014 17:31:53 +0200 Subject: [PATCH 28/42] Added a mission statement. --- .../Resources/assets/css/main.scss | 37 ++++++++++++++++++ .../Resources/assets/images/logo.png | Bin 0 -> 156785 bytes .../Resources/views/layout.html.twig | 24 +++++++++++- web/css/custom.css | 33 ---------------- web/css/custom.scss | 0 web/css/{semantic.css => semantic.scss} | 0 6 files changed, 59 insertions(+), 35 deletions(-) create mode 100644 src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss create mode 100644 src/Hackspace/Bundle/CalciferBundle/Resources/assets/images/logo.png delete mode 100755 web/css/custom.css create mode 100644 web/css/custom.scss rename web/css/{semantic.css => semantic.scss} (100%) mode change 100755 => 100644 diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss new file mode 100644 index 0000000..b4dd9dd --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss @@ -0,0 +1,37 @@ +body { + margin: 0; + font-family: 'Roboto', sans-serif; +} + +header { + top: 0; +} + +header .ui.grid > .column, .title.ui.grid > .column { + margin-top: 0; + margin-bottom: 0; +} + +.box h2 { + font-size: 1rem !important; +} + +a .icon { + text-decoration: none; +} + +a, a:hover, a:visited { + color: #000000; +} + +a:hover { + text-decoration: none; +} + +#mission-statement { + overflow: hidden; + + img { + margin-bottom: 0; + } +} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/images/logo.png b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a377dabd302a1074cfd4b248383755631b12c0a0 GIT binary patch literal 156785 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%0A*EE@!vw{2fZLkQ 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 block title %}Terminverwaltung Calcifer{% endblock %} - - + {% stylesheets filter="compass" + "@CalciferBundle/Resources/assets/css/main.scss" + "css/semantic.scss" + "css/custom.scss" + %} + + {% endstylesheets %} {% block css %} {% endblock %} @@ -17,6 +22,21 @@ {% include "CalciferBundle::navigation.html.twig" %} +

+
+
+ {% image '@CalciferBundle/Resources/assets/images/logo.png' %} + Eine Zeichnung von Calcifer. Gezeichnet von simply-Sylvan (http://simply-sylvan.deviantart.com/art/Calcifer-Purple-176746086) + {% endimage %} +

Calcifer ist ein Daemon aus dem Anime „Das wandelnde Schloss“, der sich darum kümmert das sich Howls Schloss weiter bewegt. Diese Terminverwaltung soll dafür sorgen das sich der Hackspace Jena auch weiter bewegt und viele tolle Termine statfinden.

+
+
+
+
{% block body %}{% endblock %}
diff --git a/web/css/custom.css b/web/css/custom.css deleted file mode 100755 index eeefcc3..0000000 --- a/web/css/custom.css +++ /dev/null @@ -1,33 +0,0 @@ -body { - margin: 0; - font-family: 'Roboto', sans-serif; -} - -header { - top: 0; -} - -header .ui.grid > .column, .title.ui.grid > .column { - margin-top: 0; - margin-bottom: 0; -} - -.box h2 { - font-size: 1rem !important; -} - -#main { - margin-top: 4rem; -} - -a .icon { - text-decoration: none; -} - -a, a:hover, a:visited { - color: #000000; -} - -a:hover { - text-decoration: none; -} \ No newline at end of file diff --git a/web/css/custom.scss b/web/css/custom.scss new file mode 100644 index 0000000..e69de29 diff --git a/web/css/semantic.css b/web/css/semantic.scss old mode 100755 new mode 100644 similarity index 100% rename from web/css/semantic.css rename to web/css/semantic.scss From 4f187ad08a7dd6a30ce5a27a8a6bd7fabdba646f Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Thu, 31 Jul 2014 09:51:34 +0200 Subject: [PATCH 29/42] Added the url to the ics file. --- composer.json | 2 +- .../Controller/LocationController.php | 14 +++++++++++++- .../CalciferBundle/Controller/TagController.php | 16 +++++++++++++--- .../Bundle/CalciferBundle/Entity/Location.php | 4 ++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 3ee53f9..4823ea7 100755 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "incenteev/composer-parameter-handler": "~2.0", "jquery/jquery": "1.10.*", "knplabs/knp-markdown-bundle": "~1.3", - "jsvrcek/ics": "dev-master", + "enko/ics": "~0.1", "doctrine/migrations": "dev-master", "doctrine/doctrine-migrations-bundle": "dev-master", "jbroadway/urlify" : "~1.0" diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php index 3815bfd..631892a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php @@ -24,7 +24,7 @@ use Jsvrcek\ICS\Model\Relationship\Organizer; use Jsvrcek\ICS\Utility\Formatter; use Jsvrcek\ICS\CalendarStream; use Jsvrcek\ICS\CalendarExport; -use Symfony\Component\Validator\Constraints\DateTime; +use Jsvrcek\ICS\Model\Description\Geo; /** * Location controller. @@ -82,6 +82,18 @@ class LocationController extends Controller if ($entity->enddate instanceof \DateTime) $event->setEnd($entity->enddate); $event->setSummary($entity->summary); + $event->setUrl($entity->url); + if ($entity->location instanceof Location) { + $location = new \Jsvrcek\ICS\Model\Description\Location(); + $location->setName($entity->location->name); + $event->setLocations([$location]); + if (\is_float($entity->location->lon) && \is_float($entity->location->lat)) { + $geo = new Geo(); + $geo->setLatitude($entity->location->lat); + $geo->setLongitude($entity->location->lon); + $event->setGeo($geo); + } + } $event->setDescription($entity->description); $location = new \Jsvrcek\ICS\Model\Description\Location(); $location->setName($entity->getLocation()->name); diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php index bcb0a40..dfb63f5 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php @@ -7,6 +7,7 @@ use Doctrine\ORM\EntityRepository; use Doctrine\ORM\QueryBuilder; use Hackspace\Bundle\CalciferBundle\Entity\Location; use Hackspace\Bundle\CalciferBundle\Entity\Tag; +use Jsvrcek\ICS\Model\Description\Geo; use Symfony\Component\HttpFoundation\Request; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; @@ -79,9 +80,18 @@ class TagController extends Controller $event->setEnd($entity->enddate); $event->setSummary($entity->summary); $event->setDescription($entity->description); - $location = new \Jsvrcek\ICS\Model\Description\Location(); - $location->setName($entity->location->name); - $event->setLocations([$location]); + $event->setUrl($entity->url); + if ($entity->location instanceof Location) { + $location = new \Jsvrcek\ICS\Model\Description\Location(); + $location->setName($entity->location->name); + $event->setLocations([$location]); + if (\is_float($entity->location->lon) && \is_float($entity->location->lat)) { + $geo = new Geo(); + $geo->setLatitude($entity->location->lat); + $geo->setLongitude($entity->location->lon); + $event->setGeo($geo); + } + } $calendar->addEvent($event); } diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php b/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php index af10407..afd6feb 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php @@ -7,6 +7,10 @@ use Doctrine\ORM\Mapping as ORM; /** * Location * + * @property string $name + * @property float $lon + * @property float $lat + * * @ORM\Table(name="locations") * @ORM\Entity */ From 16c48302b9dac927cf0b0af2182b53f78fe8a97a Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Thu, 31 Jul 2014 15:09:45 +0200 Subject: [PATCH 30/42] Replaced the favicon --- web/favicon.ico | Bin 1150 -> 0 bytes web/favicon.png | Bin 0 -> 865 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 web/favicon.ico create mode 100644 web/favicon.png diff --git a/web/favicon.ico b/web/favicon.ico deleted file mode 100644 index 864803618e0888f8463c0b30038633c018f939cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmaizUr1AN6vuy3^oL%AsH~?RBQobI=ccaNk~J)QQD?41%~lUl4?1&O#PTUgotA-9 zsDZB9Dx!CTsTlUUw?V5x4YK5>5M*n+r|-FL<1!X8KKK0Y+4-K|Ip_DgLX_ZFS}O27 zD6VZ4Vy_V55P%DwO+Snf_;2^FO_X=lLt9ZPzz)z@c~ldI{Q@#slCUp96W9qfs%tQ*oXL6(4`+eocJ>~>XTi!Tx6`NE0#k>{2Oo} ztK9}W2EBZ;)|i=(L{i>6UU}sHFa>93DOU?()OGNh>)?K^U==8P)fsB(g!Z`H)Oe2K zAL8V3c}P=UQK;p237iK()-qO$m3q1_)5Uf>)l?g3abZDzzr3uhc^8WX1k|b(vZuwUYd`2nOcXxJ?f6`A^uQ+Js>k0*)1Z4Ms zn^LJ1IeVQ{e)veSS*BUf_2AsdWHfQT>0~mg)MIP0(fZmtg+pPwU~40@=~Q74tpCV* z?ho@%#bU9aI76NxIeHwFNF*?aMWwIcY>?`WCUqU3p`BrU7P-H#KQlGy-*EQ!{qC?| zBHyTwqR}XwX|T}E>o*E#8G_CNzUOjq9hiOEpwp*$E~o3w^mcAenG2uk(7mCIUZ>~% zB=me1mhaCn;Cq#;BX2o}t+|y3?+$Lc6{R^^&pjZF^ diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..be99b5e76b0450179f15047715a3088b34bf1a19 GIT binary patch literal 865 zcmV-n1D^beP)H<#0`5sf zK~y-)b(2YG6j2a{|JScyces3cxg45EUfsJLGg;|4Rtjf`eGJzICb_dGddQ0rDu^-=X#{RIDry^Ajr zA>~>Kacf7*^7c6x?~y-xsO%A&CdhKMINC2 zY3vXHq!Q`keuKm9Je5H_+I8kg&E*9E(020iUjW)O8P|JS<>b;i(>0AgdVb^0E7x%a zB}5XSq;l%A!lk=s^dL+G5X+w+9Z!!^2`a;pz!2ZbXw(-h6L(YwIU@SHW7o$g(a@=l z*NPkFHQ$x;0RaHDC%`n+ip-Cs@$lT!o2n;Z1xye_X1hDO`WTkheCN!Qiq5b0jBoGb z)6Q>i3jlD)pJpi~sT;OmPyjk1P*n;7fC~;ET)0`T6of6`PGnMLvqyhk)il36C*s+4 zSJe|$7j^~=>S)}DNhu5fI_C)KI(jh%LnZJNX=*UVh0l-WU13n!01|r^E~K6KuNiZMHx(uNR1*?GCXp-wzyu&0q!>41MxV`{OB$!PymAfh7{-%Fc1Ks z3yz?!gSk)?mpji|UwxWfRT0hs<~Pg|rpdZ=MoBNGp-@l+sfvhUAfz#bbsdH;p>QAY zyr5p7HZMIqw=)MQpEHKT7eZ!TxK0w)A2uUWHx{Pv!-PcX)(NP2vjLg_C?SZHgs%M2 zAa{j*qxQ_SEVf&A*yF7TLx~7L^L=EwM5mX9tpQG2fP}4Ig+u$6)wZsT<-PK@xAkq{ zBFd!z|CWZGu#rgE=8i8&UN}DfAlARwx{xqhpJj@4 z6yeztNP*y2G6{1)=+ek}W&Nu!uV`$V)QA-qs`FO>fRhssVb#M;I5u$0YNnFes)Xw% r-MAVwZ>)LWaQ%Q)hb>NHo|%3F?{+Yb6*KX800000NkvXXu0mjfO_6;q literal 0 HcmV?d00001 From 6908eeebc9f20b194a2869af69606ec770056fea Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Fri, 1 Aug 2014 11:32:27 +0200 Subject: [PATCH 31/42] Specify the favicon in the main template. --- .../Bundle/CalciferBundle/Resources/views/layout.html.twig | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/layout.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/layout.html.twig index 5f8f997..dcc898a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/layout.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/layout.html.twig @@ -5,6 +5,7 @@ {% block title %}Terminverwaltung Calcifer{% endblock %} + {% stylesheets filter="compass" "@CalciferBundle/Resources/assets/css/main.scss" From befd59c2a7d34a099b9ecef32ca93d29810e86ed Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 31 Aug 2014 13:42:52 +0200 Subject: [PATCH 32/42] Add enddate to the event box. Fixes #10 --- .../Bundle/CalciferBundle/Entity/Event.php | 13 +++++++++++++ .../Resources/views/Event/event_box.html.twig | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php index 4e33540..8a3a791 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php @@ -104,4 +104,17 @@ class Event extends BaseEntity public function isValid() { return true; } + + public function getFormatedDate() { + $retval = $this->startdate->format('Y-m-d H:i'); + if (!is_null($this->enddate)) { + $retval .= " — "; + if ($this->startdate->format('Y-m-d') == $this->enddate->format('Y-m-d')) { + $retval .= $this->enddate->format('H:i'); + } else { + $retval .= $this->enddate->format('Y-m-d H:i'); + } + } + return $retval; + } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig index e40664c..84f135a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig @@ -11,7 +11,7 @@ {% if entity.location is not null %} From fedcb0e86024417ac51d98cf48b234a7b204d3ae Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 31 Aug 2014 13:45:46 +0200 Subject: [PATCH 33/42] Add a UTF-8 hint, so compass does not fail to build the css. --- web/css/semantic.scss | 2 ++ 1 file changed, 2 insertions(+) mode change 100644 => 100755 web/css/semantic.scss diff --git a/web/css/semantic.scss b/web/css/semantic.scss old mode 100644 new mode 100755 index 610c924..b5b8295 --- a/web/css/semantic.scss +++ b/web/css/semantic.scss @@ -1,3 +1,5 @@ +@charset "UTF-8"; + /* * # Semantic - Breadcrumb * http://github.com/jlukic/semantic-ui/ From ec89bd77fe1a0d0af3bdb28de04bad1409206dec Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 31 Aug 2014 13:46:23 +0200 Subject: [PATCH 34/42] Update dependencies. --- composer.lock | 283 ++++++++++++++++++++++++++++---------------------- 1 file changed, 157 insertions(+), 126 deletions(-) diff --git a/composer.lock b/composer.lock index db1aac7..d3cb91e 100755 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "a72c02cc5e14c865991a846b5bac02fb", + "hash": "77745a3287830b815f677d20df33b385", "packages": [ { "name": "doctrine/annotations", @@ -444,12 +444,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "f7138381aa884c0f679da4de41e369b94ead9cd3" + "reference": "81575a4316951125ce408c70f30547c77d98f78a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/f7138381aa884c0f679da4de41e369b94ead9cd3", - "reference": "f7138381aa884c0f679da4de41e369b94ead9cd3", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/81575a4316951125ce408c70f30547c77d98f78a", + "reference": "81575a4316951125ce408c70f30547c77d98f78a", "shasum": "" }, "require": { @@ -474,12 +474,6 @@ "MIT" ], "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" @@ -487,6 +481,10 @@ { "name": "Doctrine Project", "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], "description": "Symfony DoctrineMigrationsBundle", @@ -496,7 +494,7 @@ "migrations", "schema" ], - "time": "2014-03-20 14:48:55" + "time": "2014-08-17 07:53:47" }, { "name": "doctrine/inflector", @@ -620,12 +618,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "4256449c5e2603a6b6ee5a78c7c4521d4d4430b8" + "reference": "1a9dffa64e33fdc10f4b4c3f5d7230b74d4a1021" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/4256449c5e2603a6b6ee5a78c7c4521d4d4430b8", - "reference": "4256449c5e2603a6b6ee5a78c7c4521d4d4430b8", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/1a9dffa64e33fdc10f4b4c3f5d7230b74d4a1021", + "reference": "1a9dffa64e33fdc10f4b4c3f5d7230b74d4a1021", "shasum": "" }, "require": { @@ -655,15 +653,13 @@ "LGPL" ], "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/", - "role": "Creator" - }, { "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" } ], "description": "Database Schema migrations using Doctrine DBAL", @@ -672,20 +668,20 @@ "database", "migrations" ], - "time": "2014-07-09 07:58:02" + "time": "2014-08-18 18:03:07" }, { "name": "doctrine/orm", - "version": "v2.4.3", + "version": "v2.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "8a13376d42b5ea467727ffe730aa0e14ca3c5e29" + "reference": "fc19c3b53dcd00e6584db40669fdd699c4671f97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/8a13376d42b5ea467727ffe730aa0e14ca3c5e29", - "reference": "8a13376d42b5ea467727ffe730aa0e14ca3c5e29", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/fc19c3b53dcd00e6584db40669fdd699c4671f97", + "reference": "fc19c3b53dcd00e6584db40669fdd699c4671f97", "shasum": "" }, "require": { @@ -748,7 +744,59 @@ "database", "orm" ], - "time": "2014-06-10 11:49:08" + "time": "2014-07-11 03:05:53" + }, + { + "name": "enko/ics", + "version": "0.1.0", + "source": { + "type": "git", + "url": "https://github.com/enko/ICS.git", + "reference": "60416fc3842a7b4ee4f0938b8c35c96b402fee32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/enko/ICS/zipball/60416fc3842a7b4ee4f0938b8c35c96b402fee32", + "reference": "60416fc3842a7b4ee4f0938b8c35c96b402fee32", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "3.6.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Jsvrcek\\ICS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Svrcek", + "homepage": "https://github.com/jasvrcek" + }, + { + "name": "Tim Schumacher", + "homepage": "https://github.com/enko" + } + ], + "description": "abstraction layer for creating multi-byte safe RFC 5545 compliant .ics files", + "homepage": "https://github.com/enko/ICS", + "keywords": [ + ".ics", + "RFC 5545", + "calendar", + "export", + "ical", + "multi-byte safe" + ], + "time": "2014-07-30 23:43:46" }, { "name": "incenteev/composer-parameter-handler", @@ -918,54 +966,6 @@ }, "type": "library" }, - { - "name": "jsvrcek/ics", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/jasvrcek/ICS.git", - "reference": "85e3e34214547a9981bd3be38633f9dce4f85094" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jasvrcek/ICS/zipball/85e3e34214547a9981bd3be38633f9dce4f85094", - "reference": "85e3e34214547a9981bd3be38633f9dce4f85094", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "3.6.*" - }, - "type": "library", - "autoload": { - "psr-0": { - "Jsvrcek\\ICS\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Svrcek", - "homepage": "https://github.com/jasvrcek" - } - ], - "description": "abstraction layer for creating multi-byte safe RFC 5545 compliant .ics files", - "homepage": "https://github.com/jasvrcek/ICS", - "keywords": [ - ".ics", - "RFC 5545", - "calendar", - "export", - "ical", - "multi-byte safe" - ], - "time": "2013-10-28 17:21:17" - }, { "name": "knplabs/knp-markdown-bundle", "version": "1.3.2", @@ -1255,29 +1255,25 @@ }, { "name": "sensio/distribution-bundle", - "version": "v3.0.1", + "version": "v3.0.5", "target-dir": "Sensio/Bundle/DistributionBundle", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", - "reference": "e9caa300faf95076c8e27693f3fdb0bb6e3148c0" + "reference": "ad10123f2532f6e311e583cce203ef368eedc469" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/e9caa300faf95076c8e27693f3fdb0bb6e3148c0", - "reference": "e9caa300faf95076c8e27693f3fdb0bb6e3148c0", + "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/ad10123f2532f6e311e583cce203ef368eedc469", + "reference": "ad10123f2532f6e311e583cce203ef368eedc469", "shasum": "" }, "require": { "php": ">=5.3.3", + "sensiolabs/security-checker": "~2.0", "symfony/class-loader": "~2.2", - "symfony/config": "~2.2", - "symfony/dependency-injection": "~2.2", - "symfony/filesystem": "~2.2", "symfony/form": "~2.2", - "symfony/framework-bundle": "~2.2", - "symfony/http-foundation": "~2.2", - "symfony/http-kernel": "~2.2", + "symfony/framework-bundle": "~2.4", "symfony/process": "~2.2", "symfony/validator": "~2.2", "symfony/yaml": "~2.2" @@ -1300,17 +1296,15 @@ "authors": [ { "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" + "email": "fabien@symfony.com" } ], - "description": "The base bundle for the Symfony Distributions", + "description": "Base bundle for Symfony Distributions", "keywords": [ "configuration", "distribution" ], - "time": "2014-06-06 02:53:20" + "time": "2014-08-26 13:14:47" }, { "name": "sensio/framework-extra-bundle", @@ -1369,6 +1363,51 @@ ], "time": "2014-05-22 23:27:44" }, + { + "name": "sensiolabs/security-checker", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/security-checker.git", + "reference": "5b4eb4743ebe68276c911c84101ecdf4a9ae76ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/5b4eb4743ebe68276c911c84101ecdf4a9ae76ee", + "reference": "5b4eb4743ebe68276c911c84101ecdf4a9ae76ee", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "symfony/console": "~2.0" + }, + "bin": [ + "security-checker" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-0": { + "SensioLabs\\Security": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "A security checker for your composer.lock", + "time": "2014-07-19 10:52:35" + }, { "name": "swiftmailer/swiftmailer", "version": "v5.2.1", @@ -1488,20 +1527,21 @@ }, { "name": "symfony/icu", - "version": "v1.2.1", + "version": "v1.2.2", "target-dir": "Symfony/Component/Icu", "source": { "type": "git", "url": "https://github.com/symfony/Icu.git", - "reference": "98e197da54df1f966dd5e8a4992135703569c987" + "reference": "d4d85d6055b87f394d941b45ddd3a9173e1e3d2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Icu/zipball/98e197da54df1f966dd5e8a4992135703569c987", - "reference": "98e197da54df1f966dd5e8a4992135703569c987", + "url": "https://api.github.com/repos/symfony/Icu/zipball/d4d85d6055b87f394d941b45ddd3a9173e1e3d2a", + "reference": "d4d85d6055b87f394d941b45ddd3a9173e1e3d2a", "shasum": "" }, "require": { + "ext-intl": "*", "lib-icu": ">=4.4", "php": ">=5.3.3", "symfony/intl": "~2.3" @@ -1532,21 +1572,20 @@ "icu", "intl" ], - "time": "2013-10-04 10:06:38" + "time": "2014-07-25 09:58:17" }, { "name": "symfony/monolog-bundle", - "version": "v2.6.0", - "target-dir": "Symfony/Bundle/MonologBundle", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/symfony/MonologBundle.git", - "reference": "e1d4aa99c7440b11e9dfbfef7ed63084401dbc6a" + "reference": "227bbeefe30f2d95e3fe5fbd1ccda414287a957a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/MonologBundle/zipball/e1d4aa99c7440b11e9dfbfef7ed63084401dbc6a", - "reference": "e1d4aa99c7440b11e9dfbfef7ed63084401dbc6a", + "url": "https://api.github.com/repos/symfony/MonologBundle/zipball/227bbeefe30f2d95e3fe5fbd1ccda414287a957a", + "reference": "227bbeefe30f2d95e3fe5fbd1ccda414287a957a", "shasum": "" }, "require": { @@ -1568,8 +1607,8 @@ } }, "autoload": { - "psr-0": { - "Symfony\\Bundle\\MonologBundle": "" + "psr-4": { + "Symfony\\Bundle\\MonologBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1577,15 +1616,13 @@ "MIT" ], "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], "description": "Symfony MonologBundle", @@ -1594,7 +1631,7 @@ "log", "logging" ], - "time": "2014-06-04 16:49:13" + "time": "2014-07-21 00:36:06" }, { "name": "symfony/swiftmailer-bundle", @@ -1655,16 +1692,16 @@ }, { "name": "symfony/symfony", - "version": "v2.5.1", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/symfony/symfony.git", - "reference": "e3d2844abc988bc467bb1593cd340700096b0ac0" + "reference": "f077a238c781f845487a7c81fea8033ccd0e6a02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/symfony/zipball/e3d2844abc988bc467bb1593cd340700096b0ac0", - "reference": "e3d2844abc988bc467bb1593cd340700096b0ac0", + "url": "https://api.github.com/repos/symfony/symfony/zipball/f077a238c781f845487a7c81fea8033ccd0e6a02", + "reference": "f077a238c781f845487a7c81fea8033ccd0e6a02", "shasum": "" }, "require": { @@ -1751,15 +1788,13 @@ "MIT" ], "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], "description": "The Symfony PHP framework", @@ -1767,7 +1802,7 @@ "keywords": [ "framework" ], - "time": "2014-07-08 14:42:08" + "time": "2014-08-06 07:03:01" }, { "name": "twig/extensions", @@ -1927,19 +1962,15 @@ "time": "2014-04-28 14:01:06" } ], - "aliases": [ - - ], + "aliases": [], "minimum-stability": "stable", "stability-flags": { - "jsvrcek/ics": 20, "doctrine/migrations": 20, "doctrine/doctrine-migrations-bundle": 20 }, + "prefer-stable": false, "platform": { "php": ">=5.3.3" }, - "platform-dev": [ - - ] + "platform-dev": [] } From 0d9b4cce8e8aca70a3530ce746042719e5ccf73a Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 31 Aug 2014 13:55:24 +0200 Subject: [PATCH 35/42] Allow removing the enddate. Fixes #13 --- .../Bundle/CalciferBundle/Controller/EventController.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php index 023f6b2..d23aab5 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php @@ -204,6 +204,8 @@ class EventController extends Controller if (strlen($enddate) > 0) { $enddate = new \DateTime($enddate); $entity->enddate = $enddate; + } else { + $entity->enddate = null; } $location = $request->get('location'); From c7ab23c4aa79114dce5df27a5f0eee8fe05de6b8 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 31 Aug 2014 14:03:41 +0200 Subject: [PATCH 36/42] Use ISO-Format for the date in the placeholder attribute. --- .../CalciferBundle/Resources/views/Event/event_form.html.twig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig index f48ab4d..d2f1e82 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig @@ -9,7 +9,7 @@ name="startdate" required="required" value="{{ entity.startdate.format('Y-m-d H:i')|default('') }}" - placeholder="{{ "now"|date('d.m.Y H:i') }}" + placeholder="{{ "now"|date('Y-m-d H:i') }}" class="form-control"> @@ -27,7 +27,7 @@ id="event_enddate" name="enddate" value="{{ entity.enddate.format('Y-m-d H:i')|default('') }}" - placeholder="{{ "now"|date('d.m.Y H:i') }}" + placeholder="{{ "now"|date('Y-m-d H:i') }}" class="form-control"> From 8aef6ecc0fdf10dc3dd35f9579ab661a389b566e Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 31 Aug 2014 14:07:29 +0200 Subject: [PATCH 37/42] Update symfony files. --- app/SymfonyRequirements.php | 8 +- app/check.php | 148 +++++++++++++++++++++++++++--------- 2 files changed, 121 insertions(+), 35 deletions(-) diff --git a/app/SymfonyRequirements.php b/app/SymfonyRequirements.php index ed00a6f..25bc938 100644 --- a/app/SymfonyRequirements.php +++ b/app/SymfonyRequirements.php @@ -602,6 +602,12 @@ class SymfonyRequirements extends RequirementCollection 'Install and enable the XML extension.' ); + $this->addRecommendation( + function_exists('filter_var'), + 'filter_var() should be available', + 'Install and enable the filter extension.' + ); + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { $this->addRecommendation( function_exists('posix_isatty'), @@ -662,7 +668,7 @@ class SymfonyRequirements extends RequirementCollection $this->addRecommendation( $accelerator, 'a PHP accelerator should be installed', - 'Install and enable a PHP accelerator like APC (highly recommended).' + 'Install and/or enable a PHP accelerator (highly recommended).' ); if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { diff --git a/app/check.php b/app/check.php index 91b826b..bb0a20e 100644 --- a/app/check.php +++ b/app/check.php @@ -2,61 +2,141 @@ require_once dirname(__FILE__).'/SymfonyRequirements.php'; +$lineSize = 70; $symfonyRequirements = new SymfonyRequirements(); - $iniPath = $symfonyRequirements->getPhpIniConfigPath(); -echo "********************************\n"; -echo "* *\n"; -echo "* Symfony requirements check *\n"; -echo "* *\n"; -echo "********************************\n\n"; +echo_title('Symfony2 Requirements Checker'); -echo $iniPath ? sprintf("* Configuration file used by PHP: %s\n\n", $iniPath) : "* WARNING: No configuration file (php.ini) used by PHP!\n\n"; - -echo "** ATTENTION **\n"; -echo "* The PHP CLI can use a different php.ini file\n"; -echo "* than the one used with your web server.\n"; -if ('\\' == DIRECTORY_SEPARATOR) { - echo "* (especially on the Windows platform)\n"; +echo '> PHP is using the following php.ini file:'.PHP_EOL; +if ($iniPath) { + echo_style('green', ' '.$iniPath); +} else { + echo_style('warning', ' WARNING: No configuration file (php.ini) used by PHP!'); } -echo "* To be on the safe side, please also launch the requirements check\n"; -echo "* from your web server using the web/config.php script.\n"; -echo_title('Mandatory requirements'); +echo PHP_EOL.PHP_EOL; -$checkPassed = true; +echo '> Checking Symfony requirements:'.PHP_EOL.' '; + +$messages = array(); foreach ($symfonyRequirements->getRequirements() as $req) { /** @var $req Requirement */ - echo_requirement($req); - if (!$req->isFulfilled()) { - $checkPassed = false; + if ($helpText = get_error_message($req, $lineSize)) { + echo_style('red', 'E'); + $messages['error'][] = $helpText; + } else { + echo_style('green', '.'); } } -echo_title('Optional recommendations'); +$checkPassed = empty($messages['error']); foreach ($symfonyRequirements->getRecommendations() as $req) { - echo_requirement($req); + if ($helpText = get_error_message($req, $lineSize)) { + echo_style('yellow', 'W'); + $messages['warning'][] = $helpText; + } else { + echo_style('green', '.'); + } } +if ($checkPassed) { + echo_block('success', 'OK', 'Your system is ready to run Symfony2 projects', true); +} else { + echo_block('error', 'ERROR', 'Your system is not ready to run Symfony2 projects', true); + + echo_title('Fix the following mandatory requirements', 'red'); + + foreach ($messages['error'] as $helpText) { + echo ' * '.$helpText.PHP_EOL; + } +} + +if (!empty($messages['warning'])) { + echo_title('Optional recommendations to improve your setup', 'yellow'); + + foreach ($messages['warning'] as $helpText) { + echo ' * '.$helpText.PHP_EOL; + } +} + +echo PHP_EOL; +echo_style('title', 'Note'); +echo ' The command console could use a different php.ini file'.PHP_EOL; +echo_style('title', '~~~~'); +echo ' than the one used with your web server. To be on the'.PHP_EOL; +echo ' safe side, please check the requirements from your web'.PHP_EOL; +echo ' server using the '; +echo_style('yellow', 'web/config.php'); +echo ' script.'.PHP_EOL; +echo PHP_EOL; + exit($checkPassed ? 0 : 1); -/** - * Prints a Requirement instance - */ -function echo_requirement(Requirement $requirement) +function get_error_message(Requirement $requirement, $lineSize) { - $result = $requirement->isFulfilled() ? 'OK' : ($requirement->isOptional() ? 'WARNING' : 'ERROR'); - echo ' ' . str_pad($result, 9); - echo $requirement->getTestMessage() . "\n"; - - if (!$requirement->isFulfilled()) { - echo sprintf(" %s\n\n", $requirement->getHelpText()); + if ($requirement->isFulfilled()) { + return; } + + $errorMessage = wordwrap($requirement->getTestMessage(), $lineSize - 3, PHP_EOL.' ').PHP_EOL; + $errorMessage .= ' > '.wordwrap($requirement->getHelpText(), $lineSize - 5, PHP_EOL.' > ').PHP_EOL; + + return $errorMessage; } -function echo_title($title) +function echo_title($title, $style = null) { - echo "\n** $title **\n\n"; + $style = $style ?: 'title'; + + echo PHP_EOL; + echo_style($style, $title.PHP_EOL); + echo_style($style, str_repeat('~', strlen($title)).PHP_EOL); + echo PHP_EOL; +} + +function echo_style($style, $message) +{ + // ANSI color codes + $styles = array( + 'reset' => "\033[0m", + 'red' => "\033[31m", + 'green' => "\033[32m", + 'yellow' => "\033[33m", + 'error' => "\033[37;41m", + 'success' => "\033[37;42m", + 'title' => "\033[34m", + ); + $supports = has_color_support(); + + echo ($supports ? $styles[$style] : '').$message.($supports ? $styles['reset'] : ''); +} + +function echo_block($style, $title, $message) +{ + $message = ' '.trim($message).' '; + $width = strlen($message); + + echo PHP_EOL.PHP_EOL; + + echo_style($style, str_repeat(' ', $width).PHP_EOL); + echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT).PHP_EOL); + echo_style($style, str_pad($message, $width, ' ', STR_PAD_RIGHT).PHP_EOL); + echo_style($style, str_repeat(' ', $width).PHP_EOL); +} + +function has_color_support() +{ + static $support; + + if (null === $support) { + if (DIRECTORY_SEPARATOR == '\\') { + $support = false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI'); + } else { + $support = function_exists('posix_isatty') && @posix_isatty(STDOUT); + } + } + + return $support; } From f2bc90c9aea59a1e1574b7045145ffb40a2635c2 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 31 Aug 2014 14:26:05 +0200 Subject: [PATCH 38/42] Hide the underline on some of the icons. --- .../Bundle/CalciferBundle/Resources/assets/css/events.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss index 867884c..0dff5a8 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss @@ -13,6 +13,10 @@ margin-bottom: 0.5rem; } + a i.icon { + text-decoration: none; + } + ul.tags { padding-left: 0; margin: 0; From 405b19b15785e3d8f2ef4a036ee3ecd4a27e2756 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Wed, 17 Sep 2014 17:06:35 +0200 Subject: [PATCH 39/42] Only show the edit details on the detail page. --- .../CalciferBundle/Resources/views/Event/event_box.html.twig | 2 ++ .../Bundle/CalciferBundle/Resources/views/Event/show.html.twig | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig index 84f135a..fbf734a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig @@ -4,10 +4,12 @@ href="{{ path('_show', { 'slug': entity.slug }) }}">{{ entity.summary }} + {% if (detail|default(false)) %}

Bearbeiten

+ {% endif %}

- {{ include('CalciferBundle:Event:event_box.html.twig',{'entity' : entity}) }} + {{ include('CalciferBundle:Event:event_box.html.twig',{'entity' : entity,'detail' : true}) }}

{{ entity.startdate.format('Y-m-d H:i') }} + data-content="Wann?">{{ entity.getFormatedDate() }}

{% endblock %} From e8c94262d0dd738aba5198f7e3db721cd3aebd87 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Wed, 17 Sep 2014 17:37:54 +0200 Subject: [PATCH 40/42] Implemented deletion of events. Fixes #16 --- .../Controller/EventController.php | 37 +++++++++++++++++++ .../Resources/assets/css/events.scss | 2 +- .../Resources/views/Event/delete.html.twig | 29 +++++++++++++++ .../Resources/views/Event/event_box.html.twig | 7 ++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100755 src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php index d23aab5..3c83ff1 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php @@ -268,4 +268,41 @@ class EventController extends Controller } return $em; } + + /** + * Deletes a Event entity. + * + * @Route("/termine/{slug}/löschen", name="_delete") + * @Method({"GET", "POST"}) + * @Template("CalciferBundle:Event:delete.html.twig") + */ + public function deleteAction(Request $request, $slug) { + /** @var EntityManager $em */ + $em = $this->getDoctrine()->getManager(); + + /** @var EntityRepository $repo */ + $repo = $em->getRepository('CalciferBundle:Event'); + + /** @var Event $entity */ + $entity = $repo->findOneBy(['slug' => $slug]); + + if (!$entity) { + throw $this->createNotFoundException('Unable to find Event entity.'); + } + + + $confirmation = $request->get('confirmation',false); + + if (($request->getMethod() == 'POST') && ($confirmation)) { + $em->remove($entity); + $em->flush(); + + return $this->redirect('/'); + } + + return array( + 'entity' => $entity, + + ); + } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss index 0dff5a8..b109b51 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss @@ -6,7 +6,7 @@ } } - .startdate,.location,.url,.edit { + .startdate,.location,.url,.edit,.delete { display: inline; margin: 0; margin-right: 0.5rem; diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig new file mode 100755 index 0000000..66a4061 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig @@ -0,0 +1,29 @@ +{% extends 'CalciferBundle::layout.html.twig' %} + +{% block css %} + {% stylesheets filter="compass" + "@CalciferBundle/Resources/assets/css/events.scss" %} + + {% endstylesheets %} +{% endblock %} + +{% block javascripts %} + {% javascripts + "@CalciferBundle/Resources/assets/js/events.js" %} + + {% endjavascripts %} +{% endblock %} + +{% block body -%} +
+
+
+
+

Möchtest du die Veranstaltung „{{ entity.summary }}“ zum Datum „{{ entity.startdate.format('Y-m-d H:i') }}“ wirklich löschen?

+ + Nein +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig index fbf734a..a74377a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig @@ -9,6 +9,13 @@ Bearbeiten

+ +

+ + + Löschen + +

{% endif %}

From 9562a8d3a3c5a970be5b5236a4ec7eb6e5184902 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Wed, 17 Sep 2014 17:50:24 +0200 Subject: [PATCH 41/42] Implement copying of events. Fixes #17 --- .../Controller/EventController.php | 29 +++++++++++++++++++ .../Resources/assets/css/events.scss | 2 +- .../Resources/views/Event/edit.html.twig | 6 ++-- .../Resources/views/Event/event_box.html.twig | 11 +++++-- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php index 3c83ff1..3397192 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php @@ -305,4 +305,33 @@ class EventController extends Controller ); } + + /** + * Copies a Event entity. + * + * @Route("/termine/{slug}/kopieren", name="_copy") + * @Method("GET") + * @Template("CalciferBundle:Event:new.html.twig") + */ + public function copyAction(Request $request, $slug) { + /** @var EntityManager $em */ + $em = $this->getDoctrine()->getManager(); + + /** @var EntityRepository $repo */ + $repo = $em->getRepository('CalciferBundle:Event'); + + /** @var Event $entity */ + $entity = $repo->findOneBy(['slug' => $slug]); + + if (!$entity) { + throw $this->createNotFoundException('Unable to find Event entity.'); + } + + $entity->id = null; + + return array( + 'entity' => $entity, + + ); + } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss index b109b51..6b615cb 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss @@ -6,7 +6,7 @@ } } - .startdate,.location,.url,.edit,.delete { + .startdate,.location,.url,.action { display: inline; margin: 0; margin-right: 0.5rem; diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig index 07d2d67..a004f41 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig @@ -4,8 +4,7 @@ {% stylesheets filter="compass" "@CalciferBundle/Resources/assets/css/jquery.datetimepicker.scss" "@CalciferBundle/Resources/assets/css/events.scss" - "@CalciferBundle/Resources/assets/css/leaflet.scss" - %} + "@CalciferBundle/Resources/assets/css/leaflet.scss" %} {% endstylesheets %} {% endblock %} @@ -14,8 +13,7 @@ {% javascripts "@CalciferBundle/Resources/assets/js/jquery.datetimepicker.js" "@CalciferBundle/Resources/assets/js/events.js" - "@CalciferBundle/Resources/assets/js/leaflet.js" - %} + "@CalciferBundle/Resources/assets/js/leaflet.js" %} {% endjavascripts %} {% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig index a74377a..f451908 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig @@ -5,17 +5,24 @@ {% if (detail|default(false)) %} -

+

Bearbeiten

-

+

Löschen

+ +

+ + + Kopieren + +

{% endif %}

From 9fb6285d6e89120d3341d4b955c3ef721e2949c4 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Wed, 17 Sep 2014 17:59:00 +0200 Subject: [PATCH 42/42] Fix some whitespace issues. --- .../Resources/views/Event/event_box.html.twig | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig index f451908..4a9b99a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig @@ -11,17 +11,11 @@

- - - Löschen - + Löschen

- - - Kopieren - + Kopieren

{% endif %}