Wizard dil desteği ve hatalar giderildi.

This commit is contained in:
Sedat ÖZTÜRK 2026-09-02 17:31:39 +03:00
parent 3622764923
commit 0941b9143b
26 changed files with 704 additions and 600 deletions

View file

@ -879,8 +879,9 @@ embedded elsewhere as a SubGrid/part. Default is `true`.
The wizard's permission group comes from a select list backed by `GetWizardPermissionGroups`. The wizard's permission group comes from a select list backed by `GetWizardPermissionGroups`.
Display names are read from the language key whose name equals the group name. Display names are read from the language key whose name equals the group name.
- Selecting an existing group fills `PermissionGroupDisplayNameEn/Tr`; if left blank the server - Selecting an existing group fills `PermissionGroupEn/Tr` (seed file: `Language.PermissionGroupEn/Tr`);
writes the database values back, so the seed file always carries both languages. if left blank the server writes the database values back, so the seed file always carries both
languages.
- Defining a new group writes those texts to the language key with the same name as the group. - Defining a new group writes those texts to the language key with the same name as the group.
- AI must never propose a permission group without EN + TR display names. - AI must never propose a permission group without EN + TR display names.

View file

@ -572,13 +572,12 @@ Okuyan: `WizardDataSeeder` · Yazan: `ListFormWizardAppService` ve `WizardSeedSy
"Wizard": { // yalnızca ekrandan üretilemeyen bilgiler — 4.2 "Wizard": { // yalnızca ekrandan üretilemeyen bilgiler — 4.2
"ComponentKind": 0, "WizardName": "Tags", "SeededAt": "2026-09-01T09:03:00", "ComponentKind": 0, "WizardName": "Tags", "SeededAt": "2026-09-01T09:03:00",
"WizardCode": "App.Prj.Tags", "CustomComponentName": "", "WizardCode": "App.Prj.Tags", "CustomComponentName": "",
"PermissionGroupName": "App.Prj", "PermissionGroupDisplayNameEn": "…", "PermissionGroupDisplayNameTr": "…", "PermissionGroupName": "App.Prj", "DataSourceConnectionString": "", "ModuleId": "Prj",
"DataSourceConnectionString": "", "ModuleId": "Prj",
"Menu": { "MenuCode": "…", "MenuOrder": 2, "MenuUrl": "…", "MenuIcon": "…", "Menu": { "MenuCode": "…", "MenuOrder": 2, "MenuUrl": "…", "MenuIcon": "…",
"MenuParentCode": "…", "MenuParentIcon": "…" }, // "CreateMenu": false ise eklenir "MenuParentCode": "…", "MenuParentIcon": "…" }, // "CreateMenu": false ise eklenir
"Language": { "LanguageTextMenuEn": "…", /* Menu/Title/Desc/MenuParent · EN + TR */ }, "Language": { "MenuEn": "…", /* Menu/Title/Desc/MenuParent/PermissionGroup · EN + TR */ },
"Groups": [ { "Items": [ { "FieldName": "…", "CaptionName": "…", "Groups": [ { "Items": [ { "FieldName": "…", "CaptionName": "…",
"EnglishCaption": "…", "TurkishCaption": "…" } ] } ] "En": "…", "Tr": "…" } ] } ]
}, },
"ListForm": { /* GridOptionsEditDto — ekranın kendisi, ListForm detayıyla aynı sözleşme */ }, "ListForm": { /* GridOptionsEditDto — ekranın kendisi, ListForm detayıyla aynı sözleşme */ },
"Fields": [ /* ColumnFormatEditDto — alanlar, alan detayıyla aynı sözleşme */ ], "Fields": [ /* ColumnFormatEditDto — alanlar, alan detayıyla aynı sözleşme */ ],
@ -657,15 +656,17 @@ saklanır. Dosya okunurken bu alanlar `ListForm`/`Fields` üzerinden geri doldur
| Alan | Anlam | | Alan | Anlam |
| --- | --- | | --- | --- |
> `LanguageText*` alanlarının tamamı dosyada `Language` başlığı altındadır. `ListForm` yalnızca > Dil metinlerinin tamamı dosyada `Language` başlığı altındadır; başlık zaten bölümü işaretlediği
> dil **anahtarını** taşır (`Title = "{ListFormCode}.Title"`), metinlerin tek kaynağı burasıdır. > için anahtarlar ortak `LanguageText` öneki olmadan yazılır (C# sözleşmesinde önek durur).
> `ListForm` yalnızca dil **anahtarını** taşır (`Title = "{ListFormCode}.Title"`), metinlerin tek
> kaynağı burasıdır.
| `PermissionGroupName` | Var olan grup ya da yeni grup adı. | | `PermissionGroupName` | Var olan grup ya da yeni grup adı. |
| `PermissionGroupDisplayNameEn` / `Tr` | Grup adıyla aynı dil anahtarına yazılır. Var olan grup seçilip boş bırakılırsa sunucu veritabanındaki değeri geri yazar. | | `Language.PermissionGroupEn` / `Tr` | Grup adıyla aynı dil anahtarına yazılır. Var olan grup seçilip boş bırakılırsa sunucu veritabanındaki değeri geri yazar. |
| `LanguageTextMenuEn` / `Tr` | Menü etiketi. | | `Language.MenuEn` / `Tr` | Menü etiketi. |
| `LanguageTextTitleEn` / `Tr` | Ekran başlığı (yalnızca List yolunda üretilir). | | `Language.TitleEn` / `Tr` | Ekran başlığı (yalnızca List yolunda üretilir). |
| `LanguageTextDescEn` / `Tr` | Ekran açıklaması (yalnızca List yolunda). | | `Language.DescEn` / `Tr` | Ekran açıklaması (yalnızca List yolunda). |
| `LanguageTextMenuParentEn` / `Tr` | Üst menü etiketi. | | `Language.MenuParentEn` / `Tr` | Üst menü etiketi. |
Üretilen yetkiler: `{MenuCode}` (okuma, kök) + List yolunda `.Create .Update .Delete .Export Üretilen yetkiler: `{MenuCode}` (okuma, kök) + List yolunda `.Create .Update .Delete .Export
.Import .Note`, Custom yolunda yalnızca `.Create .Update .Delete`. Hepsi admin rolüne grant .Import .Note`, Custom yolunda yalnızca `.Create .Update .Delete`. Hepsi admin rolüne grant
@ -719,7 +720,7 @@ kaynağı odur. Grup yapısı yalnızca düzenleme formunun yerleşimini belirle
Seed dosyasında `Groups` **kırpılmış** hâlde durur: grup başlığı/kolon sayısı ve alanların Seed dosyasında `Groups` **kırpılmış** hâlde durur: grup başlığı/kolon sayısı ve alanların
editör bilgileri `ListForm.EditingFormDto` ve `Fields` içinde olduğu için tekrarlanmaz; dosyada editör bilgileri `ListForm.EditingFormDto` ve `Fields` içinde olduğu için tekrarlanmaz; dosyada
her öğe yalnızca `FieldName`, `CaptionName` ve `TurkishCaption`/`EnglishCaption` taşır — çünkü her öğe yalnızca `FieldName`, `CaptionName` ve `En`/`Tr` taşır — çünkü
alan başlıklarının dil metinlerinin başka kaynağı yoktur. Okurken tümü geri doldurulur. alan başlıklarının dil metinlerinin başka kaynağı yoktur. Okurken tümü geri doldurulur.
Her `Items` öğesi: Her `Items` öğesi:
@ -728,7 +729,7 @@ Her `Items` öğesi:
| --- | --- | | --- | --- |
| `FieldName` | Veri kolonunun adı (SQL'deki adıyla birebir). | | `FieldName` | Veri kolonunun adı (SQL'deki adıyla birebir). |
| `CaptionName` | Dil anahtarı ya da düz başlık. | | `CaptionName` | Dil anahtarı ya da düz başlık. |
| `TurkishCaption` / `EnglishCaption` | Dil metinleri; ikisi de doldurulur. | | `En` / `Tr` | Alan başlığının dil metinleri; ikisi de doldurulur. |
| `EditorType` | `[Fields]` Bkz. §3. | | `EditorType` | `[Fields]` Bkz. §3. |
| `EditorOptions` | `[Fields]` DevExtreme editör JSON'u — §6. | | `EditorOptions` | `[Fields]` DevExtreme editör JSON'u — §6. |
| `EditorScript` | `[Fields]` Alan davranış script'i — §5. | | `EditorScript` | `[Fields]` Alan davranış script'i — §5. |
@ -754,7 +755,7 @@ Bir kolon `Groups[].Items[]` içine eklendiğinde varsayılanlar şöyle türeti
| `DbSourceType` | SQL tipinden `System.Data.DbType` karşılığına eşlenir (§3) | | `DbSourceType` | SQL tipinden `System.Data.DbType` karşılığına eşlenir (§3) |
| `IsRequired` | Kolon `NOT NULL` ise `true` | | `IsRequired` | Kolon `NOT NULL` ise `true` |
| Anahtar alan | `KeyFieldName` ilk grubun ilk alanı olarak `IncludeInEditingForm: false` ile eklenir (`DbSourceType` = `KeyFieldDbSourceType`); listede gizli sütun olur, forma girmez | | Anahtar alan | `KeyFieldName` ilk grubun ilk alanı olarak `IncludeInEditingForm: false` ile eklenir (`DbSourceType` = `KeyFieldDbSourceType`); listede gizli sütun olur, forma girmez |
| `TurkishCaption` / `EnglishCaption` | Kolon adı PascalCase'ten kelimelere ayrılır: `OrderNo``Order No` | | `En` / `Tr` | Kolon adı PascalCase'ten kelimelere ayrılır: `OrderNo``Order No` |
| `CaptionName` | `App.Listform.ListformField.{KolonAdı}` | | `CaptionName` | `App.Listform.ListformField.{KolonAdı}` |
| `ColSpan` | `1` | | `ColSpan` | `1` |
| `IncludeInEditingForm` | `true` | | `IncludeInEditingForm` | `true` |
@ -1059,13 +1060,13 @@ varsayılan değeri olur ve **yeni kayıtta o alanı otomatik doldurur**.
"Grid": true, "Card": true, "Pivot": true, "Chart": true, "Grid": true, "Card": true, "Pivot": true, "Chart": true,
"Tree": false, "Gantt": false, "Scheduler": false, "Todo": false, "Tree": false, "Gantt": false, "Scheduler": false, "Todo": false,
"LanguageTextMenuEn": "Orders", "LanguageTextMenuTr": "Siparişler", "MenuEn": "Orders", "MenuTr": "Siparişler",
"LanguageTextTitleEn": "Orders", "LanguageTextTitleTr": "Siparişler", "TitleEn": "Orders", "TitleTr": "Siparişler",
"LanguageTextDescEn": "Order list", "LanguageTextDescTr": "Sipariş listesi", "DescEn": "Order list", "DescTr": "Sipariş listesi",
"LanguageTextMenuParentEn": "MRP", "LanguageTextMenuParentTr": "MRP", "MenuParentEn": "MRP", "MenuParentTr": "MRP",
"PermissionGroupName": "App.Mrp", "PermissionGroupName": "App.Mrp",
"PermissionGroupDisplayNameEn": "MRP", "PermissionGroupDisplayNameTr": "MRP", "PermissionGroupEn": "MRP", "PermissionGroupTr": "MRP",
"MenuParentCode": "App.Mrp", "MenuParentModuleId": "MRP", "MenuParentIcon": "FcFactory", "MenuParentCode": "App.Mrp", "MenuParentModuleId": "MRP", "MenuParentIcon": "FcFactory",
"MenuIcon": "FcShipped", "MenuIcon": "FcShipped",
@ -1081,20 +1082,20 @@ varsayılan değeri olur ve **yeni kayıtta o alanı otomatik doldurur**.
"Items": [ "Items": [
{ {
"FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id",
"TurkishCaption": "Kimlik", "EnglishCaption": "Id", "Tr": "Kimlik", "En": "Id",
"EditorType": "dxTextBox", "DbSourceType": 11, "EditorType": "dxTextBox", "DbSourceType": 11,
"IsRequired": false, "IncludeInEditingForm": false, "ColSpan": 1 "IsRequired": false, "IncludeInEditingForm": false, "ColSpan": 1
}, },
{ {
"FieldName": "OrderNo", "CaptionName": "App.Listform.ListformField.OrderNo", "FieldName": "OrderNo", "CaptionName": "App.Listform.ListformField.OrderNo",
"TurkishCaption": "Sipariş No", "EnglishCaption": "Order No", "Tr": "Sipariş No", "En": "Order No",
"EditorType": "dxTextBox", "DbSourceType": 16, "EditorType": "dxTextBox", "DbSourceType": 16,
"IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1, "IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1,
"EditorOptions": "{\"showClearButton\":true,\"maxLength\":20}" "EditorOptions": "{\"showClearButton\":true,\"maxLength\":20}"
}, },
{ {
"FieldName": "CustomerId", "CaptionName": "App.Listform.ListformField.Customer", "FieldName": "CustomerId", "CaptionName": "App.Listform.ListformField.Customer",
"TurkishCaption": "Cari", "EnglishCaption": "Customer", "Tr": "Cari", "En": "Customer",
"EditorType": "dxSelectBox", "DbSourceType": 11, "EditorType": "dxSelectBox", "DbSourceType": 11,
"IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1, "IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1,
"LookupDataSourceType": 2, "LookupDataSourceType": 2,
@ -1103,21 +1104,21 @@ varsayılan değeri olur ve **yeni kayıtta o alanı otomatik doldurur**.
}, },
{ {
"FieldName": "Quantity", "CaptionName": "App.Listform.ListformField.Quantity", "FieldName": "Quantity", "CaptionName": "App.Listform.ListformField.Quantity",
"TurkishCaption": "Miktar", "EnglishCaption": "Quantity", "Tr": "Miktar", "En": "Quantity",
"EditorType": "dxNumberBox", "DbSourceType": 7, "EditorType": "dxNumberBox", "DbSourceType": 7,
"IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1, "IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1,
"EditorOptions": "{\"format\":{\"type\":\"fixedPoint\",\"precision\":2},\"showSpinButtons\":true}" "EditorOptions": "{\"format\":{\"type\":\"fixedPoint\",\"precision\":2},\"showSpinButtons\":true}"
}, },
{ {
"FieldName": "UnitPrice", "CaptionName": "App.Listform.ListformField.UnitPrice", "FieldName": "UnitPrice", "CaptionName": "App.Listform.ListformField.UnitPrice",
"TurkishCaption": "Birim Fiyat", "EnglishCaption": "Unit Price", "Tr": "Birim Fiyat", "En": "Unit Price",
"EditorType": "dxNumberBox", "DbSourceType": 7, "EditorType": "dxNumberBox", "DbSourceType": 7,
"IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1, "IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1,
"EditorOptions": "{\"format\":{\"type\":\"fixedPoint\",\"precision\":2}}" "EditorOptions": "{\"format\":{\"type\":\"fixedPoint\",\"precision\":2}}"
}, },
{ {
"FieldName": "Total", "CaptionName": "App.Listform.ListformField.Total", "FieldName": "Total", "CaptionName": "App.Listform.ListformField.Total",
"TurkishCaption": "Tutar", "EnglishCaption": "Total", "Tr": "Tutar", "En": "Total",
"EditorType": "dxNumberBox", "DbSourceType": 7, "EditorType": "dxNumberBox", "DbSourceType": 7,
"IsRequired": false, "IncludeInEditingForm": true, "ColSpan": 2, "IsRequired": false, "IncludeInEditingForm": true, "ColSpan": 2,
"EditorOptions": "{\"readOnly\":true,\"format\":{\"type\":\"fixedPoint\",\"precision\":2}}", "EditorOptions": "{\"readOnly\":true,\"format\":{\"type\":\"fixedPoint\",\"precision\":2}}",
@ -1519,8 +1520,8 @@ bölümünü doldurur.** Keşif turu (§0.6) soruları da bu adımlarla bire bir
| --- | --- | --- | --- | | --- | --- | --- | --- |
| 0 | Komponent Tipi | her zaman | `ComponentKind` (`0` List · `1` Custom) | | 0 | Komponent Tipi | her zaman | `ComponentKind` (`0` List · `1` Custom) |
| 1 | Custom Component | yalnız Custom yolu | `CustomComponentName`, `MenuUrl` (bileşenin `RoutePath`'i) | | 1 | Custom Component | yalnız Custom yolu | `CustomComponentName`, `MenuUrl` (bileşenin `RoutePath`'i) |
| 2 | Menü | her zaman | `WizardName`, `CreateMenu`, `MenuParentCode`, `MenuCode`, `LanguageTextMenuEn/Tr`, `PermissionGroupName` (+ görünen adlar), `MenuIcon`, `MenuOrder` | | 2 | Menü | her zaman | `WizardName`, `CreateMenu`, `MenuParentCode`, `MenuCode`, `Language.MenuEn/Tr`, `PermissionGroupName` (+ görünen adlar), `MenuIcon`, `MenuOrder` |
| 3 | Ayarlar | yalnız List yolu | `ListFormCode`, `DataSourceCode` (+`DataSourceConnectionString`), `SelectCommandType`, `SelectCommand`, `KeyFieldName`, `KeyFieldDbSourceType`, `IsTenant/IsBranch/IsOrganizationUnit`, `AllowAdding/Updating/Deleting`, `ConfirmDelete`, `AllowDetail`, `DefaultLayout` + 8 görünüm bayrağı, `LanguageTextTitleEn/Tr`, `LanguageTextDescEn/Tr` | | 3 | Ayarlar | yalnız List yolu | `ListFormCode`, `DataSourceCode` (+`DataSourceConnectionString`), `SelectCommandType`, `SelectCommand`, `KeyFieldName`, `KeyFieldDbSourceType`, `IsTenant/IsBranch/IsOrganizationUnit`, `AllowAdding/Updating/Deleting`, `ConfirmDelete`, `AllowDetail`, `DefaultLayout` + 8 görünüm bayrağı, `Language.TitleEn/Tr`, `Language.DescEn/Tr` |
| 4 | Alanlar | yalnız List | `Groups[]` (aşağıda) | | 4 | Alanlar | yalnız List | `Groups[]` (aşağıda) |
| 5 | Alt Formlar | yalnız List | `SubForms[]` | | 5 | Alt Formlar | yalnız List | `SubForms[]` |
| 6 | Widget'lar | yalnız List | `Widgets[]` | | 6 | Widget'lar | yalnız List | `Widgets[]` |
@ -2333,8 +2334,8 @@ Bileşen tek başına bir ekran değildir; menü ve yetki Wizard'ın `Custom` yo
"CreateMenu": true, "CreateMenu": true,
"MenuParentCode": "App.Mrp", "MenuParentCode": "App.Mrp",
"PermissionGroupName": "App.Mrp", "PermissionGroupName": "App.Mrp",
"PermissionGroupDisplayNameEn": "MRP", "PermissionGroupDisplayNameTr": "MRP", "PermissionGroupEn": "MRP", "PermissionGroupTr": "MRP",
"LanguageTextMenuEn": "Order Board", "LanguageTextMenuTr": "Sipariş Panosu", "MenuEn": "Order Board", "MenuTr": "Sipariş Panosu",
"MenuIcon": "FcKanban", "MenuOrder": 2 "MenuIcon": "FcKanban", "MenuOrder": 2
}, },
"IsDeletedField": false, "IsCreatedField": false, "IsDeletedField": false, "IsCreatedField": false,
@ -3510,8 +3511,8 @@ isteniyorsa geçilir.
6. **Yetki** — wizard `App.Hr.AdvanceRequests` kökünü ve `.Create/.Update/.Delete/.Export/ 6. **Yetki** — wizard `App.Hr.AdvanceRequests` kökünü ve `.Create/.Update/.Delete/.Export/
.Import/.Note` alt yetkilerini üretir. Onaylayanların rolüne kök + `.Update` verilir; .Import/.Note` alt yetkilerini üretir. Onaylayanların rolüne kök + `.Update` verilir;
talep sahiplerine kök + `.Create` yeter. talep sahiplerine kök + `.Create` yeter.
7. **Dil** — menü/başlık/açıklama metinleri wizard dosyasındaki `LanguageText*` alanlarından, 7. **Dil** — menü/başlık/açıklama metinleri wizard dosyasındaki `Language` bölümünden,
alan başlıkları her `Items` öğesinin `TurkishCaption`/`EnglishCaption` alanlarından üretilir. alan başlıkları her `Items` öğesinin `En`/`Tr` alanlarından üretilir.
Ayrıca `LanguagesData.json`'a dokunmaya gerek yoktur. Ayrıca `LanguagesData.json`'a dokunmaya gerek yoktur.
8. **Teslim** — dosyaları listele, DB Migrate gerektiğini söyle, §11 kontrol listesini geç. 8. **Teslim** — dosyaları listele, DB Migrate gerektiğini söyle, §11 kontrol listesini geç.

View file

@ -535,7 +535,7 @@ alanı taşımayan eski seed dosyaları etkilenmez.
**İzin grubu seçimi.** Menü adımında izin grubu bir seçim listesinden gelir **İzin grubu seçimi.** Menü adımında izin grubu bir seçim listesinden gelir
(`GetWizardPermissionGroups`). Görünen adlar, grup adıyla aynı olan dil anahtarının metinlerinden (`GetWizardPermissionGroups`). Görünen adlar, grup adıyla aynı olan dil anahtarının metinlerinden
okunur; seçim yapıldığında `PermissionGroupDisplayNameEn/Tr` forma doldurulur. Yeni bir grup okunur; seçim yapıldığında `PermissionGroupEn/Tr` forma doldurulur. Yeni bir grup
tanımlanırsa grup adıyla aynı dil anahtarına bu metinler yazılır; mevcut grup seçilip alanlar boş tanımlanırsa grup adıyla aynı dil anahtarına bu metinler yazılır; mevcut grup seçilip alanlar boş
bırakılırsa sunucu veritabanındaki değeri geri yazar. Böylece seed dosyası her durumda iki dilli bırakılırsa sunucu veritabanındaki değeri geri yazar. Böylece seed dosyası her durumda iki dilli
görünen adı taşır. görünen adı taşır.

View file

@ -66,7 +66,7 @@ public class GanttOptionDto
/// <summary> /// <summary>
/// Düzenlemeye izin verilsin mi /// Düzenlemeye izin verilsin mi
/// </summary> /// </summary>
public bool AllowEditing { get; set; } = false; public bool EditingEnabled { get; set; } = false;
/// <summary> /// <summary>
/// Task eklemeye izin verilsin mi /// Task eklemeye izin verilsin mi
/// </summary> /// </summary>

View file

@ -87,14 +87,14 @@ public class ListFormWizardDto
public bool Scheduler { get; set; } public bool Scheduler { get; set; }
public bool Todo { get; set; } public bool Todo { get; set; }
public string LanguageTextMenuEn { get; set; } public string MenuEn { get; set; }
public string LanguageTextMenuTr { get; set; } public string MenuTr { get; set; }
public string LanguageTextTitleEn { get; set; } public string TitleEn { get; set; }
public string LanguageTextTitleTr { get; set; } public string TitleTr { get; set; }
public string LanguageTextDescEn { get; set; } public string DescEn { get; set; }
public string LanguageTextDescTr { get; set; } public string DescTr { get; set; }
public string LanguageTextMenuParentEn { get; set; } public string MenuParentEn { get; set; }
public string LanguageTextMenuParentTr { get; set; } public string MenuParentTr { get; set; }
public string PermissionGroupName { get; set; } public string PermissionGroupName { get; set; }
@ -103,10 +103,10 @@ public class ListFormWizardDto
/// anahtarina bu metin yazilir; mevcut bir grup secildiginde bos gelirse sunucu veritabanindaki /// anahtarina bu metin yazilir; mevcut bir grup secildiginde bos gelirse sunucu veritabanindaki
/// degeri geri yazar, boylece seed dosyasi her durumda iki dilli gorunen adi tasir. /// degeri geri yazar, boylece seed dosyasi her durumda iki dilli gorunen adi tasir.
/// </summary> /// </summary>
public string PermissionGroupDisplayNameEn { get; set; } public string PermissionGroupEn { get; set; }
/// <summary>Izin grubunun Turkce gorunen adi; <see cref="PermissionGroupDisplayNameEn"/> ile ayni kurallara tabidir.</summary> /// <summary>Izin grubunun Turkce gorunen adi; <see cref="PermissionGroupEn"/> ile ayni kurallara tabidir.</summary>
public string PermissionGroupDisplayNameTr { get; set; } public string PermissionGroupTr { get; set; }
public string MenuParentModuleId { get; set; } public string MenuParentModuleId { get; set; }
public string MenuParentCode { get; set; } public string MenuParentCode { get; set; }

View file

@ -96,14 +96,17 @@ public class WizardSeedFileDto
nameof(WizardColumnItemInputDto.LookupQuery), nameof(WizardColumnItemInputDto.LookupQuery),
]; ];
/// <summary>Dosyada `Menu` basligi altinda toplanan wizard alanlari.</summary> /// <summary>Dosyada `Menu` basligi altinda toplanan wizard alanlari; adlari degismez.</summary>
private static readonly string[] MenuKeys = private static readonly (string Property, string SeedKey)[] MenuKeys =
[ [
nameof(ListFormWizardDto.CreateMenu), nameof(ListFormWizardDto.MenuCode), nameof(ListFormWizardDto.MenuOrder), Same(nameof(ListFormWizardDto.MenuParentCode)), Same(nameof(ListFormWizardDto.MenuParentIcon)),
nameof(ListFormWizardDto.MenuUrl), nameof(ListFormWizardDto.MenuIcon), nameof(ListFormWizardDto.MenuParentCode), Same(nameof(ListFormWizardDto.CreateMenu)), Same(nameof(ListFormWizardDto.MenuCode)),
nameof(ListFormWizardDto.MenuParentIcon), Same(nameof(ListFormWizardDto.MenuOrder)), Same(nameof(ListFormWizardDto.MenuUrl)),
Same(nameof(ListFormWizardDto.MenuIcon)),
]; ];
private static (string Property, string SeedKey) Same(string key) => (key, key);
/// <summary> /// <summary>
/// Dosyada daha okunakli adla yazilan alanlar. Modul, wizard'in ana bilgisidir; menu ve /// Dosyada daha okunakli adla yazilan alanlar. Modul, wizard'in ana bilgisidir; menu ve
/// yetkilerin hangi modul altinda filtrelenecegini belirler. /// yetkilerin hangi modul altinda filtrelenecegini belirler.
@ -125,22 +128,33 @@ public class WizardSeedFileDto
[ [
nameof(ListFormWizardDto.ComponentKind), nameof(ListFormWizardDto.WizardName), WizardCodeKey, nameof(ListFormWizardDto.ComponentKind), nameof(ListFormWizardDto.WizardName), WizardCodeKey,
nameof(ListFormWizardDto.SeededAt), nameof(ListFormWizardDto.CustomComponentName), nameof(ListFormWizardDto.SeededAt), nameof(ListFormWizardDto.CustomComponentName),
nameof(ListFormWizardDto.PermissionGroupName), nameof(ListFormWizardDto.PermissionGroupDisplayNameEn), nameof(ListFormWizardDto.PermissionGroupName), "ModuleId",
nameof(ListFormWizardDto.PermissionGroupDisplayNameTr), "ModuleId",
nameof(ListFormWizardDto.DataSourceConnectionString), nameof(ListFormWizardDto.DataSourceConnectionString),
MenuSection, LanguageSection, nameof(ListFormWizardDto.Groups), MenuSection, LanguageSection, nameof(ListFormWizardDto.Groups),
]; ];
/// <summary> /// <summary>
/// Dosyada `Language` basligi altinda toplanan dil metinleri. ListForm yalnizca dil /// Dosyada `Language` basligi altinda toplanan dil metinleri: menu, ekran ve izin grubunun
/// anahtarini tasir (`Title = "{ListFormCode}.Title"`); metinlerin tek kaynagi burasidir. /// iki dilli gorunen adlari. ListForm yalnizca dil anahtarini tasir
/// (`Title = "{ListFormCode}.Title"`); metinlerin tek kaynagi burasidir.
/// </summary> /// </summary>
private static readonly string[] LanguageKeys = private static readonly (string Property, string SeedKey)[] LanguageKeys =
[ [
nameof(ListFormWizardDto.LanguageTextMenuEn), nameof(ListFormWizardDto.LanguageTextMenuTr), Same(nameof(ListFormWizardDto.MenuParentEn)), Same(nameof(ListFormWizardDto.MenuParentTr)),
nameof(ListFormWizardDto.LanguageTextTitleEn), nameof(ListFormWizardDto.LanguageTextTitleTr), Same(nameof(ListFormWizardDto.PermissionGroupEn)), Same(nameof(ListFormWizardDto.PermissionGroupTr)),
nameof(ListFormWizardDto.LanguageTextDescEn), nameof(ListFormWizardDto.LanguageTextDescTr), Same(nameof(ListFormWizardDto.MenuEn)), Same(nameof(ListFormWizardDto.MenuTr)),
nameof(ListFormWizardDto.LanguageTextMenuParentEn), nameof(ListFormWizardDto.LanguageTextMenuParentTr), Same(nameof(ListFormWizardDto.TitleEn)), Same(nameof(ListFormWizardDto.TitleTr)),
Same(nameof(ListFormWizardDto.DescEn)), Same(nameof(ListFormWizardDto.DescTr)),
];
/// <summary>
/// Alan basliginin iki dilli metinleri. Oge zaten bir alan tanimi oldugu icin dosyada dilin
/// adiyla degil koduyla yazilir.
/// </summary>
private static readonly (string Property, string SeedKey)[] CaptionKeys =
[
(nameof(WizardColumnItemInputDto.EnglishCaption), "En"),
(nameof(WizardColumnItemInputDto.TurkishCaption), "Tr"),
]; ];
private const string MenuSection = "Menu"; private const string MenuSection = "Menu";
@ -203,6 +217,12 @@ public class WizardSeedFileDto
foreach (var (property, seedKey) in RenamedKeys) foreach (var (property, seedKey) in RenamedKeys)
Rename(wizardNode, property, seedKey); Rename(wizardNode, property, seedKey);
foreach (var item in ItemNodes(wizardNode))
{
foreach (var (property, seedKey) in CaptionKeys)
Rename(item, property, seedKey);
}
MoveIntoSection(wizardNode, MenuSection, MenuKeys); MoveIntoSection(wizardNode, MenuSection, MenuKeys);
MoveIntoSection(wizardNode, LanguageSection, LanguageKeys); MoveIntoSection(wizardNode, LanguageSection, LanguageKeys);
@ -221,16 +241,29 @@ public class WizardSeedFileDto
var node = JsonNode.Parse(json); var node = JsonNode.Parse(json);
if (node?[nameof(Wizard)] is JsonObject wizardNode) if (node?[nameof(Wizard)] is JsonObject wizardNode)
{ {
FlattenSection(wizardNode, MenuSection); FlattenSection(wizardNode, MenuSection, MenuKeys);
FlattenSection(wizardNode, LanguageSection); FlattenSection(wizardNode, LanguageSection, LanguageKeys);
foreach (var (property, seedKey) in RenamedKeys) foreach (var (property, seedKey) in RenamedKeys)
Rename(wizardNode, seedKey, property); Rename(wizardNode, seedKey, property);
foreach (var item in ItemNodes(wizardNode))
{
foreach (var (property, seedKey) in CaptionKeys)
Rename(item, seedKey, property);
}
} }
return node.Deserialize<WizardSeedFileDto>(SeedReadOptions)?.Rehydrate(); return node.Deserialize<WizardSeedFileDto>(SeedReadOptions)?.Rehydrate();
} }
/// <summary>Wizard bolumundeki tum grup ogeleri; ad donusumu her ogeye ayni sekilde uygulanir.</summary>
private static IEnumerable<JsonObject> ItemNodes(JsonObject wizard) =>
(wizard[nameof(ListFormWizardDto.Groups)] as JsonArray ?? [])
.OfType<JsonObject>()
.SelectMany(g => g[nameof(WizardColumnGroupInputDto.Items)] as JsonArray ?? [])
.OfType<JsonObject>();
private static void Rename(JsonObject wizard, string from, string to) private static void Rename(JsonObject wizard, string from, string to)
{ {
if (wizard.Remove(from, out var value)) if (wizard.Remove(from, out var value))
@ -255,13 +288,13 @@ public class WizardSeedFileDto
} }
/// <summary>Verilen anahtarlari wizard bolumunden alip tek bir baslik altina tasir.</summary> /// <summary>Verilen anahtarlari wizard bolumunden alip tek bir baslik altina tasir.</summary>
private static void MoveIntoSection(JsonObject wizard, string section, string[] keys) private static void MoveIntoSection(JsonObject wizard, string section, (string Property, string SeedKey)[] keys)
{ {
var target = new JsonObject(); var target = new JsonObject();
foreach (var key in keys) foreach (var (property, seedKey) in keys)
{ {
if (wizard.Remove(key, out var value)) if (wizard.Remove(property, out var value))
target[key] = value; target[seedKey] = value;
} }
if (target.Count > 0) if (target.Count > 0)
@ -269,15 +302,15 @@ public class WizardSeedFileDto
} }
/// <summary>Baslik altindaki alanlari wizard bolumune geri tasir.</summary> /// <summary>Baslik altindaki alanlari wizard bolumune geri tasir.</summary>
private static void FlattenSection(JsonObject wizard, string section) private static void FlattenSection(JsonObject wizard, string section, (string Property, string SeedKey)[] keys)
{ {
if (!wizard.Remove(section, out var value) || value is not JsonObject group) if (!wizard.Remove(section, out var value) || value is not JsonObject group)
return; return;
foreach (var key in group.Select(x => x.Key).ToArray()) foreach (var (property, seedKey) in keys)
{ {
if (group.Remove(key, out var item)) if (group.Remove(seedKey, out var item))
wizard[key] = item; wizard[property] = item;
} }
} }

View file

@ -125,13 +125,13 @@ public class ListFormWizardAppService(
var inserted = new WizardInsertedRecordsDto(); var inserted = new WizardInsertedRecordsDto();
//Dil - Language Keys //Dil - Language Keys
await CreateLangKey(nameLangKey, input.LanguageTextMenuEn, input.LanguageTextMenuTr, inserted); await CreateLangKey(nameLangKey, input.MenuEn, input.MenuTr, inserted);
// Title/Desc anahtarları yalnızca ListForm tarafından tüketilir; Custom yolunda // Title/Desc anahtarları yalnızca ListForm tarafından tüketilir; Custom yolunda
// öksüz kayıt bırakmamak için üretilmez. // öksüz kayıt bırakmamak için üretilmez.
if (!isCustomComponent) if (!isCustomComponent)
{ {
await CreateLangKey(titleLangKey, input.LanguageTextTitleEn, input.LanguageTextTitleTr, inserted); await CreateLangKey(titleLangKey, input.TitleEn, input.TitleTr, inserted);
await CreateLangKey(descLangKey, input.LanguageTextDescEn, input.LanguageTextDescTr, inserted); await CreateLangKey(descLangKey, input.DescEn, input.DescTr, inserted);
} }
//Permission Group //Permission Group
@ -234,7 +234,7 @@ public class ListFormWizardAppService(
: !string.IsNullOrWhiteSpace(input.MenuIcon) : !string.IsNullOrWhiteSpace(input.MenuIcon)
? input.MenuIcon ? input.MenuIcon
: WizardConsts.MenuIcon; : WizardConsts.MenuIcon;
await CreateLangKey(input.MenuParentCode, input.LanguageTextMenuParentEn, input.LanguageTextMenuParentTr, inserted); await CreateLangKey(input.MenuParentCode, input.MenuParentEn, input.MenuParentTr, inserted);
menuParent = await repoMenu.InsertAsync(new Menu menuParent = await repoMenu.InsertAsync(new Menu
{ {
Code = input.MenuParentCode, Code = input.MenuParentCode,
@ -1445,20 +1445,24 @@ public class ListFormWizardAppService(
/// </summary> /// </summary>
private async Task ApplyPermissionGroupAsync(ListFormWizardDto input, string groupName, WizardInsertedRecordsDto inserted) private async Task ApplyPermissionGroupAsync(ListFormWizardDto input, string groupName, WizardInsertedRecordsDto inserted)
{ {
var displayEn = input.PermissionGroupDisplayNameEn?.Trim(); var displayEn = input.PermissionGroupEn?.Trim();
var displayTr = input.PermissionGroupDisplayNameTr?.Trim(); var displayTr = input.PermissionGroupTr?.Trim();
if (!await repoPermGroup.AnyAsync(a => a.Name == groupName)) if (!await repoPermGroup.AnyAsync(a => a.Name == groupName))
{ {
await repoPermGroup.InsertAsync(new PermissionGroupDefinitionRecord(GuidGenerator.Create(), groupName, groupName), autoSave: false); await repoPermGroup.InsertAsync(new PermissionGroupDefinitionRecord(GuidGenerator.Create(), groupName, groupName), autoSave: false);
// Grup adi ust menu koduyla ayniysa dil anahtari menu metinleriyle zaten uretilir; // Grup adi ust menu koduyla ayniysa anahtar menu adiyla ortaktir; metin varsa uzerine
// burada uzerine yazmak menu adini bozar. // yazmak menu adini bozar, ust menu daha once baska bir wizard'la olustuysa metin hic
// uretilmemis olabilir - o durumda menu metinleriyle tamamlanir.
if (string.Equals(groupName, input.MenuParentCode, StringComparison.OrdinalIgnoreCase)) if (string.Equals(groupName, input.MenuParentCode, StringComparison.OrdinalIgnoreCase))
{ {
await EnsureLangKey(groupName, inserted); displayEn = string.IsNullOrWhiteSpace(displayEn) ? input.MenuParentEn?.Trim() : displayEn;
displayEn = string.IsNullOrWhiteSpace(displayEn) ? input.LanguageTextMenuParentEn?.Trim() : displayEn; displayTr = string.IsNullOrWhiteSpace(displayTr) ? input.MenuParentTr?.Trim() : displayTr;
displayTr = string.IsNullOrWhiteSpace(displayTr) ? input.LanguageTextMenuParentTr?.Trim() : displayTr;
var (menuEn, menuTr) = await GetLangTextsAsync(groupName);
if (string.IsNullOrWhiteSpace(menuEn) || string.IsNullOrWhiteSpace(menuTr))
await CreateLangKey(groupName, displayEn ?? groupName, displayTr ?? groupName, inserted);
} }
else else
{ {
@ -1484,8 +1488,8 @@ public class ListFormWizardAppService(
await CreateLangKey(groupName, displayEn, displayTr, inserted); await CreateLangKey(groupName, displayEn, displayTr, inserted);
} }
input.PermissionGroupDisplayNameEn = string.IsNullOrWhiteSpace(displayEn) ? groupName : displayEn; input.PermissionGroupEn = string.IsNullOrWhiteSpace(displayEn) ? groupName : displayEn;
input.PermissionGroupDisplayNameTr = string.IsNullOrWhiteSpace(displayTr) ? groupName : displayTr; input.PermissionGroupTr = string.IsNullOrWhiteSpace(displayTr) ? groupName : displayTr;
} }
/// <summary>Bir dil anahtarinin Ingilizce/Turkce metinlerini dondurur; yoksa null.</summary> /// <summary>Bir dil anahtarinin Ingilizce/Turkce metinlerini dondurur; yoksa null.</summary>
@ -1541,16 +1545,4 @@ public class ListFormWizardAppService(
return existing; return existing;
} }
private async Task<LanguageKey> EnsureLangKey(string key, WizardInsertedRecordsDto inserted = null)
{
var res = PlatformConsts.AppName;
var existing = await repoLangKey.FirstOrDefaultAsync(a => a.ResourceName == res && a.Key == key);
if (existing != null) return existing;
existing = await repoLangKey.InsertAsync(new LanguageKey { ResourceName = res, Key = key }, autoSave: true);
inserted?.LanguageKeys.Add(key);
return existing;
}
} }

View file

@ -5262,6 +5262,12 @@
"en": "Allow Updating", "en": "Allow Updating",
"tr": "Güncellemeye İzin Ver" "tr": "Güncellemeye İzin Ver"
}, },
{
"resourceName": "Platform",
"key": "App.ListFormEdit.EditingEnabled",
"en": "Gantt Editing Enabled",
"tr": "Gantt Düzenleme Etkin"
},
{ {
"resourceName": "Platform", "resourceName": "Platform",
"key": "App.ListFormEdit.AllowEditing", "key": "App.ListFormEdit.AllowEditing",
@ -5295,8 +5301,8 @@
{ {
"resourceName": "Platform", "resourceName": "Platform",
"key": "App.ListFormEdit.AllowTaskResourceUpdating", "key": "App.ListFormEdit.AllowTaskResourceUpdating",
"en": "Allow Task Resource Updating", "en": "Resource Editing Enabled",
"tr": "Görev Kaynaklarını Güncelleme İzni" "tr": "Görev Kaynak Güncelleme İzni"
}, },
{ {
"resourceName": "Platform", "resourceName": "Platform",

View file

@ -150,7 +150,12 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
if (alreadySeeded) if (alreadySeeded)
{ {
_logger.LogInformation("[{File}] '{WizardName}' already exists, skipped.", fileName, wizardName); // Ekran kurulu olsa da dil metinleri eksik kalmis olabilir: seed dosyasina yeni
// bir alan eklendiginde ya da ekran seeder disinda olustugunda sutun basliklari
// ham anahtar olarak gorunur. Mevcut metinlerin uzerine yazilmadigi icin bu
// tamamlama ekrani degistirmez.
await SeedLanguageTextsAsync(seedFile.Wizard, isCustomComponent);
_logger.LogInformation("[{File}] '{WizardName}' already exists, only missing language texts were created.", fileName, wizardName);
continue; continue;
} }
@ -172,9 +177,7 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
var code = input.ResolveMenuCode(); var code = input.ResolveMenuCode();
var listFormCode = input.ResolveListFormCode(); var listFormCode = input.ResolveListFormCode();
var titleLangKey = $"{listFormCode}.Title";
var nameLangKey = code; var nameLangKey = code;
var descLangKey = $"{listFormCode}.Desc";
var permCreateName = $"{code}.Create"; var permCreateName = $"{code}.Create";
var permUpdateName = $"{code}.Update"; var permUpdateName = $"{code}.Update";
var permDeleteName = $"{code}.Delete"; var permDeleteName = $"{code}.Delete";
@ -187,16 +190,10 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
var customRoutePath = NormalizeSeedCustomRoutePath(input); var customRoutePath = NormalizeSeedCustomRoutePath(input);
// Dil - Language Keys // Dil - Language Keys
await CreateLangKeyAsync(nameLangKey, input.LanguageTextMenuEn, input.LanguageTextMenuTr); await SeedLanguageTextsAsync(input, isCustomComponent);
if (!isCustomComponent)
{
await CreateLangKeyAsync(titleLangKey, input.LanguageTextTitleEn, input.LanguageTextTitleTr);
await CreateLangKeyAsync(descLangKey, input.LanguageTextDescEn, input.LanguageTextDescTr);
}
// Permission Group // Permission Group - gorunen adin dil anahtari SeedLanguageTextsAsync icinde uretilir.
// Menuye eklenmeyen wizard'da izin grubu sorulmaz; bos geldiginde varsayilan gruba dusar. var groupName = ResolvePermissionGroupName(input);
var groupName = string.IsNullOrWhiteSpace(input.PermissionGroupName) ? AppName : input.PermissionGroupName.Trim();
input.PermissionGroupName = groupName; input.PermissionGroupName = groupName;
if (!await _repoPermGroup.AnyAsync(a => a.Name == groupName)) if (!await _repoPermGroup.AnyAsync(a => a.Name == groupName))
{ {
@ -204,13 +201,6 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
new PermissionGroupDefinitionRecord(Guid.NewGuid(), groupName, groupName), autoSave: true); new PermissionGroupDefinitionRecord(Guid.NewGuid(), groupName, groupName), autoSave: true);
} }
// Grup adi ust menu koduyla ayniysa dil anahtari menu metinleriyle uretilir; aksi halde
// gorunen adlar yazilir. CreateLangKeyAsync mevcut metinlerin uzerine yazmaz.
if (string.Equals(groupName, input.MenuParentCode, StringComparison.OrdinalIgnoreCase))
await EnsureLangKeyAsync(groupName);
else
await CreateLangKeyAsync(groupName, input.PermissionGroupDisplayNameEn?.Trim(), input.PermissionGroupDisplayNameTr?.Trim());
// Permissions - tek seferde mevcut permission'ları çek, sonra her birini kontrol et // Permissions - tek seferde mevcut permission'ları çek, sonra her birini kontrol et
var permQueryable = await _repoPerm.GetQueryableAsync(); var permQueryable = await _repoPerm.GetQueryableAsync();
var existingPerms = permQueryable.Where(a => a.GroupName == groupName).ToList(); var existingPerms = permQueryable.Where(a => a.GroupName == groupName).ToList();
@ -287,7 +277,6 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
: !string.IsNullOrWhiteSpace(input.MenuIcon) : !string.IsNullOrWhiteSpace(input.MenuIcon)
? input.MenuIcon ? input.MenuIcon
: WizardConsts.MenuIcon; : WizardConsts.MenuIcon;
await CreateLangKeyAsync(input.MenuParentCode, input.LanguageTextMenuParentEn, input.LanguageTextMenuParentTr);
menuParent = await _repoMenu.InsertAsync(new Menu menuParent = await _repoMenu.InsertAsync(new Menu
{ {
Code = input.MenuParentCode, Code = input.MenuParentCode,
@ -382,12 +371,6 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
await _repoListFormField.InsertAsync(field, autoSave: true); await _repoListFormField.InsertAsync(field, autoSave: true);
} }
// Alan basliklarinin iki dilli metinleri yalnizca wizard bolumunde tasinir.
foreach (var item in input.Groups.SelectMany(g => g.Items))
{
await CreateLangKeyAsync(item.CaptionName, item.EnglishCaption, item.TurkishCaption);
}
foreach (var criteria in seedFile.ListForm.WorkflowDto.Criteria) foreach (var criteria in seedFile.ListForm.WorkflowDto.Criteria)
{ {
if (string.IsNullOrWhiteSpace(criteria.Id)) if (string.IsNullOrWhiteSpace(criteria.Id))
@ -486,6 +469,57 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
} }
/// <summary>
/// Wizard'in urettigi ekranin dil metinleri: menu adi, ust menu adi, izin grubu gorunen adi,
/// ekran basligi/aciklamasi ve alan basliklari. Ekran kurulumundan bagimsiz calisir; boylece
/// zaten kurulu bir ekranda eksik kalan anahtarlar da her seed calismasinda tamamlanir.
/// </summary>
private async Task SeedLanguageTextsAsync(ListFormWizardDto input, bool isCustomComponent)
{
await CreateLangKeyAsync(input.ResolveMenuCode(), input.MenuEn, input.MenuTr);
// Ust menu ve izin grubu paylasilan kayitlardir: ilk wizard onlari uretmis olsa bile dil
// metinleri eksik kalabilir, bu yuzden menu/grup kaydinin varligindan bagimsiz yazilir.
if (input.CreateMenu)
await CreateLangKeyAsync(input.MenuParentCode, input.MenuParentEn, input.MenuParentTr);
var groupName = ResolvePermissionGroupName(input);
// Grup adi ust menu koduyla ayniysa anahtar tektir; menu adi ile izin grubu adi ayni
// metni gosterir, ayrica gorunen ad girilmediyse menu metinlerine duser.
if (!string.Equals(groupName, input.MenuParentCode, StringComparison.OrdinalIgnoreCase))
{
await CreateLangKeyAsync(groupName, input.PermissionGroupEn?.Trim(), input.PermissionGroupTr?.Trim());
}
else
{
await CreateLangKeyAsync(groupName,
input.PermissionGroupEn?.Trim() ?? input.MenuParentEn,
input.PermissionGroupTr?.Trim() ?? input.MenuParentTr);
}
// Custom yolunda ListForm ekosistemi (baslik, aciklama, alan basliklari) uretilmez.
if (isCustomComponent)
return;
var listFormCode = input.ResolveListFormCode();
await CreateLangKeyAsync($"{listFormCode}.Title", input.TitleEn, input.TitleTr);
await CreateLangKeyAsync($"{listFormCode}.Desc", input.DescEn, input.DescTr);
// Alan basliklarinin iki dilli metinleri yalnizca wizard bolumunde tasinir.
foreach (var item in (input.Groups ?? []).SelectMany(g => g.Items ?? []))
{
await CreateLangKeyAsync(item.CaptionName, item.EnglishCaption, item.TurkishCaption);
}
}
/// <summary>
/// Yetkilerin toplanacagi izin grubu adi. Menuye eklenmeyen wizard'da grup sorulmaz; bos
/// geldiginde varsayilan uygulama grubuna duser.
/// </summary>
private static string ResolvePermissionGroupName(ListFormWizardDto input) =>
string.IsNullOrWhiteSpace(input.PermissionGroupName) ? AppName : input.PermissionGroupName.Trim();
private async Task CreateLangKeyAsync(string key, string textEn, string textTr) private async Task CreateLangKeyAsync(string key, string textEn, string textTr)
{ {
if (string.IsNullOrWhiteSpace(key)) return; if (string.IsNullOrWhiteSpace(key)) return;
@ -519,16 +553,6 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
}, autoSave: true); }, autoSave: true);
} }
} }
private async Task EnsureLangKeyAsync(string key)
{
if (string.IsNullOrWhiteSpace(key)) return;
if (!await _repoLangKey.AnyAsync(a => a.ResourceName == _appName && a.Key == key))
{
await _repoLangKey.InsertAsync(new LanguageKey { ResourceName = _appName, Key = key }, autoSave: true);
}
}
} }

View file

@ -6,26 +6,26 @@
"SeededAt": "2026-09-02T11:24:22.3331299\u002B03:00", "SeededAt": "2026-09-02T11:24:22.3331299\u002B03:00",
"CustomComponentName": null, "CustomComponentName": null,
"PermissionGroupName": "App.Wizard.Sales", "PermissionGroupName": "App.Wizard.Sales",
"PermissionGroupDisplayNameEn": "Sales",
"PermissionGroupDisplayNameTr": "Sat\u0131\u015F",
"ModuleId": "Sal", "ModuleId": "Sal",
"Menu": { "Menu": {
"MenuParentCode": "App.Wizard.Sales",
"MenuParentIcon": "FcAssistant",
"MenuCode": "App.Wizard.Approval", "MenuCode": "App.Wizard.Approval",
"MenuOrder": 1, "MenuOrder": 1,
"MenuUrl": "/admin/list/App.Wizard.Approval", "MenuUrl": "/admin/list/App.Wizard.Approval",
"MenuIcon": "FcBadDecision", "MenuIcon": "FcBadDecision"
"MenuParentCode": "App.Wizard.Sales",
"MenuParentIcon": "FcAssistant"
}, },
"Language": { "Language": {
"LanguageTextMenuEn": "Approval", "MenuParentEn": "Sales",
"LanguageTextMenuTr": "Approval", "MenuParentTr": "Sat\u0131\u015F",
"LanguageTextTitleEn": "Approval", "PermissionGroupEn": "Sales",
"LanguageTextTitleTr": "Approval", "PermissionGroupTr": "Sat\u0131\u015F",
"LanguageTextDescEn": "Approval", "MenuEn": "Approval",
"LanguageTextDescTr": "Approval", "MenuTr": "Approval",
"LanguageTextMenuParentEn": "Sales", "TitleEn": "Approval",
"LanguageTextMenuParentTr": "Sat\u0131\u015F" "TitleTr": "Approval",
"DescEn": "Approval",
"DescTr": "Approval"
}, },
"Groups": [ "Groups": [
{ {
@ -33,38 +33,38 @@
{ {
"FieldName": "Id", "FieldName": "Id",
"CaptionName": "App.Listform.ListformField.Id", "CaptionName": "App.Listform.ListformField.Id",
"TurkishCaption": "Id", "En": "Id",
"EnglishCaption": "Id" "Tr": "Id"
}, },
{ {
"FieldName": "UserName", "FieldName": "UserName",
"CaptionName": "App.Listform.ListformField.UserName", "CaptionName": "App.Listform.ListformField.UserName",
"TurkishCaption": "User Name", "En": "User Name",
"EnglishCaption": "User Name" "Tr": "User Name"
}, },
{ {
"FieldName": "Status", "FieldName": "Status",
"CaptionName": "App.Listform.ListformField.Status", "CaptionName": "App.Listform.ListformField.Status",
"TurkishCaption": "Status", "En": "Status",
"EnglishCaption": "Status" "Tr": "Status"
}, },
{ {
"FieldName": "Date", "FieldName": "Date",
"CaptionName": "App.Listform.ListformField.Date", "CaptionName": "App.Listform.ListformField.Date",
"TurkishCaption": "Date", "En": "Date",
"EnglishCaption": "Date" "Tr": "Date"
}, },
{ {
"FieldName": "Description", "FieldName": "Description",
"CaptionName": "App.Listform.ListformField.Description", "CaptionName": "App.Listform.ListformField.Description",
"TurkishCaption": "Description", "En": "Description",
"EnglishCaption": "Description" "Tr": "Description"
}, },
{ {
"FieldName": "Text", "FieldName": "Text",
"CaptionName": "App.Listform.ListformField.Text", "CaptionName": "App.Listform.ListformField.Text",
"TurkishCaption": "Text", "En": "Text",
"EnglishCaption": "Text" "Tr": "Text"
} }
] ]
} }
@ -214,7 +214,7 @@
"StartExpr": null, "StartExpr": null,
"EndExpr": null, "EndExpr": null,
"ProgressExpr": null, "ProgressExpr": null,
"AllowEditing": false, "EditingEnabled": false,
"AllowTaskAdding": false, "AllowTaskAdding": false,
"AllowTaskUpdating": false, "AllowTaskUpdating": false,
"AllowTaskResourceUpdating": false, "AllowTaskResourceUpdating": false,

View file

@ -6,26 +6,26 @@
"SeededAt": "2026-09-01T09:05:00", "SeededAt": "2026-09-01T09:05:00",
"CustomComponentName": "", "CustomComponentName": "",
"PermissionGroupName": "App.Prj", "PermissionGroupName": "App.Prj",
"PermissionGroupDisplayNameEn": "Project",
"PermissionGroupDisplayNameTr": "Proje",
"ModuleId": "Prj", "ModuleId": "Prj",
"Menu": { "Menu": {
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline",
"MenuCode": "App.Prj.Customers", "MenuCode": "App.Prj.Customers",
"MenuOrder": 4, "MenuOrder": 4,
"MenuUrl": "/admin/list/App.Prj.Customers", "MenuUrl": "/admin/list/App.Prj.Customers",
"MenuIcon": "FcBusinessContact", "MenuIcon": "FcBusinessContact"
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline"
}, },
"Language": { "Language": {
"LanguageTextMenuEn": "Customers", "MenuParentEn": "Project",
"LanguageTextMenuTr": "M\u00FC\u015Fteriler", "MenuParentTr": "Proje",
"LanguageTextTitleEn": "Customers", "PermissionGroupEn": "Project",
"LanguageTextTitleTr": "M\u00FC\u015Fteriler", "PermissionGroupTr": "Proje",
"LanguageTextDescEn": "Customers linked to tasks", "MenuEn": "Customers",
"LanguageTextDescTr": "G\u00F6revlerin ba\u011Fl\u0131 oldu\u011Fu m\u00FC\u015Fteriler", "MenuTr": "M\u00FC\u015Fteriler",
"LanguageTextMenuParentEn": "Project", "TitleEn": "Customers",
"LanguageTextMenuParentTr": "Proje" "TitleTr": "M\u00FC\u015Fteriler",
"DescEn": "Customers linked to tasks",
"DescTr": "G\u00F6revlerin ba\u011Fl\u0131 oldu\u011Fu m\u00FC\u015Fteriler"
}, },
"Groups": [ "Groups": [
{ {
@ -33,32 +33,32 @@
{ {
"FieldName": "Id", "FieldName": "Id",
"CaptionName": "App.Listform.ListformField.Id", "CaptionName": "App.Listform.ListformField.Id",
"TurkishCaption": "Kimlik", "En": "Id",
"EnglishCaption": "Id" "Tr": "Kimlik"
}, },
{ {
"FieldName": "Name", "FieldName": "Name",
"CaptionName": "App.Listform.ListformField.Name", "CaptionName": "App.Listform.ListformField.Name",
"TurkishCaption": "M\u00FC\u015Fteri", "En": "Customer",
"EnglishCaption": "Customer" "Tr": "M\u00FC\u015Fteri"
}, },
{ {
"FieldName": "ContactName", "FieldName": "ContactName",
"CaptionName": "App.Listform.ListformField.ContactName", "CaptionName": "App.Listform.ListformField.ContactName",
"TurkishCaption": "\u0130lgili Ki\u015Fi", "En": "Contact",
"EnglishCaption": "Contact" "Tr": "\u0130lgili Ki\u015Fi"
}, },
{ {
"FieldName": "Email", "FieldName": "Email",
"CaptionName": "App.Listform.ListformField.Email", "CaptionName": "App.Listform.ListformField.Email",
"TurkishCaption": "E-posta", "En": "Email",
"EnglishCaption": "Email" "Tr": "E-posta"
}, },
{ {
"FieldName": "Phone", "FieldName": "Phone",
"CaptionName": "App.Listform.ListformField.Phone", "CaptionName": "App.Listform.ListformField.Phone",
"TurkishCaption": "Telefon", "En": "Phone",
"EnglishCaption": "Phone" "Tr": "Telefon"
} }
] ]
} }
@ -236,7 +236,7 @@
"StartExpr": null, "StartExpr": null,
"EndExpr": null, "EndExpr": null,
"ProgressExpr": null, "ProgressExpr": null,
"AllowEditing": false, "EditingEnabled": false,
"AllowTaskAdding": false, "AllowTaskAdding": false,
"AllowTaskUpdating": false, "AllowTaskUpdating": false,
"AllowTaskResourceUpdating": false, "AllowTaskResourceUpdating": false,

View file

@ -6,26 +6,26 @@
"SeededAt": "2026-09-01T09:04:00", "SeededAt": "2026-09-01T09:04:00",
"CustomComponentName": "", "CustomComponentName": "",
"PermissionGroupName": "App.Prj", "PermissionGroupName": "App.Prj",
"PermissionGroupDisplayNameEn": "Project",
"PermissionGroupDisplayNameTr": "Proje",
"ModuleId": "Prj", "ModuleId": "Prj",
"Menu": { "Menu": {
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline",
"MenuCode": "App.Prj.Milestones", "MenuCode": "App.Prj.Milestones",
"MenuOrder": 3, "MenuOrder": 3,
"MenuUrl": "/admin/list/App.Prj.Milestones", "MenuUrl": "/admin/list/App.Prj.Milestones",
"MenuIcon": "FcCalendar", "MenuIcon": "FcCalendar"
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline"
}, },
"Language": { "Language": {
"LanguageTextMenuEn": "Milestones", "MenuParentEn": "Project",
"LanguageTextMenuTr": "D\u00F6n\u00FCm Noktalar\u0131", "MenuParentTr": "Proje",
"LanguageTextTitleEn": "Milestones", "PermissionGroupEn": "Project",
"LanguageTextTitleTr": "D\u00F6n\u00FCm Noktalar\u0131", "PermissionGroupTr": "Proje",
"LanguageTextDescEn": "Project milestones", "MenuEn": "Milestones",
"LanguageTextDescTr": "Proje d\u00F6n\u00FCm noktalar\u0131", "MenuTr": "D\u00F6n\u00FCm Noktalar\u0131",
"LanguageTextMenuParentEn": "Project", "TitleEn": "Milestones",
"LanguageTextMenuParentTr": "Proje" "TitleTr": "D\u00F6n\u00FCm Noktalar\u0131",
"DescEn": "Project milestones",
"DescTr": "Proje d\u00F6n\u00FCm noktalar\u0131"
}, },
"Groups": [ "Groups": [
{ {
@ -33,26 +33,26 @@
{ {
"FieldName": "Id", "FieldName": "Id",
"CaptionName": "App.Listform.ListformField.Id", "CaptionName": "App.Listform.ListformField.Id",
"TurkishCaption": "Kimlik", "En": "Id",
"EnglishCaption": "Id" "Tr": "Kimlik"
}, },
{ {
"FieldName": "Name", "FieldName": "Name",
"CaptionName": "App.Listform.ListformField.Name", "CaptionName": "App.Listform.ListformField.Name",
"TurkishCaption": "D\u00F6n\u00FCm Noktas\u0131", "En": "Milestone",
"EnglishCaption": "Milestone" "Tr": "D\u00F6n\u00FCm Noktas\u0131"
}, },
{ {
"FieldName": "TargetDate", "FieldName": "TargetDate",
"CaptionName": "App.Listform.ListformField.TargetDate", "CaptionName": "App.Listform.ListformField.TargetDate",
"TurkishCaption": "Hedef Tarih", "En": "Target Date",
"EnglishCaption": "Target Date" "Tr": "Hedef Tarih"
}, },
{ {
"FieldName": "IsCompleted", "FieldName": "IsCompleted",
"CaptionName": "App.Listform.ListformField.IsCompleted", "CaptionName": "App.Listform.ListformField.IsCompleted",
"TurkishCaption": "Tamamland\u0131", "En": "Completed",
"EnglishCaption": "Completed" "Tr": "Tamamland\u0131"
} }
] ]
} }
@ -230,7 +230,7 @@
"StartExpr": null, "StartExpr": null,
"EndExpr": null, "EndExpr": null,
"ProgressExpr": null, "ProgressExpr": null,
"AllowEditing": false, "EditingEnabled": false,
"AllowTaskAdding": false, "AllowTaskAdding": false,
"AllowTaskUpdating": false, "AllowTaskUpdating": false,
"AllowTaskResourceUpdating": false, "AllowTaskResourceUpdating": false,

View file

@ -6,26 +6,26 @@
"SeededAt": "2026-09-01T09:03:00", "SeededAt": "2026-09-01T09:03:00",
"CustomComponentName": "", "CustomComponentName": "",
"PermissionGroupName": "App.Prj", "PermissionGroupName": "App.Prj",
"PermissionGroupDisplayNameEn": "Project",
"PermissionGroupDisplayNameTr": "Proje",
"ModuleId": "Prj", "ModuleId": "Prj",
"Menu": { "Menu": {
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline",
"MenuCode": "App.Prj.Tags", "MenuCode": "App.Prj.Tags",
"MenuOrder": 2, "MenuOrder": 2,
"MenuUrl": "/admin/list/App.Prj.Tags", "MenuUrl": "/admin/list/App.Prj.Tags",
"MenuIcon": "FcRules", "MenuIcon": "FcRules"
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline"
}, },
"Language": { "Language": {
"LanguageTextMenuEn": "Tags", "MenuParentEn": "Project",
"LanguageTextMenuTr": "Etiketler", "MenuParentTr": "Proje",
"LanguageTextTitleEn": "Tags", "PermissionGroupEn": "Project",
"LanguageTextTitleTr": "Etiketler", "PermissionGroupTr": "Proje",
"LanguageTextDescEn": "Task tags", "MenuEn": "Tags",
"LanguageTextDescTr": "G\u00F6rev etiketleri", "MenuTr": "Etiketler",
"LanguageTextMenuParentEn": "Project", "TitleEn": "Tags",
"LanguageTextMenuParentTr": "Proje" "TitleTr": "Etiketler",
"DescEn": "Task tags",
"DescTr": "G\u00F6rev etiketleri"
}, },
"Groups": [ "Groups": [
{ {
@ -33,20 +33,20 @@
{ {
"FieldName": "Id", "FieldName": "Id",
"CaptionName": "App.Listform.ListformField.Id", "CaptionName": "App.Listform.ListformField.Id",
"TurkishCaption": "Kimlik", "En": "Id",
"EnglishCaption": "Id" "Tr": "Kimlik"
}, },
{ {
"FieldName": "Name", "FieldName": "Name",
"CaptionName": "App.Listform.ListformField.Name", "CaptionName": "App.Listform.ListformField.Name",
"TurkishCaption": "Etiket Ad\u0131", "En": "Tag Name",
"EnglishCaption": "Tag Name" "Tr": "Etiket Ad\u0131"
}, },
{ {
"FieldName": "ColorCode", "FieldName": "ColorCode",
"CaptionName": "App.Listform.ListformField.ColorCode", "CaptionName": "App.Listform.ListformField.ColorCode",
"TurkishCaption": "Renk", "En": "Color",
"EnglishCaption": "Color" "Tr": "Renk"
} }
] ]
} }
@ -224,7 +224,7 @@
"StartExpr": null, "StartExpr": null,
"EndExpr": null, "EndExpr": null,
"ProgressExpr": null, "ProgressExpr": null,
"AllowEditing": false, "EditingEnabled": false,
"AllowTaskAdding": false, "AllowTaskAdding": false,
"AllowTaskUpdating": false, "AllowTaskUpdating": false,
"AllowTaskResourceUpdating": false, "AllowTaskResourceUpdating": false,

View file

@ -6,27 +6,27 @@
"SeededAt": "2026-09-01T09:02:00", "SeededAt": "2026-09-01T09:02:00",
"CustomComponentName": "", "CustomComponentName": "",
"PermissionGroupName": "App.Prj", "PermissionGroupName": "App.Prj",
"PermissionGroupDisplayNameEn": "Project",
"PermissionGroupDisplayNameTr": "Proje",
"ModuleId": "Prj", "ModuleId": "Prj",
"Menu": { "Menu": {
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline",
"CreateMenu": false, "CreateMenu": false,
"MenuCode": "App.Prj.TaskDependencies", "MenuCode": "App.Prj.TaskDependencies",
"MenuOrder": 1, "MenuOrder": 1,
"MenuUrl": "/admin/list/App.Prj.TaskDependencies", "MenuUrl": "/admin/list/App.Prj.TaskDependencies",
"MenuIcon": "FcTodoList", "MenuIcon": "FcTodoList"
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline"
}, },
"Language": { "Language": {
"LanguageTextMenuEn": "Blocking Tasks", "MenuParentEn": "Project",
"LanguageTextMenuTr": "Beklenen G\u00F6revler", "MenuParentTr": "Proje",
"LanguageTextTitleEn": "Blocking Tasks", "PermissionGroupEn": "Project",
"LanguageTextTitleTr": "Beklenen G\u00F6revler", "PermissionGroupTr": "Proje",
"LanguageTextDescEn": "Tasks this task waits for", "MenuEn": "Blocking Tasks",
"LanguageTextDescTr": "G\u00F6revin bekledi\u011Fi g\u00F6revler", "MenuTr": "Beklenen G\u00F6revler",
"LanguageTextMenuParentEn": "Project", "TitleEn": "Blocking Tasks",
"LanguageTextMenuParentTr": "Proje" "TitleTr": "Beklenen G\u00F6revler",
"DescEn": "Tasks this task waits for",
"DescTr": "G\u00F6revin bekledi\u011Fi g\u00F6revler"
}, },
"Groups": [ "Groups": [
{ {
@ -34,26 +34,26 @@
{ {
"FieldName": "Id", "FieldName": "Id",
"CaptionName": "App.Listform.ListformField.Id", "CaptionName": "App.Listform.ListformField.Id",
"TurkishCaption": "Kimlik", "En": "Id",
"EnglishCaption": "Id" "Tr": "Kimlik"
}, },
{ {
"FieldName": "TaskId", "FieldName": "TaskId",
"CaptionName": "App.Listform.ListformField.TaskId", "CaptionName": "App.Listform.ListformField.TaskId",
"TurkishCaption": "G\u00F6rev", "En": "Task",
"EnglishCaption": "Task" "Tr": "G\u00F6rev"
}, },
{ {
"FieldName": "DependsOnTaskId", "FieldName": "DependsOnTaskId",
"CaptionName": "App.Listform.ListformField.DependsOnTaskId", "CaptionName": "App.Listform.ListformField.DependsOnTaskId",
"TurkishCaption": "Beklenen G\u00F6rev", "En": "Blocking Task",
"EnglishCaption": "Blocking Task" "Tr": "Beklenen G\u00F6rev"
}, },
{ {
"FieldName": "Note", "FieldName": "Note",
"CaptionName": "App.Listform.ListformField.Note", "CaptionName": "App.Listform.ListformField.Note",
"TurkishCaption": "Not", "En": "Note",
"EnglishCaption": "Note" "Tr": "Not"
} }
] ]
} }
@ -231,7 +231,7 @@
"StartExpr": null, "StartExpr": null,
"EndExpr": null, "EndExpr": null,
"ProgressExpr": null, "ProgressExpr": null,
"AllowEditing": false, "EditingEnabled": false,
"AllowTaskAdding": false, "AllowTaskAdding": false,
"AllowTaskUpdating": false, "AllowTaskUpdating": false,
"AllowTaskResourceUpdating": false, "AllowTaskResourceUpdating": false,

View file

@ -6,27 +6,27 @@
"SeededAt": "2026-09-01T09:01:00", "SeededAt": "2026-09-01T09:01:00",
"CustomComponentName": "", "CustomComponentName": "",
"PermissionGroupName": "App.Prj", "PermissionGroupName": "App.Prj",
"PermissionGroupDisplayNameEn": "Project",
"PermissionGroupDisplayNameTr": "Proje",
"ModuleId": "Prj", "ModuleId": "Prj",
"Menu": { "Menu": {
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline",
"CreateMenu": false, "CreateMenu": false,
"MenuCode": "App.Prj.TaskSubTasks", "MenuCode": "App.Prj.TaskSubTasks",
"MenuOrder": 1, "MenuOrder": 1,
"MenuUrl": "/admin/list/App.Prj.TaskSubTasks", "MenuUrl": "/admin/list/App.Prj.TaskSubTasks",
"MenuIcon": "FcTodoList", "MenuIcon": "FcTodoList"
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline"
}, },
"Language": { "Language": {
"LanguageTextMenuEn": "Sub Tasks", "MenuParentEn": "Project",
"LanguageTextMenuTr": "Alt G\u00F6revler", "MenuParentTr": "Proje",
"LanguageTextTitleEn": "Sub Tasks", "PermissionGroupEn": "Project",
"LanguageTextTitleTr": "Alt G\u00F6revler", "PermissionGroupTr": "Proje",
"LanguageTextDescEn": "Sub task list", "MenuEn": "Sub Tasks",
"LanguageTextDescTr": "Alt g\u00F6rev listesi", "MenuTr": "Alt G\u00F6revler",
"LanguageTextMenuParentEn": "Project", "TitleEn": "Sub Tasks",
"LanguageTextMenuParentTr": "Proje" "TitleTr": "Alt G\u00F6revler",
"DescEn": "Sub task list",
"DescTr": "Alt g\u00F6rev listesi"
}, },
"Groups": [ "Groups": [
{ {
@ -34,50 +34,50 @@
{ {
"FieldName": "Id", "FieldName": "Id",
"CaptionName": "App.Listform.ListformField.Id", "CaptionName": "App.Listform.ListformField.Id",
"TurkishCaption": "Kimlik", "En": "Id",
"EnglishCaption": "Id" "Tr": "Kimlik"
}, },
{ {
"FieldName": "Name", "FieldName": "Name",
"CaptionName": "App.Listform.ListformField.Name", "CaptionName": "App.Listform.ListformField.Name",
"TurkishCaption": "G\u00F6rev Ad\u0131", "En": "Task Name",
"EnglishCaption": "Task Name" "Tr": "G\u00F6rev Ad\u0131"
}, },
{ {
"FieldName": "ParentTaskId", "FieldName": "ParentTaskId",
"CaptionName": "App.Listform.ListformField.ParentTaskId", "CaptionName": "App.Listform.ListformField.ParentTaskId",
"TurkishCaption": "\u00DCst G\u00F6rev", "En": "Parent Task",
"EnglishCaption": "Parent Task" "Tr": "\u00DCst G\u00F6rev"
}, },
{ {
"FieldName": "Status", "FieldName": "Status",
"CaptionName": "App.Listform.ListformField.Status", "CaptionName": "App.Listform.ListformField.Status",
"TurkishCaption": "Durum", "En": "Status",
"EnglishCaption": "Status" "Tr": "Durum"
}, },
{ {
"FieldName": "AssigneeIds", "FieldName": "AssigneeIds",
"CaptionName": "App.Listform.ListformField.AssigneeIds", "CaptionName": "App.Listform.ListformField.AssigneeIds",
"TurkishCaption": "Atananlar", "En": "Assignees",
"EnglishCaption": "Assignees" "Tr": "Atananlar"
}, },
{ {
"FieldName": "ProgressPercent", "FieldName": "ProgressPercent",
"CaptionName": "App.Listform.ListformField.ProgressPercent", "CaptionName": "App.Listform.ListformField.ProgressPercent",
"TurkishCaption": "\u0130lerleme (%)", "En": "Progress (%)",
"EnglishCaption": "Progress (%)" "Tr": "\u0130lerleme (%)"
}, },
{ {
"FieldName": "PlannedStartDate", "FieldName": "PlannedStartDate",
"CaptionName": "App.Listform.ListformField.PlannedStartDate", "CaptionName": "App.Listform.ListformField.PlannedStartDate",
"TurkishCaption": "Planlanan Ba\u015Flang\u0131\u00E7", "En": "Planned Start",
"EnglishCaption": "Planned Start" "Tr": "Planlanan Ba\u015Flang\u0131\u00E7"
}, },
{ {
"FieldName": "PlannedEndDate", "FieldName": "PlannedEndDate",
"CaptionName": "App.Listform.ListformField.PlannedEndDate", "CaptionName": "App.Listform.ListformField.PlannedEndDate",
"TurkishCaption": "Planlanan Biti\u015F", "En": "Planned End",
"EnglishCaption": "Planned End" "Tr": "Planlanan Biti\u015F"
} }
] ]
} }
@ -255,7 +255,7 @@
"StartExpr": null, "StartExpr": null,
"EndExpr": null, "EndExpr": null,
"ProgressExpr": null, "ProgressExpr": null,
"AllowEditing": false, "EditingEnabled": false,
"AllowTaskAdding": false, "AllowTaskAdding": false,
"AllowTaskUpdating": false, "AllowTaskUpdating": false,
"AllowTaskResourceUpdating": false, "AllowTaskResourceUpdating": false,

View file

@ -6,27 +6,27 @@
"SeededAt": "2026-09-01T09:00:00", "SeededAt": "2026-09-01T09:00:00",
"CustomComponentName": "", "CustomComponentName": "",
"PermissionGroupName": "App.Prj", "PermissionGroupName": "App.Prj",
"PermissionGroupDisplayNameEn": "Project",
"PermissionGroupDisplayNameTr": "Proje",
"ModuleId": "Prj", "ModuleId": "Prj",
"Menu": { "Menu": {
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline",
"CreateMenu": false, "CreateMenu": false,
"MenuCode": "App.Prj.TaskTimesheets", "MenuCode": "App.Prj.TaskTimesheets",
"MenuOrder": 1, "MenuOrder": 1,
"MenuUrl": "/admin/list/App.Prj.TaskTimesheets", "MenuUrl": "/admin/list/App.Prj.TaskTimesheets",
"MenuIcon": "FcTodoList", "MenuIcon": "FcTodoList"
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline"
}, },
"Language": { "Language": {
"LanguageTextMenuEn": "Timesheets", "MenuParentEn": "Project",
"LanguageTextMenuTr": "\u00C7al\u0131\u015Fma \u00C7izelgeleri", "MenuParentTr": "Proje",
"LanguageTextTitleEn": "Timesheets", "PermissionGroupEn": "Project",
"LanguageTextTitleTr": "\u00C7al\u0131\u015Fma \u00C7izelgeleri", "PermissionGroupTr": "Proje",
"LanguageTextDescEn": "Task timesheets", "MenuEn": "Timesheets",
"LanguageTextDescTr": "G\u00F6rev \u00E7al\u0131\u015Fma \u00E7izelgeleri", "MenuTr": "\u00C7al\u0131\u015Fma \u00C7izelgeleri",
"LanguageTextMenuParentEn": "Project", "TitleEn": "Timesheets",
"LanguageTextMenuParentTr": "Proje" "TitleTr": "\u00C7al\u0131\u015Fma \u00C7izelgeleri",
"DescEn": "Task timesheets",
"DescTr": "G\u00F6rev \u00E7al\u0131\u015Fma \u00E7izelgeleri"
}, },
"Groups": [ "Groups": [
{ {
@ -34,38 +34,38 @@
{ {
"FieldName": "Id", "FieldName": "Id",
"CaptionName": "App.Listform.ListformField.Id", "CaptionName": "App.Listform.ListformField.Id",
"TurkishCaption": "Kimlik", "En": "Id",
"EnglishCaption": "Id" "Tr": "Kimlik"
}, },
{ {
"FieldName": "TaskId", "FieldName": "TaskId",
"CaptionName": "App.Listform.ListformField.TaskId", "CaptionName": "App.Listform.ListformField.TaskId",
"TurkishCaption": "G\u00F6rev", "En": "Task",
"EnglishCaption": "Task" "Tr": "G\u00F6rev"
}, },
{ {
"FieldName": "WorkDate", "FieldName": "WorkDate",
"CaptionName": "App.Listform.ListformField.WorkDate", "CaptionName": "App.Listform.ListformField.WorkDate",
"TurkishCaption": "Tarih", "En": "Date",
"EnglishCaption": "Date" "Tr": "Tarih"
}, },
{ {
"FieldName": "UserId", "FieldName": "UserId",
"CaptionName": "App.Listform.ListformField.UserId", "CaptionName": "App.Listform.ListformField.UserId",
"TurkishCaption": "Kullan\u0131c\u0131", "En": "User",
"EnglishCaption": "User" "Tr": "Kullan\u0131c\u0131"
}, },
{ {
"FieldName": "Hours", "FieldName": "Hours",
"CaptionName": "App.Listform.ListformField.Hours", "CaptionName": "App.Listform.ListformField.Hours",
"TurkishCaption": "S\u00FCre (saat)", "En": "Hours",
"EnglishCaption": "Hours" "Tr": "S\u00FCre (saat)"
}, },
{ {
"FieldName": "Description", "FieldName": "Description",
"CaptionName": "App.Listform.ListformField.Description", "CaptionName": "App.Listform.ListformField.Description",
"TurkishCaption": "A\u00E7\u0131klama", "En": "Description",
"EnglishCaption": "Description" "Tr": "A\u00E7\u0131klama"
} }
] ]
} }
@ -243,7 +243,7 @@
"StartExpr": null, "StartExpr": null,
"EndExpr": null, "EndExpr": null,
"ProgressExpr": null, "ProgressExpr": null,
"AllowEditing": false, "EditingEnabled": false,
"AllowTaskAdding": false, "AllowTaskAdding": false,
"AllowTaskUpdating": false, "AllowTaskUpdating": false,
"AllowTaskResourceUpdating": false, "AllowTaskResourceUpdating": false,

View file

@ -6,26 +6,26 @@
"SeededAt": "2026-09-01T09:06:00", "SeededAt": "2026-09-01T09:06:00",
"CustomComponentName": "", "CustomComponentName": "",
"PermissionGroupName": "App.Prj", "PermissionGroupName": "App.Prj",
"PermissionGroupDisplayNameEn": "Project",
"PermissionGroupDisplayNameTr": "Proje",
"ModuleId": "Prj", "ModuleId": "Prj",
"Menu": { "Menu": {
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline",
"MenuCode": "App.Prj.Tasks", "MenuCode": "App.Prj.Tasks",
"MenuOrder": 1, "MenuOrder": 1,
"MenuUrl": "/admin/list/App.Prj.Tasks", "MenuUrl": "/admin/list/App.Prj.Tasks",
"MenuIcon": "FcTodoList", "MenuIcon": "FcTodoList"
"MenuParentCode": "App.Prj",
"MenuParentIcon": "FcTimeline"
}, },
"Language": { "Language": {
"LanguageTextMenuEn": "Tasks", "MenuParentEn": "Project",
"LanguageTextMenuTr": "G\u00F6revler", "MenuParentTr": "Proje",
"LanguageTextTitleEn": "Tasks", "PermissionGroupEn": "Project",
"LanguageTextTitleTr": "G\u00F6revler", "PermissionGroupTr": "Proje",
"LanguageTextDescEn": "Task card and tracking", "MenuEn": "Tasks",
"LanguageTextDescTr": "G\u00F6rev kart\u0131 ve takibi", "MenuTr": "G\u00F6revler",
"LanguageTextMenuParentEn": "Project", "TitleEn": "Tasks",
"LanguageTextMenuParentTr": "Proje" "TitleTr": "G\u00F6revler",
"DescEn": "Task card and tracking",
"DescTr": "G\u00F6rev kart\u0131 ve takibi"
}, },
"Groups": [ "Groups": [
{ {
@ -33,92 +33,92 @@
{ {
"FieldName": "Id", "FieldName": "Id",
"CaptionName": "App.Listform.ListformField.Id", "CaptionName": "App.Listform.ListformField.Id",
"TurkishCaption": "Kimlik", "En": "Id",
"EnglishCaption": "Id" "Tr": "Kimlik"
}, },
{ {
"FieldName": "Name", "FieldName": "Name",
"CaptionName": "App.Listform.ListformField.Name", "CaptionName": "App.Listform.ListformField.Name",
"TurkishCaption": "G\u00F6rev Ad\u0131", "En": "Task Name",
"EnglishCaption": "Task Name" "Tr": "G\u00F6rev Ad\u0131"
}, },
{ {
"FieldName": "MilestoneId", "FieldName": "MilestoneId",
"CaptionName": "App.Listform.ListformField.MilestoneId", "CaptionName": "App.Listform.ListformField.MilestoneId",
"TurkishCaption": "D\u00F6n\u00FCm Noktas\u0131", "En": "Milestone",
"EnglishCaption": "Milestone" "Tr": "D\u00F6n\u00FCm Noktas\u0131"
}, },
{ {
"FieldName": "Status", "FieldName": "Status",
"CaptionName": "App.Listform.ListformField.Status", "CaptionName": "App.Listform.ListformField.Status",
"TurkishCaption": "Durum", "En": "Status",
"EnglishCaption": "Status" "Tr": "Durum"
}, },
{ {
"FieldName": "AssigneeIds", "FieldName": "AssigneeIds",
"CaptionName": "App.Listform.ListformField.AssigneeIds", "CaptionName": "App.Listform.ListformField.AssigneeIds",
"TurkishCaption": "Atananlar", "En": "Assignees",
"EnglishCaption": "Assignees" "Tr": "Atananlar"
}, },
{ {
"FieldName": "TagIds", "FieldName": "TagIds",
"CaptionName": "App.Listform.ListformField.TagIds", "CaptionName": "App.Listform.ListformField.TagIds",
"TurkishCaption": "Etiketler", "En": "Tags",
"EnglishCaption": "Tags" "Tr": "Etiketler"
}, },
{ {
"FieldName": "CustomerId", "FieldName": "CustomerId",
"CaptionName": "App.Listform.ListformField.CustomerId", "CaptionName": "App.Listform.ListformField.CustomerId",
"TurkishCaption": "M\u00FC\u015Fteri", "En": "Customer",
"EnglishCaption": "Customer" "Tr": "M\u00FC\u015Fteri"
}, },
{ {
"FieldName": "CustomerContact", "FieldName": "CustomerContact",
"CaptionName": "App.Listform.ListformField.CustomerContact", "CaptionName": "App.Listform.ListformField.CustomerContact",
"TurkishCaption": "\u0130lgili Ki\u015Fi", "En": "Contact",
"EnglishCaption": "Contact" "Tr": "\u0130lgili Ki\u015Fi"
}, },
{ {
"FieldName": "PlannedHours", "FieldName": "PlannedHours",
"CaptionName": "App.Listform.ListformField.PlannedHours", "CaptionName": "App.Listform.ListformField.PlannedHours",
"TurkishCaption": "\u0130lk Planlanan Saatler", "En": "Planned Hours",
"EnglishCaption": "Planned Hours" "Tr": "\u0130lk Planlanan Saatler"
}, },
{ {
"FieldName": "ProgressPercent", "FieldName": "ProgressPercent",
"CaptionName": "App.Listform.ListformField.ProgressPercent", "CaptionName": "App.Listform.ListformField.ProgressPercent",
"TurkishCaption": "\u0130lerleme (%)", "En": "Progress (%)",
"EnglishCaption": "Progress (%)" "Tr": "\u0130lerleme (%)"
}, },
{ {
"FieldName": "SalesOrderLine", "FieldName": "SalesOrderLine",
"CaptionName": "App.Listform.ListformField.SalesOrderLine", "CaptionName": "App.Listform.ListformField.SalesOrderLine",
"TurkishCaption": "Sat\u0131\u015F Sipari\u015F Sat\u0131r\u0131", "En": "Sales Order Line",
"EnglishCaption": "Sales Order Line" "Tr": "Sat\u0131\u015F Sipari\u015F Sat\u0131r\u0131"
}, },
{ {
"FieldName": "PlannedStartDate", "FieldName": "PlannedStartDate",
"CaptionName": "App.Listform.ListformField.PlannedStartDate", "CaptionName": "App.Listform.ListformField.PlannedStartDate",
"TurkishCaption": "Planlanan Tarih", "En": "Planned Date",
"EnglishCaption": "Planned Date" "Tr": "Planlanan Tarih"
}, },
{ {
"FieldName": "PlannedEndDate", "FieldName": "PlannedEndDate",
"CaptionName": "App.Listform.ListformField.PlannedEndDate", "CaptionName": "App.Listform.ListformField.PlannedEndDate",
"TurkishCaption": "Planlanan Biti\u015F", "En": "Planned End",
"EnglishCaption": "Planned End" "Tr": "Planlanan Biti\u015F"
}, },
{ {
"FieldName": "ParentTaskId", "FieldName": "ParentTaskId",
"CaptionName": "App.Listform.ListformField.ParentTaskId", "CaptionName": "App.Listform.ListformField.ParentTaskId",
"TurkishCaption": "\u00DCst G\u00F6rev", "En": "Parent Task",
"EnglishCaption": "Parent Task" "Tr": "\u00DCst G\u00F6rev"
}, },
{ {
"FieldName": "IsFavorite", "FieldName": "IsFavorite",
"CaptionName": "App.Listform.ListformField.IsFavorite", "CaptionName": "App.Listform.ListformField.IsFavorite",
"TurkishCaption": "Favori", "En": "Favorite",
"EnglishCaption": "Favorite" "Tr": "Favori"
} }
] ]
}, },
@ -127,8 +127,8 @@
{ {
"FieldName": "Description", "FieldName": "Description",
"CaptionName": "App.Listform.ListformField.Description", "CaptionName": "App.Listform.ListformField.Description",
"TurkishCaption": "A\u00E7\u0131klama", "En": "Description",
"EnglishCaption": "Description" "Tr": "A\u00E7\u0131klama"
} }
] ]
} }
@ -306,16 +306,16 @@
"StartExpr": "PlannedStartDate", "StartExpr": "PlannedStartDate",
"EndExpr": "PlannedEndDate", "EndExpr": "PlannedEndDate",
"ProgressExpr": "ProgressPercent", "ProgressExpr": "ProgressPercent",
"AllowEditing": false, "EditingEnabled": true,
"AllowTaskAdding": false, "AllowTaskAdding": true,
"AllowTaskUpdating": false, "AllowTaskUpdating": true,
"AllowTaskResourceUpdating": false, "AllowTaskResourceUpdating": true,
"AllowTaskDeleting": false, "AllowTaskDeleting": true,
"AllowDependencyAdding": false, "AllowDependencyAdding": true,
"AllowDependencyDeleting": false, "AllowDependencyDeleting": true,
"AllowResourceAdding": false, "AllowResourceAdding": true,
"AllowResourceUpdating": false, "AllowResourceUpdating": true,
"AllowResourceDeleting": false "AllowResourceDeleting": true
}, },
"SchedulerOptionDto": { "SchedulerOptionDto": {
"TextExpr": null, "TextExpr": null,
@ -870,7 +870,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": null, "EditOrderNo": null,
"EditGroupOrderNo": null, "EditGroupOrderNo": null,
@ -1008,7 +1008,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 1, "EditOrderNo": 1,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -1134,7 +1134,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 2, "EditOrderNo": 2,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -1272,7 +1272,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 3, "EditOrderNo": 3,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -1398,7 +1398,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 4, "EditOrderNo": 4,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -1532,7 +1532,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 5, "EditOrderNo": 5,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -1666,7 +1666,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 6, "EditOrderNo": 6,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -1792,7 +1792,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 7, "EditOrderNo": 7,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -1918,7 +1918,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 8, "EditOrderNo": 8,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -2044,7 +2044,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 9, "EditOrderNo": 9,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -2170,7 +2170,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 10, "EditOrderNo": 10,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -2296,7 +2296,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 11, "EditOrderNo": 11,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -2422,7 +2422,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 12, "EditOrderNo": 12,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -2548,7 +2548,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 13, "EditOrderNo": 13,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -2674,7 +2674,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 14, "EditOrderNo": 14,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
@ -2800,7 +2800,7 @@
"GroupInterval": "", "GroupInterval": "",
"WordWrapEnabled": false "WordWrapEnabled": false
}, },
"Alignment": null, "Alignment": "left",
"Format": null, "Format": null,
"EditOrderNo": 1, "EditOrderNo": 1,
"EditGroupOrderNo": 2, "EditGroupOrderNo": 2,

View file

@ -82,19 +82,19 @@ export interface ListFormWizardDto {
scheduler: boolean scheduler: boolean
todo: boolean todo: boolean
languageTextMenuEn: string menuEn: string
languageTextMenuTr: string menuTr: string
languageTextTitleEn: string titleEn: string
languageTextTitleTr: string titleTr: string
languageTextDescEn: string descEn: string
languageTextDescTr: string descTr: string
languageTextMenuParentEn: string menuParentEn: string
languageTextMenuParentTr: string menuParentTr: string
permissionGroupName: string permissionGroupName: string
/** Izin grubunun Ingilizce gorunen adi; grup adiyla ayni olan dil anahtarina yazilir. */ /** Izin grubunun Ingilizce gorunen adi; grup adiyla ayni olan dil anahtarina yazilir. */
permissionGroupDisplayNameEn: string permissionGroupEn: string
/** Izin grubunun Turkce gorunen adi. */ /** Izin grubunun Turkce gorunen adi. */
permissionGroupDisplayNameTr: string permissionGroupTr: string
menuParentCode: string menuParentCode: string
menuParentModuleId?: string menuParentModuleId?: string
menuParentIcon?: string menuParentIcon?: string

View file

@ -417,7 +417,7 @@ export interface GanttOptionDto {
endExpr?: string endExpr?: string
progressExpr?: string progressExpr?: string
scaleType: GanttScaleType scaleType: GanttScaleType
allowEditing?: boolean editingEnabled?: boolean
allowTaskAdding?: boolean allowTaskAdding?: boolean
allowTaskUpdating?: boolean allowTaskUpdating?: boolean
allowTaskResourceUpdating?: boolean allowTaskResourceUpdating?: boolean

View file

@ -25,6 +25,18 @@ import { gantScaleOptions } from './options'
const validationSchema = Yup.object().shape({}) const validationSchema = Yup.object().shape({})
const ganttEditPermissionFields = [
'allowTaskAdding',
'allowTaskUpdating',
'allowTaskDeleting',
'allowTaskResourceUpdating',
'allowDependencyAdding',
'allowDependencyDeleting',
'allowResourceAdding',
'allowResourceUpdating',
'allowResourceDeleting',
] as const
function FormTabGantt(props: FormEditProps) { function FormTabGantt(props: FormEditProps) {
const { listFormCode } = useParams() const { listFormCode } = useParams()
const { translate } = useLocalization() const { translate } = useLocalization()
@ -345,52 +357,108 @@ function FormTabGantt(props: FormEditProps) {
className="mt-4" className="mt-4"
header={translate('::App.ListFormSchedulerOptions.InteractionSettings')} header={translate('::App.ListFormSchedulerOptions.InteractionSettings')}
> >
<div className="grid grid-cols-1 md:grid-cols-2 gap-3"> <div>
<FormItem
label={translate('::App.ListFormEdit.EditingEnabled')}
invalid={
errors.ganttOptionDto?.editingEnabled &&
touched.ganttOptionDto?.editingEnabled
}
errorMessage={errors.ganttOptionDto?.editingEnabled}
>
<Field name="ganttOptionDto.editingEnabled">
{({ field, form }: FieldProps) => (
<Checkbox
checked={field.value === true}
onChange={(checked) => {
form.setFieldValue(field.name, checked)
// Düzenleme kapatıldığında alt izinler açık kalırsa
// ekranda etkisiz ama kayıtta true görünür.
if (!checked) {
ganttEditPermissionFields.forEach((name) =>
form.setFieldValue(`ganttOptionDto.${name}`, false),
)
}
}}
/>
)}
</Field>
</FormItem>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-3 border-t border-gray-200 pt-1">
<div>
<FormItem
label={translate('::App.ListFormEdit.AllowTaskAdding')}
invalid={
errors.ganttOptionDto?.allowTaskAdding &&
touched.ganttOptionDto?.allowTaskAdding
}
errorMessage={errors.ganttOptionDto?.allowTaskAdding}
>
<Field
name="ganttOptionDto.allowTaskAdding"
placeholder={translate('::App.ListFormEdit.AllowTaskAdding')}
component={Checkbox}
disabled={!values.ganttOptionDto.editingEnabled}
/>
</FormItem>
</div>
<div>
<FormItem
label={translate('::App.ListFormEdit.AllowTaskUpdating')}
invalid={
errors.ganttOptionDto?.allowTaskUpdating &&
touched.ganttOptionDto?.allowTaskUpdating
}
errorMessage={errors.ganttOptionDto?.allowTaskUpdating}
>
<Field
name="ganttOptionDto.allowTaskUpdating"
placeholder={translate('::App.ListFormEdit.AllowTaskUpdating')}
component={Checkbox}
disabled={!values.ganttOptionDto.editingEnabled}
/>
</FormItem>
</div>
<div>
<FormItem
label={translate('::App.ListFormEdit.AllowTaskDeleting')}
invalid={
errors.ganttOptionDto?.allowTaskDeleting &&
touched.ganttOptionDto?.allowTaskDeleting
}
errorMessage={errors.ganttOptionDto?.allowTaskDeleting}
>
<Field
name="ganttOptionDto.allowTaskDeleting"
placeholder={translate('::App.ListFormEdit.AllowTaskDeleting')}
component={Checkbox}
disabled={!values.ganttOptionDto.editingEnabled}
/>
</FormItem>
</div>
</div>
<div>
<FormItem
label={translate('::App.ListFormEdit.AllowTaskResourceUpdating')}
invalid={
errors.ganttOptionDto?.allowTaskResourceUpdating &&
touched.ganttOptionDto?.allowTaskResourceUpdating
}
errorMessage={errors.ganttOptionDto?.allowTaskResourceUpdating}
>
<Field
name="ganttOptionDto.allowTaskResourceUpdating"
placeholder={translate('::App.ListFormEdit.AllowTaskResourceUpdating')}
component={Checkbox}
disabled={!values.ganttOptionDto.editingEnabled}
/>
</FormItem>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-3 border-t border-gray-200 pt-1">
<div> <div>
<FormItem
label={translate('::App.ListFormEdit.AllowEditing')}
invalid={
errors.ganttOptionDto?.allowEditing && touched.ganttOptionDto?.allowEditing
}
errorMessage={errors.ganttOptionDto?.allowEditing}
>
<Field
name="ganttOptionDto.allowEditing"
placeholder={translate('::App.ListFormEdit.AllowEditing')}
component={Checkbox}
/>
</FormItem>
<FormItem
label={translate('::App.ListFormEdit.AllowTaskUpdating')}
invalid={
errors.ganttOptionDto?.allowTaskUpdating &&
touched.ganttOptionDto?.allowTaskUpdating
}
errorMessage={errors.ganttOptionDto?.allowTaskUpdating}
>
<Field
name="ganttOptionDto.allowTaskUpdating"
placeholder={translate('::App.ListFormEdit.AllowTaskUpdating')}
component={Checkbox}
/>
</FormItem>
<FormItem
label={translate('::App.ListFormEdit.AllowDependencyAdding')}
invalid={
errors.ganttOptionDto?.allowDependencyAdding &&
touched.ganttOptionDto?.allowDependencyAdding
}
errorMessage={errors.ganttOptionDto?.allowDependencyAdding}
>
<Field
name="ganttOptionDto.allowDependencyAdding"
placeholder={translate('::App.ListFormEdit.AllowDependencyAdding')}
component={Checkbox}
/>
</FormItem>
<FormItem <FormItem
label={translate('::App.ListFormEdit.AllowResourceAdding')} label={translate('::App.ListFormEdit.AllowResourceAdding')}
invalid={ invalid={
@ -403,70 +471,11 @@ function FormTabGantt(props: FormEditProps) {
name="ganttOptionDto.allowResourceAdding" name="ganttOptionDto.allowResourceAdding"
placeholder={translate('::App.ListFormEdit.AllowResourceAdding')} placeholder={translate('::App.ListFormEdit.AllowResourceAdding')}
component={Checkbox} component={Checkbox}
/> disabled={!values.ganttOptionDto.editingEnabled}
</FormItem>
<FormItem
label={translate('::App.ListFormEdit.AllowResourceDeleting')}
invalid={
errors.ganttOptionDto?.allowResourceDeleting &&
touched.ganttOptionDto?.allowResourceDeleting
}
errorMessage={errors.ganttOptionDto?.allowResourceDeleting}
>
<Field
name="ganttOptionDto.allowResourceDeleting"
placeholder={translate('::App.ListFormEdit.AllowResourceDeleting')}
component={Checkbox}
/> />
</FormItem> </FormItem>
</div> </div>
<div> <div>
<FormItem
label={translate('::App.ListFormEdit.AllowTaskAdding')}
invalid={
errors.ganttOptionDto?.allowTaskAdding &&
touched.ganttOptionDto?.allowTaskAdding
}
errorMessage={errors.ganttOptionDto?.allowTaskAdding}
>
<Field
name="ganttOptionDto.allowTaskAdding"
placeholder={translate('::App.ListFormEdit.AllowTaskAdding')}
component={Checkbox}
/>
</FormItem>
<FormItem
label={translate('::App.ListFormEdit.AllowTaskDeleting')}
invalid={
errors.ganttOptionDto?.allowTaskDeleting &&
touched.ganttOptionDto?.allowTaskDeleting
}
errorMessage={errors.ganttOptionDto?.allowTaskDeleting}
>
<Field
name="ganttOptionDto.allowTaskDeleting"
placeholder={translate('::App.ListFormEdit.AllowTaskDeleting')}
component={Checkbox}
/>
</FormItem>
<FormItem
label={translate('::App.ListFormEdit.AllowDependencyDeleting')}
invalid={
errors.ganttOptionDto?.allowDependencyDeleting &&
touched.ganttOptionDto?.allowDependencyDeleting
}
errorMessage={errors.ganttOptionDto?.allowDependencyDeleting}
>
<Field
name="ganttOptionDto.allowDependencyDeleting"
placeholder={translate('::App.ListFormEdit.AllowDependencyDeleting')}
component={Checkbox}
/>
</FormItem>
<FormItem <FormItem
label={translate('::App.ListFormEdit.AllowResourceUpdating')} label={translate('::App.ListFormEdit.AllowResourceUpdating')}
invalid={ invalid={
@ -479,23 +488,61 @@ function FormTabGantt(props: FormEditProps) {
name="ganttOptionDto.allowResourceUpdating" name="ganttOptionDto.allowResourceUpdating"
placeholder={translate('::App.ListFormEdit.AllowResourceUpdating')} placeholder={translate('::App.ListFormEdit.AllowResourceUpdating')}
component={Checkbox} component={Checkbox}
disabled={!values.ganttOptionDto.editingEnabled}
/> />
</FormItem> </FormItem>
</div>
<div>
<FormItem <FormItem
label={translate('::App.ListFormEdit.AllowTaskResourceUpdating')} label={translate('::App.ListFormEdit.AllowResourceDeleting')}
invalid={ invalid={
errors.ganttOptionDto?.allowTaskResourceUpdating && errors.ganttOptionDto?.allowResourceDeleting &&
touched.ganttOptionDto?.allowTaskResourceUpdating touched.ganttOptionDto?.allowResourceDeleting
} }
errorMessage={errors.ganttOptionDto?.allowTaskResourceUpdating} errorMessage={errors.ganttOptionDto?.allowResourceDeleting}
> >
<Field <Field
name="ganttOptionDto.allowTaskResourceUpdating" name="ganttOptionDto.allowResourceDeleting"
placeholder={translate( placeholder={translate('::App.ListFormEdit.AllowResourceDeleting')}
'::App.ListFormEdit.AllowTaskResourceUpdating',
)}
component={Checkbox} component={Checkbox}
disabled={!values.ganttOptionDto.editingEnabled}
/>
</FormItem>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-3 border-t border-gray-200 pt-1">
<div>
<FormItem
label={translate('::App.ListFormEdit.AllowDependencyAdding')}
invalid={
errors.ganttOptionDto?.allowDependencyAdding &&
touched.ganttOptionDto?.allowDependencyAdding
}
errorMessage={errors.ganttOptionDto?.allowDependencyAdding}
>
<Field
name="ganttOptionDto.allowDependencyAdding"
placeholder={translate('::App.ListFormEdit.AllowDependencyAdding')}
component={Checkbox}
disabled={!values.ganttOptionDto.editingEnabled}
/>
</FormItem>
</div>
<div>
<FormItem
label={translate('::App.ListFormEdit.AllowDependencyDeleting')}
invalid={
errors.ganttOptionDto?.allowDependencyDeleting &&
touched.ganttOptionDto?.allowDependencyDeleting
}
errorMessage={errors.ganttOptionDto?.allowDependencyDeleting}
>
<Field
name="ganttOptionDto.allowDependencyDeleting"
placeholder={translate('::App.ListFormEdit.AllowDependencyDeleting')}
component={Checkbox}
disabled={!values.ganttOptionDto.editingEnabled}
/> />
</FormItem> </FormItem>
</div> </div>

View file

@ -101,7 +101,7 @@ const initialValues: ListFormWizardDto = {
endExpr: '', endExpr: '',
progressExpr: '', progressExpr: '',
scaleType: 'weeks', scaleType: 'weeks',
allowEditing: false, editingEnabled: false,
allowTaskAdding: false, allowTaskAdding: false,
allowTaskUpdating: false, allowTaskUpdating: false,
allowTaskResourceUpdating: false, allowTaskResourceUpdating: false,
@ -154,17 +154,17 @@ const initialValues: ListFormWizardDto = {
approvalIsResetWorkflow: false, approvalIsResetWorkflow: false,
criteria: [], criteria: [],
}, },
languageTextMenuEn: '', menuEn: '',
languageTextMenuTr: '', menuTr: '',
languageTextTitleEn: '', titleEn: '',
languageTextTitleTr: '', titleTr: '',
languageTextDescEn: '', descEn: '',
languageTextDescTr: '', descTr: '',
languageTextMenuParentEn: '', menuParentEn: '',
languageTextMenuParentTr: '', menuParentTr: '',
permissionGroupName: '', permissionGroupName: '',
permissionGroupDisplayNameEn: '', permissionGroupEn: '',
permissionGroupDisplayNameTr: '', permissionGroupTr: '',
menuParentCode: '', menuParentCode: '',
menuParentModuleId: '', menuParentModuleId: '',
menuParentIcon: '', menuParentIcon: '',
@ -194,10 +194,10 @@ const step1ValidationSchema = Yup.object().shape({
// İzin grubu menüden bağımsızdır: menüsüz wizard'da da izinler üretilir ve bir gruba yazılır. // İzin grubu menüden bağımsızdır: menüsüz wizard'da da izinler üretilir ve bir gruba yazılır.
permissionGroupName: Yup.string().required(), permissionGroupName: Yup.string().required(),
// Grup adi ile birlikte iki dilli gorunen ad da seed dosyasina yazilir; bos birakilamaz. // Grup adi ile birlikte iki dilli gorunen ad da seed dosyasina yazilir; bos birakilamaz.
permissionGroupDisplayNameEn: Yup.string().required(), permissionGroupEn: Yup.string().required(),
permissionGroupDisplayNameTr: Yup.string().required(), permissionGroupTr: Yup.string().required(),
languageTextMenuEn: Yup.string().required(), menuEn: Yup.string().required(),
languageTextMenuTr: Yup.string().required(), menuTr: Yup.string().required(),
}) })
/** /**
@ -213,10 +213,10 @@ const requiredForListComponent = <T extends Yup.Schema>(schema: T) =>
const step2ValidationSchema = Yup.object().shape({ const step2ValidationSchema = Yup.object().shape({
listFormCode: requiredForListComponent(Yup.string()), listFormCode: requiredForListComponent(Yup.string()),
languageTextTitleEn: requiredForListComponent(Yup.string()), titleEn: requiredForListComponent(Yup.string()),
languageTextTitleTr: requiredForListComponent(Yup.string()), titleTr: requiredForListComponent(Yup.string()),
languageTextDescEn: requiredForListComponent(Yup.string()), descEn: requiredForListComponent(Yup.string()),
languageTextDescTr: requiredForListComponent(Yup.string()), descTr: requiredForListComponent(Yup.string()),
dataSourceCode: requiredForListComponent(Yup.string()), dataSourceCode: requiredForListComponent(Yup.string()),
dataSourceConnectionString: Yup.string(), dataSourceConnectionString: Yup.string(),
selectCommandType: requiredForListComponent(Yup.string()), selectCommandType: requiredForListComponent(Yup.string()),
@ -610,8 +610,8 @@ const Wizard = () => {
const formik = formikRef.current const formik = formikRef.current
formik?.setFieldValue('permissionGroupName', groupName) formik?.setFieldValue('permissionGroupName', groupName)
if (!groupName) { if (!groupName) {
formik?.setFieldValue('permissionGroupDisplayNameEn', '') formik?.setFieldValue('permissionGroupEn', '')
formik?.setFieldValue('permissionGroupDisplayNameTr', '') formik?.setFieldValue('permissionGroupTr', '')
return return
} }
// Sirasiyla: mevcut grubun metinleri, cagiranin verdigi metinler, ayni koda sahip menunun // Sirasiyla: mevcut grubun metinleri, cagiranin verdigi metinler, ayni koda sahip menunun
@ -619,11 +619,11 @@ const Wizard = () => {
const texts = permissionGroupTextsRef.current[groupName] const texts = permissionGroupTextsRef.current[groupName]
const menu = rawMenuItems.find((item) => item.code === groupName) const menu = rawMenuItems.find((item) => item.code === groupName)
formik?.setFieldValue( formik?.setFieldValue(
'permissionGroupDisplayNameEn', 'permissionGroupEn',
texts?.en || fallbackTexts?.en || menu?.menuTextEn || groupName, texts?.en || fallbackTexts?.en || menu?.menuTextEn || groupName,
) )
formik?.setFieldValue( formik?.setFieldValue(
'permissionGroupDisplayNameTr', 'permissionGroupTr',
texts?.tr || fallbackTexts?.tr || menu?.menuTextTr || groupName, texts?.tr || fallbackTexts?.tr || menu?.menuTextTr || groupName,
) )
} }
@ -651,8 +651,8 @@ const Wizard = () => {
: [...prev, { value: group.name, label: permissionGroupLabel(group) }], : [...prev, { value: group.name, label: permissionGroupLabel(group) }],
) )
formik?.setFieldValue('permissionGroupName', group.name) formik?.setFieldValue('permissionGroupName', group.name)
formik?.setFieldValue('permissionGroupDisplayNameEn', group.displayNameEn) formik?.setFieldValue('permissionGroupEn', group.displayNameEn)
formik?.setFieldValue('permissionGroupDisplayNameTr', group.displayNameTr) formik?.setFieldValue('permissionGroupTr', group.displayNameTr)
} }
useEffect(() => { useEffect(() => {
@ -723,17 +723,17 @@ const Wizard = () => {
schedulerOptionDto: w.schedulerOptionDto ?? initialValues.schedulerOptionDto, schedulerOptionDto: w.schedulerOptionDto ?? initialValues.schedulerOptionDto,
todoOptionDto: w.todoOptionDto ?? initialValues.todoOptionDto, todoOptionDto: w.todoOptionDto ?? initialValues.todoOptionDto,
workflowDto: w.workflowDto ?? initialValues.workflowDto, workflowDto: w.workflowDto ?? initialValues.workflowDto,
languageTextMenuEn: w.languageTextMenuEn ?? '', menuEn: w.menuEn ?? '',
languageTextMenuTr: w.languageTextMenuTr ?? '', menuTr: w.menuTr ?? '',
languageTextTitleEn: w.languageTextTitleEn ?? '', titleEn: w.titleEn ?? '',
languageTextTitleTr: w.languageTextTitleTr ?? '', titleTr: w.titleTr ?? '',
languageTextDescEn: w.languageTextDescEn ?? '', descEn: w.descEn ?? '',
languageTextDescTr: w.languageTextDescTr ?? '', descTr: w.descTr ?? '',
languageTextMenuParentEn: w.languageTextMenuParentEn ?? '', menuParentEn: w.menuParentEn ?? '',
languageTextMenuParentTr: w.languageTextMenuParentTr ?? '', menuParentTr: w.menuParentTr ?? '',
permissionGroupName: w.permissionGroupName ?? '', permissionGroupName: w.permissionGroupName ?? '',
permissionGroupDisplayNameEn: w.permissionGroupDisplayNameEn ?? '', permissionGroupEn: w.permissionGroupEn ?? '',
permissionGroupDisplayNameTr: w.permissionGroupDisplayNameTr ?? '', permissionGroupTr: w.permissionGroupTr ?? '',
menuParentCode: w.menuParentCode ?? '', menuParentCode: w.menuParentCode ?? '',
menuParentModuleId: w.menuParentModuleId ?? '', menuParentModuleId: w.menuParentModuleId ?? '',
menuParentIcon: w.menuParentIcon ?? '', menuParentIcon: w.menuParentIcon ?? '',
@ -830,12 +830,12 @@ const Wizard = () => {
const setAutoText = ( const setAutoText = (
field: keyof Pick< field: keyof Pick<
ListFormWizardDto, ListFormWizardDto,
| 'languageTextMenuEn' | 'menuEn'
| 'languageTextMenuTr' | 'menuTr'
| 'languageTextTitleEn' | 'titleEn'
| 'languageTextTitleTr' | 'titleTr'
| 'languageTextDescEn' | 'descEn'
| 'languageTextDescTr' | 'descTr'
>, >,
) => { ) => {
const current = formik?.values[field] const current = formik?.values[field]
@ -847,12 +847,12 @@ const Wizard = () => {
formik?.setFieldValue('wizardName', name) formik?.setFieldValue('wizardName', name)
formik?.setFieldValue('listFormCode', derived) formik?.setFieldValue('listFormCode', derived)
formik?.setFieldValue('menuCode', derived) formik?.setFieldValue('menuCode', derived)
setAutoText('languageTextMenuEn') setAutoText('menuEn')
setAutoText('languageTextMenuTr') setAutoText('menuTr')
setAutoText('languageTextTitleEn') setAutoText('titleEn')
setAutoText('languageTextTitleTr') setAutoText('titleTr')
setAutoText('languageTextDescEn') setAutoText('descEn')
setAutoText('languageTextDescTr') setAutoText('descTr')
} }
/** /**
@ -943,8 +943,8 @@ const Wizard = () => {
formik?.setFieldValue('menuParentCode', '') formik?.setFieldValue('menuParentCode', '')
formik?.setFieldValue('menuParentModuleId', '') formik?.setFieldValue('menuParentModuleId', '')
formik?.setFieldValue('menuParentIcon', '') formik?.setFieldValue('menuParentIcon', '')
formik?.setFieldValue('languageTextMenuParentEn', '') formik?.setFieldValue('menuParentEn', '')
formik?.setFieldValue('languageTextMenuParentTr', '') formik?.setFieldValue('menuParentTr', '')
if (derivedFromParent) handlePermissionGroupChange('') if (derivedFromParent) handlePermissionGroupChange('')
} }
@ -961,8 +961,8 @@ const Wizard = () => {
formik?.setFieldValue('menuParentCode', '') formik?.setFieldValue('menuParentCode', '')
formik?.setFieldValue('menuParentModuleId', '') formik?.setFieldValue('menuParentModuleId', '')
formik?.setFieldValue('menuParentIcon', '') formik?.setFieldValue('menuParentIcon', '')
formik?.setFieldValue('languageTextMenuParentEn', '') formik?.setFieldValue('menuParentEn', '')
formik?.setFieldValue('languageTextMenuParentTr', '') formik?.setFieldValue('menuParentTr', '')
} }
} }
@ -977,8 +977,8 @@ const Wizard = () => {
formik?.setFieldValue('menuParentCode', '') formik?.setFieldValue('menuParentCode', '')
formik?.setFieldValue('menuParentModuleId', '') formik?.setFieldValue('menuParentModuleId', '')
formik?.setFieldValue('menuParentIcon', '') formik?.setFieldValue('menuParentIcon', '')
formik?.setFieldValue('languageTextMenuParentEn', '') formik?.setFieldValue('menuParentEn', '')
formik?.setFieldValue('languageTextMenuParentTr', '') formik?.setFieldValue('menuParentTr', '')
formik?.setFieldValue('menuIcon', '') formik?.setFieldValue('menuIcon', '')
formik?.setFieldValue('menuOrder', 0) formik?.setFieldValue('menuOrder', 0)
} }
@ -996,8 +996,8 @@ const Wizard = () => {
} }
const selectedMenu = rawMenuItems.find((item) => item.code === code) const selectedMenu = rawMenuItems.find((item) => item.code === code)
formikRef.current?.setFieldValue('menuParentIcon', selectedMenu?.icon ?? '') formikRef.current?.setFieldValue('menuParentIcon', selectedMenu?.icon ?? '')
formikRef.current?.setFieldValue('languageTextMenuParentEn', selectedMenu?.menuTextEn ?? '') formikRef.current?.setFieldValue('menuParentEn', selectedMenu?.menuTextEn ?? '')
formikRef.current?.setFieldValue('languageTextMenuParentTr', selectedMenu?.menuTextTr ?? '') formikRef.current?.setFieldValue('menuParentTr', selectedMenu?.menuTextTr ?? '')
if (!code) { if (!code) {
formikRef.current?.setFieldValue('menuParentModuleId', '') formikRef.current?.setFieldValue('menuParentModuleId', '')
return return
@ -1023,8 +1023,8 @@ const Wizard = () => {
.reduce((max, item) => Math.max(max, item.order ?? 0), 0) + 1 .reduce((max, item) => Math.max(max, item.order ?? 0), 0) + 1
formikRef.current?.setFieldValue('menuOrder', nextMenuOrder) formikRef.current?.setFieldValue('menuOrder', nextMenuOrder)
formikRef.current?.setFieldValue('menuParentIcon', menu.icon ?? '') formikRef.current?.setFieldValue('menuParentIcon', menu.icon ?? '')
formikRef.current?.setFieldValue('languageTextMenuParentEn', menu.menuTextEn) formikRef.current?.setFieldValue('menuParentEn', menu.menuTextEn)
formikRef.current?.setFieldValue('languageTextMenuParentTr', menu.menuTextTr) formikRef.current?.setFieldValue('menuParentTr', menu.menuTextTr)
const rootCode = menu.parentCode ? findRootCode(rawMenuItems, menu.parentCode) : menu.code const rootCode = menu.parentCode ? findRootCode(rawMenuItems, menu.parentCode) : menu.code
const existingRoot = rawMenuItems.find((item) => item.code === rootCode) const existingRoot = rawMenuItems.find((item) => item.code === rootCode)

View file

@ -133,10 +133,10 @@ const WizardStepDataSettings = ({
translate('::App.Listform.ListformField.ConnectionString'), translate('::App.Listform.ListformField.ConnectionString'),
!values.selectCommand && translate('::App.WizardStep2.SelectCommand'), !values.selectCommand && translate('::App.WizardStep2.SelectCommand'),
!values.keyFieldName && translate('::App.WizardStep4.KeyField'), !values.keyFieldName && translate('::App.WizardStep4.KeyField'),
!values.languageTextDescEn && translate('::App.WizardStep2.DescriptionTextEnglish'), !values.descEn && translate('::App.WizardStep2.DescriptionTextEnglish'),
!values.languageTextDescTr && translate('::App.WizardStep2.DescriptionTextTurkish'), !values.descTr && translate('::App.WizardStep2.DescriptionTextTurkish'),
!values.languageTextTitleEn && translate('::App.WizardStep2.TitleTextEnglish'), !values.titleEn && translate('::App.WizardStep2.TitleTextEnglish'),
!values.languageTextTitleTr && translate('::App.WizardStep2.TitleTextTurkish'), !values.titleTr && translate('::App.WizardStep2.TitleTextTurkish'),
selectedColumns.size === 0 && translate('::App.WizardStep2.ColumnSelection'), selectedColumns.size === 0 && translate('::App.WizardStep2.ColumnSelection'),
].filter(Boolean) as string[] ].filter(Boolean) as string[]
const step2CanGo = step2Missing.length === 0 const step2CanGo = step2Missing.length === 0
@ -653,13 +653,13 @@ const WizardStepDataSettings = ({
<FormItem <FormItem
label={translate('::App.WizardStep2.TitleTextEnglish')} label={translate('::App.WizardStep2.TitleTextEnglish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextTitleEn && touched.languageTextTitleEn)} invalid={!!(errors.titleEn && touched.titleEn)}
errorMessage={errors.languageTextTitleEn} errorMessage={errors.titleEn}
> >
<Field <Field
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextTitleEn" name="titleEn"
placeholder={translate('::App.WizardStep2.TitleTextEnglish')} placeholder={translate('::App.WizardStep2.TitleTextEnglish')}
component={Input} component={Input}
/> />
@ -668,13 +668,13 @@ const WizardStepDataSettings = ({
<FormItem <FormItem
label={translate('::App.WizardStep2.TitleTextTurkish')} label={translate('::App.WizardStep2.TitleTextTurkish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextTitleTr && touched.languageTextTitleTr)} invalid={!!(errors.titleTr && touched.titleTr)}
errorMessage={errors.languageTextTitleTr} errorMessage={errors.titleTr}
> >
<Field <Field
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextTitleTr" name="titleTr"
placeholder={translate('::App.WizardStep2.TitleTextTurkish')} placeholder={translate('::App.WizardStep2.TitleTextTurkish')}
component={Input} component={Input}
/> />
@ -683,13 +683,13 @@ const WizardStepDataSettings = ({
<FormItem <FormItem
label={translate('::App.WizardStep2.DescriptionTextEnglish')} label={translate('::App.WizardStep2.DescriptionTextEnglish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextDescEn && touched.languageTextDescEn)} invalid={!!(errors.descEn && touched.descEn)}
errorMessage={errors.languageTextDescEn} errorMessage={errors.descEn}
> >
<Field <Field
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextDescEn" name="descEn"
placeholder={translate('::App.WizardStep2.DescriptionTextEnglish')} placeholder={translate('::App.WizardStep2.DescriptionTextEnglish')}
component={Input} component={Input}
/> />
@ -698,13 +698,13 @@ const WizardStepDataSettings = ({
<FormItem <FormItem
label={translate('::App.WizardStep2.DescriptionTextTurkish')} label={translate('::App.WizardStep2.DescriptionTextTurkish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextDescTr && touched.languageTextDescTr)} invalid={!!(errors.descTr && touched.descTr)}
errorMessage={errors.languageTextDescTr} errorMessage={errors.descTr}
> >
<Field <Field
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextDescTr" name="descTr"
placeholder={translate('::App.WizardStep2.DescriptionTextTurkish')} placeholder={translate('::App.WizardStep2.DescriptionTextTurkish')}
component={Input} component={Input}
/> />

View file

@ -85,14 +85,14 @@ function buildLogSteps(
{ {
id: 3, id: 3,
label: translate('::App.Step4Log.SavingLanguageTexts'), label: translate('::App.Step4Log.SavingLanguageTexts'),
detail: `EN: ${values.languageTextMenuEn} / TR: ${values.languageTextMenuTr}`, detail: `EN: ${values.menuEn} / TR: ${values.menuTr}`,
}, },
{ {
id: 4, id: 4,
label: translate('::App.Step4Log.ConfiguringPermission', { label: translate('::App.Step4Log.ConfiguringPermission', {
0: values.permissionGroupName, 0: values.permissionGroupName,
}), }),
detail: `EN: ${values.permissionGroupDisplayNameEn} / TR: ${values.permissionGroupDisplayNameTr}`, detail: `EN: ${values.permissionGroupEn} / TR: ${values.permissionGroupTr}`,
}, },
{ {
id: 5, id: 5,
@ -116,14 +116,14 @@ function buildLogSteps(
{ {
id: 3, id: 3,
label: translate('::App.Step4Log.SavingLanguageTexts'), label: translate('::App.Step4Log.SavingLanguageTexts'),
detail: `EN: ${values.languageTextMenuEn} / TR: ${values.languageTextMenuTr}`, detail: `EN: ${values.menuEn} / TR: ${values.menuTr}`,
}, },
{ {
id: 4, id: 4,
label: translate('::App.Step4Log.ConfiguringPermission', { label: translate('::App.Step4Log.ConfiguringPermission', {
0: values.permissionGroupName, 0: values.permissionGroupName,
}), }),
detail: `EN: ${values.permissionGroupDisplayNameEn} / TR: ${values.permissionGroupDisplayNameTr}`, detail: `EN: ${values.permissionGroupEn} / TR: ${values.permissionGroupTr}`,
}, },
{ {
id: 5, id: 5,
@ -324,22 +324,22 @@ const WizardStepDeploy = ({
/> />
<Row <Row
label={translate('::App.WizardStep1.PermissionGroupDisplayNameTr')} label={translate('::App.WizardStep1.PermissionGroupDisplayNameTr')}
value={values.permissionGroupDisplayNameTr} value={values.permissionGroupTr}
/> />
<Row <Row
label={translate('::App.WizardStep1.PermissionGroupDisplayNameEn')} label={translate('::App.WizardStep1.PermissionGroupDisplayNameEn')}
value={values.permissionGroupDisplayNameEn} value={values.permissionGroupEn}
/> />
<Row label={translate('::App.Listform.ListformField.Icon')} value={values.menuIcon} /> <Row label={translate('::App.Listform.ListformField.Icon')} value={values.menuIcon} />
<Row label={translate('::App.WizardStep4.MenuTr')} value={values.languageTextMenuTr} /> <Row label={translate('::App.WizardStep4.MenuTr')} value={values.menuTr} />
<Row label={translate('::App.WizardStep4.MenuEn')} value={values.languageTextMenuEn} /> <Row label={translate('::App.WizardStep4.MenuEn')} value={values.menuEn} />
<Row <Row
label={translate('::App.WizardStep4.MenuParentTr')} label={translate('::App.WizardStep4.MenuParentTr')}
value={values.languageTextMenuParentTr} value={values.menuParentTr}
/> />
<Row <Row
label={translate('::App.WizardStep4.MenuParentEn')} label={translate('::App.WizardStep4.MenuParentEn')}
value={values.languageTextMenuParentEn} value={values.menuParentEn}
/> />
</Section> </Section>
@ -362,19 +362,19 @@ const WizardStepDeploy = ({
/> />
<Row <Row
label={translate('::App.WizardStep4.TitleTr')} label={translate('::App.WizardStep4.TitleTr')}
value={values.languageTextTitleTr} value={values.titleTr}
/> />
<Row <Row
label={translate('::App.WizardStep4.TitleEn')} label={translate('::App.WizardStep4.TitleEn')}
value={values.languageTextTitleEn} value={values.titleEn}
/> />
<Row <Row
label={translate('::App.WizardStep4.DescTr')} label={translate('::App.WizardStep4.DescTr')}
value={values.languageTextDescTr} value={values.descTr}
/> />
<Row <Row
label={translate('::App.WizardStep4.DescEn')} label={translate('::App.WizardStep4.DescEn')}
value={values.languageTextDescEn} value={values.descEn}
/> />
<Row label={translate('::App.Platform.DataSource')} value={values.dataSourceCode} /> <Row label={translate('::App.Platform.DataSource')} value={values.dataSourceCode} />
<Row <Row

View file

@ -44,7 +44,7 @@ const WizardStepGanttLayout = ({
['progressExpr', translate('::App.ListFormEdit.ProgressExpr')], ['progressExpr', translate('::App.ListFormEdit.ProgressExpr')],
] as const ] as const
const permissionFields = [ const permissionFields = [
['allowEditing', '::App.ListFormEdit.AllowEditing'], ['editingEnabled', '::App.ListFormEdit.EditingEnabled'],
['allowTaskAdding', '::App.ListFormEdit.AllowTaskAdding'], ['allowTaskAdding', '::App.ListFormEdit.AllowTaskAdding'],
['allowTaskUpdating', '::App.ListFormEdit.AllowTaskUpdating'], ['allowTaskUpdating', '::App.ListFormEdit.AllowTaskUpdating'],
['allowTaskDeleting', '::App.ListFormEdit.AllowTaskDeleting'], ['allowTaskDeleting', '::App.ListFormEdit.AllowTaskDeleting'],

View file

@ -637,12 +637,12 @@ const WizardStepMenu = ({
// burada kontrol edilmezse "Next" aktif görünüp sessizce çalışmıyordu. // burada kontrol edilmezse "Next" aktif görünüp sessizce çalışmıyordu.
createMenu && !(Number(values.menuOrder) >= 1) && translate('::App.WizardStep1.MenuOrder'), createMenu && !(Number(values.menuOrder) >= 1) && translate('::App.WizardStep1.MenuOrder'),
!values.permissionGroupName && translate('::App.WizardStep1.PermissionGroupName'), !values.permissionGroupName && translate('::App.WizardStep1.PermissionGroupName'),
!values.permissionGroupDisplayNameEn && !values.permissionGroupEn &&
translate('::App.WizardStep1.PermissionGroupDisplayNameEn'), translate('::App.WizardStep1.PermissionGroupDisplayNameEn'),
!values.permissionGroupDisplayNameTr && !values.permissionGroupTr &&
translate('::App.WizardStep1.PermissionGroupDisplayNameTr'), translate('::App.WizardStep1.PermissionGroupDisplayNameTr'),
!values.languageTextMenuEn && translate('::App.WizardStep4.MenuEn'), !values.menuEn && translate('::App.WizardStep4.MenuEn'),
!values.languageTextMenuTr && translate('::App.WizardStep4.MenuTr'), !values.menuTr && translate('::App.WizardStep4.MenuTr'),
createMenu && !values.menuIcon && translate('::App.WizardStep4.MenuIcon'), createMenu && !values.menuIcon && translate('::App.WizardStep4.MenuIcon'),
].filter(Boolean) as string[] ].filter(Boolean) as string[]
// Geçersiz ya da çakışan ad deploy'da menü/permission kayıtlarını bozar; adım burada durur. // Geçersiz ya da çakışan ad deploy'da menü/permission kayıtlarını bozar; adım burada durur.
@ -805,13 +805,13 @@ const WizardStepMenu = ({
<FormItem <FormItem
label={translate('::App.Platform.DisplayNameEnglish')} label={translate('::App.Platform.DisplayNameEnglish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextMenuEn && touched.languageTextMenuEn)} invalid={!!(errors.menuEn && touched.menuEn)}
errorMessage={errors.languageTextMenuEn} errorMessage={errors.menuEn}
> >
<Field <Field
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextMenuEn" name="menuEn"
placeholder={translate('::App.Platform.DisplayNameEnglish')} placeholder={translate('::App.Platform.DisplayNameEnglish')}
component={Input} component={Input}
/> />
@ -821,13 +821,13 @@ const WizardStepMenu = ({
<FormItem <FormItem
label={translate('::App.Platform.DisplayNameTurkish')} label={translate('::App.Platform.DisplayNameTurkish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextMenuTr && touched.languageTextMenuTr)} invalid={!!(errors.menuTr && touched.menuTr)}
errorMessage={errors.languageTextMenuTr} errorMessage={errors.menuTr}
> >
<Field <Field
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextMenuTr" name="menuTr"
placeholder={translate('::App.Platform.DisplayNameTurkish')} placeholder={translate('::App.Platform.DisplayNameTurkish')}
component={Input} component={Input}
/> />
@ -881,8 +881,8 @@ const WizardStepMenu = ({
existingNames={permissionGroupList.map((o) => o.value ?? '')} existingNames={permissionGroupList.map((o) => o.value ?? '')}
initialValue={{ initialValue={{
name: values.permissionGroupName ?? '', name: values.permissionGroupName ?? '',
displayNameEn: values.permissionGroupDisplayNameEn ?? '', displayNameEn: values.permissionGroupEn ?? '',
displayNameTr: values.permissionGroupDisplayNameTr ?? '', displayNameTr: values.permissionGroupTr ?? '',
}} }}
onClose={() => setPermissionGroupDialogOpen(false)} onClose={() => setPermissionGroupDialogOpen(false)}
onSave={onPermissionGroupDefine} onSave={onPermissionGroupDefine}

View file

@ -585,7 +585,7 @@ const GanttView = (props: GanttViewProps) => {
</Toolbar> </Toolbar>
<Editing <Editing
enabled={gridDto.gridOptions.ganttOptionDto?.allowEditing} enabled={gridDto.gridOptions.ganttOptionDto?.editingEnabled}
allowTaskAdding={gridDto.gridOptions.ganttOptionDto?.allowTaskAdding} allowTaskAdding={gridDto.gridOptions.ganttOptionDto?.allowTaskAdding}
allowTaskUpdating={gridDto.gridOptions.ganttOptionDto?.allowTaskUpdating} allowTaskUpdating={gridDto.gridOptions.ganttOptionDto?.allowTaskUpdating}
allowTaskDeleting={gridDto.gridOptions.ganttOptionDto?.allowTaskDeleting} allowTaskDeleting={gridDto.gridOptions.ganttOptionDto?.allowTaskDeleting}