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 55c5700  [DLAB-1738]: Added bucket browser to resource page, added 
multi buckets support (#753)
55c5700 is described below

commit 55c5700daf3ab46b21713627f44e4fbdc00bad4a
Author: Dmytro Gnatyshyn <42860905+dg1...@users.noreply.github.com>
AuthorDate: Thu May 14 19:31:31 2020 +0300

    [DLAB-1738]: Added bucket browser to resource page, added multi buckets 
support (#753)
    
    [DLAB-1738]: Added bucket browser to resource page and multi bucket support
---
 .../bucket-browser/bucket-browser.component.html   | 38 +++++-----
 .../bucket-browser/bucket-browser.component.ts     | 19 +++--
 .../buckets-tree/bucket-tree.component.html        | 14 +++-
 .../buckets-tree/bucket-tree.component.scss        |  5 ++
 .../buckets-tree/bucket-tree.component.ts          | 80 +++++++++++++---------
 .../detail-dialog/detail-dialog.component.html     |  4 +-
 .../detail-dialog/detail-dialog.component.ts       |  3 +-
 .../resources-grid/resources-grid.component.ts     | 26 ++++++-
 .../resources-grid/resources-grid.model.ts         |  4 ++
 .../src/app/resources/resources.component.html     | 12 +++-
 .../src/app/resources/resources.component.ts       | 20 +++++-
 .../webapp/src/assets/styles/_dialogs.scss         |  4 ++
 12 files changed, 159 insertions(+), 70 deletions(-)

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 c6b1d17..f920928 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
@@ -24,11 +24,11 @@
   </header>
 
 <!--  <div class="dialog-content tabs">-->
-  <div class="dialog-content tabs" [hidden]="!path">
+  <div class="dialog-content tabs">
     <div class="submit m-bott-10 m-top-10">
       <div class="left-side-butts">
       <span [matTooltip]="'You have not permission to upload data'" 
matTooltipPosition="above" matTooltipDisabled="{{this.bucketStatus.upload}}">
-        <button mat-raised-button type="button" class="butt first-btn" 
[disabled]="!this.bucketStatus.upload || allDisable || isSelectionOpened" 
(click)="handleFileInput($event)">
+        <button mat-raised-button type="button" class="butt first-btn" 
[disabled]="!this.bucketStatus.upload || allDisable || isSelectionOpened || 
!path || isSelectionOpened" (click)="handleFileInput($event)">
           <input [ngClass]="{'not-allowed': !this.bucketStatus.upload}" 
type="file" (change)="handleFileInput($event)" title="" multiple>
           Upload files
         </button>
@@ -39,7 +39,7 @@
           type="button"
           class="butt"
           (click)="createFolder(selectedFolder)"
-          [disabled]="!this.bucketStatus.upload || allDisable"
+          [disabled]="!this.bucketStatus.upload || allDisable || !path || 
isSelectionOpened"
         >
           Create folder
         </button>
@@ -50,7 +50,7 @@
           class="butt"
           mat-raised-button
           (click)="fileAction('delete')"
-          [disabled]="(!selected?.length && !selectedFolderForAction?.length) 
|| !this.bucketStatus.delete || allDisable"
+          [disabled]="(!selected?.length && !selectedFolderForAction?.length) 
|| !this.bucketStatus.delete || allDisable || !path || isSelectionOpened"
         >
         Delete
       </button>
@@ -60,7 +60,7 @@
           <button
             type="button" class="butt actions-btn"
             mat-raised-button
-            [disabled]=" selectedItems?.length !== 1 || allDisable"
+            [disabled]=" selectedItems?.length !== 1 || allDisable || !path || 
isSelectionOpened"
             (click)="toogleActions();$event.stopPropagation()"
           >
             Actions <i class="material-icons" >{{ !isActionsOpen ?  
'expand_more' : 'expand_less' }}</i>
@@ -70,7 +70,7 @@
           <button
             type="button" class="butt action-menu-item"
             mat-raised-button
-            [disabled]=" !selected?.length || this.selectedItems?.length > 1 
|| !this.bucketStatus.download || allDisable"
+            [disabled]=" !selected?.length || this.selectedItems?.length > 1 
|| !this.bucketStatus.download || allDisable || isSelectionOpened"
             (click)="fileAction('download');$event.stopPropagation()"
           >
             Download
@@ -94,7 +94,6 @@
       >
         <i class="material-icons">autorenew</i>Refresh
       </button>
-
     </div>
     <p class="path"><span>Bucket path:</span>
     <span class="url ellipsis">
@@ -118,13 +117,14 @@
           <i (click)="toggleBucketSelection()" class="material-icons 
close">{{isSelectionOpened ? 'chevron_left' : 'chevron_right'}}</i>
         </div>
         <dlab-bucket-tree
-          *ngIf="isSelectionOpened"
-          (emitActiveBucket)=onFolderClick($event)
+          [hidden] = "!isSelectionOpened"
+          (emitActiveBucket)=openBucket($event)
+          [buckets]='buckets'
           [openedBucket] = this.bucketName
         >
         </dlab-bucket-tree>
       </div>
-      <div class="navigation" [ngClass]="{'selection-opened': 
isSelectionOpened}">
+      <div class="navigation" [ngClass]="{'selection-opened': 
isSelectionOpened}" [hidden]="!path">
         <dlab-folder-tree
           (showFolderContent)=onFolderClick($event)
           (disableAll) = dissableAll($event)
@@ -132,7 +132,7 @@
           [endpoint] = endpoint
         > </dlab-folder-tree>
       </div>
-      <div class="directory" [ngClass]="{'selection-opened': 
isSelectionOpened}">
+      <div class="directory" [ngClass]="{'selection-opened': 
isSelectionOpened}" [hidden]="!path">
         <div class="folder-item t_header">
           <div class="folder-item-wrapper header-wrapper folder-tree 
header-item">
             <div class="name">
@@ -152,7 +152,6 @@
             <div class="date"><span class="th_date">Last modified</span></div>
           </div>
         </div>
-<!--        <ul class="folder-tree" *ngIf="!addedFiles.length">-->
         <ul class="folder-tree">
           <li *ngFor="let file of folderItems" class="folder-item" >
             <div class="folder-item-wrapper" *ngIf="file.children && 
file.item" (click)="showItem(file)">
@@ -202,6 +201,12 @@
           </li>
         </ul>
       </div>
+      <div class="loading-block" *ngIf="!path">
+        <div class="uploading">
+          <p>Please wait until DLab loads bucket: <span 
class="strong">{{bucketName}}</span>...</p>
+          <mat-progress-bar mode="indeterminate"></mat-progress-bar>
+        </div>
+      </div>
     </div>
     <div class="upload-window" *ngIf="addedFiles.length">
       <header class="upload-header">
@@ -242,14 +247,5 @@
         <li id="upload-list"></li>
       </ul>
     </div>
-<!--    <div class="text-center m-top-30 m-bott-20">-->
-<!--      <button type="button" class="butt" mat-raised-button 
(click)="this.dialogRef.close()">Close</button>-->
-<!--    </div>-->
-  </div>
-  <div class="loading-block" *ngIf="!path">
-    <div class="uploading">
-      <p>Please wait until DLab loads bucket: <span 
class="strong">{{data.bucket}}</span>...</p>
-      <mat-progress-bar mode="indeterminate"></mat-progress-bar>
-    </div>
   </div>
 </div>
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 5f549a2..03e0c42 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
@@ -44,7 +44,6 @@ export class BucketBrowserComponent implements OnInit {
   public pathInsideBucket = '';
   public bucketName = '';
   public endpoint = '';
-  public isUploadWindowOpened = false;
   public selectedFolder: any;
   public selectedFolderForAction: any;
   public selected: any[];
@@ -58,6 +57,7 @@ export class BucketBrowserComponent implements OnInit {
   @ViewChild(FolderTreeComponent, {static: true}) folderTreeComponent;
   public isSelectionOpened: any;
   isFilterVisible: boolean;
+  public buckets;
 
 
 
@@ -75,9 +75,11 @@ export class BucketBrowserComponent implements OnInit {
   }
 
   ngOnInit() {
-    this.bucketDataService.refreshBucketdata(this.data.bucket, 
this.data.endpoint);
+    this.bucketName = this.data.bucket;
+    this.bucketDataService.refreshBucketdata(this.bucketName, 
this.data.endpoint);
     this.endpoint = this.data.endpoint;
     this.bucketStatus = this.data.bucketStatus;
+    this.buckets = this.data.buckets;
   }
 
   public showItem(item) {
@@ -173,7 +175,7 @@ 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.bucketName = this.path.substring(0, this.path.indexOf('/')) || 
this.path;
       this.folderItems.forEach(item => item.isSelected = false);
     }
   }
@@ -218,7 +220,16 @@ export class BucketBrowserComponent implements OnInit {
   }
 
   public refreshBucket() {
-    this.bucketDataService.refreshBucketdata(this.data.bucket, 
this.data.endpoint);
+    this.path = '';
+    this.bucketDataService.refreshBucketdata(this.bucketName, 
this.data.endpoint);
+    this.isSelectionOpened = false;
+  }
+
+  public openBucket($event) {
+    this.bucketName = $event.name;
+    this.path = '';
+    this.bucketDataService.refreshBucketdata(this.bucketName, $event.endpoint);
+    this.isSelectionOpened = false;
   }
 
   public createFolder(folder) {
diff --git 
a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.html
 
b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.html
index ba3f2a3..8d5e04b 100644
--- 
a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.html
+++ 
b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.html
@@ -1,7 +1,17 @@
 <mat-tree [dataSource]="dataSource" [treeControl]="treeControl">
-  <mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding 
matTreeNodePaddingIndent="17" (click)="openBucketData(node)" 
[ngClass]="{'active-item': activeBucket === node}">
+  <mat-tree-node
+    *matTreeNodeDef="let node"
+    matTreeNodePadding matTreeNodePaddingIndent="17"
+    (click)="openBucketData(node)"
+    [ngClass]="{'active-item': activeBacket === node}">
     <button mat-icon-button disabled></button>
-    {{node.name}}
+    <div
+      class="ellipsis"
+      matTooltip="{{node.name}}"
+      matTooltipPosition="above"
+      matTooltipShowDelay="1000"
+      [matTooltipClass]="'bucket-item-tooltip'"
+    >{{node.name}}</div>
   </mat-tree-node>
   <mat-tree-node *matTreeNodeDef="let node;when: hasChild" matTreeNodePadding  
matTreeNodePaddingIndent="17">
     <button mat-icon-button matTreeNodeToggle
diff --git 
a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.scss
 
b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.scss
index 202d4e0..fd06d7a 100644
--- 
a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.scss
+++ 
b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.scss
@@ -92,6 +92,11 @@
   .mat-error {
     background-color: #ffffff;
   }
+
+  .d-none{
+    display: none;
+  }
+
 }
 
 
diff --git 
a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.ts
 
b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.ts
index 56ef4cc..2b3006b 100644
--- 
a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.ts
+++ 
b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.ts
@@ -2,36 +2,20 @@ import {Component, EventEmitter, Input, OnInit, Output} from 
'@angular/core';
 import {FlatTreeControl} from '@angular/cdk/tree';
 import {MatTreeFlatDataSource, MatTreeFlattener} from '@angular/material/tree';
 
-interface FoodNode {
+
+interface BucketNode {
   name: string;
-  children?: FoodNode[];
+  endpoint?: string;
+  children?: BucketNode[];
 }
 
-const TREE_DATA: FoodNode[] = [
-      {
-        name: 'ProjectA(local)',
-        children: [
-          {name: 'vi-aws-11-05-projectb-local-bucket.'},
-          {name: 'ad-aws-11-05-projectb-local-bucket.'},
-        ]
-      }, {
-        name: 'ProjectA(local1)',
-        children: [
-          {name: 'rt-aws-11-05-projectb-local-bucket.'},
-          {name: 'rt-aws-11-05-projectb-local-bucket.'},
-        ]
-      },
-    ];
-
 /** Flat node with expandable and level information */
-interface ExampleFlatNode {
+interface BucketFlatNode {
   expandable: boolean;
   name: string;
   level: number;
 }
 
-
-
 @Component({
   selector: 'dlab-bucket-tree',
   templateUrl: './bucket-tree.component.html',
@@ -39,20 +23,20 @@ interface ExampleFlatNode {
 })
 
 export class BucketTreeComponent implements OnInit {
-  public activeBucket;
-
   @Output() emitActiveBucket: EventEmitter<{}> = new EventEmitter();
   @Input() openedBucket: string;
+  @Input() buckets: BucketNode[];
 
-  private _transformer = (node: FoodNode, level: number) => {
+  private _transformer = (node: BucketNode, level: number) => {
     return {
       expandable: !!node.children && node.children.length > 0,
       name: node.name,
+      endpoint: node.endpoint,
       level: level,
     };
   }
 
-  treeControl = new FlatTreeControl<ExampleFlatNode>(
+  treeControl = new FlatTreeControl<BucketFlatNode>(
     node => node.level, node => node.expandable);
 
   treeFlattener = new MatTreeFlattener(
@@ -60,22 +44,54 @@ export class BucketTreeComponent implements OnInit {
 
   dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
   private activeBucketName: string;
+  private activeBacket: any;
 
   constructor() {
-    this.dataSource.data = TREE_DATA;
   }
 
   ngOnInit() {
     this.activeBucketName = this.openedBucket || '';
-    // console.log(this.activeBucketName);
-    // console.log(...this.dataSource._flattenedData.getValue().filter(v => 
v.name === this.activeBucketName));
+    this.dataSource.data = this.buckets;
+    this.setActiveBucket();
   }
 
   public openBucketData(bucket) {
-    this.treeControl.expand(bucket);
-    this.activeBucket = bucket;
-    // console.log(bucket);
+    this.dataSource['_treeControl'].collapseAll();
+    this.setActiveBucket(bucket);
+    this.emitActiveBucket.emit(bucket);
+  }
+
+  public setActiveBucket(bucket?) {
+    this.activeBacket = bucket || 
this.dataSource._flattenedData.getValue().filter(v => v.name === 
this.openedBucket)[0];
+    this.expandAllParents(this.activeBacket);
+  }
+
+  private expandAllParents(el) {
+    if (el) {
+      this.treeControl.expand(el);
+      if (this.getParentNode(el) !== null) {
+        this.expandAllParents(this.getParentNode(el));
+      }
+    }
+  }
+
+  private getParentNode(node: BucketFlatNode): BucketFlatNode | null {
+    const currentLevel = node.level;
+    if (currentLevel < 1) {
+      return null;
+    }
+
+    const startIndex = this.treeControl.dataNodes.indexOf(node) - 1;
+
+    for (let i = startIndex; i >= 0; i--) {
+      const currentNode = this.treeControl.dataNodes[i];
+
+      if (currentNode.level < currentLevel) {
+        return currentNode;
+      }
+    }
+    return null;
   }
 
-  hasChild = (_: number, node: ExampleFlatNode) => node.expandable;
+  public hasChild = (_: number, node: BucketFlatNode) => node.expandable;
 }
diff --git 
a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
 
b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
index 024bb1e..e8b0ad1 100644
--- 
a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
+++ 
b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
@@ -66,7 +66,7 @@
             >
               <span
                 [matTooltip]="!this.bucketStatus.view
-                 ? 'You have not permission to open project bucket'
+                 ? 'You have not permission to open bucket'
                  : 'The bucket ' + notebook.bucket_name + ' is deleted. To 
start working with data choose available bucket.'"
                 matTooltipDisabled="{{this.bucketStatus.view && 
this.isBucketAllowed}}"
                 matTooltipPosition="above"
@@ -79,7 +79,7 @@
             </div>
             <p>Shared endpoint bucket: &nbsp;</p>
             <div class="links_block" 
(click)="bucketBrowser(notebook.shared_bucket_name, notebook.endpoint, 
this.bucketStatus.view)"
-                 [matTooltip]="'You have not permission to open shared 
endpoint bucket'"
+                 [matTooltip]="'You have not permission to open bucket'"
                  matTooltipDisabled="{{this.bucketStatus.view}}"
                  matTooltipPosition="above"
                  [matTooltipClass]="'bucket-item-tooltip'"
diff --git 
a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
 
b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
index d228f8d..829b22f 100644
--- 
a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
+++ 
b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
@@ -70,7 +70,6 @@ export class DetailDialogComponent implements OnInit {
       this.upTimeSince = (this.notebook.time) ? new 
Date(this.notebook.time).toString() : '';
       this.initFormModel();
       this.getClusterConfiguration();
-    console.log(this.notebook.edgeNodeStatus);
     if (this.notebook.edgeNodeStatus === 'terminated' ||
       this.notebook.edgeNodeStatus === 'terminating' ||
       this.notebook.edgeNodeStatus === 'failed'){
@@ -133,7 +132,7 @@ export class DetailDialogComponent implements OnInit {
 
   public bucketBrowser(bucketName, endpoint, permition): void {
     permition && this.dialog.open(BucketBrowserComponent, { data:
-        {bucket: bucketName, endpoint: endpoint, bucketStatus: 
this.bucketStatus},
+        {bucket: bucketName, endpoint: endpoint, bucketStatus: 
this.bucketStatus, buckets: this.data.buckets},
       panelClass: 'modal-fullscreen' })
     .afterClosed().subscribe();
   }
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 738059a..2a2c49f 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
@@ -89,6 +89,7 @@ export class ResourcesGridComponent implements OnInit {
 
   public displayedColumns: string[] = this.filteringColumns.map(item => 
item.name);
   public displayedFilterColumns: string[] = this.filteringColumns.map(item => 
item.filter_class);
+  public bucketsList;
 
 
   constructor(
@@ -100,6 +101,7 @@ export class ResourcesGridComponent implements OnInit {
 
   ngOnInit(): void {
     this.buildGrid();
+
   }
 
   public buildGrid(): void {
@@ -107,6 +109,7 @@ export class ResourcesGridComponent implements OnInit {
     this.userResourceService.getUserProvisionedResources()
       .subscribe((result: any) => {
         this.environments = ExploratoryModel.loadEnvironments(result);
+        this.getBuckets();
         this.getDefaultFilterConfiguration();
         (this.environments.length) ? this.getUserPreferences() : 
this.filteredEnvironments = [];
         this.healthStatus && !this.healthStatus.billingEnabled && 
this.modifyGrid();
@@ -169,7 +172,7 @@ export class ResourcesGridComponent implements OnInit {
 
   public printDetailEnvironmentModal(data): void {
     this.dialog.open(DetailDialogComponent, { data:
-        {notebook: data, bucketStatus: this.healthStatus.bucketBrowser},
+        {notebook: data, bucketStatus: this.healthStatus.bucketBrowser, 
buckets: this.bucketsList},
       panelClass: 'modal-lg'
     })
       .afterClosed().subscribe(() => this.buildGrid());
@@ -330,6 +333,27 @@ export class ResourcesGridComponent implements OnInit {
       if (filterConfig[index].length) this.activeFiltering = true;
   }
 
+  public getBuckets() {
+    const bucketsList = this.environments.map(project => {
+      return Object.keys(project.projectEndpoints).map(key => {
+        const currEndpoint = project.projectEndpoints[key];
+        const provider: string =  project.endpoints.filter(endpoint => 
endpoint['name'] === key)[0]['cloudProvider'];
+        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) {
+          edgeItem.children.push({name: projectBucket, endpoint: key});
+        }
+        if (sharedBucket) {
+          edgeItem.children.push({name: sharedBucket, endpoint: key});
+        }
+        return edgeItem;
+      });
+    });
+    this.bucketsList = SortUtils.flatDeep(bucketsList, 1).filter(v => 
v.children.length);
+    console.log(this.bucketsList.filter(v => v.children.length));
+  }
+
   private getUserPreferences(): void {
     this.userResourceService.getUserPreferences()
       .subscribe((result: FilterConfigurationModel) => {
diff --git 
a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts
 
b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts
index e769dbe..c4ad5800 100644
--- 
a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts
+++ 
b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts
@@ -58,6 +58,8 @@ export class ExploratoryModel {
       return data.map((value) => {
         return {
           project: value.project,
+          projectEndpoints: value.shared,
+          endpoints: value.endpoints,
           exploratory: value.exploratory.map(el => {
             const provider = el.cloud_provider.toLowerCase();
             const billing = value.exploratoryBilling.filter(res => res.name 
=== el.exploratory_name)[0];
@@ -101,5 +103,7 @@ export class ExploratoryModel {
 
 export interface Exploratory {
   project: string;
+  endpoints: [];
+  projectEndpoints: [];
   exploratory: ExploratoryModel[];
 }
diff --git 
a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
 
b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
index 545412d..2eda7db 100644
--- 
a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
+++ 
b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
@@ -46,9 +46,15 @@
     </div>
 
     <div>
-<!--      <button mat-raised-button class="butt butt-tool" 
(click)="bucketBrowser()">-->
-<!--        <i class="material-icons"></i>Bucket browser-->
-<!--      </button>-->
+      <span  matTooltip="{{!this.bucketStatus?.view ? 'You have not permission 
to open bucket browser' : 'You have not any buckets'}}"
+             matTooltipPosition="above"
+             matTooltipDisabled="{{resourcesGrid.bucketsList?.length > 0 || 
!this.bucketStatus?.view}}"
+             [matTooltipClass]="'bucket-item-tooltip'"
+      >
+        <button mat-raised-button class="butt butt-tool" 
(click)="bucketBrowser(this.bucketStatus?.view)" 
[disabled]="!this.bucketStatus?.view || resourcesGrid.bucketsList?.length === 
0">
+        <i class="material-icons"></i>Bucket browser
+      </button>
+      </span>
       <button mat-raised-button class="butt butt-tool" (click)="manageUngit()">
         <i class="material-icons"></i>Git credentials
       </button>
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 7933fec..3878b33 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
@@ -41,6 +41,7 @@ export class ResourcesComponent implements OnInit {
   projects: Project[] = [];
 
   @ViewChild(ResourcesGridComponent, { static: true }) resourcesGrid: 
ResourcesGridComponent;
+  private bucketStatus;
 
   constructor(
     public toastr: ToastrService,
@@ -52,6 +53,7 @@ export class ResourcesComponent implements OnInit {
   ngOnInit() {
     this.getEnvironmentHealthStatus();
     this.exploratoryEnvironments = this.resourcesGrid.environments;
+
   }
 
   public createEnvironment(): void {
@@ -65,6 +67,8 @@ export class ResourcesComponent implements OnInit {
     this.exploratoryEnvironments = this.resourcesGrid.environments;
   }
 
+
+
   public toggleFiltering(): void {
     if (this.resourcesGrid.activeFiltering) {
       this.resourcesGrid.resetFilterConfigurations();
@@ -78,9 +82,17 @@ export class ResourcesComponent implements OnInit {
       .afterClosed().subscribe(() => this.refreshGrid());
   }
 
-  public bucketBrowser(): void {
-    this.dialog.open(BucketBrowserComponent, { panelClass: 'modal-fullscreen' 
})
-      .afterClosed().subscribe(() => this.refreshGrid());
+  public bucketBrowser(permition): void {
+    const defaultBucket = this.resourcesGrid.bucketsList[0].children[0];
+      permition && this.dialog.open(BucketBrowserComponent, { data:
+        {
+          bucket: defaultBucket.name,
+          endpoint: defaultBucket.endpoint,
+          bucketStatus: this.bucketStatus,
+          buckets: this.resourcesGrid.bucketsList
+        },
+      panelClass: 'modal-fullscreen' })
+      .afterClosed().subscribe();
   }
 
   public setActiveProject(project): void {
@@ -106,6 +118,8 @@ export class ResourcesComponent implements OnInit {
       (result: any) => {
         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/assets/styles/_dialogs.scss
 
b/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss
index 571de23..b0ee3a0 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
@@ -358,6 +358,10 @@ mat-dialog-container {
   height: 30px;
 }
 
+.d-none{
+  display: none !important;
+}
+
 
 @media screen and (max-width: 1280px) {
   .modal-fullscreen {


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

Reply via email to