nifi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bbe...@apache.org
Subject [2/4] nifi-registry git commit: NIFIREG-21 - Leverage REST API and add unit test coverage and update .travis.yml
Date Mon, 09 Oct 2017 16:26:06 GMT
http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/7b707a05/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js b/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js
index 7ed1206..bde863b 100644
--- a/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js
+++ b/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js
@@ -20,44 +20,73 @@ var ngCoreTesting = require('@angular/core/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');
+var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
 var NfRegistryService = require('nifi-registry/services/nf-registry.service.js');
 var NfPageNotFoundComponent = require('nifi-registry/components/page-not-found/nf-registry-page-not-found.js');
 var NfRegistryExplorer = require('nifi-registry/components/explorer/nf-registry-explorer.js');
-var NfRegistryExplorerGridListViewer = require('nifi-registry/components/explorer/grid-list/nf-registry-explorer-grid-list-viewer.js');
 var NfRegistryAdministration = require('nifi-registry/components/administration/nf-registry-administration.js');
 var NfRegistryGeneralAdministration = require('nifi-registry/components/administration/general/nf-registry-general-administration.js');
 var NfRegistryUsersAdministration = require('nifi-registry/components/administration/users/nf-registry-users-administration.js');
 var NfRegistryAddUser = require('nifi-registry/components/administration/users/add/nf-registry-add-user.js');
 var NfRegistryUserDetails = require('nifi-registry/components/administration/users/details/nf-registry-user-details.js');
 var NfRegistryUserPermissions = require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js');
-var NfRegistryBucketDetails = require('nifi-registry/components/administration/workflow/buckets/details/nf-registry-bucket-details.js');
 var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js');
 var NfRegistryWorkflowAdministration = require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js');
 var NfRegistryGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js');
-var NfRegistryBucketGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/bucket/nf-registry-bucket-grid-list-viewer.js');
-var NfRegistryDropletGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/bucket/droplet/nf-registry-droplet-grid-list-viewer.js');
+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 ngMoment = require('angular2-moment');
+var ngHttp = require('@angular/http');
 
 describe('NfRegistry Component', function () {
     var comp;
     var fixture;
 
-    beforeEach(ngCoreTesting.async(function () {
+    beforeEach(function () {
         ngCoreTesting.TestBed.configureTestingModule({
             imports: [
+                ngMoment.MomentModule,
+                ngHttp.HttpModule,
+                ngHttp.JsonpModule,
                 fdsCore,
                 NfRegistryRoutes
             ],
-            declarations: [FdsDemo, NfRegistry, NfRegistryExplorer, NfRegistryExplorerGridListViewer, NfRegistryAdministration, NfRegistryGeneralAdministration, NfRegistryUsersAdministration, NfRegistryUserDetails, NfRegistryUserPermissions, NfRegistryBucketDetails, NfRegistryBucketPermissions, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, NfRegistryBucketGridListViewer, NfRegistryDropletGridListViewer, NfPageNotFoundComponent],
-            providers: [NfRegistryService, {provide: ngCommon.APP_BASE_HREF, useValue: '/'}],
+            declarations: [
+                FdsDemo,
+                NfRegistry,
+                NfRegistryExplorer,
+                NfRegistryAdministration,
+                NfRegistryGeneralAdministration,
+                NfRegistryUsersAdministration,
+                NfRegistryUserDetails,
+                NfRegistryUserPermissions,
+                NfRegistryBucketPermissions,
+                NfRegistryAddUser,
+                NfRegistryWorkflowAdministration,
+                NfRegistryGridListViewer,
+                NfRegistryBucketGridListViewer,
+                NfRegistryDropletGridListViewer,
+                NfPageNotFoundComponent
+            ],
+            providers: [
+                NfRegistryService,
+                NfRegistryApi,
+                {
+                    provide: ngCommon.APP_BASE_HREF,
+                    useValue: '/'
+                }
+            ],
             bootstrap: [NfRegistry]
         });
-    }));
+    });
 
     it('should create component', function () {
         fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
         fixture.detectChanges();
         comp = fixture.componentInstance;
-        expect(comp).toBeDefined()
+
+        //assertions
+        expect(comp).toBeDefined();
     });
 });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/7b707a05/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
new file mode 100644
index 0000000..4738d42
--- /dev/null
+++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
@@ -0,0 +1,427 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file 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.
+ */
+
+var ngHttp = require('@angular/http');
+var fdsDialogsModule = require('@fluid-design-system/dialogs');
+var rxjs = require('rxjs/Rx');
+
+var headers = new Headers({'Content-Type': 'application/json'});
+
+/**
+ * NfRegistryApi constructor.
+ *
+ * @param Http                  The angular http module.
+ * @param FdsDialogService      The FDS dialog service.
+ * @constructor
+ */
+function NfRegistryApi(Http, FdsDialogService) {
+    this.http = Http;
+    this.dialogService = FdsDialogService;
+};
+
+NfRegistryApi.prototype = {
+    constructor: NfRegistryApi,
+
+    /**
+     * Retrieves the snapshot metadata for an existing droplet the registry has stored.
+     *
+     * If verbose is true, then the metadata about all snapshots for the droplet will also be returned.
+     *
+     * @param {string}  dropletType     The type of the droplet to request.
+     * @param {boolean} [verbose]       Flag to determine whether or not version children should be included in the response.
+     * @returns {*}
+     */
+    getDropletSnapshotMetadata: function (dropletUri, verbose) {
+        var self = this;
+        var url = '/nifi-registry-api/' + dropletUri;
+        if (verbose) {
+            url += '?verbose=true';
+        }
+        return this.http.get(url)
+            .map(function (response) {
+                return response.json().snapshotMetadata || [];
+            })
+            .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error._body,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+                return rxjs.Observable.throw(error._body);
+            });
+    },
+
+    /**
+     * Retrieves the given droplet with or without snapshot metadata.
+     *
+     * @param {string}  bucketId        The id of the bucket to request.
+     * @param {string}  dropletType     The type of the droplet to request.
+     * @param {string}  dropletId       The id of the droplet to request.
+     * @param {boolean} [verbose]       Flag to determine whether or not version children should be included in the response.
+     * @returns {*}
+     */
+    getDroplet: function (bucketId, dropletType, dropletId, verbose) {
+        var self = this;
+        var url = '/nifi-registry-api/buckets/' + bucketId + '/' + dropletType + '/' + dropletId;
+        if (verbose) {
+            url += '?verbose=true';
+        }
+        return this.http.get(url)
+            .map(function (response) {
+                return response.json() || {};
+            })
+            .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error._body,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+                return rxjs.Observable.throw(error._body);
+            });
+    },
+
+    /**
+     * Retrieves all droplets across all buckets (unless the `bucketId` is set then this will
+     * retrieve all droplets across that specific bucket). Droplets could include flows, extensions, etc.
+     *
+     * No snapshot metadata ever returned.
+     *
+     * @param {string} [bucketId] Defines a bucket id for filtering results.
+     * @returns {*}
+     */
+    getDroplets: function (bucketId) {
+        var self = this;
+        var url = '/nifi-registry-api/items';
+        if (bucketId) {
+            url += '/' + bucketId;
+        }
+        return this.http.get(url)
+            .map(function (response) {
+                return response.json() || [];
+            })
+            .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error._body,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+                return rxjs.Observable.throw(error._body);
+            });
+    },
+
+    /**
+     * Delete an existing droplet the registry has stored.
+     *
+     * @param {string} dropletUri    The portion of the URI describing the type of the droplet and its identifier
+     *
+     *  Ex:
+     *      'flows/1234'
+     *      'extension/5678'
+     *
+     * @returns {*}
+     */
+    deleteDroplet: function (dropletUri) {
+        var self = this;
+        return this.http.delete('/nifi-registry-api/' + dropletUri, headers)
+            .map(function (response) {
+                var body = response.json();
+                return response.json() || {};
+            })
+            .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error._body,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+                return rxjs.Observable.throw(error._body);
+            });
+    },
+
+    /**
+     * Create a named bucket capable of storing NiFi bucket objects (aka droplets) such as flows and extension bundles.
+     *
+     * @param {string} name  The name of the bucket.
+     * @returns {*}
+     */
+    createBucket: function (name) {
+        var self = this;
+        return this.http.post('/nifi-registry-api/buckets', {'name': name}, headers)
+            .map(function (response) {
+                var body = response.json();
+                return response.json() || {};
+            })
+            .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error._body,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+                return rxjs.Observable.throw(error._body);
+            });
+    },
+
+    /**
+     * Delete an existing bucket in the registry, along with all the objects it is storing.
+     *
+     * @param {string} bucketId     The identifier of the bucket to be deleted.
+     * @returns {*}
+     */
+    deleteBucket: function (bucketId) {
+        var self = this;
+        return this.http.delete('/nifi-registry-api/buckets/' + bucketId, headers)
+            .map(function (response) {
+                var body = response.json();
+                return response.json() || {};
+            })
+            .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error._body,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+                return rxjs.Observable.throw(error._body);
+            });
+    },
+
+    /**
+     * Get metadata for an existing bucket in the registry.
+     *
+     * If verbose is set to true, then each bucket will be returned with the
+     * set of items in the bucket, but any further children (version snapshot metadata)
+     * of those items will not be included.
+     *
+     * @param {string} bucketId     The identifier of the bucket to retrieve.
+     * @param {bool} [verbose]      Flag indicating whether to include the set of items
+     *                              (NiFi bucket objects such as flows and extension
+     *                              bundles...otherwise known as droplets) in the bucket.
+     * @returns {*}
+     */
+    getBucket: function (bucketId, verbose) {
+        var self = this;
+        var url = '/nifi-registry-api/buckets/' + bucketId;
+        if (verbose) {
+            url += '?verbose=true';
+        }
+        return this.http.get(url)
+            .map(function (response) {
+                return response.json() || {};
+            })
+            .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error._body,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+                return rxjs.Observable.throw(error._body);
+            });
+    },
+
+    /**
+     * Get metadata for all buckets in the registry for which the client is authorized.
+     *
+     * NOTE: Information about the items stored in each bucket should be obtained by
+     * requesting and individual bucket by id.
+     *
+     * @returns {*}
+     */
+    getBuckets: function () {
+        var self = this;
+        var url = '/nifi-registry-api/buckets';
+        return this.http.get(url)
+            .map(function (response) {
+                var body = response.json();
+                return response.json() || [];
+            })
+            .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error._body,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+                return rxjs.Observable.throw(error._body);
+            });
+    },
+
+    //TODO: REST call to API to get user by id.
+    getUser: function (userId) {
+        var self = this;
+        return this.http.get('/nifi-registry-api/users/' + userId)
+            .map(function (response) {
+                return response.json() || {};
+            })
+            .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error._body,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+                return rxjs.Observable.throw(error._body);
+            });
+    },
+
+    //TODO: REST call to API to get users.
+    getUsers: function (userIds, bucketId) {
+        var self = this;
+        return new Promise(
+            function (resolve) {
+                resolve([{
+                    id: '23f6cc59-0156-1000-06b4-2b0810089090',
+                    name: 'Scotty 2 Hotty',
+                    status: 'authorized',
+                    provider: 'Friendly LDAP Provider',
+                    type: 'user',
+                    activities: [{
+                        id: '25fd6vv87-3249-0001-05g6-4d4767890765',
+                        description: 'Saved something...',
+                        created: new Date().setDate(new Date().getDate() - 1),
+                        updated: new Date()
+                    }],
+                    actions: [{
+                        'name': 'details',
+                        'icon': 'fa fa-info-circle',
+                        'tooltip': 'User Details',
+                        'type': 'sidenav',
+
+                    }, {
+                        'name': 'permissions',
+                        'icon': 'fa fa-key',
+                        'tooltip': 'Manage User Policies',
+                        'type': 'sidenav'
+                    }, {
+                        'name': 'Delete',
+                        'icon': 'fa fa-trash',
+                        'tooltip': 'Delete User'
+                    }, {
+                        'name': 'Suspend',
+                        'icon': 'fa fa-ban',
+                        'tooltip': 'Suspend User'
+                    }]
+                }, {
+                    id: '25fd6vv87-3249-0001-05g6-4d4767890765',
+                    name: 'Group 1',
+                    status: 'suspended',
+                    provider: 'IOAT',
+                    type: 'group',
+                    actions: [{
+                        'name': 'details',
+                        'icon': 'fa fa-info-circle',
+                        'tooltip': 'User Details',
+                        'type': 'sidenav'
+                    }, {
+                        'name': 'permissions',
+                        'icon': 'fa fa-key',
+                        'tooltip': 'Manage User Policies',
+                        'type': 'sidenav'
+                    }, {
+                        'name': 'Delete',
+                        'icon': 'fa fa-trash',
+                        'tooltip': 'Delete User'
+                    }, {
+                        'name': 'Reauthorize',
+                        'icon': 'fa fa-check-circle',
+                        'tooltip': 'Reauthorize User'
+                    }]
+                }, {
+                    id: '98f6cc59-0156-1000-06b4-2b0810089090',
+                    name: 'G$',
+                    status: 'authorized',
+                    provider: 'Friendly LDAP Provider',
+                    type: 'user',
+                    actions: [{
+                        'name': 'details',
+                        'icon': 'fa fa-info-circle',
+                        'tooltip': 'User Details',
+                        'type': 'sidenav'
+                    }, {
+                        'name': 'permissions',
+                        'icon': 'fa fa-key',
+                        'tooltip': 'Manage User Policies',
+                        'type': 'sidenav'
+                    }, {
+                        'name': 'Delete',
+                        'icon': 'fa fa-trash',
+                        'tooltip': 'Delete User'
+                    }, {
+                        'name': 'Suspend',
+                        'icon': 'fa fa-ban',
+                        'tooltip': 'Suspend User'
+                    }]
+                }, {
+                    id: '65fd6vv87-3249-0001-05g6-4d4767890765',
+                    name: 'Group 2',
+                    status: 'suspended',
+                    provider: 'IOAT',
+                    type: 'group',
+                    actions: [{
+                        'name': 'details',
+                        'icon': 'fa fa-info-circle',
+                        'tooltip': 'User Details',
+                        'type': 'sidenav'
+                    }, {
+                        'name': 'permissions',
+                        'icon': 'fa fa-key',
+                        'tooltip': 'Manage User Policies',
+                        'type': 'sidenav'
+                    }, {
+                        'name': 'Delete',
+                        'icon': 'fa fa-trash',
+                        'tooltip': 'Delete User'
+                    }, {
+                        'name': 'Reauthorize',
+                        'icon': 'fa fa-check-circle',
+                        'tooltip': 'Reauthorize User'
+                    }]
+                }]);
+            });
+        // return this.http.get('/nifi-registry-api/users/?bucket=' + bucketId)
+        //     .map(function (response) {
+        //         return response.json() || [];
+        //     })
+        //     .catch(function (error) {
+        //     self.dialogService.openConfirm({
+        //         title: 'Error',
+        //         message: error._body,
+        //         acceptButton: 'Ok',
+        //         acceptButtonColor: 'fds-warn'
+        //     });
+        //     return rxjs.Observable.throw(error._body);
+        // });
+    },
+
+    //TODO: REST call to API to delete user by id.
+    deleteUser: function (id) {
+        var self = this;
+    },
+
+    //TODO: REST call to API to suspend user by id.
+    suspendUser: function (id) {
+        var self = this;
+    }
+};
+
+NfRegistryApi.parameters = [ngHttp.Http, fdsDialogsModule.FdsDialogService];
+
+module.exports = NfRegistryApi;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/7b707a05/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
new file mode 100644
index 0000000..7bc869e
--- /dev/null
+++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js
@@ -0,0 +1,538 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the 'License'); you may not use this file 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.
+ */
+
+var NfRegistryRoutes = require('nifi-registry/nf-registry.routes.js');
+var ngCoreTesting = require('@angular/core/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');
+var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
+var NfRegistryService = require('nifi-registry/services/nf-registry.service.js');
+var NfPageNotFoundComponent = require('nifi-registry/components/page-not-found/nf-registry-page-not-found.js');
+var NfRegistryExplorer = require('nifi-registry/components/explorer/nf-registry-explorer.js');
+var NfRegistryAdministration = require('nifi-registry/components/administration/nf-registry-administration.js');
+var NfRegistryGeneralAdministration = require('nifi-registry/components/administration/general/nf-registry-general-administration.js');
+var NfRegistryUsersAdministration = require('nifi-registry/components/administration/users/nf-registry-users-administration.js');
+var NfRegistryAddUser = require('nifi-registry/components/administration/users/add/nf-registry-add-user.js');
+var NfRegistryUserDetails = require('nifi-registry/components/administration/users/details/nf-registry-user-details.js');
+var NfRegistryUserPermissions = require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js');
+var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js');
+var NfRegistryWorkflowAdministration = require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js');
+var NfRegistryGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js');
+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 ngMoment = require('angular2-moment');
+var ngHttp = require('@angular/http');
+
+describe('NfRegistry Service API w/ Angular testing utils', function () {
+    var comp;
+    var fixture;
+    var nfRegistryService;
+
+    beforeEach(function () {
+        ngCoreTesting.TestBed.configureTestingModule({
+            imports: [
+                ngMoment.MomentModule,
+                ngHttp.HttpModule,
+                ngHttp.JsonpModule,
+                fdsCore,
+                NfRegistryRoutes
+            ],
+            declarations: [
+                FdsDemo,
+                NfRegistry,
+                NfRegistryExplorer,
+                NfRegistryAdministration,
+                NfRegistryGeneralAdministration,
+                NfRegistryUsersAdministration,
+                NfRegistryUserDetails,
+                NfRegistryUserPermissions,
+                NfRegistryBucketPermissions,
+                NfRegistryAddUser,
+                NfRegistryWorkflowAdministration,
+                NfRegistryGridListViewer,
+                NfRegistryBucketGridListViewer,
+                NfRegistryDropletGridListViewer,
+                NfPageNotFoundComponent
+            ],
+            providers: [
+                NfRegistryService,
+                NfRegistryApi,
+                {
+                    provide: ngCommon.APP_BASE_HREF,
+                    useValue: '/'
+                },
+                {
+                    provide: ngHttp.XHRBackend,
+                    useClass: ngHttpTesting.MockBackend
+                }
+            ],
+            bootstrap: [NfRegistry]
+        });
+    });
+
+    it('should GET droplet snapshot metadata (verbose = true).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'get').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = {
+            snapshotMetadata: [
+                {bucketIdentifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', version: 999}
+            ]
+        };
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.getDropletSnapshotMetadata('flow/test', true).subscribe(function (snapshotMetadata) {
+            //assertions
+            expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/flow/test?verbose=true');
+            expect(snapshotMetadata.length).toBe(1);
+            expect(snapshotMetadata[0].bucketIdentifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
+            expect(snapshotMetadata[0].version).toEqual(999);
+        });
+    }));
+
+    it('should GET droplet snapshot metadata (verbose = false).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'get').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = {
+            snapshotMetadata: [
+                {bucketIdentifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', version: 999}
+            ]
+        };
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.getDropletSnapshotMetadata('flow/test', false).subscribe(function (snapshotMetadata) {
+            //assertions
+            expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/flow/test');
+            expect(snapshotMetadata.length).toBe(1);
+            expect(snapshotMetadata[0].bucketIdentifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
+            expect(snapshotMetadata[0].version).toEqual(999);
+        });
+    }));
+
+    it('should GET droplet by type and ID (verbose = false).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'get').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = {
+            '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'
+            }
+        };
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.getDroplet('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', 'flows', '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', false).subscribe(function (droplet) {
+            //assertions
+            expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/buckets/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc/flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc');
+            expect(droplet.identifier).toEqual('2e04b4fb-9513-47bb-aa74-1ae34616bfdc');
+            expect(droplet.type).toEqual('FLOW');
+            expect(droplet.name).toEqual('Flow #1');
+        });
+    }));
+
+    it('should GET droplet by type and ID (verbose = true).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'get').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = {
+            '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'
+            }
+        };
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.getDroplet('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', 'flows', '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', true).subscribe(function (droplet) {
+            //assertions
+            expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/buckets/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc/flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc?verbose=true');
+            expect(droplet.identifier).toEqual('2e04b4fb-9513-47bb-aa74-1ae34616bfdc');
+            expect(droplet.type).toEqual('FLOW');
+            expect(droplet.name).toEqual('Flow #1');
+        });
+    }));
+
+    it('should GET all droplets across all buckets.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'get').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = [{
+            'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
+            'name': 'Flow #1',
+            'description': 'This is flow #1',
+            'bucketIdentifier': '9q7f9e54-dc09-4ceb-aa58-9fe581319cdc',
+            'createdTimestamp': 1505931890999,
+            'modifiedTimestamp': 1505931890999,
+            'type': 'FLOW',
+            'snapshotMetadata': null,
+            'link': {
+                'params': {
+                    'rel': 'self'
+                },
+                'href': 'flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc'
+            }
+        }, {
+            'identifier': '5d04b4fb-9513-47bb-aa74-1ae34616bfdc',
+            'name': 'Flow #2',
+            'description': 'This is flow #2',
+            'bucketIdentifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
+            'createdTimestamp': 1505931890999,
+            'modifiedTimestamp': 1505931890999,
+            'type': 'FLOW',
+            'snapshotMetadata': null,
+            'link': {
+                'params': {
+                    'rel': 'self'
+                },
+                'href': 'flows/5d04b4fb-9513-47bb-aa74-1ae34616bfdc'
+            }
+        }];
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.getDroplets().subscribe(function (droplets) {
+            //assertions
+            expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/items');
+            expect(droplets.length).toBe(2);
+            expect(droplets[0].bucketIdentifier).toEqual('9q7f9e54-dc09-4ceb-aa58-9fe581319cdc');
+            expect(droplets[1].bucketIdentifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
+            expect(droplets[0].name).toEqual('Flow #1');
+            expect(droplets[1].name).toEqual('Flow #2');
+        });
+    }));
+
+    it('should GET all droplets across a single bucket.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'get').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = [{
+            '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'
+            }
+        }];
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.getDroplets('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc').subscribe(function (droplets) {
+            //assertions
+            expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/items/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
+            expect(droplets.length).toBe(1);
+            expect(droplets[0].bucketIdentifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
+            expect(droplets[0].name).toEqual('Flow #1');
+        });
+    }));
+
+    it('should DELETE a droplet.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'delete').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = {};
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.deleteDroplet('flows/1234').subscribe(function () {
+            //assertions
+            var deleteDropletCall = nfRegistryService.api.http.delete.calls.first()
+            expect(deleteDropletCall.args[0]).toBe('/nifi-registry-api/flows/1234');
+        });
+    }));
+
+    it('should POST to create a new bucket.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'post').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = {
+            identifier: '1234'
+        };
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.createBucket('test').subscribe(function (bucket) {
+            //assertions
+            var createDropletCall = nfRegistryService.api.http.post.calls.first();
+            expect(createDropletCall.args[0]).toBe('/nifi-registry-api/buckets');
+            expect(createDropletCall.args[1].name).toBe('test');
+            expect(bucket.identifier).toBe('1234');
+        });
+    }));
+
+    it('should DELETE a bucket.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'delete').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = {};
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.deleteBucket('1234').subscribe(function () {
+            //assertions
+            var deleteBucketCall = nfRegistryService.api.http.delete.calls.first()
+            expect(deleteBucketCall.args[0]).toBe('/nifi-registry-api/buckets/1234');
+        });
+    }));
+
+    it('should GET bucket by ID (verbose = false).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'get').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = {
+            'identifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
+            'name': 'Bucket #1'
+        };
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.getBucket('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', false).subscribe(function (bucket) {
+            //assertions
+            expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/buckets/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
+            expect(bucket.identifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
+            expect(bucket.name).toEqual('Bucket #1');
+        });
+    }));
+
+    it('should GET bucket by ID (verbose = true).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'get').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = {
+            'identifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
+            'name': 'Bucket #1'
+        };
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.getBucket('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', true).subscribe(function (bucket) {
+            //assertions
+            expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/buckets/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc?verbose=true');
+            expect(bucket.identifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
+            expect(bucket.name).toEqual('Bucket #1');
+        });
+    }));
+
+    it('should GET metadata for all buckets in the registry for which the client is authorized.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) {
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistry);
+        fixture.detectChanges();
+        comp = fixture.componentInstance;
+
+        // NfRegistryService from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+
+        //Spy
+        spyOn(nfRegistryService.api.http, 'get').and.callThrough();
+
+        //Setup the mock backend to return mock data
+        var mockResponse = [{
+            'identifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
+            'name': 'Bucket #1'
+        }];
+        mockBackend.connections.subscribe(function (connection) {
+            // This is called every time someone subscribes to an http call
+            connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({
+                body: JSON.stringify(mockResponse)
+            })));
+        });
+
+        // The function to test
+        nfRegistryService.api.getBuckets().subscribe(function (buckets) {
+            //assertions
+            expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/buckets');
+            expect(buckets[0].identifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
+            expect(buckets[0].name).toEqual('Bucket #1');
+        });
+    }));
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/7b707a05/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 55f58d1..308db56 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
@@ -16,6 +16,11 @@
  */
 
 var covalentCore = require('@covalent/core');
+var ngRouter = require('@angular/router');
+var fdsDialogsModule = require('@fluid-design-system/dialogs');
+var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
+require('rxjs/add/operator/catch');
+require('rxjs/add/operator/map');
 
 function filterData(data, searchTerm, ignoreCase) {
     var field = '';
@@ -28,28 +33,12 @@ function filterData(data, searchTerm, ignoreCase) {
     if (filter) {
         data = data.filter(function (item) {
             var res = Object.keys(item).find(function (key) {
-                if (field.indexOf(".") > -1) {
-                    var objArray = field.split(".");
-                    var obj = item;
-                    var arrayLength = objArray.length;
-                    for (var i = 0; i < arrayLength; i++) {
-                        try {
-                            obj = obj[objArray[i]];
-                        } catch (e) {
-                            return false;
-                        }
-                    }
-                    var preItemValue = ('' + obj);
-                    var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;
-                    return itemValue.indexOf(filter) > -1;
-                } else {
-                    if (key !== field && field !== '') {
-                        return false;
-                    }
-                    var preItemValue = ('' + item[key]);
-                    var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;
-                    return itemValue.indexOf(filter) > -1;
+                if (key !== field && field !== '') {
+                    return false;
                 }
+                var preItemValue = ('' + item[key]);
+                var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;
+                return itemValue.indexOf(filter) > -1;
             });
             return !(typeof res === 'undefined');
         });
@@ -57,14 +46,26 @@ function filterData(data, searchTerm, ignoreCase) {
     return data;
 };
 
-function NfRegistryService(TdDataTableService) {
-    this.registries = [];
-    this.registry = {};
+/**
+ * NfRegistryService constructor.
+ *
+ * @param TdDataTableService    The covalent data table service module.
+ * @param NfRegistryApi         The registry API module.
+ * @param Router                The angular router module.
+ * @param FdsDialogService      The FDS dialog service.
+ * @constructor
+ */
+function NfRegistryService(TdDataTableService, NfRegistryApi, Router, FdsDialogService) {
+    this.router = Router;
+    this.dialogService = FdsDialogService;
+    this.registry = {
+        name: "Nifi Registry"
+    };
+    this.api = NfRegistryApi;
     this.bucket = {};
     this.buckets = [];
     this.droplet = {};
     this.droplets = [];
-    this.certifications = [];
     this.user = {};
     this.users = [];
     this.alerts = [];
@@ -110,386 +111,25 @@ function NfRegistryService(TdDataTableService) {
     this.usersCurrentPage = 1;
     this.usersPageSize = 5;
     this.usersPageCount = 0;
-
-    this.filteredCertifications = [];
-
-    this.certificationColumns = [
-        {name: 'name', label: 'Label Name', sortable: true, tooltip: 'Sort Certifications by name.', width: 40},
-        {name: 'usage', label: 'Usage', sortable: true, tooltip: 'Sort Certifications by usage.', width: 30},
-        {name: 'badge', label: 'Badge Design', sortable: false, tooltip: 'Certification badge.', width: 30}
-    ];
-
-    this.autoCompleteCertifications = [];
-    this.certificationsSearchTerms = [];
 };
 
 NfRegistryService.prototype = {
     constructor: NfRegistryService,
 
-    deleteDroplet: function (id) {
-        //TODO: REST call to API to delete droplet by id.
-    },
-
-    deleteBucket: function (id) {
-        //TODO: REST call to API to delete bucket by id.
-    },
-
-    deleteUser: function (id) {
-        //TODO: REST call to API to delete user by id.
-    },
-
-    suspendUser: function (id) {
-        //TODO: REST call to API to suspend user by id.
-    },
-
-    getRegistries: function () {
-        //TODO: leverage $http service to make call to nifi registry api. For now just return mock data...
-        var self = this;
-        var date = new Date();
-        return new Promise(
-            function (resolve) {
-                setTimeout(
-                    function () {
-                        resolve(self.registries = [{
-                            id: '23f6cc59-0156-1000-06b4-2b0810089090',
-                            name: "Nifi Registry",
-                            users: [{
-                                id: '23f6cc59-0156-1000-06b4-2b0810089090',
-                                name: 'Scotty 2 Hotty',
-                                status: 'authorized',
-                                provider: 'Friendly LDAP Provider',
-                                type: 'user',
-                                activities: [{
-                                    id: '25fd6vv87-3249-0001-05g6-4d4767890765',
-                                    description: 'Saved something...',
-                                    created: date.setDate(date.getDate() - 1),
-                                    updated: new Date()
-                                }],
-                                actions: [{
-                                    'name': 'details',
-                                    'icon': 'fa fa-info-circle',
-                                    'tooltip': 'User Details',
-                                    'type': 'sidenav',
-
-                                }, {
-                                    'name': 'permissions',
-                                    'icon': 'fa fa-key',
-                                    'tooltip': 'Manage User Policies',
-                                    'type': 'sidenav'
-                                }, {
-                                    'name': 'Delete',
-                                    'icon': 'fa fa-trash',
-                                    'tooltip': 'Delete User'
-                                }, {
-                                    'name': 'Suspend',
-                                    'icon': 'fa fa-ban',
-                                    'tooltip': 'Suspend User'
-                                }]
-                            }, {
-                                id: '25fd6vv87-3249-0001-05g6-4d4767890765',
-                                name: 'Group 1',
-                                status: 'suspended',
-                                provider: 'IOAT',
-                                type: 'group',
-                                actions: [{
-                                    'name': 'details',
-                                    'icon': 'fa fa-info-circle',
-                                    'tooltip': 'User Details',
-                                    'type': 'sidenav'
-                                }, {
-                                    'name': 'permissions',
-                                    'icon': 'fa fa-key',
-                                    'tooltip': 'Manage User Policies',
-                                    'type': 'sidenav'
-                                }, {
-                                    'name': 'Delete',
-                                    'icon': 'fa fa-trash',
-                                    'tooltip': 'Delete User'
-                                }, {
-                                    'name': 'Reauthorize',
-                                    'icon': 'fa fa-check-circle',
-                                    'tooltip': 'Reauthorize User'
-                                }]
-                            }, {
-                                id: '98f6cc59-0156-1000-06b4-2b0810089090',
-                                name: 'G$',
-                                status: 'authorized',
-                                provider: 'Friendly LDAP Provider',
-                                type: 'user',
-                                actions: [{
-                                    'name': 'details',
-                                    'icon': 'fa fa-info-circle',
-                                    'tooltip': 'User Details',
-                                    'type': 'sidenav'
-                                }, {
-                                    'name': 'permissions',
-                                    'icon': 'fa fa-key',
-                                    'tooltip': 'Manage User Policies',
-                                    'type': 'sidenav'
-                                }, {
-                                    'name': 'Delete',
-                                    'icon': 'fa fa-trash',
-                                    'tooltip': 'Delete User'
-                                }, {
-                                    'name': 'Suspend',
-                                    'icon': 'fa fa-ban',
-                                    'tooltip': 'Suspend User'
-                                }]
-                            }, {
-                                id: '65fd6vv87-3249-0001-05g6-4d4767890765',
-                                name: 'Group 2',
-                                status: 'suspended',
-                                provider: 'IOAT',
-                                type: 'group',
-                                actions: [{
-                                    'name': 'details',
-                                    'icon': 'fa fa-info-circle',
-                                    'tooltip': 'User Details',
-                                    'type': 'sidenav'
-                                }, {
-                                    'name': 'permissions',
-                                    'icon': 'fa fa-key',
-                                    'tooltip': 'Manage User Policies',
-                                    'type': 'sidenav'
-                                }, {
-                                    'name': 'Delete',
-                                    'icon': 'fa fa-trash',
-                                    'tooltip': 'Delete User'
-                                }, {
-                                    'name': 'Reauthorize',
-                                    'icon': 'fa fa-check-circle',
-                                    'tooltip': 'Reauthorize User'
-                                }]
-                            }],
-                            buckets: [{
-                                id: '25fd6vv87-3549-0001-05g6-4d4567890765',
-                                name: "My Flows",
-                                actions: [{
-                                    'name': 'permissions',
-                                    'icon': 'fa fa-key',
-                                    'tooltip': 'Manage Bucket Policies',
-                                    'type': 'sidenav'
-                                }, {
-                                    'name': 'Delete',
-                                    'icon': 'fa fa-trash',
-                                    'tooltip': 'Delete Bucket'
-                                }],
-                                droplets: [{
-                                    id: '23f6cc59-0156-1000-09b4-2b0610089090',
-                                    name: "Security_Dev_Ops",
-                                    displayName: 'Security Dev Ops',
-                                    type: 'Data Flow',
-                                    sublabel: 'Some info',
-                                    updated: new Date(),
-                                    description: 'This is the most secure flow ever!',
-                                    versions: [{
-                                        id: '23f6cc59-0156-1000-06b4-2b0810089090',
-                                        revision: '1',
-                                        dependentFlows: [{
-                                            id: '25fd6vv87-3549-0001-05g6-4d4567890765'
-                                        }],
-                                        author: '2Hot',
-                                        comment: 'delete ListenHttp',
-                                        created: new Date(date.setDate(date.getDate() - 1)),
-                                        updated: new Date()
-                                    }, {
-                                        id: '25fd6vv87-3549-0001-05g6-4d4567890765',
-                                        revision: '2',
-                                        dependentFlows: [{
-                                            id: '23f6cc59-0156-1000-06b4-2b0810089090'
-                                        }],
-                                        author: '2Hot',
-                                        comment: 'added Labels for better description of groups of processors',
-                                        created: new Date(),
-                                        updated: new Date()
-                                    }],
-                                    flows: [],
-                                    extensions: [],
-                                    assets: [],
-                                    actions: [{
-                                        'name': 'Delete',
-                                        'icon': 'fa fa-close',
-                                        'tooltip': 'Delete User'
-                                    }]
-                                }]
-                            }, {
-                                id: '23f6cc59-0156-1000-09b4-2b0810089080',
-                                name: "Development Flows",
-                                droplets: [{
-                                    id: '23f6cc59-0156-1000-09b4-2b0610089090',
-                                    name: "Fraud Detection Flow",
-                                    displayName: 'Fraud Detection Flow',
-                                    type: 'Data Flow',
-                                    sublabel: 'A sublabel',
-                                    updated: new Date(date.setDate(date.getDate() - 2)),
-                                    description: 'This flow detects fraud!',
-                                    versions: [{
-                                        id: '23f6cc59-0156-1000-06b4-2b0810089090',
-                                        revision: '1',
-                                        dependentFlows: [{
-                                            id: '25fd6vv87-3549-0001-05g6-4d4567890765'
-                                        }],
-                                        author: 'G$',
-                                        comment: 'added funnel',
-                                        created: new Date(date.setDate(date.getDate() - 1)),
-                                        updated: new Date()
-                                    }, {
-                                        id: '25fd6vv87-3549-0001-05g6-4d4567890765',
-                                        revision: '2',
-                                        dependentFlows: [{
-                                            id: '23f6cc59-0156-1000-06b4-2b0810089090'
-                                        }],
-                                        author: '2Hot',
-                                        comment: 'added Execute script',
-                                        created: new Date(date.setDate(date.getDate() - 1)),
-                                        updated: new Date()
-                                    }, {
-                                        id: '77fd6vv87-3549-0001-05g6-4d4567890765',
-                                        revision: '3',
-                                        dependentFlows: [{
-                                            id: '23f6cc59-0156-1000-06b4-2b0810089090'
-                                        }],
-                                        author: 'Payne',
-                                        comment: 'removed Execute script',
-                                        created: new Date(date.setDate(date.getDate() - 1)),
-                                        updated: new Date()
-                                    }, {
-                                        id: '96fd6vv87-3549-0001-05g6-4d4567890765',
-                                        revision: '4',
-                                        dependentFlows: [{
-                                            id: '23f6cc59-0156-1000-06b4-2b0810089090'
-                                        }],
-                                        author: 'G$',
-                                        comment: 'add Execute script',
-                                        created: new Date(date.setDate(date.getDate() - 1)),
-                                        updated: new Date()
-                                    }],
-                                    flows: [],
-                                    extensions: [],
-                                    assets: [],
-                                    actions: [{
-                                        'name': 'Delete',
-                                        'icon': 'fa fa-close'
-                                    }]
-                                }, {
-                                    id: '59f6cc23-0156-1000-09b4-2b0610089090',
-                                    name: "Cyber Security",
-                                    displayName: 'Cyber Security',
-                                    type: 'Data Flow',
-                                    sublabel: 'A sublabel',
-                                    updated: new Date(date.setDate(date.getDate() - 1)),
-                                    description: 'This is the most cyber secure flow ever!',
-                                    versions: [{
-                                        id: '23f6cc59-0156-1000-06b4-2b0810089090',
-                                        revision: '1',
-                                        dependentFlows: [{
-                                            id: '25fd6vv87-3549-0001-05g6-4d4567890765'
-                                        }],
-                                        author: 'G$',
-                                        comment: 'added funnel',
-                                        created: new Date(date.setDate(date.getDate() - 1)),
-                                        updated: new Date()
-                                    }],
-                                    flows: [],
-                                    extensions: [],
-                                    assets: [],
-                                    actions: [{
-                                        'name': 'Delete',
-                                        'icon': 'fa fa-close',
-                                        'tooltip': 'Delete User'
-                                    }]
-                                }],
-                                actions: [{
-                                    'name': 'permissions',
-                                    'icon': 'fa fa-key',
-                                    'tooltip': 'Manage Bucket Policies',
-                                    'type': 'sidenav'
-                                }, {
-                                    'name': 'Delete',
-                                    'icon': 'fa fa-trash',
-                                    'tooltip': 'Delete Bucket'
-                                }]
-                            }] // some data model for the contents of a registry
-                        }])
-                    }, 0);
-            }
-        );
-    },
-
-    getRegistry: function (registryId) {
-        return this.getRegistries().then(
-            function (registries) {
-                return registries.find(
-                    function (registry) {
-                        if (registryId === registry.id) {
-                            return registry;
-                        }
-                    });
-            });
-    },
-
-    getDroplet: function (registryId, bucketId, dropletId) {
-        return this.getDroplets(registryId, bucketId, dropletId).then(
-            function (droplets) {
-                return droplets[0];
-            });
-    },
-
-    getDroplets: function (registryIds, bucketIds, dropletIds) {
-        var self = this;
-        return this.getRegistries().then(
-            function (registries) {
-                var buckets = [];
-
-                registries.find(
-                    function (registry) {
-                        if (registryIds === undefined || registryIds.indexOf(registry.id) >= 0) {
-                            registry.buckets.find(
-                                function (bucket) {
-                                    if (bucketIds === undefined || bucketIds.indexOf(bucket.id) >= 0) {
-                                        buckets.push(bucket);
-                                    }
-                                });
-                        }
-                    });
-
-                var droplets = [];
-
-                buckets.find(
-                    function (bucket) {
-                        bucket.droplets.find(
-                            function (droplet) {
-                                if (dropletIds === undefined || dropletIds.indexOf(droplet.id) >= 0) {
-                                    droplets.push(droplet);
-                                }
-                            });
-                    });
-
-                return droplets;
-            });
-
-    },
-
-    isDropletFilterChecked: function (term) {
-        return (this.dropletsSearchTerms.indexOf(term) > -1);
-    },
-
-    getDropletTypeCount: function (type) {
-        return this.filteredDroplets.filter(function (droplet) {
-            return droplet.type === type;
-        }).length;
-    },
-
-    getDropletCertificationCount: function (certification) {
-        return this.filteredDroplets.filter(function (droplet) {
-            return Object.keys(droplet).find(function (key) {
-                if (key === certification && droplet[certification].type === 'certification') {
-                    return droplet;
-                }
-            });
-        }).length;
+    /**
+     * Set the state for the breadcrumb animations.
+     *
+     * @param {string} state The state. Valid values are 'in' or 'out'.
+     */
+    setBreadcrumbState: function (state) {
+        this.breadCrumbState = state;
     },
 
+    /**
+     * Gets the droplet grid-list explorer component's active sorting column display label.
+     *
+     * @returns {string}
+     */
     getSortByLabel: function () {
         var sortByColumn;
         var arrayLength = this.dropletColumns.length;
@@ -514,6 +154,12 @@ NfRegistryService.prototype = {
         }
     },
 
+    /**
+     * Generates the droplet grid-list explorer component's sorting menu options.
+     *
+     * @param col   One of the available `dropletColumns`.
+     * @returns {string}
+     */
     generateSortMenuLabels: function (col) {
         var label = '';
         switch (col.label) {
@@ -527,57 +173,78 @@ NfRegistryService.prototype = {
         return label;
     },
 
-    sortDroplets: function (sortEvent, column) {
+    /**
+     * Execute the given droplet action.
+     *
+     * @param action        The action object.
+     * @param droplet       The droplet object the `action` will act upon.
+     */
+    executeDropletAction: function (action, droplet) {
+        var self = this;
+        if (action.name.toLowerCase() === 'delete') {
+            this.dialogService.openConfirm({
+                title: 'Delete ' + droplet.type.toLowerCase(),
+                message: 'All versions of this ' + droplet.type.toLowerCase() + ' will be deleted.',
+                cancelButton: 'Cancel',
+                acceptButton: 'Delete',
+                acceptButtonColor: 'fds-warn'
+            }).afterClosed().subscribe(
+                function (accept) {
+                    if (accept) {
+                        self.api.deleteDroplet(droplet.link.href).subscribe(function(){
+                            self.droplets = self.droplets.filter(function(d){
+                                return (d.identifier !== droplet.identifier) ? true : false
+                            });
+                            self.filterDroplets();
+                        });
+                    }
+                });
+        }
+    },
+
+    /**
+     * Retrieves the snapshot metadata for the given droplet.
+     *
+     * @param droplet       The droplet.
+     */
+    getDropletSnapshotMetadata: function (droplet) {
+        this.api.getDropletSnapshotMetadata(droplet.link.href, true).subscribe(function(snapshotMetadata) {
+            droplet.snapshotMetadata = snapshotMetadata;
+        })
+    },
+
+    /**
+     * Sort `droplets` by `column`.
+     *
+     * @param column    The column to sort by.
+     */
+    sortDroplets: function (column) {
         if (column.sortable === true) {
             // toggle column sort order
             var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC';
             this.filterDroplets(column.name, sortOrder);
-            this.activeDropletColumn = column;
             //only one column can be actively sorted so we reset all to inactive
             this.dropletColumns.forEach(function (c) {
                 c.active = false;
             });
             //and set this column as the actively sorted column
             column.active = true;
+            this.activeDropletColumn = column;
         }
     },
 
-    dropletsSearchRemove: function (searchTerm) {
-        this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder);
-    },
-
-    dropletsSearchAdd: function (searchTerm) {
-        this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder);
-    },
-
-    toggleDropletsFilter: function (searchTerm) {
-        var applySearchTerm = true;
-        // check if the search term is already applied and remove it if true
-        if (this.dropletsSearchTerms.length > 0) {
-            var arrayLength = this.dropletsSearchTerms.length;
-            for (var i = 0; i < arrayLength; i++) {
-                var index = this.dropletsSearchTerms.indexOf(searchTerm);
-                if (index > -1) {
-                    this.dropletsSearchTerms.splice(index, 1);
-                    applySearchTerm = false;
-                }
-            }
-        }
-
-        // if we just removed the search term do NOT apply it again
-        if (applySearchTerm) {
-            this.dropletsSearchTerms.push(searchTerm);
-        }
-
-        this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder);
-    },
-
+    /**
+     * Filter droplets.
+     *
+     * @param {string} [sortBy]       The column name to sort `dropletColumns` by.
+     * @param {string} [sortOrder]    The order. Either 'ASC' or 'DES'
+     */
     filterDroplets: function (sortBy, sortOrder) {
         // if `sortOrder` is `undefined` then use 'ASC'
         if (sortOrder === undefined) {
             sortOrder = 'ASC'
         }
-        // if `sortBy` is `undefined` then find the first sortable column in this.dropletColumns
+        // if `sortBy` is `undefined` then find the first sortable column in `dropletColumns`
         if (sortBy === undefined) {
             var arrayLength = this.dropletColumns.length;
             for (var i = 0; i < arrayLength; i++) {
@@ -596,7 +263,14 @@ NfRegistryService.prototype = {
             }
         }
 
-        var newData = this.droplets;
+        var newData;
+
+        // if we are viewing a single droplet
+        if (this.droplet.identifier) {
+            newData = [this.droplet];
+        } else {
+            newData = this.droplets;
+        }
 
         for (var i = 0; i < this.dropletsSearchTerms.length; i++) {
             newData = filterData(newData, this.dropletsSearchTerms[i], true, this.activeDropletColumn.name);
@@ -607,6 +281,9 @@ NfRegistryService.prototype = {
         this.getAutoCompleteDroplets();
     },
 
+    /**
+     * Generates the auto complete options for the droplet filter.
+     */
     getAutoCompleteDroplets: function () {
         var self = this;
         this.autoCompleteDroplets = [];
@@ -617,36 +294,48 @@ NfRegistryService.prototype = {
         });
     },
 
-    getBucket: function (registryId, bucketId) {
-        return this.getBuckets(registryId, bucketId).then(
-            function (buckets) {
-                return buckets[0];
-            });
-    },
-
-    getBuckets: function (registryIds, bucketIds) {
+    /**
+     * Execute the given bucket action.
+     *
+     * @param action        The action object.
+     * @param bucket        The bucket object the `action` will act upon.
+     */
+    executeBucketAction: function (action, bucket) {
         var self = this;
-        return this.getRegistries().then(
-            function (registries) {
-                var buckets = [];
-
-                registries.find(
-                    function (registry) {
-                        if (registryIds === undefined || registryIds.indexOf(registry.id) >= 0) {
-                            registry.buckets.find(
-                                function (bucket) {
-                                    if (bucketIds === undefined || bucketIds.indexOf(bucket.id) >= 0) {
-                                        buckets.push(bucket);
-                                    }
+        switch (action.name.toLowerCase()) {
+            case 'delete':
+                this.dialogService.openConfirm({
+                    title: 'Delete Bucket',
+                    message: 'All versions of all items will be deleted.',
+                    cancelButton: 'Cancel',
+                    acceptButton: 'Delete',
+                    acceptButtonColor: 'fds-warn'
+                }).afterClosed().subscribe(
+                    function (accept) {
+                        if (accept) {
+                            self.api.deleteBucket(bucket.identifier).subscribe(function (response) {
+                                self.buckets = self.buckets.filter(function (b) {
+                                    return b.identifier !== bucket.identifier;
                                 });
+                                self.filterBuckets();
+                            });
                         }
                     });
-
-                return buckets;
-            });
-
+                break;
+            case 'permissions':
+                this.router.navigateByUrl('/nifi-registry/administration/workflow(' + action.type + ':bucket/' + action.name + '/' + bucket.identifier + ')');
+                break;
+            default:
+                break;
+        }
     },
 
+    /**
+     * Filter buckets.
+     *
+     * @param {string} sortBy       The column name to sort `bucketColumns` by.
+     * @param {string} sortOrder    The order. Either 'ASC' or 'DES'
+     */
     filterBuckets: function (sortBy, sortOrder) {
         // if `sortOrder` is `undefined` then use 'ASC'
         if (sortOrder === undefined) {
@@ -683,6 +372,9 @@ NfRegistryService.prototype = {
         this.getAutoCompleteBuckets();
     },
 
+    /**
+     * Generates the auto complete options for the bucket filter.
+     */
     getAutoCompleteBuckets: function () {
         var self = this;
         this.autoCompleteBuckets = [];
@@ -693,6 +385,11 @@ NfRegistryService.prototype = {
         });
     },
 
+    /**
+     * Sort `buckets` by `column`.
+     *
+     * @param column    The column to sort by.
+     */
     sortBuckets: function (sortEvent, column) {
         if (column.sortable === true) {
             // toggle column sort order
@@ -708,14 +405,6 @@ NfRegistryService.prototype = {
         }
     },
 
-    bucketsSearchRemove: function (searchTerm) {
-        this.filterDroplets(this.activeBucketsColumn.name, this.activeBucketsColumn.sortOrder);
-    },
-
-    bucketsSearchAdd: function (searchTerm) {
-        this.filterDroplets(this.activeBucketsColumn.name, this.activeBucketsColumn.sortOrder);
-    },
-
     allFilteredBucketsSelected: function () {
         this.filteredBuckets.forEach(function (c) {
             if (c.checked === undefined || c.checked === false) {
@@ -734,134 +423,6 @@ NfRegistryService.prototype = {
         }
     },
 
-    getCertification: function (registryId, certificatonId) {
-        return this.getCertifications(registryId, certificatonId).then(
-            function (certificatons) {
-                return certificatons[0];
-            });
-    },
-    getCertifications: function (registryIds, certificatonIds) {
-        var self = this;
-        return this.getRegistries().then(
-            function (registries) {
-                var certificatons = [];
-
-                registries.find(
-                    function (registry) {
-                        if (registryIds === undefined || registryIds.indexOf(registry.id) >= 0) {
-                            registry.certifications.find(
-                                function (certificaton) {
-                                    if (certificatonIds === undefined || certificatonIds.indexOf(certificaton.id) >= 0) {
-                                        certificatons.push(certificaton);
-                                    }
-                                });
-                        }
-                    });
-
-                return certificatons;
-            });
-
-    },
-
-    filterCertifications: function (sortBy, sortOrder) {
-        // if `sortOrder` is `undefined` then use 'ASC'
-        if (sortOrder === undefined) {
-            sortOrder = 'ASC'
-        }
-
-        // if `sortBy` is `undefined` then find the first sortable column in this.bucketColumns
-        if (sortBy === undefined) {
-            var arrayLength = this.bucketColumns.length;
-            for (var i = 0; i < arrayLength; i++) {
-                if (this.bucketColumns[i].sortable === true) {
-                    sortBy = this.bucketColumns[i].name;
-                    this.activeBucketColumn = this.bucketColumns[i];
-                    //only one column can be actively sorted so we reset all to inactive
-                    this.bucketColumns.forEach(function (c) {
-                        c.active = false;
-                    });
-                    //and set this column as the actively sorted column
-                    this.bucketColumns[i].active = true;
-                    this.bucketColumns[i].sortOrder = sortOrder;
-                    break;
-                }
-            }
-        }
-
-        var newData = this.certifications;
-
-        for (var i = 0; i < this.certificationsSearchTerms.length; i++) {
-            newData = filterData(newData, this.certificationsSearchTerms[i], true, this.activeBucketColumn.name);
-        }
-
-        newData = this.dataTableService.sortData(newData, sortBy, sortOrder);
-        this.filteredCertifications = newData;
-        this.getAutoCompleteCertifications();
-    },
-
-    getAutoCompleteCertifications: function () {
-        var self = this;
-        this.autoCompleteCertifications = [];
-        this.bucketColumns.forEach(function (c) {
-            return self.filteredCertifications.forEach(function (r) {
-                return (r[c.name.toLowerCase()]) ? self.autoCompleteCertifications.push(r[c.name.toLowerCase()].toString()) : '';
-            });
-        });
-    },
-
-    sortCertifications: function (sortEvent, column) {
-        if (column.sortable === true) {
-            // toggle column sort order
-            var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC';
-            this.filterCertifications(column.name, sortOrder);
-            this.activeCertificationsColumn = column;
-            //only one column can be actively sorted so we reset all to inactive
-            this.bucketColumns.forEach(function (c) {
-                c.active = false;
-            });
-            //and set this column as the actively sorted column
-            column.active = true;
-        }
-    },
-
-    certificationsSearchRemove: function (searchTerm) {
-        this.filterDroplets(this.activeCertificationsColumn.name, this.activeCertificationsColumn.sortOrder);
-    },
-
-    certificationsSearchAdd: function (searchTerm) {
-        this.filterDroplets(this.activeCertificationsColumn.name, this.activeCertificationsColumn.sortOrder);
-    },
-
-    getUser: function (registryId, userId) {
-        return this.getUsers(registryId, userId).then(
-            function (users) {
-                return users[0];
-            });
-    },
-
-    getUsers: function (registryIds, userIds) {
-        var self = this;
-        return this.getRegistries().then(
-            function (registries) {
-                var users = [];
-
-                registries.find(
-                    function (registry) {
-                        if (registryIds === undefined || registryIds.indexOf(registry.id) >= 0) {
-                            registry.users.find(
-                                function (user) {
-                                    if (userIds === undefined || userIds.indexOf(user.id) >= 0) {
-                                        users.push(user);
-                                    }
-                                });
-                        }
-                    });
-
-                return users;
-            });
-
-    },
-
     sortUsers: function (sortEvent, column) {
         if (column.sortable) {
             var sortBy = column.name;
@@ -970,12 +531,8 @@ NfRegistryService.prototype = {
     },
 
     //</editor-fold>
-
-    setBreadcrumbState: function (state) {
-        this.breadCrumbState = state;
-    }
 };
 
-NfRegistryService.parameters = [covalentCore.TdDataTableService];
+NfRegistryService.parameters = [covalentCore.TdDataTableService, NfRegistryApi, ngRouter.Router, fdsDialogsModule.FdsDialogService];
 
 module.exports = NfRegistryService;


Mime
View raw message