blob: c5d04a74ee71198bf95ce17b430cc9f4e4bf15ca [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 class="error" *ngIf="setupGroupName.errors?.long">
Group name cannot be longer than {{maxGroupLength}} characters.
</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"
[disabled]="!setupGroup || setupGroupName.errors?.long || setupGroupName.errors?.duplicate || setupGroupName.errors?.patterns"
>
Next
<i class="material-icons arrow-icon">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 arrow-icon">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 arrow-icon">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 arrow-icon">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" class="name">
<div class="d-flex">
<span
class="ellipsis"
[matTooltip]="element.group"
matTooltipPosition="above"
[matTooltipClass]="'full-size-tooltip'">
{{element.group}}
</span>
</div>
</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, element);"
(keyup)="checkIfUserAdded(element, user.value)"
/>
<button
mat-icon-button
matSuffix
(click)="addUser(user, element); user.value = ''"
[disabled]="element.isUserAdded"
>
<mat-icon
matTooltip="User is already added to this group"
matTooltipPosition="above"
[matTooltipDisabled]="!element.isUserAdded"
>
person_add
</mat-icon>
</button>
</mat-form-field>
<div class="list-selected list-container ani">
<div class="scrolling">
<mat-chip-list [disabled]="true">
<mat-chip
*ngFor="let user of element.users"
[matTooltip]="user"
matTooltipPosition="above"
matTooltipClass="mat-tooltip-for-users"
class="ellipsis"
>
{{ user }}
<a class="material-icons" (click)="removeUser(element.users, user)">clear</a>
</mat-chip>
</mat-chip-list>
</div>
</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>
<inform-message [message]="noPermissionMessage" *ngIf="!healthStatus?.admin && healthStatus?.projectAdmin && !groupsData.length"></inform-message>
</div>