base-detail.component.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { FormGroup } from '@angular/forms';
  2. import { ActivatedRoute, Data, Router } from '@angular/router';
  3. import { combineLatest, Observable, of, Subject } from 'rxjs';
  4. import { distinctUntilChanged, map, share, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';
  5. import { CustomFieldConfig, CustomFields } from 'shared/shared-types';
  6. import { ServerConfigService } from '../data/server-config';
  7. import { LanguageCode } from './generated-types';
  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 as Observable<Entity>),
  25. distinctUntilChanged((a, b) => a.id === b.id),
  26. tap(entity => (this.id = entity.id)),
  27. shareReplay(1),
  28. );
  29. this.isNew$ = this.entity$.pipe(
  30. map(entity => entity.id === ''),
  31. shareReplay(1),
  32. );
  33. this.languageCode$ = this.route.paramMap.pipe(
  34. map(paramMap => paramMap.get('lang')),
  35. map(lang => (!lang ? getDefaultLanguage() : (lang as LanguageCode))),
  36. distinctUntilChanged(),
  37. shareReplay(1),
  38. );
  39. this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();
  40. combineLatest(this.entity$, this.languageCode$)
  41. .pipe(takeUntil(this.destroy$))
  42. .subscribe(([entity, languageCode]) => {
  43. this.setFormValues(entity, languageCode);
  44. this.detailForm.markAsPristine();
  45. });
  46. }
  47. destroy() {
  48. this.destroy$.next();
  49. this.destroy$.complete();
  50. }
  51. setLanguage(code: LanguageCode) {
  52. this.setQueryParam('lang', code);
  53. }
  54. protected abstract setFormValues(entity: Entity, languageCode: LanguageCode): void;
  55. protected getCustomFieldConfig(key: keyof CustomFields): CustomFieldConfig[] {
  56. return this.serverConfigService.serverConfig.customFields[key] || [];
  57. }
  58. protected setQueryParam(key: string, value: any) {
  59. this.router.navigate(['./', { [key]: value }], {
  60. relativeTo: this.route,
  61. queryParamsHandling: 'merge',
  62. });
  63. }
  64. }