*/ #[Computed] public function presubmitChecks(): array { $titleLen = mb_strlen(trim($this->title)); $textLen = app(PressReleaseHtmlSanitizer::class)->plainTextLength($this->text); $tagsCount = count($this->tagsArray()); return [ [ 'key' => 'title', 'status' => $titleLen >= 5 ? 'ok' : 'err', 'label' => __('Titel vorhanden'), 'sub' => $titleLen > 0 ? __(':n Zeichen', ['n' => $titleLen]) : __('Noch leer'), ], [ 'key' => 'text', 'status' => $textLen >= 600 ? 'ok' : ($textLen >= 50 ? 'warn' : 'err'), 'label' => __('Mindestlänge Fließtext erreicht'), 'sub' => __(':n / 600 Zeichen empfohlen', ['n' => number_format($textLen, 0, ',', '.')]), ], [ 'key' => 'company', 'status' => $this->companyId ? 'ok' : 'err', 'label' => __('Firma zugeordnet'), 'sub' => $this->selectedCompany()?->name ?? __('Keine Firma gewählt'), ], [ 'key' => 'category', 'status' => $this->categoryId ? 'ok' : 'err', 'label' => __('Kategorie gewählt'), 'sub' => $this->categoryId ? '' : __('Kategorie ist Pflicht'), ], [ 'key' => 'contact', 'status' => $this->contactId ? 'ok' : 'warn', 'label' => __('Pressekontakt zugeordnet'), 'sub' => $this->contactId ? '' : __('empfohlen — Journalisten greifen direkt zum Hörer'), ], [ 'key' => 'tags', 'status' => $tagsCount >= 1 ? 'ok' : 'warn', 'label' => __('Themen-Tags vergeben'), 'sub' => $tagsCount >= 1 ? trans_choice('{1}:n Tag|[2,*]:n Tags', $tagsCount, ['n' => $tagsCount]) : __('empfohlen für SEO & Auffindbarkeit'), ], ]; } }