Backend-WIP: Kontakt-Queue, Page-Cache, Validierungs-Feedback, i18n

Gebuendelt, da ueber gemeinsame lang-/Service-Dateien verschraenkt:
- Kontakt-Nachrichten: contact_messages-Tabelle + Model/Enums/Factory,
  Admin-Queue (livewire/admin/contact-messages), ContactController
  persistiert das Anliegen zusaetzlich zur Brand-Mail
- Page-Data-Cache (Services/Web/*PageData) + web-archive-Indizes auf
  press_releases
- Validierungs-Feedback + Company-Portal-Restriction (Feature-Tests)
- i18n-Auslagerung lang/de|en (auth, passwords, validation, static)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-09 15:38:11 +00:00
parent ef5de54300
commit 72e6a3c210
60 changed files with 3963 additions and 327 deletions

View file

@ -21,9 +21,12 @@ class CategoryNavigation
/**
* Top-Level-Rubriken der aktiven Ausgabe als Navigationsitems.
*
* Sortiert nach Anzahl veröffentlichter Pressemitteilungen; `null` als
* Limit liefert alle Rubriken (z. B. für das „Mehr“-Dropdown im Header).
*
* @return Collection<int, array{label:string, slug:string, href:string}>
*/
public static function items(int $limit = 9): Collection
public static function items(?int $limit = 9): Collection
{
$portal = Portal::tryFrom((string) config('app.theme')) ?? Portal::Businessportal24;
$language = app()->getLocale();
@ -46,7 +49,7 @@ class CategoryNavigation
->whereNull('parent_id')
->orderByDesc('published_count')
->orderBy('id')
->limit($limit)
->when($limit !== null, fn (Builder $query) => $query->limit($limit))
->get()
->map(function (Category $category): ?array {
$translation = $category->translations->first();