From 1f69b828ce9d4b2c883b7c1abb42d2a5dad3e466 Mon Sep 17 00:00:00 2001 From: bnymncoskuner Date: Tue, 2 Nov 2021 14:42:46 +0300 Subject: [PATCH 1/5] fix: strict mode errors --- npm/ng-packs/apps/dev-app/tsconfig.json | 8 +- .../src/lib/directives/autofocus.directive.ts | 10 ++- .../lib/directives/permission.directive.ts | 8 +- .../replaceable-template.directive.ts | 10 +-- .../packages/core/src/lib/models/common.ts | 2 +- .../src/lib/models/replaceable-components.ts | 4 +- .../core/src/lib/pipes/localization.pipe.ts | 23 ++++-- .../src/lib/services/config-state.service.ts | 8 +- .../src/lib/services/environment.service.ts | 4 +- .../services/http-error-reporter.service.ts | 2 +- .../src/lib/services/lazy-load.service.ts | 2 +- .../components/tenants/tenants.component.ts | 10 +-- .../default-tenants-toolbar-actions.ts | 2 +- .../tenant-box/tenant-box.component.html | 2 +- .../nav-items/current-user.component.ts | 2 +- .../nav-items/languages.component.ts | 6 +- .../lib/components/routes/routes.component.ts | 4 +- .../validation-error.component.ts | 2 +- .../src/lib/services/layout.service.ts | 6 +- .../src/lib/adapters/date-time.adapter.ts | 9 ++- .../src/lib/adapters/date.adapter.ts | 2 +- .../src/lib/adapters/time.adapter.ts | 2 +- .../abstract-actions.component.ts | 2 +- .../date-time-picker.component.ts | 6 +- .../extensible-form-prop.component.ts | 18 ++--- .../extensible-form.component.ts | 6 +- .../src/lib/directives/prop-data.directive.ts | 6 +- .../extensions/src/lib/models/actions.ts | 2 +- .../extensions/src/lib/models/props.ts | 2 +- .../src/lib/models/toolbar-actions.ts | 4 +- .../extensions/src/lib/utils/enum.util.ts | 2 +- .../extensions/src/lib/utils/state.util.ts | 9 ++- .../src/lib/utils/typeahead.util.ts | 16 ++-- .../src/lib/utils/validation.util.ts | 5 +- .../breadcrumb-items.component.ts | 3 +- .../lib/components/button/button.component.ts | 12 +-- .../confirmation/confirmation.component.ts | 4 +- .../http-error-wrapper.component.ts | 24 +++--- .../loader-bar/loader-bar.component.ts | 2 +- .../lib/components/modal/modal-ref.service.ts | 2 +- .../lib/components/modal/modal.component.html | 4 +- .../lib/components/modal/modal.component.ts | 38 +++++----- .../toast-container.component.ts | 14 ++-- .../lib/components/toast/toast.component.html | 2 +- .../lib/components/toast/toast.component.ts | 4 +- .../src/lib/directives/ellipsis.directive.ts | 4 +- .../src/lib/directives/loading.directive.ts | 12 +-- .../ngx-datatable-list.directive.ts | 2 +- .../src/lib/handlers/error.handler.ts | 74 +++++++++++-------- .../src/lib/handlers/lazy-style.handler.ts | 10 +-- .../theme-shared/src/lib/models/nav-item.ts | 2 +- .../src/lib/services/confirmation.service.ts | 6 +- .../src/lib/services/toaster.service.ts | 4 +- .../src/lib/utils/date-parser-formatter.ts | 7 +- npm/ng-packs/tsconfig.json | 1 + 55 files changed, 233 insertions(+), 204 deletions(-) diff --git a/npm/ng-packs/apps/dev-app/tsconfig.json b/npm/ng-packs/apps/dev-app/tsconfig.json index 13552f8b6a..38576d131e 100644 --- a/npm/ng-packs/apps/dev-app/tsconfig.json +++ b/npm/ng-packs/apps/dev-app/tsconfig.json @@ -15,14 +15,14 @@ ], "compilerOptions": { "forceConsistentCasingInFileNames": true, - "strict": false, + "strict": true, "noImplicitReturns": false, "noFallthroughCasesInSwitch": true, - "allowSyntheticDefaultImports": true, + "allowSyntheticDefaultImports": true }, "angularCompilerOptions": { "strictInjectionParameters": true, - "strictInputAccessModifiers": false, - "strictTemplates": false + "strictInputAccessModifiers": true, + "strictTemplates": true } } diff --git a/npm/ng-packs/packages/core/src/lib/directives/autofocus.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/autofocus.directive.ts index 40b0fe0b0b..2f9cc13a7e 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/autofocus.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/autofocus.directive.ts @@ -5,8 +5,16 @@ import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core'; selector: '[autofocus]', }) export class AutofocusDirective implements AfterViewInit { + private _delay = 0; + @Input('autofocus') - delay = 0; + set delay(val: number | undefined) { + this._delay = val ?? 0; + } + + get delay() { + return this._delay; + } constructor(private elRef: ElementRef) {} diff --git a/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts index 891c4c6e8c..08d7d5abe7 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts @@ -1,12 +1,10 @@ import { ChangeDetectorRef, Directive, - ElementRef, Input, OnChanges, OnDestroy, Optional, - Renderer2, TemplateRef, ViewContainerRef, } from '@angular/core'; @@ -18,13 +16,11 @@ import { PermissionService } from '../services/permission.service'; selector: '[abpPermission]', }) export class PermissionDirective implements OnDestroy, OnChanges { - @Input('abpPermission') condition: string; + @Input('abpPermission') condition!: string; - subscription: Subscription; + subscription!: Subscription; constructor( - private elRef: ElementRef, - private renderer: Renderer2, @Optional() private templateRef: TemplateRef, private vcRef: ViewContainerRef, private permissionService: PermissionService, diff --git a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts index f83af059f6..329cf4f4ed 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts @@ -24,7 +24,7 @@ import { SubscriptionService } from '../services/subscription.service'; }) export class ReplaceableTemplateDirective implements OnInit, OnChanges { @Input('abpReplaceableTemplate') - data: ReplaceableComponents.ReplaceableTemplateDirectiveInput; + data!: ReplaceableComponents.ReplaceableTemplateDirectiveInput; providedData = { inputs: {}, @@ -33,7 +33,7 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges { context = {} as any; - externalComponent: Type; + externalComponent!: Type; defaultComponentRef: any; @@ -50,7 +50,7 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges { private subscription: SubscriptionService, ) { this.context = { - initTemplate: ref => { + initTemplate: (ref: any) => { this.resetDefaultComponent(); this.defaultComponentRef = ref; this.setDefaultComponentInputs(); @@ -121,7 +121,7 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges { if (Object.prototype.hasOwnProperty.call(this.data.outputs, key)) { if (!this.defaultComponentSubscriptions[key]) { this.defaultComponentSubscriptions[key] = this.defaultComponentRef[key].subscribe( - value => { + (value: any) => { this.data.outputs[key](value); }, ); @@ -144,7 +144,7 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges { configurable: true, get: () => this.data.inputs[key].value, ...(this.data.inputs[key].twoWay && { - set: newValue => { + set: (newValue: any) => { this.data.inputs[key].value = newValue; this.data.outputs[`${key}Change`](newValue); }, diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index d99d591ad4..0196ce385a 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -52,7 +52,7 @@ export namespace ABP { } export interface Route extends Nav { - path: string; + path?: string; layout?: eLayoutType; iconClass?: string; } diff --git a/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts index d20768e7ff..ebdc7d1b8b 100644 --- a/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts +++ b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts @@ -16,8 +16,8 @@ export namespace ReplaceableComponents { I, O extends { [K in keyof O]: EventEmitter | Subject }, > { - inputs: { -readonly [K in keyof I]: { value: I[K]; twoWay?: boolean } }; - outputs: { -readonly [K in keyof O]: (value: ABP.ExtractFromOutput) => void }; + inputs?: { -readonly [K in keyof I]: { value: I[K]; twoWay?: boolean } }; + outputs?: { -readonly [K in keyof O]: (value: ABP.ExtractFromOutput) => void }; componentKey: string; } diff --git a/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts b/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts index 50427ec5ed..2dbac68eb7 100644 --- a/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts +++ b/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts @@ -9,13 +9,20 @@ import { LocalizationService } from '../services/localization.service'; export class LocalizationPipe implements PipeTransform { constructor(private localization: LocalizationService) {} - transform(value: string | LocalizationWithDefault = '', ...interpolateParams: string[]): string { - return this.localization.instant( - value, - ...interpolateParams.reduce( - (acc, val) => (Array.isArray(val) ? [...acc, ...val] : [...acc, val]), - [], - ), - ); + transform( + value: string | LocalizationWithDefault = '', + ...interpolateParams: (string | string[] | undefined)[] + ): string { + const params = + interpolateParams.reduce((acc, val) => { + if (!acc) { + return val; + } + if (!val) { + return acc; + } + return Array.isArray(val) ? [...acc, ...val] : [...acc, val]; + }, []) || []; + return this.localization.instant(value, ...params); } } diff --git a/npm/ng-packs/packages/core/src/lib/services/config-state.service.ts b/npm/ng-packs/packages/core/src/lib/services/config-state.service.ts index 3aadfa898b..4223ea97de 100644 --- a/npm/ng-packs/packages/core/src/lib/services/config-state.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/config-state.service.ts @@ -48,14 +48,14 @@ export class ConfigStateService { return this.store.state; } - getDeep$(keys: string[] | string) { + getDeep$(keys: string[] | string): Observable { keys = splitKeys(keys); return this.store .sliceState(state => state) .pipe( map(state => { - return (keys as string[]).reduce((acc, val) => { + return (keys as string[]).reduce((acc: any, val) => { if (acc) { return acc[val]; } @@ -66,10 +66,10 @@ export class ConfigStateService { ); } - getDeep(keys: string[] | string) { + getDeep(keys: string[] | string): any { keys = splitKeys(keys); - return (keys as string[]).reduce((acc, val) => { + return (keys as string[]).reduce((acc: any, val) => { if (acc) { return acc[val]; } diff --git a/npm/ng-packs/packages/core/src/lib/services/environment.service.ts b/npm/ng-packs/packages/core/src/lib/services/environment.service.ts index 10d7664acb..9fd1e280a3 100644 --- a/npm/ng-packs/packages/core/src/lib/services/environment.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/environment.service.ts @@ -23,11 +23,11 @@ export class EnvironmentService { return this.store.state; } - getApiUrl(key?: string) { + getApiUrl(key: string) { return mapToApiUrl(key)(this.store.state.apis); } - getApiUrl$(key?: string) { + getApiUrl$(key: string) { return this.store.sliceState(state => state.apis).pipe(map(mapToApiUrl(key))); } diff --git a/npm/ng-packs/packages/core/src/lib/services/http-error-reporter.service.ts b/npm/ng-packs/packages/core/src/lib/services/http-error-reporter.service.ts index b34402c8cd..65d063f82d 100644 --- a/npm/ng-packs/packages/core/src/lib/services/http-error-reporter.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/http-error-reporter.service.ts @@ -4,7 +4,7 @@ import { BehaviorSubject, Subject } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class HttpErrorReporterService { - private _reporter$ = new Subject(); + private _reporter$ = new Subject(); private _errors$ = new BehaviorSubject([]); get reporter$() { diff --git a/npm/ng-packs/packages/core/src/lib/services/lazy-load.service.ts b/npm/ng-packs/packages/core/src/lib/services/lazy-load.service.ts index 0aca94c94a..3254396b82 100644 --- a/npm/ng-packs/packages/core/src/lib/services/lazy-load.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/lazy-load.service.ts @@ -8,7 +8,7 @@ import { ResourceWaitService } from './resource-wait.service'; providedIn: 'root', }) export class LazyLoadService { - readonly loaded = new Map(); + readonly loaded = new Map(); constructor(private resourceWaitService: ResourceWaitService) {} diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts index b3ebca01b1..10c50a9676 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts @@ -26,18 +26,16 @@ import { eTenantManagementComponents } from '../../enums/components'; export class TenantsComponent implements OnInit { data: PagedResultDto = { items: [], totalCount: 0 }; - selected: TenantDto; + selected!: TenantDto; - tenantForm: FormGroup; + tenantForm!: FormGroup; - isModalVisible: boolean; + isModalVisible!: boolean; visibleFeatures = false; providerKey: string; - _useSharedDatabase: boolean; - modalBusy = false; featureManagementKey = eFeatureManagementComponents.FeatureManagement; @@ -142,7 +140,7 @@ export class TenantsComponent implements OnInit { }, 0); } - sort(data) { + sort(data: any) { const { prop, dir } = data.sorts[0]; this.list.sortKey = prop; this.list.sortOrder = dir; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts index e305186276..8bd590d2f6 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts @@ -7,7 +7,7 @@ export const DEFAULT_TENANTS_TOOLBAR_ACTIONS = ToolbarAction.createMany { const component = data.getInjected(TenantsComponent); - component.openFeaturesModal(null); + component.openFeaturesModal(''); }, permission: 'FeatureManagement.ManageHostFeatures', icon: 'fa fa-cog', diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/tenant-box/tenant-box.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/tenant-box/tenant-box.component.html index ef74c61bc1..46af3658aa 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/tenant-box/tenant-box.component.html +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/tenant-box/tenant-box.component.html @@ -1,4 +1,4 @@ - +
diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts index aa2a144be6..fbfa01882a 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts @@ -21,7 +21,7 @@ export class CurrentUserComponent { } constructor( - @Inject(NAVIGATE_TO_MANAGE_PROFILE) public navigateToManageProfile, + @Inject(NAVIGATE_TO_MANAGE_PROFILE) public navigateToManageProfile: () => void, private authService: AuthService, private configState: ConfigStateService, private sessionState: SessionStateService, diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts index 7ee1000007..41af5ee264 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts @@ -7,7 +7,7 @@ import { map } from 'rxjs/operators'; selector: 'abp-languages', template: ` @@ -52,7 +52,7 @@ export class LanguagesComponent { return this.languages$.pipe( map( languages => - languages?.find(lang => lang.cultureName === this.selectedLangCulture).displayName || '', + languages?.find(lang => lang.cultureName === this.selectedLangCulture)?.displayName || '', ), ); } diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts index 273d9c71fb..1aaa863b93 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts @@ -14,9 +14,9 @@ import { templateUrl: 'routes.component.html', }) export class RoutesComponent { - @Input() smallScreen: boolean; + @Input() smallScreen?: boolean; - @ViewChildren('childrenContainer') childrenContainers: QueryList>; + @ViewChildren('childrenContainer') childrenContainers!: QueryList>; trackByFn: TrackByFunction> = (_, item) => item.name; diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/validation-error/validation-error.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/validation-error/validation-error.component.ts index 97724c0786..e1532ba743 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/validation-error/validation-error.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/validation-error/validation-error.component.ts @@ -12,7 +12,7 @@ import { Validation, ValidationErrorComponent as ErrorComponent } from '@ngx-val encapsulation: ViewEncapsulation.None, }) export class ValidationErrorComponent extends ErrorComponent { - get abpErrors(): Validation.Error[] & { interpoliteParams?: string[] } { + get abpErrors(): (Validation.Error & { interpoliteParams?: string[] })[] { if (!this.errors || !this.errors.length) return []; return this.errors.map(error => { diff --git a/npm/ng-packs/packages/theme-basic/src/lib/services/layout.service.ts b/npm/ng-packs/packages/theme-basic/src/lib/services/layout.service.ts index aaf1fcf036..860f499d55 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/services/layout.service.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/services/layout.service.ts @@ -1,14 +1,14 @@ -import { ChangeDetectorRef, Injectable } from '@angular/core'; -import { eThemeBasicComponents } from '../enums'; import { SubscriptionService } from '@abp/ng.core'; +import { ChangeDetectorRef, Injectable } from '@angular/core'; import { fromEvent } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; +import { eThemeBasicComponents } from '../enums'; @Injectable() export class LayoutService { isCollapsed = true; - smallScreen: boolean; // do not set true or false + smallScreen!: boolean; // do not set true or false logoComponentKey = eThemeBasicComponents.Logo; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date-time.adapter.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date-time.adapter.ts index 10b39627e3..9e74c1eb39 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date-time.adapter.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date-time.adapter.ts @@ -3,7 +3,7 @@ import { NgbDateStruct, NgbTimeStruct } from '@ng-bootstrap/ng-bootstrap'; @Injectable() export class DateTimeAdapter { - value: NgbDateTimeStruct; + value!: NgbDateTimeStruct; fromModel(value: string | Date): NgbDateTimeStruct | null { if (!value) return null; @@ -27,15 +27,16 @@ export class DateTimeAdapter { toModel(value: NgbDateTimeStruct | null): string { if (!value) return ''; - const now = new Date(); + //const now = new Date(); value = { - year: now.getUTCFullYear(), + // TODO + /* year: now.getUTCFullYear(), month: now.getMonth() + 1, day: now.getDate(), hour: 0, minute: 0, - second: 0, + second: 0, */ ...this.value, ...value, }; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date.adapter.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date.adapter.ts index 17db36415e..2f371aa1ca 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date.adapter.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date.adapter.ts @@ -3,7 +3,7 @@ import { Injectable } from '@angular/core'; import { NgbDateAdapter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap'; @Injectable() -export class DateAdapter extends NgbDateAdapter { +export class DateAdapter extends NgbDateAdapter { fromModel(value: string | Date): NgbDateStruct | null { if (!value) return null; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/time.adapter.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/time.adapter.ts index 704d2b6167..c51650b8dd 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/time.adapter.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/time.adapter.ts @@ -3,7 +3,7 @@ import { Injectable } from '@angular/core'; import { NgbTimeAdapter, NgbTimeStruct } from '@ng-bootstrap/ng-bootstrap'; @Injectable() -export class TimeAdapter extends NgbTimeAdapter { +export class TimeAdapter extends NgbTimeAdapter { fromModel(value: string | Date): NgbTimeStruct | null { if (!value) return null; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts index d274b868ff..fd6b6219ae 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts @@ -13,7 +13,7 @@ export abstract class AbstractActionsComponent> extend readonly getInjected: InferredData['getInjected']; - @Input() readonly record: InferredData['record']; + @Input() readonly record!: InferredData['record']; constructor(injector: Injector) { super(); diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/date-time-picker/date-time-picker.component.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/date-time-picker/date-time-picker.component.ts index 7890e65b36..60a2d16f34 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/date-time-picker/date-time-picker.component.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/date-time-picker/date-time-picker.component.ts @@ -58,11 +58,11 @@ import { selfFactory } from '../../utils/factory.util'; ], }) export class DateTimePickerComponent { - @Input() prop: FormProp; + @Input() prop!: FormProp; @Input() meridian = false; - @ViewChild(NgbInputDatepicker) date: NgbInputDatepicker; - @ViewChild(NgbTimepicker) time: NgbTimepicker; + @ViewChild(NgbInputDatepicker) date!: NgbInputDatepicker; + @ViewChild(NgbTimepicker) time!: NgbTimepicker; constructor(public readonly cdRef: ChangeDetectorRef) {} diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts index e52984db53..b022f7e35f 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts @@ -46,13 +46,13 @@ import { addTypeaheadTextSuffix } from '../../utils/typeahead.util'; ], }) export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { - @Input() data: PropData; + @Input() data!: PropData; - @Input() prop: FormProp; + @Input() prop!: FormProp; - @Input() first: boolean; + @Input() first?: boolean; - @ViewChild('field') private fieldRef: ElementRef; + @ViewChild('field') private fieldRef!: ElementRef; asterisk = ''; @@ -60,9 +60,9 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { validators: ValidatorFn[] = []; - readonly: boolean; + readonly!: boolean; - disabled: boolean; + disabled!: boolean; private readonly form: FormGroup; @@ -72,9 +72,9 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { this.typeaheadModel = selectedOption || { key: null, value: null }; const { key, value } = this.typeaheadModel; const [keyControl, valueControl] = this.getTypeaheadControls(); - if (valueControl.value && !value) valueControl.markAsDirty(); - keyControl.setValue(key); - valueControl.setValue(value); + if (valueControl?.value && !value) valueControl.markAsDirty(); + keyControl?.setValue(key); + valueControl?.setValue(value); } search = (text$: Observable) => diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts index f15f173faa..17131e9aaf 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts @@ -33,7 +33,7 @@ import { ExtensibleFormPropComponent } from './extensible-form-prop.component'; }) export class ExtensibleFormComponent { @ViewChildren(ExtensibleFormPropComponent) - formProps: QueryList; + formProps!: QueryList; @Input() set selectedRecord(record: R) { @@ -43,8 +43,8 @@ export class ExtensibleFormComponent { } extraPropertiesKey = EXTRA_PROPERTIES_KEY; - propList: FormPropList; - record: R; + propList!: FormPropList; + record!: R; get form(): FormGroup { return (this.container ? this.container.control : { controls: {} }) as FormGroup; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/directives/prop-data.directive.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/directives/prop-data.directive.ts index f03507b2e2..d4da9169ea 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/directives/prop-data.directive.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/directives/prop-data.directive.ts @@ -18,11 +18,11 @@ export class PropDataDirective> extends PropData> implements OnChanges, OnDestroy { - @Input('abpPropDataFromList') readonly propList: L; + @Input('abpPropDataFromList') readonly propList?: L; - @Input('abpPropDataWithRecord') readonly record: InferredData['record']; + @Input('abpPropDataWithRecord') readonly record!: InferredData['record']; - @Input('abpPropDataAtIndex') readonly index: number; + @Input('abpPropDataAtIndex') readonly index?: number; readonly getInjected: InferredData['getInjected']; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/actions.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/actions.ts index bbc6b77cd9..890899e515 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/actions.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/actions.ts @@ -32,7 +32,7 @@ export abstract class Action { ) {} } -export type ActionCallback = (data?: Omit, 'data'>) => R; +export type ActionCallback = (data: Omit, 'data'>) => R; export type ActionPredicate = (data?: Omit, 'data'>) => boolean; export abstract class ActionsFactory> { diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts index 60b409c4ae..66fc4f2c67 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts @@ -38,7 +38,7 @@ export abstract class Prop { } } -export type PropCallback = (data?: Omit, 'data'>, auxData?: any) => R; +export type PropCallback = (data: Omit, 'data'>, auxData?: any) => R; export type PropPredicate = (data?: Omit, 'data'>, auxData?: any) => boolean; export abstract class PropsFactory> { diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts index 5d669aa85e..9a688cc20f 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts @@ -27,7 +27,7 @@ export class ToolbarAction extends Action { readonly icon: string; constructor(options: ToolbarActionOptions) { - super(options.permission, options.visible, options.action); + super(options.permission || '', options.visible, options.action); this.text = options.text; this.icon = options.icon || ''; } @@ -45,7 +45,7 @@ export class ToolbarComponent extends Action { readonly component: Type; constructor(options: ToolbarComponentOptions) { - super(options.permission, options.visible, options.action); + super(options.permission || '', options.visible, options.action); this.component = options.component; } diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/enum.util.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/enum.util.ts index bb8da3694f..1d0c8bc699 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/enum.util.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/enum.util.ts @@ -68,6 +68,6 @@ function createEnumLocalizer( ); } -function getShortEnumType(enumType: string): string { +function getShortEnumType(enumType: string) { return enumType.split('.').pop(); } diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/state.util.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/state.util.ts index 96d83ba8f7..c8e2b03e36 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/state.util.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/state.util.ts @@ -74,7 +74,7 @@ export function mapEntitiesToContributors( resource: string, ) { return pipe( - switchMap(entities => + switchMap((entities: any) => zip(selectLocalization(configState), selectEnums(configState)).pipe( map(([localization, enums]) => { const generateDisplayName = createDisplayNameLocalizationPipeKeyGenerator(localization); @@ -166,8 +166,9 @@ function createPropertiesToContributorsMapper( if (isOnCreateForm || isOnEditForm) { const defaultValue = property.defaultValue; const validators = () => getValidatorsFromProperty(property); - let options: PropCallback[]>>; - if (type === ePropType.Enum) options = createEnumOptions(propName, enums[property.type]); + let options: PropCallback[]>> | undefined; + if (type === ePropType.Enum) + options = createEnumOptions(propName, enums[property.type || '']); else if (type === ePropType.Typeahead) options = createTypeaheadOptions(lookup); const formProp = new FormProp({ @@ -192,7 +193,7 @@ function createPropertiesToContributorsMapper( } function getTypeFromProperty(property: ObjectExtensions.ExtensionPropertyDto): ePropType { - return property.typeSimple.replace(/\?$/, '') as string as ePropType; + return property?.typeSimple?.replace(/\?$/, '') as string as ePropType; } function isUndefined(obj: any): obj is undefined { diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/typeahead.util.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/typeahead.util.ts index b34528104d..b8038b7a69 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/typeahead.util.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/typeahead.util.ts @@ -12,25 +12,25 @@ export function createTypeaheadOptions( lookup: ExtensionPropertyUiLookupDto, ): PropCallback[]>> { return (data, searchText) => - searchText + searchText && data ? data .getInjected(RestService) .request( { method: 'GET', - url: lookup.url, + url: lookup.url || '', params: { - [lookup.filterParamName]: searchText, + [lookup.filterParamName || '']: searchText, }, }, { apiName: 'Default' }, ) .pipe( - map(response => { - const list = response[lookup.resultListPropertyName]; + map((response: any) => { + const list = response[lookup.resultListPropertyName || '']; const mapToOption = (item: any) => ({ - key: item[lookup.displayPropertyName], - value: item[lookup.valuePropertyName], + key: item[lookup.displayPropertyName || ''], + value: item[lookup.valuePropertyName || ''], }); return list.map(mapToOption); }), @@ -51,7 +51,7 @@ export function createTypeaheadDisplayNameGenerator( properties: ObjectExtensions.EntityExtensionProperties, ): ObjectExtensions.DisplayNameGeneratorFn { return (displayName, fallback) => { - const name = removeTypeaheadTextSuffix(fallback.name); + const name = removeTypeaheadTextSuffix(fallback.name || ''); return displayNameGeneratorFn(displayName || properties[name].displayName, { name, resource: fallback.resource, diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/validation.util.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/validation.util.ts index d87c6c1260..0b9ef44ac0 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/validation.util.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/validation.util.ts @@ -8,8 +8,9 @@ export function getValidatorsFromProperty( const validators: ValidatorFn[] = []; property.attributes.forEach(attr => { - if (attr.typeSimple in AbpValidators) - validators.push(AbpValidators[attr.typeSimple](attr.config)); + if (attr.typeSimple && attr.typeSimple in AbpValidators) { + validators.push((AbpValidators as any)[attr.typeSimple](attr.config)); + } }); return validators; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb-items/breadcrumb-items.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb-items/breadcrumb-items.component.ts index 1bba2e9ece..7f10ebb76f 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb-items/breadcrumb-items.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb-items/breadcrumb-items.component.ts @@ -1,3 +1,4 @@ +import { ABP } from '@abp/ng.core'; import { Component, Input } from '@angular/core'; @Component({ @@ -5,5 +6,5 @@ import { Component, Input } from '@angular/core'; templateUrl: './breadcrumb-items.component.html', }) export class BreadcrumbItemsComponent { - @Input() items = []; + @Input() items: Partial[] = []; } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/button/button.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/button/button.component.ts index 33e8307824..e03e9048e5 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/button/button.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/button/button.component.ts @@ -39,16 +39,16 @@ export class ButtonComponent implements OnInit { buttonType = 'button'; @Input() - iconClass: string; + iconClass?: string; @Input() loading = false; @Input() - disabled = false; + disabled: boolean | undefined = false; @Input() - attributes: ABP.Dictionary; + attributes?: ABP.Dictionary; @Output() readonly click = new EventEmitter(); @@ -63,7 +63,7 @@ export class ButtonComponent implements OnInit { @Output() readonly abpBlur = new EventEmitter(); @ViewChild('button', { static: true }) - buttonRef: ElementRef; + buttonRef!: ElementRef; get icon(): string { return `${this.loading ? 'fa fa-spinner fa-spin' : this.iconClass || 'd-none'}`; @@ -74,7 +74,9 @@ export class ButtonComponent implements OnInit { ngOnInit() { if (this.attributes) { Object.keys(this.attributes).forEach(key => { - this.renderer.setAttribute(this.buttonRef.nativeElement, key, this.attributes[key]); + if (this.attributes?.[key]) { + this.renderer.setAttribute(this.buttonRef.nativeElement, key, this.attributes[key]); + } }); } } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts index 13462612e6..f6c625f3de 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts @@ -12,9 +12,9 @@ export class ConfirmationComponent { reject = Confirmation.Status.reject; dismiss = Confirmation.Status.dismiss; - confirmation$: ReplaySubject; + confirmation$!: ReplaySubject; - clear: (status: Confirmation.Status) => void; + clear!: (status: Confirmation.Status) => void; close(status: Confirmation.Status) { this.clear(status); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts index df810729c9..da167d1f82 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts @@ -22,11 +22,11 @@ import { debounceTime, filter } from 'rxjs/operators'; providers: [SubscriptionService], }) export class HttpErrorWrapperComponent implements AfterViewInit, OnDestroy, OnInit { - appRef: ApplicationRef; + appRef!: ApplicationRef; - cfRes: ComponentFactoryResolver; + cfRes!: ComponentFactoryResolver; - injector: Injector; + injector!: Injector; status = 0; @@ -34,18 +34,18 @@ export class HttpErrorWrapperComponent implements AfterViewInit, OnDestroy, OnIn details: LocalizationParam = 'Sorry, an error has occured.'; - customComponent: Type = null; + customComponent: Type | undefined = undefined; - destroy$: Subject; + destroy$!: Subject; hideCloseIcon = false; - backgroundColor: string; + backgroundColor!: string; isHomeShow = true; @ViewChild('container', { static: false }) - containerRef: ElementRef; + containerRef?: ElementRef; get statusText(): string { return this.status ? `[${this.status}]` : ''; @@ -66,13 +66,15 @@ export class HttpErrorWrapperComponent implements AfterViewInit, OnDestroy, OnIn customComponentRef.instance.errorStatus = this.status; customComponentRef.instance.destroy$ = this.destroy$; this.appRef.attachView(customComponentRef.hostView); - this.containerRef.nativeElement.appendChild( - (customComponentRef.hostView as EmbeddedViewRef).rootNodes[0], - ); + if (this.containerRef) { + this.containerRef.nativeElement.appendChild( + (customComponentRef.hostView as EmbeddedViewRef).rootNodes[0], + ); + } customComponentRef.changeDetectorRef.detectChanges(); } - const keyup$ = fromEvent(document, 'keyup').pipe( + const keyup$ = fromEvent(document, 'keyup').pipe( debounceTime(150), filter((key: KeyboardEvent) => key && key.key === 'Escape'), ); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts index 3fd01d1b4d..9d0446c1b1 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts @@ -22,7 +22,7 @@ import { combineLatest, Subscription, timer } from 'rxjs'; providers: [SubscriptionService], }) export class LoaderBarComponent implements OnDestroy, OnInit { - protected _isLoading: boolean; + protected _isLoading!: boolean; @Input() set isLoading(value: boolean) { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-ref.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-ref.service.ts index c9f7ea41e2..4fda88a227 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-ref.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-ref.service.ts @@ -3,7 +3,7 @@ import { Injectable } from '@angular/core'; export type ModalDismissMode = 'hard' | 'soft'; export interface DismissableModal { - dismiss(mode: ModalDismissMode); + dismiss(mode: ModalDismissMode): void; } @Injectable({ providedIn: 'root' }) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html index ee0d99b7cb..d0fbf36ad6 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html @@ -1,7 +1,7 @@ -