Created abstract methods to section model

This commit is contained in:
Giuseppe
2018-10-12 15:33:01 +02:00
parent df101c0413
commit 24450f63a9
5 changed files with 70 additions and 33 deletions

View File

@@ -1,6 +1,7 @@
import { ChangeDetectorRef, Component, Inject, OnDestroy, ViewChild } from '@angular/core'; import { ChangeDetectorRef, Component, Inject, OnDestroy, ViewChild } from '@angular/core';
import { DynamicFormControlEvent, DynamicFormControlModel } from '@ng-dynamic-forms/core'; import { DynamicFormControlEvent, DynamicFormControlModel } from '@ng-dynamic-forms/core';
import { Observable } from 'rxjs/Observable';
import { Subscription } from 'rxjs/Subscription'; import { Subscription } from 'rxjs/Subscription';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { isEqual } from 'lodash'; import { isEqual } from 'lodash';
@@ -10,7 +11,7 @@ import { FormComponent } from '../../../shared/form/form.component';
import { FormService } from '../../../shared/form/form.service'; import { FormService } from '../../../shared/form/form.service';
import { SectionModelComponent } from '../models/section.model'; import { SectionModelComponent } from '../models/section.model';
import { SubmissionFormsConfigService } from '../../../core/config/submission-forms-config.service'; import { SubmissionFormsConfigService } from '../../../core/config/submission-forms-config.service';
import { hasValue, isNotEmpty, isNotUndefined, isUndefined } from '../../../shared/empty.util'; import { hasValue, isNotEmpty, isUndefined } from '../../../shared/empty.util';
import { ConfigData } from '../../../core/config/config-data'; import { ConfigData } from '../../../core/config/config-data';
import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner'; import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner';
import { SubmissionFormsModel } from '../../../core/shared/config/config-submission-forms.model'; import { SubmissionFormsModel } from '../../../core/shared/config/config-submission-forms.model';
@@ -65,13 +66,14 @@ export class FormSectionComponent extends SectionModelComponent implements OnDes
super(injectedCollectionId, injectedSectionData, injectedSubmissionId); super(injectedCollectionId, injectedSectionData, injectedSubmissionId);
} }
ngOnInit() { onSectionInit() {
this.pathCombiner = new JsonPatchOperationPathCombiner('sections', this.sectionData.id); this.pathCombiner = new JsonPatchOperationPathCombiner('sections', this.sectionData.id);
this.formId = this.formService.getUniqueId(this.sectionData.id);
this.formConfigService.getConfigByHref(this.sectionData.config) this.formConfigService.getConfigByHref(this.sectionData.config)
.flatMap((config: ConfigData) => config.payload) .flatMap((config: ConfigData) => config.payload)
.subscribe((config: SubmissionFormsModel) => { .subscribe((config: SubmissionFormsModel) => {
this.formConfig = config; this.formConfig = config;
this.formId = this.formService.getUniqueId(this.sectionData.id);
this.sectionService.getSectionData(this.submissionId, this.sectionData.id) this.sectionService.getSectionData(this.submissionId, this.sectionData.id)
.take(1) .take(1)
.subscribe((sectionData: WorkspaceitemSectionDataType) => { .subscribe((sectionData: WorkspaceitemSectionDataType) => {
@@ -94,6 +96,10 @@ export class FormSectionComponent extends SectionModelComponent implements OnDes
.forEach((subscription) => subscription.unsubscribe()); .forEach((subscription) => subscription.unsubscribe());
} }
protected getSectionStatus(): Observable<boolean> {
return this.formService.isValid(this.formId);
}
hasMetadataEnrichment(sectionData): boolean { hasMetadataEnrichment(sectionData): boolean {
const diffResult = []; const diffResult = [];
@@ -167,16 +173,7 @@ export class FormSectionComponent extends SectionModelComponent implements OnDes
subscriptions() { subscriptions() {
this.subs.push( this.subs.push(
/**
* Subscribe to form status
*/
this.formService.isValid(this.formId)
.filter((formValid) => isNotUndefined(formValid))
.filter((formValid) => formValid !== this.valid)
.subscribe((formState) => {
this.valid = formState;
this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, this.valid);
}),
/** /**
* Subscribe to form's data * Subscribe to form's data
*/ */

View File

@@ -1,6 +1,7 @@
import { ChangeDetectorRef, Component, Inject, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core';
import { DynamicCheckboxModel, DynamicFormControlEvent, DynamicFormControlModel } from '@ng-dynamic-forms/core'; import { DynamicCheckboxModel, DynamicFormControlEvent, DynamicFormControlModel } from '@ng-dynamic-forms/core';
import { Observable } from 'rxjs/Observable';
import { Subscription } from 'rxjs/Subscription'; import { Subscription } from 'rxjs/Subscription';
import { SectionModelComponent } from '../models/section.model'; import { SectionModelComponent } from '../models/section.model';
@@ -21,6 +22,7 @@ import { WorkspaceitemSectionLicenseObject } from '../../../core/submission/mode
import { SubmissionService } from '../../submission.service'; import { SubmissionService } from '../../submission.service';
import { SectionsService } from '../sections.service'; import { SectionsService } from '../sections.service';
import { FormOperationsService } from '../form/form-operations.service'; import { FormOperationsService } from '../form/form-operations.service';
import { FormComponent } from '../../../shared/form/form.component';
@Component({ @Component({
selector: 'ds-submission-section-license', selector: 'ds-submission-section-license',
@@ -28,7 +30,7 @@ import { FormOperationsService } from '../form/form-operations.service';
templateUrl: './section-license.component.html', templateUrl: './section-license.component.html',
}) })
@renderSectionFor(SectionsType.License) @renderSectionFor(SectionsType.License)
export class LicenseSectionComponent extends SectionModelComponent implements OnDestroy, OnInit { export class LicenseSectionComponent extends SectionModelComponent implements OnDestroy {
public formId; public formId;
public formModel: DynamicFormControlModel[]; public formModel: DynamicFormControlModel[];
@@ -38,6 +40,8 @@ export class LicenseSectionComponent extends SectionModelComponent implements On
protected pathCombiner: JsonPatchOperationPathCombiner; protected pathCombiner: JsonPatchOperationPathCombiner;
protected subs: Subscription[] = []; protected subs: Subscription[] = [];
@ViewChild('formRef') private formRef: FormComponent;
constructor(protected changeDetectorRef: ChangeDetectorRef, constructor(protected changeDetectorRef: ChangeDetectorRef,
protected collectionDataService: CollectionDataService, protected collectionDataService: CollectionDataService,
protected formBuilderService: FormBuilderService, protected formBuilderService: FormBuilderService,
@@ -52,8 +56,11 @@ export class LicenseSectionComponent extends SectionModelComponent implements On
super(injectedCollectionId, injectedSectionData, injectedSubmissionId); super(injectedCollectionId, injectedSectionData, injectedSubmissionId);
} }
ngOnInit() { onSectionInit() {
this.pathCombiner = new JsonPatchOperationPathCombiner('sections', this.sectionData.id); this.pathCombiner = new JsonPatchOperationPathCombiner('sections', this.sectionData.id);
this.formId = this.formService.getUniqueId(this.sectionData.id);
this.formModel = this.formBuilderService.fromJSON(SECTION_LICENSE_FORM_MODEL);
const model = this.formBuilderService.findById('granted', this.formModel);
this.subs.push( this.subs.push(
this.collectionDataService.findById(this.collectionId) this.collectionDataService.findById(this.collectionId)
@@ -63,13 +70,13 @@ export class LicenseSectionComponent extends SectionModelComponent implements On
.take(1) .take(1)
.subscribe((licenseData: RemoteData<License>) => { .subscribe((licenseData: RemoteData<License>) => {
this.licenseText = licenseData.payload.text; this.licenseText = licenseData.payload.text;
this.formId = this.formService.getUniqueId(this.sectionData.id);
this.formModel = this.formBuilderService.fromJSON(SECTION_LICENSE_FORM_MODEL);
const model = this.formBuilderService.findById('granted', this.formModel);
// Retrieve license accepted status // Retrieve license accepted status
if ((this.sectionData.data as WorkspaceitemSectionLicenseObject).granted) { if ((this.sectionData.data as WorkspaceitemSectionLicenseObject).granted) {
(model as DynamicCheckboxModel).checked = true; (model as DynamicCheckboxModel).valueUpdates.next(true);
this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, true); // this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, true);
} else {
(model as DynamicCheckboxModel).valueUpdates.next(false);
} }
// Disable checkbox whether it's in workflow or item scope // Disable checkbox whether it's in workflow or item scope
@@ -91,7 +98,6 @@ export class LicenseSectionComponent extends SectionModelComponent implements On
// When the error path is only on the section, // When the error path is only on the section,
// replace it with the path to the form field to display error also on the form // replace it with the path to the form field to display error also on the form
if (error.path === '/sections/license') { if (error.path === '/sections/license') {
const model = this.formBuilderService.findById('granted', this.formModel);
// check whether license is not accepted // check whether license is not accepted
if (!(model as DynamicCheckboxModel).checked) { if (!(model as DynamicCheckboxModel).checked) {
return Object.assign({}, error, {path: '/sections/license/granted'}); return Object.assign({}, error, {path: '/sections/license/granted'});
@@ -115,10 +121,16 @@ export class LicenseSectionComponent extends SectionModelComponent implements On
); );
} }
protected getSectionStatus(): Observable<boolean> {
const model = this.formBuilderService.findById('granted', this.formModel);
return (model as DynamicCheckboxModel).valueUpdates
.map((value) => value === true);
}
onChange(event: DynamicFormControlEvent) { onChange(event: DynamicFormControlEvent) {
const path = this.formOperationsService.getFieldPathSegmentedFromChangeEvent(event); const path = this.formOperationsService.getFieldPathSegmentedFromChangeEvent(event);
const value = this.formOperationsService.getFieldValueFromChangeEvent(event); const value = this.formOperationsService.getFieldValueFromChangeEvent(event);
this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, value.value); // this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, value.value);
if (value) { if (value) {
this.operationsBuilder.add(this.pathCombiner.getPath(path), value.value.toString(), false, true); this.operationsBuilder.add(this.pathCombiner.getPath(path), value.value.toString(), false, true);
// Remove any section's errors // Remove any section's errors

View File

@@ -1,5 +1,8 @@
import { Inject } from '@angular/core'; import { Inject, OnInit } from '@angular/core';
import { SectionDataObject } from './section-data.model'; import { SectionDataObject } from './section-data.model';
import { Observable } from 'rxjs/Observable';
import { SectionsService } from '../sections.service';
import { isNotUndefined } from '../../../shared/empty.util';
export interface SectionDataModel { export interface SectionDataModel {
sectionData: SectionDataObject sectionData: SectionDataObject
@@ -8,7 +11,8 @@ export interface SectionDataModel {
/** /**
* An abstract model class for a submission edit form section. * An abstract model class for a submission edit form section.
*/ */
export abstract class SectionModelComponent implements SectionDataModel { export abstract class SectionModelComponent implements OnInit, SectionDataModel {
protected abstract sectionService: SectionsService;
collectionId: string; collectionId: string;
sectionData: SectionDataObject; sectionData: SectionDataObject;
submissionId: string; submissionId: string;
@@ -21,4 +25,21 @@ export abstract class SectionModelComponent implements SectionDataModel {
this.sectionData = injectedSectionData; this.sectionData = injectedSectionData;
this.submissionId = injectedSubmissionId; this.submissionId = injectedSubmissionId;
} }
ngOnInit(): void {
this.onSectionInit();
this.updateSectionStatus();
}
protected abstract getSectionStatus(): Observable<boolean>;
protected abstract onSectionInit(): void;
protected updateSectionStatus(): void {
this.getSectionStatus()
.filter((sectionStatus: boolean) => isNotUndefined(sectionStatus))
.startWith(true)
.subscribe((sectionStatus: boolean) => {
this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, sectionStatus);
});
}
} }

View File

@@ -5,10 +5,10 @@ import { renderSectionFor } from '../sections-decorator';
import { SectionDataObject } from '../models/section-data.model'; import { SectionDataObject } from '../models/section-data.model';
import { SubmissionState } from '../../submission.reducers'; import { SubmissionState } from '../../submission.reducers';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { WorkspaceitemSectionRecycleObject } from '../../../core/submission/models/workspaceitem-section-recycle.model';
import { submissionSectionDataFromIdSelector } from '../../selectors'; import { submissionSectionDataFromIdSelector } from '../../selectors';
import { isNotEmpty } from '../../../shared/empty.util'; import { isNotEmpty } from '../../../shared/empty.util';
import { Observable } from 'rxjs/Observable'; import { Observable } from 'rxjs/Observable';
import { SectionsService } from '../sections.service';
@Component({ @Component({
selector: 'ds-recycle-section', selector: 'ds-recycle-section',
@@ -26,13 +26,14 @@ export class RecycleSectionComponent extends SectionModelComponent {
public files: any[]; // WorkspaceitemSectionUploadFileObject[]; public files: any[]; // WorkspaceitemSectionUploadFileObject[];
constructor(protected store: Store<SubmissionState>, constructor(protected store: Store<SubmissionState>,
protected sectionService: SectionsService,
@Inject('collectionIdProvider') public injectedCollectionId: string, @Inject('collectionIdProvider') public injectedCollectionId: string,
@Inject('sectionDataProvider') public injectedSectionData: SectionDataObject, @Inject('sectionDataProvider') public injectedSectionData: SectionDataObject,
@Inject('submissionIdProvider') public injectedSubmissionId: string) { @Inject('submissionIdProvider') public injectedSubmissionId: string) {
super(injectedCollectionId, injectedSectionData, injectedSubmissionId); super(injectedCollectionId, injectedSectionData, injectedSubmissionId);
} }
ngOnInit() { onSectionInit() {
this.sectionDataObs = this.store.select(submissionSectionDataFromIdSelector(this.submissionId, this.sectionData.id)) this.sectionDataObs = this.store.select(submissionSectionDataFromIdSelector(this.submissionId, this.sectionData.id))
.filter((sd) => isNotEmpty(sd)) .filter((sd) => isNotEmpty(sd))
@@ -52,4 +53,8 @@ export class RecycleSectionComponent extends SectionModelComponent {
this.isLoading = false; this.isLoading = false;
} }
protected getSectionStatus(): Observable<boolean> {
return Observable.of(true);
}
} }

View File

@@ -1,4 +1,4 @@
import { ChangeDetectorRef, Component, Inject, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, Inject, OnDestroy, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable'; import { Observable } from 'rxjs/Observable';
@@ -29,7 +29,7 @@ export const POLICY_DEFAULT_WITH_LIST = 2; // Banner2
templateUrl: './section-upload.component.html', templateUrl: './section-upload.component.html',
}) })
@renderSectionFor(SectionsType.Upload) @renderSectionFor(SectionsType.Upload)
export class UploadSectionComponent extends SectionModelComponent implements OnInit { export class UploadSectionComponent extends SectionModelComponent implements OnDestroy {
public AlertTypeEnum = AlertType; public AlertTypeEnum = AlertType;
public fileIndexes = []; public fileIndexes = [];
@@ -74,7 +74,7 @@ export class UploadSectionComponent extends SectionModelComponent implements OnI
super(undefined, injectedSectionData, injectedSubmissionId); super(undefined, injectedSectionData, injectedSubmissionId);
} }
ngOnInit() { onSectionInit() {
const config$ = this.uploadsConfigService.getConfigByHref(this.sectionData.config) const config$ = this.uploadsConfigService.getConfigByHref(this.sectionData.config)
.flatMap((config) => config.payload); .flatMap((config) => config.payload);
@@ -162,7 +162,6 @@ export class UploadSectionComponent extends SectionModelComponent implements OnI
}) })
.distinctUntilChanged() .distinctUntilChanged()
.subscribe(([configMetadataForm, fileList]:[SubmissionFormsModel, any[]]) => { .subscribe(([configMetadataForm, fileList]:[SubmissionFormsModel, any[]]) => {
let sectionStatus = false;
this.fileList = []; this.fileList = [];
this.fileIndexes = []; this.fileIndexes = [];
this.fileNames = []; this.fileNames = [];
@@ -173,9 +172,7 @@ export class UploadSectionComponent extends SectionModelComponent implements OnI
this.fileIndexes.push(file.uuid); this.fileIndexes.push(file.uuid);
this.fileNames.push(this.getFileName(configMetadataForm, file)); this.fileNames.push(this.getFileName(configMetadataForm, file));
}); });
sectionStatus = true;
} }
this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, sectionStatus);
this.changeDetectorRef.detectChanges(); this.changeDetectorRef.detectChanges();
} }
) )
@@ -194,6 +191,11 @@ export class UploadSectionComponent extends SectionModelComponent implements OnI
return title; return title;
} }
protected getSectionStatus(): Observable<boolean> {
return this.bitstreamService.getUploadedFileList(this.submissionId, this.sectionData.id)
.map((fileList: any[]) => (isNotUndefined(fileList) && fileList.length > 0));
}
/** /**
* Method provided by Angular. Invoked when the instance is destroyed. * Method provided by Angular. Invoked when the instance is destroyed.
*/ */