feat(i18n): Aktions-Buttons dynamisch + komplettes Neue-Lage/Bearbeiten-Modal
- _updateRefreshButton + _updateArchiveButton (app.js) nutzen T() statt Hardcode -- Aktualisieren/Laeuft/Wiederherstellen/Archivieren/Lesemodus. - Modal-Title-Setter (Lage bearbeiten / Neue Lage anlegen) lokalisiert an drei Stellen (init / openEdit / closeModal). - updateVisibilityHint und toggleTypeDefaults: dynamischer Text via T(). - HTML: ~31 data-i18n + data-i18n-attr im modal-new (Art der Lage, Optionen, Type-Hint, Quellen-Toggles, Sichtbarkeit, Aktualisierung, Intervall-Einheiten, Aufbewahrung, E-Mail-Toggles, Abbrechen). - Cache-Buster app.js auf v=20260514a.
Dieser Commit ist enthalten in:
@@ -2178,18 +2178,23 @@ async handleRefresh() {
|
||||
_updateRefreshButton(disabled) {
|
||||
const btn = document.getElementById('refresh-btn');
|
||||
if (!btn) return;
|
||||
const _t = (k, fb) => (typeof T === 'function') ? T(k, fb) : fb;
|
||||
// Hard-Stop: Lese-Modus (Budget aufgebraucht / Lizenz abgelaufen) -> immer disabled
|
||||
if (this.user && this.user.read_only) {
|
||||
btn.disabled = true;
|
||||
const reason = this.user.read_only_reason;
|
||||
btn.textContent = reason === 'budget_exceeded' ? 'Budget aufgebraucht' : 'Nur Lesezugriff';
|
||||
btn.textContent = reason === 'budget_exceeded'
|
||||
? _t('action.budget_exceeded', 'Budget aufgebraucht')
|
||||
: _t('action.read_only', 'Nur Lesezugriff');
|
||||
btn.title = reason === 'budget_exceeded'
|
||||
? 'Token-Budget aufgebraucht. Bitte Verwaltung kontaktieren.'
|
||||
: 'Lizenz erlaubt keinen Schreibzugriff';
|
||||
? _t('action.budget_exceeded_title', 'Token-Budget aufgebraucht. Bitte Verwaltung kontaktieren.')
|
||||
: _t('action.read_only_title', 'Lizenz erlaubt keinen Schreibzugriff');
|
||||
return;
|
||||
}
|
||||
btn.disabled = disabled;
|
||||
btn.textContent = disabled ? 'Läuft...' : 'Aktualisieren';
|
||||
btn.textContent = disabled
|
||||
? _t('action.refreshing', 'Läuft...')
|
||||
: _t('action.refresh', 'Aktualisieren');
|
||||
btn.title = '';
|
||||
},
|
||||
|
||||
@@ -2236,8 +2241,8 @@ async handleRefresh() {
|
||||
toggleRefreshInterval();
|
||||
|
||||
// Modal-Titel und Submit ändern
|
||||
{ const _e = document.getElementById('modal-new-title'); if (_e) _e.textContent = 'Lage bearbeiten'; }
|
||||
{ const _e = document.getElementById('modal-new-submit'); if (_e) _e.textContent = 'Speichern'; }
|
||||
{ const _e = document.getElementById('modal-new-title'); if (_e) _e.textContent = (typeof T === 'function') ? T('modal.new_incident.edit_title', 'Lage bearbeiten') : 'Lage bearbeiten'; }
|
||||
{ const _e = document.getElementById('modal-new-submit'); if (_e) _e.textContent = (typeof T === 'function') ? T('common.save', 'Speichern') : 'Speichern'; }
|
||||
|
||||
// E-Mail-Subscription laden
|
||||
try {
|
||||
@@ -2297,7 +2302,10 @@ async handleRefresh() {
|
||||
_updateArchiveButton(status) {
|
||||
const btn = document.getElementById('archive-incident-btn');
|
||||
if (!btn) return;
|
||||
btn.textContent = status === 'archived' ? 'Wiederherstellen' : 'Archivieren';
|
||||
const _t = (k, fb) => (typeof T === 'function') ? T(k, fb) : fb;
|
||||
btn.textContent = status === 'archived'
|
||||
? _t('action.restore', 'Wiederherstellen')
|
||||
: _t('action.archive', 'Archivieren');
|
||||
},
|
||||
|
||||
// === WebSocket Handlers ===
|
||||
@@ -3466,8 +3474,8 @@ function openModal(id) {
|
||||
if (id === 'modal-new' && !App._editingIncidentId) {
|
||||
// Create-Modus: Formular zurücksetzen
|
||||
document.getElementById('new-incident-form').reset();
|
||||
document.getElementById('modal-new-title').textContent = 'Neue Lage anlegen';
|
||||
document.getElementById('modal-new-submit').textContent = 'Lage anlegen';
|
||||
document.getElementById('modal-new-title').textContent = (typeof T === 'function') ? T('modal.new_incident.title2', 'Neue Lage anlegen') : 'Neue Lage anlegen';
|
||||
document.getElementById('modal-new-submit').textContent = (typeof T === 'function') ? T('modal.new_incident.submit', 'Lage anlegen') : 'Lage anlegen';
|
||||
{ const _b = document.getElementById('btn-enhance-description'); if (_b) _b.disabled = true; }
|
||||
{ const _t = document.getElementById("inc-description"); if (_t) { _t.style.height = ""; _autoResizeTextarea(_t); } }
|
||||
// E-Mail-Checkboxen zuruecksetzen
|
||||
@@ -3500,8 +3508,8 @@ function closeModal(id) {
|
||||
}
|
||||
if (id === 'modal-new') {
|
||||
App._editingIncidentId = null;
|
||||
document.getElementById('modal-new-title').textContent = 'Neue Lage anlegen';
|
||||
document.getElementById('modal-new-submit').textContent = 'Lage anlegen';
|
||||
document.getElementById('modal-new-title').textContent = (typeof T === 'function') ? T('modal.new_incident.title2', 'Neue Lage anlegen') : 'Neue Lage anlegen';
|
||||
document.getElementById('modal-new-submit').textContent = (typeof T === 'function') ? T('modal.new_incident.submit', 'Lage anlegen') : 'Lage anlegen';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3675,9 +3683,10 @@ function updateVisibilityHint() {
|
||||
const isPublic = document.getElementById('inc-visibility').checked;
|
||||
const text = document.getElementById('visibility-text');
|
||||
if (text) {
|
||||
const _t = (k, fb) => (typeof T === 'function') ? T(k, fb) : fb;
|
||||
text.textContent = isPublic
|
||||
? 'Öffentlich — für alle Nutzer sichtbar'
|
||||
: 'Privat — nur für dich sichtbar';
|
||||
? _t('modal.toggle.visibility_public_text', 'Öffentlich — für alle Nutzer sichtbar')
|
||||
: _t('modal.toggle.visibility_private_text', 'Privat — nur für dich sichtbar');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3696,15 +3705,16 @@ function toggleTypeDefaults(preserveMode = false) {
|
||||
const hint = document.getElementById('type-hint');
|
||||
const refreshMode = document.getElementById('inc-refresh-mode');
|
||||
|
||||
const _t = (k, fb) => (typeof T === 'function') ? T(k, fb) : fb;
|
||||
if (type === 'research') {
|
||||
hint.textContent = 'Recherchiert in Tiefe: Nachrichtenarchive, Parlamentsdokumente, Fachmedien, Expertenquellen. Empfohlen: Manuell starten und bei Bedarf vertiefen.';
|
||||
hint.textContent = _t('modal.hint.type_research', 'Recherchiert in Tiefe: Nachrichtenarchive, Parlamentsdokumente, Fachmedien, Expertenquellen. Empfohlen: Manuell starten und bei Bedarf vertiefen.');
|
||||
// Nur bei Typ-Wechsel/Neuanlage Modus zurückziehen, beim Edit bestehender Lagen DB-Wert respektieren
|
||||
if (!preserveMode) {
|
||||
refreshMode.value = 'manual';
|
||||
toggleRefreshInterval();
|
||||
}
|
||||
} else {
|
||||
hint.textContent = 'Durchsucht laufend hunderte Nachrichtenquellen nach neuen Meldungen. Empfohlen: Automatische Aktualisierung.';
|
||||
hint.textContent = _t('modal.hint.type_adhoc', 'Durchsucht laufend hunderte Nachrichtenquellen nach neuen Meldungen. Empfohlen: Automatische Aktualisierung.');
|
||||
}
|
||||
|
||||
// Beschreibungs-Tooltip je nach Typ wechseln
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren