diff --git a/projects/common/form.service.ts b/projects/common/form.service.ts index 7a824b59a11db6a7ef1c975a36e6bf53868a5f8b..0bacb0b26ed8f65f24968c6624a83ca399fc4791 100644 --- a/projects/common/form.service.ts +++ b/projects/common/form.service.ts @@ -12,7 +12,6 @@ export class FormService { private _controlAdded = new Subject<FormControlElement>(); private _groupAdded = new Subject<ChildFormGroup>(); private _validatorsAdded = new Subject<FormControlValidators>(); - private _presentedPageAdded = new Subject<number>(); get controlAdded(): Observable<FormControlElement> { return this._controlAdded.asObservable(); @@ -26,10 +25,6 @@ export class FormService { return this._validatorsAdded.asObservable(); } - get presentedPageAdded(): Observable<number> { - return this._presentedPageAdded.asObservable(); - } - get elementValueChanged(): Observable<ValueChangeElement> { return this._elementValueChanged.asObservable(); } @@ -49,8 +44,4 @@ export class FormService { setValidators(validators: FormControlValidators): void { this._validatorsAdded.next(validators); } - - addPresentedPage(presentedPage: number): void { - this._presentedPageAdded.next(presentedPage); - } } diff --git a/projects/player/src/app/components/element/element.component.ts b/projects/player/src/app/components/element/element.component.ts index 4244eceffe215231de0a911ffa1f1632105ee298..9c6a9873b9ef9396adf45f903ee8c9e9dbd423d5 100644 --- a/projects/player/src/app/components/element/element.component.ts +++ b/projects/player/src/app/components/element/element.component.ts @@ -13,6 +13,7 @@ import { TextAreaComponent } from '../../../../../common/element-components/text import { FormService } from '../../../../../common/form.service'; import { ValueChangeElement } from '../../../../../common/form'; import { UnitStateElementCode } from '../../models/verona'; +import { UnitStateService } from '../../services/unit-state.service'; @Component({ selector: 'app-element', @@ -25,7 +26,6 @@ export class ElementComponent implements OnInit { @Input() parentArrayIndex!: number; @Input() unitStateElementCodes!: UnitStateElementCode[]; - private isInputElement!: boolean; private focussedInputSubscription!: Subscription; private ngUnsubscribe = new Subject<void>(); @@ -35,6 +35,7 @@ export class ElementComponent implements OnInit { constructor(private keyboardService: KeyboardService, private componentFactoryResolver: ComponentFactoryResolver, private formService: FormService, + private unitStateService: UnitStateService, private formBuilder: FormBuilder) { } @@ -44,14 +45,15 @@ export class ElementComponent implements OnInit { const elementComponent = this.elementComponentContainer.createComponent(elementComponentFactory).instance; elementComponent.elementModel = this.elementModel; - this.isInputElement = Object.prototype.hasOwnProperty.call(this.elementModel, 'required'); - if (this.isInputElement) { - const unitStateElementCode = this.unitStateElementCodes - .find((element: UnitStateElementCode): boolean => element.id === this.elementModel.id); - if (unitStateElementCode) { - elementComponent.elementModel.value = unitStateElementCode.value; - } + const unitStateElementCode = this.unitStateElementCodes + .find((elementCode: UnitStateElementCode): boolean => elementCode.id === this.elementModel.id); + if (unitStateElementCode) { + elementComponent.elementModel.value = unitStateElementCode.value; + } + this.unitStateService.registerElement(elementComponent.elementModel); + + if (Object.prototype.hasOwnProperty.call(this.elementModel, 'required')) { const elementForm = this.formBuilder.group({}); elementComponent.parentForm = elementForm; this.registerFormGroup(elementForm); @@ -66,7 +68,7 @@ export class ElementComponent implements OnInit { (this.elementModel.type === 'text-field' || this.elementModel.type === 'text-area')) { this.initEventsForKeyboard(elementComponent); } - } + } // no else } private registerFormGroup(elementForm: FormGroup): void { diff --git a/projects/player/src/app/components/page/page.component.ts b/projects/player/src/app/components/page/page.component.ts index cd05e1d0b1fc24278124656572c12f5272de352a..3d5f843ff23b4466a64a4a4a76524a8cab7d2e89 100644 --- a/projects/player/src/app/components/page/page.component.ts +++ b/projects/player/src/app/components/page/page.component.ts @@ -5,6 +5,7 @@ import { FormBuilder, FormGroup } from '@angular/forms'; import { UnitPage } from '../../../../../common/unit'; import { FormService } from '../../../../../common/form.service'; import { UnitStateElementCode } from '../../models/verona'; +import { UnitStateService } from '../../services/unit-state.service'; @Component({ selector: 'app-page', @@ -25,6 +26,7 @@ export class PageComponent implements OnInit { pageForm!: FormGroup; constructor(private formService: FormService, + private unitStateService: UnitStateService, private formBuilder: FormBuilder) {} ngOnInit(): void { @@ -42,7 +44,7 @@ export class PageComponent implements OnInit { onIntersection(detectionType: 'top' | 'bottom'): void { if (detectionType === 'bottom') { - this.formService.addPresentedPage(this.index); + this.unitStateService.addPresentedPage(this.index); } if (detectionType === 'top' || this.isLastPage) { this.selectedIndexChange.emit(this.index); diff --git a/projects/player/src/app/components/unit-state/unit-state.component.ts b/projects/player/src/app/components/unit-state/unit-state.component.ts index 1ffcb1c3a39dc5d8054c15a95b857fd89d2cbb06..934a482bfe93aa13d3f821aa864ad1ac0f7a05c5 100644 --- a/projects/player/src/app/components/unit-state/unit-state.component.ts +++ b/projects/player/src/app/components/unit-state/unit-state.component.ts @@ -19,7 +19,8 @@ import { import { PlayerConfig, Progress, UnitState, UnitStateElementCode, UnitStateElementCodeStatus, VopNavigationDeniedNotification } from '../../models/verona'; -import { UnitPage } from '../../../../../common/unit'; +import { UnitPage, UnitUIElement } from '../../../../../common/unit'; +import { UnitStateService } from '../../services/unit-state.service'; @Component({ selector: 'app-unit-state', @@ -37,6 +38,7 @@ export class UnitStateComponent implements OnInit, OnDestroy { constructor(private formBuilder: FormBuilder, private formService: FormService, + private unitStateService: UnitStateService, private veronaSubscriptionService: VeronaSubscriptionService, private veronaPostService: VeronaPostService, private messageService: MessageService, @@ -65,7 +67,10 @@ export class UnitStateComponent implements OnInit, OnDestroy { this.formService.elementValueChanged .pipe(takeUntil(this.ngUnsubscribe)) .subscribe((value: ValueChangeElement): void => this.onElementValueChanges(value)); - this.formService.presentedPageAdded + this.unitStateService.elementAdded + .pipe(takeUntil(this.ngUnsubscribe)) + .subscribe((element: UnitUIElement): void => this.addUnitStateElementCode(element)); + this.unitStateService.presentedPageAdded .pipe(takeUntil(this.ngUnsubscribe)) .subscribe((presentedPage: number): void => this.onPresentedPageAdded(presentedPage)); this.form.valueChanges @@ -93,7 +98,6 @@ export class UnitStateComponent implements OnInit, OnDestroy { private addControl = (control: FormControlElement): void => { control.formGroup.addControl(control.id, control.formControl); - this.registerUnitStateElementCode(control.id, control.formControl.value); }; private setValidators = (validators: FormControlValidators): void => { @@ -127,7 +131,7 @@ export class UnitStateComponent implements OnInit, OnDestroy { private onFormChanges(): void { // eslint-disable-next-line no-console - console.log('player: onFormChanges', this.form.value); + console.log('player: onFormChanges', this.unitStateElementCodes); this.sendVopStateChangedNotification(); } @@ -154,7 +158,7 @@ export class UnitStateComponent implements OnInit, OnDestroy { private setUnitStateElementCodeValue(id: string, value: string | number | boolean | undefined) { const unitStateElementCode = this.unitStateElementCodes - .find((element: UnitStateElementCode): boolean => element.id === id); + .find((elementCode: UnitStateElementCode): boolean => elementCode.id === id); if (unitStateElementCode) { unitStateElementCode.value = value; } @@ -162,17 +166,17 @@ export class UnitStateComponent implements OnInit, OnDestroy { private setUnitStateElementCodeStatus(id: string, status: UnitStateElementCodeStatus) { const unitStateElementCode = this.unitStateElementCodes - .find((element: UnitStateElementCode): boolean => element.id === id); + .find((elementCode: UnitStateElementCode): boolean => elementCode.id === id); if (unitStateElementCode) { unitStateElementCode.status = status; } } - private registerUnitStateElementCode(id: string, value: string | number | boolean | undefined) { + private addUnitStateElementCode(element: UnitUIElement) { const unitStateElementCode = this.unitStateElementCodes - .find((element: UnitStateElementCode): boolean => element.id === id); + .find((elementCode: UnitStateElementCode): boolean => elementCode.id === element.id); if (!unitStateElementCode) { - this.unitStateElementCodes.push({ id: id, value: value, status: 'NOT_REACHED' }); + this.unitStateElementCodes.push({ id: element.id, value: element.value, status: 'NOT_REACHED' }); } } diff --git a/projects/player/src/app/models/verona.ts b/projects/player/src/app/models/verona.ts index 251c44488cb0a07d7e4e3ffc6f5b13a0744a673f..fdd656a6ab93fe098faa03ac8c44ba2e3197e8c2 100644 --- a/projects/player/src/app/models/verona.ts +++ b/projects/player/src/app/models/verona.ts @@ -22,7 +22,7 @@ export interface PlayerConfig { export interface UnitStateElementCode { id: string; status: UnitStateElementCodeStatus; - value: string | number | boolean | undefined; + value: string | string[] | number | boolean | undefined; } export interface UnitState { diff --git a/projects/player/src/app/services/unit-state.service.ts b/projects/player/src/app/services/unit-state.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..2d9823f44508246f43b45cdb6e260bd078e6014e --- /dev/null +++ b/projects/player/src/app/services/unit-state.service.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { Observable, Subject } from 'rxjs'; +import { UnitUIElement } from '../../../../common/unit'; + +@Injectable({ + providedIn: 'root' +}) +export class UnitStateService { + private _elementAdded = new Subject<UnitUIElement>(); + private _presentedPageAdded = new Subject<number>(); + + get elementAdded(): Observable<UnitUIElement> { + return this._elementAdded.asObservable(); + } + + get presentedPageAdded(): Observable<number> { + return this._presentedPageAdded.asObservable(); + } + + registerElement(element: UnitUIElement): void { + this._elementAdded.next(element); + } + + addPresentedPage(presentedPage: number): void { + this._presentedPageAdded.next(presentedPage); + } +}