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.