From c4e90a459f993af4dc827253c7e6097ffa881af0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Thu, 1 Oct 2026 12:37:30 +0300 Subject: [PATCH] =?UTF-8?q?MenuManager=20komponenti=20json=20dosyas=C4=B1?= =?UTF-8?q?=20g=C3=BCncellenebiliyor.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/instructions/lowcode.instructions.md | 5 +- README.md | 2 +- .../ListForms/ListFormSeedDataSynchronizer.cs | 84 ++- .../Menu/MenuAppService.cs | 120 ++- claude.md | 2 +- .../ec7d68c2-2dae-466a-8f8b-f28f6042746a.json | 8 +- configs/seeds/host/data/App.Menus.Menu.json | 683 ++++++++++++++---- 7 files changed, 690 insertions(+), 214 deletions(-) diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md index c8748bab..34d1c72f 100644 --- a/.github/instructions/lowcode.instructions.md +++ b/.github/instructions/lowcode.instructions.md @@ -3995,8 +3995,9 @@ elle düzeltme ve wizard'ın kapsamadığı düzenlemeler içindir. kullanır; custom component'lerin route'u `RoutePath` alanından türetilir. `Route` tablosu yalnızca fiziksel React sayfaları içindir ve prompt ile ekran üretirken böyle bir sayfa yazılmaz. -3. **Menü sırası** için wizard'ın `MenuOrder` alanını kullan; Menu Manager'da elle taşımak seed - dosyasına yansımaz ve veritabanı sıfırlandığında kaybolur. +3. **Menü sırası** için wizard'ın `MenuOrder` alanını kullan. Menu Manager'daki taşıma/düzenleme de + `App.Menus.Menu` ekranının seed dosyasına (`data/App.Menus.Menu.json`) ve menü adı + `App.Languages.LanguageText.json`'a yansır (`MenuAppService` → `IListFormSeedDataSynchronizer`). 4. **Rol/dil bazlı menü varyantı** gerekiyorsa Menu List ekranından ikinci bir kayıt açılır — aynı `Url`, farklı `RoleId`/`CultureName`. Wizard bunu üretmez. diff --git a/README.md b/README.md index 01a72a03..0f1115a4 100644 --- a/README.md +++ b/README.md @@ -899,7 +899,7 @@ Route.Authority ──┘ └► Permission - **Menu** (`Menu.cs`): `Code`, `ParentCode`, `DisplayName`, `Url`, `Icon`, `Order`, `RequiredPermissionName`, `Target`, `IsDisabled`, ayrıca `UserId` / `RoleId` / `CultureName` ile kullanıcı, rol ve dil bazlı menü varyantları. -- **Menü yöneticisi** (`/admin/menuManager`): sürükle-bırak ağaç ile menü düzenleme. +- **Menü yöneticisi** (`/admin/menuManager`): sürükle-bırak ağaç ile menü düzenleme. Kayıtlar `App.Menus.Menu` ekranıyla aynı seed dosyasına (`data/App.Menus.Menu.json`, `SeedSync*` bayraklarına bağlı) yazılır; menü adları `App.Languages.LanguageText.json`'a. - Frontend'de `dynamicRoutesContext` route'ları çeker, `dynamicRouteLoader` bunları fiziksel view'lara veya runtime derlenmiş Custom Component'lere eşler, `DynamicRouter` React Router ağacını kurar; her korumalı route `ProtectedRoute` + `PermissionGuard` ile sarılır. diff --git a/api/src/Sozsoft.Platform.Application/ListForms/ListFormSeedDataSynchronizer.cs b/api/src/Sozsoft.Platform.Application/ListForms/ListFormSeedDataSynchronizer.cs index fc2c4ad7..5ff6d26e 100644 --- a/api/src/Sozsoft.Platform.Application/ListForms/ListFormSeedDataSynchronizer.cs +++ b/api/src/Sozsoft.Platform.Application/ListForms/ListFormSeedDataSynchronizer.cs @@ -13,6 +13,7 @@ using Sozsoft.Platform.ListForms.Select; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; namespace Sozsoft.Platform.ListForms; @@ -28,6 +29,12 @@ public interface IListFormSeedDataSynchronizer /// Task SyncRowAsync(string listFormCode, object key, SeedSyncOperation operation); + /// + /// 'in toplu hali: tek dosya modunda dosya bir kez okunup bir kez yazilir. + /// Siralama gibi bircok satiri birlikte degistiren islemler icindir. + /// + Task SyncRowsAsync(string listFormCode, IReadOnlyCollection keys, SeedSyncOperation operation); + /// Silinen satirlari dosyadan cikarir; SeedSyncDelete kapaliysa hicbir sey yapmaz. Task RemoveRowsAsync(string listFormCode, object[] keys); @@ -70,6 +77,7 @@ public class ListFormSeedDataSynchronizer( IListFormSelectAppService listFormSelectAppService, IConfiguration configuration, ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, ILogger logger) : IListFormSeedDataSynchronizer, ITransientDependency { private const int SyncAllPageSize = 10000; @@ -80,33 +88,51 @@ public class ListFormSeedDataSynchronizer( /// private sealed record SeedTarget(string Path, bool IsFolder); - public async Task SyncRowAsync(string listFormCode, object key, SeedSyncOperation operation) + public Task SyncRowAsync(string listFormCode, object key, SeedSyncOperation operation) => + SyncRowsAsync(listFormCode, [key], operation); + + public async Task SyncRowsAsync(string listFormCode, IReadOnlyCollection keys, SeedSyncOperation operation) { await ExecuteAsync(listFormCode, IsEnabled(operation), async (listForm, target) => { // Insert ucu her veri kaynaginda anahtari geri dondurmez; anahtarsiz kaldigimizda // ya da satir okunamadiginda hedef listenin tamamiyla yenilenir, bayat kalmaz. - var row = key == null ? null : await ReadRowAsync(listForm, key); - if (row == null) + var rows = new List<(object Key, Dictionary Row)>(); + foreach (var key in keys ?? []) { - logger.LogInformation("Row '{Key}' could not be read for '{ListFormCode}', seed file is rewritten from the list.", key, listForm.ListFormCode); - await WriteAllRowsAsync(listForm, target); - return; + var row = key == null ? null : await ReadRowAsync(listForm, key); + if (row == null) + { + logger.LogInformation("Row '{Key}' could not be read for '{ListFormCode}', seed file is rewritten from the list.", key, listForm.ListFormCode); + await WriteAllRowsAsync(listForm, target); + return; + } + + rows.Add((key, row)); } + if (rows.Count == 0) + return; + if (target.IsFolder) { - await WriteRowFileAsync(listForm, target, key, row); + foreach (var (key, row) in rows) + await WriteRowFileAsync(listForm, target, key, row); + return; } var seedFile = await ReadSeedFileAsync(target.Path, listForm); - var index = FindRowIndex(seedFile, listForm.KeyFieldName, key); - if (index >= 0) - seedFile.Rows[index] = row; - else - seedFile.Rows.Add(row); + foreach (var (key, row) in rows) + { + var index = FindRowIndex(seedFile, listForm.KeyFieldName, key); + + if (index >= 0) + seedFile.Rows[index] = row; + else + seedFile.Rows.Add(row); + } await WriteSeedFileAsync(target.Path, seedFile); }); @@ -171,7 +197,9 @@ public class ListFormSeedDataSynchronizer( row.Any(kv => string.Equals(kv.Key, fieldName, StringComparison.OrdinalIgnoreCase) && wanted.Contains(ToComparableText(kv.Value))); - await ExecuteAsync(listFormCode, listForm => listForm.SeedSyncDelete, async (_, target) => + // Yalnizca dosyaya dokunur, veritabanindan satir okumaz; commit beklenmez. Ertelenseydi + // ayni istekte sonradan yazilan wizard satirlarini silebilirdi. + await RunAsync(listFormCode, listForm => listForm.SeedSyncDelete, async (_, target) => { List files = target.IsFolder ? Directory.Exists(target.Path) ? [.. Directory.EnumerateFiles(target.Path, "*.json")] : [] @@ -345,15 +373,37 @@ public class ListFormSeedDataSynchronizer( /// Seed dosyasi bagli degilse ya da islemin bayragi kapaliysa hicbir sey yapmaz. /// Senkronizasyon hatasi kullanicinin kayit islemini bozmaz; yalnizca loglanir. /// - private async Task ExecuteAsync( + private Task ExecuteAsync( + string listFormCode, + Func isEnabled, + Func action) + { + if (string.IsNullOrWhiteSpace(listFormCode)) + return Task.CompletedTask; + + // Satir EF ile yazildiysa (MenuAppService, CustomComponentAppService) degisiklik commit + // edilmeden select ayri baglantidan eski degeri okur; dosya bu yuzden commit sonrasinda, + // kendi UoW'sinde yazilir. Geri alinan islem dosyaya hic yansimaz. + var unitOfWork = unitOfWorkManager.Current; + if (unitOfWork == null) + return RunAsync(listFormCode, isEnabled, action); + + unitOfWork.OnCompleted(async () => + { + using var syncUnitOfWork = unitOfWorkManager.Begin(requiresNew: true); + await RunAsync(listFormCode, isEnabled, action); + await syncUnitOfWork.CompleteAsync(); + }); + + return Task.CompletedTask; + } + + private async Task RunAsync( string listFormCode, Func isEnabled, Func action, bool createTarget = true) { - if (string.IsNullOrWhiteSpace(listFormCode)) - return; - try { var listForm = await listFormRepository.FirstOrDefaultAsync(a => a.ListFormCode == listFormCode); diff --git a/api/src/Sozsoft.Platform.Application/Menu/MenuAppService.cs b/api/src/Sozsoft.Platform.Application/Menu/MenuAppService.cs index 5a204666..de0d12ee 100644 --- a/api/src/Sozsoft.Platform.Application/Menu/MenuAppService.cs +++ b/api/src/Sozsoft.Platform.Application/Menu/MenuAppService.cs @@ -34,6 +34,7 @@ public class MenuAppService : CrudAppService< private readonly IPermissionDefinitionRecordRepository _permissionRepository; private readonly LanguageTextAppService _languageTextAppService; private readonly IRepository _moduleRepository; + private readonly IListFormSeedDataSynchronizer _seedDataSynchronizer; public MenuAppService( IRepository menuRepository, @@ -42,7 +43,8 @@ public class MenuAppService : CrudAppService< ITenantRepository tenantRepository, IPermissionDefinitionRecordRepository permissionRepository, LanguageTextAppService languageTextAppService, - IRepository moduleRepository + IRepository moduleRepository, + IListFormSeedDataSynchronizer seedDataSynchronizer ) : base(menuRepository) { _menuRepository = menuRepository; @@ -52,6 +54,7 @@ public class MenuAppService : CrudAppService< _permissionRepository = permissionRepository; _languageTextAppService = languageTextAppService; _moduleRepository = moduleRepository; + _seedDataSynchronizer = seedDataSynchronizer; CreatePolicyName = $"{AppCodes.Menus.Menu}.Create"; UpdatePolicyName = $"{AppCodes.Menus.Menu}.Update"; @@ -182,7 +185,9 @@ public class MenuAppService : CrudAppService< }); } - return await base.CreateAsync(input); + var result = await base.CreateAsync(input); + await SyncMenuRowsAsync([result.Code], SeedSyncOperation.Insert); + return result; } public override async Task UpdateAsync(Guid id, MenuDto input) @@ -205,7 +210,10 @@ public class MenuAppService : CrudAppService< }); } - return await base.UpdateAsync(id, input); + var previousCode = (await _menuRepository.GetAsync(id)).Code; + var result = await base.UpdateAsync(id, input); + await SyncUpdatedMenuRowsAsync([(previousCode, result.Code)]); + return result; } public async Task> UpdateAllAsync(List inputs) @@ -246,6 +254,10 @@ public class MenuAppService : CrudAppService< await _repositoryKey.InsertManyAsync(newKeys, autoSave: true); } + var ids = inputs.Select(x => x.Id).ToList(); + var previousCodes = (await _menuRepository.GetListAsync(a => ids.Contains(a.Id))) + .ToDictionary(a => a.Id, a => a.Code); + // Menüleri güncelle var result = new List(); foreach (var input in inputs) @@ -254,6 +266,8 @@ public class MenuAppService : CrudAppService< result.Add(updated); } + await SyncUpdatedMenuRowsAsync(result.Select(x => (previousCodes.GetValueOrDefault(x.Id), x.Code))); + return result; } @@ -270,6 +284,9 @@ public class MenuAppService : CrudAppService< } await base.DeleteAsync(id); + + if (menu != null) + await _seedDataSynchronizer.RemoveRowsAsync(AppCodes.Menus.Menu, [menu.Code]); } public async Task> GetListMainMenuAsync() @@ -307,7 +324,9 @@ public class MenuAppService : CrudAppService< await UpsertMenuLanguageTextsAsync(menu.Code, input.MenuTextEn, input.MenuTextTr); - return await base.UpdateAsync(id, input); + var result = await base.UpdateAsync(id, input); + await SyncMenuRowsAsync([result.Code], SeedSyncOperation.Update); + return result; } /// @@ -327,6 +346,9 @@ public class MenuAppService : CrudAppService< }, autoSave: true); } + var changedTextIds = new List(); + var insertedTextIds = new List(); + foreach (var (culture, value) in new[] { ("en", menuTextEn), ("tr", menuTextTr) }) { if (value == null) @@ -341,20 +363,27 @@ public class MenuAppService : CrudAppService< { existing.Value = value; await _repositoryText.UpdateAsync(existing, autoSave: true); + changedTextIds.Add(existing.Id); } else { - await _repositoryText.InsertAsync(new LanguageText + var inserted = await _repositoryText.InsertAsync(new LanguageText { Key = code, CultureName = culture, Value = value, ResourceName = PlatformConsts.AppName }, autoSave: true); + insertedTextIds.Add(inserted.Id); } } await _languageTextAppService.ClearRedisCacheAsync(); + + // Dil metinleri de kendi ekraninin seed dosyasinda yasar; menu adini runtime'da + // degistirmek DB sifirlandiginda geri gelmeli. + await _seedDataSynchronizer.SyncRowsAsync(AppCodes.Languages.LanguageText, changedTextIds, SeedSyncOperation.Update); + await _seedDataSynchronizer.SyncRowsAsync(AppCodes.Languages.LanguageText, insertedTextIds, SeedSyncOperation.Insert); } public async Task CreateWithLanguageKeyTextAsync(MenuDto input) @@ -363,67 +392,36 @@ public class MenuAppService : CrudAppService< await EnsureModuleAsync(input.ModuleId); - //Dil Key oluşturuluyor. - var keyExists = await _repositoryKey.AnyAsync( - a => a.Key == input.Code && - a.ResourceName == PlatformConsts.AppName); - if (!keyExists) - { - await _repositoryKey.InsertAsync(new LanguageKey - { - Key = input.Code, - ResourceName = PlatformConsts.AppName - }, autoSave: true); - } + await UpsertMenuLanguageTextsAsync(input.Code, input.MenuTextEn, input.MenuTextTr); - // English text oluşturuluyor veya güncelleniyor. - var existingEnText = await _repositoryText.FirstOrDefaultAsync( - a => a.CultureName == "en" && - a.Key == input.Code && - a.ResourceName == PlatformConsts.AppName); + var result = await base.CreateAsync(input); + await SyncMenuRowsAsync([result.Code], SeedSyncOperation.Insert); + return result; + } - if (existingEnText != null) - { - existingEnText.Value = input.MenuTextEn; - await _repositoryText.UpdateAsync(existingEnText, autoSave: true); - } - else - { - await _repositoryText.InsertAsync(new LanguageText - { - Key = input.Code, - CultureName = "en", - Value = input.MenuTextEn, - ResourceName = PlatformConsts.AppName - }, autoSave: true); - } + /// + /// Menu Yoneticisi de App.Menus.Menu ekraniyla ayni seed dosyasini yazar; aksi halde + /// siralama ve duzenlemeler DB sifirlandiginda kaybolur. Dosyanin anahtari Code'dur. + /// + private Task SyncMenuRowsAsync(IReadOnlyCollection codes, SeedSyncOperation operation) => + _seedDataSynchronizer.SyncRowsAsync(AppCodes.Menus.Menu, [.. codes], operation); - // Türkçe text oluşturuluyor veya güncelleniyor. - var existingTrText = await _repositoryText.FirstOrDefaultAsync( - a => a.CultureName == "tr" && - a.Key == input.Code && - a.ResourceName == PlatformConsts.AppName); + /// + /// Kodu degisen menunun eski satiri dosyadan cikarilir; dosya Code anahtarli oldugu icin + /// yeni kod ayri bir satir olarak eklenir. + /// + private async Task SyncUpdatedMenuRowsAsync(IEnumerable<(string PreviousCode, string Code)> changes) + { + var list = changes.ToList(); - if (existingTrText != null) - { - existingTrText.Value = input.MenuTextTr; - await _repositoryText.UpdateAsync(existingTrText, autoSave: true); - } - else - { - await _repositoryText.InsertAsync(new LanguageText - { - Key = input.Code, - CultureName = "tr", - Value = input.MenuTextTr, - ResourceName = PlatformConsts.AppName - }, autoSave: true); - } + var renamed = list + .Where(x => !string.IsNullOrWhiteSpace(x.PreviousCode) && x.PreviousCode != x.Code) + .Select(x => (object)x.PreviousCode) + .ToArray(); + if (renamed.Length > 0) + await _seedDataSynchronizer.RemoveRowsAsync(AppCodes.Menus.Menu, renamed); - // Clear Redis Cache - await _languageTextAppService.ClearRedisCacheAsync(); - - return await base.CreateAsync(input); + await SyncMenuRowsAsync([.. list.Select(x => x.Code)], SeedSyncOperation.Update); } /// diff --git a/claude.md b/claude.md index 195eacea..c4223ef0 100644 --- a/claude.md +++ b/claude.md @@ -406,7 +406,7 @@ Bir çelişki varsa sıra: `ai.instructions.md` → `dotnet.instructions.md` → Migrate/seed sırasında ve wizard import'unun kapanışında (`CompleteImport`) `ListFormSeedDataApplier` dosyayı geri uygular. Migrate/seed'de kayıt yoksa eklenir, varsa dokunulmaz; import'ta `overwriteExisting` açıktır: var olan kayıt dosyadaki - değerlerle güncellenir ve soft delete izleri (`IsDeleted`/`DeletionTime`/`DeleterId`) temizlenir. Yeni bir kayıt yolu (yeni endpoint, toplu işlem, tipli AppService) eklenirse + değerlerle güncellenir ve soft delete izleri (`IsDeleted`/`DeletionTime`/`DeleterId`) temizlenir. Satırı veritabanından okuyan senkronizasyon açık UoW varsa commit sonrasında kendi UoW'sinde çalışır (EF ile yazan çağıran, ör. `MenuAppService`, aksi hâlde eski değeri dosyaya yazardı); yalnızca dosyaya dokunan `RemoveRowsByFieldAsync` hemen çalışır. Yeni bir kayıt yolu (yeni endpoint, toplu işlem, tipli AppService) eklenirse senkronizasyon çağrısı da eklenir; yoksa dosya bayatlar. - **Seed dosyası yazmak** → veri dosyası `ListFormSeedDataFileDto.Serialize`, wizard dosyası `WizardSeedFileDto.ToSeedJson` ile yazılır; düz `JsonSerializer.Serialize` + `File.WriteAllText` diff --git a/configs/seeds/host/data/App.DevRequests/ec7d68c2-2dae-466a-8f8b-f28f6042746a.json b/configs/seeds/host/data/App.DevRequests/ec7d68c2-2dae-466a-8f8b-f28f6042746a.json index f2801089..4bb92d09 100644 --- a/configs/seeds/host/data/App.DevRequests/ec7d68c2-2dae-466a-8f8b-f28f6042746a.json +++ b/configs/seeds/host/data/App.DevRequests/ec7d68c2-2dae-466a-8f8b-f28f6042746a.json @@ -9,16 +9,16 @@ "TenantId": null, "UserName": "system@sozsoft.com", "RequestDate": null, - "Status": "Testing", + "Status": "Staging", "Title": "Human Resources -> Health Card", "Description": "

Human Resources menüsünün altına Health Card adında listesi ekle. Bu liste kullanıcı listesi gibi bir liste olmalı ve bu listenin sadece Detay butonu olmalı. Bu butona basınca açılan detay formu aynı aşağıdaki resimdeki gibi olmalı. Üst kısımda kullanıcı bilgileri alt kısımdaki tablarda aynı User Detaildeki Health Card gibi olmalı.


", "DueDate": null, "Tags": "HR", "Assignees": "system@sozsoft.com", "Priority": null, - "Completed": false, - "SortOrder": 0, - "Timesheets": "[{\"id\":\"fe72afa0-9b50-e90a-a166-3a24088f5087\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0833},{\"id\":\"0bad51df-91ee-6eba-2d25-3a2408986e70\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardHistory.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.05},{\"id\":\"20934d75-88dd-5a98-7314-3a2408991d44\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardLabPhysical.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"7fb1d459-e85f-6a5b-2b17-3a24089a350e\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardAnamnesis.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"196f9b32-8294-f469-e553-3a24089a843e\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardResult.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"09c813af-f6ed-0bde-590f-3a24089ae48f\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardPeriodicExamination.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"12563d83-6c1a-5e01-3590-3a24089b59bb\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardPatientProtocol.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"7e0681de-3e80-120e-8039-3a24089bd0c7\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardSickLeave.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"57ed3514-62b1-3a13-7aa3-3a24089c6423\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCard.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"3f790c75-99c4-3d11-e2d7-3a24089c7ac0\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"8 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"95e09967-9627-2e6b-50ac-3a24089cb3e7\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167}]", + "Completed": true, + "SortOrder": 2, + "Timesheets": "[{\"id\":\"fe72afa0-9b50-e90a-a166-3a24088f5087\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0833},{\"id\":\"0bad51df-91ee-6eba-2d25-3a2408986e70\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardHistory.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.05},{\"id\":\"20934d75-88dd-5a98-7314-3a2408991d44\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardLabPhysical.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"7fb1d459-e85f-6a5b-2b17-3a24089a350e\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardAnamnesis.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"196f9b32-8294-f469-e553-3a24089a843e\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardResult.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"09c813af-f6ed-0bde-590f-3a24089ae48f\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardPeriodicExamination.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"12563d83-6c1a-5e01-3590-3a24089b59bb\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardPatientProtocol.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"7e0681de-3e80-120e-8039-3a24089bd0c7\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardSickLeave.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"57ed3514-62b1-3a13-7aa3-3a24089c6423\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCard.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"3f790c75-99c4-3d11-e2d7-3a24089c7ac0\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"8 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"95e09967-9627-2e6b-50ac-3a24089cb3e7\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167},{\"id\":\"d7e031b1-84a9-ccea-56f8-3a24089cde4a\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.DevRequests ekran\\u0131nda sat\\u0131r g\\u00FCncellendi (Status)\",\"duration\":0.0167}]", "SubTasks": "[{\"id\":\"40ca1e11-348e-6a1f-44da-3a24089c7aae\",\"title\":\"deploy_wizard: HealthCardHistory.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-01\",\"completed\":true},{\"id\":\"c531aead-5088-8d56-f0c0-3a24089c7aae\",\"title\":\"deploy_wizard: HealthCardLabPhysical.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-01\",\"completed\":true},{\"id\":\"0e8ffd2f-24e8-389a-69d1-3a24089c7aae\",\"title\":\"deploy_wizard: HealthCardAnamnesis.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-01\",\"completed\":true},{\"id\":\"f46a3065-6d16-6afa-9651-3a24089c7aae\",\"title\":\"deploy_wizard: HealthCardResult.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-01\",\"completed\":true},{\"id\":\"6d5926eb-db17-b024-ff88-3a24089c7aae\",\"title\":\"deploy_wizard: HealthCardPeriodicExamination.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-01\",\"completed\":true},{\"id\":\"bbf66052-8bc3-cbd3-e089-3a24089c7aae\",\"title\":\"deploy_wizard: HealthCardPatientProtocol.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-01\",\"completed\":true},{\"id\":\"db2f5469-4f39-16be-6954-3a24089c7aae\",\"title\":\"deploy_wizard: HealthCardSickLeave.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-01\",\"completed\":true},{\"id\":\"1fea5028-41a1-a95e-601e-3a24089c7aae\",\"title\":\"deploy_wizard: HealthCard.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-01\",\"completed\":true}]", "Analysis": "

Amaç

\n

İK / işyeri hekimliği ekibi, kullanıcı yönetimi yetkisi (AbpIdentity.Users.Update) olmadan çalışanların sağlık kartını İnsan Kaynakları menüsünden açıp güncelleyebilsin. Liste kullanıcı listesine benzer, yalnızca Detay butonu taşır; detay formu üstte çalışan bilgisi, altta User Detail › Health Card ile aynı yedi sekmeyi gösterir.

\n\n

Görsel analizi

\n

[image-1] — Sekmeli düzenleme formu (User Detail › Health Card'ın kopyası). Sekmeler: Family / Personal History (açık), Laboratory - Physical Examination, Anamnesis, Result, Periodic Examinations, Patient Protocol Book, Sick Leaves. Sağ altta Save.

\n
    \n
  • Family History grubu: Mother / Father / Sibling / Child — her satırda durum seçimi (selectbox) + not (textbox).
  • \n
  • Personal History grubu: Blood Type (selectbox, örnek değer \"B Rh+\"), Congenital / Chronic Disease (textbox), Immunization alt başlığı altında Tetanus, Hepatitis, Other (textbox).
  • \n
  • Görünen satır yok; demo veri adayı yok (veri mevcut kullanıcı kayıtlarıdır).
  • \n
\n\n

Çözüm yolu

\n

Wizard List + Form alt formları. Sağlık kartı alanlarının tamamı AbpUsers'ta, çok kayıtlı bölümler mevcut Adm_T_User* tablolarında durur; yeni tablo gerekmez. Ana liste AbpUsers üzerinde salt okunur bir ListForm'dur ve hazır Detay butonuyla form görünümünü (/admin/form/App.Hr.HealthCard/{Id}) açar; formun üst kısmı çalışan bilgisi (salt okunur), sekmeler SubForms'tur: ilk dört sekme AbpUsers üzerinde TabType: Form (Id → Id, 1:1), son üç sekme Adm_T_User* üzerinde TabType: List (Id → UserId). Custom component gerekmez; User Detail React sayfasına dokunulmaz.

\n\n

Menü yeri

\n

İnsan Kaynakları › Sağlık Kartı

\n\n\n\n\n
SeviyeKodAd (TR / EN)İkonDurum
KökApp.Hrİnsan Kaynakları / Human ResourcesFcConferenceCallVar
EkranApp.Hr.HealthCardSağlık Kartı / Health CardFcInspectionYeni
\n

ModuleId: Hr · izin grubu App.Hr · route /admin/list/App.Hr.HealthCard · MenuParentCode: App.Hr, MenuParentPath boş.

\n

Yetki: App.Hr › App.Hr.HealthCard (Yeni; izin grubu App.Hr Var). Alt formlar: App.Hr › App.Hr.HealthCard › App.Hr.HealthCard{History|LabPhysical|Anamnesis|Result|PeriodicExamination|PatientProtocol|SickLeave} (hepsi Yeni).

\n\n

Veri modeli

\n

Yeni tablo yok. Tanım tablosu: Hayır (yeni tablo açılmıyor).

\n

Ana ekran App.Hr.HealthCard — AbpUsers (var), SelectCommandType: 1, anahtar Id (Guid, KeyFieldDbSourceType: 9), IsTenant: true, IsBranch: false, DefaultFilter \"IsDeleted\" = 'false'. Salt okunur alanlar (grid + formun üst grubu): Name, Surname, IdentityNumber, BirthDate, Gender (Male/Female, App.StaticLookup.*), Email, PhoneNumber, DepartmentId (lookup Hr_T_Department), JobPositionId (lookup Hr_T_JobPosition), HireDate, SskNo, BloodType, IsActive. Başlıklar AbpIdentity.Users ekranındaki anahtarlar.

\n

Form sekmeleri — tablo AbpUsers, anahtar Id, alan adı/tip/boy kolonla aynı:

\n\n\n\n\n\n\n
EkranGruplar ve alanlar
App.Hr.HealthCardHistoryFamilyHistory: {Mother|Father|Sibling|Child}HealthStatus nvarchar(16) dxSelectBox (Alive / Disease / Deceased) + …HealthNote nvarchar(512) dxTextBox. PersonalHistory: BloodType nvarchar(16) dxSelectBox (0 Rh+, 0 Rh-, A Rh+, A Rh-, B Rh+, B Rh-, AB Rh+, AB Rh-; anahtar = görünen metin), ChronicDisease nvarchar(512), Immunization: TetanusVaccination, HepatitisVaccination nvarchar(256), OtherVaccination nvarchar(512).
App.Hr.HealthCardLabPhysicalLaboratoryFindings: LabBiologicalAnalysis, LabBlood, LabUrine, LabRadiological, LabRadiologicalPhysiological, LabAudiometry, LabPulmonaryFunction, LabPsychologicalTests, LabOther (nvarchar(256)). PhysicalExamResults: ExamSensoryOrgans, ExamEye, ExamEnt, ExamSkin, ExamCardiovascular, ExamRespiratory, ExamDigestive, ExamUrogenital, ExamMusculoskeletal, ExamNeurological, ExamPsychiatric, ExamOther (nvarchar(256)), ExamBloodPressure, ExamPulse (nvarchar(16)), ExamHeight, ExamWeight (decimal, dxNumberBox).
App.Hr.HealthCardAnamnesisComplaintsQuestion: 7 × Complaint* bit dxCheckBox. DiagnosesQuestion: 10 × Diagnosis* bit dxCheckBox. Anamnesis (3–10. sorular): Hospitalized, HadSurgery, HadWorkAccident, OccupationalDiseaseExam, DisabilityPension, UnderTreatment bit dxCheckBox + her birinin …Note nvarchar(512); Smoking, Alcohol nvarchar(16) dxSelectBox (None / Occasionally / Normal / Quit) + SmokingNote, AlcoholNote.
App.Hr.HealthCardResultFitForWorkJob nvarchar(256), FitForWorkCondition nvarchar(512), FitnessDoctorId Guid, ShiftWorkFit, NightWorkFit bit dxCheckBox, ShiftNightDoctorId Guid. Doktor lookup'ı: SELECT \"Id\" AS \"Key\", \"FullName\" AS \"Name\" FROM \"Hr_T_Doctor\" WHERE \"IsDeleted\" = 'false' AND \"IsActive\" = 'true' AND \"TenantId\" = '@TENANTID' ORDER BY \"FullName\".
\n

Alan başlıkları var olan Abp.Identity.User.HealthCard.{FieldName} anahtarlarıdır; grup başlıkları Abp.Identity.User.HealthCard.{FamilyHistory|PersonalHistory|Immunization|LaboratoryFindings|PhysicalExamResults|ComplaintsQuestion|DiagnosesQuestion|Anamnesis}. Durum seçeneklerinin başlıkları var olan App.StaticLookup.{Alive|Disease|Deceased|None|Occasionally|Normal|Quit} anahtarları.

\n

Liste sekmeleri — var olan tablolar, alanlar kolonla aynı:

\n\n\n\n\n\n
EkranTabloAlanlar
App.Hr.HealthCardPeriodicExaminationAdm_T_UserPeriodicExaminationExamDate (zorunlu), Examination nvarchar(256) zorunlu, Result nvarchar(512), DoctorId (Hr_T_Doctor), DoctorDiplomaNo nvarchar(50) salt okunur; UserId gizli, ilişki kolonu.
App.Hr.HealthCardPatientProtocolAdm_T_UserPatientProtocolSequenceNo int, ProtocolDate zorunlu, ProtocolType nvarchar(32) zorunlu (Disease / WorkAccident / OccupationalDisease / Control / Other), ProtocolResult nvarchar(32) (TreatmentDischarged / Rest / Referral), RestDays int, ReferralPlace nvarchar(256), DoctorId; UserId gizli.
App.Hr.HealthCardSickLeaveAdm_T_UserSickLeaveStartDate, EndDate zorunlu, Days int zorunlu, SickLeaveType nvarchar(32) zorunlu (Disease / WorkAccident / OccupationalDisease / Maternity), Institution, Clinic nvarchar(256), SickLeaveReason nvarchar(512); UserId gizli.
\n

Üç tabloda kiracı + audit + soft delete kolonları var (TenantId, Creation*, LastModification*, IsDeleted, Deleter*); silme soft delete.

\n\n

Alt form ağacı

\n\n\n\n\n\n\n\n\n\n
SekmeHedef ListFormCodeTabTypeMenüİlişkiEkle / Düzenle / SilYetki yolu
Family / Personal HistoryApp.Hr.HealthCardHistoryFormMenüsüzId → Id✓ / ✓ / –App.Hr › App.Hr.HealthCard › App.Hr.HealthCardHistory
Laboratory - Physical ExaminationApp.Hr.HealthCardLabPhysicalFormMenüsüzId → Id✓ / ✓ / –… › App.Hr.HealthCard › App.Hr.HealthCardLabPhysical
AnamnesisApp.Hr.HealthCardAnamnesisFormMenüsüzId → Id✓ / ✓ / –… › App.Hr.HealthCard › App.Hr.HealthCardAnamnesis
ResultApp.Hr.HealthCardResultFormMenüsüzId → Id✓ / ✓ / –… › App.Hr.HealthCard › App.Hr.HealthCardResult
Periodic ExaminationsApp.Hr.HealthCardPeriodicExaminationListMenüsüzId → UserId✓ / ✓ / ✓… › App.Hr.HealthCard › App.Hr.HealthCardPeriodicExamination
Patient Protocol BookApp.Hr.HealthCardPatientProtocolListMenüsüzId → UserId✓ / ✓ / ✓… › App.Hr.HealthCard › App.Hr.HealthCardPatientProtocol
Sick LeavesApp.Hr.HealthCardSickLeaveListMenüsüzId → UserId✓ / ✓ / ✓… › App.Hr.HealthCard › App.Hr.HealthCardSickLeave
\n

Sekme başlıkları var olan anahtarlar: Abp.Identity.User.HealthCard.{History|LabPhysical|Anamnesis|Result}, App.IdentityManagement.{UserPeriodicExamination|UserPatientProtocol|UserSickLeave}. IsRefresh: true, DbType: 11 (Guid). Alt formlarda widget yok; tek gruplu formlarda (Result ve liste sekmeleri) grup başlığı yazılmaz.

\n\n

Etkilenen kısımlar

\n
    \n
  • Yeni ekranlar: App.Hr.HealthCard (menülü) + 7 menüsüz alt form.
  • \n
  • Menü: App.Hr altına App.Hr.HealthCard.
  • \n
  • Yetkiler: App.Hr.HealthCard (R) + .Create/.Update/.Delete/.Export/.Import; her alt form için aynı küme, ana ekranın altında.
  • \n
  • Dil anahtarları (yeni): App.Hr.HealthCard, App.Hr.HealthCard.Title, App.Hr.HealthCard.Desc ve 7 alt form kodu/başlığı. Alan, grup, sekme ve lookup başlıkları var olan anahtarlardan.
  • \n
  • Var olan ekranlar: değişmez. User Detail › Health Card ve App.IdentityManagement.User* listeleri aynı veriyi okumaya/yazmaya devam eder; iki ekrandaki değişiklik birbirinde görünür.
  • \n
\n\n

Görünümler ve davranış

\n
    \n
  • Ana ekran: Grid / Card / Pivot / Chart açık, varsayılan grid. EditingOptionDto: AllowDetail: true, AllowAdding / AllowUpdating / AllowDeleting: false — satırda yalnızca hazır Detay butonu. SelectionDto.Mode: none, CommandColumnDto: [].
  • \n
  • Ana ekran widget'ı (tek kayıt, 3 kart, ColSpan: 4): App.Widget.Total (blue, FaUsers), App.Widget.Active (\"IsActive\" = 'true', green, FaCheckCircle), App.Widget.Passive (\"IsActive\" = 'false', gray, FaTimesCircle); FROM \"AbpUsers\" WHERE \"TenantId\" = '@TENANTID', SubTitle = App.Hr.HealthCard.
  • \n
  • Form sekmeleri: UpdateServiceAddress: list-form-data/update; UpdateFieldsDefaultValue = LastModificationTime @NOW, LastModifierId @USERID. Komutu ekranın alanlarını yazar, kullanıcı kaydının diğer kolonlarına dokunmaz.
  • \n
  • Family History grubu ColCount: 2 (durum + not yan yana); diğer gruplar ColCount: 2, not/metin alanları ColSpan: 2. Anamnez notları ilgili soru işaretli değilse EditorScript ile salt okunur (Hospitalized → HospitalizedNote, …; Smoking/Alcohol = None → not salt okunur).
  • \n
  • Sick Leaves: EditorScript — StartDate / EndDate değişince Days = (EndDate − StartDate) + 1, alan elle değiştirilebilir; EndDate >= StartDate doğrulaması.
  • \n
  • Periodic Examinations: DoctorId seçilince DoctorDiplomaNo seçilen hekimin DiplomaNo'su ile doldurulur (lookup ek kolonu + EditorScript); ExamDate açılışta bugün.
  • \n
  • Patient Protocol Book: ProtocolDate açılışta bugün; RestDays yalnızca ProtocolResult = Rest, ReferralPlace yalnızca Referral iken düzenlenebilir.
  • \n
  • Liste sekmelerinde DeleteCommand soft delete (IsDeleted = 'true', DeleterId, DeletionTime).
  • \n
\n\n

Kararlar

\n
    \n
  • Yazma hedefi (onay): ilk dört sekme doğrudan AbpUsers'ın sağlık kolonlarını günceller (list-form-data/update); kullanıcı servisi (user-update) kullanılmaz, çünkü parola/rol akışı bu ekranın işi değildir ve yalnızca sağlık kolonları yazılır.
  • \n
  • Liste sekmeleri yeni menüsüz ekranlardır: var olan App.IdentityManagement.User* listelerinin yetkisi AbpIdentity.Users'tır; onları sekme yapmak İK kullanıcısına kullanıcı yönetimi yetkisi vermeyi gerektirirdi. Aynı tablolara App.Hr.HealthCard dalında yetkili yeni alt formlar açılır.
  • \n
  • Form sekmelerinde AllowAdding: true: standart gereği; ilişki Id → Id ve kullanıcı kaydı her zaman var olduğundan \"Yeni\" düğmesi hiç görünmez, ikinci kayıt açılmaz.
  • \n
  • Üst bilgi salt okunur: çalışan bilgisi Kullanıcılar ekranında yönetilir; burada yalnızca gösterilir.
  • \n
  • Avatar gösterilmez: kolon nvarchar(512) URL'dir, görsel alanı sözleşmesi (dxImageUpload, base64 nvarchar(MAX)) ile uyuşmaz; platform tablosunda kolon değişikliği çerçeve dışıdır.
  • \n
  • Vücut Kitle İndeksi ve hekim diploma/İSG belge bilgisi (onay): User Detail'de ekranda hesaplanan/türetilen değerlerdir, tabloda kolonu yoktur; formda alan olarak açılmaz. Boy ve kilo girilir.
  • \n
  • Değer kümeleri (onay): aile sağlık durumu Alive / Disease / Deceased; sigara/alkol None / Occasionally / Normal / Quit; protokol ve istirahat tipleri tablo açıklamalarındaki kümeler. Anahtarlar var olan App.StaticLookup.*, User Detail ile aynı değerler yazılır.
  • \n
  • Kullanıcı kapsamı: kiracının tüm kullanıcıları (aktif + pasif) listelenir; pasif çalışanın geçmiş sağlık kaydı da erişilebilir kalır, ayrımı widget ve IsActive kolonu gösterir.
  • \n
  • Demo veri yok: kayıtlar mevcut kullanıcılardır.
  • \n
\n\n

Üretim planı

\n
    \n
  1. deploy_wizard: HealthCardHistory.json
  2. \n
  3. deploy_wizard: HealthCardLabPhysical.json
  4. \n
  5. deploy_wizard: HealthCardAnamnesis.json
  6. \n
  7. deploy_wizard: HealthCardResult.json
  8. \n
  9. deploy_wizard: HealthCardPeriodicExamination.json
  10. \n
  11. deploy_wizard: HealthCardPatientProtocol.json
  12. \n
  13. deploy_wizard: HealthCardSickLeave.json
  14. \n
  15. deploy_wizard: HealthCard.json
  16. \n
\n\n

Üretime hazır

\n

Evet

MCP

\n

Üretilenler (8 wizard, yeni tablo yok): HealthCardHistory, HealthCardLabPhysical, HealthCardAnamnesis, HealthCardResult (AbpUsers, menüsüz, Form sekmesi, Ekle/Düzenle açık, Sil kapalı) · HealthCardPeriodicExamination, HealthCardPatientProtocol, HealthCardSickLeave (Adm_T_User*, menüsüz, List sekmesi, Ekle/Düzenle/Sil açık, soft delete) · HealthCard (AbpUsers, menülü, yalnızca Detay butonu, 7 alt form sekmesi, Toplam/Aktif/Pasif widget'ı).

\n

Menü / yetki: İnsan Kaynakları › Sağlık Kartları (App.Hr.HealthCard, FcInspection, /admin/list/App.Hr.HealthCard). Alt form yetkileri App.Hr.HealthCard altına taşınır. Yetkiler hiçbir role otomatik atanmaz.

\n

Analizden sapma / varsayımlar:

\n
    \n
  • Kullanıcı isteğiyle menü ve ekran başlığı Health Cards / Sağlık Kartları yazıldı (analizde \"Health Card / Sağlık Kartı\").
  • \n
  • Form sekmelerindeki UpdateFieldsDefaultValue (LastModificationTime @NOW, LastModifierId @USERID) wizard cevabında karşılığı olmadığı için yazılamadı; UpdateServiceAddress varsayılan list-form-data/update. Gerekirse ListForm editöründen eklenmeli.
  • \n
  • Liste sekmelerinde UserId gizlenemedi (wizard'da Visible yok); formda yer almaz, gridde kullanıcı adını gösteren lookup ile çıkar. İstenirse ListForm editöründen gizlenebilir.
  • \n
  • Sick Leaves'te EndDate >= StartDate kuralı ValidationRule olarak yazılamadı; EndDate script'i uyarı (notify) verir.
  • \n
  • ExamDate / ProtocolDate \"bugün\" varsayılanı, yalnızca alan boşken açılışta çalışan script ile verildi.
  • \n
  • Ana ekranın üst bilgi alanları readOnly; JobPosition lookup'ı salt okunur gösterim için cascade'siz yazıldı.
  • \n
\n

DB Migrate bekleyen wizard'lar: HealthCardHistory, HealthCardLabPhysical, HealthCardAnamnesis, HealthCardResult, HealthCardPeriodicExamination, HealthCardPatientProtocol, HealthCardSickLeave, HealthCard. Demo veri yok.

" } diff --git a/configs/seeds/host/data/App.Menus.Menu.json b/configs/seeds/host/data/App.Menus.Menu.json index f440aa38..6a219f79 100644 --- a/configs/seeds/host/data/App.Menus.Menu.json +++ b/configs/seeds/host/data/App.Menus.Menu.json @@ -5,1181 +5,1608 @@ "Order": 3, "Rows": [ { - "ParentCode": null, + "Id": "cba0b789-1124-404a-98a9-4f02e57e027e", "Code": "App.Public.Header", "DisplayName": "App.Public.Header", - "Order": -3, + "Order": 1, "Url": null, "Icon": "FcGlobe", + "ParentCode": null, "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Pub" }, { - "ParentCode": "App.Public.Header", + "Id": "a7bbef7a-8ca8-4109-ad16-99fa4543ef6d", "Code": "App.Public.Header.Home", "DisplayName": "App.Home", - "Order": 10, + "Order": 1, "Url": "/home", "Icon": "FaHome", + "ParentCode": "App.Public.Header", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Pub" }, { - "ParentCode": "App.Public.Header", + "Id": "f1c34b71-a936-455b-af7f-ea37e01f06d3", "Code": "App.Public.Header.About", "DisplayName": "App.About", - "Order": 20, + "Order": 2, "Url": "/about", "Icon": "FaInfoCircle", + "ParentCode": "App.Public.Header", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Pub" }, { - "ParentCode": "App.Public.Header", + "Id": "96259cbf-d3c0-44f4-9946-455d59f45c25", "Code": "App.Public.Header.Products", "DisplayName": "App.Platform.Orders", - "Order": 40, + "Order": 3, "Url": "/products", "Icon": "FaBoxOpen", + "ParentCode": "App.Public.Header", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Pub" }, { - "ParentCode": "App.Public.Header", + "Id": "b7182553-0de9-4c1d-9335-29b507c80f46", "Code": "App.Public.Header.Blog", "DisplayName": "App.Platform.BlogManagement", - "Order": 50, + "Order": 4, "Url": "/blog", "Icon": "FaBookOpen", + "ParentCode": "App.Public.Header", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Pub" }, { - "ParentCode": "App.Public.Header", + "Id": "8cfa9c02-040c-4a14-bd61-ffb8d89fe596", "Code": "App.Public.Header.Contact", "DisplayName": "App.Contact", - "Order": 60, + "Order": 5, "Url": "/contact", "Icon": "FaPhoneAlt", + "ParentCode": "App.Public.Header", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Pub" }, { - "ParentCode": "App.Public.Header", + "Id": "e945e887-e2cb-4602-ba26-72cc46ff02f8", "Code": "App.Public.Header.Login", "DisplayName": "App.PublicNav.Giris", - "Order": 900, + "Order": 6, "Url": "/login", "Icon": null, - "CssClass": "cta", + "ParentCode": "App.Public.Header", "RequiredPermissionName": null, + "CssClass": "cta", + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Pub" }, { - "ParentCode": null, + "Id": "bd8920ca-f224-4410-941a-9f5af36f1db6", "Code": "App.Saas", "DisplayName": "App.Saas", - "Order": -2, + "Order": 2, "Url": null, "Icon": "FcPodiumWithAudience", + "ParentCode": null, "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "4d72b320-a954-42ed-ad81-123da485b027", "Code": "App.Saas.Definitions", "DisplayName": "App.Platform.Definitions", "Order": 1, "Url": null, "Icon": "FcFilingCabinet", + "ParentCode": "App.Saas", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas.Definitions", + "Id": "9863a99d-4538-4dbc-911b-5de1ad2b6520", "Code": "App.Definitions.AiBot", "DisplayName": "App.Definitions.AiBot", "Order": 1, "Url": "/admin/list/App.Definitions.AiBot", "Icon": "FcMindMap", + "ParentCode": "App.Saas.Definitions", "RequiredPermissionName": "App.Definitions.AiBot", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas.Definitions", + "Id": "3621b2f0-27b8-4dea-a26a-ad470e532e03", "Code": "App.Definitions.GlobalSearch", "DisplayName": "App.Definitions.GlobalSearch", "Order": 2, "Url": "/admin/list/App.Definitions.GlobalSearch", "Icon": "FcSearch", + "ParentCode": "App.Saas.Definitions", "RequiredPermissionName": "App.Definitions.GlobalSearch", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas.Definitions", + "Id": "1b21d495-cdb8-46d6-9dd6-177126710099", "Code": "App.Definitions.ContactTitle", "DisplayName": "App.Definitions.ContactTitle", "Order": 3, "Url": "/admin/list/App.Definitions.ContactTitle", "Icon": "FcNeutralDecision", + "ParentCode": "App.Saas.Definitions", "RequiredPermissionName": "App.Definitions.ContactTitle", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas.Definitions", + "Id": "f0223376-cc52-4077-a9af-b68bff0d7a30", "Code": "App.Definitions.Currency", "DisplayName": "App.Definitions.Currency", "Order": 4, "Url": "/admin/list/App.Definitions.Currency", "Icon": "FcCurrencyExchange", + "ParentCode": "App.Saas.Definitions", "RequiredPermissionName": "App.Definitions.Currency", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas.Definitions", + "Id": "9081315b-1c76-4cce-b219-ff7ef83b52b5", "Code": "App.Definitions.CountryGroup", "DisplayName": "App.Definitions.CountryGroup", "Order": 5, "Url": "/admin/list/App.Definitions.CountryGroup", "Icon": "FaFlag", + "ParentCode": "App.Saas.Definitions", "RequiredPermissionName": "App.Definitions.CountryGroup", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas.Definitions", + "Id": "f724785a-6b8e-434f-bdae-02ebd2da7f8f", "Code": "App.Definitions.Country", "DisplayName": "App.Definitions.Country", "Order": 6, "Url": "/admin/list/App.Definitions.Country", "Icon": "FaFlagCheckered", + "ParentCode": "App.Saas.Definitions", "RequiredPermissionName": "App.Definitions.Country", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas.Definitions", + "Id": "19511a04-e648-4a11-a4ce-360fcbb44971", "Code": "App.Definitions.City", "DisplayName": "App.Definitions.City", "Order": 7, "Url": "/admin/list/App.Definitions.City", "Icon": "FaFontAwesomeFlag", + "ParentCode": "App.Saas.Definitions", "RequiredPermissionName": "App.Definitions.City", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas.Definitions", + "Id": "d4aa5d6b-fbac-469c-994e-c8aba919993f", "Code": "App.Definitions.District", "DisplayName": "App.Definitions.District", "Order": 8, "Url": "/admin/list/App.Definitions.District", "Icon": "FaFontAwesome", + "ParentCode": "App.Saas.Definitions", "RequiredPermissionName": "App.Definitions.District", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "b7c6c711-5b7d-413d-8ae8-530b18a22c2a", "Code": "App.Public", "DisplayName": "App.Public", "Order": 2, "Url": null, "Icon": "FcTemplate", + "ParentCode": "App.Saas", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Public", + "Id": "2d7afd91-e7c9-48cf-b30c-6d83c3acadcb", "Code": "App.Orders.Products", "DisplayName": "App.Orders.Products", - "Order": 3, + "Order": 1, "Url": "/admin/list/App.Orders.Products", "Icon": "FcDiploma1", + "ParentCode": "App.Public", "RequiredPermissionName": "App.Orders.Products", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Public", + "Id": "c9d8f2a6-13dd-42a0-be84-a8d1b4089f76", "Code": "App.Orders.PaymentMethods", "DisplayName": "App.Orders.PaymentMethods", - "Order": 4, + "Order": 2, "Url": "/admin/list/App.Orders.PaymentMethods", "Icon": "FcFeedIn", + "ParentCode": "App.Public", "RequiredPermissionName": "App.Orders.PaymentMethods", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Public", + "Id": "746f65fa-4d6e-4c01-a546-fb368f69797c", "Code": "App.Orders.InstallmentOptions", "DisplayName": "App.Orders.InstallmentOptions", - "Order": 5, + "Order": 3, "Url": "/admin/list/App.Orders.InstallmentOptions", "Icon": "FcProcess", + "ParentCode": "App.Public", "RequiredPermissionName": "App.Orders.InstallmentOptions", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Public", + "Id": "db8b0827-0671-4969-8159-02b0f1a9c8cb", "Code": "App.Orders.SalesOrders", "DisplayName": "App.Orders.SalesOrders", - "Order": 6, + "Order": 4, "Url": "/admin/list/App.Orders.SalesOrders", "Icon": "FcCollect", + "ParentCode": "App.Public", "RequiredPermissionName": "App.Orders.SalesOrders", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Public", + "Id": "f6788acf-6522-4ca2-9cd5-0a6efb603577", "Code": "App.BlogManagement.Category", "DisplayName": "App.BlogManagement.Category", - "Order": 7, + "Order": 5, "Url": "/admin/list/App.BlogManagement.Category", "Icon": "FaCertificate", + "ParentCode": "App.Public", "RequiredPermissionName": "App.BlogManagement.Category", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Public", + "Id": "54d2bf76-be96-4986-b31f-3bad5e46dc5c", "Code": "App.BlogManagement.Posts", "DisplayName": "App.BlogManagement.Posts", - "Order": 8, + "Order": 6, "Url": "/admin/list/App.BlogManagement.Posts", "Icon": "FaWeixin", + "ParentCode": "App.Public", "RequiredPermissionName": "App.BlogManagement.Posts", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Public", + "Id": "60f06464-5b13-4959-b621-1b0aeae3102d", "Code": "App.Demos", "DisplayName": "App.Demos", - "Order": 9, + "Order": 7, "Url": "/admin/list/App.Demos", "Icon": "FcMissedCall", + "ParentCode": "App.Public", "RequiredPermissionName": "App.Demos", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "6f77c3ac-1f0a-4f22-8ef2-b5aa4a01614a", "Code": "App.DevRequests", "DisplayName": "App.DevRequests", "Order": 3, "Url": "/admin/list/App.DevRequests", "Icon": "FcIdea", + "ParentCode": "App.Saas", "RequiredPermissionName": "App.DevRequests", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "d55dca3e-a14f-4b59-8541-d2a5691e4276", "Code": "AbpTenantManagement.Tenants", "DisplayName": "AbpTenantManagement.Tenants", "Order": 4, "Url": "/admin/list/AbpTenantManagement.Tenants", "Icon": "FcDepartment", + "ParentCode": "App.Saas", "RequiredPermissionName": "AbpTenantManagement.Tenants", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "16d8ca66-d74a-4b86-aabd-8ade147de92f", "Code": "App.Branches", "DisplayName": "App.Branches", "Order": 5, "Url": "/admin/list/App.Branches", "Icon": "FcTreeStructure", + "ParentCode": "App.Saas", "RequiredPermissionName": "App.Branches", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "661ab09d-78f0-4e82-ab17-a1eefe73c4bb", "Code": "App.SettingDefinitions", "DisplayName": "App.SettingDefinitions", "Order": 6, "Url": "/admin/list/App.SettingDefinitions", "Icon": "FcSupport", + "ParentCode": "App.Saas", "RequiredPermissionName": "App.SettingDefinitions", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "da20a94c-e468-45fe-b91b-b5690d3370a2", "Code": "App.Languages", "DisplayName": "App.Languages", "Order": 7, "Url": null, "Icon": "FcGlobe", + "ParentCode": "App.Saas", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Languages", + "Id": "34a69676-bbf7-406f-b5f1-68eb6127c438", "Code": "App.Languages.Language", "DisplayName": "App.Languages.Language", "Order": 1, "Url": "/admin/list/App.Languages.Language", "Icon": "FcGraduationCap", + "ParentCode": "App.Languages", "RequiredPermissionName": "App.Languages.Language", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Languages", + "Id": "48ce00a2-f5cf-4202-b95b-af8a83162168", "Code": "App.Languages.LanguageText", "DisplayName": "App.Languages.LanguageText", "Order": 2, "Url": "/admin/list/App.Languages.LanguageText", "Icon": "FcMindMap", + "ParentCode": "App.Languages", "RequiredPermissionName": "App.Languages.LanguageText", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "9328cf64-1c67-4d25-94a1-d9d7d3bb0da0", "Code": "App.DataSource", "DisplayName": "App.DataSource", "Order": 8, "Url": "/admin/list/App.DataSource", "Icon": "FcAcceptDatabase", + "ParentCode": "App.Saas", "RequiredPermissionName": "App.DataSource", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "405588d2-3185-4ee1-884a-57d4758d5eba", "Code": "App.BackgroundWorkers", "DisplayName": "App.BackgroundWorkers", "Order": 9, "Url": null, "Icon": "FcSynchronize", + "ParentCode": "App.Saas", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.BackgroundWorkers", + "Id": "fa9de54f-79af-4938-bb44-2960ad9b276b", "Code": "App.BackgroundWorkers.RecurringJobs", "DisplayName": "App.BackgroundWorkers.RecurringJobs", "Order": 1, "Url": "/admin/list/App.BackgroundWorkers.RecurringJobs", "Icon": "FcDataConfiguration", + "ParentCode": "App.BackgroundWorkers", "RequiredPermissionName": "App.BackgroundWorkers.RecurringJobs", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.BackgroundWorkers", + "Id": "be641b10-d587-4c23-b151-a92c452612a3", "Code": "App.BackgroundWorkers.Jobs", "DisplayName": "App.BackgroundWorkers.Jobs", "Order": 2, "Url": "/admin/list/App.BackgroundWorkers.Jobs", "Icon": "FcFlowChart", + "ParentCode": "App.BackgroundWorkers", "RequiredPermissionName": "App.BackgroundWorkers.Jobs", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "ac77496b-c2a8-44f4-927c-7b56faae8453", "Code": "App.Menus", "DisplayName": "App.Menus", "Order": 10, "Url": null, "Icon": "FcParallelTasks", + "ParentCode": "App.Saas", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Menus", + "Id": "49faddb1-274f-40a7-bfa1-403d97c7925e", "Code": "App.Menus.Module", "DisplayName": "App.Menus.Module", "Order": 1, "Url": "/admin/list/App.Menus.Module", "Icon": "FcGrid", + "ParentCode": "App.Menus", "RequiredPermissionName": "App.Menus.Module", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Menus", + "Id": "8b3fd17d-beba-4bec-ba6a-a3df93f3f5f7", "Code": "App.Menus.Routes", "DisplayName": "App.Menus.Routes", "Order": 2, "Url": "/admin/list/App.Menus.Routes", "Icon": "FcMultipleInputs", + "ParentCode": "App.Menus", "RequiredPermissionName": "App.Menus.Routes", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Menus", + "Id": "00d732b9-032b-4525-bab2-1663edfd56b2", "Code": "App.Menus.Menu", "DisplayName": "App.Menus.Menu", "Order": 3, "Url": "/admin/list/App.Menus.Menu", "Icon": "FcMenu", + "ParentCode": "App.Menus", "RequiredPermissionName": "App.Menus.Menu", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Menus", + "Id": "07488e92-3067-459a-ae58-37a959912784", "Code": "App.Menus.Manager", "DisplayName": "App.Menus.Manager", "Order": 4, "Url": "/admin/menuManager", "Icon": "FaRegListAlt", + "ParentCode": "App.Menus", "RequiredPermissionName": "App.Menus.Manager", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "e141c2ae-3364-4022-bf76-c745266c86ff", "Code": "App.DeveloperKit", "DisplayName": "App.DeveloperKit", "Order": 11, "Url": null, "Icon": "FcAndroidOs", + "ParentCode": "App.Saas", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.DeveloperKit", + "Id": "88ed3fe6-7937-45d1-aad7-a9d8c2150e1e", "Code": "App.SqlQueryManager", "DisplayName": "App.SqlQueryManager", "Order": 1, "Url": "/admin/sqlQueryManager", "Icon": "FaDatabase", + "ParentCode": "App.DeveloperKit", "RequiredPermissionName": "App.SqlQueryManager", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.DeveloperKit", + "Id": "0375ca77-8dfc-46ea-aadf-6989d0749e02", "Code": "App.Files", "DisplayName": "App.Files", "Order": 2, "Url": "/admin/files", "Icon": "FcFolder", + "ParentCode": "App.DeveloperKit", "RequiredPermissionName": "App.Files", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.DeveloperKit", + "Id": "df0592bf-469c-4ee1-a981-846c277c092f", "Code": "App.DeveloperKit.CustomEndpoints", "DisplayName": "App.DeveloperKit.CustomEndpoints", "Order": 3, "Url": "/admin/list/App.DeveloperKit.CustomEndpoints", "Icon": "FcMindMap", + "ParentCode": "App.DeveloperKit", "RequiredPermissionName": "App.DeveloperKit.CustomEndpoints", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.DeveloperKit", + "Id": "b75af2e9-4a36-4973-bde7-c30c76bd4551", "Code": "App.DeveloperKit.DynamicServices", "DisplayName": "App.DeveloperKit.DynamicServices", "Order": 4, "Url": "/admin/list/App.DeveloperKit.DynamicServices", "Icon": "FcCommandLine", + "ParentCode": "App.DeveloperKit", "RequiredPermissionName": "App.DeveloperKit.DynamicServices", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.DeveloperKit", + "Id": "322dbb78-c53b-433b-b387-1faf9f3960c6", "Code": "App.DeveloperKit.CustomComponents", "DisplayName": "App.DeveloperKit.CustomComponents", "Order": 5, "Url": "/admin/list/App.DeveloperKit.CustomComponents", "Icon": "FcBiohazard", + "ParentCode": "App.DeveloperKit", "RequiredPermissionName": "App.DeveloperKit.CustomComponents", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.DeveloperKit", + "Id": "16a859ee-bd46-4db0-a48b-e2923c520c69", "Code": "App.Listforms.Listform", "DisplayName": "App.Listforms.Listform", "Order": 6, "Url": "/admin/list/App.Listforms.Listform", "Icon": "FcDataSheet", + "ParentCode": "App.DeveloperKit", "RequiredPermissionName": "App.Listforms.Listform", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.DeveloperKit", + "Id": "0ef9ffe5-a083-46f1-aa0b-c4c0b61f09bc", "Code": "App.DeveloperKit.IntranetWidgets", "DisplayName": "App.DeveloperKit.IntranetWidgets", "Order": 7, "Url": "/admin/list/App.DeveloperKit.IntranetWidgets", "Icon": "FcAdvertising", + "ParentCode": "App.DeveloperKit", "RequiredPermissionName": "App.DeveloperKit.IntranetWidgets", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.DeveloperKit", + "Id": "b6474d04-4787-4476-989e-1833ba85ceff", "Code": "App.DeveloperKit.McpServers", "DisplayName": "App.DeveloperKit.McpServers", "Order": 8, "Url": "/admin/list/App.DeveloperKit.McpServers", "Icon": "FcElectroDevices", + "ParentCode": "App.DeveloperKit", "RequiredPermissionName": "App.DeveloperKit.McpServers", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.DeveloperKit", + "Id": "10672210-74c4-4ae5-95ce-0f20e2e93fcd", "Code": "App.Listforms.WizardManager", "DisplayName": "App.Listforms.WizardManager", "Order": 9, "Url": "/admin/listform/wizardManager", "Icon": "FcFlashAuto", + "ParentCode": "App.DeveloperKit", "RequiredPermissionName": "App.Listforms.Wizard", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.Saas", + "Id": "5a3637ab-11fd-4048-bed4-828cd35c91c4", "Code": "App.ForumManagement", "DisplayName": "App.ForumManagement", "Order": 12, "Url": null, "Icon": "FcReading", + "ParentCode": "App.Saas", "RequiredPermissionName": "App.ForumManagement", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.ForumManagement", + "Id": "631067db-3681-4880-9831-8c2c3a3f42c1", "Code": "App.ForumManagement.Categories", "DisplayName": "App.ForumManagement.Categories", "Order": 1, "Url": "/admin/list/App.ForumManagement.Categories", "Icon": "FcFolder", + "ParentCode": "App.ForumManagement", "RequiredPermissionName": "App.ForumManagement.Categories", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.ForumManagement", + "Id": "237e1c54-2e6d-4c30-a628-daa63359a062", "Code": "App.ForumManagement.Topics", "DisplayName": "App.ForumManagement.Topics", "Order": 2, "Url": "/admin/list/App.ForumManagement.Topics", "Icon": "FcRules", + "ParentCode": "App.ForumManagement", "RequiredPermissionName": "App.ForumManagement.Topics", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": "App.ForumManagement", + "Id": "40af01a8-c545-4edc-b941-7f1c16797f7c", "Code": "App.ForumManagement.Posts", "DisplayName": "App.ForumManagement.Posts", "Order": 3, "Url": "/admin/list/App.ForumManagement.Posts", "Icon": "FcFeedback", + "ParentCode": "App.ForumManagement", "RequiredPermissionName": "App.ForumManagement.Posts", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Sas" }, { - "ParentCode": null, + "Id": "27a780f6-59b3-48a2-b26e-db9eda0abe07", "Code": "App.Administration", "DisplayName": "App.Administration", - "Order": -1, + "Order": 3, "Url": null, "Icon": "FcOrganization", + "ParentCode": null, "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "b741695a-2c6e-4f24-960c-8db9e50b7d76", "Code": "App.Administration.Definitions", "DisplayName": "App.Platform.Definitions", "Order": 1, "Url": null, "Icon": "FcFilingCabinet", + "ParentCode": "App.Administration", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Definitions", + "Id": "5159e0f1-7fa7-41e5-a603-6586d8214b79", "Code": "App.Definitions.Sector", "DisplayName": "App.Definitions.Sector", "Order": 1, "Url": "/admin/list/App.Definitions.Sector", "Icon": "FcBiomass", + "ParentCode": "App.Administration.Definitions", "RequiredPermissionName": "App.Definitions.Sector", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Definitions", + "Id": "8364e99b-07f9-4746-b77d-23e0bac86723", "Code": "App.Definitions.Sequence", "DisplayName": "App.Definitions.Sequence", "Order": 2, "Url": "/admin/list/App.Definitions.Sequence", "Icon": "FcNumericalSorting12", + "ParentCode": "App.Administration.Definitions", "RequiredPermissionName": "App.Definitions.Sequence", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Definitions", + "Id": "f8a9e9ea-1977-4976-b7e5-ab20e1519184", "Code": "App.Definitions.UomCategory", "DisplayName": "App.Definitions.UomCategory", "Order": 3, "Url": "/admin/list/App.Definitions.UomCategory", "Icon": "FcWorkflow", + "ParentCode": "App.Administration.Definitions", "RequiredPermissionName": "App.Definitions.UomCategory", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "f7ea5d7f-09d8-457d-9656-2aa6922b2cda", "Code": "App.Licence", "DisplayName": "App.Licence", "Order": 2, "Url": "/admin/form/App.Licence", "Icon": "FcRules", + "ParentCode": "App.Administration", "RequiredPermissionName": "App.Licence", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "e205f8e9-f103-4eac-b8e3-f26eb182e1ba", "Code": "App.DevRequest", "DisplayName": "App.DevRequest", "Order": 3, "Url": "/admin/list/App.DevRequest", "Icon": "FcIdea", + "ParentCode": "App.Administration", "RequiredPermissionName": "App.DevRequest", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "5a3fc416-bd75-4e8c-ab25-0f60733a9e5a", "Code": "App.Administration.Notifications", "DisplayName": "App.Administration.Notifications", "Order": 4, "Url": null, "Icon": "FcWorkflow", + "ParentCode": "App.Administration", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Notifications", + "Id": "4111bddd-d6f3-4edf-b559-b4756a053334", "Code": "App.Notifications.NotificationTemplates", "DisplayName": "App.Notifications.NotificationTemplates", "Order": 1, "Url": "/admin/list/App.Notifications.NotificationTemplates", "Icon": "FcDocument", + "ParentCode": "App.Administration.Notifications", "RequiredPermissionName": "App.Notifications.NotificationTemplates", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Notifications", + "Id": "bb8b7a8f-8a3a-4f99-bb52-d1bdf9a240c4", "Code": "App.Notifications.NotificationTypes", "DisplayName": "App.Notifications.NotificationTypes", "Order": 2, "Url": "/admin/list/App.Notifications.NotificationTypes", "Icon": "FcComboChart", + "ParentCode": "App.Administration.Notifications", "RequiredPermissionName": "App.Notifications.NotificationTypes", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Notifications", + "Id": "3fb0789e-7b93-4820-9a33-108e77a62212", "Code": "App.Notifications.NotificationRules", "DisplayName": "App.Notifications.NotificationRules", "Order": 3, "Url": "/admin/list/App.Notifications.NotificationRules", "Icon": "FcLibrary", + "ParentCode": "App.Administration.Notifications", "RequiredPermissionName": "App.Notifications.NotificationRules", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Notifications", + "Id": "8c74780f-db02-4de5-8db1-d9931613ed92", "Code": "App.Notifications.Notification", "DisplayName": "App.Notifications.Notification", "Order": 4, "Url": "/admin/list/App.Notifications.Notification", "Icon": "FcSms", + "ParentCode": "App.Administration.Notifications", "RequiredPermissionName": "App.Notifications.Notification", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "c7bfc3ee-7e96-48e2-bbbd-4a24ad1b1ba7", "Code": "App.Agenda", "DisplayName": "App.Agenda", "Order": 5, "Url": "/admin/list/App.Agenda", "Icon": "FcPlanner", + "ParentCode": "App.Administration", "RequiredPermissionName": "App.Agenda", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "c97947c6-07ef-4173-9a8b-335758035f75", "Code": "App.Setting", "DisplayName": "App.Setting", "Order": 6, "Url": "/admin/settings", "Icon": "FcSettings", + "ParentCode": "App.Administration", "RequiredPermissionName": "App.Setting", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "aaef98c6-ab15-4097-9d32-d611db7de57d", "Code": "App.Administration.Intranet", "DisplayName": "App.Intranet", "Order": 7, "Url": null, "Icon": "FcConferenceCall", + "ParentCode": "App.Administration", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Intranet", + "Id": "5cef6234-ae2d-4963-b7aa-84f58c5d1e8a", "Code": "App.Intranet.Announcement", "DisplayName": "App.Intranet.Announcement", "Order": 1, "Url": "/admin/list/App.Intranet.Announcement", "Icon": "FcAdvertising", + "ParentCode": "App.Administration.Intranet", "RequiredPermissionName": "App.Intranet.Announcement", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Intranet", + "Id": "8eea0d26-4da7-4def-8228-bd340b518b29", "Code": "App.Intranet.Survey", "DisplayName": "App.Intranet.Survey", "Order": 2, "Url": "/admin/list/App.Intranet.Survey", "Icon": "FcTodoList", + "ParentCode": "App.Administration.Intranet", "RequiredPermissionName": "App.Intranet.Survey", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Intranet", + "Id": "216da72b-e243-4f07-afaa-04a7b79dc977", "Code": "App.Intranet.SocialPost", "DisplayName": "App.Intranet.SocialPost", "Order": 3, "Url": "/admin/list/App.Intranet.SocialPost", "Icon": "FcComments", + "ParentCode": "App.Administration.Intranet", "RequiredPermissionName": "App.Intranet.SocialPost", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Intranet", + "Id": "01246207-7a2e-43cc-82b1-3a475b242926", "Code": "App.Intranet.Events.EventType", "DisplayName": "App.Intranet.Events.EventType", "Order": 4, "Url": "/admin/list/App.Intranet.Events.EventType", "Icon": "FcPlanner", + "ParentCode": "App.Administration.Intranet", "RequiredPermissionName": "App.Intranet.Events.EventType", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Intranet", + "Id": "319118e2-1a91-44e2-8f4d-45b7327d4975", "Code": "App.Intranet.Events.EventCategory", "DisplayName": "App.Intranet.Events.EventCategory", "Order": 5, "Url": "/admin/list/App.Intranet.Events.EventCategory", "Icon": "FcTreeStructure", + "ParentCode": "App.Administration.Intranet", "RequiredPermissionName": "App.Intranet.Events.EventCategory", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Intranet", + "Id": "7efe2b4b-407d-4bb8-9350-fa89b759111b", "Code": "App.Intranet.Events.Event", "DisplayName": "App.Intranet.Events.Event", "Order": 6, "Url": "/admin/list/App.Intranet.Events.Event", "Icon": "FcCalendar", + "ParentCode": "App.Administration.Intranet", "RequiredPermissionName": "App.Intranet.Events.Event", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Intranet", + "Id": "9ef2a858-1465-407c-9636-c8802a5119d4", "Code": "App.Intranet.Document", "DisplayName": "App.Intranet.Document", "Order": 7, "Url": "/admin/intranet-documents", "Icon": "FcOpenedFolder", + "ParentCode": "App.Administration.Intranet", "RequiredPermissionName": "App.Intranet.Document", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "e599782a-f3bd-4f9e-9750-d23c55460876", "Code": "App.Administration.Restrictions", "DisplayName": "App.Platform.Restrictions", "Order": 8, "Url": null, "Icon": "FaLock", + "ParentCode": "App.Administration", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Restrictions", + "Id": "ca2b4ac8-663e-44af-9350-9cdad07ca462", "Code": "App.Restrictions.WorkHour", "DisplayName": "App.Restrictions.WorkHour", "Order": 1, "Url": "/admin/list/App.Restrictions.WorkHour", "Icon": "FcClock", + "ParentCode": "App.Administration.Restrictions", "RequiredPermissionName": "App.Restrictions.WorkHour", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration.Restrictions", + "Id": "3257cc14-2972-42c6-b5af-8ddf25758a0f", "Code": "App.Restrictions.IpRestrictions", "DisplayName": "App.Restrictions.IpRestrictions", "Order": 2, "Url": "/admin/list/App.Restrictions.IpRestrictions", "Icon": "FcNfcSign", + "ParentCode": "App.Administration.Restrictions", "RequiredPermissionName": "App.Restrictions.IpRestrictions", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "92c4e9c7-7272-4cf5-934f-9b6c37172942", "Code": "Abp.Identity", "DisplayName": "Abp.Identity", "Order": 9, "Url": null, "Icon": "FcConferenceCall", + "ParentCode": "App.Administration", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "Abp.Identity", + "Id": "c4b9c3c1-35f3-46d0-b646-f14b92864a66", "Code": "Abp.Identity.PermissionGroups", "DisplayName": "Abp.Identity.PermissionGroups", "Order": 1, "Url": "/admin/list/Abp.Identity.PermissionGroups", "Icon": "FcEngineering", + "ParentCode": "Abp.Identity", "RequiredPermissionName": "Abp.Identity.PermissionGroups", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "Abp.Identity", + "Id": "7fde942b-71f9-4945-8650-dec04147faaa", "Code": "Abp.Identity.Permissions", "DisplayName": "Abp.Identity.Permissions", "Order": 2, "Url": "/admin/list/Abp.Identity.Permissions", "Icon": "FcSupport", + "ParentCode": "Abp.Identity", "RequiredPermissionName": "Abp.Identity.Permissions", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "Abp.Identity", + "Id": "a911ad33-21b2-43c4-b4c1-6649e8f0472b", "Code": "App.IdentityManagement.ClaimType", "DisplayName": "App.IdentityManagement.ClaimType", "Order": 3, "Url": "/admin/list/App.IdentityManagement.ClaimType", "Icon": "FcOrganization", + "ParentCode": "Abp.Identity", "RequiredPermissionName": "App.IdentityManagement.ClaimType", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "Abp.Identity", + "Id": "ffe393a0-cc0e-4733-ba72-758bc3833bf3", "Code": "AbpIdentity.Roles", "DisplayName": "AbpIdentity.Roles", "Order": 4, "Url": "/admin/list/AbpIdentity.Roles", "Icon": "FcFlowChart", + "ParentCode": "Abp.Identity", "RequiredPermissionName": "AbpIdentity.Roles", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "Abp.Identity", + "Id": "3b7aaefc-b214-455c-9542-67fb56d4c75f", "Code": "AbpIdentity.Users", "DisplayName": "AbpIdentity.Users", "Order": 5, "Url": "/admin/list/AbpIdentity.Users", "Icon": "FcBusinessman", + "ParentCode": "Abp.Identity", "RequiredPermissionName": "AbpIdentity.Users", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "Abp.Identity", + "Id": "32d91d95-43a5-45fc-8440-ba3d213a7fcd", "Code": "Abp.Identity.OrganizationUnits", "DisplayName": "Abp.Identity.OrganizationUnits", "Order": 6, "Url": "/admin/ous", "Icon": "FcOrganization", + "ParentCode": "Abp.Identity", "RequiredPermissionName": "Abp.Identity.OrganizationUnits", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "Abp.Identity", + "Id": "c780ce1f-38f9-471a-a931-4cc22e03acfa", "Code": "App.IdentityManagement.AuditLogs", "DisplayName": "App.IdentityManagement.AuditLogs", "Order": 7, "Url": "/admin/list/App.IdentityManagement.AuditLogs", "Icon": "FcMultipleInputs", + "ParentCode": "Abp.Identity", "RequiredPermissionName": "App.IdentityManagement.AuditLogs", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "Abp.Identity", + "Id": "4726bea6-c9e8-4522-90f8-1294c1bb52ea", "Code": "App.IdentityManagement.Sessions", "DisplayName": "App.IdentityManagement.Sessions", "Order": 8, "Url": "/admin/list/App.IdentityManagement.Sessions", "Icon": "FcPrivacy", + "ParentCode": "Abp.Identity", "RequiredPermissionName": "App.IdentityManagement.Sessions", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "d4e11975-a4d9-4444-b742-e7eb651386fb", "Code": "App.Reports.Management", "DisplayName": "App.Reports.Management", "Order": 10, "Url": null, "Icon": "FcDocument", + "ParentCode": "App.Administration", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Reports.Management", + "Id": "feff6976-3358-46c2-a500-6d8d722e5667", "Code": "App.Reports.Categories", "DisplayName": "App.Reports.Categories", "Order": 1, "Url": "/admin/list/App.Reports.Categories", "Icon": "FcProcess", + "ParentCode": "App.Reports.Management", "RequiredPermissionName": "App.Reports.Categories", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Reports.Management", + "Id": "c4d5556b-79ea-4e87-95f6-8e928f74d226", "Code": "App.Reports.ReportTemplates", "DisplayName": "App.Reports.ReportTemplates", "Order": 2, "Url": "/admin/list/App.Reports.ReportTemplates", "Icon": "FcSimCardChip", + "ParentCode": "App.Reports.Management", "RequiredPermissionName": "App.Reports.ReportTemplates", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "2df27f03-9f1e-455c-9c0d-05ffccfe9312", "Code": "App.Videoroom", "DisplayName": "App.Videoroom", "Order": 11, "Url": "/admin/videoroom/dashboard", "Icon": "FcVideoCall", + "ParentCode": "App.Administration", "RequiredPermissionName": "App.Videoroom", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": "App.Administration", + "Id": "5e5180bf-5b4d-4f3d-9a42-795942600bbf", "Code": "App.Forum", "DisplayName": "App.Forum", "Order": 12, "Url": "/admin/forum", "Icon": "FcLink", + "ParentCode": "App.Administration", "RequiredPermissionName": "App.ForumManagement.Publish", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Adm" }, { - "ParentCode": null, + "Id": "7b6d6fe8-31c5-468b-a49d-8f61ff0538b2", "Code": "App.Hr", "DisplayName": "App.Hr", - "Order": 0, + "Order": 4, "Url": null, "Icon": "FcConferenceCall", + "ParentCode": null, "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr", + "Id": "1d7734d5-36b1-4ad2-aa33-145a4288d1dc", "Code": "App.Hr.Definitions", "DisplayName": "App.Platform.Definitions", "Order": 1, "Url": null, "Icon": "FcFilingCabinet", + "ParentCode": "App.Hr", "RequiredPermissionName": null, + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr.Definitions", + "Id": "eb9c8310-8498-4963-ba4d-8e56bcb42b5b", "Code": "App.Hr.SkillType", "DisplayName": "App.Hr.SkillType", "Order": 1, "Url": "/admin/list/App.Hr.SkillType", "Icon": "FcMindMap", + "ParentCode": "App.Hr.Definitions", "RequiredPermissionName": "App.Hr.SkillType", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr.Definitions", + "Id": "ed7bd2c5-36b0-49d8-a441-8c4426a53a28", "Code": "App.Hr.Department", "DisplayName": "App.Hr.Department", "Order": 2, "Url": "/admin/list/App.Hr.Department", "Icon": "FcDepartment", + "ParentCode": "App.Hr.Definitions", "RequiredPermissionName": "App.Hr.Department", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr.Definitions", + "Id": "f6d15b30-3404-4982-a035-97c986999f1e", "Code": "App.Hr.JobPosition", "DisplayName": "App.Hr.JobPosition", "Order": 3, "Url": "/admin/list/App.Hr.JobPosition", "Icon": "FcDebt", + "ParentCode": "App.Hr.Definitions", "RequiredPermissionName": "App.Hr.JobPosition", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr", + "Id": "9b1449bd-d898-43fb-96e0-50ab865b7072", "Code": "App.Hr.OrgChart", "DisplayName": "App.Hr.OrgChart", - "Order": 2, + "Order": 3, "Url": "/admin/organization", "Icon": "FaSitemap", + "ParentCode": "App.Hr", "RequiredPermissionName": "App.Hr.OrgChart", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr.Definitions", + "Id": "a866f244-67b4-4015-80c6-632abfab03ef", "Code": "App.Hr.Doctor", "DisplayName": "App.Hr.Doctor", "Order": 4, "Url": "/admin/list/App.Hr.Doctor", "Icon": "FcPortraitMode", + "ParentCode": "App.Hr.Definitions", "RequiredPermissionName": "App.Hr.Doctor", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr.Definitions", + "Id": "a6ddfb7b-db3e-4dec-a981-af9b193f9ea5", "Code": "App.Hr.Certificate", "DisplayName": "App.Hr.Certificate", "Order": 5, "Url": "/admin/list/App.Hr.Certificate", "Icon": "FcDiploma2", + "ParentCode": "App.Hr.Definitions", "RequiredPermissionName": "App.Hr.Certificate", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr.Definitions", + "Id": "fc69c8ac-6bec-4ee1-a30d-73f257b43338", "Code": "App.Hr.Hospital", "DisplayName": "App.Hr.Hospital", "Order": 6, "Url": "/admin/list/App.Hr.Hospital", "Icon": "FcOrganization", + "ParentCode": "App.Hr.Definitions", "RequiredPermissionName": "App.Hr.Hospital", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr.Definitions", + "Id": "b3cf12f0-062a-4b1f-ad20-748f9459d8c4", "Code": "App.Hr.HospitalDepartment", "DisplayName": "App.Hr.HospitalDepartment", "Order": 7, "Url": "/admin/list/App.Hr.HospitalDepartment", "Icon": "FcList", + "ParentCode": "App.Hr.Definitions", "RequiredPermissionName": "App.Hr.HospitalDepartment", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr.Definitions", + "Id": "4a83ad06-d841-454e-a9ac-7d83e6bcd7d3", "Code": "App.Hr.DocumentType", "DisplayName": "App.Hr.DocumentType", "Order": 8, "Url": "/admin/list/App.Hr.DocumentType", "Icon": "FcDocument", + "ParentCode": "App.Hr.Definitions", "RequiredPermissionName": "App.Hr.DocumentType", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr", + "Id": "ae8c7c61-8b57-4335-bacb-d54bcce3d661", "Code": "App.Hr.Visitor", "DisplayName": "App.Hr.Visitor", - "Order": 3, + "Order": 4, "Url": "/admin/list/App.Hr.Visitor", "Icon": "FcBusinessman", + "ParentCode": "App.Hr", "RequiredPermissionName": "App.Hr.Visitor", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" }, { - "ParentCode": "App.Hr", + "Id": "8803f8c5-e85b-491d-9330-a9dd5a95f1a1", "Code": "App.Hr.HealthCard", "DisplayName": "App.Hr.HealthCard", - "Order": 4, + "Order": 2, "Url": "/admin/list/App.Hr.HealthCard", "Icon": "FcInspection", + "ParentCode": "App.Hr", "RequiredPermissionName": "App.Hr.HealthCard", + "CssClass": null, + "Target": null, "IsDisabled": false, + "ElementId": null, "ModuleId": "Hr" } ]