PM-Vorschau: echtes Portal-Design, Direkt-Button und Portal-Switch
Der Vorschau-Link (/pm-vorschau/{token}) renderte eine schlichte
Standalone-Seite, die dem spaeteren Erscheinungsbild nicht entsprach.
Jetzt rendert er die echte Detailseite (web.release-detail) im Theme
des Zielportals:
- Controller wendet Domain-/Theme-Konfig des Zielportals an (Sprache
der PM, Links zeigen auf die Portal-Domain), kein Hit-Zaehler
- Gelbes Vorschau-Banner mit Status und Link-Gueltigkeit; noindex per
Meta-Tag + X-Robots-Tag-Header, Canonical entfaellt bei noindex
(neue robots-Section im Web-Layout)
- Teilen-Buttons teilen den Vorschau-Link selbst (oeffentliche URL
existiert vor Veroeffentlichung noch nicht)
- PMs fuer beide Portale: ?portal=... waehlt die Ansicht, Umschalter
im Banner; im Kundenpanel je Portal ein Vorschau-Button, sonst ein
einzelner "Vorschau oeffnen"-Button (Link-Feld jetzt kopierbar)
- Alte press-release-preview-View entfernt
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
9a95a6937d
commit
090a893cc6
8 changed files with 306 additions and 149 deletions
|
|
@ -3,6 +3,12 @@
|
|||
@php
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
// Private Vorschau über Magic-Link (/pm-vorschau/{token}): identisches
|
||||
// Layout wie die spätere öffentliche Seite, plus Hinweis-Banner und noindex.
|
||||
$isPreview = ($isPreview ?? false) === true;
|
||||
$previewExpiresAt = $previewExpiresAt ?? null;
|
||||
$previewPortalOptions = $previewPortalOptions ?? null;
|
||||
|
||||
$company = $release->company;
|
||||
|
||||
$categoryTranslation = $release->category?->translations?->firstWhere('locale', app()->getLocale())
|
||||
|
|
@ -17,7 +23,9 @@
|
|||
$parentSlug = $parentTranslation?->slug;
|
||||
$parentHref = $parentSlug ? route('kategorie', ['slug' => $parentSlug]) : route('web.home');
|
||||
|
||||
$publishedAt = $release->published_at;
|
||||
// In der Vorschau ersatzweise der geplante Termin, damit die Meta-Zeile
|
||||
// der späteren Veröffentlichung entspricht.
|
||||
$publishedAt = $release->published_at ?? ($isPreview ? $release->scheduledAtLocal() : null);
|
||||
$embargoAt = $release->embargoAtLocal();
|
||||
|
||||
$bodyHtml = $release->renderedText();
|
||||
|
|
@ -55,7 +63,9 @@
|
|||
$publisherVerified = (bool) ($company?->is_active && filled($company?->website));
|
||||
$isRecommended = $release->content_score !== null && $release->content_score >= 80;
|
||||
|
||||
$shareUrl = route('release.detail', ['slug' => $release->slug]);
|
||||
// In der Vorschau wird der Vorschau-Link selbst geteilt — die öffentliche
|
||||
// URL existiert vor der Veröffentlichung noch nicht.
|
||||
$shareUrl = $isPreview ? request()->fullUrl() : route('release.detail', ['slug' => $release->slug]);
|
||||
$brandLabel = config('app.theme') === 'presseecho' ? 'presseecho' : 'businessportal24';
|
||||
@endphp
|
||||
|
||||
|
|
@ -65,7 +75,11 @@
|
|||
@if ($imageUrl)
|
||||
@section('og_image', $imageUrl)
|
||||
@endif
|
||||
@section('canonical', $shareUrl)
|
||||
@if ($isPreview)
|
||||
@section('robots', 'noindex,nofollow')
|
||||
@else
|
||||
@section('canonical', $shareUrl)
|
||||
@endif
|
||||
|
||||
@section('content')
|
||||
{{-- Lese-Fortschrittsbalken --}}
|
||||
|
|
@ -78,6 +92,44 @@
|
|||
|
||||
<x-web.site-header />
|
||||
|
||||
@if ($isPreview)
|
||||
{{-- Hinweis-Banner: private Vorschau, nicht öffentlich erreichbar --}}
|
||||
<div class="bg-amber-50 border-b border-amber-200 text-amber-900">
|
||||
<div class="max-w-layout mx-auto px-4 sm:px-6 lg:px-8 py-2.5 flex flex-wrap items-center gap-x-4 gap-y-1 text-[12.5px]">
|
||||
<span class="text-[9.5px] font-bold tracking-[0.18em] uppercase px-2.5 py-[3px] border border-amber-400 font-mono whitespace-nowrap">
|
||||
● {{ __('web.detail.preview_label') }}
|
||||
</span>
|
||||
<span>{{ __('web.detail.preview_text') }}</span>
|
||||
<span class="font-mono text-[11.5px] text-amber-800">
|
||||
{{ __('web.detail.preview_status', ['status' => $release->status->label()]) }}
|
||||
@if ($previewExpiresAt)
|
||||
· {{ __('web.detail.preview_valid_until', ['date' => $previewExpiresAt->translatedFormat('j. F Y, H:i')]) }}
|
||||
@endif
|
||||
</span>
|
||||
|
||||
@if (! empty($previewPortalOptions))
|
||||
{{-- PM erscheint auf beiden Portalen: Ansicht umschalten --}}
|
||||
<span class="sm:ml-auto inline-flex items-center gap-2">
|
||||
<span class="text-[10px] font-semibold tracking-[0.14em] uppercase text-amber-800 font-mono">{{ __('web.detail.preview_portal_switch') }}</span>
|
||||
<span class="inline-flex items-stretch border border-amber-400 divide-x divide-amber-400 font-mono text-[10.5px]">
|
||||
@foreach ($previewPortalOptions as $option)
|
||||
<a href="{{ $option['url'] }}"
|
||||
@class([
|
||||
'px-2.5 py-[3px] whitespace-nowrap transition-colors cursor-pointer',
|
||||
'bg-amber-400/40 font-bold text-amber-950' => $option['active'],
|
||||
'hover:bg-amber-100 text-amber-900' => ! $option['active'],
|
||||
])
|
||||
@if ($option['active']) aria-current="true" @endif>
|
||||
{{ $option['label'] }}
|
||||
</a>
|
||||
@endforeach
|
||||
</span>
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<main class="bg-bg text-ink">
|
||||
<article>
|
||||
{{-- Breadcrumbs --}}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue