NIFI-13092: Adding info icons to configuration dialogs (#8696)

* NIFI-13092:
- Refactoring TextToolTip input to be a string.

* NIFI-13092:
- Migrating existing info tooltips to use the NiFi tooltip and fa-info-circle icon.

* NIFI-13092:
- Adding info icons to configuration dialogs where necessary.

* NIFI-13092:
- Aligning Run Schedule form label between Reporting Tasks and Processors.

* NIFI-13092:
- Removing primary color from info icons outside of those that appear in tables.

* NIFI-13092:
- Addressing review feedback.

This closes #8696
This commit is contained in:
Matt Gilman 2024-04-24 21:38:23 -04:00 committed by GitHub
parent 0e70f7a07e
commit d9dc283406
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
86 changed files with 765 additions and 474 deletions

View File

@ -80,7 +80,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }} >{{ option.text }}
</mat-option> </mat-option>

View File

@ -39,7 +39,7 @@ import { distinctUntilChanged } from 'rxjs';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { NiFiCommon } from '../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../service/nifi-common.service';
import { ComponentType, isDefinedAndNotNull, SelectOption, TextTipInput } from '../../../../state/shared'; import { ComponentType, isDefinedAndNotNull, SelectOption } from '../../../../state/shared';
import { TextTip } from '../../../../ui/common/tooltips/text-tip/text-tip.component'; import { TextTip } from '../../../../ui/common/tooltips/text-tip/text-tip.component';
import { AccessPolicyEntity, Action, PolicyStatus, ResourceAction } from '../../state/shared'; import { AccessPolicyEntity, Action, PolicyStatus, ResourceAction } from '../../state/shared';
import { selectFlowConfiguration } from '../../../../state/flow-configuration/flow-configuration.selectors'; import { selectFlowConfiguration } from '../../../../state/flow-configuration/flow-configuration.selectors';
@ -284,13 +284,6 @@ export class ComponentAccessPolicies implements OnInit, OnDestroy {
return true; return true;
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
getContextIcon(): string { getContextIcon(): string {
switch (this.resource) { switch (this.resource) {
case 'processors': case 'processors':

View File

@ -65,7 +65,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }} >{{ option.text }}
</mat-option> </mat-option>
@ -85,7 +85,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }} >{{ option.text }}
</mat-option> </mat-option>

View File

@ -39,13 +39,7 @@ import { distinctUntilChanged } from 'rxjs';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { NiFiCommon } from '../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../service/nifi-common.service';
import { import { ComponentType, isDefinedAndNotNull, RequiredPermission, SelectOption } from '../../../../state/shared';
ComponentType,
isDefinedAndNotNull,
RequiredPermission,
SelectOption,
TextTipInput
} from '../../../../state/shared';
import { TextTip } from '../../../../ui/common/tooltips/text-tip/text-tip.component'; import { TextTip } from '../../../../ui/common/tooltips/text-tip/text-tip.component';
import { AccessPolicyEntity, Action, PolicyStatus } from '../../state/shared'; import { AccessPolicyEntity, Action, PolicyStatus } from '../../state/shared';
import { loadExtensionTypesForPolicies } from '../../../../state/extension-types/extension-types.actions'; import { loadExtensionTypesForPolicies } from '../../../../state/extension-types/extension-types.actions';
@ -173,13 +167,6 @@ export class GlobalAccessPolicies implements OnInit, OnDestroy {
return state.loadedTimestamp == initialState.loadedTimestamp; return state.loadedTimestamp == initialState.loadedTimestamp;
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
resourceChanged(value: string): void { resourceChanged(value: string): void {
if (this.globalPolicySupportsReadWrite(value)) { if (this.globalPolicySupportsReadWrite(value)) {
this.supportsReadWriteAction = true; this.supportsReadWriteAction = true;

View File

@ -127,7 +127,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>
@ -154,7 +154,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>

View File

@ -37,7 +37,7 @@ import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nif
import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { MatTabsModule } from '@angular/material/tabs'; import { MatTabsModule } from '@angular/material/tabs';
import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component'; import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { ComponentType, SelectOption, TextTipInput } from '../../../../../../../state/shared'; import { ComponentType } from '../../../../../../../state/shared';
import { NiFiState } from '../../../../../../../state'; import { NiFiState } from '../../../../../../../state';
import { selectPrioritizerTypes } from '../../../../../../../state/extension-types/extension-types.selectors'; import { selectPrioritizerTypes } from '../../../../../../../state/extension-types/extension-types.selectors';
import { Prioritizers } from '../prioritizers/prioritizers.component'; import { Prioritizers } from '../prioritizers/prioritizers.component';
@ -200,13 +200,6 @@ export class CreateConnection {
} }
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
loadBalanceChanged(value: string): void { loadBalanceChanged(value: string): void {
if (value == 'PARTITION_BY_ATTRIBUTE') { if (value == 'PARTITION_BY_ATTRIBUTE') {
this.createConnectionForm.addControl('partitionAttribute', new FormControl('', Validators.required)); this.createConnectionForm.addControl('partitionAttribute', new FormControl('', Validators.required));

View File

@ -37,7 +37,7 @@
[disabled]="isDisabled" [disabled]="isDisabled"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(item)" [tooltipInputData]="item.description"
[delayClose]="false" [delayClose]="false"
>{{ item.text }}</mat-option >{{ item.text }}</mat-option
> >

View File

@ -24,7 +24,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatOptionModule } from '@angular/material/core'; import { MatOptionModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { NifiTooltipDirective } from '../../../../../../../../ui/common/tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { SelectOption, TextTipInput } from '../../../../../../../../state/shared'; import { SelectOption } from '../../../../../../../../state/shared';
@Component({ @Component({
selector: 'destination-process-group', selector: 'destination-process-group',
@ -111,13 +111,6 @@ export class DestinationProcessGroup implements ControlValueAccessor {
this.selectedInputPort = selectedInputPort; this.selectedInputPort = selectedInputPort;
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
handleChanged() { handleChanged() {
// mark the component as touched if not already // mark the component as touched if not already
if (!this.isTouched) { if (!this.isTouched) {

View File

@ -34,7 +34,7 @@
[disabled]="item.disabled == true || isDisabled" [disabled]="item.disabled == true || isDisabled"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(item)" [tooltipInputData]="item.description"
[delayClose]="false" [delayClose]="false"
>{{ item.text }}</mat-option >{{ item.text }}</mat-option
> >

View File

@ -24,7 +24,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatOptionModule } from '@angular/material/core'; import { MatOptionModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { NifiTooltipDirective } from '../../../../../../../../ui/common/tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { SelectOption, TextTipInput } from '../../../../../../../../state/shared'; import { SelectOption } from '../../../../../../../../state/shared';
@Component({ @Component({
selector: 'destination-remote-process-group', selector: 'destination-remote-process-group',
@ -99,13 +99,6 @@ export class DestinationRemoteProcessGroup implements ControlValueAccessor {
this.selectedInputPort = selectedInputPort; this.selectedInputPort = selectedInputPort;
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
handleChanged() { handleChanged() {
// mark the component as touched if not already // mark the component as touched if not already
if (!this.isTouched) { if (!this.isTouched) {

View File

@ -104,11 +104,18 @@
</div> </div>
<div class="flex flex-col mb-5"> <div class="flex flex-col mb-5">
<div>Id</div> <div>Id</div>
<div class="unset nifi-surface-default">No value set</div> <div class="accent-color font-medium">{{ dialogRequest.entity.id }}</div>
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>FlowFile Expiration</mat-label> <mat-label>
FlowFile Expiration
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The maximum amount of time an object may be in the flow before it will be automatically aged out of the flow."></i>
</mat-label>
<input <input
matInput matInput
formControlName="flowFileExpiration" formControlName="flowFileExpiration"
@ -119,7 +126,14 @@
<div class="flex gap-x-2"> <div class="flex gap-x-2">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Back Pressure Object Threshold</mat-label> <mat-label>
Back Pressure Object Threshold
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The maximum number of objects that can be queued before back pressure is applied."></i>
</mat-label>
<input <input
matInput matInput
formControlName="backPressureObjectThreshold" formControlName="backPressureObjectThreshold"
@ -129,7 +143,14 @@
</div> </div>
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Size Threshold</mat-label> <mat-label>
Size Threshold
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The maximum data size of objects that can be queued before back pressure is applied."></i>
</mat-label>
<input <input
matInput matInput
formControlName="backPressureDataSizeThreshold" formControlName="backPressureDataSizeThreshold"
@ -141,7 +162,14 @@
<div class="flex gap-x-2"> <div class="flex gap-x-2">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Load Balance Strategy</mat-label> <mat-label>
Load Balance Strategy
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="How to load balance the data in this Connection across the nodes in the cluster."></i>
</mat-label>
<mat-select <mat-select
formControlName="loadBalanceStrategy" formControlName="loadBalanceStrategy"
(selectionChange)="loadBalanceChanged($event.value)"> (selectionChange)="loadBalanceChanged($event.value)">
@ -151,7 +179,7 @@
[disabled]="connectionReadonly || sourceReadonly || destinationReadonly" [disabled]="connectionReadonly || sourceReadonly || destinationReadonly"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>
@ -162,7 +190,14 @@
@if (loadBalancePartitionAttributeRequired) { @if (loadBalancePartitionAttributeRequired) {
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Attribute Name</mat-label> <mat-label>
Attribute Name
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The FlowFile Attribute to use for determining which node a FlowFile will go to."></i>
</mat-label>
<input <input
matInput matInput
formControlName="partitionAttribute" formControlName="partitionAttribute"
@ -175,7 +210,14 @@
@if (loadBalanceCompressionRequired) { @if (loadBalanceCompressionRequired) {
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Load Balance Compression</mat-label> <mat-label>
Load Balance Compression
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Whether or not data should be compressed when being transferred between nodes in the cluster."></i>
</mat-label>
<mat-select formControlName="compression"> <mat-select formControlName="compression">
@for (option of loadBalanceCompressionStrategies; track option) { @for (option of loadBalanceCompressionStrategies; track option) {
<mat-option <mat-option
@ -183,7 +225,7 @@
[disabled]="connectionReadonly || sourceReadonly || destinationReadonly" [disabled]="connectionReadonly || sourceReadonly || destinationReadonly"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>

View File

@ -36,7 +36,7 @@ import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nif
import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { MatTabsModule } from '@angular/material/tabs'; import { MatTabsModule } from '@angular/material/tabs';
import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component'; import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { ComponentType, SelectOption, TextTipInput } from '../../../../../../../state/shared'; import { ComponentType } from '../../../../../../../state/shared';
import { NiFiState } from '../../../../../../../state'; import { NiFiState } from '../../../../../../../state';
import { selectPrioritizerTypes } from '../../../../../../../state/extension-types/extension-types.selectors'; import { selectPrioritizerTypes } from '../../../../../../../state/extension-types/extension-types.selectors';
import { Prioritizers } from '../prioritizers/prioritizers.component'; import { Prioritizers } from '../prioritizers/prioritizers.component';
@ -224,7 +224,7 @@ export class EditConnectionComponent {
initialCompression: string; initialCompression: string;
constructor( constructor(
@Inject(MAT_DIALOG_DATA) private dialogRequest: EditConnectionDialogRequest, @Inject(MAT_DIALOG_DATA) public dialogRequest: EditConnectionDialogRequest,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private store: Store<NiFiState>, private store: Store<NiFiState>,
private canvasUtils: CanvasUtils, private canvasUtils: CanvasUtils,
@ -340,13 +340,6 @@ export class EditConnectionComponent {
} }
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
loadBalanceChanged(value: string): void { loadBalanceChanged(value: string): void {
if (value == 'PARTITION_BY_ATTRIBUTE') { if (value == 'PARTITION_BY_ATTRIBUTE') {
this.editConnectionForm.addControl( this.editConnectionForm.addControl(

View File

@ -17,7 +17,14 @@
<div class="prioritizers flex flex-col gap-y-4" cdkDropListGroup> <div class="prioritizers flex flex-col gap-y-4" cdkDropListGroup>
<div class="flex flex-col"> <div class="flex flex-col">
<div>Available Prioritizers</div> <div>
Available Prioritizers
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Prioritizers that are available to reprioritize FlowFiles in this processors work queue."></i>
</div>
<div <div
class="prioritizers-list border" class="prioritizers-list border"
cdkDropList cdkDropList
@ -40,7 +47,14 @@
</div> </div>
</div> </div>
<div class="flex flex-col"> <div class="flex flex-col">
<div>Selected Prioritizers</div> <div>
Selected Prioritizers
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Prioritizers that have been selected to reprioritize FlowFiles in this processors work queue. Multiple selected prioritizers will be considered in order from top to bottom."></i>
</div>
<div <div
class="prioritizers-list border" class="prioritizers-list border"
cdkDropList cdkDropList
@ -62,11 +76,11 @@
<div class="flex gap-x-3 items-center"> <div class="flex gap-x-3 items-center">
<div>{{ getPrioritizerLabel(item) }}</div> <div>{{ getPrioritizerLabel(item) }}</div>
@if (hasDescription(item)) { @if (hasDescription(item)) {
<div <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getDescriptionTipData(item)"></div> [tooltipInputData]="item.description"></i>
} }
</div> </div>
@if (canClose) { @if (canClose) {

View File

@ -24,7 +24,7 @@ import { AsyncPipe, NgTemplateOutlet } from '@angular/common';
import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay'; import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
import { RouterLink } from '@angular/router'; import { RouterLink } from '@angular/router';
import { NiFiCommon } from '../../../../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../../../../service/nifi-common.service';
import { DocumentedType, TextTipInput } from '../../../../../../../state/shared'; import { DocumentedType } from '../../../../../../../state/shared';
import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component'; import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { import {
@ -128,13 +128,6 @@ export class Prioritizers implements ControlValueAccessor {
return !this.nifiCommon.isBlank(entity.description); return !this.nifiCommon.isBlank(entity.description);
} }
getDescriptionTipData(entity: DocumentedType): TextTipInput {
return {
// @ts-ignore
text: entity.description
};
}
removeSelected(entity: DocumentedType, i: number): void { removeSelected(entity: DocumentedType, i: number): void {
transferArrayItem(this.selectedPrioritizers, this.availablePrioritizers, i, this.availablePrioritizers.length); transferArrayItem(this.selectedPrioritizers, this.availablePrioritizers, i, this.availablePrioritizers.length);

View File

@ -37,7 +37,7 @@
[disabled]="isDisabled" [disabled]="isDisabled"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(item)" [tooltipInputData]="item.description"
[delayClose]="false" [delayClose]="false"
>{{ item.text }}</mat-option >{{ item.text }}</mat-option
> >

View File

@ -24,7 +24,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatOptionModule } from '@angular/material/core'; import { MatOptionModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { NifiTooltipDirective } from '../../../../../../../../ui/common/tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { SelectOption, TextTipInput } from '../../../../../../../../state/shared'; import { SelectOption } from '../../../../../../../../state/shared';
@Component({ @Component({
selector: 'source-process-group', selector: 'source-process-group',
@ -112,13 +112,6 @@ export class SourceProcessGroup implements ControlValueAccessor {
this.selectedOutputPort = selectedOutputPort; this.selectedOutputPort = selectedOutputPort;
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
handleChanged() { handleChanged() {
// mark the component as touched if not already // mark the component as touched if not already
if (!this.isTouched) { if (!this.isTouched) {

View File

@ -34,7 +34,7 @@
[disabled]="item.disabled == true || isDisabled" [disabled]="item.disabled == true || isDisabled"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(item)" [tooltipInputData]="item.description"
[delayClose]="false" [delayClose]="false"
>{{ item.text }}</mat-option >{{ item.text }}</mat-option
> >

View File

@ -24,7 +24,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatOptionModule } from '@angular/material/core'; import { MatOptionModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { NifiTooltipDirective } from '../../../../../../../../ui/common/tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { SelectOption, TextTipInput } from '../../../../../../../../state/shared'; import { SelectOption } from '../../../../../../../../state/shared';
@Component({ @Component({
selector: 'source-remote-process-group', selector: 'source-remote-process-group',
@ -99,13 +99,6 @@ export class SourceRemoteProcessGroup implements ControlValueAccessor {
this.selectedOutputPort = selectedOutputPort; this.selectedOutputPort = selectedOutputPort;
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
handleChanged() { handleChanged() {
// mark the component as touched if not already // mark the component as touched if not already
if (!this.isTouched) { if (!this.isTouched) {

View File

@ -28,7 +28,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }}</mat-option >{{ option.text }}</mat-option
> >
@ -48,7 +48,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }}</mat-option >{{ option.text }}</mat-option
> >
@ -71,7 +71,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }}</mat-option >{{ option.text }}</mat-option
> >
@ -88,6 +88,11 @@
<div class="mb-5"> <div class="mb-5">
<mat-checkbox color="primary" formControlName="keepParameterContexts"> <mat-checkbox color="primary" formControlName="keepParameterContexts">
Keep existing Parameter Contexts Keep existing Parameter Contexts
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="When not selected, only directly associated Parameter Contexts will be copied, inherited Contexts with no direct assignment to a Process Group are ignored."></i>
</mat-checkbox> </mat-checkbox>
</div> </div>
<div class="flex flex-col mb-5"> <div class="flex flex-col mb-5">

View File

@ -25,7 +25,6 @@ import {
isDefinedAndNotNull, isDefinedAndNotNull,
RegistryClientEntity, RegistryClientEntity,
SelectOption, SelectOption,
TextTipInput,
VersionedFlow, VersionedFlow,
VersionedFlowEntity, VersionedFlowEntity,
VersionedFlowSnapshotMetadata, VersionedFlowSnapshotMetadata,
@ -158,13 +157,6 @@ export class ImportFromRegistry implements OnInit {
} }
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
registryChanged(registryId: string): void { registryChanged(registryId: string): void {
this.loadBuckets(registryId); this.loadBuckets(registryId);
} }

View File

@ -57,7 +57,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }} >{{ option.text }}
</mat-option> </mat-option>
@ -77,7 +77,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }} >{{ option.text }}
</mat-option> </mat-option>

View File

@ -30,7 +30,7 @@ import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nif
import { MatError, MatFormField, MatLabel } from '@angular/material/form-field'; import { MatError, MatFormField, MatLabel } from '@angular/material/form-field';
import { MatOption, MatSelect } from '@angular/material/select'; import { MatOption, MatSelect } from '@angular/material/select';
import { Observable, of, take } from 'rxjs'; import { Observable, of, take } from 'rxjs';
import { BucketEntity, RegistryClientEntity, SelectOption, TextTipInput } from '../../../../../../../state/shared'; import { BucketEntity, RegistryClientEntity, SelectOption } from '../../../../../../../state/shared';
import { NiFiCommon } from '../../../../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../../../../service/nifi-common.service';
import { SaveVersionDialogRequest, SaveVersionRequest, VersionControlInformation } from '../../../../../state/flow'; import { SaveVersionDialogRequest, SaveVersionRequest, VersionControlInformation } from '../../../../../state/flow';
import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component'; import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component';
@ -149,12 +149,6 @@ export class SaveVersionDialog implements OnInit {
} }
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
text: option.description || ''
};
}
registryChanged(registryId: string): void { registryChanged(registryId: string): void {
this.loadBuckets(registryId); this.loadBuckets(registryId);
} }

View File

@ -25,7 +25,18 @@
</mat-form-field> </mat-form-field>
@if (!isRootProcessGroup) { @if (!isRootProcessGroup) {
<mat-form-field> <mat-form-field>
<mat-label>Receive From</mat-label> <mat-label>
{{ ComponentType.InputPort == request.type ? 'Receive From' : 'Send To' }}
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
[tooltipInputData]="
ComponentType.InputPort == request.type
? 'Specify where FlowFiles are received from.'
: 'Specify where FlowFiles are sent.'
"></i>
</mat-label>
<mat-select formControlName="newPortAllowRemoteAccess"> <mat-select formControlName="newPortAllowRemoteAccess">
@for (option of allowRemoteAccessOptions; track option) { @for (option of allowRemoteAccessOptions; track option) {
@if (option.description) { @if (option.description) {
@ -33,7 +44,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }}</mat-option >{{ option.text }}</mat-option
> >

View File

@ -24,7 +24,7 @@ import { selectParentProcessGroupId, selectSaving } from '../../../../../state/f
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { createPort } from '../../../../../state/flow/flow.actions'; import { createPort } from '../../../../../state/flow/flow.actions';
import { CreateComponentRequest } from '../../../../../state/flow'; import { CreateComponentRequest } from '../../../../../state/flow';
import { ComponentType, SelectOption, TextTipInput } from '../../../../../../../state/shared'; import { ComponentType, SelectOption } from '../../../../../../../state/shared';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { MatTooltipModule } from '@angular/material/tooltip'; import { MatTooltipModule } from '@angular/material/tooltip';
@ -76,7 +76,7 @@ export class CreatePort {
]; ];
constructor( constructor(
@Inject(MAT_DIALOG_DATA) private request: CreateComponentRequest, @Inject(MAT_DIALOG_DATA) public request: CreateComponentRequest,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private store: Store<CanvasState> private store: Store<CanvasState>
) { ) {
@ -102,13 +102,6 @@ export class CreatePort {
}); });
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
createPort() { createPort() {
this.store.dispatch( this.store.dispatch(
createPort({ createPort({
@ -120,4 +113,6 @@ export class CreatePort {
}) })
); );
} }
protected readonly ComponentType = ComponentType;
} }

View File

@ -28,14 +28,28 @@
<div> <div>
@if (request.entity.component.allowRemoteAccess) { @if (request.entity.component.allowRemoteAccess) {
<mat-form-field> <mat-form-field>
<mat-label>Concurrent Tasks</mat-label> <mat-label>
Concurrent Tasks
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The number of tasks that should be concurrently scheduled for this port."></i>
</mat-label>
<input matInput formControlName="concurrentTasks" type="text" [readonly]="readonly" /> <input matInput formControlName="concurrentTasks" type="text" [readonly]="readonly" />
</mat-form-field> </mat-form-field>
} }
</div> </div>
@if (portTypeLabel == 'Output Port') { @if (portTypeLabel == 'Output Port') {
<div class="mb-3.5"> <div class="mb-3.5">
<mat-label>Failure Port</mat-label> <mat-label>
Failure Port
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="When using the Stateless Engine, if any FlowFile is routed to a port marked as a Failure Port, all data in the transaction is rolled back, and the input FlowFile, if any, is routed to the Failure Port."></i>
</mat-label>
<mat-checkbox color="primary" formControlName="portFunction"></mat-checkbox> <mat-checkbox color="primary" formControlName="portFunction"></mat-checkbox>
</div> </div>
} }

View File

@ -33,6 +33,8 @@ import { selectSaving } from '../../../../../state/flow/flow.selectors';
import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nifi-spinner.directive'; import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nifi-spinner.directive';
import { ClusterConnectionService } from '../../../../../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../../../../../service/cluster-connection.service';
import { CanvasUtils } from '../../../../../service/canvas-utils.service'; import { CanvasUtils } from '../../../../../service/canvas-utils.service';
import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
@Component({ @Component({
selector: 'edit-port', selector: 'edit-port',
@ -46,7 +48,8 @@ import { CanvasUtils } from '../../../../../service/canvas-utils.service';
MatCheckboxModule, MatCheckboxModule,
MatButtonModule, MatButtonModule,
AsyncPipe, AsyncPipe,
NifiSpinnerDirective NifiSpinnerDirective,
NifiTooltipDirective
], ],
styleUrls: ['./edit-port.component.scss'] styleUrls: ['./edit-port.component.scss']
}) })
@ -122,4 +125,6 @@ export class EditPort {
}) })
); );
} }
protected readonly TextTip = TextTip;
} }

View File

@ -41,7 +41,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getParameterContextOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }}</mat-option >{{ option.text }}</mat-option
> >

View File

@ -21,7 +21,7 @@ import { CreateProcessGroupDialogRequest } from '../../../../../state/flow';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { CanvasState } from '../../../../../state'; import { CanvasState } from '../../../../../state';
import { createProcessGroup, uploadProcessGroup } from '../../../../../state/flow/flow.actions'; import { createProcessGroup, uploadProcessGroup } from '../../../../../state/flow/flow.actions';
import { SelectOption, TextTipInput } from '../../../../../../../state/shared'; import { SelectOption } from '../../../../../../../state/shared';
import { selectSaving } from '../../../../../state/flow/flow.selectors'; import { selectSaving } from '../../../../../state/flow/flow.selectors';
import { AsyncPipe } from '@angular/common'; import { AsyncPipe } from '@angular/common';
import { ErrorBanner } from '../../../../../../../ui/common/error-banner/error-banner.component'; import { ErrorBanner } from '../../../../../../../ui/common/error-banner/error-banner.component';
@ -97,13 +97,6 @@ export class CreateProcessGroup {
}); });
} }
getParameterContextOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
attachFlow(event: Event): void { attachFlow(event: Event): void {
const target = event.target as HTMLInputElement; const target = event.target as HTMLInputElement;
const files = target.files as FileList; const files = target.files as FileList;

View File

@ -39,7 +39,7 @@
[disabled]="readonly" [disabled]="readonly"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }}</mat-option >{{ option.text }}</mat-option
> >
@ -58,6 +58,11 @@
formControlName="applyParameterContextRecursively" formControlName="applyParameterContextRecursively"
name="applyParameterContextRecursively"> name="applyParameterContextRecursively">
Apply Recursively Apply Recursively
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="When checked Parameter Context will be applied to the Process Group and all the embedded Process Groups recursively, if the user has the proper permissions on all the respective components. If the user does not have the proper permissions on any embedded Process Group, then the Parameter Context will not be applied for any components."></i>
</mat-checkbox> </mat-checkbox>
</div> </div>
<div> <div>
@ -70,7 +75,7 @@
[disabled]="readonly" [disabled]="readonly"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>
@ -88,7 +93,7 @@
[disabled]="readonly" [disabled]="readonly"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>
@ -106,7 +111,7 @@
[disabled]="readonly" [disabled]="readonly"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>
@ -118,7 +123,14 @@
<div class="w-full"> <div class="w-full">
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Default FlowFile Expiration</mat-label> <mat-label>
Default FlowFile Expiration
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="This setting applies as the default FlowFile expiration for any new connection. Configuration of existing connections is unaffected."></i>
</mat-label>
<input <input
matInput matInput
formControlName="defaultFlowFileExpiration" formControlName="defaultFlowFileExpiration"
@ -128,7 +140,14 @@
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Default Back Pressure Object Threshold</mat-label> <mat-label>
Default Back Pressure Object Threshold
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="This setting applies as the default back pressure object count for any new connection. Configuration of existing connections is unaffected."></i>
</mat-label>
<input <input
matInput matInput
formControlName="defaultBackPressureObjectThreshold" formControlName="defaultBackPressureObjectThreshold"
@ -138,7 +157,14 @@
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Default Back Pressure Data Size Threshold</mat-label> <mat-label>
Default Back Pressure Data Size Threshold
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="This setting applies as the default back pressure data size for any new connection. Configuration of existing connections is unaffected."></i>
</mat-label>
<input <input
matInput matInput
formControlName="defaultBackPressureDataSizeThreshold" formControlName="defaultBackPressureDataSizeThreshold"
@ -148,7 +174,14 @@
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Log File Suffix</mat-label> <mat-label>
Log File Suffix
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Turns on dedicated logging. When left empty log messages will be logged only to the primary app log. When set messages logged by components in this group will be sent to the standard app log, as well as a separate log file, with the provided name, specific to this group."></i>
</mat-label>
<input matInput formControlName="logFileSuffix" type="text" [readonly]="readonly" /> <input matInput formControlName="logFileSuffix" type="text" [readonly]="readonly" />
</mat-form-field> </mat-form-field>
</div> </div>

View File

@ -26,7 +26,7 @@ import { MatTabsModule } from '@angular/material/tabs';
import { MatOptionModule } from '@angular/material/core'; import { MatOptionModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { SelectOption, TextTipInput } from '../../../../../../../state/shared'; import { SelectOption } from '../../../../../../../state/shared';
import { Client } from '../../../../../../../service/client.service'; import { Client } from '../../../../../../../service/client.service';
import { PropertyTable } from '../../../../../../../ui/common/property-table/property-table.component'; import { PropertyTable } from '../../../../../../../ui/common/property-table/property-table.component';
import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nifi-spinner.directive'; import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nifi-spinner.directive';
@ -189,13 +189,6 @@ export class EditProcessGroup {
}); });
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
submitForm() { submitForm() {
let updateStrategy = 'DIRECT_CHILDREN'; let updateStrategy = 'DIRECT_CHILDREN';
if (this.editProcessGroupForm.get('applyParameterContextRecursively')?.value) { if (this.editProcessGroupForm.get('applyParameterContextRecursively')?.value) {

View File

@ -31,7 +31,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getParameterContextOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false" [delayClose]="false"
>{{ option.text }}</mat-option >{{ option.text }}</mat-option
> >

View File

@ -21,7 +21,7 @@ import { GroupComponentsDialogRequest } from '../../../../../state/flow';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { CanvasState } from '../../../../../state'; import { CanvasState } from '../../../../../state';
import { groupComponents } from '../../../../../state/flow/flow.actions'; import { groupComponents } from '../../../../../state/flow/flow.actions';
import { ComponentType, SelectOption, TextTipInput } from '../../../../../../../state/shared'; import { ComponentType, SelectOption } from '../../../../../../../state/shared';
import { selectSaving } from '../../../../../state/flow/flow.selectors'; import { selectSaving } from '../../../../../state/flow/flow.selectors';
import { AsyncPipe } from '@angular/common'; import { AsyncPipe } from '@angular/common';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -90,13 +90,6 @@ export class GroupComponents {
}); });
} }
getParameterContextOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
createProcessGroup(): void { createProcessGroup(): void {
this.store.dispatch( this.store.dispatch(
groupComponents({ groupComponents({

View File

@ -58,7 +58,14 @@
<div class="flex gap-x-4"> <div class="flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Penalty Duration</mat-label> <mat-label>
Penalty Duration
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The amount of time used when this processor penalizes a FlowFile."></i>
</mat-label>
<input <input
matInput matInput
formControlName="penaltyDuration" formControlName="penaltyDuration"
@ -68,14 +75,28 @@
</div> </div>
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Yield Duration</mat-label> <mat-label>
Yield Duration
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="When a processor yields, it will not be scheduled again until this amount of time elapses."></i>
</mat-label>
<input matInput formControlName="yieldDuration" type="text" [readonly]="readonly" /> <input matInput formControlName="yieldDuration" type="text" [readonly]="readonly" />
</mat-form-field> </mat-form-field>
</div> </div>
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Bulletin Level</mat-label> <mat-label>
Bulletin Level
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The level at which this processor will generate bulletins."></i>
</mat-label>
<mat-select formControlName="bulletinLevel"> <mat-select formControlName="bulletinLevel">
@for (option of bulletinLevels; track option) { @for (option of bulletinLevels; track option) {
<mat-option [value]="option.value" [disabled]="readonly"> <mat-option [value]="option.value" [disabled]="readonly">
@ -94,7 +115,14 @@
<div class="w-full"> <div class="w-full">
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Scheduling Strategy</mat-label> <mat-label>
Scheduling Strategy
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The strategy used to schedule this processor."></i>
</mat-label>
<mat-select <mat-select
formControlName="schedulingStrategy" formControlName="schedulingStrategy"
(selectionChange)="schedulingStrategyChanged($event.value)"> (selectionChange)="schedulingStrategyChanged($event.value)">
@ -104,7 +132,7 @@
[disabled]="readonly" [disabled]="readonly"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>
@ -115,7 +143,14 @@
<div class="flex gap-x-4"> <div class="flex gap-x-4">
<div class="w-44"> <div class="w-44">
<mat-form-field> <mat-form-field>
<mat-label>Concurrent Tasks</mat-label> <mat-label>
Concurrent Tasks
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The number of tasks that should be concurrently scheduled for this processor."></i>
</mat-label>
<input <input
matInput matInput
formControlName="concurrentTasks" formControlName="concurrentTasks"
@ -127,7 +162,14 @@
</div> </div>
<div class="w-44"> <div class="w-44">
<mat-form-field> <mat-form-field>
<mat-label>Scheduling Period</mat-label> <mat-label>
Run Schedule
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The minimum number of seconds that should elapse between task executions."></i>
</mat-label>
<input <input
matInput matInput
formControlName="schedulingPeriod" formControlName="schedulingPeriod"
@ -139,7 +181,14 @@
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Execution</mat-label> <mat-label>
Execution
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The node(s) that this processor will be scheduled to run on."></i>
</mat-label>
<mat-select formControlName="executionNode"> <mat-select formControlName="executionNode">
@for (option of executionStrategies; track option) { @for (option of executionStrategies; track option) {
<mat-option <mat-option
@ -147,7 +196,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>
@ -159,7 +208,14 @@
<div class="w-full"> <div class="w-full">
@if (supportsBatching()) { @if (supportsBatching()) {
<div class="flex flex-col mb-5"> <div class="flex flex-col mb-5">
<div>Run Duration</div> <div>
Run Duration
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="When scheduled to run, the processor will continue running for up to this duration. A run duration of 0ms will execute once when scheduled."></i>
</div>
<run-duration-slider <run-duration-slider
formControlName="runDuration" formControlName="runDuration"
(change)="runDurationChanged()"></run-duration-slider> (change)="runDurationChanged()"></run-duration-slider>

View File

@ -32,8 +32,7 @@ import {
Parameter, Parameter,
ParameterContextReferenceEntity, ParameterContextReferenceEntity,
Property, Property,
SelectOption, SelectOption
TextTipInput
} from '../../../../../../../state/shared'; } from '../../../../../../../state/shared';
import { Client } from '../../../../../../../service/client.service'; import { Client } from '../../../../../../../service/client.service';
import { NiFiCommon } from '../../../../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../../../../service/nifi-common.service';
@ -239,13 +238,6 @@ export class EditProcessor {
return this.nifiCommon.formatBundle(entity.component.bundle); return this.nifiCommon.formatBundle(entity.component.bundle);
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
concurrentTasksChanged(): void { concurrentTasksChanged(): void {
if (this.schedulingStrategy === 'CRON_DRIVEN') { if (this.schedulingStrategy === 'CRON_DRIVEN') {
this.cronDrivenConcurrentTasks = this.editProcessorForm.get('concurrentTasks')?.value; this.cronDrivenConcurrentTasks = this.editProcessorForm.get('concurrentTasks')?.value;

View File

@ -20,11 +20,11 @@
<div class="flex flex-col"> <div class="flex flex-col">
<div class="flex items-center gap-x-1.5"> <div class="flex items-center gap-x-1.5">
<div>Automatically Terminate/Retry Relationships</div> <div>Automatically Terminate/Retry Relationships</div>
<mat-icon <i
class="info-icon" class="fa fa-info-circle"
title="Will automatically terminate and/or retry FlowFiles sent to a given relationship if it is not defined elsewhere. If both terminate and retry are selected, any retry logic will happen first, then auto-termination." nifiTooltip
>info_outline</mat-icon [tooltipComponentType]="TextTip"
> tooltipInputData="Will automatically terminate and/or retry FlowFiles sent to a given relationship if it is not defined elsewhere. If both terminate and retry are selected, any retry logic will happen first, then auto-termination."></i>
</div> </div>
<div class="flex flex-col gap-y-3"> <div class="flex flex-col gap-y-3">
@for (relationship of relationships; track relationship; let i = $index) { @for (relationship of relationships; track relationship; let i = $index) {
@ -65,7 +65,14 @@
@if (isRelationshipRetried()) { @if (isRelationshipRetried()) {
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Number of Retry Attempts</mat-label> <mat-label>
Number of Retry Attempts
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="For relationships set to retry, this number indicates how many times a FlowFile will attempt to reprocess before it is routed elsewhere."></i>
</mat-label>
<input <input
matInput matInput
[(ngModel)]="retryCount" [(ngModel)]="retryCount"
@ -73,22 +80,16 @@
name="retryCount" name="retryCount"
(keyup)="handleChanged()" (keyup)="handleChanged()"
[readonly]="isDisabled" /> [readonly]="isDisabled" />
<mat-icon
matSuffix
class="info-icon"
title="For relationships set to retry, this number indicates how many times a FlowFile will attempt to reprocess before it is routed elsewhere."
>info_outline</mat-icon
>
</mat-form-field> </mat-form-field>
</div> </div>
<div class="flex flex-col mb-6"> <div class="flex flex-col mb-6">
<div class="flex items-center gap-x-1.5"> <div class="flex items-center gap-x-1.5">
<div>Retry Back Off Policy</div> <div>Retry Back Off Policy</div>
<mat-icon <i
class="info-icon" class="fa fa-info-circle"
title="Penalize: Retry attempts will occur in time, but the processor will continue to process other FlowFiles. Yield: No other FlowFile processing will occur until all retry attempts have been made." nifiTooltip
>info_outline</mat-icon [tooltipComponentType]="TextTip"
> tooltipInputData="Penalize: Retry attempts will occur in time, but the processor will continue to process other FlowFiles. Yield: No other FlowFile processing will occur until all retry attempts have been made."></i>
</div> </div>
<mat-radio-group <mat-radio-group
[(ngModel)]="backoffMechanism" [(ngModel)]="backoffMechanism"
@ -101,19 +102,20 @@
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Retry Maximum Back Off Period</mat-label> <mat-label>
Retry Maximum Back Off Period
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Initial retries are based on the Penalty/Yield Duration time specified in the Settings tab. The duration time is repeatedly doubled for every subsequent retry attempt. This number indicates the maximum allowable time period before another retry attempt occurs."></i>
</mat-label>
<input <input
matInput matInput
[(ngModel)]="maxBackoffPeriod" [(ngModel)]="maxBackoffPeriod"
type="text" type="text"
(keyup)="handleChanged()" (keyup)="handleChanged()"
[readonly]="isDisabled" /> [readonly]="isDisabled" />
<mat-icon
matSuffix
class="info-icon"
title="Initial retries are based on the Penalty/Yield Duration time specified in the Settings tab. The duration time is repeatedly doubled for every subsequent retry attempt. This number indicates the maximum allowable time period before another retry attempt occurs."
>info_outline</mat-icon
>
</mat-form-field> </mat-form-field>
</div> </div>
} }

View File

@ -22,7 +22,14 @@
<div class="tab-content py-4 flex gap-x-4"> <div class="tab-content py-4 flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>URLs</mat-label> <mat-label>
URLs
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify the remote target NiFi URLs. Multiple URLs can be specified in comma-separated format. Different protocols cannot be mixed. If remote NiFi is a cluster, two or more node URLs are recommended for better connection establishment availability."></i>
</mat-label>
<input matInput formControlName="urls" type="text" placeholder="https://remotehost:8443/nifi" /> <input matInput formControlName="urls" type="text" placeholder="https://remotehost:8443/nifi" />
</mat-form-field> </mat-form-field>
</div> </div>
@ -30,30 +37,30 @@
<div class="flex gap-x-4"> <div class="flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Transport Protocol</mat-label> <mat-label>
Transport Protocol
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify the transport protocol to use for this Remote Process Group communication."></i>
</mat-label>
<mat-select formControlName="transportProtocol"> <mat-select formControlName="transportProtocol">
<mat-option <mat-option value="RAW"> RAW </mat-option>
value="RAW" <mat-option value="HTTP"> HTTP </mat-option>
nifiTooltip
[tooltipComponentType]="TextTip"
[tooltipInputData]="getOptionTipData('RAW')"
[delayClose]="false">
RAW
</mat-option>
<mat-option
value="HTTP"
nifiTooltip
[tooltipComponentType]="TextTip"
[tooltipInputData]="getOptionTipData('HTTP')"
[delayClose]="false">
HTTP
</mat-option>
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
</div> </div>
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Local Network Interface</mat-label> <mat-label>
Local Network Interface
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The local network interface to send/receive data. If not specified, any local address is used. If clustered, all nodes must have an interface with this identifier."></i>
</mat-label>
<input matInput formControlName="localNetworkInterface" type="text" /> <input matInput formControlName="localNetworkInterface" type="text" />
</mat-form-field> </mat-form-field>
</div> </div>
@ -61,13 +68,27 @@
<div class="flex gap-x-4"> <div class="flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>HTTP Proxy Server Hostname</mat-label> <mat-label>
HTTP Proxy Server Hostname
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance."></i>
</mat-label>
<input matInput formControlName="httpProxyServerHostname" type="text" /> <input matInput formControlName="httpProxyServerHostname" type="text" />
</mat-form-field> </mat-form-field>
</div> </div>
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>HTTP Proxy Server Port</mat-label> <mat-label>
HTTP Proxy Server Port
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify the proxy server's port number, optional. If not specified, default port 80 will be used."></i>
</mat-label>
<input matInput formControlName="httpProxyServerPort" type="text" /> <input matInput formControlName="httpProxyServerPort" type="text" />
</mat-form-field> </mat-form-field>
</div> </div>
@ -75,27 +96,55 @@
<div class="flex gap-x-4"> <div class="flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>HTTP Proxy User</mat-label> <mat-label>
HTTP Proxy User
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify an user name to connect to the proxy server, optional."></i>
</mat-label>
<input matInput formControlName="httpProxyUser" type="text" /> <input matInput formControlName="httpProxyUser" type="text" />
</mat-form-field> </mat-form-field>
</div> </div>
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>HTTP Proxy Password</mat-label> <mat-label>
<input matInput formControlName="httpProxyPassword" type="text" /> HTTP Proxy Password
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify an user password to connect to the proxy server, optional."></i>
</mat-label>
<input matInput formControlName="httpProxyPassword" type="password" />
</mat-form-field> </mat-form-field>
</div> </div>
</div> </div>
<div class="flex gap-x-4"> <div class="flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Communications Timeout</mat-label> <mat-label>
Communications Timeout
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="When communication with this remote process group takes longer than this amount of time, it will timeout."></i>
</mat-label>
<input matInput formControlName="communicationsTimeout" type="text" /> <input matInput formControlName="communicationsTimeout" type="text" />
</mat-form-field> </mat-form-field>
</div> </div>
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Yield Duration</mat-label> <mat-label>
Yield Duration
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="When communication with this remote process group fails, it will not be scheduled again until this amount of time elapses."></i>
</mat-label>
<input matInput formControlName="yieldDuration" type="text" /> <input matInput formControlName="yieldDuration" type="text" />
</mat-form-field> </mat-form-field>
</div> </div>

View File

@ -20,7 +20,6 @@ import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { CanvasState } from '../../../../../state'; import { CanvasState } from '../../../../../state';
import { createRemoteProcessGroup } from '../../../../../state/flow/flow.actions'; import { createRemoteProcessGroup } from '../../../../../state/flow/flow.actions';
import { TextTipInput } from '../../../../../../../state/shared';
import { selectSaving } from '../../../../../state/flow/flow.selectors'; import { selectSaving } from '../../../../../state/flow/flow.selectors';
import { AsyncPipe } from '@angular/common'; import { AsyncPipe } from '@angular/common';
import { ErrorBanner } from '../../../../../../../ui/common/error-banner/error-banner.component'; import { ErrorBanner } from '../../../../../../../ui/common/error-banner/error-banner.component';
@ -31,10 +30,10 @@ import { MatOptionModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nifi-spinner.directive'; import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nifi-spinner.directive';
import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { CreateComponentRequest } from '../../../../../state/flow'; import { CreateComponentRequest } from '../../../../../state/flow';
import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
@Component({ @Component({
standalone: true, standalone: true,
@ -49,8 +48,8 @@ import { CreateComponentRequest } from '../../../../../state/flow';
ReactiveFormsModule, ReactiveFormsModule,
MatOptionModule, MatOptionModule,
MatSelectModule, MatSelectModule,
NifiTooltipDirective, MatIconModule,
MatIconModule NifiTooltipDirective
], ],
templateUrl: './create-remote-process-group.component.html', templateUrl: './create-remote-process-group.component.html',
styleUrls: ['./create-remote-process-group.component.scss'] styleUrls: ['./create-remote-process-group.component.scss']
@ -58,8 +57,6 @@ import { CreateComponentRequest } from '../../../../../state/flow';
export class CreateRemoteProcessGroup { export class CreateRemoteProcessGroup {
saving$ = this.store.select(selectSaving); saving$ = this.store.select(selectSaving);
protected readonly TextTip = TextTip;
createRemoteProcessGroupForm: FormGroup; createRemoteProcessGroupForm: FormGroup;
constructor( constructor(
@ -80,12 +77,6 @@ export class CreateRemoteProcessGroup {
}); });
} }
getOptionTipData(tip: string): TextTipInput {
return {
text: tip
};
}
createRemoteProcessGroup(): void { createRemoteProcessGroup(): void {
this.store.dispatch( this.store.dispatch(
createRemoteProcessGroup({ createRemoteProcessGroup({
@ -104,4 +95,6 @@ export class CreateRemoteProcessGroup {
}) })
); );
} }
protected readonly TextTip = TextTip;
} }

View File

@ -30,7 +30,14 @@
<div class="tab-content py-4 flex gap-x-4"> <div class="tab-content py-4 flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>URLs</mat-label> <mat-label>
URLs
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify the remote target NiFi URLs. Multiple URLs can be specified in comma-separated format. Different protocols cannot be mixed. If remote NiFi is a cluster, two or more node URLs are recommended for better connection establishment availability."></i>
</mat-label>
<input <input
matInput matInput
formControlName="urls" formControlName="urls"
@ -43,7 +50,14 @@
<div class="flex gap-x-4"> <div class="flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Transport Protocol</mat-label> <mat-label>
Transport Protocol
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify the transport protocol to use for this Remote Process Group communication."></i>
</mat-label>
<mat-select formControlName="transportProtocol"> <mat-select formControlName="transportProtocol">
<mat-option value="RAW" [disabled]="readonly"> RAW</mat-option> <mat-option value="RAW" [disabled]="readonly"> RAW</mat-option>
<mat-option value="HTTP" [disabled]="readonly"> HTTP</mat-option> <mat-option value="HTTP" [disabled]="readonly"> HTTP</mat-option>
@ -52,7 +66,14 @@
</div> </div>
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Local Network Interface</mat-label> <mat-label>
Local Network Interface
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The local network interface to send/receive data. If not specified, any local address is used. If clustered, all nodes must have an interface with this identifier."></i>
</mat-label>
<input matInput formControlName="localNetworkInterface" type="text" [readonly]="readonly" /> <input matInput formControlName="localNetworkInterface" type="text" [readonly]="readonly" />
</mat-form-field> </mat-form-field>
</div> </div>
@ -60,13 +81,27 @@
<div class="flex gap-x-4"> <div class="flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>HTTP Proxy Server Hostname</mat-label> <mat-label>
HTTP Proxy Server Hostname
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance."></i>
</mat-label>
<input matInput formControlName="httpProxyServerHostname" type="text" [readonly]="readonly" /> <input matInput formControlName="httpProxyServerHostname" type="text" [readonly]="readonly" />
</mat-form-field> </mat-form-field>
</div> </div>
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>HTTP Proxy Server Port</mat-label> <mat-label>
HTTP Proxy Server Port
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify the proxy server's port number, optional. If not specified, default port 80 will be used."></i>
</mat-label>
<input matInput formControlName="httpProxyServerPort" type="text" [readonly]="readonly" /> <input matInput formControlName="httpProxyServerPort" type="text" [readonly]="readonly" />
</mat-form-field> </mat-form-field>
</div> </div>
@ -74,27 +109,55 @@
<div class="flex gap-x-4"> <div class="flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>HTTP Proxy User</mat-label> <mat-label>
HTTP Proxy User
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify an user name to connect to the proxy server, optional."></i>
</mat-label>
<input matInput formControlName="httpProxyUser" type="text" [readonly]="readonly" /> <input matInput formControlName="httpProxyUser" type="text" [readonly]="readonly" />
</mat-form-field> </mat-form-field>
</div> </div>
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>HTTP Proxy Password</mat-label> <mat-label>
<input matInput formControlName="httpProxyPassword" type="text" [readonly]="readonly" /> HTTP Proxy Password
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Specify an user password to connect to the proxy server, optional."></i>
</mat-label>
<input matInput formControlName="httpProxyPassword" type="password" [readonly]="readonly" />
</mat-form-field> </mat-form-field>
</div> </div>
</div> </div>
<div class="flex gap-x-4"> <div class="flex gap-x-4">
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Communications Timeout</mat-label> <mat-label>
Communications Timeout
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="When communication with this remote process group takes longer than this amount of time, it will timeout."></i>
</mat-label>
<input matInput formControlName="communicationsTimeout" type="text" [readonly]="readonly" /> <input matInput formControlName="communicationsTimeout" type="text" [readonly]="readonly" />
</mat-form-field> </mat-form-field>
</div> </div>
<div class="w-full"> <div class="w-full">
<mat-form-field> <mat-form-field>
<mat-label>Yield Duration</mat-label> <mat-label>
Yield Duration
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="When communication with this remote process group fails, it will not be scheduled again until this amount of time elapses."></i>
</mat-label>
<input matInput formControlName="yieldDuration" type="text" [readonly]="readonly" /> <input matInput formControlName="yieldDuration" type="text" [readonly]="readonly" />
</mat-form-field> </mat-form-field>
</div> </div>

View File

@ -31,6 +31,7 @@ import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-t
import { EditComponentDialogRequest } from '../../../../../state/flow'; import { EditComponentDialogRequest } from '../../../../../state/flow';
import { ErrorBanner } from '../../../../../../../ui/common/error-banner/error-banner.component'; import { ErrorBanner } from '../../../../../../../ui/common/error-banner/error-banner.component';
import { CanvasUtils } from '../../../../../service/canvas-utils.service'; import { CanvasUtils } from '../../../../../service/canvas-utils.service';
import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive';
@Component({ @Component({
standalone: true, standalone: true,
@ -46,7 +47,8 @@ import { CanvasUtils } from '../../../../../service/canvas-utils.service';
AsyncPipe, AsyncPipe,
NifiSpinnerDirective, NifiSpinnerDirective,
FormsModule, FormsModule,
ErrorBanner ErrorBanner,
NifiTooltipDirective
], ],
styleUrls: ['./edit-remote-process-group.component.scss'] styleUrls: ['./edit-remote-process-group.component.scss']
}) })

View File

@ -31,7 +31,14 @@
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Concurrent Tasks</mat-label> <mat-label>
Concurrent Tasks
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The number of tasks that should be concurrently scheduled for this port."></i>
</mat-label>
<input matInput formControlName="concurrentTasks" type="text" /> <input matInput formControlName="concurrentTasks" type="text" />
</mat-form-field> </mat-form-field>
</div> </div>
@ -41,19 +48,40 @@
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Batch Count</mat-label> <mat-label>
Batch Count
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The preferred number of flow files to include in a transaction for this port."></i>
</mat-label>
<input matInput formControlName="count" type="text" /> <input matInput formControlName="count" type="text" />
</mat-form-field> </mat-form-field>
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Batch Size</mat-label> <mat-label>
Batch Size
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The preferred number of bytes to include in a transaction for this port."></i>
</mat-label>
<input matInput formControlName="size" type="text" /> <input matInput formControlName="size" type="text" />
</mat-form-field> </mat-form-field>
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Batch Duration</mat-label> <mat-label>
Batch Duration
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The preferred amount of time that a transaction should span for this port."></i>
</mat-label>
<input matInput formControlName="duration" type="text" /> <input matInput formControlName="duration" type="text" />
</mat-form-field> </mat-form-field>
</div> </div>

View File

@ -32,6 +32,8 @@ import { ComponentType } from '../../../../../state/shared';
import { PortSummary } from '../../../state/manage-remote-ports'; import { PortSummary } from '../../../state/manage-remote-ports';
import { configureRemotePort } from '../../../state/manage-remote-ports/manage-remote-ports.actions'; import { configureRemotePort } from '../../../state/manage-remote-ports/manage-remote-ports.actions';
import { ClusterConnectionService } from '../../../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../../../service/cluster-connection.service';
import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { NifiTooltipDirective } from '../../../../../ui/common/tooltips/nifi-tooltip.directive';
@Component({ @Component({
standalone: true, standalone: true,
@ -44,7 +46,8 @@ import { ClusterConnectionService } from '../../../../../service/cluster-connect
MatCheckboxModule, MatCheckboxModule,
MatButtonModule, MatButtonModule,
AsyncPipe, AsyncPipe,
NifiSpinnerDirective NifiSpinnerDirective,
NifiTooltipDirective
], ],
styleUrls: ['./edit-remote-port.component.scss'] styleUrls: ['./edit-remote-port.component.scss']
}) })
@ -106,4 +109,6 @@ export class EditRemotePortComponent {
}) })
); );
} }
protected readonly TextTip = TextTip;
} }

View File

@ -72,7 +72,7 @@
nifiTooltip nifiTooltip
[delayClose]="false" [delayClose]="false"
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getCommentsTipData(item)"></div> [tooltipInputData]="item.comments"></div>
} }
@if (portExists(item)) { @if (portExists(item)) {
<div <div
@ -80,7 +80,7 @@
nifiTooltip nifiTooltip
[delayClose]="false" [delayClose]="false"
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getDisconnectedTipData()"></div> tooltipInputData="This port has been removed."></div>
} }
</div> </div>
</td> </td>

View File

@ -39,7 +39,7 @@ import {
stopRemotePortTransmission stopRemotePortTransmission
} from '../../state/manage-remote-ports/manage-remote-ports.actions'; } from '../../state/manage-remote-ports/manage-remote-ports.actions';
import { initialState } from '../../state/manage-remote-ports/manage-remote-ports.reducer'; import { initialState } from '../../state/manage-remote-ports/manage-remote-ports.reducer';
import { isDefinedAndNotNull, TextTipInput } from '../../../../state/shared'; import { isDefinedAndNotNull } from '../../../../state/shared';
import { selectCurrentUser } from '../../../../state/current-user/current-user.selectors'; import { selectCurrentUser } from '../../../../state/current-user/current-user.selectors';
import { NiFiState } from '../../../../state'; import { NiFiState } from '../../../../state';
import { NiFiCommon } from '../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../service/nifi-common.service';
@ -252,18 +252,6 @@ export class ManageRemotePorts implements OnInit, OnDestroy {
return !entity.exists; return !entity.exists;
} }
getCommentsTipData(entity: PortSummary): TextTipInput {
return {
text: entity.comments
};
}
getDisconnectedTipData(): TextTipInput {
return {
text: 'This port has been removed.'
};
}
toggleTransmission(port: PortSummary): void { toggleTransmission(port: PortSummary): void {
if (this.currentRpg) { if (this.currentRpg) {
if (port.transmitting) { if (port.transmitting) {

View File

@ -61,7 +61,14 @@
} }
</div> </div>
<div class="flex-1 flex flex-col"> <div class="flex-1 flex flex-col">
<div>Referencing Components</div> <div>
Referencing Components
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Components referencing the modified parameters grouped by process group."></i>
</div>
<div class="relative h-full border"> <div class="relative h-full border">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">
<parameter-references <parameter-references
@ -119,7 +126,14 @@
</div> </div>
</div> </div>
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div>Referencing Components</div> <div>
Referencing Components
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Other components referencing this parameter context."></i>
</div>
<div class="relative h-full border"> <div class="relative h-full border">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">
<process-group-references <process-group-references

View File

@ -42,6 +42,8 @@ import { ParameterReferences } from '../../../../../ui/common/parameter-referenc
import { RouterLink } from '@angular/router'; import { RouterLink } from '@angular/router';
import { ErrorBanner } from '../../../../../ui/common/error-banner/error-banner.component'; import { ErrorBanner } from '../../../../../ui/common/error-banner/error-banner.component';
import { ClusterConnectionService } from '../../../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../../../service/cluster-connection.service';
import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { NifiTooltipDirective } from '../../../../../ui/common/tooltips/nifi-tooltip.directive';
@Component({ @Component({
selector: 'edit-parameter-context', selector: 'edit-parameter-context',
@ -64,7 +66,8 @@ import { ClusterConnectionService } from '../../../../../service/cluster-connect
ParameterContextInheritance, ParameterContextInheritance,
ParameterReferences, ParameterReferences,
RouterLink, RouterLink,
ErrorBanner ErrorBanner,
NifiTooltipDirective
], ],
styleUrls: ['./edit-parameter-context.component.scss'] styleUrls: ['./edit-parameter-context.component.scss']
}) })
@ -181,4 +184,6 @@ export class EditParameterContext {
getParameterProviderLink(parameterProvider: ParameterProviderConfiguration): string[] { getParameterProviderLink(parameterProvider: ParameterProviderConfiguration): string[] {
return ['/settings', 'parameter-providers', parameterProvider.parameterProviderId]; return ['/settings', 'parameter-providers', parameterProvider.parameterProviderId];
} }
protected readonly TextTip = TextTip;
} }

View File

@ -17,7 +17,14 @@
<div class="parameter-context-inheritance flex gap-x-4" cdkDropListGroup> <div class="parameter-context-inheritance flex gap-x-4" cdkDropListGroup>
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div>Available Parameter Contexts</div> <div>
Available Parameter Contexts
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Available Parameter Contexts that could be inherited from."></i>
</div>
<div <div
class="parameter-context-inheritance-list border" class="parameter-context-inheritance-list border"
cdkDropList cdkDropList
@ -43,7 +50,14 @@
</div> </div>
</div> </div>
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div>Selected Parameter Contexts</div> <div>
Selected Parameter Contexts
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Parameter Contexts selected for inheritance. Multiple selected Parameter Contexts will be considered in order from top to bottom."></i>
</div>
<div <div
class="parameter-context-inheritance-list border" class="parameter-context-inheritance-list border"
cdkDropList cdkDropList
@ -71,11 +85,11 @@
<div class="flex gap-x-3 items-center"> <div class="flex gap-x-3 items-center">
<div>{{ item.component.name }}</div> <div>{{ item.component.name }}</div>
@if (hasDescription(item)) { @if (hasDescription(item)) {
<div <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getDescriptionTipData(item)"></div> [tooltipInputData]="item.component.description"></i>
} }
</div> </div>
@if (canClose) { @if (canClose) {

View File

@ -24,7 +24,7 @@ import { AsyncPipe, NgTemplateOutlet } from '@angular/common';
import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay'; import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
import { RouterLink } from '@angular/router'; import { RouterLink } from '@angular/router';
import { NiFiCommon } from '../../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../../service/nifi-common.service';
import { ParameterContextReferenceEntity, TextTipInput } from '../../../../../state/shared'; import { ParameterContextReferenceEntity } from '../../../../../state/shared';
import { NifiTooltipDirective } from '../../../../../ui/common/tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.component'; import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { ParameterReferences } from '../../../../../ui/common/parameter-references/parameter-references.component'; import { ParameterReferences } from '../../../../../ui/common/parameter-references/parameter-references.component';
@ -127,12 +127,6 @@ export class ParameterContextInheritance implements ControlValueAccessor {
return !this.nifiCommon.isBlank(entity.component.description); return !this.nifiCommon.isBlank(entity.component.description);
} }
getDescriptionTipData(entity: ParameterContextEntity): TextTipInput {
return {
text: entity.component.description
};
}
removeSelected(entity: ParameterContextEntity, i: number): void { removeSelected(entity: ParameterContextEntity, i: number): void {
transferArrayItem( transferArrayItem(
this.selectedParameterContexts, this.selectedParameterContexts,

View File

@ -36,11 +36,11 @@
{{ item.entity.parameter.name }} {{ item.entity.parameter.name }}
</div> </div>
@if (hasDescription(item)) { @if (hasDescription(item)) {
<div <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle primary-color"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getDescriptionTipData(item)"></div> [tooltipInputData]="item.entity.parameter.description"></i>
} }
</div> </div>
</td> </td>
@ -81,7 +81,7 @@
class="fa fa-info primary-color" class="fa fa-info primary-color"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getExtraWhitespaceTipData()"></div> tooltipInputData="The specified value contains leading and/or trailing whitespace character(s). This could produce unexpected results if it was not intentional."></div>
} }
</div> </div>
</ng-template> </ng-template>
@ -140,7 +140,14 @@
</div> </div>
</div> </div>
<div class="flex-1 flex flex-col"> <div class="flex-1 flex flex-col">
<div>Referencing Components</div> <div>
Referencing Components
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Components referencing this parameter grouped by process group."></i>
</div>
<div class="relative h-full border"> <div class="relative h-full border">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">
@if (selectedItem) { @if (selectedItem) {

View File

@ -24,7 +24,7 @@ import { AsyncPipe, NgTemplateOutlet } from '@angular/common';
import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay'; import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
import { RouterLink } from '@angular/router'; import { RouterLink } from '@angular/router';
import { NiFiCommon } from '../../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../../service/nifi-common.service';
import { Parameter, ParameterEntity, TextTipInput } from '../../../../../state/shared'; import { Parameter, ParameterEntity } from '../../../../../state/shared';
import { NifiTooltipDirective } from '../../../../../ui/common/tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.component'; import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { Observable, take } from 'rxjs'; import { Observable, take } from 'rxjs';
@ -200,12 +200,6 @@ export class ParameterTable implements AfterViewInit, ControlValueAccessor {
return !this.nifiCommon.isBlank(item.entity.parameter.description); return !this.nifiCommon.isBlank(item.entity.parameter.description);
} }
getDescriptionTipData(item: ParameterItem): TextTipInput {
return {
text: item.entity.parameter.description
};
}
isSensitiveParameter(item: ParameterItem): boolean { isSensitiveParameter(item: ParameterItem): boolean {
return item.entity.parameter.sensitive; return item.entity.parameter.sensitive;
} }
@ -222,12 +216,6 @@ export class ParameterTable implements AfterViewInit, ControlValueAccessor {
return this.nifiCommon.hasLeadTrailWhitespace(value); return this.nifiCommon.hasLeadTrailWhitespace(value);
} }
getExtraWhitespaceTipData(): TextTipInput {
return {
text: 'The specified value contains leading and/or trailing whitespace character(s). This could produce unexpected results if it was not intentional.'
};
}
canGoToParameter(item: ParameterItem): boolean { canGoToParameter(item: ParameterItem): boolean {
return ( return (
item.entity.parameter.inherited == true && item.entity.parameter.inherited == true &&

View File

@ -37,8 +37,16 @@
<mat-form-field> <mat-form-field>
<mat-label>Date Range</mat-label> <mat-label>Date Range</mat-label>
<mat-date-range-input [rangePicker]="picker"> <mat-date-range-input [rangePicker]="picker">
<input matStartDate formControlName="startDate" placeholder="Start date" /> <input
<input matEndDate formControlName="endDate" placeholder="End date" /> matStartDate
formControlName="startDate"
placeholder="Start date"
title="The start date in the format 'mm/dd/yyyy'. Must also specify start time." />
<input
matEndDate
formControlName="endDate"
placeholder="End date"
title="The end date in the format 'mm/dd/yyyy'. Must also specify end time." />
</mat-date-range-input> </mat-date-range-input>
<mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle> <mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle>
<mat-date-range-picker #picker></mat-date-range-picker> <mat-date-range-picker #picker></mat-date-range-picker>
@ -47,20 +55,46 @@
<div class="w-full flex flex-col"> <div class="w-full flex flex-col">
<mat-form-field> <mat-form-field>
<mat-label>Start Time ({{ timezone }})</mat-label> <mat-label>Start Time ({{ timezone }})</mat-label>
<input matInput type="time" step="1" formControlName="startTime" /> <input
matInput
type="time"
step="1"
formControlName="startTime"
placeholder="hh:mm:ss"
title="The start time in the format 'hh:mm:ss'. Must also specify start date." />
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<mat-label>Minimum File Size</mat-label> <mat-label>
Minimum File Size
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The minimum file size (e.g. 2 KB)."></i>
</mat-label>
<input matInput type="text" formControlName="minFileSize" /> <input matInput type="text" formControlName="minFileSize" />
</mat-form-field> </mat-form-field>
</div> </div>
<div class="w-full flex flex-col"> <div class="w-full flex flex-col">
<mat-form-field> <mat-form-field>
<mat-label>End Time ({{ timezone }})</mat-label> <mat-label>End Time ({{ timezone }})</mat-label>
<input matInput type="time" step="1" formControlName="endTime" /> <input
matInput
type="time"
step="1"
formControlName="endTime"
placeholder="hh:mm:ss"
title="The end time in the format 'hh:mm:ss'. Must also specify end date." />
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<mat-label>Maximum File Size</mat-label> <mat-label>
Maximum File Size
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The maximum file size (e.g. 4 GB)."></i>
</mat-label>
<input matInput type="text" formControlName="maxFileSize" /> <input matInput type="text" formControlName="maxFileSize" />
</mat-form-field> </mat-form-field>
</div> </div>

View File

@ -58,7 +58,14 @@
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Enforcement Policy</mat-label> <mat-label>
Enforcement Policy
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The enforcement policy of the flow analysis rule."></i>
</mat-label>
<mat-select formControlName="enforcementPolicy"> <mat-select formControlName="enforcementPolicy">
@for (option of strategies; track option) { @for (option of strategies; track option) {
<mat-option <mat-option
@ -66,7 +73,7 @@
[disabled]="readonly" [disabled]="readonly"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getPropertyTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>

View File

@ -31,8 +31,7 @@ import {
InlineServiceCreationRequest, InlineServiceCreationRequest,
InlineServiceCreationResponse, InlineServiceCreationResponse,
Property, Property,
SelectOption, SelectOption
TextTipInput
} from '../../../../../state/shared'; } from '../../../../../state/shared';
import { NiFiCommon } from '../../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../../service/nifi-common.service';
import { PropertyTable } from '../../../../../ui/common/property-table/property-table.component'; import { PropertyTable } from '../../../../../ui/common/property-table/property-table.component';
@ -157,12 +156,5 @@ export class EditFlowAnalysisRule {
}); });
} }
getPropertyTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
protected readonly TextTip = TextTip; protected readonly TextTip = TextTip;
} }

View File

@ -41,7 +41,7 @@
[delayClose]="false" [delayClose]="false"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getCommentsTipData(item)"></div> [tooltipInputData]="item.component.comments"></div>
} }
@if (hasErrors(item)) { @if (hasErrors(item)) {
<div <div

View File

@ -27,7 +27,7 @@ import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.com
import { BulletinsTip } from '../../../../../ui/common/tooltips/bulletins-tip/bulletins-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 { ValidationErrorsTip } from '../../../../../ui/common/tooltips/validation-errors-tip/validation-errors-tip.component';
import { NiFiCommon } from '../../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../../service/nifi-common.service';
import { BulletinsTipInput, TextTipInput, ValidationErrorsTipInput } from '../../../../../state/shared'; import { BulletinsTipInput, ValidationErrorsTipInput } from '../../../../../state/shared';
import { NifiTooltipDirective } from '../../../../../ui/common/tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../../../ui/common/tooltips/nifi-tooltip.directive';
import { ReportingTaskEntity } from '../../../state/reporting-tasks'; import { ReportingTaskEntity } from '../../../state/reporting-tasks';
import { CurrentUser } from '../../../../../state/current-user'; import { CurrentUser } from '../../../../../state/current-user';
@ -137,12 +137,6 @@ export class FlowAnalysisRuleTable {
return !this.nifiCommon.isBlank(entity.component.comments); return !this.nifiCommon.isBlank(entity.component.comments);
} }
getCommentsTipData(entity: FlowAnalysisRuleEntity): TextTipInput {
return {
text: entity.component.comments
};
}
hasErrors(entity: FlowAnalysisRuleEntity): boolean { hasErrors(entity: FlowAnalysisRuleEntity): boolean {
return !this.nifiCommon.isEmpty(entity.component.validationErrors); return !this.nifiCommon.isEmpty(entity.component.validationErrors);
} }

View File

@ -20,7 +20,14 @@
<form [formGroup]="controllerForm"> <form [formGroup]="controllerForm">
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Maximum Timer Driven Thread Count</mat-label> <mat-label>
Maximum Timer Driven Thread Count
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The maximum number of threads for timer driven processors available to the system."></i>
</mat-label>
<input <input
matInput matInput
formControlName="timerDrivenThreadCount" formControlName="timerDrivenThreadCount"

View File

@ -24,6 +24,7 @@ import { Client } from '../../../../../service/client.service';
import { selectCurrentUser } from '../../../../../state/current-user/current-user.selectors'; import { selectCurrentUser } from '../../../../../state/current-user/current-user.selectors';
import { selectSaving } from '../../../state/general/general.selectors'; import { selectSaving } from '../../../state/general/general.selectors';
import { ClusterConnectionService } from '../../../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../../../service/cluster-connection.service';
import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.component';
@Component({ @Component({
selector: 'general-form', selector: 'general-form',
@ -67,4 +68,6 @@ export class GeneralForm {
this.store.dispatch(updateControllerConfig({ request: payload })); this.store.dispatch(updateControllerConfig({ request: payload }));
} }
protected readonly TextTip = TextTip;
} }

View File

@ -25,6 +25,7 @@ import { MatInputModule } from '@angular/material/input';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { NifiSpinnerDirective } from '../../../../ui/common/spinner/nifi-spinner.directive'; import { NifiSpinnerDirective } from '../../../../ui/common/spinner/nifi-spinner.directive';
import { NifiTooltipDirective } from '../../../../ui/common/tooltips/nifi-tooltip.directive';
@NgModule({ @NgModule({
declarations: [General, GeneralForm], declarations: [General, GeneralForm],
@ -37,7 +38,8 @@ import { NifiSpinnerDirective } from '../../../../ui/common/spinner/nifi-spinner
MatInputModule, MatInputModule,
MatButtonModule, MatButtonModule,
NgxSkeletonLoaderModule, NgxSkeletonLoaderModule,
NifiSpinnerDirective NifiSpinnerDirective,
NifiTooltipDirective
] ]
}) })
export class GeneralModule {} export class GeneralModule {}

View File

@ -56,7 +56,14 @@
</div> </div>
</div> </div>
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div>Referencing Components</div> <div>
Referencing Components
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Other components referencing this parameter provider."></i>
</div>
<div class="relative h-full border"> <div class="relative h-full border">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">
<parameter-provider-references <parameter-provider-references

View File

@ -44,6 +44,8 @@ import { PropertyTable } from '../../../../../ui/common/property-table/property-
import { ErrorBanner } from '../../../../../ui/common/error-banner/error-banner.component'; import { ErrorBanner } from '../../../../../ui/common/error-banner/error-banner.component';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { ClusterConnectionService } from '../../../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../../../service/cluster-connection.service';
import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.component';
import { NifiTooltipDirective } from '../../../../../ui/common/tooltips/nifi-tooltip.directive';
@Component({ @Component({
selector: 'edit-parameter-provider', selector: 'edit-parameter-provider',
@ -60,7 +62,8 @@ import { ClusterConnectionService } from '../../../../../service/cluster-connect
ParameterProviderReferences, ParameterProviderReferences,
PropertyTable, PropertyTable,
ErrorBanner, ErrorBanner,
CommonModule CommonModule,
NifiTooltipDirective
], ],
templateUrl: './edit-parameter-provider.component.html', templateUrl: './edit-parameter-provider.component.html',
styleUrls: ['./edit-parameter-provider.component.scss'] styleUrls: ['./edit-parameter-provider.component.scss']
@ -146,4 +149,6 @@ export class EditParameterProvider {
this.goToReferencingParameterContext(parameterContextReference.component?.id); this.goToReferencingParameterContext(parameterContextReference.component?.id);
} }
} }
protected readonly TextTip = TextTip;
} }

View File

@ -65,8 +65,10 @@
<div class="flex flex-row items-center gap-x-2"> <div class="flex flex-row items-center gap-x-2">
Parameter Contexts To Create Parameter Contexts To Create
<i <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
title="Parameter groups set to be created as parameter contexts, pending apply."></i> nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Parameter groups set to be created as parameter contexts, pending apply."></i>
</div> </div>
<div <div
*ngIf="Object.keys(parameterContextsToCreate).length > 0; else none" *ngIf="Object.keys(parameterContextsToCreate).length > 0; else none"
@ -78,8 +80,10 @@
<div class="flex flex-row items-center gap-x-2"> <div class="flex flex-row items-center gap-x-2">
Parameter Contexts To Update Parameter Contexts To Update
<i <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
title="Synced parameter contexts to be updated, pending apply."></i> nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Synced parameter contexts to be updated, pending apply."></i>
</div> </div>
<div <div
*ngIf="parameterContextsToUpdate.length > 0; else none" *ngIf="parameterContextsToUpdate.length > 0; else none"
@ -91,8 +95,10 @@
<div class="flex flex-row items-center gap-x-2"> <div class="flex flex-row items-center gap-x-2">
Affected Referencing Components Affected Referencing Components
<i <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
title="Affected components referencing this parameter provider."></i> nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Affected components referencing this parameter provider."></i>
</div> </div>
<div class="relative h-full border"> <div class="relative h-full border">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">
@ -127,8 +133,10 @@
<div class="flex flex-row items-center gap-x-2"> <div class="flex flex-row items-center gap-x-2">
Select To Configure a Parameter Group Select To Configure a Parameter Group
<i <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
title="Discovered parameter groups from this parameter provider. Select a group to create a parameter context, then configure its parameter sensitivities."></i> nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Discovered parameter groups from this parameter provider. Select a group to create a parameter context, then configure its parameter sensitivities."></i>
</div> </div>
<div class="flex-1"> <div class="flex-1">
<parameter-groups-table <parameter-groups-table
@ -187,8 +195,10 @@
<div class="flex items-center gap-x-2"> <div class="flex items-center gap-x-2">
Fetched Parameters Fetched Parameters
<i <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
title="Discovered parameters from the selected parameter group."></i> nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Discovered parameters from the selected parameter group."></i>
</div> </div>
<ul class="flex-1 overflow-y-auto border px-2"> <ul class="flex-1 overflow-y-auto border px-2">
<li <li
@ -209,8 +219,10 @@
<div class="flex flex-row items-center gap-x-2"> <div class="flex flex-row items-center gap-x-2">
Select Parameters To Be Set As Sensitive Select Parameters To Be Set As Sensitive
<i <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
title="Only parameters that are not referenced can be modified."></i> nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Only parameters that are not referenced can be modified."></i>
</div> </div>
<div class="flex-1 relative"> <div class="flex-1 relative">
@ -289,8 +301,10 @@
<div class="flex flex-row items-center gap-x-2"> <div class="flex flex-row items-center gap-x-2">
Parameter Contexts To Create Parameter Contexts To Create
<i <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
title="Parameter groups set to be created as parameter contexts, pending apply."></i> nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Parameter groups set to be created as parameter contexts, pending apply."></i>
</div> </div>
<div <div
*ngIf="Object.keys(parameterContextsToCreate).length > 0; else none" *ngIf="Object.keys(parameterContextsToCreate).length > 0; else none"
@ -302,8 +316,10 @@
<div class="flex flex-row items-center gap-x-2"> <div class="flex flex-row items-center gap-x-2">
Parameter Contexts To Update Parameter Contexts To Update
<i <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
title="Synced parameter contexts to be updated, pending apply."></i> nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Synced parameter contexts to be updated, pending apply."></i>
</div> </div>
<div <div
*ngIf="parameterContextsToUpdate.length > 0; else none" *ngIf="parameterContextsToUpdate.length > 0; else none"
@ -315,8 +331,10 @@
<div class="flex flex-row items-center gap-x-2"> <div class="flex flex-row items-center gap-x-2">
Referencing Components Referencing Components
<i <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
title="Components referencing this selected parameter."></i> nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Components referencing this selected parameter."></i>
</div> </div>
<div class="relative h-full border"> <div class="relative h-full border">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">

View File

@ -34,7 +34,7 @@
[value]="option.type" [value]="option.type"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ formatType(option) }} {{ formatType(option) }}
</mat-option> </mat-option>

View File

@ -23,7 +23,7 @@ import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { AsyncPipe } from '@angular/common'; import { AsyncPipe } from '@angular/common';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { DocumentedType, TextTipInput } from '../../../../../state/shared'; import { DocumentedType } from '../../../../../state/shared';
import { CreateRegistryClientDialogRequest, CreateRegistryClientRequest } from '../../../state/registry-clients'; import { CreateRegistryClientDialogRequest, CreateRegistryClientRequest } from '../../../state/registry-clients';
import { NifiSpinnerDirective } from '../../../../../ui/common/spinner/nifi-spinner.directive'; import { NifiSpinnerDirective } from '../../../../../ui/common/spinner/nifi-spinner.directive';
import { Client } from '../../../../../service/client.service'; import { Client } from '../../../../../service/client.service';
@ -83,13 +83,6 @@ export class CreateRegistryClient {
return this.nifiCommon.substringAfterLast(option.type, '.'); return this.nifiCommon.substringAfterLast(option.type, '.');
} }
getOptionTipData(option: DocumentedType): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
createRegistryClientClicked() { createRegistryClientClicked() {
const request: CreateRegistryClientRequest = { const request: CreateRegistryClientRequest = {
revision: { revision: {

View File

@ -63,7 +63,14 @@
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Scheduling Strategy</mat-label> <mat-label>
Scheduling Strategy
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The strategy used to schedule this reporting task."></i>
</mat-label>
<mat-select <mat-select
formControlName="schedulingStrategy" formControlName="schedulingStrategy"
(selectionChange)="schedulingStrategyChanged($event.value)"> (selectionChange)="schedulingStrategyChanged($event.value)">
@ -73,7 +80,7 @@
[disabled]="readonly" [disabled]="readonly"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getPropertyTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>
@ -83,7 +90,14 @@
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Run Schedule</mat-label> <mat-label>
Run Schedule
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The amount of time that should elapse between task executions."></i>
</mat-label>
<input <input
matInput matInput
formControlName="schedulingPeriod" formControlName="schedulingPeriod"

View File

@ -33,8 +33,7 @@ import {
InlineServiceCreationRequest, InlineServiceCreationRequest,
InlineServiceCreationResponse, InlineServiceCreationResponse,
Property, Property,
SelectOption, SelectOption
TextTipInput
} from '../../../../../state/shared'; } from '../../../../../state/shared';
import { NiFiCommon } from '../../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../../service/nifi-common.service';
import { PropertyTable } from '../../../../../ui/common/property-table/property-table.component'; import { PropertyTable } from '../../../../../ui/common/property-table/property-table.component';
@ -197,13 +196,6 @@ export class EditReportingTask {
}); });
} }
getPropertyTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
schedulingStrategyChanged(value: string): void { schedulingStrategyChanged(value: string): void {
this.schedulingStrategy = value; this.schedulingStrategy = value;

View File

@ -41,7 +41,7 @@
[delayClose]="false" [delayClose]="false"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getCommentsTipData(item)"></div> [tooltipInputData]="item.component.comments"></div>
} }
@if (hasErrors(item)) { @if (hasErrors(item)) {
<div <div

View File

@ -23,7 +23,7 @@ import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.com
import { BulletinsTip } from '../../../../../ui/common/tooltips/bulletins-tip/bulletins-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 { ValidationErrorsTip } from '../../../../../ui/common/tooltips/validation-errors-tip/validation-errors-tip.component';
import { NiFiCommon } from '../../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../../service/nifi-common.service';
import { BulletinsTipInput, TextTipInput, ValidationErrorsTipInput } from '../../../../../state/shared'; import { BulletinsTipInput, ValidationErrorsTipInput } from '../../../../../state/shared';
import { FlowConfiguration } from '../../../../../state/flow-configuration'; import { FlowConfiguration } from '../../../../../state/flow-configuration';
import { CurrentUser } from '../../../../../state/current-user'; import { CurrentUser } from '../../../../../state/current-user';
@ -92,12 +92,6 @@ export class ReportingTaskTable {
return !this.nifiCommon.isBlank(entity.component.comments); return !this.nifiCommon.isBlank(entity.component.comments);
} }
getCommentsTipData(entity: ReportingTaskEntity): TextTipInput {
return {
text: entity.component.comments
};
}
hasErrors(entity: ReportingTaskEntity): boolean { hasErrors(entity: ReportingTaskEntity): boolean {
return !this.nifiCommon.isEmpty(entity.component.validationErrors); return !this.nifiCommon.isEmpty(entity.component.validationErrors);
} }

View File

@ -224,10 +224,6 @@ export interface ComponentHistoryEntity {
componentHistory: ComponentHistory; componentHistory: ComponentHistory;
} }
export interface TextTipInput {
text: string;
}
export interface UnorderedListTipInput { export interface UnorderedListTipInput {
items: string[]; items: string[];
} }

View File

@ -42,7 +42,7 @@
nifiTooltip nifiTooltip
[delayClose]="false" [delayClose]="false"
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getCommentsTipData(item)"></div> [tooltipInputData]="item.component.comments"></div>
} }
@if (hasErrors(item)) { @if (hasErrors(item)) {
<div <div

View File

@ -22,12 +22,7 @@ import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { NiFiCommon } from '../../../../service/nifi-common.service'; import { NiFiCommon } from '../../../../service/nifi-common.service';
import { MatSortModule, Sort } from '@angular/material/sort'; import { MatSortModule, Sort } from '@angular/material/sort';
import { NgClass } from '@angular/common'; import { NgClass } from '@angular/common';
import { import { BulletinsTipInput, ControllerServiceEntity, ValidationErrorsTipInput } from '../../../../state/shared';
BulletinsTipInput,
ControllerServiceEntity,
TextTipInput,
ValidationErrorsTipInput
} from '../../../../state/shared';
import { NifiTooltipDirective } from '../../tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../tooltips/nifi-tooltip.directive';
import { TextTip } from '../../tooltips/text-tip/text-tip.component'; import { TextTip } from '../../tooltips/text-tip/text-tip.component';
import { BulletinsTip } from '../../tooltips/bulletins-tip/bulletins-tip.component'; import { BulletinsTip } from '../../tooltips/bulletins-tip/bulletins-tip.component';
@ -116,12 +111,6 @@ export class ControllerServiceTable {
return !this.nifiCommon.isBlank(entity.component.comments); return !this.nifiCommon.isBlank(entity.component.comments);
} }
getCommentsTipData(entity: ControllerServiceEntity): TextTipInput {
return {
text: entity.component.comments
};
}
viewDocumentationClicked(entity: ControllerServiceEntity, event: MouseEvent): void { viewDocumentationClicked(entity: ControllerServiceEntity, event: MouseEvent): void {
event.stopPropagation(); event.stopPropagation();
this.viewControllerServiceDocumentation.next(entity); this.viewControllerServiceDocumentation.next(entity);

View File

@ -33,11 +33,25 @@
</div> </div>
<div class="flex flex-col"> <div class="flex flex-col">
<div>Scope</div> <div>Scope</div>
<div class="accent-color font-medium">Service and referencing components</div> <div>
<span class="accent-color font-medium">Service and referencing components</span>
<i
class="fa fa-info-circle ml-1"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Referencing components must be disabled/stopped in order to disable this service."></i>
</div>
</div> </div>
</div> </div>
<div class="flex basis-1/3 flex-col"> <div class="flex basis-1/3 flex-col">
<div>Referencing Components</div> <div>
Referencing Components
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Other components referencing this controller service."></i>
</div>
<div class="relative h-full border" style="min-height: 320px"> <div class="relative h-full border" style="min-height: 320px">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">
<controller-service-references <controller-service-references
@ -132,7 +146,14 @@
</div> </div>
</div> </div>
<div class="flex basis-1/3 flex-col"> <div class="flex basis-1/3 flex-col">
<div>Referencing Components</div> <div>
Referencing Components
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Other components referencing this controller service."></i>
</div>
<div class="relative h-full border" style="min-height: 320px"> <div class="relative h-full border" style="min-height: 320px">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">
<controller-service-references <controller-service-references

View File

@ -75,7 +75,14 @@
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Bulletin Level</mat-label> <mat-label>
Bulletin Level
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="The level at which this controller service will generate bulletins."></i>
</mat-label>
<mat-select formControlName="bulletinLevel"> <mat-select formControlName="bulletinLevel">
@for (option of bulletinLevels; track option) { @for (option of bulletinLevels; track option) {
<mat-option [value]="option.value" [disabled]="readonly"> <mat-option [value]="option.value" [disabled]="readonly">
@ -87,7 +94,14 @@
</div> </div>
</div> </div>
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div>Referencing Components</div> <div>
Referencing Components
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Other components referencing this controller service."></i>
</div>
<div class="relative h-full border"> <div class="relative h-full border">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">
<controller-service-references <controller-service-references

View File

@ -45,6 +45,8 @@ import { ControllerServiceReferences } from '../controller-service-references/co
import { NifiSpinnerDirective } from '../../spinner/nifi-spinner.directive'; import { NifiSpinnerDirective } from '../../spinner/nifi-spinner.directive';
import { ErrorBanner } from '../../error-banner/error-banner.component'; import { ErrorBanner } from '../../error-banner/error-banner.component';
import { ClusterConnectionService } from '../../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../../service/cluster-connection.service';
import { TextTip } from '../../tooltips/text-tip/text-tip.component';
import { NifiTooltipDirective } from '../../tooltips/nifi-tooltip.directive';
@Component({ @Component({
selector: 'edit-controller-service', selector: 'edit-controller-service',
@ -64,7 +66,8 @@ import { ClusterConnectionService } from '../../../../service/cluster-connection
ControllerServiceReferences, ControllerServiceReferences,
AsyncPipe, AsyncPipe,
NifiSpinnerDirective, NifiSpinnerDirective,
ErrorBanner ErrorBanner,
NifiTooltipDirective
], ],
styleUrls: ['./edit-controller-service.component.scss'] styleUrls: ['./edit-controller-service.component.scss']
}) })
@ -172,4 +175,6 @@ export class EditControllerService {
postUpdateNavigation postUpdateNavigation
}); });
} }
protected readonly TextTip = TextTip;
} }

View File

@ -40,7 +40,7 @@
[value]="option.value" [value]="option.value"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getSelectOptionTipData(option)" [tooltipInputData]="option.description"
[delayClose]="false"> [delayClose]="false">
{{ option.text }} {{ option.text }}
</mat-option> </mat-option>
@ -50,7 +50,14 @@
</div> </div>
</div> </div>
<div class="flex basis-1/3 flex-col"> <div class="flex basis-1/3 flex-col">
<div>Referencing Components</div> <div>
Referencing Components
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Other components referencing this controller service."></i>
</div>
<div class="relative h-full border" style="min-height: 320px"> <div class="relative h-full border" style="min-height: 320px">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">
<controller-service-references <controller-service-references
@ -153,7 +160,14 @@
</div> </div>
</div> </div>
<div class="flex basis-1/3 flex-col"> <div class="flex basis-1/3 flex-col">
<div>Referencing Components</div> <div>
Referencing Components
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Other components referencing this controller service."></i>
</div>
<div class="relative h-full border" style="min-height: 320px"> <div class="relative h-full border" style="min-height: 320px">
<div class="absolute inset-0 overflow-y-auto p-1"> <div class="absolute inset-0 overflow-y-auto p-1">
<controller-service-references <controller-service-references

View File

@ -21,8 +21,7 @@ import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators }
import { import {
ControllerServiceReferencingComponent, ControllerServiceReferencingComponent,
SetEnableControllerServiceDialogRequest, SetEnableControllerServiceDialogRequest,
SelectOption, SelectOption
TextTipInput
} from '../../../../state/shared'; } from '../../../../state/shared';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatCheckboxModule } from '@angular/material/checkbox';
@ -114,13 +113,6 @@ export class EnableControllerService implements OnDestroy {
); );
} }
getSelectOptionTipData(option: SelectOption): TextTipInput {
return {
// @ts-ignore
text: option.description
};
}
submitForm() { submitForm() {
this.store.dispatch( this.store.dispatch(
submitEnableRequest({ submitEnableRequest({

View File

@ -29,7 +29,14 @@
</div> </div>
<div> <div>
<mat-form-field> <mat-form-field>
<mat-label>Value</mat-label> <mat-label>
Value
<i
class="fa fa-info-circle"
nifiTooltip
[tooltipComponentType]="TextTip"
tooltipInputData="Parameter values do not support Expression Language or embedded parameter references."></i>
</mat-label>
<textarea matInput formControlName="value" type="text"></textarea> <textarea matInput formControlName="value" type="text"></textarea>
</mat-form-field> </mat-form-field>
</div> </div>

View File

@ -37,6 +37,8 @@ import { MatCheckboxModule } from '@angular/material/checkbox';
import { NifiSpinnerDirective } from '../spinner/nifi-spinner.directive'; import { NifiSpinnerDirective } from '../spinner/nifi-spinner.directive';
import { AsyncPipe } from '@angular/common'; import { AsyncPipe } from '@angular/common';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { TextTip } from '../tooltips/text-tip/text-tip.component';
import { NifiTooltipDirective } from '../tooltips/nifi-tooltip.directive';
@Component({ @Component({
selector: 'edit-parameter-dialog', selector: 'edit-parameter-dialog',
@ -51,7 +53,8 @@ import { Observable } from 'rxjs';
MatRadioModule, MatRadioModule,
MatCheckboxModule, MatCheckboxModule,
NifiSpinnerDirective, NifiSpinnerDirective,
AsyncPipe AsyncPipe,
NifiTooltipDirective
], ],
templateUrl: './edit-parameter-dialog.component.html', templateUrl: './edit-parameter-dialog.component.html',
styleUrls: ['./edit-parameter-dialog.component.scss'] styleUrls: ['./edit-parameter-dialog.component.scss']
@ -167,4 +170,6 @@ export class EditParameterDialog {
} }
}); });
} }
protected readonly TextTip = TextTip;
} }

View File

@ -35,7 +35,7 @@
(mousedown)="preventDrag($event)" (mousedown)="preventDrag($event)"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getAllowableValueOptionTipData(allowableValue)" [tooltipInputData]="allowableValue.description"
[delayClose]="false"> [delayClose]="false">
<span <span
class="option-text" class="option-text"
@ -81,7 +81,7 @@
(mousedown)="preventDrag($event)" (mousedown)="preventDrag($event)"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getAllowableValueOptionTipData(parameterAllowableValue)" [tooltipInputData]="parameterAllowableValue.description"
[delayClose]="false"> [delayClose]="false">
<span <span
class="option-text" class="option-text"

View File

@ -25,7 +25,7 @@ import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatCheckboxModule } from '@angular/material/checkbox';
import { NgForOf, NgIf, NgTemplateOutlet } from '@angular/common'; import { NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
import { NifiTooltipDirective } from '../../../tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../../../tooltips/nifi-tooltip.directive';
import { AllowableValue, Parameter, PropertyDescriptor, TextTipInput } from '../../../../../state/shared'; import { AllowableValue, Parameter, PropertyDescriptor } from '../../../../../state/shared';
import { MatOptionModule } from '@angular/material/core'; import { MatOptionModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { MatTooltipModule } from '@angular/material/tooltip'; import { MatTooltipModule } from '@angular/material/tooltip';
@ -268,13 +268,6 @@ export class ComboEditor {
return ''; return '';
} }
getAllowableValueOptionTipData(allowableValue: AllowableValue): TextTipInput {
return {
// @ts-ignore
text: allowableValue.description
};
}
okClicked(): void { okClicked(): void {
const valueControl: AbstractControl | null = this.comboEditorForm.get('value'); const valueControl: AbstractControl | null = this.comboEditorForm.get('value');
if (valueControl) { if (valueControl) {

View File

@ -38,12 +38,12 @@
<div> <div>
{{ item.descriptor.displayName }} {{ item.descriptor.displayName }}
</div> </div>
<div <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle primary-color"
nifiTooltip nifiTooltip
[tooltipComponentType]="PropertyTip" [tooltipComponentType]="PropertyTip"
[tooltipInputData]="getPropertyTipData(item)" [tooltipInputData]="getPropertyTipData(item)"
[delayClose]="false"></div> [delayClose]="false"></i>
</div> </div>
</td> </td>
</ng-container> </ng-container>
@ -89,7 +89,7 @@
class="fa fa-info primary-color" class="fa fa-info primary-color"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getExtraWhitespaceTipData()"></div> tooltipInputData="The specified value contains leading and/or trailing whitespace character(s). This could produce unexpected results if it was not intentional."></div>
} }
</div> </div>
</ng-template> </ng-template>

View File

@ -42,8 +42,7 @@ import {
Property, Property,
PropertyDependency, PropertyDependency,
PropertyDescriptor, PropertyDescriptor,
PropertyTipInput, PropertyTipInput
TextTipInput
} from '../../../state/shared'; } from '../../../state/shared';
import { NifiTooltipDirective } from '../tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../tooltips/nifi-tooltip.directive';
import { TextTip } from '../tooltips/text-tip/text-tip.component'; import { TextTip } from '../tooltips/text-tip/text-tip.component';
@ -377,12 +376,6 @@ export class PropertyTable implements AfterViewInit, ControlValueAccessor {
return this.nifiCommon.hasLeadTrailWhitespace(value); return this.nifiCommon.hasLeadTrailWhitespace(value);
} }
getExtraWhitespaceTipData(): TextTipInput {
return {
text: 'The specified value contains leading and/or trailing whitespace character(s). This could produce unexpected results if it was not intentional.'
};
}
getPropertyTipData(item: PropertyItem): PropertyTipInput { getPropertyTipData(item: PropertyItem): PropertyTipInput {
return { return {
descriptor: item.descriptor, descriptor: item.descriptor,

View File

@ -122,9 +122,7 @@
[value]="descriptor" [value]="descriptor"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]=" [tooltipInputData]="descriptor.description"
getSelectOptionTipData(descriptor)
"
[delayClose]="false"> [delayClose]="false">
<span class="option-text">{{ <span class="option-text">{{
descriptor.label descriptor.label

View File

@ -45,7 +45,7 @@ import * as d3 from 'd3';
import { NiFiCommon } from '../../../service/nifi-common.service'; import { NiFiCommon } from '../../../service/nifi-common.service';
import { TextTip } from '../tooltips/text-tip/text-tip.component'; import { TextTip } from '../tooltips/text-tip/text-tip.component';
import { NifiTooltipDirective } from '../tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../tooltips/nifi-tooltip.directive';
import { isDefinedAndNotNull, TextTipInput } from '../../../state/shared'; import { isDefinedAndNotNull } from '../../../state/shared';
import { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox'; import { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox';
import { Resizable } from '../resizable/resizable.component'; import { Resizable } from '../resizable/resizable.component';
import { Instance, NIFI_NODE_CONFIG, Stats } from './index'; import { Instance, NIFI_NODE_CONFIG, Stats } from './index';
@ -217,12 +217,6 @@ export class StatusHistory implements OnInit, AfterViewInit {
this.store.dispatch(reloadStatusHistory({ request: this.request })); this.store.dispatch(reloadStatusHistory({ request: this.request }));
} }
getSelectOptionTipData(descriptor: FieldDescriptor): TextTipInput {
return {
text: descriptor.description
};
}
clusterStatsChanged(stats: Stats) { clusterStatsChanged(stats: Stats) {
this.clusterStats = stats; this.clusterStats = stats;
} }

View File

@ -133,11 +133,11 @@
<div class="flex flex-col"> <div class="flex flex-col">
<div class="flex gap-x-3 items-center"> <div class="flex gap-x-3 items-center">
<div>Core Load Average</div> <div>Core Load Average</div>
<div <i
class="fa fa-question-circle primary-color" class="fa fa-info-circle"
nifiTooltip nifiTooltip
[tooltipComponentType]="TextTip" [tooltipComponentType]="TextTip"
[tooltipInputData]="getCoreLoadTooltip()"></div> tooltipInputData="Core load average for the last minute. Not available on all platforms."></i>
</div> </div>
<div class="accent-color font-medium"> <div class="accent-color font-medium">
{{ formatFloat(systemDiagnostics.processorLoadAverage) }} {{ formatFloat(systemDiagnostics.processorLoadAverage) }}

View File

@ -31,7 +31,7 @@ import { reloadSystemDiagnostics } from '../../../state/system-diagnostics/syste
import { NiFiCommon } from '../../../service/nifi-common.service'; import { NiFiCommon } from '../../../service/nifi-common.service';
import { TextTip } from '../tooltips/text-tip/text-tip.component'; import { TextTip } from '../tooltips/text-tip/text-tip.component';
import { NifiTooltipDirective } from '../tooltips/nifi-tooltip.directive'; import { NifiTooltipDirective } from '../tooltips/nifi-tooltip.directive';
import { isDefinedAndNotNull, TextTipInput } from '../../../state/shared'; import { isDefinedAndNotNull } from '../../../state/shared';
import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatProgressBarModule } from '@angular/material/progress-bar';
@Component({ @Component({
@ -83,12 +83,6 @@ export class SystemDiagnosticsDialog implements OnInit {
return this.nifiCommon.formatFloat(value); return this.nifiCommon.formatFloat(value);
} }
getCoreLoadTooltip(): TextTipInput {
return {
text: 'Core load average for the last minute. Not available on all platforms.'
};
}
getRepositoryStorageUsagePercent(repoStorage: RepositoryStorageUsage): number { getRepositoryStorageUsagePercent(repoStorage: RepositoryStorageUsage): number {
return (repoStorage.usedSpaceBytes / repoStorage.totalSpaceBytes) * 100; return (repoStorage.usedSpaceBytes / repoStorage.totalSpaceBytes) * 100;
} }

View File

@ -15,4 +15,4 @@
~ limitations under the License. ~ limitations under the License.
--> -->
<div class="tooltip">{{ data?.text }}</div> <div class="tooltip">{{ data }}</div>

View File

@ -16,7 +16,6 @@
*/ */
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { TextTipInput } from '../../../../state/shared';
@Component({ @Component({
selector: 'text-tip', selector: 'text-tip',
@ -25,5 +24,5 @@ import { TextTipInput } from '../../../../state/shared';
styleUrls: ['./text-tip.component.scss'] styleUrls: ['./text-tip.component.scss']
}) })
export class TextTip { export class TextTip {
@Input() data: TextTipInput | undefined; @Input() data: string = '';
} }