diff --git a/src/app/features/collections/components/add-to-collection/add-to-collection.component.ts b/src/app/features/collections/components/add-to-collection/add-to-collection.component.ts
index c90a8cee2..ed3b3b706 100644
--- a/src/app/features/collections/components/add-to-collection/add-to-collection.component.ts
+++ b/src/app/features/collections/components/add-to-collection/add-to-collection.component.ts
@@ -207,7 +207,7 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
const payload = {
collectionId: this.primaryCollectionId() || '',
projectId: this.selectedProject()?.id || '',
- collectionMetadata: this.isCedarMode() ? {} : this.collectionMetadataForm.value || {},
+ collectionMetadata: this.collectionMetadataForm.value || {},
userId: this.currentUser()?.id || '',
};
@@ -234,15 +234,17 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
},
});
} else {
- this.customDialogService
- .open(AddToCollectionConfirmationDialogComponent, {
- header: 'collections.addToCollection.confirmationDialogHeader',
- width: '500px',
- data: { payload, project: this.selectedProject() },
- })
- .onClose.pipe(
- filter((res) => !!res),
- switchMap(() => this.saveCedarRecordIfNeeded()),
+ this.saveCedarRecordIfNeeded()
+ .pipe(
+ switchMap(() =>
+ this.customDialogService
+ .open(AddToCollectionConfirmationDialogComponent, {
+ header: 'collections.addToCollection.confirmationDialogHeader',
+ width: '500px',
+ data: { payload, project: this.selectedProject() },
+ })
+ .onClose.pipe(filter((res) => !!res))
+ ),
takeUntilDestroyed(this.destroyRef)
)
.subscribe({
diff --git a/src/app/features/collections/components/add-to-collection/collection-metadata-step/collection-metadata-step.component.html b/src/app/features/collections/components/add-to-collection/collection-metadata-step/collection-metadata-step.component.html
index 0b0cd6498..8c7e779d1 100644
--- a/src/app/features/collections/components/add-to-collection/collection-metadata-step/collection-metadata-step.component.html
+++ b/src/app/features/collections/components/add-to-collection/collection-metadata-step/collection-metadata-step.component.html
@@ -20,16 +20,16 @@
{{ 'collections.addToCollection.collectionMetadata' | translate }}
[instanceObject]="cedarFormData()"
>
}
- } @else {
- @for (filterEntry of availableFilterEntries(); track filterEntry.key) {
-
-
{{ filterEntry.labelKey | translate }}
+ }
-
- {{ collectionMetadataForm().get(filterEntry.key)?.value }}
-
-
- }
+ @for (filterEntry of availableFilterEntries(); track filterEntry.key) {
+
+
{{ filterEntry.labelKey | translate }}
+
+
+ {{ collectionMetadataForm().get(filterEntry.key)?.value }}
+
+
}
}
@@ -46,6 +46,21 @@ {{ 'collections.addToCollection.collectionMetadata' | translate }}
+
+
@if (isCedarMode()) {
@if (cedarTemplate()) {
@@ -65,27 +80,16 @@
{{ 'collections.addToCollection.collectionMetadata' | translate }}
[label]="'common.buttons.discardChanges' | translate"
(onClick)="handleDiscardChanges()"
/>
-
+
} @else {
{{ 'collections.addToCollection.cedarFormNotAvailable' | translate }}
}
} @else {
-
-
{
const filterEntries = this.availableFilterEntries();
- if (filterEntries.length && !this.isCedarMode()) {
+ if (filterEntries.length) {
this.buildCollectionMetadataForm();
}
});
@@ -223,8 +224,7 @@ export class CollectionMetadataStepComponent {
form.controls &&
Object.keys(form.controls).length > 0 &&
filterEntries.length > 0 &&
- !alreadyPopulated &&
- !this.isCedarMode()
+ !alreadyPopulated
) {
this.populateFormFromSubmission(submission.submission);
this.formPopulatedFromSubmission.set(true);
@@ -233,10 +233,8 @@ export class CollectionMetadataStepComponent {
effect(() => {
if (!this.collectionMetadataSaved() && this.stepperActiveValue() !== AddToCollectionSteps.CollectionMetadata) {
- if (!this.isCedarMode()) {
- this.collectionMetadataForm().reset();
- this.formPopulatedFromSubmission.set(false);
- }
+ this.collectionMetadataForm().reset();
+ this.formPopulatedFromSubmission.set(false);
}
});
}
diff --git a/src/app/shared/mappers/collections/collections.mapper.ts b/src/app/shared/mappers/collections/collections.mapper.ts
index cd7711c26..26c717ef5 100644
--- a/src/app/shared/mappers/collections/collections.mapper.ts
+++ b/src/app/shared/mappers/collections/collections.mapper.ts
@@ -71,7 +71,7 @@ export class CollectionsMapper {
backgroundColor: response.embeds.brand.data.attributes.background_color,
}
: null,
- requiredMetadataTemplate: response.embeds.required_metadata_template?.data ?? null,
+ requiredMetadataTemplate: null,
};
}
diff --git a/src/app/shared/models/collections/collections-json-api.model.ts b/src/app/shared/models/collections/collections-json-api.model.ts
index 9dce2537f..20a0d15d0 100644
--- a/src/app/shared/models/collections/collections-json-api.model.ts
+++ b/src/app/shared/models/collections/collections-json-api.model.ts
@@ -1,4 +1,3 @@
-import { CedarMetadataDataTemplateJsonApi } from '@osf/features/metadata/models';
import { CollectionSubmissionReviewState } from '@osf/shared/enums/collection-submission-review-state.enum';
import { BrandDataJsonApi } from '../brand/brand.json-api.model';
@@ -15,9 +14,6 @@ export interface CollectionProviderResponseJsonApi {
brand: {
data?: BrandDataJsonApi;
};
- required_metadata_template?: {
- data?: CedarMetadataDataTemplateJsonApi | null;
- };
};
relationships: {
primary_collection: {
@@ -26,6 +22,12 @@ export interface CollectionProviderResponseJsonApi {
type: string;
};
};
+ required_metadata_template?: {
+ data?: {
+ id: string;
+ type: string;
+ } | null;
+ };
};
}
diff --git a/src/app/shared/services/collections.service.ts b/src/app/shared/services/collections.service.ts
index 2fea963f7..8390b9038 100644
--- a/src/app/shared/services/collections.service.ts
+++ b/src/app/shared/services/collections.service.ts
@@ -41,6 +41,7 @@ import { ReviewActionPayloadJsonApi } from '../models/review-action/review-actio
import { SetTotalSubmissions } from '../stores/collections/collections.actions';
import { JsonApiService } from './json-api.service';
+import { MetadataService } from './metadata.service';
@Injectable({
providedIn: 'root',
@@ -48,6 +49,7 @@ import { JsonApiService } from './json-api.service';
export class CollectionsService {
private readonly jsonApiService = inject(JsonApiService);
private readonly environment = inject(ENVIRONMENT);
+ private readonly metadataService = inject(MetadataService);
get apiUrl() {
return `${this.environment.apiDomainUrl}/v2`;
@@ -56,11 +58,22 @@ export class CollectionsService {
private actions = createDispatchMap({ setTotalSubmissions: SetTotalSubmissions });
getCollectionProvider(collectionName: string): Observable {
- const url = `${this.apiUrl}/providers/collections/${collectionName}/?embed=brand,required_metadata_template`;
+ const url = `${this.apiUrl}/providers/collections/${collectionName}/?embed=brand`;
- return this.jsonApiService
- .get>(url)
- .pipe(map((response) => CollectionsMapper.fromGetCollectionProviderResponse(response.data)));
+ return this.jsonApiService.get>(url).pipe(
+ switchMap((response) => {
+ const provider = CollectionsMapper.fromGetCollectionProviderResponse(response.data);
+ const templateId = response.data.relationships.required_metadata_template?.data?.id;
+
+ if (!templateId) {
+ return of(provider);
+ }
+
+ return this.metadataService
+ .getCedarMetadataTemplateDetail(templateId)
+ .pipe(map((template) => ({ ...provider, requiredMetadataTemplate: template })));
+ })
+ );
}
getCollectionDetails(collectionId: string): Observable {
diff --git a/src/app/shared/services/metadata.service.ts b/src/app/shared/services/metadata.service.ts
index 82c1bd357..0d0df1364 100644
--- a/src/app/shared/services/metadata.service.ts
+++ b/src/app/shared/services/metadata.service.ts
@@ -6,6 +6,7 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
import { CedarRecordsMapper, MetadataMapper, RorMapper } from '@osf/features/metadata/mappers';
import {
+ CedarMetadataDataTemplateJsonApi,
CedarMetadataRecord,
CedarMetadataRecordJsonApi,
CedarMetadataTemplateJsonApi,
@@ -102,6 +103,12 @@ export class MetadataService {
);
}
+ getCedarMetadataTemplateDetail(templateId: string): Observable {
+ return this.jsonApiService
+ .get<{ data: CedarMetadataDataTemplateJsonApi }>(`${this.apiDomainUrl}/_/cedar_metadata_templates/${templateId}/`)
+ .pipe(map((response) => response.data));
+ }
+
getMetadataCedarRecords(
resourceId: string,
resourceType: ResourceType,