diff --git a/api/src/Sozsoft.Platform.Application.Contracts/LookUpQueryValues.cs b/api/src/Sozsoft.Platform.Application.Contracts/LookUpQueryValues.cs index bcdd812..5f5eb1e 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/LookUpQueryValues.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/LookUpQueryValues.cs @@ -164,6 +164,14 @@ public static class LookupQueryValues $"FROM \"AbpPermissionGroups\" " + $"ORDER BY \"Name\";"; + public static string MenuGroupValues = + $"SELECT " + + $"\"Id\" AS \"Key\", " + + $"\"Name\" AS \"Name\" " + + $"FROM \"{TableNameResolver.GetFullTableName(nameof(TableNameEnum.MenuGroup))}\" " + + $"WHERE \"IsDeleted\" = 'false' " + + $"ORDER BY \"Name\";"; + public static string MenuCodeValues = $"SELECT " + $"\"Code\" AS \"Key\", " + diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json index 46feeaf..95014a6 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json @@ -1386,6 +1386,12 @@ "en": "Menu List", "tr": "Menü Listesi" }, + { + "resourceName": "Platform", + "key": "App.Menus.MenuGroup", + "en": "Menu Groups", + "tr": "Menü Grupları" + }, { "resourceName": "Platform", "key": "App.Menus.Manager", diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs index b44d61c..58b8d66 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs @@ -206,7 +206,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnOptionJson = DefaultColumnOptionJson(), PermissionJson = DefaultPermissionJson(AbpIdentity.Permissions.Create, listFormName, AbpIdentity.Permissions.Update, AbpIdentity.Permissions.Delete, AbpIdentity.Permissions.Export, AbpIdentity.Permissions.Import, AbpIdentity.Permissions.Note), PagerOptionJson = DefaultPagerOptionJson, - EditingOptionJson = DefaultEditingOptionJson(listFormName, 600, 500, true, true, true, true, false), + EditingOptionJson = DefaultEditingOptionJson(listFormName, 600, 600, true, true, true, true, false), EditingFormJson = JsonSerializer.Serialize(new List() { new() { @@ -236,7 +236,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep CultureName = LanguageCodes.En, SourceDbType = DbType.Guid, FieldName = "Id", - CaptionName = "App.Listform.ListformField.Id", + CaptionName = "App.Listform.ListformField.Id", Width = 100, ListOrderNo = 1, Visible = false, @@ -251,7 +251,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep CultureName = LanguageCodes.En, SourceDbType = DbType.String, FieldName = "GroupName", - CaptionName = "App.Listform.ListformField.GroupName", + CaptionName = "App.Listform.ListformField.GroupName", Width = 300, ListOrderNo = 2, Visible = true, @@ -266,7 +266,6 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ValueExpr = "Key", LookupQuery = LookupQueryValues.PermissionGroupValues }), - ValidationRuleJson = DefaultValidationRuleRequiredJson, ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(AbpIdentity.Permissions.Create, AbpIdentity.Permissions.Default, AbpIdentity.Permissions.Update, true, true, false), PivotSettingsJson = DefaultPivotSettingsJson @@ -276,13 +275,19 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep CultureName = LanguageCodes.En, SourceDbType = DbType.String, FieldName = "ParentName", - CaptionName = "App.Listform.ListformField.ParentName", + CaptionName = "App.Listform.ListformField.ParentName", Width = 300, ListOrderNo = 3, Visible = true, IsActive = true, IsDeleted = false, AllowSearch = true, + LookupJson = JsonSerializer.Serialize(new LookupDto { + DataSourceType = UiLookupDataSourceTypeEnum.Query, + DisplayExpr = "Name", + ValueExpr = "Key", + LookupQuery = LookupQueryValues.PermissionNameValues + }), ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(AbpIdentity.Permissions.Create, AbpIdentity.Permissions.Default, AbpIdentity.Permissions.Update, true, true, false), PivotSettingsJson = DefaultPivotSettingsJson @@ -292,7 +297,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep CultureName = LanguageCodes.En, SourceDbType = DbType.String, FieldName = "Name", - CaptionName = "App.Listform.ListformField.Name", + CaptionName = "App.Listform.ListformField.Name", Width = 300, ListOrderNo = 4, Visible = true, @@ -308,7 +313,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep CultureName = LanguageCodes.En, SourceDbType = DbType.String, FieldName = "DisplayName", - CaptionName = "App.Listform.ListformField.DisplayName", + CaptionName = "App.Listform.ListformField.DisplayName", Width = 400, ListOrderNo = 5, Visible = true, @@ -331,7 +336,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep CultureName = LanguageCodes.En, SourceDbType = DbType.Boolean, FieldName = "IsEnabled", - CaptionName = "App.Listform.ListformField.IsEnabled", + CaptionName = "App.Listform.ListformField.IsEnabled", Width = 100, ListOrderNo = 6, Visible = true, @@ -346,7 +351,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep CultureName = LanguageCodes.En, SourceDbType = DbType.Int16, FieldName = "MultiTenancySide", - CaptionName = "App.Listform.ListformField.MultiTenancySide", + CaptionName = "App.Listform.ListformField.MultiTenancySide", Width = 100, ListOrderNo = 7, Visible = true, @@ -381,13 +386,10 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep IsDeleted = false, LookupJson = JsonSerializer.Serialize(new LookupDto { - DataSourceType = UiLookupDataSourceTypeEnum.StaticData, + DataSourceType = UiLookupDataSourceTypeEnum.Query, DisplayExpr = "name", ValueExpr = "key", - LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] { - new () { Key="Kurs",Name="Kurs" }, - new () { Key="Erp",Name="Erp" }, - }), + LookupQuery = LookupQueryValues.MenuGroupValues }), ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(AbpIdentity.Permissions.Create, AbpIdentity.Permissions.Default, AbpIdentity.Permissions.Update, true, true, false), @@ -788,7 +790,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep PermissionJson = DefaultPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, listFormName, PlatformConsts.IdentityPermissions.Users.Update, PlatformConsts.IdentityPermissions.Users.Delete, PlatformConsts.IdentityPermissions.Users.Export, PlatformConsts.IdentityPermissions.Users.Import, PlatformConsts.IdentityPermissions.Users.Note), DeleteCommand = $"UPDATE \"AbpUsers\" SET \"DeleterId\"=@DeleterId, \"DeletionTime\"=CURRENT_TIMESTAMP, \"IsDeleted\"='true' WHERE \"Id\"=@Id", DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), - EditingOptionJson = DefaultEditingOptionJson(listFormName, 500, 450, true, true, true, true, false), + EditingOptionJson = DefaultEditingOptionJson(listFormName, 500, 550, true, true, true, true, false), EditingFormJson = JsonSerializer.Serialize(new List() { new () { Order=1,ColCount=1,ColSpan=1,ItemType="group",Items=[ new EditingFormItemDto { Order=1, DataField="Email", ColSpan=1, IsRequired=true, EditorType2=EditorTypes.dxTextBox }, diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs index a293d7e..3eb082b 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs @@ -538,13 +538,10 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency IsActive = true, IsDeleted = false, LookupJson = JsonSerializer.Serialize(new LookupDto { - DataSourceType = UiLookupDataSourceTypeEnum.StaticData, + DataSourceType = UiLookupDataSourceTypeEnum.Query, DisplayExpr = "name", ValueExpr = "key", - LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] { - new () { Key="Kurs", Name="Kurs" }, - new () { Key="Erp", Name="Erp" }, - }), + LookupQuery = LookupQueryValues.MenuGroupValues, }), ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(TenantManagementPermissions.Tenants.Create, TenantManagementPermissions.Tenants.Default, TenantManagementPermissions.Tenants.Update, true, true, false), @@ -5065,6 +5062,98 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency } #endregion + #region MenuGroup + listFormName = AppCodes.Menus.MenuGroup; + if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) + { + var listForm = await _listFormRepository.InsertAsync( + new ListForm + { + ListFormType = ListFormTypeEnum.List, + PageSize = 10, + ExportJson = DefaultExportJson, + IsSubForm = false, + ShowNote = true, + LayoutJson = DefaultLayoutJson(), + CultureName = LanguageCodes.En, + ListFormCode = listFormName, + Name = listFormName, + Title = listFormName, + DataSourceCode = SeedConsts.DataSources.DefaultCode, + IsTenant = false, + IsBranch = false, + IsOrganizationUnit = false, + Description = listFormName, + SelectCommandType = SelectCommandTypeEnum.Table, + SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.MenuGroup)), + KeyFieldName = "Id", + KeyFieldDbSourceType = DbType.String, + SortMode = GridOptions.SortModeSingle, + DefaultFilter = DefaultFilterJson, + FilterRowJson = DefaultFilterRowJson, + HeaderFilterJson = DefaultHeaderFilterJson, + SearchPanelJson = DefaultSearchPanelJson, + GroupPanelJson = JsonSerializer.Serialize(new { Visible = false }), + SelectionJson = DefaultSelectionSingleJson, + ColumnOptionJson = DefaultColumnOptionJson(), + PermissionJson = DefaultPermissionJson(listFormName), + PagerOptionJson = DefaultPagerOptionJson, + EditingOptionJson = DefaultEditingOptionJson(listFormName, 500, 350, true, true, true, true, false), + EditingFormJson = JsonSerializer.Serialize(new List + { + new() { Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group", Items = + [ + new EditingFormItemDto { Order = 1, DataField = "Name", ColSpan = 1, IsRequired = true, EditorType2 = EditorTypes.dxTextBox }, + ] + } + }), + DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.MenuGroup)), + DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), + InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), + }); + + #region MenuGroup Fields + await _listFormFieldRepository.InsertManyAsync([ + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Id", + CaptionName = "App.Listform.ListformField.Id", + Width = 100, + ListOrderNo = 1, + Visible = false, + IsActive = true, + IsDeleted = false, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Name", + CaptionName = "App.Listform.ListformField.Name", + Width = 300, + ListOrderNo = 2, + Visible = true, + IsActive = true, + IsDeleted = false, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }, + ]); + #endregion + } + #endregion + #region Menu listFormName = AppCodes.Menus.Menu; if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenuDataSeeder.cs b/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenuDataSeeder.cs index b4e4024..bc1c0e2 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenuDataSeeder.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenuDataSeeder.cs @@ -19,6 +19,11 @@ public class RouteSeedDto public string[] Authority { get; set; } } +public class MenuGroupSeedDto +{ + public string Name { get; set; } +} + public class MenuSeedDto { public string ParentCode { get; set; } @@ -36,20 +41,24 @@ public class MenuSeederDto { public List Routes { get; set; } public List Menus { get; set; } + public List MenuGroups { get; set; } } public class MenuDataSeeder : IDataSeedContributor, ITransientDependency { private readonly IRepository _routeRepository; private readonly IRepository _menuRepository; + private readonly IRepository _menuGroupRepository; public MenuDataSeeder( IRepository routeRepository, - IRepository menuRepository + IRepository menuRepository, + IRepository menuGroupRepository ) { _routeRepository = routeRepository; _menuRepository = menuRepository; + _menuGroupRepository = menuGroupRepository; } public async Task SeedAsync(DataSeedContext context) @@ -77,6 +86,19 @@ public class MenuDataSeeder : IDataSeedContributor, ITransientDependency } } + foreach (var item in items.MenuGroups) + { + var exists = await _menuGroupRepository.AnyAsync(x => x.Name == item.Name); + + if (!exists) + { + await _menuGroupRepository.InsertAsync(new MenuGroup(item.Name) + { + Name = item.Name + }); + } + } + foreach (var item in items.Menus) { var exists = await _menuRepository.AnyAsync(x => x.Code == item.Code); diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json index 8820868..7df0e64 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json @@ -400,6 +400,14 @@ "authority": ["App.Contact"] } ], + "MenuGroups": [ + { + "Name": "Erp" + }, + { + "Name": "Kurs" + } + ], "Menus": [ { "ParentCode": null, @@ -784,11 +792,21 @@ "RequiredPermissionName": "App.Routes", "IsDisabled": false }, + { + "ParentCode": "App.Menus", + "Code": "App.Menus.MenuGroup", + "DisplayName": "App.Menus.MenuGroup", + "Order": 2, + "Url": "/admin/list/App.Menus.MenuGroup", + "Icon": "FcGrid", + "RequiredPermissionName": "App.Menus.MenuGroup", + "IsDisabled": false + }, { "ParentCode": "App.Menus", "Code": "App.Menus.Menu", "DisplayName": "App.Menus.Menu", - "Order": 2, + "Order": 3, "Url": "/admin/list/App.Menus.Menu", "Icon": "FcMenu", "RequiredPermissionName": "App.Menus.Menu", @@ -798,7 +816,7 @@ "ParentCode": "App.Menus", "Code": "App.Menus.Manager", "DisplayName": "App.Menus.Manager", - "Order": 3, + "Order": 4, "Url": "/admin/menuManager", "Icon": "FaRegListAlt", "RequiredPermissionName": "App.Menus.Manager", diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json index f09f296..78f5503 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json @@ -1549,7 +1549,6 @@ "MultiTenancySide": 2, "MenuGroup": "Erp|Kurs" }, - { "GroupName": "App.Saas", "Name": "App.Home", @@ -1577,7 +1576,6 @@ "MultiTenancySide": 2, "MenuGroup": "Erp|Kurs" }, - { "GroupName": "App.Saas", "Name": "App.Orders.Products", @@ -2109,6 +2107,69 @@ "MultiTenancySide": 2, "MenuGroup": "Erp|Kurs" }, + { + "GroupName": "App.Saas", + "Name": "App.Menus.MenuGroup", + "ParentName": null, + "DisplayName": "App.Menus.MenuGroup", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.Menus.MenuGroup.Create", + "ParentName": "App.Menus.MenuGroup", + "DisplayName": "Create", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.Menus.MenuGroup.Delete", + "ParentName": "App.Menus.MenuGroup", + "DisplayName": "Delete", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.Menus.MenuGroup.Export", + "ParentName": "App.Menus.MenuGroup", + "DisplayName": "Export", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.Menus.MenuGroup.Import", + "ParentName": "App.Menus.MenuGroup", + "DisplayName": "Import", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.Menus.MenuGroup.Note", + "ParentName": "App.Menus.MenuGroup", + "DisplayName": "Note", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.Menus.MenuGroup.Update", + "ParentName": "App.Menus.MenuGroup", + "DisplayName": "Update", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, { "GroupName": "App.Saas", "Name": "App.Menus.Menu", @@ -2271,7 +2332,6 @@ "MultiTenancySide": 2, "MenuGroup": "Erp|Kurs" }, - { "GroupName": "App.Saas", "Name": "App.DeveloperKit", @@ -2470,7 +2530,6 @@ "MultiTenancySide": 2, "MenuGroup": "Erp|Kurs" }, - { "GroupName": "App.Administration", "Name": "App.Setting", diff --git a/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs b/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs index fd2a7a9..7b1361b 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs @@ -18,6 +18,7 @@ public enum TableNameEnum BranchUsers, GlobalSearch, Route, + MenuGroup, Menu, DataSource, ListForm, diff --git a/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs b/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs index 2e153b2..3e36821 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs @@ -60,6 +60,7 @@ public static class TableNameResolver { nameof(TableNameEnum.Demo), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.Contact), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.Route), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, + { nameof(TableNameEnum.MenuGroup), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.Menu), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.CrudEndpoint), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.CustomEndpoint), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, diff --git a/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs b/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs index dc5af8f..627c6ac 100644 --- a/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs +++ b/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs @@ -341,6 +341,7 @@ public static class SeedConsts { public const string Default = Prefix.App + ".Menus"; + public const string MenuGroup = Default + ".MenuGroup"; public const string Menu = Default + ".Menu"; public const string Manager = Default + ".Manager"; } diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Menu.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Menu.cs index 21e71c1..d30aef2 100644 --- a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Menu.cs +++ b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Menu.cs @@ -22,5 +22,4 @@ public class Menu : FullAuditedEntity public string UserId { get; set; } // External kullanici id (orn: ali.akman. ihtiyaca gore guid veya int de olabilir) public string RoleId { get; set; } // External role id (orn: ihracat) public string CultureName { get; set; } // Bu tanim hangi dil icin "en", "tr" -} - +} \ No newline at end of file diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/MenuGroup.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/MenuGroup.cs new file mode 100644 index 0000000..d0cdc5d --- /dev/null +++ b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/MenuGroup.cs @@ -0,0 +1,13 @@ +using Volo.Abp.Domain.Entities.Auditing; + +namespace Sozsoft.Platform.Entities; + +public class MenuGroup : FullAuditedEntity +{ + public string Name { get; set; } + + public MenuGroup(string id) + { + Id = id; + } +} diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Route.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Route.cs index c8294d2..0da79eb 100644 --- a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Route.cs +++ b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Route.cs @@ -1,6 +1,5 @@ using System; using Volo.Abp.Domain.Entities.Auditing; -using Volo.Abp.MultiTenancy; namespace Sozsoft.Platform.Entities; diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs index 63f99a2..cf32fda 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs @@ -48,6 +48,7 @@ public class PlatformDbContext : public DbSet GlobalSearchs { get; set; } public DbSet Routes { get; set; } public DbSet Menus { get; set; } + public DbSet MenuGroups { get; set; } public DbSet DataSources { get; set; } public DbSet ListForms { get; set; } public DbSet ListFormFields { get; set; } @@ -227,6 +228,14 @@ public class PlatformDbContext : ); }); + builder.Entity(b => + { + b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.MenuGroup)), Prefix.DbSchema); + b.ConfigureByConvention(); + + b.Property(a => a.Name).IsRequired().HasMaxLength(128); + }); + builder.Entity(b => { b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.Menu)), Prefix.DbSchema); diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317120000_Initial.Designer.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317181749_Initial.Designer.cs similarity index 99% rename from api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317120000_Initial.Designer.cs rename to api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317181749_Initial.Designer.cs index 5f7fccb..1381ec7 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317120000_Initial.Designer.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317181749_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Sozsoft.Platform.Migrations { [DbContext(typeof(PlatformDbContext))] - [Migration("20260317120000_Initial")] + [Migration("20260317181749_Initial")] partial class Initial { /// @@ -2954,6 +2954,51 @@ namespace Sozsoft.Platform.Migrations b.ToTable("Sas_H_Menu", (string)null); }); + modelBuilder.Entity("Sozsoft.Platform.Entities.MenuGroup", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.ToTable("Sas_H_MenuGroup", (string)null); + }); + modelBuilder.Entity("Sozsoft.Platform.Entities.Note", b => { b.Property("Id") diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317120000_Initial.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317181749_Initial.cs similarity index 99% rename from api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317120000_Initial.cs rename to api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317181749_Initial.cs index 4c09488..71d7bf6 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317120000_Initial.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260317181749_Initial.cs @@ -1228,6 +1228,25 @@ namespace Sozsoft.Platform.Migrations table.PrimaryKey("PK_Sas_H_Menu", x => x.Id); }); + migrationBuilder.CreateTable( + name: "Sas_H_MenuGroup", + columns: table => new + { + Id = table.Column(type: "nvarchar(450)", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Sas_H_MenuGroup", x => x.Id); + }); + migrationBuilder.CreateTable( name: "Sas_H_NotificationRule", columns: table => new @@ -3101,6 +3120,9 @@ namespace Sozsoft.Platform.Migrations migrationBuilder.DropTable( name: "Sas_H_Menu"); + migrationBuilder.DropTable( + name: "Sas_H_MenuGroup"); + migrationBuilder.DropTable( name: "Sas_H_Notification"); diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs index 8b1d765..799c9a8 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs @@ -2951,6 +2951,51 @@ namespace Sozsoft.Platform.Migrations b.ToTable("Sas_H_Menu", (string)null); }); + modelBuilder.Entity("Sozsoft.Platform.Entities.MenuGroup", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.ToTable("Sas_H_MenuGroup", (string)null); + }); + modelBuilder.Entity("Sozsoft.Platform.Entities.Note", b => { b.Property("Id") diff --git a/ui/src/views/menu/MenuItemComponent.tsx b/ui/src/views/menu/MenuItemComponent.tsx index 3c0c5ba..306d547 100644 --- a/ui/src/views/menu/MenuItemComponent.tsx +++ b/ui/src/views/menu/MenuItemComponent.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import React, { useState } from 'react' import { useSortable } from '@dnd-kit/sortable' import { CSS } from '@dnd-kit/utilities' import { MenuItem } from '@/proxy/menus/menu' @@ -74,7 +74,9 @@ export const MenuItemComponent: React.FC = ({ const [isExpanded, setIsExpanded] = useState(true) const [isModalOpen, setIsModalOpen] = useState(false) - const [formData, setFormData] = useState>({ + const [modalMode, setModalMode] = useState<'create' | 'edit'>('create') + + const getCreateInitialValues = (): Partial => ({ code: '', displayName: '', order: (item.children?.length || 0) + 1, @@ -88,15 +90,39 @@ export const MenuItemComponent: React.FC = ({ elementId: '', }) + const getEditInitialValues = (): Partial => ({ + id: item.id, + code: item.code || '', + displayName: item.displayName || '', + order: item.order, + parentCode: item.parentCode || '', + url: item.url || '', + icon: item.icon || '', + cssClass: item.cssClass || '', + requiredPermissionName: item.requiredPermissionName || '', + target: item.target || '', + isDisabled: item.isDisabled ?? false, + elementId: item.elementId || '', + }) + + const [formData, setFormData] = useState>(getCreateInitialValues()) + const toggleExpanded = () => { if (!isDesignMode) setIsExpanded(!isExpanded) } - const handleCreate = async () => { - const menuService = new MenuService() - await menuService.create(formData as MenuDto) - setIsModalOpen(false) - refetch() + const openCreateModal = () => { + setModalMode('create') + setFormData(getCreateInitialValues()) + setIsModalOpen(true) + } + + const openEditModal = (event: React.MouseEvent) => { + if (!isDesignMode) return + event.stopPropagation() + setModalMode('edit') + setFormData(getEditInitialValues()) + setIsModalOpen(true) } const handleDelete = async () => { @@ -123,7 +149,7 @@ export const MenuItemComponent: React.FC = ({ > {isDesignMode && (
-
- 0 ? 'font-semibold' : 'font-normal'} + ${isDesignMode ? 'hover:text-blue-600' : ''} `} > {translate('::' + item.displayName)} - + {item.url && } @@ -177,7 +206,9 @@ export const MenuItemComponent: React.FC = ({ onRequestClose={() => setIsModalOpen(false)} width={600} > -
{translate('::New Item')}
+
+ {modalMode === 'edit' ? translate('::Edit Menu Item') : translate('::New Item')} +
= ({ onSubmit={async (values, { setSubmitting }) => { try { const menuService = new MenuService() - await menuService.create(values as MenuDto) + if (modalMode === 'edit' && item.id) { + await menuService.update(item.id, values as MenuDto) + } else { + await menuService.create(values as MenuDto) + } toast.push( - {translate('::KayitEklendi')} + {modalMode === 'edit' ? translate('::KayitGuncellendi') : translate('::KayitEklendi')} , { placement: 'top-end' }, ) @@ -206,13 +241,12 @@ export const MenuItemComponent: React.FC = ({ } }} > - {({ values, errors, touched, isSubmitting, handleChange }) => ( + {({ values, isSubmitting }) => (
= ({ - + @@ -308,7 +346,7 @@ export const MenuItemComponent: React.FC = ({ {translate('::Cancel')} diff --git a/ui/src/views/menu/MenuManager.tsx b/ui/src/views/menu/MenuManager.tsx index 0c9ef54..a0de686 100644 --- a/ui/src/views/menu/MenuManager.tsx +++ b/ui/src/views/menu/MenuManager.tsx @@ -2,16 +2,11 @@ import React, { useState } from 'react' import { SortableMenuTree } from './SortableMenuTree' import { MenuItem } from '@/proxy/menus/menu' import { useMenuData } from '@/utils/hooks/useMenuData' -import { - FaRegBell, - FaSpinner, - FaBars, - FaRegSave -} from 'react-icons/fa'; +import { FaRegBell, FaSpinner, FaBars, FaRegSave } from 'react-icons/fa' import { Container } from '@/components/shared' import { Helmet } from 'react-helmet' import { useLocalization } from '@/utils/hooks/useLocalization' -import { APP_NAME } from '@/constants/app.constant'; +import { APP_NAME } from '@/constants/app.constant' export const MenuManager = () => { const { menuItems, setMenuItems, loading, error, refetch, saveMenuData } = useMenuData() @@ -95,7 +90,7 @@ export const MenuManager = () => { >
-
+
{/* Sol kısım: Başlık */}
diff --git a/ui/src/views/public/Home.tsx b/ui/src/views/public/Home.tsx index 8a8c0ab..ce10784 100644 --- a/ui/src/views/public/Home.tsx +++ b/ui/src/views/public/Home.tsx @@ -942,7 +942,7 @@ const Home: React.FC = () => { isDesignMode={isDesignMode} onSelect={handleSelectBlock} > -
+
{ }} className="h-full" > -
+

{slide.title}