Merge pull request #419 from atmire/selectable-themes

Selectable themes
This commit is contained in:
Tim Donohue
2019-07-15 22:34:58 +02:00
committed by GitHub
159 changed files with 2204 additions and 795 deletions

2
.gitignore vendored
View File

@@ -5,6 +5,8 @@
/tsd_typings/ /tsd_typings/
npm-debug.log npm-debug.log
/build/
/config/environment.dev.js /config/environment.dev.js
/config/environment.prod.js /config/environment.prod.js

View File

@@ -180,5 +180,8 @@ module.exports = {
edit: { edit: {
undoTimeout: 10000 // 10 seconds undoTimeout: 10000 // 10 seconds
} }
},
theme: {
name: 'default',
} }
}; };

View File

@@ -17,15 +17,16 @@
"clean:doc": "rimraf doc", "clean:doc": "rimraf doc",
"clean:log": "rimraf *.log*", "clean:log": "rimraf *.log*",
"clean:json": "rimraf *.records.json", "clean:json": "rimraf *.records.json",
"clean:bld": "rimraf build",
"clean:node": "rimraf node_modules", "clean:node": "rimraf node_modules",
"clean:prod": "yarn run clean:coverage && yarn run clean:doc && yarn run clean:dist && yarn run clean:log && yarn run clean:json", "clean:prod": "yarn run clean:coverage && yarn run clean:doc && yarn run clean:dist && yarn run clean:log && yarn run clean:json && yarn run clean:bld",
"clean": "yarn run clean:prod && yarn run clean:node", "clean": "yarn run clean:prod && yarn run clean:node",
"prebuild": "yarn run clean:dist", "prebuild": "yarn run clean:bld && yarn run clean:dist",
"prebuild:aot": "yarn run prebuild", "prebuild:aot": "yarn run prebuild",
"prebuild:prod": "yarn run prebuild", "prebuild:prod": "yarn run prebuild",
"build": "node ./webpack/run-webpack.js --progress --mode development", "build": "node ./scripts/webpack.js --progress --mode development",
"build:aot": "node ./webpack/run-webpack.js --env.aot --env.server --mode development && node ./webpack/run-webpack.js --env.aot --env.client --mode development", "build:aot": "yarn run syncbuilddir && node ./scripts/webpack.js --env.aot --env.server --mode development && node ./scripts/webpack.js --env.aot --env.client --mode development",
"build:prod": "node ./webpack/run-webpack.js --env.aot --env.server --mode production && node ./webpack/run-webpack.js --env.aot --env.client --mode production", "build:prod": "yarn run syncbuilddir && node ./scripts/webpack.js --env.aot --env.server --mode production && node ./scripts/webpack.js --env.aot --env.client --mode production",
"postbuild:prod": "yarn run rollup", "postbuild:prod": "yarn run rollup",
"rollup": "rollup -c rollup.config.js", "rollup": "rollup -c rollup.config.js",
"prestart": "yarn run build:prod", "prestart": "yarn run build:prod",
@@ -40,7 +41,8 @@
"server": "node dist/server.js", "server": "node dist/server.js",
"server:watch": "nodemon dist/server.js", "server:watch": "nodemon dist/server.js",
"server:watch:debug": "nodemon --debug dist/server.js", "server:watch:debug": "nodemon --debug dist/server.js",
"webpack:watch": "node ./webpack/run-webpack.js -w --mode development", "syncbuilddir": "node ./scripts/sync-build-dir.js",
"webpack:watch": "node ./scripts/webpack.js -w --mode development",
"watch": "yarn run build && npm-run-all -p webpack:watch server:watch", "watch": "yarn run build && npm-run-all -p webpack:watch server:watch",
"watch:debug": "yarn run build && npm-run-all -p webpack:watch server:watch:debug", "watch:debug": "yarn run build && npm-run-all -p webpack:watch server:watch:debug",
"predebug": "yarn run build", "predebug": "yarn run build",
@@ -94,6 +96,7 @@
"compression": "1.7.1", "compression": "1.7.1",
"cookie-parser": "1.4.3", "cookie-parser": "1.4.3",
"core-js": "^2.5.7", "core-js": "^2.5.7",
"debug-loader": "^0.0.1",
"express": "4.16.2", "express": "4.16.2",
"express-session": "1.15.6", "express-session": "1.15.6",
"fast-json-patch": "^2.0.7", "fast-json-patch": "^2.0.7",
@@ -121,6 +124,7 @@
"reflect-metadata": "0.1.12", "reflect-metadata": "0.1.12",
"rxjs": "6.2.2", "rxjs": "6.2.2",
"rxjs-spy": "^7.5.1", "rxjs-spy": "^7.5.1",
"sass-resources-loader": "^2.0.0",
"sortablejs": "1.7.0", "sortablejs": "1.7.0",
"text-mask-core": "5.0.1", "text-mask-core": "5.0.1",
"ts-loader": "^5.2.1", "ts-loader": "^5.2.1",
@@ -163,6 +167,7 @@
"codelyzer": "^4.4.4", "codelyzer": "^4.4.4",
"compression-webpack-plugin": "^1.1.6", "compression-webpack-plugin": "^1.1.6",
"copy-webpack-plugin": "^4.4.1", "copy-webpack-plugin": "^4.4.1",
"copyfiles": "^2.1.0",
"coveralls": "3.0.0", "coveralls": "3.0.0",
"css-loader": "1.0.0", "css-loader": "1.0.0",
"cssnano": "^4.1.10", "cssnano": "^4.1.10",
@@ -213,7 +218,7 @@
"script-ext-html-webpack-plugin": "2.0.1", "script-ext-html-webpack-plugin": "2.0.1",
"source-map": "0.7.3", "source-map": "0.7.3",
"source-map-loader": "0.2.4", "source-map-loader": "0.2.4",
"string-replace-loader": "2.1.1", "string-replace-loader": "^2.1.1",
"to-string-loader": "1.1.5", "to-string-loader": "1.1.5",
"ts-helpers": "1.1.2", "ts-helpers": "1.1.2",
"ts-node": "4.1.0", "ts-node": "4.1.0",
@@ -224,6 +229,7 @@
"webpack-bundle-analyzer": "^3.3.2", "webpack-bundle-analyzer": "^3.3.2",
"webpack-dev-middleware": "3.2.0", "webpack-dev-middleware": "3.2.0",
"webpack-dev-server": "^3.1.5", "webpack-dev-server": "^3.1.5",
"webpack-import-glob-loader": "^1.6.3",
"webpack-merge": "4.1.4", "webpack-merge": "4.1.4",
"webpack-node-externals": "1.7.2" "webpack-node-externals": "1.7.2"
} }

View File

@@ -109,6 +109,16 @@
"link": { "link": {
"simple": "Simple item page", "simple": "Simple item page",
"full": "Full item page" "full": "Full item page"
},
"journal": {
"search": {
"title": "Articles in this journal"
}
},
"person": {
"search": {
"title": "Articles by this author"
}
} }
}, },
"select": { "select": {

BIN
resources/images/banner.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="231.893px" height="167.458px" viewBox="0 0 231.893 167.458" enable-background="new 0 0 231.893 167.458"
xml:space="preserve">
<path fill="#43515F" d="M51.733,143.32c0-1.94,1.65-3.202,4.562-3.202c3.303,0,6.798,1.115,9.419,3.543l3.835-5.146
c-3.202-2.963-7.476-4.516-12.621-4.516c-7.622,0-12.284,4.467-12.284,9.855c0,12.188,18.644,8.254,18.644,13.887
c0,1.893-1.797,3.592-5.632,3.592c-4.466,0-8.011-2.039-10.292-4.418l-3.787,5.39c3.058,3.059,7.525,5.153,13.788,5.153
c8.691,0,12.964-4.474,12.964-10.396C70.329,144.971,51.733,148.418,51.733,143.32z M100.682,134.484H85.534v32.386h6.895v-11.557
h8.254c6.99,0,10.875-4.759,10.875-10.391C111.558,139.243,107.722,134.484,100.682,134.484z M99.71,149.245h-7.283v-8.69h7.283
c2.72,0,4.808,1.651,4.808,4.368C104.518,147.592,102.43,149.245,99.71,149.245z M180.759,140.067c3.302,0,6.215,2.09,7.573,4.71
l5.923-2.913c-2.28-4.078-6.407-7.914-13.496-7.914c-9.759,0-17.283,6.75-17.283,16.75c0,9.954,7.524,16.76,17.283,16.76
c7.089,0,11.216-3.94,13.496-7.971l-5.923-2.865c-1.358,2.623-4.271,4.711-7.573,4.711c-5.924,0-10.194-4.517-10.194-10.635
C170.564,144.583,174.835,140.067,180.759,140.067z M131.958,134.484l-12.485,32.386h7.823l2.04-5.486h13.887l2.038,5.486h7.816
l-12.479-32.386H131.958z M131.228,155.313l5.05-13.936l5.05,13.936H131.228z M231.892,140.553v-6.069h-22.916v32.386h22.916v-6.07
H215.87v-7.379h15.684v-6.069H215.87v-6.797L231.892,140.553L231.892,140.553z"/>
<path fill="#43515F" d="M29.956,150.652c0-9.71-7.04-16.168-17.187-16.168H0v32.386h12.817
C22.916,166.87,29.956,160.458,29.956,150.652z M12.769,160.799H6.894v-20.246h5.924c6.603,0,10.098,4.418,10.098,10.099
C22.916,156.187,19.177,160.799,12.769,160.799z"/>
<path fill="#43515F" d="M120.726,58.569l0.109-0.006l0.116-0.01l0.106-0.013l0.11-0.01l0.11-0.023l0.109-0.019l0.106-0.023
l0.106-0.029l0.105-0.023l0.106-0.033l0.103-0.034l0.097-0.035l0.104-0.04l0.101-0.042l0.1-0.042v-0.001l0.096-0.045l0,0
l0.095-0.044l0.097-0.049l0.091-0.056v-0.001l0.094-0.05v-0.002l0.09-0.056v-0.001l0.093-0.06l0.083-0.056v-0.001l0.085-0.063
l0.088-0.065v-0.002l0.087-0.062v-0.001c0.816-0.683,1.393-1.646,1.561-2.738l0.013-0.104V54.72l0.014-0.101v-0.011l0.009-0.098
v-0.012l0.009-0.101V54.38l0.005-0.095v-0.016l0.002-0.105v-16.46l-0.002-0.105v-0.016l-0.005-0.095v-0.013l-0.009-0.101v-0.012
l-0.009-0.098v-0.011l-0.014-0.1v-0.01l-0.013-0.104c-0.167-1.092-0.744-2.057-1.561-2.738V34.3l-0.087-0.063v-0.002l-0.088-0.065
l-0.085-0.063v-0.001l-0.083-0.056l-0.093-0.061l0,0l-0.09-0.056V33.93l-0.094-0.05v-0.001l-0.091-0.056l-0.097-0.049l-0.095-0.043
V33.73l-0.096-0.045v-0.001l-0.1-0.043l-0.101-0.042l-0.104-0.04l-0.097-0.035l-0.103-0.031l-0.106-0.036l-0.105-0.023l-0.106-0.028
l-0.106-0.024l-0.109-0.019l-0.11-0.023l-0.11-0.009l-0.106-0.014l-0.116-0.01l-0.109-0.006l-0.114-0.005h-7.89
c-9.716,0-15.858-7.838-15.858-17.15V6.92c0-3.812-3.102-6.915-6.914-6.915H74.085c-3.813,0-6.92,3.106-6.92,6.915v16.682
c0,3.806,3.104,6.909,6.92,6.909h8.414c9.169,0,16.906,5.95,17.146,15.403v0.04c-0.24,9.453-7.978,15.402-17.146,15.402h-8.414
c-3.815,0-6.92,3.103-6.92,6.909v16.682c0,3.81,3.106,6.915,6.92,6.915H89.95c3.812,0,6.914-3.104,6.914-6.915v-9.223
c0-9.312,6.144-17.149,15.858-17.149h7.89L120.726,58.569z M154.772,9.956C148.631,3.814,140.15,0,130.816,0h-15.024v17.424h15.024
c4.526,0,8.647,1.858,11.64,4.849c2.99,2.99,4.849,7.112,4.849,11.639v24.042c0,4.538-1.853,8.665-4.832,11.655l-0.017-0.016
c-2.991,2.991-7.113,4.849-11.64,4.849h-15.024v17.424h15.024c9.333,0,17.814-3.814,23.956-9.956v-0.033
c6.142-6.143,9.955-14.614,9.955-23.923V33.912C164.727,24.578,160.914,16.097,154.772,9.956z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

22
scripts/sync-build-dir.js Normal file
View File

@@ -0,0 +1,22 @@
const syncBuildDir = require('copyfiles');
const path = require('path');
const {
projectRoot,
theme,
themePath,
} = require('../webpack/helpers');
const projectDepth = projectRoot('./').split(path.sep).length;
let callback;
if (theme !== null && theme !== undefined) {
callback = () => {
syncBuildDir([path.join(themePath, '**/*'), 'build'], { up: projectDepth + 2 }, () => {})
}
}
else {
callback = () => {};
}
syncBuildDir([projectRoot('src/**/*'), 'build'], { up: projectDepth + 1 }, callback);

View File

@@ -1,5 +1,3 @@
@import '../../../../styles/variables.scss';
.selectable-row:hover { .selectable-row:hover {
cursor: pointer; cursor: pointer;
} }

View File

@@ -1,5 +1,3 @@
@import '../../../../styles/variables.scss';
.selectable-row:hover { .selectable-row:hover {
cursor: pointer; cursor: pointer;
} }

View File

@@ -1 +0,0 @@
@import '../../../../styles/variables.scss';

View File

@@ -1,4 +1,4 @@
<nav @slideHorizontal class="navbar navbar-dark bg-dark p-0" <nav @slideHorizontal class="navbar navbar-dark p-0"
[ngClass]="{'active': sidebarOpen, 'inactive': sidebarClosed}" [ngClass]="{'active': sidebarOpen, 'inactive': sidebarClosed}"
[@slideSidebar]="{ [@slideSidebar]="{
value: (!(sidebarExpanded | async) ? 'collapsed' : 'expanded'), value: (!(sidebarExpanded | async) ? 'collapsed' : 'expanded'),

View File

@@ -1,5 +1,3 @@
@import '../../../styles/variables.scss';
@import '../../../styles/mixins.scss';
$icon-z-index: 10; $icon-z-index: 10;
:host { :host {
@@ -8,6 +6,7 @@ $icon-z-index: 10;
height: 100vh; height: 100vh;
flex: 1 1 auto; flex: 1 1 auto;
nav { nav {
background-color: $admin-sidebar-bg;
height: 100%; height: 100%;
flex-direction: column; flex-direction: column;
> div { > div {
@@ -44,7 +43,7 @@ $icon-z-index: 10;
.sidebar-section { .sidebar-section {
display: flex; display: flex;
align-content: stretch; align-content: stretch;
background-color: $dark; background-color: $admin-sidebar-bg;
.nav-item { .nav-item {
padding-top: $spacer; padding-top: $spacer;
padding-bottom: $spacer; padding-bottom: $spacer;

View File

@@ -1,5 +1,3 @@
@import '../../../../styles/variables.scss';
::ng-deep { ::ng-deep {
.fa-chevron-right { .fa-chevron-right {
padding-left: $spacer/2; padding-left: $spacer/2;

View File

@@ -1 +0,0 @@
@import '../../styles/variables.scss';

View File

@@ -1 +0,0 @@
@import '../../styles/variables.scss';

View File

@@ -1 +0,0 @@
@import '../../../styles/variables.scss';

View File

@@ -1 +0,0 @@
@import '../../../styles/variables.scss';

View File

@@ -1,5 +1,3 @@
@import '../../../styles/variables.scss';
:host { :host {
display: block; display: block;
margin-top: -$content-spacing; margin-top: -$content-spacing;

View File

@@ -1 +1,2 @@
@import '../../styles/variables.scss'; :host {
}

View File

@@ -1,5 +1,3 @@
@import '../../../styles/variables.scss';
.btn { .btn {
min-width: $edit-item-button-min-width; min-width: $edit-item-button-min-width;
} }

View File

@@ -1 +0,0 @@
@import '../../../../styles/variables.scss';

View File

@@ -1,4 +1,3 @@
@import '../../../../../styles/variables.scss';
.btn[disabled] { .btn[disabled] {
color: $gray-600; color: $gray-600;
border-color: $gray-600; border-color: $gray-600;

View File

@@ -1,5 +1,3 @@
@import '../../../../styles/variables.scss';
.button-row { .button-row {
.btn { .btn {
margin-right: 0.5 * $spacer; margin-right: 0.5 * $spacer;

View File

@@ -1,5 +1,3 @@
@import '../../../../styles/variables.scss';
:host { :host {
.simple-view-element { .simple-view-element {
margin-bottom: 15px; margin-bottom: 15px;

View File

@@ -1 +0,0 @@
@import '../../../../styles/variables.scss';

View File

@@ -1 +0,0 @@
@import '../../../../styles/variables.scss';

View File

@@ -1,5 +1,3 @@
@import '../../../../../styles/variables';
@import '../../../../../styles/mixins';
@media screen and (min-width: map-get($grid-breakpoints, md)) { @media screen and (min-width: map-get($grid-breakpoints, md)) {
dt { dt {
text-align: right; text-align: right;

View File

@@ -1,5 +1,3 @@
@import '../../../styles/variables.scss';
:host { :host {
div.simple-view-link { div.simple-view-link {
text-align: center; text-align: center;

View File

@@ -1,5 +1,3 @@
@import '../../styles/variables.scss';
.login-logo { .login-logo {
height: $login-logo-height; height: $login-logo-height;
width: $login-logo-width; width: $login-logo-width;

View File

@@ -1,5 +1,3 @@
@import '../../../../../styles/variables.scss';
@import '../../../../../styles/mixins.scss';
.filters { .filters {
.toggle-more-filters a { .toggle-more-filters a {

View File

@@ -1,5 +1,3 @@
@import '../../../../../../styles/variables.scss';
a { a {
color: $body-color; color: $body-color;
&:hover, &focus { &:hover, &focus {

View File

@@ -1,5 +1,3 @@
@import '../../../../../../styles/variables.scss';
a { a {
color: $link-color; color: $link-color;
&:hover { &:hover {

View File

@@ -18,6 +18,7 @@ const rangeDelimiter = '-';
@Component({ @Component({
selector: 'ds-search-facet-range-option', selector: 'ds-search-facet-range-option',
styleUrls: ['./search-facet-range-option.component.scss'], styleUrls: ['./search-facet-range-option.component.scss'],
// templateUrl: './search-facet-range-option.component.html',
templateUrl: './search-facet-range-option.component.html', templateUrl: './search-facet-range-option.component.html',
}) })

View File

@@ -1,5 +1,3 @@
@import '../../../../../../styles/variables.scss';
a { a {
color: $body-color; color: $body-color;
&:hover, &focus { &:hover, &focus {

View File

@@ -1,6 +1,3 @@
@import '../../../../styles/variables.scss';
@import '../../../../styles/mixins.scss';
:host .facet-filter { :host .facet-filter {
border: 1px solid map-get($theme-colors, light); border: 1px solid map-get($theme-colors, light);
cursor: pointer; cursor: pointer;

View File

@@ -1,6 +1,3 @@
@import '../../../../../styles/variables.scss';
@import '../../../../../styles/mixins.scss';
.filters { .filters {
.toggle-more-filters a { .toggle-more-filters a {
color: $link-color; color: $link-color;

View File

@@ -1,14 +1,10 @@
@import '../../../../../styles/variables.scss';
@import '../../../../../styles/mixins.scss';
.filters { .filters {
.toggle-more-filters a { .toggle-more-filters a {
color: $link-color; color: $link-color;
text-decoration: underline; text-decoration: underline;
cursor: pointer; cursor: pointer;
} }
} }
$slider-handle-width: 18px; $slider-handle-width: 18px;
::ng-deep ::ng-deep

View File

@@ -1,5 +1,3 @@
@import '../../../../../styles/variables.scss';
@import '../../../../../styles/mixins.scss';
.filters { .filters {
.toggle-more-filters a { .toggle-more-filters a {

View File

@@ -1,2 +0,0 @@
@import '../../../styles/variables.scss';
@import '../../../styles/mixins.scss';

View File

@@ -1,5 +1,3 @@
@import '../../styles/variables.scss';
@import '../../styles/mixins.scss';
@include media-breakpoint-down(md) { @include media-breakpoint-down(md) {
.container { .container {

View File

@@ -1,5 +1,3 @@
@import '../../../styles/variables.scss';
.setting-option { .setting-option {
border: 1px solid map-get($theme-colors, light); border: 1px solid map-get($theme-colors, light);
} }

View File

@@ -1,6 +1,3 @@
@import '../../../styles/variables.scss';
@import '../../../styles/mixins.scss';
:host { :host {
.results { .results {
line-height: $button-height; line-height: $button-height;

View File

@@ -9,7 +9,6 @@
<ds-notifications-board <ds-notifications-board
[options]="config.notifications"> [options]="config.notifications">
</ds-notifications-board> </ds-notifications-board>
<main class="main-content"> <main class="main-content">
<div class="container" *ngIf="isLoading"> <div class="container" *ngIf="isLoading">
<ds-loading message="{{'loading.default' | translate}}"></ds-loading> <ds-loading message="{{'loading.default' | translate}}"></ds-loading>

View File

@@ -1,4 +1,3 @@
@import '../styles/variables.scss';
@import '../styles/helpers/font_awesome_imports.scss'; @import '../styles/helpers/font_awesome_imports.scss';
@import '../../node_modules/bootstrap/scss/bootstrap.scss'; @import '../../node_modules/bootstrap/scss/bootstrap.scss';
@import '../../node_modules/nouislider/distribute/nouislider.min'; @import '../../node_modules/nouislider/distribute/nouislider.min';
@@ -48,4 +47,3 @@ ds-admin-sidebar {
position: fixed; position: fixed;
z-index: $sidebar-z-index; z-index: $sidebar-z-index;
} }

View File

@@ -28,10 +28,10 @@ import variables from '../styles/_exposed_variables.scss';
import { CSSVariableService } from './shared/sass-helper/sass-helper.service'; import { CSSVariableService } from './shared/sass-helper/sass-helper.service';
import { MenuService } from './shared/menu/menu.service'; import { MenuService } from './shared/menu/menu.service';
import { MenuID } from './shared/menu/initial-menus-state'; import { MenuID } from './shared/menu/initial-menus-state';
import { Observable } from 'rxjs/internal/Observable'; import { combineLatest as combineLatestObservable, Observable, of } from 'rxjs';
import { slideSidebarPadding } from './shared/animations/slide'; import { slideSidebarPadding } from './shared/animations/slide';
import { combineLatest as combineLatestObservable } from 'rxjs';
import { HostWindowService } from './shared/host-window.service'; import { HostWindowService } from './shared/host-window.service';
import { Theme } from '../config/theme.inferface';
@Component({ @Component({
selector: 'ds-app', selector: 'ds-app',
@@ -47,6 +47,7 @@ export class AppComponent implements OnInit, AfterViewInit {
slideSidebarOver: Observable<boolean>; slideSidebarOver: Observable<boolean>;
collapsedSidebarWidth: Observable<string>; collapsedSidebarWidth: Observable<string>;
totalSidebarWidth: Observable<string>; totalSidebarWidth: Observable<string>;
theme: Observable<Theme> = of({} as any);
constructor( constructor(
@Inject(GLOBAL_CONFIG) public config: GlobalConfig, @Inject(GLOBAL_CONFIG) public config: GlobalConfig,
@@ -59,7 +60,7 @@ export class AppComponent implements OnInit, AfterViewInit {
private router: Router, private router: Router,
private cssService: CSSVariableService, private cssService: CSSVariableService,
private menuService: MenuService, private menuService: MenuService,
private windowService: HostWindowService private windowService: HostWindowService,
) { ) {
// Load all the languages that are defined as active from the config file // Load all the languages that are defined as active from the config file
translate.addLangs(config.languages.filter((LangConfig) => LangConfig.active === true).map((a) => a.code)); translate.addLangs(config.languages.filter((LangConfig) => LangConfig.active === true).map((a) => a.code));
@@ -83,6 +84,7 @@ export class AppComponent implements OnInit, AfterViewInit {
} }
ngOnInit() { ngOnInit() {
const env: string = this.config.production ? 'Production' : 'Development'; const env: string = this.config.production ? 'Production' : 'Development';
const color: string = this.config.production ? 'red' : 'green'; const color: string = this.config.production ? 'red' : 'green';
console.info(`Environment: %c${env}`, `color: ${color}; font-weight: bold;`); console.info(`Environment: %c${env}`, `color: ${color}; font-weight: bold;`);

View File

@@ -1,4 +1,3 @@
import { ObjectCacheEffects } from './cache/object-cache.effects'; import { ObjectCacheEffects } from './cache/object-cache.effects';
import { UUIDIndexEffects } from './index/index.effects'; import { UUIDIndexEffects } from './index/index.effects';
import { RequestEffects } from './data/request.effects'; import { RequestEffects } from './data/request.effects';

View File

@@ -89,7 +89,7 @@ describe('ComColDataService', () => {
function initMockCommunityDataService(): CommunityDataService { function initMockCommunityDataService(): CommunityDataService {
return jasmine.createSpyObj('responseCache', { return jasmine.createSpyObj('responseCache', {
getEndpoint: hot('--a-', { a: communitiesEndpoint }), getEndpoint: hot('--a-', { a: communitiesEndpoint }),
getIDHref: cold('b-', { b: communityEndpoint }) getIDHref: communityEndpoint
}); });
} }

View File

@@ -31,7 +31,7 @@ export abstract class ComColDataService<T extends CacheableObject> extends DataS
return this.halService.getEndpoint(linkPath); return this.halService.getEndpoint(linkPath);
} else { } else {
const scopeCommunityHrefObs = this.cds.getEndpoint().pipe( const scopeCommunityHrefObs = this.cds.getEndpoint().pipe(
mergeMap((endpoint: string) => this.cds.getIDHref(endpoint, options.scopeID)), map((endpoint: string) => this.cds.getIDHref(endpoint, options.scopeID)),
filter((href: string) => isNotEmpty(href)), filter((href: string) => isNotEmpty(href)),
take(1), take(1),
tap((href: string) => { tap((href: string) => {

View File

@@ -1,4 +1,3 @@
@import '../../styles/variables.scss';
$footer-bg: $gray-100; $footer-bg: $gray-100;
$footer-border: 1px solid darken($footer-bg, 10%); $footer-border: 1px solid darken($footer-bg, 10%);
$footer-padding: $spacer * 1.5; $footer-padding: $spacer * 1.5;

View File

@@ -1,5 +1,3 @@
@import '../../styles/variables.scss';
@media screen and (max-width: map-get($grid-breakpoints, md)) { @media screen and (max-width: map-get($grid-breakpoints, md)) {
:host.open { :host.open {
background-color: $white; background-color: $white;

View File

@@ -1,5 +1,3 @@
@import '../../styles/variables.scss';
.navbar-brand img { .navbar-brand img {
height: $header-logo-height; height: $header-logo-height;
@media screen and (max-width: map-get($grid-breakpoints, sm)) { @media screen and (max-width: map-get($grid-breakpoints, sm)) {

View File

@@ -1,5 +1,3 @@
@import '../../../styles/variables.scss';
.dropdown-menu { .dropdown-menu {
overflow: hidden; overflow: hidden;
min-width: 100%; min-width: 100%;

View File

@@ -1,5 +1,3 @@
@import '../../styles/variables.scss';
nav.navbar { nav.navbar {
border-bottom: 1px $gray-400 solid; border-bottom: 1px $gray-400 solid;
align-items: baseline; align-items: baseline;
@@ -35,5 +33,3 @@ nav.navbar {
padding: 0; padding: 0;
} }
} }

View File

@@ -13,8 +13,8 @@ import { GLOBAL_CONFIG, GlobalConfig } from '../../config';
*/ */
@Component({ @Component({
selector: 'ds-navbar', selector: 'ds-navbar',
styleUrls: ['navbar.component.scss'], styleUrls: ['./navbar.component.scss'],
templateUrl: 'navbar.component.html', templateUrl: './navbar.component.html',
animations: [slideMobileNav] animations: [slideMobileNav]
}) })
export class NavbarComponent extends MenuComponent implements OnInit { export class NavbarComponent extends MenuComponent implements OnInit {

View File

@@ -1 +0,0 @@
@import '../../styles/variables.scss';

View File

@@ -1,5 +1,3 @@
@import "../../../styles/variables";
.chip-selected { .chip-selected {
background-color: map-get($theme-colors, info) !important; background-color: map-get($theme-colors, info) !important;
} }

View File

@@ -1 +0,0 @@
@import '../../../styles/variables.scss';

View File

@@ -1 +0,0 @@
@import '../../../styles/variables.scss';

View File

@@ -1 +0,0 @@
@import '../../../styles/variables.scss';

View File

@@ -1,5 +1,3 @@
@import "../../../../../../../styles/variables";
.dropdown-toggle::after { .dropdown-toggle::after {
display:none display:none
} }

View File

@@ -1,5 +1,3 @@
@import "../../../../../../../styles/variables";
/* style fa-spin */ /* style fa-spin */
.fa-spin { .fa-spin {
pointer-events: none; pointer-events: none;

View File

@@ -1,5 +1,3 @@
@import "../../../../../../../styles/variables";
:host /deep/ .dropdown-menu { :host /deep/ .dropdown-menu {
width: 100% !important; width: 100% !important;
max-height: $dropdown-menu-max-height; max-height: $dropdown-menu-max-height;

View File

@@ -1,5 +1,3 @@
@import "../../../styles/_variables.scss";
.ds-form-input-addon { .ds-form-input-addon {
border-top-right-radius: 0 !important; border-top-right-radius: 0 !important;
border-bottom-right-radius: 0 !important; border-bottom-right-radius: 0 !important;

View File

@@ -1,5 +1,3 @@
@import "../../../styles/_variables.scss";
.autocomplete { .autocomplete {
width: 100%; width: 100%;
.dropdown-item { .dropdown-item {

View File

@@ -1,5 +1,3 @@
@import '../../../styles/variables.scss';
.form-login .form-control:focus { .form-login .form-control:focus {
z-index: 2; z-index: 2;
} }

View File

@@ -1,5 +1,3 @@
@import '../../../../styles/variables.scss';
.alert { .alert {
display: inline-block; display: inline-block;
min-width: $modal-sm; min-width: $modal-sm;

View File

@@ -1,6 +1,3 @@
@import '../../../../styles/variables';
@import '../../../../styles/mixins';
.notifications-wrapper { .notifications-wrapper {
z-index: $zindex-popover; z-index: $zindex-popover;
text-align: right; text-align: right;

View File

@@ -1 +0,0 @@
@import '../../../styles/variables';

View File

@@ -1,2 +1 @@
@import '../../../../styles/variables';

View File

@@ -1,2 +1 @@
@import '../../../../styles/variables';

View File

@@ -1 +0,0 @@
@import '../../../../styles/variables';

View File

@@ -1,2 +1 @@
@import '../../../../styles/variables';

View File

@@ -1,6 +1,3 @@
@import '../../../styles/variables';
@import '../../../styles/mixins';
$ds-wrapper-grid-spacing: $spacer/2; $ds-wrapper-grid-spacing: $spacer/2;
ds-wrapper-grid-element ::ng-deep { ds-wrapper-grid-element ::ng-deep {

View File

@@ -1,5 +1,3 @@
@import '../../../../../styles/variables';
.card { .card {
a > div { a > div {
position: relative; position: relative;

View File

@@ -1,4 +1,3 @@
@import '../../../../styles/variables';
:host { :host {
/deep/ em { /deep/ em {
font-weight: bold; font-weight: bold;

View File

@@ -1,2 +1 @@
@import '../../../../styles/variables';

View File

@@ -1 +0,0 @@
@import '../../../../styles/variables';

View File

@@ -1 +0,0 @@
@import '../../../../styles/variables';

View File

@@ -1 +0,0 @@
@import '../../../../styles/variables';

View File

@@ -1 +0,0 @@
@import '../../../../styles/variables';

View File

@@ -12,6 +12,7 @@
class="item-list-authors"> class="item-list-authors">
<span *ngFor="let author of allMetadataValues(['dc.contributor.author', 'dc.creator', 'dc.contributor.*']); let last=last;"> <span *ngFor="let author of allMetadataValues(['dc.contributor.author', 'dc.creator', 'dc.contributor.*']); let last=last;">
<span [innerHTML]="author"><span [innerHTML]="author"></span></span> <span [innerHTML]="author"><span [innerHTML]="author"></span></span>
<span *ngIf="!last">; </span>
</span> </span>
</span> </span>
</ds-truncatable-part> </ds-truncatable-part>

View File

@@ -1 +0,0 @@
@import '../../../styles/variables';

View File

@@ -1,4 +1,3 @@
@import '../../../../styles/variables';
:host { :host {
::ng-deep em { ::ng-deep em {
font-weight: bold; font-weight: bold;

View File

@@ -1,2 +1 @@
@import '../../../../styles/variables';

View File

@@ -1,5 +1,3 @@
@import '../../../styles/variables.scss';
// temporary fix for bootstrap 4 beta btn color issue // temporary fix for bootstrap 4 beta btn color issue
.btn-secondary { .btn-secondary {
background-color: $input-bg; background-color: $input-bg;

View File

@@ -15,6 +15,7 @@ import { SearchService } from '../../+search-page/search-service/search.service'
@Component({ @Component({
selector: 'ds-search-form', selector: 'ds-search-form',
styleUrls: ['./search-form.component.scss'], styleUrls: ['./search-form.component.scss'],
// templateUrl: './search-form.component.html',
templateUrl: './search-form.component.html' templateUrl: './search-form.component.html'
}) })
@@ -45,6 +46,16 @@ export class SearchFormComponent {
*/ */
@Input() scopes: DSpaceObject[]; @Input() scopes: DSpaceObject[];
/**
* Whether or not the search button should be displayed large
*/
@Input() large = false;
/**
* The brand color of the search button
*/
@Input() brandColor = 'primary';
constructor(private router: Router, private searchService: SearchService) { constructor(private router: Router, private searchService: SearchService) {
} }

View File

@@ -1,5 +1,3 @@
@import '../../../../styles/variables.scss';
// temporary fix for bootstrap 4 beta btn color issue // temporary fix for bootstrap 4 beta btn color issue
.btn-secondary { .btn-secondary {
background-color: $input-bg; background-color: $input-bg;

View File

@@ -1,5 +1,3 @@
@import '../../../../styles/variables.scss';
// temporary fix for bootstrap 4 beta btn color issue // temporary fix for bootstrap 4 beta btn color issue
.btn-secondary { .btn-secondary {
background-color: $input-bg; background-color: $input-bg;

View File

@@ -1,6 +1,3 @@
@import '../../../../styles/variables';
@import '../../../../styles/mixins';
@mixin clamp($lines, $size-factor: 1, $line-height: $line-height-base) { @mixin clamp($lines, $size-factor: 1, $line-height: $line-height-base) {
$height: $line-height * $font-size-base * $size-factor; $height: $line-height * $font-size-base * $size-factor;
&.fixedHeight { &.fixedHeight {

View File

@@ -1,5 +1,3 @@
@import '../../../styles/_variables.scss';
.ds-base-drop-zone { .ds-base-drop-zone {
border: 2px dashed $gray-600; border: 2px dashed $gray-600;
} }

View File

@@ -1 +0,0 @@
@import '../../../styles/variables.scss';

View File

@@ -1,5 +1,3 @@
@import '../../../../styles/variables';
.scrollable-menu { .scrollable-menu {
height: auto; height: auto;
max-height: $dropdown-menu-max-height; max-height: $dropdown-menu-max-height;

View File

@@ -1,4 +1,10 @@
import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA, DebugElement, SimpleChange } from '@angular/core'; import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
DebugElement,
SimpleChange
} from '@angular/core';
import { async, ComponentFixture, fakeAsync, inject, TestBed, tick } from '@angular/core/testing'; import { async, ComponentFixture, fakeAsync, inject, TestBed, tick } from '@angular/core/testing';
import { By } from '@angular/platform-browser'; import { By } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@@ -10,7 +16,10 @@ import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { SubmissionServiceStub } from '../../../shared/testing/submission-service-stub'; import { SubmissionServiceStub } from '../../../shared/testing/submission-service-stub';
import { mockSubmissionId, mockSubmissionRestResponse } from '../../../shared/mocks/mock-submission'; import {
mockSubmissionId,
mockSubmissionRestResponse
} from '../../../shared/mocks/mock-submission';
import { SubmissionService } from '../../submission.service'; import { SubmissionService } from '../../submission.service';
import { SubmissionFormCollectionComponent } from './submission-form-collection.component'; import { SubmissionFormCollectionComponent } from './submission-form-collection.component';
import { CommunityDataService } from '../../../core/data/community-data.service'; import { CommunityDataService } from '../../../core/data/community-data.service';
@@ -25,28 +34,8 @@ import { PageInfo } from '../../../core/shared/page-info.model';
import { Collection } from '../../../core/shared/collection.model'; import { Collection } from '../../../core/shared/collection.model';
import { createTestComponent } from '../../../shared/testing/utils'; import { createTestComponent } from '../../../shared/testing/utils';
import { cold } from 'jasmine-marbles'; import { cold } from 'jasmine-marbles';
import { SearchResult } from '../../../+search-page/search-result.model';
const subcommunities = [Object.assign(new Community(), { import { SearchService } from '../../../+search-page/search-service/search.service';
name: 'SubCommunity 1',
id: '123456789-1',
metadata: [
{
key: 'dc.title',
language: 'en_US',
value: 'SubCommunity 1'
}]
}),
Object.assign(new Community(), {
name: 'SubCommunity 1',
id: '123456789s-1',
metadata: [
{
key: 'dc.title',
language: 'en_US',
value: 'SubCommunity 1'
}]
})
];
const mockCommunity1Collection1 = Object.assign(new Collection(), { const mockCommunity1Collection1 = Object.assign(new Collection(), {
name: 'Community 1-Collection 1', name: 'Community 1-Collection 1',
@@ -92,45 +81,20 @@ const mockCommunity2Collection2 = Object.assign(new Collection(), {
}] }]
}); });
const mockCommunity = Object.assign(new Community(), { const collectionResults = [mockCommunity1Collection1, mockCommunity1Collection2, mockCommunity2Collection1, mockCommunity2Collection2].map((collection: Collection) => Object.assign(new SearchResult<Collection>(), { indexableObject: collection }));
name: 'Community 1', const searchService = {
id: '123456789-1', search: () => {
metadata: [ return observableOf(new RemoteData(true, true, true,
{ undefined, new PaginatedList(new PageInfo(), collectionResults)))
key: 'dc.title', }
language: 'en_US', };
value: 'Community 1'
}],
collections: observableOf(new RemoteData(true, true, true,
undefined, new PaginatedList(new PageInfo(), [mockCommunity1Collection1, mockCommunity1Collection2]))),
subcommunities: observableOf(new RemoteData(true, true, true,
undefined, new PaginatedList(new PageInfo(), subcommunities))),
});
const mockCommunity2 = Object.assign(new Community(), {
name: 'Community 2',
id: '123456789-2',
metadata: [
{
key: 'dc.title',
language: 'en_US',
value: 'Community 2'
}],
collections: observableOf(new RemoteData(true, true, true,
undefined, new PaginatedList(new PageInfo(), [mockCommunity2Collection1, mockCommunity2Collection2]))),
subcommunities: observableOf(new RemoteData(true, true, true,
undefined, new PaginatedList(new PageInfo(), []))),
});
const mockCommunityList = observableOf(new RemoteData(true, true, true,
undefined, new PaginatedList(new PageInfo(), [mockCommunity, mockCommunity2])));
const mockCollectionList = [ const mockCollectionList = [
{ {
communities: [ communities: [
{ {
id: '123456789-1', id: 'c0e4de93-f506-4990-a840-d406f6f2ada7',
name: 'Community 1' name: 'Submission test'
} }
], ],
collection: { collection: {
@@ -141,8 +105,8 @@ const mockCollectionList = [
{ {
communities: [ communities: [
{ {
id: '123456789-1', id: 'c0e4de93-f506-4990-a840-d406f6f2ada7',
name: 'Community 1' name: 'Submission test'
} }
], ],
collection: { collection: {
@@ -153,8 +117,8 @@ const mockCollectionList = [
{ {
communities: [ communities: [
{ {
id: '123456789-2', id: 'c0e4de93-f506-4990-a840-d406f6f2ada7',
name: 'Community 2' name: 'Submission test'
} }
], ],
collection: { collection: {
@@ -165,8 +129,8 @@ const mockCollectionList = [
{ {
communities: [ communities: [
{ {
id: '123456789-2', id: 'c0e4de93-f506-4990-a840-d406f6f2ada7',
name: 'Community 2' name: 'Submission test'
} }
], ],
collection: { collection: {
@@ -214,11 +178,15 @@ describe('SubmissionFormCollectionComponent Component', () => {
TestComponent TestComponent
], ],
providers: [ providers: [
{ provide: SubmissionJsonPatchOperationsService, useClass: SubmissionJsonPatchOperationsServiceStub }, {
provide: SubmissionJsonPatchOperationsService,
useClass: SubmissionJsonPatchOperationsServiceStub
},
{ provide: SubmissionService, useClass: SubmissionServiceStub }, { provide: SubmissionService, useClass: SubmissionServiceStub },
{ provide: CommunityDataService, useValue: communityDataService }, { provide: CommunityDataService, useValue: communityDataService },
{ provide: JsonPatchOperationsBuilder, useValue: jsonPatchOpBuilder }, { provide: JsonPatchOperationsBuilder, useValue: jsonPatchOpBuilder },
{ provide: Store, useValue: store }, { provide: Store, useValue: store },
{ provide: SearchService, useValue: searchService },
ChangeDetectorRef, ChangeDetectorRef,
SubmissionFormCollectionComponent SubmissionFormCollectionComponent
], ],
@@ -283,14 +251,11 @@ describe('SubmissionFormCollectionComponent Component', () => {
}); });
it('should init collection list properly', () => { it('should init collection list properly', () => {
communityDataService.findAll.and.returnValue(mockCommunityList);
comp.ngOnChanges({ comp.ngOnChanges({
currentCollectionId: new SimpleChange(null, collectionId, true) currentCollectionId: new SimpleChange(null, collectionId, true)
}); });
expect(comp.searchListCollection$).toBeObservable(cold('(ab)', { expect(comp.searchListCollection$).toBeObservable(cold('(b)', {
a: [],
b: mockCollectionList b: mockCollectionList
})); }));
@@ -428,6 +393,8 @@ class TestComponent {
definitionId = 'traditional'; definitionId = 'traditional';
submissionId = mockSubmissionId; submissionId = mockSubmissionId;
onCollectionChange = () => { return; } onCollectionChange = () => {
return;
}
} }

Some files were not shown because too many files have changed in this diff Show More