Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
365 changes: 325 additions & 40 deletions .github/workflows/Build.yml

Large diffs are not rendered by default.

50 changes: 46 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,48 @@

# Ignores Mac metadata. You can configure this globally if you use a Mac: http://islegend.com/development/setting-global-gitignore-mac-windows/
.DS_Store
assets/vendor/
.phpunit.result.cache
.vscode

# Ignore developer resources
_meta/

# Ignore personal config files (dev)
app/.env

# Ignore lock files
composer.lock

# Ignore log, cache, sessions and storage directories
app/cache/*
app/database/*
app/logs/*
app/sessions/*
app/storage/*

# Unignore log, cache, sessions and storage .gitkeeps
!app/cache/.gitkeep
!app/database/.gitkeep
!app/logs/.gitkeep
!app/sessions/.gitkeep
!app/storage/.gitkeep

# Ignore Composer vendor
vendor/

# Ignore node modules
node_modules/

# Ignore compiled assets
public/assets/

# Ignore Vagrant & Homestead VM
vagrant/Homestead/
.vagrant/

# Ignore dev utility cache
.phpunit.cache
.php_cs.cache

# Ignore api doc
api/

# Ignore ignore directory
ignore/
55 changes: 55 additions & 0 deletions app/src/Breadcrumb.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

/*
* UserFrosting Breadcrumb Sprinkle
*
* @link https://github.com/lcharette/UF_Breadcrumb
* @copyright Copyright (c) 2020 Louis Charette
* @license https://github.com/lcharette/UF_Breadcrumb/blob/master/LICENSE (MIT License)
*/

namespace UserFrosting\Sprinkle\Breadcrumb;

use UserFrosting\Sprinkle\Breadcrumb\Twig\BreadcrumbExtension;
use UserFrosting\Sprinkle\Core\Core;
use UserFrosting\Sprinkle\Core\Sprinkle\Recipe\TwigExtensionRecipe;
use UserFrosting\Sprinkle\SprinkleRecipe;
use UserFrosting\Theme\AdminLTE\AdminLTE;

class Breadcrumb implements SprinkleRecipe, TwigExtensionRecipe
{
public function getName(): string
{
return 'Breadcrumb';
}

public function getPath(): string
{
return __DIR__ . '/../';
}

public function getSprinkles(): array
{
return [
Core::class,
AdminLTE::class,
];
}

public function getRoutes(): array
{
return [];
}

public function getServices(): array
{
return [];
}

public function getTwigExtensions(): array
{
return [
BreadcrumbExtension::class,
];
}
}
51 changes: 12 additions & 39 deletions src/Breadcrumb/Manager.php → app/src/BreadcrumbManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,56 +8,28 @@
* @license https://github.com/lcharette/UF_Breadcrumb/blob/master/LICENSE (MIT License)
*/

namespace UserFrosting\Sprinkle\Breadcrumb\Breadcrumb;
namespace UserFrosting\Sprinkle\Breadcrumb;

use InvalidArgumentException;
use UserFrosting\I18n\MessageTranslator;
use UserFrosting\Config\Config;
use UserFrosting\I18n\Translator;
use UserFrosting\Sprinkle\Core\Router;
use UserFrosting\Support\Repository\Repository as Config;
use UserFrosting\Sprinkle\Core\Util\RouteParserInterface;

/**
* The Breadcrumbs class, which manage the breadcrumbs in the Application.
*/
class Manager
class BreadcrumbManager
{
/**
* @var array<Crumb> An array of crumb in the breadcrumbs list.
*/
protected $crumbs = [];

/**
* @var Config
*/
protected $config;

/**
* @var Translator|MessageTranslator
*/
protected $translator;

/**
* @var Router
*/
protected $router;

/**
* Create a new Manager object.
*
* @param Config $config
* @param Translator|MessageTranslator $translator
* @param Router $router
*/
public function __construct(Config $config, $translator, Router $router)
{
// Support for older version of Translator
if (!$translator instanceof Translator && !$translator instanceof MessageTranslator) {
throw new InvalidArgumentException('Translator must be an instance of Translator.');
}

$this->config = $config;
$this->translator = $translator;
$this->router = $router;
public function __construct(
protected Config $config,
protected Translator $translator,
protected RouteParserInterface $routeParser,
) {
}

/**
Expand Down Expand Up @@ -193,7 +165,7 @@ protected function getSiteTitle(): Crumb
}

/**
* Conver crumb to array.
* Convert crumb to array.
*
* @param Crumb $crumb
*
Expand All @@ -204,7 +176,8 @@ protected function crumbToArray(Crumb $crumb): array
$route = $crumb->getRoute();
if (!is_string($route)) {
list($name, $data) = $route;
$route = $this->router->pathFor($name, $data);

$route = $this->routeParser->urlFor($name, $data);
}

return [
Expand Down
4 changes: 2 additions & 2 deletions src/Breadcrumb/Crumb.php → app/src/Crumb.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @license https://github.com/lcharette/UF_Breadcrumb/blob/master/LICENSE (MIT License)
*/

namespace UserFrosting\Sprinkle\Breadcrumb\Breadcrumb;
namespace UserFrosting\Sprinkle\Breadcrumb;

/**
* Representation of a breadcrumb element.
Expand Down Expand Up @@ -110,7 +110,7 @@ public function setUri(string $uri)
/**
* Get the uri.
*
* @return string|array<string,array>
* @return string|array<mixed>
*/
public function getRoute()
{
Expand Down
38 changes: 38 additions & 0 deletions app/src/ServicesProvider/BreadcrumbServiceProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

/*
* UserFrosting Breadcrumb Sprinkle
*
* @link https://github.com/lcharette/UF_Breadcrumb
* @copyright Copyright (c) 2020 Louis Charette
* @license https://github.com/lcharette/UF_Breadcrumb/blob/master/LICENSE (MIT License)
*/

namespace UserFrosting\Sprinkle\Breadcrumb\ServicesProvider;

use Psr\Container\ContainerInterface;
use UserFrosting\Config\Config;
use UserFrosting\I18n\Translator;
use UserFrosting\ServicesProvider\ServicesProviderInterface;
use UserFrosting\Sprinkle\Breadcrumb\BreadcrumbManager;
use UserFrosting\Sprinkle\Core\Router;

/**
* Registers services for the Breadcrumb sprinkle.
*/
class BreadcrumbServiceProvider implements ServicesProviderInterface
{
/**
* Register UserFrosting's Breadcrumb services.
*
* @param ContainerInterface $container A DI container implementing ArrayAccess and container-interop.
*/
public function register(): array
{
return [
BreadcrumbManager::class => function (Config $config, Translator $translator, Router $router) {
return new BreadcrumbManager($config, $translator, $router);
},
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,17 @@

use Twig\Extension\AbstractExtension;
use Twig\Extension\GlobalsInterface;
use UserFrosting\Sprinkle\Breadcrumb\Breadcrumb\Manager;
use UserFrosting\Sprinkle\Breadcrumb\Breadcrumb;
use UserFrosting\Sprinkle\Breadcrumb\BreadcrumbManager;

/**
* Extends Twig functionality for the Breadcrumb sprinkle.
*/
class BreadcrumbExtension extends AbstractExtension implements GlobalsInterface
{
/**
* @var Manager
*/
protected $breadcrumb;

public function __construct(Manager $breadcrumb)
{
$this->breadcrumb = $breadcrumb;
public function __construct(
protected BreadcrumbManager $breadcrumb
) {
}

/**
Expand All @@ -40,7 +36,7 @@ public function getName()
/**
* @return array<string,mixed>
*/
public function getGlobals()
public function getGlobals(): array
{
return [
'breadcrumbs' => $this->breadcrumb->generate(),
Expand Down
22 changes: 22 additions & 0 deletions app/tests/BreadcrumbTestCase.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

/*
* UserFrosting Admin Sprinkle (http://www.userfrosting.com)
*
* @link https://github.com/userfrosting/sprinkle-admin
* @copyright Copyright (c) 2013-2024 Alexander Weissman & Louis Charette
* @license https://github.com/userfrosting/sprinkle-admin/blob/master/LICENSE.md (MIT License)
*/

namespace UserFrosting\Sprinkle\Breadcrumb\Tests;

use UserFrosting\Sprinkle\Breadcrumb\Breadcrumb;
use UserFrosting\Testing\TestCase;

/**
* Test case with Admin as main sprinkle
*/
class BreadcrumbTestCase extends TestCase
{
protected string $mainSprinkle = Breadcrumb::class;
}
76 changes: 76 additions & 0 deletions app/tests/Integration/BreadcrumbTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?php

/*
* UserFrosting Breadcrumb Sprinkle
*
* @link https://github.com/lcharette/UF_Breadcrumb
* @copyright Copyright (c) 2020 Louis Charette
* @license https://github.com/lcharette/UF_Breadcrumb/blob/master/LICENSE (MIT License)
*/

namespace UserFrosting\Sprinkle\Breadcrumb\Tests\Integration;

use DI\Container;
use Slim\Views\Twig;
use UserFrosting\Config\Config;
use UserFrosting\Sprinkle\Breadcrumb\BreadcrumbManager;
use UserFrosting\Sprinkle\Breadcrumb\Manager;
use UserFrosting\Sprinkle\Breadcrumb\Tests\BreadcrumbTestCase;
use UserFrosting\UniformResourceLocator\ResourceLocation;
use UserFrosting\UniformResourceLocator\ResourceLocatorInterface;
use UserFrosting\UniformResourceLocator\ResourceStream;

const RESULT_DIR = __DIR__ . "/results";

/**
* Perform functional test with a stub controller.
*/
class BreadcrumbTest extends BreadcrumbTestCase
{
protected Container $container;

public function setUp(): void
{
parent::setUp();

$locator = $this->ci->get(ResourceLocatorInterface::class);

// Register test location for test templates
$locator->addLocation(new ResourceLocation('test', __DIR__));

$config = $this->ci->get(Config::class);

$config['site.title'] = 'FOOBAR SITE';
}

public function testBreadcrumbsSimple(): void
{
$view = $this->ci->get(Twig::class);

$result = $view->fetch('breadcrumbs.html.twig');
$this->assertXmlStringEqualsXmlFile(RESULT_DIR . '/simple.txt', $result);
}

public function testBreadcrumbsCustom(): void
{
$breadcrumb = $this->ci->get(BreadcrumbManager::class);
$breadcrumb->add('Foo');

$view = $this->ci->get(Twig::class);
$result = $view->fetch('breadcrumbs.html.twig');
$this->assertXmlStringEqualsXmlFile(RESULT_DIR . '/custom.txt', $result);
}

public function testBreadcrumbsMultiple(): void
{
$breadcrumb = $this->ci->get(BreadcrumbManager::class);
$breadcrumb->add('Bar', '/Bar')
->add('Foo')
->add('Blah', '/blah')
->add('Foo Bar');

$view = $this->ci->get(Twig::class);
$result = $view->fetch('breadcrumbs.html.twig');
$this->assertXmlStringEqualsXmlFile(RESULT_DIR . '/multiple.txt', $result);
}
}
Loading