Workspace
Arbeitsbereich des sellx Hub: Plugins als Tabs, Parameter-Sidebar, Ergebnis-Tabelle mit CSV-Export. Hier laufen die SQL-Queries gegen die JTL-Wawi-DB.
Funktions-Handbuch · Endkunden
Der Workspace (/workspace) ist der Arbeitsbereich, in dem Plugins ausgeführt und ihre Ergebnisse angezeigt werden.
Datei: sellx-hub/src/pages/PluginWorkspacePage.tsx
Aufbau


┌────────────────────────────────────────────────────────────┐
│ Plugin: [Artikel-KPI] [Cross-Seller] [Wer-gekauft] × │
├──────────────────────┬─────────────────────────────────────┤
│ Parameter-Sidebar │ Ergebnis-Tabelle │
│ │ │
│ Query-Auswahl: │ ┌─────────┬────────┬──────────────┐ │
│ ▼ Top 10 Artikel │ │ cName │ fPreis │ fVerkauf │ │
│ │ ├─────────┼────────┼──────────────┤ │
│ Parameter: │ │ Bohrma. │ 89.90 │ 149.00 │ │
│ (keine) │ │ Akkusch.│ 119.00 │ 219.00 │ │
│ │ │ ... │ ... │ ... │ │
│ [Ausführen] │ └─────────┴────────┴──────────────┘ │
│ │ 5 Zeilen in 27 ms [CSV-Export] │
└──────────────────────┴─────────────────────────────────────┘Plugin-Tabs
Oben in einer Tab-Leiste werden alle aktiven Plugins angezeigt. Klick auf einen Tab:
- 1. Lädt die Plugin-Queries (
get_plugins→ Liste der Queries mit Parametern) - 2. Setzt die Parameter-Sidebar auf die Query-spezifischen Eingabefelder
- 3. Lädt den letzten gespeicherten Tab-State aus
data.db.open_tabs(falls vorhanden)
Hinweis: Beim ersten Öffnen eines Plugins wird die erste Query automatisch ausgewählt, aber nicht ausgeführt — der User muss explizit auf Ausführen klicken.
Query-Ausführung



invoke("execute_plugin", {
pluginId,
queryId,
parameters: { ... },
timeoutSeconds: 30, // optional, Default
rowLimit: 10000, // optional, Default
})Ablauf:
- 1. Sidecar validiert Plugin-Lizenz (
LicenseService.Validate) - 2. Sidecar lädt verschlüsselte SQL-Query aus Plugin-Store
- 3. Sidecar entschlüsselt mit Master-Key + HKDF
- 4.
SqlSecurityValidator.Validate(query)— lehnt Single-Statement-Violations ab - 5.
SqlExecutorService.ExecuteAsync(query, parameters, timeout, rowLimit) - 6. Ergebnis zurück an Frontend → DataTable
Mögliche Fehler:
| Fehler | Bedeutung |
|---|---|
| LICENSE_INACTIVE | Lizenz abgelaufen oder Grace-Period > 30 Tage |
| SQL_SECURITY_VIOLATION | Query verletzt Security-Validator-Regeln |
| TIMEOUT | Query > timeout-Sekunden |
| ROW_LIMIT_EXCEEDED | Query liefert > rowLimit Zeilen |
| DB_CONNECTION_FAILED | SQL Server nicht erreichbar |
| QUERY_NOT_FOUND | Query-ID existiert nicht im Plugin-Manifest |
Ergebnis-Tabelle
Datei: sellx-hub/src/components/DataTable.tsx
Features:
| Feature | Beschreibung |
|---|---|
| Sortierung | Klick auf Spalten-Header |
| Filter | Pro Spalte via Filter-Icon |
| Pagination | 25 / 50 / 100 Zeilen pro Seite |
| CSV-Export | Button unten rechts |
CSV-Export
function exportCsv(rows: Record<string, unknown>[], filename = "export.csv") {
// Spalten aus erster Zeile, Werte mit Anführungszeichen umschlossen
// Trenner: Komma, Zeilenende: \n, Encoding: UTF-8
}Wichtig: Der CSV-Export ist deterministisch — die Reihenfolge der Zeilen entspricht der DataTable-Sortierung zum Export-Zeitpunkt.
Parameter-Sidebar
Für jede Query zeigt die Sidebar die im Manifest definierten Parameter als Eingabefelder:
| Parameter-Typ | UI |
|---|---|
| string | Text-Input |
| number | Number-Input |
| date | Date-Picker (Browser-native) |
| article | Artikel-Suche mit Auto-Complete |
| customer | Kunden-Suche mit Auto-Complete |
| bool | Checkbox |
Vor dem Ausführen werden Pflichtfelder validiert (rote Markierung + Submit-Blockade).
Tabs-State-Persistenz
Welche Queries ausgewählt sind und welche Parameter gesetzt sind, werden in data.db.open_tabs persistiert (Plugin-ID + Tab-Index + JSON-Snapshot). Beim nächsten Öffnen wird der State wiederhergestellt.
invoke("save_tab", { payload: { pluginId, tabIndex, tabData } })
invoke("remove_tab", { pluginId, tabIndex })
invoke("get_open_tabs") → "[]"Hinweis: Die Parameter werden nicht im Backend validiert. Das Frontend reicht sie roh weiter; das Backend sanitisiert via ADO.NET-Parameterisierung.