Panelinformationen

Zugriff auf Dashboard-Panel-Konfigurationen

Anzeigen und Erstellen von Visualisierungs-Panels in Dashboards einschließlich deren Layout, Positionierung und Konfigurationseinstellungen.

Dashboard-Panels abrufen

GET /api/{tenantId}/{projectId}/dashboard/{dashboardId}/panels

Ruft alle in einem Dashboard konfigurierten Visualisierungs-Panels ab, einschließlich Paneltypen, Positionen, Abmessungen und Konfigurationseinstellungen.

Pfadparameter

Parameter Typ Erforderlich Beschreibung
tenantId GUID Ja Die Mandanten-ID
projectId GUID Ja Die Projekt-ID
dashboardId GUID Ja Die Dashboard-ID

Antwort (200 OK)

{
  "dashboardId": "880e8400-e29b-41d4-a716-446655440000",
  "panels": [
    {
      "panelId": "990e8400-e29b-41d4-a716-446655440000",
      "name": "Process Flow Chart",
      "panelType": "DashboardPanelProcessMap",
      "position": "Row: 1, Col: 1",
      "width": 6,
      "height": 4,
      "configuration": "{\"dataSource\": \"MainProcess\", \"visualization\": \"flow\"}"
    },
    {
      "panelId": "aa0e8400-e29b-41d4-a716-446655440000",
      "name": "KPI Summary",
      "panelType": "DashboardPanelSingleValue",
      "position": "Row: 1, Col: 7",
      "width": 3,
      "height": 2,
      "configuration": "{\"metric\": \"avgCycleTime\", \"format\": \"duration\"}"
    }
  ]
}

Antwortfelder

Feld Typ Beschreibung
dashboardId GUID Das Dashboard, das diese Panels enthält
panels Array Liste der Panel-Objekte

Felder des Panel-Objekts

Feld Typ Beschreibung
panelId GUID Eindeutige Kennung des Panels
name String Anzeigetitel des Panels
panelType String Visualisierungstyp (siehe Abschnitt Panel-Typen)
position String Rasterposition als "Row: X, Col: Y"
width Integer Breite des Panels in Rastereinheiten
height Integer Höhe des Panels in Rastereinheiten
configuration String JSON-String mit panel-spezifischen Einstellungen

Fehlermeldungen

Nicht gefunden (404):

{
  "Error": "Dashboard not found",
  "DashboardId": "880e8400-e29b-41d4-a716-446655440000"
}

Dashboard-Panel erstellen

POST /api/{tenantId}/{projectId}/dashboard/{dashboardId}/panel

Erstellt ein neues Visualisierungs-Panel in einem Dashboard. Die API erstellt automatisch den passenden Selector-Block basierend auf dem Paneltyp und den angegebenen Einstellungen.

Pfadparameter

Parameter Typ Erforderlich Beschreibung
tenantId GUID Ja Die Mandanten-ID
projectId GUID Ja Die Projekt-ID
dashboardId GUID Ja Die Dashboard-ID

Anfragetext

{
  "title": "string (erforderlich)",
  "description": "string (optional)",
  "panelType": "string (erforderlich)",
  "blockId": "GUID (erforderlich für Datenpanels)",
  "row": "integer (erforderlich, 0-basiert)",
  "column": "integer (erforderlich, 0-basiert)",
  "width": "integer (erforderlich, 1-12)",
  "height": "integer (erforderlich, 1-20)",
  "settings": "string (optional, JSON für Selector-Konfiguration)"
}

Felder im Anfragetext

Feld Typ Erforderlich Beschreibung
title String Ja Anzeigetitel des Panels
description String Nein Optionale Beschreibung
panelType String Ja Klassenname des Panel-Typs (siehe Abschnitt Panel-Typen)
blockId GUID Ja* ID des Calculator-Blocks, der angezeigt wird (*bei DashboardPanelDashboardNote nicht erforderlich)
row Integer Ja Zeilenposition (0-basiert)
column Integer Ja Spaltenposition (0-basiert)
width Integer Ja Breite des Panels in Rastereinheiten (1-12)
height Integer Ja Höhe des Panels in Rastereinheiten (1-20)
settings String Nein JSON-String mit Selector-Konfiguration

Antwort (201 Created)

{
  "panelId": "5b54172c-b15c-4dd9-bab6-6cfceb7389df",
  "title": "My KPI Panel",
  "dashboardPanelClassName": "DashboardPanelSingleValue",
  "row": 0,
  "column": 0,
  "width": 2,
  "height": 1,
  "blockId": "db0dd1b9-63b5-4754-92b1-2764f4a3fb68"
}

Hinweis: Die blockId in der Antwort ist die SELECTOR-Block-ID, nicht die ursprüngliche Calculator-Block-ID. Die API erstellt automatisch einen Selector-Block, der den Calculator kapselt.

Fehlermeldungen

Bad Request (400) - Fehlender Block:

{
  "Error": "VALIDATION_ERROR",
  "Message": "BlockId is required for panel type 'DashboardPanelSingleValue'"
}

Bad Request (400) - Ungültiger Panel-Typ:

{
  "Error": "VALIDATION_ERROR",
  "Message": "Invalid panel type 'InvalidType'. Valid types: DashboardPanelSingleValue, DashboardPanelCalculator, ..."
}

Bad Request (400) - Block nicht gefunden:

{
  "Error": "VALIDATION_ERROR",
  "Message": "Block 'guid' does not exist"
}

Panel-Typen

mindzieStudio-Dashboards unterstützen folgende Panel-Typen:

Panel-Typ-Klasse Erstellter Selector Beschreibung
DashboardPanelCalculator SelectorFullCalculator Vollständige Calculator-Ausgabe (Prozesskarten, Trends, Diagramme)
DashboardPanelSingleValue SelectorSingleValueFromLabel Einzelwert / KPI-Karte
DashboardPanelHorizontalBarChart SelectorMultiColumns Horizontaler Balkendiagramm, Ranglisten
DashboardPanelDataTable SelectorFullCalculator Datentabellenanzeige
DashboardPanelProcessMap SelectorFullCalculator Prozesskarten-Visualisierung
DashboardPanelDashboardNote (keiner) Text-/Notiz-Panel (kein blockId erforderlich)
DashboardPanelRecommendationSentence (keiner) KI-Empfehlungsanzeige

Panel-Einstellungen pro Typ

DashboardPanelSingleValue (KPI-Karten)

Wenn panelType DashboardPanelSingleValue ist, konfigurieren die Einstellungen, wie ein einzelner Wert aus der Ausgabe eines Calculators extrahiert wird:

{
  "tableIndex": 0,
  "labelColumnName": "Name",
  "labelName": "Total Case Count",
  "valueColumnName": "Value",
  "formatText": "N0"
}
Einstellung Typ Beschreibung
tableIndex Integer Welche Ausgabetabelle verwendet wird (gewöhnlich 0)
labelColumnName String Spalte mit Labels (gewöhnlich "Name")
labelName String Das zu findende Label (z.B. "Total Case Count")
valueColumnName String Spalte mit Wert (gewöhnlich "Value")
formatText String .NET-Formatstring (z.B. N0, F2, P0)

Am besten geeignet für: CalculatorDataInformation, CalculatorOverview

DashboardPanelHorizontalBarChart (Balkendiagramme)

Wenn panelType DashboardPanelHorizontalBarChart ist, muss columnNames in den Einstellungen enthalten sein, um SelectorMultiColumns auszulösen:

{
  "tableIndex": 0,
  "columnNames": ["ActivityName", "Count"],
  "sortColumnName": "Count",
  "sortAscending": false,
  "maxRows": 10
}
Einstellung Typ Beschreibung
tableIndex Integer Welche Ausgabetabelle verwendet wird
columnNames Array Spalten, die im Diagramm enthalten sein sollen (MÜSSEN mit Calculator-Ausgabe übereinstimmen)
sortColumnName String Nach welcher Spalte sortiert wird
sortAscending Boolean Sortierrichtung
maxRows Integer Maximale anzuzeigende Zeilen

WICHTIG: Spaltennamen müssen exakt mit den Ausgabespalten des Calculators übereinstimmen. Zum Beispiel verwendet CalculatorActivityFrequency den Spaltennamen der Aktivität aus dem Dataset (z.B. "ActivityName"), nicht einen generischen "Activity".

Am besten geeignet für: CalculatorActivityFrequency, CalculatorResourceFrequency

DashboardPanelCalculator (Vollständige Visualisierungen)

Für die vollständige Calculator-Ausgabe (Prozesskarten, Trends) sind keine speziellen Einstellungen erforderlich:

{}

Oder die Einstellungen können ganz weggelassen werden.

Panel-Architektur

Dashboard-Panels sind nicht direkt mit Calculator-Blöcken verbunden. Stattdessen verwenden sie eine dreistufige Architektur:

Panel.InputBlockId -> Selector Block -> Calculator Block (via parent_id)

Warum Selector? Selector-Blöcke definieren, WIE die Calculator-Ausgabe dargestellt wird:

  • SelectorFullCalculator: Vollständige Ausgabe mit Visualisierungseinstellungen anzeigen
  • SelectorSingleValueFromLabel: Einzelnen Wert per Label-Lookup extrahieren
  • SelectorMultiColumns: Bestimmte Spalten mit Sortierung/Begrenzung extrahieren

Die API erstellt automatisch den passenden Selector-Block, wenn ein Panel auf einen Calculator verweist.

Panel-Layout-System

Dashboard-Panels verwenden ein rasterbasiertes Layout-System:

  • Rastereinheiten: 12-Spalten-Raster
  • Position: Zeilen- und Spaltenkoordinaten (0-basiert)
  • Größe: Breite (1-12 Spalten), Höhe (1-20 Zeilen)
  • Responsiv: Automatische Skalierung auf verschiedenen Bildschirmgrößen

Implementierungsbeispiele

Dashboard-Panels abrufen

cURL

curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dashboard/880e8400-e29b-41d4-a716-446655440000/panels" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

KPI-Panel erstellen (Einzelwert)

curl -X POST "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/dashboard/{dashboardId}/panel" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Total Cases",
    "panelType": "DashboardPanelSingleValue",
    "blockId": "calculator-data-information-guid",
    "row": 0,
    "column": 0,
    "width": 2,
    "height": 1,
    "settings": "{\"tableIndex\":0,\"labelColumnName\":\"Name\",\"labelName\":\"Total Case Count\",\"valueColumnName\":\"Value\",\"formatText\":\"N0\"}"
  }'

Horizontales Balkendiagramm erstellen

curl -X POST "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/dashboard/{dashboardId}/panel" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Activity Distribution",
    "panelType": "DashboardPanelHorizontalBarChart",
    "blockId": "calculator-activity-frequency-guid",
    "row": 1,
    "column": 0,
    "width": 6,
    "height": 3,
    "settings": "{\"tableIndex\":0,\"columnNames\":[\"ActivityName\",\"Count\"],\"sortColumnName\":\"Count\",\"sortAscending\":false,\"maxRows\":10}"
  }'

Volles Calculator-Panel erstellen

curl -X POST "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/dashboard/{dashboardId}/panel" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Case Count",
    "panelType": "DashboardPanelCalculator",
    "blockId": "calculator-case-count-guid",
    "row": 0,
    "column": 2,
    "width": 2,
    "height": 1
  }'

JavaScript/Node.js

const TENANT_ID = '12345678-1234-1234-1234-123456789012';
const PROJECT_ID = '87654321-4321-4321-4321-210987654321';
const BASE_URL = 'https://your-mindzie-instance.com';

async function getDashboardPanels(dashboardId, token) {
  const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dashboard/${dashboardId}/panels`;

  const response = await fetch(url, {
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    }
  });

  if (response.ok) {
    return await response.json();
  } else if (response.status === 404) {
    throw new Error('Dashboard not found');
  } else {
    throw new Error(`Failed to get panels: ${response.status}`);
  }
}

async function createDashboardPanel(dashboardId, panelData, token) {
  const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dashboard/${dashboardId}/panel`;

  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(panelData)
  });

  if (response.ok) {
    return await response.json();
  } else {
    const error = await response.json();
    throw new Error(error.Message || `Failed to create panel: ${response.status}`);
  }
}

// Verwendung - Panels abrufen
const panels = await getDashboardPanels('dashboard-guid', 'your-auth-token');
console.log(`Dashboard: ${panels.dashboardId}`);
console.log(`Panels: ${panels.panels.length}`);

// Verwendung - KPI-Panel erstellen
const newPanel = await createDashboardPanel('dashboard-guid', {
  title: 'Total Cases',
  panelType: 'DashboardPanelSingleValue',
  blockId: 'calculator-data-information-guid',
  row: 0,
  column: 0,
  width: 2,
  height: 1,
  settings: JSON.stringify({
    tableIndex: 0,
    labelColumnName: 'Name',
    labelName: 'Total Case Count',
    valueColumnName: 'Value',
    formatText: 'N0'
  })
}, 'your-auth-token');

console.log(`Panel erstellt: ${newPanel.panelId}`);

Python

import requests
import json

TENANT_ID = '12345678-1234-1234-1234-123456789012'
PROJECT_ID = '87654321-4321-4321-4321-210987654321'
BASE_URL = 'https://your-mindzie-instance.com'

def get_dashboard_panels(dashboard_id, token):
    """Alle Panels in einem Dashboard abrufen."""
    url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dashboard/{dashboard_id}/panels'
    headers = {
        'Authorization': f'Bearer {token}',
        'Content-Type': 'application/json'
    }

    response = requests.get(url, headers=headers)

    if response.ok:
        return response.json()
    elif response.status_code == 404:
        raise Exception('Dashboard nicht gefunden')
    else:
        raise Exception(f'Panels konnten nicht abgerufen werden: {response.status_code}')


def create_dashboard_panel(dashboard_id, panel_data, token):
    """Neues Panel in einem Dashboard erstellen."""
    url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dashboard/{dashboard_id}/panel'
    headers = {
        'Authorization': f'Bearer {token}',
        'Content-Type': 'application/json'
    }

    response = requests.post(url, headers=headers, json=panel_data)

    if response.ok:
        return response.json()
    else:
        error = response.json()
        raise Exception(error.get('Message', f'Panel konnte nicht erstellt werden: {response.status_code}'))


# Verwendung - Panels abrufen
panels = get_dashboard_panels('dashboard-guid', 'your-auth-token')
print(f"Dashboard: {panels['dashboardId']}")
print(f"Anzahl Panels: {len(panels['panels'])}")

# Verwendung - KPI-Panel erstellen
settings = {
    'tableIndex': 0,
    'labelColumnName': 'Name',
    'labelName': 'Total Case Count',
    'valueColumnName': 'Value',
    'formatText': 'N0'
}

new_panel = create_dashboard_panel('dashboard-guid', {
    'title': 'Total Cases',
    'panelType': 'DashboardPanelSingleValue',
    'blockId': 'calculator-data-information-guid',
    'row': 0,
    'column': 0,
    'width': 2,
    'height': 1,
    'settings': json.dumps(settings)
}, 'your-auth-token')

print(f"Panel erstellt: {new_panel['panelId']}")

C#

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

public class DashboardPanelsResponse
{
    public Guid DashboardId { get; set; }
    public List<PanelInfo> Panels { get; set; }
}

public class PanelInfo
{
    public Guid PanelId { get; set; }
    public string Name { get; set; }
    public string PanelType { get; set; }
    public string Position { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }
    public string Configuration { get; set; }
}

public class CreatePanelRequest
{
    public string Title { get; set; }
    public string Description { get; set; }
    public string PanelType { get; set; }
    public Guid BlockId { get; set; }
    public int Row { get; set; }
    public int Column { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }
    public string Settings { get; set; }
}

public class CreatePanelResponse
{
    public Guid PanelId { get; set; }
    public string Title { get; set; }
    public string DashboardPanelClassName { get; set; }
    public int Row { get; set; }
    public int Column { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }
    public Guid BlockId { get; set; }
}

public class DashboardPanelClient
{
    private readonly HttpClient _httpClient;
    private readonly string _baseUrl;
    private readonly Guid _tenantId;
    private readonly Guid _projectId;
    private readonly JsonSerializerOptions _jsonOptions;

    public DashboardPanelClient(string baseUrl, Guid tenantId, Guid projectId, string accessToken)
    {
        _baseUrl = baseUrl;
        _tenantId = tenantId;
        _projectId = projectId;
        _httpClient = new HttpClient();
        _httpClient.DefaultRequestHeaders.Authorization =
            new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
        _jsonOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
    }

    public async Task<DashboardPanelsResponse> GetDashboardPanelsAsync(Guid dashboardId)
    {
        var url = $"{_baseUrl}/api/{_tenantId}/{_projectId}/dashboard/{dashboardId}/panels";
        var response = await _httpClient.GetAsync(url);

        if (response.IsSuccessStatusCode)
        {
            var json = await response.Content.ReadAsStringAsync();
            return JsonSerializer.Deserialize<DashboardPanelsResponse>(json, _jsonOptions);
        }
        else if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
        {
            throw new Exception($"Dashboard {dashboardId} nicht gefunden");
        }

        throw new Exception($"Panels konnten nicht abgerufen werden: {response.StatusCode}");
    }

    public async Task<CreatePanelResponse> CreatePanelAsync(Guid dashboardId, CreatePanelRequest request)
    {
        var url = $"{_baseUrl}/api/{_tenantId}/{_projectId}/dashboard/{dashboardId}/panel";
        var json = JsonSerializer.Serialize(request, _jsonOptions);
        var content = new StringContent(json, Encoding.UTF8, "application/json");

        var response = await _httpClient.PostAsync(url, content);

        if (response.IsSuccessStatusCode)
        {
            var responseJson = await response.Content.ReadAsStringAsync();
            return JsonSerializer.Deserialize<CreatePanelResponse>(responseJson, _jsonOptions);
        }

        var errorJson = await response.Content.ReadAsStringAsync();
        throw new Exception($"Panel konnte nicht erstellt werden: {errorJson}");
    }
}

// Verwendung
var client = new DashboardPanelClient(
    "https://your-mindzie-instance.com",
    Guid.Parse("12345678-1234-1234-1234-123456789012"),
    Guid.Parse("87654321-4321-4321-4321-210987654321"),
    "your-access-token");

// Panels abrufen
var panels = await client.GetDashboardPanelsAsync(Guid.Parse("dashboard-guid"));
Console.WriteLine($"Dashboard: {panels.DashboardId}");
foreach (var panel in panels.Panels)
{
    Console.WriteLine($"- {panel.Name} ({panel.PanelType})");
}

// KPI-Panel erstellen
var newPanel = await client.CreatePanelAsync(Guid.Parse("dashboard-guid"), new CreatePanelRequest
{
    Title = "Total Cases",
    PanelType = "DashboardPanelSingleValue",
    BlockId = Guid.Parse("calculator-data-information-guid"),
    Row = 0,
    Column = 0,
    Width = 2,
    Height = 1,
    Settings = JsonSerializer.Serialize(new
    {
        tableIndex = 0,
        labelColumnName = "Name",
        labelName = "Total Case Count",
        valueColumnName = "Value",
        formatText = "N0"
    })
});

Console.WriteLine($"Panel erstellt: {newPanel.PanelId}");

Wichtige Hinweise

API-Funktionalitäten

  • Lesezugriff: Verwenden Sie den GET-Endpunkt, um Panel-Konfigurationen abzurufen
  • Erstellen: Verwenden Sie den POST-Endpunkt, um neue Panels mit automatischer Selector-Block-Erstellung anzulegen
  • Ändern: Die Bearbeitung von Panels erfolgt aktuell über die mindzieStudio-Benutzeroberfläche
  • Löschen: Das Löschen von Panels erfolgt aktuell über die mindzieStudio-Benutzeroberfläche

Konfigurationsparsing

Das Feld configuration enthält einen JSON-String, der zum Zugriff auf die Einstellungen geparst werden muss.

Layout-System

Panel-Positionen verwenden ein Zeilen/Spalten-Rastersystem mit flexibler Größe. Zeilen- und Spaltenwerte sind beim Erstellen von Panels 0-basiert.