content-viewer.component.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import { Component, ComponentRef, Input, OnDestroy, ViewChild, ViewContainerRef } from '@angular/core';
  2. import { AttributesMap } from 'ng-dynamic-component';
  3. import { BehaviorSubject, combineLatest, Observable } from 'rxjs';
  4. import { filter, map, shareReplay } from 'rxjs/operators';
  5. import { EditionLevelType, TextFlow } from '../../app.config';
  6. import { GenericElement } from '../../models/evt-models';
  7. import { ComponentRegisterService } from '../../services/component-register.service';
  8. import { EntitiesSelectService } from '../../services/entities-select.service';
  9. import { EntitiesSelectItem } from '../entities-select/entities-select.component';
  10. import { LemsSelectService } from '../../services/lems-select.service';
  11. import { LemsSelectItem } from '../lems-select/lems-select.component';
  12. import { IperlemsSelectService } from '../../services/iperlems-select.service';
  13. import { IperlemsSelectItem } from '../iperlems-select/iperlems-select.component';
  14. @Component({
  15. selector: 'evt-content-viewer',
  16. templateUrl: './content-viewer.component.html',
  17. })
  18. export class ContentViewerComponent implements OnDestroy {
  19. private v: GenericElement;
  20. @Input() set content(v: GenericElement) {
  21. this.v = v;
  22. this.contentChange.next(v);
  23. }
  24. get content() { return this.v; }
  25. private ith: EntitiesSelectItem[];
  26. @Input() set itemsToHighlight(i: EntitiesSelectItem[]) {
  27. this.ith = i;
  28. this.itemsToHighlightChange.next(i);
  29. }
  30. get itemsToHighlight() { return this.ith; }
  31. private ithlems: LemsSelectItem[];
  32. @Input() set itemsLemsToHighlight(i: LemsSelectItem[]) {
  33. this.ithlems = i;
  34. this.itemsLemsToHighlightChange.next(i);
  35. }
  36. get itemsLemsToHighlight() { return this.ithlems; }
  37. private ithiperlems: IperlemsSelectItem[];
  38. @Input() set itemsIperlemsToHighlight(i: IperlemsSelectItem[]) {
  39. this.ithiperlems = i;
  40. this.itemsIperlemsToHighlightChange.next(i);
  41. }
  42. get itemsIperlemsToHighlight() { return this.ithiperlems; }
  43. contentChange = new BehaviorSubject<GenericElement>(undefined);
  44. @ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef;
  45. itemsToHighlightChange = new BehaviorSubject<EntitiesSelectItem[]>([]);
  46. itemsLemsToHighlightChange = new BehaviorSubject<LemsSelectItem[]>([]);
  47. itemsIperlemsToHighlightChange = new BehaviorSubject<IperlemsSelectItem[]>([]);
  48. private edLevel: EditionLevelType;
  49. @Input() set editionLevel(el: EditionLevelType) {
  50. this.edLevel = el;
  51. this.editionLevelChange.next(el);
  52. }
  53. get editionLevel() { return this.edLevel; }
  54. editionLevelChange = new BehaviorSubject<EditionLevelType | ''>('');
  55. private txtFlow: TextFlow;
  56. @Input() set textFlow(t: TextFlow) {
  57. this.txtFlow = t;
  58. this.textFlowChange.next(t);
  59. }
  60. get textFlow() { return this.txtFlow; }
  61. textFlowChange = new BehaviorSubject<TextFlow>(undefined);
  62. constructor(
  63. private componentRegister: ComponentRegisterService,
  64. private entitiesSelectService: EntitiesSelectService,
  65. private lemsSelectService: LemsSelectService,
  66. private iperlemsSelectService: IperlemsSelectService,
  67. ) {
  68. }
  69. // tslint:disable-next-line: no-any
  70. public parsedContent: Observable<{ [keyName: string]: any }> = this.contentChange.pipe(
  71. map((data) => ({
  72. ...data,
  73. type: this.componentRegister.getComponent(data?.type ?? GenericElement) || this.componentRegister.getComponent(GenericElement),
  74. })),
  75. shareReplay(1),
  76. );
  77. // tslint:disable-next-line: no-any
  78. public inputs: Observable<{ [keyName: string]: any }> = combineLatest([
  79. this.contentChange,
  80. this.itemsToHighlightChange,
  81. this.itemsLemsToHighlightChange,
  82. this.itemsIperlemsToHighlightChange,
  83. this.editionLevelChange,
  84. this.textFlowChange,
  85. ]).pipe(
  86. map(([data, itemsToHighlight, itemsLemsToHighlight, itemsIperlemsToHighlight, editionLevel, textFlow]) => {
  87. if (this.toBeHighlighted()) {
  88. return {
  89. data,
  90. highlightData: this.getHighlightData(data, itemsToHighlight),
  91. highlightDataLem: this.getHighlightDataLem(data, itemsLemsToHighlight),
  92. highlightDataIperlem: this.getHighlightDataIperlem(data, itemsIperlemsToHighlight),
  93. itemsToHighlight,
  94. itemsLemsToHighlight,
  95. itemsIperlemsToHighlight,
  96. editionLevel,
  97. textFlow,
  98. };
  99. }
  100. return {
  101. data,
  102. editionLevel,
  103. textFlow,
  104. };
  105. }),
  106. shareReplay(1),
  107. );
  108. // tslint:disable-next-line: ban-types
  109. public outputs: Observable<{ [keyName: string]: Function }> = this.contentChange.pipe(
  110. map(() => ({})),
  111. shareReplay(1),
  112. );
  113. public attributes: Observable<AttributesMap> = this.contentChange.pipe(
  114. filter(parsedContent => !!parsedContent),
  115. map((parsedContent) => ({ ...parsedContent.attributes || {}, ...{ class: `edition-font ${parsedContent.class || ''}` } })),
  116. shareReplay(1),
  117. );
  118. public context$ = combineLatest([
  119. this.parsedContent,
  120. this.inputs,
  121. this.outputs,
  122. this.attributes,
  123. ]).pipe(
  124. map(([parsedContent, inputs, outputs, attributes]) => (
  125. { parsedContent, inputs, outputs, attributes }
  126. )),
  127. );
  128. private componentRef: ComponentRef<{}>;
  129. private toBeHighlighted() {
  130. return true; // TODO: Decide when an item should be highlighted
  131. }
  132. private getHighlightData(data, ith: EntitiesSelectItem[]) {
  133. return {
  134. highlight: ith?.some(i => this.entitiesSelectService.matchClassAndAttributes(i.value, data?.attributes ?? {}, data?.class)) ?? false,
  135. highlightColor: this.entitiesSelectService.getHighlightColor(data?.attributes ?? {}, data?.class, ith),
  136. };
  137. }
  138. private getHighlightDataLem(data, ithlems: LemsSelectItem[]) {
  139. return {
  140. highlight: ithlems?.some(i => this.lemsSelectService.matchClassAndAttributes(i.value, data?.attributes ?? {}, data?.class)) ?? false,
  141. highlightColor: this.lemsSelectService.getHighlightColor(data?.attributes ?? {}, data?.class, ithlems),
  142. };
  143. }
  144. private getHighlightDataIperlem(data, ithiperlems: IperlemsSelectItem[]) {
  145. return {
  146. highlight: ithiperlems?.some(i => this.iperlemsSelectService.matchClassAndAttributes(i.value, data?.attributes ?? {}, data?.class)) ?? false,
  147. highlightColor: this.iperlemsSelectService.getHighlightColor(data?.attributes ?? {}, data?.class, ithiperlems),
  148. };
  149. }
  150. ngOnDestroy() {
  151. if (this.componentRef) {
  152. this.componentRef.destroy();
  153. this.componentRef = undefined;
  154. }
  155. }
  156. }