From 68dd35095c4ad44331edfc9d7c6f88c92b8fb4a7 Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Mon, 19 Feb 2024 15:56:08 +1300 Subject: [PATCH] [TLC-674] Do not display duplicate section if data is empty --- .../objects/submission-objects.effects.ts | 72 +++++++++++-------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/src/app/submission/objects/submission-objects.effects.ts b/src/app/submission/objects/submission-objects.effects.ts index 2c19224336..c34e8c908e 100644 --- a/src/app/submission/objects/submission-objects.effects.ts +++ b/src/app/submission/objects/submission-objects.effects.ts @@ -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, @@ -45,16 +45,19 @@ import { UpdateSectionDataAction, UpdateSectionDataSuccessAction } from './submission-objects.actions'; -import { SubmissionObjectEntry } from './submission-objects.reducer'; -import { Item } from '../../core/shared/item.model'; -import { RemoteData } from '../../core/data/remote-data'; -import { getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; -import { SubmissionObjectDataService } from '../../core/submission/submission-object-data.service'; -import { followLink } from '../../shared/utils/follow-link-config.model'; -import parseSectionErrorPaths, { SectionErrorPath } from '../utils/parseSectionErrorPaths'; -import { FormState } from '../../shared/form/form.reducer'; -import { SubmissionSectionObject } from './submission-section-object.model'; -import { SubmissionSectionError } from './submission-section-error.model'; +import {SubmissionObjectEntry} from './submission-objects.reducer'; +import {Item} from '../../core/shared/item.model'; +import {RemoteData} from '../../core/data/remote-data'; +import {getFirstSucceededRemoteDataPayload} from '../../core/shared/operators'; +import {SubmissionObjectDataService} from '../../core/submission/submission-object-data.service'; +import {followLink} from '../../shared/utils/follow-link-config.model'; +import parseSectionErrorPaths, {SectionErrorPath} from '../utils/parseSectionErrorPaths'; +import {FormState} from '../../shared/form/form.reducer'; +import {SubmissionSectionObject} from './submission-section-object.model'; +import {SubmissionSectionError} from './submission-section-error.model'; +import { + WorkspaceitemSectionDuplicatesObject +} from '../../core/submission/models/workspaceitem-section-duplicates.model'; @Injectable() export class SubmissionObjectEffects { @@ -71,7 +74,11 @@ 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 (except duplicate detection) or contains data in its section payload + const enabled = (sectionDefinition.mandatory && (sectionDefinition.sectionType !== SectionsType.Duplicates)) + || (isNotEmpty(action.payload.sections) && action.payload.sections.hasOwnProperty(sectionId) + && (sectionDefinition.sectionType === SectionsType.Duplicates && 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); @@ -434,8 +441,13 @@ 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 + const duplicatesSectionId = findKey(currentState.sections, (section) => section.sectionType === SectionsType.Duplicates); + if (isNotUndefined(duplicatesSectionId) && isNotEmpty(currentState.sections[duplicatesSectionId]?.data) && isEmpty(sections[duplicatesSectionId])) { + mappedActions.push(new UpdateSectionDataAction(submissionId, duplicatesSectionId, null, [], [])); + } + }); } return mappedActions; }