Stand: SMTP-Test, Admin-Mail-Tab, Notifiable-Fix, Lazy-Quill

- Fix: Notifiable-Trait zum User-Model hinzugefuegt (behebt notify()-500er)
- Installer: SMTP-Verbindungstest mit EsmtpTransport + Ueberspringen-Link
- Admin: Neuer E-Mail-Tab mit SMTP-Konfiguration + Verbindungstest
- Admin: Lazy Quill-Initialisierung (nur sichtbare Locale wird geladen)
- Uebersetzungen: 17 neue Mail-Keys in allen 6 Sprachen

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Rhino
2026-03-02 07:30:37 +01:00
commit 2e24a40d68
9633 changed files with 1300799 additions and 0 deletions

View File

@@ -0,0 +1,176 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>{{ $title }}</title>
<style>
@page {
size: {{ $orientation ?? 'portrait' }};
margin: 10mm;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'DejaVu Sans', Helvetica, Arial, sans-serif;
font-size: {{ $fontSize ?? 10 }}pt;
color: #374151;
background: #f3f4f6;
}
/* Card container */
.card {
background: #ffffff;
border-radius: 8px;
overflow: hidden;
}
/* Dark header */
.card-header {
background: #1f2937;
padding: 14px 20px;
}
.card-header h1 {
font-size: {{ max(($fontSize ?? 10) + 4, 13) }}pt;
font-weight: 700;
color: #ffffff;
margin: 0;
}
.card-header .subtitle {
font-size: {{ max(($fontSize ?? 10), 9) }}pt;
color: #d1d5db;
margin-top: 2px;
}
/* Notes bar */
.notes-bar {
padding: 8px 20px;
background: #f9fafb;
border-bottom: 1px solid #e5e7eb;
font-size: {{ max(($fontSize ?? 10) - 1, 8) }}pt;
color: #4b5563;
}
/* Table */
table {
width: 100%;
border-collapse: collapse;
}
th {
background: #f3f4f6;
border-bottom: 1px solid #e5e7eb;
padding: 7px 12px;
text-align: left;
font-size: {{ max(($fontSize ?? 10) - 2, 7) }}pt;
font-weight: 600;
color: #6b7280;
text-transform: uppercase;
letter-spacing: 0.5px;
}
td {
padding: 6px 12px;
border-bottom: 1px solid #f3f4f6;
font-size: {{ $fontSize ?? 10 }}pt;
color: #374151;
}
tr:nth-child(even) td {
background: #fafbfc;
}
.row-num {
color: #9ca3af;
font-size: {{ max(($fontSize ?? 10) - 2, 7) }}pt;
width: 28px;
font-family: monospace;
}
.empty-cell {
color: #d1d5db;
}
.link {
color: #2563eb;
text-decoration: none;
}
/* Footer bar */
.card-footer {
padding: 8px 20px;
background: #f9fafb;
border-top: 1px solid #e5e7eb;
font-size: {{ max(($fontSize ?? 10) - 3, 7) }}pt;
color: #9ca3af;
}
.card-footer table { border: none; }
.card-footer td {
border: none;
padding: 0;
background: none;
font-size: {{ max(($fontSize ?? 10) - 3, 7) }}pt;
color: #9ca3af;
}
.card-footer .right {
text-align: right;
}
</style>
</head>
<body>
<div class="card">
{{-- Dark header --}}
<div class="card-header">
<h1>{{ $title }}</h1>
@if ($subtitle)
<div class="subtitle">{{ $subtitle }}</div>
@endif
</div>
{{-- Notes --}}
@if ($notes)
<div class="notes-bar">{{ $notes }}</div>
@endif
{{-- Data table --}}
<table>
<thead>
<tr>
<th class="row-num">#</th>
@foreach ($columns as $key => $header)
<th>{{ $header }}</th>
@endforeach
</tr>
</thead>
<tbody>
@forelse ($rows as $i => $row)
<tr>
<td class="row-num">{{ $i + 1 }}</td>
@foreach ($columns as $key => $header)
<td>
@if (($key === 'email') && !empty($row[$key]))
<a class="link" href="mailto:{{ $row[$key] }}">{{ $row[$key] }}</a>
@elseif (($key === 'phone') && !empty($row[$key]) && $row[$key] !== '')
<a class="link" href="tel:{{ $row[$key] }}">{{ $row[$key] }}</a>
@elseif (($row[$key] ?? '') === '')
<span class="empty-cell">&mdash;</span>
@else
{{ $row[$key] }}
@endif
</td>
@endforeach
</tr>
@empty
<tr>
<td colspan="{{ count($columns) + 1 }}" style="text-align: center; color: #9ca3af; padding: 20px;">
{{ __('admin.no_entries') }}
</td>
</tr>
@endforelse
</tbody>
</table>
{{-- Footer bar --}}
<div class="card-footer">
<table>
<tr>
<td>{{ count($rows) }} {{ __('admin.list_entries_count') }}</td>
<td class="right">{{ __('admin.list_generated_at') }}: {{ $generatedAt->translatedFormat('d.m.Y, H:i') }} Uhr</td>
</tr>
</table>
</div>
</div>
</body>
</html>