Merge "Angular upgrade - Dynamic widget,widget catalog"
diff --git a/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.html b/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.html
new file mode 100644
index 0000000..5ea7209
--- /dev/null
+++ b/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.html
@@ -0,0 +1,38 @@
+<!--
+  ============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 #vc style="overflow-y: scroll;"></div>
diff --git a/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.scss b/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.scss
new file mode 100644
index 0000000..570475d
--- /dev/null
+++ b/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.scss
@@ -0,0 +1,121 @@
+/*-
+ * ============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============================================
+ *
+ * 
+ */
+
+
+
+:host {  .toolbar {
+    height: 100px;
+    display: flex;
+  }  gridster {
+    display: flex;
+    height: calc(100vh - 115px);
+    flex-direction: column;
+  }}
+  .icon-content-gridguide{
+    cursor:move;
+    font-size: 22px; 
+    }
+    .form-row {
+      margin-top: -14px;
+  }
+  .griditem-header{
+    
+    
+      border-bottom: 1px;
+      border-bottom-color: solid gray;
+      
+    
+    
+  }
+ 
+.checkbox, .radio {
+  min-height: 10px; 
+  padding-left: 0px; 
+}
+
+.appCatalogue-boarder{
+  background-color: #eee;
+  border: 1px dashed white;
+  height: 100%;
+  
+  overflow-y: auto;
+  overflow-x: hidden;
+  }
+
+  .gridster-box {
+    height: 100%;
+    border: 1px solid #ccc;
+    background-color: #fff;
+ 	transition: transform 0.5s ease-out;
+}
+.gridster-box-header {
+    background-color: #fff;
+    padding: 0 0px 0 10px;
+    border-bottom: 1px solid #ccc;
+    position: relative;
+    height: 50px !important;
+}
+.gridster-box-header h3 {
+    margin-top: 15px;
+    display: inline-block;
+    font-size: 70%;
+    font-family: "Omnes-ECOMP-W02", Arial;
+}
+.gridster-box-content {
+    //padding: 59px;
+    overflow-y: scroll;
+   height:  100%;
+   
+}
+.gridster-box-content:hover{
+    //transform: scale(1.1);
+}
+.gridster-box-header-btns {
+    top: 15px;
+    right: 10px;
+    position: absolute;
+}
+.checkbox input{
+ margin: 6px;
+    left: 112px;
+    top: -20px;
+    }
+.checkbox .skin {
+    left: 125px;
+    top: -18px;
+}
\ No newline at end of file
diff --git a/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.spec.ts b/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.spec.ts
new file mode 100644
index 0000000..bae6938
--- /dev/null
+++ b/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.spec.ts
@@ -0,0 +1,38 @@
+/*-
+ * ============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============================================
+ *
+ * 
+ */
+
diff --git a/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.ts b/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.ts
new file mode 100644
index 0000000..21aab3a
--- /dev/null
+++ b/portal-FE-common/src/app/pages/dynamic-widget/dynamic-widget.component.ts
@@ -0,0 +1,80 @@
+/*-
+ * ============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 { Compiler, Component, Injector, NgModule, NgModuleRef, ViewChild, ViewContainerRef, OnInit, Input } from '@angular/core';
+import { PluginLoaderService } from 'src/app/shared/plugin/plugin-loader/plugin-loader.service';
+
+@Component({
+  selector: 'app-dynamic-widget',
+  templateUrl: './dynamic-widget.component.html',
+  styleUrls: ['./dynamic-widget.component.scss']
+})
+export class DynamicWidgetComponent implements OnInit {
+
+  @ViewChild('vc', { read: ViewContainerRef }) _container: ViewContainerRef;
+  @Input() widgetType:string;
+
+  constructor(private injector: Injector,
+    private pluginLoader: PluginLoaderService) {
+  }
+
+  ngOnInit() {
+    console.log('this.widgetType'+ this.widgetType);
+    this.loadPlugin(this.widgetType);
+  }
+
+
+  loadPlugin(pluginName: string) {
+
+    setTimeout(() => {
+      this.executePlugin(pluginName);
+      
+    }, 2000);
+ 
+  }
+
+  executePlugin(pluginName: string) {
+    this.pluginLoader.load(pluginName).then(moduleFactory => {
+      const moduleRef = moduleFactory.create(this.injector);
+      const entryComponent = (moduleFactory.moduleType as any).entry;
+      const compFactory = moduleRef.componentFactoryResolver.resolveComponentFactory(
+        entryComponent
+      );
+      this._container.createComponent(compFactory);
+    });
+  }
+}
diff --git a/portal-FE-common/src/app/pages/get-access/get-access.component.html b/portal-FE-common/src/app/pages/get-access/get-access.component.html
new file mode 100644
index 0000000..8719ea4
--- /dev/null
+++ b/portal-FE-common/src/app/pages/get-access/get-access.component.html
@@ -0,0 +1,98 @@
+<!--
+  ============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="container">
+    <div class="ecomp-main-view-title">
+      <h1 class="heading-page">Get Access</h1>
+      <br>
+      <span> Visit <a id="url-access" [href]="getAccessUrl" target="_new">{{getAccessName}}</a>
+        {{getAccessInfo}}
+      </span>
+    </div>
+    <mat-form-field>
+      <input matInput type="text" (keyup)="applyFilter($event.target.value)" placeholder="Search in entire table">
+    </mat-form-field>
+    <span class="ecomp-spinner" *ngIf="showSpinner"></span>
+    <table mat-table [dataSource]="getAccessDataSource">
+      <!-- Function Column -->
+      <ng-container matColumnDef="function">
+        <th id="col1" mat-header-cell *matHeaderCellDef> Function </th>
+        <td id="rowheader_t1_{{i}}-function" mat-cell *matCellDef="let element; let i = index;">
+          <div id="access-page-function" *ngIf="element.ecomp_function !== 'Onap Function Not Available'">
+            {{element.ecomp_function}}</div>
+          <div id="access-page-function" *ngIf="element.ecomp_function === 'Onap Function Not Available'">
+            {{element.ecomp_function}}</div>
+        </td>
+      </ng-container>
+  
+      <!-- Application Name Column -->
+      <ng-container matColumnDef="applicationName">
+        <th id="col2" mat-header-cell *matHeaderCellDef> Application Name</th>
+        <td id="rowheader_t1_{{i}}-applicationName" mat-cell *matCellDef="let element; let i=index;"> {{element.app_name}}
+        </td>
+      </ng-container>
+  
+      <!-- Role Name Column -->
+      <ng-container matColumnDef="roleName">
+        <th id="col3" mat-header-cell *matHeaderCellDef> Role Name </th>
+        <td id="rowheader_t1_{{i}}-roleName" mat-cell *matCellDef="let element; let i=index;"> {{element.role_name}}
+        </td>
+      </ng-container>
+  
+      <!-- Current Role Column -->
+      <ng-container matColumnDef="currentRole">
+        <th id="col4" mat-header-cell *matHeaderCellDef> Current Role </th>
+        <td id="rowheader_t1_{{i}}-currentRole" mat-cell *matCellDef="let element; let i=index;">
+          <div id="access-page-currentRole" *ngIf="element.current_role === 'Y'">
+            <i class="icon ion-md-checkmark"></i>
+          </div>
+        </td>
+      </ng-container>
+  
+      <!-- Request Status Column -->
+      <ng-container matColumnDef="requestStatus">
+        <th id="col4" mat-header-cell *matHeaderCellDef> Request Status </th>
+        <td id="rowheader_t1_{{i}}-requestStatus" mat-cell *matCellDef="let element; let i=index;">
+          <div id="access-page-RequestAccess" *ngIf="element.request_type !== null">{{element.request_type}}</div>
+        </td>
+      </ng-container>
+  
+      <tr [hidden]="appTable.length === 0" mat-header-row *matHeaderRowDef="displayedColumns"></tr>
+      <tr mat-row *matRowDef="let row; columns: displayedColumns;" (click)="openExistingAdminModal(row)"></tr>
+    </table>
+    <mat-paginator [hidden]="appTable.length === 0" [pageSizeOptions]="[10, 20]" showFirstLastButtons></mat-paginator>
+  </div>
\ No newline at end of file
diff --git a/portal-FE-common/src/app/pages/get-access/get-access.component.scss b/portal-FE-common/src/app/pages/get-access/get-access.component.scss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/portal-FE-common/src/app/pages/get-access/get-access.component.scss
diff --git a/portal-FE-common/src/app/pages/get-access/get-access.component.spec.ts b/portal-FE-common/src/app/pages/get-access/get-access.component.spec.ts
new file mode 100644
index 0000000..ae61740
--- /dev/null
+++ b/portal-FE-common/src/app/pages/get-access/get-access.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { GetAccessComponent } from './get-access.component';
+
+describe('GetAccessComponent', () => {
+  let component: GetAccessComponent;
+  let fixture: ComponentFixture<GetAccessComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ GetAccessComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(GetAccessComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/portal-FE-common/src/app/pages/get-access/get-access.component.ts b/portal-FE-common/src/app/pages/get-access/get-access.component.ts
new file mode 100644
index 0000000..a745489
--- /dev/null
+++ b/portal-FE-common/src/app/pages/get-access/get-access.component.ts
@@ -0,0 +1,136 @@
+/*-
+ * ============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, ViewChild } from '@angular/core';
+import { GetAccessService } from 'src/app/shared/services/get-access/get-access.service';
+import { MatTableDataSource, MatPaginator } from '@angular/material';
+import { environment } from '../../../environments/environment';
+
+@Component({
+  selector: 'app-get-access',
+  templateUrl: './get-access.component.html',
+  styleUrls: ['./get-access.component.scss']
+})
+export class GetAccessComponent implements OnInit {
+
+  isLoadingTable: boolean;
+  appTable: any[];
+  displayedColumns: string[] = ['function', 'applicationName', 'roleName', 'currentRole', 'requestStatus'];
+  getAccessDataSource = new MatTableDataSource(this.appTable);
+  @ViewChild(MatPaginator) paginator: MatPaginator;
+  showSpinner: boolean;
+  getAccessUrl = environment.getAccessUrl;
+  getAccessName = environment.getAccessName;
+  getAccessInfo = environment.getAccessInfo;
+
+  constructor(private getAccessService: GetAccessService) { }
+
+  ngOnInit() {
+    this.appTable = [];
+    this.getAccessAppsList();
+  }
+
+  applyFilter(filterValue: string) {
+    this.getAccessDataSource.filter = filterValue.trim().toLowerCase();
+  }
+  
+  // Convert this code to typescript after mylogins feature is back again
+  // var resultAccessValue = null;
+       	
+  // $scope.openAppRoleModal = (itemData) => {    	
+  //   if(resultAccessValue){
+  //   let data = null;
+  //           data = {
+  //               dialogState: 2,
+  //               selectedUser:{
+  //                   orgUserId: $scope.orgUserId,
+  //                   firstName: $scope.firstName,
+  //                   lastName: $scope.lastName,
+  //                   headerText: itemData.app_name,
+  //               }
+  //           }
+  //       ngDialog.open({
+  //           templateUrl: 'app/views/catalog/request-access-catalog-dialogs/request-access-catalog.modal.html',
+  //           controller: 'ExternalRequestAccessCtrl',
+  //           controllerAs: 'userInfo',
+  //           data: data
+  //       });
+  //   }
+  //   }
+  
+  //   userProfileService.getUserProfile().then(
+  //     function(profile) {
+  //       $scope.orgUserId = profile.orgUserId;
+  //       $scope.firstName = profile.firstName;
+  //       $scope.lastName = profile.lastName;
+  //   });
+
+  getAccessAppsList() {
+    this.showSpinner = true;
+    this.getAccessService.getListOfApp().subscribe((_res: any) => {
+      var tableData = [];
+      // $log.info('GetAccessCtrl::updateAppsList: getting res');
+      var result = (typeof (_res) != "undefined" && _res != null) ? _res : null;
+      this.showSpinner = false;
+      // $log.info('GetAccessCtrl::updateAppsList: result',result);
+      // $log.info('GetAccessCtrl::updateAppsList: done');
+      var source = result;
+      // $log.info('GetAccessCtrl::updateAppsList source: ', source);
+      for (var i = 0; i < source.length; i++) {
+        var dataArr = source[i];
+        var checkEcompFuncAvail = 'Function Not Available';
+        var reqStatus = 'Pending';
+        dataArr.ecompFunction = (dataArr.ecompFunction === null) ? checkEcompFuncAvail : dataArr.ecompFunction;
+        dataArr.reqType = (dataArr.reqType === 'P') ? reqStatus : dataArr.reqType;
+        var dataTemp = {
+          ecomp_function: dataArr.ecompFunction,
+          app_name: dataArr.appName,
+          role_name: dataArr.roleName,
+          current_role: dataArr.roleActive,
+          request_type: dataArr.reqType
+        }
+        tableData.push(dataTemp);
+      }
+      this.appTable = tableData;
+      this.getAccessDataSource = new MatTableDataSource(this.appTable);
+      this.getAccessDataSource.paginator = this.paginator;
+    }, (_err) => {
+      this.isLoadingTable = false;
+    })
+  }
+}
diff --git a/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.html b/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.html
new file mode 100644
index 0000000..01e27a9
--- /dev/null
+++ b/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.html
@@ -0,0 +1,117 @@
+<!--
+  ============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="container">
+    <!--Modal Headers-->
+    <div class="modal-header">
+      <h4 class="modal-title">Web Analytics Report Details</h4>
+      <button type="button" class="close" aria-label="Close" (click)="activeModal.dismiss('Cross')">
+          <span aria-hidden="true">&times;</span>
+      </button>
+    </div>
+  
+    <!--Modal Body goes here-->
+		<div class="modal-body">
+				<div class="app-properties-main">
+            <div [hidden]="isEditMode" style="width: 75%;">
+              <!--<div id='ecomp-small-spinner' class="ecomp-small-spinner"  *ngIf="isAllApplications"></div>-->
+              <div *ngIf="isAllApplications">
+                <span runat="server" ID="required" style="color: Red;"
+                  visible="false">*</span>
+                <mat-form-field class="web-analytics-applications-select">
+                    <mat-label> Application Name </mat-label>
+                    <mat-select name="web-analytics-application-select" id="application" 
+                      name="applicationName" [(ngModel)]="userTableAppReport.appName" [(value)]="selected">
+                      <mat-option *ngFor="let d of allApplications" [value]="d" >{{d.appName}}</mat-option>
+                    </mat-select>
+                </mat-form-field>
+              </div>
+              <div id="web-analytics-message-required"
+                *ngIf="!userTableAppReport.appName && userTableAppReport.appName === ''">
+                <small class="mandatory-categories"
+                  style="color: Red; font-size: 11px;">Application Name is Required</small>
+              </div>
+            </div>
+
+            <div class="property-label" *ngIf="isEditMode">
+              <div class="property-label">
+                <span runat="server" ID="required" style="color: Red;" visible="false"> *</span>Application Name :
+              </div>
+              <input id="input-Application-name" type="text" ddh-reset
+                [(ngModel)]="userTableAppReport.appName" style="width: 75%;"
+                name="appId" [disabled]="isEditMode" />
+              <div id="web-analytics-message-required"
+                ng-show="(userTableAppReport.appName && (userTableAppReport.appName.length == 0 ||! userTableAppReport.appName))">
+                <small class="mandatory-categories" style="color: Red; font-size: 11px;">Application ID is  Required</small>
+              </div>
+            </div>
+           
+            <div class="property-label">
+              <div class="property-label">
+                <span runat="server" ID="required" style="color: Red;" visible="false"> *</span>Report Name :
+              </div>
+              <input id="input-report-name" type="text" ddh-reset  [(ngModel)]="userTableAppReport.reportName" style="width: 75%;" />
+              <div id="web-analytics-message-required"
+                [hidden]="(userTableAppReport.reportName && (userTableAppReport.reportName|| userTableAppReport.reportName.length == 0))">
+                <small class="mandatory-categories"
+                  style="color: Red; font-size: 11px;">Report Name is  Required</small>
+              </div>
+            </div>
+           
+            <div class="property-label">
+              <div class="property-label">
+                <span runat="server" ID="required" style="color: Red;"  visible="false"> *</span>Report URL :
+              </div>
+              <input id="input-report-url" type="text" ddh-reset  [(ngModel)]="userTableAppReport.reportSrc" style="width: 75%;" />
+              <div id="web-analytics-message-required"
+                [hidden]="(userTableAppReport.reportSrc && (userTableAppReport.reportSrc || userTableAppReport.reportSrc.length == 0))">
+                <small class="mandatory-categories" style="color: Red; font-size: 11px;">Report URL is Required</small>
+              </div>
+            </div>
+        </div>
+      </div>
+      
+      <!--Modal Footer goes Here-->
+			<div class="modal-footer">
+          <button type="submit" class="btn btn-primary" 
+              [disabled]="(userTableAppReport.appName && userTableAppReport.appName === '')||(userTableAppReport.reportName && (!userTableAppReport.reportName
+              ||userTableAppReport.reportName.length == 0))||(userTableAppReport.reportSrc && (userTableAppReport.reportSrc.length == 0 
+              || !userTableAppReport.reportSrc))"(click)="saveChanges()">Save</button> &nbsp;
+
+          <button type="button" class="btn btn-primary" (click)="activeModal.close('Close')">Cancel</button>
+			</div>
+</div>
\ No newline at end of file
diff --git a/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.scss b/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.scss
new file mode 100644
index 0000000..7a77339
--- /dev/null
+++ b/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.scss
@@ -0,0 +1,37 @@
+/*-
+ * ============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============================================
+ *
+ * 
+ */
\ No newline at end of file
diff --git a/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.spec.ts b/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.spec.ts
new file mode 100644
index 0000000..4dc8572
--- /dev/null
+++ b/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.spec.ts
@@ -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 { WebAnalyticsDetailsDialogComponent } from './web-analytics-details-dialog.component';
+
+describe('WebAnalyticsDetailsDialogComponent', () => {
+  let component: WebAnalyticsDetailsDialogComponent;
+  let fixture: ComponentFixture<WebAnalyticsDetailsDialogComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ WebAnalyticsDetailsDialogComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(WebAnalyticsDetailsDialogComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.ts b/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.ts
new file mode 100644
index 0000000..3b5a23e
--- /dev/null
+++ b/portal-FE-common/src/app/pages/web-analytics/web-analytics-details-dialog/web-analytics-details-dialog.component.ts
@@ -0,0 +1,156 @@
+/*-
+ * ============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, Output, EventEmitter} from '@angular/core';
+import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';
+import { WebAnalyticsService } from 'src/app/shared/services';
+
+@Component({
+  selector: 'app-web-analytics-details-dialog',
+  templateUrl: './web-analytics-details-dialog.component.html',
+  styleUrls: ['./web-analytics-details-dialog.component.scss']
+})
+export class WebAnalyticsDetailsDialogComponent implements OnInit {
+
+  result: any;
+  isEditMode: boolean = false;
+  isAllApplications: boolean = true;
+  emptyImg = null;
+  allApplications: any = [];
+  allApps: any = [];
+            
+  newAppModel = {
+    'appId': null,
+    'appName':null,
+    'reportName': null,
+    'reportSrc': null,
+    'resourceId': null
+  };
+
+  newApp={
+    'appId': '',
+    'appName':''	     		
+  }
+
+  constructor(public activeModal: NgbActiveModal, public ngbModal: NgbModal, 
+    public webAnalyticsService : WebAnalyticsService) { }
+
+  @Input() userTableAppReport: any;
+  @Output() passEntry: EventEmitter<any> = new EventEmitter();
+
+  ngOnInit() {
+    this.isAllApplications = true;
+    if(this.userTableAppReport.appName){
+      this.isEditMode = true;
+    }else{
+      this.isEditMode = false;
+    }
+    //console.log("IsEditMode in Web analytycs Dialog :: ",this.isEditMode)
+    this.getAllApplications();
+  }
+
+  getAllApplications(){
+    this.isAllApplications = true;
+    this.webAnalyticsService.getAllApplications()
+    .subscribe(_data => {
+        this.result = _data;
+        if (this.result == null || this.result == 'undefined') {
+             //console.log('WebAnalyticsService::getAllApplications Failed: Result or result.data is null');
+        }else {
+          for (let i = 0; i < this.result.length; i++) {
+            var application = {
+                appId : this.result[i].id,
+                appName: this.result[i].name,
+                enabled : this.result[i].enabled,
+                restrictedApp :this.result[i].restrictedApp,
+            };
+            this.allApps.push(application);  
+         }
+         for (let i = 0; i < this.allApps.length; i++) {
+          if((this.allApps[i].enabled == true && this.allApps[i].restrictedApp == false) || (this.allApps[i].appId == 1) ) {
+            var validApplication = {
+              appId : this.allApps[i].appId,
+              appName: this.allApps[i].appName,
+            };
+            this.allApplications.push(validApplication);
+          }
+        }
+      }
+    }, error =>{
+      this.isAllApplications = false;
+      console.log(error);
+    });
+  }
+
+  saveChanges(){
+    //console.log("Save Changes Called.");
+    let selectedApplication = this.userTableAppReport.appName;
+    this.newAppModel.appId = selectedApplication.appId;
+    this.newAppModel.appName = selectedApplication.appName;
+    this.newAppModel.reportName = this.userTableAppReport.reportName;
+    this.newAppModel.reportSrc =  this.userTableAppReport.reportSrc;
+    this.newAppModel.resourceId =  this.userTableAppReport.resourceId;
+
+    if (this.isEditMode) {
+      this.newAppModel.appId = this.userTableAppReport.appId;
+      //console.log("Update Analytics..newAppModel :: ",this.userTableAppReport);
+      this.webAnalyticsService.updateWebAnalyticsReport(this.newAppModel)
+      .subscribe(_data => {
+          this.result = _data;
+          //console.log("Update Analytics Response:: ",this.result);
+          this.passEntry.emit(this.result);
+          this.ngbModal.dismissAll();
+      }, error =>{
+        this.isAllApplications = false;
+        console.log(error);
+      });
+    }else{
+      //console.log("Save Analytics.newAppModel :: ",this.userTableAppReport);
+      this.webAnalyticsService.save(this.newAppModel)
+      .subscribe(_data => {
+          this.result = _data;
+          //console.log("Save Analytics Response:: ",this.result);
+          this.passEntry.emit(this.result);
+          this.ngbModal.dismissAll();
+      }, error =>{
+        this.isAllApplications = false;
+        console.log(error);
+      });
+    }
+  }
+}
diff --git a/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.html b/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.html
new file mode 100644
index 0000000..4266718
--- /dev/null
+++ b/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.html
@@ -0,0 +1,91 @@
+<!--
+  ============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="container">
+    <div class="ecomp-main-view-title">
+        <h1 class="heading-page">Web Analytics Onboarding</h1>
+    </div>
+
+    <mat-form-field>
+      <input matInput type="text" (keyup)="applyFilter($event.target.value)" placeholder="Search in entire table">
+    </mat-form-field>
+
+    <button type="button" style="float: right;" class="btn btn-primary" (click)="openWebAnalyticsModal('')">
+        <i class="icon ion-md-person-add"></i>Add Web Analytics Report
+    </button>
+
+    <div class="webanalytics-table">
+        <table mat-table [dataSource]="dataSource" matSort>
+          <!-- Account Name Column -->
+          <ng-container matColumnDef="applicationName">
+            <th id="col1" mat-header-cell *matHeaderCellDef> Application Name  </th>
+            <td (click)="openWebAnalyticsModal(element)" id="rowheader_t1_{{i}}-applicationName" 
+              mat-cell *matCellDef="let element; let i = index;"> {{element.appName}}
+            </td>
+          </ng-container>
+      
+          <!-- Report Name Column -->
+          <ng-container matColumnDef="reportName">
+            <th id="col2" mat-header-cell *matHeaderCellDef> Report Name </th>
+            <td (click)="openWebAnalyticsModal(element)" id="rowheader_t1_{{i}}-reportName" 
+              mat-cell *matCellDef="let element; let i=index;"> {{element.reportName}} </td>
+          </ng-container>
+
+          <!-- Report URL Column -->
+          <ng-container matColumnDef="reportURL">
+            <th id="col2" mat-header-cell *matHeaderCellDef> Report URL </th>
+            <td (click)="openWebAnalyticsModal(element)" id="rowheader_t1_{{i}}-reportURL" 
+              mat-cell *matCellDef="let element; let i=index;"> {{element.reportSrc}} </td>
+          </ng-container>
+    
+          <!-- Delete Column -->
+          <ng-container matColumnDef="delete">
+            <th id="col4" mat-header-cell *matHeaderCellDef> Delete </th>
+            <td id="rowheader_t1_{{i}}" mat-cell *matCellDef="let element; let i=index;">
+              <span class="icon-trash" id="{{i}}-button-portal-admin-remove" (click)="deleteWebAnalyticsReport(element)">
+                <i class="icon ion-md-trash"></i>
+              </span>
+            </td>
+          </ng-container>
+      
+          <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
+          <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
+      </table>
+      <mat-paginator [pageSizeOptions]="[10, 20]" showFirstLastButtons></mat-paginator>
+  </div>
+</div>
+  
\ No newline at end of file
diff --git a/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.scss b/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.scss
new file mode 100644
index 0000000..c72d11e
--- /dev/null
+++ b/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.scss
@@ -0,0 +1,51 @@
+/*-
+ * ============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============================================
+ *
+ * 
+ */
+
+.container{
+    overflow-y: auto;
+}
+
+.container .webanalytics-table th{
+    padding-bottom: 15px;
+    padding-right: 40px;
+    font-weight: bold;
+}
+
+.ion-md-trash{
+    cursor: pointer;
+}
\ No newline at end of file
diff --git a/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.spec.ts b/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.spec.ts
new file mode 100644
index 0000000..76d44cc
--- /dev/null
+++ b/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.spec.ts
@@ -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 { WebAnalyticsComponent } from './web-analytics.component';
+
+describe('WebAnalyticsComponent', () => {
+  let component: WebAnalyticsComponent;
+  let fixture: ComponentFixture<WebAnalyticsComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ WebAnalyticsComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(WebAnalyticsComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.ts b/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.ts
new file mode 100644
index 0000000..eb26091
--- /dev/null
+++ b/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.ts
@@ -0,0 +1,240 @@
+/*-
+ * ============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, ViewChild, Input} from '@angular/core';
+import { WebAnalyticsService } from '../../shared/services/index';
+import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
+import { MatTableDataSource } from '@angular/material';
+import { MatSort, MatPaginator } from '@angular/material';
+import { WebAnalyticsDetailsDialogComponent } from './web-analytics-details-dialog/web-analytics-details-dialog.component';
+import { ConfirmationModalComponent } from 'src/app/modals/confirmation-modal/confirmation-modal.component';
+import { InformationModalComponent } from 'src/app/modals/information-modal/information-modal.component';
+
+@Component({
+  selector: 'app-web-analytics',
+  templateUrl: './web-analytics.component.html',
+  styleUrls: ['./web-analytics.component.scss']
+})
+export class WebAnalyticsComponent implements OnInit {
+
+  application: any;
+  isAppSelectDisabled: boolean;
+  selectApp: any;
+  sortedApps: any = [];
+  userAppReports: any = [];
+  userTableAppReports: any= [];
+  userJourneyAnalytics: any = [];
+  userApps: any = [];
+  result: any;
+  isEditMode: boolean = false;
+
+  displayedColumns: string[] = ['applicationName', 'reportName', 'reportURL','delete'];
+  dataSource = new MatTableDataSource(this.userTableAppReports);
+  @ViewChild(MatSort) sort: MatSort;
+  @ViewChild(MatPaginator) paginator: MatPaginator;
+
+
+  constructor(public webAnalyticsService: WebAnalyticsService, public ngbModal: NgbModal) { }
+
+  ngOnInit() {
+
+    this.application = null;	
+    this.isAppSelectDisabled = false;
+    this.selectApp = 'All Applications';
+    this.sortedApps = [{
+        index: 0,
+        appName: 'All Applications',
+        value: 'All Applications'
+    }];
+
+    this.getAllWebAnalyticsReport();
+    //this.getUserApps();
+
+  }
+
+  getAllWebAnalyticsReport(){
+    //console.log("getAllWebAnalyticsReport called");
+    this.webAnalyticsService.getAllWebAnalyticsReport()
+    .subscribe(_data => {
+        this.result = _data;
+        if (this.result == null || this.result == 'undefined') {
+             console.log('WebAnalyticsService::getAllWebAnalyticsReport Failed: Result or result.data is null');
+        }else {
+          //console.log('WebAnalyticsService::getAllWebAnalyticsReport', this.result);
+          for (let i = 0; i < this.result.length; i++) {
+            var userTableAppReport = {
+                reportName: this.result[i].reportName,
+                reportSrc: this.result[i].reportSrc,
+                appName: this.result[i].appName,
+                appId : this.result[i].appId,
+                resourceId : this.result[i].resourceId
+            };
+            this.userTableAppReports.push(userTableAppReport);
+          }
+          this.populateTableData(this.userTableAppReports);
+        }
+    }, error =>{
+      console.log(error);
+    });
+  }
+
+  deleteWebAnalyticsReport(deleteObj: any){
+    let confirmationMsg = 'You are about to delete this Web Analytics : ' + deleteObj.reportName+ '. Click OK to continue.';
+    this.openInformationModal("Confirmation",confirmationMsg).result.then((result) => {
+      if (result === 'Ok') {
+        this.userTableAppReports.splice(this.userTableAppReports.indexOf(deleteObj), 1);
+        this.webAnalyticsService.deleteWebAnalyticsReport(deleteObj)
+        .subscribe(_data => {
+            this.userTableAppReports = [];
+            this.getAllWebAnalyticsReport();
+        }, error =>{
+          console.log(error);
+        });
+      }
+    }, (resut) => {
+      return;
+    })
+  }
+
+  getUserApps(){
+    //console.log("getUserApps called");
+    this.webAnalyticsService.getWebAnalyticsAppReports()
+    .subscribe(_data => {
+        this.result = _data;
+        if (this.result == null || this.result == 'undefined') {
+             console.log('WebAnalyticsService::getServiceList Failed: Result or result.data is null');
+         }else {
+          for (let i = 0; i < this.result.length; i++) {
+            var userAppReport = {
+                sizeX: 3,
+                sizeY: 2,
+                reportName: this.result[i].reportName,
+                reportSrc: this.result[i].reportSrc,
+                appName: this.result[i].appName,
+            };
+            
+            if(this.result[i].reportSrc.includes("appName")){
+                let appName = this.result[i].reportSrc.split("appName=").splice(-1)[0];
+                this.webAnalyticsService.getUserJourneyList(appName)
+                .subscribe(_data => {
+                  let userJourneyReports = {
+                    sizeX: 6,
+                    sizeY: 3,
+                      title: appName+" User journey",
+                      analyticsList: this.result
+                  };  
+                  this.userJourneyAnalytics.push(userJourneyReports);
+                }, error =>{
+                  console.log(error);
+                });
+
+            }                               
+            this.userAppReports.push(userAppReport);
+        }
+
+        for (var i = 0; i < this.result.length; i++) {
+            var userApp = {
+                appName: this.result[i].appName,
+            };
+
+            this.userApps.push(userApp);
+        }
+        /*angular.forEach($scope.userApps, function(value, key) {
+            var index = $scope.uniqueUserApps.indexOf(value.appName);
+
+            if (index === -1) {
+                $scope.uniqueUserApps.push(value.appName);
+            }
+        });
+
+
+        for (let i = 1; i <= $scope.uniqueUserApps.length; i++) {
+            this.sortedApps.push({
+                index: i,
+                appName: $scope.uniqueUserApps[i - 1],
+                value: $scope.uniqueUserApps[i - 1]
+            });
+        }*/
+      }
+    }, error =>{
+      //console.log(error);
+    });
+  }
+
+  openWebAnalyticsModal(rowData: any) {
+    const modalRef = this.ngbModal.open(WebAnalyticsDetailsDialogComponent, { size: 'lg' });
+    //console.log("selectedData in parent",rowData);
+    if(rowData != 'undefined' && rowData){
+      modalRef.componentInstance.userTableAppReport = rowData;
+      this.isEditMode = true;
+    }else{
+      modalRef.componentInstance.userTableAppReport  = {};
+      this.isEditMode = false;
+    }
+    modalRef.componentInstance.passEntry.subscribe((receivedEntry: any) => {
+      if(receivedEntry.httpStatusCode && receivedEntry.httpStatusCode ==='200' ||
+      receivedEntry.status && receivedEntry.status === 'OK'){
+        this.userTableAppReports = [];
+        this.getAllWebAnalyticsReport();
+      } 
+    });
+  }
+
+
+  populateTableData(userTableAppReports: Array<Object>){
+    this.dataSource = new MatTableDataSource(userTableAppReports);
+    this.dataSource.sort = this.sort;
+    this.dataSource.paginator = this.paginator;
+  }
+
+  applyFilter(filterValue: string) {
+    this.dataSource.filter = filterValue.trim().toLowerCase();
+  }
+
+  openConfirmationModal(_title: string, _message: string) {
+    const modalInfoRef = this.ngbModal.open(ConfirmationModalComponent);
+    modalInfoRef.componentInstance.title = _title;
+    modalInfoRef.componentInstance.message = _message;
+  }
+
+  openInformationModal(_title: string, _message: string){
+    const modalInfoRef = this.ngbModal.open(InformationModalComponent);
+    modalInfoRef.componentInstance.title = _title;
+    modalInfoRef.componentInstance.message = _message;
+    return modalInfoRef;
+  }
+}
diff --git a/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.html b/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.html
new file mode 100644
index 0000000..927e264
--- /dev/null
+++ b/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.html
@@ -0,0 +1,100 @@
+<!--
+  ============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="container">
+  <div id="page-content">
+    <div id="title">
+      <h1>{{'Widget Catalog'}}</h1>
+    </div>
+    <div>
+      <div>
+        <div id="widgets">
+          
+
+          <div style="height: 100%">
+            <gridster [options]="options" class="appCatalogue-boarder">
+
+
+              <div *ngFor="let item of layout">
+              <gridster-item [item]="item" >
+                <div class="gridster-box">
+                  <div class="gridster-box-header">
+
+                    <mat-icon class="icon-content-gridguide">drag_handle</mat-icon>
+                    <h3>{{ item.name | elipsis: 13}}</h3>
+                    <span style="position: absolute;right:1em">
+                      <label id="widget-checkbox-label" class="checkbox">
+
+                        <input type="checkbox" id="{{item.name.split(' ').join('-')}}-checkbox"
+                        [(ngModel)]="item.select" (ngModelChange)="storeSelection(item)" />
+
+
+                        <i class="skin"></i>
+                      </label>
+                    </span>
+
+
+                  </div>
+                  <div class="gridster-box-content" >
+                      <app-dynamic-widget [widgetType] = "item.name"></app-dynamic-widget>
+                  </div>
+
+                </div>
+              </gridster-item>
+            </div>
+
+
+
+            </gridster>
+          </div>
+        </div>
+      </div>
+      <div id="widgets-disclaimer" class="w-ecomp-main-disclaimer">
+        To request access to an application widget, please visit the <a>Get Access</a> page.
+      </div>
+    </div>
+  </div>
+</div>
+<div>
+  <div>
+
+  </div>
+  <div>
+    <div></div>
+    <div></div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.scss b/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.scss
new file mode 100644
index 0000000..cbdfd12
--- /dev/null
+++ b/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.scss
@@ -0,0 +1,119 @@
+/*
+ * ============LICENSE_START==========================================
+ * ONAP Portal SDK
+ * ===================================================================
+ * Copyright © 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============================================
+ *
+ * 
+ */
+
+
+
+:host {  .toolbar {
+    height: 100px;
+    display: flex;
+  }  gridster {
+    display: flex;
+    height: calc(100vh - 115px);
+    flex-direction: column;
+  }}
+  .icon-content-gridguide{
+    cursor:move;
+    font-size: 22px; 
+    }
+    .form-row {
+      margin-top: -14px;
+  }
+  .griditem-header{
+    
+    
+      border-bottom: 1px;
+      border-bottom-color: solid gray;
+      
+    
+    
+  }
+ 
+.checkbox, .radio {
+  min-height: 10px; 
+  padding-left: 0px; 
+}
+
+.appCatalogue-boarder{
+  background-color: #eee;
+  border: 1px dashed white;
+  height: 100%;
+  
+  overflow-y: auto;
+  overflow-x: hidden;
+  }
+
+  .gridster-box {
+    height: 100%;
+    border: 1px solid #ccc;
+    background-color: #fff;
+ 	transition: transform 0.5s ease-out;
+}
+.gridster-box-header {
+    background-color: #fff;
+    padding: 0 0px 0 10px;
+    border-bottom: 1px solid #ccc;
+    position: relative;
+    height: 50px !important;
+}
+.gridster-box-header h3 {
+    margin-top: 15px;
+    display: inline-block;
+    font-size: 70%;
+    font-family: "Omnes-ECOMP-W02", Arial;
+}
+.gridster-box-content {
+    //padding: 59px;
+    overflow-y: scroll;
+   height:  100%;
+   
+}
+
+.gridster-box-header-btns {
+    top: 15px;
+    right: 10px;
+    position: absolute;
+}
+.checkbox input{
+ margin: 6px;
+    left: 112px;
+    top: -20px;
+    }
+.checkbox .skin {
+    left: 125px;
+    top: -18px;
+}
\ No newline at end of file
diff --git a/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.spec.ts b/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.spec.ts
new file mode 100644
index 0000000..83de004
--- /dev/null
+++ b/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { WidgetCatalogComponent } from './widget-catalog.component';
+
+describe('WidgetCatalogComponent', () => {
+  let component: WidgetCatalogComponent;
+  let fixture: ComponentFixture<WidgetCatalogComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ WidgetCatalogComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(WidgetCatalogComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.ts b/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.ts
new file mode 100644
index 0000000..c36f9e1
--- /dev/null
+++ b/portal-FE-common/src/app/pages/widget-catalog/widget-catalog.component.ts
@@ -0,0 +1,85 @@
+import { Component, OnInit } from '@angular/core';
+import { GridsterConfig, GridsterItem } from 'angular-gridster2';
+import { WidgetCatalogService } from '../../shared/services/widget-catalog/widget-catalog.service';
+import { IWidgetCatalog } from '../../shared/model/widget-catalog.model';
+import { Observable } from 'rxjs';
+import { inflateRaw } from 'zlib';
+import { UsersService } from 'src/app/shared/services/users/users.service';
+
+
+@Component({
+  selector: 'app-widget-catalog',
+  templateUrl: './widget-catalog.component.html',
+  styleUrls: ['./widget-catalog.component.scss']
+})
+export class WidgetCatalogComponent implements OnInit {
+  widgetCatalogData: IWidgetCatalog[];
+  isCommonError: boolean = false;
+  isApiRunning: boolean = true;
+  userName: string;
+
+
+  get options(): GridsterConfig {
+    return this.widgetCatalogService.options;
+  } get layout(): GridsterItem[] {
+    return this.widgetCatalogService.layout;
+  } constructor(private widgetCatalogService: WidgetCatalogService, private userService: UsersService) {
+
+  }
+
+  ngOnInit() {
+    const widgetCatalogObservable = this.widgetCatalogService.getWidgetCatalog();
+    this.widgetCatalogService.layout = [];
+    this.getUserWidgets(this.userName);
+  }
+
+
+  getUserWidgets(loginName: string) {
+    const widgetCatalogUserObservable = this.userService.getUserProfile();
+    widgetCatalogUserObservable.subscribe((userProfile: any) => {
+      //console.log('UserProfile is ' + userProfile);
+      if (userProfile) {
+        const widgetCatalogObservable = this.widgetCatalogService.getUserWidgets(userProfile.orgUserId);
+        widgetCatalogObservable.subscribe(data => {
+          //console.log("What is coming from backend" + JSON.parse(data));
+          this.widgetCatalogData = data;
+          console.log(this.widgetCatalogData);
+          for (let entry of this.widgetCatalogData) {
+            if (entry[1] == 'Events' || entry[1] == 'News' || entry[1] == 'Resources') {
+              var appCatalog = {
+                id: entry[0],
+                name: entry[1],
+                headerName: entry[2],
+                select: (entry[4] == 'S' || entry[4] === null) ? true : false
+              };
+              this.widgetCatalogService.addItem(appCatalog);
+            }
+          }
+        });
+      }
+    });
+
+  }
+
+  getUserProfile(): Observable<any> {
+    const widgetCatalogObservable = this.userService.getUserProfile();
+    return widgetCatalogObservable;
+  }
+
+  storeSelection(widgetCatalogData: any) {
+    console.log("Store selection called " + widgetCatalogData.select);
+    if (widgetCatalogData) {
+      var appData = {
+        widgetId: widgetCatalogData.id,
+        select: widgetCatalogData.select,
+        pending:false
+      };
+      this.widgetCatalogService.updateWidgetCatalog(appData).subscribe(data => {
+        //console.log("Update App sort data" + data);
+      }, error => {
+        console.log('updateWidgetCatalog error' + error);
+      });
+    }
+
+  }
+}
\ No newline at end of file