You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by dg...@apache.org on 2020/05/15 15:43:44 UTC

[incubator-dlab] branch develop updated: [Dlab-1789]: Add percent progress bar, created uploading queue, fixed bugs (#755)

This is an automated email from the ASF dual-hosted git repository.

dgnatyshyn pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git


The following commit(s) were added to refs/heads/develop by this push:
     new ef565f5  [Dlab-1789]: Add percent progress bar, created uploading queue, fixed bugs (#755)
ef565f5 is described below

commit ef565f5dad36d4f58fb8ffa7c156648742e5521e
Author: Dmytro Gnatyshyn <42...@users.noreply.github.com>
AuthorDate: Fri May 15 18:43:37 2020 +0300

    [Dlab-1789]: Add percent progress bar, created uploading queue, fixed bugs (#755)
    
    [Dlab-1789]: Add percent progress bar, created uploading queue, fixed bugs
---
 .../service/impl/gcp/BucketServiceGcpImpl.java     |  4 +-
 .../convert-file-size/convert-file-size.pipe.ts}   | 48 ++++++----------
 .../convert-file-size/index.ts}                    | 40 +++-----------
 .../src/app/core/services/appRouting.service.ts    |  1 -
 .../services/applicationServiceFacade.service.ts   |  4 +-
 .../src/app/reporting/reporting.component.ts       |  1 -
 .../bucket-browser/bucket-browser.component.html   | 24 +++++---
 .../bucket-browser/bucket-browser.component.scss   | 30 ++--------
 .../bucket-browser/bucket-browser.component.ts     | 64 +++++++++++++++-------
 .../folder-tree/folder-tree.component.ts           |  5 +-
 .../resources-grid/resources-grid.component.ts     |  3 +-
 .../src/app/resources/resources.component.ts       |  1 -
 .../webapp/src/app/resources/resources.module.ts   |  2 +
 .../webapp/src/assets/styles/_dialogs.scss         | 27 +++++++++
 14 files changed, 127 insertions(+), 127 deletions(-)

diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
index dc068fc..73048c4 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
@@ -29,7 +29,6 @@ import com.google.cloud.storage.Bucket;
 import com.google.cloud.storage.Storage;
 import com.google.cloud.storage.StorageOptions;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.FileUtils;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
@@ -102,13 +101,12 @@ public class BucketServiceGcpImpl implements BucketService {
     }
 
     private BucketDTO toBucketDTO(BlobInfo blobInfo) {
-        final String size = FileUtils.byteCountToDisplaySize(blobInfo.getSize());
         Date date = new Date(blobInfo.getUpdateTime());
         SimpleDateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
         return BucketDTO.builder()
                 .bucket(blobInfo.getBucket())
                 .object(blobInfo.getName())
-                .size(size)
+                .size(String.valueOf(blobInfo.getSize()))
                 .lastModifiedDate(formatter.format(date))
                 .build();
     }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/appRouting.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/convert-file-size.pipe.ts
similarity index 51%
copy from services/self-service/src/main/resources/webapp/src/app/core/services/appRouting.service.ts
copy to services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/convert-file-size.pipe.ts
index 0f05bcb..c316c0e 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/appRouting.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/convert-file-size.pipe.ts
@@ -17,36 +17,20 @@
  * under the License.
  */
 
-import { Injectable } from '@angular/core';
-import { Router } from '@angular/router';
-
-@Injectable()
-export class AppRoutingService {
-  constructor(private router: Router) { }
-
-  redirectToLoginPage(): void {
-    if (this.router.url !== '/login')
-      this.router.navigate(['/login']);
-  }
-
-  redirectToNoAccessPage(): void {
-    this.router.navigate(['/403']);
-  }
-
-  redirectToHomePage(): void {
-    console.log('redirect');
-    this.router.navigate(['/resources_list']);
-  }
-
-  redirectToHealthStatusPage(): void {
-    this.router.navigate(['/environment_management']);
-  }
-
-  redirectToAzure(): void {
-    window.location.href = `${window.location.origin}/api/user/azure/init`;
-  }
-
-  redirectToUrl(url: string): void {
-    window.location.href = url;
-  }
+import { Pipe, PipeTransform } from '@angular/core';
+
+@Pipe({ name: 'convertFileSize' })
+
+export class ConvertFileSizePipe implements PipeTransform {
+  transform(bytes: number): any {
+      const sizes = ['bytes', 'KB', 'MB', 'GB', 'TB'];
+      for (let i = 0; i < sizes.length; i++) {
+        if (bytes <= 1024) {
+          return bytes + ' ' + sizes[i];
+        } else {
+          bytes = Math.round(bytes / 1024);
+        }
+      }
+      return bytes;
+    }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/appRouting.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/index.ts
similarity index 51%
copy from services/self-service/src/main/resources/webapp/src/app/core/services/appRouting.service.ts
copy to services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/index.ts
index 0f05bcb..2080443 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/appRouting.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/index.ts
@@ -17,36 +17,14 @@
  * under the License.
  */
 
-import { Injectable } from '@angular/core';
-import { Router } from '@angular/router';
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { ConvertFileSizePipe } from './convert-file-size.pipe';
 
-@Injectable()
-export class AppRoutingService {
-  constructor(private router: Router) { }
+@NgModule({
+  imports: [CommonModule],
+  declarations: [ConvertFileSizePipe],
+  exports: [ConvertFileSizePipe]
+})
 
-  redirectToLoginPage(): void {
-    if (this.router.url !== '/login')
-      this.router.navigate(['/login']);
-  }
-
-  redirectToNoAccessPage(): void {
-    this.router.navigate(['/403']);
-  }
-
-  redirectToHomePage(): void {
-    console.log('redirect');
-    this.router.navigate(['/resources_list']);
-  }
-
-  redirectToHealthStatusPage(): void {
-    this.router.navigate(['/environment_management']);
-  }
-
-  redirectToAzure(): void {
-    window.location.href = `${window.location.origin}/api/user/azure/init`;
-  }
-
-  redirectToUrl(url: string): void {
-    window.location.href = url;
-  }
-}
+export class ConvertFileSizePipeModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/appRouting.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/appRouting.service.ts
index 0f05bcb..1a80759 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/appRouting.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/appRouting.service.ts
@@ -34,7 +34,6 @@ export class AppRoutingService {
   }
 
   redirectToHomePage(): void {
-    console.log('redirect');
     this.router.navigate(['/resources_list']);
   }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts
index 1fdd39d..a207f97 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts
@@ -263,7 +263,7 @@ export class ApplicationServiceFacade {
   public buildUploadFileToBucket(data): Observable<any> {
     return this.buildRequest(HTTPMethod.POST,
       this.requestRegistry.Item(ApplicationServiceFacade.BUCKET) + '/upload',
-      data);
+      data, { reportProgress: true, observe: 'events' });
   }
 
   public buildDownloadFileFromBucket(data) {
@@ -271,7 +271,7 @@ export class ApplicationServiceFacade {
       this.requestRegistry.Item(ApplicationServiceFacade.BUCKET),
       data, { dataType : 'binary',
         processData : false,
-        responseType : 'arraybuffer' } );
+        responseType : 'arraybuffer', reportProgress: true, observe: 'events' } );
   }
 
   public buildDeleteFileFromBucket(data): Observable<any> {
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts
index 03f7ca9..1692ef1 100644
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts
@@ -156,7 +156,6 @@ export class ReportingComponent implements OnInit, OnDestroy {
         types.push(item['resource_type']);
 
       if (item.shape && types.indexOf(item.shape)) {
-        console.log(item);
        if (item.shape.indexOf('Master') > -1) {
           for (let shape of item.shape.split(/(?=Slave)/g)) {
             shape = shape.replace('Master: ', '');
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
index f920928..a994bf9 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
@@ -192,10 +192,14 @@
                   {{file.item}}
                 </span>
               </div>
-              <div class="size">{{file.object?.size}}</div>
+              <div class="size">{{file.object?.size | convertFileSize}}</div>
               <div class="date" *ngIf="!file.isDownloading">{{file.object?.lastModifiedDate }}</div>
               <div class="progress-wrapper" *ngIf="file.isDownloading">
-                <mat-progress-bar mode="indeterminate"></mat-progress-bar>
+                <div class="progres">
+                  <span class="progress-bar-text">{{file.progress || 0}}% Downloading...</span>
+                  <div class="bar" [ngStyle]="{width: file.progress + '%'}">
+                  </div>
+                </div>
               </div>
             </div>
           </li>
@@ -235,12 +239,18 @@
           <div class="upload-path">
             <span class="ellipsis" matTooltip="{{file.path}}" matTooltipPosition="above">{{file.path}}</span>
           </div>
-          <div class="size">{{file.size}}MB</div>
+          <div class="size">{{file.size | convertFileSize}} </div>
           <div class="state">
-            <button mat-raised-button (click)="uploadNewFile(file)" *ngIf="!file.isUploading && !file.uploaded && !file.errorUploading">Upload</button>
-            <mat-progress-bar mode="indeterminate" *ngIf="file.isUploading"></mat-progress-bar>
-            <span *ngIf="file.uploaded" class="running">Uploaded</span>
-            <span *ngIf="file.errorUploading" class="error">Failed</span>
+<!--           <button mat-raised-button (click)="uploadNewFile(file)" *ngIf="!file.isUploading && !file.uploaded && !file.errorUploading">Upload</button>-->
+           <mat-progress-bar mode="indeterminate" *ngIf="file.isUploading"></mat-progress-bar>
+            <span *ngIf="file.status === 'uploaded'" class="running">Uploaded</span>
+            <div class="progres" *ngIf="file.status === 'uploading'">
+              <span class="progress-bar-text">{{file.progress || 0}}% Uploading...</span>
+              <div class="bar" [ngStyle]="{width: file.progress + '%'}">
+              </div>
+            </div>
+            <span *ngIf="file.status === 'failed'" class="error">Failed</span>
+            <span *ngIf="file.status === 'waiting'" class="stopped">Waiting for uploading...</span>
           </div>
           <div class="remove"><i (click)="deleteAddedFile(file)" class="material-icons close">close</i></div>
         </li>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
index 21f3d04..76b5555 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
@@ -27,14 +27,15 @@
 
   .loading-block{
     width: 80%;
-    margin: 20% auto 0 auto;
+    margin: 0 auto;
     display: flex;
-    align-content: center;
+    align-items: center;
     justify-content: center;
     height: 100%;
     .uploading{
       width: 100%;
       text-align: center;
+      padding-bottom: 50px;
       p{
         margin-bottom: 20px;
       }
@@ -342,26 +343,6 @@
 
       .progress-wrapper{
         flex:1;
-
-        .progres{
-          border: 1px solid rgba(0,0,0,.12);
-          height: 15px;
-          position: relative;
-
-          .bar{
-            position: absolute;
-            top: 0;
-            bottom: 0;
-            left: 0;
-            width: 0;
-            background-color:  #00bcd4;
-
-            &.full{
-              width: 100%;
-              transition: 5s ease-in-out;
-            }
-          }
-        }
       }
 
       .material-icons.close{
@@ -625,12 +606,11 @@ input[type='file'] {
       }
 
       .size{
-        flex:4;
+        flex:2;
       }
       .state{
-        flex:6;
+        flex:4;
         display: flex;
-        justify-content: center;
         align-items: center;
         .mat-raised-button{
           width: 60px;
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
index 03e0c42..78acb30 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
@@ -29,6 +29,7 @@ import {FileUtils} from '../../core/util';
 import {BucketDataService} from './bucket-data.service';
 import {BucketConfirmationDialogComponent} from './bucket-confirmation-dialog/bucket-confirmation-dialog.component';
 import {logger} from 'codelyzer/util/logger';
+import {HttpEventType, HttpResponse} from '@angular/common/http';
 
 @Component({
   selector: 'dlab-bucket-browser',
@@ -98,7 +99,7 @@ export class BucketBrowserComponent implements OnInit {
         const uploadItem = {
           name: file['name'],
           file: file,
-          'size': (file['size'] / 1048576).toFixed(2),
+          size: file.size,
           path: this.path,
           isUploading: false,
           uploaded: false,
@@ -149,7 +150,6 @@ export class BucketBrowserComponent implements OnInit {
   this.selectedFolderForAction = this.folderItems.filter(item => item.isFolderSelected);
   this.selectedItems = [...this.selected, ...this.selectedFolderForAction];
   this.isActionsOpen = false;
-
   }
 
   filesPicked(files) {
@@ -175,7 +175,6 @@ export class BucketBrowserComponent implements OnInit {
       this.path = event.path;
       this.originFolderItems = this.folderItems.map(v => v);
       this.pathInsideBucket = this.path.indexOf('/') !== -1 ?  this.path.slice(this.path.indexOf('/') + 1) + '/' : '';
-      // this.bucketName = this.path.substring(0, this.path.indexOf('/')) || this.path;
       this.folderItems.forEach(item => item.isSelected = false);
     }
   }
@@ -204,19 +203,33 @@ export class BucketBrowserComponent implements OnInit {
     formData.append('object', fullPath);
     formData.append('bucket', this.bucketName);
     formData.append('endpoint', this.endpoint);
-    file.isUploading = true;
-    this.bucketBrowserService.uploadFile(formData)
-      .subscribe(() => {
-        this.bucketDataService.refreshBucketdata(this.data.bucket, this.data.endpoint);
-        file.isUploading = false;
-        file.uploaded = true;
-        // this.toastr.success('File successfully uploaded!', 'Success!');
-      }, error => {
-        // this.toastr.error(error.message || 'File uploading error!', 'Oops!');
-        file.errorUploading = true;
-        file.isUploading = false;
-      }
-    );
+    file.status = 'waiting';
+    file.request = this.bucketBrowserService.uploadFile(formData);
+    this.sendFile(file);
+  }
+
+  public sendFile(file) {
+    const waitUploading = this.addedFiles.filter(v => v.status === 'waiting');
+    const uploading = this.addedFiles.filter(v => v.status === 'uploading');
+    if (waitUploading.length && uploading.length < 11) {
+      file.status = 'uploading';
+      file.request.subscribe((event: any) => {
+          if (event.type === HttpEventType.UploadProgress) {
+            file.progress = Math.round(99 * event.loaded / event.total);
+          } else if (event instanceof HttpResponse) {
+            this.bucketDataService.refreshBucketdata(this.bucketName, this.data.endpoint);
+            file.status = 'uploaded';
+            delete file.request;
+            this.sendFile(this.addedFiles.filter(v => v.status === 'waiting')[0]);
+          }
+        }, error => {
+          file.status = 'failed';
+          delete file.request;
+          this.sendFile(this.addedFiles.filter(v => v.status === 'waiting')[0]);
+        }
+      );
+    }
+
   }
 
   public refreshBucket() {
@@ -240,15 +253,24 @@ export class BucketBrowserComponent implements OnInit {
   public fileAction(action) {
     const selected = this.folderItems.filter(item => item.isSelected);
     const folderSelected = this.folderItems.filter(item => item.isFolderSelected);
-
     if (action === 'download') {
       const path = encodeURIComponent(`${this.pathInsideBucket}${this.selected[0].item}`);
       selected[0]['isDownloading'] = true;
       this.bucketBrowserService.downloadFile(`/${this.bucketName}/object/${path}/endpoint/${this.endpoint}/download`)
-        .subscribe(data =>  {
-        FileUtils.downloadBigFiles(data, selected[0].item);
-        selected[0]['isDownloading'] = false;
-        this.folderItems.forEach(item => item.isSelected = false);
+        .subscribe(event =>  {
+            if (event['type'] === HttpEventType.DownloadProgress) {
+              selected[0].progress = Math.round(100 * event['loaded'] / selected[0].object.size);
+            }
+            if (event['type'] === HttpEventType.Response) {
+              FileUtils.downloadBigFiles(event['body'], selected[0].item);
+              setTimeout(() => {
+                selected[0]['isDownloading'] = false;
+                selected[0].progress = 0;
+              }, 1000);
+
+              this.folderItems.forEach(item => item.isSelected = false);
+            }
+
         }, error => {
             this.toastr.error(error.message || 'File downloading error!', 'Oops!');
             selected[0]['isDownloading'] = false;
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
index c600d54..5c4021d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
@@ -9,6 +9,7 @@ import {FormControl, FormGroupDirective, NgForm, Validators} from '@angular/form
 import {ErrorStateMatcher} from '@angular/material/core';
 import {PATTERNS} from '../../../core/util';
 import {ToastrService} from 'ngx-toastr';
+import {HttpEventType, HttpResponse} from '@angular/common/http';
 
 export class MyErrorStateMatcher implements ErrorStateMatcher {
   isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
@@ -256,13 +257,15 @@ export class FolderTreeComponent implements OnInit, OnDestroy {
     formData.append('bucket', bucket);
     formData.append('endpoint', this.endpoint);
     this.bucketBrowserService.uploadFile(formData)
-      .subscribe(() => {
+      .subscribe((event) => {
+      if (event instanceof HttpResponse) {
           this.bucketDataService.refreshBucketdata(bucket, this.endpoint);
           this.toastr.success('Folder successfully created!', 'Success!');
           this.resetForm();
           this.folderFormControl.updateValueAndValidity();
           this.folderFormControl.markAsPristine();
           this.folderCreating = false;
+        }
         }, error => {
           this.toastr.error(error.message || 'Folder creation error!', 'Oops!');
           this.folderCreating = false;
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts
index 2a2c49f..95ca609 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts
@@ -341,7 +341,7 @@ export class ResourcesGridComponent implements OnInit {
         const edgeItem = {name: `${project.project}(${key})`, children: []};
         const projectBucket = currEndpoint[this.DICTIONARY[provider.toLowerCase()].bucket_name];
         const sharedBucket = currEndpoint[this.DICTIONARY[provider.toLowerCase()].shared_bucket_name];
-        if (projectBucket) {
+        if (projectBucket && currEndpoint.status !== 'terminated' && currEndpoint.status !== 'terminating' && currEndpoint.status !== 'failed') {
           edgeItem.children.push({name: projectBucket, endpoint: key});
         }
         if (sharedBucket) {
@@ -351,7 +351,6 @@ export class ResourcesGridComponent implements OnInit {
       });
     });
     this.bucketsList = SortUtils.flatDeep(bucketsList, 1).filter(v => v.children.length);
-    console.log(this.bucketsList.filter(v => v.children.length));
   }
 
   private getUserPreferences(): void {
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts
index eedde78..6308b72 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts
@@ -119,7 +119,6 @@ export class ResourcesComponent implements OnInit {
         this.healthStatus = result;
         this.resourcesGrid.healthStatus = this.healthStatus;
         this.bucketStatus = this.healthStatus.bucketBrowser;
-        console.log(this.bucketStatus);
       },
       error => this.toastr.error(error.message, 'Oops!'));
   }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
index b20ca72..fa70162 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
@@ -33,6 +33,7 @@ import {MatTreeModule} from '@angular/material/tree';
 import {BucketDataService} from './bucket-browser/bucket-data.service';
 import {BucketConfirmationDialogComponent} from './bucket-browser/bucket-confirmation-dialog/bucket-confirmation-dialog.component';
 import {BucketTreeComponent} from './bucket-browser/buckets-tree/bucket-tree.component';
+import {ConvertFileSizePipeModule} from '../core/pipes/convert-file-size';
 
 @NgModule({
     imports: [
@@ -43,6 +44,7 @@ import {BucketTreeComponent} from './bucket-browser/buckets-tree/bucket-tree.com
         ExploratoryEnvironmentCreateModule,
         MaterialModule,
         MatTreeModule,
+        ConvertFileSizePipeModule
     ],
   declarations: [
     ResourcesComponent,
diff --git a/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss b/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss
index b0ee3a0..e7de7fd 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss
+++ b/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss
@@ -362,6 +362,33 @@ mat-dialog-container {
   display: none !important;
 }
 
+.progres{
+  border: 1px solid rgba(0,0,0,.12);
+  height: 17px;
+  position: relative;
+  width: 100%;
+
+  .bar{
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 0;
+    background-color:  #00bcd4;
+  }
+
+  .progress-bar-text{
+    position: absolute;
+    left: 5px;
+    top: 0;
+    bottom: 0;
+    font-size: 11px;
+    line-height: 13px;
+    color: rgba(0, 0, 0, 0.87);
+    z-index: 10;
+  }
+}
+
 
 @media screen and (max-width: 1280px) {
   .modal-fullscreen {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org