From eb6971b50194f4785bcbe3a342ca31b0bfbba960 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Tue, 20 Dec 2022 13:01:25 +0300 Subject: [PATCH 1/3] run change detection with queue manager in permission directive add simple queue manager resolves #15167 --- .../packages/core/src/lib/core.module.ts | 6 ++ .../lib/directives/permission.directive.ts | 6 +- .../packages/core/src/lib/tokens/index.ts | 1 + .../core/src/lib/tokens/queue.token.ts | 4 ++ .../packages/core/src/lib/utils/index.ts | 1 + .../packages/core/src/lib/utils/queue.ts | 48 ++++++++++++++++ .../appsettings.json | 56 +++++++++---------- .../appsettings.json | 34 +++++------ 8 files changed, 110 insertions(+), 46 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tokens/queue.token.ts create mode 100644 npm/ng-packs/packages/core/src/lib/utils/queue.ts 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 4bf3fae3a1..298e3c5352 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -38,6 +38,8 @@ import { ShortDateTimePipe } from './pipes/short-date-time.pipe'; import { ShortTimePipe } from './pipes/short-time.pipe'; import { ShortDatePipe } from './pipes/short-date.pipe'; import { TimeoutLimitedOAuthService } from './services/timeout-limited-oauth.service'; +import { QUEUE_MANAGER } from './tokens/queue.token'; +import { DefaultQueueManager } from './utils/queue'; export function storageFactory(): OAuthStorage { return oAuthStorage; @@ -193,6 +195,10 @@ export class CoreModule { useValue: localizationContributor(options.localizations), deps: [LocalizationService], }, + { + provide: QUEUE_MANAGER, + useClass: DefaultQueueManager, + }, ], }; } diff --git a/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts index e06c6d404c..f277bf50ee 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts @@ -2,6 +2,7 @@ import { AfterViewInit, ChangeDetectorRef, Directive, + Inject, Input, OnChanges, OnDestroy, @@ -12,6 +13,8 @@ import { import { ReplaySubject, Subscription } from 'rxjs'; import { distinctUntilChanged, take } from 'rxjs/operators'; import { PermissionService } from '../services/permission.service'; +import { QUEUE_MANAGER } from '../tokens/queue.token'; +import { QueueManager } from '../utils/queue'; @Directive({ selector: '[abpPermission]', @@ -32,6 +35,7 @@ export class PermissionDirective implements OnDestroy, OnChanges, AfterViewInit private vcRef: ViewContainerRef, private permissionService: PermissionService, private cdRef: ChangeDetectorRef, + @Inject(QUEUE_MANAGER) public queue: QueueManager, ) {} private check() { @@ -66,7 +70,7 @@ export class PermissionDirective implements OnDestroy, OnChanges, AfterViewInit } ngAfterViewInit() { - this.cdrSubject.pipe(take(1)).subscribe(() => this.cdRef.detectChanges()); + this.cdrSubject.pipe(take(1)).subscribe(() => this.queue.add(() => this.cdRef.detectChanges())); this.rendered = true; } } diff --git a/npm/ng-packs/packages/core/src/lib/tokens/index.ts b/npm/ng-packs/packages/core/src/lib/tokens/index.ts index da1ea9bdad..98985107f3 100644 --- a/npm/ng-packs/packages/core/src/lib/tokens/index.ts +++ b/npm/ng-packs/packages/core/src/lib/tokens/index.ts @@ -5,4 +5,5 @@ export * from './localization.token'; export * from './lodaer-delay.token'; export * from './manage-profile.token'; export * from './options.token'; +export * from './queue.token'; export * from './tenant-key.token'; diff --git a/npm/ng-packs/packages/core/src/lib/tokens/queue.token.ts b/npm/ng-packs/packages/core/src/lib/tokens/queue.token.ts new file mode 100644 index 0000000000..66c0efa7d6 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tokens/queue.token.ts @@ -0,0 +1,4 @@ +import { QueueManager } from "../utils/queue"; +import { InjectionToken } from "@angular/core"; + +export const QUEUE_MANAGER = new InjectionToken("QUEUE_MANAGER"); diff --git a/npm/ng-packs/packages/core/src/lib/utils/index.ts b/npm/ng-packs/packages/core/src/lib/utils/index.ts index 56378f664f..1e218e0619 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/index.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/index.ts @@ -15,6 +15,7 @@ export * from './localization-utils'; export * from './multi-tenancy-utils'; export * from './number-utils'; export * from './object-utils'; +export * from './queue'; export * from './route-utils'; export * from './string-utils'; export * from './tree-utils'; diff --git a/npm/ng-packs/packages/core/src/lib/utils/queue.ts b/npm/ng-packs/packages/core/src/lib/utils/queue.ts new file mode 100644 index 0000000000..33525d83e1 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/utils/queue.ts @@ -0,0 +1,48 @@ +export interface QueueManager { + add(fn: () => void): void; + init(interval: number, stackSize: number): void; +} + +export class DefaultQueueManager implements QueueManager { + private queue: Array<() => void> = []; + private isRunning = false; + private stack = 0; + private interval = 0; + private stackSize = 100; + + public init(interval: number, stackSize: number) { + this.interval = interval; + this.stackSize = stackSize; + } + + public add(fn: () => void) { + this.queue.push(fn); + this.run(); + } + + private run() { + if (this.isRunning) return; + this.stack++; + + this.isRunning = true; + + const fn = this.queue.shift(); + + if (!fn) { + this.isRunning = false; + return; + } + + fn(); + if (this.stack > this.stackSize) { + setTimeout(() => { + this.isRunning = false; + this.run(); + this.stack = 0; + }, this.interval); + } else { + this.isRunning = false; + this.run(); + } + } +} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json index 3d7dc2a8be..04f12e5484 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json @@ -1,31 +1,31 @@ { - "ConnectionStrings": { - "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" - }, - "OpenIddict": { - "Applications": { - "MyProjectName_Web": { - "ClientId": "MyProjectName_Web", - "ClientSecret": "1q2w3e*", - "RootUrl": "https://localhost:44302" - }, - "MyProjectName_Blazor": { - "ClientId": "MyProjectName_Blazor", - "RootUrl": "https://localhost:44307" - }, - "MyProjectName_App": { - "ClientId": "MyProjectName_App", - "RootUrl": "http://localhost:4200" - }, - "MyProjectName_BlazorServerTiered": { - "ClientId": "MyProjectName_BlazorServerTiered", - "ClientSecret": "1q2w3e*", - "RootUrl": "https://localhost:44309" - }, - "MyProjectName_Swagger": { - "ClientId": "MyProjectName_Swagger", - "RootUrl": "https://localhost:44305" - } + "ConnectionStrings": { + "Default": "Server=localhost;Database=MyProjectNameHOossos;User Id=sa;password=myPassw0rd;MultipleActiveResultSets=true" + }, + "OpenIddict": { + "Applications": { + "MyProjectName_Web": { + "ClientId": "MyProjectName_Web", + "ClientSecret": "1q2w3e*", + "RootUrl": "https://localhost:44302" + }, + "MyProjectName_Blazor": { + "ClientId": "MyProjectName_Blazor", + "RootUrl": "https://localhost:44307" + }, + "MyProjectName_App": { + "ClientId": "MyProjectName_App", + "RootUrl": "http://localhost:4200" + }, + "MyProjectName_BlazorServerTiered": { + "ClientId": "MyProjectName_BlazorServerTiered", + "ClientSecret": "1q2w3e*", + "RootUrl": "https://localhost:44309" + }, + "MyProjectName_Swagger": { + "ClientId": "MyProjectName_Swagger", + "RootUrl": "https://localhost:44305" + } + } } - } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json index 3fc189b8ae..12c37d0cff 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json @@ -1,19 +1,19 @@ { - "App": { - "SelfUrl": "https://localhost:44305", - "ClientUrl": "http://localhost:4200", - "CorsOrigins": "https://*.MyProjectName.com,http://localhost:4200,https://localhost:44307", - "RedirectAllowedUrls": "http://localhost:4200,https://localhost:44307" - }, - "ConnectionStrings": { - "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" - }, - "AuthServer": { - "Authority": "https://localhost:44305", - "RequireHttpsMetadata": "false", - "SwaggerClientId": "MyProjectName_Swagger" - }, - "StringEncryption": { - "DefaultPassPhrase": "gsKnGZ041HLL4IM8" - } + "App": { + "SelfUrl": "https://localhost:44305", + "ClientUrl": "http://localhost:4200", + "CorsOrigins": "https://*.MyProjectName.com,http://localhost:4200,https://localhost:44307", + "RedirectAllowedUrls": "http://localhost:4200,https://localhost:44307" + }, + "ConnectionStrings": { + "Default": "Server=localhost;Database=MyProjectNameHOossos;User Id=sa;password=myPassw0rd;MultipleActiveResultSets=true" + }, + "AuthServer": { + "Authority": "https://localhost:44305", + "RequireHttpsMetadata": "false", + "SwaggerClientId": "MyProjectName_Swagger" + }, + "StringEncryption": { + "DefaultPassPhrase": "gsKnGZ041HLL4IM8" + } } From 512759e550a4e4c0734b529cc8802f4530ce4475 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Mon, 26 Dec 2022 14:08:59 +0300 Subject: [PATCH 2/3] revert app setting changes --- .../src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json | 2 +- .../appsettings.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json index 04f12e5484..bec0d89991 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "Default": "Server=localhost;Database=MyProjectNameHOossos;User Id=sa;password=myPassw0rd;MultipleActiveResultSets=true" + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" }, "OpenIddict": { "Applications": { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json index 12c37d0cff..3729acf852 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json @@ -6,7 +6,7 @@ "RedirectAllowedUrls": "http://localhost:4200,https://localhost:44307" }, "ConnectionStrings": { - "Default": "Server=localhost;Database=MyProjectNameHOossos;User Id=sa;password=myPassw0rd;MultipleActiveResultSets=true" + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" }, "AuthServer": { "Authority": "https://localhost:44305", From 124747cd0c667c491e16422399d7357ce88f0802 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Tue, 27 Dec 2022 09:26:15 +0300 Subject: [PATCH 3/3] revert app setting changes --- .../appsettings.json | 56 +++++++++---------- .../appsettings.json | 34 +++++------ 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json index bec0d89991..3d7dc2a8be 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json @@ -1,31 +1,31 @@ { - "ConnectionStrings": { - "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" - }, - "OpenIddict": { - "Applications": { - "MyProjectName_Web": { - "ClientId": "MyProjectName_Web", - "ClientSecret": "1q2w3e*", - "RootUrl": "https://localhost:44302" - }, - "MyProjectName_Blazor": { - "ClientId": "MyProjectName_Blazor", - "RootUrl": "https://localhost:44307" - }, - "MyProjectName_App": { - "ClientId": "MyProjectName_App", - "RootUrl": "http://localhost:4200" - }, - "MyProjectName_BlazorServerTiered": { - "ClientId": "MyProjectName_BlazorServerTiered", - "ClientSecret": "1q2w3e*", - "RootUrl": "https://localhost:44309" - }, - "MyProjectName_Swagger": { - "ClientId": "MyProjectName_Swagger", - "RootUrl": "https://localhost:44305" - } - } + "ConnectionStrings": { + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" + }, + "OpenIddict": { + "Applications": { + "MyProjectName_Web": { + "ClientId": "MyProjectName_Web", + "ClientSecret": "1q2w3e*", + "RootUrl": "https://localhost:44302" + }, + "MyProjectName_Blazor": { + "ClientId": "MyProjectName_Blazor", + "RootUrl": "https://localhost:44307" + }, + "MyProjectName_App": { + "ClientId": "MyProjectName_App", + "RootUrl": "http://localhost:4200" + }, + "MyProjectName_BlazorServerTiered": { + "ClientId": "MyProjectName_BlazorServerTiered", + "ClientSecret": "1q2w3e*", + "RootUrl": "https://localhost:44309" + }, + "MyProjectName_Swagger": { + "ClientId": "MyProjectName_Swagger", + "RootUrl": "https://localhost:44305" + } } + } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json index 3729acf852..3fc189b8ae 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json @@ -1,19 +1,19 @@ { - "App": { - "SelfUrl": "https://localhost:44305", - "ClientUrl": "http://localhost:4200", - "CorsOrigins": "https://*.MyProjectName.com,http://localhost:4200,https://localhost:44307", - "RedirectAllowedUrls": "http://localhost:4200,https://localhost:44307" - }, - "ConnectionStrings": { - "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" - }, - "AuthServer": { - "Authority": "https://localhost:44305", - "RequireHttpsMetadata": "false", - "SwaggerClientId": "MyProjectName_Swagger" - }, - "StringEncryption": { - "DefaultPassPhrase": "gsKnGZ041HLL4IM8" - } + "App": { + "SelfUrl": "https://localhost:44305", + "ClientUrl": "http://localhost:4200", + "CorsOrigins": "https://*.MyProjectName.com,http://localhost:4200,https://localhost:44307", + "RedirectAllowedUrls": "http://localhost:4200,https://localhost:44307" + }, + "ConnectionStrings": { + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" + }, + "AuthServer": { + "Authority": "https://localhost:44305", + "RequireHttpsMetadata": "false", + "SwaggerClientId": "MyProjectName_Swagger" + }, + "StringEncryption": { + "DefaultPassPhrase": "gsKnGZ041HLL4IM8" + } }