78 lines
2.5 KiB
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);
|
|
}
|
|
}
|