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`.
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.

View file

@ -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ç.

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
(`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.

View file

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

View file

@ -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.
/// </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>
public string PermissionGroupDisplayNameTr { get; set; }
/// <summary>Izin grubunun Turkce gorunen adi; <see cref="PermissionGroupEn"/> ile ayni kurallara tabidir.</summary>
public string PermissionGroupTr { get; set; }
public string MenuParentModuleId { get; set; }
public string MenuParentCode { get; set; }

View file

@ -96,14 +96,17 @@ public class WizardSeedFileDto
nameof(WizardColumnItemInputDto.LookupQuery),
];
/// <summary>Dosyada `Menu` basligi altinda toplanan wizard alanlari.</summary>
private static readonly string[] MenuKeys =
/// <summary>Dosyada `Menu` basligi altinda toplanan wizard alanlari; adlari degismez.</summary>
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);
/// <summary>
/// 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),
];
/// <summary>
/// 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.
/// </summary>
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)),
];
/// <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";
@ -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<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)
{
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>
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
}
/// <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)
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;
}
}

View file

@ -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(
/// </summary>
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;
}
/// <summary>Bir dil anahtarinin Ingilizce/Turkce metinlerini dondurur; yoksa null.</summary>
@ -1541,16 +1545,4 @@ public class ListFormWizardAppService(
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",
"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",

View file

@ -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
}
/// <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)
{
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);
}
}
}

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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

View file

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

View file

@ -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')}
>
<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>
<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
label={translate('::App.ListFormEdit.AllowResourceAdding')}
invalid={
@ -403,70 +471,11 @@ function FormTabGantt(props: FormEditProps) {
name="ganttOptionDto.allowResourceAdding"
placeholder={translate('::App.ListFormEdit.AllowResourceAdding')}
component={Checkbox}
/>
</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}
disabled={!values.ganttOptionDto.editingEnabled}
/>
</FormItem>
</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
label={translate('::App.ListFormEdit.AllowResourceUpdating')}
invalid={
@ -479,23 +488,61 @@ function FormTabGantt(props: FormEditProps) {
name="ganttOptionDto.allowResourceUpdating"
placeholder={translate('::App.ListFormEdit.AllowResourceUpdating')}
component={Checkbox}
disabled={!values.ganttOptionDto.editingEnabled}
/>
</FormItem>
</div>
<div>
<FormItem
label={translate('::App.ListFormEdit.AllowTaskResourceUpdating')}
label={translate('::App.ListFormEdit.AllowResourceDeleting')}
invalid={
errors.ganttOptionDto?.allowTaskResourceUpdating &&
touched.ganttOptionDto?.allowTaskResourceUpdating
errors.ganttOptionDto?.allowResourceDeleting &&
touched.ganttOptionDto?.allowResourceDeleting
}
errorMessage={errors.ganttOptionDto?.allowTaskResourceUpdating}
errorMessage={errors.ganttOptionDto?.allowResourceDeleting}
>
<Field
name="ganttOptionDto.allowTaskResourceUpdating"
placeholder={translate(
'::App.ListFormEdit.AllowTaskResourceUpdating',
)}
name="ganttOptionDto.allowResourceDeleting"
placeholder={translate('::App.ListFormEdit.AllowResourceDeleting')}
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>
</div>

View file

@ -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 = <T extends Yup.Schema>(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)

View file

@ -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 = ({
<FormItem
label={translate('::App.WizardStep2.TitleTextEnglish')}
asterisk={true}
invalid={!!(errors.languageTextTitleEn && touched.languageTextTitleEn)}
errorMessage={errors.languageTextTitleEn}
invalid={!!(errors.titleEn && touched.titleEn)}
errorMessage={errors.titleEn}
>
<Field
type="text"
autoComplete="off"
name="languageTextTitleEn"
name="titleEn"
placeholder={translate('::App.WizardStep2.TitleTextEnglish')}
component={Input}
/>
@ -668,13 +668,13 @@ const WizardStepDataSettings = ({
<FormItem
label={translate('::App.WizardStep2.TitleTextTurkish')}
asterisk={true}
invalid={!!(errors.languageTextTitleTr && touched.languageTextTitleTr)}
errorMessage={errors.languageTextTitleTr}
invalid={!!(errors.titleTr && touched.titleTr)}
errorMessage={errors.titleTr}
>
<Field
type="text"
autoComplete="off"
name="languageTextTitleTr"
name="titleTr"
placeholder={translate('::App.WizardStep2.TitleTextTurkish')}
component={Input}
/>
@ -683,13 +683,13 @@ const WizardStepDataSettings = ({
<FormItem
label={translate('::App.WizardStep2.DescriptionTextEnglish')}
asterisk={true}
invalid={!!(errors.languageTextDescEn && touched.languageTextDescEn)}
errorMessage={errors.languageTextDescEn}
invalid={!!(errors.descEn && touched.descEn)}
errorMessage={errors.descEn}
>
<Field
type="text"
autoComplete="off"
name="languageTextDescEn"
name="descEn"
placeholder={translate('::App.WizardStep2.DescriptionTextEnglish')}
component={Input}
/>
@ -698,13 +698,13 @@ const WizardStepDataSettings = ({
<FormItem
label={translate('::App.WizardStep2.DescriptionTextTurkish')}
asterisk={true}
invalid={!!(errors.languageTextDescTr && touched.languageTextDescTr)}
errorMessage={errors.languageTextDescTr}
invalid={!!(errors.descTr && touched.descTr)}
errorMessage={errors.descTr}
>
<Field
type="text"
autoComplete="off"
name="languageTextDescTr"
name="descTr"
placeholder={translate('::App.WizardStep2.DescriptionTextTurkish')}
component={Input}
/>

View file

@ -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 = ({
/>
<Row
label={translate('::App.WizardStep1.PermissionGroupDisplayNameTr')}
value={values.permissionGroupDisplayNameTr}
value={values.permissionGroupTr}
/>
<Row
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.WizardStep4.MenuTr')} value={values.languageTextMenuTr} />
<Row label={translate('::App.WizardStep4.MenuEn')} value={values.languageTextMenuEn} />
<Row label={translate('::App.WizardStep4.MenuTr')} value={values.menuTr} />
<Row label={translate('::App.WizardStep4.MenuEn')} value={values.menuEn} />
<Row
label={translate('::App.WizardStep4.MenuParentTr')}
value={values.languageTextMenuParentTr}
value={values.menuParentTr}
/>
<Row
label={translate('::App.WizardStep4.MenuParentEn')}
value={values.languageTextMenuParentEn}
value={values.menuParentEn}
/>
</Section>
@ -362,19 +362,19 @@ const WizardStepDeploy = ({
/>
<Row
label={translate('::App.WizardStep4.TitleTr')}
value={values.languageTextTitleTr}
value={values.titleTr}
/>
<Row
label={translate('::App.WizardStep4.TitleEn')}
value={values.languageTextTitleEn}
value={values.titleEn}
/>
<Row
label={translate('::App.WizardStep4.DescTr')}
value={values.languageTextDescTr}
value={values.descTr}
/>
<Row
label={translate('::App.WizardStep4.DescEn')}
value={values.languageTextDescEn}
value={values.descEn}
/>
<Row label={translate('::App.Platform.DataSource')} value={values.dataSourceCode} />
<Row

View file

@ -44,7 +44,7 @@ const WizardStepGanttLayout = ({
['progressExpr', translate('::App.ListFormEdit.ProgressExpr')],
] as const
const permissionFields = [
['allowEditing', '::App.ListFormEdit.AllowEditing'],
['editingEnabled', '::App.ListFormEdit.EditingEnabled'],
['allowTaskAdding', '::App.ListFormEdit.AllowTaskAdding'],
['allowTaskUpdating', '::App.ListFormEdit.AllowTaskUpdating'],
['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.
createMenu && !(Number(values.menuOrder) >= 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 = ({
<FormItem
label={translate('::App.Platform.DisplayNameEnglish')}
asterisk={true}
invalid={!!(errors.languageTextMenuEn && touched.languageTextMenuEn)}
errorMessage={errors.languageTextMenuEn}
invalid={!!(errors.menuEn && touched.menuEn)}
errorMessage={errors.menuEn}
>
<Field
type="text"
autoComplete="off"
name="languageTextMenuEn"
name="menuEn"
placeholder={translate('::App.Platform.DisplayNameEnglish')}
component={Input}
/>
@ -821,13 +821,13 @@ const WizardStepMenu = ({
<FormItem
label={translate('::App.Platform.DisplayNameTurkish')}
asterisk={true}
invalid={!!(errors.languageTextMenuTr && touched.languageTextMenuTr)}
errorMessage={errors.languageTextMenuTr}
invalid={!!(errors.menuTr && touched.menuTr)}
errorMessage={errors.menuTr}
>
<Field
type="text"
autoComplete="off"
name="languageTextMenuTr"
name="menuTr"
placeholder={translate('::App.Platform.DisplayNameTurkish')}
component={Input}
/>
@ -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}

View file

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