From 2a3de5150b0c06fbc544ffc9f7acdd4a52240281 Mon Sep 17 00:00:00 2001 From: Scott Aslan Date: Thu, 21 Dec 2017 10:44:18 -0500 Subject: [PATCH] [NIFIREG-30] add bucket side nav --- nifi-registry-web-ui/pom.xml | 18 +- .../src/main/frontend/package.json | 37 +- .../src/main/locale/messages.es.xlf | 24 + .../core/common/styles/_expansionPanels.scss | 4 - .../core/common/styles/_globalVars.scss | 1 + .../platform/core/common/styles/_menus.scss | 5 - .../platform/core/common/styles/_tables.scss | 5 + .../src/main/webapp/WEB-INF/pages/index.jsp | 20 +- .../nf-registry-administration.spec.js | 4 +- .../nf-registry-add-user-to-groups.js | 6 + .../nf-registry-add-user-to-groups.spec.js | 2 +- .../dialogs/add-user/nf-registry-add-user.js | 12 +- .../nf-registry-create-new-group.js | 12 +- .../nf-registry-users-administration.html | 39 +- .../users/nf-registry-users-administration.js | 11 +- .../nf-registry-users-adminstration.spec.js | 6 +- .../nf-registry-manage-group.html | 268 ++++++----- .../manage-group/nf-registry-manage-group.js | 54 ++- .../manage-user/nf-registry-manage-user.html | 280 +++++++----- .../manage-user/nf-registry-manage-user.js | 12 +- .../nf-registry-bucket-permissions.html | 114 ----- .../nf-registry-bucket-permissions.js | 85 ---- .../nf-registry-add-policy-to-bucket.html | 99 +++++ .../nf-registry-add-policy-to-bucket.js | 381 ++++++++++++++++ .../nf-registry-create-bucket.html | 2 +- .../nf-registry-create-bucket.js | 12 +- .../nf-registry-create-bucket.spec.js | 2 +- .../nf-registry-edit-bucket-policy.html | 55 +++ .../nf-registry-edit-bucket-policy.js | 352 +++++++++++++++ .../nf-registry-workflow-administration.html | 20 +- .../nf-registry-workflow-administration.js | 9 +- ...f-registry-workflow-administration.spec.js | 6 +- .../nf-registry-manage-bucket.html | 128 ++++++ .../nf-registry-manage-bucket.js | 415 ++++++++++++++++++ .../nf-registry-bucket-grid-list-viewer.js | 3 +- ...f-registry-bucket-grid-list-viewer.spec.js | 4 +- .../nf-registry-droplet-grid-list-viewer.js | 3 +- ...-registry-droplet-grid-list-viewer.spec.js | 4 +- .../nf-registry-grid-list-viewer.html | 15 +- .../registry/nf-registry-grid-list-viewer.js | 3 +- .../nf-registry-grid-list-viewer.spec.js | 4 +- .../explorer/nf-registry-explorer.spec.js | 4 +- .../login/dialogs/nf-registry-user-login.js | 20 +- .../images/registry-background-logo.svg | 17 + .../src/main/webapp/nf-registry.html | 7 +- .../src/main/webapp/nf-registry.module.js | 12 +- .../src/main/webapp/nf-registry.routes.js | 9 +- .../src/main/webapp/nf-registry.spec.js | 4 +- .../main/webapp/services/nf-registry.api.js | 147 +++++-- .../webapp/services/nf-registry.api.spec.js | 41 +- .../nf-registry.auth-guard.service.js | 21 +- .../webapp/services/nf-registry.service.js | 131 ++++-- .../services/nf-registry.service.spec.js | 38 +- .../main/webapp/systemjs.builder.config.js | 6 +- .../main/webapp/theming/_helperClasses.scss | 8 + .../webapp/theming/_structureElements.scss | 149 ++++--- .../users/_structureElements.scss | 6 + .../grid-list/_structureElements.scss | 3 +- 58 files changed, 2391 insertions(+), 768 deletions(-) delete mode 100644 nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.html delete mode 100644 nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js create mode 100644 nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.html create mode 100644 nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js rename nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/{ => create-bucket}/nf-registry-create-bucket.html (98%) rename nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/{ => create-bucket}/nf-registry-create-bucket.js (87%) rename nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/{ => create-bucket}/nf-registry-create-bucket.spec.js (97%) create mode 100644 nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.html create mode 100644 nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js create mode 100644 nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html create mode 100644 nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js create mode 100644 nifi-registry-web-ui/src/main/webapp/images/registry-background-logo.svg diff --git a/nifi-registry-web-ui/pom.xml b/nifi-registry-web-ui/pom.xml index 4f14af775..51e65e932 100644 --- a/nifi-registry-web-ui/pom.xml +++ b/nifi-registry-web-ui/pom.xml @@ -192,6 +192,7 @@ false + roboto-fontface/fonts/Roboto-Slab/Roboto-Slab-Regular.ttf roboto-fontface/fonts/Roboto/Roboto-Regular.ttf roboto-fontface/fonts/Roboto/Roboto-Medium.ttf roboto-fontface/fonts/Roboto/Roboto-Light.ttf @@ -484,7 +485,22 @@ ${frontend.working.dir}/node_modules false - **/* + @fluid-design-system/**/* + @angular/**/* + hammerjs/**/* + @covalent/**/* + rxjs/**/* + moment/**/* + angular2-moment/**/* + zone.js/**/* + core-js/**/* + superagent/**/* + querystring/**/* + tslib/**/* + systemjs/**/* + systemjs-plugin-text/**/* + jquery/**/* + roboto-fontface/**/* diff --git a/nifi-registry-web-ui/src/main/frontend/package.json b/nifi-registry-web-ui/src/main/frontend/package.json index 4bfe687c9..080c676a3 100644 --- a/nifi-registry-web-ui/src/main/frontend/package.json +++ b/nifi-registry-web-ui/src/main/frontend/package.json @@ -14,13 +14,16 @@ "url": "https://github.com/apache/nifi-registry" }, "dependencies": { - "@covalent/core": "1.0.0-beta.8-1", - "angular2-moment": "1.6.0", - "font-awesome": "4.7.0", - "moment": "2.18.1", - "roboto-fontface": "0.7.0" - }, - "devDependencies": { + "querystring": "0.2.0", + "reset-css": "2.2.0", + "rxjs": "5.4.3", + "superagent": "3.6.3", + "systemjs": "0.20.17", + "systemjs-plugin-text": "0.0.11", + "zone.js": "0.8.7", + "tslib": "1.8.0", + "material-design-icons": "3.0.1", + "jquery": "3.2.1", "@angular/animations": "4.4.6", "@angular/cdk": "2.0.0-beta.12", "@angular/common": "4.4.6", @@ -34,15 +37,21 @@ "@angular/platform-browser-dynamic": "4.4.6", "@angular/router": "4.4.6", "angular2-jwt": "0.2.3", + "@covalent/core": "1.0.0-beta.8-1", + "angular2-moment": "1.6.0", + "font-awesome": "4.7.0", + "moment": "2.18.1", + "hammerjs": "2.0.8", + "roboto-fontface": "0.7.0" + }, + "devDependencies": { "canonical-path": "0.0.2", "grunt": "0.4.5", "grunt-cli": "1.2.0", "grunt-contrib-compress": "1.4.3", "grunt-sass": "2.0.0", "grunt-systemjs-builder": "1.0.0", - "hammerjs": "2.0.8", "jasmine-core": "2.8.0", - "jquery": "3.2.1", "karma": "1.7.1", "karma-chrome-launcher": "2.2.0", "karma-cli": "1.0.1", @@ -52,15 +61,7 @@ "karma-spec-reporter": "0.0.31", "load-grunt-tasks": "3.5.2", "lodash": "4.16.2", - "material-design-icons": "3.0.1", - "protractor": "4.0.14", - "querystring": "0.2.0", - "reset-css": "2.2.0", - "rxjs": "5.4.3", - "superagent": "3.6.3", - "systemjs": "0.20.17", - "systemjs-plugin-text": "0.0.11", - "zone.js": "0.8.7" + "protractor": "4.0.14" }, "bundleDependencies": [], "private": true diff --git a/nifi-registry-web-ui/src/main/locale/messages.es.xlf b/nifi-registry-web-ui/src/main/locale/messages.es.xlf index 9bee8cd6a..18395165b 100644 --- a/nifi-registry-web-ui/src/main/locale/messages.es.xlf +++ b/nifi-registry-web-ui/src/main/locale/messages.es.xlf @@ -71,6 +71,18 @@ A button for cancelling the creation of a new user in the registry. Cancel creation of new user + + Cancel + Cancelar + A button for cancelling the creation of a new bucket in the registry. + Cancel creation of new bucket + + + Cancel + Cancelar + A button for cancelling the creation of a new bucket policy in the registry. + Cancel creation of new bucket policy + Clear Claro @@ -89,6 +101,18 @@ A button for creating a new group in the registry. Create new group button + + Create + Crear + A button for creating a new bucket in the registry. + Create new bucket button + + + Apply + Aplicar + A button for applying a new bucket policy in the registry. + Apply new bucket policy button + Cancel Cancelar diff --git a/nifi-registry-web-ui/src/main/platform/core/common/styles/_expansionPanels.scss b/nifi-registry-web-ui/src/main/platform/core/common/styles/_expansionPanels.scss index 9121c39c9..7b0610261 100644 --- a/nifi-registry-web-ui/src/main/platform/core/common/styles/_expansionPanels.scss +++ b/nifi-registry-web-ui/src/main/platform/core/common/styles/_expansionPanels.scss @@ -42,10 +42,6 @@ body[fds] td-expansion-panel .td-expansion-panel-header .td-expansion-panel-head font-weight: bold; } -body[fds] td-expansion-panel { - box-shadow: none; -} - body[fds] td-expansion-panel .td-expansion-panel-header:hover:not(.mat-disabled) { background: $blue4; } diff --git a/nifi-registry-web-ui/src/main/platform/core/common/styles/_globalVars.scss b/nifi-registry-web-ui/src/main/platform/core/common/styles/_globalVars.scss index 77c6ee254..86df2efed 100644 --- a/nifi-registry-web-ui/src/main/platform/core/common/styles/_globalVars.scss +++ b/nifi-registry-web-ui/src/main/platform/core/common/styles/_globalVars.scss @@ -42,6 +42,7 @@ $grey9: #b2b8c1; $grey10: #dbdee2; $grey11: #2C3E44; $grey12: #EEEFF0; +$grey13: #808793; $blue1: #1491C1; $blue2: #E7f6Fc; $blue3: #A7DFF2; diff --git a/nifi-registry-web-ui/src/main/platform/core/common/styles/_menus.scss b/nifi-registry-web-ui/src/main/platform/core/common/styles/_menus.scss index 26a233310..5a0c6a907 100644 --- a/nifi-registry-web-ui/src/main/platform/core/common/styles/_menus.scss +++ b/nifi-registry-web-ui/src/main/platform/core/common/styles/_menus.scss @@ -21,11 +21,6 @@ body[fds] .mat-menu-panel { border-radius: 2px; } -body[fds] .mat-menu-content { - padding-top: 0px; - padding-bottom: 0px; -} - body[fds] .mat-menu-item { font-size: 14px; color: $bodyTextColor; diff --git a/nifi-registry-web-ui/src/main/platform/core/common/styles/_tables.scss b/nifi-registry-web-ui/src/main/platform/core/common/styles/_tables.scss index 904a17602..02ab2bc0a 100644 --- a/nifi-registry-web-ui/src/main/platform/core/common/styles/_tables.scss +++ b/nifi-registry-web-ui/src/main/platform/core/common/styles/_tables.scss @@ -53,6 +53,11 @@ body[fds] .td-data-table-cell .mat-icon-button { color: $linkColor; } +body[fds] .td-data-table-cell .mat-icon-button:disabled { + color: $grey13; + cursor: not-allowed; +} + body[fds] .td-data-table-cell .mat-button, body[fds] .td-data-table-cell .mat-icon-button, body[fds] .td-data-table-cell .mat-raised-button { height: 24px; width: 24px; diff --git a/nifi-registry-web-ui/src/main/webapp/WEB-INF/pages/index.jsp b/nifi-registry-web-ui/src/main/webapp/WEB-INF/pages/index.jsp index 0e8a950fd..3a9a2c9e7 100644 --- a/nifi-registry-web-ui/src/main/webapp/WEB-INF/pages/index.jsp +++ b/nifi-registry-web-ui/src/main/webapp/WEB-INF/pages/index.jsp @@ -3,30 +3,30 @@ 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 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, + 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. --%> -<%@ page contentType="text/html" pageEncoding="UTF-8" session="false" %> +<%@ page contentType='text/html' pageEncoding='UTF-8' session='false' %> NiFi Registry - - - - - - + + + + + + ${nf.registry.style.tags} - + 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 258ae066d..593d3e2f9 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 @@ -34,7 +34,7 @@ var NfRegistryUsersAdministration = require('nifi-registry/components/administra var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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'); @@ -69,7 +69,7 @@ describe('NfRegistryAdministration Component', function () { NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js b/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js index 7cb0f62c1..d6492a98f 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js @@ -58,6 +58,12 @@ NfRegistryAddUserToGroups.prototype = { ngOnInit: function () { var self = this; + // filter out any groups that + // 1) that are not configurable + self.groups = self.groups.filter(function (group) { + return (group.configurable) ? true : false + }); + // 2) the user already belongs to this.data.user.userGroups.forEach(function (userGroup) { self.groups = self.groups.filter(function (group) { return (group.identifier !== userGroup.identifier) ? true : false diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.spec.js b/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.spec.js index 018a9c122..8996a3257 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.spec.js +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.spec.js @@ -33,7 +33,7 @@ describe('NfRegistryAddUserToGroups Component isolated unit tests', function () nfRegistryService = new NfRegistryService(); // setup the nfRegistryService nfRegistryService.user = {identifier: 3, identity: 'User 3', userGroups: []}; - nfRegistryService.groups = [{identifier: 1, identity: 'Group 1', checked: true, users: []}]; + nfRegistryService.groups = [{identifier: 1, identity: 'Group 1', configurable: true, checked: true, users: []}]; nfRegistryApi = new NfRegistryApi(); snackBarService = new fdsSnackBarsModule.FdsSnackBarService(); diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.js b/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.js index 2a31e33bc..bd6e97860 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.js +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.js @@ -46,10 +46,14 @@ NfRegistryAddUser.prototype = { addUser: function (addUserInput) { var self = this; this.nfRegistryApi.addUser(addUserInput.value).subscribe(function (user) { - self.nfRegistryService.users.push(user); - self.nfRegistryService.allUsersAndGroupsSelected = false; - self.nfRegistryService.filterUsersAndGroups(); - if (self.keepDialogOpen !== true) { + if (!user.error) { + self.nfRegistryService.users.push(user); + self.nfRegistryService.allUsersAndGroupsSelected = false; + self.nfRegistryService.filterUsersAndGroups(); + if (self.keepDialogOpen !== true) { + self.dialogRef.close(); + } + } else { self.dialogRef.close(); } }); diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js b/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js index d3a574e54..a992f7899 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js @@ -47,10 +47,14 @@ NfRegistryCreateNewGroup.prototype = { var self = this; // create new group with any selected users added to the new group this.nfRegistryApi.createNewGroup(null, createNewGroupInput.value, this.nfRegistryService.getSelectedUsers()).subscribe(function (group) { - self.nfRegistryService.groups.push(group); - self.nfRegistryService.filterUsersAndGroups(); - self.nfRegistryService.allUsersAndGroupsSelected = false; - if (self.keepDialogOpen !== true) { + if (!group.error) { + self.nfRegistryService.groups.push(group); + self.nfRegistryService.filterUsersAndGroups(); + self.nfRegistryService.allUsersAndGroupsSelected = false; + if (self.keepDialogOpen !== true) { + self.dialogRef.close(); + } + } else { self.dialogRef.close(); } }); diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.html b/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.html index 59e8cfdb2..1028d9895 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.html +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.html @@ -19,7 +19,8 @@
Authorized Users ({{nfRegistryService.users.length + nfRegistryService.groups.length}})
-
- - +
+
+ + Create new group + +
@@ -61,11 +66,12 @@
-
-
+
{{column.format ? column.format(row[column.name]) : row[column.name]}}
@@ -75,7 +81,7 @@ (click)="nfRegistryService.sidenav.toggle()"> {{action.name}} @@ -110,11 +116,12 @@
-
-
+
{{column.format ? column.format(row[column.name]) : row[column.name]}}
@@ -124,7 +131,7 @@ (click)="nfRegistryService.sidenav.toggle()"> {{action.name}} 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 2cc8ff19c..e39a107b9 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 @@ -55,7 +55,7 @@ NfRegistryUsersAdministration.prototype = { ngOnInit: function () { var self = this; this.nfRegistryService.inProgress = true; - this.route.params + this.$subscription = this.route.params .switchMap(function (params) { self.nfRegistryService.adminPerspective = 'users'; return new rxjs.Observable.forkJoin( @@ -81,20 +81,25 @@ NfRegistryUsersAdministration.prototype = { this.nfRegistryService.users = this.nfRegistryService.filteredUsers = []; this.nfRegistryService.groups = this.nfRegistryService.filteredUserGroups = []; this.nfRegistryService.allUsersAndGroupsSelected = false; + this.$subscription.unsubscribe(); }, /** * Opens the create new bucket dialog. */ addUser: function () { - this.dialog.open(NfRegistryAddUser); + this.dialog.open(NfRegistryAddUser, { + disableClose: true + }); }, /** * Opens the create new group dialog. */ createNewGroup: function () { - this.dialog.open(NfRegistryCreateNewGroup); + this.dialog.open(NfRegistryCreateNewGroup, { + disableClose: true + }); } }; 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 9260dc3ea..31ea559c2 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 @@ -32,9 +32,9 @@ var NfRegistryUsersAdministration = require('nifi-registry/components/administra var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js'); var NfRegistryWorkflowAdministration = require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js'); -var NfRegistryCreateBucket = require('nifi-registry/components/administration/workflow/dialogs/nf-registry-create-bucket.js'); +var NfRegistryCreateBucket = require('nifi-registry/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.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'); @@ -73,7 +73,7 @@ describe('NfRegistryUsersAdministration Component', function () { NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryCreateBucket, diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.html b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.html index f9e213837..735dd9544 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.html +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.html @@ -17,133 +17,183 @@
- {{nfRegistryService.group.identity}} + {{nfRegistryService.group.identity}}
-
- - - - -
-
-
+
+
+ + + + +
+
+
Special Privileges - -
- - Can manage buckets - -
- - Read - - - Write - - - Delete - -
- - Can manage users - -
- - Read - - - Write - - - Delete +
+ + Can manage buckets -
- - Can manage policies - -
- - Read +
+ + Read + + + Write + + + Delete + +
+ + Can manage users - - Write +
+ + Read + + + Write + + + Delete + +
+ + Can manage policies - - Delete +
+ + Read + + + Write + + + Delete + +
+ + Can proxy user requests
- - Can proxy user requests - -
- - - Membership - - -
-
-
- Membership ({{nfRegistryService.group.users.length}}) - -
-
-
- {{column.label}} - - + + + Membership + + +
+
+
+ Membership ({{nfRegistryService.group.users.length}}) +
-
-
-
-
+
-
- {{column.format ? column.format(row[column.name]) : row[column.name]}} -
+ {{column.label}} + +
-
-
- +
+
+
+
+
+ {{column.format ? column.format(row[column.name]) : row[column.name]}} +
+
+
+
+ +
-
-
-

This group does not have any users yet.

+
+

This group does not have any users yet.

+
diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js index a51988740..9aaa684fc 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js @@ -66,7 +66,7 @@ NfRegistryManageGroup.prototype = { this.nfRegistryService.sidenav.open(); // subscribe to the route params - self.route.params + this.$subscription = self.route.params .switchMap(function (params) { return self.nfRegistryApi.getUserGroup(params['groupId']); }) @@ -82,6 +82,7 @@ NfRegistryManageGroup.prototype = { */ ngOnDestroy: function () { this.nfRegistryService.sidenav.close(); + this.$subscription.unsubscribe(); }, /** @@ -105,14 +106,14 @@ NfRegistryManageGroup.prototype = { this.nfRegistryService.BUCKETS_PRIVS[resource].forEach(function (action) { if (!policyAction || (action === policyAction)) { self.nfRegistryApi.getPolicyActionResource(action, resource).subscribe(function (policy) { - if (policy.status && policy.status === 409) { + if (policy.status && policy.status === 404) { // resource does NOT exist, let's create it self.nfRegistryApi.postPolicyActionResource(action, resource, self.nfRegistryService.group.users, []).subscribe( function (response) { // can manage buckets privileges created and granted!!!...now update the view response.userGroups.forEach(function (group) { if (group.identifier === self.nfRegistryService.group.identifier) { - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); } @@ -127,7 +128,7 @@ NfRegistryManageGroup.prototype = { // can manage buckets privileges updated!!!...now update the view response.userGroups.forEach(function (group) { if (group.identifier === self.nfRegistryService.group.identifier) { - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); } @@ -146,7 +147,7 @@ NfRegistryManageGroup.prototype = { this.nfRegistryService.BUCKETS_PRIVS[resource].forEach(function (action) { if (!policyAction || (action === policyAction)) { self.nfRegistryApi.getPolicyActionResource(action, resource).subscribe(function (policy) { - if (policy.status && policy.status === 409) { + if (policy.status && policy.status === 404) { // resource does NOT exist } else { // resource exists, let's filter out the current group and update it @@ -157,7 +158,7 @@ NfRegistryManageGroup.prototype = { policy.resource, policy.users, policy.userGroups).subscribe( function (response) { // can manage buckets privileges updated!!!...now update the view - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); }); @@ -167,7 +168,6 @@ NfRegistryManageGroup.prototype = { }); } } - } }, @@ -185,14 +185,14 @@ NfRegistryManageGroup.prototype = { this.nfRegistryService.TENANTS_PRIVS[resource].forEach(function (action) { if (!policyAction || (action === policyAction)) { self.nfRegistryApi.getPolicyActionResource(action, resource).subscribe(function (policy) { - if (policy.status && policy.status === 409) { + if (policy.status && policy.status === 404) { // resource does NOT exist, let's create it self.nfRegistryApi.postPolicyActionResource(action, resource, self.nfRegistryService.group.users, []).subscribe( function (response) { // can manage tenants privileges created and granted!!!...now update the view response.userGroups.forEach(function (group) { if (group.identifier === self.nfRegistryService.group.identifier) { - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); } @@ -207,7 +207,7 @@ NfRegistryManageGroup.prototype = { // can manage tenants privileges updated!!!...now update the view response.userGroups.forEach(function (group) { if (group.identifier === self.nfRegistryService.group.identifier) { - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); } @@ -226,7 +226,7 @@ NfRegistryManageGroup.prototype = { this.nfRegistryService.TENANTS_PRIVS[resource].forEach(function (action) { if (!policyAction || (action === policyAction)) { self.nfRegistryApi.getPolicyActionResource(action, resource).subscribe(function (policy) { - if (policy.status && policy.status === 409) { + if (policy.status && policy.status === 404) { // resource does NOT exist } else { // resource exists, let's filter out the current group and update it @@ -237,7 +237,7 @@ NfRegistryManageGroup.prototype = { policy.resource, policy.users, policy.userGroups).subscribe( function (response) { // can manage tenants privileges updated!!!...now update the view - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); }); @@ -247,7 +247,6 @@ NfRegistryManageGroup.prototype = { }); } } - } }, @@ -265,14 +264,14 @@ NfRegistryManageGroup.prototype = { this.nfRegistryService.POLICIES_PRIVS[resource].forEach(function (action) { if (!policyAction || (action === policyAction)) { self.nfRegistryApi.getPolicyActionResource(action, resource).subscribe(function (policy) { - if (policy.status && policy.status === 409) { + if (policy.status && policy.status === 404) { // resource does NOT exist, let's create it self.nfRegistryApi.postPolicyActionResource(action, resource, self.nfRegistryService.group.users, []).subscribe( function (response) { // can manage policies privileges created and granted!!!...now update the view response.userGroups.forEach(function (group) { if (group.identifier === self.nfRegistryService.group.identifier) { - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); } @@ -287,7 +286,7 @@ NfRegistryManageGroup.prototype = { // can manage policies privileges updated!!!...now update the view response.userGroups.forEach(function (group) { if (group.identifier === self.nfRegistryService.group.identifier) { - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); } @@ -306,7 +305,7 @@ NfRegistryManageGroup.prototype = { this.nfRegistryService.POLICIES_PRIVS[resource].forEach(function (action) { if (!policyAction || (action === policyAction)) { self.nfRegistryApi.getPolicyActionResource(action, resource).subscribe(function (policy) { - if (policy.status && policy.status === 409) { + if (policy.status && policy.status === 404) { // resource does NOT exist } else { // resource exists, let's filter out the current group and update it @@ -317,7 +316,7 @@ NfRegistryManageGroup.prototype = { policy.resource, policy.users, policy.userGroups).subscribe( function (response) { // can manage policies privileges updated!!!...now update the view - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); }); @@ -327,7 +326,6 @@ NfRegistryManageGroup.prototype = { }); } } - } }, @@ -345,14 +343,14 @@ NfRegistryManageGroup.prototype = { this.nfRegistryService.PROXY_PRIVS[resource].forEach(function (action) { if (!policyAction || (action === policyAction)) { self.nfRegistryApi.getPolicyActionResource(action, resource).subscribe(function (policy) { - if (policy.status && policy.status === 409) { + if (policy.status && policy.status === 404) { // resource does NOT exist, let's create it self.nfRegistryApi.postPolicyActionResource(action, resource, self.nfRegistryService.group.users, []).subscribe( function (response) { // can manage proxy privileges created and granted!!!...now update the view response.userGroups.forEach(function (group) { if (group.identifier === self.nfRegistryService.group.identifier) { - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); } @@ -367,7 +365,7 @@ NfRegistryManageGroup.prototype = { // can manage proxy privileges updated!!!...now update the view response.userGroups.forEach(function (group) { if (group.identifier === self.nfRegistryService.group.identifier) { - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); } @@ -386,7 +384,7 @@ NfRegistryManageGroup.prototype = { this.nfRegistryService.PROXY_PRIVS[resource].forEach(function (action) { if (!policyAction || (action === policyAction)) { self.nfRegistryApi.getPolicyActionResource(action, resource).subscribe(function (policy) { - if (policy.status && policy.status === 409) { + if (policy.status && policy.status === 404) { // resource does NOT exist } else { // resource exists, let's filter out the current group and update it @@ -397,7 +395,7 @@ NfRegistryManageGroup.prototype = { policy.resource, policy.users, policy.userGroups).subscribe( function (response) { // can manage proxy privileges updated!!!...now update the view - self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function(response) { + self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier).subscribe(function (response) { self.nfRegistryService.group = response; }); }); @@ -407,7 +405,6 @@ NfRegistryManageGroup.prototype = { }); } } - } }, @@ -418,7 +415,8 @@ NfRegistryManageGroup.prototype = { var self = this; this.dialog.open(NfRegistryAddUsersToGroup, { data: { - group: this.nfRegistryService.group + group: this.nfRegistryService.group, + disableClose: true } }).afterClosed().subscribe(function () { self.nfRegistryApi.getUserGroup(self.nfRegistryService.group.identifier) @@ -510,7 +508,7 @@ NfRegistryManageGroup.prototype = { }); var snackBarRef = self.snackBarService.openCoaster({ title: 'Success', - message: 'The user has been removed from the ' + this.nfRegistryService.group.identity + ' group.', + message: 'The user has been removed from the ' + self.nfRegistryService.group.identity + ' group.', verticalPosition: 'bottom', horizontalPosition: 'right', icon: 'fa fa-check-circle-o', @@ -544,7 +542,7 @@ NfRegistryManageGroup.prototype = { color: '#1EB475', duration: 3000 }); - } else if (response.status === 409) { + } else if (response.status === 404) { self._groupname = self.nfRegistryService.group.identity; self.dialogService.openConfirm({ title: 'Error', diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html index 1f0feb554..ebc14b966 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html @@ -17,137 +17,189 @@
- {{nfRegistryService.user.identity}} + {{nfRegistryService.user.identity}}
-
- - - - -
-
-
+
+
+ + + + +
+
+
Special Privileges - + -
- - Can manage buckets - -
- - Read - - - Write - - - Delete - -
- - Can manage users - -
- - Read - - - Write - - - Delete +
+ + Can manage buckets -
- - Can manage policies - -
- - Read +
+ + Read + + + Write + + + Delete + +
+ + Can manage users - - Write +
+ + Read + + + Write + + + Delete + +
+ + Can manage policies - - Delete +
+ + Read + + + Write + + + Delete + +
+ + Can proxy user requests
- - Can proxy user requests - -
- - - Membership - - -
-
-
- Membership ({{nfRegistryService.user.userGroups.length}}) - -
-
-
- {{column.label}} - - + + + Membership + + +
+
+
+ Membership ({{nfRegistryService.user.userGroups.length}}) +
-
-
-
-
+
-
- {{column.format ? column.format(row[column.name]) : row[column.name]}} -
+ {{column.label}} + +
-
-
- +
+
+
+
+
+ {{column.format ? + column.format(row[column.name]) : row[column.name]}} +
+
+
+
+ +
-
-
-

This user does not belong to any groups yet.

+
+

This user does not belong to any groups yet.

+
diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js index 59aca5f23..d9c305de2 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js @@ -66,7 +66,7 @@ NfRegistryManageUser.prototype = { this.nfRegistryService.sidenav.open(); // subscribe to the route params - self.route.params + this.$subscription = self.route.params .switchMap(function (params) { return self.nfRegistryApi.getUser(params['userId']); }) @@ -82,6 +82,7 @@ NfRegistryManageUser.prototype = { */ ngOnDestroy: function () { this.nfRegistryService.sidenav.close(); + this.$subscription.unsubscribe(); }, /** @@ -152,7 +153,7 @@ NfRegistryManageUser.prototype = { // resource exists, let's filter out the current user and update it policy.users = policy.users.filter(function (user) { return (user.identifier !== self.nfRegistryService.user.identifier) ? true : false; - }) + }); self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, policy.resource, policy.users, policy.userGroups).subscribe( function (response) { @@ -232,7 +233,7 @@ NfRegistryManageUser.prototype = { // resource exists, let's filter out the current user and update it policy.users = policy.users.filter(function (user) { return (user.identifier !== self.nfRegistryService.user.identifier) ? true : false; - }) + }); self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, policy.resource, policy.users, policy.userGroups).subscribe( function (response) { @@ -312,7 +313,7 @@ NfRegistryManageUser.prototype = { // resource exists, let's filter out the current user and update it policy.users = policy.users.filter(function (user) { return (user.identifier !== self.nfRegistryService.user.identifier) ? true : false; - }) + }); self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, policy.resource, policy.users, policy.userGroups).subscribe( function (response) { @@ -418,7 +419,8 @@ NfRegistryManageUser.prototype = { var self = this; this.dialog.open(NfRegistryAddUserToGroups, { data: { - user: this.nfRegistryService.user + user: this.nfRegistryService.user, + disableClose: true } }).afterClosed().subscribe(function () { self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier) diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.html b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.html deleted file mode 100644 index bae521802..000000000 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.html +++ /dev/null @@ -1,114 +0,0 @@ - - -
-
- {{nfRegistryService.bucket.name}} - -
-
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js deleted file mode 100644 index 74f5689ee..000000000 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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 ngCore = require('@angular/core'); -var NfRegistryService = require('nifi-registry/services/nf-registry.service.js'); -var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js'); -var ngRouter = require('@angular/router'); - -/** - * NfRegistryBucketPermissions constructor. - * - * @param nfRegistryApi The api service. - * @param nfRegistryService The nf-registry.service module. - * @param ActivatedRoute The angular activated route module. - * @param Router The angular router module. - * @constructor - */ -function NfRegistryBucketPermissions(nfRegistryApi, nfRegistryService, ActivatedRoute, Router) { - this.nfRegistryService = nfRegistryService; - this.nfRegistryApi = nfRegistryApi; - this.route = ActivatedRoute; - this.router = Router; -}; - -NfRegistryBucketPermissions.prototype = { - constructor: NfRegistryBucketPermissions, - - /** - * Initialize the component. - */ - ngOnInit: function () { - var self = this; - this.nfRegistryService.sidenav.open(); - this.route.params - .switchMap(function (params) { - return self.nfRegistryApi.getBucket(params['bucketId']); - }) - .subscribe(function (bucket) { - self.nfRegistryService.bucket = bucket; - }); - }, - - /** - * Destroy the component. - */ - ngOnDestroy: function () { - this.nfRegistryService.sidenav.close(); - this.nfRegistryService.bucket = {}; - }, - - /** - * Navigate to administer the buckets of the current registry. - */ - closeSideNav: function () { - this.router.navigateByUrl('/nifi-registry/administration/workflow'); - } -}; - -NfRegistryBucketPermissions.annotations = [ - new ngCore.Component({ - template: require('./nf-registry-bucket-permissions.html!text') - }) -]; - -NfRegistryBucketPermissions.parameters = [ - NfRegistryApi, - NfRegistryService, - ngRouter.ActivatedRoute, - ngRouter.Router -]; - -module.exports = NfRegistryBucketPermissions; diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.html b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.html new file mode 100644 index 000000000..8c89010af --- /dev/null +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.html @@ -0,0 +1,99 @@ + + +
+
+ New Policy + +
+
+
+
+ {{column.label}} + + +
+
+
+
+
+
+
+
+ {{column.format ? + column.format(row[column.name]) : row[column.name]}} +
+
+
+ + +
+
+
+
+
+
+
+ {{column.format ? column.format(row[column.name]) : row[column.name]}} +
+
+
+ + +
+
+
+
+
+
+ + All + + + Read + + + Write + + + Delete + +
+
+ + + +
+
\ No newline at end of file diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js new file mode 100644 index 000000000..118da49b7 --- /dev/null +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js @@ -0,0 +1,381 @@ +/* + * 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 rxjs = require('rxjs/Observable'); +var ngCore = require('@angular/core'); +var NfRegistryService = require('nifi-registry/services/nf-registry.service.js'); +var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js'); +var ngMaterial = require('@angular/material'); +var ngRouter = require('@angular/router'); +var covalentCore = require('@covalent/core'); +var fdsSnackBarsModule = require('@fluid-design-system/snackbars'); + +/** + * NfRegistryAddPolicyToBucket constructor. + * + * @param nfRegistryApi The api service. + * @param tdDataTableService The covalent data table service module. + * @param fdsSnackBarService The FDS snack bar service module. + * @param nfRegistryService The nf-registry.service module. + * @param activatedRoute The angular route module. + * @param matDialogRef The angular material dialog ref. + * @param data The data passed into this component. + * @constructor + */ +function NfRegistryAddPolicyToBucket(nfRegistryApi, tdDataTableService, fdsSnackBarService, nfRegistryService, activatedRoute, matDialogRef, data) { + this.users = []; + this.groups = []; + this.userOrGroup = {}; + this.filteredGroups = []; + this.filteredUsers = []; + this.usersSearchTerms = []; + this.userGroupsSearchTerms = []; + // Services + this.dataTableService = tdDataTableService; + this.snackBarService = fdsSnackBarService; + this.nfRegistryService = nfRegistryService; + this.route = activatedRoute; + this.nfRegistryApi = nfRegistryApi; + this.dialogRef = matDialogRef; + this.data = data; +}; + +NfRegistryAddPolicyToBucket.prototype = { + constructor: NfRegistryAddPolicyToBucket, + + /** + * Initialize the component. + */ + ngOnInit: function () { + var self = this; + this.route.params + .switchMap(function (params) { + return new rxjs.Observable.forkJoin( + self.nfRegistryApi.getUsers(), + self.nfRegistryApi.getUserGroups() + ); + }) + .subscribe(function (response) { + self.users = response[0]; + self.users = self.users.filter(function (user) { + return (self.data.users.indexOf(user.identity) < 0) ? true : false; + }); + self.groups = response[1]; + self.groups = self.groups.filter(function (group) { + return (self.data.groups.indexOf(group.identity) < 0) ? true : false; + }); + + self.filterUsersAndGroups(); + }); + }, + + /** + * Filter users and groups. + * + * @param {string} [sortBy] The column name to sort `userGroupsColumns` by. + * @param {string} [sortOrder] The order. Either 'ASC' or 'DES' + */ + filterUsersAndGroups: 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 `dropletColumns` + if (sortBy === undefined) { + var arrayLength = this.nfRegistryService.userGroupsColumns.length; + for (var i = 0; i < arrayLength; i++) { + if (this.nfRegistryService.userGroupsColumns[i].sortable === true) { + sortBy = this.nfRegistryService.userGroupsColumns[i].name; + //only one column can be actively sorted so we reset all to inactive + this.nfRegistryService.userGroupsColumns.forEach(function (c) { + c.active = false; + }); + //and set this column as the actively sorted column + this.nfRegistryService.userGroupsColumns[i].active = true; + this.nfRegistryService.userGroupsColumns[i].sortOrder = sortOrder; + break; + } + } + } + + var newUserGroupsData = this.groups; + + for (var i = 0; i < this.userGroupsSearchTerms.length; i++) { + newUserGroupsData = this.nfRegistryService.filterData(newUserGroupsData, this.userGroupsSearchTerms[i], true); + } + + newUserGroupsData = this.dataTableService.sortData(newUserGroupsData, sortBy, sortOrder); + this.filteredUserGroups = newUserGroupsData; + + var newUsersData = this.users; + + for (var i = 0; i < this.usersSearchTerms.length; i++) { + newUsersData = this.nfRegistryService.filterData(newUsersData, this.usersSearchTerms[i], true); + } + + newUsersData = this.dataTableService.sortData(newUsersData, sortBy, sortOrder); + this.filteredUsers = newUsersData; + }, + + /** + * Sort users and groups. + * + * @param column The column to sort by. + */ + sortUserAndGroups: function (column) { + if (column.sortable) { + var sortBy = column.name; + var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC'; + this.filterUsersAndGroups(sortBy, sortOrder); + } + }, + + /** + * Create a new policy. + */ + applyPolicy: function () { + var self = this; + var action = ''; + var resource = '/buckets'; + var permissions = []; + if (this.readCheckbox.checked) { + action = 'read'; + permissions.push(action); + this.nfRegistryApi.getResourcePoliciesById(action, resource, this.nfRegistryService.bucket.identifier).subscribe(function (policy) { + action = 'read'; + if (policy.status && policy.status === 404) { + // resource does NOT exist, let's create it + var users = []; + var groups = []; + + if (self.userOrGroup.type === 'user') { + users.push(self.userOrGroup); + } else { + groups.push(self.userOrGroup); + } + + self.nfRegistryApi.postPolicyActionResource(action, resource + '/' + self.nfRegistryService.bucket.identifier, users, groups).subscribe( + function (response) { + // policy created!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'Policy created.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + }); + }); + } else { + // resource exists, let's update it + if (self.userOrGroup.type === 'user') { + policy.users.push(self.userOrGroup); + } else { + policy.userGroups.push(self.userOrGroup); + } + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // policy updated!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'Policy created.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + }); + }); + } + }); + } + if (this.writeCheckbox.checked) { + action = 'write'; + permissions.push(action); + this.nfRegistryApi.getResourcePoliciesById(action, resource, this.nfRegistryService.bucket.identifier).subscribe(function (policy) { + action = 'write'; + if (policy.status && policy.status === 404) { + // resource does NOT exist, let's create it + var users = []; + var groups = []; + + if (self.userOrGroup.type === 'user') { + users.push(self.userOrGroup); + } else { + groups.push(self.userOrGroup); + } + + self.nfRegistryApi.postPolicyActionResource(action, resource + '/' + self.nfRegistryService.bucket.identifier, users, groups).subscribe( + function (response) { + // policy created!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'Policy created.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + }); + }); + } else { + // resource exists, let's update it + if (self.userOrGroup.type === 'user') { + policy.users.push(self.userOrGroup); + } else { + policy.userGroups.push(self.userOrGroup); + } + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // policy updated!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'Policy created.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + }); + }); + } + }); + } + if (this.deleteCheckbox.checked) { + action = 'delete'; + permissions.push(action); + this.nfRegistryApi.getResourcePoliciesById(action, resource, this.nfRegistryService.bucket.identifier).subscribe(function (policy) { + action = 'delete'; + if (policy.status && policy.status === 404) { + // resource does NOT exist, let's create it + var users = []; + var groups = []; + + if (self.userOrGroup.type === 'user') { + users.push(self.userOrGroup); + } else { + groups.push(self.userOrGroup); + } + + self.nfRegistryApi.postPolicyActionResource(action, resource + '/' + self.nfRegistryService.bucket.identifier, users, groups).subscribe( + function (response) { + // policy created!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'Policy created.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + }); + }); + } else { + // resource exists, let's update it + if (self.userOrGroup.type === 'user') { + policy.users.push(self.userOrGroup); + } else { + policy.userGroups.push(self.userOrGroup); + } + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // policy updated!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'Policy created.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + }); + }); + } + }); + } + this.dialogRef.close({userOrGroup: self.userOrGroup, permissions: permissions}); + }, + + /** + * Toggle all permission checkboxes. + * + * @param $event + */ + toggleAllPermissions: function ($event) { + if ($event.checked) { + this.readCheckbox.checked = true; + this.writeCheckbox.checked = true; + this.deleteCheckbox.checked = true; + } else { + this.readCheckbox.checked = false; + this.writeCheckbox.checked = false; + this.deleteCheckbox.checked = false; + } + }, + + /** + * Cancel creation of a new policy and close dialog. + */ + cancel: function () { + this.dialogRef.close(); + } +}; + +NfRegistryAddPolicyToBucket.annotations = [ + new ngCore.Component({ + template: require('./nf-registry-add-policy-to-bucket.html!text'), + queries: { + readCheckbox: new ngCore.ViewChild('readCheckbox'), + writeCheckbox: new ngCore.ViewChild('writeCheckbox'), + deleteCheckbox: new ngCore.ViewChild('deleteCheckbox') + } + }) +]; + +NfRegistryAddPolicyToBucket.parameters = [ + NfRegistryApi, + covalentCore.TdDataTableService, + fdsSnackBarsModule.FdsSnackBarService, + NfRegistryService, + ngRouter.ActivatedRoute, + ngMaterial.MatDialogRef, + ngMaterial.MAT_DIALOG_DATA +]; + +module.exports = NfRegistryAddPolicyToBucket; diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.html b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.html similarity index 98% rename from nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.html rename to nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.html index 6f2f9d0f3..4248bd297 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.html +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.html @@ -35,7 +35,7 @@
+
+
+ + + +
+
+ + All + + + Read + + + Write + + + Delete + +
+
+ + + +
+
\ No newline at end of file diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js new file mode 100644 index 000000000..01602dc70 --- /dev/null +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js @@ -0,0 +1,352 @@ +/* + * 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 rxjs = require('rxjs/Observable'); +var ngCore = require('@angular/core'); +var NfRegistryService = require('nifi-registry/services/nf-registry.service.js'); +var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js'); +var ngMaterial = require('@angular/material'); +var ngRouter = require('@angular/router'); + +/** + * NfRegistryEditBucketPolicy constructor. + * + * @param nfRegistryApi The api service. + * @param nfRegistryService The nf-registry.service module. + * @param activatedRoute The angular route module. + * @param matDialogRef The angular material dialog ref. + * @param data The data passed into this component. + * @constructor + */ +function NfRegistryEditBucketPolicy(nfRegistryApi, nfRegistryService, activatedRoute, matDialogRef, data) { + this.userOrGroup = {}; + // Services + this.nfRegistryService = nfRegistryService; + this.route = activatedRoute; + this.nfRegistryApi = nfRegistryApi; + this.dialogRef = matDialogRef; + this.data = data; +}; + +NfRegistryEditBucketPolicy.prototype = { + constructor: NfRegistryEditBucketPolicy, + + /** + * Initialize the component. + */ + ngOnInit: function () { + var self = this; + this.route.params + .switchMap(function (params) { + return new rxjs.Observable.forkJoin( + self.nfRegistryApi.getUsers(), + self.nfRegistryApi.getUserGroups() + ); + }) + .subscribe(function (response) { + var users = response[0]; + var groups = response[1]; + users = users.filter(function (user) { + return (self.data.userOrGroup.identity === user.identity) ? true : false; + }); + if(users.length === 0){ + groups = groups.filter(function (group) { + return (self.data.userOrGroup.identity === group.identity) ? true : false; + }); + self.userOrGroup = groups[0]; + self.userOrGroup.type = 'group' + } else { + self.userOrGroup = users[0]; + self.userOrGroup.type = 'user' + } + self.data.userOrGroup.permissions.split(", ").forEach(function(permission) { + if (permission === 'read') { + self.readCheckbox.checked = true; + } + if (permission === 'write') { + self.writeCheckbox.checked = true; + } + if (permission === 'delete') { + self.deleteCheckbox.checked = true; + } + }); + }); + }, + + /** + * Update a new policy. + */ + applyPolicy: function () { + var self = this; + var action = ''; + var resource = '/buckets'; + var permissions = []; + if (this.readCheckbox.checked) { + action = 'read'; + permissions.push(action); + this.nfRegistryApi.getResourcePoliciesById(action, resource, this.nfRegistryService.bucket.identifier).subscribe(function (policy) { + action = 'read'; + if (policy.status && policy.status === 404) { + // resource does NOT exist, let's create it + var users = []; + var groups = []; + + if (self.userOrGroup.type === 'user') { + users.push(self.userOrGroup); + } else { + groups.push(self.userOrGroup); + } + + self.nfRegistryApi.postPolicyActionResource(action, resource + '/' + self.nfRegistryService.bucket.identifier, users, groups).subscribe( + function (response) { + // policy created!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + }); + }); + } else { + // resource exists, let's update it + if (self.userOrGroup.type === 'user') { + policy.users.push(self.userOrGroup); + } else { + policy.userGroups.push(self.userOrGroup); + } + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // policy updated!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + }); + }); + } + }); + } else { + action = 'read'; + this.nfRegistryApi.getResourcePoliciesById(action, resource, this.nfRegistryService.bucket.identifier).subscribe(function (policy) { + action = 'read'; + if (policy.status && policy.status === 404) { + // resource does NOT exist so we have nothing to do + } else { + // resource exists, let's remove it + if (self.userOrGroup.type === 'user') { + policy.users = policy.users.filter(function(user) { + return (self.userOrGroup.identity !== user.identity) ? true : false; + }); + } else { + policy.userGroups = policy.userGroups.filter(function(group) { + return (self.userOrGroup.identity !== group.identity) ? true : false; + }); + } + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // policy updated!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + }); + }); + } + }); + + } + if (this.writeCheckbox.checked) { + action = 'write'; + permissions.push(action); + this.nfRegistryApi.getResourcePoliciesById(action, resource, this.nfRegistryService.bucket.identifier).subscribe(function (policy) { + action = 'write'; + if (policy.status && policy.status === 404) { + // resource does NOT exist, let's create it + var users = []; + var groups = []; + + if (self.userOrGroup.type === 'user') { + users.push(self.userOrGroup); + } else { + groups.push(self.userOrGroup); + } + + self.nfRegistryApi.postPolicyActionResource(action, resource + '/' + self.nfRegistryService.bucket.identifier, users, groups).subscribe( + function (response) { + // policy created!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + }); + }); + } else { + // resource exists, let's update it + if (self.userOrGroup.type === 'user') { + policy.users.push(self.userOrGroup); + } else { + policy.userGroups.push(self.userOrGroup); + } + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // policy updated!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + }); + }); + } + }); + } else { + action = 'write'; + this.nfRegistryApi.getResourcePoliciesById(action, resource, this.nfRegistryService.bucket.identifier).subscribe(function (policy) { + action = 'write'; + if (policy.status && policy.status === 404) { + // resource does NOT exist so we have nothing to do + } else { + // resource exists, let's remove it + if (self.userOrGroup.type === 'user') { + policy.users = policy.users.filter(function(user) { + return (self.userOrGroup.identity !== user.identity) ? true : false; + }); + } else { + policy.userGroups = policy.userGroups.filter(function(group) { + return (self.userOrGroup.identity !== group.identity) ? true : false; + }); + } + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // policy updated!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + }); + }); + } + }); + + } + if (this.deleteCheckbox.checked) { + action = 'delete'; + permissions.push(action); + this.nfRegistryApi.getResourcePoliciesById(action, resource, this.nfRegistryService.bucket.identifier).subscribe(function (policy) { + action = 'delete'; + if (policy.status && policy.status === 404) { + // resource does NOT exist, let's create it + var users = []; + var groups = []; + + if (self.userOrGroup.type === 'user') { + users.push(self.userOrGroup); + } else { + groups.push(self.userOrGroup); + } + + self.nfRegistryApi.postPolicyActionResource(action, resource + '/' + self.nfRegistryService.bucket.identifier, users, groups).subscribe( + function (response) { + // policy created!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + }); + }); + } else { + // resource exists, let's update it + if (self.userOrGroup.type === 'user') { + policy.users.push(self.userOrGroup); + } else { + policy.userGroups.push(self.userOrGroup); + } + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // policy updated!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + }); + }); + } + }); + } else { + action = 'delete'; + this.nfRegistryApi.getResourcePoliciesById(action, resource, this.nfRegistryService.bucket.identifier).subscribe(function (policy) { + action = 'delete'; + if (policy.status && policy.status === 404) { + // resource does NOT exist so we have nothing to do + } else { + // resource exists, let's remove it + if (self.userOrGroup.type === 'user') { + policy.users = policy.users.filter(function(user) { + return (self.userOrGroup.identity !== user.identity) ? true : false; + }); + } else { + policy.userGroups = policy.userGroups.filter(function(group) { + return (self.userOrGroup.identity !== group.identity) ? true : false; + }); + } + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // policy updated!!!...now update the view + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function (response) { + self.nfRegistryService.bucket = response; + }); + }); + } + }); + + } + this.dialogRef.close({userOrGroup: self.userOrGroup, permissions: permissions}); + }, + + /** + * Toggle all permission checkboxes. + * + * @param $event + */ + toggleAllPermissions: function ($event) { + if ($event.checked) { + this.readCheckbox.checked = true; + this.writeCheckbox.checked = true; + this.deleteCheckbox.checked = true; + } else { + this.readCheckbox.checked = false; + this.writeCheckbox.checked = false; + this.deleteCheckbox.checked = false; + } + }, + + /** + * Cancel creation of a new policy and close dialog. + */ + cancel: function () { + this.dialogRef.close(); + } +}; + +NfRegistryEditBucketPolicy.annotations = [ + new ngCore.Component({ + template: require('./nf-registry-edit-bucket-policy.html!text'), + queries: { + readCheckbox: new ngCore.ViewChild('readCheckbox'), + writeCheckbox: new ngCore.ViewChild('writeCheckbox'), + deleteCheckbox: new ngCore.ViewChild('deleteCheckbox') + } + }) +]; + +NfRegistryEditBucketPolicy.parameters = [ + NfRegistryApi, + NfRegistryService, + ngRouter.ActivatedRoute, + ngMaterial.MatDialogRef, + ngMaterial.MAT_DIALOG_DATA +]; + +module.exports = NfRegistryEditBucketPolicy; diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html index 544e2d1a4..fd7453cc9 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html @@ -19,9 +19,15 @@
Buckets ({{nfRegistryService.buckets.length}})
- -
@@ -55,11 +62,12 @@
-
+
{{column.format ? column.format(row[column.name]) : row[column.name]}}
@@ -69,7 +77,7 @@ + [disabled]="action.disabled(row)"> {{action.name}} 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 770b87196..5bb3b20dd 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 @@ -18,7 +18,7 @@ var ngCore = require('@angular/core'); 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'); -var NfRegistryCreateBucket = require('nifi-registry/components/administration/workflow/dialogs/nf-registry-create-bucket.js'); +var NfRegistryCreateBucket = require('nifi-registry/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js'); var nfRegistryAnimations = require('nifi-registry/nf-registry.animations.js'); var ngRouter = require('@angular/router'); var ngMaterial = require('@angular/material'); @@ -50,7 +50,7 @@ NfRegistryWorkflowAdministration.prototype = { ngOnInit: function () { var self = this; this.nfRegistryService.inProgress = true; - this.route.params + this.$subscription = this.route.params .switchMap(function (params) { self.nfRegistryService.adminPerspective = 'workflow'; return self.nfRegistryApi.getBuckets(); @@ -69,13 +69,16 @@ NfRegistryWorkflowAdministration.prototype = { this.nfRegistryService.adminPerspective = ''; this.nfRegistryService.buckets = this.nfRegistryService.filteredBuckets = []; this.nfRegistryService.allBucketsSelected = false; + this.$subscription.unsubscribe(); }, /** * Opens the create new bucket dialog. */ createBucket: function () { - this.dialog.open(NfRegistryCreateBucket); + this.dialog.open(NfRegistryCreateBucket, { + disableClose: true + }); } }; 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 1a1641bce..6ffca81d0 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 @@ -32,9 +32,9 @@ var NfRegistryUsersAdministration = require('nifi-registry/components/administra var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js'); var NfRegistryWorkflowAdministration = require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js'); -var NfRegistryCreateBucket = require('nifi-registry/components/administration/workflow/dialogs/nf-registry-create-bucket.js'); +var NfRegistryCreateBucket = require('nifi-registry/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.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'); @@ -73,7 +73,7 @@ describe('NfRegistryWorkflowAdministration Component', function () { NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryCreateBucket, diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html new file mode 100644 index 000000000..54f5c5c69 --- /dev/null +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html @@ -0,0 +1,128 @@ + + +
+
+ {{nfRegistryService.bucket.name}} + +
+
+
+ + + + +
+
+
+ Policies ({{userIdentitiesWithPolicies.length + groupIdentitiesWithPolicies.length}}) + +
+
+
+ {{column.label}} + + +
+
+
+
+
+
+
+ {{column.format ? column.format(row[column.name]) : + row[column.name]}} +
+
+
+ + +
+
+
+
+
+ {{column.format ? column.format(row[column.name]) : row[column.name]}} +
+
+
+ + +
+
+
+

No results to display.

+
+
+
+
+ +
\ No newline at end of file diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js new file mode 100644 index 000000000..8bb32868a --- /dev/null +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js @@ -0,0 +1,415 @@ +/* + * 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 rxjs = require('rxjs/Observable'); +var covalentCore = require('@covalent/core'); +var fdsDialogsModule = require('@fluid-design-system/dialogs'); +var fdsSnackBarsModule = require('@fluid-design-system/snackbars'); +var ngCore = require('@angular/core'); +var NfRegistryService = require('nifi-registry/services/nf-registry.service.js'); +var ngRouter = require('@angular/router'); +var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js'); +var ngMaterial = require('@angular/material'); +var NfRegistryEditBucketPolicy = require('nifi-registry/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js'); +var NfRegistryAddPolicyToBucket = require('nifi-registry/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js'); + +/** + * NfRegistryManageBucket constructor. + * + * @param nfRegistryApi The api service. + * @param nfRegistryService The nf-registry.service module. + * @param tdDataTableService The covalent data table service module. + * @param fdsDialogService The FDS dialog service. + * @param fdsSnackBarService The FDS snack bar service module. + * @param activatedRoute The angular route module. + * @param router The angular router module. + * @param matDialog The angular material dialog module. + * @constructor + */ +function NfRegistryManageBucket(nfRegistryApi, nfRegistryService, tdDataTableService, fdsDialogService, fdsSnackBarService, activatedRoute, router, matDialog) { + this.userPermsSearchTerms = []; + this._bucketname = ''; + this.bucketPolicies = []; + this.userPerms = {}; + this.groupPerms = {}; + this.filteredGroupPermsData = []; + this.filteredUserPermsData = []; + this.userIdentitiesWithPolicies = []; + this.groupIdentitiesWithPolicies = []; + + + // Services + this.nfRegistryService = nfRegistryService; + this.route = activatedRoute; + this.router = router; + this.dialog = matDialog; + this.nfRegistryApi = nfRegistryApi; + this.dialogService = fdsDialogService; + this.snackBarService = fdsSnackBarService; + this.dataTableService = tdDataTableService; +}; + +NfRegistryManageBucket.prototype = { + constructor: NfRegistryManageBucket, + + /** + * Initialize the component. + */ + ngOnInit: function () { + var self = this; + this.nfRegistryService.sidenav.open(); + this.$subscription = this.route.params + .switchMap(function (params) { + return new rxjs.Observable.forkJoin( + self.nfRegistryApi.getBucket(params['bucketId']), + self.nfRegistryApi.getPolicies() + ); + }) + .subscribe(function (response) { + self.nfRegistryService.bucket = response[0]; + self._bucketname = response[0].name; + if (!self.nfRegistryService.currentUser.anonymous) { + if (!response[1].error) { + var policies = response[1]; + policies.forEach(function (policy) { + if (policy.resource.indexOf("/buckets/" + self.nfRegistryService.bucket.identifier) >= 0) { + self.bucketPolicies.push(policy); + policy.users.forEach(function (user) { + var userActionsForBucket = self.userPerms[user.identity] || []; + userActionsForBucket.push(policy.action); + self.userPerms[user.identity] = userActionsForBucket; + + }); + policy.userGroups.forEach(function (group) { + var groupActionsForBucket = self.groupPerms[group.identity] || []; + groupActionsForBucket.push(policy.action); + self.groupPerms[group.identity] = groupActionsForBucket; + + }); + } + }); + self.filterPolicies(); + } + } + }); + }, + + /** + * Destroy the component. + */ + ngOnDestroy: function () { + this.nfRegistryService.sidenav.close(); + this.nfRegistryService.bucket = {}; + this.$subscription.unsubscribe(); + }, + + /** + * Navigate to administer the buckets of the current registry. + */ + closeSideNav: function () { + this.router.navigateByUrl('/nifi-registry/administration/workflow'); + }, + + /** + * Opens a modal dialog UX enabling the creation of policies. + */ + addPolicy: function () { + var self = this; + this.dialog.open(NfRegistryAddPolicyToBucket, { + data: { + users: this.userIdentitiesWithPolicies, + groups: this.groupIdentitiesWithPolicies, + disableClose: true + } + }).afterClosed().subscribe(function (dialogResult) { + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier) + .subscribe(function (response) { + self.nfRegistryService.bucket = response; + self._bucketname = response.name; + + if (dialogResult) { + if (dialogResult.userOrGroup.type === 'user') { + self.userPerms[dialogResult.userOrGroup.identity] = dialogResult.permissions; + } else { + self.groupPerms[dialogResult.userOrGroup.identity] = dialogResult.permissions; + } + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'The policy has been created for this user/group.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + } + self.filterPolicies(); + }); + }); + }, + + /** + * Opens a modal dialog UX enabling the editing of a policy. + */ + editPolicy: function (userOrGroup) { + var self = this; + this.dialog.open(NfRegistryEditBucketPolicy, { + data: { + userOrGroup: userOrGroup, + disableClose: true + } + }).afterClosed().subscribe(function (dialogResult) { + self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier) + .subscribe(function (response) { + self.nfRegistryService.bucket = response; + self._bucketname = response.name; + + if (dialogResult) { + if (dialogResult.userOrGroup.type === 'user') { + self.userPerms[dialogResult.userOrGroup.identity] = dialogResult.permissions; + } else { + self.groupPerms[dialogResult.userOrGroup.identity] = dialogResult.permissions; + } + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'The policy has been updated for this user/group.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + } + self.filterPolicies(); + }); + }); + }, + + /** + * Filter policies. + * + * @param {string} [sortBy] The column name to sort `bucketPoliciesColumns` by. + * @param {string} [sortOrder] The order. Either 'ASC' or 'DES' + */ + filterPolicies: 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 `bucketPoliciesColumns` + if (sortBy === undefined) { + var arrayLength = this.nfRegistryService.bucketPoliciesColumns.length; + for (var i = 0; i < arrayLength; i++) { + if (this.nfRegistryService.bucketPoliciesColumns[i].sortable === true) { + sortBy = this.nfRegistryService.bucketPoliciesColumns[i].name; + //only one column can be actively sorted so we reset all to inactive + this.nfRegistryService.bucketPoliciesColumns.forEach(function (c) { + c.active = false; + }); + //and set this column as the actively sorted column + this.nfRegistryService.bucketPoliciesColumns[i].active = true; + this.nfRegistryService.bucketPoliciesColumns[i].sortOrder = sortOrder; + break; + } + } + } + + var newUserPermsData = []; + this.userIdentitiesWithPolicies = []; + for (var identity in this.userPerms) { + if (this.userPerms.hasOwnProperty(identity)) { + this.userIdentitiesWithPolicies.push(identity); + newUserPermsData.push({identity: identity, permissions: this.userPerms[identity].join(", ")}); + } + } + + for (var i = 0; i < this.userPermsSearchTerms.length; i++) { + newUserPermsData = this.filterData(newUserPermsData, this.userPermsSearchTerms[i], true); + } + + newUserPermsData = this.dataTableService.sortData(newUserPermsData, sortBy, sortOrder); + this.filteredUserPermsData = newUserPermsData; + + var newGroupPermsData = []; + this.groupIdentitiesWithPolicies = []; + for (var identity in this.groupPerms) { + if (this.groupPerms.hasOwnProperty(identity)) { + this.groupIdentitiesWithPolicies.push(identity); + newGroupPermsData.push({identity: identity, permissions: this.groupPerms[identity].join(", ")}); + } + } + + for (var i = 0; i < this.userPermsSearchTerms.length; i++) { + newGroupPermsData = this.filterData(newGroupPermsData, this.userPermsSearchTerms[i], true); + } + + newGroupPermsData = this.dataTableService.sortData(newGroupPermsData, sortBy, sortOrder); + this.filteredGroupPermsData = newGroupPermsData; + }, + + /** + * Sort `groups` by `column`. + * + * @param column The column to sort by. + */ + sortUsers: function (column) { + if (column.sortable) { + var sortBy = column.name; + var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC'; + this.filterPolicies(sortBy, sortOrder); + + //only one column can be actively sorted so we reset all to inactive + this.nfRegistryService.bucketPoliciesColumns.forEach(function (c) { + c.active = false; + }); + //and set this column as the actively sorted column + column.active = true; + } + }, + + /** + * Remove user from group. + * + * @param group + */ + removePolicyFromBucket: function (userOrGroup) { + var self = this; + this.dialogService.openConfirm({ + title: 'Delete Policy', + message: 'All permissions granted by this policy will be removed for this user/group.', + cancelButton: 'Cancel', + acceptButton: 'Delete', + acceptButtonColor: 'fds-warn' + }).afterClosed().subscribe( + function (accept) { + if (accept) { + userOrGroup.permissions.split(', ').forEach(function (action) { + self.nfRegistryApi.getPolicyActionResource(action, '/buckets/' + self.nfRegistryService.bucket.identifier).subscribe(function (policy) { + if (policy.status && policy.status === 404) { + // resource does NOT exist + } else { + // resource exists, let's filter out the current group and update it + policy.users = policy.users.filter(function (user) { + return (user.identity !== userOrGroup.identity) ? true : false; + }); + policy.userGroups = policy.userGroups.filter(function (group) { + return (group.identity !== userOrGroup.identity) ? true : false; + }); + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // policy removed!!!...now update the view + self.nfRegistryApi.getPolicies().subscribe(function (response) { + self.userPerms = {}; + self.groupPerms = {}; + self.filteredGroupPermsData = []; + self.filteredUserPermsData = []; + self.userIdentitiesWithPolicies = []; + self.groupIdentitiesWithPolicies = []; + var policies = response; + policies.forEach(function (policy) { + if (policy.resource.indexOf("/buckets/" + self.nfRegistryService.bucket.identifier) >= 0) { + self.bucketPolicies.push(policy); + policy.users.forEach(function (user) { + var userActionsForBucket = self.userPerms[user.identity] || []; + userActionsForBucket.push(policy.action); + self.userPerms[user.identity] = userActionsForBucket; + + }); + policy.userGroups.forEach(function (group) { + var groupActionsForBucket = self.groupPerms[group.identity] || []; + groupActionsForBucket.push(policy.action); + self.groupPerms[group.identity] = groupActionsForBucket; + + }); + } + }); + self.filterPolicies(); + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'All permissions granted by this policy have be removed for this user/group.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + }); + }); + } + }); + }); + } + }); + }, + + /** + * Update bucket name. + * + * @param username + */ + updateBucketName: function (bucketname) { + var self = this; + this.nfRegistryApi.updateBucket(this.nfRegistryService.bucket.identifier, bucketname).subscribe(function (response) { + if (!response.status || response.status === 200) { + self.nfRegistryService.bucket = response; + // update the bucket identity in the buckets table + self.nfRegistryService.buckets.filter(function (bucket) { + if (self.nfRegistryService.bucket.identifier === bucket.identifier) { + bucket.name = response.name; + } + }); + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'This bucket name has been updated.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + } else if (response.status === 409) { + self._bucketname = self.nfRegistryService.bucket.name; + self.dialogService.openConfirm({ + title: 'Error', + message: 'This bucket already exists. Please enter a different identity/bucket name.', + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + } + }); + } +}; + +NfRegistryManageBucket.annotations = [ + new ngCore.Component({ + template: require('./nf-registry-manage-bucket.html!text') + }) +]; + +NfRegistryManageBucket.parameters = [ + NfRegistryApi, + NfRegistryService, + covalentCore.TdDataTableService, + fdsDialogsModule.FdsDialogService, + fdsSnackBarsModule.FdsSnackBarService, + ngRouter.ActivatedRoute, + ngRouter.Router, + ngMaterial.MatDialog +]; + +module.exports = NfRegistryManageBucket; 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 1712adaa6..7f4ae24a3 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 @@ -53,7 +53,7 @@ NfRegistryBucketGridListViewer.prototype = { this.nfRegistryService.droplet = {}; // subscribe to the route params - self.route.params + this.$subscription = this.route.params .switchMap(function (params) { return new rxjs.Observable.forkJoin( self.nfRegistryApi.getBuckets(), @@ -82,6 +82,7 @@ NfRegistryBucketGridListViewer.prototype = { this.nfRegistryService.explorerViewType = ''; this.nfRegistryService.setBreadcrumbState('out'); this.nfRegistryService.filteredDroplets = []; + this.$subscription.unsubscribe(); } }; 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 3c9e5cc69..135408e38 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 @@ -30,7 +30,7 @@ var NfRegistryUsersAdministration = require('nifi-registry/components/administra var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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'); @@ -67,7 +67,7 @@ describe('NfRegistryBucketGridListViewer Component', function () { NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, 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 a8c121802..d85f68b78 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 @@ -50,7 +50,7 @@ NfRegistryDropletGridListViewer.prototype = { this.nfRegistryService.explorerViewType = 'grid-list'; // subscribe to the route params - self.route.params + this.$subscription = this.route.params .switchMap(function (params) { return new rxjs.Observable.forkJoin( self.nfRegistryApi.getDroplet(params['bucketId'], params['dropletType'], params['dropletId']), @@ -81,6 +81,7 @@ NfRegistryDropletGridListViewer.prototype = { this.nfRegistryService.explorerViewType = ''; this.nfRegistryService.setBreadcrumbState('out'); this.nfRegistryService.filteredDroplets = []; + this.$subscription.unsubscribe(); } }; 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 b41d3c6fb..772db0a9b 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 @@ -30,7 +30,7 @@ var NfRegistryUsersAdministration = require('nifi-registry/components/administra var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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'); @@ -67,7 +67,7 @@ describe('NfRegistryDropletGridListViewer Component', function () { NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, 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 f1d58f3d7..7d3899280 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 @@ -21,7 +21,7 @@ + (remove)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name, nfRegistryService.activeDropletColumn.sortOrder);"class="push-right-sm"> Sort by:
{{nfRegistryService.getSortByLabel()}}
@@ -64,22 +64,24 @@
-
+
Description
Change Log
-
+
-

{{droplet.description}}

+

{{droplet.description}}

+

No description specified

@@ -88,9 +90,12 @@ *ngFor="let snapshotMeta of droplet.snapshotMetadata; let i = index" [active]="i === 0 ? true : false">
-
+
{{snapshotMeta.comments}}
+
+ No comments specified +
{{(snapshotMeta.timestamp/1000 | amFromUnix) | amDateFormat:'MMM-DD-YYYY'}} at {{(snapshotMeta.timestamp/1000 | amFromUnix) | amDateFormat:'h:mm A'}}
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 b3ff7e7ff..216008660 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 @@ -54,7 +54,7 @@ NfRegistryGridListViewer.prototype = { this.nfRegistryService.droplet = {}; // subscribe to the route params - self.route.params + this.$subscription = this.route.params .switchMap(function (params) { return new rxjs.Observable.forkJoin(self.nfRegistryApi.getDroplets(), self.nfRegistryApi.getBuckets()); @@ -77,6 +77,7 @@ NfRegistryGridListViewer.prototype = { this.nfRegistryService.explorerViewType = ''; this.nfRegistryService.setBreadcrumbState('out'); this.nfRegistryService.filteredDroplets = []; + this.$subscription.unsubscribe(); } }; 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 be0471318..991127bcd 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 @@ -30,7 +30,7 @@ var NfRegistryUsersAdministration = require('nifi-registry/components/administra var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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'); @@ -67,7 +67,7 @@ describe('NfRegistryGridListViewer Component', function () { NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, 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 228f9dd38..2676cd576 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 @@ -29,7 +29,7 @@ var NfRegistryUsersAdministration = require('nifi-registry/components/administra var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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'); @@ -64,7 +64,7 @@ describe('NfRegistryExplorer Component', function () { NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, diff --git a/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.js b/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.js index 77fb7e23f..e9e7a5cd1 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.js +++ b/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.js @@ -19,19 +19,22 @@ var ngCore = require('@angular/core'); var NfRegistryService = require('nifi-registry/services/nf-registry.service.js'); var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js'); var ngMaterial = require('@angular/material'); +var nfRegistryAuthGuardService = require('nifi-registry/services/nf-registry.auth-guard.service.js'); /** * NfRegistryUserLogin constructor. * - * @param nfRegistryApi The api service. - * @param nfRegistryService The nf-registry.service module. - * @param matDialogRef The angular material dialog ref. + * @param nfRegistryApi The api service. + * @param nfRegistryService The nf-registry.service module. + * @param matDialogRef The angular material dialog ref. + * @param nfRegistryLoginAuthGuard The login auth guard. * @constructor */ -function NfRegistryUserLogin(nfRegistryApi, nfRegistryService, matDialogRef) { +function NfRegistryUserLogin(nfRegistryApi, nfRegistryService, matDialogRef, nfRegistryLoginAuthGuard) { this.nfRegistryService = nfRegistryService; this.nfRegistryApi = nfRegistryApi; this.dialogRef = matDialogRef; + this.nfRegistryLoginAuthGuard = nfRegistryLoginAuthGuard; }; NfRegistryUserLogin.prototype = { @@ -46,9 +49,11 @@ NfRegistryUserLogin.prototype = { login: function (username, password) { var self = this; this.nfRegistryApi.postToLogin(username.value, password.value).subscribe(function(response){ - if(!response.status || response.status === 200) { + if(response || response.status === 200) { //successful login - self.nfRegistryService.router.navigateByUrl(self.nfRegistryService.redirectUrl); + self.dialogRef.close(); + self.nfRegistryService.currentUser.anonymous = false; + self.nfRegistryLoginAuthGuard.checkLogin(self.nfRegistryService.redirectUrl) } }); } @@ -63,7 +68,8 @@ NfRegistryUserLogin.annotations = [ NfRegistryUserLogin.parameters = [ NfRegistryApi, NfRegistryService, - ngMaterial.MatDialogRef + ngMaterial.MatDialogRef, + nfRegistryAuthGuardService.NfRegistryLoginAuthGuard ]; module.exports = NfRegistryUserLogin; diff --git a/nifi-registry-web-ui/src/main/webapp/images/registry-background-logo.svg b/nifi-registry-web-ui/src/main/webapp/images/registry-background-logo.svg new file mode 100644 index 000000000..bd7281516 --- /dev/null +++ b/nifi-registry-web-ui/src/main/webapp/images/registry-background-logo.svg @@ -0,0 +1,17 @@ + +Asset 5 \ No newline at end of file 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 21eaffac2..6b519c12e 100644 --- a/nifi-registry-web-ui/src/main/webapp/nf-registry.html +++ b/nifi-registry-web-ui/src/main/webapp/nf-registry.html @@ -75,11 +75,14 @@
{{nfRegistryService.currentUser.identity}}
logout
-
+ - 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 b250d1366..41af1a55f 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 @@ -30,13 +30,15 @@ var NfRegistryAdministration = require('nifi-registry/components/administration/ var NfRegistryUsersAdministration = require('nifi-registry/components/administration/users/nf-registry-users-administration.js'); var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryCreateNewGroup = require('nifi-registry/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js'); +var NfRegistryEditBucketPolicy = require('nifi-registry/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js'); +var NfRegistryAddPolicyToBucket = require('nifi-registry/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js'); var NfRegistryAddUserToGroups = require('nifi-registry/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js'); var NfRegistryAddUsersToGroup = require('nifi-registry/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js'); var NfRegistryWorkflowAdministration = require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js'); -var NfRegistryCreateBucket = require('nifi-registry/components/administration/workflow/dialogs/nf-registry-create-bucket.js'); +var NfRegistryCreateBucket = require('nifi-registry/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.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'); @@ -70,13 +72,15 @@ NfRegistryModule.annotations = [ NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryWorkflowAdministration, NfRegistryAddUser, NfRegistryCreateBucket, NfRegistryCreateNewGroup, NfRegistryAddUserToGroups, NfRegistryAddUsersToGroup, + NfRegistryAddPolicyToBucket, + NfRegistryEditBucketPolicy, NfRegistryGridListViewer, NfRegistryBucketGridListViewer, NfRegistryDropletGridListViewer, @@ -90,6 +94,8 @@ NfRegistryModule.annotations = [ NfRegistryCreateNewGroup, NfRegistryAddUserToGroups, NfRegistryAddUsersToGroup, + NfRegistryAddPolicyToBucket, + NfRegistryEditBucketPolicy, NfUserLoginComponent ], providers: [ diff --git a/nifi-registry-web-ui/src/main/webapp/nf-registry.routes.js b/nifi-registry-web-ui/src/main/webapp/nf-registry.routes.js index 941377711..3d724d66b 100644 --- a/nifi-registry-web-ui/src/main/webapp/nf-registry.routes.js +++ b/nifi-registry-web-ui/src/main/webapp/nf-registry.routes.js @@ -24,7 +24,7 @@ var NfRegistryAdministration = require('nifi-registry/components/administration/ var NfRegistryUsersAdministration = require('nifi-registry/components/administration/users/nf-registry-users-administration.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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'); @@ -79,8 +79,7 @@ var NfRegistryRoutes = new ngRouter.RouterModule.forRoot([{ pathMatch: 'full' }, { path: 'nifi-registry', - redirectTo: '/nifi-registry/explorer/grid-list', - pathMatch: 'full' + redirectTo: '/nifi-registry/explorer/grid-list' }, { path: '', redirectTo: '/nifi-registry/explorer/grid-list', @@ -99,8 +98,8 @@ var NfRegistryRoutes = new ngRouter.RouterModule.forRoot([{ canActivate: [nfRegistryAuthGuardService.NfRegistryUsersAdministrationAuthGuard], outlet: 'sidenav' }, { - path: 'bucket/permissions/:bucketId', - component: NfRegistryBucketPermissions, + path: 'manage/bucket/:bucketId', + component: NfRegistryManageBucket, canActivate: [nfRegistryAuthGuardService.NfRegistryWorkflowsAdministrationAuthGuard], outlet: 'sidenav' }]); 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 09632be3c..bb0adf1b9 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 @@ -29,7 +29,7 @@ var NfRegistryUsersAdministration = require('nifi-registry/components/administra var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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'); @@ -67,7 +67,7 @@ describe('NfRegistry Component', function () { NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, 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 08bec02ca..3e9d3074c 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 @@ -66,7 +66,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -92,7 +92,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }).afterClosed().subscribe( @@ -127,7 +127,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -155,7 +155,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -178,7 +178,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -201,7 +201,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -225,7 +225,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }).afterClosed().subscribe( @@ -256,7 +256,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -264,6 +264,27 @@ NfRegistryApi.prototype = { }); }, + /** + * Updates a bucket. + * + * @param {string} identifier The identifier of the bucket. + * @param {string} name The name of the bucket. + * @returns {*} + */ + updateBucket: function (identifier, name) { + var self = this; + return this.http.put('/nifi-registry-api/buckets/' + identifier, { + 'identifier': identifier, + 'name': name + }, headers) + .map(function (response) { + return response; + }) + .catch(function (error) { + return rxjs.Observable.of(error); + }); + }, + /** * Get user by id. * @@ -279,11 +300,11 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); - return rxjs.Observable.throw(error.message); + return rxjs.Observable.throw(error.error); }); }, @@ -331,7 +352,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -374,7 +395,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -397,7 +418,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -419,7 +440,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -442,7 +463,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -465,7 +486,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -476,9 +497,9 @@ NfRegistryApi.prototype = { /** * Creates a new group. * - * @param {string} identifier The identifier of the user. - * @param {string} identity The identity of the user. - * @param {array} users The array of users to be added to the new group. + * @param {string} identifier The identifier of the user. + * @param {string} identity The identity of the user. + * @param {array} users The array of users to be added to the new group. * @returns {*} */ createNewGroup: function (identifier, identity, users) { @@ -494,7 +515,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -505,9 +526,9 @@ NfRegistryApi.prototype = { /** * Updates a group. * - * @param {string} identifier The identifier of the group. - * @param {string} identity The identity of the group. - * @param {array} users The array of users in the new group. + * @param {string} identifier The identifier of the group. + * @param {string} identity The identity of the group. + * @param {array} users The array of users in the new group. * @returns {*} */ updateUserGroup: function (identifier, identity, users) { @@ -525,11 +546,47 @@ NfRegistryApi.prototype = { }); }, + /** + * Get metadata for all policies in the registry for which the client is authorized. + * + * @returns {*} + */ + getPolicies: function () { + var self = this; + var url = '/nifi-registry-api/policies'; + return this.http.get(url) + .map(function (response) { + return response; + }) + .catch(function (error) { + return rxjs.Observable.of(error); + }); + }, + + /** + * Get resource policies by resource identifier. + * + * @param {string} action The name of the resource action (e.g. READ/WRITE/DELETE). + * @param {string} resource The name of the resource (e.g. /buckets, /tenants, /policies, /proxy). + * @param {string} resourceId The resource identifier. + * @returns {*} + */ + getResourcePoliciesById: function (action, resource, resourceId) { + var self = this; + return this.http.get('/nifi-registry-api/policies/' + action + resource + '/' + resourceId) + .map(function (response) { + return response; + }) + .catch(function (error) { + return rxjs.Observable.of(error); + }); + }, + /** * Get policy action resource. * * @param {string} action The name of the resource action (e.g. READ/WRITE/DELETE). - * @param {string} resource The name of the resource action (e.g. READ/WRITE/DELETE). + * @param {string} resource The name of the resource (e.g. /buckets, /tenants, /policies, /proxy). * @returns {*} */ getPolicyActionResource: function (action, resource) { @@ -537,6 +594,9 @@ NfRegistryApi.prototype = { return this.http.get('/nifi-registry-api/policies/' + action + resource) .map(function (response) { return response; + }) + .catch(function (error) { + return rxjs.Observable.of(error); }); }, @@ -545,7 +605,7 @@ NfRegistryApi.prototype = { * * @param {string} identifier The identifier of the group. * @param {string} action The name of the resource action (e.g. READ/WRITE/DELETE). - * @param {string} resource The name of the resource. + * @param {string} resource The name of the resource (e.g. /buckets, /tenants, /policies, /proxy). * @param {string} users The users with resource privileges. * @param {string} userGroups The user groups with resource privileges. * @returns {*} @@ -565,7 +625,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -577,7 +637,7 @@ NfRegistryApi.prototype = { * Creates a policy action resource. * * @param {string} action The name of the resource action (e.g. READ/WRITE/DELETE). - * @param {string} resource The name of the resource. + * @param {string} resource The name of the resource (e.g. /buckets, /tenants, /policies, /proxy). * @param {string} users The users with resource privileges. * @param {string} userGroups The user groups with resource privileges. * @returns {*} @@ -596,7 +656,7 @@ NfRegistryApi.prototype = { .catch(function (error) { self.dialogService.openConfirm({ title: 'Error', - message: error.message, + message: error.error, acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); @@ -613,12 +673,29 @@ NfRegistryApi.prototype = { */ postToLogin: function (username, password) { var self = this; - return this.http.post('/nifi-registry-api/access/token/login', { - 'username': username, - 'password': password - }, headers) - .map(function (response) { - return response; + var headers = new ngCommonHttp.HttpHeaders({ + 'Content-Type': 'application/x-www-form-urlencoded' + }); + var params = new ngCommonHttp.HttpParams() + .set('username', username) + .set('password', password) + .set('grant_type', 'password'); + + var options = { + headers: headers, + params: params, + withCredentials: true, + responseType: 'text' + }; + return this.http.post('/nifi-registry-api/access/token/login', null, options) + .map(function (jwt) { + // get the payload and store the token with the appropriate expiration + var token = self.nfStorage.getJwtPayload(jwt); + if (token) { + var expiration = parseInt(token['exp'], 10) * MILLIS_PER_SECOND; + self.nfStorage.setItem('jwt', jwt, expiration); + } + return jwt; }) .catch(function (error) { self.dialogService.openConfirm({ @@ -627,7 +704,7 @@ NfRegistryApi.prototype = { acceptButton: 'Ok', acceptButtonColor: 'fds-warn' }); - return rxjs.Observable.of(error); + return rxjs.Observable.of(''); }); }, 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 3c9b6d672..76c98201d 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 @@ -30,7 +30,7 @@ var NfRegistryUsersAdministration = require('nifi-registry/components/administra var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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'); @@ -44,6 +44,7 @@ var NfRegistryAuthService = require('nifi-registry/services/nf-registry.auth.ser var NfStorage = require('nifi-registry/services/nf-storage.service.js'); var NfLoginComponent = require('nifi-registry/components/login/nf-registry-login.js'); var NfUserLoginComponent = require('nifi-registry/components/login/dialogs/nf-registry-user-login.js'); +var nfRegistryAuthGuardService = require('nifi-registry/services/nf-registry.auth-guard.service.js'); xdescribe('NfRegistry API w/ Angular testing utils', function () { var nfRegistryApi; @@ -65,7 +66,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, @@ -77,6 +78,10 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { ], providers: [ NfRegistryService, + nfRegistryAuthGuardService.NfRegistryUsersAdministrationAuthGuard, + nfRegistryAuthGuardService.NfRegistryWorkflowsAdministrationAuthGuard, + nfRegistryAuthGuardService.NfRegistryLoginAuthGuard, + nfRegistryAuthGuardService.NfRegistryResourcesAuthGuard, NfRegistryAuthService, NfRegistryApi, NfStorage, @@ -236,7 +241,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('GET'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'GET droplet mock error'}); + req.flush('Http failure response for /nifi-registry-api/flow/test/versions: 401 GET droplet mock error', {status: 401, statusText: 'GET droplet mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -300,7 +305,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('GET'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'GET droplet mock error'}); + req.flush('Http failure response for /nifi-registry-api/buckets/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc/flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc: 401 GET droplet mock error', {status: 401, statusText: 'GET droplet mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -376,7 +381,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('GET'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'GET droplet mock error'}); + req.flush('Http failure response for /nifi-registry-api/items: 401 GET droplet mock error', {status: 401, statusText: 'GET droplet mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -435,7 +440,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('GET'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'GET droplet mock error'}); + req.flush('Http failure response for /nifi-registry-api/items/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc: 401 GET droplet mock error', {status: 401, statusText: 'GET droplet mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -477,7 +482,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('DELETE'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'DELETE droplet mock error'}); + req.flush('Http failure response for /nifi-registry-api/flows/1234: 401 DELETE droplet mock error', {status: 401, statusText: 'DELETE droplet mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -521,7 +526,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('POST'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'POST bucket mock error'}); + req.flush('Http failure response for /nifi-registry-api/buckets: 401 POST bucket mock error', {status: 401, statusText: 'POST bucket mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -561,7 +566,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('DELETE'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'DELETE bucket mock error'}); + req.flush('Http failure response for /nifi-registry-api/buckets/1234: 401 DELETE bucket mock error', {status: 401, statusText: 'DELETE bucket mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -621,7 +626,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('GET'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'GET bucket mock error'}); + req.flush('Http failure response for /nifi-registry-api/buckets/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc: 401 GET bucket mock error', {status: 401, statusText: 'GET bucket mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -667,7 +672,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('GET'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'GET metadata mock error'}); + req.flush('Http failure response for /nifi-registry-api/buckets: 401 GET metadata mock error', {status: 401, statusText: 'GET metadata mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -712,7 +717,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('POST'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'POST add user mock error'}); + req.flush('Http failure response for /nifi-registry-api/tenants/users: 401 POST add user mock error', {status: 401, statusText: 'POST add user mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -758,7 +763,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('GET'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'GET users mock error'}); + req.flush('Http failure response for /nifi-registry-api/tenants/users: 401 GET users mock error', {status: 401, statusText: 'GET users mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -804,7 +809,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('DELETE'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'DELETE users mock error'}); + req.flush('Http failure response for /nifi-registry-api/tenants/users/123: 401 DELETE users mock error', {status: 401, statusText: 'DELETE users mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -850,7 +855,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('GET'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'GET user groups mock error'}); + req.flush('Http failure response for /nifi-registry-api/tenants/user-groups: 401 GET user groups mock error', {status: 401, statusText: 'GET user groups mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -896,7 +901,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('GET'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'GET user groups mock error'}); + req.flush('Http failure response for /nifi-registry-api/tenants/user-groups/123: 401 GET user groups mock error', {status: 401, statusText: 'GET user groups mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -942,7 +947,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('DELETE'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'DELETE user groups mock error'}); + req.flush('Http failure response for /nifi-registry-api/tenants/user-groups/123: 401 DELETE user groups mock error', {status: 401, statusText: 'DELETE user groups mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); @@ -997,7 +1002,7 @@ xdescribe('NfRegistry API w/ Angular testing utils', function () { expect(req.request.method).toEqual('POST'); // Next, fulfill the request by transmitting a response. - req.flush(null, {status: 401, statusText: 'POST user groups mock error'}); + req.flush('Http failure response for /nifi-registry-api/tenants/user-groups: 401 POST user groups mock error', {status: 401, statusText: 'POST user groups mock error'}); // Finally, assert that there are no outstanding requests. httpMock.verify(); diff --git a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.js b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.js index 71580a2ec..a2f34f341 100644 --- a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.js +++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.js @@ -51,7 +51,6 @@ NfRegistryUsersAdministrationAuthGuard.prototype = { this.nfRegistryService.api.ticketExchange().subscribe(function (jwt) { self.nfRegistryService.api.loadCurrentUser().subscribe(function (currentUser) { self.nfRegistryService.currentUser = currentUser; - // if the user is logged, we want to determine if they were logged in using a certificate if (currentUser.anonymous === false) { // render the logout button if there is a token locally if (self.nfRegistryService.nfStorage.getItem('jwt') !== null) { @@ -113,7 +112,6 @@ NfRegistryWorkflowsAdministrationAuthGuard.prototype = { this.nfRegistryService.api.ticketExchange().subscribe(function (jwt) { self.nfRegistryService.api.loadCurrentUser().subscribe(function (currentUser) { self.nfRegistryService.currentUser = currentUser; - // if the user is logged, we want to determine if they were logged in using a certificate if (currentUser.anonymous === false) { // render the logout button if there is a token locally if (self.nfRegistryService.nfStorage.getItem('jwt') !== null) { @@ -175,14 +173,15 @@ NfRegistryLoginAuthGuard.prototype = { this.nfRegistryService.api.ticketExchange().subscribe(function (jwt) { self.nfRegistryService.api.loadCurrentUser().subscribe(function (currentUser) { self.nfRegistryService.currentUser = currentUser; - // if the user is logged, we want to determine if they were logged in using a certificate if (currentUser.anonymous === false) { // render the logout button if there is a token locally if (self.nfRegistryService.nfStorage.getItem('jwt') !== null) { self.nfRegistryService.currentUser.canLogout = true; } + self.nfRegistryService.currentUser.canActivateResourcesAuthGuard = true; self.nfRegistryService.router.navigateByUrl(self.nfRegistryService.redirectUrl); } else { + self.nfRegistryService.currentUser.anonymous = true; self.nfRegistryService.router.navigateByUrl('/nifi-registry/login'); } }); @@ -221,7 +220,7 @@ NfRegistryResourcesAuthGuard.prototype = { checkLogin: function (url) { var self = this; - if (this.nfRegistryService.currentUser.resourcePermissions.buckets.canRead) { return true; } + if (this.nfRegistryService.currentUser.canActivateResourcesAuthGuard === true) { return true; } // Store the attempted URL for redirecting this.nfRegistryService.redirectUrl = url; @@ -230,14 +229,22 @@ NfRegistryResourcesAuthGuard.prototype = { this.nfRegistryService.api.ticketExchange().subscribe(function (jwt) { self.nfRegistryService.api.loadCurrentUser().subscribe(function (currentUser) { self.nfRegistryService.currentUser = currentUser; - // if the user is logged, we want to determine if they were logged in using a certificate - if (currentUser.anonymous === false) { + if (!currentUser || currentUser.anonymous === false) { + if(self.nfRegistryService.nfStorage.hasItem('jwt')){ + self.nfRegistryService.currentUser.canLogout = true; + self.nfRegistryService.currentUser.canActivateResourcesAuthGuard = true; + self.nfRegistryService.router.navigateByUrl(url); + } else { + self.nfRegistryService.router.navigateByUrl('/nifi-registry/login'); + } + } else if (currentUser.anonymous === true) { // render the logout button if there is a token locally if (self.nfRegistryService.nfStorage.getItem('jwt') !== null) { self.nfRegistryService.currentUser.canLogout = true; } + self.nfRegistryService.currentUser.canActivateResourcesAuthGuard = true; + self.nfRegistryService.router.navigateByUrl(url); } - self.nfRegistryService.router.navigateByUrl(url); }); }); 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 9964ffd5a..3de0ffb36 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 @@ -36,8 +36,11 @@ var rxjs = require('rxjs/Observable'); */ function NfRegistryService(nfRegistryApi, nfStorage, tdDataTableService, router, fdsDialogService, fdsSnackBarService) { this.registry = { - name: "Nifi Registry" + name: "NiFi Registry" }; + this.documentation = { + link: 'nifi-registry-docs/documentation' + } this.redirectUrl = '/nifi-registry/explorer/grid-list'; // Services @@ -67,20 +70,20 @@ function NfRegistryService(nfRegistryApi, nfStorage, tdDataTableService, router, width: 100 } ]; - this.userPoliciesColumns = [ + this.bucketPoliciesColumns = [ { name: 'identity', - label: 'Bucket Name', + label: 'Display Name', sortable: true, - tooltip: 'Bucket name.', - width: 100 + tooltip: 'User/Group name.', + width: 40 }, { - name: 'identity', - label: 'Bucket Name', - sortable: true, - tooltip: 'Bucket name.', - width: 100 + name: 'permissions', + label: 'Permissions', + sortable: false, + tooltip: 'User/Group permissions for this bucket.', + width: 40 } ]; this.dropletColumns = [ @@ -106,16 +109,35 @@ function NfRegistryService(nfRegistryApi, nfStorage, tdDataTableService, router, ]; // data table available row action definitions + this.disableMultiBucketDeleteAction = false; this.bucketActions = [ { - 'name': 'permissions', - 'icon': 'fa fa-pencil', - 'tooltip': 'Manage Bucket Policies', - 'type': 'sidenav' + name: 'manage', + icon: 'fa fa-pencil', + tooltip: 'Manage Bucket', + type: 'sidenav', + disabled: function(row) { + return false; + } + }, { + name: 'Delete', + icon: 'fa fa-trash', + tooltip: 'Delete Bucket', + disabled: function(row) { + return (!row.permissions.canDelete); + } + } + ]; + this.bucketPoliciesActions = [ + { + name: 'manage', + icon: 'fa fa-pencil', + tooltip: 'Manage Policy', + type: 'dialog' }, { - 'name': 'Delete', - 'icon': 'fa fa-trash', - 'tooltip': 'Delete Bucket' + name: 'Delete', + icon: 'fa fa-trash', + tooltip: 'Delete Policy' } ]; this.dropletActions = [ @@ -125,17 +147,24 @@ function NfRegistryService(nfRegistryApi, nfStorage, tdDataTableService, router, tooltip: 'Delete' } ]; + this.disableMultiDeleteAction = false; this.usersActions = [ { name: 'manage', icon: 'fa fa-pencil', tooltip: 'Manage User Policies', type: 'sidenav', - tooltip: 'Manage User' + tooltip: 'Manage User', + disabled: function(row) { + return false; + } }, { name: 'delete', icon: 'fa fa-trash', - tooltip: 'Delete User' + tooltip: 'Delete User', + disabled: function(row) { + return (!row.configurable); + } } ]; this.userGroupsActions = [ @@ -143,11 +172,17 @@ function NfRegistryService(nfRegistryApi, nfStorage, tdDataTableService, router, name: 'manage', icon: 'fa fa-pencil', tooltip: 'Manage User Group Policies', - type: 'sidenav' + type: 'sidenav', + disabled: function(row) { + return false; + } }, { name: 'delete', icon: 'fa fa-trash', - tooltip: 'Delete User Group' + tooltip: 'Delete User Group', + disabled: function(row) { + return (!row.configurable); + } } ]; @@ -327,7 +362,7 @@ NfRegistryService.prototype = { var label = ''; switch (sortByColumn.label) { case 'Updated': - label = (sortByColumn.sortOrder === 'ASC') ? 'Newest (update)' : 'Oldest (update)'; + label = (sortByColumn.sortOrder === 'ASC') ? 'Oldest (update)' : 'Newest (update)'; break; case 'Name': label = (sortByColumn.sortOrder === 'ASC') ? 'Name (a - z)' : 'Name (z - a)'; @@ -347,7 +382,7 @@ NfRegistryService.prototype = { var label = ''; switch (col.label) { case 'Updated': - label = (col.sortOrder !== 'ASC') ? 'Newest (update)' : 'Oldest (update)'; + label = (col.sortOrder !== 'ASC') ? 'Oldest (update)' : 'Newest (update)'; break; case 'Name': label = (col.sortOrder !== 'ASC') ? 'Name (a - z)' : 'Name (z - a)'; @@ -465,7 +500,7 @@ NfRegistryService.prototype = { } for (var i = 0; i < this.dropletsSearchTerms.length; i++) { - newData = this.filterData(newData, this.dropletsSearchTerms[i], true, sortBy); + newData = this.dataTableService.filterData(newData, this.dropletsSearchTerms[i], true); } newData = this.dataTableService.sortData(newData, sortBy, sortOrder); @@ -525,8 +560,8 @@ NfRegistryService.prototype = { } }); break; - case 'permissions': - this.router.navigateByUrl('/nifi-registry/administration/workflow(' + action.type + ':bucket/' + action.name + '/' + bucket.identifier + ')'); + case 'manage': + this.router.navigateByUrl('/nifi-registry/administration/workflow(' + action.type + ':' + action.name + '/bucket/' + bucket.identifier + ')'); break; default: break; @@ -566,7 +601,7 @@ NfRegistryService.prototype = { var newData = this.buckets; for (var i = 0; i < this.bucketsSearchTerms.length; i++) { - newData = this.filterData(newData, this.bucketsSearchTerms[i], true, sortBy); + newData = this.dataTableService.filterData(newData, this.bucketsSearchTerms[i], true); } newData = this.dataTableService.sortData(newData, sortBy, sortOrder); @@ -625,15 +660,20 @@ NfRegistryService.prototype = { allFilteredBucketsSelected: function () { var selected = 0; var allSelected = true; - this.filteredBuckets.forEach(function (c) { - if (c.checked) { + var disableMultiBucketDeleteAction = false; + this.filteredBuckets.forEach(function (bucket) { + if (bucket.checked) { selected++; } - if (c.checked === undefined || c.checked === false) { + if (bucket.checked === undefined || bucket.checked === false) { allSelected = false; } + if (bucket.permissions.canDelete === false) { + disableMultiBucketDeleteAction = true; + } }); + this.disableMultiBucketDeleteAction = disableMultiBucketDeleteAction; this.isMultiBucketActionsDisabled = (selected > 0) ? false : true; return allSelected; }, @@ -852,14 +892,14 @@ NfRegistryService.prototype = { var newUserGroupsData = this.groups; for (var i = 0; i < this.usersSearchTerms.length; i++) { - newUsersData = this.filterData(newUsersData, this.usersSearchTerms[i], true); + newUsersData = this.dataTableService.filterData(newUsersData, this.usersSearchTerms[i], true); } newUsersData = this.dataTableService.sortData(newUsersData, sortBy, sortOrder); this.filteredUsers = newUsersData; for (var i = 0; i < this.usersSearchTerms.length; i++) { - newUserGroupsData = this.filterData(newUserGroupsData, this.usersSearchTerms[i], true); + newUserGroupsData = this.dataTableService.filterData(newUserGroupsData, this.usersSearchTerms[i], true); } newUserGroupsData = this.dataTableService.sortData(newUserGroupsData, sortBy, sortOrder); @@ -874,17 +914,25 @@ NfRegistryService.prototype = { */ determineAllUsersAndGroupsSelectedState: function () { var allSelected = true; - this.filteredUserGroups.forEach(function (c) { - if (c.checked === undefined || c.checked === false) { + var disableMultiDeleteAction = false; + this.filteredUserGroups.forEach(function (group) { + if (group.checked === undefined || group.checked === false) { allSelected = false; } + if (group.checked && group.configurable === false) { + disableMultiDeleteAction = true; + } }); - this.filteredUsers.forEach(function (c) { - if (c.checked === undefined || c.checked === false) { + this.filteredUsers.forEach(function (user) { + if (user.checked === undefined || user.checked === false) { allSelected = false; } + if (user.checked && user.configurable === false) { + disableMultiDeleteAction = true; + } }); + this.disableMultiDeleteAction = disableMultiDeleteAction; this.allUsersAndGroupsSelected = allSelected; }, @@ -933,7 +981,7 @@ NfRegistryService.prototype = { this.filteredUserGroups.forEach(function (c) { c.checked = true; }); - this.allUsersAndGroupsSelected = true; + this.determineAllUsersAndGroupsSelectedState(); }, /** @@ -947,7 +995,7 @@ NfRegistryService.prototype = { this.filteredUserGroups.forEach(function (c) { c.checked = false; }); - this.allUsersAndGroupsSelected = false; + this.determineAllUsersAndGroupsSelectedState(); }, /** @@ -1006,6 +1054,8 @@ NfRegistryService.prototype = { case 'manage': this.router.navigateByUrl('/nifi-registry/administration/users(' + action.type + ':' + action.name + '/user/' + user.identifier + ')'); break; + default: + break; } }, @@ -1051,6 +1101,8 @@ NfRegistryService.prototype = { case 'manage': this.router.navigateByUrl('/nifi-registry/administration/users(' + action.type + ':' + action.name + '/group/' + group.identifier + ')'); break; + default: + break; } }, @@ -1112,6 +1164,7 @@ NfRegistryService.prototype = { }); }, + /** * Utility method that performs the custom search capability for data tables. * @@ -1120,7 +1173,7 @@ NfRegistryService.prototype = { * @param ignoreCase Ignore case. * @returns {*} */ - filterData: function (data, searchTerm, ignoreCase) { + experimental_filterData: function (data, searchTerm, ignoreCase) { var field = ''; if (searchTerm.indexOf(":") > -1) { field = searchTerm.split(':')[0].trim(); 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 e3d3164e2..bfd144638 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 @@ -30,7 +30,7 @@ var NfRegistryUsersAdministration = require('nifi-registry/components/administra var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js'); var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js'); var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js'); -var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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'); @@ -85,7 +85,7 @@ describe('NfRegistry Service isolated unit tests', function () { expect(label).toBe('Name (a - z)'); }); - it('should get the `Oldest (update)` sort by label', function () { + it('should get the `Newest (update)` sort by label', function () { //Setup the nfRegistryService state for this test nfRegistryService.dropletColumns[0].active = false; nfRegistryService.dropletColumns[1].active = true; @@ -94,10 +94,10 @@ describe('NfRegistry Service isolated unit tests', function () { var label = nfRegistryService.getSortByLabel(); //assertions - expect(label).toBe('Oldest (update)'); + expect(label).toBe('Newest (update)'); }); - it('should get the `Newest (update)` sort by label', function () { + it('should get the `Oldest (update)` sort by label', function () { //Setup the nfRegistryService state for this test nfRegistryService.dropletColumns[0].active = false; nfRegistryService.dropletColumns[1].active = true; @@ -107,7 +107,7 @@ describe('NfRegistry Service isolated unit tests', function () { var label = nfRegistryService.getSortByLabel(); //assertions - expect(label).toBe('Newest (update)'); + expect(label).toBe('Oldest (update)'); }); it('should generate the sort menu\'s `Name (a - z)` label', function () { @@ -131,15 +131,15 @@ describe('NfRegistry Service isolated unit tests', function () { expect(label).toBe('Name (z - a)'); }); - it('should generate the sort menu\'s `Newest (update)` label', function () { + it('should generate the sort menu\'s `Oldest (update)` label', function () { // The function to test var label = nfRegistryService.generateSortMenuLabels({name: 'updated', label: 'Updated', sortable: true}); //assertions - expect(label).toBe('Newest (update)'); + expect(label).toBe('Oldest (update)'); }); - it('should generate the sort menu\'s `Oldest (update)` label', function () { + it('should generate the sort menu\'s `Newest (update)` label', function () { // The function to test var label = nfRegistryService.generateSortMenuLabels({ name: 'updated', @@ -149,7 +149,7 @@ describe('NfRegistry Service isolated unit tests', function () { }); //assertions - expect(label).toBe('Oldest (update)'); + expect(label).toBe('Newest (update)'); }); it('should sort `droplets` by `column`', function () { @@ -275,10 +275,12 @@ describe('NfRegistry Service isolated unit tests', function () { //Setup the nfRegistryService state for this test nfRegistryService.filteredBuckets = [{ 'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', - 'name': 'Bucket #1' + 'name': 'Bucket #1', + 'permissions': [] }, { 'identifier': '5c04b4fb-9513-47bb-aa74-1ae34616bfdc', - 'name': 'Bucket #2' + 'name': 'Bucket #2', + 'permissions': [] }]; // The function to test @@ -294,11 +296,13 @@ describe('NfRegistry Service isolated unit tests', function () { nfRegistryService.filteredBuckets = [{ 'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', 'name': 'Bucket #1', - 'checked': true + 'checked': true, + 'permissions': [] }, { 'identifier': '5c04b4fb-9513-47bb-aa74-1ae34616bfdc', 'name': 'Bucket #2', - 'checked': true + 'checked': true, + 'permissions': [] }]; // The function to test @@ -693,7 +697,7 @@ describe('NfRegistry Service w/ Angular testing utils', function () { NfRegistryUsersAdministration, NfRegistryManageUser, NfRegistryManageGroup, - NfRegistryBucketPermissions, + NfRegistryManageBucket, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, @@ -915,7 +919,7 @@ describe('NfRegistry Service w/ Angular testing utils', function () { expect(nfRegistryService.buckets[0].identifier).toBe(1); }); - it('should execute a `permissions` action on a bucket.', function () { + it('should execute a `manage` action on a bucket.', function () { // from the root injector var router = ngCoreTesting.TestBed.get(ngRouter.Router); @@ -927,11 +931,11 @@ describe('NfRegistry Service w/ Angular testing utils', function () { var bucket = {identifier: '999'}; // The function to test - nfRegistryService.executeBucketAction({name: 'permissions', type: 'sidenav'}, bucket); + nfRegistryService.executeBucketAction({name: 'manage', type: 'sidenav'}, bucket); //assertions var navigateByUrlCall = router.navigateByUrl.calls.first(); - expect(navigateByUrlCall.args[0]).toBe('/nifi-registry/administration/workflow(sidenav:bucket/permissions/999)'); + expect(navigateByUrlCall.args[0]).toBe('/nifi-registry/administration/workflow(sidenav:manage/bucket/999)'); }); it('should execute a `delete` action on a user.', function () { 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 a66d70dce..77d27f949 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 @@ -114,8 +114,10 @@ 'nifi-registry/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js': 'components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js', 'nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js': 'components/administration/users/sidenav/manage-user/nf-registry-manage-user.js', 'nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js': 'components/administration/users/sidenav/manage-group/nf-registry-manage-group.js', - 'nifi-registry/components/administration/workflow/dialogs/nf-registry-create-bucket.js': 'components/administration/workflow/dialogs/nf-registry-create-bucket.js', - 'nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js': 'components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js', + 'nifi-registry/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js': 'components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js', + 'nifi-registry/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js': 'components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js', + 'nifi-registry/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js': 'components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js', + 'nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js': 'components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js', 'nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js': 'components/administration/workflow/nf-registry-workflow-administration.js', 'nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js': 'components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js', 'nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js': 'components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js', diff --git a/nifi-registry-web-ui/src/main/webapp/theming/_helperClasses.scss b/nifi-registry-web-ui/src/main/webapp/theming/_helperClasses.scss index 91119e547..898a8c7ef 100644 --- a/nifi-registry-web-ui/src/main/webapp/theming/_helperClasses.scss +++ b/nifi-registry-web-ui/src/main/webapp/theming/_helperClasses.scss @@ -50,6 +50,14 @@ color: $green3; } +.nonconfigurable { + background: $grey9; +} + +.selected-nonconfigurable { + background: repeating-linear-gradient(-45deg, $grey5, $grey5 10px, #fff 10px, #fff 20px) !important; +} + .nf-registry-button-container { position: absolute; bottom: 0px; diff --git a/nifi-registry-web-ui/src/main/webapp/theming/_structureElements.scss b/nifi-registry-web-ui/src/main/webapp/theming/_structureElements.scss index 3e8fa409c..396648344 100644 --- a/nifi-registry-web-ui/src/main/webapp/theming/_structureElements.scss +++ b/nifi-registry-web-ui/src/main/webapp/theming/_structureElements.scss @@ -16,114 +16,123 @@ */ body { - background: $grey12 url('/nifi-registry/images/registry-logo-web-app.svg') no-repeat center center; - background-size: 40%; + background: $grey12 url('/nifi-registry/images/registry-logo-web-app.svg') no-repeat center center; + background-size: 40%; } #nifi-registry-login-perspective { - background: $grey12 url('/nifi-registry/images/registry-logo-web-app.svg') no-repeat center center; - background-size: 40%; - position: absolute; - top: 0px; - left: 0px; - right: 0px; - bottom: 0px; + background: $grey12 url('/nifi-registry/images/registry-logo-web-app.svg') no-repeat center center; + background-size: 40%; + position: absolute; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; } #nifi-registry-not-found-perspective { - background: $grey12 url('/nifi-registry/images/registry-logo-web-app.svg') no-repeat center center; - background-size: 40%; - position: absolute; - top: 0px; - left: 0px; - right: 0px; - bottom: 0px; + background: $grey12 url('/nifi-registry/images/registry-logo-web-app.svg') no-repeat center center; + background-size: 40%; + position: absolute; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; } #nf-registry-app-container { - margin: 0; - width: 100%; - height: 100%; + margin: 0; + width: 100%; + height: 100%; } #nifi-registry-logo { - height: 44px; + height: 44px; } #nifi-registry-alerts-count { - border-radius: 50%; - background: $warnColor; - height: 14px; - width: 14px; - position: relative; - left: 9px; - color: #FFFFFF; - font-size: 9px; - text-align: center; - line-height: 14px; + border-radius: 50%; + background: $warnColor; + height: 14px; + width: 14px; + position: relative; + left: 9px; + color: #FFFFFF; + font-size: 9px; + text-align: center; + line-height: 14px; } #nifi-registry-toolbar { - min-width: 1045px; - background-color: #FFFFFF; - position: absolute; - z-index: 1000; - background: $grey11; + min-width: 1045px; + background-color: #FFFFFF; + position: absolute; + z-index: 1000; + background: $grey11; } #nifi-registry-toolbar .mat-icon-button { - color: $grey5; - font-size: 20px; - margin: 0; + color: $grey5; + font-size: 20px; + margin: 0; } -#nifi-registry-toolbar .mat-select-value-text, #nifi-registry-toolbar .mat-select-arrow{ - color: white; +#nifi-registry-toolbar .mat-select-value-text, #nifi-registry-toolbar .mat-select-arrow { + color: white; } -#nifi-registry-toolbar span, #nifi-registry-toolbar .link{ - color: $grey5; +#nifi-registry-toolbar span, #nifi-registry-toolbar .link { + color: $grey5; } #nf-registry-perspectives-container { - position: absolute; - top: 64px; - left: 0px; - right: 0px; - bottom: 0px; - min-height: 370px; - min-width: 1045px; - overflow: auto; - background: $grey12; - background-size: 40%; + position: absolute; + top: 64px; + left: 0px; + right: 0px; + bottom: 0px; + min-height: 370px; + min-width: 1045px; + overflow: auto; + background: $grey12; + background-size: 40%; } #current-user { - font-family: 'Roboto Slab'; - font-style: normal; - font-weight: normal; - font-size: 12px; - max-width: 250px; - text-overflow: ellipsis; - line-height: normal; - overflow: hidden; - white-space: nowrap; - color: $grey5; + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: normal; + font-size: 12px; + max-width: 250px; + text-overflow: ellipsis; + line-height: normal; + overflow: hidden; + white-space: nowrap; + color: $grey5; } #logout-link-container { - font-size: 12px; - text-transform:uppercase; + font-size: 12px; + text-transform: uppercase; } #loading-spinner { - position: absolute; - top: calc(50% - 50px); - left: calc(50% - 50px); - z-index: 2; + position: absolute; + top: calc(50% - 50px); + left: calc(50% - 50px); + z-index: 2; } mat-sidenav { - width: 40%; - min-width: 418px; + width: 40%; + min-width: 418px; +} + +.sidenav-content { + position: absolute; + bottom: 60px; + top: 80px; + right: 0px; + left: 0px; + overflow: auto; } diff --git a/nifi-registry-web-ui/src/main/webapp/theming/components/administration/users/_structureElements.scss b/nifi-registry-web-ui/src/main/webapp/theming/components/administration/users/_structureElements.scss index 0d5c4ad70..2dc41bb79 100644 --- a/nifi-registry-web-ui/src/main/webapp/theming/components/administration/users/_structureElements.scss +++ b/nifi-registry-web-ui/src/main/webapp/theming/components/administration/users/_structureElements.scss @@ -47,6 +47,12 @@ right: 10px; } +#nf-registry-workflow-bucket-permissions-side-nav-container { + position: absolute; + bottom: 15px; + right: 10px; +} + #nf-registry-user-group-permissions-side-nav-container { position: absolute; bottom: 15px; diff --git a/nifi-registry-web-ui/src/main/webapp/theming/components/explorer/grid-list/_structureElements.scss b/nifi-registry-web-ui/src/main/webapp/theming/components/explorer/grid-list/_structureElements.scss index 890889d4f..f56cd25e6 100644 --- a/nifi-registry-web-ui/src/main/webapp/theming/components/explorer/grid-list/_structureElements.scss +++ b/nifi-registry-web-ui/src/main/webapp/theming/components/explorer/grid-list/_structureElements.scss @@ -29,6 +29,7 @@ overflow: hidden; text-overflow: ellipsis; text-align: end; + width: 105px; } #nifi-registry-explorer-grid-list-viewer-droplet-container-details { @@ -38,6 +39,6 @@ #nifi-registry-explorer-grid-list-viewer-droplet-container-details-change-log { position: relative; left: 0px; - max-height: 230px; + max-height: 500px; overflow: auto; } \ No newline at end of file