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