From 8ba78d84bc3a485cb9c737391af660b2984441bd Mon Sep 17 00:00:00 2001 From: Dan Pock Date: Thu, 14 Mar 2024 14:03:04 -0400 Subject: [PATCH 01/11] WIP: reimagine Navigation rendering features This PR concept starts to add ability to register renderers like custom Nav item types. It also implements first-party examples of using the new system with the built-in nav item types. --- .../LinkRenderers/GenericLinkRenderer.php | 24 ++++++ .../LinkRenderers/LibraryLinkRenderer.php | 36 +++++++++ src/Classes/LinkRenderers/NavLinkRenderer.php | 45 +++++++++++ .../LinkRenderers/PageLinkRenderer.php | 37 +++++++++ .../LinkRenderers/PostLinkRenderer.php | 37 +++++++++ src/Classes/RenderNavItem.php | 78 +++++++++---------- src/Configuration.php | 32 ++++++++ 7 files changed, 250 insertions(+), 39 deletions(-) create mode 100644 src/Classes/LinkRenderers/GenericLinkRenderer.php create mode 100644 src/Classes/LinkRenderers/LibraryLinkRenderer.php create mode 100644 src/Classes/LinkRenderers/NavLinkRenderer.php create mode 100644 src/Classes/LinkRenderers/PageLinkRenderer.php create mode 100644 src/Classes/LinkRenderers/PostLinkRenderer.php diff --git a/src/Classes/LinkRenderers/GenericLinkRenderer.php b/src/Classes/LinkRenderers/GenericLinkRenderer.php new file mode 100644 index 0000000..a668e12 --- /dev/null +++ b/src/Classes/LinkRenderers/GenericLinkRenderer.php @@ -0,0 +1,24 @@ +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..62a65d8 --- /dev/null +++ b/src/Classes/LinkRenderers/LibraryLinkRenderer.php @@ -0,0 +1,36 @@ +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..2f5780b --- /dev/null +++ b/src/Classes/LinkRenderers/NavLinkRenderer.php @@ -0,0 +1,45 @@ +isActiveRoute() ? + self::$activeClasses : + self::$defaultActiveClass; + } + + /** + * @return array{} + */ + public function getPreparedLink(string $classes = ''): array { + return [ + 'classes' => $classes . ' ' . $this->getActiveClass(), + 'target' => $this->item['data']['target'] ?? '_self', + 'link' => $this->getLink(), + 'label' => $this->item['label'], + 'wrap' => null, + 'wrapClass' => null, + ]; + } +} diff --git a/src/Classes/LinkRenderers/PageLinkRenderer.php b/src/Classes/LinkRenderers/PageLinkRenderer.php new file mode 100644 index 0000000..0addaea --- /dev/null +++ b/src/Classes/LinkRenderers/PageLinkRenderer.php @@ -0,0 +1,37 @@ +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..cd8f3ab --- /dev/null +++ b/src/Classes/LinkRenderers/PostLinkRenderer.php @@ -0,0 +1,37 @@ +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..dee3b3f 100644 --- a/src/Classes/RenderNavItem.php +++ b/src/Classes/RenderNavItem.php @@ -2,52 +2,52 @@ namespace LaraZeus\Sky\Classes; +use LaraZeus\Sky\Classes\LinkRenderers\GenericLinkRenderer; +use LaraZeus\Sky\Classes\LinkRenderers\NavLinkRenderer; use LaraZeus\Sky\SkyPlugin; class RenderNavItem { - public static function render(array $item, string $class = ''): string - { - $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 ' + */ + public static string $defaultRendererClass = GenericLinkRenderer::class; + + private static function anchorLink( + string $classes, + string $target, + string $link, + string $label, + bool $wrap = false, + string $wrapClass = '', + ): string { + // TODO: make this component based? + // Then it's probably easier for users to further customize this? + 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'] . - ''; + $label . + ''; + } + public static function render(array $item, string $class = ''): string + { + $itemType = $item['type']; + if (str($itemType)->contains('_')) { + $itemType = str($itemType)->replace('_', '-')->toString(); + } + $renderersMap = SkyPlugin::get()->getNavRenderers(); + // TODO: make match current behavior with underscore or hyphen + 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 static::anchorLink(...$renderer->getPreparedLink($class)); } } diff --git a/src/Configuration.php b/src/Configuration.php index 28d4aea..e623c74 100644 --- a/src/Configuration.php +++ b/src/Configuration.php @@ -6,6 +6,10 @@ use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Illuminate\Support\Str; +use LaraZeus\Sky\Classes\LinkRenderers\LibraryLinkRenderer; +use LaraZeus\Sky\Classes\LinkRenderers\NavLinkRenderer; +use LaraZeus\Sky\Classes\LinkRenderers\PageLinkRenderer; +use LaraZeus\Sky\Classes\LinkRenderers\PostLinkRenderer; trait Configuration { @@ -55,6 +59,11 @@ trait Configuration protected array $itemTypes = []; + /** + * @var class-string[] + */ + protected array $navRenderers = []; + protected array | Closure $extraFields = []; public function navigationGroupLabel(Closure | string $lable): static @@ -279,4 +288,27 @@ public function hideResources(array $resources = []): static return $this; } + + /** + * @param class-string $rendererClass + * @return $this + */ + public function navRenderer(string $rendererClass): static + { + $this->navRenderers[$rendererClass::$renders] = $rendererClass; + + return $this; + } + + public function getNavRenderers(): array + { + return array_merge( + [ + PageLinkRenderer::$renders => PageLinkRenderer::class, + PostLinkRenderer::$renders => PostLinkRenderer::class, + LibraryLinkRenderer::$renders => LibraryLinkRenderer::class, + ], + $this->navRenderers + ); + } } From bbeda2e79a37c8e351f13ad0f0d9d16e91829be8 Mon Sep 17 00:00:00 2001 From: mallardduck Date: Thu, 14 Mar 2024 18:03:27 +0000 Subject: [PATCH 02/11] Fix styling --- src/Classes/LinkRenderers/GenericLinkRenderer.php | 1 - src/Classes/LinkRenderers/LibraryLinkRenderer.php | 5 +++-- src/Classes/LinkRenderers/NavLinkRenderer.php | 7 +++++-- src/Classes/LinkRenderers/PageLinkRenderer.php | 6 ++++-- src/Classes/LinkRenderers/PostLinkRenderer.php | 5 +++-- src/Classes/RenderNavItem.php | 1 + src/Configuration.php | 2 +- 7 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/Classes/LinkRenderers/GenericLinkRenderer.php b/src/Classes/LinkRenderers/GenericLinkRenderer.php index a668e12..bf90b52 100644 --- a/src/Classes/LinkRenderers/GenericLinkRenderer.php +++ b/src/Classes/LinkRenderers/GenericLinkRenderer.php @@ -6,7 +6,6 @@ class GenericLinkRenderer extends NavLinkRenderer { - public function getModel(): ?Model { return null; diff --git a/src/Classes/LinkRenderers/LibraryLinkRenderer.php b/src/Classes/LinkRenderers/LibraryLinkRenderer.php index 62a65d8..8ce58a6 100644 --- a/src/Classes/LinkRenderers/LibraryLinkRenderer.php +++ b/src/Classes/LinkRenderers/LibraryLinkRenderer.php @@ -12,8 +12,7 @@ class LibraryLinkRenderer extends NavLinkRenderer public function getModel(): ?Model { - return SkyPlugin::get()->getModel('Tag') - ::find($this->item['data']['library_id']); + return SkyPlugin::get()->getModel('Tag')::find($this->item['data']['library_id']); } public function getLink(): ?string @@ -22,6 +21,7 @@ public function getLink(): ?string * @var Library $tag */ $tag = $this->getModel(); + return route('library.tag', $tag->slug); } @@ -31,6 +31,7 @@ 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 index 2f5780b..febf623 100644 --- a/src/Classes/LinkRenderers/NavLinkRenderer.php +++ b/src/Classes/LinkRenderers/NavLinkRenderer.php @@ -10,10 +10,12 @@ abstract class NavLinkRenderer public function __construct( protected array $item - ) {} + ) { + } // TODO: something to control these classes for end-user? public static string $activeClasses = 'border-b border-b-secondary-500 text-secondary-500'; + public static string $defaultActiveClass = 'border-transparent'; abstract public function getModel(): ?Model; @@ -32,7 +34,8 @@ public function getActiveClass(): string /** * @return array{} */ - public function getPreparedLink(string $classes = ''): array { + public function getPreparedLink(string $classes = ''): array + { return [ 'classes' => $classes . ' ' . $this->getActiveClass(), 'target' => $this->item['data']['target'] ?? '_self', diff --git a/src/Classes/LinkRenderers/PageLinkRenderer.php b/src/Classes/LinkRenderers/PageLinkRenderer.php index 0addaea..1ad5954 100644 --- a/src/Classes/LinkRenderers/PageLinkRenderer.php +++ b/src/Classes/LinkRenderers/PageLinkRenderer.php @@ -13,8 +13,8 @@ class PageLinkRenderer extends NavLinkRenderer public function getModel(): ?Model { return SkyPlugin::get()->getModel('Post')::page() - ->whereDate('published_at', '<=', now()) - ->find($this->item['data']['page_id']); + ->whereDate('published_at', '<=', now()) + ->find($this->item['data']['page_id']); } public function getLink(): ?string @@ -23,6 +23,7 @@ public function getLink(): ?string * @var Post $page */ $page = $this->getModel(); + return route('page', $page); } @@ -32,6 +33,7 @@ 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 index cd8f3ab..0842975 100644 --- a/src/Classes/LinkRenderers/PostLinkRenderer.php +++ b/src/Classes/LinkRenderers/PostLinkRenderer.php @@ -12,8 +12,7 @@ class PostLinkRenderer extends NavLinkRenderer public function getModel(): ?Model { - return SkyPlugin::get()->getModel('Post') - ::whereDate('published_at', '<=', now()) + return SkyPlugin::get()->getModel('Post')::whereDate('published_at', '<=', now()) ->find($this->item['data']['post_id']); } @@ -23,6 +22,7 @@ public function getLink(): ?string * @var Post $post */ $post = $this->getModel(); + return route('post', $post); } @@ -32,6 +32,7 @@ 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 dee3b3f..00b9a9c 100644 --- a/src/Classes/RenderNavItem.php +++ b/src/Classes/RenderNavItem.php @@ -45,6 +45,7 @@ public static function render(array $item, string $class = ''): string } else { $renderer = new static::$defaultRendererClass($item); } + /** * @var NavLinkRenderer $renderer */ diff --git a/src/Configuration.php b/src/Configuration.php index e623c74..39f545c 100644 --- a/src/Configuration.php +++ b/src/Configuration.php @@ -290,7 +290,7 @@ public function hideResources(array $resources = []): static } /** - * @param class-string $rendererClass + * @param class-string $rendererClass * @return $this */ public function navRenderer(string $rendererClass): static From cd0526f731c4b040ca7cf55804abf321662a3f10 Mon Sep 17 00:00:00 2001 From: Dan Pock Date: Thu, 14 Mar 2024 14:12:08 -0400 Subject: [PATCH 03/11] Add more notes for todo tasks --- src/Classes/RenderNavItem.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Classes/RenderNavItem.php b/src/Classes/RenderNavItem.php index 00b9a9c..82ceef9 100644 --- a/src/Classes/RenderNavItem.php +++ b/src/Classes/RenderNavItem.php @@ -27,7 +27,8 @@ private static function anchorLink( target="' . $target . '" href="' . $link . '" >' . - $label . + $label . // TODO: allow optional wrapping link text in span? + // Or maybe support this customization via components? ''; } From af8a1865944016602cbb47389573b261ea0b2858 Mon Sep 17 00:00:00 2001 From: Dan Pock Date: Thu, 14 Mar 2024 14:13:34 -0400 Subject: [PATCH 04/11] remove old TODO i already addressed --- src/Classes/RenderNavItem.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Classes/RenderNavItem.php b/src/Classes/RenderNavItem.php index 82ceef9..dd8512b 100644 --- a/src/Classes/RenderNavItem.php +++ b/src/Classes/RenderNavItem.php @@ -39,7 +39,6 @@ public static function render(array $item, string $class = ''): string $itemType = str($itemType)->replace('_', '-')->toString(); } $renderersMap = SkyPlugin::get()->getNavRenderers(); - // TODO: make match current behavior with underscore or hyphen if (array_key_exists($itemType, $renderersMap)) { $rendererClass = $renderersMap[$itemType]; $renderer = new $rendererClass($item); From 42c3cb3ca8828135257405d56622df05bc71f7a8 Mon Sep 17 00:00:00 2001 From: Dan Pock Date: Thu, 14 Mar 2024 14:14:46 -0400 Subject: [PATCH 05/11] remove non-working idea from code for now --- src/Classes/LinkRenderers/NavLinkRenderer.php | 2 -- src/Classes/RenderNavItem.php | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/Classes/LinkRenderers/NavLinkRenderer.php b/src/Classes/LinkRenderers/NavLinkRenderer.php index febf623..b6aa386 100644 --- a/src/Classes/LinkRenderers/NavLinkRenderer.php +++ b/src/Classes/LinkRenderers/NavLinkRenderer.php @@ -41,8 +41,6 @@ public function getPreparedLink(string $classes = ''): array 'target' => $this->item['data']['target'] ?? '_self', 'link' => $this->getLink(), 'label' => $this->item['label'], - 'wrap' => null, - 'wrapClass' => null, ]; } } diff --git a/src/Classes/RenderNavItem.php b/src/Classes/RenderNavItem.php index dd8512b..6bf5238 100644 --- a/src/Classes/RenderNavItem.php +++ b/src/Classes/RenderNavItem.php @@ -18,8 +18,6 @@ private static function anchorLink( string $target, string $link, string $label, - bool $wrap = false, - string $wrapClass = '', ): string { // TODO: make this component based? // Then it's probably easier for users to further customize this? From 6b514b4b5883baa60815f71327ec7544acc92001 Mon Sep 17 00:00:00 2001 From: Dan Pock Date: Mon, 18 Mar 2024 16:43:39 -0400 Subject: [PATCH 06/11] refactor: introduce sky-link component --- resources/views/components/sky-link.blade.php | 3 +++ src/Classes/LinkRenderers/NavLinkRenderer.php | 4 ++-- src/Classes/RenderNavItem.php | 23 ++++--------------- src/Components/SkyLink.php | 22 ++++++++++++++++++ src/SkyServiceProvider.php | 2 ++ 5 files changed, 34 insertions(+), 20 deletions(-) create mode 100644 resources/views/components/sky-link.blade.php create mode 100644 src/Components/SkyLink.php diff --git a/resources/views/components/sky-link.blade.php b/resources/views/components/sky-link.blade.php new file mode 100644 index 0000000..43097e6 --- /dev/null +++ b/resources/views/components/sky-link.blade.php @@ -0,0 +1,3 @@ +except('label')->except('hasLabelWrap') }}> + {{ $label }} + diff --git a/src/Classes/LinkRenderers/NavLinkRenderer.php b/src/Classes/LinkRenderers/NavLinkRenderer.php index b6aa386..aee9e84 100644 --- a/src/Classes/LinkRenderers/NavLinkRenderer.php +++ b/src/Classes/LinkRenderers/NavLinkRenderer.php @@ -37,9 +37,9 @@ public function getActiveClass(): string public function getPreparedLink(string $classes = ''): array { return [ - 'classes' => $classes . ' ' . $this->getActiveClass(), + 'class' => $classes . ' ' . $this->getActiveClass(), 'target' => $this->item['data']['target'] ?? '_self', - 'link' => $this->getLink(), + 'href' => $this->getLink(), 'label' => $this->item['label'], ]; } diff --git a/src/Classes/RenderNavItem.php b/src/Classes/RenderNavItem.php index 6bf5238..6cb10f0 100644 --- a/src/Classes/RenderNavItem.php +++ b/src/Classes/RenderNavItem.php @@ -2,6 +2,7 @@ namespace LaraZeus\Sky\Classes; +use Illuminate\Support\Facades\Blade; use LaraZeus\Sky\Classes\LinkRenderers\GenericLinkRenderer; use LaraZeus\Sky\Classes\LinkRenderers\NavLinkRenderer; use LaraZeus\Sky\SkyPlugin; @@ -13,23 +14,6 @@ class RenderNavItem */ public static string $defaultRendererClass = GenericLinkRenderer::class; - private static function anchorLink( - string $classes, - string $target, - string $link, - string $label, - ): string { - // TODO: make this component based? - // Then it's probably easier for users to further customize this? - return '' . - $label . // TODO: allow optional wrapping link text in span? - // Or maybe support this customization via components? - ''; - } - public static function render(array $item, string $class = ''): string { $itemType = $item['type']; @@ -47,6 +31,9 @@ public static function render(array $item, string $class = ''): string /** * @var NavLinkRenderer $renderer */ - return static::anchorLink(...$renderer->getPreparedLink($class)); + return Blade::render( + '', + $renderer->getPreparedLink($class) + ); } } diff --git a/src/Components/SkyLink.php b/src/Components/SkyLink.php new file mode 100644 index 0000000..5c85614 --- /dev/null +++ b/src/Components/SkyLink.php @@ -0,0 +1,22 @@ +data()); + } +} 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'); } From 809143d4408054ea0ff95645f4f34e7050b074a9 Mon Sep 17 00:00:00 2001 From: mallardduck Date: Mon, 18 Mar 2024 20:44:01 +0000 Subject: [PATCH 07/11] Fix styling --- src/Components/SkyLink.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Components/SkyLink.php b/src/Components/SkyLink.php index 5c85614..f593b89 100644 --- a/src/Components/SkyLink.php +++ b/src/Components/SkyLink.php @@ -6,14 +6,14 @@ class SkyLink extends Component { - public function __construct( public string $label, public ?bool $hasLabelWrap = false, - ) {} + ) { + } /** - * @inheritDoc + * {@inheritDoc} */ public function render() { From 73b6cdcc88eb7b181f649bc227ada6eafceda547 Mon Sep 17 00:00:00 2001 From: Dan Pock Date: Mon, 18 Mar 2024 17:29:45 -0400 Subject: [PATCH 08/11] refactor add controls for classes --- resources/views/components/sky-link.blade.php | 2 +- src/Classes/LinkRenderers/NavLinkRenderer.php | 5 ++--- src/Configuration.php | 22 +++++++++++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/resources/views/components/sky-link.blade.php b/resources/views/components/sky-link.blade.php index 43097e6..a80e206 100644 --- a/resources/views/components/sky-link.blade.php +++ b/resources/views/components/sky-link.blade.php @@ -1,3 +1,3 @@ -except('label')->except('hasLabelWrap') }}> +except(['label', 'hasLabelWrap']) }}> {{ $label }} diff --git a/src/Classes/LinkRenderers/NavLinkRenderer.php b/src/Classes/LinkRenderers/NavLinkRenderer.php index aee9e84..5d27ef4 100644 --- a/src/Classes/LinkRenderers/NavLinkRenderer.php +++ b/src/Classes/LinkRenderers/NavLinkRenderer.php @@ -13,10 +13,9 @@ public function __construct( ) { } - // TODO: something to control these classes for end-user? public static string $activeClasses = 'border-b border-b-secondary-500 text-secondary-500'; - public static string $defaultActiveClass = 'border-transparent'; + public static string $nonActiveClasses = 'border-transparent'; abstract public function getModel(): ?Model; @@ -28,7 +27,7 @@ public function getActiveClass(): string { return $this->isActiveRoute() ? self::$activeClasses : - self::$defaultActiveClass; + self::$nonActiveClasses; } /** diff --git a/src/Configuration.php b/src/Configuration.php index 39f545c..b35ad54 100644 --- a/src/Configuration.php +++ b/src/Configuration.php @@ -311,4 +311,26 @@ public function getNavRenderers(): array $this->navRenderers ); } + + /** + * Set the default active CSS class(es) on a nav link. + * @param string $activeClasses + * @return $this + */ + public function setActiveClasses(string $activeClasses): static + { + NavLinkRenderer::$activeClasses = $activeClasses; + return $this; + } + + /** + * Set the default non-active CSS class(es) on a nav link. + * @param string $nonActiveClass + * @return $this + */ + public function setNonActiveClasses(string $nonActiveClass): static + { + NavLinkRenderer::$nonActiveClasses = $nonActiveClass; + return $this; + } } From b6c00b47676a78d71f59ed8f4194df5c1cd80fee Mon Sep 17 00:00:00 2001 From: mallardduck Date: Mon, 18 Mar 2024 21:30:16 +0000 Subject: [PATCH 09/11] Fix styling --- src/Configuration.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Configuration.php b/src/Configuration.php index b35ad54..8a86cc1 100644 --- a/src/Configuration.php +++ b/src/Configuration.php @@ -314,23 +314,25 @@ public function getNavRenderers(): array /** * Set the default active CSS class(es) on a nav link. - * @param string $activeClasses + * * @return $this */ public function setActiveClasses(string $activeClasses): static { NavLinkRenderer::$activeClasses = $activeClasses; + return $this; } /** * Set the default non-active CSS class(es) on a nav link. - * @param string $nonActiveClass + * * @return $this */ public function setNonActiveClasses(string $nonActiveClass): static { NavLinkRenderer::$nonActiveClasses = $nonActiveClass; + return $this; } } From 7bfddb3ed0c3a663e7d16abd741ed56df2a4ae8e Mon Sep 17 00:00:00 2001 From: Dan Pock Date: Thu, 21 Mar 2024 14:33:40 -0400 Subject: [PATCH 10/11] refactor based on feedback --- config/zeus-sky.php | 7 +++ .../LinkRenderers/LibraryLinkRenderer.php | 2 +- src/Classes/LinkRenderers/NavLinkRenderer.php | 2 +- .../LinkRenderers/PageLinkRenderer.php | 2 +- .../LinkRenderers/PostLinkRenderer.php | 2 +- src/Classes/RenderNavItem.php | 44 ++++++++++++++++- src/Configuration.php | 47 ------------------- 7 files changed, 54 insertions(+), 52 deletions(-) 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/src/Classes/LinkRenderers/LibraryLinkRenderer.php b/src/Classes/LinkRenderers/LibraryLinkRenderer.php index 8ce58a6..c46bbf6 100644 --- a/src/Classes/LinkRenderers/LibraryLinkRenderer.php +++ b/src/Classes/LinkRenderers/LibraryLinkRenderer.php @@ -8,7 +8,7 @@ class LibraryLinkRenderer extends NavLinkRenderer { - public static string $renders = 'library-link'; + public static string $rendersKey = 'library-link'; public function getModel(): ?Model { diff --git a/src/Classes/LinkRenderers/NavLinkRenderer.php b/src/Classes/LinkRenderers/NavLinkRenderer.php index 5d27ef4..cc1d488 100644 --- a/src/Classes/LinkRenderers/NavLinkRenderer.php +++ b/src/Classes/LinkRenderers/NavLinkRenderer.php @@ -6,7 +6,7 @@ abstract class NavLinkRenderer { - public static string $renders; + public static string $rendersKey; public function __construct( protected array $item diff --git a/src/Classes/LinkRenderers/PageLinkRenderer.php b/src/Classes/LinkRenderers/PageLinkRenderer.php index 1ad5954..3e83e19 100644 --- a/src/Classes/LinkRenderers/PageLinkRenderer.php +++ b/src/Classes/LinkRenderers/PageLinkRenderer.php @@ -8,7 +8,7 @@ class PageLinkRenderer extends NavLinkRenderer { - public static string $renders = 'page-link'; + public static string $rendersKey = 'page-link'; public function getModel(): ?Model { diff --git a/src/Classes/LinkRenderers/PostLinkRenderer.php b/src/Classes/LinkRenderers/PostLinkRenderer.php index 0842975..0734ef6 100644 --- a/src/Classes/LinkRenderers/PostLinkRenderer.php +++ b/src/Classes/LinkRenderers/PostLinkRenderer.php @@ -8,7 +8,7 @@ class PostLinkRenderer extends NavLinkRenderer { - public static string $renders = 'post-link'; + public static string $rendersKey = 'post-link'; public function getModel(): ?Model { diff --git a/src/Classes/RenderNavItem.php b/src/Classes/RenderNavItem.php index 6cb10f0..f878496 100644 --- a/src/Classes/RenderNavItem.php +++ b/src/Classes/RenderNavItem.php @@ -4,7 +4,10 @@ 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; use LaraZeus\Sky\SkyPlugin; class RenderNavItem @@ -14,13 +17,52 @@ class RenderNavItem */ 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 + { + $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 = SkyPlugin::get()->getNavRenderers(); + $renderersMap = static::getNavRenderers(); if (array_key_exists($itemType, $renderersMap)) { $rendererClass = $renderersMap[$itemType]; $renderer = new $rendererClass($item); diff --git a/src/Configuration.php b/src/Configuration.php index 8a86cc1..efbfe17 100644 --- a/src/Configuration.php +++ b/src/Configuration.php @@ -288,51 +288,4 @@ public function hideResources(array $resources = []): static return $this; } - - /** - * @param class-string $rendererClass - * @return $this - */ - public function navRenderer(string $rendererClass): static - { - $this->navRenderers[$rendererClass::$renders] = $rendererClass; - - return $this; - } - - public function getNavRenderers(): array - { - return array_merge( - [ - PageLinkRenderer::$renders => PageLinkRenderer::class, - PostLinkRenderer::$renders => PostLinkRenderer::class, - LibraryLinkRenderer::$renders => LibraryLinkRenderer::class, - ], - $this->navRenderers - ); - } - - /** - * Set the default active CSS class(es) on a nav link. - * - * @return $this - */ - public function setActiveClasses(string $activeClasses): static - { - NavLinkRenderer::$activeClasses = $activeClasses; - - return $this; - } - - /** - * Set the default non-active CSS class(es) on a nav link. - * - * @return $this - */ - public function setNonActiveClasses(string $nonActiveClass): static - { - NavLinkRenderer::$nonActiveClasses = $nonActiveClass; - - return $this; - } } From 6b0df436f45f16f1a319641d2d2414c9f9845172 Mon Sep 17 00:00:00 2001 From: mallardduck Date: Thu, 21 Mar 2024 18:33:58 +0000 Subject: [PATCH 11/11] Fix styling --- src/Classes/RenderNavItem.php | 1 - src/Configuration.php | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/Classes/RenderNavItem.php b/src/Classes/RenderNavItem.php index f878496..603fb24 100644 --- a/src/Classes/RenderNavItem.php +++ b/src/Classes/RenderNavItem.php @@ -8,7 +8,6 @@ use LaraZeus\Sky\Classes\LinkRenderers\NavLinkRenderer; use LaraZeus\Sky\Classes\LinkRenderers\PageLinkRenderer; use LaraZeus\Sky\Classes\LinkRenderers\PostLinkRenderer; -use LaraZeus\Sky\SkyPlugin; class RenderNavItem { diff --git a/src/Configuration.php b/src/Configuration.php index efbfe17..1ddae6d 100644 --- a/src/Configuration.php +++ b/src/Configuration.php @@ -6,10 +6,7 @@ use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Illuminate\Support\Str; -use LaraZeus\Sky\Classes\LinkRenderers\LibraryLinkRenderer; use LaraZeus\Sky\Classes\LinkRenderers\NavLinkRenderer; -use LaraZeus\Sky\Classes\LinkRenderers\PageLinkRenderer; -use LaraZeus\Sky\Classes\LinkRenderers\PostLinkRenderer; trait Configuration {