From 54da3c1d86c7df439f53209affc09d80f9c3dc27 Mon Sep 17 00:00:00 2001
From: Florent Poittevin <florent.poittevin@unige.ch>
Date: Mon, 1 Jul 2019 16:48:14 +0200
Subject: [PATCH] Style link on the app Add dialog to see detail of file Style
 file tree

---
 .../components/footer/footer.component.scss   |   7 +-
 .../language-selector.component.scss          |   8 +
 .../main-toolbar-mobile.component.scss        |   8 +
 .../main-toolbar/main-toolbar.component.scss  |   8 +
 .../file-tree/file-tree.component.html        |  24 +-
 .../file-tree/file-tree.component.scss        |  33 ++
 .../file-tree/file-tree.component.ts          |  19 +-
 src/app/deposit/deposit.module.ts             |   6 +-
 .../file-detail/file-detail.dialog.html       | 109 ++++++
 .../file-detail/file-detail.dialog.scss       |  24 ++
 .../dialogs/file-detail/file-detail.dialog.ts |  27 ++
 src/app/material.module.ts                    |  11 +-
 .../breadcrumb/breadcrumb.component.scss      |  10 -
 src/assets/i18n/de.json                       | 319 ++++++++++--------
 src/assets/i18n/en.json                       | 319 ++++++++++--------
 src/assets/i18n/fr.json                       |  23 ++
 src/environments/environment.ts               |   2 +-
 src/sass/abstracts/_variables.scss            |   1 +
 src/sass/main.scss                            |  27 +-
 src/sass/themes/dlcm-theme.scss               |   1 +
 src/sass/themes/yareta-theme.scss             |   1 +
 21 files changed, 669 insertions(+), 318 deletions(-)
 create mode 100644 src/app/deposit/dialogs/file-detail/file-detail.dialog.html
 create mode 100644 src/app/deposit/dialogs/file-detail/file-detail.dialog.scss
 create mode 100644 src/app/deposit/dialogs/file-detail/file-detail.dialog.ts

diff --git a/src/app/components/footer/footer.component.scss b/src/app/components/footer/footer.component.scss
index c18d8a956..fc906c2dd 100644
--- a/src/app/components/footer/footer.component.scss
+++ b/src/app/components/footer/footer.component.scss
@@ -26,7 +26,10 @@ $height: 40px;
   font-weight: bold;
 
   &:hover {
-    color: white;
-    text-decoration: underline;
+    color: $white;
+  }
+
+  &:before {
+    background-color: $white;
   }
 }
diff --git a/src/app/components/language-selector/language-selector.component.scss b/src/app/components/language-selector/language-selector.component.scss
index 9c0892acc..bb229a67e 100644
--- a/src/app/components/language-selector/language-selector.component.scss
+++ b/src/app/components/language-selector/language-selector.component.scss
@@ -7,3 +7,11 @@
 .is-active {
   color: $primary-color;
 }
+
+a {
+  color: $white;
+
+  &:hover {
+    color: $primary-color;
+  }
+}
diff --git a/src/app/components/main-toolbar-mobile/main-toolbar-mobile.component.scss b/src/app/components/main-toolbar-mobile/main-toolbar-mobile.component.scss
index d4cb3e324..d3b04c161 100644
--- a/src/app/components/main-toolbar-mobile/main-toolbar-mobile.component.scss
+++ b/src/app/components/main-toolbar-mobile/main-toolbar-mobile.component.scss
@@ -9,6 +9,14 @@
   color: $white;
 }
 
+a {
+  color: $white;
+
+  &:hover {
+    color: $primary-color;
+  }
+}
+
 .unige-logo {
   max-height: 50px;
 }
diff --git a/src/app/components/main-toolbar/main-toolbar.component.scss b/src/app/components/main-toolbar/main-toolbar.component.scss
index 90686701d..44053c96e 100644
--- a/src/app/components/main-toolbar/main-toolbar.component.scss
+++ b/src/app/components/main-toolbar/main-toolbar.component.scss
@@ -10,6 +10,14 @@
   color: $white;
 }
 
+a {
+  color: $white;
+
+  &:hover {
+    color: $primary-color;
+  }
+}
+
 .logo {
   align-self: center;
 }
diff --git a/src/app/deposit/components/file-tree/file-tree.component.html b/src/app/deposit/components/file-tree/file-tree.component.html
index c6b424136..307d63e72 100644
--- a/src/app/deposit/components/file-tree/file-tree.component.html
+++ b/src/app/deposit/components/file-tree/file-tree.component.html
@@ -6,8 +6,26 @@
   <mat-tree-node *matTreeNodeDef="let node" matTreeNodeToggle>
     <li class="mat-tree-node">
       <!-- use a disabled button to provide padding for tree leaf -->
-      <button mat-icon-button disabled></button>
-      <a href="{{getSourceData(node)}}" target="_blank">{{node.name}}</a> - {{getStatus(node)}}
+      <!--      <button mat-icon-button disabled></button>-->
+      <mat-card class="file">
+        <span>
+          <fa-icon class="ico-file" icon="file"></fa-icon>
+          <a href="{{getSourceData(node)}}" target="_blank">{{node.name}}</a>
+        </span>
+        <div class="right-part">
+          <span *ngIf="isInError(node)"
+                [matTooltip]="'deposit.file.tree.error' | translate"
+                class="status">
+            <fa-icon icon="exclamation-triangle"></fa-icon>
+          </span>
+          <button mat-icon-button
+                  class="more"
+                  (click)="openDetailDialog(node)"
+                  [matTooltip]="'deposit.file.tree.details' | translate">
+            <fa-icon icon="ellipsis-v"></fa-icon>
+          </button>
+        </div>
+      </mat-card>
     </li>
   </mat-tree-node>
 
@@ -17,7 +35,7 @@
       <div class="mat-tree-node">
         <button mat-icon-button matTreeNodeToggle
                 [attr.aria-label]="'toggle ' + node.name">
-          <fa-icon [icon]="treeControl.isExpanded(node) ? 'chevron-down' : 'chevron-right'"></fa-icon>
+          <fa-icon [icon]="treeControl.isExpanded(node) ? 'folder-open' : 'folder'"></fa-icon>
         </button>
         {{node.name}}
       </div>
diff --git a/src/app/deposit/components/file-tree/file-tree.component.scss b/src/app/deposit/components/file-tree/file-tree.component.scss
index 6ceec9236..c74d85490 100644
--- a/src/app/deposit/components/file-tree/file-tree.component.scss
+++ b/src/app/deposit/components/file-tree/file-tree.component.scss
@@ -15,3 +15,36 @@ $line-item-size: 30px;
     line-height: $line-item-size;
   }
 }
+
+.file {
+  width: 100%;
+  padding: 5px 8px;
+  margin: 4px 1px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.ico-file {
+  padding-right: 10px;
+}
+
+.right-part {
+  width: 60px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.status {
+  padding-top: 2px;
+  color: $red;
+}
+
+a {
+  position: initial;
+
+  &:before {
+    bottom: 0;
+  }
+}
diff --git a/src/app/deposit/components/file-tree/file-tree.component.ts b/src/app/deposit/components/file-tree/file-tree.component.ts
index 498d829e8..3f3efdd33 100644
--- a/src/app/deposit/components/file-tree/file-tree.component.ts
+++ b/src/app/deposit/components/file-tree/file-tree.component.ts
@@ -1,6 +1,7 @@
 import {NestedTreeControl} from "@angular/cdk/tree";
 import {ChangeDetectionStrategy, Component, Input} from "@angular/core";
-import {MatTreeNestedDataSource} from "@angular/material";
+import {MatDialog, MatTreeNestedDataSource} from "@angular/material";
+import {FileDetailDialog} from "@app/deposit/dialogs/file-detail/file-detail.dialog";
 import {DepositDataFileModel} from "@app/deposit/models/deposit-data-file.model";
 import {StringUtil} from "@app/shared/utils/string.util";
 
@@ -22,6 +23,8 @@ export class FileTreeComponent {
   @Input()
   readonly: boolean;
 
+  readonly inErrorStatus: string = "IN_ERROR";
+
   @Input()
   set listDepositDataFile(val: DepositDataFileModel[]) {
     this._listDepositDataFile = val;
@@ -41,7 +44,7 @@ export class FileTreeComponent {
   private readonly SEPARATOR = "/";
   private readonly ROOT = this.SEPARATOR;
 
-  constructor() {
+  constructor(public dialog: MatDialog) {
   }
 
   adaptListDepositDataFileToTree(): void {
@@ -133,4 +136,16 @@ export class FileTreeComponent {
   getSourceData(node: FileNode): string {
     return node.file.sourceData;
   }
+
+  isInError(node: FileNode): boolean {
+    return node.file.status === this.inErrorStatus;
+  }
+
+  openDetailDialog(node: FileNode) {
+    const dialogRef = this.dialog.open(FileDetailDialog, {
+      data: node.file,
+      height: "400px",
+      width: "600px",
+    });
+  }
 }
diff --git a/src/app/deposit/deposit.module.ts b/src/app/deposit/deposit.module.ts
index 3884cf537..ba4a3717a 100644
--- a/src/app/deposit/deposit.module.ts
+++ b/src/app/deposit/deposit.module.ts
@@ -4,16 +4,17 @@ import {FileContainer} from "@app/deposit/containers/file/file.container";
 import {DepositRoutingModule} from "@app/deposit/deposit-routing.module";
 import {DepositState} from "@app/deposit/deposit.state";
 import {DeleteDialog} from "@app/deposit/dialogs/delete/delete.dialog";
+import {FileDetailDialog} from "@app/deposit/dialogs/file-detail/file-detail.dialog";
 import {DepositService} from "@app/deposit/services/deposit.service";
 import {EditView} from "@app/deposit/views/edit/edit.view";
 import {ListView} from "@app/deposit/views/list/list.view";
 import {SharedModule} from "@app/shared/shared.module";
 import {TranslateModule} from "@ngx-translate/core";
 import {NgxsModule} from "@ngxs/store";
+import {FileTreeComponent} from "./components/file-tree/file-tree.component";
+import {FileUploadComponent} from "./components/file-upload/file-upload.component";
 import {CreateView} from "./views/create/create.view";
 import {DetailView} from "./views/detail/detail.view";
-import { FileTreeComponent } from './components/file-tree/file-tree.component';
-import { FileUploadComponent } from './components/file-upload/file-upload.component';
 
 const views = [
   ListView,
@@ -26,6 +27,7 @@ const containers = [
 ];
 const dialogs = [
   DeleteDialog,
+  FileDetailDialog,
 ];
 const components = [
   FormComponent,
diff --git a/src/app/deposit/dialogs/file-detail/file-detail.dialog.html b/src/app/deposit/dialogs/file-detail/file-detail.dialog.html
new file mode 100644
index 000000000..d5d6f33e4
--- /dev/null
+++ b/src/app/deposit/dialogs/file-detail/file-detail.dialog.html
@@ -0,0 +1,109 @@
+<h1 mat-dialog-title>{{'deposit.file.details.title' | translate:paramMessage}}</h1>
+<mat-list>
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.createDate' | translate}}</span>
+      <span class="value">{{data.creation.when | date}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.status' | translate}}</span>
+      <span class="value">{{data.status}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.statusMessage' | translate}}</span>
+      <span class="value">{{data.statusMessage}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.category' | translate}}</span>
+      <span class="value">{{data.dataCategory}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.type' | translate}}</span>
+      <span class="value">{{data.dataType}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.complianceLevel' | translate}}</span>
+      <span class="value">{{data.complianceLevel}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.smartSize' | translate}}</span>
+      <span class="value">{{data.smartSize}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.available' | translate}}</span>
+      <span class="value">{{data.available}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.fileFormat' | translate}}</span>
+      <span class="value">{{data.fileFormat}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.virusCheck' | translate}}</span>
+      <span class="value">{{data.virusCheck}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.initialPath' | translate}}</span>
+      <span class="value">{{data.initialPath}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.fileSize' | translate}}</span>
+      <span class="value">{{data.fileSize}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+
+  <mat-list-item>
+    <div class="item-content">
+      <span class="key">{{'deposit.file.detail.data.checksums' | translate}}</span>
+      <span class="value">{{data.checksums | json}}</span>
+    </div>
+  </mat-list-item>
+  <mat-divider></mat-divider>
+</mat-list>
+<div mat-dialog-actions>
+  <button mat-button cdkFocusInitial (click)="close()">{{'deposit.file.details.close' | translate}}</button>
+</div>
diff --git a/src/app/deposit/dialogs/file-detail/file-detail.dialog.scss b/src/app/deposit/dialogs/file-detail/file-detail.dialog.scss
new file mode 100644
index 000000000..29df397b5
--- /dev/null
+++ b/src/app/deposit/dialogs/file-detail/file-detail.dialog.scss
@@ -0,0 +1,24 @@
+@import "abstracts/variables";
+@import "abstracts/mixins";
+
+.item-content {
+  display: flex;
+  justify-content: flex-end;
+  width: 100%;
+  flex-wrap: wrap;
+
+  @include respond-to('sm') {
+    justify-content: space-between;
+  }
+}
+
+.key {
+  flex-basis: 100%;
+  color: $light-grey;
+
+  @include respond-to('sm') {
+    flex-basis: auto;
+    color: initial;
+  }
+}
+
diff --git a/src/app/deposit/dialogs/file-detail/file-detail.dialog.ts b/src/app/deposit/dialogs/file-detail/file-detail.dialog.ts
new file mode 100644
index 000000000..3a6606d22
--- /dev/null
+++ b/src/app/deposit/dialogs/file-detail/file-detail.dialog.ts
@@ -0,0 +1,27 @@
+import {ChangeDetectionStrategy, Component, Inject, OnInit} from "@angular/core";
+import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material";
+import {DepositDataFileModel} from "@app/deposit/models/deposit-data-file.model";
+import {BaseDirective} from "@app/shared/directives/base.directive";
+
+@Component({
+  selector: "dlcm-file-detail-dialog",
+  templateUrl: "./file-detail.dialog.html",
+  styleUrls: ["./file-detail.dialog.scss"],
+  changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class FileDetailDialog extends BaseDirective implements OnInit {
+  paramMessage = {name: ""};
+
+  constructor(protected dialogRef: MatDialogRef<FileDetailDialog>,
+              @Inject(MAT_DIALOG_DATA) public data: DepositDataFileModel) {
+    super();
+  }
+
+  ngOnInit() {
+    this.paramMessage.name = this.data.fileName;
+  }
+
+  close() {
+    this.dialogRef.close();
+  }
+}
diff --git a/src/app/material.module.ts b/src/app/material.module.ts
index 6f7b5a533..44eea37c9 100644
--- a/src/app/material.module.ts
+++ b/src/app/material.module.ts
@@ -1,10 +1,14 @@
 import {NgModule} from "@angular/core";
 import {
   MatButtonModule,
+  MatCardModule,
   MatCheckboxModule,
   MatDatepickerModule,
   MatDialogModule,
+  MatDividerModule,
+  MatExpansionModule,
   MatInputModule,
+  MatListModule,
   MatNativeDateModule,
   MatPaginatorModule,
   MatProgressSpinnerModule,
@@ -12,7 +16,8 @@ import {
   MatSnackBarModule,
   MatTabsModule,
   MatToolbarModule,
-  MatTooltipModule, MatTreeModule,
+  MatTooltipModule,
+  MatTreeModule,
 } from "@angular/material";
 
 const modules = [
@@ -23,6 +28,7 @@ const modules = [
   MatButtonModule,
   MatSnackBarModule,
   MatDialogModule,
+  MatDividerModule,
   MatDatepickerModule,
   MatNativeDateModule,
   MatSelectModule,
@@ -30,6 +36,9 @@ const modules = [
   MatPaginatorModule,
   MatTooltipModule,
   MatTreeModule,
+  MatExpansionModule,
+  MatCardModule,
+  MatListModule,
 ];
 
 @NgModule({
diff --git a/src/app/shared/components/breadcrumb/breadcrumb.component.scss b/src/app/shared/components/breadcrumb/breadcrumb.component.scss
index a177177e1..114543451 100644
--- a/src/app/shared/components/breadcrumb/breadcrumb.component.scss
+++ b/src/app/shared/components/breadcrumb/breadcrumb.component.scss
@@ -18,13 +18,3 @@ li + li:before {
   color: $dark-grey;
   content: "/\00a0";
 }
-
-a {
-  color: $primary-color;
-  text-decoration: none;
-
-  &:hover {
-    color: $accent-color;
-    text-decoration: underline;
-  }
-}
diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json
index 285536710..01eebe58c 100644
--- a/src/assets/i18n/de.json
+++ b/src/assets/i18n/de.json
@@ -1,105 +1,128 @@
 {
-	"access": {
-		"organizationalUnitNotFound": "Unable to get data",
-		"table": {
-			"header": {
-				"accessLevel": "Access Level",
-				"organizationalUnit": "Organizational Unit",
-				"title": "Title",
-				"yearPublicationDate": "Publication Year"
-			}
-		}
-	},
-	"app": {
-		"login": {
-			"loginButton": "Log in",
-			"loginMessage": "You are currently not connected, please log in to continue."
-		},
-		"toolbar": {
-			"deposit": "Deposits",
-			"home": "Home",
-			"login": "Log in",
-			"logout": "Log out",
-			"organizationalUnit": "Organizational Units"
-		}
-	},
-	"breadcrumb": {
-		"access": {
-			"root": "Access",
-			"search": "Search"
-		},
-		"deposit": {
-			"create": "Create",
-			"detail": "Detail",
-			"edit": "Edit",
-			"list": "List",
-			"root": "Deposits"
-		},
-		"home": "Home",
-		"organizationalUnit": {
-			"create": "Create",
-			"detail": "Detail",
-			"edit": "Edit",
-			"list": "List",
-			"root": "Organizational Units"
-		}
-	},
-	"deposit": {
-		"accessLevel": "Access Level",
-		"author": "Author",
-		"collectionBegin": "Data Collection Start Date",
-		"collectionEnd": "Data Collection End Date",
-		"delete": "Delete",
-		"description": "Description",
-		"dialog": {
-			"delete": {
-				"cancel": "Cancel",
-				"confirm": "Yes",
-				"message": "Are you sure you want to delete the deposit '{{name}}'?",
-				"title": "Confirm deletion"
-			}
-		},
-		"edit": "Edit",
-		"file": {
-			"search": "Choose file",
-			"tree": {
-				"label": ""
-			},
-			"uploadButton": "Upload"
-		},
-		"hasEmbargo": "The deposit has an embargo",
-		"hint": {
-			"author": "Author"
-		},
-		"language": "Language",
-		"license": "License",
-		"new": "Create deposit",
-		"organizationUnit": "Organizational Unit",
-		"preservationPolicy": "Preservation Policy",
-		"publicationDate": "Publication Date",
-		"refresh": "Refresh",
-		"submissionPolicy": "Submission Policy",
-		"submit": "Submit",
-		"tab": {
-			"datafiles": "Data Files",
-			"details": "Details"
-		},
-		"table": {
-			"header": {
-				"creation": {
-					"when": "Created"
-				},
-				"lastUpdate": {
-					"when": "Last updated"
-				},
-				"publicationDate": "Publication date",
-				"status": "Status",
-				"title": "Title"
-			}
-		},
-		"title": "Title"
-	},
-	"error": {
+  "access": {
+    "organizationalUnitNotFound": "Unable to get data",
+    "table": {
+      "header": {
+        "accessLevel": "Access Level",
+        "organizationalUnit": "Organizational Unit",
+        "title": "Title",
+        "yearPublicationDate": "Publication Year"
+      }
+    }
+  },
+  "app": {
+    "login": {
+      "loginButton": "Log in",
+      "loginMessage": "You are currently not connected, please log in to continue."
+    },
+    "toolbar": {
+      "deposit": "Deposits",
+      "home": "Home",
+      "login": "Log in",
+      "logout": "Log out",
+      "organizationalUnit": "Organizational Units"
+    }
+  },
+  "breadcrumb": {
+    "access": {
+      "root": "Access",
+      "search": "Search"
+    },
+    "deposit": {
+      "create": "Create",
+      "detail": "Detail",
+      "edit": "Edit",
+      "list": "List",
+      "root": "Deposits"
+    },
+    "home": "Home",
+    "organizationalUnit": {
+      "create": "Create",
+      "detail": "Detail",
+      "edit": "Edit",
+      "list": "List",
+      "root": "Organizational Units"
+    }
+  },
+  "deposit": {
+    "accessLevel": "Access Level",
+    "author": "Author",
+    "collectionBegin": "Data Collection Start Date",
+    "collectionEnd": "Data Collection End Date",
+    "delete": "Delete",
+    "description": "Description",
+    "dialog": {
+      "delete": {
+        "cancel": "Cancel",
+        "confirm": "Yes",
+        "message": "Are you sure you want to delete the deposit '{{name}}'?",
+        "title": "Confirm deletion"
+      }
+    },
+    "edit": "Edit",
+    "file": {
+      "detail": {
+        "data": {
+          "available": "Available",
+          "category": "Category",
+          "checksums": "Checksums",
+          "complianceLevel": "Compliance level",
+          "createDate": "Creation date",
+          "fileFormat": "File format",
+          "fileSize": "File size",
+          "initialPath": "Initial path",
+          "smartSize": "Smart size",
+          "status": "Status",
+          "statusMessage": "Status message",
+          "type": "Type",
+          "virusCheck": "Virus check"
+        }
+      },
+      "details": {
+        "close": "Close",
+        "title": "Details of file \"{{name}}\""
+      },
+      "search": "Choose file",
+      "tree": {
+        "details": "Details",
+        "error": "The file is in error state",
+        "label": "List of files :"
+      },
+      "uploadButton": "Upload"
+    },
+    "hasEmbargo": "The deposit has an embargo",
+    "hint": {
+      "author": "Author"
+    },
+    "language": "Language",
+    "license": "License",
+    "new": "Create deposit",
+    "organizationUnit": "Organizational Unit",
+    "preservationPolicy": "Preservation Policy",
+    "publicationDate": "Publication Date",
+    "refresh": "Refresh",
+    "submissionPolicy": "Submission Policy",
+    "submit": "Submit",
+    "tab": {
+      "datafiles": "Data Files",
+      "details": "Details"
+    },
+    "table": {
+      "header": {
+        "creation": {
+          "when": "Created"
+        },
+        "lastUpdate": {
+          "when": "Last updated"
+        },
+        "publicationDate": "Publication date",
+        "status": "Status",
+        "title": "Title"
+      }
+    },
+    "title": "Title"
+  },
+  "error": {
 		"http": {
 			"forbidden": "You can't do this action",
 			"notFound": "The resource requested not exist",
@@ -114,51 +137,51 @@
 		}
 	},
 	"organizationalUnit": {
-		"closingDate": "Closing Date",
-		"delete": "Delete",
-		"description": "Description",
-		"dialog": {
-			"delete": {
-				"cancel": "Cancel",
-				"confirm": "Yes",
-				"message": "Are you sure you want to delete the organizational unit '{{name}}'?",
-				"title": "Confirm deletion"
-			}
-		},
-		"edit": "Edit",
-		"isEmpty": "Is Empty",
-		"name": "Name",
-		"new": "Create new organizational unit",
-		"open": "Open",
-		"openingDate": "Opening Date",
-		"refresh": "Refresh",
-		"submissionPolicy": "Submission policy",
-		"submit": "Submit",
-		"table": {
-			"header": {
-				"creation": {
-					"when": "Created"
-				},
-				"description": "Description",
-				"name": "Name"
-			}
-		}
-	},
-	"required": "This field is required",
-	"search": "Search",
-	"table": {
-		"nodata": "No data has been found",
-		"paginator": {
-			"firstPage": "First page",
-			"itemPerPage": "Items per page",
-			"lastPage": "Last page",
-			"nextPage": "Next page",
-			"ofLabel": "of",
-			"previousPage": "Previous page"
-		}
-	},
-	"tooltip": {
-		"other": "other",
-		"others": "others"
-	}
+    "closingDate": "Closing Date",
+    "delete": "Delete",
+    "description": "Description",
+    "dialog": {
+      "delete": {
+        "cancel": "Cancel",
+        "confirm": "Yes",
+        "message": "Are you sure you want to delete the organizational unit '{{name}}'?",
+        "title": "Confirm deletion"
+      }
+    },
+    "edit": "Edit",
+    "isEmpty": "Is Empty",
+    "name": "Name",
+    "new": "Create new organizational unit",
+    "open": "Open",
+    "openingDate": "Opening Date",
+    "refresh": "Refresh",
+    "submissionPolicy": "Submission policy",
+    "submit": "Submit",
+    "table": {
+      "header": {
+        "creation": {
+          "when": "Created"
+        },
+        "description": "Description",
+        "name": "Name"
+      }
+    }
+  },
+  "required": "This field is required",
+  "search": "Search",
+  "table": {
+    "nodata": "No data has been found",
+    "paginator": {
+      "firstPage": "First page",
+      "itemPerPage": "Items per page",
+      "lastPage": "Last page",
+      "nextPage": "Next page",
+      "ofLabel": "of",
+      "previousPage": "Previous page"
+    }
+  },
+  "tooltip": {
+    "other": "other",
+    "others": "others"
+  }
 }
diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json
index 55e7b7875..d85bab74a 100644
--- a/src/assets/i18n/en.json
+++ b/src/assets/i18n/en.json
@@ -1,105 +1,128 @@
 {
-  "access": {
-    "organizationalUnitNotFound": "Unable to get data",
-    "table": {
-      "header": {
-        "accessLevel": "Access Level",
-        "organizationalUnit": "Organizational Unit",
-        "title": "Title",
-        "yearPublicationDate": "Publication Year"
-      }
-    }
-  },
-  "app": {
-    "login": {
-      "loginButton": "Log in",
-      "loginMessage": "You are currently not connected, please log in to continue."
-    },
-    "toolbar": {
-      "deposit": "Deposits",
-      "home": "Home",
-      "login": "Log in",
-      "logout": "Log out",
-      "organizationalUnit": "Organizational Units"
-    }
-  },
-  "breadcrumb": {
-    "access": {
-      "root": "Access",
-      "search": "Search"
-    },
-    "deposit": {
-      "create": "Create",
-      "detail": "Detail",
-      "edit": "Edit",
-      "list": "List",
-      "root": "Deposits"
-    },
-    "home": "Home",
-    "organizationalUnit": {
-      "create": "Create",
-      "detail": "Detail",
-      "edit": "Edit",
-      "list": "List",
-      "root": "Organizational Units"
-    }
-  },
-  "deposit": {
-    "accessLevel": "Access Level",
-    "author": "Author",
-    "collectionBegin": "Data Collection Start Date",
-    "collectionEnd": "Data Collection End Date",
-    "delete": "Delete",
-    "description": "Description",
-    "dialog": {
-      "delete": {
-        "cancel": "Cancel",
-        "confirm": "Yes",
-        "message": "Are you sure you want to delete the deposit '{{name}}'?",
-        "title": "Confirm deletion"
-      }
-    },
-    "edit": "Edit",
-    "file": {
-      "search": "Choose file",
-      "tree": {
-        "label": "List of files :"
-      },
-      "uploadButton": "Upload"
-    },
-    "hasEmbargo": "The deposit has an embargo",
-    "hint": {
-      "author": "Author"
-    },
-    "language": "Language",
-    "license": "License",
-    "new": "Create deposit",
-    "organizationUnit": "Organizational Unit",
-    "preservationPolicy": "Preservation Policy",
-    "publicationDate": "Publication Date",
-    "refresh": "Refresh",
-    "submissionPolicy": "Submission Policy",
-    "submit": "Submit",
-    "tab": {
-      "datafiles": "Data Files",
-      "details": "Details"
-    },
-    "table": {
-      "header": {
-        "creation": {
-          "when": "Created"
-        },
-        "lastUpdate": {
-          "when": "Last updated"
-        },
-        "publicationDate": "Publication date",
-        "status": "Status",
-        "title": "Title"
-      }
-    },
-    "title": "Title"
-  },
-  "error": {
+	"access": {
+		"organizationalUnitNotFound": "Unable to get data",
+		"table": {
+			"header": {
+				"accessLevel": "Access Level",
+				"organizationalUnit": "Organizational Unit",
+				"title": "Title",
+				"yearPublicationDate": "Publication Year"
+			}
+		}
+	},
+	"app": {
+		"login": {
+			"loginButton": "Log in",
+			"loginMessage": "You are currently not connected, please log in to continue."
+		},
+		"toolbar": {
+			"deposit": "Deposits",
+			"home": "Home",
+			"login": "Log in",
+			"logout": "Log out",
+			"organizationalUnit": "Organizational Units"
+		}
+	},
+	"breadcrumb": {
+		"access": {
+			"root": "Access",
+			"search": "Search"
+		},
+		"deposit": {
+			"create": "Create",
+			"detail": "Detail",
+			"edit": "Edit",
+			"list": "List",
+			"root": "Deposits"
+		},
+		"home": "Home",
+		"organizationalUnit": {
+			"create": "Create",
+			"detail": "Detail",
+			"edit": "Edit",
+			"list": "List",
+			"root": "Organizational Units"
+		}
+	},
+	"deposit": {
+		"accessLevel": "Access Level",
+		"author": "Author",
+		"collectionBegin": "Data Collection Start Date",
+		"collectionEnd": "Data Collection End Date",
+		"delete": "Delete",
+		"description": "Description",
+		"dialog": {
+			"delete": {
+				"cancel": "Cancel",
+				"confirm": "Yes",
+				"message": "Are you sure you want to delete the deposit '{{name}}'?",
+				"title": "Confirm deletion"
+			}
+		},
+		"edit": "Edit",
+		"file": {
+			"detail": {
+				"data": {
+					"available": "Available",
+					"category": "Category",
+					"checksums": "Checksums",
+					"complianceLevel": "Compliance level",
+					"createDate": "Creation date",
+					"fileFormat": "File format",
+					"fileSize": "File size",
+					"initialPath": "Initial path",
+					"smartSize": "Smart size",
+					"status": "Status",
+					"statusMessage": "Status message",
+					"type": "Type",
+					"virusCheck": "Virus check"
+				}
+			},
+			"details": {
+				"close": "Close",
+				"title": "Details of file \"{{name}}\""
+			},
+			"search": "Choose file",
+			"tree": {
+				"details": "Details",
+				"error": "The file is in error state",
+				"label": "List of files :"
+			},
+			"uploadButton": "Upload"
+		},
+		"hasEmbargo": "The deposit has an embargo",
+		"hint": {
+			"author": "Author"
+		},
+		"language": "Language",
+		"license": "License",
+		"new": "Create deposit",
+		"organizationUnit": "Organizational Unit",
+		"preservationPolicy": "Preservation Policy",
+		"publicationDate": "Publication Date",
+		"refresh": "Refresh",
+		"submissionPolicy": "Submission Policy",
+		"submit": "Submit",
+		"tab": {
+			"datafiles": "Data Files",
+			"details": "Details"
+		},
+		"table": {
+			"header": {
+				"creation": {
+					"when": "Created"
+				},
+				"lastUpdate": {
+					"when": "Last updated"
+				},
+				"publicationDate": "Publication date",
+				"status": "Status",
+				"title": "Title"
+			}
+		},
+		"title": "Title"
+	},
+	"error": {
 		"http": {
 			"forbidden": "You can't do this action",
 			"notFound": "The resource requested not exist",
@@ -114,51 +137,51 @@
 		}
 	},
 	"organizationalUnit": {
-    "closingDate": "Closing Date",
-    "delete": "Delete",
-    "description": "Description",
-    "dialog": {
-      "delete": {
-        "cancel": "Cancel",
-        "confirm": "Yes",
-        "message": "Are you sure you want to delete the organizational unit '{{name}}'?",
-        "title": "Confirm deletion"
-      }
-    },
-    "edit": "Edit",
-    "isEmpty": "Is Empty",
-    "name": "Name",
-    "new": "Create new organizational unit",
-    "open": "Open",
-    "openingDate": "Opening Date",
-    "refresh": "Refresh",
-    "submissionPolicy": "Submission policy",
-    "submit": "Submit",
-    "table": {
-      "header": {
-        "creation": {
-          "when": "Created"
-        },
-        "description": "Description",
-        "name": "Name"
-      }
-    }
-  },
-  "required": "This field is required",
-  "search": "Search",
-  "table": {
-    "nodata": "No data has been found",
-    "paginator": {
-      "firstPage": "First page",
-      "itemPerPage": "Items per page",
-      "lastPage": "Last page",
-      "nextPage": "Next page",
-      "ofLabel": "of",
-      "previousPage": "Previous page"
-    }
-  },
-  "tooltip": {
-    "other": "other",
-    "others": "others"
-  }
+		"closingDate": "Closing Date",
+		"delete": "Delete",
+		"description": "Description",
+		"dialog": {
+			"delete": {
+				"cancel": "Cancel",
+				"confirm": "Yes",
+				"message": "Are you sure you want to delete the organizational unit '{{name}}'?",
+				"title": "Confirm deletion"
+			}
+		},
+		"edit": "Edit",
+		"isEmpty": "Is Empty",
+		"name": "Name",
+		"new": "Create new organizational unit",
+		"open": "Open",
+		"openingDate": "Opening Date",
+		"refresh": "Refresh",
+		"submissionPolicy": "Submission policy",
+		"submit": "Submit",
+		"table": {
+			"header": {
+				"creation": {
+					"when": "Created"
+				},
+				"description": "Description",
+				"name": "Name"
+			}
+		}
+	},
+	"required": "This field is required",
+	"search": "Search",
+	"table": {
+		"nodata": "No data has been found",
+		"paginator": {
+			"firstPage": "First page",
+			"itemPerPage": "Items per page",
+			"lastPage": "Last page",
+			"nextPage": "Next page",
+			"ofLabel": "of",
+			"previousPage": "Previous page"
+		}
+	},
+	"tooltip": {
+		"other": "other",
+		"others": "others"
+	}
 }
diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json
index 197a182c1..689cb7b79 100644
--- a/src/assets/i18n/fr.json
+++ b/src/assets/i18n/fr.json
@@ -61,8 +61,31 @@
     },
     "edit": "Modifier",
     "file": {
+      "detail": {
+        "data": {
+          "available": "Disponible",
+          "category": "Catégorie",
+          "checksums": "Checksums",
+          "complianceLevel": "Compliance level",
+          "createDate": "Date de création",
+          "fileFormat": "Format de fichier",
+          "fileSize": "Taille du fichier",
+          "initialPath": "Chemin initial",
+          "smartSize": "Smart size",
+          "status": "Statut",
+          "statusMessage": "Message du statut",
+          "type": "Type",
+          "virusCheck": "Vérification virus"
+        }
+      },
+      "details": {
+        "close": "Fermer",
+        "title": "Détails du fichier \"{{name}}\""
+      },
       "search": "Choisir fichier",
       "tree": {
+        "details": "Détails",
+        "error": "Le fichier est en état d'erreur",
         "label": "Liste des fichiers :"
       },
       "uploadButton": "Téléverser"
diff --git a/src/environments/environment.ts b/src/environments/environment.ts
index fdbb6e39f..f99516721 100644
--- a/src/environments/environment.ts
+++ b/src/environments/environment.ts
@@ -8,7 +8,7 @@ import {defaultEnvironment} from "./environment.defaults";
 
 export const environment = {
   ...defaultEnvironment,
-  theme: ThemeEnum.yareta,
+  theme: ThemeEnum.dlcm,
   oauthTokenEndpoint: "http://localhost/dlcm-authorization/oauth/token",
   oauthDummyClientSecret: "123abc",
   oauthClientId: "local-dev-angular",
diff --git a/src/sass/abstracts/_variables.scss b/src/sass/abstracts/_variables.scss
index 937b9dbc2..9c67ca6f8 100644
--- a/src/sass/abstracts/_variables.scss
+++ b/src/sass/abstracts/_variables.scss
@@ -1,5 +1,6 @@
 $primary-color: var(--primary-color);
 $primary-color-lighter: var(--primary-color-lighter);
+$primary-color-darker: var(--primary-color-darker);
 $accent-color: var(--accent-color);
 $red: #f44336;
 $background-grey: #f5f5f5;
diff --git a/src/sass/main.scss b/src/sass/main.scss
index 54211da19..ce68d491c 100644
--- a/src/sass/main.scss
+++ b/src/sass/main.scss
@@ -20,9 +20,34 @@
 a {
   cursor: pointer;
   text-decoration: none;
+  color: $primary-color;
+  position: relative;
+  -webkit-transition: all 0.2s ease-in-out 0s;
+  transition: all 0.2s ease-in-out 0s;
 
   &:hover {
-    color: $primary-color;
+    color: $primary-color-darker;
+  }
+
+  &:before {
+    content: "";
+    position: absolute;
+    width: 100%;
+    height: 2px;
+    bottom: -2px;
+    left: 0;
+    background-color: $primary-color-darker;
+    visibility: hidden;
+    -webkit-transform: scaleX(0);
+    transform: scaleX(0);
+    -webkit-transition: all 0.2s ease-in-out 0s;
+    transition: all 0.2s ease-in-out 0s;
+  }
+
+  &:hover:before {
+    visibility: visible;
+    -webkit-transform: scaleX(1);
+    transform: scaleX(1);
   }
 }
 
diff --git a/src/sass/themes/dlcm-theme.scss b/src/sass/themes/dlcm-theme.scss
index 5d22e7d70..fbc205c06 100644
--- a/src/sass/themes/dlcm-theme.scss
+++ b/src/sass/themes/dlcm-theme.scss
@@ -20,4 +20,5 @@ $dlcm-theme: mat-light-theme(
   //--primary-color: mat-color($primary-palette, default, 1.0);
   --primary-color: #03A9F4; // Should be equal to $mat-yareta-primary : 500
   --primary-color-lighter: #7dc9f4;
+  --primary-color-darker: #0381c9;
 }
diff --git a/src/sass/themes/yareta-theme.scss b/src/sass/themes/yareta-theme.scss
index fd59b2ab0..9e916618c 100644
--- a/src/sass/themes/yareta-theme.scss
+++ b/src/sass/themes/yareta-theme.scss
@@ -93,4 +93,5 @@ $yareta-theme: mat-light-theme(
   @include angular-material-theme($yareta-theme);
   --primary-color: #a2c252; // Should be equal to $mat-yareta-primary : 500
   --primary-color-lighter: #b5c787;
+  --primary-color-darker: #7a9a4d;
 }
-- 
GitLab