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/01/20 07:58:27 UTC

[incubator-dlab] branch develop updated: [DLAB-1451]: Added endpoint url and endpoint name validation (#533)

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 51f3d37  [DLAB-1451]: Added endpoint url and endpoint name validation (#533)
51f3d37 is described below

commit 51f3d37fa3284a6ca78356dc4e94a78dafa9d6ae
Author: Dmytro Gnatyshyn <42...@users.noreply.github.com>
AuthorDate: Mon Jan 20 09:58:22 2020 +0200

    [DLAB-1451]: Added endpoint url and endpoint name validation (#533)
    
    [DLAB-1451]: Added endpoint url and endpoint name validation
---
 .../management/endpoints/endpoints.component.html  |  13 ++-
 .../management/endpoints/endpoints.component.scss  | 112 +++++++++++----------
 .../management/endpoints/endpoints.component.ts    |  18 +++-
 .../resources/webapp/src/app/core/util/patterns.ts |   5 +-
 .../resources-grid/resources-grid.component.ts     |   2 +-
 5 files changed, 86 insertions(+), 64 deletions(-)

diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.html
index c1171dd..08b030f 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.html
@@ -35,19 +35,24 @@
                   <input type="text" formControlName="name" placeholder="Enter endpoint name"
                     (blur)="generateEndpointTag($event)">
                   <span class="error"
-                    *ngIf="!createEndpointForm?.controls.name.valid && createEndpointForm?.controls.name.touched">
+                    *ngIf="!createEndpointForm?.controls.name.valid && createEndpointForm?.controls.name.touched && !createEndpointForm?.controls['name'].hasError('isDuplicate')">
                     Endpoint name can only contain letters, numbers, hyphens and '_' but can not end with special
                     characters
                   </span>
+                  <span class="error"
+                        *ngIf="createEndpointForm?.controls['name'].hasError('isDuplicate')">
+                    This endpoint name already exists.
+                  </span>
                 </div>
               </div>
               <div class="control-group">
                 <label class="label">Endpoint url</label>
                 <div class="control">
                   <input type="text" formControlName="url" placeholder="Enter endpoint url">
+                  <span class="error" *ngIf="createEndpointForm?.controls['url'].hasError('isDuplicate')">This endpoint url already exists.</span>
                   <span class="error"
-                    *ngIf="!createEndpointForm?.controls.url.valid && createEndpointForm.controls.url.touched">
-                    Endpoint url should end with slash
+                        *ngIf="!createEndpointForm?.controls.url.valid && createEndpointForm.controls.url.touched && !createEndpointForm?.controls['url'].hasError('isDuplicate')">
+                    Please provide a valid endpoint url with slash in the end.
                   </span>
                 </div>
               </div>
@@ -58,7 +63,7 @@
                   <span class="error"
                     *ngIf="!createEndpointForm?.controls.account.valid && createEndpointForm.controls.account.touched">
                     Endpoint account can only contain letters, numbers, hyphens and '_' but can not end with special
-                    characters
+                    characters.
                   </span>
                 </div>
               </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.scss
index 5714552..78665ea 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.scss
@@ -16,79 +16,81 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+.endpoints-dialog {
+  .content-box {
+    padding: 10px 30px 30px;
+    height: 400px;
 
-.content-box {
-  padding: 10px 30px 30px;
-  height: 400px;
+    .split {
+      display: flex;
+      flex-direction: column;
+      justify-content: space-between;
+      height: 100%;
 
-  .split {
-    display: flex;
-    flex-direction: column;
-    justify-content: space-between;
-    height: 100%;
+      form {
+        padding: 20px 10px;
 
-    form {
-      padding: 20px 10px;
-
-      .control-group {
-        .error {
-          position: absolute;
-          right: 0;
-          bottom: 5px;
-          font-family: 'Open Sans', sans-serif;
-          font-weight: 300;
+        .control-group {
+          .error {
+            position: absolute;
+            right: 0;
+            bottom: 5px;
+            font-family: 'Open Sans', sans-serif;
+            font-weight: 300;
+            top: 34px;
+          }
         }
       }
     }
-  }
 
-  .action-group {
-    display: flex;
-    justify-content: space-between;
-    padding: 0 10px;
-  }
+    .action-group {
+      display: flex;
+      justify-content: space-between;
+      padding: 0 10px;
+    }
 
-  .endpoints {
-    height: 265px;
+    .endpoints {
+      height: 265px;
 
-    table.mat-table {
-      width: 100%;
-      thead{
-        background: transparent;
-      }
-      tr {
-        td {
-          vertical-align: middle;
-          max-width: 150px;
-          overflow: hidden;
-          text-overflow: ellipsis;
+      table.mat-table {
+        width: 100%;
+        thead{
+          background: transparent;
+        }
+        tr {
+          td {
+            vertical-align: middle;
+            max-width: 150px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+          }
         }
-      }
 
-      .actions {
-        color: #607d8b;
-        text-align: center;
-        width: 14%;
+        .actions {
+          color: #607d8b;
+          text-align: center;
+          width: 14%;
 
-        span {
-          transition: all .5s ease-in-out;
-          cursor: pointer;
+          span {
+            transition: all .5s ease-in-out;
+            cursor: pointer;
 
-          .mat-icon {
-            font-size: 18px;
-            padding-top: 5px;
-          }
+            .mat-icon {
+              font-size: 18px;
+              padding-top: 5px;
+            }
 
-          &:hover {
-            color: darken(#607d8b, 10%);
+            &:hover {
+              color: darken(#607d8b, 10%);
+            }
           }
         }
       }
-    }
 
-    .content {
-      p {
-        margin-bottom: 30px;
+      .content {
+        p {
+          margin-bottom: 30px;
+        }
       }
     }
   }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.ts
index e263edc..d29a5d0 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.ts
@@ -97,8 +97,8 @@ export class EndpointsComponent implements OnInit {
 
   private initFormModel(): void {
     this.createEndpointForm = this._fb.group({
-      name: ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.namePattern)])],
-      url: ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.url)])],
+      name: ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.namePattern), this.validateName.bind(this)])],
+      url: ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.fullUrl), this.validateUrl.bind(this)])],
       account: ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.namePattern)])],
       endpoint_tag: ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.namePattern)])]
     });
@@ -114,6 +114,20 @@ export class EndpointsComponent implements OnInit {
   private getEndpointList() : void{
     this.endpointService.getEndpointsData().subscribe((endpoints: any) => this.endpoints = endpoints);
   }
+
+  private validateUrl(control) {
+    if (control && control.value){
+      const isDublicat = this.endpoints.some(endpoint => endpoint['url'].toLocaleLowerCase() === control.value.toLowerCase());
+      return isDublicat ? { isDuplicate: true } : null;
+    }
+  }
+
+  private validateName(control) {
+    if (control && control.value){
+      const isDublicat = this.endpoints.some(endpoint => endpoint['name'].toLocaleLowerCase() === control.value.toLowerCase());
+      return isDublicat ? { isDuplicate: true } : null;
+    }
+  }
 }
 
 @Component({
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/util/patterns.ts b/services/self-service/src/main/resources/webapp/src/app/core/util/patterns.ts
index 52e2670..ac9137f 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/util/patterns.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/util/patterns.ts
@@ -23,5 +23,6 @@ export const PATTERNS = {
   delimitersRegex: '[-_]?',
   url: '[a-zA-Z0-9.://%#&\\.@:%-_\+~#=]*\.[^\s]*[a-zA-Z0-9]/+',
   nodeCountPattern: '^[1-9]\\d*$',
-  integerRegex: '^[0-9]*$'
-}
+  integerRegex: '^[0-9]*$',
+  fullUrl: /^(http?|ftp|https):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+([.:])(\d{4}|com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*\/$/
+};
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 d5fd324..347483b 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
@@ -127,7 +127,7 @@ export class ResourcesGridComponent implements OnInit {
   }
 
   public containsNotebook(notebook_name: string): boolean {
-    if (notebook_name)
+    if (notebook_name && this.environments.length)
       return this.environments
         .filter(project => project.exploratory
           .some(item => CheckUtils.delimitersFiltering(notebook_name) === CheckUtils.delimitersFiltering(item.name))).length > 0;


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