İçeriğe geç

Özel Menü

Custom Menu, space seviyesinde tanımlanan özel menü girdileridir. Mevcut bir Custom HTML sayfasına veya Animation’a bağlanır, ya da alt menüleri taşıyan bir grup görevi görür.

Veri modelinde CustomMenu, Menu sınıfını genişletir — yani her custom menu aynı zamanda bir menü yetkisidir (privilege). İkisi aynı UUID’yi paylaşır: custom_menu_id ile menu_id her zaman aynı değerdir. Bu ayrıntı görünürlük yapılandırmasında belirleyicidir.

Custom Menu’ler space’e bağlıdır, projeye değil. Proje ilişkisi dolaylıdır: bağlı customHtmlId’nin veya animationId’nin ait olduğu proje üzerinden kurulur.

Özel Menüler ekranı — kök seviye listesi, altında ikinci ve üçüncü seviye panelleri

AlanTipZorunluAçıklama
nameString (≤100)EvetMenü adı. Oluşturduktan sonra değiştirilemez
contentTypeEnumEvetHtml, Animation veya Group. Değiştirilemez
iconString (≤16384)Hayırİkon tanımlayıcı JSON (aşağıya bakın)
menuOrderIntegerHayırMenü sıralaması
parentCustomMenuHayırÜst menü — hiyerarşi için
customHtmlIdStringHtml ise evetBağlanacak Custom HTML kaydı. Değiştirilemez
animationIdStringAnimation ise evetBağlanacak Animation kaydı. Değiştirilemez
animationParamsString (≤32767)HayırAnimation’a geçirilecek JSON parametreler

Yeni menü formu ortak alanları sorar:

Yeni Custom Menu formu — Name, Order, Content Type ve Icon alanları

Düzenleme formu — alanlar düzenlenebilir görünür, ancak yalnızca Order ve Icon kalıcı olur

ContentType enum’ı üç değer alır:

TipZorunlu alanAçıklama
HtmlcustomHtmlIdMevcut bir Custom HTML sayfasını açar. Aynı HTML birden fazla menüye bağlanabilir
AnimationanimationIdMevcut bir Animation’ı açar. animationParams ile parametre geçirilebilir
Group—Alt menüleri taşıyan boş kapsayıcı

Formdaki liste de tam olarak bu üç değeri sunar:

Content Type listesi açık — Animation, Html ve Group seçenekleri

Menü formundaki Icon alanı seçili ikonun önizlemesini gösterir. Henüz ikon yokken Choose icon düğmesi kütüphaneyi açar; ikon atandıktan sonra bu düğmeler Change ve Clear olur (yukarıdaki düzenleme formu görüntüsünde bu hâli görebilirsiniz).

Formdaki Icon alanı — önizleme kutusu ve Choose icon düğmesi

Kütüphane dört kaynak sunar — FontAwesome, OpenBridge, Material Symbols ve Custom — ve ada göre arama ile kategori süzmesi içerir.

İkon kütüphanesi — FontAwesome, OpenBridge, Material Symbols ve Custom sekmeleri, arama ve kategori süzmesi

Seçilen ikon, yalnızca vektör yollarından oluşan bir tanımlayıcı JSON olarak saklanır; renk bilgisi taşımaz. Böylece ikon, içinde bulunduğu temanın metin rengini devralır ve açık/koyu temalarda doğru görünür.

Custom Menu’ler en fazla 3 seviye iç içe olabilir. Her seviyenin kendi endpoint’i vardır:

Root (1. seviye) POST /api/custom-menus Second (2. seviye) POST /api/custom-menus/{root}/second / Third (3. seviye) POST /api/custom-menus/{root}/second/{second}/third Root (1. seviye) POST /api/custom-menus Second (2. seviye) POST /api/custom-menus/{root}/second Third (3. seviye) POST /api/custom-menus/{root}/second/{second}/third
  1. seviye oluşturma denemesi hata döner. Aynı seviye mantığı güncelleme ve silme işlemlerinde de geçerlidir.

Tipik bir kurgu:

Plant (Group, kök) Pump Station (Html, 2. seviye) / Inverters (Group, 2. seviye) / Live Schematic (Animation, 3. seviye) / Daily Report (Html, 2. seviye) Plant (Group, kök) Pump Station (Html, 2. seviye) Inverters (Group, 2. seviye) Live Schematic (Animation, 3. seviye) Daily Report (Html, 2. seviye)

Ekranda her seviye kendi paneline düşer. Kök satırı seçtiğinizde o menünün alt seviyesi İkinci Seviye panelinde listelenir; ikinci seviyeden bir satır seçtiğinizde de Üçüncü Seviye paneli dolar.

Kök menü seçili — İkinci Seviye panelinde ona bağlı Html menü listeleniyor

JDK 21’de Custom HTML ayrı bir kayıttır. Menü, içeriği kendi içinde barındırmaz; yalnızca mevcut bir HTML kaydına referans verir. Sıra şudur:

  1. Custom HTML sayfasını oluştur → customHtmlId al
  2. Html tipinde bir Custom Menu oluştur, bu ID’yi ver

Özel HTML'ler listesi — menüye bağlanacak sayfalar burada yönetilir

Menü çalışma zamanında, bağlı sayfa gömülü olarak açılır:

Çalışma zamanı — Plant grubu altındaki menü ve içine gömülü Custom HTML sayfası

Custom HTML sayfası, korumalı (sandboxed) bir iframe içinde çalışır. inSCADA API’sine erişmenin tek yolu, sunucunun sayfaya otomatik enjekte ettiği InscadaApi proxy’sidir:

var api = new InscadaApi(); // sayfa kendi projesini otomatik alır
(async function () {
var v = await api.getVariableValue('ActivePower_kW');
document.getElementById('power').textContent = v.value.toFixed(1);
// Birden fazla değişken — tek gidiş-dönüş
var batch = await api.getVariableValues(['Voltage_V', 'Current_A']);
console.log(batch.Voltage_V.value);
})();

Doğrudan yönetici rolüne eklemek de mümkün değildir — Administrator ve Space Admin sistem rolleridir ve değiştirilemezler; bu rolleri güncelleme girişimi hata döner.

İzinler birleşimli (additive) çalıştığı için çözüm, yalnızca ilgili custom menüleri taşıyan ikinci bir rol oluşturmaktır:

  1. Amacını yansıtan bir rol oluştur — örneğin PumpStationAccess
  2. Yeni menüyü bu role ekle
  3. Rolü ilgili kullanıcılara ata — mevcut rolleri korunur, yenisi üzerine eklenir

Sonraki menüler için yalnızca 2. adımı tekrarlamanız yeterlidir.

En az yetki ilkesi gereği bu role yalnızca custom menüleri ekleyin. Home, Variables, Trends gibi sistem menüleri zaten kullanıcının yönetici rolünden gelir; tekrar eklemek denetim kayıtlarını gereksiz yere kalabalıklaştırır.

Bir kullanıcı menüyü neden göremiyor?

Section titled “Bir kullanıcı menüyü neden göremiyor?”
  1. Kullanıcının rollerini listeleyin
  2. Her rolün bağlı menülerini listeleyin
  3. Menü bu listelerin hiçbirinde yoksa → role-menü bağlantısı eksiktir

Mevcut bir menü, yeni bir ad verilerek kopyalanabilir. name alanı değiştirilemez olduğu için, benzer bir menüyü farklı adla oluşturmanın pratik yolu budur.

Bir Custom Menu silindiğinde arkasındaki menü yetkisi de silinir ve bu menüye ait tüm role bağlantıları otomatik olarak temizlenir. Rollerde geride başvurusuz (ölü) kayıt kalmaz.

Toplu silme işlemi seviyeye özeldir: silinecek menülerin tamamı aynı seviyede (kök / 2. / 3.) olmalıdır. Farklı seviyelerdeki menüler için ayrı işlem yapın.