diff --git a/src/app/core/cache/models/normalized-object-factory.ts b/src/app/core/cache/models/normalized-object-factory.ts index 095309f515..0722eea909 100644 --- a/src/app/core/cache/models/normalized-object-factory.ts +++ b/src/app/core/cache/models/normalized-object-factory.ts @@ -46,6 +46,9 @@ export class NormalizedObjectFactory { case ResourceType.Group: { return NormalizedGroupModel } + case ResourceType.Workflowitem: { + return NormalizedWorkflowItem + } default: { return undefined; } diff --git a/src/app/core/json-patch/builder/json-patch-operation-path-combiner.ts b/src/app/core/json-patch/builder/json-patch-operation-path-combiner.ts index c99cd94966..1650f57d63 100644 --- a/src/app/core/json-patch/builder/json-patch-operation-path-combiner.ts +++ b/src/app/core/json-patch/builder/json-patch-operation-path-combiner.ts @@ -18,8 +18,6 @@ export class JsonPatchOperationPathCombiner { constructor(rootElement, ...subRootElements: string[]) { this._rootElement = rootElement; this._subRootElement = subRootElements.join('/'); - console.log(subRootElements); - console.log(this._subRootElement); } get rootElement(): string { diff --git a/src/app/submission/form/collection/submission-form-collection.component.ts b/src/app/submission/form/collection/submission-form-collection.component.ts index efcebeebd8..03a8e38fd7 100644 --- a/src/app/submission/form/collection/submission-form-collection.component.ts +++ b/src/app/submission/form/collection/submission-form-collection.component.ts @@ -10,8 +10,6 @@ import { SimpleChanges } from '@angular/core'; import { FormControl } from '@angular/forms'; - -import { Store } from '@ngrx/store'; import { Subscription } from 'rxjs/Subscription'; import { isNullOrUndefined } from 'util'; @@ -27,8 +25,6 @@ import { PaginatedList } from '../../../core/data/paginated-list'; import { JsonPatchOperationsService } from '../../../core/json-patch/json-patch-operations.service'; import { SubmitDataResponseDefinitionObject } from '../../../core/shared/submit-data-response-definition.model'; import { SubmissionService } from '../../submission.service'; -import { SubmissionState } from '../../submission.reducers'; -import { ChangeSubmissionCollectionAction } from '../../objects/submission-objects.actions'; import { SubmissionObject } from '../../../core/submission/models/submission-object.model'; @Component({ @@ -66,7 +62,6 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit { private communityDataService: CommunityDataService, private operationsBuilder: JsonPatchOperationsBuilder, private operationsService: JsonPatchOperationsService, - private store: Store, private submissionService: SubmissionService) { } @@ -156,7 +151,7 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit { this.selectedCollectionId = event.collection.id; this.selectedCollectionName = event.collection.name; this.collectionChange.emit(submissionObject[0]); - this.store.dispatch(new ChangeSubmissionCollectionAction(this.submissionId, event.collection.id)); + this.submissionService.changeSubmissionCollection(this.submissionId, event.collection.id); this.disabled = false; this.cdr.detectChanges(); }) diff --git a/src/app/submission/form/footer/submission-form-footer.component.ts b/src/app/submission/form/footer/submission-form-footer.component.ts index d422b87a62..a968de4ef5 100644 --- a/src/app/submission/form/footer/submission-form-footer.component.ts +++ b/src/app/submission/form/footer/submission-form-footer.component.ts @@ -1,15 +1,7 @@ import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; -import { Store } from '@ngrx/store'; import { SubmissionRestService } from '../../submission-rest.service'; import { SubmissionService } from '../../submission.service'; -import { SubmissionState } from '../../submission.reducers'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { - DepositSubmissionAction, DiscardSubmissionAction, - SaveAndDepositSubmissionAction, - SaveForLaterSubmissionFormAction, - SaveSubmissionFormAction -} from '../../objects/submission-objects.actions'; import { Observable } from 'rxjs/Observable'; import { SubmissionScopeType } from '../../../core/submission/submission-scope-type'; @@ -29,8 +21,7 @@ export class SubmissionFormFooterComponent implements OnChanges { constructor(private modalService: NgbModal, private restService: SubmissionRestService, - private submissionService: SubmissionService, - private store: Store) { + private submissionService: SubmissionService) { } ngOnChanges(changes: SimpleChanges) { @@ -47,22 +38,22 @@ export class SubmissionFormFooterComponent implements OnChanges { } save(event) { - this.store.dispatch(new SaveSubmissionFormAction(this.submissionId)); + this.submissionService.dispatchSave(this.submissionId); } saveLater(event) { - this.store.dispatch(new SaveForLaterSubmissionFormAction(this.submissionId)); + this.submissionService.dispatchSaveForLater(this.submissionId); } public deposit(event) { - this.store.dispatch(new SaveAndDepositSubmissionAction(this.submissionId)); + this.submissionService.dispatchDeposit(this.submissionId); } public confirmDiscard(content) { this.modalService.open(content).result.then( (result) => { if (result === 'ok') { - this.store.dispatch(new DiscardSubmissionAction(this.submissionId)); + this.submissionService.dispatchDiscard(this.submissionId) } } ); diff --git a/src/app/submission/form/submission-form.component.ts b/src/app/submission/form/submission-form.component.ts index 0ea4afd1a4..1e3f7aab40 100644 --- a/src/app/submission/form/submission-form.component.ts +++ b/src/app/submission/form/submission-form.component.ts @@ -1,16 +1,8 @@ import { ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, SimpleChanges } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { - CancelSubmissionFormAction, - InitSubmissionFormAction, - ResetSubmissionFormAction -} from '../objects/submission-objects.actions'; -import { hasValue, isNotEmpty, isNotUndefined } from '../../shared/empty.util'; -import { submissionObjectFromIdSelector } from '../selectors'; +import { hasValue, isNotEmpty } from '../../shared/empty.util'; import { SubmissionObjectEntry } from '../objects/submission-objects.reducer'; import { WorkspaceitemSectionsObject } from '../../core/submission/models/workspaceitem-sections.model'; import { SubmissionDefinitionsModel } from '../../core/shared/config/config-submission-definitions.model'; -import { SubmissionState } from '../submission.reducers'; import { Workspaceitem } from '../../core/submission/models/workspaceitem.model'; import { SubmissionService } from '../submission.service'; import { Subscription } from 'rxjs/Subscription'; @@ -50,7 +42,6 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy { private authService: AuthService, private changeDetectorRef: ChangeDetectorRef, private halService: HALEndpointService, - private store: Store, private submissionService: SubmissionService) { this.isActive = true; } @@ -58,8 +49,8 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy { ngOnChanges(changes: SimpleChanges) { if (this.collectionId && this.submissionId) { this.isActive = true; - this.submissionSections = this.store.select(submissionObjectFromIdSelector(this.submissionId)) - .filter((submission: SubmissionObjectEntry) => isNotUndefined(submission) && this.isActive) + this.submissionSections = this.submissionService.getSubmissionObject(this.submissionId) + .filter(() => this.isActive) .map((submission: SubmissionObjectEntry) => submission.isLoading) .map((isLoading: boolean) => isLoading) .distinctUntilChanged() @@ -71,8 +62,8 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy { } }); - this.loading = this.store.select(submissionObjectFromIdSelector(this.submissionId)) - .filter((submission: SubmissionObjectEntry) => isNotUndefined(submission) && this.isActive) + this.loading = this.submissionService.getSubmissionObject(this.submissionId) + .filter(() => this.isActive) .map((submission: SubmissionObjectEntry) => submission.isLoading) .map((isLoading: boolean) => isLoading) .distinctUntilChanged(); @@ -85,18 +76,15 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy { this.uploadFilesOptions.authToken = this.authService.buildAuthHeader(); this.uploadFilesOptions.url = endpointURL.concat(`/${this.submissionId}`); this.definitionId = this.submissionDefinition.name; - this.store.dispatch(new InitSubmissionFormAction(this.collectionId, this.submissionId, this.selfUrl, this.submissionDefinition, this.sections, null)); + this.submissionService.dispatchInit( + this.collectionId, + this.submissionId, + this.selfUrl, + this.submissionDefinition, + this.sections, + null); this.changeDetectorRef.detectChanges(); - }), - - // this.store.select(submissionObjectFromIdSelector(this.submissionId)) - // .filter((submission: SubmissionObjectEntry) => isNotUndefined(submission) && this.isActive) - // .subscribe((submission: SubmissionObjectEntry) => { - // if (this.loading !== submission.isLoading) { - // this.loading = submission.isLoading; - // this.changeDetectorRef.detectChanges(); - // } - // }) + }) ); this.submissionService.startAutoSave(this.submissionId); } @@ -105,7 +93,7 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy { ngOnDestroy() { this.isActive = false; this.submissionService.stopAutoSave(); - this.store.dispatch(new CancelSubmissionFormAction()); + this.submissionService.resetAllSubmissionObjects(); this.subs .filter((subscription) => hasValue(subscription)) .forEach((subscription) => subscription.unsubscribe()); @@ -117,8 +105,12 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy { this.sections = workspaceItemObject.sections; this.submissionDefinition = workspaceItemObject.submissionDefinition[0]; this.definitionId = this.submissionDefinition.name; - this.store.dispatch(new ResetSubmissionFormAction(this.collectionId, this.submissionId, workspaceItemObject.self, this.sections, this.submissionDefinition)); - // this.submissionSections = this.getSectionsList(); + this.submissionService.resetSubmissionObject( + this.collectionId, + this.submissionId, + workspaceItemObject.self, + this.submissionDefinition, + this.sections); } else { this.changeDetectorRef.detectChanges(); } diff --git a/src/app/submission/objects/submission-objects.effects.ts b/src/app/submission/objects/submission-objects.effects.ts index 7da7c52c8f..edfeb514bd 100644 --- a/src/app/submission/objects/submission-objects.effects.ts +++ b/src/app/submission/objects/submission-objects.effects.ts @@ -124,9 +124,7 @@ export class SubmissionObjectEffects { .map(([action, currentState]: [SaveSubmissionFormSuccessAction | SaveSubmissionSectionFormSuccessAction, any]) => { return this.parseSaveResponse((currentState.submission as SubmissionState).objects[action.payload.submissionId], action.payload.submissionObject, action.payload.submissionId); }) - .mergeMap((actions) => { - return Observable.from(actions); - }); + .mergeMap((actions) => Observable.from(actions)); @Effect() saveSection$ = this.actions$ .ofType(SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM) diff --git a/src/app/submission/sections/container/section-container.component.ts b/src/app/submission/sections/container/section-container.component.ts index e97d348781..51daa63035 100644 --- a/src/app/submission/sections/container/section-container.component.ts +++ b/src/app/submission/sections/container/section-container.component.ts @@ -1,10 +1,7 @@ import { Component, Injector, Input, OnInit, ViewChild } from '@angular/core'; -import { Store } from '@ngrx/store'; - import { SectionsDirective } from '../sections.directive'; import { SectionDataObject } from '../models/section-data.model'; -import { SubmissionState } from '../../submission.reducers'; import { rendersSectionType } from '../sections-decorator'; import { SectionsType } from '../sections-type'; import { AlertType } from '../../../shared/alerts/aletrs-type'; @@ -26,7 +23,7 @@ export class SectionContainerComponent implements OnInit { @ViewChild('sectionRef') sectionRef: SectionsDirective; - constructor(private injector: Injector, private store: Store) { + constructor(private injector: Injector) { } ngOnInit() { diff --git a/src/app/submission/sections/form/section-form.component.ts b/src/app/submission/sections/form/section-form.component.ts index d870a5b22e..38e59244ea 100644 --- a/src/app/submission/sections/form/section-form.component.ts +++ b/src/app/submission/sections/form/section-form.component.ts @@ -1,25 +1,22 @@ import { ChangeDetectorRef, Component, Inject, OnDestroy, ViewChild } from '@angular/core'; -import { Store } from '@ngrx/store'; import { DynamicFormControlEvent, DynamicFormControlModel } from '@ng-dynamic-forms/core'; +import { Subscription } from 'rxjs/Subscription'; +import { TranslateService } from '@ngx-translate/core'; import { isEqual } from 'lodash'; import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; import { FormComponent } from '../../../shared/form/form.component'; import { FormService } from '../../../shared/form/form.service'; -import { SaveSubmissionFormAction, SectionStatusChangeAction, } from '../../objects/submission-objects.actions'; import { SectionModelComponent } from '../models/section.model'; -import { SubmissionState } from '../../submission.reducers'; import { SubmissionFormsConfigService } from '../../../core/config/submission-forms-config.service'; import { hasValue, isNotEmpty, isNotUndefined, isUndefined } from '../../../shared/empty.util'; import { ConfigData } from '../../../core/config/config-data'; import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner'; -import { submissionSectionDataFromIdSelector, submissionSectionFromIdSelector } from '../../selectors'; import { SubmissionFormsModel } from '../../../core/shared/config/config-submission-forms.model'; import { SubmissionSectionError, SubmissionSectionObject } from '../../objects/submission-objects.reducer'; import { FormFieldPreviousValueObject } from '../../../shared/form/builder/models/form-field-previous-value-object'; import { WorkspaceitemSectionDataType } from '../../../core/submission/models/workspaceitem-sections.model'; -import { Subscription } from 'rxjs/Subscription'; import { GLOBAL_CONFIG } from '../../../../config'; import { GlobalConfig } from '../../../../config/global-config.interface'; import { SectionDataObject } from '../models/section-data.model'; @@ -28,7 +25,6 @@ import { SectionsType } from '../sections-type'; import { SubmissionService } from '../../submission.service'; import { FormOperationsService } from './form-operations.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { TranslateService } from '@ngx-translate/core'; import { SectionsService } from '../sections.service'; import { difference } from '../../../shared/object.util'; @@ -59,7 +55,6 @@ export class FormSectionComponent extends SectionModelComponent implements OnDes protected formService: FormService, protected formConfigService: SubmissionFormsConfigService, protected notificationsService: NotificationsService, - protected store: Store, protected sectionService: SectionsService, protected submissionService: SubmissionService, protected translate: TranslateService, @@ -77,7 +72,7 @@ export class FormSectionComponent extends SectionModelComponent implements OnDes .subscribe((config: SubmissionFormsModel) => { this.formConfig = config; this.formId = this.formService.getUniqueId(this.sectionData.id); - this.store.select(submissionSectionDataFromIdSelector(this.submissionId, this.sectionData.id)) + this.sectionService.getSectionData(this.submissionId, this.sectionData.id) .take(1) .subscribe((sectionData: WorkspaceitemSectionDataType) => { if (isUndefined(this.formModel)) { @@ -180,7 +175,7 @@ export class FormSectionComponent extends SectionModelComponent implements OnDes .filter((formValid) => formValid !== this.valid) .subscribe((formState) => { this.valid = formState; - this.store.dispatch(new SectionStatusChangeAction(this.submissionId, this.sectionData.id, this.valid)); + this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, this.valid); }), /** * Subscribe to form's data @@ -193,7 +188,7 @@ export class FormSectionComponent extends SectionModelComponent implements OnDes /** * Subscribe to section state */ - this.store.select(submissionSectionFromIdSelector(this.submissionId, this.sectionData.id)) + this.sectionService.getSectionState(this.submissionId, this.sectionData.id) .filter((sectionState: SubmissionSectionObject) => { return isNotEmpty(sectionState) && (isNotEmpty(sectionState.data) || isNotEmpty(sectionState.errors)) }) @@ -214,7 +209,7 @@ export class FormSectionComponent extends SectionModelComponent implements OnDes const value = this.formOperationsService.getFieldValueFromChangeEvent(event); if (this.EnvConfig.submission.autosave.metadata.indexOf(metadata) !== -1 && isNotEmpty(value)) { - this.store.dispatch(new SaveSubmissionFormAction(this.submissionId)); + this.submissionService.dispatchSave(this.submissionId); } } diff --git a/src/app/submission/sections/license/section-license.component.ts b/src/app/submission/sections/license/section-license.component.ts index 65cb99faf6..52f77c1f16 100644 --- a/src/app/submission/sections/license/section-license.component.ts +++ b/src/app/submission/sections/license/section-license.component.ts @@ -1,19 +1,18 @@ import { ChangeDetectorRef, Component, Inject, OnDestroy, OnInit } from '@angular/core'; + +import { DynamicCheckboxModel, DynamicFormControlEvent, DynamicFormControlModel } from '@ng-dynamic-forms/core'; +import { Subscription } from 'rxjs/Subscription'; + import { SectionModelComponent } from '../models/section.model'; -import { Store } from '@ngrx/store'; import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; import { CollectionDataService } from '../../../core/data/collection-data.service'; -import { Subscription } from 'rxjs/Subscription'; import { hasValue, isNotEmpty, isNotNull, isNotUndefined } from '../../../shared/empty.util'; import { License } from '../../../core/shared/license.model'; import { RemoteData } from '../../../core/data/remote-data'; import { Collection } from '../../../core/shared/collection.model'; -import { DynamicCheckboxModel, DynamicFormControlEvent, DynamicFormControlModel } from '@ng-dynamic-forms/core'; import { SECTION_LICENSE_FORM_MODEL } from './section-license.model'; import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; -import { RemoveSectionErrorsAction, SectionStatusChangeAction } from '../../objects/submission-objects.actions'; import { FormService } from '../../../shared/form/form.service'; -import { SubmissionState } from '../../submission.reducers'; import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner'; import { SectionsType } from '../sections-type'; import { renderSectionFor } from '../sections-decorator'; @@ -22,7 +21,6 @@ import { WorkspaceitemSectionLicenseObject } from '../../../core/submission/mode import { SubmissionService } from '../../submission.service'; import { SectionsService } from '../sections.service'; import { FormOperationsService } from '../form/form-operations.service'; -import { submissionSectionErrorsFromIdSelector } from '../../selectors'; @Component({ selector: 'ds-submission-section-license', @@ -46,7 +44,6 @@ export class LicenseSectionComponent extends SectionModelComponent implements On protected formOperationsService: FormOperationsService, protected formService: FormService, protected operationsBuilder: JsonPatchOperationsBuilder, - protected store: Store, protected sectionService: SectionsService, protected submissionService: SubmissionService, @Inject('collectionIdProvider') public injectedCollectionId: string, @@ -72,7 +69,7 @@ export class LicenseSectionComponent extends SectionModelComponent implements On // Retrieve license accepted status if ((this.sectionData.data as WorkspaceitemSectionLicenseObject).granted) { (model as DynamicCheckboxModel).checked = true; - this.store.dispatch(new SectionStatusChangeAction(this.submissionId, this.sectionData.id, true)); + this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, true); } // Disable checkbox whether it's in workflow or item scope @@ -84,7 +81,8 @@ export class LicenseSectionComponent extends SectionModelComponent implements On }); this.changeDetectorRef.detectChanges(); }), - this.store.select(submissionSectionErrorsFromIdSelector(this.submissionId, this.sectionData.id)) + + this.sectionService.getSectionErrors(this.submissionId, this.sectionData.id) .filter((errors) => isNotEmpty(errors)) .distinctUntilChanged() .subscribe((errors) => { @@ -110,7 +108,7 @@ export class LicenseSectionComponent extends SectionModelComponent implements On this.sectionData.errors = errors; } else { // Remove any section's errors - this.store.dispatch(new RemoveSectionErrorsAction(this.submissionId, this.sectionData.id)); + this.sectionService.dispatchRemoveSectionErrors(this.submissionId, this.sectionData.id); } this.changeDetectorRef.detectChanges(); }) @@ -120,11 +118,11 @@ export class LicenseSectionComponent extends SectionModelComponent implements On onChange(event: DynamicFormControlEvent) { const path = this.formOperationsService.getFieldPathSegmentedFromChangeEvent(event); const value = this.formOperationsService.getFieldValueFromChangeEvent(event); - this.store.dispatch(new SectionStatusChangeAction(this.submissionId, this.sectionData.id, value.value)); + this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, value.value); if (value) { this.operationsBuilder.add(this.pathCombiner.getPath(path), value.value.toString(), false, true); // Remove any section's errors - this.store.dispatch(new RemoveSectionErrorsAction(this.submissionId, this.sectionData.id)); + this.sectionService.dispatchRemoveSectionErrors(this.submissionId, this.sectionData.id); } else { this.operationsBuilder.remove(this.pathCombiner.getPath(path)); } diff --git a/src/app/submission/sections/sections.directive.ts b/src/app/submission/sections/sections.directive.ts index 0e9f1bb283..ee142f97ad 100644 --- a/src/app/submission/sections/sections.directive.ts +++ b/src/app/submission/sections/sections.directive.ts @@ -1,21 +1,13 @@ import { ChangeDetectorRef, Directive, Input, OnDestroy, OnInit } from '@angular/core'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs/Observable'; import { Subscription } from 'rxjs/Subscription'; import { uniq } from 'lodash'; import { SectionsService } from './sections.service'; -import { hasValue, isNotEmpty, isNotNull, isNotUndefined } from '../../shared/empty.util'; -import { submissionSectionFromIdSelector } from '../selectors'; -import { SubmissionState } from '../submission.reducers'; +import { hasValue, isNotEmpty, isNotNull } from '../../shared/empty.util'; import { SubmissionSectionError, SubmissionSectionObject } from '../objects/submission-objects.reducer'; import parseSectionErrorPaths, { SectionErrorPath } from '../utils/parseSectionErrorPaths'; -import { - RemoveSectionErrorsAction, - SaveSubmissionSectionFormAction, - SetActiveSectionAction -} from '../objects/submission-objects.actions'; import { SubmissionService } from '../submission.service'; @Directive({ @@ -35,7 +27,6 @@ export class SectionsDirective implements OnDestroy, OnInit { private valid: Observable; constructor(private changeDetectorRef: ChangeDetectorRef, - private store: Store, private submissionService: SubmissionService, private sectionService: SectionsService) { } @@ -50,10 +41,8 @@ export class SectionsDirective implements OnDestroy, OnInit { }); this.subs.push( - this.store.select(submissionSectionFromIdSelector(this.submissionId, this.sectionId)) - .filter((state: SubmissionSectionObject) => isNotUndefined(state)) + this.sectionService.getSectionState(this.submissionId, this.sectionId) .map((state: SubmissionSectionObject) => state.errors) - // .filter((errors: SubmissionSectionError[]) => isNotEmpty(errors)) .subscribe((errors: SubmissionSectionError[]) => { if (isNotEmpty(errors)) { errors.forEach((errorItem: SubmissionSectionError) => { @@ -77,7 +66,7 @@ export class SectionsDirective implements OnDestroy, OnInit { this.changeDetectorRef.detectChanges(); // If section is no longer active dispatch save action if (!this.active && isNotNull(activeSectionId)) { - this.store.dispatch(new SaveSubmissionSectionFormAction(this.submissionId, this.sectionId)); + this.submissionService.dispatchSaveSection(this.submissionId, this.sectionId); } } }) @@ -144,7 +133,7 @@ export class SectionsDirective implements OnDestroy, OnInit { public resetErrors() { if (isNotEmpty(this.sectionErrors)) { - this.store.dispatch(new RemoveSectionErrorsAction(this.submissionId, this.sectionId)); + this.sectionService.dispatchRemoveSectionErrors(this.submissionId, this.sectionId); } this.sectionErrors = []; diff --git a/src/app/submission/sections/sections.service.ts b/src/app/submission/sections/sections.service.ts index f6a4533526..0edc968f82 100644 --- a/src/app/submission/sections/sections.service.ts +++ b/src/app/submission/sections/sections.service.ts @@ -2,14 +2,18 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import { Store } from '@ngrx/store'; -import { SubmissionState } from '../submission.reducers'; +import { TranslateService } from '@ngx-translate/core'; +import { ScrollToConfigOptions, ScrollToService } from '@nicky-lenaers/ngx-scroll-to'; import { isEqual } from 'lodash'; +import { SubmissionState } from '../submission.reducers'; import { hasValue, isEmpty, isNotEmpty, isNotUndefined } from '../../shared/empty.util'; import { DisableSectionAction, EnableSectionAction, - InertSectionErrorsAction, RemoveSectionErrorsAction, SectionStatusChangeAction, + InertSectionErrorsAction, + RemoveSectionErrorsAction, + SectionStatusChangeAction, UpdateSectionDataAction } from '../objects/submission-objects.actions'; import { @@ -17,14 +21,18 @@ import { SubmissionSectionError, SubmissionSectionObject } from '../objects/submission-objects.reducer'; -import { submissionObjectFromIdSelector, submissionSectionFromIdSelector } from '../selectors'; -import { ScrollToConfigOptions, ScrollToService } from '@nicky-lenaers/ngx-scroll-to'; +import { + submissionObjectFromIdSelector, + submissionSectionDataFromIdSelector, + submissionSectionErrorsFromIdSelector, + submissionSectionFromIdSelector +} from '../selectors'; import { SubmissionScopeType } from '../../core/submission/submission-scope-type'; import parseSectionErrorPaths, { SectionErrorPath } from '../utils/parseSectionErrorPaths'; import { FormAddError, FormClearErrorsAction, FormRemoveErrorAction } from '../../shared/form/form.actions'; -import { TranslateService } from '@ngx-translate/core'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { SubmissionService } from '../submission.service'; +import { WorkspaceitemSectionDataType } from '../../core/submission/models/workspaceitem-sections.model'; @Injectable() export class SectionsService { @@ -36,7 +44,12 @@ export class SectionsService { private translate: TranslateService) { } - public checkSectionErrors(submissionId, sectionId, formId, currentErrors, prevErrors = []) { + public checkSectionErrors( + submissionId: string, + sectionId: string, + formId: string, + currentErrors: SubmissionSectionError[], + prevErrors: SubmissionSectionError[] = []) { if (isEmpty(currentErrors)) { this.store.dispatch(new RemoveSectionErrorsAction(submissionId, sectionId)); this.store.dispatch(new FormClearErrorsAction(formId)); @@ -74,27 +87,41 @@ export class SectionsService { } } - public getSectionState(submissionId, sectionId): Observable { + public dispatchRemoveSectionErrors(submissionId, sectionId) { + this.store.dispatch(new RemoveSectionErrorsAction(submissionId, sectionId)); + } + + public getSectionData(submissionId: string, sectionId: string): Observable { + return this.store.select(submissionSectionDataFromIdSelector(submissionId, sectionId)) + .distinctUntilChanged(); + } + + public getSectionErrors(submissionId: string, sectionId: string): Observable { + return this.store.select(submissionSectionErrorsFromIdSelector(submissionId, sectionId)) + .distinctUntilChanged(); + } + + public getSectionState(submissionId: string, sectionId: string): Observable { return this.store.select(submissionSectionFromIdSelector(submissionId, sectionId)) - .filter((sectionObj) => hasValue(sectionObj)) + .filter((sectionObj: SubmissionSectionObject) => hasValue(sectionObj)) .map((sectionObj: SubmissionSectionObject) => sectionObj) .distinctUntilChanged(); } - public isSectionValid(submissionId, sectionId): Observable { + public isSectionValid(submissionId: string, sectionId: string): Observable { return this.store.select(submissionSectionFromIdSelector(submissionId, sectionId)) .filter((sectionObj) => hasValue(sectionObj)) .map((sectionObj: SubmissionSectionObject) => sectionObj.isValid) .distinctUntilChanged(); } - public isSectionActive(submissionId, sectionId): Observable { + public isSectionActive(submissionId: string, sectionId: string): Observable { return this.submissionService.getActiveSectionId(submissionId) .map((activeSectionId: string) => sectionId === activeSectionId) .distinctUntilChanged(); } - public isSectionEnabled(submissionId, sectionId): Observable { + public isSectionEnabled(submissionId: string, sectionId: string): Observable { return this.store.select(submissionSectionFromIdSelector(submissionId, sectionId)) .filter((sectionObj) => hasValue(sectionObj)) .map((sectionObj: SubmissionSectionObject) => sectionObj.enabled) @@ -110,7 +137,7 @@ export class SectionsService { .distinctUntilChanged(); } - public isSectionAvailable(submissionId, sectionId): Observable { + public isSectionAvailable(submissionId: string, sectionId: string): Observable { return this.store.select(submissionObjectFromIdSelector(submissionId)) .filter((submissionState: SubmissionObjectEntry) => isNotUndefined(submissionState)) .map((submissionState: SubmissionObjectEntry) => { @@ -130,11 +157,11 @@ export class SectionsService { this.scrollToService.scrollTo(config); } - public removeSection(submissionId, sectionId) { + public removeSection(submissionId: string, sectionId: string) { this.store.dispatch(new DisableSectionAction(submissionId, sectionId)) } - public updateSectionData(submissionId, sectionId, data, errors = []) { + public updateSectionData(submissionId: string, sectionId: string, data, errors = []) { if (isNotEmpty(data)) { const isAvailable$ = this.isSectionAvailable(submissionId, sectionId); const isEnabled$ = this.isSectionEnabled(submissionId, sectionId); diff --git a/src/app/submission/sections/upload/section-upload.component.ts b/src/app/submission/sections/upload/section-upload.component.ts index 5aea04e358..9a837789cf 100644 --- a/src/app/submission/sections/upload/section-upload.component.ts +++ b/src/app/submission/sections/upload/section-upload.component.ts @@ -1,24 +1,24 @@ import { ChangeDetectorRef, Component, Inject, OnInit } from '@angular/core'; -import { Store } from '@ngrx/store'; + +import { Observable } from 'rxjs/Observable'; + import { SectionModelComponent } from '../models/section.model'; import { hasValue, isNotEmpty, isNotUndefined, isUndefined } from '../../../shared/empty.util'; import { SectionUploadService } from './section-upload.service'; -import { SectionStatusChangeAction } from '../../objects/submission-objects.actions'; -import { SubmissionState } from '../../submission.reducers'; import { CollectionDataService } from '../../../core/data/collection-data.service'; import { GroupEpersonService } from '../../../core/eperson/group-eperson.service'; import { SubmissionUploadsConfigService } from '../../../core/config/submission-uploads-config.service'; import { SubmissionUploadsModel } from '../../../core/shared/config/config-submission-uploads.model'; -import { Observable } from 'rxjs/Observable'; import { SubmissionFormsModel } from '../../../core/shared/config/config-submission-forms.model'; import { SectionsType } from '../sections-type'; import { renderSectionFor } from '../sections-decorator'; import { SectionDataObject } from '../models/section-data.model'; -import { submissionObjectFromIdSelector } from '../../selectors'; import { SubmissionObjectEntry } from '../../objects/submission-objects.reducer'; import { AlertType } from '../../../shared/alerts/aletrs-type'; import { RemoteData } from '../../../core/data/remote-data'; import { Group } from '../../../core/eperson/models/group.model'; +import { SectionsService } from '../sections.service'; +import { SubmissionService } from '../../submission.service'; export const POLICY_DEFAULT_NO_LIST = 1; // Banner1 export const POLICY_DEFAULT_WITH_LIST = 2; // Banner2 @@ -66,7 +66,8 @@ export class UploadSectionComponent extends SectionModelComponent implements OnI private changeDetectorRef: ChangeDetectorRef, private collectionDataService: CollectionDataService, private groupService: GroupEpersonService, - private store: Store, + protected sectionService: SectionsService, + private submissionService: SubmissionService, private uploadsConfigService: SubmissionUploadsConfigService, @Inject('sectionDataProvider') public injectedSectionData: SectionDataObject, @Inject('submissionIdProvider') public injectedSubmissionId: string) { @@ -82,7 +83,7 @@ export class UploadSectionComponent extends SectionModelComponent implements OnI .map((config: SubmissionUploadsModel) => config.metadata[0]); this.subs.push( - this.store.select(submissionObjectFromIdSelector(this.submissionId)) + this.submissionService.getSubmissionObject(this.submissionId) .filter((submissionObject: SubmissionObjectEntry) => isNotUndefined(submissionObject) && !submissionObject.isLoading) .filter((submissionObject: SubmissionObjectEntry) => isUndefined(this.collectionId) || this.collectionId !== submissionObject.collection) .subscribe((submissionObject: SubmissionObjectEntry) => { @@ -174,9 +175,7 @@ export class UploadSectionComponent extends SectionModelComponent implements OnI }); sectionStatus = true; } - this.store.dispatch(new SectionStatusChangeAction(this.submissionId, - this.sectionData.id, - sectionStatus)); + this.sectionService.setSectionStatus(this.submissionId, this.sectionData.id, sectionStatus); this.changeDetectorRef.detectChanges(); } ) diff --git a/src/app/submission/submission.service.ts b/src/app/submission/submission.service.ts index 85174532a4..c66362ec09 100644 --- a/src/app/submission/submission.service.ts +++ b/src/app/submission/submission.service.ts @@ -7,10 +7,18 @@ import { Store } from '@ngrx/store'; import { submissionSelector, SubmissionState } from './submission.reducers'; import { hasValue, isEmpty, isNotUndefined } from '../shared/empty.util'; -import { SaveSubmissionFormAction, SetActiveSectionAction } from './objects/submission-objects.actions'; +import { + CancelSubmissionFormAction, + ChangeSubmissionCollectionAction, + DiscardSubmissionAction, InitSubmissionFormAction, ResetSubmissionFormAction, + SaveAndDepositSubmissionAction, + SaveForLaterSubmissionFormAction, + SaveSubmissionFormAction, + SetActiveSectionAction +} from './objects/submission-objects.actions'; import { SubmissionObjectEntry, - SubmissionSectionEntry, + SubmissionSectionEntry, SubmissionSectionError, SubmissionSectionObject } from './objects/submission-objects.reducer'; import { submissionObjectFromIdSelector } from './selectors'; @@ -26,8 +34,9 @@ import { RouteService } from '../shared/services/route.service'; import { SectionsType } from './sections/sections-type'; import { TranslateService } from '@ngx-translate/core'; import { NotificationsService } from '../shared/notifications/notifications.service'; -import { ScrollToConfigOptions, ScrollToService } from '@nicky-lenaers/ngx-scroll-to'; -import { NotificationOptions } from '../shared/notifications/models/notification-options.model'; +import { ScrollToService } from '@nicky-lenaers/ngx-scroll-to'; +import { SubmissionDefinitionsModel } from '../core/shared/config/config-submission-definitions.model'; +import { WorkspaceitemSectionsObject } from '../core/submission/models/workspaceitem-sections.model'; @Injectable() export class SubmissionService { @@ -45,6 +54,10 @@ export class SubmissionService { protected translate: TranslateService) { } + changeSubmissionCollection(submissionId, collectionId) { + this.store.dispatch(new ChangeSubmissionCollectionAction(submissionId, collectionId)); + } + createSubmission(): Observable { return this.restService.postToEndpoint('workspaceitems', {}) .map((workspaceitems) => workspaceitems[0]) @@ -63,6 +76,36 @@ export class SubmissionService { return this.restService.deleteById(submissionId); } + dispatchInit( + collectionId: string, + submissionId: string, + selfUrl: string, + submissionDefinition: SubmissionDefinitionsModel, + sections: WorkspaceitemSectionsObject, + errors: SubmissionSectionError[]) { + this.store.dispatch(new InitSubmissionFormAction(collectionId, submissionId, selfUrl, submissionDefinition, sections, errors)); + } + + dispatchDeposit(submissionId) { + this.store.dispatch(new SaveAndDepositSubmissionAction(submissionId)); + } + + dispatchDiscard(submissionId) { + this.store.dispatch(new DiscardSubmissionAction(submissionId)); + } + + dispatchSave(submissionId) { + this.store.dispatch(new SaveSubmissionFormAction(submissionId)); + } + + dispatchSaveForLater(submissionId) { + this.store.dispatch(new SaveForLaterSubmissionFormAction(submissionId)); + } + + dispatchSaveSection(submissionId, sectionId) { + this.store.dispatch(new SaveSubmissionFormAction(submissionId)); + } + getActiveSectionId(submissionId: string): Observable { return this.getSubmissionObject(submissionId) .map((submission: SubmissionObjectEntry) => submission.activeSection); @@ -121,19 +164,6 @@ export class SubmissionService { .distinctUntilChanged(); } - isSectionHidden(sectionData: SubmissionSectionObject) { - return (isNotUndefined(sectionData.visibility) - && sectionData.visibility.main === 'HIDDEN' - && sectionData.visibility.other === 'HIDDEN'); - - } - - isSubmissionLoading(submissionId: string): Observable { - return this.getSubmissionObject(submissionId) - .map((submission: SubmissionObjectEntry) => submission.isLoading) - .distinctUntilChanged() - } - getSubmissionObjectLinkName(): string { const url = this.router.routerState.snapshot.url; if (url.startsWith('/workspaceitems') || url.startsWith('/submit')) { @@ -207,6 +237,27 @@ export class SubmissionService { .startWith(false); } + isSectionHidden(sectionData: SubmissionSectionObject) { + return (isNotUndefined(sectionData.visibility) + && sectionData.visibility.main === 'HIDDEN' + && sectionData.visibility.other === 'HIDDEN'); + + } + + isSubmissionLoading(submissionId: string): Observable { + return this.getSubmissionObject(submissionId) + .map((submission: SubmissionObjectEntry) => submission.isLoading) + .distinctUntilChanged() + } + + notifyNewSection(submissionId: string, sectionId: string, sectionType?: SectionsType) { + this.translate.get('submission.sections.general.metadata-extracted-new-section', {sectionId}) + .take(1) + .subscribe((m) => { + this.notificationsService.info(null, m, null, true); + }); + } + redirectToMyDSpace() { const previousUrl = this.routeService.getPreviousUrl(); if (isEmpty(previousUrl)) { @@ -216,13 +267,20 @@ export class SubmissionService { } } - notifyNewSection(sectionId: string, sectionType?: SectionsType) { - this.translate.get('submission.sections.general.metadata-extracted-new-section', {sectionId}) - .take(1) - .subscribe((m) => { - this.notificationsService.info(null, m, null, true); - }); + resetAllSubmissionObjects() { + this.store.dispatch(new CancelSubmissionFormAction()); } + + resetSubmissionObject( + collectionId: string, + submissionId: string, + selfUrl: string, + submissionDefinition: SubmissionDefinitionsModel, + sections: WorkspaceitemSectionsObject + ) { + this.store.dispatch(new ResetSubmissionFormAction(collectionId, submissionId, selfUrl, sections, submissionDefinition)); + } + retrieveSubmission(submissionId): Observable { return this.restService.getDataById(this.getSubmissionObjectLinkName(), submissionId) .filter((submissionObjects: SubmissionObject[]) => isNotUndefined(submissionObjects))