From 0941b9143b3b90435f3559bdd0d7bcebf638db9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Wed, 2 Sep 2026 17:31:39 +0300 Subject: [PATCH] =?UTF-8?q?Wizard=20dil=20deste=C4=9Fi=20ve=20hatalar=20gi?= =?UTF-8?q?derildi.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/instructions/ai.instructions.md | 5 +- .github/instructions/lowcode.instructions.md | 63 ++-- README.md | 2 +- .../GridOptionsDto/GanttOptionDto.cs | 2 +- .../ListForms/Wizard/ListFormWizardDto.cs | 22 +- .../ListForms/Wizard/WizardSeedFileDto.cs | 81 ++++-- .../ListForms/ListFormWizardAppService.cs | 42 ++- .../Migrations/LanguagesData.json | 10 +- .../Migrations/WizardDataSeeder.cs | 96 +++--- configs/seeds/host/wizard/Approval.json | 52 ++-- configs/seeds/host/wizard/Customers.json | 48 +-- configs/seeds/host/wizard/Milestones.json | 44 +-- configs/seeds/host/wizard/Tags.json | 40 +-- .../seeds/host/wizard/TaskDependencies.json | 44 +-- configs/seeds/host/wizard/TaskSubTasks.json | 60 ++-- configs/seeds/host/wizard/TaskTimesheets.json | 52 ++-- configs/seeds/host/wizard/Tasks.json | 142 ++++----- ui/src/proxy/admin/wizard/models.ts | 20 +- ui/src/proxy/form/models.ts | 2 +- .../admin/listForm/edit/FormTabGantt.tsx | 275 ++++++++++-------- ui/src/views/admin/listForm/wizard/Wizard.tsx | 114 ++++---- .../wizard/WizardStepDataSettings.tsx | 32 +- .../listForm/wizard/WizardStepDeploy.tsx | 28 +- .../listForm/wizard/WizardStepGanttLayout.tsx | 2 +- .../admin/listForm/wizard/WizardStepMenu.tsx | 24 +- ui/src/views/list/GanttView.tsx | 2 +- 26 files changed, 704 insertions(+), 600 deletions(-) diff --git a/.github/instructions/ai.instructions.md b/.github/instructions/ai.instructions.md index 832b02ae..142b1803 100644 --- a/.github/instructions/ai.instructions.md +++ b/.github/instructions/ai.instructions.md @@ -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`. 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 - writes the database values back, so the seed file always carries both languages. +- Selecting an existing group fills `PermissionGroupEn/Tr` (seed file: `Language.PermissionGroupEn/Tr`); + 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. - AI must never propose a permission group without EN + TR display names. diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md index be449a0d..0b5fd367 100644 --- a/.github/instructions/lowcode.instructions.md +++ b/.github/instructions/lowcode.instructions.md @@ -572,13 +572,12 @@ Okuyan: `WizardDataSeeder` · Yazan: `ListFormWizardAppService` ve `WizardSeedSy "Wizard": { // yalnızca ekrandan üretilemeyen bilgiler — 4.2 "ComponentKind": 0, "WizardName": "Tags", "SeededAt": "2026-09-01T09:03:00", "WizardCode": "App.Prj.Tags", "CustomComponentName": "", - "PermissionGroupName": "App.Prj", "PermissionGroupDisplayNameEn": "…", "PermissionGroupDisplayNameTr": "…", - "DataSourceConnectionString": "", "ModuleId": "Prj", + "PermissionGroupName": "App.Prj", "DataSourceConnectionString": "", "ModuleId": "Prj", "Menu": { "MenuCode": "…", "MenuOrder": 2, "MenuUrl": "…", "MenuIcon": "…", "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": "…", - "EnglishCaption": "…", "TurkishCaption": "…" } ] } ] + "En": "…", "Tr": "…" } ] } ] }, "ListForm": { /* GridOptionsEditDto — ekranın kendisi, ListForm 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 | | --- | --- | -> `LanguageText*` alanlarının tamamı dosyada `Language` başlığı altındadır. `ListForm` yalnızca -> dil **anahtarını** taşır (`Title = "{ListFormCode}.Title"`), metinlerin tek kaynağı burasıdır. +> Dil metinlerinin tamamı dosyada `Language` başlığı altındadır; başlık zaten bölümü işaretlediği +> 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ı. | -| `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. | -| `LanguageTextMenuEn` / `Tr` | Menü etiketi. | -| `LanguageTextTitleEn` / `Tr` | Ekran başlığı (yalnızca List yolunda üretilir). | -| `LanguageTextDescEn` / `Tr` | Ekran açıklaması (yalnızca List yolunda). | -| `LanguageTextMenuParentEn` / `Tr` | Üst menü etiketi. | +| `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. | +| `Language.MenuEn` / `Tr` | Menü etiketi. | +| `Language.TitleEn` / `Tr` | Ekran başlığı (yalnızca List yolunda üretilir). | +| `Language.DescEn` / `Tr` | Ekran açıklaması (yalnızca List yolunda). | +| `Language.MenuParentEn` / `Tr` | Üst menü etiketi. | Ü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 @@ -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 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. Her `Items` öğesi: @@ -728,7 +729,7 @@ Her `Items` öğesi: | --- | --- | | `FieldName` | Veri kolonunun adı (SQL'deki adıyla birebir). | | `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. | | `EditorOptions` | `[Fields]` DevExtreme editör JSON'u — §6. | | `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) | | `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 | -| `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ı}` | | `ColSpan` | `1` | | `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, "Tree": false, "Gantt": false, "Scheduler": false, "Todo": false, - "LanguageTextMenuEn": "Orders", "LanguageTextMenuTr": "Siparişler", - "LanguageTextTitleEn": "Orders", "LanguageTextTitleTr": "Siparişler", - "LanguageTextDescEn": "Order list", "LanguageTextDescTr": "Sipariş listesi", - "LanguageTextMenuParentEn": "MRP", "LanguageTextMenuParentTr": "MRP", + "MenuEn": "Orders", "MenuTr": "Siparişler", + "TitleEn": "Orders", "TitleTr": "Siparişler", + "DescEn": "Order list", "DescTr": "Sipariş listesi", + "MenuParentEn": "MRP", "MenuParentTr": "MRP", "PermissionGroupName": "App.Mrp", - "PermissionGroupDisplayNameEn": "MRP", "PermissionGroupDisplayNameTr": "MRP", + "PermissionGroupEn": "MRP", "PermissionGroupTr": "MRP", "MenuParentCode": "App.Mrp", "MenuParentModuleId": "MRP", "MenuParentIcon": "FcFactory", "MenuIcon": "FcShipped", @@ -1081,20 +1082,20 @@ varsayılan değeri olur ve **yeni kayıtta o alanı otomatik doldurur**. "Items": [ { "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", - "TurkishCaption": "Kimlik", "EnglishCaption": "Id", + "Tr": "Kimlik", "En": "Id", "EditorType": "dxTextBox", "DbSourceType": 11, "IsRequired": false, "IncludeInEditingForm": false, "ColSpan": 1 }, { "FieldName": "OrderNo", "CaptionName": "App.Listform.ListformField.OrderNo", - "TurkishCaption": "Sipariş No", "EnglishCaption": "Order No", + "Tr": "Sipariş No", "En": "Order No", "EditorType": "dxTextBox", "DbSourceType": 16, "IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1, "EditorOptions": "{\"showClearButton\":true,\"maxLength\":20}" }, { "FieldName": "CustomerId", "CaptionName": "App.Listform.ListformField.Customer", - "TurkishCaption": "Cari", "EnglishCaption": "Customer", + "Tr": "Cari", "En": "Customer", "EditorType": "dxSelectBox", "DbSourceType": 11, "IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1, "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", - "TurkishCaption": "Miktar", "EnglishCaption": "Quantity", + "Tr": "Miktar", "En": "Quantity", "EditorType": "dxNumberBox", "DbSourceType": 7, "IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1, "EditorOptions": "{\"format\":{\"type\":\"fixedPoint\",\"precision\":2},\"showSpinButtons\":true}" }, { "FieldName": "UnitPrice", "CaptionName": "App.Listform.ListformField.UnitPrice", - "TurkishCaption": "Birim Fiyat", "EnglishCaption": "Unit Price", + "Tr": "Birim Fiyat", "En": "Unit Price", "EditorType": "dxNumberBox", "DbSourceType": 7, "IsRequired": true, "IncludeInEditingForm": true, "ColSpan": 1, "EditorOptions": "{\"format\":{\"type\":\"fixedPoint\",\"precision\":2}}" }, { "FieldName": "Total", "CaptionName": "App.Listform.ListformField.Total", - "TurkishCaption": "Tutar", "EnglishCaption": "Total", + "Tr": "Tutar", "En": "Total", "EditorType": "dxNumberBox", "DbSourceType": 7, "IsRequired": false, "IncludeInEditingForm": true, "ColSpan": 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) | | 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` | -| 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` | +| 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ğı, `Language.TitleEn/Tr`, `Language.DescEn/Tr` | | 4 | Alanlar | yalnız List | `Groups[]` (aşağıda) | | 5 | Alt Formlar | yalnız List | `SubForms[]` | | 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, "MenuParentCode": "App.Mrp", "PermissionGroupName": "App.Mrp", - "PermissionGroupDisplayNameEn": "MRP", "PermissionGroupDisplayNameTr": "MRP", - "LanguageTextMenuEn": "Order Board", "LanguageTextMenuTr": "Sipariş Panosu", + "PermissionGroupEn": "MRP", "PermissionGroupTr": "MRP", + "MenuEn": "Order Board", "MenuTr": "Sipariş Panosu", "MenuIcon": "FcKanban", "MenuOrder": 2 }, "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/ .Import/.Note` alt yetkilerini üretir. Onaylayanların rolüne kök + `.Update` verilir; talep sahiplerine kök + `.Create` yeter. -7. **Dil** — menü/başlık/açıklama metinleri wizard dosyasındaki `LanguageText*` alanlarından, - alan başlıkları her `Items` öğesinin `TurkishCaption`/`EnglishCaption` alanlarından üretilir. +7. **Dil** — menü/başlık/açıklama metinleri wizard dosyasındaki `Language` bölümünden, + alan başlıkları her `Items` öğesinin `En`/`Tr` alanlarından üretilir. Ayrıca `LanguagesData.json`'a dokunmaya gerek yoktur. 8. **Teslim** — dosyaları listele, DB Migrate gerektiğini söyle, §11 kontrol listesini geç. diff --git a/README.md b/README.md index daf729e2..938a841c 100644 --- a/README.md +++ b/README.md @@ -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 (`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ş 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. diff --git a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/GridOptionsDto/GanttOptionDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/GridOptionsDto/GanttOptionDto.cs index 5bfd5cc7..2348a036 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/GridOptionsDto/GanttOptionDto.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/GridOptionsDto/GanttOptionDto.cs @@ -66,7 +66,7 @@ public class GanttOptionDto /// /// Düzenlemeye izin verilsin mi /// - public bool AllowEditing { get; set; } = false; + public bool EditingEnabled { get; set; } = false; /// /// Task eklemeye izin verilsin mi /// diff --git a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs index 6525ef31..59499861 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs @@ -87,14 +87,14 @@ public class ListFormWizardDto public bool Scheduler { get; set; } public bool Todo { get; set; } - public string LanguageTextMenuEn { get; set; } - public string LanguageTextMenuTr { get; set; } - public string LanguageTextTitleEn { get; set; } - public string LanguageTextTitleTr { get; set; } - public string LanguageTextDescEn { get; set; } - public string LanguageTextDescTr { get; set; } - public string LanguageTextMenuParentEn { get; set; } - public string LanguageTextMenuParentTr { get; set; } + public string MenuEn { get; set; } + public string MenuTr { get; set; } + public string TitleEn { get; set; } + public string TitleTr { get; set; } + public string DescEn { get; set; } + public string DescTr { get; set; } + public string MenuParentEn { get; set; } + public string MenuParentTr { 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 /// degeri geri yazar, boylece seed dosyasi her durumda iki dilli gorunen adi tasir. /// - public string PermissionGroupDisplayNameEn { get; set; } + public string PermissionGroupEn { get; set; } - /// Izin grubunun Turkce gorunen adi; ile ayni kurallara tabidir. - public string PermissionGroupDisplayNameTr { get; set; } + /// Izin grubunun Turkce gorunen adi; ile ayni kurallara tabidir. + public string PermissionGroupTr { get; set; } public string MenuParentModuleId { get; set; } public string MenuParentCode { get; set; } diff --git a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardSeedFileDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardSeedFileDto.cs index 7d50f564..a985845a 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardSeedFileDto.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/WizardSeedFileDto.cs @@ -96,14 +96,17 @@ public class WizardSeedFileDto nameof(WizardColumnItemInputDto.LookupQuery), ]; - /// Dosyada `Menu` basligi altinda toplanan wizard alanlari. - private static readonly string[] MenuKeys = + /// Dosyada `Menu` basligi altinda toplanan wizard alanlari; adlari degismez. + private static readonly (string Property, string SeedKey)[] MenuKeys = [ - nameof(ListFormWizardDto.CreateMenu), nameof(ListFormWizardDto.MenuCode), nameof(ListFormWizardDto.MenuOrder), - nameof(ListFormWizardDto.MenuUrl), nameof(ListFormWizardDto.MenuIcon), nameof(ListFormWizardDto.MenuParentCode), - nameof(ListFormWizardDto.MenuParentIcon), + Same(nameof(ListFormWizardDto.MenuParentCode)), Same(nameof(ListFormWizardDto.MenuParentIcon)), + Same(nameof(ListFormWizardDto.CreateMenu)), Same(nameof(ListFormWizardDto.MenuCode)), + Same(nameof(ListFormWizardDto.MenuOrder)), Same(nameof(ListFormWizardDto.MenuUrl)), + Same(nameof(ListFormWizardDto.MenuIcon)), ]; + private static (string Property, string SeedKey) Same(string key) => (key, key); + /// /// Dosyada daha okunakli adla yazilan alanlar. Modul, wizard'in ana bilgisidir; menu ve /// yetkilerin hangi modul altinda filtrelenecegini belirler. @@ -125,22 +128,33 @@ public class WizardSeedFileDto [ nameof(ListFormWizardDto.ComponentKind), nameof(ListFormWizardDto.WizardName), WizardCodeKey, nameof(ListFormWizardDto.SeededAt), nameof(ListFormWizardDto.CustomComponentName), - nameof(ListFormWizardDto.PermissionGroupName), nameof(ListFormWizardDto.PermissionGroupDisplayNameEn), - nameof(ListFormWizardDto.PermissionGroupDisplayNameTr), "ModuleId", + nameof(ListFormWizardDto.PermissionGroupName), "ModuleId", nameof(ListFormWizardDto.DataSourceConnectionString), MenuSection, LanguageSection, nameof(ListFormWizardDto.Groups), ]; /// - /// Dosyada `Language` basligi altinda toplanan dil metinleri. ListForm yalnizca dil - /// anahtarini tasir (`Title = "{ListFormCode}.Title"`); metinlerin tek kaynagi burasidir. + /// Dosyada `Language` basligi altinda toplanan dil metinleri: menu, ekran ve izin grubunun + /// iki dilli gorunen adlari. ListForm yalnizca dil anahtarini tasir + /// (`Title = "{ListFormCode}.Title"`); metinlerin tek kaynagi burasidir. /// - private static readonly string[] LanguageKeys = + private static readonly (string Property, string SeedKey)[] LanguageKeys = [ - nameof(ListFormWizardDto.LanguageTextMenuEn), nameof(ListFormWizardDto.LanguageTextMenuTr), - nameof(ListFormWizardDto.LanguageTextTitleEn), nameof(ListFormWizardDto.LanguageTextTitleTr), - nameof(ListFormWizardDto.LanguageTextDescEn), nameof(ListFormWizardDto.LanguageTextDescTr), - nameof(ListFormWizardDto.LanguageTextMenuParentEn), nameof(ListFormWizardDto.LanguageTextMenuParentTr), + Same(nameof(ListFormWizardDto.MenuParentEn)), Same(nameof(ListFormWizardDto.MenuParentTr)), + Same(nameof(ListFormWizardDto.PermissionGroupEn)), Same(nameof(ListFormWizardDto.PermissionGroupTr)), + Same(nameof(ListFormWizardDto.MenuEn)), Same(nameof(ListFormWizardDto.MenuTr)), + Same(nameof(ListFormWizardDto.TitleEn)), Same(nameof(ListFormWizardDto.TitleTr)), + Same(nameof(ListFormWizardDto.DescEn)), Same(nameof(ListFormWizardDto.DescTr)), + ]; + + /// + /// Alan basliginin iki dilli metinleri. Oge zaten bir alan tanimi oldugu icin dosyada dilin + /// adiyla degil koduyla yazilir. + /// + private static readonly (string Property, string SeedKey)[] CaptionKeys = + [ + (nameof(WizardColumnItemInputDto.EnglishCaption), "En"), + (nameof(WizardColumnItemInputDto.TurkishCaption), "Tr"), ]; private const string MenuSection = "Menu"; @@ -203,6 +217,12 @@ public class WizardSeedFileDto foreach (var (property, seedKey) in RenamedKeys) 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, LanguageSection, LanguageKeys); @@ -221,16 +241,29 @@ public class WizardSeedFileDto var node = JsonNode.Parse(json); if (node?[nameof(Wizard)] is JsonObject wizardNode) { - FlattenSection(wizardNode, MenuSection); - FlattenSection(wizardNode, LanguageSection); + FlattenSection(wizardNode, MenuSection, MenuKeys); + FlattenSection(wizardNode, LanguageSection, LanguageKeys); foreach (var (property, seedKey) in RenamedKeys) Rename(wizardNode, seedKey, property); + + foreach (var item in ItemNodes(wizardNode)) + { + foreach (var (property, seedKey) in CaptionKeys) + Rename(item, seedKey, property); + } } return node.Deserialize(SeedReadOptions)?.Rehydrate(); } + /// Wizard bolumundeki tum grup ogeleri; ad donusumu her ogeye ayni sekilde uygulanir. + private static IEnumerable ItemNodes(JsonObject wizard) => + (wizard[nameof(ListFormWizardDto.Groups)] as JsonArray ?? []) + .OfType() + .SelectMany(g => g[nameof(WizardColumnGroupInputDto.Items)] as JsonArray ?? []) + .OfType(); + private static void Rename(JsonObject wizard, string from, string to) { if (wizard.Remove(from, out var value)) @@ -255,13 +288,13 @@ public class WizardSeedFileDto } /// Verilen anahtarlari wizard bolumunden alip tek bir baslik altina tasir. - 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(); - foreach (var key in keys) + foreach (var (property, seedKey) in keys) { - if (wizard.Remove(key, out var value)) - target[key] = value; + if (wizard.Remove(property, out var value)) + target[seedKey] = value; } if (target.Count > 0) @@ -269,15 +302,15 @@ public class WizardSeedFileDto } /// Baslik altindaki alanlari wizard bolumune geri tasir. - 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) return; - foreach (var key in group.Select(x => x.Key).ToArray()) + foreach (var (property, seedKey) in keys) { - if (group.Remove(key, out var item)) - wizard[key] = item; + if (group.Remove(seedKey, out var item)) + wizard[property] = item; } } diff --git a/api/src/Sozsoft.Platform.Application/ListForms/ListFormWizardAppService.cs b/api/src/Sozsoft.Platform.Application/ListForms/ListFormWizardAppService.cs index dc6f63c3..2dc83755 100644 --- a/api/src/Sozsoft.Platform.Application/ListForms/ListFormWizardAppService.cs +++ b/api/src/Sozsoft.Platform.Application/ListForms/ListFormWizardAppService.cs @@ -125,13 +125,13 @@ public class ListFormWizardAppService( var inserted = new WizardInsertedRecordsDto(); //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 // öksüz kayıt bırakmamak için üretilmez. if (!isCustomComponent) { - await CreateLangKey(titleLangKey, input.LanguageTextTitleEn, input.LanguageTextTitleTr, inserted); - await CreateLangKey(descLangKey, input.LanguageTextDescEn, input.LanguageTextDescTr, inserted); + await CreateLangKey(titleLangKey, input.TitleEn, input.TitleTr, inserted); + await CreateLangKey(descLangKey, input.DescEn, input.DescTr, inserted); } //Permission Group @@ -234,7 +234,7 @@ public class ListFormWizardAppService( : !string.IsNullOrWhiteSpace(input.MenuIcon) ? input.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 { Code = input.MenuParentCode, @@ -1445,20 +1445,24 @@ public class ListFormWizardAppService( /// private async Task ApplyPermissionGroupAsync(ListFormWizardDto input, string groupName, WizardInsertedRecordsDto inserted) { - var displayEn = input.PermissionGroupDisplayNameEn?.Trim(); - var displayTr = input.PermissionGroupDisplayNameTr?.Trim(); + var displayEn = input.PermissionGroupEn?.Trim(); + var displayTr = input.PermissionGroupTr?.Trim(); if (!await repoPermGroup.AnyAsync(a => a.Name == groupName)) { await repoPermGroup.InsertAsync(new PermissionGroupDefinitionRecord(GuidGenerator.Create(), groupName, groupName), autoSave: false); - // Grup adi ust menu koduyla ayniysa dil anahtari menu metinleriyle zaten uretilir; - // burada uzerine yazmak menu adini bozar. + // Grup adi ust menu koduyla ayniysa anahtar menu adiyla ortaktir; metin varsa uzerine + // 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)) { - await EnsureLangKey(groupName, inserted); - displayEn = string.IsNullOrWhiteSpace(displayEn) ? input.LanguageTextMenuParentEn?.Trim() : displayEn; - displayTr = string.IsNullOrWhiteSpace(displayTr) ? input.LanguageTextMenuParentTr?.Trim() : displayTr; + displayEn = string.IsNullOrWhiteSpace(displayEn) ? input.MenuParentEn?.Trim() : displayEn; + displayTr = string.IsNullOrWhiteSpace(displayTr) ? input.MenuParentTr?.Trim() : displayTr; + + var (menuEn, menuTr) = await GetLangTextsAsync(groupName); + if (string.IsNullOrWhiteSpace(menuEn) || string.IsNullOrWhiteSpace(menuTr)) + await CreateLangKey(groupName, displayEn ?? groupName, displayTr ?? groupName, inserted); } else { @@ -1484,8 +1488,8 @@ public class ListFormWizardAppService( await CreateLangKey(groupName, displayEn, displayTr, inserted); } - input.PermissionGroupDisplayNameEn = string.IsNullOrWhiteSpace(displayEn) ? groupName : displayEn; - input.PermissionGroupDisplayNameTr = string.IsNullOrWhiteSpace(displayTr) ? groupName : displayTr; + input.PermissionGroupEn = string.IsNullOrWhiteSpace(displayEn) ? groupName : displayEn; + input.PermissionGroupTr = string.IsNullOrWhiteSpace(displayTr) ? groupName : displayTr; } /// Bir dil anahtarinin Ingilizce/Turkce metinlerini dondurur; yoksa null. @@ -1541,16 +1545,4 @@ public class ListFormWizardAppService( return existing; } - - private async Task 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; - } } diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json b/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json index d7257479..b750b58f 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json @@ -5262,6 +5262,12 @@ "en": "Allow Updating", "tr": "Güncellemeye İzin Ver" }, + { + "resourceName": "Platform", + "key": "App.ListFormEdit.EditingEnabled", + "en": "Gantt Editing Enabled", + "tr": "Gantt Düzenleme Etkin" + }, { "resourceName": "Platform", "key": "App.ListFormEdit.AllowEditing", @@ -5295,8 +5301,8 @@ { "resourceName": "Platform", "key": "App.ListFormEdit.AllowTaskResourceUpdating", - "en": "Allow Task Resource Updating", - "tr": "Görev Kaynaklarını Güncelleme İzni" + "en": "Resource Editing Enabled", + "tr": "Görev Kaynak Güncelleme İzni" }, { "resourceName": "Platform", diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/WizardDataSeeder.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/WizardDataSeeder.cs index 8cd6a93f..e9bc2d03 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/WizardDataSeeder.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/WizardDataSeeder.cs @@ -150,7 +150,12 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency 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; } @@ -172,9 +177,7 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency var code = input.ResolveMenuCode(); var listFormCode = input.ResolveListFormCode(); - var titleLangKey = $"{listFormCode}.Title"; var nameLangKey = code; - var descLangKey = $"{listFormCode}.Desc"; var permCreateName = $"{code}.Create"; var permUpdateName = $"{code}.Update"; var permDeleteName = $"{code}.Delete"; @@ -187,16 +190,10 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency var customRoutePath = NormalizeSeedCustomRoutePath(input); // Dil - Language Keys - await CreateLangKeyAsync(nameLangKey, input.LanguageTextMenuEn, input.LanguageTextMenuTr); - if (!isCustomComponent) - { - await CreateLangKeyAsync(titleLangKey, input.LanguageTextTitleEn, input.LanguageTextTitleTr); - await CreateLangKeyAsync(descLangKey, input.LanguageTextDescEn, input.LanguageTextDescTr); - } + await SeedLanguageTextsAsync(input, isCustomComponent); - // Permission Group - // Menuye eklenmeyen wizard'da izin grubu sorulmaz; bos geldiginde varsayilan gruba dusar. - var groupName = string.IsNullOrWhiteSpace(input.PermissionGroupName) ? AppName : input.PermissionGroupName.Trim(); + // Permission Group - gorunen adin dil anahtari SeedLanguageTextsAsync icinde uretilir. + var groupName = ResolvePermissionGroupName(input); input.PermissionGroupName = 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); } - // 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 var permQueryable = await _repoPerm.GetQueryableAsync(); var existingPerms = permQueryable.Where(a => a.GroupName == groupName).ToList(); @@ -287,7 +277,6 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency : !string.IsNullOrWhiteSpace(input.MenuIcon) ? input.MenuIcon : WizardConsts.MenuIcon; - await CreateLangKeyAsync(input.MenuParentCode, input.LanguageTextMenuParentEn, input.LanguageTextMenuParentTr); menuParent = await _repoMenu.InsertAsync(new Menu { Code = input.MenuParentCode, @@ -382,12 +371,6 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency 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) { if (string.IsNullOrWhiteSpace(criteria.Id)) @@ -486,6 +469,57 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency } + /// + /// 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. + /// + 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); + } + } + + /// + /// Yetkilerin toplanacagi izin grubu adi. Menuye eklenmeyen wizard'da grup sorulmaz; bos + /// geldiginde varsayilan uygulama grubuna duser. + /// + private static string ResolvePermissionGroupName(ListFormWizardDto input) => + string.IsNullOrWhiteSpace(input.PermissionGroupName) ? AppName : input.PermissionGroupName.Trim(); + private async Task CreateLangKeyAsync(string key, string textEn, string textTr) { if (string.IsNullOrWhiteSpace(key)) return; @@ -519,16 +553,6 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency }, 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); - } - } } diff --git a/configs/seeds/host/wizard/Approval.json b/configs/seeds/host/wizard/Approval.json index 8dd608af..10979584 100644 --- a/configs/seeds/host/wizard/Approval.json +++ b/configs/seeds/host/wizard/Approval.json @@ -6,26 +6,26 @@ "SeededAt": "2026-09-02T11:24:22.3331299\u002B03:00", "CustomComponentName": null, "PermissionGroupName": "App.Wizard.Sales", - "PermissionGroupDisplayNameEn": "Sales", - "PermissionGroupDisplayNameTr": "Sat\u0131\u015F", "ModuleId": "Sal", "Menu": { + "MenuParentCode": "App.Wizard.Sales", + "MenuParentIcon": "FcAssistant", "MenuCode": "App.Wizard.Approval", "MenuOrder": 1, "MenuUrl": "/admin/list/App.Wizard.Approval", - "MenuIcon": "FcBadDecision", - "MenuParentCode": "App.Wizard.Sales", - "MenuParentIcon": "FcAssistant" + "MenuIcon": "FcBadDecision" }, "Language": { - "LanguageTextMenuEn": "Approval", - "LanguageTextMenuTr": "Approval", - "LanguageTextTitleEn": "Approval", - "LanguageTextTitleTr": "Approval", - "LanguageTextDescEn": "Approval", - "LanguageTextDescTr": "Approval", - "LanguageTextMenuParentEn": "Sales", - "LanguageTextMenuParentTr": "Sat\u0131\u015F" + "MenuParentEn": "Sales", + "MenuParentTr": "Sat\u0131\u015F", + "PermissionGroupEn": "Sales", + "PermissionGroupTr": "Sat\u0131\u015F", + "MenuEn": "Approval", + "MenuTr": "Approval", + "TitleEn": "Approval", + "TitleTr": "Approval", + "DescEn": "Approval", + "DescTr": "Approval" }, "Groups": [ { @@ -33,38 +33,38 @@ { "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", - "TurkishCaption": "Id", - "EnglishCaption": "Id" + "En": "Id", + "Tr": "Id" }, { "FieldName": "UserName", "CaptionName": "App.Listform.ListformField.UserName", - "TurkishCaption": "User Name", - "EnglishCaption": "User Name" + "En": "User Name", + "Tr": "User Name" }, { "FieldName": "Status", "CaptionName": "App.Listform.ListformField.Status", - "TurkishCaption": "Status", - "EnglishCaption": "Status" + "En": "Status", + "Tr": "Status" }, { "FieldName": "Date", "CaptionName": "App.Listform.ListformField.Date", - "TurkishCaption": "Date", - "EnglishCaption": "Date" + "En": "Date", + "Tr": "Date" }, { "FieldName": "Description", "CaptionName": "App.Listform.ListformField.Description", - "TurkishCaption": "Description", - "EnglishCaption": "Description" + "En": "Description", + "Tr": "Description" }, { "FieldName": "Text", "CaptionName": "App.Listform.ListformField.Text", - "TurkishCaption": "Text", - "EnglishCaption": "Text" + "En": "Text", + "Tr": "Text" } ] } @@ -214,7 +214,7 @@ "StartExpr": null, "EndExpr": null, "ProgressExpr": null, - "AllowEditing": false, + "EditingEnabled": false, "AllowTaskAdding": false, "AllowTaskUpdating": false, "AllowTaskResourceUpdating": false, diff --git a/configs/seeds/host/wizard/Customers.json b/configs/seeds/host/wizard/Customers.json index 0057dda7..440b6064 100644 --- a/configs/seeds/host/wizard/Customers.json +++ b/configs/seeds/host/wizard/Customers.json @@ -6,26 +6,26 @@ "SeededAt": "2026-09-01T09:05:00", "CustomComponentName": "", "PermissionGroupName": "App.Prj", - "PermissionGroupDisplayNameEn": "Project", - "PermissionGroupDisplayNameTr": "Proje", "ModuleId": "Prj", "Menu": { + "MenuParentCode": "App.Prj", + "MenuParentIcon": "FcTimeline", "MenuCode": "App.Prj.Customers", "MenuOrder": 4, "MenuUrl": "/admin/list/App.Prj.Customers", - "MenuIcon": "FcBusinessContact", - "MenuParentCode": "App.Prj", - "MenuParentIcon": "FcTimeline" + "MenuIcon": "FcBusinessContact" }, "Language": { - "LanguageTextMenuEn": "Customers", - "LanguageTextMenuTr": "M\u00FC\u015Fteriler", - "LanguageTextTitleEn": "Customers", - "LanguageTextTitleTr": "M\u00FC\u015Fteriler", - "LanguageTextDescEn": "Customers linked to tasks", - "LanguageTextDescTr": "G\u00F6revlerin ba\u011Fl\u0131 oldu\u011Fu m\u00FC\u015Fteriler", - "LanguageTextMenuParentEn": "Project", - "LanguageTextMenuParentTr": "Proje" + "MenuParentEn": "Project", + "MenuParentTr": "Proje", + "PermissionGroupEn": "Project", + "PermissionGroupTr": "Proje", + "MenuEn": "Customers", + "MenuTr": "M\u00FC\u015Fteriler", + "TitleEn": "Customers", + "TitleTr": "M\u00FC\u015Fteriler", + "DescEn": "Customers linked to tasks", + "DescTr": "G\u00F6revlerin ba\u011Fl\u0131 oldu\u011Fu m\u00FC\u015Fteriler" }, "Groups": [ { @@ -33,32 +33,32 @@ { "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", - "TurkishCaption": "Kimlik", - "EnglishCaption": "Id" + "En": "Id", + "Tr": "Kimlik" }, { "FieldName": "Name", "CaptionName": "App.Listform.ListformField.Name", - "TurkishCaption": "M\u00FC\u015Fteri", - "EnglishCaption": "Customer" + "En": "Customer", + "Tr": "M\u00FC\u015Fteri" }, { "FieldName": "ContactName", "CaptionName": "App.Listform.ListformField.ContactName", - "TurkishCaption": "\u0130lgili Ki\u015Fi", - "EnglishCaption": "Contact" + "En": "Contact", + "Tr": "\u0130lgili Ki\u015Fi" }, { "FieldName": "Email", "CaptionName": "App.Listform.ListformField.Email", - "TurkishCaption": "E-posta", - "EnglishCaption": "Email" + "En": "Email", + "Tr": "E-posta" }, { "FieldName": "Phone", "CaptionName": "App.Listform.ListformField.Phone", - "TurkishCaption": "Telefon", - "EnglishCaption": "Phone" + "En": "Phone", + "Tr": "Telefon" } ] } @@ -236,7 +236,7 @@ "StartExpr": null, "EndExpr": null, "ProgressExpr": null, - "AllowEditing": false, + "EditingEnabled": false, "AllowTaskAdding": false, "AllowTaskUpdating": false, "AllowTaskResourceUpdating": false, diff --git a/configs/seeds/host/wizard/Milestones.json b/configs/seeds/host/wizard/Milestones.json index a0c9889c..358fa744 100644 --- a/configs/seeds/host/wizard/Milestones.json +++ b/configs/seeds/host/wizard/Milestones.json @@ -6,26 +6,26 @@ "SeededAt": "2026-09-01T09:04:00", "CustomComponentName": "", "PermissionGroupName": "App.Prj", - "PermissionGroupDisplayNameEn": "Project", - "PermissionGroupDisplayNameTr": "Proje", "ModuleId": "Prj", "Menu": { + "MenuParentCode": "App.Prj", + "MenuParentIcon": "FcTimeline", "MenuCode": "App.Prj.Milestones", "MenuOrder": 3, "MenuUrl": "/admin/list/App.Prj.Milestones", - "MenuIcon": "FcCalendar", - "MenuParentCode": "App.Prj", - "MenuParentIcon": "FcTimeline" + "MenuIcon": "FcCalendar" }, "Language": { - "LanguageTextMenuEn": "Milestones", - "LanguageTextMenuTr": "D\u00F6n\u00FCm Noktalar\u0131", - "LanguageTextTitleEn": "Milestones", - "LanguageTextTitleTr": "D\u00F6n\u00FCm Noktalar\u0131", - "LanguageTextDescEn": "Project milestones", - "LanguageTextDescTr": "Proje d\u00F6n\u00FCm noktalar\u0131", - "LanguageTextMenuParentEn": "Project", - "LanguageTextMenuParentTr": "Proje" + "MenuParentEn": "Project", + "MenuParentTr": "Proje", + "PermissionGroupEn": "Project", + "PermissionGroupTr": "Proje", + "MenuEn": "Milestones", + "MenuTr": "D\u00F6n\u00FCm Noktalar\u0131", + "TitleEn": "Milestones", + "TitleTr": "D\u00F6n\u00FCm Noktalar\u0131", + "DescEn": "Project milestones", + "DescTr": "Proje d\u00F6n\u00FCm noktalar\u0131" }, "Groups": [ { @@ -33,26 +33,26 @@ { "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", - "TurkishCaption": "Kimlik", - "EnglishCaption": "Id" + "En": "Id", + "Tr": "Kimlik" }, { "FieldName": "Name", "CaptionName": "App.Listform.ListformField.Name", - "TurkishCaption": "D\u00F6n\u00FCm Noktas\u0131", - "EnglishCaption": "Milestone" + "En": "Milestone", + "Tr": "D\u00F6n\u00FCm Noktas\u0131" }, { "FieldName": "TargetDate", "CaptionName": "App.Listform.ListformField.TargetDate", - "TurkishCaption": "Hedef Tarih", - "EnglishCaption": "Target Date" + "En": "Target Date", + "Tr": "Hedef Tarih" }, { "FieldName": "IsCompleted", "CaptionName": "App.Listform.ListformField.IsCompleted", - "TurkishCaption": "Tamamland\u0131", - "EnglishCaption": "Completed" + "En": "Completed", + "Tr": "Tamamland\u0131" } ] } @@ -230,7 +230,7 @@ "StartExpr": null, "EndExpr": null, "ProgressExpr": null, - "AllowEditing": false, + "EditingEnabled": false, "AllowTaskAdding": false, "AllowTaskUpdating": false, "AllowTaskResourceUpdating": false, diff --git a/configs/seeds/host/wizard/Tags.json b/configs/seeds/host/wizard/Tags.json index aa85b8c3..4fdb8551 100644 --- a/configs/seeds/host/wizard/Tags.json +++ b/configs/seeds/host/wizard/Tags.json @@ -6,26 +6,26 @@ "SeededAt": "2026-09-01T09:03:00", "CustomComponentName": "", "PermissionGroupName": "App.Prj", - "PermissionGroupDisplayNameEn": "Project", - "PermissionGroupDisplayNameTr": "Proje", "ModuleId": "Prj", "Menu": { + "MenuParentCode": "App.Prj", + "MenuParentIcon": "FcTimeline", "MenuCode": "App.Prj.Tags", "MenuOrder": 2, "MenuUrl": "/admin/list/App.Prj.Tags", - "MenuIcon": "FcRules", - "MenuParentCode": "App.Prj", - "MenuParentIcon": "FcTimeline" + "MenuIcon": "FcRules" }, "Language": { - "LanguageTextMenuEn": "Tags", - "LanguageTextMenuTr": "Etiketler", - "LanguageTextTitleEn": "Tags", - "LanguageTextTitleTr": "Etiketler", - "LanguageTextDescEn": "Task tags", - "LanguageTextDescTr": "G\u00F6rev etiketleri", - "LanguageTextMenuParentEn": "Project", - "LanguageTextMenuParentTr": "Proje" + "MenuParentEn": "Project", + "MenuParentTr": "Proje", + "PermissionGroupEn": "Project", + "PermissionGroupTr": "Proje", + "MenuEn": "Tags", + "MenuTr": "Etiketler", + "TitleEn": "Tags", + "TitleTr": "Etiketler", + "DescEn": "Task tags", + "DescTr": "G\u00F6rev etiketleri" }, "Groups": [ { @@ -33,20 +33,20 @@ { "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", - "TurkishCaption": "Kimlik", - "EnglishCaption": "Id" + "En": "Id", + "Tr": "Kimlik" }, { "FieldName": "Name", "CaptionName": "App.Listform.ListformField.Name", - "TurkishCaption": "Etiket Ad\u0131", - "EnglishCaption": "Tag Name" + "En": "Tag Name", + "Tr": "Etiket Ad\u0131" }, { "FieldName": "ColorCode", "CaptionName": "App.Listform.ListformField.ColorCode", - "TurkishCaption": "Renk", - "EnglishCaption": "Color" + "En": "Color", + "Tr": "Renk" } ] } @@ -224,7 +224,7 @@ "StartExpr": null, "EndExpr": null, "ProgressExpr": null, - "AllowEditing": false, + "EditingEnabled": false, "AllowTaskAdding": false, "AllowTaskUpdating": false, "AllowTaskResourceUpdating": false, diff --git a/configs/seeds/host/wizard/TaskDependencies.json b/configs/seeds/host/wizard/TaskDependencies.json index c6ead42e..029e063a 100644 --- a/configs/seeds/host/wizard/TaskDependencies.json +++ b/configs/seeds/host/wizard/TaskDependencies.json @@ -6,27 +6,27 @@ "SeededAt": "2026-09-01T09:02:00", "CustomComponentName": "", "PermissionGroupName": "App.Prj", - "PermissionGroupDisplayNameEn": "Project", - "PermissionGroupDisplayNameTr": "Proje", "ModuleId": "Prj", "Menu": { + "MenuParentCode": "App.Prj", + "MenuParentIcon": "FcTimeline", "CreateMenu": false, "MenuCode": "App.Prj.TaskDependencies", "MenuOrder": 1, "MenuUrl": "/admin/list/App.Prj.TaskDependencies", - "MenuIcon": "FcTodoList", - "MenuParentCode": "App.Prj", - "MenuParentIcon": "FcTimeline" + "MenuIcon": "FcTodoList" }, "Language": { - "LanguageTextMenuEn": "Blocking Tasks", - "LanguageTextMenuTr": "Beklenen G\u00F6revler", - "LanguageTextTitleEn": "Blocking Tasks", - "LanguageTextTitleTr": "Beklenen G\u00F6revler", - "LanguageTextDescEn": "Tasks this task waits for", - "LanguageTextDescTr": "G\u00F6revin bekledi\u011Fi g\u00F6revler", - "LanguageTextMenuParentEn": "Project", - "LanguageTextMenuParentTr": "Proje" + "MenuParentEn": "Project", + "MenuParentTr": "Proje", + "PermissionGroupEn": "Project", + "PermissionGroupTr": "Proje", + "MenuEn": "Blocking Tasks", + "MenuTr": "Beklenen G\u00F6revler", + "TitleEn": "Blocking Tasks", + "TitleTr": "Beklenen G\u00F6revler", + "DescEn": "Tasks this task waits for", + "DescTr": "G\u00F6revin bekledi\u011Fi g\u00F6revler" }, "Groups": [ { @@ -34,26 +34,26 @@ { "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", - "TurkishCaption": "Kimlik", - "EnglishCaption": "Id" + "En": "Id", + "Tr": "Kimlik" }, { "FieldName": "TaskId", "CaptionName": "App.Listform.ListformField.TaskId", - "TurkishCaption": "G\u00F6rev", - "EnglishCaption": "Task" + "En": "Task", + "Tr": "G\u00F6rev" }, { "FieldName": "DependsOnTaskId", "CaptionName": "App.Listform.ListformField.DependsOnTaskId", - "TurkishCaption": "Beklenen G\u00F6rev", - "EnglishCaption": "Blocking Task" + "En": "Blocking Task", + "Tr": "Beklenen G\u00F6rev" }, { "FieldName": "Note", "CaptionName": "App.Listform.ListformField.Note", - "TurkishCaption": "Not", - "EnglishCaption": "Note" + "En": "Note", + "Tr": "Not" } ] } @@ -231,7 +231,7 @@ "StartExpr": null, "EndExpr": null, "ProgressExpr": null, - "AllowEditing": false, + "EditingEnabled": false, "AllowTaskAdding": false, "AllowTaskUpdating": false, "AllowTaskResourceUpdating": false, diff --git a/configs/seeds/host/wizard/TaskSubTasks.json b/configs/seeds/host/wizard/TaskSubTasks.json index 7eef0b26..076eaa9d 100644 --- a/configs/seeds/host/wizard/TaskSubTasks.json +++ b/configs/seeds/host/wizard/TaskSubTasks.json @@ -6,27 +6,27 @@ "SeededAt": "2026-09-01T09:01:00", "CustomComponentName": "", "PermissionGroupName": "App.Prj", - "PermissionGroupDisplayNameEn": "Project", - "PermissionGroupDisplayNameTr": "Proje", "ModuleId": "Prj", "Menu": { + "MenuParentCode": "App.Prj", + "MenuParentIcon": "FcTimeline", "CreateMenu": false, "MenuCode": "App.Prj.TaskSubTasks", "MenuOrder": 1, "MenuUrl": "/admin/list/App.Prj.TaskSubTasks", - "MenuIcon": "FcTodoList", - "MenuParentCode": "App.Prj", - "MenuParentIcon": "FcTimeline" + "MenuIcon": "FcTodoList" }, "Language": { - "LanguageTextMenuEn": "Sub Tasks", - "LanguageTextMenuTr": "Alt G\u00F6revler", - "LanguageTextTitleEn": "Sub Tasks", - "LanguageTextTitleTr": "Alt G\u00F6revler", - "LanguageTextDescEn": "Sub task list", - "LanguageTextDescTr": "Alt g\u00F6rev listesi", - "LanguageTextMenuParentEn": "Project", - "LanguageTextMenuParentTr": "Proje" + "MenuParentEn": "Project", + "MenuParentTr": "Proje", + "PermissionGroupEn": "Project", + "PermissionGroupTr": "Proje", + "MenuEn": "Sub Tasks", + "MenuTr": "Alt G\u00F6revler", + "TitleEn": "Sub Tasks", + "TitleTr": "Alt G\u00F6revler", + "DescEn": "Sub task list", + "DescTr": "Alt g\u00F6rev listesi" }, "Groups": [ { @@ -34,50 +34,50 @@ { "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", - "TurkishCaption": "Kimlik", - "EnglishCaption": "Id" + "En": "Id", + "Tr": "Kimlik" }, { "FieldName": "Name", "CaptionName": "App.Listform.ListformField.Name", - "TurkishCaption": "G\u00F6rev Ad\u0131", - "EnglishCaption": "Task Name" + "En": "Task Name", + "Tr": "G\u00F6rev Ad\u0131" }, { "FieldName": "ParentTaskId", "CaptionName": "App.Listform.ListformField.ParentTaskId", - "TurkishCaption": "\u00DCst G\u00F6rev", - "EnglishCaption": "Parent Task" + "En": "Parent Task", + "Tr": "\u00DCst G\u00F6rev" }, { "FieldName": "Status", "CaptionName": "App.Listform.ListformField.Status", - "TurkishCaption": "Durum", - "EnglishCaption": "Status" + "En": "Status", + "Tr": "Durum" }, { "FieldName": "AssigneeIds", "CaptionName": "App.Listform.ListformField.AssigneeIds", - "TurkishCaption": "Atananlar", - "EnglishCaption": "Assignees" + "En": "Assignees", + "Tr": "Atananlar" }, { "FieldName": "ProgressPercent", "CaptionName": "App.Listform.ListformField.ProgressPercent", - "TurkishCaption": "\u0130lerleme (%)", - "EnglishCaption": "Progress (%)" + "En": "Progress (%)", + "Tr": "\u0130lerleme (%)" }, { "FieldName": "PlannedStartDate", "CaptionName": "App.Listform.ListformField.PlannedStartDate", - "TurkishCaption": "Planlanan Ba\u015Flang\u0131\u00E7", - "EnglishCaption": "Planned Start" + "En": "Planned Start", + "Tr": "Planlanan Ba\u015Flang\u0131\u00E7" }, { "FieldName": "PlannedEndDate", "CaptionName": "App.Listform.ListformField.PlannedEndDate", - "TurkishCaption": "Planlanan Biti\u015F", - "EnglishCaption": "Planned End" + "En": "Planned End", + "Tr": "Planlanan Biti\u015F" } ] } @@ -255,7 +255,7 @@ "StartExpr": null, "EndExpr": null, "ProgressExpr": null, - "AllowEditing": false, + "EditingEnabled": false, "AllowTaskAdding": false, "AllowTaskUpdating": false, "AllowTaskResourceUpdating": false, diff --git a/configs/seeds/host/wizard/TaskTimesheets.json b/configs/seeds/host/wizard/TaskTimesheets.json index 72a7e7cc..c2c2e08e 100644 --- a/configs/seeds/host/wizard/TaskTimesheets.json +++ b/configs/seeds/host/wizard/TaskTimesheets.json @@ -6,27 +6,27 @@ "SeededAt": "2026-09-01T09:00:00", "CustomComponentName": "", "PermissionGroupName": "App.Prj", - "PermissionGroupDisplayNameEn": "Project", - "PermissionGroupDisplayNameTr": "Proje", "ModuleId": "Prj", "Menu": { + "MenuParentCode": "App.Prj", + "MenuParentIcon": "FcTimeline", "CreateMenu": false, "MenuCode": "App.Prj.TaskTimesheets", "MenuOrder": 1, "MenuUrl": "/admin/list/App.Prj.TaskTimesheets", - "MenuIcon": "FcTodoList", - "MenuParentCode": "App.Prj", - "MenuParentIcon": "FcTimeline" + "MenuIcon": "FcTodoList" }, "Language": { - "LanguageTextMenuEn": "Timesheets", - "LanguageTextMenuTr": "\u00C7al\u0131\u015Fma \u00C7izelgeleri", - "LanguageTextTitleEn": "Timesheets", - "LanguageTextTitleTr": "\u00C7al\u0131\u015Fma \u00C7izelgeleri", - "LanguageTextDescEn": "Task timesheets", - "LanguageTextDescTr": "G\u00F6rev \u00E7al\u0131\u015Fma \u00E7izelgeleri", - "LanguageTextMenuParentEn": "Project", - "LanguageTextMenuParentTr": "Proje" + "MenuParentEn": "Project", + "MenuParentTr": "Proje", + "PermissionGroupEn": "Project", + "PermissionGroupTr": "Proje", + "MenuEn": "Timesheets", + "MenuTr": "\u00C7al\u0131\u015Fma \u00C7izelgeleri", + "TitleEn": "Timesheets", + "TitleTr": "\u00C7al\u0131\u015Fma \u00C7izelgeleri", + "DescEn": "Task timesheets", + "DescTr": "G\u00F6rev \u00E7al\u0131\u015Fma \u00E7izelgeleri" }, "Groups": [ { @@ -34,38 +34,38 @@ { "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", - "TurkishCaption": "Kimlik", - "EnglishCaption": "Id" + "En": "Id", + "Tr": "Kimlik" }, { "FieldName": "TaskId", "CaptionName": "App.Listform.ListformField.TaskId", - "TurkishCaption": "G\u00F6rev", - "EnglishCaption": "Task" + "En": "Task", + "Tr": "G\u00F6rev" }, { "FieldName": "WorkDate", "CaptionName": "App.Listform.ListformField.WorkDate", - "TurkishCaption": "Tarih", - "EnglishCaption": "Date" + "En": "Date", + "Tr": "Tarih" }, { "FieldName": "UserId", "CaptionName": "App.Listform.ListformField.UserId", - "TurkishCaption": "Kullan\u0131c\u0131", - "EnglishCaption": "User" + "En": "User", + "Tr": "Kullan\u0131c\u0131" }, { "FieldName": "Hours", "CaptionName": "App.Listform.ListformField.Hours", - "TurkishCaption": "S\u00FCre (saat)", - "EnglishCaption": "Hours" + "En": "Hours", + "Tr": "S\u00FCre (saat)" }, { "FieldName": "Description", "CaptionName": "App.Listform.ListformField.Description", - "TurkishCaption": "A\u00E7\u0131klama", - "EnglishCaption": "Description" + "En": "Description", + "Tr": "A\u00E7\u0131klama" } ] } @@ -243,7 +243,7 @@ "StartExpr": null, "EndExpr": null, "ProgressExpr": null, - "AllowEditing": false, + "EditingEnabled": false, "AllowTaskAdding": false, "AllowTaskUpdating": false, "AllowTaskResourceUpdating": false, diff --git a/configs/seeds/host/wizard/Tasks.json b/configs/seeds/host/wizard/Tasks.json index fd7cca23..a6560f44 100644 --- a/configs/seeds/host/wizard/Tasks.json +++ b/configs/seeds/host/wizard/Tasks.json @@ -6,26 +6,26 @@ "SeededAt": "2026-09-01T09:06:00", "CustomComponentName": "", "PermissionGroupName": "App.Prj", - "PermissionGroupDisplayNameEn": "Project", - "PermissionGroupDisplayNameTr": "Proje", "ModuleId": "Prj", "Menu": { + "MenuParentCode": "App.Prj", + "MenuParentIcon": "FcTimeline", "MenuCode": "App.Prj.Tasks", "MenuOrder": 1, "MenuUrl": "/admin/list/App.Prj.Tasks", - "MenuIcon": "FcTodoList", - "MenuParentCode": "App.Prj", - "MenuParentIcon": "FcTimeline" + "MenuIcon": "FcTodoList" }, "Language": { - "LanguageTextMenuEn": "Tasks", - "LanguageTextMenuTr": "G\u00F6revler", - "LanguageTextTitleEn": "Tasks", - "LanguageTextTitleTr": "G\u00F6revler", - "LanguageTextDescEn": "Task card and tracking", - "LanguageTextDescTr": "G\u00F6rev kart\u0131 ve takibi", - "LanguageTextMenuParentEn": "Project", - "LanguageTextMenuParentTr": "Proje" + "MenuParentEn": "Project", + "MenuParentTr": "Proje", + "PermissionGroupEn": "Project", + "PermissionGroupTr": "Proje", + "MenuEn": "Tasks", + "MenuTr": "G\u00F6revler", + "TitleEn": "Tasks", + "TitleTr": "G\u00F6revler", + "DescEn": "Task card and tracking", + "DescTr": "G\u00F6rev kart\u0131 ve takibi" }, "Groups": [ { @@ -33,92 +33,92 @@ { "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", - "TurkishCaption": "Kimlik", - "EnglishCaption": "Id" + "En": "Id", + "Tr": "Kimlik" }, { "FieldName": "Name", "CaptionName": "App.Listform.ListformField.Name", - "TurkishCaption": "G\u00F6rev Ad\u0131", - "EnglishCaption": "Task Name" + "En": "Task Name", + "Tr": "G\u00F6rev Ad\u0131" }, { "FieldName": "MilestoneId", "CaptionName": "App.Listform.ListformField.MilestoneId", - "TurkishCaption": "D\u00F6n\u00FCm Noktas\u0131", - "EnglishCaption": "Milestone" + "En": "Milestone", + "Tr": "D\u00F6n\u00FCm Noktas\u0131" }, { "FieldName": "Status", "CaptionName": "App.Listform.ListformField.Status", - "TurkishCaption": "Durum", - "EnglishCaption": "Status" + "En": "Status", + "Tr": "Durum" }, { "FieldName": "AssigneeIds", "CaptionName": "App.Listform.ListformField.AssigneeIds", - "TurkishCaption": "Atananlar", - "EnglishCaption": "Assignees" + "En": "Assignees", + "Tr": "Atananlar" }, { "FieldName": "TagIds", "CaptionName": "App.Listform.ListformField.TagIds", - "TurkishCaption": "Etiketler", - "EnglishCaption": "Tags" + "En": "Tags", + "Tr": "Etiketler" }, { "FieldName": "CustomerId", "CaptionName": "App.Listform.ListformField.CustomerId", - "TurkishCaption": "M\u00FC\u015Fteri", - "EnglishCaption": "Customer" + "En": "Customer", + "Tr": "M\u00FC\u015Fteri" }, { "FieldName": "CustomerContact", "CaptionName": "App.Listform.ListformField.CustomerContact", - "TurkishCaption": "\u0130lgili Ki\u015Fi", - "EnglishCaption": "Contact" + "En": "Contact", + "Tr": "\u0130lgili Ki\u015Fi" }, { "FieldName": "PlannedHours", "CaptionName": "App.Listform.ListformField.PlannedHours", - "TurkishCaption": "\u0130lk Planlanan Saatler", - "EnglishCaption": "Planned Hours" + "En": "Planned Hours", + "Tr": "\u0130lk Planlanan Saatler" }, { "FieldName": "ProgressPercent", "CaptionName": "App.Listform.ListformField.ProgressPercent", - "TurkishCaption": "\u0130lerleme (%)", - "EnglishCaption": "Progress (%)" + "En": "Progress (%)", + "Tr": "\u0130lerleme (%)" }, { "FieldName": "SalesOrderLine", "CaptionName": "App.Listform.ListformField.SalesOrderLine", - "TurkishCaption": "Sat\u0131\u015F Sipari\u015F Sat\u0131r\u0131", - "EnglishCaption": "Sales Order Line" + "En": "Sales Order Line", + "Tr": "Sat\u0131\u015F Sipari\u015F Sat\u0131r\u0131" }, { "FieldName": "PlannedStartDate", "CaptionName": "App.Listform.ListformField.PlannedStartDate", - "TurkishCaption": "Planlanan Tarih", - "EnglishCaption": "Planned Date" + "En": "Planned Date", + "Tr": "Planlanan Tarih" }, { "FieldName": "PlannedEndDate", "CaptionName": "App.Listform.ListformField.PlannedEndDate", - "TurkishCaption": "Planlanan Biti\u015F", - "EnglishCaption": "Planned End" + "En": "Planned End", + "Tr": "Planlanan Biti\u015F" }, { "FieldName": "ParentTaskId", "CaptionName": "App.Listform.ListformField.ParentTaskId", - "TurkishCaption": "\u00DCst G\u00F6rev", - "EnglishCaption": "Parent Task" + "En": "Parent Task", + "Tr": "\u00DCst G\u00F6rev" }, { "FieldName": "IsFavorite", "CaptionName": "App.Listform.ListformField.IsFavorite", - "TurkishCaption": "Favori", - "EnglishCaption": "Favorite" + "En": "Favorite", + "Tr": "Favori" } ] }, @@ -127,8 +127,8 @@ { "FieldName": "Description", "CaptionName": "App.Listform.ListformField.Description", - "TurkishCaption": "A\u00E7\u0131klama", - "EnglishCaption": "Description" + "En": "Description", + "Tr": "A\u00E7\u0131klama" } ] } @@ -306,16 +306,16 @@ "StartExpr": "PlannedStartDate", "EndExpr": "PlannedEndDate", "ProgressExpr": "ProgressPercent", - "AllowEditing": false, - "AllowTaskAdding": false, - "AllowTaskUpdating": false, - "AllowTaskResourceUpdating": false, - "AllowTaskDeleting": false, - "AllowDependencyAdding": false, - "AllowDependencyDeleting": false, - "AllowResourceAdding": false, - "AllowResourceUpdating": false, - "AllowResourceDeleting": false + "EditingEnabled": true, + "AllowTaskAdding": true, + "AllowTaskUpdating": true, + "AllowTaskResourceUpdating": true, + "AllowTaskDeleting": true, + "AllowDependencyAdding": true, + "AllowDependencyDeleting": true, + "AllowResourceAdding": true, + "AllowResourceUpdating": true, + "AllowResourceDeleting": true }, "SchedulerOptionDto": { "TextExpr": null, @@ -870,7 +870,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": null, "EditGroupOrderNo": null, @@ -1008,7 +1008,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 1, "EditGroupOrderNo": 1, @@ -1134,7 +1134,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 2, "EditGroupOrderNo": 1, @@ -1272,7 +1272,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 3, "EditGroupOrderNo": 1, @@ -1398,7 +1398,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 4, "EditGroupOrderNo": 1, @@ -1532,7 +1532,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 5, "EditGroupOrderNo": 1, @@ -1666,7 +1666,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 6, "EditGroupOrderNo": 1, @@ -1792,7 +1792,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 7, "EditGroupOrderNo": 1, @@ -1918,7 +1918,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 8, "EditGroupOrderNo": 1, @@ -2044,7 +2044,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 9, "EditGroupOrderNo": 1, @@ -2170,7 +2170,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 10, "EditGroupOrderNo": 1, @@ -2296,7 +2296,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 11, "EditGroupOrderNo": 1, @@ -2422,7 +2422,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 12, "EditGroupOrderNo": 1, @@ -2548,7 +2548,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 13, "EditGroupOrderNo": 1, @@ -2674,7 +2674,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 14, "EditGroupOrderNo": 1, @@ -2800,7 +2800,7 @@ "GroupInterval": "", "WordWrapEnabled": false }, - "Alignment": null, + "Alignment": "left", "Format": null, "EditOrderNo": 1, "EditGroupOrderNo": 2, diff --git a/ui/src/proxy/admin/wizard/models.ts b/ui/src/proxy/admin/wizard/models.ts index 3ba7e668..e0464c1c 100644 --- a/ui/src/proxy/admin/wizard/models.ts +++ b/ui/src/proxy/admin/wizard/models.ts @@ -82,19 +82,19 @@ export interface ListFormWizardDto { scheduler: boolean todo: boolean - languageTextMenuEn: string - languageTextMenuTr: string - languageTextTitleEn: string - languageTextTitleTr: string - languageTextDescEn: string - languageTextDescTr: string - languageTextMenuParentEn: string - languageTextMenuParentTr: string + menuEn: string + menuTr: string + titleEn: string + titleTr: string + descEn: string + descTr: string + menuParentEn: string + menuParentTr: string permissionGroupName: string /** Izin grubunun Ingilizce gorunen adi; grup adiyla ayni olan dil anahtarina yazilir. */ - permissionGroupDisplayNameEn: string + permissionGroupEn: string /** Izin grubunun Turkce gorunen adi. */ - permissionGroupDisplayNameTr: string + permissionGroupTr: string menuParentCode: string menuParentModuleId?: string menuParentIcon?: string diff --git a/ui/src/proxy/form/models.ts b/ui/src/proxy/form/models.ts index c2984616..9e116582 100644 --- a/ui/src/proxy/form/models.ts +++ b/ui/src/proxy/form/models.ts @@ -417,7 +417,7 @@ export interface GanttOptionDto { endExpr?: string progressExpr?: string scaleType: GanttScaleType - allowEditing?: boolean + editingEnabled?: boolean allowTaskAdding?: boolean allowTaskUpdating?: boolean allowTaskResourceUpdating?: boolean diff --git a/ui/src/views/admin/listForm/edit/FormTabGantt.tsx b/ui/src/views/admin/listForm/edit/FormTabGantt.tsx index a7764970..459f8bb3 100644 --- a/ui/src/views/admin/listForm/edit/FormTabGantt.tsx +++ b/ui/src/views/admin/listForm/edit/FormTabGantt.tsx @@ -25,6 +25,18 @@ import { gantScaleOptions } from './options' const validationSchema = Yup.object().shape({}) +const ganttEditPermissionFields = [ + 'allowTaskAdding', + 'allowTaskUpdating', + 'allowTaskDeleting', + 'allowTaskResourceUpdating', + 'allowDependencyAdding', + 'allowDependencyDeleting', + 'allowResourceAdding', + 'allowResourceUpdating', + 'allowResourceDeleting', +] as const + function FormTabGantt(props: FormEditProps) { const { listFormCode } = useParams() const { translate } = useLocalization() @@ -345,52 +357,108 @@ function FormTabGantt(props: FormEditProps) { className="mt-4" header={translate('::App.ListFormSchedulerOptions.InteractionSettings')} > -
+
+ + + {({ field, form }: FieldProps) => ( + { + 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), + ) + } + }} + /> + )} + + +
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ +
+ + + +
+ +
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - +
+
+ +
+
+ +
+
+ + + +
+
+ +
diff --git a/ui/src/views/admin/listForm/wizard/Wizard.tsx b/ui/src/views/admin/listForm/wizard/Wizard.tsx index 888c14d9..0a0138ef 100644 --- a/ui/src/views/admin/listForm/wizard/Wizard.tsx +++ b/ui/src/views/admin/listForm/wizard/Wizard.tsx @@ -101,7 +101,7 @@ const initialValues: ListFormWizardDto = { endExpr: '', progressExpr: '', scaleType: 'weeks', - allowEditing: false, + editingEnabled: false, allowTaskAdding: false, allowTaskUpdating: false, allowTaskResourceUpdating: false, @@ -154,17 +154,17 @@ const initialValues: ListFormWizardDto = { approvalIsResetWorkflow: false, criteria: [], }, - languageTextMenuEn: '', - languageTextMenuTr: '', - languageTextTitleEn: '', - languageTextTitleTr: '', - languageTextDescEn: '', - languageTextDescTr: '', - languageTextMenuParentEn: '', - languageTextMenuParentTr: '', + menuEn: '', + menuTr: '', + titleEn: '', + titleTr: '', + descEn: '', + descTr: '', + menuParentEn: '', + menuParentTr: '', permissionGroupName: '', - permissionGroupDisplayNameEn: '', - permissionGroupDisplayNameTr: '', + permissionGroupEn: '', + permissionGroupTr: '', menuParentCode: '', menuParentModuleId: '', 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. permissionGroupName: Yup.string().required(), // Grup adi ile birlikte iki dilli gorunen ad da seed dosyasina yazilir; bos birakilamaz. - permissionGroupDisplayNameEn: Yup.string().required(), - permissionGroupDisplayNameTr: Yup.string().required(), - languageTextMenuEn: Yup.string().required(), - languageTextMenuTr: Yup.string().required(), + permissionGroupEn: Yup.string().required(), + permissionGroupTr: Yup.string().required(), + menuEn: Yup.string().required(), + menuTr: Yup.string().required(), }) /** @@ -213,10 +213,10 @@ const requiredForListComponent = (schema: T) => const step2ValidationSchema = Yup.object().shape({ listFormCode: requiredForListComponent(Yup.string()), - languageTextTitleEn: requiredForListComponent(Yup.string()), - languageTextTitleTr: requiredForListComponent(Yup.string()), - languageTextDescEn: requiredForListComponent(Yup.string()), - languageTextDescTr: requiredForListComponent(Yup.string()), + titleEn: requiredForListComponent(Yup.string()), + titleTr: requiredForListComponent(Yup.string()), + descEn: requiredForListComponent(Yup.string()), + descTr: requiredForListComponent(Yup.string()), dataSourceCode: requiredForListComponent(Yup.string()), dataSourceConnectionString: Yup.string(), selectCommandType: requiredForListComponent(Yup.string()), @@ -610,8 +610,8 @@ const Wizard = () => { const formik = formikRef.current formik?.setFieldValue('permissionGroupName', groupName) if (!groupName) { - formik?.setFieldValue('permissionGroupDisplayNameEn', '') - formik?.setFieldValue('permissionGroupDisplayNameTr', '') + formik?.setFieldValue('permissionGroupEn', '') + formik?.setFieldValue('permissionGroupTr', '') return } // Sirasiyla: mevcut grubun metinleri, cagiranin verdigi metinler, ayni koda sahip menunun @@ -619,11 +619,11 @@ const Wizard = () => { const texts = permissionGroupTextsRef.current[groupName] const menu = rawMenuItems.find((item) => item.code === groupName) formik?.setFieldValue( - 'permissionGroupDisplayNameEn', + 'permissionGroupEn', texts?.en || fallbackTexts?.en || menu?.menuTextEn || groupName, ) formik?.setFieldValue( - 'permissionGroupDisplayNameTr', + 'permissionGroupTr', texts?.tr || fallbackTexts?.tr || menu?.menuTextTr || groupName, ) } @@ -651,8 +651,8 @@ const Wizard = () => { : [...prev, { value: group.name, label: permissionGroupLabel(group) }], ) formik?.setFieldValue('permissionGroupName', group.name) - formik?.setFieldValue('permissionGroupDisplayNameEn', group.displayNameEn) - formik?.setFieldValue('permissionGroupDisplayNameTr', group.displayNameTr) + formik?.setFieldValue('permissionGroupEn', group.displayNameEn) + formik?.setFieldValue('permissionGroupTr', group.displayNameTr) } useEffect(() => { @@ -723,17 +723,17 @@ const Wizard = () => { schedulerOptionDto: w.schedulerOptionDto ?? initialValues.schedulerOptionDto, todoOptionDto: w.todoOptionDto ?? initialValues.todoOptionDto, workflowDto: w.workflowDto ?? initialValues.workflowDto, - languageTextMenuEn: w.languageTextMenuEn ?? '', - languageTextMenuTr: w.languageTextMenuTr ?? '', - languageTextTitleEn: w.languageTextTitleEn ?? '', - languageTextTitleTr: w.languageTextTitleTr ?? '', - languageTextDescEn: w.languageTextDescEn ?? '', - languageTextDescTr: w.languageTextDescTr ?? '', - languageTextMenuParentEn: w.languageTextMenuParentEn ?? '', - languageTextMenuParentTr: w.languageTextMenuParentTr ?? '', + menuEn: w.menuEn ?? '', + menuTr: w.menuTr ?? '', + titleEn: w.titleEn ?? '', + titleTr: w.titleTr ?? '', + descEn: w.descEn ?? '', + descTr: w.descTr ?? '', + menuParentEn: w.menuParentEn ?? '', + menuParentTr: w.menuParentTr ?? '', permissionGroupName: w.permissionGroupName ?? '', - permissionGroupDisplayNameEn: w.permissionGroupDisplayNameEn ?? '', - permissionGroupDisplayNameTr: w.permissionGroupDisplayNameTr ?? '', + permissionGroupEn: w.permissionGroupEn ?? '', + permissionGroupTr: w.permissionGroupTr ?? '', menuParentCode: w.menuParentCode ?? '', menuParentModuleId: w.menuParentModuleId ?? '', menuParentIcon: w.menuParentIcon ?? '', @@ -830,12 +830,12 @@ const Wizard = () => { const setAutoText = ( field: keyof Pick< ListFormWizardDto, - | 'languageTextMenuEn' - | 'languageTextMenuTr' - | 'languageTextTitleEn' - | 'languageTextTitleTr' - | 'languageTextDescEn' - | 'languageTextDescTr' + | 'menuEn' + | 'menuTr' + | 'titleEn' + | 'titleTr' + | 'descEn' + | 'descTr' >, ) => { const current = formik?.values[field] @@ -847,12 +847,12 @@ const Wizard = () => { formik?.setFieldValue('wizardName', name) formik?.setFieldValue('listFormCode', derived) formik?.setFieldValue('menuCode', derived) - setAutoText('languageTextMenuEn') - setAutoText('languageTextMenuTr') - setAutoText('languageTextTitleEn') - setAutoText('languageTextTitleTr') - setAutoText('languageTextDescEn') - setAutoText('languageTextDescTr') + setAutoText('menuEn') + setAutoText('menuTr') + setAutoText('titleEn') + setAutoText('titleTr') + setAutoText('descEn') + setAutoText('descTr') } /** @@ -943,8 +943,8 @@ const Wizard = () => { formik?.setFieldValue('menuParentCode', '') formik?.setFieldValue('menuParentModuleId', '') formik?.setFieldValue('menuParentIcon', '') - formik?.setFieldValue('languageTextMenuParentEn', '') - formik?.setFieldValue('languageTextMenuParentTr', '') + formik?.setFieldValue('menuParentEn', '') + formik?.setFieldValue('menuParentTr', '') if (derivedFromParent) handlePermissionGroupChange('') } @@ -961,8 +961,8 @@ const Wizard = () => { formik?.setFieldValue('menuParentCode', '') formik?.setFieldValue('menuParentModuleId', '') formik?.setFieldValue('menuParentIcon', '') - formik?.setFieldValue('languageTextMenuParentEn', '') - formik?.setFieldValue('languageTextMenuParentTr', '') + formik?.setFieldValue('menuParentEn', '') + formik?.setFieldValue('menuParentTr', '') } } @@ -977,8 +977,8 @@ const Wizard = () => { formik?.setFieldValue('menuParentCode', '') formik?.setFieldValue('menuParentModuleId', '') formik?.setFieldValue('menuParentIcon', '') - formik?.setFieldValue('languageTextMenuParentEn', '') - formik?.setFieldValue('languageTextMenuParentTr', '') + formik?.setFieldValue('menuParentEn', '') + formik?.setFieldValue('menuParentTr', '') formik?.setFieldValue('menuIcon', '') formik?.setFieldValue('menuOrder', 0) } @@ -996,8 +996,8 @@ const Wizard = () => { } const selectedMenu = rawMenuItems.find((item) => item.code === code) formikRef.current?.setFieldValue('menuParentIcon', selectedMenu?.icon ?? '') - formikRef.current?.setFieldValue('languageTextMenuParentEn', selectedMenu?.menuTextEn ?? '') - formikRef.current?.setFieldValue('languageTextMenuParentTr', selectedMenu?.menuTextTr ?? '') + formikRef.current?.setFieldValue('menuParentEn', selectedMenu?.menuTextEn ?? '') + formikRef.current?.setFieldValue('menuParentTr', selectedMenu?.menuTextTr ?? '') if (!code) { formikRef.current?.setFieldValue('menuParentModuleId', '') return @@ -1023,8 +1023,8 @@ const Wizard = () => { .reduce((max, item) => Math.max(max, item.order ?? 0), 0) + 1 formikRef.current?.setFieldValue('menuOrder', nextMenuOrder) formikRef.current?.setFieldValue('menuParentIcon', menu.icon ?? '') - formikRef.current?.setFieldValue('languageTextMenuParentEn', menu.menuTextEn) - formikRef.current?.setFieldValue('languageTextMenuParentTr', menu.menuTextTr) + formikRef.current?.setFieldValue('menuParentEn', menu.menuTextEn) + formikRef.current?.setFieldValue('menuParentTr', menu.menuTextTr) const rootCode = menu.parentCode ? findRootCode(rawMenuItems, menu.parentCode) : menu.code const existingRoot = rawMenuItems.find((item) => item.code === rootCode) diff --git a/ui/src/views/admin/listForm/wizard/WizardStepDataSettings.tsx b/ui/src/views/admin/listForm/wizard/WizardStepDataSettings.tsx index 5890654b..862f9102 100644 --- a/ui/src/views/admin/listForm/wizard/WizardStepDataSettings.tsx +++ b/ui/src/views/admin/listForm/wizard/WizardStepDataSettings.tsx @@ -133,10 +133,10 @@ const WizardStepDataSettings = ({ translate('::App.Listform.ListformField.ConnectionString'), !values.selectCommand && translate('::App.WizardStep2.SelectCommand'), !values.keyFieldName && translate('::App.WizardStep4.KeyField'), - !values.languageTextDescEn && translate('::App.WizardStep2.DescriptionTextEnglish'), - !values.languageTextDescTr && translate('::App.WizardStep2.DescriptionTextTurkish'), - !values.languageTextTitleEn && translate('::App.WizardStep2.TitleTextEnglish'), - !values.languageTextTitleTr && translate('::App.WizardStep2.TitleTextTurkish'), + !values.descEn && translate('::App.WizardStep2.DescriptionTextEnglish'), + !values.descTr && translate('::App.WizardStep2.DescriptionTextTurkish'), + !values.titleEn && translate('::App.WizardStep2.TitleTextEnglish'), + !values.titleTr && translate('::App.WizardStep2.TitleTextTurkish'), selectedColumns.size === 0 && translate('::App.WizardStep2.ColumnSelection'), ].filter(Boolean) as string[] const step2CanGo = step2Missing.length === 0 @@ -653,13 +653,13 @@ const WizardStepDataSettings = ({ @@ -668,13 +668,13 @@ const WizardStepDataSettings = ({ @@ -683,13 +683,13 @@ const WizardStepDataSettings = ({ @@ -698,13 +698,13 @@ const WizardStepDataSettings = ({ diff --git a/ui/src/views/admin/listForm/wizard/WizardStepDeploy.tsx b/ui/src/views/admin/listForm/wizard/WizardStepDeploy.tsx index 410a1b4c..efb3adc2 100644 --- a/ui/src/views/admin/listForm/wizard/WizardStepDeploy.tsx +++ b/ui/src/views/admin/listForm/wizard/WizardStepDeploy.tsx @@ -85,14 +85,14 @@ function buildLogSteps( { id: 3, label: translate('::App.Step4Log.SavingLanguageTexts'), - detail: `EN: ${values.languageTextMenuEn} / TR: ${values.languageTextMenuTr}`, + detail: `EN: ${values.menuEn} / TR: ${values.menuTr}`, }, { id: 4, label: translate('::App.Step4Log.ConfiguringPermission', { 0: values.permissionGroupName, }), - detail: `EN: ${values.permissionGroupDisplayNameEn} / TR: ${values.permissionGroupDisplayNameTr}`, + detail: `EN: ${values.permissionGroupEn} / TR: ${values.permissionGroupTr}`, }, { id: 5, @@ -116,14 +116,14 @@ function buildLogSteps( { id: 3, label: translate('::App.Step4Log.SavingLanguageTexts'), - detail: `EN: ${values.languageTextMenuEn} / TR: ${values.languageTextMenuTr}`, + detail: `EN: ${values.menuEn} / TR: ${values.menuTr}`, }, { id: 4, label: translate('::App.Step4Log.ConfiguringPermission', { 0: values.permissionGroupName, }), - detail: `EN: ${values.permissionGroupDisplayNameEn} / TR: ${values.permissionGroupDisplayNameTr}`, + detail: `EN: ${values.permissionGroupEn} / TR: ${values.permissionGroupTr}`, }, { id: 5, @@ -324,22 +324,22 @@ const WizardStepDeploy = ({ /> - - + + @@ -362,19 +362,19 @@ const WizardStepDeploy = ({ /> = 1) && translate('::App.WizardStep1.MenuOrder'), !values.permissionGroupName && translate('::App.WizardStep1.PermissionGroupName'), - !values.permissionGroupDisplayNameEn && + !values.permissionGroupEn && translate('::App.WizardStep1.PermissionGroupDisplayNameEn'), - !values.permissionGroupDisplayNameTr && + !values.permissionGroupTr && translate('::App.WizardStep1.PermissionGroupDisplayNameTr'), - !values.languageTextMenuEn && translate('::App.WizardStep4.MenuEn'), - !values.languageTextMenuTr && translate('::App.WizardStep4.MenuTr'), + !values.menuEn && translate('::App.WizardStep4.MenuEn'), + !values.menuTr && translate('::App.WizardStep4.MenuTr'), createMenu && !values.menuIcon && translate('::App.WizardStep4.MenuIcon'), ].filter(Boolean) as string[] // 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 = ({ @@ -821,13 +821,13 @@ const WizardStepMenu = ({ @@ -881,8 +881,8 @@ const WizardStepMenu = ({ existingNames={permissionGroupList.map((o) => o.value ?? '')} initialValue={{ name: values.permissionGroupName ?? '', - displayNameEn: values.permissionGroupDisplayNameEn ?? '', - displayNameTr: values.permissionGroupDisplayNameTr ?? '', + displayNameEn: values.permissionGroupEn ?? '', + displayNameTr: values.permissionGroupTr ?? '', }} onClose={() => setPermissionGroupDialogOpen(false)} onSave={onPermissionGroupDefine} diff --git a/ui/src/views/list/GanttView.tsx b/ui/src/views/list/GanttView.tsx index b49489f1..03abfb75 100644 --- a/ui/src/views/list/GanttView.tsx +++ b/ui/src/views/list/GanttView.tsx @@ -585,7 +585,7 @@ const GanttView = (props: GanttViewProps) => {