CluPilotCloud/app/Livewire/Admin/Setup.php

78 lines
2.5 KiB
PHP

<?php
namespace App\Livewire\Admin;
use App\Support\Navigation;
use Livewire\Attributes\Layout;
use Livewire\Component;
/**
* Die Tür zu allem, was man einmal einrichtet.
*
* Neun Seiten standen in der Seitenleiste zwischen dem Tagesgeschäft — die
* Mail-Einrichtung neben einem Rechtsdokument, neben den persönlichen
* Kontoeinstellungen, neben der Mitarbeiterverwaltung. Sie sind gleich wichtig
* und ungleich häufig: man fasst sie an, wenn etwas Neues dazukommt, und danach
* monatelang nicht mehr. In einer Liste, die man jeden Tag liest, kosten sie
* jeden Tag Aufmerksamkeit.
*
* Diese Seite legt sie hinter EINEN Eintrag und ordnet sie nach dem, was sie
* einrichten. Sie fasst nichts an: jede Seite behält ihre Route, ihre
* Berechtigung und ihren Inhalt — es ändert sich nur der Weg dorthin. Damit ist
* der Umbau rückholbar, und ob einzelne dieser Seiten später verschmelzen, ist
* eine eigene Entscheidung.
*
* Bewusst Kacheln und keine Reiterleiste: neun Reiter wären wieder das, was
* hier gerade abgeschafft wird.
*/
#[Layout('layouts.admin')]
class Setup extends Component
{
public function render()
{
return view('livewire.admin.setup', [
'groups' => $this->visibleGroups(),
])->title(__('setup.title'));
}
/**
* Nur, was dieser Betreiber auch öffnen darf — und keine leere Gruppe.
*
* Eine Kachel, die zu einer 403 führt, ist schlimmer als eine fehlende:
* sie sieht aus wie ein Weg. Dieselbe Prüfung, die x-shell.nav je Eintrag
* anwendet, damit beide Wege zu einer Seite dieselbe Antwort geben.
*
* @return array<string, array<int, array{0:string,1:string,2:string,3:mixed}>>
*/
private function visibleGroups(): array
{
$sichtbar = [];
foreach (Navigation::setup() as $gruppe => $kacheln) {
$erlaubt = array_values(array_filter(
$kacheln,
fn (array $kachel) => $this->mayOpen($kachel[3]),
));
if ($erlaubt !== []) {
$sichtbar[$gruppe] = $erlaubt;
}
}
return $sichtbar;
}
private function mayOpen(mixed $capability): bool
{
if ($capability === null) {
return true;
}
$betreiber = auth('operator')->user();
return is_array($capability)
? collect($capability)->contains(fn (string $eine) => (bool) $betreiber?->can($eine))
: (bool) $betreiber?->can($capability);
}
}