diff --git a/data/events.yml b/data/events.yml
index 55fdc2ed..f63263d9 100644
--- a/data/events.yml
+++ b/data/events.yml
@@ -59,7 +59,6 @@ events:
nomad_php:
name: Nomad PHP
- location: Online
url: https://nomadphp.com
nwdug:
diff --git a/source/_partials/talk/events.html.twig b/source/_partials/talk/events.html.twig
index 741b804b..3a1b611a 100644
--- a/source/_partials/talk/events.html.twig
+++ b/source/_partials/talk/events.html.twig
@@ -1,11 +1,21 @@
-{% set talks = getAllTalks([page], site.events) %}
-{% if talks is not empty %}
+{% if page.events %}
+
+
-
-
Upcoming Talks
+
+ {% for talk in getUpcomingTalks(page.talks|merge(data.talks)) %}
+ {% include 'talks/talk' %}
+ {% else %}
+
sdf
+ {% endfor %}
+
+
- {% set upcoming_talks = getUpcomingTalks(data.talks|merge(page.talks), site.events) %}
- {% if not upcoming_talks.empty %}
- {% include "talks/table" with {
- talks: upcoming_talks,
- upcoming: true,
- } %}
- {% else %}
-
Nothing scheduled at the moment.
- {% endif %}
-
+
+
-
-
Previous Talks
-
- {% include "talks/table" with {
- talks: getPastTalks(data.talks|merge(page.talks), site.events)
- } %}
+
+ {% for talk in getPastTalks(page.talks|merge(data.talks))|reverse %}
+ {% include 'talks/talk' %}
+ {% endfor %}
+
+
{% endblock %}
diff --git a/src/TalksBundle/TwigExtension/TalksExtension.php b/src/TalksBundle/TwigExtension/TalksExtension.php
index 1d1e290f..cd848d0a 100644
--- a/src/TalksBundle/TwigExtension/TalksExtension.php
+++ b/src/TalksBundle/TwigExtension/TalksExtension.php
@@ -34,77 +34,46 @@ class TalksExtension extends Twig_Extension
];
}
- /**
- * Get all upcoming and previous talks.
- *
- * @param ProxySourceCollection|array $talks All talk nodes.
- * @param array $eventData Shared event data.
- *
- * @return Collection A sorted collection of talks.
- */
- public function getAll($talks, array $eventData = [])
+ /**
+ * Get all upcoming and previous talks.
+ *
+ * @param ProxySourceCollection|array $talks All talk nodes.
+ *
+ * @return Collection A sorted collection of talks.
+ */
+ public function getAll($talks): Collection
{
- return $this->format($talks, $eventData)->sortBy('event.date');
+ return collect($talks)->sortBy(function ($talk) {
+ return $this->getLastDate($talk);
+ });
}
/**
* Get all upcoming talks.
*
* @param ProxySourceCollection|array $talks All talk nodes.
- * @param array $eventData Shared event data.
*
* @return Collection A sorted collection of talks.
*/
- public function getUpcoming($talks, array $eventData = [])
+ public function getUpcoming($talks): Collection
{
- return $this->format($talks, $eventData)
- ->filter(function ($talk) {
- return $talk['event']['date'] >= $this->today;
- })
- ->sortBy('event.date');
+ return $this->getAll($talks)->filter(function ($talk) {
+ return $this->getLastDate($talk) >= $this->today;
+ })->values();
}
/**
* Get all past talks.
*
* @param ProxySourceCollection|array $talks All talk nodes.
- * @param array $eventData Shared event data.
*
* @return Collection A sorted collection of talks.
*/
- public function getPast($talks, array $eventData = [])
+ public function getPast($talks): Collection
{
- return $this->format($talks, $eventData)
- ->filter(function ($talk) {
- return $talk['event']['date'] < $this->today;
- })
- ->sortByDesc('event.date');
- }
-
- /**
- * Format the talk data into the required format.
- *
- * @param ProxySourceCollection|array $talks All talk nodes.
- * @param array $eventData Shared event data.
- *
- * @return Collection The combined event and talk data.
- */
- public function format($talks, array $eventData)
- {
- $eventData = collect($eventData);
-
- return collect($talks)->flatMap(function ($talk) use ($eventData) {
- // Build an associative array with the talk, as well as the
- // specified event data (e.g. date and time) as well as the shared
- // event data (e.g. event name and website).
- return collect($talk['events'])
- ->map(function ($event) use ($talk, $eventData) {
- $event = collect($event);
- $event = $event->merge($eventData->get($event->get('event')))->all();
-
- return compact('event', 'talk');
- });
- });
+ return $this->getAll($talks)->filter(function ($talk) {
+ return $this->getLastDate($talk) < $this->today;
+ })->values();
}
/**
@@ -114,4 +83,9 @@ class TalksExtension extends Twig_Extension
{
return 'talks';
}
+
+ private function getLastDate($talk): string
+ {
+ return (string) collect($talk['events'])->pluck('date')->sort()->last();
+ }
}
diff --git a/tests/TalksBundle/TwigExtension/FormatTalksTest.php b/tests/TalksBundle/TwigExtension/FormatTalksTest.php
deleted file mode 100644
index f4c1baae..00000000
--- a/tests/TalksBundle/TwigExtension/FormatTalksTest.php
+++ /dev/null
@@ -1,177 +0,0 @@
-extension = new TalksExtension();
- }
-
- /** @test */
- public function format_events()
- {
- $event_data = [
- 'event-a' => [
- 'name' => 'Event A',
- 'location' => 'Somewhere',
- 'website' => 'http://event-a.com',
- ],
- 'event-b' => [
- 'name' => 'Event B',
- 'location' => 'Somewhere else',
- 'website' => 'http://event-b.com',
- ],
- ];
-
- $talks = [
- [
- 'title' => 'Talk A',
- 'events' => [
- ['event' => 'event-a', 'date' => strtotime('2018-01-01'), 'time' => '09:00'],
- ['event' => 'event-b', 'date' => strtotime('2018-01-30'), 'time' => '12:00'],
- ],
- ],
- [
- 'title' => 'Talk B',
- 'events' => [
- ['event' => 'event-b', 'date' => strtotime('2018-01-31'), 'time' => '17:00'],
- ],
- ],
- ];
-
- $results = $this->extension->format($talks, $event_data);
-
- $this->assertCount(3, $results);
-
- tap($results->first(), function ($result) {
- $this->assertArrayHasKey('event', $result);
- $this->assertArrayHasKey('talk', $result);
-
- $this->assertEquals([
- 'date' => '1514764800',
- 'event' => 'event-a',
- 'location' => 'Somewhere',
- 'name' => 'Event A',
- 'time' => '09:00',
- 'website' => 'http://event-a.com',
- ], $result['event']);
-
- $this->assertEquals('Talk A', $result['talk']['title']);
- });
-
- tap($results->get(1), function ($result) {
- $this->assertArrayHasKey('event', $result);
- $this->assertArrayHasKey('talk', $result);
-
- $this->assertEquals([
- 'date' => 1517270400,
- 'event' => 'event-b',
- 'location' => 'Somewhere else',
- 'name' => 'Event B',
- 'time' => '12:00',
- 'website' => 'http://event-b.com',
- ], $result['event']);
-
- $this->assertEquals('Talk A', $result['talk']['title']);
- });
-
- tap($results[2], function ($result) {
- $this->assertEquals('Talk B', $result['talk']['title']);
- });
- }
-
- /** @test */
- public function get_all_events()
- {
- $eventA = ['date' => (new DateTime('+1 week'))->getTimestamp()];
- $eventB = ['date' => (new DateTime('-2 weeks'))->getTimestamp()];
- $eventC = ['date' => (new DateTime('today'))->getTimestamp()];
-
- $talks = [
- ['events' => [$eventA, $eventB]],
- ['events' => [$eventC]],
- ];
-
- $results = $this->extension->getAll($talks);
-
- $this->assertCount(3, $results);
-
- // Earliest events should be returned first.
- $this->assertEquals(
- [$eventB['date'], $eventC['date'], $eventA['date']],
- $this->extractDates($results)
- );
- }
-
- /** @test */
- public function get_upcoming_events()
- {
- $eventA = ['date' => (new DateTime('+1 week'))->getTimestamp()];
- $eventB = ['date' => (new DateTime('-2 weeks'))->getTimestamp()];
- $eventC = ['date' => (new DateTime('today'))->getTimestamp()];
- $eventD = ['date' => (new DateTime('+1 day'))->getTimestamp()];
- $eventE = ['date' => (new DateTime('+2 weeks'))->getTimestamp()];
-
- $talks = [
- ['events' => [$eventA, $eventC]],
- ['events' => [$eventB, $eventE]],
- ];
-
- $results = $this->extension->getUpcoming($talks);
-
- $this->assertCount(3, $results);
-
- // Earliest events should be returned first.
- $this->assertEquals(
- [$eventC['date'], $eventA['date'], $eventE['date']],
- $this->extractDates($results)
- );
- }
-
- /** @test */
- public function get_past_events()
- {
- $eventA = ['date' => (new DateTime('+1 week'))->getTimestamp()];
- $eventB = ['date' => (new DateTime('-2 weeks'))->getTimestamp()];
- $eventC = ['date' => (new DateTime('today'))->getTimestamp()];
- $eventD = ['date' => (new DateTime('+1 day'))->getTimestamp()];
- $eventE = ['date' => (new DateTime('-2 days'))->getTimestamp()];
- $eventF = ['date' => (new DateTime('-2 months'))->getTimestamp()];
-
- $talks = [
- ['events' => [$eventD]],
- ['events' => [$eventA, $eventB, $eventC]],
- ['events' => [$eventF]],
- ];
-
- $results = $this->extension->getPast($talks);
-
- $this->assertCount(2, $results);
-
- // Latest events should be returned first.
- $this->assertEquals(
- [$eventB['date'], $eventF['date']],
- $this->extractDates($results)
- );
- }
-
- private function extractDates(Collection $results)
- {
- return $results->pluck('event.date')->all();
- }
-}
diff --git a/tests/TalksBundle/TwigExtension/TalksExtensionTest.php b/tests/TalksBundle/TwigExtension/TalksExtensionTest.php
new file mode 100644
index 00000000..90d1c276
--- /dev/null
+++ b/tests/TalksBundle/TwigExtension/TalksExtensionTest.php
@@ -0,0 +1,144 @@
+extension = new TalksExtension();
+ }
+
+ /** @test */
+ public function talks_given_multiple_times_are_only_returned_once()
+ {
+ $talkA = [
+ 'title' => 'Talk A',
+ 'events' => [
+ ['event' => 'event_a', 'date' => (new DateTime('-1 days'))->getTimestamp()],
+ ['event' => 'event_b', 'date' => (new DateTime('+1 days'))->getTimestamp()],
+ ],
+ ];
+
+ $talkB = [
+ 'title' => 'Talk B',
+ 'events' => [
+ ['event' => 'event_a', 'date' => (new DateTime('-3 days'))->getTimestamp()],
+ ],
+ ];
+
+ $this->assertCount(2, $this->extension->getAll([$talkA, $talkB]));
+ }
+
+ /** @test */
+ public function talks_are_ordered_by_the_most_recent_event_date()
+ {
+ $talkA = [
+ 'title' => 'Talk A',
+ 'events' => [
+ ['event' => 'event_a', 'date' => (new DateTime('-5 days'))->getTimestamp()],
+ ],
+ ];
+
+ $talkB = [
+ 'title' => 'Talk B',
+ 'events' => [
+ ['event' => 'event_a', 'date' => (new DateTime('-20 days'))->getTimestamp()],
+ ],
+ ];
+
+ $talkC = [
+ 'title' => 'Talk C',
+ 'events' => [
+ ['event' => 'event_a', 'date' => (new DateTime('-3 days'))->getTimestamp()],
+ ['event' => 'event_b', 'date' => (new DateTime('-10 days'))->getTimestamp()],
+ ],
+ ];
+
+ $unorderedTalks = [$talkC, $talkA, $talkB];
+ $orderedTalks = $this->extension->getAll($unorderedTalks);
+
+ $this->assertEquals([$talkC, $talkA, $talkB], $orderedTalks->toArray());
+ }
+
+ /** @test */
+ public function only_past_talks_can_be_retrieved()
+ {
+ $pastTalk = [
+ 'title' => 'Past talk',
+ 'events' => [
+ ['date' => (new DateTime('-1 day'))->getTimestamp()],
+ ]
+ ];
+
+ $futureTalk = [
+ 'title' => 'Future talk',
+ 'events' => [
+ ['date' => (new DateTime('+1 day'))->getTimestamp()],
+ ],
+ ];
+
+ $result = $this->extension->getPast([$pastTalk, $futureTalk]);
+
+ $this->assertCount(1, $result);
+ $this->assertSame($pastTalk, $result->first());
+ }
+
+ /** @test */
+ public function only_current_and_future_talks_can_be_retrieved()
+ {
+ $pastTalk = [
+ 'title' => 'Past talk',
+ 'events' => [
+ ['date' => (new DateTime('-1 day'))->getTimestamp()],
+ ]
+ ];
+
+ $todayTalk = [
+ 'title' => 'A talk that it happening today',
+ 'events' => [
+ ['date' => (new DateTime('now'))->getTimestamp()],
+ ],
+ ];
+
+ $futureTalk = [
+ 'title' => 'Future talk',
+ 'events' => [
+ ['date' => (new DateTime('+1 day'))->getTimestamp()],
+ ],
+ ];
+
+ $result = $this->extension->getUpcoming([$pastTalk, $todayTalk, $futureTalk]);
+
+ $this->assertCount(2, $result);
+ $this->assertSame([$todayTalk, $futureTalk], $result->toArray());
+ }
+
+ /** @test */
+ public function if_a_talk_is_both_upcoming_and_past_then_it_is_only_shown_as_upcoming()
+ {
+ $talk = [
+ 'title' => 'An upcoming talk that has been given before',
+ 'events' => [
+ ['date' => (new DateTime('-1 week'))->getTimestamp()],
+ ['date' => (new DateTime('+1 week'))->getTimestamp()],
+ ],
+ ];
+
+ $this->assertCount(1, $this->extension->getUpcoming([$talk]));
+ $this->assertEmpty($this->extension->getPast([$talk]));
+ }
+}
diff --git a/yarn.lock b/yarn.lock
index 4e4a0057..5168d885 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6550,10 +6550,9 @@ tailwindcss-skip-link@^1.0.0:
resolved "https://registry.yarnpkg.com/tailwindcss-skip-link/-/tailwindcss-skip-link-1.0.1.tgz#b965624ed0b007ddd33f0326f2719d9a88b857c7"
integrity sha512-Hxivkqu7UEluZY+ZPv+aQv4dreqTfYRgniEtux4qb9yJPjyR4dXiHMIWk7LgNqsyCPKpoRL8FJq55uIQN4ms+w==
-tailwindcss-spaced-items@^0.1.0:
+"tailwindcss-spaced-items@https://github.com/n1kk/tailwindcss-spaced-items#master":
version "0.1.0"
- resolved "https://registry.yarnpkg.com/tailwindcss-spaced-items/-/tailwindcss-spaced-items-0.1.0.tgz#e7f381e5c780a034bcdbc38a6a2cfb31f828a020"
- integrity sha512-YiT1h89fp13r6I+EBM8wS1RWfsTwzHSi4BAnHoTXXQK1GQ53DUCPeFNmiksYSdx2aQLMdp/DTPvErqBVfTALiQ==
+ resolved "https://github.com/n1kk/tailwindcss-spaced-items#00aeaa1b37b6a6c2614b1f656bd9120b3839a089"
tailwindcss-visuallyhidden@^1.0.1:
version "1.0.1"