blob: b79ecca3b7df78548857b0d809d68c1ec0c74988 [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.
*/
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { MatTableDataSource } from '@angular/material/table';
import { Sort } from '@angular/material/sort';
import { ReportingTaskEntity } from '../../../state/reporting-tasks';
import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { BulletinsTip } from '../../../../../ui/common/tooltips/bulletins-tip/bulletins-tip.component';
import { ValidationErrorsTip } from '../../../../../ui/common/tooltips/validation-errors-tip/validation-errors-tip.component';
import { NiFiCommon } from '../../../../../service/nifi-common.service';
import { BulletinsTipInput, ValidationErrorsTipInput } from '../../../../../state/shared';
import { FlowConfiguration } from '../../../../../state/flow-configuration';
import { CurrentUser } from '../../../../../state/current-user';
@Component({
selector: 'reporting-task-table',
templateUrl: './reporting-task-table.component.html',
styleUrls: ['./reporting-task-table.component.scss']
})
export class ReportingTaskTable {
@Input() initialSortColumn: 'name' | 'type' | 'bundle' | 'state' = 'name';
@Input() initialSortDirection: 'asc' | 'desc' = 'asc';
activeSort: Sort = {
active: this.initialSortColumn,
direction: this.initialSortDirection
};
@Input() set reportingTasks(reportingTaskEntities: ReportingTaskEntity[]) {
this.dataSource.data = this.sortEntities(reportingTaskEntities, this.activeSort);
}
@Input() selectedReportingTaskId!: string;
@Input() flowConfiguration!: FlowConfiguration;
@Input() currentUser!: CurrentUser;
@Output() selectReportingTask: EventEmitter<ReportingTaskEntity> = new EventEmitter<ReportingTaskEntity>();
@Output() viewReportingTaskDocumentation: EventEmitter<ReportingTaskEntity> =
new EventEmitter<ReportingTaskEntity>();
@Output() deleteReportingTask: EventEmitter<ReportingTaskEntity> = new EventEmitter<ReportingTaskEntity>();
@Output() startReportingTask: EventEmitter<ReportingTaskEntity> = new EventEmitter<ReportingTaskEntity>();
@Output() configureReportingTask: EventEmitter<ReportingTaskEntity> = new EventEmitter<ReportingTaskEntity>();
@Output() openAdvancedUi: EventEmitter<ReportingTaskEntity> = new EventEmitter<ReportingTaskEntity>();
@Output() viewStateReportingTask: EventEmitter<ReportingTaskEntity> = new EventEmitter<ReportingTaskEntity>();
@Output() stopReportingTask: EventEmitter<ReportingTaskEntity> = new EventEmitter<ReportingTaskEntity>();
@Output() changeReportingTaskVersion: EventEmitter<ReportingTaskEntity> = new EventEmitter<ReportingTaskEntity>();
protected readonly TextTip = TextTip;
protected readonly BulletinsTip = BulletinsTip;
protected readonly ValidationErrorsTip = ValidationErrorsTip;
displayedColumns: string[] = ['moreDetails', 'name', 'type', 'bundle', 'state', 'actions'];
dataSource: MatTableDataSource<ReportingTaskEntity> = new MatTableDataSource<ReportingTaskEntity>();
constructor(private nifiCommon: NiFiCommon) {}
canRead(entity: ReportingTaskEntity): boolean {
return entity.permissions.canRead;
}
canWrite(entity: ReportingTaskEntity): boolean {
return entity.permissions.canWrite;
}
canOperate(entity: ReportingTaskEntity): boolean {
if (this.canWrite(entity)) {
return true;
}
return !!entity.operatePermissions?.canWrite;
}
viewDocumentationClicked(entity: ReportingTaskEntity, event: MouseEvent): void {
event.stopPropagation();
this.viewReportingTaskDocumentation.next(entity);
}
hasComments(entity: ReportingTaskEntity): boolean {
return !this.nifiCommon.isBlank(entity.component.comments);
}
hasErrors(entity: ReportingTaskEntity): boolean {
return !this.nifiCommon.isEmpty(entity.component.validationErrors);
}
getValidationErrorsTipData(entity: ReportingTaskEntity): ValidationErrorsTipInput {
return {
isValidating: entity.status.validationStatus === 'VALIDATING',
validationErrors: entity.component.validationErrors
};
}
hasBulletins(entity: ReportingTaskEntity): boolean {
return !this.nifiCommon.isEmpty(entity.bulletins);
}
getBulletinsTipData(entity: ReportingTaskEntity): BulletinsTipInput {
return {
bulletins: entity.bulletins
};
}
getStateIcon(entity: ReportingTaskEntity): string {
if (entity.status.validationStatus === 'VALIDATING') {
return 'validating nifi-surface-default fa fa-spin fa-circle-o-notch';
} else if (entity.status.validationStatus === 'INVALID') {
return 'invalid fa fa-warning';
} else {
if (entity.status.runStatus === 'STOPPED') {
return 'fa fa-stop nifi-warn-lighter stopped';
} else if (entity.status.runStatus === 'RUNNING') {
return 'fa fa-play nifi-success-lighter running';
} else {
return 'icon icon-enable-false on-surface-medium disabled';
}
}
}
formatState(entity: ReportingTaskEntity): string {
if (entity.status.validationStatus === 'VALIDATING') {
return 'Validating';
} else if (entity.status.validationStatus === 'INVALID') {
return 'Invalid';
} else {
if (entity.status.runStatus === 'STOPPED') {
return 'Stopped';
} else if (entity.status.runStatus === 'RUNNING') {
return 'Running';
} else {
return 'Disabled';
}
}
}
hasActiveThreads(entity: ReportingTaskEntity): boolean {
return entity.status?.activeThreadCount > 0;
}
formatName(entity: ReportingTaskEntity): string {
return this.canRead(entity) ? entity.component.name : entity.id;
}
formatType(entity: ReportingTaskEntity): string {
return this.canRead(entity) ? this.nifiCommon.formatType(entity.component) : '';
}
formatBundle(entity: ReportingTaskEntity): string {
return this.canRead(entity) ? this.nifiCommon.formatBundle(entity.component.bundle) : '';
}
isDisabled(entity: ReportingTaskEntity): boolean {
return entity.status.runStatus === 'DISABLED';
}
isValid(entity: ReportingTaskEntity): boolean {
return entity.status.validationStatus === 'VALID';
}
isRunning(entity: ReportingTaskEntity): boolean {
return entity.status.runStatus === 'RUNNING';
}
isStopped(entity: ReportingTaskEntity): boolean {
return entity.status.runStatus === 'STOPPED';
}
isStoppedOrDisabled(entity: ReportingTaskEntity): boolean {
return this.isStopped(entity) || entity.status.runStatus === 'DISABLED';
}
canStop(entity: ReportingTaskEntity): boolean {
return this.canOperate(entity) && this.isRunning(entity);
}
stopClicked(entity: ReportingTaskEntity): void {
this.stopReportingTask.next(entity);
}
canEdit(entity: ReportingTaskEntity): boolean {
return this.canRead(entity) && this.canWrite(entity) && this.isStoppedOrDisabled(entity);
}
hasAdvancedUi(entity: ReportingTaskEntity): boolean {
return this.canRead(entity) && !!entity.component.customUiUrl;
}
advancedClicked(entity: ReportingTaskEntity, event: MouseEvent): void {
event.stopPropagation();
this.openAdvancedUi.next(entity);
}
canStart(entity: ReportingTaskEntity): boolean {
return this.canOperate(entity) && this.isStopped(entity) && this.isValid(entity);
}
startClicked(entity: ReportingTaskEntity): void {
this.startReportingTask.next(entity);
}
canChangeVersion(entity: ReportingTaskEntity): boolean {
return (
(this.isDisabled(entity) || this.isStopped(entity)) &&
this.canRead(entity) &&
this.canWrite(entity) &&
entity.component.multipleVersionsAvailable === true
);
}
canDelete(entity: ReportingTaskEntity): boolean {
const canWriteParent: boolean =
this.currentUser.controllerPermissions.canRead && this.currentUser.controllerPermissions.canWrite;
return (
(this.isDisabled(entity) || this.isStopped(entity)) &&
this.canRead(entity) &&
this.canWrite(entity) &&
canWriteParent
);
}
changeVersionClicked(entity: ReportingTaskEntity): void {
this.changeReportingTaskVersion.next(entity);
}
deleteClicked(entity: ReportingTaskEntity): void {
this.deleteReportingTask.next(entity);
}
configureClicked(entity: ReportingTaskEntity, event: MouseEvent): void {
event.stopPropagation();
this.configureReportingTask.next(entity);
}
canViewState(entity: ReportingTaskEntity): boolean {
return this.canRead(entity) && this.canWrite(entity) && entity.component.persistsState === true;
}
viewStateClicked(entity: ReportingTaskEntity): void {
this.viewStateReportingTask.next(entity);
}
canManageAccessPolicies(): boolean {
return this.flowConfiguration.supportsManagedAuthorizer && this.currentUser.tenantsPermissions.canRead;
}
getPolicyLink(entity: ReportingTaskEntity): string[] {
return ['/access-policies', 'read', 'component', 'reporting-tasks', entity.id];
}
select(entity: ReportingTaskEntity): void {
this.selectReportingTask.next(entity);
}
isSelected(entity: ReportingTaskEntity): boolean {
if (this.selectedReportingTaskId) {
return entity.id == this.selectedReportingTaskId;
}
return false;
}
sortData(sort: Sort) {
this.activeSort = sort;
this.dataSource.data = this.sortEntities(this.dataSource.data, sort);
}
private sortEntities(data: ReportingTaskEntity[], sort: Sort): ReportingTaskEntity[] {
if (!data) {
return [];
}
return data.slice().sort((a, b) => {
const isAsc = sort.direction === 'asc';
let retVal = 0;
switch (sort.active) {
case 'name':
retVal = this.nifiCommon.compareString(this.formatName(a), this.formatName(b));
break;
case 'type':
retVal = this.nifiCommon.compareString(this.formatType(a), this.formatType(b));
break;
case 'bundle':
retVal = this.nifiCommon.compareString(this.formatBundle(a), this.formatBundle(b));
break;
case 'state':
retVal = this.nifiCommon.compareString(this.formatState(a), this.formatState(b));
break;
default:
return 0;
}
return retVal * (isAsc ? 1 : -1);
});
}
}