Browse Source

fix typescript strict mode errors

pull/15750/head
muhammedaltug 4 years ago
parent
commit
106eac9cd9
  1. 2
      npm/ng-packs/package.json
  2. 6
      npm/ng-packs/packages/core/locale/src/utils/register-locale.ts
  3. 2
      npm/ng-packs/packages/core/package.json
  4. 10
      npm/ng-packs/packages/core/src/lib/abstracts/ng-model.component.ts
  5. 2
      npm/ng-packs/packages/core/src/lib/clients/http.client.ts
  6. 22
      npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts
  7. 6
      npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts
  8. 4
      npm/ng-packs/packages/core/src/lib/directives/debounce.directive.ts
  9. 58
      npm/ng-packs/packages/core/src/lib/directives/for.directive.ts
  10. 12
      npm/ng-packs/packages/core/src/lib/directives/form-submit.directive.ts
  11. 15
      npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts
  12. 2
      npm/ng-packs/packages/core/src/lib/directives/stop-propagation.directive.ts
  13. 20
      npm/ng-packs/packages/core/src/lib/handlers/routes.handler.ts
  14. 2
      npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts
  15. 38
      npm/ng-packs/packages/core/src/lib/models/dtos.ts
  16. 5
      npm/ng-packs/packages/core/src/lib/models/environment.ts
  17. 6
      npm/ng-packs/packages/core/src/lib/providers/locale.provider.ts
  18. 15
      npm/ng-packs/packages/core/src/lib/services/config-state.service.ts
  19. 11
      npm/ng-packs/packages/core/src/lib/services/dom-insertion.service.ts
  20. 17
      npm/ng-packs/packages/core/src/lib/services/environment.service.ts
  21. 5
      npm/ng-packs/packages/core/src/lib/services/http-wait.service.ts
  22. 10
      npm/ng-packs/packages/core/src/lib/services/lazy-load.service.ts
  23. 22
      npm/ng-packs/packages/core/src/lib/services/localization.service.ts
  24. 2
      npm/ng-packs/packages/core/src/lib/services/multi-tenancy.service.ts
  25. 4
      npm/ng-packs/packages/core/src/lib/services/permission.service.ts
  26. 6
      npm/ng-packs/packages/core/src/lib/services/replaceable-components.service.ts
  27. 2
      npm/ng-packs/packages/core/src/lib/services/resource-wait.service.ts
  28. 7
      npm/ng-packs/packages/core/src/lib/services/rest.service.ts
  29. 5
      npm/ng-packs/packages/core/src/lib/services/router-events.service.ts
  30. 12
      npm/ng-packs/packages/core/src/lib/services/routes.service.ts
  31. 8
      npm/ng-packs/packages/core/src/lib/services/subscription.service.ts
  32. 4
      npm/ng-packs/packages/core/src/lib/strategies/content-security.strategy.ts
  33. 10
      npm/ng-packs/packages/core/src/lib/strategies/content.strategy.ts
  34. 2
      npm/ng-packs/packages/core/src/lib/strategies/context.strategy.ts
  35. 9
      npm/ng-packs/packages/core/src/lib/strategies/cross-origin.strategy.ts
  36. 6
      npm/ng-packs/packages/core/src/lib/strategies/loading.strategy.ts
  37. 4
      npm/ng-packs/packages/core/src/lib/tokens/localization.token.ts
  38. 20
      npm/ng-packs/packages/core/src/lib/utils/common-utils.ts
  39. 5
      npm/ng-packs/packages/core/src/lib/utils/date-utils.ts
  40. 10
      npm/ng-packs/packages/core/src/lib/utils/environment-utils.ts
  41. 4
      npm/ng-packs/packages/core/src/lib/utils/factory-utils.ts
  42. 3
      npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts
  43. 12
      npm/ng-packs/packages/core/src/lib/utils/lazy-load-utils.ts
  44. 2
      npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts
  45. 9
      npm/ng-packs/packages/core/src/lib/utils/multi-tenancy-utils.ts
  46. 28
      npm/ng-packs/packages/core/src/lib/utils/object-utils.ts
  47. 6
      npm/ng-packs/packages/core/src/lib/utils/route-utils.ts
  48. 6
      npm/ng-packs/packages/core/src/lib/utils/tree-utils.ts
  49. 4
      npm/ng-packs/packages/core/src/lib/validators/range.validator.ts
  50. 2
      npm/ng-packs/packages/core/src/lib/validators/required.validator.ts
  51. 4
      npm/ng-packs/packages/core/src/lib/validators/string-length.validator.ts
  52. 2
      npm/ng-packs/packages/core/src/lib/validators/username.validator.ts
  53. 2
      npm/ng-packs/packages/core/testing/src/lib/services/mock-permission.service.ts
  54. 10
      npm/ng-packs/packages/core/testing/src/lib/services/mock-rest.service.ts
  55. 6
      npm/ng-packs/packages/oauth/src/lib/handlers/oauth-configuration.handler.ts
  56. 4
      npm/ng-packs/packages/oauth/src/lib/interceptors/api.interceptor.ts
  57. 4
      npm/ng-packs/packages/oauth/src/lib/oauth.module.ts
  58. 6
      npm/ng-packs/packages/oauth/src/lib/services/oauth.service.ts
  59. 18
      npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts
  60. 2
      npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts
  61. 14
      npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date-time.adapter.ts
  62. 16
      npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-props.ts
  63. 10
      npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts
  64. 9
      npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb/breadcrumb.component.ts
  65. 7
      npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts
  66. 4
      npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts
  67. 3
      npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts
  68. 2
      npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts
  69. 2
      npm/ng-packs/packages/theme-shared/src/lib/tokens/confirmation-icons.token.ts
  70. 2
      npm/ng-packs/tsconfig.base.json

2
npm/ng-packs/package.json

@ -106,7 +106,7 @@
"jest-preset-angular": "^12.2.2",
"jsonc-parser": "^2.3.0",
"just-clone": "^6.1.1",
"just-compare": "^1.4.0",
"just-compare": "^2.3.0",
"lerna": "^4.0.0",
"lint-staged": "^13.0.3",
"ng-packagr": "15.0.1",

6
npm/ng-packs/packages/core/locale/src/utils/register-locale.ts

@ -8,7 +8,7 @@ export interface LocaleErrorHandlerData {
locale: string;
}
let localeMap = {};
let localeMap = {} as { [key: string]: string };
export interface RegisterLocaleData {
cultureNameLocaleFileMap?: Record<string, string>;
@ -51,7 +51,7 @@ export function registerLocale(
};
}
const extraLocales = {};
const extraLocales = {} as { [key: string]: any };
export function storeLocaleData(data: any, localeId: string) {
extraLocales[localeId] = data;
}
@ -62,7 +62,7 @@ export async function defaultLocalErrorHandlerFn({ locale, resolve }: LocaleErro
return;
}
if (isDevMode) {
if (isDevMode()) {
console.error(
`Cannot find the ${locale} locale file. You can check how can add new culture at https://docs.abp.io/en/abp/latest/UI/Angular/Localization#adding-a-new-culture`,
);

2
npm/ng-packs/packages/core/package.json

@ -10,7 +10,7 @@
"@abp/utils": "~7.0.1",
"angular-oauth2-oidc": "^15.0.1",
"just-clone": "^6.1.1",
"just-compare": "^1.4.0",
"just-compare": "^2.3.0",
"ts-toolbelt": "6.15.4",
"tslib": "^2.0.0"
},

10
npm/ng-packs/packages/core/src/lib/abstracts/ng-model.component.ts

@ -4,16 +4,16 @@ import { ControlValueAccessor } from '@angular/forms';
// Not an abstract class on purpose. Do not change!
@Component({ template: '' })
export class AbstractNgModelComponent<T = any, U = T> implements ControlValueAccessor {
protected _value: T;
protected _value!: T;
protected cdRef: ChangeDetectorRef;
onChange: (value: T) => void;
onTouched: () => void;
onChange?: (value: T) => void;
onTouched?: () => void;
@Input()
disabled: boolean;
disabled?: boolean;
@Input()
readonly: boolean;
readonly?: boolean;
@Input()
valueFn: (value: U, previousValue?: T) => T = value => value as any as T;

2
npm/ng-packs/packages/core/src/lib/clients/http.client.ts

@ -15,7 +15,7 @@ export class ExternalHttpClient extends HttpClient {
): Observable<any> {
if (typeof first === 'string') {
this.#setPlaceholderContext(options);
return super.request(first, url, options);
return super.request(first, url || '', options);
}
this.#setPlaceholderContext(first);

22
npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts

@ -17,8 +17,8 @@ import { TreeNode } from '../utils/tree-utils';
providers: [SubscriptionService],
})
export class DynamicLayoutComponent {
layout: Type<any>;
layoutKey: eLayoutType;
layout?: Type<any>;
layoutKey?: eLayoutType;
// TODO: Consider a shared enum (eThemeSharedComponents) for known layouts
readonly layouts = new Map([
@ -29,9 +29,9 @@ export class DynamicLayoutComponent {
isLayoutVisible = true;
private router: Router;
private route: ActivatedRoute;
private routes: RoutesService;
private router!: Router;
private route!: ActivatedRoute;
private routes!: RoutesService;
constructor(
injector: Injector,
@ -42,7 +42,7 @@ export class DynamicLayoutComponent {
@Optional() @SkipSelf() dynamicLayoutComponent: DynamicLayoutComponent,
) {
if (dynamicLayoutComponent) {
if (isDevMode) console.warn('DynamicLayoutComponent must be used only in AppComponent.');
if (isDevMode()) console.warn('DynamicLayoutComponent must be used only in AppComponent.');
return;
}
this.route = injector.get(ActivatedRoute);
@ -80,8 +80,10 @@ export class DynamicLayoutComponent {
if (this.layoutKey === expectedLayout) return;
const key = this.layouts.get(expectedLayout);
this.layout = this.getComponent(key)?.component;
this.layoutKey = expectedLayout;
if (key) {
this.layout = this.getComponent(key)?.component;
this.layoutKey = expectedLayout;
}
if(!this.layout){
this.showLayoutNotFoundError(expectedLayout);
}
@ -94,7 +96,7 @@ export class DynamicLayoutComponent {
}
console.warn(message);
}
private listenToLanguageChange() {
this.subscription.addOne(this.localizationService.languageChange$, () => {
@ -103,7 +105,7 @@ export class DynamicLayoutComponent {
});
}
private getComponent(key: string): ReplaceableComponents.ReplaceableComponent {
private getComponent(key: string): ReplaceableComponents.ReplaceableComponent | undefined {
return this.replaceableComponents.get(key);
}
}

6
npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts

@ -13,11 +13,11 @@ import { SubscriptionService } from '../services/subscription.service';
providers: [SubscriptionService],
})
export class ReplaceableRouteContainerComponent implements OnInit {
defaultComponent: Type<any>;
defaultComponent!: Type<any>;
componentKey: string;
componentKey!: string;
externalComponent: Type<any>;
externalComponent?: Type<any>;
constructor(
private route: ActivatedRoute,

4
npm/ng-packs/packages/core/src/lib/directives/debounce.directive.ts

@ -16,7 +16,9 @@ export class InputEventDebounceDirective implements OnInit {
constructor(private el: ElementRef, private subscription: SubscriptionService) {}
ngOnInit(): void {
const input$ = fromEvent(this.el.nativeElement, 'input').pipe(debounceTime(this.debounce));
const input$ = fromEvent<InputEvent>(this.el.nativeElement, 'input').pipe(
debounceTime(this.debounce),
);
this.subscription.addOne(input$, (event: Event) => {
this.debounceEvent.emit(event);

58
npm/ng-packs/packages/core/src/lib/directives/for.directive.ts

@ -38,32 +38,32 @@ class RecordView {
export class ForDirective implements OnChanges {
// eslint-disable-next-line @angular-eslint/no-input-rename
@Input('abpForOf')
items: any[];
items!: any[];
@Input('abpForOrderBy')
orderBy: string;
orderBy?: string;
@Input('abpForOrderDir')
orderDir: 'ASC' | 'DESC';
orderDir?: 'ASC' | 'DESC';
@Input('abpForFilterBy')
filterBy: string;
filterBy?: string;
@Input('abpForFilterVal')
filterVal: any;
@Input('abpForTrackBy')
trackBy;
trackBy?: TrackByFunction<any>;
@Input('abpForCompareBy')
compareBy: CompareFn;
compareBy?: CompareFn;
@Input('abpForEmptyRef')
emptyRef: TemplateRef<any>;
emptyRef?: TemplateRef<any>;
private differ: IterableDiffer<any>;
private differ!: IterableDiffer<any> | null;
private isShowEmptyRef: boolean;
private isShowEmptyRef!: boolean;
get compareFn(): CompareFn {
return this.compareBy || compare;
@ -83,22 +83,29 @@ export class ForDirective implements OnChanges {
const rw: RecordView[] = [];
changes.forEachOperation(
(record: IterableChangeRecord<any>, previousIndex: number, currentIndex: number) => {
(
record: IterableChangeRecord<any>,
previousIndex: number | null,
currentIndex: number | null,
) => {
if (record.previousIndex == null) {
const view = this.vcRef.createEmbeddedView(
this.tempRef,
new AbpForContext(null, -1, -1, this.items),
currentIndex,
currentIndex || 0,
);
rw.push(new RecordView(record, view));
} else if (currentIndex == null) {
} else if (currentIndex == null && previousIndex !== null) {
this.vcRef.remove(previousIndex);
} else {
const view = this.vcRef.get(previousIndex);
this.vcRef.move(view, currentIndex);
rw.push(new RecordView(record, view as EmbeddedViewRef<AbpForContext>));
if (previousIndex !== null) {
const view = this.vcRef.get(previousIndex);
if (view && currentIndex !== null) {
this.vcRef.move(view, currentIndex);
rw.push(new RecordView(record, view as EmbeddedViewRef<AbpForContext>));
}
}
}
},
);
@ -117,8 +124,10 @@ export class ForDirective implements OnChanges {
}
changes.forEachIdentityChange((record: IterableChangeRecord<any>) => {
const viewRef = this.vcRef.get(record.currentIndex) as EmbeddedViewRef<AbpForContext>;
viewRef.context.$implicit = record.item;
if (record.currentIndex !== null) {
const viewRef = this.vcRef.get(record.currentIndex) as EmbeddedViewRef<AbpForContext>;
viewRef.context.$implicit = record.item;
}
});
}
@ -152,10 +161,9 @@ export class ForDirective implements OnChanges {
}
private sortItems(items: any[]) {
if (this.orderBy) {
items.sort((a, b) =>
a[this.orderBy] > b[this.orderBy] ? 1 : a[this.orderBy] < b[this.orderBy] ? -1 : 0,
);
const orderBy = this.orderBy;
if (orderBy) {
items.sort((a, b) => (a[orderBy] > b[orderBy] ? 1 : a[orderBy] < b[orderBy] ? -1 : 0));
} else {
items.sort();
}
@ -166,13 +174,13 @@ export class ForDirective implements OnChanges {
if (!Array.isArray(items)) return;
const compareFn = this.compareFn;
const filterBy = this.filterBy;
if (
typeof this.filterBy !== 'undefined' &&
typeof filterBy !== 'undefined' &&
typeof this.filterVal !== 'undefined' &&
this.filterVal !== ''
) {
items = items.filter(item => compareFn(item[this.filterBy], this.filterVal));
items = items.filter(item => compareFn(item[filterBy], this.filterVal));
}
switch (this.orderDir) {

12
npm/ng-packs/packages/core/src/lib/directives/form-submit.directive.ts

@ -8,7 +8,7 @@ import {
Output,
Self,
} from '@angular/core';
import { UntypedFormControl, UntypedFormGroup, FormGroupDirective } from '@angular/forms';
import { FormGroupDirective, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
import { fromEvent } from 'rxjs';
import { debounceTime, filter } from 'rxjs/operators';
import { SubscriptionService } from '../services/subscription.service';
@ -26,8 +26,9 @@ export class FormSubmitDirective implements OnInit {
@Input()
debounce = 200;
// TODO: Remove unused input
@Input()
notValidateOnSubmit: string | boolean;
notValidateOnSubmit?: string | boolean;
@Input()
markAsDirtyWhenSubmit = true;
@ -41,11 +42,10 @@ export class FormSubmitDirective implements OnInit {
private host: ElementRef<HTMLFormElement>,
private cdRef: ChangeDetectorRef,
private subscription: SubscriptionService,
) { }
) {}
ngOnInit() {
this.subscription.addOne(this.formGroupDirective.ngSubmit, () => {
if (this.markAsDirtyWhenSubmit) {
this.markAsDirty();
}
@ -53,10 +53,10 @@ export class FormSubmitDirective implements OnInit {
this.executedNgSubmit = true;
});
const keyup$ = fromEvent(this.host.nativeElement as HTMLElement, 'keyup').pipe(
const keyup$ = fromEvent<KeyboardEvent>(this.host.nativeElement as HTMLElement, 'keyup').pipe(
debounceTime(this.debounce),
filter(event => !(event.target instanceof HTMLTextAreaElement)),
filter((event: KeyboardEvent) => event && event.key === 'Enter'),
filter(event => event && event.key === 'Enter'),
);
this.subscription.addOne(keyup$, () => {

15
npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts

@ -1,5 +1,4 @@
import {
ComponentRef,
Directive,
Injector,
Input,
@ -24,7 +23,7 @@ import { SubscriptionService } from '../services/subscription.service';
})
export class ReplaceableTemplateDirective implements OnInit, OnChanges {
@Input('abpReplaceableTemplate')
data: ReplaceableComponents.ReplaceableTemplateDirectiveInput<any, any>;
data!: ReplaceableComponents.ReplaceableTemplateDirectiveInput<any, any>;
providedData = {
inputs: {},
@ -140,11 +139,15 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges {
[key]: {
enumerable: true,
configurable: true,
get: () => this.data.inputs[key]?.value,
...(this.data.inputs[key]?.twoWay && {
get: () => this.data.inputs?.[key]?.value,
...(this.data.inputs?.[key]?.twoWay && {
set: (newValue: any) => {
this.data.inputs[key].value = newValue;
this.data.outputs[`${key}Change`](newValue);
if (this.data.inputs?.[key]) {
this.data.inputs[key].value = newValue;
}
if (this.data.outputs?.[`${key}Change`]) {
this.data.outputs[`${key}Change`](newValue);
}
},
}),
},

2
npm/ng-packs/packages/core/src/lib/directives/stop-propagation.directive.ts

@ -13,7 +13,7 @@ export class StopPropagationDirective implements OnInit {
constructor(private el: ElementRef, private subscription: SubscriptionService) {}
ngOnInit(): void {
this.subscription.addOne(fromEvent(this.el.nativeElement, 'click'), (event: MouseEvent) => {
this.subscription.addOne(fromEvent<MouseEvent>(this.el.nativeElement, 'click'), event => {
event.stopPropagation();
this.stopPropEvent.emit(event);
});

20
npm/ng-packs/packages/core/src/lib/handlers/routes.handler.ts

@ -12,16 +12,16 @@ export class RoutesHandler {
}
addRoutes() {
this.router?.config?.forEach(({ path = '', data }: RouteData) => {
if (!data?.routes) return;
if (Array.isArray(data.routes)) {
this.routes.add(data.routes);
return;
(this.router?.config as RouteData[])?.forEach(({ path = '', data }: RouteData) => {
const routes = data?.routes;
if (!routes) return;
if (Array.isArray(routes)) {
this.routes.add(routes);
} else {
const routesFlatten = flatRoutes([{ path, ...routes }], { path: '' });
this.routes.add(routesFlatten);
}
const routes = flatRoutes([{ path, ...data.routes }], { path: '' });
this.routes.add(routes);
});
}
}
@ -39,7 +39,7 @@ function flatRoutes(routes: RouteDef[], parent: any) {
acc.push(current, ...flatRoutes(children, current));
return acc;
}, []);
}, [] as ABP.Route[]);
}
type RouteDef = ABP.Route & { children: RouteDef[] };

2
npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts

@ -10,7 +10,7 @@ export class ApiInterceptor implements IApiInterceptor {
constructor(private httpWaitService: HttpWaitService) {}
getAdditionalHeaders(existingHeaders?: HttpHeaders) {
return existingHeaders;
return existingHeaders || new HttpHeaders();
}
intercept(request: HttpRequest<any>, next: HttpHandler) {

38
npm/ng-packs/packages/core/src/lib/models/dtos.ts

@ -1,17 +1,18 @@
import { ABP } from './common';
import { checkHasProp } from '../utils/common-utils';
export class ListResultDto<T> {
items?: T[];
constructor(initialValues: Partial<ListResultDto<T>> = {}) {
for (const key in initialValues) {
if (Object.prototype.hasOwnProperty.call(initialValues, key)) {
if (checkHasProp(initialValues, key)) {
this[key] = initialValues[key];
}
}
}
}
type ValueOf<T> = T[keyof T];
export class PagedResultDto<T> extends ListResultDto<T> {
totalCount?: number;
@ -25,11 +26,8 @@ export class LimitedResultRequestDto {
constructor(initialValues: Partial<LimitedResultRequestDto> = {}) {
for (const key in initialValues) {
if (
Object.prototype.hasOwnProperty.call(initialValues, key) &&
initialValues[key] !== undefined
) {
this[key] = initialValues[key];
if (checkHasProp(initialValues, key) && initialValues[key] !== undefined) {
this[key] = initialValues[key] as ValueOf<LimitedResultRequestDto>;
}
}
}
@ -56,7 +54,7 @@ export class EntityDto<TKey = string> {
constructor(initialValues: Partial<EntityDto<TKey>> = {}) {
for (const key in initialValues) {
if (Object.prototype.hasOwnProperty.call(initialValues, key)) {
if (checkHasProp(initialValues, key)) {
this[key] = initialValues[key];
}
}
@ -130,11 +128,11 @@ export class FullAuditedEntityWithUserDto<
}
export class ExtensibleObject {
extraProperties: ABP.Dictionary<any>;
extraProperties?: ABP.Dictionary<any>;
constructor(initialValues: Partial<ExtensibleObject> = {}) {
for (const key in initialValues) {
if (Object.prototype.hasOwnProperty.call(initialValues, key)) {
if (checkHasProp(initialValues, key)) {
this[key] = initialValues[key];
}
}
@ -142,7 +140,7 @@ export class ExtensibleObject {
}
export class ExtensibleEntityDto<TKey = string> extends ExtensibleObject {
id: TKey;
id?: TKey;
constructor(initialValues: Partial<ExtensibleEntityDto<TKey>> = {}) {
super(initialValues);
@ -152,7 +150,7 @@ export class ExtensibleEntityDto<TKey = string> extends ExtensibleObject {
export class ExtensibleCreationAuditedEntityDto<
TPrimaryKey = string,
> extends ExtensibleEntityDto<TPrimaryKey> {
creationTime: Date | string;
creationTime?: Date | string;
creatorId?: string;
constructor(initialValues: Partial<ExtensibleCreationAuditedEntityDto<TPrimaryKey>> = {}) {
@ -175,8 +173,8 @@ export class ExtensibleAuditedEntityWithUserDto<
TPrimaryKey = string,
TUserDto = any,
> extends ExtensibleAuditedEntityDto<TPrimaryKey> {
creator: TUserDto;
lastModifier: TUserDto;
creator?: TUserDto;
lastModifier?: TUserDto;
constructor(initialValues: Partial<ExtensibleAuditedEntityWithUserDto<TPrimaryKey>> = {}) {
super(initialValues);
@ -187,7 +185,7 @@ export class ExtensibleCreationAuditedEntityWithUserDto<
TPrimaryKey = string,
TUserDto = any,
> extends ExtensibleCreationAuditedEntityDto<TPrimaryKey> {
creator: TUserDto;
creator?: TUserDto;
constructor(
initialValues: Partial<ExtensibleCreationAuditedEntityWithUserDto<TPrimaryKey>> = {},
@ -199,9 +197,9 @@ export class ExtensibleCreationAuditedEntityWithUserDto<
export class ExtensibleFullAuditedEntityDto<
TPrimaryKey = string,
> extends ExtensibleAuditedEntityDto<TPrimaryKey> {
isDeleted: boolean;
isDeleted?: boolean;
deleterId?: string;
deletionTime: Date | string;
deletionTime?: Date | string;
constructor(initialValues: Partial<ExtensibleFullAuditedEntityDto<TPrimaryKey>> = {}) {
super(initialValues);
@ -212,9 +210,9 @@ export class ExtensibleFullAuditedEntityWithUserDto<
TPrimaryKey = string,
TUserDto = any,
> extends ExtensibleFullAuditedEntityDto<TPrimaryKey> {
creator: TUserDto;
lastModifier: TUserDto;
deleter: TUserDto;
creator?: TUserDto;
lastModifier?: TUserDto;
deleter?: TUserDto;
constructor(initialValues: Partial<ExtensibleFullAuditedEntityWithUserDto<TPrimaryKey>> = {}) {
super(initialValues);

5
npm/ng-packs/packages/core/src/lib/models/environment.ts

@ -17,9 +17,10 @@ export interface ApplicationInfo {
baseUrl?: string;
logoUrl?: string;
}
export interface ApiConfig {
export interface HasAdditional {
[key: string]: string;
}
export interface ApiConfig extends Partial<HasAdditional>{
url: string;
rootNamespace?: string;
}

6
npm/ng-packs/packages/core/src/lib/providers/locale.provider.ts

@ -1,6 +1,7 @@
import { LOCALE_ID, Provider } from '@angular/core';
import { differentLocales } from '../constants/different-locales';
import { LocalizationService } from '../services/localization.service';
import { checkHasProp } from '../utils/common-utils';
export class LocaleId extends String {
constructor(private localizationService: LocalizationService) {
@ -9,7 +10,10 @@ export class LocaleId extends String {
toString(): string {
const { currentLang } = this.localizationService;
return differentLocales[currentLang] || currentLang;
if (checkHasProp(differentLocales, currentLang)) {
return differentLocales[currentLang];
}
return currentLang;
}
valueOf(): string {

15
npm/ng-packs/packages/core/src/lib/services/config-state.service.ts

@ -1,5 +1,5 @@
import { Inject, Injectable } from '@angular/core';
import { Observable, Subject, of } from 'rxjs';
import { Observable, Subject } from 'rxjs';
import { map, switchMap, take, tap } from 'rxjs/operators';
import { AbpApplicationConfigurationService } from '../proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service';
import { AbpApplicationLocalizationService } from '../proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-localization.service';
@ -47,6 +47,9 @@ export class ConfigStateService {
private getLocalizationAndCombineWithAppState(
appState: ApplicationConfigurationDto,
): Observable<ApplicationConfigurationDto> {
if (!appState.localization.currentCulture.cultureName) {
throw new Error('culture name should defined');
}
return this.getlocalizationResource(appState.localization.currentCulture.cultureName).pipe(
map(result => ({ ...appState, localization: { ...appState.localization, ...result } })),
);
@ -77,11 +80,11 @@ export class ConfigStateService {
}
}
getOne$(key: string) {
getOne$<K extends keyof ApplicationConfigurationDto>(key: K) {
return this.store.sliceState(state => state[key]);
}
getOne(key: string) {
getOne<K extends keyof ApplicationConfigurationDto>(key: K) {
return this.store.state[key];
}
@ -138,7 +141,7 @@ export class ConfigStateService {
return keys.reduce((acc, key) => ({ ...acc, [key]: features.values[key] }), {});
}
getFeatures$(keys: string[]) {
getFeatures$(keys: string[]): Observable<{[key: string]: string} | undefined> {
return this.store.sliceState(({ features }) => {
if (!features?.values) return;
@ -164,7 +167,7 @@ export class ConfigStateService {
return keysFound.reduce((acc, key) => {
acc[key] = settings[key];
return acc;
}, {});
}, {} as Record<string, string>);
}
getSettings$(keyword?: string) {
@ -179,7 +182,7 @@ export class ConfigStateService {
return keysFound.reduce((acc, key) => {
acc[key] = settings[key];
return acc;
}, {});
}, {} as Record<string, string>);
}),
);
}

11
npm/ng-packs/packages/core/src/lib/services/dom-insertion.service.ts

@ -8,7 +8,7 @@ export class DomInsertionService {
insertContent<T extends HTMLScriptElement | HTMLStyleElement>(
contentStrategy: ContentStrategy<T>,
): T {
): T | undefined {
const hash = generateHash(contentStrategy.content);
if (this.inserted.has(hash)) return;
@ -20,10 +20,11 @@ export class DomInsertionService {
}
removeContent(element: HTMLScriptElement | HTMLStyleElement) {
const hash = generateHash(element.textContent);
this.inserted.delete(hash);
element.parentNode.removeChild(element);
if (element.textContent) {
const hash = generateHash(element.textContent);
this.inserted.delete(hash);
element.parentNode?.removeChild(element);
}
}
has(content: string): boolean {

17
npm/ng-packs/packages/core/src/lib/services/environment.service.ts

@ -4,10 +4,10 @@ import { map } from 'rxjs/operators';
import { Apis, Environment } from '../models/environment';
import { InternalStore } from '../utils/internal-store-utils';
const mapToApiUrl = (key: string) => (apis: Apis) =>
(apis[key] || apis.default).url || apis.default.url;
const mapToApiUrl = (key: string | undefined) => (apis: Apis) =>
((key && apis[key]) || apis.default).url || apis.default.url;
const mapToIssuer = (issuer: string) => {
const mapToIssuer = (issuer: string | undefined) => {
if (!issuer) {
return issuer;
}
@ -30,8 +30,8 @@ export class EnvironmentService {
return this.store.state;
}
getApiUrl(key: string) {
return mapToApiUrl(key)(this.store.state.apis);
getApiUrl(key: string | undefined) {
return mapToApiUrl(key)(this.store.state?.apis);
}
getApiUrl$(key: string) {
@ -43,11 +43,12 @@ export class EnvironmentService {
}
getIssuer() {
const issuer = this.store.state.oAuthConfig.issuer;
const issuer = this.store.state?.oAuthConfig?.issuer;
return mapToIssuer(issuer);
}
getIssuer$() {
return this.store.sliceState(state => state.oAuthConfig.issuer).pipe(map(mapToIssuer));
return this.store.sliceState(state => state?.oAuthConfig?.issuer).pipe(map(mapToIssuer));
}
}

5
npm/ng-packs/packages/core/src/lib/services/http-wait.service.ts

@ -86,7 +86,10 @@ export class HttpWaitService {
this.store.patch({ filteredRequests });
}
private applyFilter(requests: HttpRequest<any>[]) {
private applyFilter(requests: HttpRequest<any>[] | undefined) {
if (!requests) {
return [];
}
const { filteredRequests } = this.store.state;
return requests.filter(
({ method, url }) =>

10
npm/ng-packs/packages/core/src/lib/services/lazy-load.service.ts

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { concat, Observable, of, throwError } from 'rxjs';
import { concat, Observable, of, pipe, throwError } from 'rxjs';
import { delay, retryWhen, shareReplay, take, tap } from 'rxjs/operators';
import { LoadingStrategy } from '../strategies';
import { ResourceWaitService } from './resource-wait.service';
@ -15,11 +15,13 @@ export class LazyLoadService {
load(strategy: LoadingStrategy, retryTimes?: number, retryDelay?: number): Observable<Event> {
if (this.loaded.has(strategy.path)) return of(new CustomEvent('load'));
this.resourceWaitService.addResource(strategy.path);
const delayOperator = retryDelay ? pipe(delay(retryDelay)) : pipe();
const takeOp = retryTimes ? pipe(take(retryTimes)) : pipe();
return strategy.createStream().pipe(
retryWhen(error$ =>
concat(
error$.pipe(delay(retryDelay), take(retryTimes)),
throwError(new CustomEvent('error')),
error$.pipe(delayOperator, takeOp),
throwError(() => new CustomEvent('error')),
),
),
tap(() => {
@ -36,7 +38,7 @@ export class LazyLoadService {
if (!element) return false;
element.parentNode.removeChild(element);
element.parentNode?.removeChild(element);
this.loaded.delete(path);
return true;
}

22
npm/ng-packs/packages/core/src/lib/services/localization.service.ts

@ -90,15 +90,16 @@ export class LocalizationService {
Object.entries(remote).forEach(entry => {
const resourceName = entry[0];
const remoteTexts = entry[1];
let resource = local.get(resourceName) || {};
let resource = local?.get(resourceName) || {};
resource = { ...resource, ...remoteTexts };
local.set(resourceName, resource);
local?.set(resourceName, resource);
});
}
return local;
}),
filter(Boolean)
)
.subscribe(val => this.localizations$.next(val));
}
@ -134,6 +135,7 @@ export class LocalizationService {
lang => this.configState.getDeep('localization.currentCulture.cultureName') !== lang,
),
switchMap(lang => this.configState.refreshAppState().pipe(map(() => lang))),
filter(Boolean),
switchMap(lang => from(this.registerLocale(lang).then(() => lang))),
)
.subscribe(lang => this._languageChange$.next(lang));
@ -176,14 +178,14 @@ export class LocalizationService {
return this.getLocalization(this.configState.getAll(), key, ...interpolateParams);
}
localize(resourceName: string, key: string, defaultValue: string): Observable<string> {
localize(resourceName: string, key: string, defaultValue: string): Observable<string | null> {
return this.configState.getOne$('localization').pipe(
map(createLocalizer),
map(localize => localize(resourceName, key, defaultValue)),
);
}
localizeSync(resourceName: string, key: string, defaultValue: string): string {
localizeSync(resourceName: string, key: string, defaultValue: string): string | null {
const localization = this.configState.getOne('localization');
return createLocalizer(localization)(resourceName, key, defaultValue);
}
@ -210,7 +212,7 @@ export class LocalizationService {
...interpolateParams: string[]
) {
if (!key) key = '';
let defaultValue: string;
let defaultValue = '';
if (typeof key !== 'string') {
defaultValue = key.defaultValue;
@ -219,7 +221,7 @@ export class LocalizationService {
const keys = key.split('::') as string[];
const warn = (message: string) => {
if (isDevMode) console.warn(message);
if (isDevMode()) console.warn(message);
};
if (keys.length < 2) {
@ -263,7 +265,7 @@ export class LocalizationService {
}
}
function recursivelyMergeBaseResources(baseResourceName: string, source: ResourceDto) {
function recursivelyMergeBaseResources(baseResourceName: string, source: ResourceDto): ApplicationLocalizationResourceDto {
const item = source[baseResourceName];
if (item.baseResources.length === 0) {
@ -278,7 +280,7 @@ function recursivelyMergeBaseResources(baseResourceName: string, source: Resourc
}
function mergeResourcesWithBaseResource(resource: ResourceDto): ResourceDto {
const entities = Object.keys(resource).map(key => {
const entities: Array<[string, ApplicationLocalizationResourceDto]> = Object.keys(resource).map(key => {
const newValue = recursivelyMergeBaseResources(key, resource);
return [key, newValue];
});
@ -296,5 +298,5 @@ function combineLegacyandNewResources(
}, legacy);
}
type LegacyLanguageDto = Record<string, Record<string, string>>;
type ResourceDto = Record<string, ApplicationLocalizationResourceDto>;
export type LegacyLanguageDto = Record<string, Record<string, string>>;
export type ResourceDto = Record<string, ApplicationLocalizationResourceDto>;

2
npm/ng-packs/packages/core/src/lib/services/multi-tenancy.service.ts

@ -12,7 +12,7 @@ import { SessionStateService } from './session-state.service';
@Injectable({ providedIn: 'root' })
export class MultiTenancyService {
domainTenant: CurrentTenantDto = null;
domainTenant: CurrentTenantDto | null = null;
isTenantBoxVisible = true;

4
npm/ng-packs/packages/core/src/lib/services/permission.service.ts

@ -14,7 +14,7 @@ export class PermissionService {
);
}
getGrantedPolicy(key: string) {
getGrantedPolicy(key: string | undefined) {
const policies = this.getSnapshot();
return this.isPolicyGranted(key, policies);
}
@ -36,7 +36,7 @@ export class PermissionService {
);
}
protected isPolicyGranted(key: string, grantedPolicies: Record<string, boolean>) {
protected isPolicyGranted(key: string | undefined, grantedPolicies: Record<string, boolean>) {
if (!key) return true;
const orRegexp = /\|\|/g;

6
npm/ng-packs/packages/core/src/lib/services/replaceable-components.service.ts

@ -23,7 +23,7 @@ export class ReplaceableComponentsService {
}
constructor(private ngZone: NgZone, private router: Router) {
this.store = new InternalStore([]);
this.store = new InternalStore([] as ReplaceableComponents.ReplaceableComponent[]);
}
add(replaceableComponent: ReplaceableComponents.ReplaceableComponent, reload?: boolean): void {
@ -44,11 +44,11 @@ export class ReplaceableComponentsService {
if (reload) reloadRoute(this.router, this.ngZone);
}
get(replaceableComponentKey: string): ReplaceableComponents.ReplaceableComponent {
get(replaceableComponentKey: string): ReplaceableComponents.ReplaceableComponent | undefined {
return this.replaceableComponents.find(component => component.key === replaceableComponentKey);
}
get$(replaceableComponentKey: string): Observable<ReplaceableComponents.ReplaceableComponent> {
get$(replaceableComponentKey: string): Observable<ReplaceableComponents.ReplaceableComponent | undefined> {
return this.replaceableComponents$.pipe(
map(components => components.find(component => component.key === replaceableComponentKey)),
);

2
npm/ng-packs/packages/core/src/lib/services/resource-wait.service.ts

@ -20,7 +20,7 @@ export class ResourceWaitService {
}
updateLoading$() {
return this.store.sliceUpdate(({ resources }) => !!resources.size);
return this.store.sliceUpdate(({ resources }) => !!resources?.size);
}
clearLoading() {

7
npm/ng-packs/packages/core/src/lib/services/rest.service.ts

@ -20,7 +20,7 @@ export class RestService {
protected httpErrorReporter: HttpErrorReporterService,
) {}
protected getApiFromStore(apiName: string): string {
protected getApiFromStore(apiName: string | undefined): string {
return this.environment.getApiUrl(apiName);
}
@ -51,13 +51,12 @@ export class RestService {
}
private getParams(params: Rest.Params, encoder?: HttpParameterCodec): HttpParams {
const filteredParams = Object.keys(params).reduce((acc, key) => {
const value = params[key];
const filteredParams = Object.entries(params).reduce((acc, [key, value]) => {
if (isUndefinedOrEmptyString(value)) return acc;
if (value === null && !this.options.sendNullsAsQueryParam) return acc;
acc[key] = value;
return acc;
}, {});
}, {} as any);
return encoder
? new HttpParams({ encoder, fromObject: filteredParams })
: new HttpParams({ fromObject: filteredParams });

5
npm/ng-packs/packages/core/src/lib/services/router-events.service.ts

@ -6,6 +6,7 @@ import {
NavigationStart,
Router,
RouterEvent,
Event
} from '@angular/router';
import { filter } from 'rxjs/operators';
@ -23,7 +24,7 @@ export class RouterEvents {
getEvents<T extends RouterEventConstructors>(...eventTypes: T) {
type FilteredRouterEvent = T extends Type<infer Ctor>[] ? Ctor : never;
const filterRouterEvents = (event: RouterEvent): event is FilteredRouterEvent =>
const filterRouterEvents = (event: Event): event is FilteredRouterEvent =>
eventTypes.some(type => event instanceof type);
return this.router.events.pipe(filter(filterRouterEvents));
@ -36,7 +37,7 @@ export class RouterEvents {
: never
: never;
const filterNavigationEvents = (event: RouterEvent): event is FilteredNavigationEvent =>
const filterNavigationEvents = (event: Event): event is FilteredNavigationEvent =>
navigationEventKeys.some(key => event instanceof NavigationEvent[key]);
return this.router.events.pipe(filter(filterNavigationEvents));

12
npm/ng-packs/packages/core/src/lib/services/routes.service.ts

@ -7,7 +7,7 @@ import { ConfigStateService } from './config-state.service';
import { PermissionService } from './permission.service';
// eslint-disable-next-line @typescript-eslint/ban-types
export abstract class AbstractTreeService<T extends object> {
export abstract class AbstractTreeService<T extends {[key: string | number | symbol]: any}> {
abstract id: string;
abstract parentId: string;
abstract hide: (item: T) => boolean;
@ -84,7 +84,7 @@ export abstract class AbstractTreeService<T extends object> {
}
find(predicate: (item: TreeNode<T>) => boolean, tree = this.tree): TreeNode<T> | null {
return tree.reduce(
return tree.reduce<TreeNode<T> | null>(
(acc, node) => (acc ? acc : predicate(node) ? node : this.find(predicate, node.children)),
null,
);
@ -119,9 +119,9 @@ export abstract class AbstractTreeService<T extends object> {
}
search(params: Partial<T>, tree = this.tree): TreeNode<T> | null {
const searchKeys = Object.keys(params);
const searchKeys = Object.keys(params) as Array<keyof Partial<T>>;
return tree.reduce(
return tree.reduce<TreeNode<T> | null>(
(acc, node) =>
acc
? acc
@ -147,7 +147,7 @@ export abstract class AbstractNavTreeService<T extends ABP.Nav>
if (!Number.isInteger(a.order)) return 1;
if (!Number.isInteger(b.order)) return -1;
return a.order - b.order;
return (a.order as number) - (b.order as number);
};
constructor(protected injector: Injector) {
@ -170,7 +170,7 @@ export abstract class AbstractNavTreeService<T extends ABP.Nav>
hasInvisibleChild(identifier: string): boolean {
const node = this.find(item => item[this.id] === identifier);
return node?.children?.some(child => child.invisible);
return node?.children?.some(child => child.invisible) || false;
}
/* istanbul ignore next */

8
npm/ng-packs/packages/core/src/lib/services/subscription.service.ts

@ -1,7 +1,7 @@
import { Injectable } from '@angular/core';
import type { OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs';
import { Injectable } from '@angular/core';
import type { Observable, PartialObserver } from 'rxjs';
import { Subscription } from 'rxjs';
@Injectable()
export class SubscriptionService implements OnDestroy {
@ -33,7 +33,9 @@ export class SubscriptionService implements OnDestroy {
closeOne(subscription: Subscription | undefined | null) {
this.removeOne(subscription);
subscription.unsubscribe();
if (subscription) {
subscription.unsubscribe();
}
}
ngOnDestroy(): void {

4
npm/ng-packs/packages/core/src/lib/strategies/content-security.strategy.ts

@ -10,7 +10,9 @@ export class LooseContentSecurityStrategy extends ContentSecurityStrategy {
}
applyCSP(element: HTMLScriptElement | HTMLStyleElement) {
element.setAttribute('nonce', this.nonce);
if (this.nonce) {
element.setAttribute('nonce', this.nonce);
}
}
}

10
npm/ng-packs/packages/core/src/lib/strategies/content.strategy.ts

@ -1,5 +1,5 @@
import { ContentSecurityStrategy, CONTENT_SECURITY_STRATEGY } from './content-security.strategy';
import { DomStrategy, DOM_STRATEGY } from './dom.strategy';
import { CONTENT_SECURITY_STRATEGY, ContentSecurityStrategy } from './content-security.strategy';
import { DOM_STRATEGY, DomStrategy } from './dom.strategy';
export type ElementOptions<T extends HTMLScriptElement | HTMLStyleElement = any> = Partial<{
[key in keyof T]: T[key];
@ -19,7 +19,11 @@ export abstract class ContentStrategy<T extends HTMLScriptElement | HTMLStyleEle
const element = this.createElement();
if (this.options && Object.keys(this.options).length > 0) {
Object.keys(this.options).forEach(key => (element[key] = this.options[key]));
(Object.keys(this.options) as Array<keyof ElementOptions<T>>).forEach(key => {
if (this.options[key]) {
element[key] = (this.options as NonNullable<T>)[key];
}
});
}
this.contentSecurityStrategy.applyCSP(element);

2
npm/ng-packs/packages/core/src/lib/strategies/context.strategy.ts

@ -13,7 +13,7 @@ export class NoContextStrategy<
T extends Type<any> | TemplateRef<any> = any,
> extends ContextStrategy<T> {
constructor() {
super(undefined);
super(undefined as unknown as Partial<ContextType<T>>);
}
}

9
npm/ng-packs/packages/core/src/lib/strategies/cross-origin.strategy.ts

@ -1,9 +1,14 @@
export class CrossOriginStrategy {
constructor(public crossorigin: 'anonymous' | 'use-credentials', public integrity?: string) {}
constructor(
public crossorigin: 'anonymous' | 'use-credentials' | null,
public integrity?: string,
) {}
setCrossOrigin<T extends HTMLElement>(element: T) {
if (this.integrity) element.setAttribute('integrity', this.integrity);
element.setAttribute('crossorigin', this.crossorigin);
if (this.crossorigin) {
element.setAttribute('crossorigin', this.crossorigin);
}
}
}

6
npm/ng-packs/packages/core/src/lib/strategies/loading.strategy.ts

@ -1,11 +1,11 @@
import { Observable, of } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { fromLazyLoad } from '../utils';
import { CrossOriginStrategy, CROSS_ORIGIN_STRATEGY } from './cross-origin.strategy';
import { DomStrategy, DOM_STRATEGY } from './dom.strategy';
import { CROSS_ORIGIN_STRATEGY, CrossOriginStrategy } from './cross-origin.strategy';
import { DOM_STRATEGY, DomStrategy } from './dom.strategy';
export abstract class LoadingStrategy<T extends HTMLScriptElement | HTMLLinkElement = any> {
element: T;
element!: T;
constructor(
public path: string,

4
npm/ng-packs/packages/core/src/lib/tokens/localization.token.ts

@ -4,10 +4,10 @@ import { ABP } from '../models/common';
export const LOCALIZATIONS = new InjectionToken('LOCALIZATIONS');
export function localizationContributor(localizations: ABP.Localization[]) {
export function localizationContributor(localizations?: ABP.Localization[]) {
if (localizations) {
localizations$.next([...localizations$.value, ...localizations]);
}
}
export const localizations$ = new BehaviorSubject([]);
export const localizations$ = new BehaviorSubject<ABP.Localization[]>([]);

20
npm/ng-packs/packages/core/src/lib/utils/common-utils.ts

@ -7,34 +7,38 @@ export function isUndefinedOrEmptyString(value: unknown): boolean {
return value === undefined || value === '';
}
export function isNullOrUndefined(obj) {
export function isNullOrUndefined<T>(obj: T) {
return obj === null || obj === undefined;
}
export function isNullOrEmpty(obj){
export function isNullOrEmpty<T>(obj: T): boolean {
return obj === null || obj === undefined || obj === '';
}
export function exists(obj) {
export function exists<T>(obj: T): obj is T {
return !isNullOrUndefined(obj);
}
export function isObject(obj) {
export function isObject<T>(obj: T): boolean {
return obj instanceof Object;
}
export function isArray(obj) {
export function isArray<T>(obj: T): boolean {
return Array.isArray(obj);
}
export function isObjectAndNotArray(obj) {
export function isObjectAndNotArray<T>(obj: T): boolean {
return isObject(obj) && !isArray(obj);
}
export function isNode(obj) {
export function isNode<T>(obj: T): boolean {
return obj instanceof Node;
}
export function isObjectAndNotArrayNotNode(obj) {
export function isObjectAndNotArrayNotNode<T>(obj: T): boolean {
return isObjectAndNotArray(obj) && !isNode(obj);
}
export function checkHasProp<T>(object: T, key: string | keyof T): key is keyof T {
return Object.prototype.hasOwnProperty.call(object, key);
}

5
npm/ng-packs/packages/core/src/lib/utils/date-utils.ts

@ -13,8 +13,7 @@ export function getShortTimeFormat(configStateService: ConfigStateService) {
const dateTimeFormat = configStateService.getDeep(
'localization.currentCulture.dateTimeFormat',
) as DateTimeFormatDto;
return dateTimeFormat.shortTimePattern.replace('tt', 'a');
return dateTimeFormat?.shortTimePattern?.replace('tt', 'a');
}
export function getShortDateShortTimeFormat(configStateService: ConfigStateService) {
@ -22,5 +21,5 @@ export function getShortDateShortTimeFormat(configStateService: ConfigStateServi
'localization.currentCulture.dateTimeFormat',
) as DateTimeFormatDto;
return `${dateTimeFormat.shortDatePattern} ${dateTimeFormat.shortTimePattern.replace('tt', 'a')}`;
return `${dateTimeFormat.shortDatePattern} ${dateTimeFormat?.shortTimePattern?.replace('tt', 'a')}`;
}

10
npm/ng-packs/packages/core/src/lib/utils/environment-utils.ts

@ -24,19 +24,23 @@ export function getRemoteEnv(injector: Injector, environment: Partial<Environmen
httpErrorReporter.reportError(err);
return of(null);
}), // TODO: Consider get handle function from a provider
tap(env => environmentService.setState(mergeEnvironments(environment, env, remoteEnv))),
tap(env =>
environmentService.setState(
mergeEnvironments(environment, env || ({} as Environment), remoteEnv as RemoteEnv),
),
),
)
.toPromise();
}
function mergeEnvironments(
local: Partial<Environment>,
remote: any,
remote: Environment,
config: RemoteEnv,
): Environment {
switch (config.mergeStrategy) {
case 'deepmerge':
return deepMerge(local, remote);
return deepMerge(local, remote) as Environment;
case 'overwrite':
case null:
case undefined:

4
npm/ng-packs/packages/core/src/lib/utils/factory-utils.ts

@ -21,7 +21,7 @@ export class LazyModuleFactory<T> extends NgModuleFactory<T> {
create(parentInjector: Injector | null): NgModuleRef<T> {
const injector = Injector.create({
parent: parentInjector,
...(parentInjector && { parent: parentInjector }),
providers: this.moduleWithProviders.providers as StaticProvider[],
});
@ -35,7 +35,7 @@ export class LazyModuleFactory<T> extends NgModuleFactory<T> {
export function featuresFactory(
configState: ConfigStateService,
featureKeys: string[],
mapFn: (features) => any = features => features,
mapFn: (features: { [key: string]: string }) => any = features => features,
) {
return configState.getFeatures$(featureKeys).pipe(filter(Boolean), map(mapFn));
}

3
npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts

@ -37,7 +37,8 @@ export class InternalStore<State> {
}
deepPatch(state: DeepPartial<State>) {
this.state$.next(deepMerge(this.state, state));
// TODO: Strict improve deepMerge
this.state$.next(deepMerge(this.state, state) as State);
this.update$.next(state);
}

12
npm/ng-packs/packages/core/src/lib/utils/lazy-load-utils.ts

@ -1,6 +1,6 @@
import { Observable, Observer } from 'rxjs';
import { CrossOriginStrategy, CROSS_ORIGIN_STRATEGY } from '../strategies/cross-origin.strategy';
import { DomStrategy, DOM_STRATEGY } from '../strategies/dom.strategy';
import { CROSS_ORIGIN_STRATEGY, CrossOriginStrategy } from '../strategies/cross-origin.strategy';
import { DOM_STRATEGY, DomStrategy } from '../strategies/dom.strategy';
export function fromLazyLoad<T extends Event>(
element: HTMLScriptElement | HTMLLinkElement,
@ -11,9 +11,9 @@ export function fromLazyLoad<T extends Event>(
domStrategy.insertElement(element);
return new Observable((observer: Observer<T>) => {
element.onload = (event: T) => {
element.onload = (event: Event) => {
clearCallbacks(element);
observer.next(event);
observer.next(event as T);
observer.complete();
};
@ -32,10 +32,10 @@ export function fromLazyLoad<T extends Event>(
});
}
function createErrorHandler(observer: Observer<Event>, element: HTMLElement) {
function createErrorHandler<T extends Event = Event>(observer: Observer<T>, element: HTMLElement) {
return function (event: Event | string) {
clearCallbacks(element);
element.parentNode.removeChild(element);
element.parentNode?.removeChild(element);
observer.error(event);
};
}

2
npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts

@ -10,7 +10,7 @@ export function getLocaleDirection(locale: string): 'ltr' | 'rtl' {
}
export function createLocalizer(localization: ApplicationLocalizationConfigurationDto) {
return (resourceName: string, key: string, defaultValue: string) => {
return (resourceName: string, key: string, defaultValue: string | null) => {
if (resourceName === '_') return key;
const resource = localization?.values?.[resourceName];

9
npm/ng-packs/packages/core/src/lib/utils/multi-tenancy-utils.ts

@ -90,18 +90,21 @@ function replaceTenantNameWithinEnvironment(
);
}
if (environment.oAuthConfig.redirectUri) {
if (environment.oAuthConfig?.redirectUri) {
environment.oAuthConfig.redirectUri = environment.oAuthConfig.redirectUri.replace(
placeholder,
tenancyName,
);
}
environment.oAuthConfig.issuer = environment.oAuthConfig.issuer.replace(placeholder, tenancyName);
if(!environment.oAuthConfig) {
environment.oAuthConfig = {};
}
environment.oAuthConfig.issuer = (environment.oAuthConfig.issuer || '').replace(placeholder, tenancyName);
Object.keys(environment.apis).forEach(api => {
Object.keys(environment.apis[api]).forEach(key => {
environment.apis[api][key] = environment.apis[api][key].replace(placeholder, tenancyName);
environment.apis[api][key] = (environment.apis[api][key] || '').replace(placeholder, tenancyName);
});
});

28
npm/ng-packs/packages/core/src/lib/utils/object-utils.ts

@ -6,18 +6,25 @@ import {
isObject,
isObjectAndNotArrayNotNode,
} from './common-utils';
import { DeepPartial } from '../models';
export function deepMerge(target, source) {
export function deepMerge<T>(
target: DeepPartial<T> | T,
source: DeepPartial<T> | T,
): DeepPartial<T> | T {
if (isObjectAndNotArrayNotNode(target) && isObjectAndNotArrayNotNode(source)) {
return deepMergeRecursively(target, source);
} else if (isNullOrUndefined(target) && isNullOrUndefined(source)) {
return {};
return {} as T;
} else {
return exists(source) ? source : target;
return exists(source) ? (source as T) : target;
}
}
function deepMergeRecursively(target, source) {
function deepMergeRecursively<T>(
target: DeepPartial<T> | T,
source: DeepPartial<T> | T,
): DeepPartial<T> | T {
const shouldNotRecurse =
isNullOrUndefined(target) ||
isNullOrUndefined(source) || // at least one not defined
@ -33,14 +40,17 @@ function deepMergeRecursively(target, source) {
* we will prioritize source if it is a defined value.
*/
if (shouldNotRecurse) {
return exists(source) ? source : target;
return exists(source) ? (source as T) : target;
}
const keysOfTarget = Object.keys(target);
const keysOfSource = Object.keys(source);
const keysOfTarget = Object.keys(target as { [key: string]: any });
const keysOfSource = Object.keys(source as { [key: string]: any });
const uniqueKeys = new Set(keysOfTarget.concat(keysOfSource));
return [...uniqueKeys].reduce((retVal, key) => {
retVal[key] = deepMergeRecursively(target[key], source[key]);
(retVal as any)[key] = deepMergeRecursively(
(target as { [key: string]: any })[key],
(source as { [key: string]: any })[key],
);
return retVal;
}, {});
}, {} as T);
}

6
npm/ng-packs/packages/core/src/lib/utils/route-utils.ts

@ -1,11 +1,11 @@
import { NgZone } from '@angular/core';
import { PRIMARY_OUTLET, Router, UrlSegmentGroup } from '@angular/router';
import { PRIMARY_OUTLET, Router, UrlSegment, UrlSegmentGroup } from "@angular/router";
import { ABP } from '../models/common';
import { RoutesService } from '../services/routes.service';
import { noop } from './common-utils';
import { TreeNode } from './tree-utils';
export function findRoute(routesService: RoutesService, path: string): TreeNode<ABP.Route> {
export function findRoute(routesService: RoutesService, path: string): TreeNode<ABP.Route> | null {
const node = routesService.find(route => route.path === path);
return node || path === '/'
@ -14,7 +14,7 @@ export function findRoute(routesService: RoutesService, path: string): TreeNode<
}
export function getRoutePath(router: Router, url = router.url) {
const emptyGroup = { segments: [] } as UrlSegmentGroup;
const emptyGroup = { segments: [] as UrlSegment[] } as UrlSegmentGroup;
const primaryGroup = router.parseUrl(url).root.children[PRIMARY_OUTLET];
return '/' + (primaryGroup || emptyGroup).segments.map(({ path }) => path).join('/');

6
npm/ng-packs/packages/core/src/lib/utils/tree-utils.ts

@ -62,7 +62,7 @@ export function createTreeNodeFilterCreator<T extends object>(
return (search: string) => {
const regex = new RegExp('.*' + search + '.*', 'i');
return function collectNodes(nodes: TreeNode<T>[], matches = []) {
return function collectNodes(nodes: TreeNode<T>[], matches: TreeNode<T>[] = []) {
for (const node of nodes) {
if (regex.test(mapperFn(node[key]))) matches.push(node);
@ -82,8 +82,8 @@ export type TreeNode<T extends object> = {
parent?: TreeNode<T>;
};
type NodeKey = number | string | symbol | undefined | null;
export type NodeKey = number | string | symbol | undefined | null;
type NodeValue<T extends object, F extends (...args: any) => any> = F extends undefined
export type NodeValue<T extends object, F extends (...args: any) => any> = F extends undefined
? TreeNode<T>
: ReturnType<F>;

4
npm/ng-packs/packages/core/src/lib/validators/range.validator.ts

@ -21,10 +21,10 @@ export function validateRange({ maximum = Infinity, minimum = 0 }: RangeOptions
};
}
function getMaxError(value: number, max: number, min: number): RangeError {
function getMaxError(value: number, max: number, min: number): RangeError | null {
return value > max ? { range: { max, min } } : null;
}
function getMinError(value: number, min: number, max: number): RangeError {
function getMinError(value: number, min: number, max: number): RangeError | null {
return value < min ? { range: { min, max } } : null;
}

2
npm/ng-packs/packages/core/src/lib/validators/required.validator.ts

@ -16,7 +16,7 @@ export function validateRequired({ allowEmptyStrings }: RequiredOptions = {}): V
return required;
}
function isValidRequired(value: any, allowEmptyStrings: boolean): boolean {
function isValidRequired(value: any, allowEmptyStrings: boolean | undefined): boolean {
if (value || value === 0 || value === false) return true;
if (allowEmptyStrings && value === '') return true;

4
npm/ng-packs/packages/core/src/lib/validators/string-length.validator.ts

@ -27,10 +27,10 @@ export function validateStringLength({
};
}
function getMaxLengthError(value: string, requiredLength: number): StringLengthError {
function getMaxLengthError(value: string, requiredLength: number): StringLengthError | null {
return value.length > requiredLength ? { maxlength: { requiredLength } } : null;
}
function getMinLengthError(value: string, requiredLength: number): StringLengthError {
function getMinLengthError(value: string, requiredLength: number): StringLengthError | null {
return value.length < requiredLength ? { minlength: { requiredLength } } : null;
}

2
npm/ng-packs/packages/core/src/lib/validators/username.validator.ts

@ -14,7 +14,7 @@ export interface UsernameOptions {
const onlyLetterAndNumberRegex = /^[a-zA-Z0-9]+$/;
export function validateUsername(
{ pattern }: UsernameOptions = { pattern: onlyLetterAndNumberRegex },
{ pattern = /.*/ }: UsernameOptions = { pattern: onlyLetterAndNumberRegex },
): ValidatorFn {
return (control: AbstractControl): UsernamePatternError | null => {
const isValid = isValidUserName(control.value, pattern);

2
npm/ng-packs/packages/core/testing/src/lib/services/mock-permission.service.ts

@ -27,7 +27,7 @@ export class MockPermissionService extends PermissionService {
const grantedPolicies = keys.reduce((policies, key) => {
policies[key] = true;
return policies;
}, {});
}, {} as { [key: string]: boolean });
this.configState['store'].deepPatch({ auth: { grantedPolicies } });
}

10
npm/ng-packs/packages/core/testing/src/lib/services/mock-rest.service.ts

@ -1,4 +1,10 @@
import { ABP, CORE_OPTIONS, EnvironmentService, RestService } from '@abp/ng.core';
import {
ABP,
CORE_OPTIONS,
EnvironmentService,
HttpErrorReporterService,
RestService,
} from '@abp/ng.core';
import { HttpClient } from '@angular/common/http';
import { Inject, Injectable } from '@angular/core';
import { Observable, throwError } from 'rxjs';
@ -12,7 +18,7 @@ export class MockRestService extends RestService {
protected http: HttpClient,
protected environment: EnvironmentService,
) {
super(options, http, environment, null);
super(options, http, environment, null as unknown as HttpErrorReporterService);
}
handleError(err: any): Observable<any> {

6
npm/ng-packs/packages/oauth/src/lib/handlers/oauth-configuration.handler.ts

@ -1,5 +1,5 @@
import { Inject, Injectable } from '@angular/core';
import { OAuthService } from 'angular-oauth2-oidc';
import { AuthConfig, OAuthService } from "angular-oauth2-oidc";
import compare from 'just-compare';
import { filter, map } from 'rxjs/operators';
import { ABP, EnvironmentService, CORE_OPTIONS } from '@abp/ng.core';
@ -20,10 +20,10 @@ export class OAuthConfigurationHandler {
this.environmentService
.createOnUpdateStream(state => state)
.pipe(
map(environment => environment.oAuthConfig),
map(environment => environment.oAuthConfig as AuthConfig),
filter(config => !compare(config, this.options.environment.oAuthConfig)),
)
.subscribe(config => {
.subscribe((config) => {
this.oAuthService.configure(config);
});
}

4
npm/ng-packs/packages/oauth/src/lib/interceptors/api.interceptor.ts

@ -3,11 +3,11 @@ import { Inject, Injectable } from '@angular/core';
import { OAuthService } from 'angular-oauth2-oidc';
import { finalize } from 'rxjs/operators';
import {
SessionStateService,
HttpWaitService,
TENANT_KEY,
IApiInterceptor,
IS_EXTERNAL_REQUEST,
SessionStateService,
TENANT_KEY,
} from '@abp/ng.core';
@Injectable({

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

@ -1,4 +1,4 @@
import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core';
import { APP_INITIALIZER, ModuleWithProviders, NgModule, Provider } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc';
import {
@ -63,7 +63,7 @@ export class AbpOAuthModule {
deps: [OAuthConfigurationHandler],
useFactory: noop,
},
OAuthModule.forRoot().providers,
OAuthModule.forRoot().providers as Provider[],
{ provide: OAuthStorage, useFactory: storageFactory },
],
};

6
npm/ng-packs/packages/oauth/src/lib/services/oauth.service.ts

@ -6,13 +6,13 @@ import { IAuthService, LoginParams } from '@abp/ng.core';
import { AuthFlowStrategy } from '../strategies';
import { EnvironmentService } from '@abp/ng.core';
import { AUTH_FLOW_STRATEGY } from '../tokens/auth-flow-strategy';
import { OAuthService } from 'angular-oauth2-oidc';
import { AuthConfig, OAuthService } from "angular-oauth2-oidc";
@Injectable({
providedIn: 'root',
})
export class AbpOAuthService implements IAuthService {
private strategy: AuthFlowStrategy;
private strategy!: AuthFlowStrategy;
get isInternalAuth() {
return this.strategy.isInternalAuth;
@ -25,7 +25,7 @@ export class AbpOAuthService implements IAuthService {
const result$ = environmentService.getEnvironment$().pipe(
map(env => env?.oAuthConfig),
filter(oAuthConfig => !!oAuthConfig),
filter(Boolean),
tap(oAuthConfig => {
this.strategy =
oAuthConfig.responseType === 'code'

18
npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts

@ -9,15 +9,16 @@ import {
import { Observable, of } from 'rxjs';
import { filter, switchMap, tap } from 'rxjs/operators';
import {
LoginParams,
ConfigStateService,
EnvironmentService,
HttpErrorReporterService,
LoginParams,
SessionStateService,
TENANT_KEY,
} from '@abp/ng.core';
import { clearOAuthStorage } from '../utils/clear-o-auth-storage';
import { oAuthStorage } from '../utils/oauth-storage';
import { HttpErrorResponse } from '@angular/common/http';
export abstract class AuthFlowStrategy {
abstract readonly isInternalAuth: boolean;
@ -26,7 +27,7 @@ export abstract class AuthFlowStrategy {
protected environment: EnvironmentService;
protected configState: ConfigStateService;
protected oAuthService: OAuthService2;
protected oAuthConfig: AuthConfig;
protected oAuthConfig!: AuthConfig;
protected sessionState: SessionStateService;
protected tenantKey: string;
@ -38,7 +39,7 @@ export abstract class AuthFlowStrategy {
abstract login(params?: LoginParams | Params): Observable<any>;
private catchError = err => {
private catchError = (err: HttpErrorResponse) => {
this.httpErrorReporter.reportError(err);
return of(null);
};
@ -49,18 +50,17 @@ export abstract class AuthFlowStrategy {
this.configState = injector.get(ConfigStateService);
this.oAuthService = injector.get(OAuthService2);
this.sessionState = injector.get(SessionStateService);
this.oAuthConfig = this.environment.getEnvironment().oAuthConfig;
this.oAuthConfig = this.environment.getEnvironment().oAuthConfig || {};
this.tenantKey = injector.get(TENANT_KEY);
this.listenToOauthErrors();
}
async init(): Promise<any> {
const shouldClear = shouldStorageClear(
this.environment.getEnvironment().oAuthConfig.clientId,
oAuthStorage,
);
if (shouldClear) clearOAuthStorage(oAuthStorage);
if (this.oAuthConfig.clientId) {
const shouldClear = shouldStorageClear(this.oAuthConfig.clientId, oAuthStorage);
if (shouldClear) clearOAuthStorage(oAuthStorage);
}
this.oAuthService.configure(this.oAuthConfig);

2
npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts

@ -52,7 +52,7 @@ export const setTokenResponseToStorage: SetTokenResponseToStorageFn<TokenRespons
}
};
export function setRememberMe(remember: boolean) {
export function setRememberMe(remember: boolean | undefined) {
removeRememberMe();
localStorage.setItem(storageKey, 'true');
document.cookie = `${cookieKey}=true; path=/${

14
npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date-time.adapter.ts

@ -3,9 +3,9 @@ import { NgbDateStruct, NgbTimeStruct } from '@ng-bootstrap/ng-bootstrap';
@Injectable()
export class DateTimeAdapter {
value!: NgbDateTimeStruct;
value!: Partial<NgbDateTimeStruct>;
fromModel(value: string | Date): NgbDateTimeStruct | null {
fromModel(value: string | Date): Partial<NgbDateTimeStruct> | null {
if (!value) return null;
const date = new Date(value);
@ -24,12 +24,12 @@ export class DateTimeAdapter {
return this.value;
}
toModel(value: NgbDateTimeStruct | null): string {
toModel(value: Partial<NgbDateTimeStruct> | null): string {
if (!value) return '';
const now = new Date();
value = {
const newValue = {
// TODO look for strict mode errors
year: now.getUTCFullYear(),
month: now.getMonth() + 1,
@ -39,11 +39,11 @@ export class DateTimeAdapter {
second: 0,
...this.value,
...value,
};
} as NgbDateTimeStruct;
const date = new Date(
value.year,
value.month - 1,
newValue.year,
newValue.month - 1,
value.day,
value.hour,
value.minute,

16
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-props.ts

@ -35,8 +35,8 @@ export class EntityProp<R = any> extends Prop<R> {
super(
options.type,
options.name,
options.displayName,
options.permission,
options.displayName || '',
options.permission || '',
options.visible,
options.isExtra,
);
@ -45,9 +45,15 @@ export class EntityProp<R = any> extends Prop<R> {
this.sortable = options.sortable || false;
this.valueResolver =
options.valueResolver || (data => of(escapeHtmlChars(data.record[this.name])));
this.action = options.action;
this.component = options.component;
this.enumList = options.enumList;
if (options.action) {
this.action = options.action;
}
if (options.component) {
this.component = options.component;
}
if (options.enumList) {
this.enumList = options.enumList;
}
}
static create<R = any>(options: EntityPropOptions<R>) {

10
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts

@ -18,7 +18,7 @@ import {
export class FormPropList<R = any> extends PropList<R, FormProp<R>> {}
export class FormProps<R = any> extends Props<FormPropList<R>> {
export class FormProps<R = any> extends Props<PropList<R, FormProp<R>> {
protected _ctor: Type<FormPropList<R>> = FormPropList;
}
@ -76,8 +76,8 @@ export class FormProp<R = any> extends Prop<R> {
super(
options.type,
options.name,
options.displayName,
options.permission,
options.displayName || '',
options.permission || '',
options.visible,
options.isExtra,
options.template,
@ -94,7 +94,7 @@ export class FormProp<R = any> extends Prop<R> {
this.options = options.options;
this.id = options.id || options.name;
const defaultValue = options.defaultValue;
this.defaultValue = isFalsyValue(defaultValue) ? defaultValue : defaultValue || null;
this.defaultValue = isFalsyValue(defaultValue) ? defaultValue as number : defaultValue || '';
this.displayTextResolver = options.displayTextResolver;
}
@ -141,6 +141,6 @@ export type EditFormPropDefaults<R = any> = Record<string, FormProp<R>[]>;
export type EditFormPropContributorCallback<R = any> = PropContributorCallback<FormPropList<R>>;
export type EditFormPropContributorCallbacks<R = any> = PropContributorCallbacks<FormPropList<R>>;
function isFalsyValue(defaultValue: FormProp['defaultValue']): boolean {
function isFalsyValue(defaultValue?: FormProp['defaultValue']): boolean {
return [0, '', false].indexOf(defaultValue as any) > -1;
}

9
npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb/breadcrumb.component.ts

@ -1,4 +1,11 @@
import { ABP, getRoutePath, RouterEvents, RoutesService, SubscriptionService, TreeNode } from '@abp/ng.core';
import {
ABP,
getRoutePath,
RouterEvents,
RoutesService,
SubscriptionService,
TreeNode,
} from '@abp/ng.core';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { map, startWith } from 'rxjs/operators';

7
npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts

@ -15,7 +15,7 @@ export class ConfirmationComponent {
reject = Confirmation.Status.reject;
dismiss = Confirmation.Status.dismiss;
confirmation$!: ReplaySubject<Confirmation.DialogData>;
confirmation$!: ReplaySubject<Confirmation.DialogData | null>;
clear!: (status: Confirmation.Status) => void;
@ -30,7 +30,10 @@ export class ConfirmationComponent {
if (!this.icons) {
return '';
}
return this.icons[severity] || this.icons.default;
if (severity) {
return this.icons[severity];
}
return this.icons.default;
}
isCustomIconExists({ options }: Confirmation.DialogData): boolean {

4
npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts

@ -4,7 +4,7 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms';
@Component({
selector: 'abp-password',
templateUrl: `password.component.html`,
templateUrl: `./password.component.html`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
@ -16,7 +16,7 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms';
export class PasswordComponent extends AbstractNgModelComponent {
@Input() inputId!: string;
@Input() formControlName!: string;
fieldTextType: boolean;
fieldTextType?: boolean;
constructor(injector: Injector) {
super(injector);

3
npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts

@ -1,8 +1,9 @@
import { BehaviorSubject, Observable } from 'rxjs';
import { NavItem } from '../models/nav-item';
import { Type } from '@angular/core';
export abstract class AbstractMenuService<T extends NavItem> {
protected abstract baseClass;
protected abstract baseClass: Type<any>;
protected _items$ = new BehaviorSubject<T[]>([]);

2
npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts

@ -8,7 +8,7 @@ import { Confirmation } from '../models/confirmation';
@Injectable({ providedIn: 'root' })
export class ConfirmationService {
status$!: Subject<Confirmation.Status>;
confirmation$ = new ReplaySubject<Confirmation.DialogData>(1);
confirmation$ = new ReplaySubject<Confirmation.DialogData | null>(1);
private containerComponentRef!: ComponentRef<ConfirmationComponent>;

2
npm/ng-packs/packages/theme-shared/src/lib/tokens/confirmation-icons.token.ts

@ -6,6 +6,7 @@ export interface ConfirmationIcons {
warning: string;
error: string;
default: string;
neutral: string;
}
export const CONFIRMATION_ICONS = new InjectionToken<Partial<ConfirmationIcons>>(
@ -18,4 +19,5 @@ export const DEFAULT_CONFIRMATION_ICONS: ConfirmationIcons = {
warning: 'fa fa-exclamation-triangle',
error: 'fa fa-times-circle',
default: 'fa fa-question-circle',
neutral: '',
};

2
npm/ng-packs/tsconfig.base.json

@ -1,7 +1,7 @@
{
"compileOnSave": false,
"compilerOptions": {
"strict": false,
"strict": true,
"sourceMap": true,
"declaration": false,
"moduleResolution": "node",

Loading…
Cancel
Save