blob: 5c7332959a707278c634b67031e655cdfa5f7c3e [file] [log] [blame]
<!--
~ 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 class="manage-roles base-retreat">
<div class="sub-nav">
<div matTooltip="Only admin can add group."
matTooltipPosition="above"
[matTooltipDisabled]="healthStatus?.admin"
>
<button mat-raised-button class="butt add-group" (click)="stepperView = !stepperView" [disabled]="!healthStatus?.admin"
>
<i class="material-icons">people_outline</i>Add group
</button>
</div>
<div></div>
</div>
<mat-card *ngIf="stepperView" class="m-top-10">
<mat-horizontal-stepper #stepper class="stepper ani">
<mat-step [completed]='false'>
<ng-template matStepLabel>Groups</ng-template>
<div class="inner-step mat-reset">
<input [validator]="groupValidation()" type="text" placeholder="Enter group name" [(ngModel)]="setupGroup"
#setupGroupName="ngModel">
<div class="error" *ngIf="setupGroupName.errors?.patterns && setupGroupName.dirty">Group name can only
contain letters, numbers, hyphens and '_'</div>
<div class="error" *ngIf="setupGroupName.errors?.duplicate && setupGroupName.dirty">Group name already
exists</div>
</div>
<div class="text-center m-bott-10">
<button mat-raised-button (click)="resetDialog()" class="butt">Cancel</button>
<button mat-raised-button matStepperNext class="butt">Next<i
class="material-icons">keyboard_arrow_right</i></button>
</div>
</mat-step>
<mat-step [completed]='false'>
<ng-template matStepLabel>Users</ng-template>
<div class="inner-step mat-reset">
<input type="text" placeholder="Enter user login" [(ngModel)]="setupUser">
</div>
<div class="text-center m-bott-10">
<button mat-raised-button matStepperPrevious class="butt"><i
class="material-icons">keyboard_arrow_left</i>Back</button>
<button mat-raised-button (click)="resetDialog()" class="butt">Cancel</button>
<button mat-raised-button matStepperNext class="butt">Next<i
class="material-icons">keyboard_arrow_right</i></button>
</div>
</mat-step>
<mat-step [completed]='false'>
<ng-template matStepLabel>Roles</ng-template>
<div class="inner-step mat-reset roles">
<div class="selector-wrapper">
<multi-level-select-dropdown
(selectionChange)="onUpdate($event)"
name="roles"
[items]="rolesList"
[model]="setupRoles"
[isAdmin]="healthStatus?.admin"
>
</multi-level-select-dropdown>
</div>
</div>
<div class="text-center m-bott-10">
<button mat-raised-button matStepperPrevious class="butt"><i
class="material-icons">keyboard_arrow_left</i>Back</button>
<button mat-raised-button (click)="resetDialog()" class="butt">Cancel</button>
<button mat-raised-button (click)="manageAction('create', 'group')" class="butt butt-success"
[disabled]="!setupGroup || setupGroupName.errors?.patterns || setupGroupName.errors?.duplicate || !setupRoles.length">Create</button>
</div>
</mat-step>
</mat-horizontal-stepper>
</mat-card>
<mat-divider></mat-divider>
<div *ngIf="groupsData.length" class="ani">
<table mat-table [dataSource]="groupsData" class="projects-table mat-elevation-z6">
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef class="name"> Group name </th>
<td mat-cell *matCellDef="let element"> {{element.group}} </td>
</ng-container>
<ng-container matColumnDef="roles">
<th mat-header-cell *matHeaderCellDef class="roles"> Roles </th>
<td mat-cell *matCellDef="let element" class="roles">
<div class="inner-step mat-reset">
<multi-level-select-dropdown
(selectionChange)="onUpdate($event)"
[type]="element.group"
[items]="rolesList"
[model]="element.selected_roles"
[isAdmin]="healthStatus?.admin"
>
</multi-level-select-dropdown>
</div>
</td>
</ng-container>
<ng-container matColumnDef="users">
<th mat-header-cell *matHeaderCellDef class="users"> Users </th>
<td mat-cell *matCellDef="let element" class="users-list ani">
<mat-form-field class="chip-list">
<input #user matInput placeholder="Enter user login" pattern="[@.-_0-9a-zA-Z]"
(keydown.enter)="addUser(user.value, element); user.value = ''">
<button mat-icon-button matSuffix (click)="addUser(user.value, element); user.value = ''">
<mat-icon>person_add</mat-icon>
</button>
</mat-form-field>
<div class="list-selected list-container ani">
<mat-chip-list>
<mat-chip *ngFor="let user of element.users">
{{ user }}
<a class="material-icons" (click)="removeUser(element.users, user)">clear</a>
</mat-chip>
</mat-chip-list>
</div>
</td>
</ng-container>
<ng-container matColumnDef="actions">
<th mat-header-cell *matHeaderCellDef class="actions"></th>
<td mat-cell *matCellDef="let element" class="actions">
<div class="actions-wrapper">
<span class="action-disabled"
matTooltip="Only admin can delete group."
matTooltipPosition="above"
[matTooltipDisabled]="healthStatus?.admin"
>
<span
(click)="manageAction('delete', 'group', element)"
class="reset ani"
[ngClass]="{ 'not-allowed' : !healthStatus?.admin}"
>
<mat-icon >delete_forever</mat-icon>
</span>
</span>
<span class="apply ani big-icon" matTooltip="Group cannot be updated without any selected role"
matTooltipPosition="above" [matTooltipDisabled]="element.selected_roles.length > 0"
[ngClass]="{ 'not-allowed' : !element.selected_roles.length || isGroupChanded(element)}"
(click)="manageAction('update', 'group', element)">
<mat-icon [ngClass]="{'big-icon': !isGroupChanded(element) && element.selected_roles.length}">done</mat-icon>
</span>
</div>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
</div>
</div>