From 9999353f56d249ac78aa68140eabb3f8870a3bd3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Agneray?= <francois.agneray@lam.fr>
Date: Mon, 28 Mar 2022 17:18:35 +0200
Subject: [PATCH] Fixed bug admin select file

---
 .../data-path-form-control.component.html     |  6 +-
 .../data-path-form-control.component.ts       |  6 +-
 .../file-select-form-control.component.html   |  6 +-
 .../file-select-form-control.component.ts     | 12 +--
 .../components/instance-form.component.html   | 38 +++++-----
 .../components/instance-form.component.ts     | 10 ++-
 .../containers/edit-instance.component.html   |  6 +-
 .../containers/edit-instance.component.ts     | 18 ++---
 .../containers/new-instance.component.html    |  6 +-
 .../containers/new-instance.component.ts      | 18 ++---
 .../dataset/dataset-form.component.html       |  6 +-
 .../containers/edit-dataset.component.ts      | 12 +--
 .../containers/new-dataset.component.ts       | 12 +--
 ...ry.actions.ts => file-explorer.actions.ts} |  5 +-
 .../effects/file-explorer.effects.ts          | 64 ++++++++++++++++
 client/src/app/metamodel/effects/index.ts     |  6 +-
 .../effects/root-directory.effects.spec.ts    | 62 ---------------
 .../effects/root-directory.effects.ts         | 45 -----------
 client/src/app/metamodel/metamodel.reducer.ts |  8 +-
 .../reducers/file-explorer.reducer.ts         | 61 +++++++++++++++
 .../reducers/root-directory.reducer.spec.ts   | 63 ---------------
 .../reducers/root-directory.reducer.ts        | 76 -------------------
 .../selectors/file-explorer.selector.ts       | 33 ++++++++
 .../selectors/root-directory.selector.spec.ts | 39 ----------
 .../selectors/root-directory.selector.ts      | 48 ------------
 ...ry.service.ts => file-explorer.service.ts} | 15 +++-
 client/src/app/metamodel/services/index.ts    |  6 +-
 .../services/root-directory.service.spec.ts   | 41 ----------
 28 files changed, 264 insertions(+), 464 deletions(-)
 rename client/src/app/metamodel/actions/{root-directory.actions.ts => file-explorer.actions.ts} (57%)
 create mode 100644 client/src/app/metamodel/effects/file-explorer.effects.ts
 delete mode 100644 client/src/app/metamodel/effects/root-directory.effects.spec.ts
 delete mode 100644 client/src/app/metamodel/effects/root-directory.effects.ts
 create mode 100644 client/src/app/metamodel/reducers/file-explorer.reducer.ts
 delete mode 100644 client/src/app/metamodel/reducers/root-directory.reducer.spec.ts
 delete mode 100644 client/src/app/metamodel/reducers/root-directory.reducer.ts
 create mode 100644 client/src/app/metamodel/selectors/file-explorer.selector.ts
 delete mode 100644 client/src/app/metamodel/selectors/root-directory.selector.spec.ts
 delete mode 100644 client/src/app/metamodel/selectors/root-directory.selector.ts
 rename client/src/app/metamodel/services/{root-directory.service.ts => file-explorer.service.ts} (67%)
 delete mode 100644 client/src/app/metamodel/services/root-directory.service.spec.ts

diff --git a/client/src/app/admin/admin-shared/components/data-path-form-control.component.html b/client/src/app/admin/admin-shared/components/data-path-form-control.component.html
index dfe6a5f7..b0227d45 100644
--- a/client/src/app/admin/admin-shared/components/data-path-form-control.component.html
+++ b/client/src/app/admin/admin-shared/components/data-path-form-control.component.html
@@ -17,13 +17,13 @@
         <h4 class="modal-title pull-left">ANIS file explorer</h4>
     </div>
     <div>
-        <app-spinner *ngIf="rootDirectoryIsLoading"></app-spinner>
+        <app-spinner *ngIf="directoryIsLoading"></app-spinner>
 
         <p class="ml-3 mt-3">
             <span class="far fa-folder"></span>
             {{ fileExplorerPath }}
         </p>
-        <div *ngIf="rootDirectoryIsLoaded" class="table-responsive">
+        <div *ngIf="directoryIsLoaded" class="table-responsive">
             <table class="table table-hover" aria-describedby="File explorer">
                 <thead>
                     <tr>
@@ -34,7 +34,7 @@
                     </tr>
                 </thead>
                 <tbody>
-                    <tr *ngFor="let fileInfo of rootDirectory" (click)="dataPathAction(fileInfo)" [class.pointer]="fileInfo.type === 'dir' && fileInfo.name !== '.'">
+                    <tr *ngFor="let fileInfo of files" (click)="dataPathAction(fileInfo)" [class.pointer]="fileInfo.type === 'dir' && fileInfo.name !== '.'">
                         <td>
                             <span *ngIf="fileInfo.type === 'dir'"><span class="far fa-folder"></span></span>
                             <span *ngIf="fileInfo.type === 'file'"><span class="far fa-file"></span></span>
diff --git a/client/src/app/admin/admin-shared/components/data-path-form-control.component.ts b/client/src/app/admin/admin-shared/components/data-path-form-control.component.ts
index 9ff36dfb..c1585ee3 100644
--- a/client/src/app/admin/admin-shared/components/data-path-form-control.component.ts
+++ b/client/src/app/admin/admin-shared/components/data-path-form-control.component.ts
@@ -21,9 +21,9 @@ import { FileInfo } from 'src/app/metamodel/models';
 })
 export class DataPathFormControlComponent {
     @Input() form: FormGroup;
-    @Input() rootDirectory: FileInfo[];
-    @Input() rootDirectoryIsLoading: boolean;
-    @Input() rootDirectoryIsLoaded: boolean;
+    @Input() files: FileInfo[];
+    @Input() directoryIsLoading: boolean;
+    @Input() directoryIsLoaded: boolean;
     @Output() loadRootDirectory: EventEmitter<string> = new EventEmitter();
 
     modalRef: BsModalRef;
diff --git a/client/src/app/admin/admin-shared/components/file-select-form-control.component.html b/client/src/app/admin/admin-shared/components/file-select-form-control.component.html
index ef2e1e34..01180cd7 100644
--- a/client/src/app/admin/admin-shared/components/file-select-form-control.component.html
+++ b/client/src/app/admin/admin-shared/components/file-select-form-control.component.html
@@ -17,13 +17,13 @@
         <h4 class="modal-title pull-left">ANIS file explorer</h4>
     </div>
     <div>
-        <app-spinner *ngIf="rootDirectoryIsLoading"></app-spinner>
+        <app-spinner *ngIf="directoryIsLoading"></app-spinner>
 
         <p class="ml-3 mt-3">
             <span class="far fa-folder"></span>
             {{ fileExplorerPath }}
         </p>
-        <div *ngIf="rootDirectoryIsLoaded" class="table-responsive">
+        <div *ngIf="directoryIsLoaded" class="table-responsive">
             <table class="table table-hover" aria-describedby="File selector">
                 <thead>
                     <tr>
@@ -34,7 +34,7 @@
                     </tr>
                 </thead>
                 <tbody>
-                    <tr *ngFor="let fileInfo of rootDirectory" 
+                    <tr *ngFor="let fileInfo of files" 
                         (click)="click(fileInfo)" 
                         [class.table-active]="checkFileSelected(fileInfo)"
                         [class.pointer]="fileInfo.name !== '.'">
diff --git a/client/src/app/admin/admin-shared/components/file-select-form-control.component.ts b/client/src/app/admin/admin-shared/components/file-select-form-control.component.ts
index 4c0e5cc9..2986f65b 100644
--- a/client/src/app/admin/admin-shared/components/file-select-form-control.component.ts
+++ b/client/src/app/admin/admin-shared/components/file-select-form-control.component.ts
@@ -24,10 +24,10 @@ export class FileSelectFormControlComponent implements OnChanges {
     @Input() disabled: boolean = false;
     @Input() controlName: string;
     @Input() controlLabel: string;
-    @Input() rootDirectory: FileInfo[];
-    @Input() rootDirectoryIsLoading: boolean;
-    @Input() rootDirectoryIsLoaded: boolean;
-    @Output() loadRootDirectory: EventEmitter<string> = new EventEmitter();
+    @Input() files: FileInfo[];
+    @Input() directoryIsLoading: boolean;
+    @Input() directoryIsLoaded: boolean;
+    @Output() loadDirectory: EventEmitter<string> = new EventEmitter();
 
     modalRef: BsModalRef;
     fileExplorerPath = '';
@@ -52,7 +52,7 @@ export class FileSelectFormControlComponent implements OnChanges {
             this.fileExplorerPath = '';
         }
         this.modalRef = this.modalService.show(template);
-        this.loadRootDirectory.emit(this.fileExplorerPath);
+        this.loadDirectory.emit(this.fileExplorerPath);
     }
 
     click(fileInfo: FileInfo): void {
@@ -70,7 +70,7 @@ export class FileSelectFormControlComponent implements OnChanges {
         } else {
             this.fileExplorerPath += `/${fileInfo.name}`;
         }
-        this.loadRootDirectory.emit(this.fileExplorerPath);
+        this.loadDirectory.emit(this.fileExplorerPath);
     }
 
     buildFilePath(fileInfo: FileInfo) {
diff --git a/client/src/app/admin/instance/components/instance-form.component.html b/client/src/app/admin/instance/components/instance-form.component.html
index e756ad55..70e1d906 100644
--- a/client/src/app/admin/instance/components/instance-form.component.html
+++ b/client/src/app/admin/instance/components/instance-form.component.html
@@ -19,9 +19,9 @@
             </div>
             <app-data-path-form-control
                 [form]="form"
-                [rootDirectory]="rootDirectory"
-                [rootDirectoryIsLoading]="rootDirectoryIsLoading"
-                [rootDirectoryIsLoaded]="rootDirectoryIsLoaded"
+                [files]="files"
+                [directoryIsLoading]="directoryIsLoading"
+                [directoryIsLoaded]="directoryIsLoaded"
                 (loadRootDirectory)="loadRootDirectory.emit($event)">
             </app-data-path-form-control>
             <div class="custom-control custom-radio custom-control-inline">
@@ -39,10 +39,10 @@
                 [disabled]="isDataPathEmpty()"
                 [controlName]="'portal_logo'"
                 [controlLabel]="'Portal logo'"
-                [rootDirectory]="rootDirectory"
-                [rootDirectoryIsLoading]="rootDirectoryIsLoading"
-                [rootDirectoryIsLoaded]="rootDirectoryIsLoaded"
-                (loadRootDirectory)="loadRootDirectory.emit($event)">
+                [files]="files"
+                [directoryIsLoading]="directoryIsLoading"
+                [directoryIsLoaded]="directoryIsLoaded"
+                (loadDirectory)="onChangeFileSelect($event)">
             </app-file-select-form-control>
             <div class="form-row">
                 <div class="form-group col-md-6">
@@ -69,20 +69,20 @@
                 [disabled]="isDataPathEmpty()"
                 [controlName]="'design_logo'"
                 [controlLabel]="'Logo'"
-                [rootDirectory]="rootDirectory"
-                [rootDirectoryIsLoading]="rootDirectoryIsLoading"
-                [rootDirectoryIsLoaded]="rootDirectoryIsLoaded"
-                (loadRootDirectory)="loadRootDirectory.emit($event)">
+                [files]="files"
+                [directoryIsLoading]="directoryIsLoading"
+                [directoryIsLoaded]="directoryIsLoaded"
+                (loadDirectory)="onChangeFileSelect($event)">
             </app-file-select-form-control>
             <app-file-select-form-control
                 [form]="form"
                 [disabled]="isDataPathEmpty()"
                 [controlName]="'design_favicon'"
                 [controlLabel]="'Favicon'"
-                [rootDirectory]="rootDirectory"
-                [rootDirectoryIsLoading]="rootDirectoryIsLoading"
-                [rootDirectoryIsLoaded]="rootDirectoryIsLoaded"
-                (loadRootDirectory)="loadRootDirectory.emit($event)">
+                [files]="files"
+                [directoryIsLoading]="directoryIsLoading"
+                [directoryIsLoaded]="directoryIsLoaded"
+                (loadDirectory)="onChangeFileSelect($event)">
             </app-file-select-form-control>
         </accordion-group>
         <accordion-group heading="Home page" [isOpen]="true">
@@ -101,10 +101,10 @@
                     [form]="getHomeConfigFormGroup()"
                     [controlName]="'home_component_logo'"
                     [controlLabel]="'Logo'"
-                    [rootDirectory]="rootDirectory"
-                    [rootDirectoryIsLoading]="rootDirectoryIsLoading"
-                    [rootDirectoryIsLoaded]="rootDirectoryIsLoaded"
-                    (loadRootDirectory)="loadRootDirectory.emit($event)">
+                    [files]="files"
+                    [directoryIsLoading]="directoryIsLoading"
+                    [directoryIsLoaded]="directoryIsLoaded"
+                    (loadDirectory)="onChangeFileSelect($event)">
                 </app-file-select-form-control>
             </div>
         </accordion-group>
diff --git a/client/src/app/admin/instance/components/instance-form.component.ts b/client/src/app/admin/instance/components/instance-form.component.ts
index 407768ea..42837852 100644
--- a/client/src/app/admin/instance/components/instance-form.component.ts
+++ b/client/src/app/admin/instance/components/instance-form.component.ts
@@ -18,9 +18,9 @@ import { Instance, FileInfo } from 'src/app/metamodel/models';
 })
 export class InstanceFormComponent implements OnInit {
     @Input() instance: Instance;
-    @Input() rootDirectory: FileInfo[];
-    @Input() rootDirectoryIsLoading: boolean;
-    @Input() rootDirectoryIsLoaded: boolean;
+    @Input() files: FileInfo[];
+    @Input() directoryIsLoading: boolean;
+    @Input() directoryIsLoaded: boolean;
     @Output() loadRootDirectory: EventEmitter<string> = new EventEmitter();
     @Output() onSubmit: EventEmitter<Instance> = new EventEmitter();
 
@@ -74,6 +74,10 @@ the fast implementation of a project data exchange platform in a dedicated infor
         return this.form.controls.data_path.value == '';
     }
 
+    onChangeFileSelect(path: string) {
+        this.loadRootDirectory.emit(`${this.form.controls.data_path.value}${path}`);
+    }
+
     getHomeConfigFormGroup() {
         return this.form.controls.home_component_config as FormGroup;
     }
diff --git a/client/src/app/admin/instance/containers/edit-instance.component.html b/client/src/app/admin/instance/containers/edit-instance.component.html
index 1a8c5740..419925a9 100644
--- a/client/src/app/admin/instance/containers/edit-instance.component.html
+++ b/client/src/app/admin/instance/containers/edit-instance.component.html
@@ -12,9 +12,9 @@
         <div class="col-12">
             <app-instance-form 
                 [instance]="instance | async"
-                [rootDirectory]="rootDirectory | async"
-                [rootDirectoryIsLoading]="rootDirectoryIsLoading | async"
-                [rootDirectoryIsLoaded]="rootDirectoryIsLoaded | async"
+                [files]="files | async"
+                [directoryIsLoading]="directoryIsLoading | async"
+                [directoryIsLoaded]="directoryIsLoaded | async"
                 (loadRootDirectory)="loadRootDirectory($event)"
                 (onSubmit)="editInstance($event)"
                 #formInstance>
diff --git a/client/src/app/admin/instance/containers/edit-instance.component.ts b/client/src/app/admin/instance/containers/edit-instance.component.ts
index 278e28cb..590a1e02 100644
--- a/client/src/app/admin/instance/containers/edit-instance.component.ts
+++ b/client/src/app/admin/instance/containers/edit-instance.component.ts
@@ -15,8 +15,8 @@ import { Observable } from 'rxjs';
 import { Instance, FileInfo } from 'src/app/metamodel/models';
 import * as instanceActions from 'src/app/metamodel/actions/instance.actions';
 import * as instanceSelector from 'src/app/metamodel/selectors/instance.selector';
-import * as rootDirectoryActions from 'src/app/metamodel/actions/root-directory.actions';
-import * as rootDirectorySelector from 'src/app/metamodel/selectors/root-directory.selector';
+import * as fileExplorerActions from 'src/app/metamodel/actions/file-explorer.actions';
+import * as fileExplorerSelector from 'src/app/metamodel/selectors/file-explorer.selector';
 
 @Component({
     selector: 'app-edit-instance',
@@ -24,15 +24,15 @@ import * as rootDirectorySelector from 'src/app/metamodel/selectors/root-directo
 })
 export class EditInstanceComponent {
     public instance: Observable<Instance>;
-    public rootDirectory: Observable<FileInfo[]>;
-    public rootDirectoryIsLoading: Observable<boolean>;
-    public rootDirectoryIsLoaded: Observable<boolean>;
+    public files: Observable<FileInfo[]>;
+    public directoryIsLoading: Observable<boolean>;
+    public directoryIsLoaded: Observable<boolean>;
 
     constructor(private store: Store<{ }>) {
         this.instance = store.select(instanceSelector.selectInstanceByRouteName);
-        this.rootDirectory = store.select(rootDirectorySelector.selectAllFileInfo);
-        this.rootDirectoryIsLoading = store.select(rootDirectorySelector.selectRootDirectoryIsLoading);
-        this.rootDirectoryIsLoaded = store.select(rootDirectorySelector.selectRootDirectoryIsLoaded);
+        this.files = store.select(fileExplorerSelector.selectFiles);
+        this.directoryIsLoading = store.select(fileExplorerSelector.selectDirectoryIsLoading);
+        this.directoryIsLoaded = store.select(fileExplorerSelector.selectDirectoryIsLoaded);
     }
 
     editInstance(instance: Instance) {
@@ -40,6 +40,6 @@ export class EditInstanceComponent {
     }
 
     loadRootDirectory(path: string) {
-        this.store.dispatch(rootDirectoryActions.loadRootDirectory({ path }));
+        this.store.dispatch(fileExplorerActions.loadRootDirectory({ path }));
     }
 }
diff --git a/client/src/app/admin/instance/containers/new-instance.component.html b/client/src/app/admin/instance/containers/new-instance.component.html
index 5566a517..ed3f2058 100644
--- a/client/src/app/admin/instance/containers/new-instance.component.html
+++ b/client/src/app/admin/instance/containers/new-instance.component.html
@@ -11,9 +11,9 @@
     <div class="row">
         <div class="col-12">
             <app-instance-form
-                [rootDirectory]="rootDirectory | async"
-                [rootDirectoryIsLoading]="rootDirectoryIsLoading | async"
-                [rootDirectoryIsLoaded]="rootDirectoryIsLoaded | async"
+                [files]="files | async"
+                [directoryIsLoading]="directoryIsLoading | async"
+                [directoryIsLoaded]="directoryIsLoaded | async"
                 (loadRootDirectory)="loadRootDirectory($event)"
                 (onSubmit)="addNewInstance($event)" 
                 #formInstance>
diff --git a/client/src/app/admin/instance/containers/new-instance.component.ts b/client/src/app/admin/instance/containers/new-instance.component.ts
index 9c3383cf..70756b1d 100644
--- a/client/src/app/admin/instance/containers/new-instance.component.ts
+++ b/client/src/app/admin/instance/containers/new-instance.component.ts
@@ -14,22 +14,22 @@ import { Observable } from 'rxjs';
 
 import { Instance, FileInfo } from 'src/app/metamodel/models';
 import * as instanceActions from 'src/app/metamodel/actions/instance.actions';
-import * as rootDirectoryActions from 'src/app/metamodel/actions/root-directory.actions';
-import * as rootDirectorySelector from 'src/app/metamodel/selectors/root-directory.selector';
+import * as fileExplorerActions from 'src/app/metamodel/actions/file-explorer.actions';
+import * as fileExplorerSelector from 'src/app/metamodel/selectors/file-explorer.selector';
 
 @Component({
     selector: 'app-new-instance',
     templateUrl: 'new-instance.component.html'
 })
 export class NewInstanceComponent {
-    public rootDirectory: Observable<FileInfo[]>;
-    public rootDirectoryIsLoading: Observable<boolean>;
-    public rootDirectoryIsLoaded: Observable<boolean>;
+    public files: Observable<FileInfo[]>;
+    public directoryIsLoading: Observable<boolean>;
+    public directoryIsLoaded: Observable<boolean>;
 
     constructor(private store: Store<{ }>) {
-        this.rootDirectory = store.select(rootDirectorySelector.selectAllFileInfo);
-        this.rootDirectoryIsLoading = store.select(rootDirectorySelector.selectRootDirectoryIsLoading);
-        this.rootDirectoryIsLoaded = store.select(rootDirectorySelector.selectRootDirectoryIsLoaded);
+        this.files = store.select(fileExplorerSelector.selectFiles);
+        this.directoryIsLoading = store.select(fileExplorerSelector.selectDirectoryIsLoading);
+        this.directoryIsLoaded = store.select(fileExplorerSelector.selectDirectoryIsLoaded);
     }
 
     addNewInstance(instance: Instance) {
@@ -37,6 +37,6 @@ export class NewInstanceComponent {
     }
 
     loadRootDirectory(path: string) {
-        this.store.dispatch(rootDirectoryActions.loadRootDirectory({ path }));
+        this.store.dispatch(fileExplorerActions.loadRootDirectory({ path }));
     }
 }
diff --git a/client/src/app/admin/instance/dataset/components/dataset/dataset-form.component.html b/client/src/app/admin/instance/dataset/components/dataset/dataset-form.component.html
index 7434b275..5680185a 100644
--- a/client/src/app/admin/instance/dataset/components/dataset/dataset-form.component.html
+++ b/client/src/app/admin/instance/dataset/components/dataset/dataset-form.component.html
@@ -42,9 +42,9 @@
             </div>
             <app-data-path-form-control
                 [form]="form"
-                [rootDirectory]="rootDirectory"
-                [rootDirectoryIsLoading]="rootDirectoryIsLoading"
-                [rootDirectoryIsLoaded]="rootDirectoryIsLoaded"
+                [files]="rootDirectory"
+                [directoryIsLoading]="rootDirectoryIsLoading"
+                [directoryIsLoaded]="rootDirectoryIsLoaded"
                 (loadRootDirectory)="onChangeDataPath($event)">
             </app-data-path-form-control>
             <div class="form-group">
diff --git a/client/src/app/admin/instance/dataset/containers/edit-dataset.component.ts b/client/src/app/admin/instance/dataset/containers/edit-dataset.component.ts
index a816c37a..1eaadb2d 100644
--- a/client/src/app/admin/instance/dataset/containers/edit-dataset.component.ts
+++ b/client/src/app/admin/instance/dataset/containers/edit-dataset.component.ts
@@ -23,8 +23,8 @@ import * as tableActions from 'src/app/metamodel/actions/table.actions';
 import * as tableSelector from 'src/app/metamodel/selectors/table.selector';
 import * as datasetFamilySelector from 'src/app/metamodel/selectors/dataset-family.selector';
 import * as instanceSelector from 'src/app/metamodel/selectors/instance.selector';
-import * as rootDirectoryActions from 'src/app/metamodel/actions/root-directory.actions';
-import * as rootDirectorySelector from 'src/app/metamodel/selectors/root-directory.selector';
+import * as fileExplorerActions from 'src/app/metamodel/actions/file-explorer.actions';
+import * as fileExplorerSelector from 'src/app/metamodel/selectors/file-explorer.selector';
 
 @Component({
     selector: 'app-edit-dataset',
@@ -70,9 +70,9 @@ export class EditDatasetComponent implements OnInit {
         this.datasetFamilyListIsLoading = store.select(datasetFamilySelector.selectDatasetFamilyListIsLoading);
         this.datasetFamilyListIsLoaded = store.select(datasetFamilySelector.selectDatasetFamilyListIsLoaded);
         this.datasetFamilyList = store.select(datasetFamilySelector.selectAllDatasetFamilies);
-        this.rootDirectory = store.select(rootDirectorySelector.selectAllFileInfo);
-        this.rootDirectoryIsLoading = store.select(rootDirectorySelector.selectRootDirectoryIsLoading);
-        this.rootDirectoryIsLoaded = store.select(rootDirectorySelector.selectRootDirectoryIsLoaded);
+        this.rootDirectory = store.select(fileExplorerSelector.selectFiles);
+        this.rootDirectoryIsLoading = store.select(fileExplorerSelector.selectDirectoryIsLoading);
+        this.rootDirectoryIsLoaded = store.select(fileExplorerSelector.selectDirectoryIsLoaded);
     }
 
     ngOnInit() {
@@ -84,7 +84,7 @@ export class EditDatasetComponent implements OnInit {
     }
 
     loadRootDirectory(path: string) {
-        this.store.dispatch(rootDirectoryActions.loadRootDirectory({ path }));
+        this.store.dispatch(fileExplorerActions.loadRootDirectory({ path }));
     }
 
     editDataset(dataset: Dataset) {
diff --git a/client/src/app/admin/instance/dataset/containers/new-dataset.component.ts b/client/src/app/admin/instance/dataset/containers/new-dataset.component.ts
index a9de9b2f..73393f66 100644
--- a/client/src/app/admin/instance/dataset/containers/new-dataset.component.ts
+++ b/client/src/app/admin/instance/dataset/containers/new-dataset.component.ts
@@ -21,8 +21,8 @@ import * as tableSelector from 'src/app/metamodel/selectors/table.selector';
 import * as datasetFamilySelector from 'src/app/metamodel/selectors/dataset-family.selector';
 import * as datasetActions from 'src/app/metamodel/actions/dataset.actions';
 import * as instanceSelector from 'src/app/metamodel/selectors/instance.selector';
-import * as rootDirectoryActions from 'src/app/metamodel/actions/root-directory.actions';
-import * as rootDirectorySelector from 'src/app/metamodel/selectors/root-directory.selector';
+import * as fileExplorerActions from 'src/app/metamodel/actions/file-explorer.actions';
+import * as fileExplorerSelector from 'src/app/metamodel/selectors/file-explorer.selector';
 
 @Component({
     selector: 'app-new-dataset',
@@ -55,9 +55,9 @@ export class NewDatasetComponent implements OnInit {
         this.datasetFamilyListIsLoading = store.select(datasetFamilySelector.selectDatasetFamilyListIsLoading);
         this.datasetFamilyListIsLoaded = store.select(datasetFamilySelector.selectDatasetFamilyListIsLoaded);
         this.datasetFamilyList = store.select(datasetFamilySelector.selectAllDatasetFamilies);
-        this.rootDirectory = store.select(rootDirectorySelector.selectAllFileInfo);
-        this.rootDirectoryIsLoading = store.select(rootDirectorySelector.selectRootDirectoryIsLoading);
-        this.rootDirectoryIsLoaded = store.select(rootDirectorySelector.selectRootDirectoryIsLoaded);
+        this.rootDirectory = store.select(fileExplorerSelector.selectFiles);
+        this.rootDirectoryIsLoading = store.select(fileExplorerSelector.selectDirectoryIsLoading);
+        this.rootDirectoryIsLoaded = store.select(fileExplorerSelector.selectDirectoryIsLoaded);
     }
 
     ngOnInit() {
@@ -71,7 +71,7 @@ export class NewDatasetComponent implements OnInit {
     }
 
     loadRootDirectory(path: string) {
-        this.store.dispatch(rootDirectoryActions.loadRootDirectory({ path }));
+        this.store.dispatch(fileExplorerActions.loadRootDirectory({ path }));
     }
 
     addNewDataset(dataset: Dataset) {
diff --git a/client/src/app/metamodel/actions/root-directory.actions.ts b/client/src/app/metamodel/actions/file-explorer.actions.ts
similarity index 57%
rename from client/src/app/metamodel/actions/root-directory.actions.ts
rename to client/src/app/metamodel/actions/file-explorer.actions.ts
index e702eff1..2eac1f02 100644
--- a/client/src/app/metamodel/actions/root-directory.actions.ts
+++ b/client/src/app/metamodel/actions/file-explorer.actions.ts
@@ -12,5 +12,6 @@ import { createAction, props } from '@ngrx/store';
 import { FileInfo } from '../models';
 
 export const loadRootDirectory = createAction('[Metamodel] Load Root Directory', props<{ path: string }>());
-export const loadRootDirectorySuccess = createAction('[Metamodel] Load Root Directory Success', props<{ files: FileInfo[] }>());
-export const loadRootDirectoryFail = createAction('[Metamodel] Load Root Directory Fail');
+export const loadDatasetDirectory = createAction('[Metamodel] Load Dataset Directory', props<{ path: string }>());
+export const loadDirectorySuccess = createAction('[Metamodel] Load Root Directory Success', props<{ files: FileInfo[] }>());
+export const loadDirectoryFail = createAction('[Metamodel] Load Root Directory Fail');
\ No newline at end of file
diff --git a/client/src/app/metamodel/effects/file-explorer.effects.ts b/client/src/app/metamodel/effects/file-explorer.effects.ts
new file mode 100644
index 00000000..cd99b62a
--- /dev/null
+++ b/client/src/app/metamodel/effects/file-explorer.effects.ts
@@ -0,0 +1,64 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { Injectable } from '@angular/core';
+
+import { Actions, createEffect, ofType, concatLatestFrom } from '@ngrx/effects';
+import { Store } from '@ngrx/store';
+import { of } from 'rxjs';
+import { map, mergeMap, catchError } from 'rxjs/operators';
+
+import * as fileExplorerActions from '../actions/file-explorer.actions';
+import { FileExplorerService } from '../services/file-explorer.service';
+import * as instanceSelector from '../selectors/instance.selector';
+import * as datasetSelector from '../selectors/dataset.selector';
+
+/**
+ * @class
+ * @classdesc File explorer effects.
+ */
+@Injectable()
+export class FileExplorerEffects {
+    /**
+     * Calls action to retrieve file list for the given root directory.
+     */
+    loadRootDirectory$ = createEffect((): any =>
+        this.actions$.pipe(
+            ofType(fileExplorerActions.loadRootDirectory),
+            mergeMap(action => this.fileExplorerService.retrieveRootDirectory(action.path)
+                .pipe(
+                    map(files => fileExplorerActions.loadDirectorySuccess({ files })),
+                    catchError(() => of(fileExplorerActions.loadDirectoryFail()))
+                )
+            )
+        )
+    );
+
+    /**
+     * Calls action to retrieve file list for the given dataset directory.
+     */
+    loadDatasetDirectory$ = createEffect((): any =>
+        this.actions$.pipe(
+            ofType(fileExplorerActions.loadDatasetDirectory),
+            concatLatestFrom(() => this.store.select(datasetSelector.selectDatasetNameByRoute)),
+            mergeMap(([action, datasetName]) => this.fileExplorerService.retrieveDatasetDirectory(datasetName, action.path)
+                .pipe(
+                    map(files => fileExplorerActions.loadDirectorySuccess({ files })),
+                    catchError(() => of(fileExplorerActions.loadDirectoryFail()))
+                )
+            )
+        )
+    );
+
+    constructor(
+        private actions$: Actions,
+        private fileExplorerService: FileExplorerService,
+        private store: Store<{ }>
+    ) {}
+}
diff --git a/client/src/app/metamodel/effects/index.ts b/client/src/app/metamodel/effects/index.ts
index 2be316f4..e024d70b 100644
--- a/client/src/app/metamodel/effects/index.ts
+++ b/client/src/app/metamodel/effects/index.ts
@@ -20,10 +20,10 @@ import { InstanceGroupEffects } from './instance-group.effects';
 import { CriteriaFamilyEffects } from './criteria-family.effects';
 import { OutputCategoryEffects } from './output-category.effects';
 import { OutputFamilyEffects } from './output-family.effects';
-import { RootDirectoryEffects } from './root-directory.effects'
 import { SelectEffects } from './select.effects';
 import { SelectOptionEffects } from './select-option.effects';
 import { AttributeDistinctEffects } from './attribute-distinct.effects';
+import { FileExplorerEffects } from './file-explorer.effects';
 
 export const metamodelEffects = [
     DatabaseEffects,
@@ -39,8 +39,8 @@ export const metamodelEffects = [
     CriteriaFamilyEffects,
     OutputCategoryEffects,
     OutputFamilyEffects,
-    RootDirectoryEffects,
     SelectEffects,
     SelectOptionEffects,
-    AttributeDistinctEffects
+    AttributeDistinctEffects,
+    FileExplorerEffects
 ];
diff --git a/client/src/app/metamodel/effects/root-directory.effects.spec.ts b/client/src/app/metamodel/effects/root-directory.effects.spec.ts
deleted file mode 100644
index c2704c84..00000000
--- a/client/src/app/metamodel/effects/root-directory.effects.spec.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { TestBed } from '@angular/core/testing';
-
-import { provideMockActions } from '@ngrx/effects/testing';
-import { EffectsMetadata, getEffectsMetadata } from '@ngrx/effects';
-import { Observable } from 'rxjs';
-import { cold, hot } from 'jasmine-marbles';
-
-import { RootDirectoryEffects } from './root-directory.effects';
-import { RootDirectoryService } from '../services/root-directory.service';
-import * as rootDirectoryActions from '../actions/root-directory.actions';
-import { FILES } from '../../../test-data';
-
-describe('[Metamodel][Effects] RootDirectoryEffects', () => {
-    let actions = new Observable();
-    let effects: RootDirectoryEffects;
-    let metadata: EffectsMetadata<RootDirectoryEffects>;
-    let service: RootDirectoryService;
-
-    beforeEach(() => {
-        TestBed.configureTestingModule({
-            providers: [
-                RootDirectoryEffects,
-                { provide: RootDirectoryService, useValue: { }},
-                provideMockActions(() => actions)
-            ]
-        }).compileComponents();
-        effects = TestBed.inject(RootDirectoryEffects);
-        metadata = getEffectsMetadata(effects);
-        service = TestBed.inject(RootDirectoryService);
-    });
-
-    it('should be created', () => {
-        expect(effects).toBeTruthy();
-    });
-
-    describe('loadRootDirectory$ effect', () => {
-        it('should dispatch the loadRootDirectorySuccess action on success', () => {
-            const action = rootDirectoryActions.loadRootDirectory({ path: 'path' });
-            const outcome = rootDirectoryActions.loadRootDirectorySuccess({ files: FILES });
-
-            actions = hot('-a', { a: action });
-            const response = cold('-a|', { a: FILES });
-            const expected = cold('--b', { b: outcome });
-            service.retrieveRootDirectory = jest.fn(() => response);
-
-            expect(effects.loadRootDirectory$).toBeObservable(expected);
-        });
-
-        it('should dispatch the loadRootDirectoryFail action on HTTP failure', () => {
-            const action = rootDirectoryActions.loadRootDirectory({ path: 'path' });
-            const error = new Error();
-            const outcome = rootDirectoryActions.loadRootDirectoryFail();
-
-            actions = hot('-a', { a: action });
-            const response = cold('-#|', { }, error);
-            const expected = cold('--b', { b: outcome });
-            service.retrieveRootDirectory = jest.fn(() => response);
-
-            expect(effects.loadRootDirectory$).toBeObservable(expected);
-        });
-    });
-});
diff --git a/client/src/app/metamodel/effects/root-directory.effects.ts b/client/src/app/metamodel/effects/root-directory.effects.ts
deleted file mode 100644
index f8ff1ff7..00000000
--- a/client/src/app/metamodel/effects/root-directory.effects.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * This file is part of Anis Client.
- *
- * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-import { Injectable } from '@angular/core';
-
-import { Actions, createEffect, ofType } from '@ngrx/effects';
-import { of } from 'rxjs';
-import { map, mergeMap, catchError } from 'rxjs/operators';
-
-import * as rootDirectoryActions from '../actions/root-directory.actions';
-import { RootDirectoryService } from '../services/root-directory.service';
-
-/**
- * @class
- * @classdesc Root directory effects.
- */
-@Injectable()
-export class RootDirectoryEffects {
-
-    /**
-     * Calls action to retrieve file list for the given root directory.
-     */
-    loadRootDirectory$ = createEffect((): any =>
-        this.actions$.pipe(
-            ofType(rootDirectoryActions.loadRootDirectory),
-            mergeMap(action => this.rootDirectoryService.retrieveRootDirectory(action.path)
-                .pipe(
-                    map(files => rootDirectoryActions.loadRootDirectorySuccess({ files })),
-                    catchError(() => of(rootDirectoryActions.loadRootDirectoryFail()))
-                )
-            )
-        )
-    );
-
-    constructor(
-        private actions$: Actions,
-        private rootDirectoryService: RootDirectoryService
-    ) {}
-}
diff --git a/client/src/app/metamodel/metamodel.reducer.ts b/client/src/app/metamodel/metamodel.reducer.ts
index 2873d835..a58d9387 100644
--- a/client/src/app/metamodel/metamodel.reducer.ts
+++ b/client/src/app/metamodel/metamodel.reducer.ts
@@ -23,10 +23,10 @@ import * as attribute from './reducers/attribute.reducer';
 import * as criteriaFamily from './reducers/criteria-family.reducer';
 import * as outputCategory from './reducers/output-category.reducer';
 import * as outputFamily from './reducers/output-family.reducer';
-import * as rootDirectory from './reducers/root-directory.reducer';
 import * as select from './reducers/select.reducer';
 import * as selectOption from './reducers/select-option.reducer';
 import * as attributeDistinct from './reducers/attribute-distinct.reducer';
+import * as fileExplorer from './reducers/file-explorer.reducer';
 
 /**
  * Interface for metamodel state.
@@ -47,10 +47,10 @@ export interface State {
     criteriaFamily: criteriaFamily.State;
     outputCategory: outputCategory.State;
     outputFamily: outputFamily.State;
-    rootDirectory: rootDirectory.State;
     select: select.State;
     selectOption: selectOption.State;
     attributeDistinct: attributeDistinct.State;
+    fileExplorer: fileExplorer.State;
 }
 
 const reducers = {
@@ -67,10 +67,10 @@ const reducers = {
     criteriaFamily: criteriaFamily.criteriaFamilyReducer,
     outputCategory: outputCategory.outputCategoryReducer,
     outputFamily: outputFamily.outputFamilyReducer,
-    rootDirectory: rootDirectory.rootDirectoryReducer,
     select: select.selectReducer,
     selectOption: selectOption.selectOptionReducer,
-    attributeDistinct: attributeDistinct.attributeDistinctReducer
+    attributeDistinct: attributeDistinct.attributeDistinctReducer,
+    fileExplorer: fileExplorer.fileExplorerReducer
 };
 
 export const metamodelReducer = combineReducers(reducers);
diff --git a/client/src/app/metamodel/reducers/file-explorer.reducer.ts b/client/src/app/metamodel/reducers/file-explorer.reducer.ts
new file mode 100644
index 00000000..c625f43e
--- /dev/null
+++ b/client/src/app/metamodel/reducers/file-explorer.reducer.ts
@@ -0,0 +1,61 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { createReducer, on } from '@ngrx/store';
+
+import * as fileExplorerActions from '../actions/file-explorer.actions';
+import { FileInfo } from '../models';
+
+/**
+ * Interface for root directory state.
+ *
+ * @interface State
+ */
+export interface State {
+    files: FileInfo[];
+    directoryIsLoading: boolean;
+    directoryIsLoaded: boolean;
+}
+
+export const initialState: State = {
+    files: null,
+    directoryIsLoading: false,
+    directoryIsLoaded: false
+};
+
+export const fileExplorerReducer = createReducer(
+    initialState,
+    on(fileExplorerActions.loadRootDirectory, (state) => ({
+        ...state,
+        files: null,
+        directoryIsLoading: true,
+        directoryIsLoaded: false
+    })),
+    on(fileExplorerActions.loadDatasetDirectory, (state) => ({
+        ...state,
+        files: null,
+        directoryIsLoading: true,
+        directoryIsLoaded: false
+    })),
+    on(fileExplorerActions.loadDirectorySuccess, (state, { files }) => ({
+        ...state,
+        files,
+        directoryIsLoading: false,
+        directoryIsLoaded: true
+    })),
+    on(fileExplorerActions.loadDirectoryFail, state => ({
+        ...state,
+        directoryIsLoading: false,
+        directoryIsLoaded: false
+    }))
+);
+
+export const selectFiles = (state: State) => state.files;
+export const selectDirectoryIsLoading = (state: State) => state.directoryIsLoading;
+export const selectDirectoryIsLoaded = (state: State) => state.directoryIsLoaded;
diff --git a/client/src/app/metamodel/reducers/root-directory.reducer.spec.ts b/client/src/app/metamodel/reducers/root-directory.reducer.spec.ts
deleted file mode 100644
index 942dcd43..00000000
--- a/client/src/app/metamodel/reducers/root-directory.reducer.spec.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { Action } from '@ngrx/store';
-
-import * as fromRootDirectory from './root-directory.reducer';
-import * as rootDirectoryActions from '../actions/root-directory.actions';
-import { FILES } from '../../../test-data';
-
-describe('[Metamodel][Reducers] RootDirectory reducer', () => {
-    it('unknown action should return the default state', () => {
-        const { initialState } = fromRootDirectory;
-        const action = { type: 'Unknown' };
-        const state = fromRootDirectory.rootDirectoryReducer(initialState, action);
-        expect(state).toBe(initialState);
-    });
-
-    it('loadRootDirectory action should set rootDirectoryIsLoading to true', () => {
-        const { initialState } = fromRootDirectory;
-        const action = rootDirectoryActions.loadRootDirectory({ path: 'path' });
-        const state = fromRootDirectory.rootDirectoryReducer(initialState, action);
-        expect(state.ids.length).toEqual(0);
-        expect(state.entities).toEqual({ });
-        expect(state.rootDirectoryIsLoading).toEqual(true);
-        expect(state.rootDirectoryIsLoaded).toEqual(false);
-        expect(state).not.toBe(initialState);
-    });
-
-    it('loadRootDirectorySuccess action should add files, set rootDirectoryIsLoading to false and set rootDirectoryIsLoaded to true', () => {
-        const { initialState } = fromRootDirectory;
-        const action = rootDirectoryActions.loadRootDirectorySuccess({ files: FILES });
-        const state = fromRootDirectory.rootDirectoryReducer(initialState, action);
-        expect(state.ids.length).toEqual(2);
-        expect(state.ids).toContain('file-one');
-        expect(state.ids).toContain('file-two');
-        expect(Object.keys(state.entities).length).toEqual(2);
-        expect(state.rootDirectoryIsLoading).toEqual(false);
-        expect(state.rootDirectoryIsLoaded).toEqual(true);
-        expect(state).not.toBe(initialState);
-    });
-
-    it('loadRootDirectoryFail action should set rootDirectoryIsLoading to false', () => {
-        const { initialState } = fromRootDirectory;
-        const action = rootDirectoryActions.loadRootDirectoryFail();
-        const state = fromRootDirectory.rootDirectoryReducer(initialState, action);
-        expect(state.ids.length).toEqual(0);
-        expect(state.entities).toEqual({ });
-        expect(state.rootDirectoryIsLoading).toEqual(false);
-        expect(state.rootDirectoryIsLoaded).toEqual(false);
-        expect(state).not.toBe(initialState);
-    });
-
-    it('should get rootDirectoryIsLoading', () => {
-        const action = {} as Action;
-        const state =  fromRootDirectory.rootDirectoryReducer(undefined, action);
-
-        expect(fromRootDirectory.selectRootDirectoryIsLoading(state)).toEqual(false);
-    });
-
-    it('should get rootDirectoryIsLoaded', () => {
-        const action = {} as Action;
-        const state = fromRootDirectory.rootDirectoryReducer(undefined, action);
-
-        expect(fromRootDirectory.selectRootDirectoryIsLoaded(state)).toEqual(false);
-    });
-});
diff --git a/client/src/app/metamodel/reducers/root-directory.reducer.ts b/client/src/app/metamodel/reducers/root-directory.reducer.ts
deleted file mode 100644
index efab0b9d..00000000
--- a/client/src/app/metamodel/reducers/root-directory.reducer.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * This file is part of Anis Client.
- *
- * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-import { createReducer, on } from '@ngrx/store';
-import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity';
-
-import * as rootDirectoryActions from '../actions/root-directory.actions';
-import { FileInfo } from '../models';
-
-/**
- * Interface for root directory state.
- *
- * @interface State
- */
-export interface State extends EntityState<FileInfo> {
-    rootDirectoryIsLoading: boolean;
-    rootDirectoryIsLoaded: boolean;
-}
-
-export const adapter: EntityAdapter<FileInfo> = createEntityAdapter<FileInfo>({
-    selectId: (fileInfo: FileInfo) => fileInfo.name,
-    sortComparer: (a: FileInfo, b: FileInfo) => a.name.localeCompare(b.name)
-});
-
-export const initialState: State = adapter.getInitialState({
-    rootDirectoryIsLoading: false,
-    rootDirectoryIsLoaded: false
-});
-
-export const rootDirectoryReducer = createReducer(
-    initialState,
-    on(rootDirectoryActions.loadRootDirectory, (state) => {
-        return {
-            ...state,
-            rootDirectoryIsLoading: true,
-            rootDirectoryIsLoaded: false
-        }
-    }),
-    on(rootDirectoryActions.loadRootDirectorySuccess, (state, { files }) => {
-        return adapter.setAll(
-            files,
-            {
-                ...state,
-                rootDirectoryIsLoading: false,
-                rootDirectoryIsLoaded: true
-            }
-        );
-    }),
-    on(rootDirectoryActions.loadRootDirectoryFail, (state) => {
-        return {
-            ...state,
-            rootDirectoryIsLoading: false
-        }
-    })
-);
-
-const {
-    selectIds,
-    selectEntities,
-    selectAll,
-    selectTotal,
-} = adapter.getSelectors();
-
-export const selectFileInfoIds = selectIds;
-export const selectFileInfoEntities = selectEntities;
-export const selectAllFileInfo = selectAll;
-export const selectFileInfoTotal = selectTotal;
-
-export const selectRootDirectoryIsLoading = (state: State) => state.rootDirectoryIsLoading;
-export const selectRootDirectoryIsLoaded = (state: State) => state.rootDirectoryIsLoaded;
diff --git a/client/src/app/metamodel/selectors/file-explorer.selector.ts b/client/src/app/metamodel/selectors/file-explorer.selector.ts
new file mode 100644
index 00000000..a7d2b305
--- /dev/null
+++ b/client/src/app/metamodel/selectors/file-explorer.selector.ts
@@ -0,0 +1,33 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { createSelector } from '@ngrx/store';
+
+import * as reducer from '../metamodel.reducer';
+import * as fromFileExplorer from '../reducers/file-explorer.reducer';
+
+export const selectFileExplorerState = createSelector(
+    reducer.getMetamodelState,
+    (state: reducer.State) => state.fileExplorer
+);
+
+export const selectFiles = createSelector(
+    selectFileExplorerState,
+    fromFileExplorer.selectFiles
+);
+
+export const selectDirectoryIsLoading = createSelector(
+    selectFileExplorerState,
+    fromFileExplorer.selectDirectoryIsLoading
+);
+
+export const selectDirectoryIsLoaded = createSelector(
+    selectFileExplorerState,
+    fromFileExplorer.selectDirectoryIsLoaded
+);
diff --git a/client/src/app/metamodel/selectors/root-directory.selector.spec.ts b/client/src/app/metamodel/selectors/root-directory.selector.spec.ts
deleted file mode 100644
index ab145eb0..00000000
--- a/client/src/app/metamodel/selectors/root-directory.selector.spec.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import * as rootDirectorySelector from './root-directory.selector';
-import * as fromRootDirectory from '../reducers/root-directory.reducer';
-
-describe('[Metamodel][Selector] Root Directory selector', () => {
-    it('should get rootDirectory state', () => {
-        const state = { metamodel: { rootDirectory: { ...fromRootDirectory.initialState }}};
-        expect(rootDirectorySelector.selectRootDirectoryState(state)).toEqual(state.metamodel.rootDirectory);
-    });
-
-    it('should get file info IDs', () => {
-        const state = { metamodel: { rootDirectory: { ...fromRootDirectory.initialState }}};
-        expect(rootDirectorySelector.selectFileInfoIds(state).length).toEqual(0);
-    });
-
-    it('should get file info entities', () => {
-        const state = { metamodel: { rootDirectory: { ...fromRootDirectory.initialState }}};
-        expect(rootDirectorySelector.selectFileInfoEntities(state)).toEqual({ });
-    });
-
-    it('should get all file info', () => {
-        const state = { metamodel: { rootDirectory: { ...fromRootDirectory.initialState }}};
-        expect(rootDirectorySelector.selectAllFileInfo(state).length).toEqual(0);
-    });
-
-    it('should get file info count', () => {
-        const state = { metamodel: { rootDirectory: { ...fromRootDirectory.initialState }}};
-        expect(rootDirectorySelector.selectFileInfoTotal(state)).toEqual(0);
-    });
-
-    it('should get rootDirectoryIsLoading', () => {
-        const state = { metamodel: { rootDirectory: { ...fromRootDirectory.initialState }}};
-        expect(rootDirectorySelector.selectRootDirectoryIsLoading(state)).toBe(false);
-    });
-
-    it('should get rootDirectoryIsLoading', () => {
-        const state = { metamodel: { rootDirectory: { ...fromRootDirectory.initialState }}};
-        expect(rootDirectorySelector.selectRootDirectoryIsLoaded(state)).toBe(false);
-    });
-});
diff --git a/client/src/app/metamodel/selectors/root-directory.selector.ts b/client/src/app/metamodel/selectors/root-directory.selector.ts
deleted file mode 100644
index 8462cfcf..00000000
--- a/client/src/app/metamodel/selectors/root-directory.selector.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * This file is part of Anis Client.
- *
- * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-import { createSelector } from '@ngrx/store';
-
-import * as reducer from '../metamodel.reducer';
-import * as fromRootDirectory from '../reducers/root-directory.reducer';
-
-export const selectRootDirectoryState = createSelector(
-    reducer.getMetamodelState,
-    (state: reducer.State) => state.rootDirectory
-);
-
-export const selectFileInfoIds = createSelector(
-    selectRootDirectoryState,
-    fromRootDirectory.selectFileInfoIds
-);
-
-export const selectFileInfoEntities = createSelector(
-    selectRootDirectoryState,
-    fromRootDirectory.selectFileInfoEntities
-);
-
-export const selectAllFileInfo = createSelector(
-    selectRootDirectoryState,
-    fromRootDirectory.selectAllFileInfo
-);
-
-export const selectFileInfoTotal = createSelector(
-    selectRootDirectoryState,
-    fromRootDirectory.selectFileInfoTotal
-);
-
-export const selectRootDirectoryIsLoading = createSelector(
-    selectRootDirectoryState,
-    fromRootDirectory.selectRootDirectoryIsLoading
-);
-
-export const selectRootDirectoryIsLoaded = createSelector(
-    selectRootDirectoryState,
-    fromRootDirectory.selectRootDirectoryIsLoaded
-);
diff --git a/client/src/app/metamodel/services/root-directory.service.ts b/client/src/app/metamodel/services/file-explorer.service.ts
similarity index 67%
rename from client/src/app/metamodel/services/root-directory.service.ts
rename to client/src/app/metamodel/services/file-explorer.service.ts
index ed8c19c3..4894cd4b 100644
--- a/client/src/app/metamodel/services/root-directory.service.ts
+++ b/client/src/app/metamodel/services/file-explorer.service.ts
@@ -17,10 +17,10 @@ import { AppConfigService } from 'src/app/app-config.service';
 
 /**
  * @class
- * @classdesc Root directory service.
+ * @classdesc File explorer service.
  */
 @Injectable()
-export class RootDirectoryService {
+export class FileExplorerService {
     constructor(private http: HttpClient, private config: AppConfigService) { }
 
     /**
@@ -33,4 +33,15 @@ export class RootDirectoryService {
     retrieveRootDirectory(path: string): Observable<FileInfo[]> {
         return this.http.get<FileInfo[]>(`${this.config.apiUrl}/file-explorer${path}`);
     }
+
+    /**
+     * Retrieves dataset directory with the given path.
+     *
+     * @param  {string} path - The path.
+     *
+     * @return Observable<FileInfo[]>
+     */
+    retrieveDatasetDirectory(datasetName: string, path: string): Observable<FileInfo[]> {
+        return this.http.get<FileInfo[]>(`${this.config.apiUrl}//dataset-file-explorer//${datasetName}${path}`);
+    }
 }
diff --git a/client/src/app/metamodel/services/index.ts b/client/src/app/metamodel/services/index.ts
index 414036d9..5433cee0 100644
--- a/client/src/app/metamodel/services/index.ts
+++ b/client/src/app/metamodel/services/index.ts
@@ -20,10 +20,10 @@ import { AttributeService } from './attribute.service';
 import { CriteriaFamilyService } from './criteria-family.service';
 import { OutputCategoryService } from './output-category.service';
 import { OutputFamilyService } from './output-family.service';
-import { RootDirectoryService } from './root-directory.service';
 import { SelectService } from './select.service';
 import { SelectOptionService } from './select-option.service';
 import { AttributeDistinctService } from './attribute-distinct.service';
+import { FileExplorerService } from './file-explorer.service';
 
 export const metamodelServices = [
     DatabaseService,
@@ -39,8 +39,8 @@ export const metamodelServices = [
     CriteriaFamilyService,
     OutputCategoryService,
     OutputFamilyService,
-    RootDirectoryService,
     SelectService,
     SelectOptionService,
-    AttributeDistinctService
+    AttributeDistinctService,
+    FileExplorerService
 ];
diff --git a/client/src/app/metamodel/services/root-directory.service.spec.ts b/client/src/app/metamodel/services/root-directory.service.spec.ts
deleted file mode 100644
index adf40e82..00000000
--- a/client/src/app/metamodel/services/root-directory.service.spec.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { TestBed, inject } from '@angular/core/testing';
-import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
-
-import { RootDirectoryService } from './root-directory.service';
-import { AppConfigService } from 'src/app/app-config.service';
-import { FileInfo } from '../models';
-
-describe('[Instance][Metamodel][Services] RootDirectoryService', () => {
-    let service: RootDirectoryService;
-
-    beforeEach(() => {
-        TestBed.configureTestingModule({
-            imports: [HttpClientTestingModule],
-            providers: [
-                { provide: AppConfigService, useValue: { apiUrl: 'http://testing.com' } },
-                RootDirectoryService
-            ]
-        });
-        service = TestBed.inject(RootDirectoryService);
-    });
-
-    it('#retrieveRootDirectory() should return an Observable<FileInfo[]>',
-        inject([HttpTestingController, RootDirectoryService],(httpMock: HttpTestingController, service: RootDirectoryService) => {
-                const mockResponse = [];
-
-                service.retrieveRootDirectory('/path').subscribe((event: FileInfo[]) => {
-                    expect(event).toEqual(mockResponse);
-                });
-
-                const mockRequest = httpMock.expectOne('http://testing.com/file-explorer/path');
-
-                expect(mockRequest.cancelled).toBeFalsy();
-                expect(mockRequest.request.method).toEqual('GET');
-                expect(mockRequest.request.responseType).toEqual('json');
-                mockRequest.flush(mockResponse);
-
-                httpMock.verify();
-            }
-        )
-    );
-});
-- 
GitLab