| /******************************************************************************** |
| * Copyright (c) 2020 Contributors to the Eclipse Foundation |
| * |
| * See the NOTICE file(s) distributed with this work for additional |
| * information regarding copyright ownership. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0 |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| ********************************************************************************/ |
| |
| import {Component, OnDestroy, OnInit} from "@angular/core"; |
| import {select, Store} from "@ngrx/store"; |
| import {Observable} from "rxjs"; |
| import {distinctUntilChanged, take, takeUntil} from "rxjs/operators"; |
| import {IAPISearchOptions} from "../../../../core/api"; |
| import { |
| createWorkflowForm, |
| departmentGroupsSelector, |
| departmentOptionsSelector, |
| getSearchContentStatementsSelector, |
| getStatementErrorSelector, |
| IStatementErrorEntity, |
| IWorkflowFormValue, |
| queryParamsIdSelector, |
| setErrorAction, |
| startStatementSearchAction, |
| statementLoadingSelector, |
| statementTypesSelector, |
| submitWorkflowDataFormAction, |
| taskSelector, |
| workflowFormValueSelector |
| } from "../../../../store"; |
| import {AbstractReactiveFormComponent} from "../../abstract"; |
| |
| @Component({ |
| selector: "app-workflow-data-form", |
| templateUrl: "./workflow-data-form.component.html", |
| styleUrls: ["./workflow-data-form.component.scss"] |
| }) |
| export class WorkflowDataFormComponent extends AbstractReactiveFormComponent<IWorkflowFormValue> implements OnInit, OnDestroy { |
| |
| public task$ = this.store.pipe(select(taskSelector)); |
| |
| public statementId$ = this.store.pipe(select(queryParamsIdSelector)); |
| |
| public statementTypes$ = this.store.pipe(select(statementTypesSelector)); |
| |
| public searchContent$ = this.store.pipe(select(getSearchContentStatementsSelector)); |
| |
| public departmentOptions$ = this.store.pipe(select(departmentOptionsSelector)); |
| |
| public departmentGroups$ = this.store.pipe(select(departmentGroupsSelector)); |
| |
| public isStatementLoading$ = this.store.pipe(select(statementLoadingSelector)); |
| |
| public appFormGroup = createWorkflowForm(); |
| |
| public appErrorMessage$: Observable<IStatementErrorEntity> = this.store.pipe(select(getStatementErrorSelector)); |
| |
| private form$ = this.store.pipe(select(workflowFormValueSelector)); |
| |
| public constructor(public store: Store) { |
| super(); |
| } |
| |
| public async ngOnInit() { |
| this.updateForm(); |
| this.task$.pipe(takeUntil(this.destroy$)).subscribe(() => this.search({q: ""})); |
| } |
| |
| public async ngOnDestroy() { |
| super.ngOnDestroy(); |
| return this.clearErrors(); |
| } |
| |
| public async submit(completeTask?: boolean) { |
| await this.clearErrors(); |
| const task = await this.task$.pipe(take(1)).toPromise(); |
| this.store.dispatch(submitWorkflowDataFormAction({ |
| statementId: task.statementId, |
| taskId: task.taskId, |
| data: this.getValue(), |
| completeTask |
| })); |
| } |
| |
| public search(options: IAPISearchOptions) { |
| this.store.dispatch(startStatementSearchAction({options})); |
| } |
| |
| private async clearErrors() { |
| const statementId = await this.statementId$.pipe(take(1)).toPromise(); |
| const loading = await this.isStatementLoading$.pipe(take(1)).toPromise(); |
| if (statementId != null && !loading) { |
| this.store.dispatch(setErrorAction({statementId, error: null})); |
| } |
| } |
| |
| private updateForm() { |
| this.isStatementLoading$.pipe(takeUntil(this.destroy$), distinctUntilChanged()) |
| .subscribe((loading) => loading ? this.appFormGroup.disable() : this.appFormGroup.enable()); |
| this.form$.pipe(takeUntil(this.destroy$)).subscribe((value) => this.patchValue(value)); |
| } |
| |
| |
| } |