base-detail.component.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { FormGroup } from '@angular/forms';
  2. import { ActivatedRoute, Router } from '@angular/router';
  3. import { combineLatest, Observable, of, Subject } from 'rxjs';
  4. import { map, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';
  5. import { LanguageCode } from 'shared/generated-types';
  6. import { CustomFieldConfig, CustomFields } from 'shared/shared-types';
  7. import { ServerConfigService } from '../data/server-config';
  8. import { getDefaultLanguage } from './utilities/get-default-language';
  9. export abstract class BaseDetailComponent<Entity extends { id: string }> {
  10. entity$: Observable<Entity>;
  11. availableLanguages$: Observable<LanguageCode[]>;
  12. languageCode$: Observable<LanguageCode>;
  13. isNew$: Observable<boolean>;
  14. id: string;
  15. abstract detailForm: FormGroup;
  16. protected destroy$ = new Subject<void>();
  17. protected constructor(
  18. protected route: ActivatedRoute,
  19. protected router: Router,
  20. protected serverConfigService: ServerConfigService,
  21. ) {}
  22. init() {
  23. this.entity$ = this.route.data.pipe(
  24. switchMap(data => data.entity),
  25. tap<any>(entity => (this.id = entity.id)),
  26. );
  27. this.isNew$ = this.entity$.pipe(
  28. map(entity => entity.id === ''),
  29. shareReplay(1),
  30. );
  31. this.languageCode$ = this.route.paramMap.pipe(
  32. map(paramMap => paramMap.get('lang')),
  33. map(lang => (!lang ? getDefaultLanguage() : (lang as LanguageCode))),
  34. );
  35. this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();
  36. combineLatest(this.entity$, this.languageCode$)
  37. .pipe(takeUntil(this.destroy$))
  38. .subscribe(([facet, languageCode]) => {
  39. this.setFormValues(facet, languageCode);
  40. this.detailForm.markAsPristine();
  41. });
  42. }
  43. destroy() {
  44. this.destroy$.next();
  45. this.destroy$.complete();
  46. }
  47. setLanguage(code: LanguageCode) {
  48. this.setQueryParam('lang', code);
  49. }
  50. protected abstract setFormValues(entity: Entity, languageCode: LanguageCode): void;
  51. protected getCustomFieldConfig(key: keyof CustomFields): CustomFieldConfig[] {
  52. return this.serverConfigService.serverConfig.customFields[key] || [];
  53. }
  54. protected setQueryParam(key: string, value: any) {
  55. this.router.navigate(['./', { [key]: value }], {
  56. relativeTo: this.route,
  57. queryParamsHandling: 'merge',
  58. });
  59. }
  60. }