Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 || '',
};

Expand All @@ -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({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,16 @@ <h3>{{ 'collections.addToCollection.collectionMetadata' | translate }}</h3>
[instanceObject]="cedarFormData()"
></cedar-artifact-viewer>
}
} @else {
@for (filterEntry of availableFilterEntries(); track filterEntry.key) {
<div>
<p class="font-bold">{{ filterEntry.labelKey | translate }}</p>
}

<p class="mt-2">
{{ collectionMetadataForm().get(filterEntry.key)?.value }}
</p>
</div>
}
@for (filterEntry of availableFilterEntries(); track filterEntry.key) {
<div>
<p class="font-bold">{{ filterEntry.labelKey | translate }}</p>

<p class="mt-2">
{{ collectionMetadataForm().get(filterEntry.key)?.value }}
</p>
</div>
}
}

Expand All @@ -46,6 +46,21 @@ <h3>{{ 'collections.addToCollection.collectionMetadata' | translate }}</h3>

<p-step-panel [value]="targetStepValue()" class="p-0">
<ng-template class="m-0" #content let-activateCallback="activateCallback">
<form [formGroup]="collectionMetadataForm()" class="grid row-gap-2 mt-3">
@for (filterEntry of availableFilterEntries(); track filterEntry.key) {
<div class="flex flex-column gap-1 col-12 md:col-6">
<label [for]="filterEntry.key">{{ filterEntry.labelKey | translate }}</label>
<p-select
[id]="filterEntry.key"
[options]="filterEntry.options"
[formControlName]="filterEntry.key"
[placeholder]="filterEntry.labelKey | translate"
appendTo="body"
></p-select>
</div>
}
</form>

@if (isCedarMode()) {
@if (cedarTemplate()) {
<div class="cedar-editor-container mt-3">
Expand All @@ -65,27 +80,16 @@ <h3>{{ 'collections.addToCollection.collectionMetadata' | translate }}</h3>
[label]="'common.buttons.discardChanges' | translate"
(onClick)="handleDiscardChanges()"
/>
<p-button [label]="'common.buttons.saveAndContinue' | translate" (onClick)="handleSaveCedarMetadata()" />
<p-button
[label]="'common.buttons.saveAndContinue' | translate"
[disabled]="!collectionMetadataForm().valid"
(onClick)="handleSaveCedarMetadata()"
/>
</div>
} @else {
<p class="mt-3">{{ 'collections.addToCollection.cedarFormNotAvailable' | translate }}</p>
}
} @else {
<form [formGroup]="collectionMetadataForm()" class="grid row-gap-2 mt-3">
@for (filterEntry of availableFilterEntries(); track filterEntry.key) {
<div class="flex flex-column gap-1 col-12 md:col-6">
<label [for]="filterEntry.key">{{ filterEntry.labelKey | translate }}</label>
<p-select
[id]="filterEntry.key"
[options]="filterEntry.options"
[formControlName]="filterEntry.key"
[placeholder]="filterEntry.labelKey | translate"
appendTo="body"
></p-select>
</div>
}
</form>

<div class="flex justify-content-end gap-3 mt-4">
<p-button
severity="info"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,14 +136,28 @@ describe('CollectionMetadataStepComponent', () => {
expect(component.cedarTemplate()).toEqual(MOCK_CEDAR_TEMPLATE);
});

it('should handle discard changes in CEDAR mode', () => {
it('should initialize cedarFormData with CEDAR system fields when template is available and no existing record', () => {
const formData = component.cedarFormData();
expect(formData['@id']).toBe('');
expect(formData['schema:isBasedOn']).toBe(MOCK_CEDAR_TEMPLATE.attributes.template['@id']);
expect(formData['schema:name']).toBe('');
expect(formData['schema:description']).toBe('');
expect(formData['pav:createdBy']).toBe('');
expect(formData['oslc:modifiedBy']).toBe('');
expect(typeof formData['pav:createdOn']).toBe('string');
expect(typeof formData['pav:lastUpdatedOn']).toBe('string');
});

it('should handle discard changes in CEDAR mode with no existing record', () => {
component.cedarFormData.set({ field: 'value' });
component.collectionMetadataSaved.set(true);

component.handleDiscardChanges();

expect(component.collectionMetadataSaved()).toBe(false);
expect(component.cedarFormData()).toEqual({});
const formData = component.cedarFormData();
expect(formData['@id']).toBe('');
expect(formData['schema:isBasedOn']).toBe(MOCK_CEDAR_TEMPLATE.attributes.template['@id']);
});

it('should handle discard changes with existing record in CEDAR mode', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import { AddToCollectionSteps, CollectionFilterType } from '@osf/features/collec
import { CollectionFilterEntry } from '@osf/features/collections/models/collection-filter-entry.model';
import { AddToCollectionSelectors } from '@osf/features/collections/store/add-to-collection';
import { CEDAR_CONFIG, CEDAR_VIEWER_CONFIG } from '@osf/features/metadata/constants';
import { CedarMetadataHelper } from '@osf/features/metadata/helpers';
import {
CedarEditorElement,
CedarMetadataDataTemplateJsonApi,
Expand Down Expand Up @@ -99,9 +100,14 @@ export class CollectionMetadataStepComponent {
handleDiscardChanges() {
if (this.isCedarMode()) {
const record = this.existingCedarRecord();
this.cedarFormData.set(
record?.attributes?.metadata ? (record.attributes.metadata as Record<string, unknown>) : {}
);
const template = this.cedarTemplate();
if (record?.attributes?.metadata) {
this.cedarFormData.set(record.attributes.metadata as Record<string, unknown>);
} else if (template?.attributes?.template) {
this.cedarFormData.set(CedarMetadataHelper.buildCedarSystemMetadata(template.attributes.template));
} else {
this.cedarFormData.set({});
}
const editor = this.cedarEditor()?.nativeElement;
if (editor) {
editor.instanceObject = this.cedarFormData();
Expand Down Expand Up @@ -135,20 +141,22 @@ export class CollectionMetadataStepComponent {
const template = this.cedarTemplate();
if (!editor || !template) return;

const currentMetadata = editor.currentMetadata;
const currentMetadata = editor.currentMetadata as Record<string, unknown>;
const isValid = !!editor.dataQualityReport?.isValid;

if (currentMetadata) {
this.cedarFormData.set(currentMetadata as Record<string, unknown>);
}
const systemFields = CedarMetadataHelper.buildCedarSystemMetadata(template.attributes.template);
const enrichedMetadata = { ...systemFields, ...(currentMetadata ?? {}) };

this.cedarFormData.set(enrichedMetadata);

const cedarData: CedarRecordDataBinding = {
data: currentMetadata as CedarRecordDataBinding['data'],
data: enrichedMetadata as CedarRecordDataBinding['data'],
id: template.id,
isPublished: isValid,
};

this.collectionMetadataSaved.set(true);
this.metadataSaved.emit(this.collectionMetadataForm());
this.cedarDataSaved.emit(cedarData);
this.stepChange.emit(AddToCollectionSteps.Complete);
}
Expand Down Expand Up @@ -195,19 +203,22 @@ export class CollectionMetadataStepComponent {

effect(() => {
const record = this.existingCedarRecord();
const template = this.cedarTemplate();
if (record?.attributes?.metadata) {
const metadata = record.attributes.metadata as Record<string, unknown>;
this.cedarFormData.set(metadata);
const editor = this.cedarEditor()?.nativeElement;
if (editor) editor.instanceObject = metadata;
const viewer = this.cedarViewer()?.nativeElement;
if (viewer) viewer.instanceObject = metadata;
} else if (template?.attributes?.template) {
this.cedarFormData.set(CedarMetadataHelper.buildCedarSystemMetadata(template.attributes.template));
}
});

effect(() => {
const filterEntries = this.availableFilterEntries();
if (filterEntries.length && !this.isCedarMode()) {
if (filterEntries.length) {
this.buildCollectionMetadataForm();
}
});
Expand All @@ -223,8 +234,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);
Expand All @@ -233,10 +243,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);
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ import { MockProvider } from 'ng-mocks';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ActivatedRoute } from '@angular/router';

import { CedarMetadataHelper } from '@osf/features/metadata/helpers';

import { CEDAR_METADATA_DATA_TEMPLATE_JSON_API_MOCK } from '@testing/mocks/cedar-metadata-data-template-json-api.mock';
import { provideOSFCore } from '@testing/osf.testing.provider';
import { ActivatedRouteMockBuilder } from '@testing/providers/route-provider.mock';
Expand Down Expand Up @@ -79,12 +77,19 @@ describe('CedarTemplateFormComponent', () => {
expect(emitSpy).toHaveBeenCalled();
});

it('should initialize form data with empty metadata when no existing record', () => {
it('should initialize form data with system fields and empty metadata when no existing record', () => {
fixture.componentRef.setInput('existingRecord', null);
fixture.detectChanges();

const expectedEmptyMetadata = CedarMetadataHelper.buildEmptyMetadata();
expect(component.formData()).toEqual(expectedEmptyMetadata);
const formData = component.formData();
expect(formData['@id']).toBe('');
expect(formData['schema:isBasedOn']).toBe(mockTemplate.attributes.template['@id']);
expect(formData['schema:name']).toBe('');
expect(formData['schema:description']).toBe('');
expect(formData['pav:createdBy']).toBe('');
expect(formData['oslc:modifiedBy']).toBe('');
expect(formData['pav:createdOn']).toBeDefined();
expect(formData['pav:lastUpdatedOn']).toBeDefined();
});

it('should handle cedar change event with undefined currentMetadata', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,10 @@ export class CedarTemplateFormComponent {
const structuredMetadata = CedarMetadataHelper.buildStructuredMetadata(metadata);
this.formData.set(structuredMetadata);
} else {
this.formData.set(CedarMetadataHelper.buildEmptyMetadata());
this.formData.set({
...CedarMetadataHelper.buildCedarSystemMetadata(template),
...CedarMetadataHelper.buildEmptyMetadata(),
});
}
}

Expand Down
Loading
Loading