From 6916af8cd10a35322d05f2c7006e4ef78d7a21d9 Mon Sep 17 00:00:00 2001 From: Andi Date: Mon, 14 Jul 2014 19:25:54 +0200 Subject: [PATCH 01/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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/24] 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();