*/ public Collection $events; public string $currentUrl; abstract protected function isRegistering(): bool; public function componentDetails() { $componentName = str(class_basename(static::class))->snake(); return [ 'name' => __("{$componentName}_component_name"), 'description' => __("{$componentName}_component_description"), ]; } public function onRun() { $this->addAssets(); $this->loadColors(); $this->loadSettings(); $this->loadSingleEvent(); $this->page['breadcrumbs'] = $this->getBreadcrumbs(); } private function getBreadcrumbs(): Collection { $breadcrumbs = collect([]); $breadcrumbs->push(['url' => $this->settings['indexUrl'], 'title' => 'Veranstaltungen', 'isActive' => $this->event === null]); if ($this->event) { $breadcrumbs->push([ 'url' => (string) str($this->settings['singleUrl'])->replace(':slug', $this->event['slug']), 'title' => $this->event['name'], 'isActive' => !$this->isRegistering() ]); } if ($this->event && $this->isRegistering()) { $breadcrumbs->push([ 'url' => (string) str($this->settings['registerUrl'])->replace(':slug', $this->event['slug']), 'title' => 'Anmeldung', 'isActive' => true, ]); } return $breadcrumbs; } public function defineProperties() { return [ 'indexPage' => [ 'title' => __('properties.index_page_title'), 'type' => 'dropdown', 'default' => null, ], 'singlePage' => [ 'title' => __('properties.single_page_title'), 'type' => 'dropdown', 'default' => null, ], 'registerPage' => [ 'title' => __('properties.register_page_title'), 'type' => 'dropdown', 'default' => null, ], 'eventSlug' => [ 'title' => __('properties.event_slug_title'), 'type' => 'text', 'default' => null, ], ]; } public function getIndexPageOptions(): array { return $this->pageOptions(); } public function getSinglePageOptions(): array { return $this->pageOptions(); } public function getRegisterPageOptions(): array { return $this->pageOptions(); } private function pageOptions(): array { return Page::get() ->mapWithKeys(fn ($page) => [$page->fileName => $page->title]) ->toArray(); } private function getPageFromProperty(string $property): Page { throw_if(!$this->property('indexPage') || !$this->property('singlePage') || !$this->property('registerPage'), ComponentException::class, 'not_all_pages_set'); $page = Page::find($this->property($property)); throw_if($page === null, ComponentException::class, 'page_not_found'); return $page; } /** * @return array */ private function resolvePageUrls(): array { $indexPage = $this->getPageFromProperty('indexPage'); $singlePage = $this->getPageFromProperty('singlePage'); $registerPage = $this->getPageFromProperty('registerPage'); throw_if(!str($singlePage->url)->contains(':slug'), ComponentException::class, 'slug_not_found'); throw_if(!str($registerPage->url)->contains(':slug'), ComponentException::class, 'slug_not_found'); return [ 'indexUrl' => $indexPage->url, 'singleUrl' => $singlePage->url, 'registerUrl' => $registerPage->url, ]; } protected function loadSingleEvent(): void { $eventSlug = $this->property('eventSlug'); if (!$eventSlug) { return; } $this->eventMeta = data_get(app(FetchAllEvents::class)->run(), 'meta', []); $this->events = $this->page['events'] = collect(app(FetchAllEvents::class)->run()['data']); $this->event = $this->page['event'] = $this->events->first(fn ($event) => $event['slug'] == $eventSlug); $this->currentUrl = url()->current(); } private function addAssets(): void { // $this->addJs('assets/vendor/adrema-form/dist/main.js'); $this->addJs('http://localhost:5174/src/main.js', ['type' => 'module']); } private function loadSettings(): void { $this->settings = [ ...$this->settings, ...$this->resolvePageUrls(), ]; } protected function loadColors(): void { $this->settings = [ ...$this->settings, 'primary_color' => Settings::get('primary_color'), ]; } }