mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-09 11:03:05 +00:00
Created abstract methods to section model
This commit is contained in:
@@ -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
|
||||||
*/
|
*/
|
||||||
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user