Added:
- toolbar refactor
This commit is contained in:
@@ -33,7 +33,7 @@ class ImportController extends AbstractController
|
||||
|
||||
}
|
||||
|
||||
#[Route('/import', name: 'app_import')]
|
||||
#[Route('/manga/import', name: 'app_manga_import')]
|
||||
public function index(Request $request, SessionInterface $session): Response
|
||||
{
|
||||
if ($request->isMethod('post')) {
|
||||
@@ -73,7 +73,7 @@ class ImportController extends AbstractController
|
||||
$filePath = $session->get('import_file_path');
|
||||
$originalFileName = $session->get('import_original_file_name');
|
||||
if (!$filePath || !$originalFileName) {
|
||||
return $this->redirectToRoute('app_import');
|
||||
return $this->redirectToRoute('app_manga_import');
|
||||
}
|
||||
|
||||
$metadata = $this->cbzService->extractMetadata($filePath, $originalFileName);
|
||||
@@ -82,7 +82,7 @@ class ImportController extends AbstractController
|
||||
'type' => 'error',
|
||||
'message' => 'Impossible de détecter le titre du manga.'
|
||||
]);
|
||||
return $this->redirectToRoute('app_import');
|
||||
return $this->redirectToRoute('app_manga_import');
|
||||
}
|
||||
|
||||
$mangas = $this->mangaRepository->findBySlug($metadata['title']);
|
||||
@@ -130,7 +130,7 @@ class ImportController extends AbstractController
|
||||
public function confirm(Request $request, SessionInterface $session): Response
|
||||
{
|
||||
if (!$request->isMethod('POST')) {
|
||||
return $this->redirectToRoute('app_import');
|
||||
return $this->redirectToRoute('app_manga_import');
|
||||
}
|
||||
|
||||
$action = $request->request->get('action');
|
||||
@@ -145,7 +145,7 @@ class ImportController extends AbstractController
|
||||
'type' => 'error',
|
||||
'message' => 'Manga non trouvé.'
|
||||
]);
|
||||
return $this->redirectToRoute('app_import');
|
||||
return $this->redirectToRoute('app_manga_import');
|
||||
}
|
||||
|
||||
$filePath = $session->get('import_file_path');
|
||||
@@ -154,7 +154,7 @@ class ImportController extends AbstractController
|
||||
'type' => 'error',
|
||||
'message' => 'Fichier d\'import non trouvé.'
|
||||
]);
|
||||
return $this->redirectToRoute('app_import');
|
||||
return $this->redirectToRoute('app_manga_import');
|
||||
}
|
||||
$originalFileName = $session->get('import_original_file_name');
|
||||
|
||||
@@ -192,6 +192,6 @@ class ImportController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->redirectToRoute('app_import');
|
||||
return $this->redirectToRoute('app_manga_import');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Controller;
|
||||
|
||||
use App\Entity\Chapter;
|
||||
use App\Entity\Manga;
|
||||
use App\Manager\Toolbar\Factory\ToolbarFactory;
|
||||
use App\Manager\ToolbarManager;
|
||||
use App\Message\DownloadChapter;
|
||||
use App\Repository\ChapterRepository;
|
||||
@@ -36,7 +37,7 @@ class MangaController extends AbstractController
|
||||
private readonly MangaUpdatesMetadataProvider $mangaUpdatesDbProvider,
|
||||
private readonly MessageBusInterface $bus,
|
||||
private readonly CbzService $cbzService,
|
||||
private readonly ToolbarManager $toolbarManager
|
||||
private readonly ToolbarFactory $toolbarFactory
|
||||
)
|
||||
{
|
||||
}
|
||||
@@ -46,12 +47,16 @@ class MangaController extends AbstractController
|
||||
{
|
||||
$sort = $request->query->get('sort', 'title');
|
||||
$order = $request->query->get('order', 'asc');
|
||||
$status = $request->query->get('status', 'all');
|
||||
$view = $request->query->get('view', 'poster');
|
||||
|
||||
$mangas = $this->mangaRepository->findAllSorted($sort, $order);
|
||||
$mangas = $this->mangaRepository->findAllSortedAndFiltered($sort, $order, $status);
|
||||
|
||||
return $this->render('manga/index.html.twig', [
|
||||
'mangas' => $mangas,
|
||||
'toolbarItems' => $this->toolbarManager->getToolbarItems(),
|
||||
'toolbar' => $this->toolbarFactory->createToolbar('manga_list')->getGroups(),
|
||||
'currentStatus' => $status,
|
||||
'currentView' => $view,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -94,7 +99,7 @@ class MangaController extends AbstractController
|
||||
return $this->render('manga/show_chapters.html.twig', [
|
||||
'chapters_by_volume' => $chaptersByVolume,
|
||||
'manga' => $manga,
|
||||
'toolbarItems' => $this->toolbarManager->getToolbarItems(),
|
||||
'toolbar' => $this->toolbarFactory->createToolbar('chapter_list')->getGroups(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
21
src/Manager/Toolbar/Definition/ChapterListToolbar.php
Normal file
21
src/Manager/Toolbar/Definition/ChapterListToolbar.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace App\Manager\Toolbar\Definition;
|
||||
|
||||
use App\Manager\Toolbar\Element\ToolbarButton;
|
||||
use App\Manager\Toolbar\Element\ToolbarDivider;
|
||||
|
||||
class ChapterListToolbar extends Toolbar
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->addToLeftGroup(new ToolbarButton('keyboard', 'Rename chapters', 'renameChapters'))
|
||||
->addToLeftGroup(new ToolbarButton('file-zipper', 'Manage cbz', 'manageCbz'))
|
||||
->addToLeftGroup(new ToolbarButton('history', 'History', 'history'))
|
||||
->addToLeftGroup(new ToolbarDivider())
|
||||
->addToLeftGroup(new ToolbarButton('bookmark', 'Monitoring', 'monitoring'))
|
||||
->addToLeftGroup(new ToolbarButton('wrench', 'Edit', 'edit'))
|
||||
->addToLeftGroup(new ToolbarButton('trash-can', 'Delete', 'delete'))
|
||||
->addToRightGroup(new ToolbarButton('chevron-down', 'Expand all', 'expandAll'));
|
||||
}
|
||||
}
|
||||
37
src/Manager/Toolbar/Definition/MangaListToolbar.php
Normal file
37
src/Manager/Toolbar/Definition/MangaListToolbar.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Manager\Toolbar\Definition;
|
||||
|
||||
use App\Manager\Toolbar\Element\ToolbarButton;
|
||||
use App\Manager\Toolbar\Element\ToolbarDivider;
|
||||
use App\Manager\Toolbar\Element\ToolbarDropdown;
|
||||
|
||||
class MangaListToolbar extends Toolbar
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->addToLeftGroup(new ToolbarButton('arrows-rotate', 'Refresh metadata', 'refreshMetadata'))
|
||||
->addToLeftGroup(new ToolbarButton('search', 'Search last chapter', 'searchLastChapter'))
|
||||
->addToLeftGroup(new ToolbarDivider())
|
||||
->addToLeftGroup(new ToolbarButton('plus', 'Add Manga', 'addManga'))
|
||||
|
||||
->addToRightGroup(new ToolbarButton('th-large', 'Options', 'options'))
|
||||
->addToRightGroup(new ToolbarDivider())
|
||||
->addToRightGroup(new ToolbarDropdown('eye', 'View', 'changeView', [
|
||||
['text' => 'Poster View', 'action' => 'changeView', 'data' => ['view' => 'poster']],
|
||||
['text' => 'Table View', 'action' => 'changeView', 'data' => ['view' => 'table']],
|
||||
['text' => 'Resume View', 'action' => 'changeView', 'data' => ['view' => 'resume']]
|
||||
]))
|
||||
->addToRightGroup(new ToolbarDropdown('sort', 'Sort', 'sort', [
|
||||
['text' => 'Par titre', 'action' => 'sort', 'data' => ['sort' => 'title']],
|
||||
['text' => 'Par année de publication', 'action' => 'sort', 'data' => ['sort' => 'publicationYear']],
|
||||
['text' => 'Par date d\'ajout', 'action' => 'sort', 'data' => ['sort' => 'createdAt']]
|
||||
]))
|
||||
->addToRightGroup(new ToolbarDropdown('filter', 'Filter', 'filter', [
|
||||
['text' => 'Tous les mangas', 'action' => 'filter', 'data' => ['filter' => 'all']],
|
||||
['text' => 'Mangas en cours', 'action' => 'filter', 'data' => ['filter' => 'ongoing']],
|
||||
['text' => 'Mangas terminés', 'action' => 'filter', 'data' => ['filter' => 'completed']]
|
||||
]))
|
||||
;
|
||||
}
|
||||
}
|
||||
31
src/Manager/Toolbar/Definition/Toolbar.php
Normal file
31
src/Manager/Toolbar/Definition/Toolbar.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Manager\Toolbar\Definition;
|
||||
|
||||
use App\Manager\Toolbar\Element\ToolbarElement;
|
||||
|
||||
class Toolbar
|
||||
{
|
||||
private array $leftGroup = [];
|
||||
private array $rightGroup = [];
|
||||
|
||||
public function addToLeftGroup(ToolbarElement $element): self
|
||||
{
|
||||
$this->leftGroup[] = $element;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addToRightGroup(ToolbarElement $element): self
|
||||
{
|
||||
$this->rightGroup[] = $element;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getGroups(): array
|
||||
{
|
||||
return [
|
||||
'leftGroup' => $this->leftGroup,
|
||||
'rightGroup' => $this->rightGroup,
|
||||
];
|
||||
}
|
||||
}
|
||||
37
src/Manager/Toolbar/Element/AbstractToolbarElement.php
Normal file
37
src/Manager/Toolbar/Element/AbstractToolbarElement.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Manager\Toolbar\Element;
|
||||
|
||||
abstract class AbstractToolbarElement implements ToolbarElement
|
||||
{
|
||||
protected string $icon;
|
||||
protected string|array $text;
|
||||
protected string $action;
|
||||
|
||||
public function __construct(string $icon, string|array $text, string $action)
|
||||
{
|
||||
$this->icon = $icon;
|
||||
$this->text = $text;
|
||||
$this->action = $action;
|
||||
}
|
||||
|
||||
public function getIcon(): string
|
||||
{
|
||||
return $this->icon;
|
||||
}
|
||||
|
||||
public function getText(): string|array
|
||||
{
|
||||
return $this->text;
|
||||
}
|
||||
|
||||
public function getAction(): string
|
||||
{
|
||||
return $this->action;
|
||||
}
|
||||
|
||||
public function getAdditionalProperties(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
14
src/Manager/Toolbar/Element/ToolbarButton.php
Normal file
14
src/Manager/Toolbar/Element/ToolbarButton.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace App\Manager\Toolbar\Element;
|
||||
|
||||
use App\Manager\Toolbar\Element\AbstractToolbarElement;
|
||||
|
||||
class ToolbarButton extends AbstractToolbarElement
|
||||
{
|
||||
|
||||
public function getType(): string
|
||||
{
|
||||
return 'button';
|
||||
}
|
||||
}
|
||||
15
src/Manager/Toolbar/Element/ToolbarDivider.php
Normal file
15
src/Manager/Toolbar/Element/ToolbarDivider.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace App\Manager\Toolbar\Element;
|
||||
|
||||
class ToolbarDivider extends AbstractToolbarElement
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct('divider', '', '');
|
||||
}
|
||||
public function getType(): string
|
||||
{
|
||||
return 'divider';
|
||||
}
|
||||
}
|
||||
24
src/Manager/Toolbar/Element/ToolbarDropdown.php
Normal file
24
src/Manager/Toolbar/Element/ToolbarDropdown.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Manager\Toolbar\Element;
|
||||
|
||||
class ToolbarDropdown extends AbstractToolbarElement
|
||||
{
|
||||
private array $items;
|
||||
|
||||
public function __construct(string $icon, string $text, string $action, array $items)
|
||||
{
|
||||
parent::__construct($icon, $text, $action);
|
||||
$this->items = $items;
|
||||
}
|
||||
|
||||
public function getType(): string
|
||||
{
|
||||
return 'dropdown';
|
||||
}
|
||||
|
||||
public function getAdditionalProperties(): array
|
||||
{
|
||||
return ['items' => $this->items];
|
||||
}
|
||||
}
|
||||
12
src/Manager/Toolbar/Element/ToolbarElement.php
Normal file
12
src/Manager/Toolbar/Element/ToolbarElement.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace App\Manager\Toolbar\Element;
|
||||
|
||||
interface ToolbarElement
|
||||
{
|
||||
public function getIcon(): string;
|
||||
public function getText(): string|array;
|
||||
public function getAction(): string;
|
||||
public function getType(): string;
|
||||
public function getAdditionalProperties(): array;
|
||||
}
|
||||
19
src/Manager/Toolbar/Factory/ToolbarFactory.php
Normal file
19
src/Manager/Toolbar/Factory/ToolbarFactory.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace App\Manager\Toolbar\Factory;
|
||||
|
||||
use App\Manager\Toolbar\Definition\ChapterListToolbar;
|
||||
use App\Manager\Toolbar\Definition\MangaListToolbar;
|
||||
use App\Manager\Toolbar\Definition\Toolbar;
|
||||
|
||||
class ToolbarFactory
|
||||
{
|
||||
public function createToolbar(string $type): Toolbar
|
||||
{
|
||||
return match ($type) {
|
||||
'manga_list' => new MangaListToolbar(),
|
||||
'chapter_list' => new ChapterListToolbar(),
|
||||
default => throw new \InvalidArgumentException("Unknown toolbar type: $type"),
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -25,17 +25,18 @@ class ToolbarManager
|
||||
private function getFilterItems(): array
|
||||
{
|
||||
return [
|
||||
['text' => 'Tous les genres', 'action' => 'filter', 'data' => ['filter-option' => 'allGenres']],
|
||||
['text' => 'Mangas terminés', 'action' => 'filter', 'data' => ['filter-option' => 'completed']],
|
||||
['text' => 'Mangas en cours', 'action' => 'filter', 'data' => ['filter-option' => 'ongoing']]
|
||||
['text' => 'Tous les mangas', 'action' => 'filter', 'data' => ['filter-option' => 'all']],
|
||||
['text' => 'Mangas en cours', 'action' => 'filter', 'data' => ['filter-option' => 'ongoing']],
|
||||
['text' => 'Mangas terminés', 'action' => 'filter', 'data' => ['filter-option' => 'completed']]
|
||||
];
|
||||
}
|
||||
|
||||
private function getViewOptions(): array
|
||||
{
|
||||
return [
|
||||
['text' => 'Vue grille', 'action' => 'changeView', 'data' => ['view-option' => 'grid']],
|
||||
['text' => 'Vue liste', 'action' => 'changeView', 'data' => ['view-option' => 'list']]
|
||||
['text' => 'Vue poster', 'action' => 'changeView', 'data' => ['view-option' => 'poster']],
|
||||
['text' => 'Vue résumé', 'action' => 'changeView', 'data' => ['view-option' => 'resume']],
|
||||
['text' => 'Vue table', 'action' => 'changeView', 'data' => ['view-option' => 'table']]
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,23 +103,14 @@ class MangaRepository extends ServiceEntityRepository
|
||||
return $query->getQuery()->getOneOrNullResult();
|
||||
}
|
||||
|
||||
public function findAllSorted(string $sort = 'title', string $order = 'asc'): array
|
||||
public function findAllSortedAndFiltered($sort = 'title', $order = 'asc', $status = 'all')
|
||||
{
|
||||
$qb = $this->createQueryBuilder('m');
|
||||
$qb = $this->createQueryBuilder('m')
|
||||
->orderBy('m.' . $sort, $order);
|
||||
|
||||
switch ($sort) {
|
||||
case 'title':
|
||||
$qb->orderBy('m.title', $order);
|
||||
break;
|
||||
case 'publicationYear':
|
||||
$qb->orderBy('m.publicationYear', $order);
|
||||
break;
|
||||
case 'createdAt':
|
||||
$qb->orderBy('m.createdAt', $order);
|
||||
break;
|
||||
// Ajoutez d'autres cas pour les différentes options de tri
|
||||
default:
|
||||
$qb->orderBy('m.title', 'asc');
|
||||
if ($status !== 'all') {
|
||||
$qb->andWhere('m.status = :status')
|
||||
->setParameter('status', $status);
|
||||
}
|
||||
|
||||
return $qb->getQuery()->getResult();
|
||||
|
||||
@@ -42,6 +42,7 @@ readonly class MangadexProvider implements MetadataProviderInterface
|
||||
->setSlug($this->slugger->slug($result['attributes']['title']['en'])->lower())
|
||||
->setDescription($result['attributes']['description']['fr'] ?? $result['attributes']['description']['en'] ?? '')
|
||||
->setPublicationYear($result['attributes']['year'])
|
||||
->setStatus($result['attributes']['status'])
|
||||
;
|
||||
$tags = [];
|
||||
foreach($result['attributes']['tags'] as $tag){
|
||||
|
||||
Reference in New Issue
Block a user