Skip to content

Commit b20b47c

Browse files
authored
Merge pull request DSpace#5106 from Dawnkai/CRIS-MERGER-11751
[DSpace-CRIS] Port CMS edit and User Agreement edit from DSpace CRIS
2 parents efaf437 + 24c9860 commit b20b47c

File tree

79 files changed

+4801
-195
lines changed

Some content is hidden

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

79 files changed

+4801
-195
lines changed

config/config.example.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,8 @@ communityList:
387387
pageSize: 20
388388

389389
homePage:
390+
# Whether to show the top footer section or not
391+
showTopFooter: false
390392
recentSubmissions:
391393
# The number of item showing in recent submission components
392394
pageSize: 5
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
@if (editMode | async) {
2+
<ng-container *ngTemplateOutlet="editMetadataTemplate"></ng-container>
3+
}
4+
@else {
5+
<ng-container *ngTemplateOutlet="selectMetadataTemplate"></ng-container>
6+
}
7+
8+
<ng-template #selectMetadataTemplate>
9+
<div class="container">
10+
<h3 class="mb-4">{{'menu.section.cms.edit.metadata.head' | translate}}</h3>
11+
<div class="input-group">
12+
<select class="form-control col-md-4 mr-3 mb-2" aria-label="Select metadata" [(ngModel)]="selectedMetadata">
13+
<option [ngValue]="undefined" disabled selected>{{'admin.edit-cms-metadata.select-metadata' | translate}}</option>
14+
@for (md of metadataList; track $index) {
15+
<option [value]="md">{{md}}</option>
16+
}
17+
</select>
18+
<span class="input-group-btn">
19+
<button id="edit-metadata-btn" class="btn btn-primary" (click)="editSelectedMetadata()" [dsBtnDisabled]="!selectedMetadata">
20+
<i class="fas fa-edit mr-1"></i>
21+
{{'admin.edit-cms-metadata.edit-button' | translate}}
22+
</button>
23+
</span>
24+
</div>
25+
</div>
26+
</ng-template>
27+
28+
29+
<ng-template #editMetadataTemplate>
30+
<div class="container">
31+
<h2 class=" mb-5">{{'admin.edit-cms-metadata.title' | translate}} '{{selectedMetadata}}'</h2>
32+
<ds-alert [type]="'alert-info'" [dismissible]="true" [content]="'admin.edit-cms-metadata.markdown' | translate"></ds-alert>
33+
<div class="row">
34+
<div class="col-md">
35+
@for (lang of (languageMap | keyvalue); track lang.key) {
36+
<div class="form-group">
37+
<label>{{languageLabel(lang.value)}}</label>
38+
<textarea class="col-md-12 m-2" [ngModel]="selectedMetadataValues.get(lang.key)" (ngModelChange)="selectedMetadataValues.set(lang.key, $event)" rows="10"></textarea>
39+
</div>
40+
}
41+
</div>
42+
</div>
43+
<ng-container *ngTemplateOutlet="editMetadataButtonsTemplate"></ng-container>
44+
</div>
45+
</ng-template>
46+
47+
48+
<ng-template #editMetadataButtonsTemplate>
49+
<div class="row">
50+
<div class="col-md">
51+
<button id="save-metadata-btn" class="btn btn-primary float-right m-2" (click)="saveMetadata()">
52+
<span>
53+
<i class="fas fa-save mr-1"></i>
54+
{{ 'admin.edit-cms-metadata.save-button' | translate }}
55+
</span>
56+
</button>
57+
<button id="back-metadata-btn" class="btn btn-outline-secondary float-right m-2" (click)="back()">
58+
<span>
59+
<i class="fas fa-arrow-left mr-1"></i>
60+
{{ 'admin.edit-cms-metadata.back-button' | translate }}
61+
</span>
62+
</button>
63+
</div>
64+
</div>
65+
</ng-template>

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

Whitespace-only changes.
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
import { NO_ERRORS_SCHEMA } from '@angular/core';
2+
import {
3+
ComponentFixture,
4+
TestBed,
5+
waitForAsync,
6+
} from '@angular/core/testing';
7+
import { FormsModule } from '@angular/forms';
8+
import { By } from '@angular/platform-browser';
9+
import { provideNoopAnimations } from '@angular/platform-browser/animations';
10+
import { NotificationsService } from '@dspace/core/notification-system/notifications.service';
11+
import { NotificationsServiceStub } from '@dspace/core/testing/notifications-service.stub';
12+
import { TranslateLoaderMock } from '@dspace/core/testing/translate-loader.mock';
13+
import {
14+
TranslateLoader,
15+
TranslateModule,
16+
} from '@ngx-translate/core';
17+
import { of } from 'rxjs';
18+
19+
import { environment } from '../../../environments/environment.test';
20+
import { SiteDataService } from '../../core/data/site-data.service';
21+
import { Site } from '../../core/shared/site.model';
22+
import { AdminEditCmsMetadataComponent } from './admin-edit-cms-metadata.component';
23+
24+
describe('AdminEditCmsMetadataComponent', () => {
25+
26+
let component: AdminEditCmsMetadataComponent;
27+
let fixture: ComponentFixture<AdminEditCmsMetadataComponent>;
28+
const site = Object.assign(new Site(), {
29+
metadata: { },
30+
});
31+
32+
const siteServiceStub = jasmine.createSpyObj('SiteDataService', {
33+
find: jasmine.createSpy('find'),
34+
patch: jasmine.createSpy('patch'),
35+
});
36+
37+
const metadataValueMap = new Map([
38+
['en', ''],
39+
['de', ''],
40+
['cs', ''],
41+
['nl', ''],
42+
['pt', ''],
43+
['fr', ''],
44+
['lv', ''],
45+
['bn', ''],
46+
['el', ''],
47+
]);
48+
beforeEach(waitForAsync(() => {
49+
TestBed.configureTestingModule({
50+
imports: [
51+
FormsModule,
52+
TranslateModule.forRoot({
53+
loader: {
54+
provide: TranslateLoader,
55+
useClass: TranslateLoaderMock,
56+
},
57+
}),
58+
AdminEditCmsMetadataComponent,
59+
],
60+
providers: [
61+
{ provide: NotificationsService, useValue: NotificationsServiceStub },
62+
{ provide: SiteDataService, useValue: siteServiceStub },
63+
provideNoopAnimations(),
64+
],
65+
schemas: [NO_ERRORS_SCHEMA],
66+
}).compileComponents();
67+
}));
68+
69+
beforeEach(() => {
70+
fixture = TestBed.createComponent(AdminEditCmsMetadataComponent);
71+
component = fixture.componentInstance;
72+
siteServiceStub.find.and.returnValue(of(site));
73+
siteServiceStub.patch.and.returnValue(of(site));
74+
});
75+
76+
describe('', () => {
77+
78+
beforeEach(() => {
79+
// component.editMode = false;
80+
fixture.detectChanges();
81+
});
82+
it('should create', () => {
83+
expect(component).toBeTruthy();
84+
});
85+
86+
it('should show metadata cms list correctly', () => {
87+
// Substract 1 because the top footer is not included in the list if it is not enabled (and it's not, by default)
88+
const metadataListLength = environment.cms.metadataList.length - 1;
89+
const selectMetadata = fixture.debugElement.query(By.css('select'));
90+
expect(selectMetadata.children).toHaveSize(metadataListLength + 1);
91+
});
92+
93+
});
94+
95+
describe('when the edit button is clicked', () => {
96+
beforeEach(() => {
97+
spyOn(component, 'editSelectedMetadata');
98+
component.selectedMetadata = 'metadata';
99+
fixture.detectChanges();
100+
});
101+
it('should call selectMetadataToEdit', () => {
102+
const editButton = fixture.debugElement.query(By.css('#edit-metadata-btn'));
103+
editButton.nativeElement.click();
104+
expect(component.editSelectedMetadata).toHaveBeenCalled();
105+
});
106+
});
107+
108+
describe('after the button edit is clicked', () => {
109+
110+
beforeEach(() => {
111+
component.selectedMetadata = environment.cms.metadataList[0];
112+
component.selectedMetadataValues = metadataValueMap;
113+
component.editMode.next(true);
114+
fixture.detectChanges();
115+
});
116+
117+
it('should render textareas of the languages', () => {
118+
const languagesLength = environment.languages.filter((l) => l.active).length;
119+
const textareas = fixture.debugElement.queryAll(By.css('textarea'));
120+
console.log(textareas.length, languagesLength);
121+
expect(textareas).toHaveSize(languagesLength);
122+
});
123+
124+
describe('after the button save is clicked', () => {
125+
126+
it('should call method edit', () => {
127+
spyOn(component, 'saveMetadata');
128+
const saveButton = fixture.debugElement.query(By.css('#save-metadata-btn'));
129+
saveButton.nativeElement.click();
130+
expect(component.saveMetadata).toHaveBeenCalled();
131+
});
132+
133+
it('should call method patch of service', () => {
134+
component.selectedMetadata = environment.cms.metadataList[0];
135+
const saveButton = fixture.debugElement.query(By.css('#save-metadata-btn'));
136+
saveButton.nativeElement.click();
137+
const operations = [];
138+
operations.push({
139+
op: 'replace',
140+
path: '/metadata/' + component.selectedMetadata,
141+
value: {
142+
value: component.selectedMetadataValues.get(environment.languages[0].code),
143+
language: environment.languages[0].code,
144+
},
145+
});
146+
component.selectedMetadataValues.forEach((value, key) => {
147+
if (key !== environment.languages[0].code) {
148+
operations.push({
149+
op: 'add',
150+
path: '/metadata/' + component.selectedMetadata,
151+
value: {
152+
value: value,
153+
language: key,
154+
},
155+
});
156+
}
157+
});
158+
expect(siteServiceStub.patch).toHaveBeenCalledWith(site, operations);
159+
});
160+
161+
});
162+
});
163+
});

0 commit comments

Comments
 (0)