[DLAB-1984]: Allowed to create EMR/Dataproc with GPU for Jupyter, fix… (#848)

[DLAB-1984]: Allowed to create EMR/Dataproc with GPU for Jupyter, fixed libs groups, ungit for zeppelin
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 2be3dad..d179780 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
@@ -370,8 +370,6 @@
 
   private getCloud() {
     return this.buckets.filter(v => v.children.some(bucket => {
-      console.log(bucket.name);
-      console.log(this.bucketName);
       return bucket.name === this.bucketName;
     }))[0].cloud.toLowerCase();
   }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts
index 9f319cc..55bb6e8 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts
@@ -267,32 +267,36 @@
 
   private filterShapes(): void {
     const allowed: any = ['GPU optimized'];
+    let filtered;
+
+    const reduceShapes = (obj, key) => {
+      obj[key] = this.selectedImage.computation_resources_shapes[key];
+      return obj;
+    };
+
+    const filteredShapeKeys = Object.keys(
+      SortUtils.shapesSort(this.selectedImage.computation_resources_shapes));
+
+    const filterShapes = (filter) => filteredShapeKeys
+      .filter(filter)
+      .reduce(reduceShapes, {});
+
     if (this.notebook_instance.template_name.toLowerCase().indexOf('tensorflow') !== -1
       || this.notebook_instance.template_name.toLowerCase().indexOf('deep learning') !== -1
     ) {
-      const filtered = Object.keys(
-        SortUtils.shapesSort(this.selectedImage.computation_resources_shapes))
-        .filter(key => allowed.includes(key))
-        .reduce((obj, key) => {
-          obj[key] = this.selectedImage.computation_resources_shapes[key];
-          return obj;
-        }, {});
+      filtered = filterShapes(key => allowed.includes(key));
       if (this.PROVIDER !== 'azure') {
         const images = this.clusterTypes.filter(image => image.image === 'docker.dlab-dataengine');
         this.clusterTypes = images;
         this.selectedImage = this.clusterTypes[0];
       }
-      this.selectedImage.computation_resources_shapes = filtered;
+    } else if (this.notebook_instance.template_name.toLowerCase().indexOf('jupyter notebook') !== -1 &&
+      this.selectedImage.image === 'docker.dlab-dataengine-service') {
+      filtered = filterShapes(v => v);
     } else {
-      const filtered = Object.keys(
-        SortUtils.shapesSort(this.selectedImage.computation_resources_shapes))
-        .filter(key => !(allowed.includes(key)))
-        .reduce((obj, key) => {
-          obj[key] = this.selectedImage.computation_resources_shapes[key];
-          return obj;
-        }, {});
-      this.selectedImage.computation_resources_shapes = filtered;
+      filtered = filterShapes(key => !(allowed.includes(key)));
     }
+    this.selectedImage.computation_resources_shapes = filtered;
   }
 
   private filterAvailableSpots() {
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.scss
index 6711ad4..f02436e 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.scss
@@ -55,7 +55,7 @@
   .error {
     position: absolute;
     right: 0;
-    top: 35px;
+    top: 38px;
   }
 
   &.name-control {
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 409e3ae..541c8a1 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
@@ -59,24 +59,30 @@
               {{upTimeSince || "not specified."}}</p>
             <p *ngIf="notebook.url?.length">Open following URL(s) in your browser to access this box:</p>
             <div class="links_block">
-              <p *ngFor="let item of notebook.url" (mouseleave)="hideCopyIcon()">
-                <span class="description">{{item.description}}: &nbsp;</span>
-                <a (mouseover)="showCopyIcon(item.description)"
-                   (click)="logAction(notebook.name, item.description)"
-                   class="ellipsis none-select" matTooltip="{{item.url}}"
-                   matTooltipPosition="above"
-                   href="{{item.url}}"
-                  target="_blank"
-                   (contextmenu)="false"
-                >
-                  &nbsp;{{item.url}}
-                </a>
-                <span (click)="logAction(notebook.name, item.description, 'Copy');$event.stopPropagation()" *ngIf="isCopyIconVissible[item.description]" [matTooltip]="isCopied ? 'Copy ' + item.description + ' url': 'Copied'" matTooltipPosition="above" class="copy-icon-wrapper">
-                  <span  class="link-icon" (click)="copyBucketName(item.url)" >
-                    <span _ngcontent-xpv-c19="" class="material-icons" (click)="this.isCopied = false">content_copy</span>
-                   </span>
+              <ng-container *ngFor="let item of notebook.url">
+                <span class="d-none" *ngIf="item.description === 'Ungit' && notebook.template_name.toLowerCase().indexOf('deep learning') !== -1; else ungit">
                 </span>
-              </p>
+                <ng-template #ungit>
+                  <p (mouseleave)="hideCopyIcon()">
+                    <span class="description">{{item.description}}: &nbsp;</span>
+                    <a (mouseover)="showCopyIcon(item.description)"
+                       (click)="logAction(notebook.name, item.description)"
+                       class="ellipsis none-select" matTooltip="{{item.url}}"
+                       matTooltipPosition="above"
+                       href="{{item.url}}"
+                      target="_blank"
+                       (contextmenu)="false"
+                    >
+                      &nbsp;{{item.url}}
+                    </a>
+                    <span (click)="logAction(notebook.name, item.description, 'Copy');$event.stopPropagation()" *ngIf="isCopyIconVissible[item.description]" [matTooltip]="isCopied ? 'Copy ' + item.description + ' url': 'Copied'" matTooltipPosition="above" class="copy-icon-wrapper">
+                      <span  class="link-icon" (click)="copyBucketName(item.url)" >
+                        <span _ngcontent-xpv-c19="" class="material-icons" (click)="this.isCopied = false">content_copy</span>
+                       </span>
+                    </span>
+                  </p>
+                </ng-template>
+              </ng-container>
             </div>
             <p class="flex" *ngIf="notebook.username">Node User: &nbsp;<span
                 class="strong">{{ notebook.username }}</span></p>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.ts
index 94c7009..909fa4d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.ts
@@ -172,13 +172,12 @@
       }
       this.lib = {name: '', version: ''};
     } else if ($event.model.type === 'destination') {
-      this.resetDialog();
       this.destination = $event.model.value;
       this.destination && this.destination.type === 'СOMPUTATIONAL'
         ? this.model.computational_name = this.destination.name
         : this.model.computational_name = null;
-      this.uploadLibGroups();
-      this.getInstalledLibsByResource();
+      this.resetDialog();
+      // this.getInstalledLibsByResource();
       this.libSearch.disable();
     }
     this.filterList();
@@ -345,7 +344,8 @@
             libs => {
               this.filteredList = [libs];
               this.filteredList.forEach(lib => {
-                lib.isInSelectedList = this.model.selectedLibs.some(el => lib.name.toLowerCase() === el.name.substring(0, el.name.lastIndexOf(':')).toLowerCase());
+                lib.isInSelectedList = this.model.selectedLibs
+                  .some(el => lib.name.toLowerCase() === el.name.substring(0, el.name.lastIndexOf(':')).toLowerCase());
                 lib.isInstalled = this.notebookLibs.some(libr => {
                     return lib.name.toLowerCase() === libr.name.substring(0, libr.name.lastIndexOf(':')).toLowerCase() &&
                       this.group === libr.group &&
@@ -360,7 +360,7 @@
                 || error.status === HTTP_STATUS_CODES.BAD_REQUEST
                 || error.status === HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR) {
                 this.validity_format = error.message;
-                if (error.message.indexOf('query param artifact') !== -1) {
+                if (error.message.indexOf('query param artifact') !== -1 || error.message.indexOf('Illegal character') !== -1) {
                   this.validity_format = 'Wrong library name format. Should be <groupId>:<artifactId>:<versionId>.';
                 }
                 if (error.message.indexOf('not found') !== -1) {
@@ -394,8 +394,8 @@
 
   }
 
-  private selectorsReset(): void {
-    this.destination = this.getResourcesList()[0];
+  private selectorsReset(leaveDestanation?): void {
+    if (!leaveDestanation) this.destination = this.getResourcesList()[0];
     this.uploadLibGroups();
     this.getInstalledLibsByResource();
     this.libSearch.disable();
@@ -414,7 +414,7 @@
 
     clearTimeout(this.clear);
     clearTimeout(this.loadLibsTimer);
-    this.selectorsReset();
+    this.selectorsReset(true);
   }
 
   public toggleFilterRow(): void {
@@ -489,25 +489,6 @@
     <h4 class="modal-title" *ngIf="data.type === 'available'">Version is not available</h4>
     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
   </div>
-<!--  <mat-list class="resources">-->
-
-<!--    <mat-list-item class="list-header">-->
-<!--      <div class="object">Name</div>-->
-<!--      <div class="size">Version</div>-->
-<!--    </mat-list-item>-->
-
-<!--    <div class="scrolling-content delete-list" id="scrolling">-->
-
-<!--      <mat-list-item *ngFor="let lib of data.add_pkgs" class="delete-item">-->
-<!--        <div class="object">-->
-<!--         {{lib}}-->
-<!--        </div>-->
-<!--        <div class="size">v2.3.4</div>-->
-<!--      </mat-list-item>-->
-
-<!--    </div>-->
-<!--  </mat-list>-->
-
   <div class="lib-list" *ngIf="data.type === 'added'">
     <span class="strong dependency-title">Dependency: </span><span class="packeges" *ngFor="let pack of data.lib.add_pkgs; index as i">{{pack + (i !== data.lib.add_pkgs.length - 1 ? ', ' : '')}}</span>
   </div>
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 3dadd70..13421ee 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
@@ -86,7 +86,6 @@
   }
 
   public bucketBrowser(permition): void {
-    console.log(this.exploratoryEnvironments);
     const defaultBucket = this.resourcesGrid.bucketsList[0].children[0];
       permition && this.dialog.open(BucketBrowserComponent, { data:
         {