diff --git a/src/app/app-routing-paths.ts b/src/app/app-routing-paths.ts
index 6524edef77..866957f70d 100644
--- a/src/app/app-routing-paths.ts
+++ b/src/app/app-routing-paths.ts
@@ -107,6 +107,8 @@ export function getPageInternalServerErrorRoute() {
return `/${INTERNAL_SERVER_ERROR}`;
}
+export const ERROR_PAGE = 'error'
+
export const INFO_MODULE_PATH = 'info';
export function getInfoModulePath() {
return `/${INFO_MODULE_PATH}`;
diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index f0869d9fb6..1815e0ec60 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -8,6 +8,7 @@ import {
ACCESS_CONTROL_MODULE_PATH,
ADMIN_MODULE_PATH,
BITSTREAM_MODULE_PATH,
+ ERROR_PAGE,
FORBIDDEN_PATH,
FORGOT_PASSWORD_PATH,
INFO_MODULE_PATH,
@@ -31,11 +32,13 @@ import { GroupAdministratorGuard } from './core/data/feature-authorization/featu
import { ThemedPageInternalServerErrorComponent } from './page-internal-server-error/themed-page-internal-server-error.component';
import { ServerCheckGuard } from './core/server-check/server-check.guard';
import { MenuResolver } from './menu.resolver';
+import { ThemedPageErrorComponent } from './page-error/themed-page-error.component';
@NgModule({
imports: [
RouterModule.forRoot([
{ path: INTERNAL_SERVER_ERROR, component: ThemedPageInternalServerErrorComponent },
+ { path: ERROR_PAGE , component: ThemedPageErrorComponent },
{
path: '',
canActivate: [AuthBlockingGuard],
diff --git a/src/app/page-error/page-error.component.html b/src/app/page-error/page-error.component.html
new file mode 100644
index 0000000000..d0571e420d
--- /dev/null
+++ b/src/app/page-error/page-error.component.html
@@ -0,0 +1,10 @@
+
+
{{status}}
+
{{"error-page.description." + status | translate}}
+
+
{{"error-page." + code | translate}}
+
+
+ {{ status + ".link.home-page" | translate}}
+
+
diff --git a/src/app/page-error/page-error.component.scss b/src/app/page-error/page-error.component.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/src/app/page-error/page-error.component.ts b/src/app/page-error/page-error.component.ts
new file mode 100644
index 0000000000..18f0b34c47
--- /dev/null
+++ b/src/app/page-error/page-error.component.ts
@@ -0,0 +1,27 @@
+import { ChangeDetectionStrategy, Component } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+
+/**
+ * This component representing the `PageError` DSpace page.
+ */
+@Component({
+ selector: 'ds-page-error',
+ styleUrls: ['./page-error.component.scss'],
+ templateUrl: './page-error.component.html',
+ changeDetection: ChangeDetectionStrategy.Default
+})
+export class PageErrorComponent {
+ status: number;
+ code: string;
+ /**
+ * Initialize instance variables
+ *
+ * @param {ActivatedRoute} activatedRoute
+ */
+ constructor(private activatedRoute: ActivatedRoute) {
+ this.activatedRoute.queryParams.subscribe((params) => {
+ this.status = params['status'];
+ this.code = params['code'];
+ });
+ }
+}
diff --git a/src/app/page-error/themed-page-error.component.ts b/src/app/page-error/themed-page-error.component.ts
new file mode 100644
index 0000000000..34d29fb2a9
--- /dev/null
+++ b/src/app/page-error/themed-page-error.component.ts
@@ -0,0 +1,26 @@
+import { Component } from '@angular/core';
+import { ThemedComponent } from '../shared/theme-support/themed.component';
+import { PageErrorComponent } from './page-error.component';
+
+/**
+ * Themed wrapper for PageErrorComponent
+ */
+@Component({
+ selector: 'ds-themed-search-page',
+ styleUrls: [],
+ templateUrl: '../shared/theme-support/themed.component.html',
+})
+export class ThemedPageErrorComponent extends ThemedComponent {
+
+ protected getComponentName(): string {
+ return 'PageErrorComponent';
+ }
+
+ protected importThemedComponent(themeName: string): Promise {
+ return import(`../../themes/${themeName}/app/page-error/page-error.component`);
+ }
+
+ protected importUnthemedComponent(): Promise {
+ return import(`src/app/page-error/page-error.component`);
+ }
+}
diff --git a/src/app/root.module.ts b/src/app/root.module.ts
index e5a8aad949..8577f0d728 100644
--- a/src/app/root.module.ts
+++ b/src/app/root.module.ts
@@ -40,6 +40,8 @@ import {
import {
PageInternalServerErrorComponent
} from './page-internal-server-error/page-internal-server-error.component';
+import { ThemedPageErrorComponent } from './page-error/themed-page-error.component';
+import { PageErrorComponent } from './page-error/page-error.component';
const IMPORTS = [
CommonModule,
@@ -74,7 +76,9 @@ const DECLARATIONS = [
ThemedForbiddenComponent,
IdleModalComponent,
ThemedPageInternalServerErrorComponent,
- PageInternalServerErrorComponent
+ PageInternalServerErrorComponent,
+ ThemedPageErrorComponent,
+ PageErrorComponent
];
const EXPORTS = [
diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5
index c81ab66516..7ea671a0bc 100644
--- a/src/assets/i18n/en.json5
+++ b/src/assets/i18n/en.json5
@@ -27,6 +27,16 @@
"404.page-not-found": "page not found",
+ "error-page.description.401": "unauthorized",
+
+ "error-page.description.403": "forbidden",
+
+ "error-page.description.500": "Service Unavailable",
+
+ "error-page.description.404": "page not found",
+
+ "error-page.orcid.generic-error": "An error occurred during login via ORCID. Make sure you have shared your ORCID account email address with DSpace. If the error persists, contact the administrator",
+
"access-status.embargo.listelement.badge": "Embargo",
"access-status.metadata.only.listelement.badge": "Metadata only",