Skip to content

Commit 4595f14

Browse files
committed
[UXP-147] Refactoring external upload step in order to use common behaviour to update section data and errors
1 parent 34faa4e commit 4595f14

6 files changed

Lines changed: 43 additions & 93 deletions

File tree

src/app/submission/objects/submission-objects.actions.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,7 @@ export class ExecuteExternalUploadErrorAction implements Action {
10881088
type = SubmissionObjectActionTypes.EXECUTE_EXTERNAL_UPLOAD_ERROR;
10891089
payload: {
10901090
submissionId: string;
1091+
sectionId: string;
10911092
errors: SubmissionObjectError[]
10921093
};
10931094

@@ -1096,11 +1097,13 @@ export class ExecuteExternalUploadErrorAction implements Action {
10961097
*
10971098
* @param submissionId
10981099
* the submission's ID
1100+
* @param sectionId
1101+
* the section's ID
10991102
* @param errors
11001103
* the section's ID
11011104
*/
1102-
constructor(submissionId: string, errors: SubmissionObjectError[]) {
1103-
this.payload = { submissionId, errors };
1105+
constructor(submissionId: string, sectionId: string, errors: SubmissionObjectError[]) {
1106+
this.payload = { submissionId, sectionId, errors };
11041107
}
11051108
}
11061109

src/app/submission/objects/submission-objects.effects.ts

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -401,28 +401,24 @@ export class SubmissionObjectEffects {
401401
'sections',
402402
action.payload.sectionId).pipe(
403403
map((response: SubmissionObject[]) => {
404-
const errors = [].concat.apply([], response.map(sub => sub.errors));
405-
const sectionErrors = errors.filter((errorObject: SubmissionObjectError) => errorObject.paths.length > 0)
406-
.filter(err => err.paths.includes('/sections/' + action.payload.sectionId));
404+
const { errors } = response[0];
405+
const errorsMap = parseSectionErrors(errors);
406+
const sectionErrors = errorsMap[action.payload.sectionId];
407407

408-
if (sectionErrors.length > 0) {
409-
return new ExecuteExternalUploadErrorAction(action.payload.submissionId, sectionErrors);
408+
if (sectionErrors?.length > 0) {
409+
return [new ExecuteExternalUploadErrorAction(action.payload.submissionId, action.payload.sectionId, sectionErrors)];
410410
} else {
411-
const index: any = parseInt(action.payload.submissionId, 10);
412-
const sections = currentState.submission.objects[index]?.sections;
413-
const newSectionsState = Object.assign({}, sections);
414-
415-
//Update upload section with received files
416-
newSectionsState[SectionsType.Upload] = Object.assign({}, newSectionsState[SectionsType.Upload], {
417-
data: Object.assign({files: (response[0].sections[SectionsType.Upload] as any).files})
418-
});
419-
return new ExecuteExternalUploadSuccessAction(
411+
const actions = this.parseSaveResponse((currentState.submission as SubmissionState).objects[action.payload.submissionId],
412+
response, action.payload.submissionId, currentState.forms, false, true);
413+
actions.push(new ExecuteExternalUploadSuccessAction(
420414
action.payload.submissionId,
421415
action.payload.sectionId,
422-
newSectionsState
423-
);
416+
null
417+
));
418+
return actions;
424419
}
425420
}),
421+
mergeMap((actions) => observableFrom(actions)),
426422
catchError((rd: RemoteData<any>) => observableFrom(
427423
this.parseErrorResponse(false, rd.errors, action.payload.submissionId, rd.statusCode, rd.errorMessage)
428424
))

src/app/submission/objects/submission-objects.reducer.ts

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
EnableSectionAction,
2121
ExecuteExternalUploadAction,
2222
ExecuteExternalUploadErrorAction,
23-
ExecuteExternalUploadSuccessAction,
2423
InertSectionErrorsAction,
2524
InitSectionAction,
2625
InitSubmissionFormAction,
@@ -113,10 +112,6 @@ export interface SubmissionObjectEntry {
113112
*/
114113
externalUploadPending?: boolean;
115114

116-
/**
117-
* Errors from external upload
118-
*/
119-
externalUploadErrors?: SubmissionObjectError[];
120115
/**
121116
* A boolean representing if a submission deposit operation is pending
122117
*/
@@ -302,11 +297,11 @@ export function submissionObjectReducer(state = initialState, action: Submission
302297
}
303298

304299
case SubmissionObjectActionTypes.EXECUTE_EXTERNAL_UPLOAD_ERROR: {
305-
return endExternalUploadExecution(state, action as ExecuteExternalUploadErrorAction);
300+
return updateExternalUploadState(state, action.payload.submissionId, action.payload.sectionId, (action as ExecuteExternalUploadErrorAction).payload.errors);
306301
}
307302

308303
case SubmissionObjectActionTypes.EXECUTE_EXTERNAL_UPLOAD_SUCCESS: {
309-
return updateSubmissionFromExternalUploadEvent(state, action as ExecuteExternalUploadSuccessAction);
304+
return updateExternalUploadState(state, action.payload.submissionId, action.payload.sectionId, []);
310305
}
311306

312307
default: {
@@ -416,7 +411,6 @@ function initSubmission(state: SubmissionObjectState, action: InitSubmissionForm
416411
savePending: false,
417412
saveDecisionPending: false,
418413
externalUploadPending: false,
419-
externalUploadErrors: [],
420414
depositPending: false,
421415
metadataSecurityConfiguration: action.payload.metadataSecurityConfiguration,
422416
isDiscarding: false
@@ -1116,7 +1110,6 @@ function startExternalUploadExecution(state: SubmissionObjectState, action: Exec
11161110
return Object.assign({}, state, {
11171111
[ action.payload.submissionId ]: Object.assign({}, state[ action.payload.submissionId ], {
11181112
externalUploadPending: true,
1119-
externalUploadErrors: [],
11201113
})
11211114
});
11221115
} else {
@@ -1125,54 +1118,35 @@ function startExternalUploadExecution(state: SubmissionObjectState, action: Exec
11251118
}
11261119

11271120
/**
1128-
* Set external upload flag to false
1121+
* Update external upload state
11291122
*
11301123
* @param state
11311124
* the current state
1132-
* @param action
1133-
* a SetDuplicateDecisionAction
1125+
* @param submissionId
1126+
* the submission's ID
1127+
* @param sectionId
1128+
* the section's ID
1129+
* @param errors
1130+
* the section's ID
11341131
* @return SubmissionObjectState
11351132
* the new state, with the decision flag changed.
11361133
*/
1137-
function endExternalUploadExecution(state: SubmissionObjectState, action: ExecuteExternalUploadErrorAction): SubmissionObjectState {
1138-
if (hasValue(state[ action.payload.submissionId ])) {
1134+
function updateExternalUploadState(state: SubmissionObjectState, submissionId: string, sectionId: string, errors: SubmissionObjectError[]): SubmissionObjectState {
1135+
if (isNotEmpty(state[ submissionId ])
1136+
&& isNotEmpty(state[ submissionId ].sections[ sectionId])) {
11391137
return Object.assign({}, state, {
1140-
[ action.payload.submissionId ]: Object.assign({}, state[ action.payload.submissionId ], {
1138+
[ submissionId ]: Object.assign({}, state[ submissionId ], {
1139+
sections: Object.assign({}, state[ submissionId ].sections, {
1140+
[ sectionId ]: Object.assign({}, state[ submissionId ].sections [ sectionId ], {
1141+
enabled: true,
1142+
errorsToShow: errors,
1143+
serverValidationErrors: errors,
1144+
})
1145+
}),
11411146
externalUploadPending: false,
1142-
externalUploadErrors: action.payload.errors
11431147
})
11441148
});
11451149
} else {
11461150
return state;
11471151
}
11481152
}
1149-
1150-
/**
1151-
* Update submission object in store form external update response
1152-
*
1153-
* @param state
1154-
* @param action
1155-
*/
1156-
1157-
function updateSubmissionFromExternalUploadEvent(state: SubmissionObjectState, action: ExecuteExternalUploadSuccessAction) {
1158-
const sectionsData = action.payload.sectionsObject;
1159-
1160-
let currentSection = {};
1161-
const currentSectionId = action.payload.sectionId;
1162-
currentSection[currentSectionId] = state[ action.payload.submissionId ].sections[currentSectionId];
1163-
1164-
if (hasValue(sectionsData[ action.payload.sectionId ])) {
1165-
return Object.assign({}, state, {
1166-
[ action.payload.submissionId ]: Object.assign({}, state[ action.payload.submissionId ], {
1167-
sections: Object.assign({}, sectionsData, currentSection),
1168-
externalUploadPending: false
1169-
})
1170-
});
1171-
} else {
1172-
return Object.assign({}, state, {
1173-
[action.payload.submissionId]: Object.assign({}, state[action.payload.submissionId], {
1174-
externalUploadPending: false
1175-
})
1176-
});
1177-
}
1178-
}

src/app/submission/sections/external-upload/section-external-upload.component.html

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,14 @@
1+
2+
<ds-alert [type]="AlertType.Info"
3+
[content]="'submission.sections.external-upload.info' | translate"></ds-alert>
4+
15
<div class="container-fluid">
2-
<div class="row justify-content-center">
3-
<div class="col-12">
4-
<ds-alert [type]="AlertType.Info"
5-
[content]="'submission.sections.external-upload.info' | translate"></ds-alert>
6-
</div>
7-
</div>
86
<div class="row justify-content-center w-100 external-upload-container">
97
<div class="col-12" *ngIf="!(loading$ | async)">
108
<div class="w-100">
119
<label for="externalUploadSource">{{'submission.sections.external-upload.source' | translate}}</label>
1210
<input [(ngModel)]="source" class="form-control w-100" id="externalUploadSource" [placeholder]="'submission.sections.external-upload.placeholder' | translate" />
1311
</div>
14-
<div class="d-flex flex-column" *ngIf="(errors$ | async).length > 0">
15-
<div class="text-danger mt-1" *ngFor="let error of (errors$ | async)">
16-
{{error.message | translate}}
17-
</div>
18-
</div>
1912
<div class="w-100 d-flex justify-content-center">
2013
<button [disabled]="!source" (click)="submitUpload()" class="btn btn-success mt-4">{{'submission.sections.external-upload.import' | translate}}</button>
2114
</div>

src/app/submission/sections/external-upload/section-external-upload.component.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ export class SectionExternalUploadComponent extends SectionModelComponent implem
2727

2828
public loading$ = this.submissionService.getExternalUplodaProcessingStatus(this.injectedSubmissionId);
2929

30-
public errors$ = this.submissionService.getExternalUplodaErorrs(this.injectedSubmissionId);
31-
3230
public AlertType = AlertType;
3331

3432
/**
@@ -69,6 +67,7 @@ export class SectionExternalUploadComponent extends SectionModelComponent implem
6967
public submitUpload() {
7068
this.dispatchExecuteUploadAction();
7169
}
70+
7271
getSectionStatus(): Observable<boolean> {
7372
return of(true);
7473
}

src/app/submission/submission.service.ts

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { HttpOptions } from '../core/dspace-rest/dspace-rest.service';
3030
import { SubmissionRestService } from '../core/submission/submission-rest.service';
3131
import { SectionDataObject } from './sections/models/section-data.model';
3232
import { SubmissionScopeType } from '../core/submission/submission-scope-type';
33-
import { SubmissionObject, SubmissionObjectError } from '../core/submission/models/submission-object.model';
33+
import { SubmissionObject } from '../core/submission/models/submission-object.model';
3434
import { RouteService } from '../core/services/route.service';
3535
import { SectionsType } from './sections/sections-type';
3636
import { NotificationsService } from '../shared/notifications/notifications.service';
@@ -554,21 +554,6 @@ export class SubmissionService {
554554
startWith(false));
555555
}
556556

557-
/**
558-
* Return the external upload status of the submission
559-
*
560-
* @param submissionId
561-
* The submission id
562-
* @return Observable<boolean>
563-
* observable with submission save-decision status
564-
*/
565-
getExternalUplodaErorrs(submissionId: string): Observable<SubmissionObjectError[]> {
566-
return this.getSubmissionObject(submissionId).pipe(
567-
map((state: SubmissionObjectEntry) => state.externalUploadErrors),
568-
distinctUntilChanged(),
569-
startWith([]));
570-
}
571-
572557
/**
573558
* Return whether submission unsaved modification are present
574559
*

0 commit comments

Comments
 (0)