Quelltext des aktuellen Standes
<?php $this->layout('layouts/admin', [
'page_title' => 'Alarm-Tickets',
'current_admin_page' => 'tickets-alerts',
]); ?>
<style>
.auto-card { background:var(--color-bg); border:1px solid var(--gray-200); border-radius:8px; margin-bottom:18px; overflow:hidden; }
.auto-card-head { padding:14px 20px; background:var(--color-gray-50); border-bottom:1px solid var(--gray-200); font-weight:700; color:var(--color-primary-deep); }
.auto-card-body { padding:6px 20px; }
.auto-row { display:flex; align-items:center; gap:14px; padding:14px 0; border-bottom:1px solid var(--color-gray-100); }
.auto-row:last-child { border-bottom:none; }
.auto-icon { flex:0 0 40px; height:40px; border-radius:10px; display:flex; align-items:center; justify-content:center; color:var(--color-on-accent); font-size:1.1rem; }
.auto-meta { flex:1; min-width:0; }
.auto-name { font-weight:600; color:var(--gray-900); display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.auto-desc { font-size:0.85rem; color:var(--gray-500); margin-top:2px; }
.auto-off-hint { font-size:0.72rem; color:var(--amber-700); background:var(--amber-50); border:1px solid var(--amber-200); border-radius:4px; padding:1px 7px; }
.toggle-label { position:relative; display:inline-block; width:46px; height:26px; flex-shrink:0; cursor:pointer; }
.toggle-label input { opacity:0; width:0; height:0; }
.toggle-switch { position:absolute; inset:0; background:var(--slate-300); border-radius:26px; transition:.2s; }
.toggle-switch::before { content:''; position:absolute; width:20px; height:20px; left:3px; top:3px; background:var(--color-on-accent); border-radius:50%; transition:.2s; }
.toggle-label input:checked + .toggle-switch { background:var(--green-600); }
.toggle-label input:checked + .toggle-switch::before { transform:translateX(20px); }
.toggle-label input:disabled + .toggle-switch { background:var(--gray-200); cursor:not-allowed; }
.auto-row.is-disabled { opacity:0.55; }
.auto-row.is-disabled .toggle-label { cursor:not-allowed; }
.auto-cat { flex:0 0 200px; display:flex; flex-direction:column; gap:3px; }
.auto-cat-label { font-size:0.7rem; font-weight:600; color:var(--gray-500); text-transform:uppercase; letter-spacing:0.03em; }
.auto-config { display:flex; gap:18px; flex-wrap:wrap; padding:14px 0; }
.auto-config .form-group { margin:0; }
@media (max-width:640px){ .auto-row { flex-wrap:wrap; } .auto-cat { flex-basis:100%; } }
</style>
<form method="POST" action="/admin/tickets/alerts">
<input type="hidden" name="_csrf" value="<?= $this->csrf() ?>">
<div class="auto-card">
<div class="auto-card-head"><i class="fas fa-bolt"></i> <?= $this->te('Alarm → Ticket') ?></div>
<div class="auto-card-body">
<p style="color:var(--gray-700);font-size:0.9rem;padding:12px 0 0;"><?= $this->te('Aus diesen Ereignissen wird automatisch ein Ticket erstellt. Eine Monitoring-Störung wird sofort beim Eingang zum Ticket, die übrigen Quellen laufen im Hintergrund über den Scheduler; doppelte Tickets werden verhindert.') ?></p>
<?php
$sources = [
['key'=>'monitoring','module'=>'monitoring','icon'=>'#0ea5e9','fa'=>'fa-heart-pulse','name'=>'Monitoring-Störung','desc'=>'Eine eingehende Störung ab dem gewählten Schweregrad erzeugt sofort ein Ticket.'],
['key'=>'xdr','module'=>'xdr','icon'=>'#ef4444','fa'=>'fa-shield-virus','name'=>'XDR/EDR-Alarm','desc'=>'Neuer Alarm (kritisch/hoch) aus der XDR-Anbindung erzeugt ein Ticket.'],
['key'=>'cve','module'=>'cve','icon'=>'#f59e0b','fa'=>'fa-bug','name'=>'Kritische CVE (Watchlist)','desc'=>'Neue kritische CVE, die auf ein Watchlist-Stichwort passt, erzeugt ein Ticket.'],
['key'=>'ssl','module'=>'ssl','icon'=>'#8b5cf6','fa'=>'fa-lock','name'=>'SSL-Zertifikat läuft ab','desc'=>'Zertifikat innerhalb der Vorwarnzeit erzeugt ein Ticket.'],
];
foreach ($sources as $src):
$moduleOn = (bool)($modules[$src['module']] ?? false);
?>
<div class="auto-row<?= $moduleOn ? '' : ' is-disabled' ?>">
<div class="auto-icon" style="background:<?= $src['icon'] ?>;"><i class="fas <?= $src['fa'] ?>"></i></div>
<div class="auto-meta">
<div class="auto-name">
<?= $this->e($src['name']) ?>
<?php if (!$moduleOn): ?><span class="auto-off-hint"><?= $this->te('Modul „{modul}" inaktiv', ['modul' => $src['module']]) ?></span><?php endif; ?>
</div>
<div class="auto-desc"><?= $this->e($src['desc']) ?></div>
</div>
<div class="auto-cat">
<label class="auto-cat-label" for="cat-<?= $src['key'] ?>"><?= $this->te('Zielkategorie') ?></label>
<select id="cat-<?= $src['key'] ?>" name="<?= $src['key'] ?>_category" class="form-control form-control-sm" <?= $moduleOn ? '' : 'disabled' ?>>
<option value=""><?= $this->te('– keine –') ?></option>
<?php foreach (($categories ?? []) as $c): ?>
<option value="<?= (int)$c['id'] ?>" <?= (int)($settings['category'][$src['key']] ?? 0) === (int)$c['id'] ? 'selected' : '' ?>><?= $this->e($c['name']) ?></option>
<?php endforeach; ?>
</select>
</div>
<label class="toggle-label" title="<?= $moduleOn ? '' : 'Quellmodul ist deaktiviert' ?>">
<input type="checkbox" name="<?= $src['key'] ?>" value="1" <?= !empty($settings[$src['key']]) ? 'checked' : '' ?> <?= $moduleOn ? '' : 'disabled' ?>>
<span class="toggle-switch"></span>
</label>
</div>
<?php endforeach; ?>
<div class="auto-config">
<?php if (!empty($modules['monitoring'])): ?>
<div class="form-group">
<label class="form-label" for="monitoring_severity"><?= $this->te('Monitoring: ab Schweregrad') ?></label>
<select id="monitoring_severity" name="monitoring_severity" class="form-control form-control-sm" style="max-width:220px;">
<?php foreach (($severities ?? []) as $wert => $beschriftung): ?>
<option value="<?= $this->e($wert) ?>" <?= ($settings['monitoring_severity'] ?? '') === $wert ? 'selected' : '' ?>><?= $this->te($beschriftung) ?></option>
<?php endforeach; ?>
</select>
<small style="color:var(--gray-500)"><?= $this->te('Störungen darunter erzeugen kein Ticket – aus ihnen lässt sich in der Übersicht von Hand eines machen.') ?></small>
</div>
<div class="form-group">
<label class="form-label" for="monitoring_window"><?= $this->te('Monitoring: Wiederholung zusammenfassen (Stunden)') ?></label>
<input type="number" id="monitoring_window" name="monitoring_window" min="0" max="720"
value="<?= (int)($settings['monitoring_window'] ?? 24) ?>" class="form-control form-control-sm" style="max-width:120px;">
<small style="color:var(--gray-500)"><?= $this->te('Tritt dieselbe Störung (gleicher Host und Trigger) innerhalb dieser Zeit erneut auf und ist ihr Ticket noch offen, wird sie dort vermerkt statt ein zweites Ticket zu erzeugen. Ein geschlossenes Ticket wird nie wieder geöffnet – danach beginnt ein neuer Vorfall. 0 schaltet die Zusammenfassung ab.') ?></small>
</div>
<?php endif; ?>
<div class="form-group">
<label class="form-label" for="ssl_days"><?= $this->te('SSL-Vorwarnzeit (Tage)') ?></label>
<input type="number" id="ssl_days" name="ssl_days" min="1" max="365" value="<?= (int)($settings['ssl_days'] ?? 14) ?>" class="form-control form-control-sm" style="max-width:120px;">
</div>
</div>
</div>
</div>
<button type="submit" class="btn btn-primary"><?= $this->te('Speichern') ?></button>
</form>