Browse Source

Merge pull request #19707 from abpframework/sinan/environment-provider

Use `makeEnvironmentProviders` function instead of config modules
pull/19922/head
Masum ULU 2 years ago
committed by GitHub
parent
commit
7a9d5e031f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 54
      npm/ng-packs/apps/dev-app/src/app/app.module.ts
  2. 18
      npm/ng-packs/packages/account/config/src/account-config.module.ts
  3. 15
      npm/ng-packs/packages/account/config/src/providers/account-config.provider.ts
  4. 1
      npm/ng-packs/packages/account/config/src/providers/index.ts
  5. 1
      npm/ng-packs/packages/account/config/src/public-api.ts
  6. 1
      npm/ng-packs/packages/account/config/src/utils/index.ts
  7. 117
      npm/ng-packs/packages/core/src/lib/core.module.ts
  8. 159
      npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts
  9. 1
      npm/ng-packs/packages/core/src/lib/providers/index.ts
  10. 1
      npm/ng-packs/packages/core/src/lib/services/index.ts
  11. 6
      npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts
  12. 1
      npm/ng-packs/packages/core/src/lib/tokens/index.ts
  13. 1
      npm/ng-packs/packages/core/src/public-api.ts
  14. 8
      npm/ng-packs/packages/feature-management/src/lib/components/feature-management-tab/feature-management-tab.component.ts
  15. 18
      npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts
  16. 1
      npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts
  17. 12
      npm/ng-packs/packages/feature-management/src/lib/feature-management.module.ts
  18. 6
      npm/ng-packs/packages/feature-management/src/lib/providers/feature-management-config.provider.ts
  19. 1
      npm/ng-packs/packages/feature-management/src/lib/providers/index.ts
  20. 7
      npm/ng-packs/packages/identity/config/src/identity-config.module.ts
  21. 6
      npm/ng-packs/packages/identity/config/src/providers/identity-config.provider.ts
  22. 1
      npm/ng-packs/packages/identity/config/src/providers/index.ts
  23. 72
      npm/ng-packs/packages/oauth/src/lib/oauth.module.ts
  24. 1
      npm/ng-packs/packages/oauth/src/lib/providers/index.ts
  25. 66
      npm/ng-packs/packages/oauth/src/lib/providers/oauth-module-config.provider.ts
  26. 2
      npm/ng-packs/packages/setting-management/config/src/lib/providers/index.ts
  27. 16
      npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-management-config.provider.ts
  28. 17
      npm/ng-packs/packages/setting-management/config/src/lib/setting-management-config.module.ts
  29. 1
      npm/ng-packs/packages/tenant-management/config/src/providers/index.ts
  30. 6
      npm/ng-packs/packages/tenant-management/config/src/providers/tenant-management-config.provider.ts
  31. 7
      npm/ng-packs/packages/tenant-management/config/src/tenant-management-config.module.ts
  32. 4
      npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts
  33. 1
      npm/ng-packs/packages/theme-basic/src/lib/providers/index.ts
  34. 39
      npm/ng-packs/packages/theme-basic/src/lib/providers/theme-basic-config.provider.ts
  35. 44
      npm/ng-packs/packages/theme-basic/src/lib/theme-basic.module.ts
  36. 1
      npm/ng-packs/packages/theme-shared/src/lib/providers/index.ts
  37. 161
      npm/ng-packs/packages/theme-shared/src/lib/providers/theme-shared-config.provider.ts
  38. 89
      npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts
  39. 1
      npm/ng-packs/packages/theme-shared/src/lib/tokens/index.ts

54
npm/ng-packs/apps/dev-app/src/app/app.module.ts

@ -1,17 +1,21 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser'; import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { CoreModule } from '@abp/ng.core'; import { CoreModule, provideAbpCore, withOptions } from '@abp/ng.core';
import { registerLocale } from '@abp/ng.core/locale'; import { registerLocale } from '@abp/ng.core/locale';
import { InternetConnectionStatusComponent, ThemeSharedModule } from '@abp/ng.theme.shared'; import {
InternetConnectionStatusComponent,
ThemeSharedModule,
provideAbpThemeShared,
} from '@abp/ng.theme.shared';
import { ThemeLeptonXModule } from '@abp/ng.theme.lepton-x'; import { ThemeLeptonXModule } from '@abp/ng.theme.lepton-x';
import { SideMenuLayoutModule } from '@abp/ng.theme.lepton-x/layouts'; import { SideMenuLayoutModule } from '@abp/ng.theme.lepton-x/layouts';
import { IdentityConfigModule } from '@abp/ng.identity/config'; import { provideAbpOAuth } from '@abp/ng.oauth';
import { AbpOAuthModule } from '@abp/ng.oauth'; import { provideSettingManagementConfig } from '@abp/ng.setting-management/config';
import { SettingManagementConfigModule } from '@abp/ng.setting-management/config'; import { provideAccountConfig } from '@abp/ng.account/config';
import { TenantManagementConfigModule } from '@abp/ng.tenant-management/config'; import { provideIdentityConfig } from '@abp/ng.identity/config';
import { FeatureManagementModule } from '@abp/ng.feature-management'; import { provideTenantManagementConfig } from '@abp/ng.tenant-management/config';
import { AccountConfigModule } from '@abp/ng.account/config'; import { provideFeatureManagementConfig } from '@abp/ng.feature-management';
import { AccountLayoutModule } from '@abp/ng.theme.lepton-x/account'; import { AccountLayoutModule } from '@abp/ng.theme.lepton-x/account';
import { environment } from '../environments/environment'; import { environment } from '../environments/environment';
import { AppRoutingModule } from './app-routing.module'; import { AppRoutingModule } from './app-routing.module';
@ -23,25 +27,31 @@ import { APP_ROUTE_PROVIDER } from './route.provider';
BrowserModule, BrowserModule,
BrowserAnimationsModule, BrowserAnimationsModule,
AppRoutingModule, AppRoutingModule,
CoreModule.forRoot({ CoreModule,
environment, ThemeSharedModule,
registerLocaleFn: registerLocale(),
sendNullsAsQueryParam: false,
skipGetAppConfiguration: false,
}),
AbpOAuthModule.forRoot(),
ThemeSharedModule.forRoot(),
AccountConfigModule.forRoot(),
IdentityConfigModule.forRoot(),
TenantManagementConfigModule.forRoot(),
FeatureManagementModule.forRoot(),
SettingManagementConfigModule.forRoot(),
ThemeLeptonXModule.forRoot(), ThemeLeptonXModule.forRoot(),
SideMenuLayoutModule.forRoot(), SideMenuLayoutModule.forRoot(),
AccountLayoutModule.forRoot(), AccountLayoutModule.forRoot(),
InternetConnectionStatusComponent, InternetConnectionStatusComponent,
], ],
providers: [APP_ROUTE_PROVIDER], providers: [
APP_ROUTE_PROVIDER,
provideAbpCore(
withOptions({
environment,
registerLocaleFn: registerLocale(),
sendNullsAsQueryParam: false,
skipGetAppConfiguration: false,
}),
),
provideAbpOAuth(),
provideAbpThemeShared(),
provideSettingManagementConfig(),
provideAccountConfig(),
provideIdentityConfig(),
provideTenantManagementConfig(),
provideFeatureManagementConfig(),
],
declarations: [AppComponent], declarations: [AppComponent],
bootstrap: [AppComponent], bootstrap: [AppComponent],
}) })

18
npm/ng-packs/packages/account/config/src/account-config.module.ts

@ -1,21 +1,15 @@
import { Injector, ModuleWithProviders, NgModule } from '@angular/core'; import { ModuleWithProviders, NgModule } from '@angular/core';
import { NAVIGATE_TO_MANAGE_PROFILE } from '@abp/ng.core'; import { provideAccountConfig } from './providers';
import { ACCOUNT_ROUTE_PROVIDERS } from './providers/route.provider';
import { navigateToManageProfileFactory } from './utils/factories';
/**
* @deprecated AccountConfigModule is deprecated use `provideAccountConfig` *function* instead.
*/
@NgModule() @NgModule()
export class AccountConfigModule { export class AccountConfigModule {
static forRoot(): ModuleWithProviders<AccountConfigModule> { static forRoot(): ModuleWithProviders<AccountConfigModule> {
return { return {
ngModule: AccountConfigModule, ngModule: AccountConfigModule,
providers: [ providers: [provideAccountConfig()],
ACCOUNT_ROUTE_PROVIDERS,
{
provide: NAVIGATE_TO_MANAGE_PROFILE,
useFactory: navigateToManageProfileFactory,
deps: [Injector],
},
],
}; };
} }
} }

15
npm/ng-packs/packages/account/config/src/providers/account-config.provider.ts

@ -0,0 +1,15 @@
import { NAVIGATE_TO_MANAGE_PROFILE } from '@abp/ng.core';
import { makeEnvironmentProviders, Injector } from '@angular/core';
import { navigateToManageProfileFactory } from '../utils';
import { ACCOUNT_ROUTE_PROVIDERS } from './';
export function provideAccountConfig() {
return makeEnvironmentProviders([
ACCOUNT_ROUTE_PROVIDERS,
{
provide: NAVIGATE_TO_MANAGE_PROFILE,
useFactory: navigateToManageProfileFactory,
deps: [Injector],
},
]);
}

1
npm/ng-packs/packages/account/config/src/providers/index.ts

@ -1 +1,2 @@
export * from './route.provider'; export * from './route.provider';
export * from './account-config.provider';

1
npm/ng-packs/packages/account/config/src/public-api.ts

@ -1,3 +1,4 @@
export * from './account-config.module'; export * from './account-config.module';
export * from './enums'; export * from './enums';
export * from './providers'; export * from './providers';
export * from './utils';

1
npm/ng-packs/packages/account/config/src/utils/index.ts

@ -0,0 +1 @@
export * from './factories';

117
npm/ng-packs/packages/core/src/lib/core.module.ts

@ -1,8 +1,8 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { HttpClientModule, HttpClientXsrfModule } from '@angular/common/http'; import { HttpClientModule, HttpClientXsrfModule } from '@angular/common/http';
import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core'; import { ModuleWithProviders, NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { RouterModule, TitleStrategy } from '@angular/router'; import { RouterModule } from '@angular/router';
import { AbstractNgModelComponent } from './abstracts/ng-model.component'; import { AbstractNgModelComponent } from './abstracts/ng-model.component';
import { DynamicLayoutComponent } from './components/dynamic-layout.component'; import { DynamicLayoutComponent } from './components/dynamic-layout.component';
import { ReplaceableRouteContainerComponent } from './components/replaceable-route-container.component'; import { ReplaceableRouteContainerComponent } from './components/replaceable-route-container.component';
@ -15,35 +15,17 @@ import { InitDirective } from './directives/init.directive';
import { PermissionDirective } from './directives/permission.directive'; import { PermissionDirective } from './directives/permission.directive';
import { ReplaceableTemplateDirective } from './directives/replaceable-template.directive'; import { ReplaceableTemplateDirective } from './directives/replaceable-template.directive';
import { StopPropagationDirective } from './directives/stop-propagation.directive'; import { StopPropagationDirective } from './directives/stop-propagation.directive';
import { RoutesHandler } from './handlers/routes.handler';
import { LocalizationModule } from './localization.module'; import { LocalizationModule } from './localization.module';
import { ABP } from './models/common'; import { ABP } from './models/common';
import { LocalizationPipe } from './pipes/localization.pipe'; import { LocalizationPipe } from './pipes/localization.pipe';
import { SortPipe } from './pipes/sort.pipe'; import { SortPipe } from './pipes/sort.pipe';
import { ToInjectorPipe } from './pipes/to-injector.pipe'; import { ToInjectorPipe } from './pipes/to-injector.pipe';
import { CookieLanguageProvider } from './providers/cookie-language.provider';
import { LocaleProvider } from './providers/locale.provider';
import { LocalizationService } from './services/localization.service';
import { DISABLE_PROJECT_NAME, OTHERS_GROUP } from './tokens';
import { localizationContributor, LOCALIZATIONS } from './tokens/localization.token';
import { CORE_OPTIONS, coreOptionsFactory } from './tokens/options.token';
import { TENANT_KEY } from './tokens/tenant-key.token';
import { noop } from './utils/common-utils';
import './utils/date-extensions'; import './utils/date-extensions';
import { getInitialData, localeInitializer } from './utils/initial-utils';
import { ShortDateTimePipe } from './pipes/short-date-time.pipe'; import { ShortDateTimePipe } from './pipes/short-date-time.pipe';
import { ShortTimePipe } from './pipes/short-time.pipe'; import { ShortTimePipe } from './pipes/short-time.pipe';
import { ShortDatePipe } from './pipes/short-date.pipe'; import { ShortDatePipe } from './pipes/short-date.pipe';
import { SafeHtmlPipe } from './pipes/safe-html.pipe'; import { SafeHtmlPipe } from './pipes/safe-html.pipe';
import { QUEUE_MANAGER } from './tokens/queue.token'; import { provideAbpCoreChild, provideAbpCore, withOptions } from './providers';
import { DefaultQueueManager } from './utils/queue';
import { IncludeLocalizationResourcesProvider } from './providers/include-localization-resources.provider';
import { SORT_COMPARE_FUNC, compareFuncFactory } from './tokens/compare-func.token';
import { AuthErrorFilterService } from './abstracts';
import { DYNAMIC_LAYOUTS_TOKEN } from './tokens/dynamic-layout.token';
import { DEFAULT_DYNAMIC_LAYOUTS } from './constants';
import { AbpTitleStrategy } from './services/title-strategy.service';
import { LocalStorageListenerService } from './services/local-storage-listener.service';
const standaloneDirectives = [ const standaloneDirectives = [
AutofocusDirective, AutofocusDirective,
@ -131,100 +113,23 @@ export class RootCoreModule {}
imports: [BaseCoreModule], imports: [BaseCoreModule],
}) })
export class CoreModule { export class CoreModule {
/**
* @deprecated forRoot method is deprecated, use `provideAbpCore` *function* for config settings.
*/
static forRoot(options = {} as ABP.Root): ModuleWithProviders<RootCoreModule> { static forRoot(options = {} as ABP.Root): ModuleWithProviders<RootCoreModule> {
return { return {
ngModule: RootCoreModule, ngModule: RootCoreModule,
providers: [ providers: [provideAbpCore(withOptions(options))],
LocaleProvider,
CookieLanguageProvider,
{
provide: 'CORE_OPTIONS',
useValue: options,
},
{
provide: CORE_OPTIONS,
useFactory: coreOptionsFactory,
deps: ['CORE_OPTIONS'],
},
{
provide: APP_INITIALIZER,
multi: true,
deps: [Injector],
useFactory: getInitialData,
},
{
provide: APP_INITIALIZER,
multi: true,
deps: [Injector],
useFactory: localeInitializer,
},
{
provide: APP_INITIALIZER,
multi: true,
deps: [LocalizationService],
useFactory: noop,
},
{
provide: APP_INITIALIZER,
multi: true,
deps: [LocalStorageListenerService],
useFactory: noop,
},
{
provide: APP_INITIALIZER,
multi: true,
deps: [RoutesHandler],
useFactory: noop,
},
{ provide: TENANT_KEY, useValue: options.tenantKey || '__tenant' },
{
provide: LOCALIZATIONS,
multi: true,
useValue: localizationContributor(options.localizations),
deps: [LocalizationService],
},
{
provide: SORT_COMPARE_FUNC,
useFactory: compareFuncFactory,
},
{
provide: QUEUE_MANAGER,
useClass: DefaultQueueManager,
},
{
provide: OTHERS_GROUP,
useValue: options.othersGroup || 'AbpUi::OthersGroup',
},
AuthErrorFilterService,
IncludeLocalizationResourcesProvider,
{
provide: DYNAMIC_LAYOUTS_TOKEN,
useValue: options.dynamicLayouts || DEFAULT_DYNAMIC_LAYOUTS,
},
{
provide: TitleStrategy,
useExisting: AbpTitleStrategy,
},
{
provide: DISABLE_PROJECT_NAME,
useValue: options.disableProjectNameInTitle || false,
},
],
}; };
} }
/**
* @deprecated forChild method is deprecated, use `provideAbpCoreChild` *function* for config settings.
*/
static forChild(options = {} as ABP.Child): ModuleWithProviders<RootCoreModule> { static forChild(options = {} as ABP.Child): ModuleWithProviders<RootCoreModule> {
return { return {
ngModule: RootCoreModule, ngModule: RootCoreModule,
providers: [ providers: [provideAbpCoreChild(options)],
{
provide: LOCALIZATIONS,
multi: true,
useValue: localizationContributor(options.localizations),
deps: [LocalizationService],
},
],
}; };
} }
} }

159
npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts

@ -0,0 +1,159 @@
import { makeEnvironmentProviders, APP_INITIALIZER, Injector, Provider } from '@angular/core';
import { TitleStrategy } from '@angular/router';
import {
CORE_OPTIONS,
LOCALIZATIONS,
DYNAMIC_LAYOUTS_TOKEN,
OTHERS_GROUP,
QUEUE_MANAGER,
SORT_COMPARE_FUNC,
TENANT_KEY,
compareFuncFactory,
coreOptionsFactory,
localizationContributor,
} from '../tokens';
import { RoutesHandler } from '../handlers';
import { ABP, SortableItem } from '../models';
import { AuthErrorFilterService } from '../abstracts';
import { DEFAULT_DYNAMIC_LAYOUTS } from '../constants';
import { LocalizationService, LocalStorageListenerService, AbpTitleStrategy } from '../services';
import { DefaultQueueManager, getInitialData, localeInitializer, noop } from '../utils';
import { CookieLanguageProvider, IncludeLocalizationResourcesProvider, LocaleProvider } from './';
export enum CoreFeatureKind {
Options,
CompareFunctionFactory,
TitleStrategy,
}
export interface CoreFeature<KindT extends CoreFeatureKind> {
ɵkind: KindT;
ɵproviders: Provider[];
}
function makeCoreFeature<KindT extends CoreFeatureKind>(
kind: KindT,
providers: Provider[],
): CoreFeature<KindT> {
return {
ɵkind: kind,
ɵproviders: providers,
};
}
export function withOptions(options = {} as ABP.Root): CoreFeature<CoreFeatureKind.Options> {
return makeCoreFeature(CoreFeatureKind.Options, [
{
provide: 'CORE_OPTIONS',
useValue: options,
},
{
provide: CORE_OPTIONS,
useFactory: coreOptionsFactory,
deps: ['CORE_OPTIONS'],
},
{ provide: TENANT_KEY, useValue: options.tenantKey || '__tenant' },
{
provide: LOCALIZATIONS,
multi: true,
useValue: localizationContributor(options.localizations),
deps: [LocalizationService],
},
{
provide: OTHERS_GROUP,
useValue: options.othersGroup || 'AbpUi::OthersGroup',
},
{
provide: DYNAMIC_LAYOUTS_TOKEN,
useValue: options.dynamicLayouts || DEFAULT_DYNAMIC_LAYOUTS,
},
]);
}
export function withTitleStrategy(strategy: unknown): CoreFeature<CoreFeatureKind.TitleStrategy> {
return makeCoreFeature(CoreFeatureKind.TitleStrategy, [
{
provide: TitleStrategy,
useExisting: strategy,
},
]);
}
export function withCompareFuncFactory(
factory: (a: SortableItem, b: SortableItem) => 1 | -1 | 0,
): CoreFeature<CoreFeatureKind.CompareFunctionFactory> {
return makeCoreFeature(CoreFeatureKind.CompareFunctionFactory, [
{
provide: SORT_COMPARE_FUNC,
useFactory: factory,
},
]);
}
export function provideAbpCore(...features: CoreFeature<CoreFeatureKind>[]) {
const providers = [
LocaleProvider,
CookieLanguageProvider,
{
provide: APP_INITIALIZER,
multi: true,
deps: [Injector],
useFactory: getInitialData,
},
{
provide: APP_INITIALIZER,
multi: true,
deps: [Injector],
useFactory: localeInitializer,
},
{
provide: APP_INITIALIZER,
multi: true,
deps: [LocalizationService],
useFactory: noop,
},
{
provide: APP_INITIALIZER,
multi: true,
deps: [LocalStorageListenerService],
useFactory: noop,
},
{
provide: APP_INITIALIZER,
multi: true,
deps: [RoutesHandler],
useFactory: noop,
},
{
provide: SORT_COMPARE_FUNC,
useFactory: compareFuncFactory,
},
{
provide: QUEUE_MANAGER,
useClass: DefaultQueueManager,
},
AuthErrorFilterService,
IncludeLocalizationResourcesProvider,
{
provide: TitleStrategy,
useExisting: AbpTitleStrategy,
},
];
for (const feature of features) {
providers.push(...feature.ɵproviders);
}
return makeEnvironmentProviders(providers);
}
export function provideAbpCoreChild(options = {} as ABP.Child) {
return makeEnvironmentProviders([
{
provide: LOCALIZATIONS,
multi: true,
useValue: localizationContributor(options.localizations),
deps: [LocalizationService],
},
]);
}

1
npm/ng-packs/packages/core/src/lib/providers/index.ts

@ -1,3 +1,4 @@
export * from './cookie-language.provider'; export * from './cookie-language.provider';
export * from './locale.provider'; export * from './locale.provider';
export * from './include-localization-resources.provider'; export * from './include-localization-resources.provider';
export * from './core-module-config.provider';

1
npm/ng-packs/packages/core/src/lib/services/index.ts

@ -22,3 +22,4 @@ export * from './local-storage.service';
export * from './window.service'; export * from './window.service';
export * from './internet-connection-service'; export * from './internet-connection-service';
export * from './local-storage-listener.service'; export * from './local-storage-listener.service';
export * from './title-strategy.service';

6
npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts

@ -14,12 +14,11 @@ import { HttpErrorReporterService } from '../services/http-error-reporter.servic
import { PermissionService } from '../services/permission.service'; import { PermissionService } from '../services/permission.service';
import { RoutesService } from '../services/routes.service'; import { RoutesService } from '../services/routes.service';
import { CORE_OPTIONS } from '../tokens/options.token'; import { CORE_OPTIONS } from '../tokens/options.token';
import { IncludeLocalizationResourcesProvider } from '../providers'; import { IncludeLocalizationResourcesProvider, provideAbpCore, withOptions } from '../providers';
import { TestBed } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing';
import { RouterTestingHarness } from '@angular/router/testing'; import { RouterTestingHarness } from '@angular/router/testing';
import { OTHERS_GROUP } from '../tokens'; import { OTHERS_GROUP } from '../tokens';
import { SORT_COMPARE_FUNC, compareFuncFactory } from '../tokens/compare-func.token'; import { SORT_COMPARE_FUNC, compareFuncFactory } from '../tokens/compare-func.token';
import { CoreModule } from '../core.module';
import { AuthService } from '../abstracts'; import { AuthService } from '../abstracts';
describe('PermissionGuard', () => { describe('PermissionGuard', () => {
@ -155,12 +154,13 @@ describe('authGuard', () => {
permissionService = createSpyObject(PermissionService); permissionService = createSpyObject(PermissionService);
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [HttpClientTestingModule, CoreModule.forRoot()], imports: [HttpClientTestingModule],
providers: [ providers: [
{ provide: AuthService, useValue: mockOAuthService }, { provide: AuthService, useValue: mockOAuthService },
{ provide: PermissionService, useValue: permissionService }, { provide: PermissionService, useValue: permissionService },
{ provide: HttpErrorReporterService, useValue: httpErrorReporter }, { provide: HttpErrorReporterService, useValue: httpErrorReporter },
provideRouter(routes), provideRouter(routes),
provideAbpCore(withOptions()),
], ],
}); });
}); });

1
npm/ng-packs/packages/core/src/lib/tokens/index.ts

@ -15,4 +15,5 @@ export * from './http-context.token';
export * from './others-group.token'; export * from './others-group.token';
export * from './tenant-not-found-by-name'; export * from './tenant-not-found-by-name';
export * from './compare-func.token'; export * from './compare-func.token';
export * from './dynamic-layout.token';
export * from './title-strategy-disable-project-name.token'; export * from './title-strategy-disable-project-name.token';

1
npm/ng-packs/packages/core/src/public-api.ts

@ -9,6 +9,7 @@ export * from './lib/guards';
export * from './lib/localization.module'; export * from './lib/localization.module';
export * from './lib/models'; export * from './lib/models';
export * from './lib/pipes'; export * from './lib/pipes';
export * from './lib/providers';
export * from './lib/proxy/pages/abp/multi-tenancy'; export * from './lib/proxy/pages/abp/multi-tenancy';
export * from './lib/proxy/volo/abp/asp-net-core/mvc/api-exploring'; export * from './lib/proxy/volo/abp/asp-net-core/mvc/api-exploring';
export * from './lib/proxy/volo/abp/asp-net-core/mvc/application-configurations'; export * from './lib/proxy/volo/abp/asp-net-core/mvc/application-configurations';

8
npm/ng-packs/packages/feature-management/src/lib/components/feature-management-tab/feature-management-tab.component.ts

@ -1,8 +1,16 @@
import { LocalizationModule, ReplaceableTemplateDirective } from '@abp/ng.core';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { FeatureManagementComponent } from '../feature-management/feature-management.component';
@Component({ @Component({
standalone: true,
selector: 'abp-feature-management-tab', selector: 'abp-feature-management-tab',
templateUrl: './feature-management-tab.component.html', templateUrl: './feature-management-tab.component.html',
imports: [
ReplaceableTemplateDirective,
LocalizationModule,
FeatureManagementComponent,
],
}) })
export class FeatureManagementTabComponent { export class FeatureManagementTabComponent {
visibleFeatures = false; visibleFeatures = false;

18
npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts

@ -1,4 +1,4 @@
import { ConfigStateService, TrackByService } from '@abp/ng.core'; import { ConfigStateService, LocalizationModule, TrackByService } from '@abp/ng.core';
import { import {
FeatureDto, FeatureDto,
FeatureGroupDto, FeatureGroupDto,
@ -9,10 +9,15 @@ import {
Confirmation, Confirmation,
ConfirmationService, ConfirmationService,
LocaleDirection, LocaleDirection,
ThemeSharedModule,
ToasterService, ToasterService,
} from '@abp/ng.theme.shared'; } from '@abp/ng.theme.shared';
import { Component, EventEmitter, Input, Output, inject } from '@angular/core'; import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
import { NgTemplateOutlet } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
import { finalize } from 'rxjs/operators'; import { finalize } from 'rxjs/operators';
import { FreeTextInputDirective } from '../../directives';
import { FeatureManagement } from '../../models/feature-management'; import { FeatureManagement } from '../../models/feature-management';
enum ValueTypes { enum ValueTypes {
@ -22,9 +27,18 @@ enum ValueTypes {
} }
@Component({ @Component({
standalone: true,
selector: 'abp-feature-management', selector: 'abp-feature-management',
templateUrl: './feature-management.component.html', templateUrl: './feature-management.component.html',
exportAs: 'abpFeatureManagement', exportAs: 'abpFeatureManagement',
imports: [
ThemeSharedModule,
LocalizationModule,
FormsModule,
NgbNavModule,
FreeTextInputDirective,
NgTemplateOutlet,
],
}) })
export class FeatureManagementComponent export class FeatureManagementComponent
implements implements
@ -125,7 +139,7 @@ export class FeatureManagementComponent
.subscribe(() => { .subscribe(() => {
this.visible = false; this.visible = false;
this.toasterService.success('AbpFeatureManagement::Saved'); this.toasterService.success('AbpUi::SavedSuccessfully');
if (!this.providerKey) { if (!this.providerKey) {
// to refresh host's features // to refresh host's features
this.configState.refreshAppState().subscribe(); this.configState.refreshAppState().subscribe();

1
npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts

@ -15,6 +15,7 @@ export const INPUT_TYPES = {
}; };
@Directive({ @Directive({
standalone: true,
selector: 'input[abpFeatureManagementFreeText]', selector: 'input[abpFeatureManagementFreeText]',
exportAs: 'inputAbpFeatureManagementFreeText', exportAs: 'inputAbpFeatureManagementFreeText',
}) })

12
npm/ng-packs/packages/feature-management/src/lib/feature-management.module.ts

@ -4,7 +4,7 @@ import { ModuleWithProviders, NgModule } from '@angular/core';
import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
import { FeatureManagementComponent } from './components/feature-management/feature-management.component'; import { FeatureManagementComponent } from './components/feature-management/feature-management.component';
import { FreeTextInputDirective } from './directives/free-text-input.directive'; import { FreeTextInputDirective } from './directives/free-text-input.directive';
import { FEATURE_MANAGEMENT_SETTINGS_PROVIDERS } from './providers'; import { provideFeatureManagementConfig } from './providers';
import { FeatureManagementTabComponent } from './components'; import { FeatureManagementTabComponent } from './components';
const exported = [ const exported = [
@ -13,16 +13,20 @@ const exported = [
FeatureManagementTabComponent, FeatureManagementTabComponent,
]; ];
/**
* @deprecated FeatureManagementModule is deprecated .
* @description use `provideFeatureManagementConfig` *function* for config settings.
* You can import directives and pipes directly whichs were belongs to FeatureManagementModule are switched to standalone.
*/
@NgModule({ @NgModule({
declarations: [...exported], imports: [CoreModule, ThemeSharedModule, NgbNavModule, ...exported],
imports: [CoreModule, ThemeSharedModule, NgbNavModule],
exports: [...exported], exports: [...exported],
}) })
export class FeatureManagementModule { export class FeatureManagementModule {
static forRoot(): ModuleWithProviders<FeatureManagementModule> { static forRoot(): ModuleWithProviders<FeatureManagementModule> {
return { return {
ngModule: FeatureManagementModule, ngModule: FeatureManagementModule,
providers: [FEATURE_MANAGEMENT_SETTINGS_PROVIDERS], providers: [provideFeatureManagementConfig()],
}; };
} }
} }

6
npm/ng-packs/packages/feature-management/src/lib/providers/feature-management-config.provider.ts

@ -0,0 +1,6 @@
import { makeEnvironmentProviders } from '@angular/core';
import { FEATURE_MANAGEMENT_SETTINGS_PROVIDERS } from './';
export function provideFeatureManagementConfig() {
return makeEnvironmentProviders([FEATURE_MANAGEMENT_SETTINGS_PROVIDERS]);
}

1
npm/ng-packs/packages/feature-management/src/lib/providers/index.ts

@ -1 +1,2 @@
export * from './feature-management-settings.provider'; export * from './feature-management-settings.provider';
export * from './feature-management-config.provider';

7
npm/ng-packs/packages/identity/config/src/identity-config.module.ts

@ -1,12 +1,15 @@
import { ModuleWithProviders, NgModule } from '@angular/core'; import { ModuleWithProviders, NgModule } from '@angular/core';
import { IDENTITY_ROUTE_PROVIDERS } from './providers/route.provider'; import { provideIdentityConfig } from './providers';
/**
* @deprecated IdentityConfigModule is deprecated use `provideIdentityConfig` *function* instead.
*/
@NgModule() @NgModule()
export class IdentityConfigModule { export class IdentityConfigModule {
static forRoot(): ModuleWithProviders<IdentityConfigModule> { static forRoot(): ModuleWithProviders<IdentityConfigModule> {
return { return {
ngModule: IdentityConfigModule, ngModule: IdentityConfigModule,
providers: [IDENTITY_ROUTE_PROVIDERS], providers: [provideIdentityConfig()],
}; };
} }
} }

6
npm/ng-packs/packages/identity/config/src/providers/identity-config.provider.ts

@ -0,0 +1,6 @@
import { makeEnvironmentProviders } from '@angular/core';
import { IDENTITY_ROUTE_PROVIDERS } from './';
export function provideIdentityConfig() {
return makeEnvironmentProviders([IDENTITY_ROUTE_PROVIDERS]);
}

1
npm/ng-packs/packages/identity/config/src/providers/index.ts

@ -1 +1,2 @@
export * from './route.provider'; export * from './route.provider';
export * from './identity-config.provider';

72
npm/ng-packs/packages/oauth/src/lib/oauth.module.ts

@ -1,73 +1,15 @@
import { APP_INITIALIZER, ModuleWithProviders, NgModule, Provider } from '@angular/core'; import { ModuleWithProviders, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; import { provideAbpOAuth } from './providers';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc';
import {
AbpLocalStorageService,
ApiInterceptor,
AuthErrorFilterService,
AuthGuard,
authGuard,
AuthService,
CHECK_AUTHENTICATION_STATE_FN_KEY,
noop,
PIPE_TO_LOGIN_FN_KEY,
} from '@abp/ng.core';
import { AbpOAuthService, OAuthErrorFilterService } from './services';
import { OAuthConfigurationHandler } from './handlers/oauth-configuration.handler';
import { OAuthApiInterceptor } from './interceptors/api.interceptor';
import { AbpOAuthGuard, abpOAuthGuard } from './guards/oauth.guard';
import { NavigateToManageProfileProvider } from './providers';
import { checkAccessToken, pipeToLogin } from './utils';
@NgModule({ /**
imports: [CommonModule, OAuthModule], * @deprecated AbpOAuthModule is deprecated use `provideAbpOAuth` *function* instead.
}) */
@NgModule()
export class AbpOAuthModule { export class AbpOAuthModule {
static forRoot(): ModuleWithProviders<AbpOAuthModule> { static forRoot(): ModuleWithProviders<AbpOAuthModule> {
return { return {
ngModule: AbpOAuthModule, ngModule: AbpOAuthModule,
providers: [ providers: [provideAbpOAuth()],
{
provide: AuthService,
useClass: AbpOAuthService,
},
{
provide: AuthGuard,
useClass: AbpOAuthGuard,
},
{
provide: authGuard,
useValue: abpOAuthGuard,
},
{
provide: ApiInterceptor,
useClass: OAuthApiInterceptor,
},
{
provide: PIPE_TO_LOGIN_FN_KEY,
useValue: pipeToLogin,
},
{
provide: CHECK_AUTHENTICATION_STATE_FN_KEY,
useValue: checkAccessToken,
},
{
provide: HTTP_INTERCEPTORS,
useExisting: ApiInterceptor,
multi: true,
},
NavigateToManageProfileProvider,
{
provide: APP_INITIALIZER,
multi: true,
deps: [OAuthConfigurationHandler],
useFactory: noop,
},
OAuthModule.forRoot().providers as Provider[],
{ provide: OAuthStorage, useClass: AbpLocalStorageService },
{ provide: AuthErrorFilterService, useExisting: OAuthErrorFilterService },
],
}; };
} }
} }

1
npm/ng-packs/packages/oauth/src/lib/providers/index.ts

@ -1 +1,2 @@
export * from './navigate-to-manage-profile.provider'; export * from './navigate-to-manage-profile.provider';
export * from './oauth-module-config.provider';

66
npm/ng-packs/packages/oauth/src/lib/providers/oauth-module-config.provider.ts

@ -0,0 +1,66 @@
import {
AuthService,
AuthGuard,
authGuard,
ApiInterceptor,
PIPE_TO_LOGIN_FN_KEY,
CHECK_AUTHENTICATION_STATE_FN_KEY,
AbpLocalStorageService,
AuthErrorFilterService,
noop,
} from '@abp/ng.core';
import { APP_INITIALIZER, Provider, makeEnvironmentProviders } from '@angular/core';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc';
import { AbpOAuthGuard, abpOAuthGuard } from '../guards';
import { OAuthConfigurationHandler } from '../handlers';
import { OAuthApiInterceptor } from '../interceptors';
import { AbpOAuthService, OAuthErrorFilterService } from '../services';
import { pipeToLogin, checkAccessToken } from '../utils';
import { NavigateToManageProfileProvider } from './navigate-to-manage-profile.provider';
export function provideAbpOAuth() {
const providers = [
{
provide: AuthService,
useClass: AbpOAuthService,
},
{
provide: AuthGuard,
useClass: AbpOAuthGuard,
},
{
provide: authGuard,
useValue: abpOAuthGuard,
},
{
provide: ApiInterceptor,
useClass: OAuthApiInterceptor,
},
{
provide: PIPE_TO_LOGIN_FN_KEY,
useValue: pipeToLogin,
},
{
provide: CHECK_AUTHENTICATION_STATE_FN_KEY,
useValue: checkAccessToken,
},
{
provide: HTTP_INTERCEPTORS,
useExisting: ApiInterceptor,
multi: true,
},
NavigateToManageProfileProvider,
{
provide: APP_INITIALIZER,
multi: true,
deps: [OAuthConfigurationHandler],
useFactory: noop,
},
OAuthModule.forRoot().providers as Provider[],
{ provide: OAuthStorage, useClass: AbpLocalStorageService },
{ provide: AuthErrorFilterService, useExisting: OAuthErrorFilterService },
];
return makeEnvironmentProviders(providers);
}

2
npm/ng-packs/packages/setting-management/config/src/lib/providers/index.ts

@ -1,3 +1,5 @@
export * from './route.provider'; export * from './route.provider';
export * from './setting-tab.provider'; export * from './setting-tab.provider';
export * from './visible.provider'; export * from './visible.provider';
export * from './setting-management-config.provider';
export * from './features.token';

16
npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-management-config.provider.ts

@ -0,0 +1,16 @@
import { makeEnvironmentProviders } from '@angular/core';
import {
SETTING_MANAGEMENT_FEATURES_PROVIDERS,
SETTING_MANAGEMENT_ROUTE_PROVIDERS,
SETTING_MANAGEMENT_SETTING_TAB_PROVIDERS,
SETTING_MANAGEMENT_VISIBLE_PROVIDERS,
} from './';
export function provideSettingManagementConfig() {
return makeEnvironmentProviders([
SETTING_MANAGEMENT_ROUTE_PROVIDERS,
SETTING_MANAGEMENT_SETTING_TAB_PROVIDERS,
SETTING_MANAGEMENT_FEATURES_PROVIDERS,
SETTING_MANAGEMENT_VISIBLE_PROVIDERS,
]);
}

17
npm/ng-packs/packages/setting-management/config/src/lib/setting-management-config.module.ts

@ -2,27 +2,22 @@ import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { ModuleWithProviders, NgModule } from '@angular/core'; import { ModuleWithProviders, NgModule } from '@angular/core';
import { CoreModule } from '@abp/ng.core'; import { CoreModule } from '@abp/ng.core';
import { NgxValidateCoreModule } from '@ngx-validate/core'; import { NgxValidateCoreModule } from '@ngx-validate/core';
import { SETTING_MANAGEMENT_FEATURES_PROVIDERS } from './providers/features.token';
import { SETTING_MANAGEMENT_VISIBLE_PROVIDERS } from './providers/visible.provider';
import { SETTING_MANAGEMENT_ROUTE_PROVIDERS } from './providers/route.provider';
import { SETTING_MANAGEMENT_SETTING_TAB_PROVIDERS } from './providers/setting-tab.provider';
import { EmailSettingGroupComponent } from './components/email-setting-group/email-setting-group.component'; import { EmailSettingGroupComponent } from './components/email-setting-group/email-setting-group.component';
import { provideSettingManagementConfig } from './providers';
@NgModule({ @NgModule({
imports: [CoreModule,ThemeSharedModule,NgxValidateCoreModule], imports: [CoreModule, ThemeSharedModule, NgxValidateCoreModule],
declarations: [EmailSettingGroupComponent], declarations: [EmailSettingGroupComponent],
exports: [EmailSettingGroupComponent], exports: [EmailSettingGroupComponent],
}) })
export class SettingManagementConfigModule { export class SettingManagementConfigModule {
/**
* @deprecated forRoot method is deprecated, use `provideSettingManagementConfig` *function* for config settings.
*/
static forRoot(): ModuleWithProviders<SettingManagementConfigModule> { static forRoot(): ModuleWithProviders<SettingManagementConfigModule> {
return { return {
ngModule: SettingManagementConfigModule, ngModule: SettingManagementConfigModule,
providers: [ providers: [provideSettingManagementConfig()],
SETTING_MANAGEMENT_ROUTE_PROVIDERS,
SETTING_MANAGEMENT_SETTING_TAB_PROVIDERS,
SETTING_MANAGEMENT_FEATURES_PROVIDERS,
SETTING_MANAGEMENT_VISIBLE_PROVIDERS,
],
}; };
} }
} }

1
npm/ng-packs/packages/tenant-management/config/src/providers/index.ts

@ -1 +1,2 @@
export * from './route.provider'; export * from './route.provider';
export * from './tenant-management-config.provider';

6
npm/ng-packs/packages/tenant-management/config/src/providers/tenant-management-config.provider.ts

@ -0,0 +1,6 @@
import { makeEnvironmentProviders } from '@angular/core';
import { TENANT_MANAGEMENT_ROUTE_PROVIDERS } from './';
export function provideTenantManagementConfig() {
return makeEnvironmentProviders([TENANT_MANAGEMENT_ROUTE_PROVIDERS]);
}

7
npm/ng-packs/packages/tenant-management/config/src/tenant-management-config.module.ts

@ -1,12 +1,15 @@
import { ModuleWithProviders, NgModule } from '@angular/core'; import { ModuleWithProviders, NgModule } from '@angular/core';
import { TENANT_MANAGEMENT_ROUTE_PROVIDERS } from './providers/route.provider'; import { provideTenantManagementConfig } from './providers';
/**
* @deprecated TenantManagementConfigModule is deprecated use `provideTenantManagementConfig` *function* instead.
*/
@NgModule() @NgModule()
export class TenantManagementConfigModule { export class TenantManagementConfigModule {
static forRoot(): ModuleWithProviders<TenantManagementConfigModule> { static forRoot(): ModuleWithProviders<TenantManagementConfigModule> {
return { return {
ngModule: TenantManagementConfigModule, ngModule: TenantManagementConfigModule,
providers: [TENANT_MANAGEMENT_ROUTE_PROVIDERS], providers: [provideTenantManagementConfig()],
}; };
} }
} }

4
npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts

@ -1,5 +1,4 @@
import { CoreModule, LazyModuleFactory } from '@abp/ng.core'; import { CoreModule, LazyModuleFactory } from '@abp/ng.core';
import { FeatureManagementModule } from '@abp/ng.feature-management';
import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { ExtensibleModule } from '@abp/ng.components/extensible'; import { ExtensibleModule } from '@abp/ng.components/extensible';
import { ModuleWithProviders, NgModule, NgModuleFactory } from '@angular/core'; import { ModuleWithProviders, NgModule, NgModuleFactory } from '@angular/core';
@ -17,6 +16,7 @@ import {
TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS,
} from './tokens/extensions.token'; } from './tokens/extensions.token';
import { PageModule } from '@abp/ng.components/page'; import { PageModule } from '@abp/ng.components/page';
import { FeatureManagementComponent } from '@abp/ng.feature-management';
@NgModule({ @NgModule({
declarations: [TenantsComponent], declarations: [TenantsComponent],
@ -27,9 +27,9 @@ import { PageModule } from '@abp/ng.components/page';
CoreModule, CoreModule,
ThemeSharedModule, ThemeSharedModule,
NgbDropdownModule, NgbDropdownModule,
FeatureManagementModule,
ExtensibleModule, ExtensibleModule,
PageModule, PageModule,
FeatureManagementComponent,
], ],
}) })
export class TenantManagementModule { export class TenantManagementModule {

1
npm/ng-packs/packages/theme-basic/src/lib/providers/index.ts

@ -1,3 +1,4 @@
export * from './nav-item.provider'; export * from './nav-item.provider';
export * from './styles.provider'; export * from './styles.provider';
export * from './user-menu.provider'; export * from './user-menu.provider';
export * from './theme-basic-config.provider';

39
npm/ng-packs/packages/theme-basic/src/lib/providers/theme-basic-config.provider.ts

@ -0,0 +1,39 @@
import { APP_INITIALIZER, makeEnvironmentProviders } from '@angular/core';
import { noop } from '@abp/ng.core';
import {
VALIDATION_ERROR_TEMPLATE,
VALIDATION_TARGET_SELECTOR,
VALIDATION_INVALID_CLASSES,
} from '@ngx-validate/core';
import { LazyStyleHandler } from '../handlers';
import { BASIC_THEME_NAV_ITEM_PROVIDERS } from './nav-item.provider';
import { BASIC_THEME_STYLES_PROVIDERS } from './styles.provider';
import { BASIC_THEME_USER_MENU_PROVIDERS } from './user-menu.provider';
import { ValidationErrorComponent } from '../components';
export function provideThemeBasicConfig() {
return makeEnvironmentProviders([
BASIC_THEME_NAV_ITEM_PROVIDERS,
BASIC_THEME_USER_MENU_PROVIDERS,
BASIC_THEME_STYLES_PROVIDERS,
{
provide: VALIDATION_ERROR_TEMPLATE,
useValue: ValidationErrorComponent,
},
{
provide: VALIDATION_TARGET_SELECTOR,
useValue: '.form-group',
},
{
provide: VALIDATION_INVALID_CLASSES,
useValue: 'is-invalid',
},
LazyStyleHandler,
{
provide: APP_INITIALIZER,
useFactory: noop,
multi: true,
deps: [LazyStyleHandler],
},
]);
}

44
npm/ng-packs/packages/theme-basic/src/lib/theme-basic.module.ts

@ -1,13 +1,8 @@
import { CoreModule, noop } from '@abp/ng.core'; import { CoreModule } from '@abp/ng.core';
import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; import { ModuleWithProviders, NgModule } from '@angular/core';
import { NgbCollapseModule, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbCollapseModule, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
import { import { NgxValidateCoreModule } from '@ngx-validate/core';
NgxValidateCoreModule,
VALIDATION_ERROR_TEMPLATE,
VALIDATION_INVALID_CLASSES,
VALIDATION_TARGET_SELECTOR,
} from '@ngx-validate/core';
import { AccountLayoutComponent } from './components/account-layout/account-layout.component'; import { AccountLayoutComponent } from './components/account-layout/account-layout.component';
import { AuthWrapperComponent } from './components/account-layout/auth-wrapper/auth-wrapper.component'; import { AuthWrapperComponent } from './components/account-layout/auth-wrapper/auth-wrapper.component';
import { TenantBoxComponent } from './components/account-layout/tenant-box/tenant-box.component'; import { TenantBoxComponent } from './components/account-layout/tenant-box/tenant-box.component';
@ -20,10 +15,7 @@ import { NavItemsComponent } from './components/nav-items/nav-items.component';
import { PageAlertContainerComponent } from './components/page-alert-container/page-alert-container.component'; import { PageAlertContainerComponent } from './components/page-alert-container/page-alert-container.component';
import { RoutesComponent } from './components/routes/routes.component'; import { RoutesComponent } from './components/routes/routes.component';
import { ValidationErrorComponent } from './components/validation-error/validation-error.component'; import { ValidationErrorComponent } from './components/validation-error/validation-error.component';
import { LazyStyleHandler } from './handlers/lazy-style.handler'; import { provideThemeBasicConfig } from './providers';
import { BASIC_THEME_NAV_ITEM_PROVIDERS } from './providers/nav-item.provider';
import { BASIC_THEME_STYLES_PROVIDERS } from './providers/styles.provider';
import { BASIC_THEME_USER_MENU_PROVIDERS } from './providers/user-menu.provider';
export const LAYOUTS = [ApplicationLayoutComponent, AccountLayoutComponent, EmptyLayoutComponent]; export const LAYOUTS = [ApplicationLayoutComponent, AccountLayoutComponent, EmptyLayoutComponent];
@ -65,33 +57,13 @@ export class BaseThemeBasicModule {}
imports: [BaseThemeBasicModule], imports: [BaseThemeBasicModule],
}) })
export class ThemeBasicModule { export class ThemeBasicModule {
/**
* @deprecated forRoot method is deprecated, use `provideThemeBasicConfig` *function* for config settings.
*/
static forRoot(): ModuleWithProviders<ThemeBasicModule> { static forRoot(): ModuleWithProviders<ThemeBasicModule> {
return { return {
ngModule: ThemeBasicModule, ngModule: ThemeBasicModule,
providers: [ providers: [provideThemeBasicConfig()],
BASIC_THEME_NAV_ITEM_PROVIDERS,
BASIC_THEME_USER_MENU_PROVIDERS,
BASIC_THEME_STYLES_PROVIDERS,
{
provide: VALIDATION_ERROR_TEMPLATE,
useValue: ValidationErrorComponent,
},
{
provide: VALIDATION_TARGET_SELECTOR,
useValue: '.form-group',
},
{
provide: VALIDATION_INVALID_CLASSES,
useValue: 'is-invalid',
},
LazyStyleHandler,
{
provide: APP_INITIALIZER,
useFactory: noop,
multi: true,
deps: [LazyStyleHandler],
},
],
}; };
} }
} }

1
npm/ng-packs/packages/theme-shared/src/lib/providers/index.ts

@ -2,3 +2,4 @@ export * from './ng-bootstrap-config.provider';
export * from './route.provider'; export * from './route.provider';
export * from './tenant-not-found.provider'; export * from './tenant-not-found.provider';
export * from './error-handlers.provider'; export * from './error-handlers.provider';
export * from './theme-shared-config.provider';

161
npm/ng-packs/packages/theme-shared/src/lib/providers/theme-shared-config.provider.ts

@ -0,0 +1,161 @@
import { APP_INITIALIZER, Provider, makeEnvironmentProviders } from '@angular/core';
import { noop } from '@abp/ng.core';
import { NgbDateParserFormatter } from '@ng-bootstrap/ng-bootstrap';
import {
VALIDATION_BLUEPRINTS,
VALIDATION_MAP_ERRORS_FN,
defaultMapErrorsFn,
VALIDATION_VALIDATE_ON_SUBMIT,
Validation,
} from '@ngx-validate/core';
import { DEFAULT_VALIDATION_BLUEPRINTS } from '../constants';
import { DocumentDirHandlerService, ErrorHandler } from '../handlers';
import { HttpErrorConfig } from '../models';
import {
THEME_SHARED_APPEND_CONTENT,
HTTP_ERROR_CONFIG,
CONFIRMATION_ICONS,
ConfirmationIcons,
DEFAULT_CONFIRMATION_ICONS,
} from '../tokens';
import { DateParserFormatter } from '../utils';
import {
DEFAULT_HANDLERS_PROVIDERS,
NG_BOOTSTRAP_CONFIG_PROVIDERS,
THEME_SHARED_ROUTE_PROVIDERS,
tenantNotFoundProvider,
} from './';
export enum ThemeSharedFeatureKind {
HttpErrorConfig,
ValidationBluePrint,
ValidationErrorsFn,
ValidateOnSubmit,
Validation,
ConfirmationIcons,
}
export interface ThemeSharedFeature<KindT extends ThemeSharedFeatureKind> {
ɵkind: KindT;
ɵproviders: Provider[];
}
function makeThemeSharedFeature<KindT extends ThemeSharedFeatureKind>(
kind: KindT,
providers: Provider[],
): ThemeSharedFeature<KindT> {
return {
ɵkind: kind,
ɵproviders: providers,
};
}
export function withHttpErrorConfig(
httpErrorConfig: HttpErrorConfig,
): ThemeSharedFeature<ThemeSharedFeatureKind.HttpErrorConfig> {
return makeThemeSharedFeature(ThemeSharedFeatureKind.HttpErrorConfig, [
{
provide: HTTP_ERROR_CONFIG,
useValue: httpErrorConfig,
},
]);
}
export function withValidationBluePrint(
bluePrints: Validation.Blueprints,
): ThemeSharedFeature<ThemeSharedFeatureKind.ValidationBluePrint> {
return makeThemeSharedFeature(ThemeSharedFeatureKind.ValidationBluePrint, [
{
provide: VALIDATION_BLUEPRINTS,
useValue: {
...DEFAULT_VALIDATION_BLUEPRINTS,
...(bluePrints || {}),
},
},
]);
}
export function withValidationMapErrorsFn(
mapErrorsFn: Validation.MapErrorsFn,
): ThemeSharedFeature<ThemeSharedFeatureKind.ValidationErrorsFn> {
return makeThemeSharedFeature(ThemeSharedFeatureKind.ValidationErrorsFn, [
{
provide: VALIDATION_MAP_ERRORS_FN,
useValue: mapErrorsFn || defaultMapErrorsFn,
},
]);
}
export function withValidateOnSubmit(
validateOnSubmit: boolean,
): ThemeSharedFeature<ThemeSharedFeatureKind.ValidateOnSubmit> {
return makeThemeSharedFeature(ThemeSharedFeatureKind.ValidateOnSubmit, [
{
provide: VALIDATION_VALIDATE_ON_SUBMIT,
useValue: validateOnSubmit,
},
]);
}
export function withConfirmationIcon(
confirmationIcons: Partial<ConfirmationIcons>,
): ThemeSharedFeature<ThemeSharedFeatureKind.HttpErrorConfig> {
return makeThemeSharedFeature(ThemeSharedFeatureKind.HttpErrorConfig, [
{
provide: CONFIRMATION_ICONS,
useValue: { ...DEFAULT_CONFIRMATION_ICONS, ...(confirmationIcons || {}) },
},
]);
}
export function provideAbpThemeShared(...features: ThemeSharedFeature<ThemeSharedFeatureKind>[]) {
const providers = [
{
provide: APP_INITIALIZER,
multi: true,
deps: [ErrorHandler],
useFactory: noop,
},
THEME_SHARED_ROUTE_PROVIDERS,
{
provide: APP_INITIALIZER,
multi: true,
deps: [THEME_SHARED_APPEND_CONTENT],
useFactory: noop,
},
{ provide: HTTP_ERROR_CONFIG, useValue: undefined },
{ provide: NgbDateParserFormatter, useClass: DateParserFormatter },
NG_BOOTSTRAP_CONFIG_PROVIDERS,
{
provide: VALIDATION_BLUEPRINTS,
useValue: { ...DEFAULT_VALIDATION_BLUEPRINTS },
},
{
provide: VALIDATION_MAP_ERRORS_FN,
useValue: defaultMapErrorsFn,
},
{
provide: VALIDATION_VALIDATE_ON_SUBMIT,
useValue: undefined,
},
DocumentDirHandlerService,
{
provide: APP_INITIALIZER,
useFactory: noop,
multi: true,
deps: [DocumentDirHandlerService],
},
{
provide: CONFIRMATION_ICONS,
useValue: { ...DEFAULT_CONFIRMATION_ICONS },
},
tenantNotFoundProvider,
DEFAULT_HANDLERS_PROVIDERS,
];
for (const feature of features) {
providers.push(...feature.ɵproviders);
}
return makeEnvironmentProviders(providers);
}

89
npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts

@ -1,14 +1,8 @@
import { CoreModule, noop } from '@abp/ng.core'; import { CoreModule } from '@abp/ng.core';
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; import { ModuleWithProviders, NgModule } from '@angular/core';
import { NgbDateParserFormatter, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';
import { import { NgxValidateCoreModule } from '@ngx-validate/core';
defaultMapErrorsFn,
NgxValidateCoreModule,
VALIDATION_BLUEPRINTS,
VALIDATION_MAP_ERRORS_FN,
VALIDATION_VALIDATE_ON_SUBMIT,
} from '@ngx-validate/core';
import { NgxDatatableModule } from '@swimlane/ngx-datatable'; import { NgxDatatableModule } from '@swimlane/ngx-datatable';
import { BreadcrumbItemsComponent } from './components/breadcrumb-items/breadcrumb-items.component'; import { BreadcrumbItemsComponent } from './components/breadcrumb-items/breadcrumb-items.component';
import { BreadcrumbComponent } from './components/breadcrumb/breadcrumb.component'; import { BreadcrumbComponent } from './components/breadcrumb/breadcrumb.component';
@ -21,26 +15,24 @@ import { ModalCloseDirective } from './components/modal/modal-close.directive';
import { ModalComponent } from './components/modal/modal.component'; import { ModalComponent } from './components/modal/modal.component';
import { ToastContainerComponent } from './components/toast-container/toast-container.component'; import { ToastContainerComponent } from './components/toast-container/toast-container.component';
import { ToastComponent } from './components/toast/toast.component'; import { ToastComponent } from './components/toast/toast.component';
import { DEFAULT_VALIDATION_BLUEPRINTS } from './constants/validation';
import { EllipsisDirective } from './directives/ellipsis.directive'; import { EllipsisDirective } from './directives/ellipsis.directive';
import { LoadingDirective } from './directives/loading.directive'; import { LoadingDirective } from './directives/loading.directive';
import { NgxDatatableDefaultDirective } from './directives/ngx-datatable-default.directive'; import { NgxDatatableDefaultDirective } from './directives/ngx-datatable-default.directive';
import { NgxDatatableListDirective } from './directives/ngx-datatable-list.directive'; import { NgxDatatableListDirective } from './directives/ngx-datatable-list.directive';
import { DocumentDirHandlerService } from './handlers/document-dir.handler';
import { ErrorHandler } from './handlers/error.handler';
import { RootParams } from './models/common'; import { RootParams } from './models/common';
import { DEFAULT_HANDLERS_PROVIDERS, NG_BOOTSTRAP_CONFIG_PROVIDERS } from './providers'; import {
import { THEME_SHARED_ROUTE_PROVIDERS } from './providers/route.provider'; provideAbpThemeShared,
import { THEME_SHARED_APPEND_CONTENT } from './tokens/append-content.token'; withConfirmationIcon,
import { HTTP_ERROR_CONFIG } from './tokens/http-error.token'; withHttpErrorConfig,
import { DateParserFormatter } from './utils/date-parser-formatter'; withValidateOnSubmit,
import { CONFIRMATION_ICONS, DEFAULT_CONFIRMATION_ICONS } from './tokens/confirmation-icons.token'; withValidationBluePrint,
withValidationMapErrorsFn,
} from './providers';
import { PasswordComponent } from './components/password/password.component'; import { PasswordComponent } from './components/password/password.component';
import { CardModule } from './components/card/card.module'; import { CardModule } from './components/card/card.module';
import { AbpVisibleDirective, DisabledDirective } from './directives'; import { AbpVisibleDirective, DisabledDirective } from './directives';
import { FormInputComponent } from './components/form-input/form-input.component'; import { FormInputComponent } from './components/form-input/form-input.component';
import { FormCheckboxComponent } from './components/checkbox/checkbox.component'; import { FormCheckboxComponent } from './components/checkbox/checkbox.component';
import { tenantNotFoundProvider } from './providers/tenant-not-found.provider';
const declarationsWithExports = [ const declarationsWithExports = [
BreadcrumbComponent, BreadcrumbComponent,
@ -93,59 +85,22 @@ export class BaseThemeSharedModule {}
exports: [BaseThemeSharedModule], exports: [BaseThemeSharedModule],
}) })
export class ThemeSharedModule { export class ThemeSharedModule {
/**
* @deprecated forRoot method is deprecated, use `provideAbpThemeShared` *function* for config settings.
*/
static forRoot( static forRoot(
{ httpErrorConfig, validation = {}, confirmationIcons = {} } = {} as RootParams, { httpErrorConfig, validation = {}, confirmationIcons = {} } = {} as RootParams,
): ModuleWithProviders<ThemeSharedModule> { ): ModuleWithProviders<ThemeSharedModule> {
return { return {
ngModule: ThemeSharedModule, ngModule: ThemeSharedModule,
providers: [ providers: [
{ provideAbpThemeShared(
provide: APP_INITIALIZER, withHttpErrorConfig(httpErrorConfig),
multi: true, withValidationBluePrint(validation.blueprints),
deps: [ErrorHandler], withValidationMapErrorsFn(validation.mapErrorsFn),
useFactory: noop, withValidateOnSubmit(validation.validateOnSubmit),
}, withConfirmationIcon(confirmationIcons),
THEME_SHARED_ROUTE_PROVIDERS, ),
{
provide: APP_INITIALIZER,
multi: true,
deps: [THEME_SHARED_APPEND_CONTENT],
useFactory: noop,
},
{ provide: HTTP_ERROR_CONFIG, useValue: httpErrorConfig },
{ provide: NgbDateParserFormatter, useClass: DateParserFormatter },
NG_BOOTSTRAP_CONFIG_PROVIDERS,
{
provide: VALIDATION_BLUEPRINTS,
useValue: {
...DEFAULT_VALIDATION_BLUEPRINTS,
...(validation.blueprints || {}),
},
},
{
provide: VALIDATION_MAP_ERRORS_FN,
useValue: validation.mapErrorsFn || defaultMapErrorsFn,
},
{
provide: VALIDATION_VALIDATE_ON_SUBMIT,
useValue: validation.validateOnSubmit,
},
DocumentDirHandlerService,
{
provide: APP_INITIALIZER,
useFactory: noop,
multi: true,
deps: [DocumentDirHandlerService],
},
{
provide: CONFIRMATION_ICONS,
useValue: {
...DEFAULT_CONFIRMATION_ICONS,
...(confirmationIcons || {}),
},
},
tenantNotFoundProvider,
DEFAULT_HANDLERS_PROVIDERS,
], ],
}; };
} }

1
npm/ng-packs/packages/theme-shared/src/lib/tokens/index.ts

@ -2,3 +2,4 @@ export * from './append-content.token';
export * from './http-error.token'; export * from './http-error.token';
export * from './ngx-datatable-messages.token'; export * from './ngx-datatable-messages.token';
export * from './suppress-unsaved-changes-warning.token'; export * from './suppress-unsaved-changes-warning.token';
export * from './confirmation-icons.token';

Loading…
Cancel
Save