@@ -21,6 +21,7 @@ import { combineLatest, Subscription, timer } from 'rxjs';
`,
styleUrls: ['./loader-bar.component.scss'],
providers: [SubscriptionService],
+ imports: [CommonModule],
})
export class LoaderBarComponent implements OnDestroy, OnInit {
protected _isLoading!: boolean;
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/loading/loading.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/loading/loading.component.ts
index 56990be1bc..7c4b35c6fa 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/components/loading/loading.component.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/loading/loading.component.ts
@@ -1,7 +1,6 @@
import { Component, ViewEncapsulation } from '@angular/core';
@Component({
- standalone: false,
selector: 'abp-loading',
template: `
@@ -33,5 +32,6 @@ import { Component, ViewEncapsulation } from '@angular/core';
}
`,
],
+ imports: [],
})
export class LoadingComponent {}
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-close.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-close.directive.ts
index 8b50174fd9..96455d1151 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-close.directive.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-close.directive.ts
@@ -2,7 +2,6 @@ import { Directive, HostListener, Optional } from '@angular/core';
import { ModalComponent } from './modal.component';
@Directive({
- standalone: false,
selector: '[abpClose]',
})
export class ModalCloseDirective {
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 30c802e387..3ac175ae6c 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
@@ -1,4 +1,3 @@
-import { SubscriptionService, uuid } from '@abp/ng.core';
import {
Component,
DestroyRef,
@@ -13,12 +12,14 @@ import {
output,
viewChild,
} from '@angular/core';
+import { CommonModule } from '@angular/common';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
+import { SubscriptionService, uuid } from '@abp/ng.core';
import { NgbModal, NgbModalOptions, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
import { fromEvent } from 'rxjs';
import { debounceTime, filter } from 'rxjs/operators';
-import { Confirmation } from '../../models/confirmation';
-import { ConfirmationService } from '../../services/confirmation.service';
+import { Confirmation } from '../../models';
+import { ConfirmationService } from '../../services';
import { SUPPRESS_UNSAVED_CHANGES_WARNING } from '../../tokens/suppress-unsaved-changes-warning.token';
import { ButtonComponent } from '../button/button.component';
import { DismissableModal, ModalDismissMode, ModalRefService } from './modal-ref.service';
@@ -26,11 +27,11 @@ import { DismissableModal, ModalDismissMode, ModalRefService } from './modal-ref
export type ModalSize = 'sm' | 'md' | 'lg' | 'xl';
@Component({
- standalone: false,
selector: 'abp-modal',
templateUrl: './modal.component.html',
styleUrls: ['./modal.component.scss'],
providers: [SubscriptionService],
+ imports: [CommonModule],
})
export class ModalComponent implements OnInit, OnDestroy, DismissableModal {
protected readonly confirmationService = inject(ConfirmationService);
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts
index cfdc080f5b..a6e670db0b 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts
@@ -1,7 +1,8 @@
import { Component, forwardRef, Input } from '@angular/core';
-import { AbstractNgModelComponent } from '@abp/ng.core';
-import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
+import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
+import { AbstractNgModelComponent } from '@abp/ng.core';
+import { NgxValidateCoreModule } from '@ngx-validate/core';
/**
* @deprecated use ShowPasswordDirective directive
@@ -9,7 +10,7 @@ import { CommonModule } from '@angular/common';
*/
@Component({
selector: 'abp-password',
- imports: [CommonModule, FormsModule],
+ imports: [CommonModule, FormsModule, ReactiveFormsModule, NgxValidateCoreModule],
templateUrl: `./password.component.html`,
providers: [
{
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/spinner/spinner.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/spinner/spinner.component.ts
index e1d3493261..4847d15652 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/components/spinner/spinner.component.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/spinner/spinner.component.ts
@@ -2,7 +2,6 @@ import { Component } from '@angular/core';
@Component({
selector: 'abp-spinner',
- standalone: true,
template: `
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts
index 4703a41c17..aca2149f8b 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts
@@ -2,13 +2,14 @@ import { Component, HostListener, Input, OnInit } from '@angular/core';
import { ReplaySubject } from 'rxjs';
import { toastInOut } from '../../animations/toast.animations';
import { Toaster } from '../../models/toaster';
+import { ToastComponent } from '../toast/toast.component';
@Component({
- standalone: false,
selector: 'abp-toast-container',
templateUrl: './toast-container.component.html',
styleUrls: ['./toast-container.component.scss'],
animations: [toastInOut],
+ imports: [ToastComponent],
})
export class ToastContainerComponent implements OnInit {
toasts$!: ReplaySubject
;
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts
index d76790bf54..8bb1a7126e 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts
@@ -1,10 +1,13 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import { CommonModule } from '@angular/common';
import { Toaster } from '../../models/toaster';
+import { LocalizationPipe } from '@abp/ng.core';
+
@Component({
- standalone: false,
selector: 'abp-toast',
templateUrl: './toast.component.html',
styleUrls: ['./toast.component.scss'],
+ imports: [CommonModule, LocalizationPipe],
})
export class ToastComponent implements OnInit {
@Input()
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/disabled.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/disabled.directive.ts
index 8832280dee..c0a1a74995 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/directives/disabled.directive.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/disabled.directive.ts
@@ -3,7 +3,6 @@ import { NgControl } from '@angular/forms';
@Directive({
selector: '[abpDisabled]',
- standalone:true,
})
export class DisabledDirective implements OnChanges {
@Input()
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/ellipsis.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/ellipsis.directive.ts
index 2cad957942..94d963ce2e 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/directives/ellipsis.directive.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/ellipsis.directive.ts
@@ -10,7 +10,6 @@ import {
@Directive({
selector: '[abpEllipsis]',
- standalone:true
})
export class EllipsisDirective implements AfterViewInit {
@Input('abpEllipsis')
@@ -38,7 +37,10 @@ export class EllipsisDirective implements AfterViewInit {
return this.enabled && this.width ? this.width || '170px' : undefined;
}
- constructor(private cdRef: ChangeDetectorRef, private elRef: ElementRef) {}
+ constructor(
+ private cdRef: ChangeDetectorRef,
+ private elRef: ElementRef,
+ ) {}
ngAfterViewInit() {
this.title = this.title || (this.elRef.nativeElement as HTMLElement).innerText;
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/loading.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/loading.directive.ts
index e20ef4fa02..9de000e15f 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/directives/loading.directive.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/loading.directive.ts
@@ -14,10 +14,9 @@ import {
} from '@angular/core';
import { Subscription, timer } from 'rxjs';
import { take } from 'rxjs/operators';
-import { LoadingComponent } from '../components/loading/loading.component';
+import { LoadingComponent } from '../components';
@Directive({
- standalone: false,
selector: '[abpLoading]',
})
export class LoadingDirective implements OnInit, OnDestroy {
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-default.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-default.directive.ts
index 359ca72b59..c7dc96f3c9 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-default.directive.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-default.directive.ts
@@ -7,10 +7,9 @@ import { debounceTime } from 'rxjs/operators';
@Directive({
// eslint-disable-next-line @angular-eslint/directive-selector
selector: 'ngx-datatable[default]',
- standalone: true,
exportAs: 'ngxDatatableDefault',
})
-export class NgxDatatableDefaultDirective implements AfterViewInit, OnDestroy {
+export class NgxDatatableDefaultDirective implements AfterViewInit, OnDestroy {
private subscription = new Subscription();
private resizeDiff = 0;
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts
index d50038b1b7..5715a4f40b 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts
@@ -24,7 +24,6 @@ import { SpinnerComponent } from '../components';
@Directive({
// eslint-disable-next-line @angular-eslint/directive-selector
selector: 'ngx-datatable[list]',
- standalone: true,
exportAs: 'ngxDatatableList',
})
export class NgxDatatableListDirective implements OnChanges, OnInit, DoCheck {
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts
index bcdd94a5d4..9613779472 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts
@@ -2,7 +2,6 @@ import { OnInit, Directive, OnDestroy, Input, ViewContainerRef, TemplateRef } fr
import { EMPTY, from, Observable, of, Subscription } from 'rxjs';
@Directive({
- standalone: true,
selector: '[abpVisible]',
})
export class AbpVisibleDirective implements OnDestroy, OnInit {
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts
index 40a1109de0..7f8010c839 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts
@@ -33,8 +33,14 @@ describe('BreadcrumbComponent', () => {
useFactory: () => mockRoutesService(),
},
],
- declarations: [LocalizationPipe, BreadcrumbComponent, BreadcrumbItemsComponent],
- imports: [RouterModule,HttpClientModule],
+ declarations: [],
+ imports: [
+ RouterModule,
+ HttpClientModule,
+ LocalizationPipe,
+ BreadcrumbComponent,
+ BreadcrumbItemsComponent,
+ ],
routes: [
{
path: '',
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/card.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/card.component.spec.ts
index a5c8a5c43b..1a03353565 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/tests/card.component.spec.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/card.component.spec.ts
@@ -15,7 +15,8 @@ describe('CardComponent', () => {
const createHost = createHostFactory({
component: CardComponent,
- declarations: [
+ declarations: [],
+ imports: [
CardHeaderComponent,
CardTitleDirective,
CardSubtitleDirective,
@@ -32,7 +33,7 @@ describe('CardComponent', () => {
Card title
- Card subtitle
+ Card subtitle
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts
index 587365e3f6..43b6ef11a9 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts
@@ -10,8 +10,8 @@ import { CONFIRMATION_ICONS, DEFAULT_CONFIRMATION_ICONS } from '../tokens/confir
@NgModule({
exports: [ConfirmationComponent],
- declarations: [ConfirmationComponent],
- imports: [CoreTestingModule.withConfig()],
+ declarations: [],
+ imports: [CoreTestingModule.withConfig(), ConfirmationComponent],
providers: [{ provide: CONFIRMATION_ICONS, useValue: DEFAULT_CONFIRMATION_ICONS }],
})
export class MockModule {}
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.component.spec.ts
index 5bde4d2a54..eef153e8d8 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.component.spec.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.component.spec.ts
@@ -9,7 +9,7 @@ describe('ErrorComponent', () => {
let spectator: SpectatorHost;
const createHost = createHostFactory({
component: HttpErrorWrapperComponent,
- declarations: [LocalizationPipe],
+ declarations: [],
mocks: [HttpClient],
providers: [
{ provide: CORE_OPTIONS, useValue: {} },
@@ -19,7 +19,7 @@ describe('ErrorComponent', () => {
useValue: { nativeElement: document.createElement('div') },
},
],
- imports:[HttpClientModule]
+ imports: [HttpClientModule, LocalizationPipe],
});
beforeEach(() => {
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts
index 8688572436..ede2bded2d 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts
@@ -10,15 +10,22 @@ import { HttpErrorWrapperComponent } from '../components/http-error-wrapper/http
import { ErrorHandler } from '../handlers';
import { DEFAULT_ERROR_LOCALIZATIONS, DEFAULT_ERROR_MESSAGES } from '../constants/default-errors';
import { ConfirmationService } from '../services';
-import { httpErrorConfigFactory } from '../tokens/http-error.token';
+import { CUSTOM_ERROR_HANDLERS, HTTP_ERROR_CONFIG } from '../tokens/http-error.token';
+import { CustomHttpErrorHandlerService } from '../models';
+
+const customHandlerMock: CustomHttpErrorHandlerService = {
+ priority: 100,
+ canHandle: jest.fn().mockReturnValue(true),
+ execute: jest.fn(),
+};
const reporter$ = new Subject();
@NgModule({
exports: [HttpErrorWrapperComponent],
- declarations: [HttpErrorWrapperComponent],
+ declarations: [],
//entryComponents: [HttpErrorWrapperComponent],
- imports: [CoreTestingModule],
+ imports: [CoreTestingModule, HttpErrorWrapperComponent],
})
class MockModule {}
@@ -46,16 +53,21 @@ describe('ErrorHandler', () => {
},
},
{ provide: APP_BASE_HREF, useValue: '/' },
- {
- provide: 'HTTP_ERROR_CONFIG',
- useFactory: httpErrorConfigFactory,
- },
{
provide: ConfirmationService,
useValue: {
error: errorConfirmation,
},
},
+ {
+ provide: CUSTOM_ERROR_HANDLERS,
+ useValue: customHandlerMock,
+ multi: true,
+ },
+ {
+ provide: HTTP_ERROR_CONFIG,
+ useFactory: () => ({}),
+ },
],
});
@@ -71,67 +83,26 @@ describe('ErrorHandler', () => {
});
test('should display HttpErrorWrapperComponent when server error occurs', () => {
- const createComponent = jest.spyOn(service, 'createErrorComponent');
const error = new HttpErrorResponse({ status: 500 });
- const params = {
- title: {
- key: DEFAULT_ERROR_LOCALIZATIONS.defaultError500.title,
- defaultValue: DEFAULT_ERROR_MESSAGES.defaultError500.title,
- },
- details: {
- key: DEFAULT_ERROR_LOCALIZATIONS.defaultError500.details,
- defaultValue: DEFAULT_ERROR_MESSAGES.defaultError500.details,
- },
- status: 500,
- };
expect(selectHtmlErrorWrapper()).toBeNull();
-
httpErrorReporter.reportError(error);
-
- expect(createComponent).toHaveBeenCalledWith(params);
+ expect(selectHtmlErrorWrapper()).not.toBeNull();
});
test('should display HttpErrorWrapperComponent when authorize error occurs', () => {
- const createComponent = jest.spyOn(service, 'createErrorComponent');
const error = new HttpErrorResponse({ status: 403 });
- const params = {
- title: {
- key: DEFAULT_ERROR_LOCALIZATIONS.defaultError403.title,
- defaultValue: DEFAULT_ERROR_MESSAGES.defaultError403.title,
- },
- details: {
- key: DEFAULT_ERROR_LOCALIZATIONS.defaultError403.details,
- defaultValue: DEFAULT_ERROR_MESSAGES.defaultError403.details,
- },
- status: 403,
- };
expect(selectHtmlErrorWrapper()).toBeNull();
-
httpErrorReporter.reportError(error);
-
- expect(createComponent).toHaveBeenCalledWith(params);
+ expect(selectHtmlErrorWrapper()).not.toBeNull();
});
test('should display HttpErrorWrapperComponent when unknown error occurs', () => {
- const createComponent = jest.spyOn(service, 'createErrorComponent');
- const error = new HttpErrorResponse({
- status: 0,
- statusText: 'Unknown Error',
- });
- const params = {
- title: {
- key: DEFAULT_ERROR_LOCALIZATIONS.defaultError.title,
- defaultValue: DEFAULT_ERROR_MESSAGES.defaultError.title,
- },
- details: error.message,
- isHomeShow: false,
- };
+ const error = new HttpErrorResponse({ status: 0 });
httpErrorReporter.reportError(error);
-
- expect(createComponent).toHaveBeenCalledWith(params);
+ expect(selectHtmlErrorWrapper()).not.toBeNull();
});
test('should call error method of ConfirmationService when not found error occurs', () => {
@@ -215,6 +186,15 @@ describe('ErrorHandler', () => {
CONFIRMATION_BUTTONS,
);
});
+
+ test('should delegate to CUSTOM_ERROR_HANDLERS and call execute if canHandle is true', () => {
+ const error = new HttpErrorResponse({ status: 418 });
+
+ httpErrorReporter.reportError(error);
+
+ expect(customHandlerMock.canHandle).toHaveBeenCalledWith(error);
+ expect(customHandlerMock.execute).toHaveBeenCalled();
+ });
});
@Component({
@@ -227,9 +207,9 @@ class DummyErrorComponent {
}
@NgModule({
- declarations: [DummyErrorComponent],
+ declarations: [],
exports: [DummyErrorComponent],
- entryComponents: [DummyErrorComponent],
+ imports: [DummyErrorComponent],
})
class ErrorModule {}
@@ -310,15 +290,6 @@ class ErrorModule {}
// });
// });
-export function customHttpErrorConfigFactory() {
- return httpErrorConfigFactory({
- errorScreen: {
- component: DummyErrorComponent,
- forWhichErrors: [401, 403, 404, 500],
- },
- });
-}
-
function removeIfExistsInDom(errorSelector: () => HTMLDivElement | null) {
const abpError = errorSelector();
if (abpError) abpError.parentNode.removeChild(abpError);
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/loading.directive.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/loading.directive.spec.ts
index b359a2000c..808419616b 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/tests/loading.directive.spec.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/loading.directive.spec.ts
@@ -14,8 +14,9 @@ describe('LoadingDirective', () => {
let spectator: SpectatorDirective;
const createDirective = createDirectiveFactory({
directive: LoadingDirective,
- declarations: [LoadingComponent, DummyComponent],
- entryComponents: [LoadingComponent],
+ declarations: [],
+ entryComponents: [],
+ imports: [LoadingComponent, DummyComponent],
});
describe('default', () => {
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.component.spec.ts
index 838d83d226..ebb50f3bb1 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.component.spec.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.component.spec.ts
@@ -18,8 +18,14 @@ describe('ModalComponent', () => {
let mockConfirmation$: Subject;
const createHost = createHostFactory({
component: ModalComponent,
- imports: [RouterTestingModule, NgbModalModule],
- declarations: [ConfirmationComponent, LocalizationPipe, ButtonComponent],
+ imports: [
+ RouterTestingModule,
+ NgbModalModule,
+ ConfirmationComponent,
+ LocalizationPipe,
+ ButtonComponent,
+ ],
+ declarations: [],
providers: [
{
provide: ConfirmationService,
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts
index 3493d9c12a..576c4f0320 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts
@@ -8,8 +8,8 @@ import { ToasterService } from '../services/toaster.service';
@NgModule({
exports: [ToastContainerComponent],
- declarations: [ToastContainerComponent, ToastComponent],
- imports: [CoreTestingModule.withConfig()],
+ declarations: [],
+ imports: [CoreTestingModule.withConfig(), ToastContainerComponent, ToastComponent],
})
export class MockModule {}
const toastClassPrefix = 'abp-toast';
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 50d179c3a9..b15ca00ed4 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
@@ -1,25 +1,31 @@
-import { CoreModule } from '@abp/ng.core';
-import { DatePipe } from '@angular/common';
import { ModuleWithProviders, NgModule } from '@angular/core';
-import { NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';
import { NgxValidateCoreModule } from '@ngx-validate/core';
import { NgxDatatableModule } from '@swimlane/ngx-datatable';
-import { BreadcrumbItemsComponent } from './components/breadcrumb-items/breadcrumb-items.component';
-import { BreadcrumbComponent } from './components/breadcrumb/breadcrumb.component';
-import { ButtonComponent } from './components/button/button.component';
-import { ConfirmationComponent } from './components/confirmation/confirmation.component';
-import { HttpErrorWrapperComponent } from './components/http-error-wrapper/http-error-wrapper.component';
-import { LoaderBarComponent } from './components/loader-bar/loader-bar.component';
-import { LoadingComponent } from './components/loading/loading.component';
-import { ModalCloseDirective } from './components/modal/modal-close.directive';
-import { ModalComponent } from './components/modal/modal.component';
-import { ToastContainerComponent } from './components/toast-container/toast-container.component';
-import { ToastComponent } from './components/toast/toast.component';
-import { EllipsisDirective } from './directives/ellipsis.directive';
-import { LoadingDirective } from './directives/loading.directive';
-import { NgxDatatableDefaultDirective } from './directives/ngx-datatable-default.directive';
-import { NgxDatatableListDirective } from './directives/ngx-datatable-list.directive';
-import { RootParams } from './models/common';
+import {
+ BreadcrumbItemsComponent,
+ BreadcrumbComponent,
+ ButtonComponent,
+ ConfirmationComponent,
+ HttpErrorWrapperComponent,
+ LoaderBarComponent,
+ LoadingComponent,
+ ModalComponent,
+ ToastContainerComponent,
+ ToastComponent,
+ ModalCloseDirective,
+ PasswordComponent,
+ CardModule,
+ FormInputComponent,
+ FormCheckboxComponent,
+} from './components';
+import {
+ LoadingDirective,
+ NgxDatatableDefaultDirective,
+ NgxDatatableListDirective,
+ AbpVisibleDirective,
+ DisabledDirective,
+} from './directives';
+import { RootParams } from './models';
import {
provideAbpThemeShared,
withConfirmationIcon,
@@ -28,13 +34,8 @@ import {
withValidationBluePrint,
withValidationMapErrorsFn,
} from './providers';
-import { PasswordComponent } from './components/password/password.component';
-import { CardModule } from './components/card/card.module';
-import { AbpVisibleDirective, DisabledDirective } from './directives';
-import { FormInputComponent } from './components/form-input/form-input.component';
-import { FormCheckboxComponent } from './components/checkbox/checkbox.component';
-const declarationsWithExports = [
+export const THEME_SHARED_EXPORTS = [
BreadcrumbComponent,
BreadcrumbItemsComponent,
ButtonComponent,
@@ -48,35 +49,21 @@ const declarationsWithExports = [
ModalCloseDirective,
FormInputComponent,
FormCheckboxComponent,
+ HttpErrorWrapperComponent,
+ NgxDatatableModule,
+ NgxValidateCoreModule,
+ CardModule,
+ DisabledDirective,
+ AbpVisibleDirective,
+ NgxDatatableListDirective,
+ NgxDatatableDefaultDirective,
+ PasswordComponent,
];
@NgModule({
- imports: [
- CoreModule,
- NgxDatatableModule,
- NgxValidateCoreModule,
- NgbPaginationModule,
- EllipsisDirective,
- CardModule,
- PasswordComponent,
- NgxDatatableDefaultDirective,
- NgxDatatableListDirective,
- DisabledDirective,
- AbpVisibleDirective,
- ],
- declarations: [...declarationsWithExports, HttpErrorWrapperComponent],
- exports: [
- NgxDatatableModule,
- NgxValidateCoreModule,
- CardModule,
- DisabledDirective,
- AbpVisibleDirective,
- NgxDatatableListDirective,
- NgxDatatableDefaultDirective,
- PasswordComponent,
- ...declarationsWithExports,
- ],
- providers: [DatePipe],
+ imports: [...THEME_SHARED_EXPORTS],
+ declarations: [],
+ exports: [...THEME_SHARED_EXPORTS],
})
export class BaseThemeSharedModule {}
diff --git a/templates/app-nolayers/angular/src/app/app-routing.module.ts b/templates/app-nolayers/angular/src/app/app-routing.module.ts
deleted file mode 100644
index 0d9f82ea25..0000000000
--- a/templates/app-nolayers/angular/src/app/app-routing.module.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-
-const routes: Routes = [
- {
- path: '',
- pathMatch: 'full',
- loadChildren: () => import('./home/home.module').then(m => m.HomeModule),
- },
- {
- path: 'account',
- loadChildren: () => import('@abp/ng.account').then(m => m.AccountModule.forLazy()),
- },
- {
- path: 'identity',
- loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy()),
- },
- {
- path: 'tenant-management',
- loadChildren: () =>
- import('@abp/ng.tenant-management').then(m => m.TenantManagementModule.forLazy()),
- },
- {
- path: 'setting-management',
- loadChildren: () =>
- import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()),
- },
-];
-
-@NgModule({
- imports: [RouterModule.forRoot(routes, {})],
- exports: [RouterModule],
-})
-export class AppRoutingModule {}
diff --git a/templates/app-nolayers/angular/src/app/app.component.ts b/templates/app-nolayers/angular/src/app/app.component.ts
index 5476691764..5ef8f52ddb 100644
--- a/templates/app-nolayers/angular/src/app/app.component.ts
+++ b/templates/app-nolayers/angular/src/app/app.component.ts
@@ -1,12 +1,14 @@
import { Component } from '@angular/core';
+import {InternetConnectionStatusComponent, LoaderBarComponent} from "@abp/ng.theme.shared";
+import {DynamicLayoutComponent} from "@abp/ng.core";
@Component({
- standalone: false,
selector: 'app-root',
template: `
`,
+ imports: [LoaderBarComponent, DynamicLayoutComponent, InternetConnectionStatusComponent]
})
export class AppComponent {}
diff --git a/templates/app-nolayers/angular/src/app/app.module.ts b/templates/app-nolayers/angular/src/app/app.config.ts
similarity index 50%
rename from templates/app-nolayers/angular/src/app/app.module.ts
rename to templates/app-nolayers/angular/src/app/app.config.ts
index 48ae3ab98a..5fcd465589 100644
--- a/templates/app-nolayers/angular/src/app/app.module.ts
+++ b/templates/app-nolayers/angular/src/app/app.config.ts
@@ -1,39 +1,24 @@
-import { provideAccountConfig } from '@abp/ng.account/config';
-import { CoreModule, provideAbpCore, withOptions } from '@abp/ng.core';
+import {ApplicationConfig, importProvidersFrom} from '@angular/core';
+import {provideAnimations} from "@angular/platform-browser/animations";
+import {provideRouter} from "@angular/router";
+import { appRoutes } from './app.routes';
+import { APP_ROUTE_PROVIDER } from './route.provider';
+import { provideAbpCore, withOptions } from '@abp/ng.core';
+import { environment } from '../environments/environment';
import { registerLocale } from '@abp/ng.core/locale';
-import { provideIdentityConfig } from '@abp/ng.identity/config';
+import { provideAbpOAuth } from '@abp/ng.oauth';
+import { provideAbpThemeShared } from '@abp/ng.theme.shared';
import { provideSettingManagementConfig } from '@abp/ng.setting-management/config';
+import { provideAccountConfig } from '@abp/ng.account/config';
+import { provideIdentityConfig } from '@abp/ng.identity/config';
import { provideTenantManagementConfig } from '@abp/ng.tenant-management/config';
-import { ThemeLeptonXModule } from '@abp/ng.theme.lepton-x';
-import { SideMenuLayoutModule } from '@abp/ng.theme.lepton-x/layouts';
-import {
- InternetConnectionStatusComponent,
- ThemeSharedModule,
- provideAbpThemeShared,
-} from '@abp/ng.theme.shared';
import { provideFeatureManagementConfig } from '@abp/ng.feature-management';
-import { provideAbpOAuth } from '@abp/ng.oauth';
-import { NgModule } from '@angular/core';
-import { BrowserModule } from '@angular/platform-browser';
-import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { environment } from '../environments/environment';
-import { AppRoutingModule } from './app-routing.module';
-import { AppComponent } from './app.component';
-import { APP_ROUTE_PROVIDER } from './route.provider';
+import {ThemeLeptonXModule} from "@abp/ng.theme.lepton-x";
+import {SideMenuLayoutModule} from "@abp/ng.theme.lepton-x/layouts";
-@NgModule({
- imports: [
- BrowserModule,
- BrowserAnimationsModule,
- AppRoutingModule,
- CoreModule,
- ThemeSharedModule,
- ThemeLeptonXModule.forRoot(),
- SideMenuLayoutModule.forRoot(),
- InternetConnectionStatusComponent,
- ],
- declarations: [AppComponent],
+export const appConfig: ApplicationConfig = {
providers: [
+ provideRouter(appRoutes),
APP_ROUTE_PROVIDER,
provideAbpCore(
withOptions({
@@ -48,7 +33,10 @@ import { APP_ROUTE_PROVIDER } from './route.provider';
provideIdentityConfig(),
provideTenantManagementConfig(),
provideFeatureManagementConfig(),
+ provideAnimations(),
+ importProvidersFrom([
+ ThemeLeptonXModule.forRoot(),
+ SideMenuLayoutModule.forRoot(),
+ ])
],
- bootstrap: [AppComponent],
-})
-export class AppModule {}
+};
diff --git a/templates/app-nolayers/angular/src/app/app.routes.ts b/templates/app-nolayers/angular/src/app/app.routes.ts
new file mode 100644
index 0000000000..2c5b4cae93
--- /dev/null
+++ b/templates/app-nolayers/angular/src/app/app.routes.ts
@@ -0,0 +1,27 @@
+import { Routes } from '@angular/router';
+
+export const appRoutes: Routes = [
+ {
+ path: '',
+ pathMatch: 'full',
+ loadChildren: () => import('./home/home.routes').then(m => m.homeRoutes),
+ },
+ {
+ path: 'account',
+ loadChildren: () => import('@abp/ng.account').then(m => m.createRoutes()),
+ },
+ {
+ path: 'identity',
+ loadChildren: () => import('@abp/ng.identity').then(m => m.createRoutes()),
+ },
+ {
+ path: 'tenant-management',
+ loadChildren: () =>
+ import('@abp/ng.tenant-management').then(m => m.createRoutes()),
+ },
+ {
+ path: 'setting-management',
+ loadChildren: () =>
+ import('@abp/ng.setting-management').then(m => m.createRoutes()),
+ },
+];
diff --git a/templates/app-nolayers/angular/src/app/home/home-routing.module.ts b/templates/app-nolayers/angular/src/app/home/home-routing.module.ts
deleted file mode 100644
index 7089990134..0000000000
--- a/templates/app-nolayers/angular/src/app/home/home-routing.module.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { NgModule } from '@angular/core';
-import { Routes, RouterModule } from '@angular/router';
-import { HomeComponent } from './home.component';
-
-const routes: Routes = [{ path: '', component: HomeComponent }];
-
-@NgModule({
- imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
-})
-export class HomeRoutingModule {}
diff --git a/templates/app-nolayers/angular/src/app/home/home.component.ts b/templates/app-nolayers/angular/src/app/home/home.component.ts
index 458f51628c..4fa3761541 100644
--- a/templates/app-nolayers/angular/src/app/home/home.component.ts
+++ b/templates/app-nolayers/angular/src/app/home/home.component.ts
@@ -1,11 +1,12 @@
-import { AuthService } from '@abp/ng.core';
+import {AuthService, LocalizationPipe} from '@abp/ng.core';
import { Component, inject } from '@angular/core';
+import {CommonModule} from "@angular/common";
@Component({
- standalone: false,
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.scss'],
+ imports: [CommonModule, LocalizationPipe],
})
export class HomeComponent {
private authService = inject(AuthService);
diff --git a/templates/app-nolayers/angular/src/app/home/home.module.ts b/templates/app-nolayers/angular/src/app/home/home.module.ts
deleted file mode 100644
index 72d20ccc65..0000000000
--- a/templates/app-nolayers/angular/src/app/home/home.module.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { NgModule } from '@angular/core';
-import { SharedModule } from '../shared/shared.module';
-import { HomeRoutingModule } from './home-routing.module';
-import { HomeComponent } from './home.component';
-
-@NgModule({
- declarations: [HomeComponent],
- imports: [SharedModule, HomeRoutingModule],
-})
-export class HomeModule {}
diff --git a/templates/app-nolayers/angular/src/app/home/home.routes.ts b/templates/app-nolayers/angular/src/app/home/home.routes.ts
new file mode 100644
index 0000000000..b04601eddc
--- /dev/null
+++ b/templates/app-nolayers/angular/src/app/home/home.routes.ts
@@ -0,0 +1,9 @@
+import { Routes } from '@angular/router';
+
+export const homeRoutes: Routes = [
+ {
+ path: '',
+ pathMatch: 'full',
+ loadComponent: () => import('./home.component').then(m => m.HomeComponent),
+ },
+];
diff --git a/templates/app-nolayers/angular/src/main.ts b/templates/app-nolayers/angular/src/main.ts
index fa4e0aef33..7180ec1a32 100644
--- a/templates/app-nolayers/angular/src/main.ts
+++ b/templates/app-nolayers/angular/src/main.ts
@@ -1,13 +1,5 @@
-import { enableProdMode } from '@angular/core';
-import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { bootstrapApplication } from '@angular/platform-browser';
+import { appConfig } from './app/app.config';
+import { AppComponent } from './app/app.component';
-import { AppModule } from './app/app.module';
-import { environment } from './environments/environment';
-
-if (environment.production) {
- enableProdMode();
-}
-
-platformBrowserDynamic()
- .bootstrapModule(AppModule)
- .catch(err => console.error(err));
+bootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));
diff --git a/templates/app/angular/src/app/app-routing.module.ts b/templates/app/angular/src/app/app-routing.module.ts
deleted file mode 100644
index 0d9f82ea25..0000000000
--- a/templates/app/angular/src/app/app-routing.module.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-
-const routes: Routes = [
- {
- path: '',
- pathMatch: 'full',
- loadChildren: () => import('./home/home.module').then(m => m.HomeModule),
- },
- {
- path: 'account',
- loadChildren: () => import('@abp/ng.account').then(m => m.AccountModule.forLazy()),
- },
- {
- path: 'identity',
- loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy()),
- },
- {
- path: 'tenant-management',
- loadChildren: () =>
- import('@abp/ng.tenant-management').then(m => m.TenantManagementModule.forLazy()),
- },
- {
- path: 'setting-management',
- loadChildren: () =>
- import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()),
- },
-];
-
-@NgModule({
- imports: [RouterModule.forRoot(routes, {})],
- exports: [RouterModule],
-})
-export class AppRoutingModule {}
diff --git a/templates/app/angular/src/app/app.component.ts b/templates/app/angular/src/app/app.component.ts
index 5476691764..68cc759e1b 100644
--- a/templates/app/angular/src/app/app.component.ts
+++ b/templates/app/angular/src/app/app.component.ts
@@ -1,12 +1,14 @@
import { Component } from '@angular/core';
+import { InternetConnectionStatusComponent, LoaderBarComponent } from '@abp/ng.theme.shared';
+import { DynamicLayoutComponent } from '@abp/ng.core';
@Component({
- standalone: false,
selector: 'app-root',
template: `
`,
+ imports: [LoaderBarComponent, DynamicLayoutComponent, InternetConnectionStatusComponent],
})
export class AppComponent {}
diff --git a/templates/app/angular/src/app/app.config.ts b/templates/app/angular/src/app/app.config.ts
new file mode 100644
index 0000000000..0d7e64c80c
--- /dev/null
+++ b/templates/app/angular/src/app/app.config.ts
@@ -0,0 +1,46 @@
+import {ApplicationConfig, importProvidersFrom} from '@angular/core';
+import { provideRouter } from '@angular/router';
+import {provideAnimations} from "@angular/platform-browser/animations";
+
+import { appRoutes } from './app.routes';
+import { APP_ROUTE_PROVIDER } from './route.provider';
+import { provideAbpCore, withOptions } from '@abp/ng.core';
+import { environment } from '../environments/environment';
+import { registerLocale } from '@abp/ng.core/locale';
+import { provideAbpOAuth } from '@abp/ng.oauth';
+import { provideAbpThemeShared } from '@abp/ng.theme.shared';
+import { provideSettingManagementConfig } from '@abp/ng.setting-management/config';
+import { provideAccountConfig } from '@abp/ng.account/config';
+import { provideIdentityConfig } from '@abp/ng.identity/config';
+import { provideTenantManagementConfig } from '@abp/ng.tenant-management/config';
+import { provideFeatureManagementConfig } from '@abp/ng.feature-management';
+import {ThemeLeptonXModule} from "@abp/ng.theme.lepton-x";
+import {SideMenuLayoutModule} from "@abp/ng.theme.lepton-x/layouts";
+import {AccountLayoutModule} from "@abp/ng.theme.lepton-x/account";
+
+export const appConfig: ApplicationConfig = {
+ providers: [
+ provideRouter(appRoutes),
+ APP_ROUTE_PROVIDER,
+ provideAbpCore(
+ withOptions({
+ environment,
+ registerLocaleFn: registerLocale(),
+ })
+ ),
+ provideAbpOAuth(),
+ provideAbpThemeShared(),
+ provideSettingManagementConfig(),
+ provideAccountConfig(),
+ provideIdentityConfig(),
+ provideTenantManagementConfig(),
+ provideFeatureManagementConfig(),
+ provideAnimations(),
+ provideAbpCore(),
+ importProvidersFrom([
+ ThemeLeptonXModule.forRoot(),
+ SideMenuLayoutModule.forRoot(),
+ AccountLayoutModule.forRoot(),
+ ])
+ ],
+};
diff --git a/templates/app/angular/src/app/app.module.ts b/templates/app/angular/src/app/app.module.ts
deleted file mode 100644
index de45468f4a..0000000000
--- a/templates/app/angular/src/app/app.module.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { CoreModule, provideAbpCore, withOptions } from '@abp/ng.core';
-import { registerLocale } from '@abp/ng.core/locale';
-import {
- InternetConnectionStatusComponent,
- ThemeSharedModule,
- provideAbpThemeShared,
-} from '@abp/ng.theme.shared';
-import { provideFeatureManagementConfig } from '@abp/ng.feature-management';
-import { provideAbpOAuth } from '@abp/ng.oauth';
-import { provideIdentityConfig } from '@abp/ng.identity/config';
-import { provideSettingManagementConfig } from '@abp/ng.setting-management/config';
-import { provideTenantManagementConfig } from '@abp/ng.tenant-management/config';
-import { provideAccountConfig } from '@abp/ng.account/config';
-import { ThemeLeptonXModule } from '@abp/ng.theme.lepton-x';
-import { SideMenuLayoutModule } from '@abp/ng.theme.lepton-x/layouts';
-import { AccountLayoutModule } from '@abp/ng.theme.lepton-x/account';
-import { NgModule } from '@angular/core';
-import { BrowserModule } from '@angular/platform-browser';
-import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { environment } from '../environments/environment';
-import { AppRoutingModule } from './app-routing.module';
-import { AppComponent } from './app.component';
-import { APP_ROUTE_PROVIDER } from './route.provider';
-
-@NgModule({
- imports: [
- BrowserModule,
- BrowserAnimationsModule,
- AppRoutingModule,
- CoreModule,
- ThemeSharedModule,
- ThemeLeptonXModule.forRoot(),
- SideMenuLayoutModule.forRoot(),
- AccountLayoutModule.forRoot(),
- InternetConnectionStatusComponent,
- ],
- declarations: [AppComponent],
- providers: [
- APP_ROUTE_PROVIDER,
- provideAbpCore(
- withOptions({
- environment,
- registerLocaleFn: registerLocale(),
- })
- ),
- provideAbpOAuth(),
- provideAbpThemeShared(),
- provideSettingManagementConfig(),
- provideAccountConfig(),
- provideIdentityConfig(),
- provideTenantManagementConfig(),
- provideFeatureManagementConfig(),
- ],
- bootstrap: [AppComponent],
-})
-export class AppModule {}
diff --git a/templates/app/angular/src/app/app.routes.ts b/templates/app/angular/src/app/app.routes.ts
new file mode 100644
index 0000000000..2c5b4cae93
--- /dev/null
+++ b/templates/app/angular/src/app/app.routes.ts
@@ -0,0 +1,27 @@
+import { Routes } from '@angular/router';
+
+export const appRoutes: Routes = [
+ {
+ path: '',
+ pathMatch: 'full',
+ loadChildren: () => import('./home/home.routes').then(m => m.homeRoutes),
+ },
+ {
+ path: 'account',
+ loadChildren: () => import('@abp/ng.account').then(m => m.createRoutes()),
+ },
+ {
+ path: 'identity',
+ loadChildren: () => import('@abp/ng.identity').then(m => m.createRoutes()),
+ },
+ {
+ path: 'tenant-management',
+ loadChildren: () =>
+ import('@abp/ng.tenant-management').then(m => m.createRoutes()),
+ },
+ {
+ path: 'setting-management',
+ loadChildren: () =>
+ import('@abp/ng.setting-management').then(m => m.createRoutes()),
+ },
+];
diff --git a/templates/app/angular/src/app/home/home-routing.module.ts b/templates/app/angular/src/app/home/home-routing.module.ts
deleted file mode 100644
index 7089990134..0000000000
--- a/templates/app/angular/src/app/home/home-routing.module.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { NgModule } from '@angular/core';
-import { Routes, RouterModule } from '@angular/router';
-import { HomeComponent } from './home.component';
-
-const routes: Routes = [{ path: '', component: HomeComponent }];
-
-@NgModule({
- imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
-})
-export class HomeRoutingModule {}
diff --git a/templates/app/angular/src/app/home/home.component.spec.ts b/templates/app/angular/src/app/home/home.component.spec.ts
index e02c272719..2243bfca92 100644
--- a/templates/app/angular/src/app/home/home.component.spec.ts
+++ b/templates/app/angular/src/app/home/home.component.spec.ts
@@ -6,8 +6,6 @@ import { HomeComponent } from "./home.component";
import { OAuthService } from 'angular-oauth2-oidc';
import { AuthService } from '@abp/ng.core';
-
-
describe("HomeComponent", () => {
let fixture: ComponentFixture;
const mockOAuthService = jasmine.createSpyObj('OAuthService', ['hasValidAccessToken'])
@@ -15,11 +13,12 @@ describe("HomeComponent", () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [HomeComponent],
+ declarations: [],
imports: [
CoreTestingModule.withConfig(),
ThemeSharedTestingModule.withConfig(),
NgxValidateCoreModule,
+ HomeComponent
],
providers: [
/* mock providers here */
diff --git a/templates/app/angular/src/app/home/home.component.ts b/templates/app/angular/src/app/home/home.component.ts
index 458f51628c..cf42b0f606 100644
--- a/templates/app/angular/src/app/home/home.component.ts
+++ b/templates/app/angular/src/app/home/home.component.ts
@@ -1,11 +1,12 @@
-import { AuthService } from '@abp/ng.core';
+import {AuthService, LocalizationPipe} from '@abp/ng.core';
import { Component, inject } from '@angular/core';
+import {CommonModule} from "@angular/common";
@Component({
- standalone: false,
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.scss'],
+ imports: [CommonModule, LocalizationPipe]
})
export class HomeComponent {
private authService = inject(AuthService);
diff --git a/templates/app/angular/src/app/home/home.module.ts b/templates/app/angular/src/app/home/home.module.ts
deleted file mode 100644
index 72d20ccc65..0000000000
--- a/templates/app/angular/src/app/home/home.module.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { NgModule } from '@angular/core';
-import { SharedModule } from '../shared/shared.module';
-import { HomeRoutingModule } from './home-routing.module';
-import { HomeComponent } from './home.component';
-
-@NgModule({
- declarations: [HomeComponent],
- imports: [SharedModule, HomeRoutingModule],
-})
-export class HomeModule {}
diff --git a/templates/app/angular/src/app/home/home.routes.ts b/templates/app/angular/src/app/home/home.routes.ts
new file mode 100644
index 0000000000..b04601eddc
--- /dev/null
+++ b/templates/app/angular/src/app/home/home.routes.ts
@@ -0,0 +1,9 @@
+import { Routes } from '@angular/router';
+
+export const homeRoutes: Routes = [
+ {
+ path: '',
+ pathMatch: 'full',
+ loadComponent: () => import('./home.component').then(m => m.HomeComponent),
+ },
+];
diff --git a/templates/app/angular/src/main.ts b/templates/app/angular/src/main.ts
index fa4e0aef33..7180ec1a32 100644
--- a/templates/app/angular/src/main.ts
+++ b/templates/app/angular/src/main.ts
@@ -1,13 +1,5 @@
-import { enableProdMode } from '@angular/core';
-import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { bootstrapApplication } from '@angular/platform-browser';
+import { appConfig } from './app/app.config';
+import { AppComponent } from './app/app.component';
-import { AppModule } from './app/app.module';
-import { environment } from './environments/environment';
-
-if (environment.production) {
- enableProdMode();
-}
-
-platformBrowserDynamic()
- .bootstrapModule(AppModule)
- .catch(err => console.error(err));
+bootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));
diff --git a/templates/module/angular/projects/dev-app/src/app/app-routing.module.ts b/templates/module/angular/projects/dev-app/src/app/app-routing.module.ts
deleted file mode 100644
index ba7ee06b13..0000000000
--- a/templates/module/angular/projects/dev-app/src/app/app-routing.module.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-
-const routes: Routes = [
- {
- path: '',
- pathMatch: 'full',
- loadChildren: () => import('./home/home.module').then(m => m.HomeModule),
- },
- {
- path: 'account',
- loadChildren: () => import('@abp/ng.account').then(m => m.AccountModule.forLazy()),
- },
- {
- path: 'identity',
- loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy()),
- },
- {
- path: 'tenant-management',
- loadChildren: () =>
- import('@abp/ng.tenant-management').then(m => m.TenantManagementModule.forLazy()),
- },
- {
- path: 'setting-management',
- loadChildren: () =>
- import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()),
- },
- {
- path: 'my-project-name',
- loadChildren: () =>
- import('@my-company-name/my-project-name').then(m => m.MyProjectNameModule.forLazy()),
- },
-];
-
-@NgModule({
- imports: [RouterModule.forRoot(routes, {})],
- exports: [RouterModule],
-})
-export class AppRoutingModule {}
diff --git a/templates/module/angular/projects/dev-app/src/app/app.component.ts b/templates/module/angular/projects/dev-app/src/app/app.component.ts
index 3a2a61014e..bea8e842f1 100644
--- a/templates/module/angular/projects/dev-app/src/app/app.component.ts
+++ b/templates/module/angular/projects/dev-app/src/app/app.component.ts
@@ -1,11 +1,13 @@
import { Component } from '@angular/core';
+import {LoaderBarComponent} from "@abp/ng.theme.shared";
+import {DynamicLayoutComponent} from "@abp/ng.core";
@Component({
- standalone: false,
selector: 'app-root',
template: `
-
+ ,
`,
+ imports: [LoaderBarComponent, DynamicLayoutComponent]
})
export class AppComponent {}
diff --git a/templates/module/angular/projects/dev-app/src/app/app.module.ts b/templates/module/angular/projects/dev-app/src/app/app.config.ts
similarity index 54%
rename from templates/module/angular/projects/dev-app/src/app/app.module.ts
rename to templates/module/angular/projects/dev-app/src/app/app.config.ts
index ab0a3acb67..f05d9956cc 100644
--- a/templates/module/angular/projects/dev-app/src/app/app.module.ts
+++ b/templates/module/angular/projects/dev-app/src/app/app.config.ts
@@ -1,33 +1,24 @@
-import { provideAccountConfig } from '@abp/ng.account/config';
-import { CoreModule, provideAbpCore, withOptions } from '@abp/ng.core';
+import {ApplicationConfig} from '@angular/core';
+import {provideAnimations} from "@angular/platform-browser/animations";
+import {provideRouter} from "@angular/router";
+import { appRoutes } from './app.routes';
+import { APP_ROUTE_PROVIDER } from './route.provider';
+import { provideAbpCore, withOptions } from '@abp/ng.core';
+import { environment } from '../environments/environment';
import { registerLocale } from '@abp/ng.core/locale';
-import { provideIdentityConfig } from '@abp/ng.identity/config';
+import { provideAbpOAuth } from '@abp/ng.oauth';
+import { provideAbpThemeShared } from '@abp/ng.theme.shared';
import { provideSettingManagementConfig } from '@abp/ng.setting-management/config';
+import { provideAccountConfig } from '@abp/ng.account/config';
+import { provideIdentityConfig } from '@abp/ng.identity/config';
import { provideTenantManagementConfig } from '@abp/ng.tenant-management/config';
-import { ThemeBasicModule, provideThemeBasicConfig } from '@abp/ng.theme.basic';
-import { ThemeSharedModule, provideAbpThemeShared } from '@abp/ng.theme.shared';
import { provideFeatureManagementConfig } from '@abp/ng.feature-management';
-import { provideAbpOAuth } from '@abp/ng.oauth';
-import { NgModule } from '@angular/core';
-import { BrowserModule } from '@angular/platform-browser';
-import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { MyProjectNameConfigModule } from '@my-company-name/my-project-name/config';
-import { environment } from '../environments/environment';
-import { AppRoutingModule } from './app-routing.module';
-import { AppComponent } from './app.component';
-import { APP_ROUTE_PROVIDER } from './route.provider';
+import {provideThemeBasicConfig} from "@abp/ng.theme.basic";
+import {provideMyProjectNameConfig} from "@my-company-name/my-project-name/config";
-@NgModule({
- imports: [
- BrowserModule,
- BrowserAnimationsModule,
- AppRoutingModule,
- CoreModule,
- ThemeSharedModule,
- MyProjectNameConfigModule.forRoot(),
- ThemeBasicModule,
- ],
+export const appConfig: ApplicationConfig = {
providers: [
+ provideRouter(appRoutes),
APP_ROUTE_PROVIDER,
provideAbpCore(
withOptions({
@@ -44,9 +35,8 @@ import { APP_ROUTE_PROVIDER } from './route.provider';
provideIdentityConfig(),
provideTenantManagementConfig(),
provideFeatureManagementConfig(),
+ provideAnimations(),
provideThemeBasicConfig(),
+ provideMyProjectNameConfig(),
],
- declarations: [AppComponent],
- bootstrap: [AppComponent],
-})
-export class AppModule {}
+};
diff --git a/templates/module/angular/projects/dev-app/src/app/app.routes.ts b/templates/module/angular/projects/dev-app/src/app/app.routes.ts
new file mode 100644
index 0000000000..0aba22b861
--- /dev/null
+++ b/templates/module/angular/projects/dev-app/src/app/app.routes.ts
@@ -0,0 +1,32 @@
+import { Routes } from '@angular/router';
+
+export const appRoutes: Routes = [
+ {
+ path: '',
+ pathMatch: 'full',
+ loadChildren: () => import('./home/home.routes').then(m => m.homeRoutes),
+ },
+ {
+ path: 'account',
+ loadChildren: () => import('@abp/ng.account').then(m => m.createRoutes()),
+ },
+ {
+ path: 'identity',
+ loadChildren: () => import('@abp/ng.identity').then(m => m.createRoutes()),
+ },
+ {
+ path: 'tenant-management',
+ loadChildren: () =>
+ import('@abp/ng.tenant-management').then(m => m.createRoutes()),
+ },
+ {
+ path: 'setting-management',
+ loadChildren: () =>
+ import('@abp/ng.setting-management').then(m => m.createRoutes()),
+ },
+ {
+ path: 'my-project-name',
+ loadChildren: () =>
+ import('@my-company-name/my-project-name').then(m => m.myProjectNameRoutes),
+ },
+];
diff --git a/templates/module/angular/projects/dev-app/src/app/home/home-routing.module.ts b/templates/module/angular/projects/dev-app/src/app/home/home-routing.module.ts
deleted file mode 100644
index 634706a36c..0000000000
--- a/templates/module/angular/projects/dev-app/src/app/home/home-routing.module.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { NgModule } from '@angular/core';
-import { Routes, RouterModule } from '@angular/router';
-import { HomeComponent } from './home.component';
-
-const routes: Routes = [
- {
- path: '',
- children: [{ path: '', component: HomeComponent }],
- },
-];
-
-@NgModule({
- imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
-})
-export class HomeRoutingModule {}
diff --git a/templates/module/angular/projects/dev-app/src/app/home/home.component.ts b/templates/module/angular/projects/dev-app/src/app/home/home.component.ts
index a0f37a99ca..ab1f354e89 100644
--- a/templates/module/angular/projects/dev-app/src/app/home/home.component.ts
+++ b/templates/module/angular/projects/dev-app/src/app/home/home.component.ts
@@ -1,7 +1,6 @@
import { Component } from '@angular/core';
@Component({
- standalone: false,
selector: 'app-home',
templateUrl: './home.component.html',
})
diff --git a/templates/module/angular/projects/dev-app/src/app/home/home.module.ts b/templates/module/angular/projects/dev-app/src/app/home/home.module.ts
deleted file mode 100644
index 72d20ccc65..0000000000
--- a/templates/module/angular/projects/dev-app/src/app/home/home.module.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { NgModule } from '@angular/core';
-import { SharedModule } from '../shared/shared.module';
-import { HomeRoutingModule } from './home-routing.module';
-import { HomeComponent } from './home.component';
-
-@NgModule({
- declarations: [HomeComponent],
- imports: [SharedModule, HomeRoutingModule],
-})
-export class HomeModule {}
diff --git a/templates/module/angular/projects/dev-app/src/app/home/home.routes.ts b/templates/module/angular/projects/dev-app/src/app/home/home.routes.ts
new file mode 100644
index 0000000000..b04601eddc
--- /dev/null
+++ b/templates/module/angular/projects/dev-app/src/app/home/home.routes.ts
@@ -0,0 +1,9 @@
+import { Routes } from '@angular/router';
+
+export const homeRoutes: Routes = [
+ {
+ path: '',
+ pathMatch: 'full',
+ loadComponent: () => import('./home.component').then(m => m.HomeComponent),
+ },
+];
diff --git a/templates/module/angular/projects/dev-app/src/main.ts b/templates/module/angular/projects/dev-app/src/main.ts
index c7b673cf44..7180ec1a32 100644
--- a/templates/module/angular/projects/dev-app/src/main.ts
+++ b/templates/module/angular/projects/dev-app/src/main.ts
@@ -1,12 +1,5 @@
-import { enableProdMode } from '@angular/core';
-import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { bootstrapApplication } from '@angular/platform-browser';
+import { appConfig } from './app/app.config';
+import { AppComponent } from './app/app.component';
-import { AppModule } from './app/app.module';
-import { environment } from './environments/environment';
-
-if (environment.production) {
- enableProdMode();
-}
-
-platformBrowserDynamic().bootstrapModule(AppModule)
- .catch(err => console.error(err));
+bootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));
diff --git a/templates/module/angular/projects/my-project-name/config/src/my-project-name-config.module.ts b/templates/module/angular/projects/my-project-name/config/src/my-project-name-config.module.ts
index 6ce45aa112..d756a8ad0d 100644
--- a/templates/module/angular/projects/my-project-name/config/src/my-project-name-config.module.ts
+++ b/templates/module/angular/projects/my-project-name/config/src/my-project-name-config.module.ts
@@ -1,12 +1,6 @@
-import { ModuleWithProviders, NgModule } from '@angular/core';
+import {makeEnvironmentProviders} from '@angular/core';
import { MY_PROJECT_NAME_ROUTE_PROVIDERS } from './providers/route.provider';
-@NgModule()
-export class MyProjectNameConfigModule {
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MyProjectNameConfigModule,
- providers: [MY_PROJECT_NAME_ROUTE_PROVIDERS],
- };
- }
+export function provideMyProjectNameConfig() {
+ return makeEnvironmentProviders([MY_PROJECT_NAME_ROUTE_PROVIDERS])
}
diff --git a/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts b/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts
index 21628304ac..3482489623 100644
--- a/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts
+++ b/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts
@@ -2,7 +2,6 @@ import { Component, inject, OnInit } from '@angular/core';
import { MyProjectNameService } from '../services/my-project-name.service';
@Component({
- standalone: false,
selector: 'lib-my-project-name',
template: ` my-project-name works!
`,
styles: [],
diff --git a/templates/module/angular/projects/my-project-name/src/lib/my-project-name.module.ts b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.module.ts
deleted file mode 100644
index 7e92915f4e..0000000000
--- a/templates/module/angular/projects/my-project-name/src/lib/my-project-name.module.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { NgModule, NgModuleFactory, ModuleWithProviders } from '@angular/core';
-import { CoreModule, LazyModuleFactory } from '@abp/ng.core';
-import { ThemeSharedModule } from '@abp/ng.theme.shared';
-import { MyProjectNameComponent } from './components/my-project-name.component';
-import { MyProjectNameRoutingModule } from './my-project-name-routing.module';
-
-@NgModule({
- declarations: [MyProjectNameComponent],
- imports: [CoreModule, ThemeSharedModule, MyProjectNameRoutingModule],
- exports: [MyProjectNameComponent],
-})
-export class MyProjectNameModule {
- static forChild(): ModuleWithProviders {
- return {
- ngModule: MyProjectNameModule,
- providers: [],
- };
- }
-
- static forLazy(): NgModuleFactory {
- return new LazyModuleFactory(MyProjectNameModule.forChild());
- }
-}
diff --git a/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.routes.ts
similarity index 56%
rename from templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts
rename to templates/module/angular/projects/my-project-name/src/lib/my-project-name.routes.ts
index f676a219d9..ae9f1dfcec 100644
--- a/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts
+++ b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.routes.ts
@@ -1,9 +1,8 @@
-import { NgModule } from '@angular/core';
import { RouterOutletComponent } from '@abp/ng.core';
-import { Routes, RouterModule } from '@angular/router';
+import { Routes } from '@angular/router';
import { MyProjectNameComponent } from './components/my-project-name.component';
-const routes: Routes = [
+export const myProjectNameRoutes: Routes = [
{
path: '',
pathMatch: 'full',
@@ -16,9 +15,3 @@ const routes: Routes = [
],
},
];
-
-@NgModule({
- imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
-})
-export class MyProjectNameRoutingModule {}
diff --git a/templates/module/angular/projects/my-project-name/src/public-api.ts b/templates/module/angular/projects/my-project-name/src/public-api.ts
index 3bb54f6a9a..b445f589e0 100644
--- a/templates/module/angular/projects/my-project-name/src/public-api.ts
+++ b/templates/module/angular/projects/my-project-name/src/public-api.ts
@@ -4,4 +4,4 @@
export * from './lib/components/my-project-name.component';
export * from './lib/services/my-project-name.service';
-export * from './lib/my-project-name.module';
+export * from './lib/my-project-name.routes';