Großes Cleanup: Bugs fixen, Features fertigstellen, toten Code entfernen

Bugs behoben:
- handleEdit() async keyword hinzugefügt (E-Mail-Checkboxen funktionieren jetzt)
- parseUTC() Funktion definiert (Fortschritts-Timer nutzt Server-Startzeit)
- Status cancelling wird im Frontend korrekt angezeigt

Features fertiggestellt:
- Sidebar: Lagen nach Typ getrennt (adhoc/research) mit Zählern
- Quellen-Bearbeiten: Edit-Button pro Quelle, Formular vorausfüllen
- Lizenz-Info: Org-Name und Lizenzstatus im Header angezeigt

Toter Code entfernt:
- 5 verwaiste Dateien gelöscht (alte rss_parser, style.css, components.js, layout.js, setup_users)
- 6 ungenutzte Pydantic Models entfernt
- Ungenutzte Funktionen/Imports in auth.py, routers, agents, config
- Tote API-Methoden, Legacy-UI-Methoden, verwaiste WS-Handler
- Abgeschlossene DB-Migrationen aufgeräumt

Sonstiges:
- requirements.txt: passlib[bcrypt] durch bcrypt ersetzt
- Umlaute korrigiert (index.html)
- CSS: incident-type-label → incident-type-badge, .login-success hinzugefügt
- Schließen statt Schliessen im Feedback-Modal
Dieser Commit ist enthalten in:
claude-dev
2026-03-04 18:45:38 +01:00
Ursprung 2a155c084d
Commit 71296edb97
23 geänderte Dateien mit 269 neuen und 4768 gelöschten Zeilen

Datei anzeigen

@@ -341,6 +341,17 @@ a:hover {
color: var(--error);
}
.login-success {
display: none;
background: var(--tint-success);
border: 1px solid rgba(16, 185, 129, 0.3);
border-radius: var(--radius);
padding: var(--sp-lg) var(--sp-xl);
margin-bottom: var(--sp-xl);
font-size: 13px;
color: var(--success);
}
/* === Buttons === */
.btn {
display: inline-flex;
@@ -466,6 +477,88 @@ a:hover {
color: var(--text-secondary);
font-weight: 500;
}
/* --- Org & License Info in Header --- */
.header-user-info {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 2px;
line-height: 1.3;
}
.header-user-top {
display: flex;
align-items: center;
gap: var(--sp-md);
}
.header-org-name {
font-size: 11px;
color: var(--text-tertiary);
font-weight: 400;
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.header-license-badge {
display: inline-block;
font-size: 10px;
font-weight: 600;
padding: 1px 7px;
border-radius: 9999px;
text-transform: uppercase;
letter-spacing: 0.03em;
line-height: 1.6;
white-space: nowrap;
}
.header-license-badge.license-trial {
background: var(--warning-bg, #fef3c7);
color: var(--warning-text, #92400e);
border: 1px solid var(--warning-border, #fcd34d);
}
.header-license-badge.license-annual {
background: var(--success-bg, #d1fae5);
color: var(--success-text, #065f46);
border: 1px solid var(--success-border, #6ee7b7);
}
.header-license-badge.license-permanent {
background: var(--info-bg, #dbeafe);
color: var(--info-text, #1e40af);
border: 1px solid var(--info-border, #93c5fd);
}
.header-license-badge.license-expired {
background: var(--danger-bg, #fee2e2);
color: var(--danger-text, #991b1b);
border: 1px solid var(--danger-border, #fca5a5);
}
.header-license-badge.license-unknown {
background: var(--bg-tertiary, #f3f4f6);
color: var(--text-tertiary, #6b7280);
border: 1px solid var(--border-color, #d1d5db);
}
.header-license-warning {
display: none;
font-size: 11px;
color: var(--danger-text, #991b1b);
background: var(--danger-bg, #fee2e2);
border: 1px solid var(--danger-border, #fca5a5);
border-radius: var(--radius);
padding: 3px 10px;
white-space: nowrap;
}
.header-license-warning.visible {
display: inline-block;
}
/* === Sidebar === */
.sidebar {
@@ -3165,6 +3258,23 @@ a:hover {
}
/* Delete Button */
.source-edit-btn {
background: none;
border: none;
color: var(--text-disabled);
cursor: pointer;
font-size: 13px;
padding: 2px 6px;
border-radius: var(--radius);
transition: color 0.2s, background 0.2s;
line-height: 1;
}
.source-edit-btn:hover {
color: var(--accent);
background: var(--tint-accent);
}
.source-delete-btn {
background: none;
border: none;