Skip to content

Commit 93c6466

Browse files
authored
[ENG-9802] Users unable to create a NEW CEDAR metadata template, and existing templates not able to be viewed #791
- Ticket: [ENG-9802] - Feature flag: n/a ## Summary of Changes 1. Fixed load of cedar pakcages.
1 parent 000f563 commit 93c6466

File tree

4 files changed

+67
-39
lines changed

4 files changed

+67
-39
lines changed

src/@types/cedar.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
declare module 'cedar-artifact-viewer';
2+
declare module 'cedar-embeddable-editor';

src/app/features/metadata/components/cedar-template-form/cedar-template-form.component.html

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -54,23 +54,27 @@ <h3 class="text-lg text-red-500">{{ 'project.metadata.addMetadata.notPublishedTe
5454
</div>
5555
}
5656
<div class="cedar-editor-container">
57-
@if (readonly()) {
58-
<cedar-artifact-viewer
59-
#cedarViewer
60-
[config]="cedarViewerConfig"
61-
[templateObject]="template().attributes.template"
62-
[instanceObject]="formData()"
63-
></cedar-artifact-viewer>
57+
@if (!cedarLoaded()) {
58+
<osf-loading-spinner />
6459
} @else {
65-
<cedar-embeddable-editor
66-
#cedarEditor
67-
[config]="cedarConfig"
68-
[templateObject]="template().attributes.template"
69-
[metadata]="formData()"
70-
(change)="onCedarChange($event)"
71-
(pointerover)="validateCedarMetadata()"
72-
(keyup)="onCedarChange($event)"
73-
></cedar-embeddable-editor>
60+
@if (readonly()) {
61+
<cedar-artifact-viewer
62+
#cedarViewer
63+
[config]="cedarViewerConfig"
64+
[templateObject]="template().attributes.template"
65+
[instanceObject]="formData()"
66+
></cedar-artifact-viewer>
67+
} @else {
68+
<cedar-embeddable-editor
69+
#cedarEditor
70+
[config]="cedarConfig"
71+
[templateObject]="template().attributes.template"
72+
[metadata]="formData()"
73+
(change)="onCedarChange($event)"
74+
(pointerover)="validateCedarMetadata()"
75+
(keyup)="onCedarChange($event)"
76+
></cedar-embeddable-editor>
77+
}
7478
}
7579
</div>
7680

src/app/features/metadata/components/cedar-template-form/cedar-template-form.component.spec.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
import { MockComponent } from 'ng-mocks';
2+
3+
import { PLATFORM_ID } from '@angular/core';
14
import { ComponentFixture, TestBed } from '@angular/core/testing';
25

36
import { CedarMetadataHelper } from '@osf/features/metadata/helpers';
47
import { CedarMetadataDataTemplateJsonApi } from '@osf/features/metadata/models';
8+
import { LoadingSpinnerComponent } from '@osf/shared/components/loading-spinner/loading-spinner.component';
59

610
import { CedarTemplateFormComponent } from './cedar-template-form.component';
711

@@ -16,7 +20,8 @@ describe('CedarTemplateFormComponent', () => {
1620

1721
beforeEach(async () => {
1822
await TestBed.configureTestingModule({
19-
imports: [CedarTemplateFormComponent, OSFTestingModule],
23+
imports: [CedarTemplateFormComponent, OSFTestingModule, MockComponent(LoadingSpinnerComponent)],
24+
providers: [{ provide: PLATFORM_ID, useValue: 'browser' }],
2025
}).compileComponents();
2126

2227
fixture = TestBed.createComponent(CedarTemplateFormComponent);
@@ -75,10 +80,14 @@ describe('CedarTemplateFormComponent', () => {
7580
expect(emitSpy).toHaveBeenCalled();
7681
});
7782

78-
it('should initialize form data with empty metadata when no existing record', () => {
83+
it('should initialize form data with empty metadata when no existing record', async () => {
7984
fixture.componentRef.setInput('existingRecord', null);
8085
fixture.detectChanges();
8186

87+
await (component as any).loadCedarLibraries();
88+
(component as any).initializeCedar();
89+
fixture.detectChanges();
90+
8291
const expectedEmptyMetadata = CedarMetadataHelper.buildEmptyMetadata();
8392
expect(component.formData()).toEqual(expectedEmptyMetadata);
8493
});

src/app/features/metadata/components/cedar-template-form/cedar-template-form.component.ts

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Tooltip } from 'primeng/tooltip';
66

77
import { map, of } from 'rxjs';
88

9-
import { CommonModule } from '@angular/common';
9+
import { CommonModule, isPlatformBrowser } from '@angular/common';
1010
import {
1111
ChangeDetectionStrategy,
1212
Component,
@@ -16,6 +16,7 @@ import {
1616
inject,
1717
input,
1818
output,
19+
PLATFORM_ID,
1920
signal,
2021
viewChild,
2122
ViewEncapsulation,
@@ -24,9 +25,7 @@ import { toSignal } from '@angular/core/rxjs-interop';
2425
import { ActivatedRoute } from '@angular/router';
2526

2627
import { ENVIRONMENT } from '@core/provider/environment.provider';
27-
28-
import 'cedar-artifact-viewer';
29-
import 'cedar-embeddable-editor';
28+
import { LoadingSpinnerComponent } from '@osf/shared/components/loading-spinner/loading-spinner.component';
3029

3130
import { CEDAR_CONFIG, CEDAR_VIEWER_CONFIG } from '../../constants';
3231
import { CedarMetadataHelper } from '../../helpers';
@@ -39,7 +38,7 @@ import {
3938

4039
@Component({
4140
selector: 'osf-cedar-template-form',
42-
imports: [CommonModule, Button, TranslatePipe, Tooltip, Menu],
41+
imports: [CommonModule, Button, TranslatePipe, Tooltip, Menu, LoadingSpinnerComponent],
4342
templateUrl: './cedar-template-form.component.html',
4443
styleUrl: './cedar-template-form.component.scss',
4544
schemas: [CUSTOM_ELEMENTS_SCHEMA],
@@ -66,11 +65,15 @@ export class CedarTemplateFormComponent {
6665

6766
private route = inject(ActivatedRoute);
6867
readonly environment = inject(ENVIRONMENT);
68+
private platformId = inject(PLATFORM_ID);
69+
readonly cedarLoaded = signal<boolean>(false);
6970

7071
readonly recordId = signal<string>('');
7172
readonly downloadUrl = signal<string>('');
7273
readonly schemaName = signal<string>('');
7374

75+
readonly fileGuid = toSignal(this.route.params.pipe(map((params) => params['fileGuid'])) ?? of(undefined));
76+
7477
shareItems = [
7578
{
7679
label: 'files.detail.actions.share.email',
@@ -90,15 +93,15 @@ export class CedarTemplateFormComponent {
9093
effect(() => {
9194
const tpl = this.template();
9295
if (tpl?.attributes?.template) {
93-
this.initializeCedar();
96+
this.loadCedarLibraries().then(() => this.initializeCedar());
9497
}
9598
});
9699

97100
effect(() => {
98101
const record = this.existingRecord();
99102
this.schemaName.set(record?.embeds?.template.data.attributes.schema_name || '');
100103
if (record) {
101-
this.initializeCedar();
104+
this.loadCedarLibraries().then(() => this.initializeCedar());
102105
}
103106
});
104107
}
@@ -123,7 +126,30 @@ export class CedarTemplateFormComponent {
123126
this.validateCedarMetadata();
124127
}
125128

126-
readonly fileGuid = toSignal(this.route.params.pipe(map((params) => params['fileGuid'])) ?? of(undefined));
129+
private initializeFormData(): void {
130+
const template = this.template()?.attributes?.template;
131+
if (!template) return;
132+
const metadata = this.existingRecord()?.attributes?.metadata;
133+
if (this.existingRecord()) {
134+
const structuredMetadata = CedarMetadataHelper.buildStructuredMetadata(metadata);
135+
this.formData.set(structuredMetadata);
136+
} else {
137+
this.formData.set(CedarMetadataHelper.buildEmptyMetadata());
138+
}
139+
}
140+
141+
private async loadCedarLibraries(): Promise<void> {
142+
if (!isPlatformBrowser(this.platformId) || this.cedarLoaded()) {
143+
return;
144+
}
145+
146+
try {
147+
await Promise.all([import('cedar-artifact-viewer'), import('cedar-embeddable-editor')]);
148+
this.cedarLoaded.set(true);
149+
} catch {
150+
this.cedarLoaded.set(false);
151+
}
152+
}
127153

128154
downloadMetadadaRecord() {
129155
if (this.fileGuid()) {
@@ -173,19 +199,6 @@ export class CedarTemplateFormComponent {
173199
this.emitData.emit(finalData as CedarRecordDataBinding);
174200
}
175201
}
176-
177-
private initializeFormData(): void {
178-
const template = this.template()?.attributes?.template;
179-
if (!template) return;
180-
const metadata = this.existingRecord()?.attributes?.metadata;
181-
if (this.existingRecord()) {
182-
const structuredMetadata = CedarMetadataHelper.buildStructuredMetadata(metadata);
183-
this.formData.set(structuredMetadata);
184-
} else {
185-
this.formData.set(CedarMetadataHelper.buildEmptyMetadata());
186-
}
187-
}
188-
189202
handleEmailShare(): void {
190203
const url = window.location.href;
191204
window.location.href = `mailto:?subject=${this.schemaName()}&body=${url}`;

0 commit comments

Comments
 (0)