Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions config/config.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ communityList:
pageSize: 20

homePage:
# Whether to show the top footer section or not
showTopFooter: false
recentSubmissions:
# The number of item showing in recent submission components
pageSize: 5
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
@if (editMode | async) {
<ng-container *ngTemplateOutlet="editMetadataTemplate"></ng-container>
}
@else {
<ng-container *ngTemplateOutlet="selectMetadataTemplate"></ng-container>
}

<ng-template #selectMetadataTemplate>
<div class="container">
<h3 class="mb-4">{{'menu.section.cms.edit.metadata.head' | translate}}</h3>
<div class="input-group">
<select class="form-control col-md-4 mr-3 mb-2" aria-label="Select metadata" [(ngModel)]="selectedMetadata">
<option [ngValue]="undefined" disabled selected>{{'admin.edit-cms-metadata.select-metadata' | translate}}</option>
@for (md of metadataList; track $index) {
<option [value]="md">{{md}}</option>
}
</select>
<span class="input-group-btn">
<button id="edit-metadata-btn" class="btn btn-primary" (click)="editSelectedMetadata()" [dsBtnDisabled]="!selectedMetadata">
<i class="fas fa-edit mr-1"></i>
{{'admin.edit-cms-metadata.edit-button' | translate}}
</button>
</span>
</div>
</div>
</ng-template>


<ng-template #editMetadataTemplate>
<div class="container">
<h2 class=" mb-5">{{'admin.edit-cms-metadata.title' | translate}} '{{selectedMetadata}}'</h2>
<ds-alert [type]="'alert-info'" [dismissible]="true" [content]="'admin.edit-cms-metadata.markdown' | translate"></ds-alert>
<div class="row">
<div class="col-md">
@for (lang of (languageMap | keyvalue); track lang.key) {
<div class="form-group">
<label>{{languageLabel(lang.value)}}</label>
<textarea class="col-md-12 m-2" [ngModel]="selectedMetadataValues.get(lang.key)" (ngModelChange)="selectedMetadataValues.set(lang.key, $event)" rows="10"></textarea>
</div>
}
</div>
</div>
<ng-container *ngTemplateOutlet="editMetadataButtonsTemplate"></ng-container>
</div>
</ng-template>


<ng-template #editMetadataButtonsTemplate>
<div class="row">
<div class="col-md">
<button id="save-metadata-btn" class="btn btn-primary float-right m-2" (click)="saveMetadata()">
<span>
<i class="fas fa-save mr-1"></i>
{{ 'admin.edit-cms-metadata.save-button' | translate }}
</span>
</button>
<button id="back-metadata-btn" class="btn btn-outline-secondary float-right m-2" (click)="back()">
<span>
<i class="fas fa-arrow-left mr-1"></i>
{{ 'admin.edit-cms-metadata.back-button' | translate }}
</span>
</button>
</div>
</div>
</ng-template>
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
import { NO_ERRORS_SCHEMA } from '@angular/core';
import {
ComponentFixture,
TestBed,
waitForAsync,
} from '@angular/core/testing';
import { FormsModule } from '@angular/forms';
import { By } from '@angular/platform-browser';
import { provideNoopAnimations } from '@angular/platform-browser/animations';
import { NotificationsService } from '@dspace/core/notification-system/notifications.service';
import { NotificationsServiceStub } from '@dspace/core/testing/notifications-service.stub';
import { TranslateLoaderMock } from '@dspace/core/testing/translate-loader.mock';
import {
TranslateLoader,
TranslateModule,
} from '@ngx-translate/core';
import { of } from 'rxjs';

import { environment } from '../../../environments/environment.test';
import { SiteDataService } from '../../core/data/site-data.service';
import { Site } from '../../core/shared/site.model';
import { AdminEditCmsMetadataComponent } from './admin-edit-cms-metadata.component';

describe('AdminEditCmsMetadataComponent', () => {

let component: AdminEditCmsMetadataComponent;
let fixture: ComponentFixture<AdminEditCmsMetadataComponent>;
const site = Object.assign(new Site(), {
metadata: { },
});

const siteServiceStub = jasmine.createSpyObj('SiteDataService', {
find: jasmine.createSpy('find'),
patch: jasmine.createSpy('patch'),
});

const metadataValueMap = new Map([
['en', ''],
['de', ''],
['cs', ''],
['nl', ''],
['pt', ''],
['fr', ''],
['lv', ''],
['bn', ''],
['el', ''],
]);
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
FormsModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateLoaderMock,
},
}),
AdminEditCmsMetadataComponent,
],
providers: [
{ provide: NotificationsService, useValue: NotificationsServiceStub },
{ provide: SiteDataService, useValue: siteServiceStub },
provideNoopAnimations(),
],
schemas: [NO_ERRORS_SCHEMA],
}).compileComponents();
}));

beforeEach(() => {
fixture = TestBed.createComponent(AdminEditCmsMetadataComponent);
component = fixture.componentInstance;
siteServiceStub.find.and.returnValue(of(site));
siteServiceStub.patch.and.returnValue(of(site));
});

describe('', () => {

beforeEach(() => {
// component.editMode = false;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});

it('should show metadata cms list correctly', () => {
// Substract 1 because the top footer is not included in the list if it is not enabled (and it's not, by default)
const metadataListLength = environment.cms.metadataList.length - 1;
const selectMetadata = fixture.debugElement.query(By.css('select'));
expect(selectMetadata.children).toHaveSize(metadataListLength + 1);
});

});

describe('when the edit button is clicked', () => {
beforeEach(() => {
spyOn(component, 'editSelectedMetadata');
component.selectedMetadata = 'metadata';
fixture.detectChanges();
});
it('should call selectMetadataToEdit', () => {
const editButton = fixture.debugElement.query(By.css('#edit-metadata-btn'));
editButton.nativeElement.click();
expect(component.editSelectedMetadata).toHaveBeenCalled();
});
});

describe('after the button edit is clicked', () => {

beforeEach(() => {
component.selectedMetadata = environment.cms.metadataList[0];
component.selectedMetadataValues = metadataValueMap;
component.editMode.next(true);
fixture.detectChanges();
});

it('should render textareas of the languages', () => {
const languagesLength = environment.languages.filter((l) => l.active).length;
const textareas = fixture.debugElement.queryAll(By.css('textarea'));
console.log(textareas.length, languagesLength);
expect(textareas).toHaveSize(languagesLength);
});

describe('after the button save is clicked', () => {

it('should call method edit', () => {
spyOn(component, 'saveMetadata');
const saveButton = fixture.debugElement.query(By.css('#save-metadata-btn'));
saveButton.nativeElement.click();
expect(component.saveMetadata).toHaveBeenCalled();
});

it('should call method patch of service', () => {
component.selectedMetadata = environment.cms.metadataList[0];
const saveButton = fixture.debugElement.query(By.css('#save-metadata-btn'));
saveButton.nativeElement.click();
const operations = [];
operations.push({
op: 'replace',
path: '/metadata/' + component.selectedMetadata,
value: {
value: component.selectedMetadataValues.get(environment.languages[0].code),
language: environment.languages[0].code,
},
});
component.selectedMetadataValues.forEach((value, key) => {
if (key !== environment.languages[0].code) {
operations.push({
op: 'add',
path: '/metadata/' + component.selectedMetadata,
value: {
value: value,
language: key,
},
});
}
});
expect(siteServiceStub.patch).toHaveBeenCalledWith(site, operations);
});

});
});
});
Loading
Loading