From f4482c710c56adbeeb7ec9a5b8586aa76e280540 Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Thu, 18 Oct 2018 16:48:17 +0200 Subject: [PATCH 01/41] 55959: Add subcommunities on community page --- resources/i18n/en.json | 5 ++ .../community-page.component.html | 1 + .../+community-page/community-page.module.ts | 2 + ...ty-page-sub-collection-list.component.html | 2 +- ...ity-page-sub-community-list.component.html | 15 ++++ ...ity-page-sub-community-list.component.scss | 1 + ...-page-sub-community-list.component.spec.ts | 78 +++++++++++++++++++ ...unity-page-sub-community-list.component.ts | 23 ++++++ src/app/core/shared/community.model.ts | 2 +- 9 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 src/app/+community-page/sub-community-list/community-page-sub-community-list.component.html create mode 100644 src/app/+community-page/sub-community-list/community-page-sub-community-list.component.scss create mode 100644 src/app/+community-page/sub-community-list/community-page-sub-community-list.component.spec.ts create mode 100644 src/app/+community-page/sub-community-list/community-page-sub-community-list.component.ts diff --git a/resources/i18n/en.json b/resources/i18n/en.json index b6a23068d7..d084728fde 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -22,6 +22,9 @@ }, "sub-collection-list": { "head": "Collections of this Community" + }, + "sub-community-list": { + "head": "Communities of this Community" } }, "item": { @@ -209,6 +212,7 @@ "community": "Loading community...", "collection": "Loading collection...", "sub-collections": "Loading sub-collections...", + "sub-communities": "Loading sub-communities...", "recent-submissions": "Loading recent submissions...", "item": "Loading item...", "objects": "Loading...", @@ -221,6 +225,7 @@ "community": "Error fetching community", "collection": "Error fetching collection", "sub-collections": "Error fetching sub-collections", + "sub-communities": "Error fetching sub-communities", "recent-submissions": "Error fetching recent submissions", "item": "Error fetching item", "objects": "Error fetching objects", diff --git a/src/app/+community-page/community-page.component.html b/src/app/+community-page/community-page.component.html index 637e37af0c..a86a86c3da 100644 --- a/src/app/+community-page/community-page.component.html +++ b/src/app/+community-page/community-page.component.html @@ -24,6 +24,7 @@ [content]="communityPayload.copyrightText" [hasInnerHtml]="true"> + diff --git a/src/app/+community-page/community-page.module.ts b/src/app/+community-page/community-page.module.ts index e00c3910c5..d7f97755c2 100644 --- a/src/app/+community-page/community-page.module.ts +++ b/src/app/+community-page/community-page.module.ts @@ -6,6 +6,7 @@ import { SharedModule } from '../shared/shared.module'; import { CommunityPageComponent } from './community-page.component'; import { CommunityPageSubCollectionListComponent } from './sub-collection-list/community-page-sub-collection-list.component'; import { CommunityPageRoutingModule } from './community-page-routing.module'; +import {CommunityPageSubCommunityListComponent} from './sub-community-list/community-page-sub-community-list.component'; @NgModule({ imports: [ @@ -16,6 +17,7 @@ import { CommunityPageRoutingModule } from './community-page-routing.module'; declarations: [ CommunityPageComponent, CommunityPageSubCollectionListComponent, + CommunityPageSubCommunityListComponent, ] }) export class CommunityPageModule { diff --git a/src/app/+community-page/sub-collection-list/community-page-sub-collection-list.component.html b/src/app/+community-page/sub-collection-list/community-page-sub-collection-list.component.html index 12c2578d9c..9156a99b18 100644 --- a/src/app/+community-page/sub-collection-list/community-page-sub-collection-list.component.html +++ b/src/app/+community-page/sub-collection-list/community-page-sub-collection-list.component.html @@ -1,5 +1,5 @@ -
+

{{'community.sub-collection-list.head' | translate}}

  • diff --git a/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.html b/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.html new file mode 100644 index 0000000000..6cd62ba48d --- /dev/null +++ b/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.html @@ -0,0 +1,15 @@ + +
    +

    {{'community.sub-community-list.head' | translate}}

    + +
    + + +
    diff --git a/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.scss b/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.scss new file mode 100644 index 0000000000..50be6f5ad0 --- /dev/null +++ b/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.scss @@ -0,0 +1 @@ +@import '../../../styles/variables.scss'; diff --git a/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.spec.ts b/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.spec.ts new file mode 100644 index 0000000000..b4203eb11a --- /dev/null +++ b/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.spec.ts @@ -0,0 +1,78 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; +import {TranslateModule} from '@ngx-translate/core'; +import {NO_ERRORS_SCHEMA} from '@angular/core'; +import {CommunityPageSubCommunityListComponent} from './community-page-sub-community-list.component'; +import {Community} from '../../core/shared/community.model'; +import {Observable} from 'rxjs/Observable'; +import {RemoteData} from '../../core/data/remote-data'; +import {PaginatedList} from '../../core/data/paginated-list'; +import 'rxjs/add/observable/of'; +import {PageInfo} from '../../core/shared/page-info.model'; +import {SharedModule} from '../../shared/shared.module'; +import {RouterTestingModule} from '@angular/router/testing'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import {By} from '@angular/platform-browser'; + +describe('SubCommunityList Component', () => { + let comp: CommunityPageSubCommunityListComponent; + let fixture: ComponentFixture; + + const subcommunities = [Object.assign(new Community(), { + name: 'SubCommunity 1', + id: '123456789-1', + metadata: [ + { + key: 'dc.title', + language: 'en_US', + value: 'SubCommunity 1' + }] + }), + Object.assign(new Community(), { + name: 'SubCommunity 2', + id: '123456789-2', + metadata: [ + { + key: 'dc.title', + language: 'en_US', + value: 'SubCommunity 2' + }] + }) + ]; + + const mockCommunity = Object.assign(new Community(), { + metadata: [ + { + key: 'dc.title', + language: 'en_US', + value: 'Test title' + }], + subcommunities: Observable.of(new RemoteData(true, true, true, + undefined, new PaginatedList(new PageInfo(), subcommunities))) + }) + ; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot(), SharedModule, + RouterTestingModule.withRoutes([]), + NoopAnimationsModule], + declarations: [CommunityPageSubCommunityListComponent], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CommunityPageSubCommunityListComponent); + comp = fixture.componentInstance; + }); + + it('should display a list of subCommunities', () => { + comp.community = mockCommunity; + fixture.detectChanges(); + + const subComList = fixture.debugElement.queryAll(By.css('li')); + expect(subComList.length).toEqual(2); + expect(subComList[0].nativeElement.textContent).toContain('SubCommunity 1'); + expect(subComList[1].nativeElement.textContent).toContain('SubCommunity 2'); + }); +}); diff --git a/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.ts b/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.ts new file mode 100644 index 0000000000..da6135040c --- /dev/null +++ b/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.ts @@ -0,0 +1,23 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; + +import { RemoteData } from '../../core/data/remote-data'; +import { Community } from '../../core/shared/community.model'; + +import { fadeIn } from '../../shared/animations/fade'; +import { PaginatedList } from '../../core/data/paginated-list'; + +@Component({ + selector: 'ds-community-page-sub-community-list', + styleUrls: ['./community-page-sub-community-list.component.scss'], + templateUrl: './community-page-sub-community-list.component.html', + animations:[fadeIn] +}) +export class CommunityPageSubCommunityListComponent implements OnInit { + @Input() community: Community; + subCommunitiesRDObs: Observable>>; + + ngOnInit(): void { + this.subCommunitiesRDObs = this.community.subcommunities; + } +} diff --git a/src/app/core/shared/community.model.ts b/src/app/core/shared/community.model.ts index 20bd50f4a9..d90742fa00 100644 --- a/src/app/core/shared/community.model.ts +++ b/src/app/core/shared/community.model.ts @@ -61,6 +61,6 @@ export class Community extends DSpaceObject { collections: Observable>>; - subcommunities: Observable>>; + subcommunities: Observable>>; } From 44c227ffff052225ad88990fe0c22d00b4cfed38 Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Fri, 26 Oct 2018 10:55:27 +0200 Subject: [PATCH 02/41] 55959: Add additional test when no subcommunities When the subcommunity list is empty, the subcommunity section should be hidden. --- ...-page-sub-community-list.component.spec.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.spec.ts b/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.spec.ts index b4203eb11a..a3efc2ebc5 100644 --- a/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.spec.ts +++ b/src/app/+community-page/sub-community-list/community-page-sub-community-list.component.spec.ts @@ -39,6 +39,17 @@ describe('SubCommunityList Component', () => { }) ]; + const emptySubCommunitiesCommunity = Object.assign(new Community(), { + metadata: [ + { + key: 'dc.title', + language: 'en_US', + value: 'Test title' + }], + subcommunities: Observable.of(new RemoteData(true, true, true, + undefined, new PaginatedList(new PageInfo(), []))) + }); + const mockCommunity = Object.assign(new Community(), { metadata: [ { @@ -75,4 +86,12 @@ describe('SubCommunityList Component', () => { expect(subComList[0].nativeElement.textContent).toContain('SubCommunity 1'); expect(subComList[1].nativeElement.textContent).toContain('SubCommunity 2'); }); + + it('should not display the header when subCommunities are empty', () => { + comp.community = emptySubCommunitiesCommunity; + fixture.detectChanges(); + + const subComHead = fixture.debugElement.queryAll(By.css('h2')); + expect(subComHead.length).toEqual(0); + }); }); From 67619a2ba56296e36b8e09d5560dea85f4e3dfb0 Mon Sep 17 00:00:00 2001 From: Bram Luyten Date: Wed, 31 Oct 2018 23:06:38 +0100 Subject: [PATCH 03/41] issue 323 comcol page logo bottom padding --- .../shared/comcol-page-logo/comcol-page-logo.component.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/shared/comcol-page-logo/comcol-page-logo.component.scss b/src/app/shared/comcol-page-logo/comcol-page-logo.component.scss index ad84b72f8c..ea0ae377b3 100644 --- a/src/app/shared/comcol-page-logo/comcol-page-logo.component.scss +++ b/src/app/shared/comcol-page-logo/comcol-page-logo.component.scss @@ -1 +1,5 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file +@import '../../../styles/variables.scss'; + +.dso-logo { + padding-bottom: 1em; +} From 2af1d3b0421cab2f72a566261d2119ad8dc5cc99 Mon Sep 17 00:00:00 2001 From: lotte Date: Mon, 5 Nov 2018 16:34:03 +0100 Subject: [PATCH 04/41] 57053: started on menu --- resources/images/dspace-logo.svg | 37 +++++++++++++++ src/app/app.component.html | 1 + src/app/app.component.scss | 5 ++ src/app/app.effects.ts | 5 +- src/app/app.module.ts | 2 + src/app/app.reducer.ts | 12 +++-- src/app/header/header.component.html | 22 +++------ src/app/header/header.component.scss | 15 ++---- src/app/header/header.component.ts | 31 +------------ .../navbar.actions.ts} | 28 +++++------ src/app/navbar/navbar.component.html | 46 +++++++++++++++++++ src/app/navbar/navbar.component.scss | 18 ++++++++ .../navbar.component.spec.ts} | 28 +++++------ src/app/navbar/navbar.component.ts | 34 ++++++++++++++ .../navbar.effects.spec.ts} | 20 ++++---- .../navbar.effects.ts} | 8 ++-- .../navbar.reducer.spec.ts} | 42 ++++++++--------- .../navbar.reducer.ts} | 14 +++--- .../auth-nav-menu.component.html | 6 +-- src/styles/_custom_variables.scss | 4 ++ 20 files changed, 237 insertions(+), 141 deletions(-) create mode 100644 resources/images/dspace-logo.svg rename src/app/{header/header.actions.ts => navbar/navbar.actions.ts} (52%) create mode 100644 src/app/navbar/navbar.component.html create mode 100644 src/app/navbar/navbar.component.scss rename src/app/{header/header.component.spec.ts => navbar/navbar.component.spec.ts} (74%) create mode 100644 src/app/navbar/navbar.component.ts rename src/app/{header/header.effects.spec.ts => navbar/navbar.effects.spec.ts} (66%) rename src/app/{header/header.effects.ts => navbar/navbar.effects.ts} (71%) rename src/app/{header/header.reducer.spec.ts => navbar/navbar.reducer.spec.ts} (65%) rename src/app/{header/header.reducer.ts => navbar/navbar.reducer.ts} (54%) diff --git a/resources/images/dspace-logo.svg b/resources/images/dspace-logo.svg new file mode 100644 index 0000000000..60df1ed46d --- /dev/null +++ b/resources/images/dspace-logo.svg @@ -0,0 +1,37 @@ + + + + + + + + diff --git a/src/app/app.component.html b/src/app/app.component.html index 95db61ab5a..24ce6dc843 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,6 +1,7 @@
    + diff --git a/src/app/app.component.scss b/src/app/app.component.scss index e4c51ae37b..1b2a21b0c6 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -28,7 +28,12 @@ body { } .main-content { + z-index: $main-z-index; flex: 1 0 auto; margin-top: $content-spacing; margin-bottom: $content-spacing; } + +ds-navbar { + z-index: $nav-z-index; +} diff --git a/src/app/app.effects.ts b/src/app/app.effects.ts index 6a53d7b619..3ee483ccba 100644 --- a/src/app/app.effects.ts +++ b/src/app/app.effects.ts @@ -1,10 +1,9 @@ - -import { HeaderEffects } from './header/header.effects'; import { StoreEffects } from './store.effects'; import { NotificationsEffects } from './shared/notifications/notifications.effects'; +import { NavbarEffects } from './navbar/navbar.effects'; export const appEffects = [ StoreEffects, - HeaderEffects, + NavbarEffects, NotificationsEffects ]; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 528c84fd3b..987ce77dd1 100755 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -31,6 +31,7 @@ import { DSpaceRouterStateSerializer } from './shared/ngrx/dspace-router-state-s import { NotificationsBoardComponent } from './shared/notifications/notifications-board/notifications-board.component'; import { NotificationComponent } from './shared/notifications/notification/notification.component'; import { SharedModule } from './shared/shared.module'; +import { NavbarComponent } from './navbar/navbar.component'; export function getConfig() { return ENV_CONFIG; @@ -87,6 +88,7 @@ if (!ENV_CONFIG.production) { declarations: [ AppComponent, HeaderComponent, + NavbarComponent, FooterComponent, PageNotFoundComponent, NotificationComponent, diff --git a/src/app/app.reducer.ts b/src/app/app.reducer.ts index 8dc82dfb6f..6bdb1a1f58 100644 --- a/src/app/app.reducer.ts +++ b/src/app/app.reducer.ts @@ -1,7 +1,5 @@ import { ActionReducerMap } from '@ngrx/store'; import * as fromRouter from '@ngrx/router-store'; - -import { headerReducer, HeaderState } from './header/header.reducer'; import { hostWindowReducer, HostWindowState } from './shared/host-window.reducer'; import { formReducer, FormState } from './shared/form/form.reducer'; import { @@ -12,13 +10,17 @@ import { filterReducer, SearchFiltersState } from './+search-page/search-filters/search-filter/search-filter.reducer'; -import { notificationsReducer, NotificationsState } from './shared/notifications/notifications.reducers'; +import { + notificationsReducer, + NotificationsState +} from './shared/notifications/notifications.reducers'; import { truncatableReducer, TruncatablesState } from './shared/truncatable/truncatable.reducer'; +import { navbarReducer, NavbarState } from './navbar/navbar.reducer'; export interface AppState { router: fromRouter.RouterReducerState; hostWindow: HostWindowState; - header: HeaderState; + navbar: NavbarState; forms: FormState; notifications: NotificationsState; searchSidebar: SearchSidebarState; @@ -29,7 +31,7 @@ export interface AppState { export const appReducers: ActionReducerMap = { router: fromRouter.routerReducer, hostWindow: hostWindowReducer, - header: headerReducer, + navbar: navbarReducer, forms: formReducer, notifications: notificationsReducer, searchSidebar: sidebarReducer, diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index f47696609c..22e2a307a5 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -1,18 +1,10 @@
    -
    diff --git a/src/app/header/header.component.scss b/src/app/header/header.component.scss index 81f6a809bf..627ce93c6c 100644 --- a/src/app/header/header.component.scss +++ b/src/app/header/header.component.scss @@ -1,14 +1,5 @@ @import '../../styles/variables.scss'; -header nav.navbar { - border-radius: 0; -} - -header nav.navbar .navbar-toggler:hover { - cursor: pointer; -} - -header nav.navbar .navbar-toggler .navbar-toggler-icon { - background-image: none !important; - line-height: 1.5; -} +.navbar-brand img { + height: $header-logo-height; +} \ No newline at end of file diff --git a/src/app/header/header.component.ts b/src/app/header/header.component.ts index 93cb329f4f..8ccc779873 100644 --- a/src/app/header/header.component.ts +++ b/src/app/header/header.component.ts @@ -1,43 +1,16 @@ -import { Component, OnInit } from '@angular/core'; -import { createSelector, Store } from '@ngrx/store'; +import { Component } from '@angular/core'; import { Observable } from 'rxjs/Observable'; -import { RouterReducerState } from '@ngrx/router-store'; - -import { HeaderState } from './header.reducer'; -import { HeaderToggleAction } from './header.actions'; -import { AppState } from '../app.reducer'; -import { HostWindowService } from '../shared/host-window.service'; - -const headerStateSelector = (state: AppState) => state.header; -const navCollapsedSelector = createSelector(headerStateSelector, (header: HeaderState) => header.navCollapsed); @Component({ selector: 'ds-header', styleUrls: ['header.component.scss'], templateUrl: 'header.component.html', }) -export class HeaderComponent implements OnInit { +export class HeaderComponent { /** * Whether user is authenticated. * @type {Observable} */ public isAuthenticated: Observable; - public isNavBarCollapsed: Observable; public showAuth = false; - - constructor( - private store: Store, - private windowService: HostWindowService - ) { - } - - ngOnInit(): void { - // set loading - this.isNavBarCollapsed = this.store.select(navCollapsedSelector); - } - - public toggle(): void { - this.store.dispatch(new HeaderToggleAction()); - } - } diff --git a/src/app/header/header.actions.ts b/src/app/navbar/navbar.actions.ts similarity index 52% rename from src/app/header/header.actions.ts rename to src/app/navbar/navbar.actions.ts index 7176474a4a..c588c41f0c 100644 --- a/src/app/header/header.actions.ts +++ b/src/app/navbar/navbar.actions.ts @@ -10,23 +10,23 @@ import { type } from '../shared/ngrx/type'; * literal types and runs a simple check to guarantee all * action types in the application are unique. */ -export const HeaderActionTypes = { - COLLAPSE: type('dspace/header/COLLAPSE'), - EXPAND: type('dspace/header/EXPAND'), - TOGGLE: type('dspace/header/TOGGLE') +export const NavbarActionTypes = { + COLLAPSE: type('dspace/navbar/COLLAPSE'), + EXPAND: type('dspace/navbar/EXPAND'), + TOGGLE: type('dspace/navbar/TOGGLE') }; /* tslint:disable:max-classes-per-file */ -export class HeaderCollapseAction implements Action { - type = HeaderActionTypes.COLLAPSE; +export class NavbarCollapseAction implements Action { + type = NavbarActionTypes.COLLAPSE; } -export class HeaderExpandAction implements Action { - type = HeaderActionTypes.EXPAND; +export class NavbarExpandAction implements Action { + type = NavbarActionTypes.EXPAND; } -export class HeaderToggleAction implements Action { - type = HeaderActionTypes.TOGGLE; +export class NavbarToggleAction implements Action { + type = NavbarActionTypes.TOGGLE; } /* tslint:enable:max-classes-per-file */ @@ -34,7 +34,7 @@ export class HeaderToggleAction implements Action { * Export a type alias of all actions in this action group * so that reducers can easily compose action types */ -export type HeaderAction - = HeaderCollapseAction - | HeaderExpandAction - | HeaderToggleAction +export type NavbarAction + = NavbarCollapseAction + | NavbarExpandAction + | NavbarToggleAction diff --git a/src/app/navbar/navbar.component.html b/src/app/navbar/navbar.component.html new file mode 100644 index 0000000000..7c4de41098 --- /dev/null +++ b/src/app/navbar/navbar.component.html @@ -0,0 +1,46 @@ + diff --git a/src/app/navbar/navbar.component.scss b/src/app/navbar/navbar.component.scss new file mode 100644 index 0000000000..10e97834f3 --- /dev/null +++ b/src/app/navbar/navbar.component.scss @@ -0,0 +1,18 @@ +@import '../../styles/variables.scss'; + +nav.navbar { + border-bottom: 1px $gray-400 solid; +} + +nav.navbar .navbar-toggler .navbar-toggler-icon { + background-image: none !important; + line-height: 1.5; +} + +.dropdown-menu { + min-width: 100%; +} +.reset-padding { + margin-left: -$spacer/2; + margin-right: -$spacer/2; +} \ No newline at end of file diff --git a/src/app/header/header.component.spec.ts b/src/app/navbar/navbar.component.spec.ts similarity index 74% rename from src/app/header/header.component.spec.ts rename to src/app/navbar/navbar.component.spec.ts index 9d0dd04e40..0a0ed43716 100644 --- a/src/app/header/header.component.spec.ts +++ b/src/app/navbar/navbar.component.spec.ts @@ -1,4 +1,4 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Store, StoreModule } from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; @@ -6,13 +6,7 @@ import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap'; import { Observable } from 'rxjs/Observable'; -import { HeaderComponent } from './header.component'; -import { HeaderState } from './header.reducer'; -import { HeaderToggleAction } from './header.actions'; -import { AuthNavMenuComponent } from '../shared/auth-nav-menu/auth-nav-menu.component'; -import { LogInComponent } from '../shared/log-in/log-in.component'; -import { LogOutComponent } from '../shared/log-out/log-out.component'; -import { LoadingComponent } from '../shared/loading/loading.component'; +import { NavbarComponent } from './navbar.component'; import { ReactiveFormsModule } from '@angular/forms'; import { HostWindowService } from '../shared/host-window.service'; import { HostWindowServiceStub } from '../shared/testing/host-window-service-stub'; @@ -20,12 +14,14 @@ import { RouterStub } from '../shared/testing/router-stub'; import { Router } from '@angular/router'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { NavbarState } from './navbar.reducer'; +import { NavbarToggleAction } from './navbar.actions'; -let comp: HeaderComponent; -let fixture: ComponentFixture; -let store: Store; +let comp: NavbarComponent; +let fixture: ComponentFixture; +let store: Store; -describe('HeaderComponent', () => { +describe('NavbarComponent', () => { // async beforeEach beforeEach(async(() => { @@ -36,7 +32,7 @@ describe('HeaderComponent', () => { NgbCollapseModule.forRoot(), NoopAnimationsModule, ReactiveFormsModule], - declarations: [HeaderComponent], + declarations: [NavbarComponent], providers: [ { provide: HostWindowService, useValue: new HostWindowServiceStub(800) }, { provide: Router, useClass: RouterStub }, @@ -48,7 +44,7 @@ describe('HeaderComponent', () => { // synchronous beforeEach beforeEach(() => { - fixture = TestBed.createComponent(HeaderComponent); + fixture = TestBed.createComponent(NavbarComponent); comp = fixture.componentInstance; @@ -63,8 +59,8 @@ describe('HeaderComponent', () => { navbarToggler.triggerEventHandler('click', null); }); - it('should dispatch a HeaderToggleAction', () => { - expect(store.dispatch).toHaveBeenCalledWith(new HeaderToggleAction()); + it('should dispatch a NavbarToggleAction', () => { + expect(store.dispatch).toHaveBeenCalledWith(new NavbarToggleAction()); }); }); diff --git a/src/app/navbar/navbar.component.ts b/src/app/navbar/navbar.component.ts new file mode 100644 index 0000000000..e1f8d0bb82 --- /dev/null +++ b/src/app/navbar/navbar.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit } from '@angular/core'; +import { createSelector, Store } from '@ngrx/store'; +import { Observable } from 'rxjs/Observable'; + +import { NavbarState } from './navbar.reducer'; +import { NavbarToggleAction } from './navbar.actions'; +import { AppState } from '../app.reducer'; + +const navbarStateSelector = (state: AppState) => state.navbar; +const navCollapsedSelector = createSelector(navbarStateSelector, (navbar: NavbarState) => navbar.navCollapsed); + +@Component({ + selector: 'ds-navbar', + styleUrls: ['navbar.component.scss'], + templateUrl: 'navbar.component.html', +}) +export class NavbarComponent implements OnInit { + public isNavBarCollapsed: Observable; + + constructor( + private store: Store, + ) { + } + + ngOnInit(): void { + // set loading + this.isNavBarCollapsed = this.store.select(navCollapsedSelector); + } + + public toggle(): void { + this.store.dispatch(new NavbarToggleAction()); + } + +} diff --git a/src/app/header/header.effects.spec.ts b/src/app/navbar/navbar.effects.spec.ts similarity index 66% rename from src/app/header/header.effects.spec.ts rename to src/app/navbar/navbar.effects.spec.ts index e67043dcba..261d24a850 100644 --- a/src/app/header/header.effects.spec.ts +++ b/src/app/navbar/navbar.effects.spec.ts @@ -1,26 +1,26 @@ import { TestBed } from '@angular/core/testing'; -import { HeaderEffects } from './header.effects'; -import { HeaderCollapseAction } from './header.actions'; +import { NavbarEffects } from './navbar.effects'; +import { NavbarCollapseAction } from './navbar.actions'; import { HostWindowResizeAction } from '../shared/host-window.actions'; import { Observable } from 'rxjs/Observable'; import { provideMockActions } from '@ngrx/effects/testing'; import { cold, hot } from 'jasmine-marbles'; import * as fromRouter from '@ngrx/router-store'; -describe('HeaderEffects', () => { - let headerEffects: HeaderEffects; +describe('NavbarEffects', () => { + let navbarEffects: NavbarEffects; let actions: Observable; beforeEach(() => { TestBed.configureTestingModule({ providers: [ - HeaderEffects, + NavbarEffects, provideMockActions(() => actions), // other providers ], }); - headerEffects = TestBed.get(HeaderEffects); + navbarEffects = TestBed.get(NavbarEffects); }); describe('resize$', () => { @@ -28,9 +28,9 @@ describe('HeaderEffects', () => { it('should return a COLLAPSE action in response to a RESIZE action', () => { actions = hot('--a-', { a: new HostWindowResizeAction(800, 600) }); - const expected = cold('--b-', { b: new HeaderCollapseAction() }); + const expected = cold('--b-', { b: new NavbarCollapseAction() }); - expect(headerEffects.resize$).toBeObservable(expected); + expect(navbarEffects.resize$).toBeObservable(expected); }); }); @@ -40,9 +40,9 @@ describe('HeaderEffects', () => { it('should return a COLLAPSE action in response to an UPDATE_LOCATION action', () => { actions = hot('--a-', { a: { type: fromRouter.ROUTER_NAVIGATION } }); - const expected = cold('--b-', { b: new HeaderCollapseAction() }); + const expected = cold('--b-', { b: new NavbarCollapseAction() }); - expect(headerEffects.routeChange$).toBeObservable(expected); + expect(navbarEffects.routeChange$).toBeObservable(expected); }); }); diff --git a/src/app/header/header.effects.ts b/src/app/navbar/navbar.effects.ts similarity index 71% rename from src/app/header/header.effects.ts rename to src/app/navbar/navbar.effects.ts index e1d281958b..bc6cf876e1 100644 --- a/src/app/header/header.effects.ts +++ b/src/app/navbar/navbar.effects.ts @@ -3,18 +3,18 @@ import { Effect, Actions } from '@ngrx/effects' import * as fromRouter from '@ngrx/router-store'; import { HostWindowActionTypes } from '../shared/host-window.actions'; -import { HeaderCollapseAction } from './header.actions'; +import { NavbarCollapseAction } from './navbar.actions'; @Injectable() -export class HeaderEffects { +export class NavbarEffects { @Effect() resize$ = this.actions$ .ofType(HostWindowActionTypes.RESIZE) - .map(() => new HeaderCollapseAction()); + .map(() => new NavbarCollapseAction()); @Effect() routeChange$ = this.actions$ .ofType(fromRouter.ROUTER_NAVIGATION) - .map(() => new HeaderCollapseAction()); + .map(() => new NavbarCollapseAction()); constructor(private actions$: Actions) { diff --git a/src/app/header/header.reducer.spec.ts b/src/app/navbar/navbar.reducer.spec.ts similarity index 65% rename from src/app/header/header.reducer.spec.ts rename to src/app/navbar/navbar.reducer.spec.ts index b2630ec960..b9afbd743e 100644 --- a/src/app/header/header.reducer.spec.ts +++ b/src/app/navbar/navbar.reducer.spec.ts @@ -1,13 +1,9 @@ import * as deepFreeze from 'deep-freeze'; -import { headerReducer } from './header.reducer'; -import { - HeaderCollapseAction, - HeaderExpandAction, - HeaderToggleAction -} from './header.actions'; +import { navbarReducer } from './navbar.reducer'; +import { NavbarCollapseAction, NavbarExpandAction, NavbarToggleAction } from './navbar.actions'; -class NullAction extends HeaderCollapseAction { +class NullAction extends NavbarCollapseAction { type = null; constructor() { @@ -15,18 +11,18 @@ class NullAction extends HeaderCollapseAction { } } -describe('headerReducer', () => { +describe('navbarReducer', () => { it('should return the current state when no valid actions have been made', () => { const state = { navCollapsed: false }; const action = new NullAction(); - const newState = headerReducer(state, action); + const newState = navbarReducer(state, action); expect(newState).toEqual(state); }); it('should start with navCollapsed = true', () => { const action = new NullAction(); - const initialState = headerReducer(undefined, action); + const initialState = navbarReducer(undefined, action); // The navigation starts collapsed expect(initialState.navCollapsed).toEqual(true); @@ -34,8 +30,8 @@ describe('headerReducer', () => { it('should set navCollapsed to true in response to the COLLAPSE action', () => { const state = { navCollapsed: false }; - const action = new HeaderCollapseAction(); - const newState = headerReducer(state, action); + const action = new NavbarCollapseAction(); + const newState = navbarReducer(state, action); expect(newState.navCollapsed).toEqual(true); }); @@ -44,8 +40,8 @@ describe('headerReducer', () => { const state = { navCollapsed: false }; deepFreeze(state); - const action = new HeaderCollapseAction(); - headerReducer(state, action); + const action = new NavbarCollapseAction(); + navbarReducer(state, action); // no expect required, deepFreeze will ensure an exception is thrown if the state // is mutated, and any uncaught exception will cause the test to fail @@ -53,8 +49,8 @@ describe('headerReducer', () => { it('should set navCollapsed to false in response to the EXPAND action', () => { const state = { navCollapsed: true }; - const action = new HeaderExpandAction(); - const newState = headerReducer(state, action); + const action = new NavbarExpandAction(); + const newState = navbarReducer(state, action); expect(newState.navCollapsed).toEqual(false); }); @@ -63,16 +59,16 @@ describe('headerReducer', () => { const state = { navCollapsed: true }; deepFreeze(state); - const action = new HeaderExpandAction(); - headerReducer(state, action); + const action = new NavbarExpandAction(); + navbarReducer(state, action); }); it('should flip the value of navCollapsed in response to the TOGGLE action', () => { const state1 = { navCollapsed: true }; - const action = new HeaderToggleAction(); + const action = new NavbarToggleAction(); - const state2 = headerReducer(state1, action); - const state3 = headerReducer(state2, action); + const state2 = navbarReducer(state1, action); + const state3 = navbarReducer(state2, action); expect(state2.navCollapsed).toEqual(false); expect(state3.navCollapsed).toEqual(true); @@ -82,8 +78,8 @@ describe('headerReducer', () => { const state = { navCollapsed: true }; deepFreeze(state); - const action = new HeaderToggleAction(); - headerReducer(state, action); + const action = new NavbarToggleAction(); + navbarReducer(state, action); }); }); diff --git a/src/app/header/header.reducer.ts b/src/app/navbar/navbar.reducer.ts similarity index 54% rename from src/app/header/header.reducer.ts rename to src/app/navbar/navbar.reducer.ts index 2c8a89249b..c3edc80115 100644 --- a/src/app/header/header.reducer.ts +++ b/src/app/navbar/navbar.reducer.ts @@ -1,30 +1,30 @@ -import { HeaderAction, HeaderActionTypes } from './header.actions'; +import { NavbarAction, NavbarActionTypes } from './navbar.actions'; -export interface HeaderState { +export interface NavbarState { navCollapsed: boolean; } -const initialState: HeaderState = { +const initialState: NavbarState = { navCollapsed: true }; -export function headerReducer(state = initialState, action: HeaderAction): HeaderState { +export function navbarReducer(state = initialState, action: NavbarAction): NavbarState { switch (action.type) { - case HeaderActionTypes.COLLAPSE: { + case NavbarActionTypes.COLLAPSE: { return Object.assign({}, state, { navCollapsed: true }); } - case HeaderActionTypes.EXPAND: { + case NavbarActionTypes.EXPAND: { return Object.assign({}, state, { navCollapsed: false }); } - case HeaderActionTypes.TOGGLE: { + case NavbarActionTypes.TOGGLE: { return Object.assign({}, state, { navCollapsed: !state.navCollapsed }); diff --git a/src/app/shared/auth-nav-menu/auth-nav-menu.component.html b/src/app/shared/auth-nav-menu/auth-nav-menu.component.html index cc9b8c410b..217b731e0c 100644 --- a/src/app/shared/auth-nav-menu/auth-nav-menu.component.html +++ b/src/app/shared/auth-nav-menu/auth-nav-menu.component.html @@ -1,6 +1,6 @@
  • diff --git a/src/app/shared/chips/chips.component.spec.ts b/src/app/shared/chips/chips.component.spec.ts index d7940303c0..84efe2b86e 100644 --- a/src/app/shared/chips/chips.component.spec.ts +++ b/src/app/shared/chips/chips.component.spec.ts @@ -10,6 +10,7 @@ import { SortablejsModule } from 'angular-sortablejs'; import { By } from '@angular/platform-browser'; import { FormFieldMetadataValueObject } from '../form/builder/models/form-field-metadata-value.model'; import { createTestComponent, hasClass } from '../testing/utils'; +import { TranslateModule } from '@ngx-translate/core'; describe('ChipsComponent test suite', () => { @@ -27,6 +28,7 @@ describe('ChipsComponent test suite', () => { imports: [ NgbModule.forRoot(), SortablejsModule.forRoot({animation: 150}), + TranslateModule.forRoot() ], declarations: [ ChipsComponent, diff --git a/src/app/shared/menu/menu.reducer.spec.ts b/src/app/shared/menu/menu.reducer.spec.ts index c3968d098a..ac56bed1f0 100644 --- a/src/app/shared/menu/menu.reducer.spec.ts +++ b/src/app/shared/menu/menu.reducer.spec.ts @@ -54,7 +54,7 @@ describe('menusReducer', () => { visible: true, model: { type: 0, - text: 'admin.sidebar.section.new' + text: 'menu.section.new' }, icon: 'plus-circle', index: 0 @@ -66,7 +66,7 @@ describe('menusReducer', () => { visible: true, model: { type: 1, - text: 'admin.sidebar.section.new_item', + text: 'menu.section.new_item', link: '/items/submission' } }, @@ -77,7 +77,7 @@ describe('menusReducer', () => { visible: true, model: { type: 1, - text: 'admin.sidebar.section.new_community', + text: 'menu.section.new_community', link: '/communities/submission' } }, @@ -87,7 +87,7 @@ describe('menusReducer', () => { visible: true, model: { type: 0, - text: 'admin.sidebar.section.access_control' + text: 'menu.section.access_control' }, icon: 'key', index: 4 @@ -99,7 +99,7 @@ describe('menusReducer', () => { visible: true, model: { type: 1, - text: 'admin.sidebar.section.access_control_people', + text: 'menu.section.access_control_people', link: '#' } }, @@ -110,7 +110,7 @@ describe('menusReducer', () => { visible: true, model: { type: 1, - text: 'admin.sidebar.section.access_control_groups', + text: 'menu.section.access_control_groups', link: '#' } }, @@ -121,7 +121,7 @@ describe('menusReducer', () => { visible: true, model: { type: 1, - text: 'admin.sidebar.section.new_collection', + text: 'menu.section.new_collection', link: '/collections/submission' } } From 67e2a78a264f98f82050d99b844e1dae5367e5ee Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 19 Dec 2018 14:15:34 +0100 Subject: [PATCH 31/41] applied more feedback --- .../+search-page/search-sidebar/search-sidebar.component.html | 2 +- src/app/header/header.component.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/+search-page/search-sidebar/search-sidebar.component.html b/src/app/+search-page/search-sidebar/search-sidebar.component.html index a9a958cffa..5ff1e3c8fa 100644 --- a/src/app/+search-page/search-sidebar/search-sidebar.component.html +++ b/src/app/+search-page/search-sidebar/search-sidebar.component.html @@ -4,7 +4,7 @@
diff --git a/src/app/header/header.component.ts b/src/app/header/header.component.ts index 336acc35df..8f2da69f0d 100644 --- a/src/app/header/header.component.ts +++ b/src/app/header/header.component.ts @@ -3,6 +3,9 @@ import { Observable } from 'rxjs/internal/Observable'; import { MenuService } from '../shared/menu/menu.service'; import { MenuID } from '../shared/menu/initial-menus-state'; +/** + * Represents the header with the logo and simple navigation + */ @Component({ selector: 'ds-header', styleUrls: ['header.component.scss'], From b305462449537abd3b218972fcfe01add224ae2a Mon Sep 17 00:00:00 2001 From: courtneypattison Date: Wed, 19 Dec 2018 13:53:19 -0800 Subject: [PATCH 32/41] Made home news responsive --- resources/images/dspace-logo.png | Bin 7709 -> 8609 bytes .../home-news/home-news.component.html | 6 ++---- .../home-news/home-news.component.scss | 9 --------- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/resources/images/dspace-logo.png b/resources/images/dspace-logo.png index 5bb0b36addcc7bb68c8419881fa1f72e0e297d3e..40b59feeaaf5ab7d9b885f02820956ddda24e431 100644 GIT binary patch literal 8609 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 Fe*l0irBwg` diff --git a/src/app/+home-page/home-news/home-news.component.html b/src/app/+home-page/home-news/home-news.component.html index ffc88be574..aa3b6e914d 100644 --- a/src/app/+home-page/home-news/home-news.component.html +++ b/src/app/+home-page/home-news/home-news.component.html @@ -1,9 +1,7 @@
-
-
- -
+
+

Welcome to DSpace

DSpace is an open source software platform that enables organisations to:

diff --git a/src/app/+home-page/home-news/home-news.component.scss b/src/app/+home-page/home-news/home-news.component.scss index 4f4c6df128..dfcc293e21 100644 --- a/src/app/+home-page/home-news/home-news.component.scss +++ b/src/app/+home-page/home-news/home-news.component.scss @@ -5,12 +5,3 @@ margin-top: -$content-spacing; margin-bottom: -$content-spacing; } - -.dspace-logo-container { - margin: 10px 20px 0px 20px; -} - -.dspace-logo-container img { - max-height: 110px; - max-width: 110px; -} From b4d21d88b5cd9efbefb2f07f29ae5b799eb52c1b Mon Sep 17 00:00:00 2001 From: courtneypattison Date: Wed, 19 Dec 2018 15:15:35 -0800 Subject: [PATCH 33/41] Changed search filter cursor to pointer --- .../search-filter/search-filter.component.scss | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/app/+search-page/search-filters/search-filter/search-filter.component.scss b/src/app/+search-page/search-filters/search-filter/search-filter.component.scss index 6e49172a48..4e45f49468 100644 --- a/src/app/+search-page/search-filters/search-filter/search-filter.component.scss +++ b/src/app/+search-page/search-filters/search-filter/search-filter.component.scss @@ -2,11 +2,12 @@ @import '../../../../styles/mixins.scss'; :host { - border: 1px solid map-get($theme-colors, light); - .search-filter-wrapper.closed { - overflow: hidden; - } - .filter-toggle { - line-height: $line-height-base; - } -} \ No newline at end of file + border: 1px solid map-get($theme-colors, light); + cursor: pointer; + .search-filter-wrapper.closed { + overflow: hidden; + } + .filter-toggle { + line-height: $line-height-base; + } +} From 2e40b007ae16a881a214f98dabf824c0948929c6 Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Thu, 20 Dec 2018 11:43:04 +0100 Subject: [PATCH 34/41] Add additional typedocs to Edit Item classes --- src/app/+item-page/edit-item-page/edit-item-page.module.ts | 3 +++ .../edit-item-page/edit-item-page.routing.module.ts | 3 +++ .../edit-item-page/item-operation/itemOperation.model.ts | 4 ++++ .../abstract-simple-item-action.component.spec.ts | 4 ++++ 4 files changed, 14 insertions(+) diff --git a/src/app/+item-page/edit-item-page/edit-item-page.module.ts b/src/app/+item-page/edit-item-page/edit-item-page.module.ts index 9cc2ffe84d..0a7b363d6a 100644 --- a/src/app/+item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/+item-page/edit-item-page/edit-item-page.module.ts @@ -13,6 +13,9 @@ import {ItemPrivateComponent} from './item-private/item-private.component'; import {ItemPublicComponent} from './item-public/item-public.component'; import {ItemDeleteComponent} from './item-delete/item-delete.component'; +/** + * Module that contains all components related to the Edit Item page administrator functionality + */ @NgModule({ imports: [ CommonModule, diff --git a/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts b/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts index 3d86aab741..8ef6f43e17 100644 --- a/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts +++ b/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts @@ -14,6 +14,9 @@ const ITEM_EDIT_PRIVATE_PATH = 'private'; const ITEM_EDIT_PUBLIC_PATH = 'public'; const ITEM_EDIT_DELETE_PATH = 'delete'; +/** + * Routing module that handles the routing for the Edit Item page administrator functionality + */ @NgModule({ imports: [ RouterModule.forChild([ diff --git a/src/app/+item-page/edit-item-page/item-operation/itemOperation.model.ts b/src/app/+item-page/edit-item-page/item-operation/itemOperation.model.ts index 0104dfbdb3..105889d42d 100644 --- a/src/app/+item-page/edit-item-page/item-operation/itemOperation.model.ts +++ b/src/app/+item-page/edit-item-page/item-operation/itemOperation.model.ts @@ -1,3 +1,7 @@ +/** + * Represents an item operation used on the edit item page with a key, an operation URL to which will be navigated + * when performing the action and an option to disable the operation. + */ export class ItemOperation { operationKey: string; diff --git a/src/app/+item-page/edit-item-page/simple-item-action/abstract-simple-item-action.component.spec.ts b/src/app/+item-page/edit-item-page/simple-item-action/abstract-simple-item-action.component.spec.ts index 9343e68655..2da671517c 100644 --- a/src/app/+item-page/edit-item-page/simple-item-action/abstract-simple-item-action.component.spec.ts +++ b/src/app/+item-page/edit-item-page/simple-item-action/abstract-simple-item-action.component.spec.ts @@ -18,6 +18,10 @@ import {RestResponse} from '../../../core/cache/response-cache.models'; import {of as observableOf} from 'rxjs'; import {getItemEditPath} from '../../item-page-routing.module'; +/** + * Test component that implements the AbstractSimpleItemActionComponent used to test the + * AbstractSimpleItemActionComponent component + */ @Component({ selector: 'ds-simple-action', templateUrl: './abstract-simple-item-action.component.html' From 8ae08fc1fdb3723fad564f98d8da8a2d2da9f28d Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 20 Dec 2018 14:09:41 +0100 Subject: [PATCH 35/41] added title to admin sidebar section icon --- .../admin-sidebar-section/admin-sidebar-section.component.html | 2 +- .../admin-sidebar-section.component.spec.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/+admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.html b/src/app/+admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.html index ac2f3338d0..e72a17aac1 100644 --- a/src/app/+admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.html +++ b/src/app/+admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.html @@ -1,6 +1,6 @@