FunktionenMitarbeiter-Handbuch

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

Leerer Workspace mit Hinweis 'Keine aktiven Plugins — bitte Plugins aktivieren' und Link zur Meine-Plugins-Seite
Workspace ohne aktive Plugins
Workspace mit geoeffnetem Artikel-KPI-Tab: links Parameter-Sidebar, rechts leere Ergebnis-Tabelle, oben Tab-Leiste mit allen aktiven Plugins
Workspace mit geoeffnetem Plugin-Tab
text
┌────────────────────────────────────────────────────────────┐
│ 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. 1. Lädt die Plugin-Queries ( get_plugins → Liste der Queries mit Parametern)
  2. 2. Setzt die Parameter-Sidebar auf die Query-spezifischen Eingabefelder
  3. 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

Workspace-Parameter-Sidebar mit Datum-Picker und Artikel-Suche; 'Ausfuehren'-Button ist highlighted
Parameter-Sidebar mit gefuellten Feldern
Ergebnis-Tabelle mit 10 Zeilen Spalten cName, fPreis, fVerkauf, sortierbar; Footer '5 Zeilen in 27 ms' und CSV-Export-Button
Ergebnis-Tabelle nach Query-Ausfuehrung
CSV-Export-Dialog: 'Speichern unter' mit Vorschlag 'export.csv' und Encoding UTF-8
CSV-Export-Dialog
ts
invoke("execute_plugin", {
  pluginId,
  queryId,
  parameters: { ... },
  timeoutSeconds: 30,    // optional, Default
  rowLimit: 10000,       // optional, Default
})

Ablauf:

  1. 1. Sidecar validiert Plugin-Lizenz (LicenseService.Validate)
  2. 2. Sidecar lädt verschlüsselte SQL-Query aus Plugin-Store
  3. 3. Sidecar entschlüsselt mit Master-Key + HKDF
  4. 4. SqlSecurityValidator.Validate(query) — lehnt Single-Statement-Violations ab
  5. 5. SqlExecutorService.ExecuteAsync(query, parameters, timeout, rowLimit)
  6. 6. Ergebnis zurück an Frontend → DataTable

Mögliche Fehler:

FehlerBedeutung
LICENSE_INACTIVELizenz abgelaufen oder Grace-Period > 30 Tage
SQL_SECURITY_VIOLATIONQuery verletzt Security-Validator-Regeln
TIMEOUTQuery > timeout-Sekunden
ROW_LIMIT_EXCEEDEDQuery liefert > rowLimit Zeilen
DB_CONNECTION_FAILEDSQL Server nicht erreichbar
QUERY_NOT_FOUNDQuery-ID existiert nicht im Plugin-Manifest

Ergebnis-Tabelle

Datei: sellx-hub/src/components/DataTable.tsx

Features:

FeatureBeschreibung
SortierungKlick auf Spalten-Header
FilterPro Spalte via Filter-Icon
Pagination25 / 50 / 100 Zeilen pro Seite
CSV-ExportButton unten rechts

CSV-Export

ts
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-TypUI
stringText-Input
numberNumber-Input
dateDate-Picker (Browser-native)
articleArtikel-Suche mit Auto-Complete
customerKunden-Suche mit Auto-Complete
boolCheckbox

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.

ts
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.