1
0

Displaying of dossiers

This commit is contained in:
Richard Dern 2024-04-25 00:57:06 +02:00
parent 4a4727f92d
commit c7010c7e74
8 changed files with 214 additions and 2 deletions

View File

@ -7,6 +7,7 @@
use App\Classes\Traits\ManagesMetadata;
use App\Contracts\Bundles;
use App\Services\BundleRenderers\Facades\BundleRenderer;
use Carbon\Carbon;
use Exception;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Str;
@ -26,6 +27,8 @@ class Bundle implements Bundles
protected ?Bundle $parent;
protected ?array $directChildren;
public function __construct(protected string $path, protected FilesystemAdapter $disk)
{
$this->path = $this->normalizeBundlePath($path);
@ -102,6 +105,18 @@ public function getParent(): ?Bundle
return $this->parent;
}
/**
* Return an array containing direct children of this bundle
*/
public function getDirectChildren(): array
{
if (!isset($this->directChildren)) {
$this->directChildren = static::findBundles($this->getDisk(), $this->getPath());
}
return $this->directChildren;
}
public function getArticleTitle(): string
{
return $this->metadata()->get('title') ?? Str::title(basename($this->path));
@ -199,6 +214,15 @@ public static function findBundles(FilesystemAdapter $disk, ?string $path = '/',
}
}
$bundles = collect($bundles)
->sortBy([
fn (Bundle $a, Bundle $b) => Carbon::parse($a->metadata()->get('date'))
->gt(Carbon::parse($b->metadata()->get('date'))),
fn (Bundle $a, Bundle $b) => Carbon::parse($b->metadata()->get('date'))
->gt(Carbon::parse($a->metadata()->get('date'))),
])
->toArray();
return $bundles;
}

View File

@ -7,7 +7,10 @@
class BundleRendererServiceProvider extends ServiceProvider
{
protected array $bundleRenderers = [];
protected array $bundleRenderers = [
\App\Services\BundleRenderers\Renderers\DossiersListRenderer::class,
\App\Services\BundleRenderers\Renderers\DossierRenderer::class,
];
/**
* Register services.

View File

@ -0,0 +1,48 @@
<?php
namespace App\Services\BundleRenderers\Renderers;
use App\Classes\Bundle;
class DossierRenderer extends BaseRenderer
{
/**
* Renders a complete HTML view of the bundle
*/
public function render()
{
$this->prepareRender();
$parts = preg_split('#/#', $this->bundle->getPath(), -1, PREG_SPLIT_NO_EMPTY);
$dossierPath = implode('/', [$parts[0], $parts[1]]);
$dossier = new Bundle($dossierPath, $this->bundle->getDisk());
data_set($this->viewData, 'showToc', true);
data_set($this->viewData, 'dossier', $dossier);
return view('article', $this->viewData);
}
/**
* Renders a card HTML view of the bundle, suitable to display in lists
*/
public function renderCard()
{
$this->prepareRenderCard();
return view('dossier-card', $this->viewData);
}
/**
* Return a boolean value indicating if this creator in particular can
* create bundles for specified section
*/
public static function handles(Bundle $bundle): bool
{
return $bundle->getSection() && $bundle->getSection()->getPath() === '/dossiers/';
}
protected function handlePagination()
{
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\Services\BundleRenderers\Renderers;
use App\Classes\Bundle;
use Carbon\Carbon;
class DossiersListRenderer extends BaseRenderer
{
/**
* Renders a complete HTML view of the bundle
*/
public function render()
{
$this->prepareRender();
return view('article', $this->viewData);
}
/**
* Return a boolean value indicating if this creator in particular can
* create bundles for specified section
*/
public static function handles(Bundle $bundle): bool
{
return $bundle->getPath() === '/dossiers/';
}
protected function collectSubBundles()
{
$subBundles = Bundle::findBundles($this->bundle->getDisk(), $this->bundle->getPath());
$subBundles = collect($subBundles)
->filter(fn (Bundle $bundle) => !empty($bundle->metadata()->get('date')) && $bundle->getPath() !== $this->bundle->getPath())
->sort(function (Bundle $bundleA, Bundle $bundleB) {
return Carbon::parse($bundleA->metadata()->get('date'))->lt(Carbon::parse($bundleB->metadata()->get('date')));
})
->map(fn (Bundle $bundle) => $bundle->getPath())
->toArray();
return $subBundles;
}
}

View File

@ -26,6 +26,55 @@ #article-main {
flex-direction: column;
gap: 1.5rem;
.drop {
font-size: 1rem;
width: var(--design-width);
margin: 0 auto;
color: #6c7a89;
background: #01010c radial-gradient(at bottom center, #00101f, #000614, #01010c) no-repeat;
box-shadow: 0 1px 1rem #000;
border-radius: .5rem;
border: solid 2px #00101f;
padding: 0 1rem;
summary ~ * {
left: 0;
right: 0;
}
&.down {
summary ~ * {
top: 3em;
}
}
&.up {
summary ~ * {
bottom: 3em;
}
}
nav {
padding: .5rem;
ul,
ol {
padding-left: 2rem;
line-height: 150%;
margin: 0;
a {
padding: .2rem 0;
background: none;
}
li + li {
margin-top: 0;
}
}
}
}
.table-of-contents {
margin: 2rem auto;
line-height: 150%;

View File

@ -24,9 +24,27 @@ class="{!! $mainLink['classes'] !!}"
@endif
</header>
@if (!empty($body))
@if (!empty($body) || $showToc)
<section id="article-body">
@if($showToc)
<details class="drop down">
<summary>Sommaire</summary>
<nav>
@include('components.table-of-contents', ['toc' => $dossier->getDirectChildren()])
</nav>
</details>
@endif
{!! $body !!}
@if($showToc)
<details class="drop up">
<summary>Sommaire</summary>
<nav>
@include('components.table-of-contents', ['toc' => $dossier->getDirectChildren()])
</nav>
</details>
@endif
</section>
@endif
</article>

View File

@ -0,0 +1,14 @@
<ul>
@foreach ($toc as $item)
<li>
@if ('/' . urldecode(request()->path()) . '/' === $item->getPath())
<strong>{{ $item->getArticleTitle() }}</strong>
@else
<a href="{{ $item->getPath() }}">{{ $item->getArticleTitle() }}</a>
@endif
@if (!empty($item->getDirectChildren()))
@include('components.table-of-contents', ['toc' => $item->getDirectChildren()])
@endif
</li>
@endforeach
</ul>

View File

@ -0,0 +1,13 @@
<a class="article-card-link" href="{{ $bundle->getPath() }}">
<article class="article-card">
<h2>{!! $bundle->getArticleTitle() !!}</h2>
<section class="article-card-body">
@if (!empty($date))
<p><time datetime="{{ $date->toIso8601String() }}">{{ $date->isoFormat('LL') }}</time></p>
@endif
@if (!empty($section))
<p>{!! $section->getArticleTitle() !!}</p>
@endif
</section>
</article>
</a>