Skip to content

Commit b86b57e

Browse files
committed
Revert "Merge pull request #988 from Vlad0n20/feat/ENG-9827"
This reverts commit d198ac4, reversing changes made to d67e972.
1 parent ab21476 commit b86b57e

19 files changed

Lines changed: 637 additions & 973 deletions

src/app/features/collections/components/add-to-collection/add-to-collection.component.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ <h1 class="collections-heading flex align-items-center">{{ collectionProvider()?
4848
[targetStepValue]="AddToCollectionSteps.CollectionMetadata"
4949
[isDisabled]="isCollectionMetadataDisabled()"
5050
[primaryCollectionId]="primaryCollectionId()"
51+
[isCedarMode]="isCedarMode()"
52+
[cedarTemplate]="requiredMetadataTemplate()"
53+
[existingCedarRecord]="existingCedarRecord()"
5154
(metadataSaved)="handleCollectionMetadataSaved($event)"
55+
(cedarDataSaved)="handleCedarDataSaved($event)"
5256
(stepChange)="handleChangeStep($event)"
5357
/>
5458
</p-stepper>

src/app/features/collections/components/add-to-collection/add-to-collection.component.spec.ts

Lines changed: 85 additions & 319 deletions
Large diffs are not rendered by default.

src/app/features/collections/components/add-to-collection/add-to-collection.component.ts

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,18 @@ import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
2323
import { FormGroup } from '@angular/forms';
2424
import { ActivatedRoute, Router, RouterLink } from '@angular/router';
2525

26+
import { ENVIRONMENT } from '@core/provider/environment.provider';
2627
import { UserSelectors } from '@core/store/user';
28+
import { CedarMetadataRecordData, CedarRecordDataBinding } from '@osf/features/metadata/models';
29+
import {
30+
CreateCedarMetadataRecord,
31+
GetCedarMetadataRecords,
32+
MetadataSelectors,
33+
UpdateCedarMetadataRecord,
34+
} from '@osf/features/metadata/store';
2735
import { LoadingSpinnerComponent } from '@osf/shared/components/loading-spinner/loading-spinner.component';
2836
import { CollectionSubmissionReviewState } from '@osf/shared/enums/collection-submission-review-state.enum';
37+
import { ResourceType } from '@osf/shared/enums/resource-type.enum';
2938
import { CanDeactivateComponent } from '@osf/shared/models/can-deactivate.interface';
3039
import { BrandService } from '@osf/shared/services/brand.service';
3140
import { CustomDialogService } from '@osf/shared/services/custom-dialog.service';
@@ -81,6 +90,7 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
8190
private readonly headerStyleHelper = inject(HeaderStyleService);
8291
private readonly platformId = inject(PLATFORM_ID);
8392
private readonly isBrowser = isPlatformBrowser(this.platformId);
93+
private readonly environment = inject(ENVIRONMENT);
8494

8595
readonly selectedProjectId = toSignal<string | null>(
8696
this.route.params.pipe(map((params) => params['id'])) ?? of(null)
@@ -92,15 +102,18 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
92102

93103
isProviderLoading = select(CollectionsSelectors.getCollectionProviderLoading);
94104
collectionProvider = select(CollectionsSelectors.getCollectionProvider);
105+
requiredMetadataTemplate = select(CollectionsSelectors.getRequiredMetadataTemplate);
95106
selectedProject = select(ProjectsSelectors.getSelectedProject);
96107
currentUser = select(UserSelectors.getCurrentUser);
97108
currentCollectionSubmission = select(AddToCollectionSelectors.getCurrentCollectionSubmission);
109+
cedarRecords = select(MetadataSelectors.getCedarRecords);
98110

99111
providerId = signal<string>('');
100112
allowNavigation = signal<boolean>(false);
101113
projectMetadataSaved = signal<boolean>(false);
102114
projectContributorsSaved = signal<boolean>(false);
103115
collectionMetadataSaved = signal<boolean>(false);
116+
pendingCedarData = signal<CedarRecordDataBinding | null>(null);
104117
stepperActiveValue = signal<number>(AddToCollectionSteps.SelectProject);
105118

106119
primaryCollectionId = computed(() => this.collectionProvider()?.primaryCollection?.id);
@@ -110,6 +123,13 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
110123
isCollectionMetadataDisabled = computed(
111124
() => !this.selectedProject() || !this.projectMetadataSaved() || !this.projectContributorsSaved()
112125
);
126+
isCedarMode = computed(() => this.environment.collectionSubmissionWithCedar && !!this.requiredMetadataTemplate());
127+
existingCedarRecord = computed<CedarMetadataRecordData | null>(() => {
128+
const records = this.cedarRecords();
129+
const templateId = this.requiredMetadataTemplate()?.id;
130+
if (!records?.length || !templateId) return null;
131+
return records.find((r) => r.relationships?.template?.data?.id === templateId) ?? null;
132+
});
113133

114134
readonly actions = createDispatchMap({
115135
getCollectionProvider: GetCollectionProvider,
@@ -118,6 +138,9 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
118138
deleteCollectionSubmission: RemoveCollectionSubmission,
119139
setSelectedProject: SetSelectedProject,
120140
getCurrentCollectionSubmission: GetCurrentCollectionSubmission,
141+
getCedarRecords: GetCedarMetadataRecords,
142+
createCedarRecord: CreateCedarMetadataRecord,
143+
updateCedarRecord: UpdateCedarMetadataRecord,
121144
});
122145

123146
showRemoveButton = computed(
@@ -174,20 +197,29 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
174197
this.stepperActiveValue.set(AddToCollectionSteps.Complete);
175198
}
176199

200+
handleCedarDataSaved(data: CedarRecordDataBinding): void {
201+
this.pendingCedarData.set(data);
202+
this.collectionMetadataSaved.set(true);
203+
this.stepperActiveValue.set(AddToCollectionSteps.Complete);
204+
}
205+
177206
handleAddToCollection() {
178207
const payload = {
179208
collectionId: this.primaryCollectionId() || '',
180209
projectId: this.selectedProject()?.id || '',
181-
collectionMetadata: this.collectionMetadataForm.value || {},
210+
collectionMetadata: this.isCedarMode() ? {} : this.collectionMetadataForm.value || {},
182211
userId: this.currentUser()?.id || '',
183212
};
184213

185-
if (this.isEditMode()) {
214+
const isEditMode = this.isEditMode();
215+
216+
if (isEditMode) {
186217
this.loaderService.show();
187218

188219
this.actions
189220
.updateCollectionSubmission(payload)
190221
.pipe(
222+
switchMap(() => this.saveCedarRecordIfNeeded()),
191223
finalize(() => this.loaderService.hide()),
192224
takeUntilDestroyed(this.destroyRef)
193225
)
@@ -210,6 +242,7 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
210242
})
211243
.onClose.pipe(
212244
filter((res) => !!res),
245+
switchMap(() => this.saveCedarRecordIfNeeded()),
213246
takeUntilDestroyed(this.destroyRef)
214247
)
215248
.subscribe({
@@ -245,21 +278,35 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
245278
collectionId,
246279
comment: res?.comment || '',
247280
};
248-
this.loaderService.show();
281+
249282
return this.actions.deleteCollectionSubmission(payload);
250283
}),
251-
finalize(() => this.loaderService.hide()),
252284
takeUntilDestroyed(this.destroyRef)
253285
)
254286
.subscribe({
255287
next: () => {
256288
this.toastService.showSuccess('collections.removeDialog.success');
289+
this.loaderService.show();
257290
this.allowNavigation.set(true);
258291
this.router.navigate([projectId, 'overview']);
259292
},
260293
});
261294
}
262295

296+
private saveCedarRecordIfNeeded(): Observable<unknown> {
297+
if (!this.isCedarMode()) return of(null);
298+
299+
const cedarData = this.pendingCedarData();
300+
const projectId = this.selectedProject()?.id;
301+
const templateId = this.requiredMetadataTemplate()?.id;
302+
if (!cedarData || !projectId || !templateId) return of(null);
303+
304+
const existingId = this.existingCedarRecord()?.id;
305+
return existingId
306+
? this.actions.updateCedarRecord(cedarData, existingId, projectId, ResourceType.Project)
307+
: this.actions.createCedarRecord(cedarData, projectId, ResourceType.Project);
308+
}
309+
263310
private initializeProvider(): void {
264311
const id = this.route.snapshot.paramMap.get('providerId');
265312
if (!id) {
@@ -298,6 +345,14 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
298345
this.actions.setSelectedProject(submission.project);
299346
}
300347
});
348+
349+
effect(() => {
350+
const projectId = this.selectedProjectId();
351+
const isCedar = this.isCedarMode();
352+
if (isCedar && projectId) {
353+
this.actions.getCedarRecords(projectId, ResourceType.Project);
354+
}
355+
});
301356
}
302357

303358
private setupCleanup() {

src/app/features/collections/components/add-to-collection/collection-metadata-step/collection-metadata-step.component.html

Lines changed: 68 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,25 @@ <h3>{{ 'collections.addToCollection.collectionMetadata' | translate }}</h3>
1111

1212
@if (!isDisabled() && stepperActiveValue() !== targetStepValue()) {
1313
@if (collectionMetadataSaved()) {
14-
@for (filterEntry of availableFilterEntries(); track filterEntry.key) {
15-
<div>
16-
<p class="font-bold">{{ filterEntry.labelKey | translate }}</p>
14+
@if (isCedarMode()) {
15+
@if (cedarTemplate()) {
16+
<cedar-artifact-viewer
17+
#cedarViewer
18+
[config]="cedarViewerConfig"
19+
[templateObject]="cedarTemplate()!.attributes.template"
20+
[instanceObject]="cedarFormData()"
21+
></cedar-artifact-viewer>
22+
}
23+
} @else {
24+
@for (filterEntry of availableFilterEntries(); track filterEntry.key) {
25+
<div>
26+
<p class="font-bold">{{ filterEntry.labelKey | translate }}</p>
1727

18-
<p class="mt-2">
19-
{{ collectionMetadataForm().get(filterEntry.key)?.value }}
20-
</p>
21-
</div>
28+
<p class="mt-2">
29+
{{ collectionMetadataForm().get(filterEntry.key)?.value }}
30+
</p>
31+
</div>
32+
}
2233
}
2334
}
2435

@@ -35,33 +46,59 @@ <h3>{{ 'collections.addToCollection.collectionMetadata' | translate }}</h3>
3546

3647
<p-step-panel [value]="targetStepValue()" class="p-0">
3748
<ng-template class="m-0" #content let-activateCallback="activateCallback">
38-
<form [formGroup]="collectionMetadataForm()" class="grid row-gap-2 mt-3">
39-
@for (filterEntry of availableFilterEntries(); track filterEntry.key) {
40-
<div class="flex flex-column gap-1 col-12 md:col-6">
41-
<label [for]="filterEntry.key">{{ filterEntry.labelKey | translate }}</label>
42-
<p-select
43-
[id]="filterEntry.key"
44-
[options]="filterEntry.options"
45-
[formControlName]="filterEntry.key"
46-
[placeholder]="filterEntry.labelKey | translate"
47-
appendTo="body"
48-
></p-select>
49+
@if (isCedarMode()) {
50+
@if (cedarTemplate()) {
51+
<div class="cedar-editor-container mt-3">
52+
<cedar-embeddable-editor
53+
#cedarEditor
54+
[config]="cedarConfig"
55+
[templateObject]="cedarTemplate()!.attributes.template"
56+
[metadata]="cedarFormData()"
57+
(change)="onCedarChange($event)"
58+
(keyup)="onCedarChange($event)"
59+
></cedar-embeddable-editor>
4960
</div>
61+
62+
<div class="flex justify-content-end gap-3 mt-4">
63+
<p-button
64+
severity="info"
65+
[label]="'common.buttons.discardChanges' | translate"
66+
(onClick)="handleDiscardChanges()"
67+
/>
68+
<p-button [label]="'common.buttons.saveAndContinue' | translate" (onClick)="handleSaveCedarMetadata()" />
69+
</div>
70+
} @else {
71+
<p class="mt-3">{{ 'collections.addToCollection.cedarFormNotAvailable' | translate }}</p>
5072
}
51-
</form>
73+
} @else {
74+
<form [formGroup]="collectionMetadataForm()" class="grid row-gap-2 mt-3">
75+
@for (filterEntry of availableFilterEntries(); track filterEntry.key) {
76+
<div class="flex flex-column gap-1 col-12 md:col-6">
77+
<label [for]="filterEntry.key">{{ filterEntry.labelKey | translate }}</label>
78+
<p-select
79+
[id]="filterEntry.key"
80+
[options]="filterEntry.options"
81+
[formControlName]="filterEntry.key"
82+
[placeholder]="filterEntry.labelKey | translate"
83+
appendTo="body"
84+
></p-select>
85+
</div>
86+
}
87+
</form>
5288

53-
<div class="flex justify-content-end gap-3 mt-4">
54-
<p-button
55-
severity="info"
56-
[label]="'common.buttons.discardChanges' | translate"
57-
(onClick)="handleDiscardChanges()"
58-
/>
59-
<p-button
60-
[label]="'common.buttons.saveAndContinue' | translate"
61-
[disabled]="!collectionMetadataForm().valid"
62-
(onClick)="handleSaveMetadata()"
63-
/>
64-
</div>
89+
<div class="flex justify-content-end gap-3 mt-4">
90+
<p-button
91+
severity="info"
92+
[label]="'common.buttons.discardChanges' | translate"
93+
(onClick)="handleDiscardChanges()"
94+
/>
95+
<p-button
96+
[label]="'common.buttons.saveAndContinue' | translate"
97+
[disabled]="!collectionMetadataForm().valid"
98+
(onClick)="handleSaveMetadata()"
99+
/>
100+
</div>
101+
}
65102
</ng-template>
66103
</p-step-panel>
67104
</p-step-item>

0 commit comments

Comments
 (0)