diff --git a/package.json b/package.json
index a10aeb1bc..7570c8532 100644
--- a/package.json
+++ b/package.json
@@ -27,21 +27,21 @@
},
"private": false,
"dependencies": {
- "@angular/animations": "9.1.0",
- "@angular/common": "9.1.0",
- "@angular/compiler": "9.1.0",
- "@angular/core": "9.1.0",
- "@angular/forms": "9.1.0",
- "@angular/localize": "^9.1.0",
- "@angular/platform-browser": "9.1.0",
- "@angular/platform-browser-dynamic": "9.1.0",
- "@angular/platform-server": "9.1.0",
- "@angular/router": "9.1.0",
+ "@angular/animations": "9.1.1",
+ "@angular/common": "9.1.1",
+ "@angular/compiler": "9.1.1",
+ "@angular/core": "9.1.1",
+ "@angular/forms": "9.1.1",
+ "@angular/localize": "9.1.1",
+ "@angular/platform-browser": "9.1.1",
+ "@angular/platform-browser-dynamic": "9.1.1",
+ "@angular/platform-server": "9.1.1",
+ "@angular/router": "9.1.1",
"@ng-bootstrap/ng-bootstrap": "6.0.2",
- "@ngrx/effects": "9.0.0",
- "@ngrx/entity": "9.0.0",
- "@ngrx/router-store": "9.0.0",
- "@ngrx/store": "9.0.0",
+ "@ngrx/effects": "9.1.0",
+ "@ngrx/entity": "9.1.0",
+ "@ngrx/router-store": "9.1.0",
+ "@ngrx/store": "9.1.0",
"@nguniversal/express-engine": "9.1.0",
"@ngx-translate/core": "12.1.2",
"@ngx-translate/http-loader": "4.0.0",
@@ -52,6 +52,7 @@
"font-awesome": "4.7.0",
"ie11-custom-properties": "3.0.6",
"net": "1.0.2",
+ "ng5-slider": "1.2.4",
"rxjs": "6.5.5",
"scholars-embed-utilities": "0.2.0",
"sockjs-client": "1.4.0",
@@ -63,9 +64,9 @@
"devDependencies": {
"@angular-devkit/build-angular": "0.901.0",
"@angular/cli": "9.1.0",
- "@angular/compiler-cli": "9.1.0",
- "@angular/language-service": "9.1.0",
- "@ngrx/store-devtools": "9.0.0",
+ "@angular/compiler-cli": "9.1.1",
+ "@angular/language-service": "9.1.1",
+ "@ngrx/store-devtools": "9.1.0",
"@nguniversal/builders": "9.1.0",
"@types/compression": "1.7.0",
"@types/express": "4.17.4",
diff --git a/src/app/+admin/admin.component.html b/src/app/+admin/admin.component.html
index 2fcfb03ae..aac86a034 100644
--- a/src/app/+admin/admin.component.html
+++ b/src/app/+admin/admin.component.html
@@ -9,7 +9,7 @@
-
{{ 'SHARED.SIDEBAR.ADMINISTRATION.TITLE' | translate }}
+
{{ 'ADMIN.TITLE' | translate }}
-
{{ tab.translateKey | translate }}
diff --git a/src/app/+admin/admin.component.ts b/src/app/+admin/admin.component.ts
index 9f2f5f14a..0c425e9f6 100644
--- a/src/app/+admin/admin.component.ts
+++ b/src/app/+admin/admin.component.ts
@@ -33,23 +33,23 @@ export class AdminComponent implements OnInit {
this.tabs = [
{
route: ['/admin/DirectoryViews'],
- translateKey: 'SHARED.SIDEBAR.ADMINISTRATION.DIRECTORY_VIEWS',
+ translateKey: 'ADMIN.DIRECTORY_VIEWS.TITLE',
},
{
route: ['/admin/DiscoveryViews'],
- translateKey: 'SHARED.SIDEBAR.ADMINISTRATION.DISCOVERY_VIEWS',
+ translateKey: 'ADMIN.DISCOVERY_VIEWS.TITLE',
},
{
route: ['/admin/DisplayViews'],
- translateKey: 'SHARED.SIDEBAR.ADMINISTRATION.DISPLAY_VIEWS',
+ translateKey: 'ADMIN.DISPLAY_VIEWS.TITLE',
},
{
route: ['/admin/Themes'],
- translateKey: 'SHARED.SIDEBAR.ADMINISTRATION.THEMES',
+ translateKey: 'ADMIN.THEMES.TITLE',
},
{
route: ['/admin/Users'],
- translateKey: 'SHARED.SIDEBAR.ADMINISTRATION.USERS',
+ translateKey: 'ADMIN.USERS.TITLE',
},
];
}
diff --git a/src/app/+admin/directory-views/directory-views.component.html b/src/app/+admin/directory-views/directory-views.component.html
index 90ecccda1..d8b1473df 100644
--- a/src/app/+admin/directory-views/directory-views.component.html
+++ b/src/app/+admin/directory-views/directory-views.component.html
@@ -1,5 +1,4 @@
-
- {{ 'ADMIN.DIRECTORY_VIEWS.TITLE' | translate }}
+
@@ -7,7 +6,7 @@
{{ 'ADMIN.DIRECTORY_VIEWS.LAYOUT' | translate }} |
-
+
{{directoryView.name}} |
{{directoryView.layout}} |
diff --git a/src/app/+admin/discovery-views/discovery-views.component.html b/src/app/+admin/discovery-views/discovery-views.component.html
index 798fb58c3..fee1a5a47 100644
--- a/src/app/+admin/discovery-views/discovery-views.component.html
+++ b/src/app/+admin/discovery-views/discovery-views.component.html
@@ -1,5 +1,4 @@
- {{ 'ADMIN.DISCOVERY_VIEWS.TITLE' | translate }}
diff --git a/src/app/+admin/display-views/display-views.component.html b/src/app/+admin/display-views/display-views.component.html
index 086525e0f..b0b34a799 100644
--- a/src/app/+admin/display-views/display-views.component.html
+++ b/src/app/+admin/display-views/display-views.component.html
@@ -1,5 +1,4 @@
- {{ 'ADMIN.DISPLAY_VIEWS.TITLE' | translate }}
diff --git a/src/app/+admin/themes/themes.component.html b/src/app/+admin/themes/themes.component.html
index 4a084b5f4..32b6d3e5f 100644
--- a/src/app/+admin/themes/themes.component.html
+++ b/src/app/+admin/themes/themes.component.html
@@ -1,5 +1,4 @@
- {{ 'ADMIN.THEMES.TITLE' | translate }}
diff --git a/src/app/+admin/users/users.component.html b/src/app/+admin/users/users.component.html
index 5f7e77dfb..ce8cd8f9b 100644
--- a/src/app/+admin/users/users.component.html
+++ b/src/app/+admin/users/users.component.html
@@ -1,5 +1,4 @@
- {{ 'ADMIN.USERS.TITLE' | translate }}
@@ -18,7 +17,7 @@
{{getRoleValue(user.role)}} |
{{user.active}} |
{{user.enabled}} |
- |
+ |
diff --git a/src/app/+directory/directory.component.ts b/src/app/+directory/directory.component.ts
index 7b8ec6433..d6e148787 100644
--- a/src/app/+directory/directory.component.ts
+++ b/src/app/+directory/directory.component.ts
@@ -45,7 +45,12 @@ export class DirectoryComponent implements OnDestroy, OnInit {
private subscriptions: Subscription[];
- constructor(@Inject('APP_CONFIG') private appConfig: AppConfig, private store: Store, private router: Router, private route: ActivatedRoute) {
+ constructor(
+ @Inject('APP_CONFIG') private appConfig: AppConfig,
+ private store: Store,
+ private router: Router,
+ private route: ActivatedRoute
+ ) {
this.subscriptions = [];
}
diff --git a/src/app/+discovery/discovery.component.ts b/src/app/+discovery/discovery.component.ts
index 3290d2435..7ccdb734b 100644
--- a/src/app/+discovery/discovery.component.ts
+++ b/src/app/+discovery/discovery.component.ts
@@ -29,6 +29,7 @@ import { addExportToQueryParams, getQueryParams, applyFiltersToQueryParams, show
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class DiscoveryComponent implements OnDestroy, OnInit {
+
public windowDimensions: Observable;
public url: Observable;
@@ -53,7 +54,12 @@ export class DiscoveryComponent implements OnDestroy, OnInit {
private subscriptions: Subscription[];
- constructor(@Inject('APP_CONFIG') private appConfig: AppConfig, private store: Store, private router: Router, private route: ActivatedRoute) {
+ constructor(
+ @Inject('APP_CONFIG') private appConfig: AppConfig,
+ private store: Store,
+ private router: Router,
+ private route: ActivatedRoute
+ ) {
this.subscriptions = [];
}
diff --git a/src/app/core/guard/auth.guard.ts b/src/app/core/guard/auth.guard.ts
index 7ee187b5a..33ba4149c 100644
--- a/src/app/core/guard/auth.guard.ts
+++ b/src/app/core/guard/auth.guard.ts
@@ -20,7 +20,13 @@ import * as fromRouter from '../store/router/router.actions';
@Injectable()
export class AuthGuard implements CanActivate {
- constructor(@Inject(PLATFORM_ID) private platformId: string, private alert: AlertService, private dialog: DialogService, private store: Store) {}
+
+ constructor(
+ @Inject(PLATFORM_ID) private platformId: string,
+ private alert: AlertService,
+ private dialog: DialogService,
+ private store: Store
+ ) { }
public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {
const roles = route.data.roles;
@@ -36,26 +42,20 @@ export class AuthGuard implements CanActivate {
}
private isAuthorized(url: string, roles: Role[]): Observable {
- return this.isAuthenticated(url).pipe(
- switchMap((authenticated: boolean) =>
- authenticated
- ? this.store.pipe(
- select(selectUser),
- filter((user: User) => user !== undefined),
- map((user: User) => {
- const authorized = user ? roles.indexOf(Role[user.role]) >= 0 : false;
- if (!authorized) {
- this.store.dispatch(new fromRouter.Go({ path: ['/'] }));
- if (isPlatformBrowser(this.platformId)) {
- this.store.dispatch(this.alert.unsubscribeFailureAlert());
- }
- }
- return authorized;
- })
- )
- : scheduled([false], asap)
- )
- );
+ return this.isAuthenticated(url).pipe(switchMap((authenticated: boolean) => authenticated ?
+ this.store.pipe(
+ select(selectUser),
+ filter((user: User) => user !== undefined),
+ map((user: User) => {
+ const authorized = user ? roles.indexOf(Role[user.role]) >= 0 : false;
+ if (!authorized) {
+ this.store.dispatch(new fromRouter.Go({ path: ['/'] }));
+ if (isPlatformBrowser(this.platformId)) {
+ this.store.dispatch(this.alert.unsubscribeFailureAlert());
+ }
+ }
+ return authorized;
+ })) : scheduled([false], asap)));
}
private isAuthenticated(url: string): Observable {
@@ -65,11 +65,9 @@ export class AuthGuard implements CanActivate {
if (!authenticated) {
this.store.dispatch(new fromRouter.Go({ path: ['/'] }));
if (isPlatformBrowser(this.platformId)) {
- this.store.dispatch(
- new fromAuth.SetLoginRedirectAction({
- navigation: { path: [url] },
- })
- );
+ this.store.dispatch(new fromAuth.SetLoginRedirectAction({
+ navigation: { path: [url] },
+ }));
this.store.dispatch(this.dialog.loginDialog());
this.store.dispatch(this.alert.forbiddenAlert());
}
diff --git a/src/app/core/model/sidebar/sidebar-item.ts b/src/app/core/model/sidebar/sidebar-item.ts
index 509a3faa0..79b7dd763 100644
--- a/src/app/core/model/sidebar/sidebar-item.ts
+++ b/src/app/core/model/sidebar/sidebar-item.ts
@@ -1,10 +1,10 @@
-import { Observable } from 'rxjs';
-
import { Params } from '@angular/router';
import { Action } from '@ngrx/store';
+import { Observable } from 'rxjs';
export enum SidebarItemType {
FACET = 'FACET',
+ RANGE_SLIDER = 'RANGE_SLIDER',
ACTION = 'ACTION',
INFO = 'INFO',
}
@@ -18,5 +18,7 @@ export interface SidebarItem {
action?: Action;
selected?: boolean;
parenthetical?: number;
+ rangeOptions?: any;
+ rangeValues?: any;
classes?: string;
}
diff --git a/src/app/core/model/view/collection-view.ts b/src/app/core/model/view/collection-view.ts
index 135df5625..a56345f8b 100644
--- a/src/app/core/model/view/collection-view.ts
+++ b/src/app/core/model/view/collection-view.ts
@@ -9,22 +9,23 @@ export enum OpKey {
EXPRESSION = 'EXPRESSION',
FUZZY = 'FUZZY',
NOT_EQUALS = 'NOT_EQUALS',
- STARTS_WITH = 'STARTS_WITH',
+ STARTS_WITH = 'STARTS_WITH'
}
export enum Layout {
LIST = 'LIST',
- GRID = 'GRID',
+ GRID = 'GRID'
}
export enum FacetType {
STRING = 'STRING',
DATE_YEAR = 'DATE_YEAR',
+ RANGE_SLIDER = 'RANGE_SLIDER'
}
export enum FacetSort {
COUNT = 'COUNT',
- INDEX = 'INDEX',
+ INDEX = 'INDEX'
}
export interface Sort {
@@ -48,6 +49,8 @@ export interface Facet {
readonly direction: Direction;
readonly collapsed: boolean;
readonly hidden: boolean;
+ readonly rangeMin?: number;
+ readonly rangeMax?: number;
}
export interface Filter {
diff --git a/src/app/core/store/auth/auth.effects.ts b/src/app/core/store/auth/auth.effects.ts
index 83a9a53a0..062b7bda9 100644
--- a/src/app/core/store/auth/auth.effects.ts
+++ b/src/app/core/store/auth/auth.effects.ts
@@ -28,7 +28,7 @@ import * as fromSdr from '../sdr/sdr.actions';
@Injectable()
export class AuthEffects {
- constructor(private actions: Actions, private store: Store, private alert: AlertService, private authService: AuthService, private dialog: DialogService) {}
+ constructor(private actions: Actions, private store: Store, private alert: AlertService, private authService: AuthService, private dialog: DialogService) { }
@Effect() reconnect = this.actions.pipe(
ofType(fromAuth.AuthActionTypes.LOGIN_SUCCESS, fromAuth.AuthActionTypes.LOGOUT_SUCCESS),
diff --git a/src/app/core/store/router/router.effects.ts b/src/app/core/store/router/router.effects.ts
index 850936223..89054c632 100644
--- a/src/app/core/store/router/router.effects.ts
+++ b/src/app/core/store/router/router.effects.ts
@@ -11,7 +11,6 @@ import { AppState } from '../';
import { selectLoginRedirect } from '../auth';
import * as fromAuth from '../auth/auth.actions';
-import * as fromDialog from '../dialog/dialog.actions';
import * as fromRouter from './router.actions';
@Injectable()
diff --git a/src/app/core/store/sdr/sdr.effects.ts b/src/app/core/store/sdr/sdr.effects.ts
index 6aa6fad61..ea27a917e 100644
--- a/src/app/core/store/sdr/sdr.effects.ts
+++ b/src/app/core/store/sdr/sdr.effects.ts
@@ -604,7 +604,9 @@ export class SdrEffects {
viewFacets
.filter((viewFacet: Facet) => !viewFacet.hidden)
.forEach((viewFacet: Facet) => {
+
const sdrFacet = sdrFacets.find((sf: SdrFacet) => sf.field === viewFacet.field);
+
if (sdrFacet) {
const sidebarSection: SidebarSection = {
title: scheduled([viewFacet.name], asap),
@@ -615,6 +617,41 @@ export class SdrEffects {
sidebarMenu.sections.push(sidebarSection);
+ if (viewFacet.type === FacetType.RANGE_SLIDER) {
+
+ const requestFilter = routerState.queryParams.filters.split(',').find((rf: string) => rf === sdrFacet.field);
+
+ const rangeOptions = {
+ floor: viewFacet.rangeMin,
+ ceil: viewFacet.rangeMax
+ };
+ const rangeValues = {
+ from: viewFacet.rangeMin,
+ to: viewFacet.rangeMax
+ };
+
+ if (requestFilter) {
+ const filterValue = routerState.queryParams[`${requestFilter}.filter`];
+ const range = filterValue.substring(1, filterValue.length - 1).split(' TO ');
+ rangeValues.from = range[0];
+ rangeValues.to = range[1];
+ sidebarSection.collapsed = false;
+ }
+
+ const sidebarItem: SidebarItem = {
+ type: SidebarItemType.RANGE_SLIDER,
+ label: scheduled([], asap),
+ facet: viewFacet,
+ route: [],
+ queryParams: Object.assign({}, routerState.queryParams),
+ rangeOptions,
+ rangeValues
+ };
+ sidebarItem.queryParams[`${sdrFacet.field}.filter`] = `[${sidebarItem.rangeValues.from} TO ${sidebarItem.rangeValues.to}]`;
+ sidebarItem.queryParams[`${sdrFacet.field}.opKey`] = OpKey.BETWEEN;
+ sidebarSection.items.push(sidebarItem);
+ }
+
sdrFacet.entries.content
.filter((facetEntry: SdrFacetEntry) => facetEntry.value.length > 0)
.forEach((facetEntry: SdrFacetEntry) => {
@@ -626,7 +663,9 @@ export class SdrEffects {
if (viewFacet.type === FacetType.DATE_YEAR) {
const date = new Date(facetEntry.value);
const year = date.getUTCFullYear();
- if (routerState.queryParams[`${requestFacet}.filter`] === `[${year} TO ${year + 1}]`) {
+ const from = new Date(year, 0, 1, -6).toISOString();
+ const to = new Date(year + 1, 0, 1, -6).toISOString();
+ if (routerState.queryParams[`${requestFacet}.filter`] === `[${from} TO ${to}]`) {
selected = true;
}
} else {
@@ -643,13 +682,15 @@ export class SdrEffects {
selected,
parenthetical: facetEntry.count,
route: [],
- queryParams: Object.assign({}, routerState.queryParams),
+ queryParams: Object.assign({}, routerState.queryParams)
};
if (viewFacet.type === FacetType.DATE_YEAR) {
const date = new Date(facetEntry.value);
const year = date.getUTCFullYear();
- sidebarItem.queryParams[`${sdrFacet.field}.filter`] = !selected ? `[${year} TO ${year + 1}]` : undefined;
+ const from = new Date(year, 0, 1, -6).toISOString();
+ const to = new Date(year + 1, 0, 1, -6).toISOString();
+ sidebarItem.queryParams[`${sdrFacet.field}.filter`] = !selected ? `[${from} TO ${to}]` : undefined;
sidebarItem.queryParams[`${sdrFacet.field}.opKey`] = OpKey.BETWEEN;
} else {
sidebarItem.queryParams[`${sdrFacet.field}.filter`] = !selected ? facetEntry.value : undefined;
@@ -680,7 +721,6 @@ export class SdrEffects {
sidebarItem.queryParams.filters = sdrFacet.field;
}
}
-
sidebarSection.items.push(sidebarItem);
});
@@ -720,4 +760,5 @@ export class SdrEffects {
}
this.subscribeToResourceQueue(action.name, store.stomp);
}
+
}
diff --git a/src/app/shared/recent-carousel/recent-carousel.component.scss b/src/app/shared/recent-carousel/recent-carousel.component.scss
index bb9fa2547..8de872e5f 100644
--- a/src/app/shared/recent-carousel/recent-carousel.component.scss
+++ b/src/app/shared/recent-carousel/recent-carousel.component.scss
@@ -30,7 +30,7 @@
.scroll-item {
box-sizing: border-box;
flex-direction: column;
- height: 125px;
+ height: 120px;
width: 100px;
margin: 5px;
line-height: 12px;
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
index 2d4066e47..3b445229a 100644
--- a/src/app/shared/shared.module.ts
+++ b/src/app/shared/shared.module.ts
@@ -5,6 +5,8 @@ import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
+import { Ng5SliderModule } from 'ng5-slider';
+
import { AlertComponent } from './alert/alert.component';
import { DialogComponent } from './dialog/dialog.component';
import { FacetEntriesComponent } from './dialog/facet-entries/facet-entries.component';
@@ -34,6 +36,7 @@ import { SafeUrlPipe } from './utilities/safe-url.pipe';
const MODULES = [
CommonModule,
NgbModule,
+ Ng5SliderModule,
FormsModule,
ReactiveFormsModule,
TranslateModule,
diff --git a/src/app/shared/sidebar/sidebar.component.html b/src/app/shared/sidebar/sidebar.component.html
index a8cdf3e97..77f320dcc 100644
--- a/src/app/shared/sidebar/sidebar.component.html
+++ b/src/app/shared/sidebar/sidebar.component.html
@@ -1,12 +1,13 @@