From 296045c954d906f5c0ec10255067273c38ebcaa5 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Mon, 9 Sep 2019 16:29:05 +0300 Subject: [PATCH 01/10] refactor modal component and remove perfect scrollbar --- .../lib/components/users/users.component.html | 168 +++++++++--------- .../identity/src/lib/identity.module.ts | 2 - .../permission-management.component.html | 66 ++++--- .../src/lib/permission-management.module.ts | 3 +- .../lib/components/modal/modal.component.html | 7 +- .../lib/components/modal/modal.component.ts | 15 +- .../theme-shared/src/lib/contants/styles.ts | 5 + .../src/lib/theme-shared.module.ts | 32 ++-- 8 files changed, 151 insertions(+), 147 deletions(-) diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html index ea954c55be..949c6619ec 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html @@ -83,100 +83,98 @@ - -
- - - -
-
- * - -
+ + + + +
+
+ * + +
-
- - -
+
+ + +
-
- - -
+
+ + +
-
- * - -
+
+ * + +
-
- * - -
+
+ * + +
-
- - -
+
+ + +
-
- - -
+
+ + +
-
- - -
+
+ +
- - - - -
-
- - -
+
+
+
+ + +
+
+ +
- - - - - +
+
+
+ + diff --git a/npm/ng-packs/packages/identity/src/lib/identity.module.ts b/npm/ng-packs/packages/identity/src/lib/identity.module.ts index baac608c6e..7ae218a5f3 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity.module.ts @@ -10,7 +10,6 @@ import { UsersComponent } from './components/users/users.component'; import { PermissionManagementModule } from '@abp/ng.permission-management'; import { TableModule } from 'primeng/table'; import { NgxValidateCoreModule } from '@ngx-validate/core'; -import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; @NgModule({ declarations: [RolesComponent, UsersComponent], @@ -24,7 +23,6 @@ import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; NgbDropdownModule, PermissionManagementModule, NgxValidateCoreModule, - PerfectScrollbarModule, ], }) export class IdentityModule {} diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html index 3f6a47eabd..fbac3ae354 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html @@ -22,16 +22,14 @@
@@ -52,32 +50,30 @@ }}

- -
+ + - - -
-
+
diff --git a/npm/ng-packs/packages/permission-management/src/lib/permission-management.module.ts b/npm/ng-packs/packages/permission-management/src/lib/permission-management.module.ts index 3986689c41..73c3455828 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/permission-management.module.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/permission-management.module.ts @@ -4,11 +4,10 @@ import { NgModule } from '@angular/core'; import { NgxsModule } from '@ngxs/store'; import { PermissionManagementComponent } from './components/permission-management.component'; import { PermissionManagementState } from './states/permission-management.state'; -import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; @NgModule({ declarations: [PermissionManagementComponent], - imports: [CoreModule, ThemeSharedModule, NgxsModule.forFeature([PermissionManagementState]), PerfectScrollbarModule], + imports: [CoreModule, ThemeSharedModule, NgxsModule.forFeature([PermissionManagementState])], exports: [PermissionManagementComponent], }) export class PermissionManagementModule {} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html index 5f57360aa8..75c48d2d15 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html @@ -27,10 +27,9 @@ [style.minHeight]="minHeight || undefined" > - - + + diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts index dd66eec05c..e2646b5128 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts @@ -119,11 +119,16 @@ export class ModalComponent implements OnDestroy { this.visibleChange.emit(value); this.showModal = value; - value - ? timer(ANIMATION_TIMEOUT + 100) - .pipe(take(1)) - .subscribe(_ => (this.closable = true)) - : (this.closable = false); + if (value) { + timer(ANIMATION_TIMEOUT + 100) + .pipe(take(1)) + .subscribe(_ => (this.closable = true)); + + this.renderer.addClass(document.body, 'modal-open'); + } else { + this.closable = false; + this.renderer.removeClass(document.body, 'modal-open'); + } } listen() { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts b/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts index 7291eb0ab9..16c6433362 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts @@ -32,6 +32,11 @@ export default ` background-color: rgba(0, 0, 0, .6); } +.modal.show { + overflow-x: hidden !important; + overflow-y: auto !important; +} + .abp-ellipsis-inline { display: inline-block; overflow: hidden; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index 6d31540305..49269b59d9 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -18,22 +18,26 @@ import { ChangePasswordComponent } from './components/change-password/change-pas import { ProfileComponent } from './components/profile/profile.component'; import { BreadcrumbComponent } from './components/breadcrumb/breadcrumb.component'; -export function appendScript(injector: Injector) { - const fn = function() { - const lazyLoadService: LazyLoadService = injector.get(LazyLoadService); +export function appendScript(styles) { + const higher = (injector: Injector) => { + const fn = function() { + const lazyLoadService: LazyLoadService = injector.get(LazyLoadService); - return forkJoin( - lazyLoadService.load( - null, - 'style', - styles, - 'head', - 'afterbegin', - ) /* lazyLoadService.load(null, 'script', scripts) */, - ).pipe(take(1)); + return forkJoin( + lazyLoadService.load( + null, + 'style', + styles, + 'head', + 'afterbegin', + ) /* lazyLoadService.load(null, 'script', scripts) */, + ).pipe(take(1)); + }; + + return fn; }; - return fn; + return higher; } @NgModule({ @@ -87,7 +91,7 @@ export class ThemeSharedModule { provide: APP_INITIALIZER, multi: true, deps: [Injector, ErrorHandler], - useFactory: appendScript, + useFactory: appendScript(styles), }, { provide: MessageService, useClass: MessageService }, ], From 70ec0b3a63c001f94e7eb5de4b1be6fefb625869 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Mon, 9 Sep 2019 16:55:44 +0300 Subject: [PATCH 02/10] fix(theme-shared): remove unnecessary css style --- .../packages/theme-shared/src/lib/contants/styles.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts b/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts index 16c6433362..7291eb0ab9 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts @@ -32,11 +32,6 @@ export default ` background-color: rgba(0, 0, 0, .6); } -.modal.show { - overflow-x: hidden !important; - overflow-y: auto !important; -} - .abp-ellipsis-inline { display: inline-block; overflow: hidden; From e4d82550a94500cbf5630b1d3e53ca4e91a3a5f9 Mon Sep 17 00:00:00 2001 From: abp modules <51013007+abphub@users.noreply.github.com> Date: Tue, 10 Sep 2019 09:42:05 +0800 Subject: [PATCH 03/10] Modify an error description MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inheritance interface is not “ITenantResolver”,modified “ITenantResolveContributor”. See lines 118 and 134. --- docs/zh-Hans/Multi-Tenancy.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/zh-Hans/Multi-Tenancy.md b/docs/zh-Hans/Multi-Tenancy.md index 911803b1be..259cfeda9f 100644 --- a/docs/zh-Hans/Multi-Tenancy.md +++ b/docs/zh-Hans/Multi-Tenancy.md @@ -115,7 +115,7 @@ namespace MyCompany.MyProject { Configure(options => { - options.TenantResolvers.Add(new MyCustomTenantResolver()); + options.TenantResolvers.Add(new MyCustomTenantResolveContributor()); }); //... @@ -124,14 +124,14 @@ namespace MyCompany.MyProject } ```` -MyCustomTenantResolver必须像下面这样实现**ITenantResolver**接口: +MyCustomTenantResolveContributor必须像下面这样实现**ITenantResolveContributor**接口: ````C# using Volo.Abp.MultiTenancy; namespace MyCompany.MyProject { - public class MyCustomTenantResolver : ITenantResolver + public class MyCustomTenantResolveContributor : ITenantResolveContributor { public void Resolve(ITenantResolveContext context) { From 62f21424c1e64f8d3560e00684cbc6f135a23645 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 10 Sep 2019 14:23:55 +0800 Subject: [PATCH 04/10] Update Multi-Tenancy.md --- docs/en/Multi-Tenancy.md | 6 +++--- docs/zh-Hans/Multi-Tenancy.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/Multi-Tenancy.md b/docs/en/Multi-Tenancy.md index f5510a82db..0ad3c66b26 100644 --- a/docs/en/Multi-Tenancy.md +++ b/docs/en/Multi-Tenancy.md @@ -114,7 +114,7 @@ namespace MyCompany.MyProject { Configure(options => { - options.TenantResolvers.Add(new MyCustomTenantResolver()); + options.TenantResolvers.Add(new MyCustomTenantResolveContributor()); }); //... @@ -123,14 +123,14 @@ namespace MyCompany.MyProject } ```` -MyCustomTenantResolver must implement **ITenantResolver** as shown below: +`MyCustomTenantResolveContributor` must implement **ITenantResolveContributor** as shown below: ````C# using Volo.Abp.MultiTenancy; namespace MyCompany.MyProject { - public class MyCustomTenantResolver : ITenantResolver + public class MyCustomTenantResolveContributor : ITenantResolveContributor { public void Resolve(ITenantResolveContext context) { diff --git a/docs/zh-Hans/Multi-Tenancy.md b/docs/zh-Hans/Multi-Tenancy.md index 259cfeda9f..352190d5cd 100644 --- a/docs/zh-Hans/Multi-Tenancy.md +++ b/docs/zh-Hans/Multi-Tenancy.md @@ -124,7 +124,7 @@ namespace MyCompany.MyProject } ```` -MyCustomTenantResolveContributor必须像下面这样实现**ITenantResolveContributor**接口: +`MyCustomTenantResolveContributor`必须像下面这样实现**ITenantResolveContributor**接口: ````C# using Volo.Abp.MultiTenancy; From 9574d002deda4472835f1e22ee66227e3faaf5e1 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 10 Sep 2019 09:27:33 +0300 Subject: [PATCH 05/10] Show information when no features resolved https://github.com/volosoft/volo/issues/570 --- .../Localization/Domain/en.json | 3 +- .../FeatureManagementModal.cshtml | 87 ++++++++++--------- 2 files changed, 50 insertions(+), 40 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json index 68af08b6a1..2e8812968d 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json @@ -1,6 +1,7 @@ { "culture": "en", "texts": { - "Features": "Features" + "Features": "Features", + "NoFeatureFoundMessage": "There is't any available feature." } } \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index b52ea264b4..59e80e236c 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -12,49 +12,58 @@
- - - - @for (var i = 0; i < Model.FeatureListDto.Features.Count; i++) - { - var feature = Model.FeatureListDto.Features[i]; -
+ @if (Model.FeatureListDto?.Features != null && Model.FeatureListDto.Features.Any()) + { + + + + @for (var i = 0; i < Model.FeatureListDto.Features.Count; i++) + { + var feature = Model.FeatureListDto.Features[i]; +
- @feature.Name + @feature.Name - - @if (feature.ValueType is FreeTextStringValueType) - { - - - } - @if (feature.ValueType is SelectionStringValueType) - { - - + @if (feature.ValueType is FreeTextStringValueType) + { + + + } + @if (feature.ValueType is SelectionStringValueType) + { + + - } - @if (feature.ValueType is ToggleStringValueType) - { - - - } -
- } -
- + + } + @if (feature.ValueType is ToggleStringValueType) + { + + + } +
+ } +
+ + } + else + { + + @L["NoFeatureFoundMessage"] + + }
From 80d9105d2ef7f8ce747564f9be9a9e9321492fa9 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 10 Sep 2019 13:28:44 +0300 Subject: [PATCH 06/10] added CheckNameExistAsync methods to api and identity resources --- ...olo.Abp.IdentityServer.Domain.Shared.csproj | 8 ++++++++ .../AbpIdentityServerDomainSharedModule.cs | 18 +++++++++++++++++- .../Localization/Resources/en.json | 7 +++++++ .../ApiResources/IApiResourceRepository.cs | 5 +++++ .../IIdentityResourceRepository.cs | 5 +++++ .../ApiResources/ApiResourceRepository.cs | 5 +++++ .../IdentityResourceRepository.cs | 5 +++++ .../MongoDB/MongoApiResourceRepository.cs | 5 +++++ .../MongoDB/MongoIdentityResourceRepository.cs | 5 +++++ 9 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj index 6894c3f60b..bcd99cd524 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj @@ -13,6 +13,14 @@ + + + + + + + + diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs index 141bd1a5fb..8d2bf66576 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs @@ -1,6 +1,9 @@ using Volo.Abp.IdentityServer.Localization; using Volo.Abp.Localization; +using Volo.Abp.Localization.ExceptionHandling; +using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.IdentityServer { @@ -11,9 +14,22 @@ namespace Volo.Abp.IdentityServer { public override void ConfigureServices(ServiceConfigurationContext context) { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + Configure(options => { - options.Resources.Add("en"); + options.Resources.Add("en") + .AddBaseTypes( + typeof(AbpValidationResource) + ).AddVirtualJson("/Volo/Abp/IdentityServer/Localization/Resources"); + }); + + Configure(options => + { + options.MapCodeNamespace("Volo.IdentityServer", typeof(AbpIdentityServerResource)); }); } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json new file mode 100644 index 0000000000..89ffea534c --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json @@ -0,0 +1,7 @@ +{ + "culture": "en", + "texts": { + "Volo.IdentityServer:DuplicateIdentityResourceName": "Identity Resource name already exist: {Name}", + "Volo.IdentityServer:DuplicateApiResourceName": "Api Resource name already exist: {Name}" + } +} \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs index e229f361d5..6eead2f2dd 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs @@ -32,5 +32,10 @@ namespace Volo.Abp.IdentityServer.ApiResources bool includeDetails = false, CancellationToken cancellationToken = default ); + + Task CheckNameExistAsync( + string name, + Guid? expectedId = null + ); } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs index 0ae9754b91..2b569a84e4 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs @@ -27,5 +27,10 @@ namespace Volo.Abp.IdentityServer.IdentityResources bool includeDetails = true, CancellationToken cancellationToken = default ); + + Task CheckNameExistAsync( + string name, + Guid? expectedId = null + ); } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs index 7b6acd495a..9ba8f19b14 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs @@ -61,6 +61,11 @@ namespace Volo.Abp.IdentityServer.ApiResources .ToListAsync(GetCancellationToken(cancellationToken)); } + public async Task CheckNameExistAsync(string name, Guid? expectedId = null) + { + return await DbSet.AnyAsync(ar => ar.Id != expectedId && ar.Name == name); + } + public override async Task DeleteAsync(Guid id, bool autoSave = false, CancellationToken cancellationToken = default) { var scopeClaims = DbContext.Set().Where(sc => sc.ApiResourceId == id); diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceRepository.cs index a5237a6cc8..5c6de3ffac 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceRepository.cs @@ -56,5 +56,10 @@ namespace Volo.Abp.IdentityServer.IdentityResources .Where(x => x.Name == name) .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); } + + public async Task CheckNameExistAsync(string name, Guid? expectedId = null) + { + return await DbSet.AnyAsync(ir => ir.Id != expectedId && ir.Name == name); + } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs index 81ea680720..7cd9147889 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs @@ -47,5 +47,10 @@ namespace Volo.Abp.IdentityServer.MongoDB { return await GetCountAsync(); } + + public async Task CheckNameExistAsync(string name, Guid? expectedId = null) + { + return await GetMongoQueryable().AnyAsync(ar => ar.Id != expectedId && ar.Name == name); + } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoIdentityResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoIdentityResourceRepository.cs index 85505c2987..4ab1ee91c0 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoIdentityResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoIdentityResourceRepository.cs @@ -50,5 +50,10 @@ namespace Volo.Abp.IdentityServer.MongoDB { return await GetCountAsync(); } + + public async Task CheckNameExistAsync(string name, Guid? expectedId = null) + { + return await GetMongoQueryable().AnyAsync(ir => ir.Id != expectedId && ir.Name == name); + } } } From c466807c014354b2c19dddad0c4c9cdf7a253062 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 10 Sep 2019 13:50:11 +0300 Subject: [PATCH 07/10] refactor: remove all root modules and add module provider functions --- .../account/src/lib/account.module.ts | 15 +++++++++++++- .../account/src/lib/root-account.module.ts | 20 ------------------- .../packages/account/src/public-api.ts | 1 - .../src/lib/root-feature-management.module.ts | 11 ---------- .../feature-management/src/public-api.ts | 1 - .../identity/src/lib/identity.module.ts | 6 +++++- .../identity/src/lib/root-identity.module.ts | 11 ---------- .../packages/identity/src/public-api.ts | 1 - .../lib/root-permission-management.module.ts | 11 ---------- .../permission-management/src/public-api.ts | 1 - .../src/lib/root-setting-management.module.ts | 11 ---------- .../setting-management/src/public-api.ts | 3 +-- .../src/lib/root-tenant-management.module.ts | 11 ---------- .../src/lib/tenant-management.module.ts | 6 +++++- .../tenant-management/src/public-api.ts | 1 - 15 files changed, 25 insertions(+), 85 deletions(-) delete mode 100644 npm/ng-packs/packages/account/src/lib/root-account.module.ts delete mode 100644 npm/ng-packs/packages/feature-management/src/lib/root-feature-management.module.ts delete mode 100644 npm/ng-packs/packages/identity/src/lib/root-identity.module.ts delete mode 100644 npm/ng-packs/packages/permission-management/src/lib/root-permission-management.module.ts delete mode 100644 npm/ng-packs/packages/setting-management/src/lib/root-setting-management.module.ts delete mode 100644 npm/ng-packs/packages/tenant-management/src/lib/root-tenant-management.module.ts diff --git a/npm/ng-packs/packages/account/src/lib/account.module.ts b/npm/ng-packs/packages/account/src/lib/account.module.ts index fbfe6a7226..8a790a21c1 100644 --- a/npm/ng-packs/packages/account/src/lib/account.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account.module.ts @@ -1,6 +1,6 @@ import { CoreModule } from '@abp/ng.core'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; -import { NgModule } from '@angular/core'; +import { NgModule, Provider } from '@angular/core'; import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; import { NgxValidateCoreModule } from '@ngx-validate/core'; import { TableModule } from 'primeng/table'; @@ -8,6 +8,8 @@ import { AccountRoutingModule } from './account-routing.module'; import { LoginComponent } from './components/login/login.component'; import { RegisterComponent } from './components/register/register.component'; import { TenantBoxComponent } from './components/tenant-box/tenant-box.component'; +import { Options } from './models/options'; +import { ACCOUNT_OPTIONS, optionsFactory } from './tokens/options.token'; @NgModule({ declarations: [LoginComponent, RegisterComponent, TenantBoxComponent], @@ -15,3 +17,14 @@ import { TenantBoxComponent } from './components/tenant-box/tenant-box.component exports: [], }) export class AccountModule {} + +export function AccountProviders(options = {} as Options): Provider[] { + return [ + { provide: ACCOUNT_OPTIONS, useValue: options }, + { + provide: 'ACCOUNT_OPTIONS', + useFactory: optionsFactory, + deps: [ACCOUNT_OPTIONS], + }, + ]; +} diff --git a/npm/ng-packs/packages/account/src/lib/root-account.module.ts b/npm/ng-packs/packages/account/src/lib/root-account.module.ts deleted file mode 100644 index beca480223..0000000000 --- a/npm/ng-packs/packages/account/src/lib/root-account.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ModuleWithProviders, NgModule } from '@angular/core'; -import { Options } from './models/options'; -import { ACCOUNT_OPTIONS, optionsFactory } from './tokens/options.token'; - -@NgModule({}) -export class RootAccountModule { - static forRoot(options = {} as Options): ModuleWithProviders { - return { - ngModule: RootAccountModule, - providers: [ - { provide: ACCOUNT_OPTIONS, useValue: options }, - { - provide: 'ACCOUNT_OPTIONS', - useFactory: optionsFactory, - deps: [ACCOUNT_OPTIONS], - }, - ], - }; - } -} diff --git a/npm/ng-packs/packages/account/src/public-api.ts b/npm/ng-packs/packages/account/src/public-api.ts index d75f7155f1..0e845f0768 100644 --- a/npm/ng-packs/packages/account/src/public-api.ts +++ b/npm/ng-packs/packages/account/src/public-api.ts @@ -1,4 +1,3 @@ -export * from './lib/root-account.module'; export * from './lib/account.module'; export * from './lib/components'; export * from './lib/constants/routes'; diff --git a/npm/ng-packs/packages/feature-management/src/lib/root-feature-management.module.ts b/npm/ng-packs/packages/feature-management/src/lib/root-feature-management.module.ts deleted file mode 100644 index cb60351a07..0000000000 --- a/npm/ng-packs/packages/feature-management/src/lib/root-feature-management.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ModuleWithProviders, NgModule } from '@angular/core'; - -@NgModule({}) -export class RootFeatureManagementModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootFeatureManagementModule, - providers: [], - }; - } -} diff --git a/npm/ng-packs/packages/feature-management/src/public-api.ts b/npm/ng-packs/packages/feature-management/src/public-api.ts index a13bb6c526..047ac00914 100644 --- a/npm/ng-packs/packages/feature-management/src/public-api.ts +++ b/npm/ng-packs/packages/feature-management/src/public-api.ts @@ -1,3 +1,2 @@ -export * from './lib/root-feature-management.module'; export * from './lib/feature-management.module'; export * from './lib/components'; diff --git a/npm/ng-packs/packages/identity/src/lib/identity.module.ts b/npm/ng-packs/packages/identity/src/lib/identity.module.ts index baac608c6e..e39385e5f5 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity.module.ts @@ -1,5 +1,5 @@ import { CoreModule } from '@abp/ng.core'; -import { NgModule } from '@angular/core'; +import { NgModule, Provider } from '@angular/core'; import { NgxsModule } from '@ngxs/store'; import { RolesComponent } from './components/roles/roles.component'; import { IdentityRoutingModule } from './identity-routing.module'; @@ -28,3 +28,7 @@ import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; ], }) export class IdentityModule {} + +export function IdentityProviders(): Provider[] { + return []; +} diff --git a/npm/ng-packs/packages/identity/src/lib/root-identity.module.ts b/npm/ng-packs/packages/identity/src/lib/root-identity.module.ts deleted file mode 100644 index c5cc5efaaa..0000000000 --- a/npm/ng-packs/packages/identity/src/lib/root-identity.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ModuleWithProviders, NgModule } from '@angular/core'; - -@NgModule({}) -export class RootIdentityModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootIdentityModule, - providers: [], - }; - } -} diff --git a/npm/ng-packs/packages/identity/src/public-api.ts b/npm/ng-packs/packages/identity/src/public-api.ts index e3de2483e4..be547b1c34 100644 --- a/npm/ng-packs/packages/identity/src/public-api.ts +++ b/npm/ng-packs/packages/identity/src/public-api.ts @@ -2,7 +2,6 @@ * Public API Surface of identity */ -export * from './lib/root-identity.module'; export * from './lib/identity.module'; export * from './lib/actions/identity.actions'; export * from './lib/components/roles/roles.component'; diff --git a/npm/ng-packs/packages/permission-management/src/lib/root-permission-management.module.ts b/npm/ng-packs/packages/permission-management/src/lib/root-permission-management.module.ts deleted file mode 100644 index a61fbc6b64..0000000000 --- a/npm/ng-packs/packages/permission-management/src/lib/root-permission-management.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ModuleWithProviders, NgModule } from '@angular/core'; - -@NgModule({}) -export class RootPermissionManagementModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootPermissionManagementModule, - providers: [], - }; - } -} diff --git a/npm/ng-packs/packages/permission-management/src/public-api.ts b/npm/ng-packs/packages/permission-management/src/public-api.ts index bf45b06676..3182363f25 100644 --- a/npm/ng-packs/packages/permission-management/src/public-api.ts +++ b/npm/ng-packs/packages/permission-management/src/public-api.ts @@ -2,7 +2,6 @@ * Public API Surface of permission-management */ -export * from './lib/root-permission-management.module'; export * from './lib/permission-management.module'; export * from './lib/actions'; export * from './lib/components'; diff --git a/npm/ng-packs/packages/setting-management/src/lib/root-setting-management.module.ts b/npm/ng-packs/packages/setting-management/src/lib/root-setting-management.module.ts deleted file mode 100644 index 120d9fc444..0000000000 --- a/npm/ng-packs/packages/setting-management/src/lib/root-setting-management.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ModuleWithProviders, NgModule } from '@angular/core'; - -@NgModule({}) -export class RootSettingManagementModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootSettingManagementModule, - providers: [], - }; - } -} diff --git a/npm/ng-packs/packages/setting-management/src/public-api.ts b/npm/ng-packs/packages/setting-management/src/public-api.ts index 6ef085fc8e..5343d9e457 100644 --- a/npm/ng-packs/packages/setting-management/src/public-api.ts +++ b/npm/ng-packs/packages/setting-management/src/public-api.ts @@ -1,4 +1,3 @@ -export * from './lib/root-setting-management.module'; export * from './lib/setting-management.module'; -export * from './lib/components'; export * from './lib/constants'; +export * from './lib/components/setting-layout.component'; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/root-tenant-management.module.ts b/npm/ng-packs/packages/tenant-management/src/lib/root-tenant-management.module.ts deleted file mode 100644 index a147f2a36a..0000000000 --- a/npm/ng-packs/packages/tenant-management/src/lib/root-tenant-management.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ModuleWithProviders, NgModule } from '@angular/core'; - -@NgModule({}) -export class RootTenantManagementModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootTenantManagementModule, - providers: [], - }; - } -} diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts index feb7303167..f8a258da3b 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts @@ -1,6 +1,6 @@ import { CoreModule } from '@abp/ng.core'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; -import { NgModule } from '@angular/core'; +import { NgModule, Provider } from '@angular/core'; import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; import { NgxsModule } from '@ngxs/store'; import { TableModule } from 'primeng/table'; @@ -24,3 +24,7 @@ import { NgxValidateCoreModule } from '@ngx-validate/core'; ], }) export class TenantManagementModule {} + +export function TenantManagementProviders(): Provider[] { + return []; +} diff --git a/npm/ng-packs/packages/tenant-management/src/public-api.ts b/npm/ng-packs/packages/tenant-management/src/public-api.ts index 6b2ae2d388..9bae9a9edb 100644 --- a/npm/ng-packs/packages/tenant-management/src/public-api.ts +++ b/npm/ng-packs/packages/tenant-management/src/public-api.ts @@ -1,4 +1,3 @@ -export * from './lib/root-tenant-management.module'; export * from './lib/tenant-management.module'; export * from './lib/actions'; export * from './lib/components'; From 2ac158d3672644c191c56eef1dc13fc860111794 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 10 Sep 2019 13:51:50 +0300 Subject: [PATCH 08/10] feature(core): add abpFor directive support to add layout type from routing module --- .../components/dynamic-layout.component.ts | 32 ++-- .../packages/core/src/lib/core.module.ts | 3 + .../core/src/lib/directives/for.directive.ts | 174 ++++++++++++++++++ .../packages/core/src/lib/directives/index.ts | 1 + .../packages/core/src/lib/enums/common.ts | 1 + .../packages/core/src/lib/models/common.ts | 2 +- templates/app/angular/src/app/app.module.ts | 11 +- 7 files changed, 204 insertions(+), 20 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/directives/for.directive.ts diff --git a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts index 517e1974ad..d89d486c57 100644 --- a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts @@ -1,12 +1,13 @@ -import { Component, OnDestroy, Type } from '@angular/core'; -import { NavigationEnd, Router, UrlSegment } from '@angular/router'; +import { Component, Input, OnDestroy, Type } from '@angular/core'; +import { ActivatedRoute, NavigationEnd, Router, UrlSegment } from '@angular/router'; import { Select, Store } from '@ngxs/store'; import { Observable } from 'rxjs'; -import { eLayoutType } from '../enums'; -import { ABP, Config } from '../models'; -import { ConfigState } from '../states'; -import { takeUntilDestroy } from '../utils'; import snq from 'snq'; +import { eLayoutType } from '../enums/common'; +import { Config } from '../models/config'; +import { ABP } from '../models/common'; +import { ConfigState } from '../states/config.state'; +import { takeUntilDestroy } from '../utils/rxjs-utils'; @Component({ selector: 'abp-dynamic-layout', @@ -23,16 +24,23 @@ export class DynamicLayoutComponent implements OnDestroy { layout: Type; - constructor(private router: Router, private store: Store) { + constructor(private router: Router, private route: ActivatedRoute, private store: Store) { + const { + requirements: { layouts }, + routes, + } = this.store.selectSnapshot(ConfigState.getAll); + + if ((this.route.snapshot.data || {}).layout) { + this.layout = layouts + .filter(l => !!l) + .find(l => snq(() => l.type.toLowerCase().indexOf(this.route.snapshot.data.layout), -1) > -1); + } + this.router.events.pipe(takeUntilDestroy(this)).subscribe(event => { if (event instanceof NavigationEnd) { const { segments } = this.router.parseUrl(event.url).root.children.primary; - const { - requirements: { layouts }, - routes, - } = this.store.selectSnapshot(ConfigState.getAll); - const layout = findLayout(segments, routes); + const layout = (this.route.snapshot.data || {}).layout || findLayout(segments, routes); this.layout = layouts.filter(l => !!l).find(l => snq(() => l.type.toLowerCase().indexOf(layout), -1) > -1); } diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 6e801ffd83..c9c6ce9761 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -24,6 +24,7 @@ import { ProfileState } from './states/profile.state'; import { SessionState } from './states/session.state'; import { getInitialData, localeInitializer } from './utils/initial-utils'; import { ConfigPlugin, NGXS_CONFIG_PLUGIN_OPTIONS } from './plugins/config/config.plugin'; +import { ForDirective } from './directives/for.directive'; @NgModule({ imports: [ @@ -41,6 +42,7 @@ import { ConfigPlugin, NGXS_CONFIG_PLUGIN_OPTIONS } from './plugins/config/confi DynamicLayoutComponent, AutofocusDirective, EllipsisDirective, + ForDirective, FormSubmitDirective, LocalizationPipe, PermissionDirective, @@ -58,6 +60,7 @@ import { ConfigPlugin, NGXS_CONFIG_PLUGIN_OPTIONS } from './plugins/config/confi DynamicLayoutComponent, AutofocusDirective, EllipsisDirective, + ForDirective, FormSubmitDirective, LocalizationPipe, PermissionDirective, diff --git a/npm/ng-packs/packages/core/src/lib/directives/for.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/for.directive.ts new file mode 100644 index 0000000000..24769b325d --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/directives/for.directive.ts @@ -0,0 +1,174 @@ +import { + Directive, + EmbeddedViewRef, + Input, + IterableChangeRecord, + IterableChanges, + IterableDiffer, + IterableDiffers, + OnChanges, + TemplateRef, + TrackByFunction, + ViewContainerRef, +} from '@angular/core'; +import compare from 'just-compare'; + +export type CompareFn = (value: T, comparison: T) => boolean; + +class AbpForContext { + constructor(public $implicit: any, public index: number, public count: number, public list: any[]) {} +} + +class RecordView { + constructor(public record: IterableChangeRecord, public view: EmbeddedViewRef) {} +} + +@Directive({ + selector: '[abpFor]', +}) +export class ForDirective implements OnChanges { + @Input('abpForOf') + items: any[]; + + @Input('abpForOrderBy') + orderBy: string; + + @Input('abpForOrderDir') + orderDir: 'ASC' | 'DESC'; + + @Input('abpForFilterBy') + filterBy: string; + + @Input('abpForFilterVal') + filterVal: any; + + @Input('abpForTrackBy') + trackBy; + + @Input('abpForCompareBy') + compareBy: CompareFn; + + @Input('abpForEmptyRef') + emptyRef: TemplateRef; + + private differ: IterableDiffer; + + private isShowEmptyRef: boolean; + + get compareFn(): CompareFn { + return this.compareBy || compare; + } + + get trackByFn(): TrackByFunction { + return this.trackBy || ((index: number, item: any) => (item as any).id || index); + } + + constructor( + private tempRef: TemplateRef, + private vcRef: ViewContainerRef, + private differs: IterableDiffers, + ) {} + + private iterateOverAppliedOperations(changes: IterableChanges) { + const rw: RecordView[] = []; + + changes.forEachOperation((record: IterableChangeRecord, previousIndex: number, currentIndex: number) => { + if (record.previousIndex == null) { + const view = this.vcRef.createEmbeddedView( + this.tempRef, + new AbpForContext(null, -1, -1, this.items), + currentIndex, + ); + + rw.push(new RecordView(record, view)); + } else if (currentIndex == null) { + this.vcRef.remove(previousIndex); + } else { + const view = this.vcRef.get(previousIndex); + this.vcRef.move(view, currentIndex); + + rw.push(new RecordView(record, view as EmbeddedViewRef)); + } + }); + + for (let i = 0, l = rw.length; i < l; i++) { + rw[i].view.context.$implicit = rw[i].record.item; + } + } + + private iterateOverAttachedViews(changes: IterableChanges) { + for (let i = 0, l = this.vcRef.length; i < l; i++) { + const viewRef = this.vcRef.get(i) as EmbeddedViewRef; + viewRef.context.index = i; + viewRef.context.count = l; + viewRef.context.list = this.items; + } + + changes.forEachIdentityChange((record: IterableChangeRecord) => { + const viewRef = this.vcRef.get(record.currentIndex) as EmbeddedViewRef; + viewRef.context.$implicit = record.item; + }); + } + + private projectItems(items: any[]): void { + if (!items.length && this.emptyRef) { + this.vcRef.createEmbeddedView(this.emptyRef).rootNodes; + this.isShowEmptyRef = true; + + return; + } + + if (this.emptyRef && this.isShowEmptyRef) { + this.vcRef.clear(); + this.isShowEmptyRef = false; + } + + if (!this.differ && items) { + this.differ = this.differs.find(items).create(this.trackByFn); + } + + if (this.differ) { + const changes = this.differ.diff(items); + + if (changes) { + this.iterateOverAppliedOperations(changes); + this.iterateOverAttachedViews(changes); + } + } + } + + private sortItems(items: any[]) { + if (this.orderBy) { + items.sort((a, b) => (a[this.orderBy] > b[this.orderBy] ? 1 : a[this.orderBy] < b[this.orderBy] ? -1 : 0)); + } else { + items.sort(); + } + } + + ngOnChanges() { + let items = [...this.items] as any[]; + if (!Array.isArray(items)) return; + + const compareFn = this.compareFn; + + if (typeof this.filterBy !== 'undefined') { + items = items.filter(item => compareFn(item[this.filterBy], this.filterVal)); + } + + switch (this.orderDir) { + case 'ASC': + this.sortItems(items); + this.projectItems(items); + break; + + case 'DESC': + this.sortItems(items); + items.reverse(); + this.projectItems(items); + break; + + default: + this.projectItems(items); + } + } +} diff --git a/npm/ng-packs/packages/core/src/lib/directives/index.ts b/npm/ng-packs/packages/core/src/lib/directives/index.ts index 336b6ff5ab..7edf1b5f76 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/index.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/index.ts @@ -1,5 +1,6 @@ export * from './autofocus.directive'; export * from './ellipsis.directive'; +export * from './for.directive'; export * from './form-submit.directive'; export * from './permission.directive'; export * from './visibility.directive'; diff --git a/npm/ng-packs/packages/core/src/lib/enums/common.ts b/npm/ng-packs/packages/core/src/lib/enums/common.ts index 08ddf05b6d..3b953b8ac7 100644 --- a/npm/ng-packs/packages/core/src/lib/enums/common.ts +++ b/npm/ng-packs/packages/core/src/lib/enums/common.ts @@ -2,4 +2,5 @@ export const enum eLayoutType { account = 'account', application = 'application', empty = 'empty', + setting = 'setting', } diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index 502363a323..a5089760f0 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -1,5 +1,5 @@ import { Config } from './config'; -import { eLayoutType } from '../enums'; +import { eLayoutType } from '../enums/common'; export namespace ABP { export interface Root { diff --git a/templates/app/angular/src/app/app.module.ts b/templates/app/angular/src/app/app.module.ts index 86b2d1b7be..7e942b2648 100644 --- a/templates/app/angular/src/app/app.module.ts +++ b/templates/app/angular/src/app/app.module.ts @@ -11,9 +11,9 @@ import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { SharedModule } from './shared/shared.module'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; -import { RootAccountModule } from '@abp/ng.account'; -import { RootIdentityModule } from '@abp/ng.identity'; -import { RootTenantManagementModule } from '@abp/ng.tenant-management'; +import { AccountProviders } from '@abp/ng.account'; +import { IdentityProviders } from '@abp/ng.identity'; +import { TenantManagementProviders } from '@abp/ng.tenant-management'; @NgModule({ declarations: [AppComponent], @@ -29,15 +29,12 @@ import { RootTenantManagementModule } from '@abp/ng.tenant-management'; layouts: LAYOUTS, }, }), - RootAccountModule.forRoot({ redirectUrl: '/' }), - RootIdentityModule.forRoot(), - RootTenantManagementModule.forRoot(), OAuthModule.forRoot(), NgxsModule.forRoot([]), NgxsReduxDevtoolsPluginModule.forRoot({ disabled: environment.production }), ], - providers: [], + providers: [...AccountProviders({ redirectUrl: '/' }), ...IdentityProviders(), ...TenantManagementProviders()], bootstrap: [AppComponent], }) export class AppModule {} From 180d37a6535e2daa05e9a1414ae74be8871becdb Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 10 Sep 2019 13:52:35 +0300 Subject: [PATCH 09/10] feature(setting-management): change setting management module structure --- .../src/lib/components/index.ts | 1 - .../components/services/initial.service.ts | 17 ------ .../components/setting-layout.component.html | 59 +++++++++++++++++++ .../components/setting-layout.component.ts | 37 ++++++++++++ .../components/setting/setting.component.html | 51 ---------------- .../components/setting/setting.component.ts | 20 ------- .../src/lib/constants/routes.ts | 1 - .../services/setting-management.service.ts | 53 +++++++++++++++++ .../lib/setting-management-routing.module.ts | 8 ++- .../src/lib/setting-management.module.ts | 19 +++--- .../src/lib/models/setting-management.ts | 4 +- npm/ng-packs/tsconfig.json | 9 ++- 12 files changed, 171 insertions(+), 108 deletions(-) delete mode 100644 npm/ng-packs/packages/setting-management/src/lib/components/index.ts delete mode 100644 npm/ng-packs/packages/setting-management/src/lib/components/services/initial.service.ts create mode 100644 npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.html create mode 100644 npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.ts delete mode 100644 npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.html delete mode 100644 npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.ts create mode 100644 npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/index.ts b/npm/ng-packs/packages/setting-management/src/lib/components/index.ts deleted file mode 100644 index 4f59d5c056..0000000000 --- a/npm/ng-packs/packages/setting-management/src/lib/components/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './setting/setting.component'; diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/services/initial.service.ts b/npm/ng-packs/packages/setting-management/src/lib/components/services/initial.service.ts deleted file mode 100644 index 44f289a362..0000000000 --- a/npm/ng-packs/packages/setting-management/src/lib/components/services/initial.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { SettingTab } from '@abp/ng.theme.shared'; -import { Injectable, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import snq from 'snq'; - -@Injectable() -export class InitialService { - public settings: SettingTab[]; - - constructor(private router: Router) { - this.settings = this.router.config - .map(route => snq(() => route.data.routes.settings)) - .filter(settings => settings && settings.length) - .reduce((acc, val) => [...acc, ...val], []) - .sort((a, b) => a.order - b.order); - } -} diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.html b/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.html new file mode 100644 index 0000000000..8465f75e65 --- /dev/null +++ b/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.html @@ -0,0 +1,59 @@ +
+
+

{{ 'AbpSettingManagement::Settings' | abpLocalization }}

+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+

{{ settingManagementService.selected.name | abpLocalization }}

+
+ +
+
+
+
+
+
+
diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.ts b/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.ts new file mode 100644 index 0000000000..3096a2104b --- /dev/null +++ b/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.ts @@ -0,0 +1,37 @@ +import { eLayoutType } from '@abp/ng.core'; +import { SettingTab } from '@abp/ng.theme.shared'; +import { Component, TrackByFunction } from '@angular/core'; +import { Router } from '@angular/router'; +import { timer } from 'rxjs'; +import { SettingManagementService } from '../services/setting-management.service'; + +@Component({ + selector: 'abp-setting-layout', + templateUrl: './setting-layout.component.html', +}) +export class SettingLayoutComponent { + // required for dynamic component + static type = eLayoutType.setting; + + trackByFn: TrackByFunction = (_, item) => item.name; + + constructor(public settingManagementService: SettingManagementService, private router: Router) { + if ( + settingManagementService.selected && + this.router.url !== settingManagementService.selected.url && + settingManagementService.settings.length + ) { + settingManagementService.setSelected(settingManagementService.settings[0]); + } + } + + ngOnDestroy() {} + + ngAfterViewInit() { + timer(250).subscribe(() => { + if (!this.settingManagementService.settings.length) { + this.settingManagementService.setSettings(); + } + }); + } +} diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.html b/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.html deleted file mode 100644 index 6397e17a1f..0000000000 --- a/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.html +++ /dev/null @@ -1,51 +0,0 @@ -
-
-

{{ 'AbpSettingManagement::Settings' | abpLocalization }}

-
- -
-
-
-
- -
-
-
-
- -
-
-
-

{{ selected.name | abpLocalization }}

-
- - -
-
-
-
-
-
-
diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.ts b/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.ts deleted file mode 100644 index 645f7e2c2c..0000000000 --- a/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { SettingTab, fade } from '@abp/ng.theme.shared'; -import { InitialService } from '../services/initial.service'; - -@Component({ - selector: 'abp-setting', - templateUrl: './setting.component.html', -}) -export class SettingComponent implements OnInit { - settings: SettingTab[]; - - selected = {} as SettingTab; - - constructor(private initialService: InitialService) {} - - ngOnInit() { - this.settings = this.initialService.settings; - this.selected = this.settings[0]; - } -} diff --git a/npm/ng-packs/packages/setting-management/src/lib/constants/routes.ts b/npm/ng-packs/packages/setting-management/src/lib/constants/routes.ts index 067f8e9c02..3f47c95eb7 100644 --- a/npm/ng-packs/packages/setting-management/src/lib/constants/routes.ts +++ b/npm/ng-packs/packages/setting-management/src/lib/constants/routes.ts @@ -11,5 +11,4 @@ export const SETTING_MANAGEMENT_ROUTES = { iconClass: 'fa fa-cog', }, ] as ABP.FullRoute[], - settings: [], }; diff --git a/npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts b/npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts new file mode 100644 index 0000000000..141ce3a03d --- /dev/null +++ b/npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts @@ -0,0 +1,53 @@ +import { SettingTab } from '@abp/ng.theme.shared'; +import { Injectable } from '@angular/core'; +import { Router, RouteConfigLoadEnd, NavigationEnd } from '@angular/router'; +import { Navigate } from '@ngxs/router-plugin'; +import { Store } from '@ngxs/store'; +import { filter } from 'rxjs/operators'; +import { takeUntilDestroy } from '@abp/ng.core'; +import { Subscription, timer } from 'rxjs'; + +@Injectable({ providedIn: 'root' }) +export class SettingManagementService { + settings: SettingTab[] = []; + + selected = {} as SettingTab; + + constructor(private router: Router, private store: Store) { + let timeout: Subscription; + this.router.events + .pipe( + filter(event => event instanceof RouteConfigLoadEnd), + takeUntilDestroy(this), + ) + .subscribe(event => { + if (timeout) timeout.unsubscribe(); + timeout = timer(150).subscribe(() => { + this.setSettings(); + }); + }); + } + + ngOnDestroy() {} + + setSettings() { + setTimeout(() => { + const route = this.router.config.find(r => r.path === 'setting-management'); + this.settings = route.data.settings.sort((a, b) => a.order - b.order); + this.checkSelected(); + }, 0); + } + + checkSelected() { + this.selected = this.settings.find(setting => setting.url === this.router.url) || ({} as SettingTab); + + if (!this.selected.name && this.settings.length) { + this.setSelected(this.settings[0]); + } + } + + setSelected(selected: SettingTab) { + this.selected = selected; + this.store.dispatch(new Navigate([selected.url])); + } +} diff --git a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts index dcafc14f41..e401df16de 100644 --- a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts +++ b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts @@ -1,13 +1,15 @@ import { DynamicLayoutComponent } from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { SettingComponent } from './components/setting/setting.component'; +import { SETTING_MANAGEMENT_ROUTES } from './constants/routes'; +import { SettingLayoutComponent } from './components/setting-layout.component'; const routes: Routes = [ { - path: '', + path: 'setting-management', component: DynamicLayoutComponent, - children: [{ path: '', component: SettingComponent }], + children: [{ path: '', component: SettingLayoutComponent }], + data: { routes: SETTING_MANAGEMENT_ROUTES, settings: [] }, }, ]; diff --git a/npm/ng-packs/packages/setting-management/src/lib/setting-management.module.ts b/npm/ng-packs/packages/setting-management/src/lib/setting-management.module.ts index 6c0918788c..b3959e6650 100644 --- a/npm/ng-packs/packages/setting-management/src/lib/setting-management.module.ts +++ b/npm/ng-packs/packages/setting-management/src/lib/setting-management.module.ts @@ -1,15 +1,14 @@ -import { CoreModule, noop } from '@abp/ng.core'; -import { NgModule, ModuleWithProviders, APP_INITIALIZER, Self } from '@angular/core'; -import { SettingComponent } from './components/setting/setting.component'; -import { SettingManagementRoutingModule } from './setting-management-routing.module'; +import { CoreModule } from '@abp/ng.core'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; -import { InitialService } from './components/services/initial.service'; +import { NgModule } from '@angular/core'; +import { SettingLayoutComponent } from './components/setting-layout.component'; +import { SettingManagementRoutingModule } from './setting-management-routing.module'; + +export const SETTING_LAYOUT = SettingLayoutComponent; @NgModule({ - declarations: [SettingComponent], + declarations: [SETTING_LAYOUT], imports: [SettingManagementRoutingModule, CoreModule, ThemeSharedModule], - providers: [InitialService], + entryComponents: [SETTING_LAYOUT], }) -export class SettingManagementModule { - constructor(@Self() initialService: InitialService) {} -} +export class SettingManagementModule {} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts index 68bd0335a5..1b8c36412e 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts @@ -1,8 +1,6 @@ -import { Type } from '@angular/core'; - export interface SettingTab { name: string; order: number; - component: Type; requiredPolicy?: string; + url?: string; } diff --git a/npm/ng-packs/tsconfig.json b/npm/ng-packs/tsconfig.json index 9c996dd271..d503c81439 100644 --- a/npm/ng-packs/tsconfig.json +++ b/npm/ng-packs/tsconfig.json @@ -11,8 +11,13 @@ "moduleResolution": "node", "importHelpers": true, "target": "es2015", - "typeRoots": ["node_modules/@types"], - "lib": ["es2018", "dom"], + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ], "paths": {} }, "angularCompilerOptions": { From b46ce09a1a153cf8308c4a705b5a180f36fd42fd Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 10 Sep 2019 13:55:34 +0300 Subject: [PATCH 10/10] Update IdentityResourceDataSeeder.cs --- .../IdentityResources/IdentityResourceDataSeeder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceDataSeeder.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceDataSeeder.cs index 362fef9ae1..024f8bea13 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceDataSeeder.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceDataSeeder.cs @@ -46,7 +46,7 @@ namespace Volo.Abp.IdentityServer.IdentityResources protected virtual async Task AddIdentityResourceIfNotExistsAsync(IdentityServer4.Models.IdentityResource resource) { - if (await IdentityResourceRepository.FindByNameAsync(resource.Name) != null) + if (await IdentityResourceRepository.CheckNameExistAsync(resource.Name)) { return; }