Aller au contenu principal

Layouts

Layouts disponibles

LayoutFichierUsage
layouts.appresources/views/layouts/app.blade.phpPages génériques simples
layouts.adminresources/views/layouts/admin.blade.phpModule Admin (sidebar + topbar)
layouts.dashboardresources/views/layouts/dashboard.blade.phpWidgets intranet uniquement
layouts.metierresources/views/layouts/metier.blade.phpToutes les applications métier
layouts.fullpageresources/views/layouts/fullpage.blade.phpPages plein écran
elevage::layouts.appModules/Elevage/…/layouts/app.blade.phpÉlevage (étend layouts.metier)

Règle de choix du layout

ContexteLayout
Widgets intranet (Dashboard, Alert, Actualité)layouts.dashboard
Applications métier (Elevage, ChrConnector, EdiEngine…)layouts.metier
Module Adminlayouts.admin
Pages simples sans structure spécifiquelayouts.app

Layout métier (layouts.metier)

C'est le layout commun de toutes les applications métier.

Fournit :

  • La navbar partagée (bleue, 44px)
  • La zone de contenu (#metier-main, flex 1)
  • Le footer avec pastille notice

Paramètres attendus :

ParamètreDescriptionObligatoire
$appCodeCode dans core_applications (ex. 'elevage_huitres')Oui
$navbarTitleTitre affiché dans la navbarNon
$noticeURL de la notice de pageNon

Usage :

@extends('layouts.metier', ['appCode' => 'mon_app_code'])

Fichier : resources/views/layouts/partials/navbar.blade.php

  • Hauteur fixe : 44px
  • Background : #0d6efd
  • Structure : logo SVG (gauche) · titre centré · actions (droite)
  • Actions droite : Accueil · Admin (si autorisé) · dropdown utilisateur

Bouton Admin :

  • Layouts standard : visible si is_admin ou admin_srv
  • Layout métier : visible si isAdminOfApp($app) (inclut is_admin)
  • URL Admin → paramètres de l'application (/admin/applications/{id}/settings)

Paramètres du partial :

ParamètreDescription
$navbarDefaultTitleTitre centre de la navbar
$navbarAdminUrlURL du bouton Admin (override)
$navbarCanAdminBool override de la visibilité du bouton Admin

Présente dans layouts.admin et elevage::layouts.app.

PropriétéAdminÉlevage
Background#212529#212529
Largeur240px210px
Lien actifcolor: #fff; background: #343a40border-left: 3px solid #0d6efd
Texte inactif#adb5bd#adb5bd
Labels section.7rem, font-weight: 600, uppercaseidem

  • Hauteur : 31px (--footer-h)
  • Background : #f0f2f5, bordure top #dee2e6
  • Pastille d'aide bas-gauche : quart de cercle #0d6efd, icône bi-info-lg
    • Lien actif : cliquable, icône grossit au hover (transition .18s ease)
    • Inactif : opacity: .45, cursor: default

En-tête de page standard

<div class="d-flex justify-content-between align-items-center mb-4">
<h4 class="mb-0">Titre de la page</h4>
@can('create', App\Models\MonModele::class)
<button type="button" class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#modal-add">
<i class="bi bi-plus-lg me-1"></i>Ajouter
</button>
@endcan
</div>
@section('breadcrumb', 'Parent › Enfant')

Affiché dans la topbar Admin, text-muted small.

Titre d'onglet

@section('title', 'Libellé')

Rendu : Libellé — {{ config('app.name') }}


Formulaires

  • Centrés dans col-lg-6 avec row.justify-content-center
  • Bouton retour + h4 en haut : d-flex align-items-center gap-3 mb-4
  • Card shadow-sm autour du formulaire
  • Boutons en bas à droite :
<div class="d-flex justify-content-end gap-2 mt-4">
<a href="{{ url()->previous() }}" class="btn btn-outline-secondary">Annuler</a>
<button type="submit" class="btn btn-primary">Enregistrer</button>
</div>

Sections repliables

<div class="card-header" data-bs-toggle="collapse" data-bs-target="#section-id" style="cursor:pointer">
<div class="d-flex align-items-center justify-content-between">
<h5 class="mb-0"><i class="bi bi-list me-2"></i>Titre section</h5>
<div class="d-flex align-items-center gap-2">
<span class="badge bg-dark">{{ $count }}</span>
<i class="bi bi-chevron-down"></i>
</div>
</div>
</div>
<div class="collapse" id="section-id">
<div class="card-body">...</div>
</div>