http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..1f0feb5 --- /dev/null +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html @@ -0,0 +1,158 @@ +<!-- +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.user.identity}}</span> + <button mat-icon-button (click)="closeSideNav()"> + <mat-icon color="primary">close</mat-icon> + </button> + </div> + <div class="pad-bottom-md pad-left-md pad-right-md" flex fxLayoutAlign="start center"> + <mat-input-container flex> + <input #usernameInput + matInput + [disabled]="!nfRegistryService.currentUser.resourcePermissions.tenants.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" + placeholder="Identity/User Name" + value="{{nfRegistryService.user.identity}}" + [(ngModel)]="_username"> + </mat-input-container> + <button [disabled]="nfRegistryService.user.identity === _username || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" + (click)="updateUserName(usernameInput.value)" + class="input-button" + color="fds-regular" + mat-raised-button> + Save + </button> + </div> + <div class="pad-bottom-md pad-left-md pad-right-md" flex fxLayout="column" fxLayoutAlign="space-between start"> + <div> + <span class="header">Special Privileges + <i matTooltip="Allows a user to manage NiFi Registry users and groups, buckets, proxies, and policies." + class="pad-left-sm fa fa-question-circle-o help-icon"></i> + </span> + </div> + <mat-checkbox [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [checked]="nfRegistryService.user.resourcePermissions.buckets.canRead && nfRegistryService.user.resourcePermissions.buckets.canWrite && nfRegistryService.user.resourcePermissions.buckets.canDelete" (change)="toggleUserManageBucketsPrivileges($event)"> + <span class="description">Can manage buckets</span> + </mat-checkbox> + <div flex fxLayout="row" fxLayoutAlign="space-around center"> + <mat-checkbox class="pad-left-md" [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [(checked)]="nfRegistryService.user.resourcePermissions.buckets.canRead" (change)="toggleUserManageBucketsPrivileges($event, 'read')"> + <span class="description">Read</span> + </mat-checkbox> + <mat-checkbox class="pad-left-md" [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [(checked)]="nfRegistryService.user.resourcePermissions.buckets.canWrite" (change)="toggleUserManageBucketsPrivileges($event, 'write')"> + <span class="description">Write</span> + </mat-checkbox> + <mat-checkbox class="pad-left-md" [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [(checked)]="nfRegistryService.user.resourcePermissions.buckets.canDelete" (change)="toggleUserManageBucketsPrivileges($event, 'delete')"> + <span class="description">Delete</span> + </mat-checkbox> + </div> + <mat-checkbox [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [checked]="nfRegistryService.user.resourcePermissions.tenants.canRead && nfRegistryService.user.resourcePermissions.tenants.canWrite && nfRegistryService.user.resourcePermissions.tenants.canDelete" (change)="toggleUserManageTenantsPrivileges($event)"> + <span class="description">Can manage users</span> + </mat-checkbox> + <div flex fxLayout="row" fxLayoutAlign="space-around center"> + <mat-checkbox class="pad-left-md" [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [(checked)]="nfRegistryService.user.resourcePermissions.tenants.canRead" (change)="toggleUserManageTenantsPrivileges($event, 'read')"> + <span class="description">Read</span> + </mat-checkbox> + <mat-checkbox class="pad-left-md" [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [(checked)]="nfRegistryService.user.resourcePermissions.tenants.canWrite" (change)="toggleUserManageTenantsPrivileges($event, 'write')"> + <span class="description">Write</span> + </mat-checkbox> + <mat-checkbox class="pad-left-md" [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [(checked)]="nfRegistryService.user.resourcePermissions.tenants.canDelete" (change)="toggleUserManageTenantsPrivileges($event, 'delete')"> + <span class="description">Delete</span> + </mat-checkbox> + </div> + <mat-checkbox [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [checked]="nfRegistryService.user.resourcePermissions.policies.canRead && nfRegistryService.user.resourcePermissions.policies.canWrite && nfRegistryService.user.resourcePermissions.policies.canDelete" (change)="toggleUserManagePoliciesPrivileges($event)"> + <span class="description">Can manage policies</span> + </mat-checkbox> + <div flex fxLayout="row" fxLayoutAlign="space-around center"> + <mat-checkbox class="pad-left-md" [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [(checked)]="nfRegistryService.user.resourcePermissions.policies.canRead" (change)="toggleUserManagePoliciesPrivileges($event, 'read')"> + <span class="description">Read</span> + </mat-checkbox> + <mat-checkbox class="pad-left-md" [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [(checked)]="nfRegistryService.user.resourcePermissions.policies.canWrite" (change)="toggleUserManagePoliciesPrivileges($event, 'write')"> + <span class="description">Write</span> + </mat-checkbox> + <mat-checkbox class="pad-left-md" [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [(checked)]="nfRegistryService.user.resourcePermissions.policies.canDelete" (change)="toggleUserManagePoliciesPrivileges($event, 'delete')"> + <span class="description">Delete</span> + </mat-checkbox> + </div> + <mat-checkbox [disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)" [checked]="nfRegistryService.user.resourcePermissions.proxy.canWrite" (change)="toggleUserManageProxyPrivileges($event)"> + <span class="description">Can proxy user requests</span> + </mat-checkbox> + </div> + <mat-button-toggle-group name="nifi-registry-manage-user-perspective" class="pad-left-md tab-toggle-group"> + <mat-button-toggle [checked]="manageUserPerspective === 'membership'" + value="membership" + class="uppercase" + (change)="manageUserPerspective = 'membership'" + i18n="Group membership tab, user management sidenav|View the groups to which this user belongs.@@nf-admin-user-management-sidenav-membership-tab-title"> + Membership + </mat-button-toggle> + </mat-button-toggle-group> + <div *ngIf="manageUserPerspective === 'membership'"> + <div *ngIf="nfRegistryService.user.userGroups" fxFlex 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">Membership ({{nfRegistryService.user.userGroups.length}})</span> + <button color="fds-secondary" + [disabled]="!nfRegistryService.currentUser.resourcePermissions.tenants.canWrite" + mat-raised-button + (click)="addUserToGroups()"> + Add To Group + </button> + </div> + <div id="nifi-registry-user-membership-list-container-column-header" fxLayout="row" + fxLayoutAlign="space-between center" class="td-data-table"> + <div class="td-data-table-column" (click)="sortGroups(column)" + *ngFor="let column of nfRegistryService.userGroupsColumns" + 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> + <div id="nifi-registry-user-membership-list-container"> + <div fxLayout="row" fxLayoutAlign="space-between center" class="td-data-table-row" + [ngClass]="{'selected' : row.checked}" *ngFor="let row of filteredUserGroups" + (click)="row.checked = !row.checked"> + <div class="td-data-table-cell" *ngFor="let column of nfRegistryService.userGroupsColumns" + fxFlex="{{column.width}}"> + <div matTooltip="{{column.format ? column.format(row[column.name]) : row[column.name]}}"> + <i 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"> + <div> + <button (click)="removeUserFromGroup(row);row.checked = !row.checked;" + matTooltip="'Remove user from group'" mat-icon-button color="accent" + *ngIf="nfRegistryService.currentUser.resourcePermissions.tenants.canWrite"> + <i class="fa fa-minus-circle" aria-hidden="true"></i> + </button> + </div> + </div> + </div> + </div> + <div class="mat-padding" *ngIf="nfRegistryService.user.userGroups.length === 0" layout="row" + layout-align="center center"> + <h3>This user does not belong to any groups yet.</h3> + </div> + </div> + </div> + <button id="nf-registry-user-permissions-side-nav-container" class="push-right-md" mat-raised-button + color="fds-primary" + (click)="closeSideNav()">Close + </button> +</div>
http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..59aca5f --- /dev/null +++ b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js @@ -0,0 +1,577 @@ +/* + * 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 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 NfRegistryAddUserToGroups = require('nifi-registry/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js'); + +/** + * NfRegistryManageUser 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 NfRegistryManageUser(nfRegistryApi, nfRegistryService, tdDataTableService, fdsDialogService, fdsSnackBarService, activatedRoute, router, matDialog) { + this.filteredUserGroups = []; + this.userGroupsSearchTerms = []; + this._username = ''; + this.manageUserPerspective = 'membership'; + + // 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; +}; + +NfRegistryManageUser.prototype = { + constructor: NfRegistryManageUser, + + /** + * Initialize the component. + */ + ngOnInit: function () { + var self = this; + this.nfRegistryService.sidenav.open(); + + // subscribe to the route params + self.route.params + .switchMap(function (params) { + return self.nfRegistryApi.getUser(params['userId']); + }) + .subscribe(function (response) { + self.nfRegistryService.user = response; + self._username = response.identity; + self.filterGroups(); + }); + }, + + /** + * Destroy the component. + */ + ngOnDestroy: function () { + this.nfRegistryService.sidenav.close(); + }, + + /** + * Navigate to administer users for current registry. + */ + closeSideNav: function () { + this.router.navigateByUrl('/nifi-registry/administration/users'); + }, + + /** + * Toggles the manage bucket privileges for the user. + * + * @param $event + * @param policyAction The action to be toggled + */ + toggleUserManageBucketsPrivileges: function ($event, policyAction) { + var self = this; + if($event.checked) { + for (var resource in this.nfRegistryService.BUCKETS_PRIVS) { + if (this.nfRegistryService.BUCKETS_PRIVS.hasOwnProperty(resource)) { + 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) { + // resource does NOT exist, let's create it + self.nfRegistryApi.postPolicyActionResource(action, resource, [self.nfRegistryService.user], []).subscribe( + function (response) { + // can manage buckets privileges created and granted!!!...now update the view + response.users.forEach(function (user) { + if (user.identifier === self.nfRegistryService.user.identifier) { + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function(response) { + self.nfRegistryService.user = response; + }); + } + }); + }); + } else { + // resource exists, let's update it + policy.users.push(self.nfRegistryService.user); + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // can manage buckets privileges updated!!!...now update the view + response.users.forEach(function (user) { + if (user.identifier === self.nfRegistryService.user.identifier) { + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function(response) { + self.nfRegistryService.user = response; + }); + } + }); + }); + } + }); + } + }); + } + } + } else { + // Remove the current user from the /buckets resources + for (var resource in this.nfRegistryService.BUCKETS_PRIVS) { + if (this.nfRegistryService.BUCKETS_PRIVS.hasOwnProperty(resource)) { + 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) { + // resource does NOT exist + } else { + // 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) { + // can manage buckets privileges updated!!!...now update the view + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function(response) { + self.nfRegistryService.user = response; + }); + }); + } + }); + } + }); + } + } + + } + }, + + /** + * Toggles the manage tenants privileges for the user. + * + * @param $event + * @param policyAction The action to be toggled + */ + toggleUserManageTenantsPrivileges: function ($event, policyAction) { + var self = this; + if($event.checked) { + for (var resource in this.nfRegistryService.TENANTS_PRIVS) { + if (this.nfRegistryService.TENANTS_PRIVS.hasOwnProperty(resource)) { + 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) { + // resource does NOT exist, let's create it + self.nfRegistryApi.postPolicyActionResource(action, resource, [self.nfRegistryService.user], []).subscribe( + function (response) { + // can manage tenants privileges created and granted!!!...now update the view + response.users.forEach(function (user) { + if (user.identifier === self.nfRegistryService.user.identifier) { + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function (response) { + self.nfRegistryService.user = response; + }); + } + }); + }); + } else { + // resource exists, let's update it + policy.users.push(self.nfRegistryService.user); + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // can manage tenants privileges updated!!!...now update the view + response.users.forEach(function (user) { + if (user.identifier === self.nfRegistryService.user.identifier) { + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function (response) { + self.nfRegistryService.user = response; + }); + } + }); + }); + } + }); + } + }); + } + } + } else { + // Remove the current user from the administrator resources + for (var resource in this.nfRegistryService.TENANTS_PRIVS) { + if (this.nfRegistryService.TENANTS_PRIVS.hasOwnProperty(resource)) { + 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) { + // resource does NOT exist + } else { + // 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) { + // can manage tenants privileges updated!!!...now update the view + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function (response) { + self.nfRegistryService.user = response; + }); + }); + } + }); + } + }); + } + } + + } + }, + + /** + * Toggles the manage policies privileges for the user. + * + * @param $event + * @param policyAction The action to be toggled + */ + toggleUserManagePoliciesPrivileges: function ($event, policyAction) { + var self = this; + if($event.checked) { + for (var resource in this.nfRegistryService.POLICIES_PRIVS) { + if (this.nfRegistryService.POLICIES_PRIVS.hasOwnProperty(resource)) { + 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) { + // resource does NOT exist, let's create it + self.nfRegistryApi.postPolicyActionResource(action, resource, [self.nfRegistryService.user], []).subscribe( + function (response) { + // can manage policies privileges created and granted!!!...now update the view + response.users.forEach(function (user) { + if (user.identifier === self.nfRegistryService.user.identifier) { + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function (response) { + self.nfRegistryService.user = response; + }); + } + }); + }); + } else { + // resource exists, let's update it + policy.users.push(self.nfRegistryService.user); + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // can manage policies privileges updated!!!...now update the view + response.users.forEach(function (user) { + if (user.identifier === self.nfRegistryService.user.identifier) { + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function (response) { + self.nfRegistryService.user = response; + }); + } + }); + }); + } + }); + } + }); + } + } + } else { + // Remove the current user from the administrator resources + for (var resource in this.nfRegistryService.POLICIES_PRIVS) { + if (this.nfRegistryService.POLICIES_PRIVS.hasOwnProperty(resource)) { + 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) { + // resource does NOT exist + } else { + // 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) { + // can manage policies privileges updated!!!...now update the view + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function (response) { + self.nfRegistryService.user = response; + }); + }); + } + }); + } + }); + } + } + + } + }, + + /** + * Toggles the manage proxy privileges for the user. + * + * @param $event + * @param policyAction The action to be toggled + */ + toggleUserManageProxyPrivileges: function ($event, policyAction) { + var self = this; + if($event.checked) { + for (var resource in this.nfRegistryService.PROXY_PRIVS) { + if (this.nfRegistryService.PROXY_PRIVS.hasOwnProperty(resource)) { + 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) { + // resource does NOT exist, let's create it + self.nfRegistryApi.postPolicyActionResource(action, resource, [self.nfRegistryService.user], []).subscribe( + function (response) { + // can manage proxy privileges created and granted!!!...now update the view + response.users.forEach(function (user) { + if (user.identifier === self.nfRegistryService.user.identifier) { + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function (response) { + self.nfRegistryService.user = response; + }); + } + }); + }); + } else { + // resource exists, let's update it + policy.users.push(self.nfRegistryService.user); + self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action, + policy.resource, policy.users, policy.userGroups).subscribe( + function (response) { + // can manage proxy privileges updated!!!...now update the view + response.users.forEach(function (user) { + if (user.identifier === self.nfRegistryService.user.identifier) { + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function (response) { + self.nfRegistryService.user = response; + }); + } + }); + }); + } + }); + } + }); + } + } + } else { + // Remove the current user from the administrator resources + for (var resource in this.nfRegistryService.PROXY_PRIVS) { + if (this.nfRegistryService.PROXY_PRIVS.hasOwnProperty(resource)) { + 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) { + // resource does NOT exist + } else { + // 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) { + // administrator privileges updated!!!...now update the view + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function (response) { + self.nfRegistryService.user = response; + }); + }); + } + }); + } + }); + } + } + + } + }, + + /** + * Opens a modal dialog UX enabling the addition of this user to multiple groups. + */ + addUserToGroups: function () { + var self = this; + this.dialog.open(NfRegistryAddUserToGroups, { + data: { + user: this.nfRegistryService.user + } + }).afterClosed().subscribe(function () { + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier) + .subscribe(function (response) { + self.nfRegistryService.user = response; + self._username = response.identity; + self.filterGroups(); + }); + }); + }, + + /** + * Filter groups. + * + * @param {string} [sortBy] The column name to sort `userGroupsColumns` by. + * @param {string} [sortOrder] The order. Either 'ASC' or 'DES' + */ + filterGroups: 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 `userGroupsColumns` + 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.nfRegistryService.user.userGroups || []; + + for (var i = 0; i < this.userGroupsSearchTerms.length; i++) { + newUserGroupsData = this.filterData(newUserGroupsData, this.userGroupsSearchTerms[i], true); + } + + newUserGroupsData = this.dataTableService.sortData(newUserGroupsData, sortBy, sortOrder); + this.filteredUserGroups = newUserGroupsData; + }, + + /** + * Sort `groups` by `column`. + * + * @param column The column to sort by. + */ + sortGroups: function (column) { + if (column.sortable) { + var sortBy = column.name; + var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC'; + this.filterGroups(sortBy, sortOrder); + + //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 + column.active = true; + } + }, + + /** + * Remove user from group. + * + * @param group + */ + removeUserFromGroup: function (group) { + var self = this; + var userGroups = this.nfRegistryService.user.userGroups.filter(function (userGroup) { + if (userGroup.identifier !== group.identifier) { + return userGroup; + } + }); + + this.nfRegistryApi.updateUserGroup(group.identifier, group.identity, userGroups).subscribe(function (response) { + self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier) + .subscribe(function (response) { + self.nfRegistryService.user = response; + self.filterGroups(); + }); + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'This user has been removed from the ' + group.identity + ' group.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + }); + }, + + /** + * Update user name. + * + * @param username + */ + updateUserName: function (username) { + var self = this; + this.nfRegistryApi.updateUser(this.nfRegistryService.user.identifier, username).subscribe(function (response) { + if(!response.status || response.status === 200) { + self.nfRegistryService.user = response; + self.nfRegistryService.users.filter(function(user) { + if (self.nfRegistryService.user.identifier === user.identifier){ + user.identity = response.identity; + } + }); + var snackBarRef = self.snackBarService.openCoaster({ + title: 'Success', + message: 'This user name has been updated.', + verticalPosition: 'bottom', + horizontalPosition: 'right', + icon: 'fa fa-check-circle-o', + color: '#1EB475', + duration: 3000 + }); + } else if (response.status === 409) { + self._username = self.nfRegistryService.user.identity; + self.dialogService.openConfirm({ + title: 'Error', + message: 'This user already exists. Please enter a different identity/user name.', + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + } + }); + } +}; + +NfRegistryManageUser.annotations = [ + new ngCore.Component({ + template: require('./nf-registry-manage-user.html!text') + }) +]; + +NfRegistryManageUser.parameters = [ + NfRegistryApi, + NfRegistryService, + covalentCore.TdDataTableService, + fdsDialogsModule.FdsDialogService, + fdsSnackBarsModule.FdsSnackBarService, + ngRouter.ActivatedRoute, + ngRouter.Router, + ngMaterial.MatDialog +]; + +module.exports = NfRegistryManageUser; http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.html ---------------------------------------------------------------------- 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 index 4c46910..bae5218 100644 --- 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 @@ -16,12 +16,98 @@ limitations under the License. --> <div fxFill> - <div fxLayout="row" fxLayoutAlign="space-between center" class="pad-top-md pad-bottom-md pad-left-sm pad-right-sm"> + <div fxLayout="row" fxLayoutAlign="space-between center" class="pad-top-sm pad-bottom-md pad-left-md pad-right-md"> <span *ngIf="nfRegistryService.bucket.identifier" 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="pad-bottom-md pad-left-md pad-right-md" flex fxLayoutAlign="start center"> + <mat-input-container floatPlaceholder="always" flex> + <input matInput placeholder="Bucket Name" value="{{nfRegistryService.bucket.name}}"> + </mat-input-container> + <button class="input-button" color="fds-regular" mat-raised-button> + Save + </button> + </div> + <!--<div id="nifi-registry-bucket-permissions-container" class="mat-elevation-z5">--> + <!--<div fxFlex class="pad-top-md pad-bottom-sm pad-left-md pad-right-md">--> + <!--<span class="md-card-title">Policies ({{nfRegistryService.bucket.authorizedActions.length}})</span>--> + <!--<div id="nifi-registry-bucket-permissions-list-container-column-header" fxLayout="row"--> + <!--fxLayoutAlign="space-between center" class="td-data-table">--> + <!--<div class="td-data-table-column" (click)="nfRegistryService.sortBuckets(column)"--> + <!--*ngFor="let column of nfRegistryService.bucketColumns"--> + <!--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 fxLayout="row" fxLayoutAlign="end center">--> + <!--<mat-checkbox class="pad-left-sm" [(ngModel)]="nfRegistryService.allBucketsSelected"--> + <!--(checked)="nfRegistryService.allBucketsSelected"--> + <!--(change)="nfRegistryService.toggleBucketsSelectAll()"></mat-checkbox>--> + <!--</div>--> + <!--</div>--> + <!--</div>--> + <!--<div id="nifi-registry-bucket-permissions-list-container">--> + <!--<div fxLayout="row" fxLayoutAlign="space-between center" class="td-data-table-row"--> + <!--[ngClass]="{'selected' : row.checked}" *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]}}">--> + <!--{{column.format ? column.format(row[column.name]) : row[column.name]}}--> + <!--</div>--> + <!--</div>--> + <!--<div class="td-data-table-cell">--> + <!--<div>--> + <!--<div *ngIf="bucketActions.length <= 4" fxLayout="row" fxLayoutAlign="end center">--> + <!--<button (click)="nfRegistryService.executeBucketAction(action, row);row.checked = !row.checked;"--> + <!--*ngFor="let action of bucketActions"--> + <!--matTooltip="{{action.tooltip}}" mat-icon-button color="accent"--> + <!--[disabled]="action.disabled ? '' : null">--> + <!--<i class="{{action.icon}}" aria-hidden="true"></i>--> + <!--</button>--> + <!--<mat-checkbox class="pad-left-sm" [(ngModel)]="row.checked" [checked]="row.checked"--> + <!--(change)="nfRegistryService.determineAllBucketsSelectedState()"--> + <!--(click)="row.checked = !row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox>--> + <!--</div>--> + <!--<div *ngIf="bucketActions.length > 4" fxLayout="row" fxLayoutAlign="end center">--> + <!--<button (click)="row.checked = !row.checked" matTooltip="Actions" mat-icon-button--> + <!--[matMenuTriggerFor]="bucketTableActionMenu">--> + <!--<i class="fa fa-ellipsis-h" aria-hidden="true"></i>--> + <!--</button>--> + <!--<mat-menu #bucketTableActionMenu="matMenu" [overlapTrigger]="false">--> + <!--<button (click)="nfRegistryService.executeBucketAction(action, row);row.checked = !row.checked;"--> + <!--*ngFor="let action of bucketActions"--> + <!--matTooltip="{{action.tooltip}}" mat-menu-item--> + <!--[disabled]="action.disabled ? '' : null">--> + <!--<i class="{{action.icon}}" aria-hidden="true"></i>--> + <!--<span>{{action.name}}</span>--> + <!--</button>--> + <!--</mat-menu>--> + <!--<mat-checkbox [(ngModel)]="row.checked" [checked]="row.checked"--> + <!--(change)="nfRegistryService.determineAllBucketsSelectedState()"--> + <!--(click)="row.checked = !row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox>--> + <!--</div>--> + <!--</div>--> + <!--<div *ngIf="!bucketActions" fxLayout="row" fxLayoutAlign="end center">--> + <!--<mat-checkbox [(ngModel)]="row.checked" [checked]="row.checked"--> + <!--(change)="nfRegistryService.determineAllBucketsSelectedState(row)"--> + <!--(click)="row.checked = !row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox>--> + <!--</div>--> + <!--</div>--> + <!--</div>--> + <!--</div>--> + <!--<div class="mat-padding" *ngIf="nfRegistryService.filteredBuckets.length === 0" layout="row"--> + <!--layout-align="center center">--> + <!--<h3>No results to display.</h3>--> + <!--</div>--> + <!--</div>--> + <!--</div>--> <button id="nf-registry-workflow-bucket-permissions-side-nav-container" mat-raised-button color="fds-primary" (click)="closeSideNav()">Close </button> http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/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 5ff3247..544e2d1 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 @@ -65,9 +65,9 @@ limitations under the License. </div> <div class="td-data-table-cell"> <div> - <div *ngIf="bucketActions.length <= 4" fxLayout="row" fxLayoutAlign="end center"> + <div *ngIf="nfRegistryService.bucketActions.length <= 4" fxLayout="row" fxLayoutAlign="end center"> <button (click)="nfRegistryService.executeBucketAction(action, row);row.checked = !row.checked;" - *ngFor="let action of bucketActions" + *ngFor="let action of nfRegistryService.bucketActions" matTooltip="{{action.tooltip}}" mat-icon-button color="accent" [disabled]="action.disabled ? '' : null"> <i class="{{action.icon}}" aria-hidden="true"></i> @@ -76,14 +76,14 @@ limitations under the License. (change)="nfRegistryService.determineAllBucketsSelectedState()" (click)="row.checked = !row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox> </div> - <div *ngIf="bucketActions.length > 4" fxLayout="row" fxLayoutAlign="end center"> + <div *ngIf="nfRegistryService.bucketActions.length > 4" fxLayout="row" fxLayoutAlign="end center"> <button (click)="row.checked = !row.checked" matTooltip="Actions" mat-icon-button [matMenuTriggerFor]="bucketTableActionMenu"> <i class="fa fa-ellipsis-h" aria-hidden="true"></i> </button> <mat-menu #bucketTableActionMenu="matMenu" [overlapTrigger]="false"> <button (click)="nfRegistryService.executeBucketAction(action, row);row.checked = !row.checked;" - *ngFor="let action of bucketActions" + *ngFor="let action of nfRegistryService.bucketActions" matTooltip="{{action.tooltip}}" mat-menu-item [disabled]="action.disabled ? '' : null"> <i class="{{action.icon}}" aria-hidden="true"></i> @@ -95,7 +95,7 @@ limitations under the License. (click)="row.checked = !row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox> </div> </div> - <div *ngIf="!bucketActions" fxLayout="row" fxLayoutAlign="end center"> + <div *ngIf="!nfRegistryService.bucketActions" fxLayout="row" fxLayoutAlign="end center"> <mat-checkbox [(ngModel)]="row.checked" [checked]="row.checked" (change)="nfRegistryService.determineAllBucketsSelectedState(row)" (click)="row.checked = !row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox> http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/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 5a27be9..770b871 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 @@ -39,16 +39,6 @@ function NfRegistryWorkflowAdministration(nfRegistryApi, nfStorage, nfRegistrySe this.nfRegistryService = nfRegistryService; this.nfRegistryApi = nfRegistryApi; this.dialog = matDialog; - this.bucketActions = [{ - 'name': 'permissions', - 'icon': 'fa fa-pencil', - 'tooltip': 'Manage Bucket Policies', - 'type': 'sidenav' - }, { - 'name': 'Delete', - 'icon': 'fa fa-trash', - 'tooltip': 'Delete Bucket' - }]; }; NfRegistryWorkflowAdministration.prototype = { @@ -60,21 +50,16 @@ NfRegistryWorkflowAdministration.prototype = { ngOnInit: function () { var self = this; this.nfRegistryService.inProgress = true; - // attempt kerberos authentication - this.nfRegistryApi.ticketExchange().subscribe(function (jwt) { - self.nfRegistryService.loadCurrentUser().subscribe(function (currentUser) { - self.route.params - .switchMap(function (params) { - self.nfRegistryService.adminPerspective = 'workflow'; - return self.nfRegistryApi.getBuckets(); - }) - .subscribe(function (buckets) { - self.nfRegistryService.buckets = buckets; - self.nfRegistryService.filterBuckets(); - self.nfRegistryService.inProgress = false; - }); + this.route.params + .switchMap(function (params) { + self.nfRegistryService.adminPerspective = 'workflow'; + return self.nfRegistryApi.getBuckets(); + }) + .subscribe(function (buckets) { + self.nfRegistryService.buckets = buckets; + self.nfRegistryService.filterBuckets(); + self.nfRegistryService.inProgress = false; }); - }); }, /** http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/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 febac5c..1a1641b 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 @@ -30,9 +30,8 @@ var NfRegistryExplorer = require('nifi-registry/components/explorer/nf-registry- var NfRegistryAdministration = require('nifi-registry/components/administration/nf-registry-administration.js'); 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 NfRegistryUserDetails = require('nifi-registry/components/administration/users/details/nf-registry-user-details.js'); -var NfRegistryUserPermissions = require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js'); -var NfRegistryUserGroupPermissions = require('nifi-registry/components/administration/user-group/permissions/nf-registry-user-group-permissions.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 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'); @@ -46,6 +45,8 @@ var ngCommonHttp = require('@angular/common/http'); var NfRegistryTokenInterceptor = require('nifi-registry/services/nf-registry.token.interceptor.js'); var NfRegistryAuthService = require('nifi-registry/services/nf-registry.auth.service.js'); var NfStorage = require('nifi-registry/services/nf-storage.service.js'); +var NfLoginComponent = require('nifi-registry/components/login/nf-registry-login.js'); +var NfUserLoginComponent = require('nifi-registry/components/login/dialogs/nf-registry-user-login.js'); describe('NfRegistryWorkflowAdministration Component', function () { var comp; @@ -70,9 +71,8 @@ describe('NfRegistryWorkflowAdministration Component', function () { NfRegistryExplorer, NfRegistryAdministration, NfRegistryUsersAdministration, - NfRegistryUserDetails, - NfRegistryUserPermissions, - NfRegistryUserGroupPermissions, + NfRegistryManageUser, + NfRegistryManageGroup, NfRegistryBucketPermissions, NfRegistryAddUser, NfRegistryWorkflowAdministration, @@ -80,7 +80,9 @@ describe('NfRegistryWorkflowAdministration Component', function () { NfRegistryGridListViewer, NfRegistryBucketGridListViewer, NfRegistryDropletGridListViewer, - NfPageNotFoundComponent + NfPageNotFoundComponent, + NfLoginComponent, + NfUserLoginComponent ], entryComponents: [ NfRegistryCreateBucket http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/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 cbba95e..1712ada 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 @@ -52,30 +52,26 @@ NfRegistryBucketGridListViewer.prototype = { // reset the breadcrumb state this.nfRegistryService.droplet = {}; - // attempt kerberos authentication - this.nfRegistryApi.ticketExchange().subscribe(function (jwt) { - self.nfRegistryService.loadCurrentUser().subscribe(function (currentUser) { - self.route.params - .switchMap(function (params) { - return new rxjs.Observable.forkJoin( - self.nfRegistryApi.getBuckets(), - self.nfRegistryApi.getDroplets(params['bucketId']), - self.nfRegistryApi.getBucket(params['bucketId']) - ); - }) - .subscribe(function (response) { - var buckets = response[0]; - var droplets = response[1]; - var bucket = response[2]; - self.nfRegistryService.bucket = bucket; - self.nfRegistryService.buckets = buckets; - self.nfRegistryService.droplets = droplets; - self.nfRegistryService.filterDroplets(); - self.nfRegistryService.setBreadcrumbState('in'); - self.nfRegistryService.inProgress = false; - }); + // subscribe to the route params + self.route.params + .switchMap(function (params) { + return new rxjs.Observable.forkJoin( + self.nfRegistryApi.getBuckets(), + self.nfRegistryApi.getDroplets(params['bucketId']), + self.nfRegistryApi.getBucket(params['bucketId']) + ); + }) + .subscribe(function (response) { + var buckets = response[0]; + var droplets = response[1]; + var bucket = response[2]; + self.nfRegistryService.bucket = bucket; + self.nfRegistryService.buckets = buckets; + self.nfRegistryService.droplets = droplets; + self.nfRegistryService.filterDroplets(); + self.nfRegistryService.setBreadcrumbState('in'); + self.nfRegistryService.inProgress = false; }); - }); }, http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/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 22805d0..3c9e5cc 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 @@ -17,7 +17,6 @@ var NfRegistryRoutes = require('nifi-registry/nf-registry.routes.js'); var ngCoreTesting = require('@angular/core/testing'); -var ngHttpTesting = require('@angular/http/testing'); var ngCommon = require('@angular/common'); var ngRouter = require('@angular/router'); var FdsDemo = require('nifi-registry/components/fluid-design-system/fds-demo.js'); @@ -29,9 +28,8 @@ var NfRegistryExplorer = require('nifi-registry/components/explorer/nf-registry- var NfRegistryAdministration = require('nifi-registry/components/administration/nf-registry-administration.js'); 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 NfRegistryUserDetails = require('nifi-registry/components/administration/users/details/nf-registry-user-details.js'); -var NfRegistryUserPermissions = require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js'); -var NfRegistryUserGroupPermissions = require('nifi-registry/components/administration/user-group/permissions/nf-registry-user-group-permissions.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 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'); @@ -44,6 +42,8 @@ var ngCommonHttp = require('@angular/common/http'); var NfRegistryTokenInterceptor = require('nifi-registry/services/nf-registry.token.interceptor.js'); var NfRegistryAuthService = require('nifi-registry/services/nf-registry.auth.service.js'); var NfStorage = require('nifi-registry/services/nf-storage.service.js'); +var NfLoginComponent = require('nifi-registry/components/login/nf-registry-login.js'); +var NfUserLoginComponent = require('nifi-registry/components/login/dialogs/nf-registry-user-login.js'); describe('NfRegistryBucketGridListViewer Component', function () { var comp; @@ -65,16 +65,17 @@ describe('NfRegistryBucketGridListViewer Component', function () { NfRegistryExplorer, NfRegistryAdministration, NfRegistryUsersAdministration, - NfRegistryUserDetails, - NfRegistryUserPermissions, - NfRegistryUserGroupPermissions, + NfRegistryManageUser, + NfRegistryManageGroup, NfRegistryBucketPermissions, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, NfRegistryBucketGridListViewer, NfRegistryDropletGridListViewer, - NfPageNotFoundComponent + NfPageNotFoundComponent, + NfLoginComponent, + NfUserLoginComponent ], providers: [ NfRegistryService, http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/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 41bef94..a8c1218 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 @@ -48,33 +48,30 @@ NfRegistryDropletGridListViewer.prototype = { var self = this; this.nfRegistryService.inProgress = true; this.nfRegistryService.explorerViewType = 'grid-list'; - // attempt kerberos authentication - this.nfRegistryApi.ticketExchange().subscribe(function (jwt) { - self.nfRegistryService.loadCurrentUser().subscribe(function (currentUser) { - self.route.params - .switchMap(function (params) { - return new rxjs.Observable.forkJoin( - self.nfRegistryApi.getDroplet(params['bucketId'], params['dropletType'], params['dropletId']), - self.nfRegistryApi.getBucket(params['bucketId']), - self.nfRegistryApi.getBuckets(), - self.nfRegistryApi.getDroplets(params['bucketId']) - ); - }) - .subscribe(function (response) { - var droplet = response[0]; - var bucket = response[1]; - var buckets = response[2]; - var droplets = response[3]; - self.nfRegistryService.bucket = bucket; - self.nfRegistryService.buckets = buckets; - self.nfRegistryService.droplet = droplet; - self.nfRegistryService.droplets = droplets; - self.nfRegistryService.filterDroplets(); - self.nfRegistryService.setBreadcrumbState('in'); - self.nfRegistryService.inProgress = false; - }); + + // subscribe to the route params + self.route.params + .switchMap(function (params) { + return new rxjs.Observable.forkJoin( + self.nfRegistryApi.getDroplet(params['bucketId'], params['dropletType'], params['dropletId']), + self.nfRegistryApi.getBucket(params['bucketId']), + self.nfRegistryApi.getBuckets(), + self.nfRegistryApi.getDroplets(params['bucketId']) + ); + }) + .subscribe(function (response) { + var droplet = response[0]; + var bucket = response[1]; + var buckets = response[2]; + var droplets = response[3]; + self.nfRegistryService.bucket = bucket; + self.nfRegistryService.buckets = buckets; + self.nfRegistryService.droplet = droplet; + self.nfRegistryService.droplets = droplets; + self.nfRegistryService.filterDroplets(); + self.nfRegistryService.setBreadcrumbState('in'); + self.nfRegistryService.inProgress = false; }); - }); }, /** http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/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 8631eb4..b41d3c6 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 @@ -17,7 +17,6 @@ var NfRegistryRoutes = require('nifi-registry/nf-registry.routes.js'); var ngCoreTesting = require('@angular/core/testing'); -var ngHttpTesting = require('@angular/http/testing'); var ngCommon = require('@angular/common'); var ngRouter = require('@angular/router'); var FdsDemo = require('nifi-registry/components/fluid-design-system/fds-demo.js'); @@ -29,9 +28,8 @@ var NfRegistryExplorer = require('nifi-registry/components/explorer/nf-registry- var NfRegistryAdministration = require('nifi-registry/components/administration/nf-registry-administration.js'); 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 NfRegistryUserDetails = require('nifi-registry/components/administration/users/details/nf-registry-user-details.js'); -var NfRegistryUserPermissions = require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js'); -var NfRegistryUserGroupPermissions = require('nifi-registry/components/administration/user-group/permissions/nf-registry-user-group-permissions.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 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'); @@ -44,6 +42,8 @@ var ngCommonHttp = require('@angular/common/http'); var NfRegistryTokenInterceptor = require('nifi-registry/services/nf-registry.token.interceptor.js'); var NfRegistryAuthService = require('nifi-registry/services/nf-registry.auth.service.js'); var NfStorage = require('nifi-registry/services/nf-storage.service.js'); +var NfLoginComponent = require('nifi-registry/components/login/nf-registry-login.js'); +var NfUserLoginComponent = require('nifi-registry/components/login/dialogs/nf-registry-user-login.js'); describe('NfRegistryDropletGridListViewer Component', function () { var comp; @@ -65,16 +65,17 @@ describe('NfRegistryDropletGridListViewer Component', function () { NfRegistryExplorer, NfRegistryAdministration, NfRegistryUsersAdministration, - NfRegistryUserDetails, - NfRegistryUserPermissions, - NfRegistryUserGroupPermissions, + NfRegistryManageUser, + NfRegistryManageGroup, NfRegistryBucketPermissions, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, NfRegistryBucketGridListViewer, NfRegistryDropletGridListViewer, - NfPageNotFoundComponent + NfPageNotFoundComponent, + NfLoginComponent, + NfUserLoginComponent ], providers: [ NfRegistryService, http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/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 bb8c52d..8e336ab 100644 --- a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html +++ b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html @@ -20,8 +20,8 @@ limitations under the License. <div flex fxLayout="row" fxLayoutAlign="end center"> <td-chips [(ngModel)]="nfRegistryService.dropletsSearchTerms" [items]="nfRegistryService.autoCompleteDroplets" - (add)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.identity, nfRegistryService.activeDropletColumn.sortOrder);" - (remove)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.identity, nfRegistryService.activeDropletColumn.sortOrder);" class="push-right-sm"></td-chips> + (add)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name, nfRegistryService.activeDropletColumn.sortOrder);" + (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> @@ -84,12 +84,9 @@ limitations under the License. <div id="nifi-registry-explorer-grid-list-viewer-droplet-container-details-change-log" fxFlex="75"> <td-steps mode="vertical"> - <td-step label="{{snapshotMeta.version}}" sublabel="by {{snapshotMeta.author}}" + <td-step label="Version {{snapshotMeta.version}} - {{snapshotMeta.timestamp | amTimeAgo}}" sublabel="by {{snapshotMeta.author}}" *ngFor="let snapshotMeta of droplet.snapshotMetadata; let i = index" [active]="i === 0 ? true : false"> - <ng-template td-step-label> - <span>{{snapshotMeta.timestamp | amTimeAgo}}</span> - </ng-template> <div fxLayout="column" fxLayoutAlign="space-between stretch"> <div fxLayout="row" class="md-body-2"> {{snapshotMeta.comments}} http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/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 adeee3f..b3ff7e7 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 @@ -53,25 +53,21 @@ NfRegistryGridListViewer.prototype = { this.nfRegistryService.bucket = {}; this.nfRegistryService.droplet = {}; - // attempt kerberos authentication - this.nfRegistryApi.ticketExchange().subscribe(function (jwt) { - self.nfRegistryService.loadCurrentUser().subscribe(function (currentUser) { - self.route.params - .switchMap(function (params) { - return new rxjs.Observable.forkJoin(self.nfRegistryApi.getDroplets(), - self.nfRegistryApi.getBuckets()); - }) - .subscribe(function (response) { - var droplets = response[0]; - var buckets = response[1]; - self.nfRegistryService.buckets = buckets; - self.nfRegistryService.droplets = droplets; - self.nfRegistryService.filterDroplets(); - self.nfRegistryService.setBreadcrumbState('in'); - self.nfRegistryService.inProgress = false; - }); + // subscribe to the route params + self.route.params + .switchMap(function (params) { + return new rxjs.Observable.forkJoin(self.nfRegistryApi.getDroplets(), + self.nfRegistryApi.getBuckets()); + }) + .subscribe(function (response) { + var droplets = response[0]; + var buckets = response[1]; + self.nfRegistryService.buckets = buckets; + self.nfRegistryService.droplets = droplets; + self.nfRegistryService.filterDroplets(); + self.nfRegistryService.setBreadcrumbState('in'); + self.nfRegistryService.inProgress = false; }); - }); }, /** http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/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 2c926b4..be04713 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 @@ -28,9 +28,8 @@ var NfRegistryExplorer = require('nifi-registry/components/explorer/nf-registry- var NfRegistryAdministration = require('nifi-registry/components/administration/nf-registry-administration.js'); 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 NfRegistryUserDetails = require('nifi-registry/components/administration/users/details/nf-registry-user-details.js'); -var NfRegistryUserPermissions = require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js'); -var NfRegistryUserGroupPermissions = require('nifi-registry/components/administration/user-group/permissions/nf-registry-user-group-permissions.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 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'); @@ -43,6 +42,8 @@ var ngCommonHttp = require('@angular/common/http'); var NfRegistryTokenInterceptor = require('nifi-registry/services/nf-registry.token.interceptor.js'); var NfRegistryAuthService = require('nifi-registry/services/nf-registry.auth.service.js'); var NfStorage = require('nifi-registry/services/nf-storage.service.js'); +var NfLoginComponent = require('nifi-registry/components/login/nf-registry-login.js'); +var NfUserLoginComponent = require('nifi-registry/components/login/dialogs/nf-registry-user-login.js'); describe('NfRegistryGridListViewer Component', function () { var comp; @@ -64,16 +65,17 @@ describe('NfRegistryGridListViewer Component', function () { NfRegistryExplorer, NfRegistryAdministration, NfRegistryUsersAdministration, - NfRegistryUserDetails, - NfRegistryUserPermissions, - NfRegistryUserGroupPermissions, + NfRegistryManageUser, + NfRegistryManageGroup, NfRegistryBucketPermissions, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, NfRegistryBucketGridListViewer, NfRegistryDropletGridListViewer, - NfPageNotFoundComponent + NfPageNotFoundComponent, + NfLoginComponent, + NfUserLoginComponent ], providers: [ NfRegistryService,