Skip to content

Commit 258d539

Browse files
feat(metadata): cedar metadata
1 parent e105fa6 commit 258d539

20 files changed

Lines changed: 316 additions & 257 deletions

File tree

angular.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"allowedCommonJsDependencies": [
2828
"qrcode",
2929
"cedar-embeddable-editor",
30+
"cedar-artifact-viewer",
3031
"markdown-it-video",
3132
"ace-builds/src-noconflict/ext-language_tools"
3233
],

package-lock.json

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"@ngxs/store": "^19.0.0",
4646
"@primeng/themes": "^19.0.9",
4747
"ace-builds": "^1.42.0",
48+
"cedar-artifact-viewer": "^0.9.5",
4849
"cedar-embeddable-editor": "^1.5.0",
4950
"chart.js": "^4.4.9",
5051
"diff": "^8.0.2",

src/app/features/metadata/constants/cedar-config.const.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,13 @@ export const CEDAR_CONFIG = {
1515
strictValidation: false,
1616
autoInitializeFields: true,
1717
};
18+
19+
export const CEDAR_VIEWER_CONFIG = {
20+
showHeader: false,
21+
showFooter: false,
22+
expandedSampleTemplateLinks: false,
23+
showSampleTemplateLinks: false,
24+
defaultLanguage: 'en',
25+
showTemplateData: false,
26+
showInstanceData: false,
27+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { CedarMetadataRecord, CedarRecordDataBinding } from '../models';
2+
3+
export class CedarRecordsMapper {
4+
static toCedarRecordsPayload(
5+
data: CedarRecordDataBinding,
6+
resourceId: string,
7+
resourceType: string
8+
): CedarMetadataRecord {
9+
return {
10+
data: {
11+
type: 'cedar_metadata_records',
12+
attributes: {
13+
metadata: data.data,
14+
is_published: data.isPublished,
15+
},
16+
relationships: {
17+
template: {
18+
data: {
19+
type: 'cedar-metadata-templates',
20+
id: data.id,
21+
},
22+
},
23+
target: {
24+
data: {
25+
type: resourceType,
26+
id: resourceId,
27+
},
28+
},
29+
},
30+
},
31+
};
32+
}
33+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
export * from './cedar-records.mapper';
12
export * from './metadata.mapper';

src/app/features/metadata/metadata.component.ts

Lines changed: 48 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
OnInit,
1717
signal,
1818
} from '@angular/core';
19-
import { toSignal } from '@angular/core/rxjs-interop';
19+
import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
2020
import { ActivatedRoute, Router } from '@angular/router';
2121

2222
import { MetadataTabsComponent, SubHeaderComponent } from '@osf/shared/components';
@@ -49,16 +49,15 @@ import {
4949
UpdateResourceSubjects,
5050
} from '@osf/shared/stores';
5151

52+
import { CedarMetadataDataTemplateJsonApi, CedarMetadataRecordData, CedarRecordDataBinding } from './models';
5253
import {
53-
CedarMetadataDataTemplateJsonApi,
54-
CedarMetadataRecord,
55-
CedarMetadataRecordData,
56-
CedarRecordDataBinding,
57-
} from './models';
58-
import {
54+
CreateCedarMetadataRecord,
55+
GetCedarMetadataRecords,
56+
GetCedarMetadataTemplates,
5957
GetCustomItemMetadata,
6058
GetResourceMetadata,
6159
MetadataSelectors,
60+
UpdateCedarMetadataRecord,
6261
UpdateCustomItemMetadata,
6362
UpdateResourceDetails,
6463
UpdateResourceLicense,
@@ -131,11 +130,10 @@ export class MetadataComponent implements OnInit {
131130
updateResourceInstitutions: UpdateResourceInstitutions,
132131
fetchResourceInstitutions: FetchResourceInstitutions,
133132

134-
// getUserInstitutions: GetUserInstitutions,
135-
// getCedarRecords: GetCedarMetadataRecords,
136-
// getCedarTemplates: GetCedarMetadataTemplates,
137-
// createCedarRecord: CreateCedarMetadataRecord,
138-
// updateCedarRecord: UpdateCedarMetadataRecord,
133+
getCedarRecords: GetCedarMetadataRecords,
134+
getCedarTemplates: GetCedarMetadataTemplates,
135+
createCedarRecord: CreateCedarMetadataRecord,
136+
updateCedarRecord: UpdateCedarMetadataRecord,
139137

140138
fetchSubjects: FetchSubjects,
141139
fetchSelectedSubjects: FetchSelectedSubjects,
@@ -214,13 +212,9 @@ export class MetadataComponent implements OnInit {
214212
this.actions.getCustomItemMetadata(this.resourceId);
215213
this.actions.getContributors(this.resourceId, this.resourceType());
216214
this.actions.fetchResourceInstitutions(this.resourceId, this.resourceType());
217-
// this.actions.getCedarRecords(this.resourceId);
218-
// this.actions.getCedarTemplates();
215+
this.actions.getCedarRecords(this.resourceId, this.resourceType());
216+
this.actions.getCedarTemplates();
219217
this.actions.fetchSelectedSubjects(this.resourceId, this.resourceType());
220-
// const user = this.currentUser();
221-
// if (user?.id) {
222-
// this.actions.getUserInstitutions(user.id);
223-
// }
224218
}
225219
}
226220
onTabChange(tabId: string | number): void {
@@ -259,41 +253,17 @@ export class MetadataComponent implements OnInit {
259253

260254
if (!this.resourceId || !selectedRecord) return;
261255

262-
const model = {
263-
data: {
264-
type: 'cedar_metadata_records' as const,
265-
attributes: {
266-
metadata: data.data,
267-
is_published: false,
268-
},
269-
relationships: {
270-
template: {
271-
data: {
272-
type: 'cedar-metadata-templates' as const,
273-
id: data.id,
274-
},
275-
},
276-
target: {
277-
data: {
278-
type: 'nodes' as const,
279-
id: this.resourceId,
280-
},
281-
},
282-
},
283-
},
284-
} as CedarMetadataRecord;
285-
286256
if (selectedRecord.id) {
287-
// this.actions
288-
// .updateCedarRecord(model, selectedRecord.id)
289-
// .pipe(takeUntilDestroyed(this.destroyRef))
290-
// .subscribe({
291-
// next: () => {
292-
// this.cedarFormReadonly.set(true);
293-
// this.toastService.showSuccess('CEDAR record updated successfully');
294-
// this.actions.getCedarRecords(projectId);
295-
// },
296-
// });
257+
this.actions
258+
.updateCedarRecord(data, selectedRecord.id, this.resourceId, this.resourceType())
259+
.pipe(takeUntilDestroyed(this.destroyRef))
260+
.subscribe({
261+
next: () => {
262+
this.cedarFormReadonly.set(true);
263+
this.toastService.showSuccess('CEDAR record updated successfully');
264+
this.actions.getCedarRecords(this.resourceId, this.resourceType());
265+
},
266+
});
297267
}
298268
}
299269

@@ -302,7 +272,7 @@ export class MetadataComponent implements OnInit {
302272
}
303273

304274
openAddRecord(): void {
305-
this.router.navigate(['add'], { relativeTo: this.activeRoute });
275+
this.router.navigate(['../add'], { relativeTo: this.activeRoute });
306276
}
307277

308278
onTagsChanged(tags: string[]): void {
@@ -541,30 +511,31 @@ export class MetadataComponent implements OnInit {
541511
}
542512

543513
private loadCedarRecord(recordId: string): void {
544-
// const records = this.cedarRecords();
545-
// const templates = this.cedarTemplates();
546-
// if (!records) {
547-
// return;
548-
// }
549-
// const record = records.find((r) => r.id === recordId);
550-
// if (!record) {
551-
// return;
552-
// }
553-
// this.selectedCedarRecord.set(record);
554-
// this.cedarFormReadonly.set(true);
555-
// const templateId = record.relationships?.template?.data?.id;
556-
// if (templateId && templates?.data) {
557-
// const template = templates.data.find((t) => t.id === templateId);
558-
// if (template) {
559-
// this.selectedCedarTemplate.set(template);
560-
// } else {
561-
// this.selectedCedarTemplate.set(null);
562-
// this.actions.getCedarTemplates();
563-
// }
564-
// } else {
565-
// this.selectedCedarTemplate.set(null);
566-
// this.actions.getCedarTemplates();
567-
// }
514+
const records = this.cedarRecords();
515+
const templates = this.cedarTemplates();
516+
if (!records) {
517+
return;
518+
}
519+
const record = records.find((r) => r.id === recordId);
520+
if (!record) {
521+
return;
522+
}
523+
this.selectedCedarRecord.set(record);
524+
this.cedarFormReadonly.set(true);
525+
const templateId = record.relationships?.template?.data?.id;
526+
console.log('templateId:', templateId);
527+
if (templateId && templates?.data) {
528+
const template = templates.data.find((t) => t.id === templateId);
529+
if (template) {
530+
this.selectedCedarTemplate.set(template);
531+
} else {
532+
this.selectedCedarTemplate.set(null);
533+
this.actions.getCedarTemplates();
534+
}
535+
} else {
536+
this.selectedCedarTemplate.set(null);
537+
this.actions.getCedarTemplates();
538+
}
568539
}
569540

570541
private handleRouteBasedTabSelection(): void {

src/app/features/metadata/models/cedar-metadata-template.model.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ export interface CedarMetadataRecord {
189189
export interface CedarRecordDataBinding {
190190
data: CedarMetadataAttributes;
191191
id: string;
192+
isPublished: boolean;
192193
}
193194

194195
export interface CedarMetadataRecordJsonApi {
@@ -221,7 +222,7 @@ export interface CedarMetadataRecordData {
221222
};
222223
target: {
223224
data: {
224-
type: 'nodes' | 'registrations';
225+
type: string;
225226
id: string;
226227
};
227228
};

src/app/features/metadata/pages/add-metadata/add-metadata.component.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ <h2>{{ meta.attributes.template.title }}</h2>
7272
</section>
7373
}
7474
} @else {
75+
<p-button (click)="toggleEditMode()" class="cursor-pointer text-blue-600 underline mb-3">toggle</p-button>
76+
7577
<osf-cedar-template-form
7678
(editMode)="toggleEditMode()"
7779
(emitData)="createRecordMetadata($event)"

0 commit comments

Comments
 (0)