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 }}

+
+ @for (filterEntry of availableFilterEntries(); track filterEntry.key) { +
+ + +
+ } +
+ @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 { -
- @for (filterEntry of availableFilterEntries(); track filterEntry.key) { -
- - -
- } -
-
{ 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,