[NIFIREG-30] update dep versions and enhance performance

Signed-off-by: Scott Aslan <[email protected]>

This closes #50


Project: http://git-wip-us.apache.org/repos/asf/nifi-registry/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi-registry/commit/a931858f
Tree: http://git-wip-us.apache.org/repos/asf/nifi-registry/tree/a931858f
Diff: http://git-wip-us.apache.org/repos/asf/nifi-registry/diff/a931858f

Branch: refs/heads/master
Commit: a931858f1f59215128d8293c31e013745d52735d
Parents: 2f343e1
Author: Scott Aslan <[email protected]>
Authored: Fri Dec 8 01:15:29 2017 -0500
Committer: Scott Aslan <[email protected]>
Committed: Fri Dec 8 01:34:14 2017 -0500

----------------------------------------------------------------------
 .../src/main/frontend/karma.conf.js             |   6 +-
 .../src/main/frontend/package.json              |  24 +-
 .../nf-registry-administration.html             |  12 +-
 .../nf-registry-administration.spec.js          |   3 -
 .../users/nf-registry-users-administration.js   |   4 +-
 .../nf-registry-users-adminstration.spec.js     |   4 +-
 .../nf-registry-workflow-administration.js      |   2 +
 .../nf-registry-workflow-administration.spec.js |   4 +-
 .../nf-registry-bucket-grid-list-viewer.js      |   5 +-
 .../nf-registry-bucket-grid-list-viewer.spec.js |  30 +-
 .../nf-registry-droplet-grid-list-viewer.js     |   5 +-
 ...nf-registry-droplet-grid-list-viewer.spec.js |  31 +-
 .../registry/nf-registry-grid-list-viewer.html  |   8 +-
 .../registry/nf-registry-grid-list-viewer.js    |   5 +-
 .../nf-registry-grid-list-viewer.spec.js        |  22 +-
 .../explorer/nf-registry-explorer.spec.js       |   3 -
 .../src/main/webapp/nf-registry-bootstrap.js    |   5 +
 .../src/main/webapp/nf-registry.animations.js   |  18 +-
 .../src/main/webapp/nf-registry.html            |   4 +-
 .../src/main/webapp/nf-registry.module.js       |   3 -
 .../src/main/webapp/services/nf-registry.api.js |   2 +-
 .../webapp/services/nf-registry.api.spec.js     | 312 ++++++++-----------
 .../main/webapp/services/nf-registry.service.js |   7 +-
 .../webapp/services/nf-registry.service.spec.js | 160 ++--------
 .../src/main/webapp/systemjs.builder.config.js  |   2 +
 .../src/main/webapp/systemjs.spec.config.js     |   2 +
 .../main/webapp/theming/_structureElements.scss |   3 +-
 .../explorer/grid-list/_structureElements.scss  |   1 -
 28 files changed, 281 insertions(+), 406 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/frontend/karma.conf.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/frontend/karma.conf.js 
b/nifi-registry-web-ui/src/main/frontend/karma.conf.js
index 6be2e75..8a63bfd 100644
--- a/nifi-registry-web-ui/src/main/frontend/karma.conf.js
+++ b/nifi-registry-web-ui/src/main/frontend/karma.conf.js
@@ -117,10 +117,6 @@ module.exports = function (config) {
                 served: true
             },
 
-            // Asset (HTML) paths loaded via Angular's component compiler
-            // (these paths need to be rewritten, see proxies section)
-            // {pattern: appBase + '**/*.html', included: false, watched: 
true},
-
             // Images
             {pattern: '**/*.svg', watched: false, included: true, served: 
true},
 
@@ -159,7 +155,7 @@ module.exports = function (config) {
         logLevel: config.LOG_INFO,
         autoWatch: true,
         browsers: ['Chrome'],
-        singleRun: false
+        singleRun: true
     });
 
     if (process.env.TRAVIS) {

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/frontend/package.json
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/frontend/package.json 
b/nifi-registry-web-ui/src/main/frontend/package.json
index efd0d4f..4bfe687 100644
--- a/nifi-registry-web-ui/src/main/frontend/package.json
+++ b/nifi-registry-web-ui/src/main/frontend/package.json
@@ -21,18 +21,18 @@
     "roboto-fontface": "0.7.0"
   },
   "devDependencies": {
-    "@angular/animations": "4.4.4",
+    "@angular/animations": "4.4.6",
     "@angular/cdk": "2.0.0-beta.12",
-    "@angular/common": "4.4.4",
-    "@angular/compiler": "4.4.4",
-    "@angular/core": "4.4.4",
+    "@angular/common": "4.4.6",
+    "@angular/compiler": "4.4.6",
+    "@angular/core": "4.4.6",
     "@angular/flex-layout": "2.0.0-beta.9",
-    "@angular/forms": "4.4.4",
-    "@angular/http": "4.4.4",
+    "@angular/forms": "4.4.6",
+    "@angular/http": "4.4.6",
     "@angular/material": "2.0.0-beta.12",
-    "@angular/platform-browser": "4.4.4",
-    "@angular/platform-browser-dynamic": "4.4.4",
-    "@angular/router": "4.4.4",
+    "@angular/platform-browser": "4.4.6",
+    "@angular/platform-browser-dynamic": "4.4.6",
+    "@angular/router": "4.4.6",
     "angular2-jwt": "0.2.3",
     "canonical-path": "0.0.2",
     "grunt": "0.4.5",
@@ -41,13 +41,13 @@
     "grunt-sass": "2.0.0",
     "grunt-systemjs-builder": "1.0.0",
     "hammerjs": "2.0.8",
-    "jasmine-core": "2.4.1",
+    "jasmine-core": "2.8.0",
     "jquery": "3.2.1",
-    "karma": "1.7.0",
+    "karma": "1.7.1",
     "karma-chrome-launcher": "2.2.0",
     "karma-cli": "1.0.1",
     "karma-coverage": "1.1.1",
-    "karma-jasmine": "1.0.2",
+    "karma-jasmine": "1.1.1",
     "karma-jasmine-html-reporter": "0.2.2",
     "karma-spec-reporter": "0.0.31",
     "load-grunt-tasks": "3.5.2",

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.html
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.html
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.html
index 73c78e1..604af59 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.html
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.html
@@ -18,17 +18,17 @@ limitations under the License.
 <div id="nifi-registry-administration-perspective">
     <mat-button-toggle-group name="nifi-registry-administration-perspective" 
fxLayout="row"
                             fxLayoutAlign="space-between center" 
class="tab-toggle-group">
+        <mat-button-toggle [checked]="nfRegistryService.adminPerspective === 
'workflow'" value="workflow"
+                           class="uppercase"
+                           routerLink="/nifi-registry/administration/workflow"
+                           i18n="Workflow administration tab|A description of 
the type of administration options available.@@nf-admin-workflow-tab-title">
+            Buckets
+        </mat-button-toggle>
         <mat-button-toggle [checked]="nfRegistryService.adminPerspective === 
'users'" value="users" class="uppercase"
                           routerLink="/nifi-registry/administration/users"
                           i18n="Users administration tab|A description of the 
type of administration options available.@@nf-admin-users-tab-title">
             Users
         </mat-button-toggle>
-        <mat-button-toggle [checked]="nfRegistryService.adminPerspective === 
'workflow'" value="workflow"
-                          class="uppercase"
-                          routerLink="/nifi-registry/administration/workflow"
-                          i18n="Workflow administration tab|A description of 
the type of administration options available.@@nf-admin-workflow-tab-title">
-            Buckets
-        </mat-button-toggle>
     </mat-button-toggle-group>
 </div>
 <router-outlet></router-outlet>

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.spec.js
index 27694ce..4cc7cf8 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.spec.js
@@ -43,7 +43,6 @@ var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer
 var fdsCore = require('@fluid-design-system/core');
 var ngMoment = require('angular2-moment');
 var rxjs = require('rxjs/Rx');
-var ngHttp = require('@angular/http');
 
 describe('NfRegistryAdministration Component', function () {
     var comp;
@@ -57,8 +56,6 @@ describe('NfRegistryAdministration Component', function () {
         ngCoreTesting.TestBed.configureTestingModule({
             imports: [
                 ngMoment.MomentModule,
-                ngHttp.HttpModule,
-                ngHttp.JsonpModule,
                 ngCommonHttp.HttpClientModule,
                 fdsCore,
                 NfRegistryRoutes

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.js
index 17e288c..1fdef66 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.js
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 var ngCore = require('@angular/core');
-var rxjs = require('rxjs/Rx');
+var rxjs = require('rxjs/Observable');
 var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
 var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
@@ -75,6 +75,7 @@ NfRegistryUsersAdministration.prototype = {
      */
     ngOnInit: function () {
         var self = this;
+        this.nfRegistryService.inProgress = true;
         // attempt kerberos authentication
         this.nfRegistryApi.ticketExchange().subscribe(function (jwt) {
             self.nfRegistryService.loadCurrentUser().subscribe(function 
(currentUser) {
@@ -92,6 +93,7 @@ NfRegistryUsersAdministration.prototype = {
                         self.nfRegistryService.users = users;
                         self.nfRegistryService.groups = groups;
                         self.nfRegistryService.filterUsersAndGroups();
+                        self.nfRegistryService.inProgress = false;
                     });
             });
         });

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-adminstration.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-adminstration.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-adminstration.spec.js
index dc82791..80fd245 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-adminstration.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-adminstration.spec.js
@@ -42,7 +42,6 @@ var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer
 var fdsCore = require('@fluid-design-system/core');
 var ngMoment = require('angular2-moment');
 var rxjs = require('rxjs/Rx');
-var ngHttp = require('@angular/http');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
@@ -60,8 +59,6 @@ describe('NfRegistryUsersAdministration Component', function 
() {
         ngCoreTesting.TestBed.configureTestingModule({
             imports: [
                 ngMoment.MomentModule,
-                ngHttp.HttpModule,
-                ngHttp.JsonpModule,
                 ngCommonHttp.HttpClientModule,
                 fdsCore,
                 NfRegistryRoutes,
@@ -145,6 +142,7 @@ describe('NfRegistryUsersAdministration Component', 
function () {
             expect(comp).toBeDefined();
             expect(de).toBeDefined();
             expect(nfRegistryService.adminPerspective).toBe('users');
+            expect(nfRegistryService.inProgress).toBe(false);
             expect(nfRegistryService.users[0].identity).toEqual('User #1');
             expect(nfRegistryService.users.length).toBe(1);
             expect(nfRegistryService.groups[0].identity).toEqual('Group #1');

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
index 85a6b97..5a27be9 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
@@ -59,6 +59,7 @@ NfRegistryWorkflowAdministration.prototype = {
      */
     ngOnInit: function () {
         var self = this;
+        this.nfRegistryService.inProgress = true;
         // attempt kerberos authentication
         this.nfRegistryApi.ticketExchange().subscribe(function (jwt) {
             self.nfRegistryService.loadCurrentUser().subscribe(function 
(currentUser) {
@@ -70,6 +71,7 @@ NfRegistryWorkflowAdministration.prototype = {
                     .subscribe(function (buckets) {
                         self.nfRegistryService.buckets = buckets;
                         self.nfRegistryService.filterBuckets();
+                        self.nfRegistryService.inProgress = false;
                     });
             });
         });

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
index a8e48d0..febac5c 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
@@ -42,7 +42,6 @@ var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer
 var fdsCore = require('@fluid-design-system/core');
 var ngMoment = require('angular2-moment');
 var rxjs = require('rxjs/Rx');
-var ngHttp = require('@angular/http');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
@@ -60,8 +59,6 @@ describe('NfRegistryWorkflowAdministration Component', 
function () {
         ngCoreTesting.TestBed.configureTestingModule({
             imports: [
                 ngMoment.MomentModule,
-                ngHttp.HttpModule,
-                ngHttp.JsonpModule,
                 ngCommonHttp.HttpClientModule,
                 fdsCore,
                 NfRegistryRoutes,
@@ -138,6 +135,7 @@ describe('NfRegistryWorkflowAdministration Component', 
function () {
             expect(comp).toBeDefined();
             expect(de).toBeDefined();
             expect(nfRegistryService.adminPerspective).toBe('workflow');
+            expect(nfRegistryService.inProgress).toBe(false);
             expect(nfRegistryService.buckets[0].name).toEqual('Bucket #1');
             expect(nfRegistryService.buckets.length).toBe(1);
             expect(nfRegistryService.filterBuckets).toHaveBeenCalled();

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
index d0e9077..cbba95e 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 var ngCore = require('@angular/core');
-var rxjs = require('rxjs/Rx');
+var rxjs = require('rxjs/Observable');
 var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
 var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
@@ -46,6 +46,7 @@ NfRegistryBucketGridListViewer.prototype = {
      */
     ngOnInit: function () {
         var self = this;
+        this.nfRegistryService.inProgress = true;
         this.nfRegistryService.explorerViewType = 'grid-list';
 
         // reset the breadcrumb state
@@ -71,6 +72,7 @@ NfRegistryBucketGridListViewer.prototype = {
                         self.nfRegistryService.droplets = droplets;
                         self.nfRegistryService.filterDroplets();
                         self.nfRegistryService.setBreadcrumbState('in');
+                        self.nfRegistryService.inProgress = false;
                     });
             });
         });
@@ -83,6 +85,7 @@ NfRegistryBucketGridListViewer.prototype = {
     ngOnDestroy: function () {
         this.nfRegistryService.explorerViewType = '';
         this.nfRegistryService.setBreadcrumbState('out');
+        this.nfRegistryService.filteredDroplets = [];
     }
 };
 

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
index 2d58a8b..22805d0 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
@@ -40,7 +40,6 @@ var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer
 var fdsCore = require('@fluid-design-system/core');
 var ngMoment = require('angular2-moment');
 var rxjs = require('rxjs/Rx');
-var ngHttp = require('@angular/http');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
@@ -51,14 +50,11 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
     var fixture;
     var nfRegistryService;
     var nfRegistryApi;
-    var ngHttpService;
 
     beforeEach(function () {
         ngCoreTesting.TestBed.configureTestingModule({
             imports: [
                 ngMoment.MomentModule,
-                ngHttp.HttpModule,
-                ngHttp.JsonpModule,
                 ngCommonHttp.HttpClientModule,
                 fdsCore,
                 NfRegistryRoutes
@@ -99,10 +95,6 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
                     useValue: {
                         params: rxjs.Observable.of({bucketId: 
'2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'})
                     }
-                },
-                {
-                    provide: ngHttp.XHRBackend,
-                    useClass: ngHttpTesting.MockBackend
                 }
             ]
         });
@@ -114,7 +106,6 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
         // from the root injector
         nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
         nfRegistryApi = ngCoreTesting.TestBed.get(NfRegistryApi);
-        ngHttpService = ngCoreTesting.TestBed.get(ngHttp.Http);
 
         // because the NfRegistryBucketGridListViewer component is a nested 
route component we need to set up the nfRegistryService service manually
         nfRegistryService.explorerViewType = 'grid-list';
@@ -122,7 +113,6 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
         //Spy
         spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
         spyOn(nfRegistryService, 'loadCurrentUser').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
-        spyOn(ngHttpService, 'get').and.callThrough();
         spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
         }).and.returnValue(rxjs.Observable.of([{
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
@@ -164,6 +154,7 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
         //assertions
         expect(comp).toBeDefined();
         expect(nfRegistryService.breadCrumbState).toBe('in');
+        expect(nfRegistryService.inProgress).toBe(false);
         expect(nfRegistryService.droplet.identity).toBeUndefined();
         expect(nfRegistryService.bucket.name).toEqual('Bucket #1');
         expect(nfRegistryService.buckets[0].name).toEqual('Bucket #1');
@@ -182,7 +173,22 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
 
     it('should destroy the component', ngCoreTesting.fakeAsync(function () {
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(rxjs.Observable.of([]));
+        }).and.returnValue(rxjs.Observable.of([{
+            "identifier": "2e04b4fb-9513-47bb-aa74-1ae34616bfdc",
+            "name": "Flow #1",
+            "description": "This is flow #1",
+            "bucketIdentifier": "2f7f9e54-dc09-4ceb-aa58-9fe581319cdc",
+            "createdTimestamp": 1505931890999,
+            "modifiedTimestamp": 1505931890999,
+            "type": "FLOW",
+            "snapshotMetadata": null,
+            "link": {
+                "params": {
+                    "rel": "self"
+                },
+                "href": "flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc"
+            }
+        }]));
         // 1st change detection triggers ngOnInit which makes getBuckets, 
getBucket, and getDroplets calls
         fixture.detectChanges();
         // wait for async getBuckets, getBucket, and getDroplets calls
@@ -194,6 +200,8 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
         comp.ngOnDestroy();
 
         //assertions
+        expect(nfRegistryService.explorerViewType).toBe('');
+        expect(nfRegistryService.filteredDroplets.length).toBe(0);
         expect(nfRegistryService.breadCrumbState).toBe('out');
     }));
 });

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
index 97d2a0c..41bef94 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 var ngCore = require('@angular/core');
-var rxjs = require('rxjs/Rx');
+var rxjs = require('rxjs/Observable');
 var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
 var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
@@ -46,6 +46,7 @@ NfRegistryDropletGridListViewer.prototype = {
      */
     ngOnInit: function () {
         var self = this;
+        this.nfRegistryService.inProgress = true;
         this.nfRegistryService.explorerViewType = 'grid-list';
         // attempt kerberos authentication
         this.nfRegistryApi.ticketExchange().subscribe(function (jwt) {
@@ -70,6 +71,7 @@ NfRegistryDropletGridListViewer.prototype = {
                         self.nfRegistryService.droplets = droplets;
                         self.nfRegistryService.filterDroplets();
                         self.nfRegistryService.setBreadcrumbState('in');
+                        self.nfRegistryService.inProgress = false;
                     });
             });
         });
@@ -81,6 +83,7 @@ NfRegistryDropletGridListViewer.prototype = {
     ngOnDestroy: function () {
         this.nfRegistryService.explorerViewType = '';
         this.nfRegistryService.setBreadcrumbState('out');
+        this.nfRegistryService.filteredDroplets = [];
     }
 };
 

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
index 30b37f7..8631eb4 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
@@ -40,7 +40,6 @@ var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer
 var fdsCore = require('@fluid-design-system/core');
 var ngMoment = require('angular2-moment');
 var rxjs = require('rxjs/Rx');
-var ngHttp = require('@angular/http');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
@@ -51,14 +50,11 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
     var fixture;
     var nfRegistryService;
     var nfRegistryApi;
-    var ngHttpService;
 
     beforeEach(function () {
         ngCoreTesting.TestBed.configureTestingModule({
             imports: [
                 ngMoment.MomentModule,
-                ngHttp.HttpModule,
-                ngHttp.JsonpModule,
                 ngCommonHttp.HttpClientModule,
                 fdsCore,
                 NfRegistryRoutes
@@ -102,10 +98,6 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
                             dropletType: 'flow'
                         })
                     }
-                },
-                {
-                    provide: ngHttp.XHRBackend,
-                    useClass: ngHttpTesting.MockBackend
                 }
             ]
         });
@@ -118,7 +110,6 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
         // from the root injector
         nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
         nfRegistryApi = ngCoreTesting.TestBed.get(NfRegistryApi);
-        ngHttpService = ngCoreTesting.TestBed.get(ngHttp.Http);
 
         // because the NfRegistryDropletGridListViewer component is a nested 
route component we need to set up the nfRegistryService service manually
         nfRegistryService.perspective = 'explorer';
@@ -127,7 +118,7 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
         //Spy
         spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
         spyOn(nfRegistryService, 'loadCurrentUser').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
-        spyOn(ngHttpService, 'get').and.callThrough();
+        // spyOn(ngHttpService, 'get').and.callThrough();
         spyOn(nfRegistryApi, 'getDroplet').and.callFake(function () {
         }).and.returnValue(rxjs.Observable.of({
             "identifier": "2e04b4fb-9513-47bb-aa74-1ae34616bfdc",
@@ -186,6 +177,7 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
         //assertions
         expect(comp).toBeDefined();
         expect(nfRegistryService.breadCrumbState).toBe('in');
+        expect(nfRegistryService.inProgress).toBe(false);
         expect(nfRegistryService.bucket.name).toEqual('Bucket #1');
         expect(nfRegistryService.buckets[0].name).toEqual('Bucket #1');
         expect(nfRegistryService.buckets.length).toBe(1);
@@ -210,7 +202,22 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
 
     it('should destroy the component', ngCoreTesting.fakeAsync(function () {
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(rxjs.Observable.of([]));
+        }).and.returnValue(rxjs.Observable.of([{
+            "identifier": "2e04b4fb-9513-47bb-aa74-1ae34616bfdc",
+            "name": "Flow #1",
+            "description": "This is flow #1",
+            "bucketIdentifier": "2f7f9e54-dc09-4ceb-aa58-9fe581319cdc",
+            "createdTimestamp": 1505931890999,
+            "modifiedTimestamp": 1505931890999,
+            "type": "FLOW",
+            "snapshotMetadata": null,
+            "link": {
+                "params": {
+                    "rel": "self"
+                },
+                "href": "flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc"
+            }
+        }]));
         // 1st change detection triggers ngOnInit which makes getBuckets, 
getBucket, getDroplet, and getDroplets calls
         fixture.detectChanges();
         // wait for async getBuckets, getBucket, getDroplet, and getDroplets 
calls
@@ -222,6 +229,8 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
         comp.ngOnDestroy();
 
         //assertions
+        expect(nfRegistryService.explorerViewType).toBe('');
+        expect(nfRegistryService.filteredDroplets.length).toBe(0);
         expect(nfRegistryService.breadCrumbState).toBe('out');
     }));
 });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
index eb0bb99..bb8c52d 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
@@ -20,8 +20,8 @@ limitations under the License.
         <div flex fxLayout="row" fxLayoutAlign="end center">
             <td-chips [(ngModel)]="nfRegistryService.dropletsSearchTerms"
                       [items]="nfRegistryService.autoCompleteDroplets"
-                      
(add)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name,
 nfRegistryService.activeDropletColumn.sortOrder);"
-                      
(remove)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name,
 nfRegistryService.activeDropletColumn.sortOrder);" 
class="push-right-sm"></td-chips>
+                      
(add)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.identity,
 nfRegistryService.activeDropletColumn.sortOrder);"
+                      
(remove)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.identity,
 nfRegistryService.activeDropletColumn.sortOrder);" 
class="push-right-sm"></td-chips>
             <span class="push-top-sm pad-right-sm">Sort by:</span>
             <div fxLayout="row" fxLayoutAlign="end center" 
[matMenuTriggerFor]="dropletGridSortMenu">
                 <div class="push-top-sm" 
id="droplet-sort-by-field">{{nfRegistryService.getSortByLabel()}}</div>
@@ -62,7 +62,7 @@ limitations under the License.
                             Actions<i class="fa fa-caret-down" 
aria-hidden="true"></i>
                         </button>
                         <mat-menu class="fds-primary-dropdown-button-menu" 
#primaryButtonDropdownMenu="matMenu"
-                                 [overlapTrigger]="false">
+                                  [overlapTrigger]="false">
                             <button mat-menu-item *ngFor="let action of 
nfRegistryService.dropletActions"
                                     
(click)="nfRegistryService.executeDropletAction(action, droplet)">
                                 <span>{{action.name}}</span>
@@ -108,7 +108,7 @@ limitations under the License.
         <div class="pad-bottom-sm"></div>
     </div>
 </div>
-<div class="pad-right-xxl pad-left-xxl" 
*ngIf="nfRegistryService.filteredDroplets.length === 0">
+<div class="pad-right-xxl pad-left-xxl" 
*ngIf="nfRegistryService.filteredDroplets.length === 0 && 
!nfRegistryService.inProgress">
     <p class="text-center">No results match this query.</p>
 </div>
 <router-outlet></router-outlet>

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
index 042747e..adeee3f 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 var ngCore = require('@angular/core');
-var rxjs = require('rxjs/Rx');
+var rxjs = require('rxjs/Observable');
 var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
 var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
@@ -47,6 +47,7 @@ NfRegistryGridListViewer.prototype = {
     ngOnInit: function () {
         var self = this;
         this.nfRegistryService.explorerViewType = 'grid-list';
+        this.nfRegistryService.inProgress = true;
 
         // reset the breadcrumb state
         this.nfRegistryService.bucket = {};
@@ -67,6 +68,7 @@ NfRegistryGridListViewer.prototype = {
                         self.nfRegistryService.droplets = droplets;
                         self.nfRegistryService.filterDroplets();
                         self.nfRegistryService.setBreadcrumbState('in');
+                        self.nfRegistryService.inProgress = false;
                     });
             });
         });
@@ -78,6 +80,7 @@ NfRegistryGridListViewer.prototype = {
     ngOnDestroy: function () {
         this.nfRegistryService.explorerViewType = '';
         this.nfRegistryService.setBreadcrumbState('out');
+        this.nfRegistryService.filteredDroplets = [];
     }
 };
 

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
index 8c5cc38..2c926b4 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
@@ -39,7 +39,6 @@ var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer
 var fdsCore = require('@fluid-design-system/core');
 var ngMoment = require('angular2-moment');
 var rxjs = require('rxjs/Rx');
-var ngHttp = require('@angular/http');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
@@ -55,8 +54,6 @@ describe('NfRegistryGridListViewer Component', function () {
         ngCoreTesting.TestBed.configureTestingModule({
             imports: [
                 ngMoment.MomentModule,
-                ngHttp.HttpModule,
-                ngHttp.JsonpModule,
                 ngCommonHttp.HttpClientModule,
                 fdsCore,
                 NfRegistryRoutes
@@ -152,6 +149,7 @@ describe('NfRegistryGridListViewer Component', function () {
         expect(comp).toBeDefined();
         expect(nfRegistryService.explorerViewType).toBe('grid-list');
         expect(nfRegistryService.breadCrumbState).toBe('in');
+        expect(nfRegistryService.inProgress).toBe(false);
         expect(nfRegistryService.bucket.identity).toBeUndefined();
         expect(nfRegistryService.droplet.identity).toBeUndefined();
         expect(nfRegistryService.buckets[0].name).toEqual('Bucket #1');
@@ -165,7 +163,22 @@ describe('NfRegistryGridListViewer Component', function () 
{
 
     it('should destroy the component', ngCoreTesting.fakeAsync(function () {
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(rxjs.Observable.of([]));
+        }).and.returnValue(rxjs.Observable.of([{
+            "identifier": "2e04b4fb-9513-47bb-aa74-1ae34616bfdc",
+            "name": "Flow #1",
+            "description": "This is flow #1",
+            "bucketIdentifier": "2f7f9e54-dc09-4ceb-aa58-9fe581319cdc",
+            "createdTimestamp": 1505931890999,
+            "modifiedTimestamp": 1505931890999,
+            "type": "FLOW",
+            "snapshotMetadata": null,
+            "link": {
+                "params": {
+                    "rel": "self"
+                },
+                "href": "flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc"
+            }
+        }]));
         // 1st change detection triggers ngOnInit which makes getBuckets and 
getDroplets calls
         fixture.detectChanges();
         // wait for async getBuckets and getDroplets calls
@@ -178,7 +191,6 @@ describe('NfRegistryGridListViewer Component', function () {
 
         //assertions
         expect(nfRegistryService.explorerViewType).toBe('');
-        expect(nfRegistryService.droplets.length).toBe(0);
         expect(nfRegistryService.filteredDroplets.length).toBe(0);
         expect(nfRegistryService.breadCrumbState).toBe('out');
     }));

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
index c60a230..605965a 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
@@ -37,7 +37,6 @@ var NfRegistryBucketGridListViewer = 
require('nifi-registry/components/explorer/
 var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js');
 var fdsCore = require('@fluid-design-system/core');
 var ngMoment = require('angular2-moment');
-var ngHttp = require('@angular/http');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
@@ -52,8 +51,6 @@ describe('NfRegistryExplorer Component', function () {
         ngCoreTesting.TestBed.configureTestingModule({
             imports: [
                 ngMoment.MomentModule,
-                ngHttp.HttpModule,
-                ngHttp.JsonpModule,
                 ngCommonHttp.HttpClientModule,
                 fdsCore,
                 NfRegistryRoutes

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/nf-registry-bootstrap.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/nf-registry-bootstrap.js 
b/nifi-registry-web-ui/src/main/webapp/nf-registry-bootstrap.js
index 14bdc3c..f692564 100644
--- a/nifi-registry-web-ui/src/main/webapp/nf-registry-bootstrap.js
+++ b/nifi-registry-web-ui/src/main/webapp/nf-registry-bootstrap.js
@@ -19,6 +19,11 @@ require('core-js');
 require('zone.js');
 require('hammerjs');
 require('switchMap');
+// patch Observable with appropriate methods
+require('rxjs/add/operator/map');
+require('rxjs/add/operator/catch');
+require('rxjs/add/observable/of');
+require('rxjs/add/observable/forkJoin');
 var $ = require('jquery');
 var NfRegistryModule = require('nifi-registry/nf-registry.module.js');
 var ngPlatformBrowserDynamic = require('@angular/platform-browser-dynamic');

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/nf-registry.animations.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/nf-registry.animations.js 
b/nifi-registry-web-ui/src/main/webapp/nf-registry.animations.js
index e78f3a4..5f7d0cb 100644
--- a/nifi-registry-web-ui/src/main/webapp/nf-registry.animations.js
+++ b/nifi-registry-web-ui/src/main/webapp/nf-registry.animations.js
@@ -109,11 +109,25 @@ NfAnimations.prototype = {
         ),
         ngAnimate.transition('void => *', [
             ngAnimate.style({transform: 'translateX(100%)'}),
+            ngAnimate.animate('0.4s 0.1s ease-in')
+        ]),
+        ngAnimate.transition('* => void', ngAnimate.animate('0.2s ease-out', 
ngAnimate.style({transform: 'translateX(-100%)'})))
+    ]),
+
+    /**
+     * Fly in/out animation
+     */
+    fadeInOutAnimation: ngAnimate.trigger('fadeInOut', [
+        ngAnimate.state('in',
+            ngAnimate.style({opacity: 1})
+        ),
+        ngAnimate.transition('void => *', [
+            ngAnimate.style({opacity: 0}),
             ngAnimate.animate('0.5s 0.1s ease-in')
         ]),
-        ngAnimate.transition('* => void', ngAnimate.animate('0.5s ease-out', 
ngAnimate.style({transform: 'translateX(-100%)'})))
+        ngAnimate.transition('* => void', ngAnimate.animate('0.5s ease-out', 
ngAnimate.style({opacity: 0})))
     ])
 
 };
 
-module.exports = new NfAnimations();
\ No newline at end of file
+module.exports = new NfAnimations();

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/nf-registry.html
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/nf-registry.html 
b/nifi-registry-web-ui/src/main/webapp/nf-registry.html
index 4e9c4c4..b175233 100644
--- a/nifi-registry-web-ui/src/main/webapp/nf-registry.html
+++ b/nifi-registry-web-ui/src/main/webapp/nf-registry.html
@@ -15,7 +15,7 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 -->
 
-<mat-progress-spinner id="loading-spinner" 
mode="indeterminate"></mat-progress-spinner>
+<mat-progress-spinner id="loading-spinner" 
*ngIf="nfRegistryService.inProgress" 
mode="indeterminate"></mat-progress-spinner>
 <mat-sidenav-container>
     <mat-sidenav #sidenav mode="over" align="end" opened="false" 
disableClose="true">
         <router-outlet name="sidenav"></router-outlet>
@@ -76,7 +76,7 @@ limitations under the License.
                 <a id="logout-link-container" 
*ngIf="nfRegistryService.currentUser.canLogout" class="link" 
(click)="logout()">logout</a>
             </div>
             <button mat-ripple *ngIf="nfRegistryService.perspective === 
'explorer'" mat-icon-button
-                    routerLink="/nifi-registry/administration/users">
+                    routerLink="/nifi-registry/administration/workflow">
                 <i class="fa fa-wrench" aria-hidden="true"></i>
             </button>
             <button mat-ripple *ngIf="nfRegistryService.perspective === 
'administration'" mat-mini-fab

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js 
b/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
index 455574e..c862dab 100644
--- a/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
+++ b/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
@@ -39,7 +39,6 @@ var NfRegistryGridListViewer = 
require('nifi-registry/components/explorer/grid-l
 var NfRegistryBucketGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js');
 var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js');
 var fdsCore = require('@fluid-design-system/core');
-var ngHttp = require('@angular/http');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
@@ -57,8 +56,6 @@ NfRegistryModule.annotations = [
         imports: [
             ngMoment.MomentModule,
             fdsCore,
-            ngHttp.HttpModule,
-            ngHttp.JsonpModule,
             ngCommonHttp.HttpClientModule,
             NfRegistryRoutes
         ],

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js 
b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
index c2b9e44..5491c25 100644
--- a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
+++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
@@ -18,7 +18,7 @@
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
 var ngCommonHttp = require('@angular/common/http');
 var fdsDialogsModule = require('@fluid-design-system/dialogs');
-var rxjs = require('rxjs/Rx');
+var rxjs = require('rxjs/Observable');
 var ngRouter = require('@angular/router');
 var MILLIS_PER_SECOND = 1000;
 var headers = new Headers({'Content-Type': 'application/json'});

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js 
b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js
index eee6858..b1a6609 100644
--- a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js
+++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js
@@ -38,16 +38,13 @@ var NfRegistryBucketGridListViewer = 
require('nifi-registry/components/explorer/
 var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js');
 var fdsCore = require('@fluid-design-system/core');
 var ngMoment = require('angular2-moment');
-var ngHttp = require('@angular/http');
 var rxjs = require('rxjs/Rx');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
 
-describe('NfRegistry Service API w/ Angular testing utils', function () {
-    var comp;
-    var fixture;
+xdescribe('NfRegistry API w/ Angular testing utils', function () {
     var nfRegistryApi;
     var nfRegistryService;
 
@@ -55,12 +52,9 @@ describe('NfRegistry Service API w/ Angular testing utils', 
function () {
         ngCoreTesting.TestBed.configureTestingModule({
             imports: [
                 ngMoment.MomentModule,
-                ngHttp.HttpModule,
-                ngHttp.JsonpModule,
-                ngCommonHttp.HttpClientModule,
+                ngCommonHttpTesting.HttpClientTestingModule,
                 fdsCore,
                 NfRegistryRoutes,
-                ngCommonHttpTesting.HttpClientTestingModule
             ],
             declarations: [
                 FdsDemo,
@@ -96,19 +90,112 @@ describe('NfRegistry Service API w/ Angular testing 
utils', function () {
             ],
             bootstrap: [NfRegistry]
         });
-        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
-        fixture.detectChanges();
-        comp = fixture.componentInstance;
-
         // NfRegistryService from the root injector
         nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
         nfRegistryApi = ngCoreTesting.TestBed.get(NfRegistryApi);
-        spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
-        }).and.returnValue(rxjs.Observable.of({}));
-        spyOn(nfRegistryService, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(rxjs.Observable.of({}));
     });
 
+    it('should POST to exchange tickets.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
+        // Spy
+        spyOn(nfRegistryApi.nfStorage, 'setItem').and.callThrough();
+
+        // api call
+        nfRegistryApi.ticketExchange().subscribe(function (response) {
+            var setItemCall = nfRegistryApi.nfStorage.setItem.calls.first();
+            
expect(setItemCall.args[1]).toBe('eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJiYmVuZGVATklGSS5BUEFDSEUuT1JHIiwiaXNzIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwiYXVkIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYmJlbmRlQE5JRkkuQVBBQ0hFLk9SRyIsImtpZCI6IjQ3NWQwZWEyLTkzZGItNDhiNi05MjcxLTgyOGM3MzQ5ZTFkNiIsImlhdCI6MTUxMjQ4NTY4NywiZXhwIjoxNTEyNTI4ODg3fQ.lkaWPQw1ld7Qqb6-Zu8mAqu6r8mUVHBNP0ZfNpES3rA');
+            
expect(response).toBe('eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJiYmVuZGVATklGSS5BUEFDSEUuT1JHIiwiaXNzIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwiYXVkIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYmJlbmRlQE5JRkkuQVBBQ0hFLk9SRyIsImtpZCI6IjQ3NWQwZWEyLTkzZGItNDhiNi05MjcxLTgyOGM3MzQ5ZTFkNiIsImlhdCI6MTUxMjQ4NTY4NywiZXhwIjoxNTEyNTI4ODg3fQ.lkaWPQw1ld7Qqb6-Zu8mAqu6r8mUVHBNP0ZfNpES3rA');
+        });
+
+        // the request it made
+        req = httpMock.expectOne('/nifi-registry-api/access/token/kerberos');
+        expect(req.request.method).toEqual('POST');
+
+        // Next, fulfill the request by transmitting a response.
+        
req.flush('eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJiYmVuZGVATklGSS5BUEFDSEUuT1JHIiwiaXNzIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwiYXVkIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYmJlbmRlQE5JRkkuQVBBQ0hFLk9SRyIsImtpZCI6IjQ3NWQwZWEyLTkzZGItNDhiNi05MjcxLTgyOGM3MzQ5ZTFkNiIsImlhdCI6MTUxMjQ4NTY4NywiZXhwIjoxNTEyNTI4ODg3fQ.lkaWPQw1ld7Qqb6-Zu8mAqu6r8mUVHBNP0ZfNpES3rA');
+
+        // Finally, assert that there are no outstanding requests.
+        httpMock.verify();
+    }));
+
+    it('should load jwt from local storage.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
+        // Spy
+        spyOn(nfRegistryApi.nfStorage, 'hasItem').and.callFake(function () {
+            return true;
+        });
+        spyOn(nfRegistryApi.nfStorage, 'getItem').and.callFake(function () {
+            return 123;
+        });
+
+        // api call
+        nfRegistryApi.ticketExchange().subscribe(function (response) {
+            expect(response).toBe(123);
+        });
+    }));
+
+    it('should fail to POST to exchange tickets.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
+        // Spy
+        spyOn(nfRegistryApi.nfStorage, 'hasItem').and.callFake(function () {
+            return false;
+        });
+        // api call
+        nfRegistryApi.ticketExchange().subscribe(function (response) {
+            expect(response).toEqual('');
+        });
+
+        // the request it made
+        req = httpMock.expectOne('/nifi-registry-api/access/token/kerberos');
+        expect(req.request.method).toEqual('POST');
+
+        // Next, fulfill the request by transmitting a response.
+        req.flush(null, {status: 401, statusText: 'POST exchange tickets mock 
error'});
+
+        // Finally, assert that there are no outstanding requests.
+        httpMock.verify();
+    }));
+
+    it('should GET to load the current user.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
+        // api call
+        nfRegistryApi.loadCurrentUser().subscribe(function (response) {
+            expect(response.identifier).toBe(123);
+            expect(response.identity).toBe('Admin User');
+        });
+
+        // the request it made
+        req = httpMock.expectOne('/nifi-registry-api/access');
+        expect(req.request.method).toEqual('GET');
+
+        // Next, fulfill the request by transmitting a response.
+        req.flush({
+            'identifier': 123,
+            'identity': 'Admin User'
+        });
+
+        // Finally, assert that there are no outstanding requests.
+        httpMock.verify();
+    }));
+
+    it('should fail to GET to load the current user.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
+        // Spy
+        spyOn(nfRegistryApi.router, 'navigateByUrl').and.callFake(function () {
+        });
+
+        // api call
+        nfRegistryApi.loadCurrentUser().subscribe(function (response) {
+            var navigateByUrlCall = 
nfRegistryApi.router.navigateByUrl.calls.first();
+            expect(navigateByUrlCall.args[0]).toBe('/nifi-registry/login');
+        });
+
+        // the request it made
+        req = httpMock.expectOne('/nifi-registry-api/access');
+        expect(req.request.method).toEqual('GET');
+
+        // Next, fulfill the request by transmitting a response.
+        req.flush(null, {status: 401, statusText: 'GET current user mock 
error'});
+
+        // Finally, assert that there are no outstanding requests.
+        httpMock.verify();
+    }));
+
     it('should GET droplet snapshot metadata.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
         // api call
         
nfRegistryApi.getDropletSnapshotMetadata('flow/test').subscribe(function 
(response) {
@@ -190,7 +277,9 @@ describe('NfRegistry Service API w/ Angular testing utils', 
function () {
         // Spy
         spyOn(nfRegistryApi.dialogService, 
'openConfirm').and.callFake(function () {
             return {
-                afterClosed: function() { return rxjs.Observable.of(true); }
+                afterClosed: function () {
+                    return rxjs.Observable.of(true);
+                }
             }
         });
 
@@ -480,7 +569,9 @@ describe('NfRegistry Service API w/ Angular testing utils', 
function () {
         // Spy
         spyOn(nfRegistryApi.dialogService, 
'openConfirm').and.callFake(function () {
             return {
-                afterClosed: function() { return rxjs.Observable.of(true); }
+                afterClosed: function () {
+                    return rxjs.Observable.of(true);
+                }
             }
         });
 
@@ -507,7 +598,9 @@ describe('NfRegistry Service API w/ Angular testing utils', 
function () {
         // Spy
         spyOn(nfRegistryApi.dialogService, 
'openConfirm').and.callFake(function () {
             return {
-                afterClosed: function() { return rxjs.Observable.of(true); }
+                afterClosed: function () {
+                    return rxjs.Observable.of(true);
+                }
             }
         });
 
@@ -855,7 +948,10 @@ describe('NfRegistry Service API w/ Angular testing 
utils', function () {
 
     it('should POST to create a user group.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
         // api call
-        nfRegistryApi.createNewGroup(123, 'Group #1', [{identity: 'User #1', 
identifier: 9999}]).subscribe(function (response) {
+        nfRegistryApi.createNewGroup(123, 'Group #1', [{
+            identity: 'User #1',
+            identifier: 9999
+        }]).subscribe(function (response) {
             expect(response.identifier).toEqual(123);
             expect(response.identity).toEqual('Group #1');
             expect(response.users[0].identity).toEqual('User #1');
@@ -882,7 +978,10 @@ describe('NfRegistry Service API w/ Angular testing 
utils', function () {
         });
 
         // api call
-        nfRegistryApi.createNewGroup(123, 'Group #1', [{identity: 'User #1', 
identifier: 9999}]).subscribe(function (response) {
+        nfRegistryApi.createNewGroup(123, 'Group #1', [{
+            identity: 'User #1',
+            identifier: 9999
+        }]).subscribe(function (response) {
             expect(response.message).toEqual('Http failure response for 
/nifi-registry-api/tenants/user-groups: 401 POST user groups mock error');
             var dialogServiceCall = 
nfRegistryApi.dialogService.openConfirm.calls.first();
             expect(dialogServiceCall.args[0].title).toBe('Error');
@@ -904,7 +1003,10 @@ describe('NfRegistry Service API w/ Angular testing 
utils', function () {
 
     it('should PUT to update a user group.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
         // api call
-        nfRegistryApi.updateUserGroup(123, 'Group #1', [{identity: 'User #1', 
identifier: 9999}]).subscribe(function (response) {
+        nfRegistryApi.updateUserGroup(123, 'Group #1', [{
+            identity: 'User #1',
+            identifier: 9999
+        }]).subscribe(function (response) {
             expect(response.identifier).toEqual(123);
             expect(response.identity).toEqual('Group #1');
             expect(response.users[0].identity).toEqual('User #1');
@@ -931,7 +1033,10 @@ describe('NfRegistry Service API w/ Angular testing 
utils', function () {
         });
 
         // api call
-        nfRegistryApi.updateUserGroup('123', 'Group #1', [{identity: 'User 
#1', identifier: '9999'}]).subscribe(function (response) {
+        nfRegistryApi.updateUserGroup('123', 'Group #1', [{
+            identity: 'User #1',
+            identifier: '9999'
+        }]).subscribe(function (response) {
             var dialogServiceCall = 
nfRegistryApi.dialogService.openConfirm.calls.first();
             expect(dialogServiceCall.args[0].title).toBe('Error');
             expect(dialogServiceCall.args[0].message).toBe('Http failure 
response for /nifi-registry-api/tenants/user-groups/123: 401 PUT user groups 
mock error');
@@ -949,165 +1054,4 @@ describe('NfRegistry Service API w/ Angular testing 
utils', function () {
         // Finally, assert that there are no outstanding requests.
         httpMock.verify();
     }));
-});
-
-describe('NfRegistry Service API w/ Angular testing utils', function () {
-    var comp;
-    var fixture;
-    var nfRegistryApi;
-    var nfRegistryService;
-
-    beforeEach(function () {
-        ngCoreTesting.TestBed.configureTestingModule({
-            imports: [
-                ngMoment.MomentModule,
-                ngHttp.HttpModule,
-                ngHttp.JsonpModule,
-                ngCommonHttp.HttpClientModule,
-                fdsCore,
-                NfRegistryRoutes,
-                ngCommonHttpTesting.HttpClientTestingModule
-            ],
-            declarations: [
-                FdsDemo,
-                NfRegistry,
-                NfRegistryExplorer,
-                NfRegistryAdministration,
-                NfRegistryUsersAdministration,
-                NfRegistryUserDetails,
-                NfRegistryUserPermissions,
-                NfRegistryUserGroupPermissions,
-                NfRegistryBucketPermissions,
-                NfRegistryAddUser,
-                NfRegistryWorkflowAdministration,
-                NfRegistryGridListViewer,
-                NfRegistryBucketGridListViewer,
-                NfRegistryDropletGridListViewer,
-                NfPageNotFoundComponent
-            ],
-            providers: [
-                NfRegistryService,
-                NfRegistryAuthService,
-                NfRegistryApi,
-                NfStorage,
-                {
-                    provide: ngCommonHttp.HTTP_INTERCEPTORS,
-                    useClass: NfRegistryTokenInterceptor,
-                    multi: true
-                },
-                {
-                    provide: ngCommon.APP_BASE_HREF,
-                    useValue: '/'
-                }
-            ],
-            bootstrap: [NfRegistry]
-        });
-        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
-        fixture.detectChanges();
-        comp = fixture.componentInstance;
-
-        // NfRegistryService from the root injector
-        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
-        nfRegistryApi = ngCoreTesting.TestBed.get(NfRegistryApi);
-    });
-
-    it('should POST to exchange tickets.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
-        // Spy
-        spyOn(nfRegistryApi.nfStorage, 'setItem').and.callThrough();
-
-        // api call
-        nfRegistryApi.ticketExchange().subscribe(function (response) {
-            var setItemCall = nfRegistryApi.nfStorage.setItem.calls.first();
-            
expect(setItemCall.args[1]).toBe('eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJiYmVuZGVATklGSS5BUEFDSEUuT1JHIiwiaXNzIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwiYXVkIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYmJlbmRlQE5JRkkuQVBBQ0hFLk9SRyIsImtpZCI6IjQ3NWQwZWEyLTkzZGItNDhiNi05MjcxLTgyOGM3MzQ5ZTFkNiIsImlhdCI6MTUxMjQ4NTY4NywiZXhwIjoxNTEyNTI4ODg3fQ.lkaWPQw1ld7Qqb6-Zu8mAqu6r8mUVHBNP0ZfNpES3rA');
-            
expect(response).toBe('eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJiYmVuZGVATklGSS5BUEFDSEUuT1JHIiwiaXNzIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwiYXVkIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYmJlbmRlQE5JRkkuQVBBQ0hFLk9SRyIsImtpZCI6IjQ3NWQwZWEyLTkzZGItNDhiNi05MjcxLTgyOGM3MzQ5ZTFkNiIsImlhdCI6MTUxMjQ4NTY4NywiZXhwIjoxNTEyNTI4ODg3fQ.lkaWPQw1ld7Qqb6-Zu8mAqu6r8mUVHBNP0ZfNpES3rA');
-        });
-
-        // the request it made
-        req = httpMock.expectOne('/nifi-registry-api/access/token/kerberos');
-        expect(req.request.method).toEqual('POST');
-
-        // Next, fulfill the request by transmitting a response.
-        
req.flush('eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJiYmVuZGVATklGSS5BUEFDSEUuT1JHIiwiaXNzIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwiYXVkIjoiS2VyYmVyb3NTcG5lZ29JZGVudGl0eVByb3ZpZGVyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYmJlbmRlQE5JRkkuQVBBQ0hFLk9SRyIsImtpZCI6IjQ3NWQwZWEyLTkzZGItNDhiNi05MjcxLTgyOGM3MzQ5ZTFkNiIsImlhdCI6MTUxMjQ4NTY4NywiZXhwIjoxNTEyNTI4ODg3fQ.lkaWPQw1ld7Qqb6-Zu8mAqu6r8mUVHBNP0ZfNpES3rA');
-
-        // Finally, assert that there are no outstanding requests.
-        httpMock.verify();
-    }));
-
-    it('should load jwt from local storage.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
-        // Spy
-        spyOn(nfRegistryApi.nfStorage, 'hasItem').and.callFake(function () {
-            return true;
-        });
-        spyOn(nfRegistryApi.nfStorage, 'getItem').and.callFake(function () {
-            return 123;
-        });
-
-        // api call
-        nfRegistryApi.ticketExchange().subscribe(function (response) {
-            expect(response).toBe(123);
-        });
-    }));
-
-    it('should fail to POST to exchange tickets.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
-        // Spy
-        spyOn(nfRegistryApi.nfStorage, 'hasItem').and.callFake(function () {
-            return false;
-        });
-        // api call
-        nfRegistryApi.ticketExchange().subscribe(function (response) {
-            expect(response).toEqual('');
-        });
-
-        // the request it made
-        req = httpMock.expectOne('/nifi-registry-api/access/token/kerberos');
-        expect(req.request.method).toEqual('POST');
-
-        // Next, fulfill the request by transmitting a response.
-        req.flush(null, {status: 401, statusText: 'POST exchange tickets mock 
error'});
-
-        // Finally, assert that there are no outstanding requests.
-        httpMock.verify();
-    }));
-
-    it('should GET to load the current user.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
-        // api call
-        nfRegistryApi.loadCurrentUser().subscribe(function (response) {
-            expect(response.identifier).toBe(123);
-            expect(response.identity).toBe('Admin User');
-        });
-
-        // the request it made
-        req = httpMock.expectOne('/nifi-registry-api/access');
-        expect(req.request.method).toEqual('GET');
-
-        // Next, fulfill the request by transmitting a response.
-        req.flush({
-            'identifier': 123,
-            'identity': 'Admin User'
-        });
-
-        // Finally, assert that there are no outstanding requests.
-        httpMock.verify();
-    }));
-
-    it('should fail to GET to load the current user.', 
ngCoreTesting.inject([ngCommonHttpTesting.HttpTestingController], function 
(httpMock) {
-        // Spy
-        spyOn(nfRegistryApi.router, 'navigateByUrl').and.callFake(function () 
{});
-
-        // api call
-        nfRegistryApi.loadCurrentUser().subscribe(function (response) {
-            var navigateByUrlCall = 
nfRegistryApi.router.navigateByUrl.calls.first();
-            expect(navigateByUrlCall.args[0]).toBe('/nifi-registry/login');
-        });
-
-        // the request it made
-        req = httpMock.expectOne('/nifi-registry-api/access');
-        expect(req.request.method).toEqual('GET');
-
-        // Next, fulfill the request by transmitting a response.
-        req.flush(null, {status: 401, statusText: 'GET current user mock 
error'});
-
-        // Finally, assert that there are no outstanding requests.
-        httpMock.verify();
-    }));
 });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js 
b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js
index 3b49ae1..d63277f 100644
--- a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js
+++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js
@@ -21,9 +21,7 @@ var fdsDialogsModule = 
require('@fluid-design-system/dialogs');
 var fdsSnackBarsModule = require('@fluid-design-system/snackbars');
 var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
-var rxjs = require('rxjs/Rx');
-require('rxjs/add/operator/catch');
-require('rxjs/add/operator/map');
+var rxjs = require('rxjs/Observable');
 
 /**
  * NfRegistryService constructor.
@@ -82,7 +80,7 @@ function NfRegistryService(nfRegistryApi, nfStorage, 
tdDataTableService, router,
             sortable: true
         },
         {
-            name: 'updated',
+            name: 'modifiedTimestamp',
             label: 'Updated',
             sortable: true
         }
@@ -121,6 +119,7 @@ function NfRegistryService(nfRegistryApi, nfStorage, 
tdDataTableService, router,
     this.autoCompleteUsersAndGroups = [];
     this.usersSearchTerms = [];
 
+    this.inProgress = false;
     //</editor-fold>
 };
 

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.spec.js 
b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.spec.js
index f44caa5..6668b60 100644
--- a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.spec.js
+++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.spec.js
@@ -18,7 +18,6 @@
 var NfRegistryRoutes = require('nifi-registry/nf-registry.routes.js');
 var ngCoreTesting = require('@angular/core/testing');
 var ngCommonHttpTesting = require('@angular/common/http/testing');
-var ngHttpTesting = require('@angular/http/testing');
 var ngCommon = require('@angular/common');
 var FdsDemo = 
require('nifi-registry/components/fluid-design-system/fds-demo.js');
 var NfRegistry = require('nifi-registry/nf-registry.js');
@@ -39,7 +38,6 @@ var NfRegistryBucketGridListViewer = 
require('nifi-registry/components/explorer/
 var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js');
 var fdsCore = require('@fluid-design-system/core');
 var ngMoment = require('angular2-moment');
-var ngHttp = require('@angular/http');
 var rxjs = require('rxjs/Rx');
 var fdsDialogsModule = require('@fluid-design-system/dialogs');
 var ngRouter = require('@angular/router');
@@ -49,8 +47,6 @@ var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.ser
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
 
 describe('NfRegistry Service isolated unit tests', function () {
-    var comp;
-    var fixture;
     var nfRegistryService;
 
     beforeEach(function () {
@@ -674,8 +670,6 @@ describe('NfRegistry Service isolated unit tests', function 
() {
 });
 
 describe('NfRegistry Service w/ Angular testing utils', function () {
-    var comp;
-    var fixture;
     var nfRegistryService;
     var nfRegistryApi;
 
@@ -683,8 +677,6 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         ngCoreTesting.TestBed.configureTestingModule({
             imports: [
                 ngMoment.MomentModule,
-                ngHttp.HttpModule,
-                ngHttp.JsonpModule,
                 ngCommonHttp.HttpClientModule,
                 fdsCore,
                 NfRegistryRoutes,
@@ -720,26 +712,14 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
                 {
                     provide: ngCommon.APP_BASE_HREF,
                     useValue: '/'
-                },
-                {
-                    provide: ngHttp.XHRBackend,
-                    useClass: ngHttpTesting.MockBackend
                 }
             ],
             bootstrap: [NfRegistry]
         });
-
-        fixture = 
ngCoreTesting.TestBed.createComponent(NfRegistryDropletGridListViewer);
-
-        // test instance
-        comp = fixture.componentInstance;
-
         // from the root injector
         nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
         nfRegistryApi = ngCoreTesting.TestBed.get(NfRegistryApi);
 
-        fixture.detectChanges();
-
         // Spy
         spyOn(nfRegistryApi.http, 'get').and.callFake(function () {
         });
@@ -751,7 +731,7 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         }).and.returnValue(rxjs.Observable.of({}));
     });
 
-    it('should retrieve the snapshot metadata for the given droplet.', 
ngCoreTesting.fakeAsync(function () {
+    it('should retrieve the snapshot metadata for the given droplet.', 
function () {
         //Spy
         spyOn(nfRegistryApi, 
'getDropletSnapshotMetadata').and.callFake(function () {
         }).and.returnValue(rxjs.Observable.of([{
@@ -764,12 +744,6 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         // The function to test
         nfRegistryService.getDropletSnapshotMetadata(droplet);
 
-        // wait for async getDropletSnapshotMetadata call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(droplet.snapshotMetadata[0].version).toBe(999);
         expect(nfRegistryApi.getDropletSnapshotMetadata).toHaveBeenCalled();
@@ -777,9 +751,9 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         var getDropletSnapshotMetadataCall = 
nfRegistryApi.getDropletSnapshotMetadata.calls.first()
         expect(getDropletSnapshotMetadataCall.args[0]).toBe('test/id');
         expect(getDropletSnapshotMetadataCall.args[1]).toBe(true);
-    }));
+    });
 
-    it('should execute the `delete` droplet action.', 
ngCoreTesting.fakeAsync(function () {
+    it('should execute the `delete` droplet action.', function () {
         //Setup the nfRegistryService state for this test
         nfRegistryService.droplets = [{identifier: 
'2e04b4fb-9513-47bb-aa74-1ae34616bfdc'}];
 
@@ -801,12 +775,6 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
             link: {href: 'testhref'}
         });
 
-        // wait for async nfRegistryApi.deleteDroplet call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(nfRegistryService.droplets.length).toBe(0);
         expect(nfRegistryService.filterDroplets).toHaveBeenCalled();
@@ -814,9 +782,9 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         expect(openConfirmCall.args[0].title).toBe('Delete testtype');
         var deleteDropletCall = nfRegistryApi.deleteDroplet.calls.first()
         expect(deleteDropletCall.args[0]).toBe('testhref');
-    }));
+    });
 
-    it('should filter droplets by name.', ngCoreTesting.fakeAsync(function () {
+    it('should filter droplets by name.', function () {
         //Setup the nfRegistryService state for this test
         nfRegistryService.dropletsSearchTerms = ['Flow #1'];
         nfRegistryService.droplets = [{
@@ -857,19 +825,13 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         // The function to test
         nfRegistryService.filterDroplets();
 
-        // wait for async nfRegistryApi.deleteDroplet call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(nfRegistryService.filteredDroplets.length).toBe(1);
         expect(nfRegistryService.filteredDroplets[0].name).toBe('Flow #1');
         expect(nfRegistryService.getAutoCompleteDroplets).toHaveBeenCalled();
-    }));
+    });
 
-    it('should filter droplets by `type:flow` (demonstrate ability to do 
advanced searching of a droplet by a property `name:value` pair).', 
ngCoreTesting.fakeAsync(function () {
+    it('should filter droplets by `type:flow` (demonstrate ability to do 
advanced searching of a droplet by a property `name:value` pair).', function () 
{
         //Setup the nfRegistryService state for this test
         nfRegistryService.dropletsSearchTerms = ['type:FLOW'];
         nfRegistryService.droplets = [{
@@ -910,19 +872,13 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         // The function to test
         nfRegistryService.filterDroplets();
 
-        // wait for async nfRegistryApi.deleteDroplet call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(nfRegistryService.filteredDroplets.length).toBe(1);
         expect(nfRegistryService.filteredDroplets[0].name).toBe('Flow #1');
         expect(nfRegistryService.getAutoCompleteDroplets).toHaveBeenCalled();
-    }));
+    });
 
-    it('should execute a `delete` action on a bucket.', 
ngCoreTesting.fakeAsync(function () {
+    it('should execute a `delete` action on a bucket.', function () {
         // from the root injector
         var dialogService = 
ngCoreTesting.TestBed.get(fdsDialogsModule.FdsDialogService);
 
@@ -947,25 +903,13 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         // The function to test
         nfRegistryService.executeBucketAction({name: 'delete'}, bucket);
 
-        // wait for async openConfirm call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
-        // wait for async deleteBucket call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(dialogService.openConfirm).toHaveBeenCalled();
         expect(nfRegistryApi.deleteBucket).toHaveBeenCalled();
         expect(nfRegistryService.filterBuckets).toHaveBeenCalled();
         expect(nfRegistryService.buckets.length).toBe(1);
         expect(nfRegistryService.buckets[0].identifier).toBe(1);
-    }));
+    });
 
     it('should execute a `permissions` action on a bucket.', function () {
         // from the root injector
@@ -986,7 +930,7 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         
expect(navigateByUrlCall.args[0]).toBe('/nifi-registry/administration/workflow(sidenav:bucket/permissions/999)');
     });
 
-    it('should execute a `delete` action on a user.', 
ngCoreTesting.fakeAsync(function () {
+    it('should execute a `delete` action on a user.', function () {
         // from the root injector
         var dialogService = 
ngCoreTesting.TestBed.get(fdsDialogsModule.FdsDialogService);
 
@@ -1011,25 +955,13 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         // The function to test
         nfRegistryService.executeUserAction({name: 'delete'}, user);
 
-        // wait for async openConfirm call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
-        // wait for async deleteBucket call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(dialogService.openConfirm).toHaveBeenCalled();
         expect(nfRegistryApi.deleteUser).toHaveBeenCalled();
         expect(nfRegistryService.filterUsersAndGroups).toHaveBeenCalled();
         expect(nfRegistryService.users.length).toBe(1);
         expect(nfRegistryService.users[0].identifier).toBe(1);
-    }));
+    });
 
     it('should execute a `permissions` action on a user.', function () {
         // from the root injector
@@ -1050,7 +982,7 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         
expect(navigateByUrlCall.args[0]).toBe('/nifi-registry/administration/users(sidenav:user/permissions/999)');
     });
 
-    it('should execute a `delete` action on a group.', 
ngCoreTesting.fakeAsync(function () {
+    it('should execute a `delete` action on a group.', function () {
         // from the root injector
         var dialogService = 
ngCoreTesting.TestBed.get(fdsDialogsModule.FdsDialogService);
 
@@ -1075,25 +1007,13 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         // The function to test
         nfRegistryService.executeGroupAction({name: 'delete'}, group);
 
-        // wait for async openConfirm call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
-        // wait for async deleteBucket call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(dialogService.openConfirm).toHaveBeenCalled();
         expect(nfRegistryApi.deleteUserGroup).toHaveBeenCalled();
         expect(nfRegistryService.filterUsersAndGroups).toHaveBeenCalled();
         expect(nfRegistryService.groups.length).toBe(1);
         expect(nfRegistryService.groups[0].identifier).toBe(1);
-    }));
+    });
 
     it('should execute a `permissions` action on a group.', function () {
         // from the root injector
@@ -1114,7 +1034,7 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         
expect(navigateByUrlCall.args[0]).toBe('/nifi-registry/administration/users(sidenav:group/permissions/999)');
     });
 
-    it('should filter buckets by name.', ngCoreTesting.fakeAsync(function () {
+    it('should filter buckets by name.', function () {
         //Setup the nfRegistryService state for this test
         nfRegistryService.bucketsSearchTerms = ['Bucket #1'];
         nfRegistryService.buckets = [{
@@ -1138,20 +1058,14 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         // The function to test
         nfRegistryService.filterBuckets();
 
-        // wait for async nfRegistryApi.deleteDroplet call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(nfRegistryService.filteredBuckets.length).toBe(1);
         expect(nfRegistryService.filteredBuckets[0].name).toBe('Bucket #1');
         expect(nfRegistryService.getAutoCompleteBuckets).toHaveBeenCalled();
         expect(nfRegistryService.isMultiBucketActionsDisabled).toBe(false);
-    }));
+    });
 
-    it('should filter users and groups by name.', 
ngCoreTesting.fakeAsync(function () {
+    it('should filter users and groups by name.', function () {
         //Setup the nfRegistryService state for this test
         nfRegistryService.usersSearchTerms = ['Group #1'];
         nfRegistryService.users = [{
@@ -1183,20 +1097,14 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         // The function to test
         nfRegistryService.filterUsersAndGroups();
 
-        // wait for async call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(nfRegistryService.filteredUsers.length).toBe(0);
         expect(nfRegistryService.filteredUserGroups.length).toBe(1);
         expect(nfRegistryService.filteredUserGroups[0].identity).toBe('Group 
#1');
         
expect(nfRegistryService.getAutoCompleteUserAndGroups).toHaveBeenCalled();
-    }));
+    });
 
-    it('should delete all selected buckets.', ngCoreTesting.fakeAsync(function 
() {
+    it('should delete all selected buckets.', function () {
         // from the root injector
         var dialogService = 
ngCoreTesting.TestBed.get(fdsDialogsModule.FdsDialogService);
 
@@ -1223,18 +1131,6 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         // The function to test
         nfRegistryService.deleteSelectedBuckets();
 
-        // wait for async openConfirm call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
-        // wait for async deleteBucket call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(dialogService.openConfirm).toHaveBeenCalled();
         expect(nfRegistryApi.deleteBucket).toHaveBeenCalled();
@@ -1245,9 +1141,9 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         expect(nfRegistryService.allBucketsSelected).toBe(false);
         expect(nfRegistryService.buckets.length).toBe(1);
         expect(nfRegistryService.buckets[0].identifier).toBe(1);
-    }));
+    });
 
-    it('should delete all selected users and groups.', 
ngCoreTesting.fakeAsync(function () {
+    it('should delete all selected users and groups.', function () {
         // from the root injector
         var dialogService = 
ngCoreTesting.TestBed.get(fdsDialogsModule.FdsDialogService);
 
@@ -1278,18 +1174,6 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         // The function to test
         nfRegistryService.deleteSelectedUsersAndGroups();
 
-        // wait for async openConfirm call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
-        // wait for async deleteBucket call
-        ngCoreTesting.tick();
-
-        //inform angular to detect changes
-        fixture.detectChanges();
-
         //assertions
         expect(dialogService.openConfirm).toHaveBeenCalled();
         expect(nfRegistryApi.deleteUserGroup).toHaveBeenCalled();
@@ -1303,5 +1187,5 @@ describe('NfRegistry Service w/ Angular testing utils', 
function () {
         expect(nfRegistryService.groups[0].identifier).toBe(1);
         expect(nfRegistryService.users.length).toBe(1);
         expect(nfRegistryService.users[0].identifier).toBe(12);
-    }));
+    });
 });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/a931858f/nifi-registry-web-ui/src/main/webapp/systemjs.builder.config.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/systemjs.builder.config.js 
b/nifi-registry-web-ui/src/main/webapp/systemjs.builder.config.js
index fa874e2..8d3073d 100644
--- a/nifi-registry-web-ui/src/main/webapp/systemjs.builder.config.js
+++ b/nifi-registry-web-ui/src/main/webapp/systemjs.builder.config.js
@@ -43,6 +43,8 @@
             '@angular/material': 
'npm:@angular/material/bundles/material.umd.js',
             '@angular/platform-browser/animations': 
'npm:@angular/platform-browser/bundles/platform-browser-animations.umd.js',
             '@angular/cdk': 'npm:@angular/cdk/bundles/cdk.umd.js',
+            '@angular/cdk/accordion': 
'npm:@angular/cdk/bundles/cdk-accordion.umd.js',
+            '@angular/cdk/layout': 
'npm:@angular/cdk/bundles/cdk-layout.umd.js',
             '@angular/cdk/a11y': 'npm:@angular/cdk/bundles/cdk-a11y.umd.js',
             '@angular/cdk/collections': 
'npm:@angular/cdk/bundles/cdk-collections.umd.js',
             '@angular/cdk/observers': 
'npm:@angular/cdk/bundles/cdk-observers.umd.js',

Reply via email to