127655: Fixed getFirstDataDefinition not always returning a correct SubmitDataResponseDefinitionObject, leading to an infinite loading screen

- Also fixed an issue where the collection switcher could accidentally show the old collection name instead of the new one
- Also updated the WorkspaceItemPageResolver & WorkflowItemPageResolver to embed the collection to use fewer requests
This commit is contained in:
Alexandre Vryghem
2025-05-06 13:37:52 +02:00
parent c1bd65e8c6
commit 3d32715d25
5 changed files with 8 additions and 9 deletions

View File

@@ -33,7 +33,7 @@ export const getFirstDataDefinition = () =>
if (response.hasFailed) { if (response.hasFailed) {
throw new Error(response.errorMessage); throw new Error(response.errorMessage);
} else { } else {
return hasValue(response.payload) ? response.payload.dataDefinition : response.payload; return hasValue(response?.payload?.dataDefinition) ? response.payload.dataDefinition : [response.payload];
} }
}), }),
distinctUntilChanged(), distinctUntilChanged(),

View File

@@ -27,7 +27,7 @@ import { TestScheduler } from 'rxjs/testing';
import { SectionsService } from '../sections/sections.service'; import { SectionsService } from '../sections/sections.service';
import { VisibilityType } from '../sections/visibility-type'; import { VisibilityType } from '../sections/visibility-type';
describe('SubmissionFormComponent Component', () => { describe('SubmissionFormComponent', () => {
let comp: SubmissionFormComponent; let comp: SubmissionFormComponent;
let compAsAny: any; let compAsAny: any;
@@ -197,7 +197,6 @@ describe('SubmissionFormComponent Component', () => {
}); });
scheduler.flush(); scheduler.flush();
expect(comp.collectionId).toEqual(submissionObjectNew.collection.id);
expect(comp.submissionDefinition).toEqual(submissionObjectNew.submissionDefinition); expect(comp.submissionDefinition).toEqual(submissionObjectNew.submissionDefinition);
expect(comp.definitionId).toEqual(submissionObjectNew.submissionDefinition.name); expect(comp.definitionId).toEqual(submissionObjectNew.submissionDefinition.name);
expect(comp.sections).toEqual(submissionObjectNew.sections); expect(comp.sections).toEqual(submissionObjectNew.sections);
@@ -235,7 +234,6 @@ describe('SubmissionFormComponent Component', () => {
}); });
scheduler.flush(); scheduler.flush();
expect(comp.collectionId).toEqual('45f2f3f1-ba1f-4f36-908a-3f1ea9a557eb');
expect(submissionServiceStub.resetSubmissionObject).not.toHaveBeenCalled(); expect(submissionServiceStub.resetSubmissionObject).not.toHaveBeenCalled();
done(); done();
}); });

View File

@@ -249,13 +249,12 @@ export class SubmissionFormComponent implements OnChanges, OnDestroy {
* new submission object * new submission object
*/ */
onCollectionChange(submissionObject: SubmissionObject) { onCollectionChange(submissionObject: SubmissionObject) {
this.collectionId = (submissionObject.collection as Collection).id;
if (this.definitionId !== (submissionObject.submissionDefinition as SubmissionDefinitionsModel).name) { if (this.definitionId !== (submissionObject.submissionDefinition as SubmissionDefinitionsModel).name) {
this.sections = submissionObject.sections; this.sections = submissionObject.sections;
this.submissionDefinition = (submissionObject.submissionDefinition as SubmissionDefinitionsModel); this.submissionDefinition = (submissionObject.submissionDefinition as SubmissionDefinitionsModel);
this.definitionId = this.submissionDefinition.name; this.definitionId = this.submissionDefinition.name;
this.submissionService.resetSubmissionObject( this.submissionService.resetSubmissionObject(
this.collectionId, (submissionObject.collection as Collection).id,
this.submissionId, this.submissionId,
submissionObject._links.self.href, submissionObject._links.self.href,
this.submissionDefinition, this.submissionDefinition,

View File

@@ -27,6 +27,7 @@ export class WorkflowItemPageResolver implements Resolve<RemoteData<WorkflowItem
true, true,
false, false,
followLink('item'), followLink('item'),
followLink('collection'),
).pipe( ).pipe(
getFirstCompletedRemoteData(), getFirstCompletedRemoteData(),
); );

View File

@@ -4,14 +4,14 @@ import { Observable } from 'rxjs';
import { RemoteData } from '../core/data/remote-data'; import { RemoteData } from '../core/data/remote-data';
import { followLink } from '../shared/utils/follow-link-config.model'; import { followLink } from '../shared/utils/follow-link-config.model';
import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service';
import { WorkflowItem } from '../core/submission/models/workflowitem.model'; import { WorkspaceItem } from '../core/submission/models/workspaceitem.model';
import { getFirstCompletedRemoteData } from '../core/shared/operators'; import { getFirstCompletedRemoteData } from '../core/shared/operators';
/** /**
* This class represents a resolver that requests a specific workflow item before the route is activated * This class represents a resolver that requests a specific workflow item before the route is activated
*/ */
@Injectable() @Injectable()
export class WorkspaceItemPageResolver implements Resolve<RemoteData<WorkflowItem>> { export class WorkspaceItemPageResolver implements Resolve<RemoteData<WorkspaceItem>> {
constructor(private workspaceItemService: WorkspaceitemDataService) { constructor(private workspaceItemService: WorkspaceitemDataService) {
} }
@@ -22,11 +22,12 @@ export class WorkspaceItemPageResolver implements Resolve<RemoteData<WorkflowIte
* @returns Observable<<RemoteData<Item>> Emits the found workflow item based on the parameters in the current route, * @returns Observable<<RemoteData<Item>> Emits the found workflow item based on the parameters in the current route,
* or an error if something went wrong * or an error if something went wrong
*/ */
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<RemoteData<WorkflowItem>> { resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<RemoteData<WorkspaceItem>> {
return this.workspaceItemService.findById(route.params.id, return this.workspaceItemService.findById(route.params.id,
true, true,
false, false,
followLink('item'), followLink('item'),
followLink('collection'),
).pipe( ).pipe(
getFirstCompletedRemoteData(), getFirstCompletedRemoteData(),
); );