From 4d384ee426b75e2cd2d37ec4be311b38f1e9c33d Mon Sep 17 00:00:00 2001 From: jojohoch <joachim.hoch@iqb.hu-berlin.de> Date: Fri, 29 Oct 2021 15:15:30 +0200 Subject: [PATCH] [player] Remove methods from UnitStateService to ElementContainer --- .../src/app/classes/intersection-detector.ts | 1 + .../element-container.component.ts | 44 +++++++++++++++-- .../src/app/services/unit-state.service.ts | 49 ++----------------- 3 files changed, 46 insertions(+), 48 deletions(-) diff --git a/projects/player/src/app/classes/intersection-detector.ts b/projects/player/src/app/classes/intersection-detector.ts index f7488dc08..9d760c93b 100644 --- a/projects/player/src/app/classes/intersection-detector.ts +++ b/projects/player/src/app/classes/intersection-detector.ts @@ -35,6 +35,7 @@ export class IntersectionDetector { const intersectedElementIndex = this.elements.findIndex(e => e.element === element); if (intersectedElementIndex > -1) { const intersectedElement = this.elements[intersectedElementIndex]; + this.intersecting.emit(intersectedElement.id); this.intersectionObserver.unobserve(intersectedElement.element); this.elements.splice(intersectedElementIndex, 1); } diff --git a/projects/player/src/app/components/element-container/element-container.component.ts b/projects/player/src/app/components/element-container/element-container.component.ts index 74358834c..be1e6acef 100644 --- a/projects/player/src/app/components/element-container/element-container.component.ts +++ b/projects/player/src/app/components/element-container/element-container.component.ts @@ -14,7 +14,7 @@ import { FormService } from '../../services/form.service'; import { UnitStateService } from '../../services/unit-state.service'; import { MarkingService } from '../../services/marking.service'; import { - InputElement, + InputElement, InputElementValue, UIElement, ValueChangeElement } from '../../../../../common/models/uI-element'; @@ -23,6 +23,9 @@ import { FormElementComponent } from '../../../../../common/form-element-compone import { ElementComponent } from '../../../../../common/element-component.directive'; import { CompoundElementComponent } from '../../../../../common/element-components/compound-elements/compound-element.directive'; +import { TextElement } from '../../../../../common/models/text-element'; +import { VideoElement } from '../../../../../common/models/video-element'; +import { AudioElement } from '../../../../../common/models/audio-element'; @Component({ selector: 'app-element-container', @@ -54,10 +57,12 @@ export class ElementContainerComponent implements OnInit { const elementComponentFactory = ElementFactory.getComponentFactory(this.elementModel.type, this.componentFactoryResolver); const elementComponent = this.elementComponentContainer.createComponent(elementComponentFactory).instance; - elementComponent.elementModel = this.unitStateService.restoreUnitStateValue(this.elementModel); + elementComponent.elementModel = this.restoreUnitStateValue(this.elementModel); if (elementComponent.domElement) { - this.unitStateService.registerElement(elementComponent.elementModel, elementComponent.domElement); + this.unitStateService.registerElement( + this.initUnitStateValue(elementComponent.elementModel), elementComponent.domElement + ); } if (elementComponent.childrenAdded) { @@ -66,7 +71,7 @@ export class ElementContainerComponent implements OnInit { .subscribe((children: QueryList<ElementComponent>) => { children.forEach(child => { if (child.domElement) { - this.unitStateService.registerElement(child.elementModel, child.domElement); + this.unitStateService.registerElement(this.initUnitStateValue(child.elementModel), child.domElement); } }); }); @@ -141,6 +146,37 @@ export class ElementContainerComponent implements OnInit { } } + private restoreUnitStateValue(elementModel: UIElement): UIElement { + const unitStateElementCode = this.unitStateService.getUnitStateElement(elementModel.id); + if (unitStateElementCode && unitStateElementCode.value !== undefined) { + switch (elementModel.type) { + case 'text': + elementModel.text = unitStateElementCode.value; + break; + case 'video': + case 'audio': + elementModel.playbackTime = unitStateElementCode.value; + break; + default: + elementModel.value = unitStateElementCode.value; + } + } + return elementModel; + } + + private initUnitStateValue = (elementModel: UIElement): { id: string, value: InputElementValue } => { + switch (elementModel.type) { + case 'text': + return { id: elementModel.id, value: (elementModel as TextElement).text }; + case 'video': + return { id: elementModel.id, value: (elementModel as VideoElement).playbackTime }; + case 'audio': + return { id: elementModel.id, value: (elementModel as AudioElement).playbackTime }; + default: + return { id: elementModel.id, value: (elementModel as InputElement).value }; + } + }; + private registerFormGroup(elementForm: FormGroup): void { this.formService.registerFormGroup({ formGroup: elementForm, diff --git a/projects/player/src/app/services/unit-state.service.ts b/projects/player/src/app/services/unit-state.service.ts index f7196967a..ff9a503d0 100644 --- a/projects/player/src/app/services/unit-state.service.ts +++ b/projects/player/src/app/services/unit-state.service.ts @@ -7,12 +7,7 @@ import { UnitStateElementCodeStatus, UnitStateElementCodeStatusValue } from '../models/verona'; -import { - InputElement, InputElementValue, UIElement, ValueChangeElement -} from '../../../../common/models/uI-element'; -import { TextElement } from '../../../../common/models/text-element'; -import { VideoElement } from '../../../../common/models/video-element'; -import { AudioElement } from '../../../../common/models/audio-element'; +import { InputElementValue, ValueChangeElement } from '../../../../common/models/uI-element'; import { IntersectionDetector } from '../classes/intersection-detector'; @Injectable({ @@ -28,7 +23,7 @@ export class UnitStateService { this.intersectionDetector = new IntersectionDetector(document); } - private getUnitStateElement(id: string): UnitStateElementCode | undefined { + getUnitStateElement(id: string): UnitStateElementCode | undefined { return this.unitStateElementCodes .find((elementCode: UnitStateElementCode): boolean => elementCode.id === id); } @@ -60,33 +55,15 @@ export class UnitStateService { return this._presentedPageAdded.asObservable(); } - registerElement(elementModel: UIElement, element: Element): void { - this.initUnitStateValue(elementModel); - this.intersectionDetector.observe(elementModel.id, element); + registerElement(element: { id: string, value: InputElementValue }, domElement: Element): void { + this.addUnitStateElementCode(element.id, element.value); + this.intersectionDetector.observe(element.id, domElement); this.intersectionDetector.intersecting .subscribe((id: string) => { this.changeElementStatus({ id: id, status: 'DISPLAYED' }); }); } - restoreUnitStateValue(elementModel: UIElement): UIElement { - const unitStateElementCode = this.getUnitStateElement(elementModel.id); - if (unitStateElementCode && unitStateElementCode.value !== undefined) { - switch (elementModel.type) { - case 'text': - elementModel.text = unitStateElementCode.value; - break; - case 'video': - case 'audio': - elementModel.playbackTime = unitStateElementCode.value; - break; - default: - elementModel.value = unitStateElementCode.value; - } - } - return elementModel; - } - addPresentedPage(presentedPage: number): void { this._presentedPageAdded.next(presentedPage); } @@ -105,22 +82,6 @@ export class UnitStateService { this.setUnitStateElementCodeStatus(elementStatus.id, elementStatus.status); } - private initUnitStateValue(elementModel: UIElement): void { - switch (elementModel.type) { - case 'text': - this.addUnitStateElementCode(elementModel.id, (elementModel as TextElement).text); - break; - case 'video': - this.addUnitStateElementCode(elementModel.id, (elementModel as VideoElement).playbackTime); - break; - case 'audio': - this.addUnitStateElementCode(elementModel.id, (elementModel as AudioElement).playbackTime); - break; - default: - this.addUnitStateElementCode(elementModel.id, (elementModel as InputElement).value); - } - } - private addUnitStateElementCode(id: string, value: InputElementValue): void { if (!this.getUnitStateElement(id)) { const unitStateElementCode: UnitStateElementCode = { id: id, value: value, status: 'NOT_REACHED' }; -- GitLab