Moved the use of store to services

This commit is contained in:
Giuseppe
2018-10-11 14:18:55 +02:00
parent d5c5749784
commit d2e522749d
13 changed files with 182 additions and 142 deletions

View File

@@ -46,6 +46,9 @@ export class NormalizedObjectFactory {
case ResourceType.Group: {
return NormalizedGroupModel
}
case ResourceType.Workflowitem: {
return NormalizedWorkflowItem
}
default: {
return undefined;
}

View File

@@ -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 {

View File

@@ -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<SubmitDataResponseDefinitionObject>,
private store: Store<SubmissionState>,
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();
})

View File

@@ -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<SubmissionState>) {
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)
}
}
);

View File

@@ -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<SubmissionState>,
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();
}

View File

@@ -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)

View File

@@ -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<SubmissionState>) {
constructor(private injector: Injector) {
}
ngOnInit() {

View File

@@ -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<SubmissionState>,
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);
}
}

View File

@@ -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<SubmissionState>,
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));
}

View File

@@ -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<boolean>;
constructor(private changeDetectorRef: ChangeDetectorRef,
private store: Store<SubmissionState>,
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 = [];

View File

@@ -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<SubmissionSectionObject> {
public dispatchRemoveSectionErrors(submissionId, sectionId) {
this.store.dispatch(new RemoveSectionErrorsAction(submissionId, sectionId));
}
public getSectionData(submissionId: string, sectionId: string): Observable<WorkspaceitemSectionDataType> {
return this.store.select(submissionSectionDataFromIdSelector(submissionId, sectionId))
.distinctUntilChanged();
}
public getSectionErrors(submissionId: string, sectionId: string): Observable<SubmissionSectionError[]> {
return this.store.select(submissionSectionErrorsFromIdSelector(submissionId, sectionId))
.distinctUntilChanged();
}
public getSectionState(submissionId: string, sectionId: string): Observable<SubmissionSectionObject> {
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<boolean> {
public isSectionValid(submissionId: string, sectionId: string): Observable<boolean> {
return this.store.select(submissionSectionFromIdSelector(submissionId, sectionId))
.filter((sectionObj) => hasValue(sectionObj))
.map((sectionObj: SubmissionSectionObject) => sectionObj.isValid)
.distinctUntilChanged();
}
public isSectionActive(submissionId, sectionId): Observable<boolean> {
public isSectionActive(submissionId: string, sectionId: string): Observable<boolean> {
return this.submissionService.getActiveSectionId(submissionId)
.map((activeSectionId: string) => sectionId === activeSectionId)
.distinctUntilChanged();
}
public isSectionEnabled(submissionId, sectionId): Observable<boolean> {
public isSectionEnabled(submissionId: string, sectionId: string): Observable<boolean> {
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<boolean> {
public isSectionAvailable(submissionId: string, sectionId: string): Observable<boolean> {
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);

View File

@@ -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<SubmissionState>,
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();
}
)

View File

@@ -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<SubmissionObject> {
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<string> {
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<boolean> {
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<boolean> {
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<SubmissionObject> {
return this.restService.getDataById(this.getSubmissionObjectLinkName(), submissionId)
.filter((submissionObjects: SubmissionObject[]) => isNotUndefined(submissionObjects))