From 81b2202df0e5e67706ca7bd73b21c9b42e69dbd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Thu, 1 Oct 2026 16:42:56 +0300 Subject: [PATCH] =?UTF-8?q?mcp=20Lookup=20Cascading=20=C3=B6zelli=C4=9Fi?= =?UTF-8?q?=20eklendi.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/instructions/lowcode.instructions.md | 29 +++++++++++-- .../ListForms/Wizard/ListFormWizardDto.cs | 11 ++++- .../Wizard/WizardColumnItemInputDto.cs | 12 ++++++ .../ListForms/Wizard/WizardSeedFileDto.cs | 4 +- .../WizardConsts.cs | 41 ++++++++++++++++--- .../c8017276-eef2-4ede-b060-ec86339fee18.json | 2 +- ui/src/proxy/admin/wizard/models.ts | 4 ++ ui/src/views/admin/listForm/wizard/Wizard.tsx | 8 ++++ .../listForm/wizard/WizardStepFields.tsx | 5 +++ 9 files changed, 104 insertions(+), 12 deletions(-) diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md index 029a4e2b..7b9b042f 100644 --- a/.github/instructions/lowcode.instructions.md +++ b/.github/instructions/lowcode.instructions.md @@ -506,7 +506,7 @@ ister ve kiracı kullanıcısına hiçbiri açılmaz. | `get_dev_guide` | Bu dosyanın (`lowcode`) ya da `reference`'ın başlık listesini / bir bölümünü döner | Bölüm numarayla istenir (`4.3`); aynı numarayı iki başlık taşımamalıdır | | `create_table` | Yeni SQL Server tablosu kurar, `sql/object/{Tablo}.sql` dosyasını yazar | Ek olarak `App.SqlQueryManager` ister; `Id`/`TenantId`/audit kolonlarını kendi ekler (`fullAudited`, `multiTenant` varsayılan açık); var olan tabloyu reddeder. View/SP/fonksiyon kurulamaz | | `list_wizards` · `get_wizard` | Wizard dosyalarını listeler (menü yolu, bağımlılar) · dosyayı diskteki hâliyle döner | Var olan menü kökünü/izin grubunu bulmak için önce `list_wizards` | -| `deploy_wizard` | Wizard cevabından ekranın wizard dosyasını ve menü/yetki/dil seed satırlarını yazar; veritabanına yazmaz (§4.0) | Girdi §4.4'teki düz cevap ya da `get_wizard` çıktısıyla aynı dosya biçimi; enum'lar sayı. `replaceFileName` = `EditFileName` (§4.5). List ekranında `Widgets` dolu gelir — alt form olarak üretilen ekran hariç (`Widgets: []`) — en az 3 kart, kiracı tablosunda `"TenantId" = '@TENANTID'` (§4.6.1); kartlardaki her dil anahtarı var olmalı ya da `Language.Texts`'te EN + TR verilmeli, yoksa deploy reddeder. `MenuOrder` yazılmaz — sunucu yeni ekranı kardeşlerinin sonuna koyar, güncellemede yerini korur. Talep bağı (`DevRequest`) da yazılmaz — sunucu etkin talepten doldurur (§4.0). İstek demo veri taşıyorsa `SeedData: true` + `seedRows` (§0.10.1). Satır/toolbar butonları `CommandColumns` (§4.9). Çıkıştaki `isPending: true` ekranın henüz kurulmadığını söyler — kullanıcı Wizard Manager'da DB Migrate çalıştırır; model migrate'i beklemez | +| `deploy_wizard` | Wizard cevabından ekranın wizard dosyasını ve menü/yetki/dil seed satırlarını yazar; veritabanına yazmaz (§4.0) | Girdi §4.4'teki düz cevap ya da `get_wizard` çıktısıyla aynı dosya biçimi; enum'lar sayı. `replaceFileName` = `EditFileName` (§4.5). List ekranında `Widgets` dolu gelir — alt form olarak üretilen ekran hariç (`Widgets: []`) — en az 3 kart, kiracı tablosunda `"TenantId" = '@TENANTID'` (§4.6.1); kartlardaki her dil anahtarı var olmalı ya da `Language.Texts`'te EN + TR verilmeli, yoksa deploy reddeder. `MenuOrder` yazılmaz — sunucu yeni ekranı kardeşlerinin sonuna koyar, güncellemede yerini korur. Talep bağı (`DevRequest`) da yazılmaz — sunucu etkin talepten doldurur (§4.0). İstek demo veri taşıyorsa `SeedData: true` + `seedRows` (§0.10.1). Satır/toolbar butonları `CommandColumns` (§4.9). Bağımlı lookup öğedeki `Cascade*` alanları (§4.3.4). Çıkıştaki `isPending: true` ekranın henüz kurulmadığını söyler — kullanıcı Wizard Manager'da DB Migrate çalıştırır; model migrate'i beklemez | | `delete_wizard` | Wizard'ı ve yalnızca onun ürettiği kayıtları siler; `dropTables: true` ekranın tablosunu da düşürür | Bağımlı wizard varsa reddeder. Tablo kullanıcı açıkça onaylamadan düşürülmez; `App.SqlQueryManager` ister (§4.5) | | `start_dev_request` | `App.DevRequests` talebini üstlenir: `Ready to Start` durumundaysa `In Progress` durumuna alır, değilse reddeder | Ek olarak `App.DevRequests.Update` ister. Açıklamadaki görseller ayrı resim içeriği olarak gelir (§0.11) | | `get_dev_request` | Talebi durumuna dokunmadan okur (aynı metin + analiz + resim içerikleri) | Analizden önce ya da yarım kalan talebe dönmek için; `App.DevRequests` ister | @@ -1341,7 +1341,11 @@ başlangıçlar bu anahtarların doğru bileşimlerini üretir. ### 4.3.4 Lookup ve cascade (`LookupJson`) Wizard'daki `LookupDataSourceType` + `LookupQuery` + `ValueExpr` + `DisplayExpr` alanları alanın -`LookupJson` kolonuna dönüşür. Tam sözleşme: +`LookupJson` kolonuna dönüşür. **Cascade de wizard girdisidir:** öğedeki `CascadeParentFields`, +`CascadeRelationField`, `CascadeFilterOperator`, `CascadeEmptyFields` aynı adla `LookupJson`'a +yazılır (`WizardConsts.DefaultLookupJson`; yalnızca dolu olanlar). Wizard ekranında bu alanların +adımı yoktur, düzenlemede korunur. MCP `deploy_wizard` ile cascade'li ekran doğrudan üretilir; +cascade eksik yetenek değildir ve analizde `Ready to Start`'ı engellemez. Tam sözleşme: | Alan | Anlam | | --- | --- | @@ -1386,6 +1390,25 @@ kaçışlanmış JSON string** olarak yazılır; canlı örnek Tenants ekranı, Tablo adlarını tahmin etme: platform tablolarının adı `TableNameResolver`'dan gelir (reference §12.1); yukarıdakiler kalıbı gösterir, üretimden önce `sql/object/` ya da mevcut sorgudan doğrula. +Wizard öğesi olarak (Eğitim Tipi → Eğitim Konusu; ebeveyn StaticData, çocuk Query): + +```jsonc +{ "FieldName": "TrainingType", "EditorType": "dxSelectBox", "LookupDataSourceType": 1, + "LookupQuery": "[{\"key\":\"Orientation\",\"name\":\"Oryantasyon Eğitimi\"}]", + "ValueExpr": "key", "DisplayExpr": "name", + "CascadeEmptyFields": "TrainingTopicId" }, +{ "FieldName": "TrainingTopicId", "EditorType": "dxSelectBox", "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM Hr_T_TrainingTopic WHERE (TrainingType = @param0 OR @param0 IS NULL) AND IsDeleted = 'false' ORDER BY Name", + "ValueExpr": "Key", "DisplayExpr": "Name", + "CascadeParentFields": "TrainingType" } +``` + +**Lookup'ta Id görünmesin.** Açılır listede metin yerine Id görünüyorsa iki nedeni vardır: +`DisplayExpr` sorgunun döndürdüğü kolon adıyla birebir (büyük/küçük harf dahil) eşleşmiyordur, +ya da `EditorOptions`'ta `grouped: true` vardır ve öğeler `group` alanı taşımaz. `Query` lookup'ı +`[Key]` + `[Name]` takma adlarını döndürür ve `ValueExpr: "Key"`, `DisplayExpr: "Name"` yazılır. +Bağımlı liste `grouped` ile değil cascade ile kurulur. + > Lookup verisi önbelleklenir; aynı sorgu aynı filtrelerle bir kez yüklenir. ### 4.3.5 Varsayılan değerler — `*FieldsDefaultValueJson` @@ -2469,7 +2492,7 @@ tanımsız kalır**. Yardımcı adlarını yeniden tanımlama. - **Alan gizleme yok.** Runtime'da `visible` yardımcısı yoktur; koşullu görünürlük yerine `readOnly` kullan, kalıcı gizleme `EditorOptions.visible` ya da `IncludeInEditingForm`'dur. -- **Lookup sorgusu değiştirilemez**; cascade davranışı ListForm lookup ayarlarından kurulur. +- **Lookup sorgusu değiştirilemez**; bağımlı liste wizard öğesinin `Cascade*` alanlarıyla kurulur (§4.3.4). - **Sunucu tarafı doğrulama değildir.** `ask`/`notify` yalnızca tarayıcıdadır; iş kuralı zorunluysa SQL/endpoint tarafında da uygula. - **Satırlar arası hesap yok**: script yalnızca düzenlenen kaydı ve seçili lookup kaydını görür. diff --git a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs index b22fb2ed..ef042390 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs @@ -377,7 +377,12 @@ public class ListFormWizardDto field.ColumnFilterJson = WizardConsts.DefaultColumnFilteringJson; field.PivotSettingsJson = WizardConsts.DefaultPivotSettingsJson; field.LookupJson = !string.IsNullOrWhiteSpace(item.LookupQuery) - ? WizardConsts.DefaultLookupJson(item.LookupDataSourceType, item.DisplayExpr, item.ValueExpr, item.LookupQuery) + ? WizardConsts.DefaultLookupJson( + item.LookupDataSourceType, + item.DisplayExpr, + item.ValueExpr, + item.LookupQuery, + new WizardLookupCascade(item.CascadeParentFields, item.CascadeRelationField, item.CascadeFilterOperator, item.CascadeEmptyFields)) : null; field.ValidationRuleJson = inEditingForm && item.IsRequired ? WizardConsts.DefaultValidationRuleRequiredJson @@ -490,6 +495,10 @@ public class ListFormWizardDto ValueExpr = lookup.ValueExpr, DisplayExpr = lookup.DisplayExpr, LookupQuery = lookup.LookupQuery, + CascadeParentFields = lookup.CascadeParentFields, + CascadeRelationField = lookup.CascadeRelationField, + CascadeFilterOperator = string.IsNullOrWhiteSpace(lookup.CascadeParentFields) ? null : lookup.CascadeFilterOperator, + CascadeEmptyFields = lookup.CascadeEmptyFields, EnglishCaption = previous?.EnglishCaption, TurkishCaption = previous?.TurkishCaption, }); diff --git a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardColumnItemInputDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardColumnItemInputDto.cs index a50db3d5..e62dcdfa 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardColumnItemInputDto.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardColumnItemInputDto.cs @@ -20,4 +20,16 @@ public class WizardColumnItemInputDto public string ValueExpr { get; set; } public string DisplayExpr { get; set; } public string LookupQuery { get; set; } + + /// Cocuk alanda: degeri lookup sorgusuna @param0… olarak giden ebeveyn alan(lar), virgulle. + public string CascadeParentFields { get; set; } + + /// Cocuk alanda: StaticData ogesinde ebeveyn degeriyle karsilastirilan alan (group). + public string CascadeRelationField { get; set; } + + /// StaticData cascade filtresinin operatoru; bos ise =. + public string CascadeFilterOperator { get; set; } + + /// Ebeveyn alanda: bu alan degisince bosaltilacak cocuk alanlar, virgulle. + public string CascadeEmptyFields { get; set; } } diff --git a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardSeedFileDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardSeedFileDto.cs index 5201adad..6aacdb52 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardSeedFileDto.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardSeedFileDto.cs @@ -109,7 +109,9 @@ public class WizardSeedFileDto nameof(WizardColumnItemInputDto.IsRequired), nameof(WizardColumnItemInputDto.IncludeInEditingForm), nameof(WizardColumnItemInputDto.DbSourceType), nameof(WizardColumnItemInputDto.LookupDataSourceType), nameof(WizardColumnItemInputDto.ValueExpr), nameof(WizardColumnItemInputDto.DisplayExpr), - nameof(WizardColumnItemInputDto.LookupQuery), + nameof(WizardColumnItemInputDto.LookupQuery), nameof(WizardColumnItemInputDto.CascadeParentFields), + nameof(WizardColumnItemInputDto.CascadeRelationField), nameof(WizardColumnItemInputDto.CascadeFilterOperator), + nameof(WizardColumnItemInputDto.CascadeEmptyFields), ]; /// Dosyada `Menu` basligi altinda toplanan wizard alanlari; adlari degismez. diff --git a/api/src/Sozsoft.Platform.Domain.Shared/WizardConsts.cs b/api/src/Sozsoft.Platform.Domain.Shared/WizardConsts.cs index b7aea5b7..53eb0e75 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/WizardConsts.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/WizardConsts.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Data; using System.Text.Json; using Sozsoft.Platform.Enums; @@ -128,13 +129,38 @@ public static class WizardConsts new { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required) } }); - public static string DefaultLookupJson(UiLookupDataSourceTypeEnum dataSourceType, string displayExpr = "name", string valueExpr = "key", string lookupQuery = "") => JsonSerializer.Serialize(new + /// + /// Cascade alanlari yalnizca doluysa yazilir; cascade'siz lookup'in JSON'u onceki bicimiyle + /// ayni kalir, boylece yeniden deploy edilen ekranlarin seed dosyalari sahte fark uretmez. + /// + public static string DefaultLookupJson( + UiLookupDataSourceTypeEnum dataSourceType, + string displayExpr = "name", + string valueExpr = "key", + string lookupQuery = "", + WizardLookupCascade cascade = null) { - DataSourceType = dataSourceType, - DisplayExpr = displayExpr, - ValueExpr = valueExpr, - LookupQuery = lookupQuery, - }); + var lookup = new Dictionary + { + ["DataSourceType"] = dataSourceType, + ["DisplayExpr"] = displayExpr, + ["ValueExpr"] = valueExpr, + ["LookupQuery"] = lookupQuery, + }; + + if (!string.IsNullOrWhiteSpace(cascade?.ParentFields)) + { + lookup["CascadeParentFields"] = cascade.ParentFields.Trim(); + lookup["CascadeFilterOperator"] = string.IsNullOrWhiteSpace(cascade.FilterOperator) ? "=" : cascade.FilterOperator.Trim(); + if (!string.IsNullOrWhiteSpace(cascade.RelationField)) + lookup["CascadeRelationField"] = cascade.RelationField.Trim(); + } + + if (!string.IsNullOrWhiteSpace(cascade?.EmptyFields)) + lookup["CascadeEmptyFields"] = cascade.EmptyFields.Trim(); + + return JsonSerializer.Serialize(lookup); + } /// /// Query kaynagi turetilmis tablo olarak sarilir ve kolonlar bu takma adla nitelenir; @@ -217,3 +243,6 @@ public static class WizardConsts AllowDetail = AllowDetail }); } + +/// Wizard alanindan lookup'a yazilan cascade ayarlari (LookupDto.Cascade*). +public sealed record WizardLookupCascade(string ParentFields, string RelationField, string FilterOperator, string EmptyFields); diff --git a/configs/seeds/host/data/App.DevRequests/c8017276-eef2-4ede-b060-ec86339fee18.json b/configs/seeds/host/data/App.DevRequests/c8017276-eef2-4ede-b060-ec86339fee18.json index ceebc420..d1a04426 100644 --- a/configs/seeds/host/data/App.DevRequests/c8017276-eef2-4ede-b060-ec86339fee18.json +++ b/configs/seeds/host/data/App.DevRequests/c8017276-eef2-4ede-b060-ec86339fee18.json @@ -11,7 +11,7 @@ "RequestDate": null, "Status": "Backlog", "Title": "Human Resources -> Eğitim", - "Description": "

Human Resources menüsünün içerisinde Eğitim isimli bir alt menü oluşturulmalı. Aşağıdaki komponentler bu alt menünün altına yerleştirilmeli.


Eğitim Konuları : Eğtiim Tipi sütunu Oryantasyon Eğitimi, İş Başı Eğitimi, Teknik Oryantasyon Eğitimi, Grup Eğitimi, Firma Dışı Eğitimi, Eğitim İçerikli Sosyal Faaliyet, Akademi Eğitimleri, Rotasyon Eğitimleri seçenekleri olmalı.



Eğitimler : Yukarıda bahsedilen eğitim tiplerine ait fotoğraflarını gönderiyorum. Ancak beklentim sadece bir eğitim ekranına ihtiyacım var. Bu resimleri birleştirerek tek bir komponent tasarlamalısın. Eğitim ekranının üzerinde Eğitim tipi seçilmeli ve yukarıdaki listedeki Eğitim Konusu seçilmeli. Diğer sütunlar resimlerdeki ortak ve artan tüm bilgileri içerecek şekilde oluşturulmalıdır. Eğitimler listesinin detayında Katılımcılar, Maliyet ve Yetkinlikler girilebilmeli. Yekinlikler -> Skill Types içerisinde seçilebilmeli hatta bunun listesi olmayabilir Eğitim kaydında birden fazla seçilebilen yetkinler sütunu da olabilir. Her katılımcının katılıma durumu, değerlendirme puanı, sınav notu gibi bilgiler girilebilmelidir. Eğitimle alakalı birden fazla eğitim kaynağı olan dijital dosyaları da bu eğtiimin içerisine kaydedebilmeliyim.


Eğitime katılan tüm katılımcılar eğer katıldıysa Sertifika alabilmeli. Sertifika raporu aşağıdaki gibi hazırlanmalı. Uygulamada Rapor Kategorileri, Report Templates seçenekleri var. Bu Sertifika raporu için Standart

Taahhütname gibi bir rapor hazırlanabilir. DynamicReport ile hazırlanabilmeli. Raporlar kategorisinde Standard Taahhütname gibi statik bir rapor ekle



Yine eğitimin içerisinde Maliyet bilgileri girebileceğimiz bir group olmalı. aşağıda resimdeki detayları o kısma yazabilmeliyim. Bu bilgiler Eğitim listesinde görünebilmelidir.



", + "Description": "

Human Resources menüsünün içerisinde Eğitim isimli bir alt menü oluşturulmalı. Aşağıdaki komponentler bu alt menünün altına yerleştirilmeli.


Eğitim Tipleri : Eğitim Tipleri Oryantasyon Eğitimi, İş Başı Eğitimi, Teknik Oryantasyon Eğitimi, Grup Eğitimi, Firma Dışı Eğitimi, Eğitim İçerikli Sosyal Faaliyet, Akademi Eğitimleri, Rotasyon Eğitimleri seçenekleri olmalı. Bu bilgiler demo olarak otomatik eklenmeli.


Eğitim Konuları : Eğitim Tipi sütunu Eğtim Tipleri listesinden gelmeli. Demo veri eklenirken Eğitim Tipi listesinde Id değeri kullanılmalı. Yoksa Eğitim Tipi sütunu boş görünmemeli.



Eğitimler : Yukarıda bahsedilen eğitim tiplerine ait fotoğraflarını gönderiyorum. Ancak beklentim sadece bir eğitim ekranına ihtiyacım var. Bu resimleri birleştirerek tek bir komponent tasarlamalısın. Eğitim ekranının üzerinde Eğitim tipi seçilmeli ve o tipe bağlı olarak yukarıdaki listedeki Eğitim Konusu seçilmeli. Yani cascading olarak çalışmalı. Diğer sütunlar resimlerdeki ortak ve artan tüm bilgileri içerecek şekilde oluşturulmalıdır. Eğitimler listesinin detayında Katılımcılar, Maliyet ve Yetkinlikler girilebilmeli. Yekinlikler -> Skill Types içerisinde seçilebilmeli hatta bunun listesi olmayabilir Eğitim kaydında birden fazla seçilebilen yetkinler sütunu da olabilir. Her katılımcının katılıma durumu, değerlendirme puanı, sınav notu gibi bilgiler girilebilmelidir. Eğitimle alakalı birden fazla eğitim kaynağı olan dijital dosyaları da bu eğtiimin içerisine kaydedebilmeliyim. DepartmanId ve BirimId sütunlarını oluşturmana gerek yok.


Eğitime katılan tüm katılımcılar eğer katıldıysa Sertifika alabilmeli. Sertifika raporu aşağıdaki gibi hazırlanmalı. Uygulamada Rapor Kategorileri, Report Templates seçenekleri var. Bu Sertifika raporu için Standart

Taahhütname gibi bir rapor hazırlanabilir. DynamicReport ile hazırlanabilmeli. Raporlar kategorisinde Standard Taahhütname gibi statik bir rapor ekle. Katılım durumu onay kutusu yerine üç seçenekli bir liste olacak: Katıldı / Katılmadı / Mazeretli.



Yine eğitimin içerisinde Maliyet bilgileri girebileceğimiz bir group olmalı. aşağıda resimdeki detayları o kısma yazabilmeliyim. Bu bilgiler Eğitim listesinde görünebilmelidir.



", "DueDate": "2026-10-01T10:34:00", "Tags": "HR", "Assignees": "system@sozsoft.com", diff --git a/ui/src/proxy/admin/wizard/models.ts b/ui/src/proxy/admin/wizard/models.ts index bbf4c48d..1961ce27 100644 --- a/ui/src/proxy/admin/wizard/models.ts +++ b/ui/src/proxy/admin/wizard/models.ts @@ -285,6 +285,10 @@ export interface WizardSeedFileItemDto { valueExpr?: string displayExpr?: string lookupQuery?: string + cascadeParentFields?: string + cascadeRelationField?: string + cascadeFilterOperator?: string + cascadeEmptyFields?: string } export interface WizardSeedFileGroupDto { diff --git a/ui/src/views/admin/listForm/wizard/Wizard.tsx b/ui/src/views/admin/listForm/wizard/Wizard.tsx index b8d49aba..e9626c82 100644 --- a/ui/src/views/admin/listForm/wizard/Wizard.tsx +++ b/ui/src/views/admin/listForm/wizard/Wizard.tsx @@ -797,6 +797,10 @@ const Wizard = () => { valueExpr: it.valueExpr ?? 'Key', displayExpr: it.displayExpr ?? 'Name', lookupQuery: it.lookupQuery ?? '', + cascadeParentFields: it.cascadeParentFields, + cascadeRelationField: it.cascadeRelationField, + cascadeFilterOperator: it.cascadeFilterOperator, + cascadeEmptyFields: it.cascadeEmptyFields, }) as WizardGroupItem, ), })) @@ -1173,6 +1177,10 @@ const Wizard = () => { displayExpr: item.displayExpr, valueExpr: item.valueExpr, lookupQuery: item.lookupQuery, + cascadeParentFields: item.cascadeParentFields, + cascadeRelationField: item.cascadeRelationField, + cascadeFilterOperator: item.cascadeFilterOperator, + cascadeEmptyFields: item.cascadeEmptyFields, } }), })), diff --git a/ui/src/views/admin/listForm/wizard/WizardStepFields.tsx b/ui/src/views/admin/listForm/wizard/WizardStepFields.tsx index 2043c8e2..d58a1ff0 100644 --- a/ui/src/views/admin/listForm/wizard/WizardStepFields.tsx +++ b/ui/src/views/admin/listForm/wizard/WizardStepFields.tsx @@ -54,6 +54,11 @@ export interface WizardGroupItem { valueExpr?: string displayExpr?: string lookupQuery?: string + /** Wizard ekraninda sorulmaz; MCP deploy_wizard ya da alan detayindan gelir, duzenlemede korunur. */ + cascadeParentFields?: string + cascadeRelationField?: string + cascadeFilterOperator?: string + cascadeEmptyFields?: string } export interface WizardGroup {