From d6acbffe79aa6885d6f4fbcbf61be5eca0cd607b Mon Sep 17 00:00:00 2001 From: sumeyye Date: Mon, 15 Jun 2026 16:31:58 +0300 Subject: [PATCH] update: core package for the latest upgrade (state management and html properties) --- npm/ng-packs/packages/core/project.json | 2 +- .../components/dynamic-layout.component.ts | 47 ++++++------------- .../core/src/lib/guards/permission.guard.ts | 10 +++- .../src/lib/strategies/projection.strategy.ts | 31 ++++++------ .../testing/src/lib/core-testing.module.ts | 4 +- 5 files changed, 40 insertions(+), 54 deletions(-) diff --git a/npm/ng-packs/packages/core/project.json b/npm/ng-packs/packages/core/project.json index 69bbb4f572..e3c7c58737 100644 --- a/npm/ng-packs/packages/core/project.json +++ b/npm/ng-packs/packages/core/project.json @@ -30,7 +30,7 @@ "executor": "@nx/vitest:test", "outputs": ["{options.reportsDirectory}"], "options": { - "reportsDirectory": "../../coverage/packages/core" + "reportsDirectory": "{projectRoot}/../../coverage/packages/core" } } } 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 8d6b5f3992..4e2f3d46b0 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,32 +1,29 @@ -import { - Component, - inject, - input, - isDevMode, - Type, -} from '@angular/core'; +import { Component, inject, input, isDevMode, Type } from '@angular/core'; +import { NgComponentOutlet } from '@angular/common'; import { ActivatedRoute, Router } from '@angular/router'; +import { startWith } from 'rxjs/operators'; + import { eLayoutType } from '../enums/common'; import { ABP } from '../models'; import { ReplaceableComponents } from '../models/replaceable-components'; + import { LocalizationService } from '../services/localization.service'; import { ReplaceableComponentsService } from '../services/replaceable-components.service'; import { RouterEvents } from '../services/router-events.service'; import { RoutesService } from '../services/routes.service'; import { SubscriptionService } from '../services/subscription.service'; + import { RouteBasedCultureUrlService } from '../services/route-based-culture-url.service'; import { findRoute } from '../utils/route-utils'; import { TreeNode } from '../utils/tree-utils'; + import { DYNAMIC_LAYOUTS_TOKEN } from '../tokens/dynamic-layout.token'; -import { EnvironmentService } from '../services'; -import { NgComponentOutlet } from '@angular/common'; -import { filter, take } from 'rxjs'; @Component({ selector: 'abp-dynamic-layout', template: ` @if (isLayoutVisible) { - + } `, providers: [SubscriptionService], @@ -46,24 +43,25 @@ export class DynamicLayoutComponent { protected readonly replaceableComponents = inject(ReplaceableComponentsService); protected readonly subscription = inject(SubscriptionService); protected readonly routerEvents = inject(RouterEvents); - protected readonly environment = inject(EnvironmentService); protected readonly routeCultureUrl = inject(RouteBasedCultureUrlService); constructor() { - const dynamicLayoutComponent = inject(DynamicLayoutComponent, { optional: true, skipSelf: true }); + const dynamicLayoutComponent = inject(DynamicLayoutComponent, { + optional: true, + skipSelf: true, + }); if (dynamicLayoutComponent) { if (isDevMode()) console.warn('DynamicLayoutComponent must be used only in AppComponent.'); return; } - this.checkLayoutOnNavigationEnd(); + this.listenToLayoutChanges(); this.listenToLanguageChange(); - this.listenToEnvironmentChange(); } - private checkLayoutOnNavigationEnd() { + private listenToLayoutChanges() { const navigationEnd$ = this.routerEvents.getNavigationEvents('End'); - this.subscription.addOne(navigationEnd$, () => this.getLayout()); + this.subscription.addOne(navigationEnd$.pipe(startWith(null)), () => this.getLayout()); } private getLayout() { @@ -120,19 +118,4 @@ export class DynamicLayoutComponent { private getComponent(key: string): ReplaceableComponents.ReplaceableComponent | undefined { return this.replaceableComponents.get(key); } - - private listenToEnvironmentChange() { - this.environment - .createOnUpdateStream(x => x.oAuthConfig) - .pipe( - take(1), - filter(config => config.responseType === 'code'), - ) - .subscribe(() => { - if (this.layout) { - return; - } - this.getLayout(); - }); - } } diff --git a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts index a6ae040597..e201390501 100644 --- a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts +++ b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts @@ -34,7 +34,10 @@ export class PermissionGuard implements IAbpGuard { protected readonly configStateService = inject(ConfigStateService); protected readonly routeCultureUrl = inject(RouteBasedCultureUrlService); - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + canActivate( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, + ): Observable { let { requiredPolicy } = route.data || {}; if (!requiredPolicy) { @@ -86,7 +89,10 @@ export const permissionGuard: CanActivateFn = ( let { requiredPolicy } = route.data || {}; if (!requiredPolicy) { - const routeFound = findRoute(routesService, routeCultureUrl.getRoutePathForMatching(router, state.url)); + const routeFound = findRoute( + routesService, + routeCultureUrl.getRoutePathForMatching(router, state.url), + ); requiredPolicy = routeFound?.requiredPolicy; } diff --git a/npm/ng-packs/packages/core/src/lib/strategies/projection.strategy.ts b/npm/ng-packs/packages/core/src/lib/strategies/projection.strategy.ts index bc7c9201fd..e893bb50b1 100644 --- a/npm/ng-packs/packages/core/src/lib/strategies/projection.strategy.ts +++ b/npm/ng-packs/packages/core/src/lib/strategies/projection.strategy.ts @@ -1,7 +1,7 @@ import { ApplicationRef, - ComponentFactoryResolver, ComponentRef, + createComponent, EmbeddedViewRef, Injector, TemplateRef, @@ -31,14 +31,10 @@ export class ComponentProjectionStrategy> extends Projection injectContent(injector: Injector) { this.containerStrategy.prepare(); - const resolver = injector.get(ComponentFactoryResolver) as ComponentFactoryResolver; - const factory = resolver.resolveComponentFactory>(this.content); - - const componentRef = this.containerStrategy.containerRef.createComponent( - factory, - this.containerStrategy.getIndex(), + const componentRef = this.containerStrategy.containerRef.createComponent(this.content, { + index: this.containerStrategy.getIndex(), injector, - ); + }); this.contextStrategy.setContext(componentRef); return componentRef as ComponentRefOrEmbeddedViewRef; @@ -56,10 +52,10 @@ export class RootComponentProjectionStrategy> extends Projec injectContent(injector: Injector) { const appRef = injector.get(ApplicationRef); - const resolver = injector.get(ComponentFactoryResolver) as ComponentFactoryResolver; - const componentRef = resolver - .resolveComponentFactory>(this.content) - .create(injector); + const componentRef = createComponent(this.content, { + environmentInjector: appRef.injector, + elementInjector: injector, + }); this.contextStrategy.setContext(componentRef); @@ -172,8 +168,9 @@ export const PROJECTION_STRATEGY = { }, }; -type ComponentRefOrEmbeddedViewRef = T extends Type - ? ComponentRef - : T extends TemplateRef - ? EmbeddedViewRef - : never; +type ComponentRefOrEmbeddedViewRef = + T extends Type + ? ComponentRef + : T extends TemplateRef + ? EmbeddedViewRef + : never; diff --git a/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts b/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts index 8f077fa628..4d87de1aac 100644 --- a/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts +++ b/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts @@ -15,7 +15,7 @@ import { import { APP_BASE_HREF } from '@angular/common'; import { ModuleWithProviders, NgModule } from '@angular/core'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { provideRoutes } from '@angular/router'; +import { provideRouter } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { MockPermissionService } from './services/mock-permission.service'; import { MockRestService } from './services/mock-rest.service'; @@ -77,7 +77,7 @@ export class CoreTestingModule { provide: SORT_COMPARE_FUNC, useFactory: compareFuncFactory, }, - provideRoutes(routes), + provideRouter(routes), ], }; }