diff --git a/config/zeus-sky.php b/config/zeus-sky.php index c79ecf1..923a419 100644 --- a/config/zeus-sky.php +++ b/config/zeus-sky.php @@ -58,4 +58,11 @@ * \LaraZeus\Sky\Editors\RichEditor::class, */ 'editor' => \LaraZeus\Sky\Editors\RichEditor::class, + + /** + * A list of custom NavLinkRenderer classes for your app. + */ + 'navRenderers' => [ + // Add your custom Nav Renderers here... + ], ]; diff --git a/resources/views/components/sky-link.blade.php b/resources/views/components/sky-link.blade.php new file mode 100644 index 0000000..a80e206 --- /dev/null +++ b/resources/views/components/sky-link.blade.php @@ -0,0 +1,3 @@ +except(['label', 'hasLabelWrap']) }}> + {{ $label }} + diff --git a/src/Classes/LinkRenderers/GenericLinkRenderer.php b/src/Classes/LinkRenderers/GenericLinkRenderer.php new file mode 100644 index 0000000..bf90b52 --- /dev/null +++ b/src/Classes/LinkRenderers/GenericLinkRenderer.php @@ -0,0 +1,23 @@ +item['data']['url']; + } + + public function isActiveRoute(): bool + { + return false; + } +} diff --git a/src/Classes/LinkRenderers/LibraryLinkRenderer.php b/src/Classes/LinkRenderers/LibraryLinkRenderer.php new file mode 100644 index 0000000..c46bbf6 --- /dev/null +++ b/src/Classes/LinkRenderers/LibraryLinkRenderer.php @@ -0,0 +1,37 @@ +getModel('Tag')::find($this->item['data']['library_id']); + } + + public function getLink(): ?string + { + /** + * @var Library $tag + */ + $tag = $this->getModel(); + + return route('library.tag', $tag->slug); + } + + public function isActiveRoute(): bool + { + /** + * @var Library $tag + */ + $tag = $this->getModel(); + + return str(request()->url())->contains($tag->library->first()->slug); + } +} diff --git a/src/Classes/LinkRenderers/NavLinkRenderer.php b/src/Classes/LinkRenderers/NavLinkRenderer.php new file mode 100644 index 0000000..cc1d488 --- /dev/null +++ b/src/Classes/LinkRenderers/NavLinkRenderer.php @@ -0,0 +1,45 @@ +isActiveRoute() ? + self::$activeClasses : + self::$nonActiveClasses; + } + + /** + * @return array{} + */ + public function getPreparedLink(string $classes = ''): array + { + return [ + 'class' => $classes . ' ' . $this->getActiveClass(), + 'target' => $this->item['data']['target'] ?? '_self', + 'href' => $this->getLink(), + 'label' => $this->item['label'], + ]; + } +} diff --git a/src/Classes/LinkRenderers/PageLinkRenderer.php b/src/Classes/LinkRenderers/PageLinkRenderer.php new file mode 100644 index 0000000..3e83e19 --- /dev/null +++ b/src/Classes/LinkRenderers/PageLinkRenderer.php @@ -0,0 +1,39 @@ +getModel('Post')::page() + ->whereDate('published_at', '<=', now()) + ->find($this->item['data']['page_id']); + } + + public function getLink(): ?string + { + /** + * @var Post $page + */ + $page = $this->getModel(); + + return route('page', $page); + } + + public function isActiveRoute(): bool + { + /** + * @var Post $page + */ + $page = $this->getModel(); + + return request()->routeIs('page', $page); + } +} diff --git a/src/Classes/LinkRenderers/PostLinkRenderer.php b/src/Classes/LinkRenderers/PostLinkRenderer.php new file mode 100644 index 0000000..0734ef6 --- /dev/null +++ b/src/Classes/LinkRenderers/PostLinkRenderer.php @@ -0,0 +1,38 @@ +getModel('Post')::whereDate('published_at', '<=', now()) + ->find($this->item['data']['post_id']); + } + + public function getLink(): ?string + { + /** + * @var Post $post + */ + $post = $this->getModel(); + + return route('post', $post); + } + + public function isActiveRoute(): bool + { + /** + * @var Post $post + */ + $post = $this->getModel(); + + return request()->routeIs('post', $post); + } +} diff --git a/src/Classes/RenderNavItem.php b/src/Classes/RenderNavItem.php index 660f143..603fb24 100644 --- a/src/Classes/RenderNavItem.php +++ b/src/Classes/RenderNavItem.php @@ -2,52 +2,79 @@ namespace LaraZeus\Sky\Classes; -use LaraZeus\Sky\SkyPlugin; +use Illuminate\Support\Facades\Blade; +use LaraZeus\Sky\Classes\LinkRenderers\GenericLinkRenderer; +use LaraZeus\Sky\Classes\LinkRenderers\LibraryLinkRenderer; +use LaraZeus\Sky\Classes\LinkRenderers\NavLinkRenderer; +use LaraZeus\Sky\Classes\LinkRenderers\PageLinkRenderer; +use LaraZeus\Sky\Classes\LinkRenderers\PostLinkRenderer; class RenderNavItem { - public static function render(array $item, string $class = ''): string + /** + * @var class-string + */ + public static string $defaultRendererClass = GenericLinkRenderer::class; + + /** + * Set the default active CSS class(es) on a nav link. + * + * @return $this + */ + public static function setActiveClasses(string $activeClasses): void + { + NavLinkRenderer::$activeClasses = $activeClasses; + } + + /** + * Set the default non-active CSS class(es) on a nav link. + * + * @return $this + */ + public static function setNonActiveClasses(string $nonActiveClass): void + { + NavLinkRenderer::$nonActiveClasses = $nonActiveClass; + } + + public static function getNavRenderers(): array { - $color = 'border-b border-b-secondary-500 text-secondary-500'; - - if ($item['type'] === 'page-link' || $item['type'] === 'page_link') { - $page = SkyPlugin::get()->getModel('Post')::page()->whereDate('published_at', '<=', now())->find($item['data']['page_id']) ?? ''; - $activeClass = (request()->routeIs('page', $page)) ? $color : 'border-transparent'; - - return '' . - $item['label'] . - ''; - } elseif ($item['type'] === 'post-link' || $item['type'] === 'post_link') { - $post = SkyPlugin::get()->getModel('Post')::find($item['data']['post_id']) ?? ''; - $activeClass = (request()->routeIs('post', $post)) ? $color : 'border-transparent'; - - return '' . - $item['label'] . - ''; - } elseif ($item['type'] === 'library-link' || $item['type'] === 'library_link') { - $tag = SkyPlugin::get()->getModel('Tag')::find($item['data']['library_id']) ?? ''; - $activeClass = (str(request()->url())->contains($tag->library->first()->slug)) ? $color : 'border-transparent'; - - return '' . - $item['label'] . - ''; + $allRenderers = array_merge([ + PageLinkRenderer::$rendersKey => PageLinkRenderer::class, + PostLinkRenderer::$rendersKey => PostLinkRenderer::class, + LibraryLinkRenderer::$rendersKey => LibraryLinkRenderer::class, + ], config('zeus-sky.navRenderers', [])); + $renderersMap = []; + foreach ($allRenderers as $renderer) { + /** + * @var NavLinkRenderer $renderer + */ + $renderersMap[$renderer::$rendersKey] = $renderer; + } + + return $renderersMap; + } + + public static function render(array $item, string $class = ''): string + { + $itemType = $item['type']; + if (str($itemType)->contains('_')) { + $itemType = str($itemType)->replace('_', '-')->toString(); + } + $renderersMap = static::getNavRenderers(); + if (array_key_exists($itemType, $renderersMap)) { + $rendererClass = $renderersMap[$itemType]; + $renderer = new $rendererClass($item); } else { - return '' . - $item['label'] . - ''; + $renderer = new static::$defaultRendererClass($item); } + + /** + * @var NavLinkRenderer $renderer + */ + return Blade::render( + '', + $renderer->getPreparedLink($class) + ); } } diff --git a/src/Components/SkyLink.php b/src/Components/SkyLink.php new file mode 100644 index 0000000..f593b89 --- /dev/null +++ b/src/Components/SkyLink.php @@ -0,0 +1,22 @@ +data()); + } +} diff --git a/src/Configuration.php b/src/Configuration.php index 28d4aea..1ddae6d 100644 --- a/src/Configuration.php +++ b/src/Configuration.php @@ -6,6 +6,7 @@ use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Illuminate\Support\Str; +use LaraZeus\Sky\Classes\LinkRenderers\NavLinkRenderer; trait Configuration { @@ -55,6 +56,11 @@ trait Configuration protected array $itemTypes = []; + /** + * @var class-string[] + */ + protected array $navRenderers = []; + protected array | Closure $extraFields = []; public function navigationGroupLabel(Closure | string $lable): static diff --git a/src/SkyServiceProvider.php b/src/SkyServiceProvider.php index 2112dd7..10b1d01 100644 --- a/src/SkyServiceProvider.php +++ b/src/SkyServiceProvider.php @@ -5,6 +5,7 @@ use Filament\Facades\Filament; use Filament\Forms\Components\Select; use LaraZeus\Core\CoreServiceProvider; +use LaraZeus\Sky\Components\SkyLink; use LaraZeus\Sky\Console\InstallCommand; use LaraZeus\Sky\Console\migrateCommand; use LaraZeus\Sky\Console\PublishCommand; @@ -31,6 +32,7 @@ public function configurePackage(Package $package): void ->hasConfigFile() ->hasCommands($this->getCommands()) ->hasViews('zeus') + ->hasViewComponent('zeus', SkyLink::class) ->hasRoute('web'); }