tenantpilot/specs/004-policy-explorer-v2/spec.md

11 KiB

Feature Specification: Policy Explorer V2

Feature Branch: 004-policy-explorer-v2
Created: 2025-12-08
Status: Draft
Input: "Policy Explorer V2 - Advanced data table with pagination, sorting, filtering, column management, bulk export, and enhanced detail view for Intune policy settings analysis"

Overview

Erweiterung des bestehenden Policy Explorers (/search) von einer einfachen Such-/Tabellenansicht zu einem vollwertigen Admin-Interface für die Analyse großer Policy-Datasets mit erweiterten Funktionen für Navigation, Filterung, Sortierung und Export.

User Scenarios & Testing (mandatory)

User Story 1 - Advanced Data Table Navigation (Priority: P1)

Als Intune-Admin möchte ich durch große Policy-Datasets navigieren können mit Pagination, Sortierung und anpassbaren Spalten, um schnell relevante Settings zu finden.

Why this priority: Grundlegende Tabellenfunktionalität ist essentiell für die Arbeit mit >100 Settings. Ohne Pagination und Sortierung wird die Tabelle unbrauchbar.

Independent Test: Dataset mit 500+ Settings laden, Pagination durchklicken, nach verschiedenen Spalten sortieren, Spalten ein-/ausblenden.

Acceptance Scenarios:

  1. Given der Admin hat 200+ Policy Settings im System, When er den Policy Explorer öffnet, Then sieht er maximal 50 Settings pro Seite mit Pagination Controls (Previous, Next, Page Numbers).
  2. Given der Admin sieht die Tabelle, When er auf einen Spalten-Header klickt, Then wird die Tabelle nach dieser Spalte sortiert (Toggle: ASC/DESC).
  3. Given der Admin sieht die Tabelle, When er das Column Visibility Menu öffnet und Spalten deselektiert, Then werden diese Spalten ausgeblendet und die Einstellung bleibt beim Reload erhalten (localStorage).
  4. Given der Admin sieht die Tabelle, When er eine Spaltenbreite mit der Maus anpasst, Then wird die neue Breite gespeichert (localStorage).
  5. Given der Admin scrollt nach unten, When er weiter scrollt, Then bleibt der Table Header sichtbar (sticky).

User Story 2 - Enhanced Filtering (Priority: P1)

Als Intune-Admin möchte ich nach PolicyType filtern können, um nur relevante Policy-Kategorien zu sehen.

Why this priority: Filter sind essentiell für die Arbeit mit verschiedenen Policy-Typen (Compliance, Security, Configuration).

Independent Test: PolicyType Filter auswählen, Ergebnisse validieren, Filter kombinieren mit Suche.

Acceptance Scenarios:

  1. Given der Admin öffnet den Policy Explorer, When er den PolicyType Filter öffnet, Then sieht er alle verfügbaren Policy Types als Checkboxen (deviceConfiguration, compliancePolicy, etc.).
  2. Given der Admin hat einen PolicyType ausgewählt, When die Tabelle lädt, Then werden nur Settings dieses Typs angezeigt.
  3. Given der Admin hat Filter + Suche kombiniert, When er die Seite neu lädt, Then bleiben Filter und Suche aktiv (URL state).

User Story 3 - Bulk Export (Priority: P1)

Als Intune-Admin möchte ich Policy Settings als CSV exportieren können, um sie in Excel/Sheets zu analysieren oder zu dokumentieren.

Why this priority: Export ist ein häufig gefordertes Feature für Compliance-Reports und Dokumentation.

Independent Test: Rows selektieren, CSV Export triggern, Datei öffnen und Inhalt validieren.

Acceptance Scenarios:

  1. Given der Admin hat Rows in der Tabelle selektiert, When er "Export Selected" klickt, Then wird ein CSV mit den selektierten Rows heruntergeladen.
  2. Given der Admin hat Filter angewendet, When er "Export All Filtered" klickt, Then wird ein CSV mit allen gefilterten Results heruntergeladen (serverseitig generiert).
  3. Given das CSV wurde generiert, When der Admin die Datei öffnet, Then enthält sie alle relevanten Spalten (Policy Name, Type, Setting Name, Value, Last Synced) mit korrektem CSV-Escaping.

User Story 4 - Enhanced Detail View (Priority: P2)

Als Intune-Admin möchte ich im Detail-Sheet erweiterte Funktionen haben (Copy-to-Clipboard, Raw JSON View), um Settings schnell zu teilen oder zu debuggen.

Why this priority: Quality-of-Life Verbesserung für Power-User. Nicht MVP-blocking aber sehr nützlich.

Independent Test: Detail-Sheet öffnen, Copy-Buttons testen, Raw JSON Tab öffnen.

Acceptance Scenarios:

  1. Given der Admin öffnet das Detail-Sheet für ein Setting, When er auf "Copy Policy ID" klickt, Then wird die graphPolicyId in die Zwischenablage kopiert.
  2. Given der Admin sieht das Detail-Sheet, When er auf "Raw JSON" Tab klickt, Then sieht er die kompletten Rohdaten formatiert als JSON.
  3. Given das Setting hat eine graphPolicyId, When der Admin "Open in Intune" klickt, Then öffnet sich ein neues Tab mit dem Intune Portal Link (oder wird Policy ID kopiert als Fallback).

Edge Cases

  • Was passiert bei sehr breiten Tabellen (viele Spalten)? → Horizontales Scrolling + Sticky erste Spalte.
  • Wie verhält sich Export bei >10.000 Rows? → Server-seitige Limitierung auf max 5000 Rows pro Export mit Warning.
  • Was passiert wenn keine Rows selektiert sind beim Export? → Button disabled mit Tooltip "Select rows first".
  • Wie wird Sorting mit Pagination kombiniert? → Server-seitig: Sort state wird an API übergeben.
  • Was passiert bei Column Resize auf mobilen Geräten? → Touch-optimierte Resize Handles oder Feature deaktiviert auf <768px.

Requirements (mandatory)

Functional Requirements

  • FR-001: System MUSS serverseitige Pagination mit konfigurierbarer Page Size (10/25/50/100) unterstützen.
  • FR-002: System MUSS Sortierung nach allen Spalten unterstützen (ASC/DESC Toggle).
  • FR-003: System MUSS Column Visibility Management bereitstellen (Spalten ein-/ausblenden via Dropdown).
  • FR-004: System MUSS Column Resizing unterstützen (Drag & Drop an Spaltenrändern).
  • FR-005: System MUSS Sticky Table Header implementieren (bleibt beim Scrollen sichtbar).
  • FR-006: System MUSS PolicyType Filter als Multi-Select Checkbox implementieren.
  • FR-007: System MUSS Filter + Suche kombinierbar machen (beide aktiv gleichzeitig).
  • FR-008: System MUSS URL State für Filter/Sort/Search speichern (shareable links).
  • FR-009: System MUSS localStorage für Column Settings verwenden (Breite, Visibility, Reihenfolge).
  • FR-010: System MUSS Row Selection mit Checkboxes implementieren (einzeln + Select All).
  • FR-011: System MUSS CSV Export für Selected Rows bereitstellen (client-seitig generiert).
  • FR-012: System MUSS CSV Export für All Filtered Results bereitstellen (server-seitig, max 5000 Rows).
  • FR-013: System MUSS Copy-to-Clipboard Buttons für Policy ID, Setting Name, Setting Value implementieren.
  • FR-014: System MUSS Raw JSON View im Detail-Sheet anzeigen.
  • FR-015: System MUSS "Open in Intune" Button implementieren (wenn graphPolicyId vorhanden).
  • FR-016: System MUSS Truncation + Tooltip für lange Werte/IDs implementieren.
  • FR-017: System MUSS Compact/Comfortable Density Mode Toggle bereitstellen.
  • FR-018: System MUSS Meta-Info Zeile über Tabelle anzeigen (X settings · Y policies · Last sync).

Key Entities

Erweitert PolicySetting Datenmodell (keine Schema-Änderungen nötig):

  • DataTableState: Client-side State für Tabelle

    • pagination: { page: number, pageSize: number }
    • sorting: { column: string, direction: 'asc'|'desc' }[]
    • columnVisibility: { [columnId: string]: boolean }
    • columnSizing: { [columnId: string]: number }
    • rowSelection: { [rowId: string]: boolean }
  • FilterState: Filter-Zustand

    • policyTypes: string[] (selected policy types)
    • searchQuery: string (existing search)
    • dateRange: { from?: Date, to?: Date } (optional, Phase 2)

Success Criteria (mandatory)

Measurable Outcomes

  • SC-001: Pagination lädt neue Seiten in <500ms (serverseitige Query + Rendering).
  • SC-002: Sortierung funktioniert auf allen Spalten ohne Performance-Degradation bei 1000+ Rows.
  • SC-003: Column Settings (Visibility, Sizing) bleiben nach Browser-Reload erhalten.
  • SC-004: CSV Export für 1000 Selected Rows dauert <2s (client-seitig).
  • SC-005: CSV Export für 5000 Filtered Results dauert <5s (server-seitig).
  • SC-006: Filter + Suche kombiniert reduziert Results korrekt (AND-Logik).
  • SC-007: URL State ist shareable (Copy/Paste URL zeigt identische Filterung).
  • SC-008: Detail-Sheet Copy-Buttons funktionieren in allen modernen Browsern (Chrome, Firefox, Safari, Edge).

Assumptions

  • TanStack Table (React Table v8) wird als Data Table Library verwendet.
  • Shadcn UI Table Komponenten werden erweitert oder mit TanStack Table integriert.
  • Export-Logik nutzt serverseitigen Endpoint für große Datasets (>1000 Rows).
  • Column Settings werden im localStorage gespeichert (keine User-Profile Persistierung).
  • "Open in Intune" Links werden per Policy Type konstruiert (bekannte URL-Pattern).

Nicht-Ziele (Out of Scope)

  • Kein Policy Editing (read-only view bleibt erhalten).
  • Kein vollständiges RBAC-System (bleibt bei Tenant-Isolation).
  • Kein Conflict Detection (Phase 2).
  • Kein Policy Comparison/Diff (Phase 2).
  • Kein Saved Views (Phase 2).
  • Keine Gruppierung (Group by Policy/Setting) (Phase 2).

Technical Notes

TanStack Table Integration

  • @tanstack/react-table bereits im Projekt vorhanden oder muss installiert werden
  • Server-side Pagination, Sorting, Filtering via Server Actions
  • Column Definitions mit Type-Safety via TypeScript
  • Shadcn Table Primitives als UI Layer

CSV Export Strategy

Client-Side (Selected Rows):

  • Library: papaparse oder native String-Builder
  • Maximal 1000 Rows empfohlen
  • Sofortiger Download ohne Server-Request

Server-Side (Filtered Results):

  • Neuer Server Action: exportPolicySettingsCSV(filterState)
  • Stream-basierter Export für große Datasets
  • Content-Disposition Header für File Download
  • Limit: 5000 Rows (UI Warning bei mehr)

URL State Management

  • nuqs Library für type-safe URL State
  • Query Params:
    • page: number
    • pageSize: 10|25|50|100
    • sortBy: columnId
    • sortDir: asc|desc
    • policyTypes: comma-separated
    • q: search query

Column Configuration

Default Columns:

  • Setting Name (visible, pinned left)
  • Setting Value (visible, truncated)
  • Policy Name (visible)
  • Policy Type (visible, badge)
  • Last Synced (visible, relative time)
  • Policy ID (hidden by default)

Dependencies

  • TanStack Table v8: @tanstack/react-table
  • CSV Export: papaparse (optional, kann auch nativ gebaut werden)
  • URL State: nuqs (optional, kann auch mit useSearchParams gelöst werden)
  • Clipboard API: Native Browser API
  • Icons: Lucide React (bereits vorhanden)