Merge remote-tracking branch 'origin/main' into fix-versioning-button

This commit is contained in:
Yury Bondarenko
2024-03-07 10:10:45 +01:00
161 changed files with 5127 additions and 573 deletions

View File

@@ -56,6 +56,9 @@ export const SubmissionObjectActionTypes = {
DISCARD_SUBMISSION_SUCCESS: type('dspace/submission/DISCARD_SUBMISSION_SUCCESS'),
DISCARD_SUBMISSION_ERROR: type('dspace/submission/DISCARD_SUBMISSION_ERROR'),
// Clearing active section types
CLEAN_DUPLICATE_DETECTION: type('dspace/submission/CLEAN_DUPLICATE_DETECTION'),
// Upload file types
NEW_FILE: type('dspace/submission/NEW_FILE'),
EDIT_FILE_DATA: type('dspace/submission/EDIT_FILE_DATA'),
@@ -240,6 +243,25 @@ export class UpdateSectionDataAction implements Action {
}
}
/**
* Removes data and makes 'detect-duplicate' section not visible.
*/
export class CleanDuplicateDetectionAction implements Action {
type = SubmissionObjectActionTypes.CLEAN_DUPLICATE_DETECTION;
payload: {
submissionId: string;
};
/**
* creates a new CleanDetectDuplicateAction
*
* @param submissionId Id of the submission on which perform the action
*/
constructor(submissionId: string ) {
this.payload = { submissionId };
}
}
export class UpdateSectionDataSuccessAction implements Action {
type = SubmissionObjectActionTypes.UPDATE_SECTION_DATA_SUCCESS;
}
@@ -845,6 +867,7 @@ export type SubmissionObjectAction = DisableSectionAction
| InitSubmissionFormAction
| ResetSubmissionFormAction
| CancelSubmissionFormAction
| CleanDuplicateDetectionAction
| CompleteInitSubmissionFormAction
| ChangeSubmissionCollectionAction
| SaveAndDepositSubmissionAction

View File

@@ -1,25 +1,25 @@
import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { Store } from '@ngrx/store';
import { TranslateService } from '@ngx-translate/core';
import {Injectable} from '@angular/core';
import {Actions, createEffect, ofType} from '@ngrx/effects';
import {Store} from '@ngrx/store';
import {TranslateService} from '@ngx-translate/core';
import findKey from 'lodash/findKey';
import isEqual from 'lodash/isEqual';
import union from 'lodash/union';
import { from as observableFrom, Observable, of as observableOf } from 'rxjs';
import { catchError, filter, map, mergeMap, switchMap, take, tap, withLatestFrom } from 'rxjs/operators';
import { SubmissionObject } from '../../core/submission/models/submission-object.model';
import { WorkflowItem } from '../../core/submission/models/workflowitem.model';
import { WorkspaceitemSectionUploadObject } from '../../core/submission/models/workspaceitem-section-upload.model';
import { WorkspaceitemSectionsObject } from '../../core/submission/models/workspaceitem-sections.model';
import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model';
import { SubmissionJsonPatchOperationsService } from '../../core/submission/submission-json-patch-operations.service';
import { isEmpty, isNotEmpty, isNotUndefined } from '../../shared/empty.util';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { SectionsType } from '../sections/sections-type';
import { SectionsService } from '../sections/sections.service';
import { SubmissionState } from '../submission.reducers';
import { SubmissionService } from '../submission.service';
import {from as observableFrom, Observable, of as observableOf} from 'rxjs';
import {catchError, filter, map, mergeMap, switchMap, take, tap, withLatestFrom} from 'rxjs/operators';
import {SubmissionObject} from '../../core/submission/models/submission-object.model';
import {WorkflowItem} from '../../core/submission/models/workflowitem.model';
import {WorkspaceitemSectionUploadObject} from '../../core/submission/models/workspaceitem-section-upload.model';
import {WorkspaceitemSectionsObject} from '../../core/submission/models/workspaceitem-sections.model';
import {WorkspaceItem} from '../../core/submission/models/workspaceitem.model';
import {SubmissionJsonPatchOperationsService} from '../../core/submission/submission-json-patch-operations.service';
import {isEmpty, isNotEmpty, isNotUndefined} from '../../shared/empty.util';
import {NotificationsService} from '../../shared/notifications/notifications.service';
import {SectionsType} from '../sections/sections-type';
import {SectionsService} from '../sections/sections.service';
import {SubmissionState} from '../submission.reducers';
import {SubmissionService} from '../submission.service';
import parseSectionErrors from '../utils/parseSectionErrors';
import {
CompleteInitSubmissionFormAction,
@@ -43,7 +43,8 @@ import {
SubmissionObjectAction,
SubmissionObjectActionTypes,
UpdateSectionDataAction,
UpdateSectionDataSuccessAction
UpdateSectionDataSuccessAction,
CleanDuplicateDetectionAction
} from './submission-objects.actions';
import { SubmissionObjectEntry } from './submission-objects.reducer';
import { Item } from '../../core/shared/item.model';
@@ -56,6 +57,8 @@ import { FormState } from '../../shared/form/form.reducer';
import { SubmissionSectionObject } from './submission-section-object.model';
import { SubmissionSectionError } from './submission-section-error.model';
import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service';
import { WorkspaceitemSectionDuplicatesObject } from '../../core/submission/models/workspaceitem-section-duplicates.model';
import { environment } from '../../../environments/environment';
@Injectable()
export class SubmissionObjectEffects {
@@ -72,7 +75,12 @@ export class SubmissionObjectEffects {
const selfLink = sectionDefinition._links.self.href || sectionDefinition._links.self;
const sectionId = selfLink.substr(selfLink.lastIndexOf('/') + 1);
const config = sectionDefinition._links.config ? (sectionDefinition._links.config.href || sectionDefinition._links.config) : '';
const enabled = (sectionDefinition.mandatory) || (isNotEmpty(action.payload.sections) && action.payload.sections.hasOwnProperty(sectionId));
// A section is enabled if it is mandatory or contains data in its section payload
// except for detect duplicate steps which will be hidden with no data unless overridden in config, even if mandatory
const enabled = (sectionDefinition.mandatory && (sectionDefinition.sectionType !== SectionsType.Duplicates))
|| (isNotEmpty(action.payload.sections) && action.payload.sections.hasOwnProperty(sectionId)
&& (sectionDefinition.sectionType === SectionsType.Duplicates && (alwaysDisplayDuplicates() || isNotEmpty((action.payload.sections[sectionId] as WorkspaceitemSectionDuplicatesObject).potentialDuplicates)))
);
let sectionData;
if (sectionDefinition.sectionType !== SectionsType.SubmissionForm) {
sectionData = (isNotUndefined(action.payload.sections) && isNotUndefined(action.payload.sections[sectionId])) ? action.payload.sections[sectionId] : Object.create(null);
@@ -439,8 +447,16 @@ export class SubmissionObjectEffects {
&& isEmpty(sections[sherpaPoliciesSectionId])) {
mappedActions.push(new UpdateSectionDataAction(submissionId, sherpaPoliciesSectionId, null, [], []));
}
});
// When Duplicate Detection step is enabled, add it only if there are duplicates in the response section data
// or if configuration overrides this behaviour
if (!alwaysDisplayDuplicates()) {
const duplicatesSectionId = findKey(currentState.sections, (section) => section.sectionType === SectionsType.Duplicates);
if (isNotUndefined(duplicatesSectionId) && sections.hasOwnProperty(duplicatesSectionId) && isEmpty((sections[duplicatesSectionId] as WorkspaceitemSectionDuplicatesObject).potentialDuplicates)) {
mappedActions.push(new CleanDuplicateDetectionAction(submissionId));
}
}
});
}
return mappedActions;
}
@@ -486,3 +502,7 @@ function filterErrors(sectionForm: FormState, sectionErrors: SubmissionSectionEr
});
return filteredErrors;
}
function alwaysDisplayDuplicates(): boolean {
return (environment.submission.duplicateDetection.alwaysShowSection);
}

View File

@@ -1,7 +1,7 @@
import { submissionObjectReducer, SubmissionObjectState } from './submission-objects.reducer';
import {
CancelSubmissionFormAction,
ChangeSubmissionCollectionAction,
ChangeSubmissionCollectionAction, CleanDuplicateDetectionAction,
CompleteInitSubmissionFormAction,
DeleteSectionErrorsAction,
DeleteUploadedFileAction,
@@ -273,7 +273,7 @@ describe('submissionReducer test suite', () => {
expect(newState[826].sections.traditionalpagetwo.enabled).toBeTruthy();
});
it('should enable submission section properly', () => {
it('should disable submission section properly', () => {
let action: SubmissionObjectAction = new EnableSectionAction(submissionId, 'traditionalpagetwo');
let newState = submissionObjectReducer(initState, action);
@@ -644,4 +644,20 @@ describe('submissionReducer test suite', () => {
expect(newState[826].sections.upload.data).toEqual(expectedState);
});
it('should enable duplicates section properly', () => {
let action: SubmissionObjectAction = new EnableSectionAction(submissionId, 'duplicates');
let newState = submissionObjectReducer(initState, action);
expect(newState[826].sections.duplicates.enabled).toBeTruthy();
});
it('should clean duplicates section properly', () => {
let action = new CleanDuplicateDetectionAction(submissionId);
let newState = submissionObjectReducer(initState, action);
expect(newState[826].sections.duplicates.enabled).toBeFalsy();
});
});

View File

@@ -5,7 +5,7 @@ import isEqual from 'lodash/isEqual';
import uniqWith from 'lodash/uniqWith';
import {
ChangeSubmissionCollectionAction,
ChangeSubmissionCollectionAction, CleanDuplicateDetectionAction,
CompleteInitSubmissionFormAction,
DeleteSectionErrorsAction,
DeleteUploadedFileAction,
@@ -229,6 +229,10 @@ export function submissionObjectReducer(state = initialState, action: Submission
return removeSectionErrors(state, action as RemoveSectionErrorsAction);
}
case SubmissionObjectActionTypes.CLEAN_DUPLICATE_DETECTION: {
return cleanDuplicateDetectionSection(state, action as CleanDuplicateDetectionAction);
}
default: {
return state;
}
@@ -856,3 +860,20 @@ function deleteFile(state: SubmissionObjectState, action: DeleteUploadedFileActi
}
return state;
}
function cleanDuplicateDetectionSection(state: SubmissionObjectState, action: CleanDuplicateDetectionAction): SubmissionObjectState {
if (isNotEmpty(state[ action.payload.submissionId ]) && state[action.payload.submissionId].sections.hasOwnProperty('duplicates')) {
return Object.assign({}, state, {
[ action.payload.submissionId ]: Object.assign({}, state[ action.payload.submissionId ], {
sections: Object.assign({}, state[ action.payload.submissionId ].sections, {
[ 'duplicates' ]: Object.assign({}, state[ action.payload.submissionId ].sections.duplicates, {
enabled: false,
data: { potentialDuplicates: [] }
})
})
})
});
} else {
return state;
}
}