base-detail.component.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { ChangeDetectorRef, OnDestroy, OnInit } from '@angular/core';
  2. import { FormBuilder } from '@angular/forms';
  3. import { ActivatedRoute, Router } from '@angular/router';
  4. import { combineLatest, Observable, of, Subject } from 'rxjs';
  5. import { map, switchMap, takeUntil } from 'rxjs/operators';
  6. import { LanguageCode } from 'shared/generated-types';
  7. import { CustomFieldConfig, CustomFields } from 'shared/shared-types';
  8. import { NotificationService } from '../core/providers/notification/notification.service';
  9. import { DataService } from '../data/providers/data.service';
  10. import { getServerConfig } from '../data/server-config';
  11. import { getDefaultLanguage } from './utilities/get-default-language';
  12. export abstract class BaseDetailComponent<Entity extends { id: string }> {
  13. entity$: Observable<Entity>;
  14. availableLanguages$: Observable<LanguageCode[]>;
  15. languageCode$: Observable<LanguageCode>;
  16. isNew$: Observable<boolean>;
  17. protected destroy$ = new Subject<void>();
  18. protected constructor(protected route: ActivatedRoute, protected router: Router) {}
  19. init() {
  20. this.entity$ = this.route.data.pipe(switchMap(data => data.entity));
  21. this.isNew$ = this.entity$.pipe(map(entity => entity.id === ''));
  22. this.languageCode$ = this.route.queryParamMap.pipe(
  23. map(qpm => qpm.get('lang')),
  24. map(lang => (!lang ? getDefaultLanguage() : (lang as LanguageCode))),
  25. );
  26. this.availableLanguages$ = of([LanguageCode.en]);
  27. combineLatest(this.entity$, this.languageCode$)
  28. .pipe(takeUntil(this.destroy$))
  29. .subscribe(([facet, languageCode]) => this.setFormValues(facet, languageCode));
  30. }
  31. destroy() {
  32. this.destroy$.next();
  33. this.destroy$.complete();
  34. }
  35. protected abstract setFormValues(entity: Entity, languageCode: LanguageCode): void;
  36. protected getCustomFieldConfig(key: keyof CustomFields): CustomFieldConfig[] {
  37. return getServerConfig().customFields[key] || [];
  38. }
  39. protected setQueryParam(key: string, value: any) {
  40. this.router.navigate(['./'], {
  41. queryParams: { [key]: value },
  42. relativeTo: this.route,
  43. queryParamsHandling: 'merge',
  44. });
  45. }
  46. }