http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js ---------------------------------------------------------------------- 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 0000000..01602dc --- /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;
http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.html ---------------------------------------------------------------------- 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/nf-registry-create-bucket.html deleted file mode 100644 index 6f2f9d0..0000000 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.html +++ /dev/null @@ -1,46 +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. ---> - -<div id="nifi-registry-admin-create-bucket-dialog"> - <div class="pad-bottom-md" fxLayout="row" fxLayoutAlign="space-between center"> - <span class="md-card-title">New Bucket</span> - <button mat-icon-button (click)="cancel()"> - <mat-icon color="primary">close</mat-icon> - </button> - </div> - <div fxLayout="column" fxLayoutAlign="space-between start" class="pad-bottom-md"> - <div class="pad-bottom-md fill-available-width"> - <mat-input-container floatPlaceholder="always" fxFlex> - <input #newBucketInput matInput floatPlaceholder="always" placeholder="Bucket Name" focused="true"> - </mat-input-container> - </div> - <mat-checkbox [(ngModel)]="keepDialogOpen"> - Keep this dialog open after creating bucket - </mat-checkbox> - </div> - <div fxLayout="row"> - <span fxFlex></span> - <button (click)="cancel()" color="fds-regular" mat-raised-button - i18n="Cancel creation of new bucket|A button for cancelling the creation of a new bucket in the registry.@@nf-admin-workflow-create-bucket-button"> - Cancel - </button> - <button [disabled]="newBucketInput.value.length === 0" class="push-left-sm" (click)="createBucket(newBucketInput)" color="fds-primary" mat-raised-button - i18n="Create new bucket button|A button for creating a new bucket in the registry.@@nf-admin-workflow-create-bucket-button"> - Create - </button> - </div> -</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.js b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.js deleted file mode 100644 index 115b699..0000000 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.js +++ /dev/null @@ -1,77 +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 ngMaterial = require('@angular/material'); - -/** - * NfRegistryCreateBucket constructor. - * - * @param nfRegistryApi The api service. - * @param nfRegistryService The nf-registry.service module. - * @param matDialogRef The angular material dialog ref. - * @constructor - */ -function NfRegistryCreateBucket(nfRegistryApi, nfRegistryService, matDialogRef) { - this.nfRegistryService = nfRegistryService; - this.nfRegistryApi = nfRegistryApi; - this.dialogRef = matDialogRef; - this.keepDialogOpen = false; -}; - -NfRegistryCreateBucket.prototype = { - constructor: NfRegistryCreateBucket, - - /** - * Create a new bucket. - * - * @param newBucketInput The newBucketInput element. - */ - createBucket: function (newBucketInput) { - var self = this; - this.nfRegistryApi.createBucket(newBucketInput.value).subscribe(function (bucket) { - self.nfRegistryService.buckets.push(bucket); - self.nfRegistryService.filterBuckets(); - self.nfRegistryService.allBucketsSelected = false; - if (self.keepDialogOpen !== true) { - self.dialogRef.close(); - } - }) - }, - - /** - * Cancel creation of a new bucket and close dialog. - */ - cancel: function () { - this.dialogRef.close(); - } -}; - -NfRegistryCreateBucket.annotations = [ - new ngCore.Component({ - template: require('./nf-registry-create-bucket.html!text') - }) -]; - -NfRegistryCreateBucket.parameters = [ - NfRegistryApi, - NfRegistryService, - ngMaterial.MatDialogRef -]; - -module.exports = NfRegistryCreateBucket; http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.spec.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.spec.js b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.spec.js deleted file mode 100644 index b07b235..0000000 --- a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.spec.js +++ /dev/null @@ -1,77 +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 NfRegistryApi = require('nifi-registry/services/nf-registry.api.js'); -var NfRegistryService = require('nifi-registry/services/nf-registry.service.js'); -var NfRegistryCreateBucket = require('nifi-registry/components/administration/workflow/dialogs/nf-registry-create-bucket.js'); -var rxjs = require('rxjs/Rx'); - -describe('NfRegistryCreateBucket Component isolated unit tests', function () { - var comp; - var nfRegistryService; - var nfRegistryApi; - - beforeEach(function () { - nfRegistryService = new NfRegistryService(); - nfRegistryApi = new NfRegistryApi(); - comp = new NfRegistryCreateBucket(nfRegistryApi, nfRegistryService, { - close: function () { - } - }); - - // Spy - spyOn(nfRegistryApi, 'createBucket').and.callFake(function () { - }).and.returnValue(rxjs.Observable.of({name: 'NewBucket'})); - spyOn(nfRegistryService, 'filterBuckets'); - spyOn(comp.dialogRef, 'close'); - }); - - it('should create a new bucket and close the dialog', function () { - // The function to test - comp.createBucket({value: 'NewBucket'}); - - //assertions - expect(comp).toBeDefined(); - expect(nfRegistryService.buckets.length).toBe(1); - expect(nfRegistryService.buckets[0].name).toBe('NewBucket'); - expect(nfRegistryService.filterBuckets).toHaveBeenCalled(); - expect(comp.dialogRef.close).toHaveBeenCalled(); - }); - - it('should create a new bucket and keep the dialog open', function () { - // setup the component - comp.keepDialogOpen = true; - - // The function to test - comp.createBucket({value: 'NewBucket'}); - - //assertions - expect(comp).toBeDefined(); - expect(nfRegistryService.buckets.length).toBe(1); - expect(nfRegistryService.buckets[0].name).toBe('NewBucket'); - expect(nfRegistryService.filterBuckets).toHaveBeenCalled(); - expect(comp.dialogRef.close.calls.count()).toEqual(0); - }); - - it('should close the dialog', function () { - // The function to test - comp.cancel(); - - //assertions - expect(comp.dialogRef.close).toHaveBeenCalled(); - }); -}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html ---------------------------------------------------------------------- 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 544e2d1..fd7453c 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 @@ limitations under the License. <div fxFlex class="pad-top-md pad-bottom-sm pad-left-md pad-right-md"> <span class="md-card-title">Buckets ({{nfRegistryService.buckets.length}})</span> <div flex class="push-right-sm" fxLayout="row" fxLayoutAlign="end center"> - <td-chips class="push-right-sm" [items]="nfRegistryService.autoCompleteBuckets" (add)="nfRegistryService.bucketsSearchAdd($event)" + <td-chips class="push-right-sm" + [items]="nfRegistryService.autoCompleteBuckets" + (add)="nfRegistryService.bucketsSearchAdd($event)" (remove)="nfRegistryService.bucketsSearchRemove($event)"></td-chips> - <button class="push-top-sm push-right-sm" color="fds-secondary" mat-raised-button (click)="createBucket()"> + <button class="push-top-sm push-right-sm" + color="fds-secondary" + mat-raised-button + [disabled]="!nfRegistryService.currentUser.resourcePermissions.buckets.canWrite" + (click)="createBucket()"> New Bucket </button> <button class="push-top-sm" [disabled]="nfRegistryService.isMultiBucketActionsDisabled" color="fds-primary" mat-raised-button [matMenuTriggerFor]="bucketActionMenu"> @@ -30,6 +36,7 @@ limitations under the License. </div> <mat-menu class="fds-primary-dropdown-button-menu" #bucketActionMenu="matMenu" [overlapTrigger]="false"> <button mat-menu-item + [disabled]="nfRegistryService.disableMultiBucketDeleteAction" (click)="nfRegistryService.deleteSelectedBuckets()"> <span>Delete</span> </button> @@ -55,11 +62,12 @@ limitations under the License. </div> <div id="nifi-registry-workflow-administration-buckets-list-container"> <div fxLayout="row" fxLayoutAlign="space-between center" class="td-data-table-row" - [ngClass]="{'selected' : row.checked}" *ngFor="let row of nfRegistryService.filteredBuckets" + [ngClass]="{'nonconfigurable' : row.configurable === false, 'selected-nonconfigurable' : (row.checked === true && row.configurable === false), 'selected' : row.checked === true}" + *ngFor="let row of nfRegistryService.filteredBuckets" (click)="row.checked = !row.checked;nfRegistryService.determineAllBucketsSelectedState()"> <div class="td-data-table-cell" *ngFor="let column of nfRegistryService.bucketColumns" fxFlex="{{column.width}}"> - <div matTooltip="{{column.format ? column.format(row[column.name]) : row[column.name]}}"> + <div class="ellipsis" matTooltip="{{column.format ? column.format(row[column.name]) : row[column.name]}}"> {{column.format ? column.format(row[column.name]) : row[column.name]}} </div> </div> @@ -69,7 +77,7 @@ limitations under the License. <button (click)="nfRegistryService.executeBucketAction(action, row);row.checked = !row.checked;" *ngFor="let action of nfRegistryService.bucketActions" matTooltip="{{action.tooltip}}" mat-icon-button color="accent" - [disabled]="action.disabled ? '' : null"> + [disabled]="action.disabled(row)"> <i class="{{action.icon}}" aria-hidden="true"></i> </button> <mat-checkbox class="pad-left-sm" [(ngModel)]="row.checked" [checked]="row.checked" @@ -85,7 +93,7 @@ limitations under the License. <button (click)="nfRegistryService.executeBucketAction(action, row);row.checked = !row.checked;" *ngFor="let action of nfRegistryService.bucketActions" matTooltip="{{action.tooltip}}" mat-menu-item - [disabled]="action.disabled ? '' : null"> + [disabled]="action.disabled(row)"> <i class="{{action.icon}}" aria-hidden="true"></i> <span>{{action.name}}</span> </button> http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js index 770b871..5bb3b20 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 + }); } }; http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js index 1a1641b..6ffca81 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, http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html ---------------------------------------------------------------------- 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 0000000..54f5c5c --- /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 @@ +<!-- +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. +--> + +<div fxFill> + <div fxLayout="row" fxLayoutAlign="space-between center" class="pad-top-sm pad-bottom-md pad-left-md pad-right-md"> + <span class="md-card-title">{{nfRegistryService.bucket.name}}</span> + <button mat-icon-button (click)="closeSideNav()"> + <mat-icon color="primary">close</mat-icon> + </button> + </div> + <div class="sidenav-content"> + <div class="pad-bottom-md pad-left-md pad-right-md" flex fxLayoutAlign="start center"> + <mat-input-container flex> + <input #bucketnameInput + matInput + [disabled]="!nfRegistryService.currentUser.resourcePermissions.buckets.canWrite" + placeholder="Identity/Bucket Name" + value="{{nfRegistryService.bucket.name}}" + [(ngModel)]="_bucketname"> + </mat-input-container> + <button [disabled]="nfRegistryService.bucket.name === _bucketname" + (click)="updateBucketName(bucketnameInput.value)" + class="input-button" + color="fds-regular" + mat-raised-button> + Save + </button> + </div> + <div *ngIf="!nfRegistryService.currentUser.anonymous || nfRegistryService.currentUser.resourcePermissions.policies.canRead" class="pad-top-md pad-bottom-sm pad-left-md pad-right-md"> + <div flex fxLayout="row" fxLayoutAlign="space-between center"> + <span class="md-card-title">Policies ({{userIdentitiesWithPolicies.length + groupIdentitiesWithPolicies.length}})</span> + <button color="fds-secondary" + [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite" + mat-raised-button + (click)="addPolicy()"> + New Policy + </button> + </div> + <div id="nifi-registry-manage-bucket-list-container-column-header" fxLayout="row" + fxLayoutAlign="space-between center" class="td-data-table"> + <div class="td-data-table-column" (click)="sortUsers(column)" + *ngFor="let column of nfRegistryService.bucketPoliciesColumns" + fxFlex="{{column.width}}"> + {{column.label}} + <i *ngIf="column.active && column.sortable && column.sortOrder === 'ASC'" class="fa fa-caret-up" + aria-hidden="true"></i> + <i *ngIf="column.active && column.sortable && column.sortOrder === 'DESC'" class="fa fa-caret-down" + aria-hidden="true"></i> + </div> + <div class="td-data-table-column"></div> + </div> + <div id="nifi-registry-manage-bucket-list-container"> + <div fxLayout="row" fxLayoutAlign="space-between center" class="td-data-table-row" + [ngClass]="{'selected' : row.checked}" *ngFor="let row of filteredGroupPermsData" + (click)="row.checked = !row.checked"> + <div class="td-data-table-cell" *ngFor="let column of nfRegistryService.bucketPoliciesColumns" + fxFlex="{{column.width}}"> + <div class="ellipsis" + matTooltip="{{column.format ? column.format(row[column.name]) : row[column.name]}}"> + <i *ngIf="column.name === 'identity'" class="fa fa-users push-right-sm" + aria-hidden="true"></i>{{column.format ? column.format(row[column.name]) : + row[column.name]}} + </div> + </div> + <div class="td-data-table-cell"> + <button (click)="editPolicy(row);row.checked = !row.checked;" + [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite" + matTooltip="'Edit user policies of this bucket'" mat-icon-button color="accent"> + <i class="fa fa-pencil" aria-hidden="true"></i> + </button> + <button (click)="removePolicyFromBucket(row);row.checked = !row.checked;" + [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canDelete" + matTooltip="'Remove group policies from bucket'" mat-icon-button color="accent"> + <i class="fa fa-minus-circle" aria-hidden="true"></i> + </button> + </div> + </div> + <div fxLayout="row" fxLayoutAlign="space-between center" class="td-data-table-row" + [ngClass]="{'selected' : row.checked}" *ngFor="let row of filteredUserPermsData" + (click)="row.checked = !row.checked"> + <div class="td-data-table-cell" *ngFor="let column of nfRegistryService.bucketPoliciesColumns" + fxFlex="{{column.width}}"> + <div class="ellipsis" + matTooltip="{{column.format ? column.format(row[column.name]) : row[column.name]}}"> + {{column.format ? column.format(row[column.name]) : row[column.name]}} + </div> + </div> + <div class="td-data-table-cell"> + <button (click)="editPolicy(row);row.checked = !row.checked;" + matTooltip="'Edit user policies of this bucket'" mat-icon-button color="accent" + [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite"> + <i class="fa fa-pencil" aria-hidden="true"></i> + </button> + <button (click)="removePolicyFromBucket(row);row.checked = !row.checked;" + matTooltip="'Remove user policies from this bucket'" mat-icon-button color="accent" + [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canDelete"> + <i class="fa fa-trash" aria-hidden="true"></i> + </button> + </div> + </div> + <div class="mat-padding" + *ngIf="filteredUserPermsData.length === 0 && filteredGroupPermsData.length === 0" + layout="row" + layout-align="center center"> + <h3>No results to display.</h3> + </div> + </div> + </div> + </div> + <button id="nf-registry-workflow-bucket-permissions-side-nav-container" class="push-right-md" mat-raised-button + color="fds-primary" + (click)="closeSideNav()">Close + </button> +</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js ---------------------------------------------------------------------- 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 0000000..8bb3286 --- /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; http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js index 1712ada..7f4ae24 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(); } }; http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js index 3c9e5cc..135408e 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, http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js index a8c1218..d85f68b 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(); } }; http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js index b41d3c6..772db0a 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, http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html index f1d58f3..7d38992 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 @@ limitations under the License. <td-chips [(ngModel)]="nfRegistryService.dropletsSearchTerms" [items]="nfRegistryService.autoCompleteDroplets" (add)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name, nfRegistryService.activeDropletColumn.sortOrder);" - (remove)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name, nfRegistryService.activeDropletColumn.sortOrder);" class="push-right-sm"></td-chips> + (remove)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name, nfRegistryService.activeDropletColumn.sortOrder);"class="push-right-sm"></td-chips> <span class="push-top-sm pad-right-sm">Sort by:</span> <div fxLayout="row" fxLayoutAlign="end center" [matMenuTriggerFor]="dropletGridSortMenu"> <div class="push-top-sm" id="droplet-sort-by-field">{{nfRegistryService.getSortByLabel()}}</div> @@ -64,22 +64,24 @@ limitations under the License. <mat-menu class="fds-primary-dropdown-button-menu" #primaryButtonDropdownMenu="matMenu" [overlapTrigger]="false"> <button mat-menu-item *ngFor="let action of nfRegistryService.dropletActions" + [disabled]="!droplet.permissions.canDelete" (click)="nfRegistryService.executeDropletAction(action, droplet)"> <span>{{action.name}}</span> </button> </mat-menu> </div> <div fxLayout="row"> - <div fxFlex="25"> + <div fxFlex="25" class="pad-left-sm"> <span class="uppercase">Description</span> </div> <div fxFlex="75"> <span class="uppercase">Change Log</span> </div> </div> - <div fxLayout="row"> + <div fxLayout="row" class="pad-left-sm"> <div fxFlex="25"> - <p>{{droplet.description}}</p> + <p *ngIf="droplet.description">{{droplet.description}}</p> + <p *ngIf="!droplet.description">No description specified</p> </div> <div id="nifi-registry-explorer-grid-list-viewer-droplet-container-details-change-log" fxFlex="75"> @@ -88,9 +90,12 @@ limitations under the License. *ngFor="let snapshotMeta of droplet.snapshotMetadata; let i = index" [active]="i === 0 ? true : false"> <div fxLayout="column" fxLayoutAlign="space-between stretch"> - <div fxLayout="row" class="md-body-2"> + <div *ngIf="snapshotMeta.comments" fxLayout="row" class="md-body-2"> {{snapshotMeta.comments}} </div> + <div *ngIf="!snapshotMeta.comments" fxLayout="row" class="md-body-2"> + No comments specified + </div> <div fxLayout="row" class="mat-caption"> {{(snapshotMeta.timestamp/1000 | amFromUnix) | amDateFormat:'MMM-DD-YYYY'}} at {{(snapshotMeta.timestamp/1000 | amFromUnix) | amDateFormat:'h:mm A'}} </div> http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js index b3ff7e7..2160086 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(); } }; http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js index be04713..991127b 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, http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js b/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js index 228f9dd..2676cd5 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, http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.js ---------------------------------------------------------------------- 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 77fb7e2..e9e7a5c 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;
