feat(sources): UI fuer Quellen-Klassifikation (Filter, Badges, Edit-Form)
- Quellen-Modal: 4 neue Filter (Politik, Medientyp, Reliability, Alignment). - Edit-Form: Selects fuer political_orientation/media_type/reliability, Multi-Select-Chips fuer alignments, Toggle state_affiliated, Country-Code-Input. - renderSourceGroup: Politik-Badge mit DACH-Farbskala (rot=L, blau=R), Reliability-Punkt (gruen→rot), Alignment-Tags, state-affiliated-Indikator. Tooltip um alle 4 Achsen erweitert. - CSS-Block fuer alle neuen Badge-/Chip-Styles. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -481,6 +481,70 @@
|
||||
<option value="boulevard">Boulevard</option>
|
||||
<option value="sonstige">Sonstige</option>
|
||||
</select>
|
||||
<label for="sources-filter-political" class="sr-only">Politische Ausrichtung filtern</label>
|
||||
<select id="sources-filter-political" class="timeline-filter-select" onchange="App.filterSources()">
|
||||
<option value="">Alle Ausrichtungen</option>
|
||||
<option value="links_extrem">Links (extrem)</option>
|
||||
<option value="links">Links</option>
|
||||
<option value="mitte_links">Mitte-Links</option>
|
||||
<option value="liberal">Liberal</option>
|
||||
<option value="mitte">Mitte</option>
|
||||
<option value="konservativ">Konservativ</option>
|
||||
<option value="mitte_rechts">Mitte-Rechts</option>
|
||||
<option value="rechts">Rechts</option>
|
||||
<option value="rechts_extrem">Rechts (extrem)</option>
|
||||
<option value="na">Nicht eingeordnet</option>
|
||||
</select>
|
||||
<label for="sources-filter-mediatype" class="sr-only">Medientyp filtern</label>
|
||||
<select id="sources-filter-mediatype" class="timeline-filter-select" onchange="App.filterSources()">
|
||||
<option value="">Alle Medientypen</option>
|
||||
<option value="tageszeitung">Tageszeitung</option>
|
||||
<option value="wochenzeitung">Wochenzeitung</option>
|
||||
<option value="magazin">Magazin</option>
|
||||
<option value="tv_sender">TV-Sender</option>
|
||||
<option value="radio">Radio</option>
|
||||
<option value="oeffentlich_rechtlich">Öffentlich-Rechtlich</option>
|
||||
<option value="nachrichtenagentur">Nachrichtenagentur</option>
|
||||
<option value="online_only">Online-only</option>
|
||||
<option value="blog">Blog</option>
|
||||
<option value="telegram_kanal">Telegram-Kanal</option>
|
||||
<option value="telegram_bot">Telegram-Bot</option>
|
||||
<option value="podcast">Podcast</option>
|
||||
<option value="social_media">Social Media</option>
|
||||
<option value="imageboard">Imageboard</option>
|
||||
<option value="think_tank">Think Tank</option>
|
||||
<option value="ngo">NGO</option>
|
||||
<option value="behoerde">Behörde</option>
|
||||
<option value="staatsmedium">Staatsmedium</option>
|
||||
<option value="fachmedium">Fachmedium</option>
|
||||
<option value="sonstige">Sonstige</option>
|
||||
</select>
|
||||
<label for="sources-filter-reliability" class="sr-only">Glaubwürdigkeit filtern</label>
|
||||
<select id="sources-filter-reliability" class="timeline-filter-select" onchange="App.filterSources()">
|
||||
<option value="">Alle Glaubwürdigkeiten</option>
|
||||
<option value="sehr_hoch">Sehr hoch</option>
|
||||
<option value="hoch">Hoch</option>
|
||||
<option value="gemischt">Gemischt</option>
|
||||
<option value="niedrig">Niedrig</option>
|
||||
<option value="sehr_niedrig">Sehr niedrig</option>
|
||||
<option value="na">Nicht eingeordnet</option>
|
||||
</select>
|
||||
<label for="sources-filter-alignment" class="sr-only">Geopolitische Nähe filtern</label>
|
||||
<select id="sources-filter-alignment" class="timeline-filter-select" onchange="App.filterSources()">
|
||||
<option value="">Alle Nähen</option>
|
||||
<option value="prorussisch">Prorussisch</option>
|
||||
<option value="proiranisch">Proiranisch</option>
|
||||
<option value="prowestlich">Prowestlich</option>
|
||||
<option value="proukrainisch">Proukrainisch</option>
|
||||
<option value="prochinesisch">Prochinesisch</option>
|
||||
<option value="projapanisch">Projapanisch</option>
|
||||
<option value="proisraelisch">Proisraelisch</option>
|
||||
<option value="propalaestinensisch">Propalästinensisch</option>
|
||||
<option value="protuerkisch">Protürkisch</option>
|
||||
<option value="panarabisch">Panarabisch</option>
|
||||
<option value="neutral">Neutral</option>
|
||||
<option value="sonstige">Sonstige</option>
|
||||
</select>
|
||||
<label for="sources-search" class="sr-only">Quellen durchsuchen</label>
|
||||
<input type="text" id="sources-search" class="timeline-filter-input sources-search-input" placeholder="Suche..." oninput="App.filterSources()">
|
||||
</div>
|
||||
@@ -548,6 +612,89 @@
|
||||
<input type="text" id="src-notes" placeholder="Optional">
|
||||
</div>
|
||||
</div>
|
||||
<div class="sources-classification-section">
|
||||
<div class="sources-classification-header">Einordnung</div>
|
||||
<div class="sources-add-form-grid">
|
||||
<div class="form-group">
|
||||
<label for="src-political">Politische Ausrichtung</label>
|
||||
<select id="src-political">
|
||||
<option value="na">Nicht eingeordnet</option>
|
||||
<option value="links_extrem">Links (extrem)</option>
|
||||
<option value="links">Links</option>
|
||||
<option value="mitte_links">Mitte-Links</option>
|
||||
<option value="liberal">Liberal</option>
|
||||
<option value="mitte">Mitte</option>
|
||||
<option value="konservativ">Konservativ</option>
|
||||
<option value="mitte_rechts">Mitte-Rechts</option>
|
||||
<option value="rechts">Rechts</option>
|
||||
<option value="rechts_extrem">Rechts (extrem)</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="src-mediatype">Medientyp</label>
|
||||
<select id="src-mediatype">
|
||||
<option value="sonstige">Sonstige</option>
|
||||
<option value="tageszeitung">Tageszeitung</option>
|
||||
<option value="wochenzeitung">Wochenzeitung</option>
|
||||
<option value="magazin">Magazin</option>
|
||||
<option value="tv_sender">TV-Sender</option>
|
||||
<option value="radio">Radio</option>
|
||||
<option value="oeffentlich_rechtlich">Öffentlich-Rechtlich</option>
|
||||
<option value="nachrichtenagentur">Nachrichtenagentur</option>
|
||||
<option value="online_only">Online-only</option>
|
||||
<option value="blog">Blog</option>
|
||||
<option value="telegram_kanal">Telegram-Kanal</option>
|
||||
<option value="telegram_bot">Telegram-Bot</option>
|
||||
<option value="podcast">Podcast</option>
|
||||
<option value="social_media">Social Media</option>
|
||||
<option value="imageboard">Imageboard</option>
|
||||
<option value="think_tank">Think Tank</option>
|
||||
<option value="ngo">NGO</option>
|
||||
<option value="behoerde">Behörde</option>
|
||||
<option value="staatsmedium">Staatsmedium</option>
|
||||
<option value="fachmedium">Fachmedium</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="src-reliability">Glaubwürdigkeit</label>
|
||||
<select id="src-reliability">
|
||||
<option value="na">Nicht eingeordnet</option>
|
||||
<option value="sehr_hoch">Sehr hoch</option>
|
||||
<option value="hoch">Hoch</option>
|
||||
<option value="gemischt">Gemischt</option>
|
||||
<option value="niedrig">Niedrig</option>
|
||||
<option value="sehr_niedrig">Sehr niedrig</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="src-country">Land (ISO 3166)</label>
|
||||
<input type="text" id="src-country" maxlength="2" placeholder="z.B. DE, RU, US" style="text-transform:uppercase;">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="checkbox-label" style="display:flex;align-items:center;gap:8px;">
|
||||
<input type="checkbox" id="src-state-affiliated">
|
||||
<span>Staatsnah/-kontrolliert</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" style="margin-top:8px;">
|
||||
<label>Geopolitische Nähe (Mehrfachauswahl)</label>
|
||||
<div id="src-alignments-chips" class="alignment-chips" onclick="App.handleAlignmentChipClick(event)">
|
||||
<button type="button" class="alignment-chip" data-alignment="prorussisch">prorussisch</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="proiranisch">proiranisch</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="prowestlich">prowestlich</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="proukrainisch">proukrainisch</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="prochinesisch">prochinesisch</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="projapanisch">projapanisch</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="proisraelisch">proisraelisch</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="propalaestinensisch">propalästinensisch</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="protuerkisch">protürkisch</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="panarabisch">panarabisch</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="neutral">neutral</button>
|
||||
<button type="button" class="alignment-chip" data-alignment="sonstige">sonstige</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sources-discovery-actions">
|
||||
<button class="btn btn-primary btn-small" onclick="App.saveSource()">Speichern</button>
|
||||
<button class="btn btn-secondary btn-small" onclick="App.toggleSourceForm(false)">Abbrechen</button>
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren