Panel Bilgisi

Dashboard Panel Konfigürasyonlarına Erişim

Dashboard’larda görselleştirme panellerini, bunların düzenini, konumlandırılmasını ve yapılandırma ayarlarını görüntüleyin ve oluşturun.

Dashboard Panellerini Getir

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

Bir dashboard’da yapılandırılmış tüm görselleştirme panellerini, panel türlerini, konumlarını, boyutlarını ve konfigürasyon ayarlarını getirir.

Yol Parametreleri

Parametre Tür Gerekli Açıklama
tenantId GUID Evet Tenant (kiracı) tanımlayıcısı
projectId GUID Evet Proje tanımlayıcısı
dashboardId GUID Evet Dashboard tanımlayıcısı

Yanıt (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\"}"
    }
  ]
}

Yanıt Alanları

Alan Tür Açıklama
dashboardId GUID Bu panelleri içeren dashboard
panels dizi Panel nesneleri listesi

Panel Nesnesi Alanları

Alan Tür Açıklama
panelId GUID Panel için benzersiz tanımlayıcı
name string Panelin görüntülenen başlığı
panelType string Görselleştirme türü (Panel Türleri bölümüne bakınız)
position string "Row: X, Col: Y" formatında ızgara konumu
width integer Panelin ızgara birimleri cinsinden genişliği
height integer Panelin ızgara birimleri cinsinden yüksekliği
configuration string Panele özel ayarları içeren JSON string

Hata Yanıtları

Bulunamadı (404):

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

Dashboard Paneli Oluştur

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

Dashboard’da yeni bir görselleştirme paneli oluşturur. API, panel türü ve verilen ayarlara göre uygun selector bloğunu otomatik olarak oluşturur.

Yol Parametreleri

Parametre Tür Gerekli Açıklama
tenantId GUID Evet Tenant (kiracı) tanımlayıcısı
projectId GUID Evet Proje tanımlayıcısı
dashboardId GUID Evet Dashboard tanımlayıcısı

İstek Gövdesi

{
  "title": "string (gerekli)",
  "description": "string (isteğe bağlı)",
  "panelType": "string (gerekli)",
  "blockId": "GUID (veri panelleri için gerekli)",
  "row": "integer (gerekli, 0 tabanlı)",
  "column": "integer (gerekli, 0 tabanlı)",
  "width": "integer (gerekli, 1-12 arası)",
  "height": "integer (gerekli, 1-20 arası)",
  "settings": "string (isteğe bağlı, selector konfigurasyonu için JSON)"
}

İstek Gövdesi Alanları

Alan Tür Gerekli Açıklama
title string Evet Panelin görüntüleme başlığı
description string Hayır İsteğe bağlı açıklama
panelType string Evet Panel türü sınıf adı (Panel Türleri bölümüne bakınız)
blockId GUID Evet* Görüntülenecek hesaplayıcı bloğu ID’si (*DashboardPanelDashboardNote için gerekli değildir)
row integer Evet Satır konumu (0 tabanlı)
column integer Evet Sütun konumu (0 tabanlı)
width integer Evet Panel genişliği ızgara birimleri cinsinden (1-12)
height integer Evet Panel yüksekliği ızgara birimleri cinsinden (1-20)
settings string Hayır Selector konfigürasyonunu içeren JSON string

Yanıt (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"
}

Not: Yanıttaki blockId, orijinal hesaplayıcı bloğu ID’si değil, SELECTOR bloğu ID’sidir. API, hesaplayıcıyı saran selector bloğunu otomatik olarak oluşturur.

Hata Yanıtları

Bad Request (400) - Eksik Blok:

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

Bad Request (400) - Geçersiz Panel Türü:

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

Bad Request (400) - Blok Bulunamadı:

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

Panel Türleri

mindzieStudio dashboard’ları aşağıdaki panel türlerini destekler:

Panel Türü Sınıfı Oluşturulan Selector Açıklama
DashboardPanelCalculator SelectorFullCalculator Tam hesaplayıcı çıktısı (proses haritaları, trendler, grafikler)
DashboardPanelSingleValue SelectorSingleValueFromLabel Tek değer / KPI kartı
DashboardPanelHorizontalBarChart SelectorMultiColumns Yatay çubuk grafik, sıralı listeler
DashboardPanelDataTable SelectorFullCalculator Veri tablosu gösterimi
DashboardPanelProcessMap SelectorFullCalculator Proses haritası görselleştirmesi
DashboardPanelDashboardNote (yok) Metin/not paneli (blockId gerekli değildir)
DashboardPanelRecommendationSentence (yok) AI öneri gösterimi

Türüne Göre Panel Ayarları

DashboardPanelSingleValue (KPI Kartları)

panelType DashboardPanelSingleValue olduğunda, ayarlar hesaplayıcının çıktısından tek bir değer nasıl çıkarılacağını yapılandırır:

{
  "tableIndex": 0,
  "labelColumnName": "Name",
  "labelName": "Total Case Count",
  "valueColumnName": "Value",
  "formatText": "N0"
}
Ayar Tür Açıklama
tableIndex integer Hangi çıktı tablosu kullanılacak (genellikle 0)
labelColumnName string Etiketlerin bulunduğu sütun (genellikle "Name")
labelName string Bulunacak etiket (ör. "Total Case Count")
valueColumnName string Değerin bulunduğu sütun (genellikle "Value")
formatText string .NET format string’i (N0, F2, P0 vb.)

En iyi uyumlu olduğu: CalculatorDataInformation, CalculatorOverview

DashboardPanelHorizontalBarChart (Çubuk Grafikler)

panelType DashboardPanelHorizontalBarChart olduğunda, columnNames ayarlarında belirtilir, bu SelectorMultiColumns tetikler:

{
  "tableIndex": 0,
  "columnNames": ["ActivityName", "Count"],
  "sortColumnName": "Count",
  "sortAscending": false,
  "maxRows": 10
}
Ayar Tür Açıklama
tableIndex integer Hangi çıktı tablosu kullanılacak
columnNames dizi Grafikte gösterilecek sütunlar (hesaplayıcı çıktısıyla TAM EŞLEŞMELİ)
sortColumnName string Sıralama yapılacak sütun
sortAscending boolean Artan / azalan sıralama
maxRows integer Gösterilecek maksimum satır sayısı

ÖNEMLİ: Sütun adları hesaplayıcı çıktısındaki sütun adları ile TAM olarak eşleşmelidir. Örneğin, CalculatorActivityFrequency kullanılan veri setindeki aktivite sütun adı (örn. "ActivityName") kullanır, genel bir "Activity" değil.

En iyi uyumlu olduğu: CalculatorActivityFrequency, CalculatorResourceFrequency

DashboardPanelCalculator (Tam Görselleştirmeler)

Tam hesaplayıcı çıktısı (proses haritaları, trendler) için özel ayara gerek yoktur:

{}

Veya settings parametresi tamamen çıkarılabilir.

Panel Mimarisi

Dashboard panelleri doğrudan hesaplayıcı bloklara bağlanmazlar. Bunun yerine üç katmanlı bir mimari kullanırlar:

Panel.InputBlockId -> Selector Bloğu -> Hesaplayıcı Bloğu (parent_id üzerinden)

Neden Selector? Selector blokları hesaplayıcı çıktısını NASIL göstereceğini tanımlar:

  • SelectorFullCalculator: Tüm çıktıyı görselleştirme ayarlarıyla gösterir
  • SelectorSingleValueFromLabel: Etiket aramasıyla tek bir değer çıkarır
  • SelectorMultiColumns: Belirli sütunları sıralama ve sınırlama ile çıkarır

Panel oluştururken API, hesaplayıcıya işaret eden uygun selector bloğunu otomatik oluşturur.

Panel Düzen Sistemi

Dashboard panelleri ızgara tabanlı bir düzen sistemi kullanır:

  • Izgara Birimleri: 12 sütunlu ızgara sistemi
  • Konum: Satır ve sütun koordinatları (0 tabanlı)
  • Boyut: Genişlik (1-12 sütun), Yükseklik (1-20 satır)
  • Responsive: Farklı ekran boyutlarında otomatik ölçeklendirme

Uygulama Örnekleri

Dashboard Panellerini Getir

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 Paneli Oluştur (Tek Değer)

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\"}"
  }'

Yatay Çubuk Grafik Oluştur

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}"
  }'

Tam Hesaplayıcı Paneli Oluştur

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}`);
  }
}

// Kullanım - Panelleri Getir
const panels = await getDashboardPanels('dashboard-guid', 'your-auth-token');
console.log(`Dashboard: ${panels.dashboardId}`);
console.log(`Paneller: ${panels.panels.length}`);

// Kullanım - KPI Paneli Oluştur
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(`Oluşturulan panel: ${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):
    """Bir dashboard’daki tüm panelleri getirir."""
    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 bulunamadı')
    else:
        raise Exception(f'Paneller getirilemedi: {response.status_code}')


def create_dashboard_panel(dashboard_id, panel_data, token):
    """Dashboard’da yeni panel oluşturur."""
    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 oluşturulamadı: {response.status_code}'))


# Kullanım - Panelleri Getir
panels = get_dashboard_panels('dashboard-guid', 'your-auth-token')
print(f"Dashboard: {panels['dashboardId']}")
print(f"Panel sayısı: {len(panels['panels'])}")

# Kullanım - KPI Paneli Oluştur
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"Oluşturulan panel: {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} bulunamadı");
        }

        throw new Exception($"Paneller getirilemedi: {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 oluşturulamadı: {errorJson}");
    }
}

// Kullanım
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");

// Panelleri Getir
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 paneli oluştur
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($"Oluşturulan panel: {newPanel.PanelId}");

Önemli Notlar

API Yetkinlikleri

  • Okuma Erişimi: GET endpoint’i ile panel konfigürasyonlarını alabilirsiniz
  • Oluşturma Erişimi: POST endpoint’i ile yeni paneller oluşturabilir, seçici blok otomatik olarak yaratılır
  • Değiştirme Erişimi: Panel değişiklikleri şu anda mindzieStudio UI ile yapılmaktadır
  • Silme Erişimi: Panel silme işlemi şu anda mindzieStudio UI ile yapılmaktadır

Konfigürasyon Ayrıştırması

configuration alanı, ayarları erişmek için ayrıştırılması gereken JSON string içerir.

Düzen Sistemi

Panel konumları satır/sütun ızgara sistemi kullanır ve esnek boyutlandırma sağlar. Satır ve sütun değerleri panel oluşturulurken 0 tabanlıdır.