Add event fetching

This commit is contained in:
philipp lang 2024-02-01 01:58:40 +01:00
parent 38389f6fd7
commit a4937bb6e9
7 changed files with 59 additions and 14 deletions

@ -1 +1 @@
Subproject commit e62934504bf2d33b65d0282a8d311df9cecb178e Subproject commit 10070f39ad7b91dee37f953325726e8b56694c6c

View File

@ -4,8 +4,10 @@ namespace Silva\Adrema\Components;
use Cms\Classes\ComponentBase; use Cms\Classes\ComponentBase;
use Cms\Classes\Page; use Cms\Classes\Page;
use FetchAllEvents;
use Silva\Adrema\Exceptions\ComponentException; use Silva\Adrema\Exceptions\ComponentException;
use Silva\Adrema\Models\Settings; use Silva\Adrema\Models\Settings;
use Silva\Adrema\Support\FetchAllEvents as SupportFetchAllEvents;
class EventIndex extends ComponentBase class EventIndex extends ComponentBase
{ {
@ -13,7 +15,9 @@ class EventIndex extends ComponentBase
public $settings; public $settings;
/** @var string The active event */ /** @var string The active event */
public ?string $event; public ?string $eventSlug;
public ?array $event;
public string $currentUrl;
public function componentDetails() public function componentDetails()
{ {
@ -26,12 +30,22 @@ class EventIndex extends ComponentBase
public function onRun() public function onRun()
{ {
$this->addJs('assets/vendor/adrema-form/dist/main.js'); $this->addJs('assets/vendor/adrema-form/dist/main.js');
$this->currentUrl = url()->current();
// $this->addJs('http://localhost:5174/src/main.js', ['type' => 'module']);
$this->settings = [ $this->settings = [
'primary_color' => Settings::get('primary_color'), 'primary_color' => Settings::get('primary_color'),
...$this->resolvePageUrls(), ...$this->resolvePageUrls(),
]; ];
$this->event = $this->property('event'); $this->eventSlug = $this->property('eventSlug');
if ($this->eventSlug) {
$events = data_get(app(SupportFetchAllEvents::class)->run(), 'data');
throw_if(is_null($events), ComponentException::class, 'event_fetching_failed');
$this->event = collect($events)->first(fn ($event) => $event['slug'] === $this->eventSlug);
$this->page->title = $this->event['name'];
}
} }
/** /**
@ -81,8 +95,8 @@ class EventIndex extends ComponentBase
'type' => 'dropdown', 'type' => 'dropdown',
'default' => null, 'default' => null,
], ],
'event' => [ 'eventSlug' => [
'title' => __('properties.event_title'), 'title' => __('properties.event_slug_title'),
'type' => 'text', 'type' => 'text',
'default' => null, 'default' => null,
], ],

View File

@ -1,8 +1,18 @@
{% if __SELF__.event %}
{% put metatags %}
<meta property="og:title" content="{{__SELF__.event.name}}">
<meta property="og:url" content="{{__SELF__.currentUrl}}">
<meta property="og:description" content="{{__SELF__.event.excerpt}}">
<meta property="og:image" content="{{__SELF__.event.image}}">
<meta property="og:type" content="article">
{% endput %}
{% endif %}
<event-index <event-index
style="--primary: {{__SELF__.settings.primary_color}}; --primaryfg: #d1f8ff; --secondary: #800a19; --font: hsl(181, 84%, 78%); --circle: hsl(181, 86%, 16%)" style="--primary: {{__SELF__.settings.primary_color}}; --primaryfg: #d1f8ff; --secondary: #800a19; --font: hsl(181, 84%, 78%); --circle: hsl(181, 86%, 16%)"
index-url="{{__SELF__.settings.indexUrl}}" index-url="{{__SELF__.settings.indexUrl}}"
single-url="{{__SELF__.settings.singleUrl}}" single-url="{{__SELF__.settings.singleUrl}}"
register-url="{{__SELF__.settings.registerUrl}}" register-url="{{__SELF__.settings.registerUrl}}"
url="/api/silva_adrema_event_overview" url="/api/silva_adrema_event_overview"
{% if __SELF__.event %} event="{{__SELF__.event }}" {% endif %} {% if __SELF__.event %} event="{{__SELF__.event.slug }}" {% endif %}
></event-index> ></event-index>

View File

@ -5,5 +5,5 @@
"properties.index_page_title": "Seite für Übersicht", "properties.index_page_title": "Seite für Übersicht",
"properties.single_page_title": "Seite für Einzelansicht", "properties.single_page_title": "Seite für Einzelansicht",
"properties.register_page_title": "Seite zum anmelden", "properties.register_page_title": "Seite zum anmelden",
"properties.event_title": "Veranstaltung slug" "properties.event_slug_title": "Veranstaltung slug"
} }

View File

@ -5,8 +5,9 @@
"properties.index_page_title": "Page for overview", "properties.index_page_title": "Page for overview",
"properties.single_page_title": "Page for single view", "properties.single_page_title": "Page for single view",
"properties.register_page_title": "Page for registration", "properties.register_page_title": "Page for registration",
"properties.event_title": "Event slug", "properties.event_slug_title": "Event slug",
"errors.not_all_pages_set": "You didn't assign all pages. Please edit your components.", "errors.not_all_pages_set": "You didn't assign all pages. Please edit your components.",
"errors.page_not_found": "One page cannot be found. Event component cannot be rendered.", "errors.page_not_found": "One page cannot be found. Event component cannot be rendered.",
"errors.slug_not_found": "You need to set a placeholder in page urls to set the event slug (\":slug\")" "errors.slug_not_found": "You need to set a placeholder in page urls to set the event slug (\":slug\")",
"errors.event_fetching_failed": "Failed to fetch event."
} }

View File

@ -1,14 +1,13 @@
<?php <?php
use Silva\Adrema\Models\Settings; use Silva\Adrema\Support\FetchAllEvents;
Route::get('/api/silva_adrema_event_overview', function () { Route::get('/api/silva_adrema_event_overview', function () {
$baseUrl = Settings::get('base_url'); $events = app(FetchAllEvents::class)->run();
$response = Http::get($baseUrl . '/api/form');
if (!$response->ok()) { if (is_null($events)) {
return Response::json(['message' => 'Fehler beim Laden der Veranstaltungen'], 422); return Response::json(['message' => 'Fehler beim Laden der Veranstaltungen'], 422);
} }
return Response::json($response->json()); return Response::json($events);
})->middleware('api'); })->middleware('api');

View File

@ -0,0 +1,21 @@
<?php
namespace Silva\Adrema\Support;
use Silva\Adrema\Models\Settings;
use Http;
class FetchAllEvents
{
public function run(): ?array
{
$baseUrl = Settings::get('base_url');
$response = Http::get($baseUrl . '/api/form');
if (!$response->ok()) {
return null;
}
return $response->json();
}
}