Skip to content

Commit 6fd8c17

Browse files
authored
Merge pull request DSpace#5412 from LA-Referencia-Lyrasis-Project/fix-cms-edit-metadata
Fix CMS metadata editor language field saving
2 parents 77a8984 + 04676ef commit 6fd8c17

File tree

2 files changed

+75
-38
lines changed

2 files changed

+75
-38
lines changed

src/app/admin/admin-edit-cms-metadata/admin-edit-cms-metadata.component.spec.ts

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { provideNoopAnimations } from '@angular/platform-browser/animations';
1010
import { NotificationsService } from '@dspace/core/notification-system/notifications.service';
1111
import { NotificationsServiceStub } from '@dspace/core/testing/notifications-service.stub';
1212
import { TranslateLoaderMock } from '@dspace/core/testing/translate-loader.mock';
13+
import { createSuccessfulRemoteDataObject$ } from '@dspace/core/utilities/remote-data.utils';
1314
import {
1415
TranslateLoader,
1516
TranslateModule,
@@ -26,11 +27,12 @@ describe('AdminEditCmsMetadataComponent', () => {
2627
let component: AdminEditCmsMetadataComponent;
2728
let fixture: ComponentFixture<AdminEditCmsMetadataComponent>;
2829
const site = Object.assign(new Site(), {
29-
metadata: { },
30+
metadata: {},
3031
});
3132

3233
const siteServiceStub = jasmine.createSpyObj('SiteDataService', {
3334
find: jasmine.createSpy('find'),
35+
findByHref: jasmine.createSpy('findByHref'),
3436
patch: jasmine.createSpy('patch'),
3537
});
3638

@@ -70,6 +72,7 @@ describe('AdminEditCmsMetadataComponent', () => {
7072
fixture = TestBed.createComponent(AdminEditCmsMetadataComponent);
7173
component = fixture.componentInstance;
7274
siteServiceStub.find.and.returnValue(of(site));
75+
siteServiceStub.findByHref.and.returnValue(createSuccessfulRemoteDataObject$(site));
7376
siteServiceStub.patch.and.returnValue(of(site));
7477
});
7578

@@ -131,28 +134,29 @@ describe('AdminEditCmsMetadataComponent', () => {
131134

132135
it('should call method patch of service', () => {
133136
component.selectedMetadata = environment.cms.metadataList[0];
134-
const saveButton = fixture.debugElement.query(By.css('#save-metadata-btn'));
135-
saveButton.nativeElement.click();
137+
component.site = site;
138+
component.selectedMetadataValues.set(environment.languages[0].code, 'Test English Text');
139+
component.selectedMetadataValues.set(environment.languages[1].code, 'Test Second Language Text');
140+
component.saveMetadata();
141+
136142
const operations = [];
137-
operations.push({
138-
op: 'replace',
139-
path: '/metadata/' + component.selectedMetadata,
140-
value: {
141-
value: component.selectedMetadataValues.get(environment.languages[0].code),
142-
language: environment.languages[0].code,
143-
},
144-
});
145-
component.selectedMetadataValues.forEach((value, key) => {
146-
if (key !== environment.languages[0].code) {
147-
operations.push({
148-
op: 'add',
149-
path: '/metadata/' + component.selectedMetadata,
150-
value: {
151-
value: value,
152-
language: key,
153-
},
154-
});
155-
}
143+
if (site.hasMetadata && site.hasMetadata(component.selectedMetadata)) {
144+
operations.push({
145+
op: 'remove',
146+
path: '/metadata/' + component.selectedMetadata,
147+
});
148+
}
149+
const nonEmptyValues = Array.from(component.selectedMetadataValues.entries())
150+
.filter(([, text]) => text && text.trim().length > 0);
151+
nonEmptyValues.forEach(([language, value]) => {
152+
operations.push({
153+
op: 'add',
154+
path: '/metadata/' + component.selectedMetadata + '/-',
155+
value: {
156+
value,
157+
language,
158+
},
159+
});
156160
});
157161
expect(siteServiceStub.patch).toHaveBeenCalledWith(site, operations);
158162
});

src/app/admin/admin-edit-cms-metadata/admin-edit-cms-metadata.component.ts

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,7 @@ export class AdminEditCmsMetadataComponent implements OnInit {
8484
}
8585
this.metadataList.push(md);
8686
});
87-
this.siteService.find().subscribe((site) => {
88-
this.site = site;
89-
});
87+
this.refreshSiteWithAllLanguages();
9088
}
9189

9290
/**
@@ -106,12 +104,25 @@ export class AdminEditCmsMetadataComponent implements OnInit {
106104
this.notificationsService.error(this.translateService.get('admin.edit-cms-metadata.error'));
107105
}
108106
this.siteService.setStale();
109-
this.siteService.find().subscribe((site) => {
110-
this.site = site;
111-
});
107+
this.refreshSiteWithAllLanguages();
112108
});
113109
}
114110

111+
/**
112+
* Reload site metadata including all language variants.
113+
*/
114+
private refreshSiteWithAllLanguages() {
115+
this.siteService.find().subscribe((site) => {
116+
this.siteService.findByHref(`${site.self}?projection=allLanguages`, false, true).pipe(
117+
getFirstCompletedRemoteData(),
118+
).subscribe((response) => {
119+
if (response?.hasSucceeded) {
120+
this.site = response.payload;
121+
}
122+
});
123+
});
124+
}
125+
115126
/**
116127
* Reset metadata selection and go back to the select options
117128
*/
@@ -147,16 +158,38 @@ export class AdminEditCmsMetadataComponent implements OnInit {
147158
* @returns List of operations to send to backend to edit selected metadata
148159
*/
149160
private getOperationsToEditText(): Operation[] {
150-
const entries = Array.from(this.selectedMetadataValues.entries());
161+
const operations: Operation[] = [];
162+
const nonEmptyValues = Array.from(this.selectedMetadataValues.entries())
163+
.filter(([, text]) => text && text.trim().length > 0);
164+
165+
if (nonEmptyValues.length === 0) {
166+
if (this.site.hasMetadata(this.selectedMetadata)) {
167+
operations.push({
168+
op: 'remove',
169+
path: `/metadata/${this.selectedMetadata}`,
170+
});
171+
}
172+
return operations;
173+
}
174+
175+
if (this.site.hasMetadata(this.selectedMetadata)) {
176+
operations.push({
177+
op: 'remove',
178+
path: `/metadata/${this.selectedMetadata}`,
179+
});
180+
}
181+
182+
nonEmptyValues.forEach(([language, text]) => {
183+
operations.push({
184+
op: 'add',
185+
path: `/metadata/${this.selectedMetadata}/-`,
186+
value: {
187+
value: text,
188+
language,
189+
},
190+
});
191+
});
151192

152-
// First entry should form a 'replace' operation, then the rest should be an 'add' operation
153-
return entries.map(([language, text], index) => ({
154-
op: index === 0 ? 'replace' : 'add',
155-
path: `/metadata/${this.selectedMetadata}`,
156-
value: {
157-
value: text ?? '',
158-
language: language,
159-
},
160-
}));
193+
return operations;
161194
}
162195
}

0 commit comments

Comments
 (0)