From c0bce88e75f64b2aa23eee817d44bea5432ac51c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Wed, 6 Sep 2023 09:53:52 +0200 Subject: [PATCH] Overhaul pagination --- .../Pagination/ItemsPerPaginationEnum.php | 16 ++ app/Http/Controllers/Controller.php | 27 ++++ app/Http/Controllers/ProductController.php | 2 +- app/Lib/Helpers/ToolboxHelper.php | 20 +++ resources/lang/fr/crud.php | 83 +++++++++++ resources/sass/base/_common.scss | 5 + resources/ts/utilities/fontawesome.ts | 12 ++ resources/views/modules/pagination.blade.php | 140 +++++++++++------- 8 files changed, 253 insertions(+), 52 deletions(-) create mode 100644 app/Enums/Pagination/ItemsPerPaginationEnum.php create mode 100644 resources/lang/fr/crud.php diff --git a/app/Enums/Pagination/ItemsPerPaginationEnum.php b/app/Enums/Pagination/ItemsPerPaginationEnum.php new file mode 100644 index 0000000..b1682f8 --- /dev/null +++ b/app/Enums/Pagination/ItemsPerPaginationEnum.php @@ -0,0 +1,16 @@ +route()->getName()); + $cacheKey = "pagination.{$currentRoutePath}"; + $pagination = $pagination ?? ItemsPerPaginationEnum::twelve->value; + $pagination = ToolboxHelper::getValidatedPaginate( + Cache::get($cacheKey, $pagination) + ); + if (Cache::get($cacheKey) !== $pagination) { + Cache::put($cacheKey, $pagination); + } + $query = $query->paginate($pagination); + return $query; + } } diff --git a/app/Http/Controllers/ProductController.php b/app/Http/Controllers/ProductController.php index 1e03b0c..9c731ad 100644 --- a/app/Http/Controllers/ProductController.php +++ b/app/Http/Controllers/ProductController.php @@ -38,7 +38,7 @@ class ProductController extends Controller $this->sortQuery($products); - $products = $products->paginate(10); + $products = $this->paginate($products); /** @var array $printMultiProduct Array of id */ $printMultiProduct = session('printMultiProduct') ?? []; diff --git a/app/Lib/Helpers/ToolboxHelper.php b/app/Lib/Helpers/ToolboxHelper.php index e82533e..e280f90 100644 --- a/app/Lib/Helpers/ToolboxHelper.php +++ b/app/Lib/Helpers/ToolboxHelper.php @@ -2,6 +2,7 @@ namespace App\Lib\Helpers; +use App\Enums\Pagination\ItemsPerPaginationEnum; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; @@ -9,6 +10,7 @@ use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; use Illuminate\Validation\Rule; +use Illuminate\Validation\Rules\Enum; use Illuminate\Validation\ValidationException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -288,4 +290,22 @@ class ToolboxHelper { return (array_diff($array1, $array2) == [] && array_diff($array2, $array1) == []); } + + /** + * Get validated pagination from request + * + * @param integer $default + * @return integer + */ + public static function getValidatedPaginate(int $default): int + { + try { + return \intval(Validator::make( + ['pagination' => \request()->get('pagination')], + ['pagination' => new Enum(ItemsPerPaginationEnum::class)] + )->validated()['pagination']); + } catch (ValidationException $e) { + return $default; + } + } } diff --git a/resources/lang/fr/crud.php b/resources/lang/fr/crud.php new file mode 100644 index 0000000..3465c18 --- /dev/null +++ b/resources/lang/fr/crud.php @@ -0,0 +1,83 @@ + [ + 'list' => 'Liste', + 'view' => 'Voir', + 'create' => 'Créer', + 'duplicate' => 'Dupliquer', + 'update' => 'Éditer', + 'delete' => 'Supprimer', + 'save' => 'Sauvegarder', + 'edit' => 'Mettre à jour', + ], + + 'helpers' => [ + 'list' => 'Liste', + 'list_all' => 'Lister tous les :model', + 'create_model' => 'Créer :model', + 'view_model' => 'Voir :model', + 'update_model' => 'Éditer :model', + 'duplicate_model' => 'Dupliquer :model', + 'delete_model' => 'Supprimer :model', + 'save_model' => 'Sauvegarder :model', + 'edit_model' => 'Mettre à jour :model', + 'no_results' => 'Aucun résultat pour :model', + 'publish' => 'Publié', + 'unpublish' => 'Dépublié', + ], + + 'libs' => [ + 'toolbox' => [ + 'assertFieldIsUnique' => 'La :valeur du champ :attribut est déjà utilisée', + 'assertNoInternalBoUrls' => ':attribute : Il est interdit de coller l\'uri de back-office dans ce champ', + 'assertNoInternalUrls' => ':attribute : Il est interdit de coller une url de :appname dans ce champ.', + ] + ], + + 'messages' => [ + 'has_been_created' => ':model a été créé', + 'cannot_be_created' => ':model ne peut être créé', + 'has_been_updated' => ':model a été mis à jour', + 'cannot_be_updated' => ':model ne peut être mis à jour', + 'has_been_deleted' => ':model a été supprimé', + 'cannot_be_deleted' => ':model ne peut être supprimé', + 'order_changed' => 'L\'ordre a été changé !', + 'order_not_changed' => 'L\'ordre n\'a pas été changé !', + 'publish_status_saved' => 'Changement de l\'état de publication réussit !', + 'right' => 'Vous n\'avez pas les droits pour accéder à cette partie !' + ], + + 'minicrud' => [ + 'visibility_label' => 'Visibilité', + 'visibility_helper' => 'Vérifier qu\'il est visible.', + 'enum_select' => 'Sélectionnez :enum dans la liste.', + 'associated_enum' => 'Associé :enum', + 'dimensions_must_be' => 'Doit être :widthpx (largeur) par :heightpx (hauteur).', + 'picture_title_helper' => 'Utile pour les utilisateurs, s\'affiche en passant la souris sur l\'image', + 'picture_title_label' => 'Attribut du titre de l\'image', + 'picture_alt_helper' => 'Doit décrire votre image pour les moteurs de recherche et les aveugles (5 à 6 mots)', + 'picture_alt_label' => 'Attribut Alt de l\'image', + 'text_warning' => 'Relisez votre contenu avant de le publier', + ], + + 'pagination' => [ + "previous" => "Page précédente", + "next" => "Page suivante", + "specific_page" => "Accéder à la page n°:id", + 'paginate_list' => 'Nombre d\'éléments par page', + ], + + 'other' => [ + 'up' => 'Modifier l\'ordre d\'apparition vers le haut', + 'down' => 'Modifier l\'ordre d\'apparition vers le bas', + 'no_model_found' => 'Aucun :model trouvés', + 'publish' => 'Publié', + 'unpublish' => 'Dépublié', + 'sort_ascending' => 'Trier :name dans l\'ordre croissant', + 'sort_descending' => 'Trier :name dans l\'ordre décroissant', + 'sort_delete' => 'Supprimer le tri', + 'sort_arrow' => 'Ici, les flèches sont utilisées pour trier et non pour filtrer', + 'right' => 'Vous n\'avez pas les droits', + ] +]; diff --git a/resources/sass/base/_common.scss b/resources/sass/base/_common.scss index a52b4d5..479a389 100644 --- a/resources/sass/base/_common.scss +++ b/resources/sass/base/_common.scss @@ -15,6 +15,11 @@ white-space: nowrap; } +.btn-md { + min-width: 38px; + height: 38px; +} + // Print fiche commerciale @media print { #print-id-product { diff --git a/resources/ts/utilities/fontawesome.ts b/resources/ts/utilities/fontawesome.ts index fbcd640..e148221 100644 --- a/resources/ts/utilities/fontawesome.ts +++ b/resources/ts/utilities/fontawesome.ts @@ -1,5 +1,6 @@ import { config, dom, library } from "~/@fortawesome/fontawesome-svg-core"; import { + faAnglesRight, faArrowAltCircleDown, faArrowAltCircleUp, faArrowDown, @@ -12,6 +13,9 @@ import { faArrowsAltV, faBackspace, faCheck, + faChevronLeft, + faChevronRight, + faCircleNotch, faCopy, faCrop, faDownload, @@ -20,8 +24,10 @@ import { faFile, faFilePdf, faFolderOpen, + faHeading, faImage, faLink, + faListUl, faMinus, faPencil, faPlus, @@ -79,5 +85,11 @@ library.add(faPrint); library.add(faImage); library.add(faDownload); library.add(faFilePdf); +library.add(faListUl); +library.add(faHeading); +library.add(faAnglesRight); +library.add(faChevronLeft); +library.add(faChevronRight); +library.add(faCircleNotch); dom.watch(); diff --git a/resources/views/modules/pagination.blade.php b/resources/views/modules/pagination.blade.php index eca3d1a..c86ebd1 100644 --- a/resources/views/modules/pagination.blade.php +++ b/resources/views/modules/pagination.blade.php @@ -1,60 +1,98 @@ -@if ($paginator->hasPages()) -