Skip to content

Commit

Permalink
Refactor frontend code to allow for extension of assets
Browse files Browse the repository at this point in the history
- Simpler class naming:
    Frontend\CompilerFactory → Frontend\Assets
    Frontend\HtmlDocumentFactory → Frontend\Frontend
    Frontend\HtmlDocument → Frontend\Document

- Remove AssetInterface and simply collect callbacks in Frontend\Assets
  instead

- Remove ContentInterface because it serves no purpose (never type-
  hinted or type-checked)

- Commit and add asset URLs to the Document via a content callback
  instead of in the Document factory class itself

- Add translations and locale assets to Assets separate to the assets
  factory, as non-forum/admin asset bundles probably won't want them

- Update Frontend Extender to allow the creation of new asset bundles

- Make custom LESS validation listener a standalone class instead of
  extending RecompileFrontendAssets
  • Loading branch information
tobyzerner committed Nov 22, 2018
1 parent 9e63f32 commit edaca31
Show file tree
Hide file tree
Showing 34 changed files with 519 additions and 946 deletions.
33 changes: 25 additions & 8 deletions src/Admin/AdminServiceProvider.php
Expand Up @@ -14,6 +14,9 @@
use Flarum\Event\ConfigureMiddleware;
use Flarum\Foundation\AbstractServiceProvider;
use Flarum\Foundation\Application;
use Flarum\Frontend\AddLocaleAssets;
use Flarum\Frontend\AddTranslations;
use Flarum\Frontend\Compiler\Source\SourceCollector;
use Flarum\Frontend\RecompileFrontendAssets;
use Flarum\Http\Middleware as HttpMiddleware;
use Flarum\Http\RouteCollection;
Expand Down Expand Up @@ -62,17 +65,31 @@ public function register()
$pipe->pipe(new HttpMiddleware\DispatchRoute($this->app->make('flarum.admin.routes')));
});

$this->app->bind('flarum.admin.assets', function () {
return $this->app->make('flarum.frontend.assets.defaults')('admin');
$this->app->bind('flarum.assets.admin', function () {
/** @var \Flarum\Frontend\Assets $assets */
$assets = $this->app->make('flarum.assets.factory')('admin');

$assets->js(function (SourceCollector $sources) {
$sources->addFile(__DIR__.'/../../js/dist/admin.js');
});

$assets->css(function (SourceCollector $sources) {
$sources->addFile(__DIR__.'/../../less/admin.less');
});

$this->app->make(AddTranslations::class)->forFrontend('admin')->to($assets);
$this->app->make(AddLocaleAssets::class)->to($assets);

return $assets;
});

$this->app->bind('flarum.admin.frontend', function () {
$view = $this->app->make('flarum.frontend.view.defaults')('admin');
$this->app->bind('flarum.frontend.admin', function () {
/** @var \Flarum\Frontend\Frontend $frontend */
$frontend = $this->app->make('flarum.frontend.factory')('admin');

$view->setAssets($this->app->make('flarum.admin.assets'));
$view->add($this->app->make(Content\AdminPayload::class));
$frontend->content($this->app->make(Content\AdminPayload::class));

return $view;
return $frontend;
});
}

Expand All @@ -87,7 +104,7 @@ public function boot()

$this->app->make('events')->subscribe(
new RecompileFrontendAssets(
$this->app->make('flarum.admin.assets'),
$this->app->make('flarum.assets.admin'),
$this->app->make('flarum.locales')
)
);
Expand Down
7 changes: 3 additions & 4 deletions src/Admin/Content/AdminPayload.php
Expand Up @@ -12,16 +12,15 @@
namespace Flarum\Admin\Content;

use Flarum\Extension\ExtensionManager;
use Flarum\Frontend\Content\ContentInterface;
use Flarum\Frontend\HtmlDocument;
use Flarum\Frontend\Document;
use Flarum\Group\Permission;
use Flarum\Settings\Event\Deserializing;
use Flarum\Settings\SettingsRepositoryInterface;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Database\ConnectionInterface;
use Psr\Http\Message\ServerRequestInterface as Request;

class AdminPayload implements ContentInterface
class AdminPayload
{
/**
* @var SettingsRepositoryInterface
Expand Down Expand Up @@ -52,7 +51,7 @@ public function __construct(SettingsRepositoryInterface $settings, ExtensionMana
$this->events = $events;
}

public function __invoke(HtmlDocument $document, Request $request)
public function __invoke(Document $document, Request $request)
{
$settings = $this->settings->all();

Expand Down
52 changes: 39 additions & 13 deletions src/Extend/Frontend.php
Expand Up @@ -12,9 +12,9 @@
namespace Flarum\Extend;

use Flarum\Extension\Extension;
use Flarum\Frontend\Asset\ExtensionAssets;
use Flarum\Frontend\CompilerFactory;
use Flarum\Frontend\HtmlDocumentFactory;
use Flarum\Frontend\Assets;
use Flarum\Frontend\Compiler\Source\SourceCollector;
use Flarum\Frontend\RecompileFrontendAssets;
use Flarum\Http\RouteHandlerFactory;
use Illuminate\Contracts\Container\Container;

Expand Down Expand Up @@ -77,16 +77,42 @@ private function registerAssets(Container $container, string $moduleName)
return;
}

$container->resolving(
"flarum.$this->frontend.assets",
function (CompilerFactory $assets) use ($moduleName) {
$assets->add(function () use ($moduleName) {
return new ExtensionAssets(
$moduleName, $this->css, $this->js
);
$abstract = 'flarum.assets.'.$this->frontend;

$container->resolving($abstract, function (Assets $assets) use ($moduleName) {
if ($this->js) {
$assets->js(function (SourceCollector $sources) use ($moduleName) {
$sources->addString(function () {
return 'var module={}';
});
$sources->addFile($this->js);
$sources->addString(function () use ($moduleName) {
return "flarum.extensions['$moduleName']=module.exports";
});
});
}
);

if ($this->css) {
$assets->css(function (SourceCollector $sources) {
foreach ($this->css as $path) {
$sources->addFile($path);
}
});
}
});

if (! $container->bound($abstract)) {
$container->bind($abstract, function (Container $container) {
return $container->make('flarum.assets.factory')($this->frontend);
});

$container->make('events')->subscribe(
new RecompileFrontendAssets(
$container->make($abstract),
$container->make('flarum.locales')
)
);
}
}

private function registerRoutes(Container $container)
Expand Down Expand Up @@ -114,13 +140,13 @@ private function registerContent(Container $container)

$container->resolving(
"flarum.$this->frontend.frontend",
function (HtmlDocumentFactory $view, Container $container) {
function (Frontend $frontend, Container $container) {
foreach ($this->content as $content) {
if (is_string($content)) {
$content = $container->make($content);
}

$view->add($content);
$frontend->content($content);
}
}
);
Expand Down
51 changes: 0 additions & 51 deletions src/Forum/Asset/CustomCss.php

This file was deleted.

51 changes: 0 additions & 51 deletions src/Forum/Asset/FormatterJs.php

This file was deleted.

7 changes: 3 additions & 4 deletions src/Forum/Content/AssertRegistered.php
Expand Up @@ -11,16 +11,15 @@

namespace Flarum\Forum\Content;

use Flarum\Frontend\Content\ContentInterface;
use Flarum\Frontend\HtmlDocument;
use Flarum\Frontend\Document;
use Flarum\User\AssertPermissionTrait;
use Psr\Http\Message\ServerRequestInterface as Request;

class AssertRegistered implements ContentInterface
class AssertRegistered
{
use AssertPermissionTrait;

public function __invoke(HtmlDocument $document, Request $request)
public function __invoke(Document $document, Request $request)
{
$this->assertRegistered($request->getAttribute('actor'));
}
Expand Down
7 changes: 3 additions & 4 deletions src/Forum/Content/Discussion.php
Expand Up @@ -12,15 +12,14 @@
namespace Flarum\Forum\Content;

use Flarum\Api\Client;
use Flarum\Frontend\Content\ContentInterface;
use Flarum\Frontend\HtmlDocument;
use Flarum\Frontend\Document;
use Flarum\Http\Exception\RouteNotFoundException;
use Flarum\Http\UrlGenerator;
use Flarum\User\User;
use Illuminate\Contracts\View\Factory;
use Psr\Http\Message\ServerRequestInterface as Request;

class Discussion implements ContentInterface
class Discussion
{
/**
* @var Client
Expand Down Expand Up @@ -49,7 +48,7 @@ public function __construct(Client $api, UrlGenerator $url, Factory $view)
$this->view = $view;
}

public function __invoke(HtmlDocument $document, Request $request)
public function __invoke(Document $document, Request $request)
{
$queryParams = $request->getQueryParams();
$page = max(1, array_get($queryParams, 'page'));
Expand Down
10 changes: 3 additions & 7 deletions src/Forum/Content/Index.php
Expand Up @@ -13,13 +13,12 @@

use Flarum\Api\Client;
use Flarum\Api\Controller\ListDiscussionsController;
use Flarum\Frontend\Content\ContentInterface;
use Flarum\Frontend\HtmlDocument;
use Flarum\Frontend\Document;
use Flarum\User\User;
use Illuminate\Contracts\View\Factory;
use Psr\Http\Message\ServerRequestInterface as Request;

class Index implements ContentInterface
class Index
{
/**
* @var Client
Expand All @@ -41,10 +40,7 @@ public function __construct(Client $api, Factory $view)
$this->view = $view;
}

/**
* {@inheritdoc}
*/
public function __invoke(HtmlDocument $document, Request $request)
public function __invoke(Document $document, Request $request)
{
$queryParams = $request->getQueryParams();

Expand Down

0 comments on commit edaca31

Please sign in to comment.