common-ui/src/lib/common-ui.module.ts

113 lines
4.3 KiB
TypeScript

import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MatIconModule } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core';
import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner';
import { SortByPipe } from './sorting';
import { CommonUiOptions, IqserAppConfig, ModuleWithOptions } from './utils';
import { HiddenActionComponent, ToastComponent } from './shared';
import { ConnectionStatusComponent, FullPageErrorComponent } from './error';
import { IqserListingModule } from './listing';
import { IqserFiltersModule } from './filtering';
import { IqserInputsModule } from './inputs';
import { IqserIconsModule } from './icons';
import { IqserButtonsModule } from './buttons';
import { IqserScrollbarModule } from './scrollbar';
import { IqserEmptyStatesModule } from './empty-states';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox';
import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar';
import { ConfirmationDialogComponent } from './dialog';
import { MatTooltipModule } from '@angular/material/tooltip';
import { ApiPathInterceptor, DefaultUserPreferenceService, IqserConfigService, IqserUserPreferenceService } from './services';
import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
import { IqserSkeletonModule } from './skeleton/skeleton.module';
import { MatDialogModule } from '@angular/material/dialog';
const matModules = [
MatIconModule,
MatProgressSpinnerModule,
MatButtonModule,
MatDialogModule,
MatCheckboxModule,
MatTooltipModule,
MatProgressBarModule,
];
const modules = [
IqserIconsModule,
IqserButtonsModule,
IqserListingModule,
IqserFiltersModule,
IqserInputsModule,
IqserScrollbarModule,
IqserEmptyStatesModule,
IqserSkeletonModule,
HttpClientModule,
];
const components = [ConnectionStatusComponent, FullPageErrorComponent, HiddenActionComponent, ConfirmationDialogComponent, ToastComponent];
const pipes = [SortByPipe];
@NgModule({
declarations: [...components, ...pipes],
imports: [CommonModule, ...matModules, ...modules, FormsModule, ReactiveFormsModule, TranslateModule],
exports: [...components, ...pipes, ...modules],
providers: [
{
provide: HTTP_INTERCEPTORS,
multi: true,
useClass: ApiPathInterceptor,
},
],
})
export class CommonUiModule extends ModuleWithOptions {
constructor(@Optional() @SkipSelf() parentModule?: CommonUiModule) {
super();
if (parentModule) {
throw new Error('CommonUiModule is already loaded. Import it in the AppModule only!');
}
}
static forRoot<
UserPreference extends IqserUserPreferenceService,
Config extends IqserConfigService<AppConfig>,
AppConfig extends IqserAppConfig = IqserAppConfig,
>(options: CommonUiOptions<UserPreference, Config, AppConfig>): ModuleWithProviders<CommonUiModule> {
const userPreferenceService = this._getService(
IqserUserPreferenceService,
DefaultUserPreferenceService,
options.existingUserPreferenceService,
);
const configServiceProviders = this._getConfigServiceProviders(options.configServiceFactory, options.configService);
return {
ngModule: CommonUiModule,
providers: [userPreferenceService, configServiceProviders],
};
}
private static _getConfigServiceProviders(configServiceFactory: () => unknown, configService?: unknown) {
if (configService) {
return [
{
provide: configService,
useFactory: configServiceFactory,
},
{
provide: IqserConfigService,
useExisting: configService,
},
];
}
return [
{
provide: IqserConfigService,
useFactory: configServiceFactory,
},
];
}
}