[INFRA] Globale Quality-Filter Einstellung für konsistente Datenansichten #31

Closed
opened 2026-03-23 22:21:22 +01:00 by Lars · 0 comments
Owner

Überblick

Aktuell wirkt der Quality-Filter nur lokal in History.jsx. Für konsistente Datenansichten über alle Views (Dashboard, Charts, Statistiken, KI-Analysen) muss der Filter global als User-Präferenz gespeichert werden.

Problem

Inkonsistente Datenansichten:

  • History.jsx ActivitySection: Quality-Filter vorhanden
  • TrainingTypeDistribution Chart: nutzt alle Activities
  • Dashboard Charts: nutzen alle Activities
  • Andere Activity-Listen: nutzen alle Activities
  • KI-Pipeline: hardcoded auf quality (excellent + good + acceptable)

Folge: Charts zeigen unterschiedliche Daten → nicht vergleichbar!

Lösung: User-Präferenz im Profil

1. DB-Schema erweitern

Migration 016:

ALTER TABLE profiles ADD COLUMN quality_filter_level VARCHAR(20) DEFAULT 'all';

COMMENT ON COLUMN profiles.quality_filter_level IS 'Global quality filter: all, quality, very_good, excellent';

Werte:

  • all: Alle Activities (kein Filter)
  • quality: excellent + good + acceptable (Standard für neue User?)
  • very_good: excellent + good
  • excellent: nur excellent

2. Backend: Helper-Funktion

def get_quality_filter_sql(profile: dict) -> str:
    level = profile.get('quality_filter_level', 'all')
    
    if level == 'all':
        return ''
    elif level == 'quality':
        return "AND quality_label IN ('excellent', 'good', 'acceptable')"
    elif level == 'very_good':
        return "AND quality_label IN ('excellent', 'good')"
    elif level == 'excellent':
        return "AND quality_label = 'excellent'"
    return ''

3. Settings UI

<select value={profile.quality_filter_level} onChange={handleQualityChange}>
  <option value="all">📊 Alle Activities</option>
  <option value="quality"> Hochwertig (excellent, good, acceptable)</option>
  <option value="very_good">✓✓ Sehr gut (excellent, good)</option>
  <option value="excellent"> Exzellent (nur excellent)</option>
</select>

Aufwandsschätzung

  • Backend: 2-3h (Migration, Helper, alle Queries anpassen)
  • Frontend: 2-3h (Settings UI, Profil-Update)
  • Testing: 1h
  • Gesamt: ~5-7h

Akzeptanzkriterien

  • Migration 016: profiles.quality_filter_level Spalte
  • Backend: get_quality_filter_sql() Helper-Funktion
  • Backend: Alle Activity-Queries nutzen globalen Filter
  • Settings UI: Dropdown mit 4 Qualitätsstufen
  • Dashboard Charts nutzen globalen Filter
  • History.jsx nutzt Profil-Einstellung
  • TrainingTypeDistribution nutzt globalen Filter
  • KI-Pipeline nutzt globalen Filter
  • Alle Views zeigen konsistente Daten

Abhängigkeiten

  • Baut auf: Issue #24 (Quality-Filter in History.jsx)
  • Unabhängig von: Issue #28 (AI-Prompts) - anderer Layer!

Layer-Trennung

Issue #28 (AI-Prompts): Analysis Layer - KI-Analysen flexibilisieren
Issue #31 (Quality-Filter): Data Access Layer - Datenqualität global steuern

→ Zwei unabhängige Concerns, können parallel laufen!

## Überblick Aktuell wirkt der Quality-Filter nur lokal in History.jsx. Für konsistente Datenansichten über alle Views (Dashboard, Charts, Statistiken, KI-Analysen) muss der Filter global als User-Präferenz gespeichert werden. ## Problem **Inkonsistente Datenansichten:** - ✅ History.jsx ActivitySection: Quality-Filter vorhanden - ❌ TrainingTypeDistribution Chart: nutzt alle Activities - ❌ Dashboard Charts: nutzen alle Activities - ❌ Andere Activity-Listen: nutzen alle Activities - ❌ KI-Pipeline: hardcoded auf `quality` (excellent + good + acceptable) **Folge:** Charts zeigen unterschiedliche Daten → nicht vergleichbar! ## Lösung: User-Präferenz im Profil ### 1. DB-Schema erweitern **Migration 016:** ```sql ALTER TABLE profiles ADD COLUMN quality_filter_level VARCHAR(20) DEFAULT 'all'; COMMENT ON COLUMN profiles.quality_filter_level IS 'Global quality filter: all, quality, very_good, excellent'; ``` **Werte:** - `all`: Alle Activities (kein Filter) - `quality`: excellent + good + acceptable (Standard für neue User?) - `very_good`: excellent + good - `excellent`: nur excellent ### 2. Backend: Helper-Funktion ```python def get_quality_filter_sql(profile: dict) -> str: level = profile.get('quality_filter_level', 'all') if level == 'all': return '' elif level == 'quality': return "AND quality_label IN ('excellent', 'good', 'acceptable')" elif level == 'very_good': return "AND quality_label IN ('excellent', 'good')" elif level == 'excellent': return "AND quality_label = 'excellent'" return '' ``` ### 3. Settings UI ```jsx <select value={profile.quality_filter_level} onChange={handleQualityChange}> <option value="all">📊 Alle Activities</option> <option value="quality">✓ Hochwertig (excellent, good, acceptable)</option> <option value="very_good">✓✓ Sehr gut (excellent, good)</option> <option value="excellent">⭐ Exzellent (nur excellent)</option> </select> ``` ## Aufwandsschätzung - **Backend:** 2-3h (Migration, Helper, alle Queries anpassen) - **Frontend:** 2-3h (Settings UI, Profil-Update) - **Testing:** 1h - **Gesamt:** ~5-7h ## Akzeptanzkriterien - [ ] Migration 016: `profiles.quality_filter_level` Spalte - [ ] Backend: `get_quality_filter_sql()` Helper-Funktion - [ ] Backend: Alle Activity-Queries nutzen globalen Filter - [ ] Settings UI: Dropdown mit 4 Qualitätsstufen - [ ] Dashboard Charts nutzen globalen Filter - [ ] History.jsx nutzt Profil-Einstellung - [ ] TrainingTypeDistribution nutzt globalen Filter - [ ] KI-Pipeline nutzt globalen Filter - [ ] Alle Views zeigen konsistente Daten ## Abhängigkeiten - **Baut auf:** Issue #24 (Quality-Filter in History.jsx) - **Unabhängig von:** Issue #28 (AI-Prompts) - anderer Layer! ## Layer-Trennung **Issue #28 (AI-Prompts):** Analysis Layer - KI-Analysen flexibilisieren **Issue #31 (Quality-Filter):** Data Access Layer - Datenqualität global steuern → Zwei unabhängige Concerns, können parallel laufen!
Lars added the
feature
high
develop
labels 2026-03-23 22:21:22 +01:00
Lars closed this issue 2026-03-24 06:14:06 +01:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Lars/mitai-jinkendo#31
No description provided.