Skip to content

Commit a4c700a

Browse files
authored
Merge pull request #1031 from CenterForOpenScience/feature/pbs-26-12
Merge Feature/pbs 26 12 into develop
2 parents 4fd907b + 7383794 commit a4c700a

115 files changed

Lines changed: 746 additions & 3860 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎src/app/features/admin-institutions/components/filters-section/filters-section.component.ts‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import { ChangeDetectionStrategy, Component, model } from '@angular/core';
99

1010
import { FilterChipsComponent } from '@osf/shared/components/filter-chips/filter-chips.component';
1111
import { SearchFiltersComponent } from '@osf/shared/components/search-filters/search-filters.component';
12-
import { DiscoverableFilter, FilterOption } from '@osf/shared/models/search/discoverable-filter.model';
12+
import { DiscoverableFilter } from '@osf/shared/models/search/discoverable-filter.model';
13+
import { FilterOptionRemoved } from '@osf/shared/models/search/filter-option-removed';
14+
import { FilterOptionSelected } from '@osf/shared/models/search/filter-option-selected.model';
15+
import { FilterOptionsSearchText } from '@osf/shared/models/search/filter-options-search-text.model';
1316
import {
1417
ClearFilterSearchResults,
1518
FetchResources,
@@ -44,7 +47,7 @@ export class FiltersSectionComponent {
4447

4548
filtersVisible = model<boolean>();
4649

47-
onSelectedFilterOptionsChanged(event: { filter: DiscoverableFilter; filterOption: FilterOption[] }): void {
50+
onSelectedFilterOptionsChanged(event: FilterOptionSelected): void {
4851
this.actions.updateSelectedFilterOption(event.filter.key, event.filterOption);
4952
this.actions.fetchResources();
5053
}
@@ -57,15 +60,15 @@ export class FiltersSectionComponent {
5760
this.actions.loadMoreFilterOptions(filter.key);
5861
}
5962

60-
onSearchFilterOptions(event: { searchText: string; filter: DiscoverableFilter }): void {
63+
onSearchFilterOptions(event: FilterOptionsSearchText): void {
6164
if (event.searchText.trim()) {
6265
this.actions.loadFilterOptionsWithSearch(event.filter.key, event.searchText);
6366
} else {
6467
this.actions.clearFilterSearchResults(event.filter.key);
6568
}
6669
}
6770

68-
onFilterChipRemoved(event: { filterKey: string; optionRemoved: FilterOption }): void {
71+
onFilterChipRemoved(event: FilterOptionRemoved): void {
6972
const updatedOptions = this.selectedFilterOptions()[event.filterKey].filter(
7073
(option) => option.value !== event.optionRemoved.value
7174
);

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,8 @@ <h1 class="collections-heading flex align-items-center">{{ collectionProvider()?
4747
[stepperActiveValue]="stepperActiveValue()"
4848
[targetStepValue]="AddToCollectionSteps.CollectionMetadata"
4949
[isDisabled]="isCollectionMetadataDisabled()"
50-
[primaryCollectionId]="primaryCollectionId()"
51-
[isCedarMode]="isCedarMode()"
5250
[cedarTemplate]="requiredMetadataTemplate()"
5351
[existingCedarRecord]="existingCedarRecord()"
54-
(metadataSaved)="handleCollectionMetadataSaved($event)"
5552
(cedarDataSaved)="handleCedarDataSaved($event)"
5653
(stepChange)="handleChangeStep($event)"
5754
/>

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

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { MockComponents, MockProvider } from 'ng-mocks';
33
import { of, Subject, throwError } from 'rxjs';
44

55
import { ComponentFixture, TestBed } from '@angular/core/testing';
6-
import { FormGroup } from '@angular/forms';
76
import { ActivatedRoute, Router } from '@angular/router';
87

98
import { UserSelectors } from '@core/store/user';
@@ -51,7 +50,6 @@ const DEFAULT_SIGNALS: SignalOverride[] = [
5150
{ selector: CollectionsSelectors.getRequiredMetadataTemplate, value: null },
5251
{ selector: ProjectsSelectors.getSelectedProject, value: MOCK_PROJECT },
5352
{ selector: UserSelectors.getCurrentUser, value: MOCK_USER },
54-
{ selector: UserSelectors.getActiveFlags, value: [] },
5553
{ selector: MetadataSelectors.getCedarRecords, value: [] },
5654
{ selector: AddToCollectionSelectors.getCurrentCollectionSubmission, value: null },
5755
];
@@ -175,16 +173,6 @@ describe('AddToCollectionComponent', () => {
175173
expect(component.projectContributorsSaved()).toBe(true);
176174
});
177175

178-
it('should handle collection metadata saved', () => {
179-
const { component } = setup();
180-
const mockForm = new FormGroup({});
181-
component.handleCollectionMetadataSaved(mockForm);
182-
183-
expect(component.collectionMetadataForm).toBe(mockForm);
184-
expect(component.collectionMetadataSaved()).toBe(true);
185-
expect(component.stepperActiveValue()).toBe(AddToCollectionSteps.Complete);
186-
});
187-
188176
it('should handle cedar data saved', () => {
189177
const { component } = setup();
190178
const mockCedarData: CedarRecordDataBinding = {
@@ -283,11 +271,10 @@ describe('AddToCollectionComponent', () => {
283271
);
284272
});
285273

286-
it('should update submission and navigate on success in edit mode', () => {
274+
it('should navigate on success in edit mode', () => {
287275
const { component, mockToastService, mockLoaderService, mockRouter } = setup({
288276
routeParams: { id: 'project-1', providerId: 'provider-1' },
289277
});
290-
vi.spyOn(component.actions, 'updateCollectionSubmission').mockReturnValue(of(void 0));
291278

292279
component.handleAddToCollection();
293280

@@ -299,11 +286,20 @@ describe('AddToCollectionComponent', () => {
299286
expect(mockRouter.navigate).toHaveBeenCalledWith(['project-1', 'overview']);
300287
});
301288

302-
it('should show error toast when update fails in edit mode', () => {
289+
it('should show error toast when saving cedar record fails in edit mode', () => {
303290
const { component, mockToastService } = setup({
304291
routeParams: { id: 'project-1', providerId: 'provider-1' },
292+
selectorOverrides: [
293+
{ selector: CollectionsSelectors.getRequiredMetadataTemplate, value: { id: 'template-123' } },
294+
],
305295
});
306-
vi.spyOn(component.actions, 'updateCollectionSubmission').mockReturnValue(throwError(() => new Error('fail')));
296+
const mockCedarData: CedarRecordDataBinding = {
297+
data: {} as CedarRecordDataBinding['data'],
298+
id: 'template-123',
299+
isPublished: false,
300+
};
301+
component.handleCedarDataSaved(mockCedarData);
302+
vi.spyOn(component.actions, 'createCedarRecord').mockReturnValue(throwError(() => new Error('fail')));
307303

308304
component.handleAddToCollection();
309305

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

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ import {
2020
signal,
2121
} from '@angular/core';
2222
import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
23-
import { FormGroup } from '@angular/forms';
2423
import { ActivatedRoute, Router, RouterLink } from '@angular/router';
2524

26-
import { ENVIRONMENT } from '@core/provider/environment.provider';
2725
import { UserSelectors } from '@core/store/user';
2826
import { CedarMetadataRecordData, CedarRecordDataBinding } from '@osf/features/metadata/models';
2927
import {
@@ -43,7 +41,6 @@ import { LoaderService } from '@osf/shared/services/loader.service';
4341
import { ToastService } from '@osf/shared/services/toast.service';
4442
import { CollectionsSelectors, GetCollectionProvider } from '@osf/shared/stores/collections';
4543
import { ProjectsSelectors, SetSelectedProject } from '@osf/shared/stores/projects';
46-
import { COLLECTION_SUBMISSION_WITH_CEDAR } from '@shared/constants/feature-flags.const';
4744

4845
import { AddToCollectionSteps } from '../../enums';
4946
import { RemoveCollectionSubmissionPayload } from '../../models/remove-collection-submission-payload.model';
@@ -53,7 +50,6 @@ import {
5350
ClearAddToCollectionState,
5451
GetCurrentCollectionSubmission,
5552
RemoveCollectionSubmission,
56-
UpdateCollectionSubmission,
5753
} from '../../store/add-to-collection';
5854

5955
import { AddToCollectionConfirmationDialogComponent } from './add-to-collection-confirmation-dialog/add-to-collection-confirmation-dialog.component';
@@ -91,22 +87,18 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
9187
private readonly headerStyleHelper = inject(HeaderStyleService);
9288
private readonly platformId = inject(PLATFORM_ID);
9389
private readonly isBrowser = isPlatformBrowser(this.platformId);
94-
private readonly environment = inject(ENVIRONMENT);
9590

9691
readonly selectedProjectId = toSignal<string | null>(
9792
this.route.params.pipe(map((params) => params['id'])) ?? of(null)
9893
);
9994

10095
readonly AddToCollectionSteps = AddToCollectionSteps;
10196

102-
collectionMetadataForm = new FormGroup({});
103-
10497
isProviderLoading = select(CollectionsSelectors.getCollectionProviderLoading);
10598
collectionProvider = select(CollectionsSelectors.getCollectionProvider);
10699
requiredMetadataTemplate = select(CollectionsSelectors.getRequiredMetadataTemplate);
107100
selectedProject = select(ProjectsSelectors.getSelectedProject);
108101
currentUser = select(UserSelectors.getCurrentUser);
109-
activeFlags = select(UserSelectors.getActiveFlags);
110102
currentCollectionSubmission = select(AddToCollectionSelectors.getCurrentCollectionSubmission);
111103
cedarRecords = select(MetadataSelectors.getCedarRecords);
112104

@@ -125,9 +117,6 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
125117
isCollectionMetadataDisabled = computed(
126118
() => !this.selectedProject() || !this.projectMetadataSaved() || !this.projectContributorsSaved()
127119
);
128-
isCedarMode = computed(
129-
() => this.activeFlags().includes(COLLECTION_SUBMISSION_WITH_CEDAR) && !!this.requiredMetadataTemplate()
130-
);
131120
existingCedarRecord = computed<CedarMetadataRecordData | null>(() => {
132121
const records = this.cedarRecords();
133122
const templateId = this.requiredMetadataTemplate()?.id;
@@ -138,7 +127,6 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
138127
readonly actions = createDispatchMap({
139128
getCollectionProvider: GetCollectionProvider,
140129
clearAddToCollectionState: ClearAddToCollectionState,
141-
updateCollectionSubmission: UpdateCollectionSubmission,
142130
deleteCollectionSubmission: RemoveCollectionSubmission,
143131
setSelectedProject: SetSelectedProject,
144132
getCurrentCollectionSubmission: GetCurrentCollectionSubmission,
@@ -195,12 +183,6 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
195183
this.projectContributorsSaved.set(true);
196184
}
197185

198-
handleCollectionMetadataSaved(form: FormGroup): void {
199-
this.collectionMetadataForm = form;
200-
this.collectionMetadataSaved.set(true);
201-
this.stepperActiveValue.set(AddToCollectionSteps.Complete);
202-
}
203-
204186
handleCedarDataSaved(data: CedarRecordDataBinding): void {
205187
this.pendingCedarData.set(data);
206188
this.collectionMetadataSaved.set(true);
@@ -212,17 +194,13 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
212194
collectionId: this.primaryCollectionId() || '',
213195
projectId: this.selectedProject()?.id || '',
214196
userId: this.currentUser()?.id || '',
215-
collectionMetadata: this.isCedarMode() ? {} : this.collectionMetadataForm.value || {},
216197
};
217198

218-
const isEditMode = this.isEditMode();
219-
220-
if (isEditMode) {
199+
if (this.isEditMode()) {
221200
this.loaderService.show();
222201

223202
this.saveCedarRecordIfNeeded()
224203
.pipe(
225-
switchMap(() => this.actions.updateCollectionSubmission(payload)),
226204
finalize(() => this.loaderService.hide()),
227205
takeUntilDestroyed(this.destroyRef)
228206
)
@@ -298,8 +276,6 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
298276
}
299277

300278
private saveCedarRecordIfNeeded(): Observable<unknown> {
301-
if (!this.isCedarMode()) return of(null);
302-
303279
const cedarData = this.pendingCedarData();
304280
const projectId = this.selectedProject()?.id;
305281
const templateId = this.requiredMetadataTemplate()?.id;
@@ -352,8 +328,7 @@ export class AddToCollectionComponent implements CanDeactivateComponent {
352328

353329
effect(() => {
354330
const projectId = this.selectedProjectId();
355-
const isCedar = this.isCedarMode();
356-
if (isCedar && projectId) {
331+
if (projectId) {
357332
this.actions.getCedarRecords(projectId, ResourceType.Project);
358333
}
359334
});

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

Lines changed: 23 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,15 @@ <h3>{{ 'collections.addToCollection.collectionMetadata' | translate }}</h3>
1111

1212
@if (!isDisabled() && !isStepActive()) {
1313
@if (collectionMetadataSaved()) {
14-
@if (isCedarMode()) {
15-
@let cedarTpl = cedarTemplate();
14+
@let cedarTpl = cedarTemplate();
1615

17-
@if (cedarTpl) {
18-
<cedar-artifact-viewer
19-
#cedarViewer
20-
[config]="cedarViewerConfig"
21-
[templateObject]="cedarTpl.attributes.template"
22-
[instanceObject]="cedarFormData()"
23-
></cedar-artifact-viewer>
24-
}
25-
} @else {
26-
@for (filterEntry of availableFilterEntries(); track filterEntry.key) {
27-
<div>
28-
<p class="font-bold">{{ filterEntry.labelKey | translate }}</p>
29-
30-
<p class="mt-2">
31-
{{ collectionMetadataForm().get(filterEntry.key)?.value }}
32-
</p>
33-
</div>
34-
}
16+
@if (cedarTpl) {
17+
<cedar-artifact-viewer
18+
#cedarViewer
19+
[config]="cedarViewerConfig"
20+
[templateObject]="cedarTpl.attributes.template"
21+
[instanceObject]="cedarFormData()"
22+
></cedar-artifact-viewer>
3523
}
3624
}
3725

@@ -48,62 +36,32 @@ <h3>{{ 'collections.addToCollection.collectionMetadata' | translate }}</h3>
4836

4937
<p-step-panel [value]="targetStepValue()" class="p-0">
5038
<ng-template #content>
51-
@if (isCedarMode()) {
52-
@let cedarTpl = cedarTemplate();
53-
54-
@if (cedarTpl) {
55-
@if (isStepActive()) {
56-
<div class="cedar-editor-container mt-3">
57-
<cedar-embeddable-editor
58-
#cedarEditor
59-
[config]="cedarConfig"
60-
[templateObject]="cedarTpl.attributes.template"
61-
[metadata]="cedarFormData()"
62-
(change)="onCedarChange($event)"
63-
(keyup)="onCedarChange($event)"
64-
></cedar-embeddable-editor>
65-
</div>
66-
}
39+
@let cedarTpl = cedarTemplate();
6740

68-
<div class="flex justify-content-end gap-3 mt-4">
69-
<p-button
70-
severity="info"
71-
[label]="'common.buttons.discardChanges' | translate"
72-
(onClick)="handleDiscardChanges()"
73-
/>
74-
<p-button [label]="'common.buttons.saveAndContinue' | translate" (onClick)="handleSaveCedarMetadata()" />
41+
@if (cedarTpl) {
42+
@if (isStepActive()) {
43+
<div class="cedar-editor-container mt-3">
44+
<cedar-embeddable-editor
45+
#cedarEditor
46+
[config]="cedarConfig"
47+
[templateObject]="cedarTpl.attributes.template"
48+
[metadata]="cedarFormData()"
49+
(change)="onCedarChange($event)"
50+
(keyup)="onCedarChange($event)"
51+
></cedar-embeddable-editor>
7552
</div>
76-
} @else {
77-
<p class="mt-3">{{ 'collections.addToCollection.cedarFormNotAvailable' | translate }}</p>
7853
}
79-
} @else {
80-
<form [formGroup]="collectionMetadataForm()" class="grid row-gap-2 mt-3">
81-
@for (filterEntry of availableFilterEntries(); track filterEntry.key) {
82-
<div class="flex flex-column gap-1 col-12 md:col-6">
83-
<label [for]="filterEntry.key">{{ filterEntry.labelKey | translate }}</label>
84-
<p-select
85-
[id]="filterEntry.key"
86-
[options]="filterEntry.options"
87-
[formControlName]="filterEntry.key"
88-
[placeholder]="filterEntry.labelKey | translate"
89-
appendTo="body"
90-
></p-select>
91-
</div>
92-
}
93-
</form>
9454

9555
<div class="flex justify-content-end gap-3 mt-4">
9656
<p-button
9757
severity="info"
9858
[label]="'common.buttons.discardChanges' | translate"
9959
(onClick)="handleDiscardChanges()"
10060
/>
101-
<p-button
102-
[label]="'common.buttons.saveAndContinue' | translate"
103-
[disabled]="!collectionMetadataForm().valid"
104-
(onClick)="handleSaveMetadata()"
105-
/>
61+
<p-button [label]="'common.buttons.saveAndContinue' | translate" (onClick)="handleSaveCedarMetadata()" />
10662
</div>
63+
} @else {
64+
<p class="mt-3">{{ 'collections.addToCollection.cedarFormNotAvailable' | translate }}</p>
10765
}
10866
</ng-template>
10967
</p-step-panel>

0 commit comments

Comments
 (0)