{{-- Les photos de la page, par chantier (un retour de chantier par carte), ou toutes à la suite (« Mosaïque », $photos). Une photo : _tuile. Une vignette ouvre la photo dans le panneau de droite (lien `?photo=`, intercepté par js/phototheque.js) ; la loupe l'ouvre en grand (js/visionneuse.js), et la visionneuse défile sur toute la page. La case la met dans la sélection, que la barre du haut étiquette d'un coup. Une vidéo (reprise de digiKam) se lit dans la visionneuse comme une photo s'y regarde (`data-video`), et dans le panneau. --}} @php $peutModifier = auth()->user()?->can('photos.edit'); $peutTrier = auth()->user()?->can('photos.delete'); $peutPublier = auth()->user()?->can('photos.publier'); $ouverte = $photo?->id; $dansLaCorbeille = $filtres->vue === 'corbeille'; // Cocher sert à étiqueter, publier ou jeter ; dans la corbeille, seulement à restaurer. $peutSelectionner = $dansLaCorbeille ? $peutTrier : ($peutModifier || $peutTrier || $peutPublier); @endphp
@foreach ($actifs as $actif) {{ $actif['cle'] }} {{ $actif['valeur'] }} @endforeach {{-- Par chantier, ou toutes à la suite : pour choisir parmi toutes les photos d'un modèle sans passer de carte en carte. Retenu pour la session (PhotoController::index). --}}
@foreach (['chantiers' => [__('Par chantier'), 'bi-collection'], 'mosaique' => [__('Mosaïque'), 'bi-grid-3x3-gap']] as $valeur => [$libelle, $icone]) {{ $libelle }} @endforeach
@if ($peutSelectionner) {{-- La barre de sélection : cachée tant que rien n'est coché (js/phototheque.js). Les cases des vignettes s'y rattachent par `form="lot-etiquette"`, sans être dans le formulaire. Un seul formulaire, une seule adresse : le bouton cliqué dit le geste (`geste`), PhotoController::lot vérifie la permission. « Mettre à la corbeille » n'a pas besoin du nom d'étiquette, d'où `formnovalidate`. --}} @endif @if ($photos?->isNotEmpty()) {{-- La mosaïque : toutes les photos à la suite, sans carte de chantier. Le client passe sous la photo, faute d'en-tête qui le dise. --}}
@foreach ($photos as $p) @php $nomClient = $p->client?->libelle ?? $p->client_nom ?? ($p->client_id ? __('Client :id', ['id' => $p->client_id]) : __('Client inconnu')); @endphp @include('admin.photos._tuile', ['piedClient' => true]) @endforeach
{{ $photos->links() }} @else @forelse (($chantiers ?? collect()) as $chantier) @php $planning = $chantier['planning']; $premiere = $chantier['photos']->first(); // Le client du planning ; une photo reprise de digiKam sans planning // a quand même le sien. $client = $planning?->client ?? $premiere->client; // Le client de la copie Gestan ; sinon l'étiquette de digiKam // (« RICHARD.B ») ; sinon son seul id. $nomClient = $client?->libelle ?? $premiere->client_nom ?? ($premiere->client_id ? __('Client :id', ['id' => $premiere->client_id]) : __('Client inconnu')); $produits = $chantier['photos']->flatMap->produits ->filter(fn ($p) => $p->modele || $p->type_id || $p->article) ->unique(fn ($p) => $p->commande_id ?: ($p->article ? 'a|' . $p->article : $p->modele . '|' . $p->couleur)); $commandes = $produits->pluck('commande_id')->filter()->unique()->take(3); // Tous ceux qui ont envoyé des photos du chantier : à trois sur place, // chacun envoie les siennes. $auteur = $chantier['photos'] ->map(fn ($p) => $p->user ? trim($p->user->prenom . ' ' . $p->user->nom) : $p->photographe) ->filter()->unique()->implode(', '); $nonVues = $dansLaCorbeille ? 0 : $chantier['photos']->filter(fn ($p) => !$p->estTraitee())->count(); @endphp
{{-- Coche ou décoche les photos de la carte d'un coup, celles que les filtres montrent ; à moitié cochée (tiret) quand une partie l'est (js/phototheque.js). Pas de `name` : seules les cases des photos partent avec le formulaire. --}} @if ($peutSelectionner) @endif

@if ($premiere->client_id) {{ $nomClient }} @else {{ $nomClient }} @endif @if ($premiere->ville) · {{ \Illuminate\Support\Str::title(mb_strtolower($premiere->ville)) }} @endif

{{ collect([ $premiere->metier ? config("rapport_chantiers.types.{$premiere->metier}") : null, $premiere->date_chantier?->translatedFormat('j M Y') . ($premiere->date_chantier ? ' · S' . $premiere->date_chantier->isoWeek() : ''), $planning?->equipe?->nom, \App\Services\Photos\Phototheque::compteDe($chantier['photos']) . ($auteur ? ' ' . __('de :nom', ['nom' => $auteur]) : ''), ])->filter()->implode(' · ') }}
@if ($produits->isNotEmpty())
@foreach ($produits->take(4) as $produit) {{ collect([mb_strtoupper($produit->modele ?? '') ?: $produit->article, \App\Services\Photos\Phototheque::couleurCourte($produit->couleur)])->filter()->implode(' · ') }} @endforeach
@endif
@if ($planning) {{ __('Planning') }} @endif @foreach ($commandes as $commande) {{ __('Commande :n', ['n' => $commande]) }} @endforeach
{{-- Le chantier sort de la file : tout son lot, pas seulement les photos que les filtres montrent — c'est le chantier qu'on déclare vu. --}} @if ($peutModifier && $nonVues)
@csrf
@endif
@foreach ($chantier['photos'] as $p) @include('admin.photos._tuile') @endforeach
@empty
@if ($filtres->vue === 'a-traiter' && !$actifs)

{{ __('Tout est traité.') }}

{{ __('Les prochaines photos arriveront ici avec les retours de chantier.') }}

@elseif ($dansLaCorbeille && !$actifs)

{{ __('La corbeille est vide.') }}

@else

{{ __('Aucune photo ne passe ces filtres.') }}

{{ __('Les photos arrivent avec les retours de chantier remplis depuis le planning.') }}

@endif @if ($actifs) {{ __('Tout effacer') }} @endif
@endforelse {{ $chantiers?->links() }} @endif