global-search and search user components 61/101161/2
authorjz385p <jegadeesh.babu@att.com>
Wed, 5 Feb 2020 10:10:15 +0000 (15:40 +0530)
committerJegadeesh Babu <jegadeesh.babu@att.com>
Wed, 5 Feb 2020 10:16:03 +0000 (10:16 +0000)
global-search and search user components with service

Issue-ID: PORTAL-827
Change-Id: I503b259b71f3edcb27456d4e37c84fb356239f31
Signed-off-by: jz385p <jegadeesh.babu@att.com>
12 files changed:
portal-FE-common/src/app/layout/components/global-search/global-search.component.html [new file with mode: 0644]
portal-FE-common/src/app/layout/components/global-search/global-search.component.scss [new file with mode: 0644]
portal-FE-common/src/app/layout/components/global-search/global-search.component.spec.ts [new file with mode: 0644]
portal-FE-common/src/app/layout/components/global-search/global-search.component.ts [new file with mode: 0644]
portal-FE-common/src/app/layout/components/search-users/search-users.component.html [new file with mode: 0644]
portal-FE-common/src/app/layout/components/search-users/search-users.component.scss [new file with mode: 0644]
portal-FE-common/src/app/layout/components/search-users/search-users.component.spec.ts [new file with mode: 0644]
portal-FE-common/src/app/layout/components/search-users/search-users.component.ts [new file with mode: 0644]
portal-FE-common/src/app/shared/services/global-search/global-search.service.spec.ts [new file with mode: 0644]
portal-FE-common/src/app/shared/services/global-search/global-search.service.ts [new file with mode: 0644]
portal-FE-os/src/environments/environment.prod.ts
portal-FE-os/src/environments/environment.ts

diff --git a/portal-FE-common/src/app/layout/components/global-search/global-search.component.html b/portal-FE-common/src/app/layout/components/global-search/global-search.component.html
new file mode 100644 (file)
index 0000000..ff5473b
--- /dev/null
@@ -0,0 +1,109 @@
+<!--
+  ============LICENSE_START==========================================
+  ONAP Portal
+  ===================================================================
+  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+  ===================================================================
+  Unless otherwise specified, all software contained herein is licensed
+  under the Apache License, Version 2.0 (the "License");
+  you may not use this software except in compliance with the License.
+  You may obtain a copy of the License at
+              http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  Unless otherwise specified, all documentation contained herein is licensed
+  under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+  you may not use this documentation except in compliance with the License.
+  You may obtain a copy of the License at
+              https://creativecommons.org/licenses/by/4.0/
+  Unless required by applicable law or agreed to in writing, documentation
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END============================================
+  
+  -->
+<div class="search-div" (clickOutside)="clickOutSide($event)">
+  <div class="notification-div">
+    <div class="form-field form-field__small">
+      <div class="search-input">
+        <input id="mainSearchText" style="border-radius:0.25rem;" type="text" (keypress)="searchDialogToggle($event)"
+          placeholder="What are you looking for?" class="form-field form-field__small" />
+      </div>
+      <span class="icon-search-span"> <i class="icon-search">&nbsp;</i>
+      </span>
+
+    </div>
+  </div>  
+</div>
+<div *ngIf="searchResDialog" class="search-res-dialog">
+  <div id="reg-header-snippet">
+
+    <div tabindex="0"  id="reg-searchPop-id">
+      <div id="contentVertical" att-scrollbar="y">
+        <ul class="searchUl">
+          <li><a class="icon-tiles"></a> <a id="search-app-title" (click)="goToUrl(item)"
+              class="searchLiHeader">Applications:</a>
+          </li>
+          <li *ngFor="let item of items?.application"><a
+              id="search-app-item-{{item.name.split(' ').join('-')}}-{{$index}}" (click)="goToUrl(item)"
+              class="searchLiItems">{{item.name}}</a>
+          </li>
+        </ul>
+
+        <ul class="searchUl">
+          <li><a class="icon-tiles-small"></a> <a id="seach-functional-menu-title" (click)="goToUrl(item)"
+              class="searchLiHeader">Functional Menus:</a></li>
+          <li *ngFor="let item of items?.menu"><a
+              id="search-functional-menu-item-{{item.name.split(' ').join('-')}}-{{$index}}" (click)="goToUrl(item)"
+              class="searchLiItems">{{item.name}}</a>
+          </li>
+        </ul>
+
+
+        <ul class="searchUl">
+          <li><a class="full-linear-icon-person search-li"></a> <a id="search-user-title" (click)="goToUrl(item)"
+              class="searchLiHeader">Users:</a></li>
+          <li *ngFor="let item of items?.user"><a id="search-user-item-{{item.name.split(' ').join('-')}}-{{$index}}"
+              href="qto://talk/{{item.target}}" class="searchLiItems">{{item.name}}</a>
+
+          </li>
+        </ul>
+
+        <ul class="searchUl">
+          <li><a class="full-linear-icon-person search-li"></a> <a id="search-widgets-title" (click)="goToUrl(item)"
+              class="searchLiHeader">Widgets:</a></li>
+          <li *ngFor="let item of items?.widget"><a
+              id="search-widgets-item-{{item.name.split(' ').join('-')}}-{{$index}}" href="widgetCatalog"
+              class="searchLiHeader">{{item.name}}</a></li>
+        </ul>
+
+        <ul class="searchUl">
+          <li><a class="full-linear-icon-internet search-li"></a> <a id="search-intranet"
+              (click)="goToUrl(item, 'intra')" class="searchLiHeader" style="cursor: pointer;">Click to search
+              Intranet <span class="icon-arrow-right"></span>
+            </a></li>
+        </ul>
+
+        <ul class="searchUl">
+          <li><a class="full-linear-icon-internet search-li"></a> <a id="search-extranet"
+              (click)="goToUrl(item, 'extra')" class="searchLiHeader" style="cursor: pointer;">Click to search
+              Extranet <span class="icon-arrow-right"></span></a></li>
+        </ul>
+
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/portal-FE-common/src/app/layout/components/global-search/global-search.component.scss b/portal-FE-common/src/app/layout/components/global-search/global-search.component.scss
new file mode 100644 (file)
index 0000000..70f1b34
--- /dev/null
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END============================================
+ *
+ * 
+ */
+
+ .search-div {
+    margin-bottom: -14px;
+  }
+
+  .search-res-dialog{
+    position: fixed;
+      background: white;
+      box-shadow: rgba(0, 0, 0, 0.247059) 0px 5px 6px 0px;
+      top: 2.5em;
+      border-radius: 0.25rem;
+      padding: 20px;
+      opacity: 1;
+      z-index: 1;
+  }
+  .searchUl {
+    list-style: none; 
+    border-bottom: 1px solid #bbb; 
+    padding-bottom: 20px;
+    padding-left: 4px;
+    }
+    .searchLiHeader {
+      font-weight: bold; 
+      color: #0574ac; 
+      font-size: 16px;
+      padding-bottom: 10px;
+      line-height: 1.5;
+      font-family: Omnes-ECOMP-W02,Arial;
+      
+      }
+      .searchLiItems{
+        cursor: pointer;
+        font-weight: normal; 
+        font-size: 12px;
+        color: #444444;
+        font-family: Omnes-ECOMP-W02,Arial;
+        }
\ No newline at end of file
diff --git a/portal-FE-common/src/app/layout/components/global-search/global-search.component.spec.ts b/portal-FE-common/src/app/layout/components/global-search/global-search.component.spec.ts
new file mode 100644 (file)
index 0000000..c377137
--- /dev/null
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END============================================
+ *
+ * 
+ */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { GlobalSearchComponent } from './global-search.component';
+
+describe('GlobalSearchComponent', () => {
+  let component: GlobalSearchComponent;
+  let fixture: ComponentFixture<GlobalSearchComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ GlobalSearchComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(GlobalSearchComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/portal-FE-common/src/app/layout/components/global-search/global-search.component.ts b/portal-FE-common/src/app/layout/components/global-search/global-search.component.ts
new file mode 100644 (file)
index 0000000..f98ea39
--- /dev/null
@@ -0,0 +1,152 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END============================================
+ *
+ * 
+ */
+import { Component, OnInit, Output, EventEmitter } from '@angular/core';
+import { GlobalSearchService } from 'src/app/shared/services/global-search/global-search.service';
+import { GlobalSearchItem } from 'src/app/shared/model/global-search-item.model';
+import * as $ from 'jquery';
+import { AddTabFunctionService } from 'src/app/shared/services/tab/add-tab-function.service';
+import { Router } from '@angular/router';
+import { environment } from 'src/environments/environment';
+
+@Component({
+  selector: 'app-global-search',
+  templateUrl: './global-search.component.html',
+  styleUrls: ['./global-search.component.scss']
+})
+export class GlobalSearchComponent implements OnInit {
+  searchResDialog: boolean = false;
+  items: any;
+  searchString: string;
+  api = environment.api;
+  constructor(private globalSearchService: GlobalSearchService, private addTabFuntionService: AddTabFunctionService, private router: Router) { }
+
+  ngOnInit() {
+  }
+
+  showHideSearchSnippet() {
+    setTimeout(() => {
+      $('#mainSearchSnippet').click();
+    }, 1000);
+    setTimeout(() => {
+      $('mainSearchText').focus();
+    }, 1000);
+  }
+
+  mainSearchEvent = $('#mainSearchDiv').keyup((event) => {
+    if (event.keyCode == 13) {
+
+      this.getSearchResult(<string><any>$('#mainSearchText').val());
+
+      // opens the popup
+      var popupDomObj = $("[content='searchSnippet.html']");
+      if (popupDomObj.length == 0) {
+        this.showHideSearchSnippet();
+      } else {
+        $('#mainSearchSnippet').click();
+        this.showHideSearchSnippet();
+      }
+
+
+
+    }
+  });
+
+  clickOutSide(event: any) {
+
+    this.searchResDialog = false;
+
+  }
+  searchDialogToggle(event: any) {
+    if (event.keyCode == 13) {
+      this.searchResDialog = true;
+      this.searchString = <string><any>$('#mainSearchText').val();
+      this.getSearchResult(<string><any>$('#mainSearchText').val());
+    }
+  }
+
+  getSearchResult(searchString: string) {
+    //console.log("getSearch Result");
+    this.globalSearchService.getSearchResults(searchString).subscribe(data => {
+      //console.log("Response data" + data);
+      this.items = data.response;
+      //console.log("search result data" + JSON.stringify(data));
+
+    }, error => {
+      console.log('getSearchResult Error Object' + error);
+    });
+  };
+  goToUrl(item: any, type?: any) {
+    //console.log('check goto');
+    //var a = { 'test1': 'value1', 'test2': 'value3', 'test3': 'value2' };
+    if (type == 'intra') {
+
+      var intraSearcLink = this.api.intraSearcLink;
+      var intraSpecSearcLink = intraSearcLink + encodeURIComponent(this.searchString);
+      window.open(intraSpecSearcLink, '_blank');
+
+    } else if (type == 'extra') {
+      var extraSearcLink = this.api.extraSearcLink;
+      var extraSpecSearcLink = extraSearcLink + encodeURIComponent(this.searchString);
+      window.open(extraSpecSearcLink, '_blank');
+    }
+    let url = item.target;
+    let restrictedApp = item.uuid;
+    let getAccessState = "getAccess"
+    console.log("item.target " + item.target + "item.uuid " + item.uuid);
+    if (!url) {
+      this.router.navigate(['/' + getAccessState]);
+      //$log.info('No url found for this application, doing nothing..');
+      return;
+    }
+    if (!restrictedApp) {
+      window.open(url, '_blank');
+    } else {
+      if (item.url == "root.access") {
+        this.router.navigate(['/' + item.url]);
+        var tabContent = { id: new Date(), title: 'Home', url: url };
+        // $cookies.putObject('addTab', tabContent );
+        this.addTabFuntionService.filter(tabContent);
+      } else {
+        var tabContentCtrl = { id: new Date(), title: item.name, url: url };
+        this.addTabFuntionService.filter(tabContentCtrl);
+      }
+    }
+
+  }
+
+}
diff --git a/portal-FE-common/src/app/layout/components/search-users/search-users.component.html b/portal-FE-common/src/app/layout/components/search-users/search-users.component.html
new file mode 100644 (file)
index 0000000..0362449
--- /dev/null
@@ -0,0 +1,70 @@
+<!--
+  ============LICENSE_START==========================================
+  ONAP Portal
+  ===================================================================
+  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+  ===================================================================
+  Unless otherwise specified, all software contained herein is licensed
+  under the Apache License, Version 2.0 (the "License");
+  you may not use this software except in compliance with the License.
+  You may obtain a copy of the License at
+              http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  Unless otherwise specified, all documentation contained herein is licensed
+  under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+  you may not use this documentation except in compliance with the License.
+  You may obtain a copy of the License at
+              https://creativecommons.org/licenses/by/4.0/
+  Unless required by applicable law or agreed to in writing, documentation
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END============================================
+  
+  -->
+
+<form>
+    {{searchTitle}}
+    <div class="form-row">
+        <div class="col-md-6 my-1">
+            <label for="inputSearch" class="sr-only"></label>
+            <input id="inputSearch" pattern="[a-zA-Z0-9-'\s]{3,}" [(ngModel)]="searchString" (keyup)="passSystemUserInfo($event.srcElement.value)" maxlength="80"
+                required="true" name="searchString" #searchInput auto-focus tabindex="0" autocomplete="off" type="text"
+                class="form-control" value="searchString" placeholder="{{placeHolder}}">
+        </div>
+
+        <div class="col-auto my-1">
+            <button id="button-search-users" *ngIf="!isSystemUser" [disabled]="!searchInput.validity.valid || isLoading " type="submit"
+                class="btn btn-primary mb-2" (click)="searchUsers()"> Search
+            </button>
+        </div>
+    </div>
+</form>
+<span class="ecomp-spinner" *ngIf="isLoading"></span>
+<div class="search-user-container" *ngIf="showUserTable && !isSystemUser">
+    <table mat-table [dataSource]="dataSourceMap">
+        <!-- Search Result Column-->
+        <ng-container matColumnDef="firstName">
+            <th id="rowheader-result" mat-header-cell *matHeaderCellDef> Showing {{searchUsersResults.length}} {{txtResults}} </th>
+            <td id="table-data-{{i}}" mat-cell *matCellDef="let element; let i = index;">
+                {{element.firstName}} {{element.lastName}} <br> {{element.jobTitle}}
+            </td>
+        </ng-container>
+        <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
+        <tr mat-row (click)="setSelectedUser(row)" id="table-row-{{i}}" [ngClass]="{ 'selected': row === selectedUser }"
+            *matRowDef="let row; columns: displayedColumns; let i = index;"></tr>
+    </table>
+</div>
\ No newline at end of file
diff --git a/portal-FE-common/src/app/layout/components/search-users/search-users.component.scss b/portal-FE-common/src/app/layout/components/search-users/search-users.component.scss
new file mode 100644 (file)
index 0000000..95a2a5e
--- /dev/null
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END============================================
+ *
+ * 
+ */
+@import "../../../pages/pages.component";
+
+.mat-row {
+  cursor: pointer;
+  background-color: #f2f2f2;
+}
+.selected {
+  background-color: #ffffff !important;
+}
+
+.search-user-container {
+  overflow-y: auto;
+  height: 250px;
+}
+
+.ecomp-spinner{
+  opacity: 10;
+}
diff --git a/portal-FE-common/src/app/layout/components/search-users/search-users.component.spec.ts b/portal-FE-common/src/app/layout/components/search-users/search-users.component.spec.ts
new file mode 100644 (file)
index 0000000..66a966c
--- /dev/null
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END============================================
+ *
+ * 
+ */
+
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SearchUsersComponent } from './search-users.component';
+
+describe('SearchUsersComponent', () => {
+  let component: SearchUsersComponent;
+  let fixture: ComponentFixture<SearchUsersComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ SearchUsersComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(SearchUsersComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/portal-FE-common/src/app/layout/components/search-users/search-users.component.ts b/portal-FE-common/src/app/layout/components/search-users/search-users.component.ts
new file mode 100644 (file)
index 0000000..b93ffd6
--- /dev/null
@@ -0,0 +1,107 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END============================================
+ *
+ * 
+ */
+import { Component, OnInit, Input, ViewChild, Output, EventEmitter } from '@angular/core';
+import { UsersService } from 'src/app/shared/services';
+import { MatTableDataSource, MatPaginator, MatSort } from '@angular/material';
+import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
+import { ConfirmationModalComponent } from 'src/app/modals/confirmation-modal/confirmation-modal.component';
+import { PortalAdmin } from 'src/app/shared/model/PortalAdmin';
+
+@Component({
+  selector: 'app-search-users',
+  templateUrl: './search-users.component.html',
+  styleUrls: ['./search-users.component.scss']
+})
+export class SearchUsersComponent implements OnInit {
+
+  constructor(private userService: UsersService, private ngModal: NgbModal) { }
+  @Input() searchTitle: string;
+  @Input() placeHolder: string;
+  @Input() isSystemUser: boolean;
+  @ViewChild(MatSort) sort: MatSort;
+  @ViewChild(MatPaginator) paginator: MatPaginator;
+  @Output() passBackSelectedUser: EventEmitter<any> = new EventEmitter();
+  searchString: string;
+  txtResults = 'result';
+  searchUsersResults: any;
+  selected: any;
+  isLoading: boolean;
+  showUserTable: boolean;
+  selectedUser: any;
+  displayedColumns: string[] = ['firstName'];
+  dataSourceMap = new MatTableDataSource(this.searchUsersResults);
+
+  ngOnInit() {
+    this.searchString = '';
+    this.showUserTable = false;
+    this.isSystemUser = false;
+  }
+
+  passSystemUserInfo(systemUser: string) {
+    if (this.isSystemUser)
+      this.passBackSelectedUser.emit(systemUser);
+  }
+
+  searchUsers() {
+    if (!this.isSystemUser) {
+      this.isLoading = true;
+      this.showUserTable = false;
+      this.passBackSelectedUser.emit(this.selectedUser = '');
+      this.userService.searchUsers(this.searchString).subscribe((_data: PortalAdmin) => {
+        this.searchUsersResults = _data;
+        if (this.searchUsersResults == null || this.searchUsersResults.length == 0) {
+          const modelRef = this.ngModal.open(ConfirmationModalComponent)
+          modelRef.componentInstance.title = "Confirmation";
+          modelRef.componentInstance.message = " No users found with your query. Please change your search and try again."
+          this.isLoading = false;
+        } else {
+          this.showUserTable = true;
+          this.isLoading = false;
+          this.dataSourceMap = new MatTableDataSource(this.searchUsersResults);
+          this.txtResults = (this.searchUsersResults && this.searchUsersResults.length > 1) ? 'results' : 'result';
+        }
+      });
+    }
+  }
+
+  setSelectedUser(user: PortalAdmin) {
+    this.selectedUser = user;
+    this.passBackSelectedUser.emit(this.selectedUser);
+  }
+
+}
diff --git a/portal-FE-common/src/app/shared/services/global-search/global-search.service.spec.ts b/portal-FE-common/src/app/shared/services/global-search/global-search.service.spec.ts
new file mode 100644 (file)
index 0000000..50ccebb
--- /dev/null
@@ -0,0 +1,49 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END============================================
+ *
+ * 
+ */
+import { TestBed } from '@angular/core/testing';
+
+import { GlobalSearchService } from './global-search.service';
+
+describe('GlobalSearchService', () => {
+  beforeEach(() => TestBed.configureTestingModule({}));
+
+  it('should be created', () => {
+    const service: GlobalSearchService = TestBed.get(GlobalSearchService);
+    expect(service).toBeTruthy();
+  });
+});
diff --git a/portal-FE-common/src/app/shared/services/global-search/global-search.service.ts b/portal-FE-common/src/app/shared/services/global-search/global-search.service.ts
new file mode 100644 (file)
index 0000000..ff44fba
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END============================================
+ *
+ * 
+ */
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
+import { environment } from 'src/environments/environment';
+import { Observable } from 'rxjs';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class GlobalSearchService {
+
+  constructor(private api: HttpClient) { }
+  getSearchResults(searchString: string): Observable<any> {
+    let httpParams = new HttpParams()
+      .set('searchString', searchString);
+    return this.api.get(environment.api.getSearchAllByStringResults, { params: httpParams, responseType: 'json' });
+  }
+}
index e877024..e8dbe0f 100644 (file)
@@ -123,7 +123,9 @@ export const environment = {
     "footerLinkText": "",
     "footerMessage": "",
     "footerLogoImagePath": "",
-    "footerLogoText": ""
+    "footerLogoText": "",
+    "intraSearcLink": "",
+    "extraSpecSearcLink": "https://wiki.onap.org/dosearchsite.action?cql=siteSearch+~+searchStringPlaceHolder&queryString=searchStringPlaceHolder"
 },
 "cookieDomain": "att.com"
 };
index 3b13f08..470b0c2 100644 (file)
@@ -127,7 +127,9 @@ export const environment = {
     "footerLinkText": "",
     "footerMessage": "",
     "footerLogoImagePath": "",
-    "footerLogoText": ""
+    "footerLogoText": "",
+    "intraSearcLink": "",
+    "extraSpecSearcLink": "https://wiki.onap.org/dosearchsite.action?cql=siteSearch+~+searchStringPlaceHolder&queryString=searchStringPlaceHolder"
   },
   "cookieDomain": "att.com"
 };