diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/behavior/quick-select-behavior.service.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/behavior/quick-select-behavior.service.ts index 82391380ff..225963e88f 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/behavior/quick-select-behavior.service.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/behavior/quick-select-behavior.service.ts @@ -37,7 +37,7 @@ export class QuickSelectBehavior { const selection: any = this.canvasUtils.getSelection(); const selectionData: any = selection.datum(); - if (this.canvasUtils.isConfigurable(selection)) { + if (this.canvasUtils.isConfigurable(selection) || this.canvasUtils.hasDetails(selection)) { // show configuration dialog this.store.dispatch( navigateToEditComponent({ @@ -47,9 +47,6 @@ export class QuickSelectBehavior { } }) ); - } else if (this.canvasUtils.hasDetails(selection)) { - // TODO - show details (read only)... update Edit Forms to support readonly directive - // nfActions.showDetails(selection); } // stop propagation and prevent default diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/canvas-context-menu.service.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/canvas-context-menu.service.ts index bf9f4e0617..9685477e21 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/canvas-context-menu.service.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/canvas-context-menu.service.ts @@ -435,6 +435,28 @@ export class CanvasContextMenu implements ContextMenuDefinitionProvider { } } }, + { + condition: (selection: d3.Selection) => { + return this.canvasUtils.hasDetails(selection); + }, + clazz: 'fa fa-gear', + text: 'View configuration', + action: (selection: d3.Selection) => { + if (selection.empty()) { + this.store.dispatch(navigateToEditCurrentProcessGroup()); + } else { + const selectionData = selection.datum(); + this.store.dispatch( + navigateToEditComponent({ + request: { + type: selectionData.type, + id: selectionData.id + } + }) + ); + } + } + }, { condition: (selection: any) => { if (this.canvasUtils.canRead(selection) && this.canvasUtils.isProcessor(selection)) { @@ -481,17 +503,6 @@ export class CanvasContextMenu implements ContextMenuDefinitionProvider { } } }, - { - condition: (selection: any) => { - // TODO - hasDetails - return false; - }, - clazz: 'fa fa-gear', - text: 'View configuration', - action: (selection: any) => { - // TODO - showDetails... Can we support read only and configurable in the same dialog/form? - } - }, { condition: (selection: any) => { // TODO - hasParameterContext diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/canvas-utils.service.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/canvas-utils.service.ts index 471e4040db..afbc4d2940 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/canvas-utils.service.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/canvas-utils.service.ts @@ -248,12 +248,35 @@ export class CanvasUtils { return selectionSize === readableSize; } + /** + * Determines whether the specified Processor, Input Port, or Output Port currently supports modification. + * + * @param entity + */ + public runnableSupportsModification(entity: any): boolean { + return !( + entity.status.aggregateSnapshot.runStatus === 'Running' || + entity.status.aggregateSnapshot.activeThreadCount > 0 + ); + } + + /** + * Determines whether the specified Remote Process Group currently supports modification. + * + * @param entity + */ + public remoteProcessGroupSupportsModification(entity: any): boolean { + return !( + entity.status.transmissionStatus === 'Transmitting' || entity.status.aggregateSnapshot.activeThreadCount > 0 + ); + } + /** * Determines whether the specified selection is in a state to support modification. * * @argument {selection} selection The selection */ - public supportsModification(selection: any): boolean { + private supportsModification(selection: d3.Selection): boolean { if (selection.size() !== 1) { return false; } @@ -263,15 +286,9 @@ export class CanvasUtils { let supportsModification = false; if (this.isProcessor(selection) || this.isInputPort(selection) || this.isOutputPort(selection)) { - supportsModification = !( - selectionData.status.aggregateSnapshot.runStatus === 'Running' || - selectionData.status.aggregateSnapshot.activeThreadCount > 0 - ); + supportsModification = this.runnableSupportsModification(selectionData); } else if (this.isRemoteProcessGroup(selection)) { - supportsModification = !( - selectionData.status.transmissionStatus === 'Transmitting' || - selectionData.status.aggregateSnapshot.activeThreadCount > 0 - ); + supportsModification = this.remoteProcessGroupSupportsModification(selectionData); } else if (this.isProcessGroup(selection)) { supportsModification = true; } else if (this.isFunnel(selection)) { @@ -383,20 +400,26 @@ export class CanvasUtils { * @param selection */ public hasDetails(selection: any): boolean { + if (selection.empty()) { + return this.canvasPermissions.canRead && !this.canvasPermissions.canWrite; + } + // ensure the correct number of components are selected - if (selection.size() !== 1) { + if (selection.size() > 1) { return false; } if (!this.canRead(selection)) { return false; } + if (this.canModify(selection)) { if ( this.isProcessor(selection) || this.isInputPort(selection) || this.isOutputPort(selection) || this.isRemoteProcessGroup(selection) || + this.isProcessGroup(selection) || this.isConnection(selection) ) { return !this.isConfigurable(selection); @@ -404,10 +427,11 @@ export class CanvasUtils { } else { return ( this.isProcessor(selection) || - this.isConnection(selection) || this.isInputPort(selection) || this.isOutputPort(selection) || - this.isRemoteProcessGroup(selection) + this.isRemoteProcessGroup(selection) || + this.isProcessGroup(selection) || + this.isConnection(selection) ); } @@ -1830,11 +1854,7 @@ export class CanvasUtils { if (this.isProcessor(selection)) { const data = selection.datum(); - const supportsModification = !( - data.status.aggregateSnapshot.runStatus === 'Running' || - data.status.aggregateSnapshot.activeThreadCount > 0 - ); - + const supportsModification = this.runnableSupportsModification(data); return supportsModification && data.component.multipleVersionsAvailable; } return false; diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.effects.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.effects.ts index e8a27b8c38..98b2cbf110 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.effects.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.effects.ts @@ -68,7 +68,9 @@ import { selectCopiedSnippet, selectCurrentParameterContext, selectCurrentProcessGroupId, + selectInputPort, selectMaxZIndex, + selectOutputPort, selectParentProcessGroupId, selectProcessGroup, selectProcessor, @@ -1294,6 +1296,12 @@ export class FlowEffects { editDialogReference.componentInstance.selectProcessor = (id: string) => { return this.store.select(selectProcessor(id)); }; + editDialogReference.componentInstance.selectInputPort = (id: string) => { + return this.store.select(selectInputPort(id)); + }; + editDialogReference.componentInstance.selectOutputPort = (id: string) => { + return this.store.select(selectOutputPort(id)); + }; editDialogReference.componentInstance.selectProcessGroup = (id: string) => { return this.store.select(selectProcessGroup(id)); }; diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-process-group/destination-process-group.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-process-group/destination-process-group.component.html index 2b6b45c275..fcf2e30319 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-process-group/destination-process-group.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-process-group/destination-process-group.component.html @@ -29,11 +29,12 @@ } @else { To Input - + @for (item of inputPortItems; track item) { @if (item.description) { {{ item.text }} } @else { - {{ item.text }} + {{ item.text }} } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-process-group/destination-process-group.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-process-group/destination-process-group.component.ts index 6fc4347571..2e410e9ddc 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-process-group/destination-process-group.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-process-group/destination-process-group.component.ts @@ -49,10 +49,12 @@ import { SelectOption, TextTipInput } from '../../../../../../../../state/shared }) export class DestinationProcessGroup implements ControlValueAccessor { @Input() set processGroup(processGroup: any) { - if (processGroup.permissions.canRead) { - this.groupName = processGroup.component.name; - } else { - this.groupName = processGroup.id; + if (processGroup) { + if (processGroup.permissions.canRead) { + this.groupName = processGroup.component.name; + } else { + this.groupName = processGroup.id; + } } } @Input() set inputPorts(inputPorts: any[]) { diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-remote-process-group/destination-remote-process-group.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-remote-process-group/destination-remote-process-group.component.html index 1cc1030bbb..4f665e9a2c 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-remote-process-group/destination-remote-process-group.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-remote-process-group/destination-remote-process-group.component.html @@ -26,12 +26,12 @@ } @else { To Input - + @for (item of inputPortItems; track item) { @if (item.description) { {{ item.text }} } @else { - {{ item.text }} + {{ + item.text + }} } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-remote-process-group/destination-remote-process-group.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-remote-process-group/destination-remote-process-group.component.ts index a636cffb96..4d28151b58 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-remote-process-group/destination-remote-process-group.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/destination/destination-remote-process-group/destination-remote-process-group.component.ts @@ -49,23 +49,25 @@ import { SelectOption, TextTipInput } from '../../../../../../../../state/shared }) export class DestinationRemoteProcessGroup implements ControlValueAccessor { @Input() set remoteProcessGroup(remoteProcessGroup: any) { - const rpg = remoteProcessGroup.component; - const inputPorts: any[] = rpg.contents.inputPorts; + if (remoteProcessGroup) { + const rpg = remoteProcessGroup.component; + const inputPorts: any[] = rpg.contents.inputPorts; - if (inputPorts) { - this.noPorts = inputPorts.length == 0; + if (inputPorts) { + this.noPorts = inputPorts.length == 0; - this.inputPortItems = inputPorts.map((inputPort) => { - return { - value: inputPort.id, - text: inputPort.name, - description: inputPort.comments, - disabled: inputPort.exists === false - }; - }); + this.inputPortItems = inputPorts.map((inputPort) => { + return { + value: inputPort.id, + text: inputPort.name, + description: inputPort.comments, + disabled: inputPort.exists === false + }; + }); + } + + this.groupName = rpg.name; } - - this.groupName = rpg.name; } protected readonly TextTip = TextTip; diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.html index 7b47cf3015..74f3a29d0e 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.html @@ -15,7 +15,9 @@ ~ limitations under the License. --> -

Edit Connection

+

+ {{ connectionReadonly || sourceReadonly || destinationReadonly ? 'Connection Details' : 'Edit Connection' }} +

@@ -42,9 +44,11 @@ formControlName="source"> } @case (ComponentType.InputPort) { - + @if (sourceInputPort$ | async) { + + } } @case (ComponentType.Funnel) { @@ -70,9 +74,11 @@ formControlName="destination"> } @case (ComponentType.OutputPort) { - + @if (destinationOutputPort$ | async) { + + } } @case (ComponentType.Funnel) { Name - +
@@ -99,20 +109,32 @@
FlowFile Expiration - +
Back Pressure Object Threshold - +
Size Threshold - +
@@ -126,6 +148,7 @@ @for (option of loadBalanceStrategies; track option) { Attribute Name - +
} @@ -153,6 +180,7 @@ @for (option of loadBalanceCompressionStrategies; track option) { @if ({ value: (saving$ | async)! }; as saving) { - - + @if (connectionReadonly || sourceReadonly || destinationReadonly) { + + } @else { + + + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.ts index dea975c025..eddf087100 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.ts @@ -49,7 +49,7 @@ import { SourceFunnel } from '../source/source-funnel/source-funnel.component'; import { DestinationProcessor } from '../destination/destination-processor/destination-processor.component'; import { DestinationOutputPort } from '../destination/destination-output-port/destination-output-port.component'; import { SourceInputPort } from '../source/source-input-port/source-input-port.component'; -import { Observable } from 'rxjs'; +import { asyncScheduler, Observable, observeOn, tap } from 'rxjs'; import { SourceProcessGroup } from '../source/source-process-group/source-process-group.component'; import { DestinationProcessGroup } from '../destination/destination-process-group/destination-process-group.component'; import { SourceRemoteProcessGroup } from '../source/source-remote-process-group/source-remote-process-group.component'; @@ -92,39 +92,96 @@ export class EditConnectionComponent { @Input() set getChildOutputPorts(getChildOutputPorts: (groupId: string) => Observable) { if (this.sourceType == ComponentType.ProcessGroup) { this.childOutputPorts$ = getChildOutputPorts(this.source.groupId); + this.sourceReadonly = false; + this.updateControlValueAccessorsForReadOnly(); } } @Input() set getChildInputPorts(getChildInputPorts: (groupId: string) => Observable) { if (this.destinationType == ComponentType.ProcessGroup) { this.childInputPorts$ = getChildInputPorts(this.destinationGroupId); + this.destinationReadonly = false; + this.updateControlValueAccessorsForReadOnly(); } } @Input() set selectProcessor(selectProcessor: (id: string) => Observable) { if (this.sourceType == ComponentType.Processor) { - this.sourceProcessor$ = selectProcessor(this.source.id); + this.sourceProcessor$ = selectProcessor(this.source.id).pipe( + observeOn(asyncScheduler), + tap((processor) => { + this.sourceReadonly = !this.canvasUtils.runnableSupportsModification(processor); + this.updateControlValueAccessorsForReadOnly(); + }) + ); } if (this.destinationType == ComponentType.Processor && this.destinationId) { - this.destinationProcessor$ = selectProcessor(this.destinationId); + this.destinationProcessor$ = selectProcessor(this.destinationId).pipe( + observeOn(asyncScheduler), + tap((processor) => { + this.destinationReadonly = !this.canvasUtils.runnableSupportsModification(processor); + this.updateControlValueAccessorsForReadOnly(); + }) + ); + } + } + + @Input() set selectInputPort(selectInputPort: (id: string) => Observable) { + if (this.sourceType == ComponentType.InputPort) { + this.sourceInputPort$ = selectInputPort(this.source.id).pipe( + observeOn(asyncScheduler), + tap((inputPort) => { + this.sourceReadonly = !this.canvasUtils.runnableSupportsModification(inputPort); + this.updateControlValueAccessorsForReadOnly(); + }) + ); + } + } + + @Input() set selectOutputPort(selectOutputPort: (id: string) => Observable) { + if (this.destinationType == ComponentType.OutputPort && this.destinationId) { + this.destinationOutputPort$ = selectOutputPort(this.destinationId).pipe( + observeOn(asyncScheduler), + tap((outputPort) => { + this.destinationReadonly = !this.canvasUtils.runnableSupportsModification(outputPort); + this.updateControlValueAccessorsForReadOnly(); + }) + ); } } @Input() set selectProcessGroup(selectProcessGroup: (id: string) => Observable) { if (this.sourceType == ComponentType.ProcessGroup) { this.sourceProcessGroup$ = selectProcessGroup(this.source.groupId); + this.sourceReadonly = false; + this.updateControlValueAccessorsForReadOnly(); } if (this.destinationType == ComponentType.ProcessGroup) { this.destinationProcessGroup$ = selectProcessGroup(this.destinationGroupId); + this.destinationReadonly = false; + this.updateControlValueAccessorsForReadOnly(); } } @Input() set selectRemoteProcessGroup(selectRemoteProcessGroup: (id: string) => Observable) { if (this.sourceType == ComponentType.RemoteProcessGroup) { - this.sourceRemoteProcessGroup$ = selectRemoteProcessGroup(this.source.groupId); + this.sourceRemoteProcessGroup$ = selectRemoteProcessGroup(this.source.groupId).pipe( + observeOn(asyncScheduler), + tap((remoteProcessGroup) => { + this.sourceReadonly = !this.canvasUtils.remoteProcessGroupSupportsModification(remoteProcessGroup); + this.updateControlValueAccessorsForReadOnly(); + }) + ); } if (this.destinationType == ComponentType.RemoteProcessGroup) { - this.destinationRemoteProcessGroup$ = selectRemoteProcessGroup(this.destinationGroupId); + this.destinationRemoteProcessGroup$ = selectRemoteProcessGroup(this.destinationGroupId).pipe( + observeOn(asyncScheduler), + tap((remoteProcessGroup) => { + this.destinationReadonly = + !this.canvasUtils.remoteProcessGroupSupportsModification(remoteProcessGroup); + this.updateControlValueAccessorsForReadOnly(); + }) + ); } } @@ -136,6 +193,9 @@ export class EditConnectionComponent { breadcrumbs$ = this.store.select(selectBreadcrumbs); editConnectionForm: FormGroup; + connectionReadonly: boolean; + sourceReadonly: boolean = false; + destinationReadonly: boolean = false; source: any; sourceType: ComponentType | null; @@ -147,14 +207,16 @@ export class EditConnectionComponent { destinationGroupId: string; destinationName: string; - sourceProcessor$!: Observable | null; - destinationProcessor$!: Observable | null; - sourceProcessGroup$!: Observable | null; - destinationProcessGroup$!: Observable | null; - sourceRemoteProcessGroup$!: Observable | null; - destinationRemoteProcessGroup$!: Observable | null; - childOutputPorts$!: Observable | null; - childInputPorts$!: Observable | null; + sourceProcessor$: Observable | null = null; + destinationProcessor$: Observable | null = null; + sourceInputPort$: Observable | null = null; + destinationOutputPort$: Observable | null = null; + sourceProcessGroup$: Observable | null = null; + destinationProcessGroup$: Observable | null = null; + sourceRemoteProcessGroup$: Observable | null = null; + destinationRemoteProcessGroup$: Observable | null = null; + childOutputPorts$: Observable | null = null; + childInputPorts$: Observable | null = null; loadBalancePartitionAttributeRequired = false; initialPartitionAttribute: string; @@ -170,6 +232,8 @@ export class EditConnectionComponent { ) { const connection: any = dialogRequest.entity.component; + this.connectionReadonly = !dialogRequest.entity.permissions.canWrite; + this.source = connection.source; this.sourceType = this.canvasUtils.getComponentTypeForSource(this.source.type); @@ -228,6 +292,44 @@ export class EditConnectionComponent { this.initialPartitionAttribute = connection.loadBalancePartitionAttribute; this.initialCompression = connection.loadBalanceCompression; this.loadBalanceChanged(connection.loadBalanceStrategy); + + this.updateControlValueAccessorsForReadOnly(); + } + + updateControlValueAccessorsForReadOnly(): void { + const disabled = this.connectionReadonly || this.sourceReadonly || this.destinationReadonly; + + // sourceReadonly is used to update the readonly / disable state of the form controls, note that + // the source control for local and remote groups is always disabled (see above) in this edit + // component because the source of the connection cannot be changed + + if (disabled) { + this.editConnectionForm.get('prioritizers')?.disable(); + + if (this.sourceType == ComponentType.Processor) { + this.editConnectionForm.get('relationships')?.disable(); + } + + if ( + this.destinationType == ComponentType.ProcessGroup || + this.destinationType == ComponentType.RemoteProcessGroup + ) { + this.editConnectionForm.get('destination')?.disable(); + } + } else { + this.editConnectionForm.get('prioritizers')?.enable(); + + if (this.sourceType == ComponentType.Processor) { + this.editConnectionForm.get('relationships')?.enable(); + } + + if ( + this.destinationType == ComponentType.ProcessGroup || + this.destinationType == ComponentType.RemoteProcessGroup + ) { + this.editConnectionForm.get('destination')?.enable(); + } + } } getCurrentGroupName(breadcrumbs: BreadcrumbEntity): string { diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/prioritizers/prioritizers.component.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/prioritizers/prioritizers.component.scss index cb091d6d4f..e38ff7943e 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/prioritizers/prioritizers.component.scss +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/prioritizers/prioritizers.component.scss @@ -21,6 +21,7 @@ border-radius: 4px; overflow: hidden; display: block; + user-select: none; } .prioritizer-draggable-item { diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/source/source-process-group/source-process-group.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/source/source-process-group/source-process-group.component.html index 19a0cb20fd..3aecf1d0da 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/source/source-process-group/source-process-group.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/source/source-process-group/source-process-group.component.html @@ -29,11 +29,12 @@ } @else { From Output - + @for (item of outputPortItems; track item) { @if (item.description) { {{ item.text }} } @else { - {{ item.text }} + {{ item.text }} } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/source/source-remote-process-group/source-remote-process-group.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/source/source-remote-process-group/source-remote-process-group.component.html index 4570315004..e76f236a11 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/source/source-remote-process-group/source-remote-process-group.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/source/source-remote-process-group/source-remote-process-group.component.html @@ -26,12 +26,12 @@ } @else { From Output - + @for (item of outputPortItems; track item) { @if (item.description) { {{ item.text }} } @else { - {{ item.text }} + {{ + item.text + }} } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/port/edit-port/edit-port.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/port/edit-port/edit-port.component.html index a12ecfe576..cb0adb3b82 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/port/edit-port/edit-port.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/port/edit-port/edit-port.component.html @@ -15,21 +15,21 @@ ~ limitations under the License. --> -

Edit {{ portTypeLabel }}

+

{{ readonly ? portTypeLabel + ' Details' : 'Edit ' + portTypeLabel }}

{{ portTypeLabel }} Name - +
@if (request.entity.component.allowRemoteAccess) { Concurrent Tasks - + }
@@ -42,21 +42,25 @@
Comments - +
@if ({ value: (saving$ | async)! }; as saving) { - - + @if (readonly) { + + } @else { + + + } }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/port/edit-port/edit-port.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/port/edit-port/edit-port.component.ts index b1a5e5a9ab..2f44d2e177 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/port/edit-port/edit-port.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/port/edit-port/edit-port.component.ts @@ -32,6 +32,7 @@ import { AsyncPipe } from '@angular/common'; import { selectSaving } from '../../../../../state/flow/flow.selectors'; import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nifi-spinner.directive'; import { ClusterConnectionService } from '../../../../../../../service/cluster-connection.service'; +import { CanvasUtils } from '../../../../../service/canvas-utils.service'; @Component({ selector: 'edit-port', @@ -53,15 +54,20 @@ export class EditPort { saving$ = this.store.select(selectSaving); editPortForm: FormGroup; + readonly: boolean; portTypeLabel: string; constructor( @Inject(MAT_DIALOG_DATA) public request: EditComponentDialogRequest, private formBuilder: FormBuilder, private store: Store, + private canvasUtils: CanvasUtils, private client: Client, private clusterConnectionService: ClusterConnectionService ) { + this.readonly = + !request.entity.permissions.canWrite || !this.canvasUtils.runnableSupportsModification(request.entity); + // set the port type name if (ComponentType.InputPort == this.request.type) { this.portTypeLabel = 'Input Port'; @@ -77,7 +83,10 @@ export class EditPort { Validators.required ), comments: new FormControl(request.entity.component.comments), - portFunction: new FormControl(request.entity.component.portFunction == 'FAILURE') + portFunction: new FormControl({ + value: request.entity.component.portFunction == 'FAILURE', + disabled: this.readonly + }) }); } @@ -98,7 +107,7 @@ export class EditPort { } // if this port is an output port update the port function - if (ComponentType.OutputPort == this.request.entity.type) { + if (ComponentType.OutputPort == this.request.type) { payload.component.portFunction = this.editPortForm.get('portFunction')?.value ? 'FAILURE' : 'STANDARD'; } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/process-group/edit-process-group/edit-process-group.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/process-group/edit-process-group/edit-process-group.component.html index d95b118c7c..30414f7ce5 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/process-group/edit-process-group/edit-process-group.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/process-group/edit-process-group/edit-process-group.component.html @@ -15,7 +15,7 @@ ~ limitations under the License. --> -

Edit Process Group

+

{{ readonly ? 'Process Group Details' : 'Edit Process Group' }}

@@ -25,7 +25,7 @@
Name - +
@@ -36,6 +36,7 @@ @if (option.description) { {{ option.text }} } @else { - {{ option.text }} + {{ + option.text + }} } } @@ -64,6 +67,7 @@ @for (option of executionEngineOptions; track option) { Default FlowFile Expiration - +
Default Back Pressure Object Threshold - +
Default Back Pressure Data Size Threshold - +
Log File Suffix - +
@@ -141,7 +159,12 @@
Comments - +
@@ -149,16 +172,20 @@
@if ({ value: (saving$ | async)! }; as saving) { - - + @if (readonly) { + + } @else { + + + } }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/process-group/edit-process-group/edit-process-group.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/process-group/edit-process-group/edit-process-group.component.ts index c152c279bd..1aac5c6690 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/process-group/edit-process-group/edit-process-group.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/process-group/edit-process-group/edit-process-group.component.ts @@ -86,6 +86,7 @@ export class EditProcessGroup { protected readonly TextTip = TextTip; editProcessGroupForm: FormGroup; + readonly: boolean; parameterContextsOptions: SelectOption[] = []; executionEngineOptions: SelectOption[] = [ @@ -155,6 +156,8 @@ export class EditProcessGroup { private client: Client, private clusterConnectionService: ClusterConnectionService ) { + this.readonly = !request.entity.permissions.canWrite; + this.parameterContextsOptions.push({ text: 'No parameter context', value: null @@ -162,7 +165,7 @@ export class EditProcessGroup { this.editProcessGroupForm = this.formBuilder.group({ name: new FormControl(request.entity.component.name, Validators.required), - applyParameterContextRecursively: new FormControl(false), + applyParameterContextRecursively: new FormControl({ value: false, disabled: this.readonly }), executionEngine: new FormControl(request.entity.component.executionEngine, Validators.required), flowfileConcurrency: new FormControl(request.entity.component.flowfileConcurrency, Validators.required), flowfileOutboundPolicy: new FormControl( diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.html index 1aadd8c6ac..e7307bacd4 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.html @@ -15,7 +15,16 @@ ~ limitations under the License. --> -

Edit Processor

+

+
+
+ {{ readonly ? 'Processor Details' : 'Edit Processor' }} +
+
+ {{ formatType(request.entity) }} +
+
+

@@ -27,7 +36,7 @@
Name - +
@@ -50,13 +59,17 @@
Penalty Duration - +
Yield Duration - +
@@ -65,7 +78,7 @@ Bulletin Level @for (option of bulletinLevels; track option) { - + {{ option.text }} } @@ -88,6 +101,7 @@ @for (option of schedulingStrategies; track option) { + type="number" + [readonly]="readonly" />
@@ -117,7 +132,8 @@ matInput formControlName="schedulingPeriod" (change)="schedulingPeriodChanged()" - type="text" /> + type="text" + [readonly]="readonly" />
@@ -127,7 +143,7 @@ @for (option of executionStrategies; track option) { Comments - + @@ -197,15 +218,19 @@ @if ({ value: (saving$ | async)! }; as saving) { - - + @if (readonly) { + + } @else { + + + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.scss index 3f1bdc73df..70e3437928 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.scss +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.scss @@ -17,6 +17,10 @@ @use '@angular/material' as mat; +h2.mdc-dialog__title::before { + height: 0; +} + .processor-edit-form { @include mat.button-density(-1); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.ts index 09bee2d8e8..d3841f75c0 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.ts @@ -49,6 +49,7 @@ import { } from './relationship-settings/relationship-settings.component'; import { ErrorBanner } from '../../../../../../../ui/common/error-banner/error-banner.component'; import { ClusterConnectionService } from '../../../../../../../service/cluster-connection.service'; +import { CanvasUtils } from '../../../../../service/canvas-utils.service'; @Component({ selector: 'edit-processor', @@ -87,6 +88,7 @@ export class EditProcessor { protected readonly TextTip = TextTip; editProcessorForm: FormGroup; + readonly: boolean; bulletinLevels = [ { @@ -148,9 +150,13 @@ export class EditProcessor { @Inject(MAT_DIALOG_DATA) public request: EditComponentDialogRequest, private formBuilder: FormBuilder, private client: Client, + private canvasUtils: CanvasUtils, private clusterConnectionService: ClusterConnectionService, private nifiCommon: NiFiCommon ) { + this.readonly = + !request.entity.permissions.canWrite || !this.canvasUtils.runnableSupportsModification(request.entity); + const processorProperties: any = request.entity.component.config.properties; const properties: Property[] = Object.entries(processorProperties).map((entry: any) => { const [property, value] = entry; @@ -205,15 +211,18 @@ export class EditProcessor { concurrentTasks: new FormControl(concurrentTasks, Validators.required), schedulingPeriod: new FormControl(schedulingPeriod, Validators.required), executionNode: new FormControl(request.entity.component.config.executionNode, Validators.required), - properties: new FormControl(properties), - relationshipConfiguration: new FormControl(relationshipConfiguration, Validators.required), + properties: new FormControl({ value: properties, disabled: this.readonly }), + relationshipConfiguration: new FormControl( + { value: relationshipConfiguration, disabled: this.readonly }, + Validators.required + ), comments: new FormControl(request.entity.component.config.comments) }); if (this.supportsBatching()) { this.editProcessorForm.addControl( 'runDuration', - new FormControl(this.runDurationMillis, Validators.required) + new FormControl({ value: this.runDurationMillis, disabled: this.readonly }, Validators.required) ); } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/relationship-settings/relationship-settings.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/relationship-settings/relationship-settings.component.html index 9cb223f05b..5f46e58f6b 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/relationship-settings/relationship-settings.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/relationship-settings/relationship-settings.component.html @@ -72,7 +72,7 @@ type="number" name="retryCount" (keyup)="handleChanged()" - [disabled]="isDisabled" /> + [readonly]="isDisabled" /> + [readonly]="isDisabled" />
-
- - - -
-
-
Lower latency
-
Higher throughput
-
+ @if (isDisabled) { +
{{ formatLabel(runDurationIndex) }}
+ } @else { +
+ + + +
+
+
Lower latency
+
Higher throughput
+
+ }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/run-duration-slider/run-duration-slider.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/run-duration-slider/run-duration-slider.component.ts index 2f6a72ada6..6379854823 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/run-duration-slider/run-duration-slider.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/run-duration-slider/run-duration-slider.component.ts @@ -79,7 +79,7 @@ export class RunDurationSlider implements ControlValueAccessor { if (index < 0) { this.runDurationIndex = 0; } else { - this.runDurationIndex = runDuration; + this.runDurationIndex = index; } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.html index cf642eb5d4..2f8eff3d03 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.html @@ -15,7 +15,7 @@ ~ limitations under the License. --> -

Edit Remote Process Group

+

{{ readonly ? 'Remote Process Group Details' : 'Edit Remote Process Group' }}

@@ -31,7 +31,12 @@
URLs - +
@@ -40,15 +45,15 @@ Transport Protocol - RAW - HTTP + RAW + HTTP
Local Network Interface - +
@@ -56,13 +61,13 @@
HTTP Proxy Server Hostname - +
HTTP Proxy Server Port - +
@@ -70,13 +75,13 @@
HTTP Proxy User - +
HTTP Proxy Password - +
@@ -84,28 +89,32 @@
Communications Timeout - +
Yield Duration - +
@if ({ value: (saving$ | async)! }; as saving) { - - + @if (readonly) { + + } @else { + + + } }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.spec.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.spec.ts index 7f3c9a7c3f..31aba3cd80 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.spec.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.spec.ts @@ -29,16 +29,21 @@ describe('EditRemoteProcessGroup', () => { let fixture: ComponentFixture; const data: any = { - revision: { - clientId: 'a6482293-7fe8-43b4-8ab4-ee95b3b27721', - version: 0 - }, type: ComponentType.RemoteProcessGroup, - position: { - x: -4, - y: -698.5 - }, + uri: 'https://localhost:4200/nifi-api/remote-process-groups/abd5a02c-018b-1000-c602-fe83979f1997', entity: { + revision: { + clientId: 'a6482293-7fe8-43b4-8ab4-ee95b3b27721', + version: 0 + }, + position: { + x: -4, + y: -698.5 + }, + permissions: { + canRead: true, + canWrite: false + }, component: { activeRemoteInputPortCount: 0, activeRemoteOutputPortCount: 0, diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.ts index b2fc0191c6..3d4f0e971d 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/remote-process-group/edit-remote-process-group/edit-remote-process-group.component.ts @@ -30,6 +30,7 @@ import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nif import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component'; import { EditComponentDialogRequest } from '../../../../../state/flow'; import { ErrorBanner } from '../../../../../../../ui/common/error-banner/error-banner.component'; +import { CanvasUtils } from '../../../../../service/canvas-utils.service'; @Component({ standalone: true, @@ -56,12 +57,18 @@ export class EditRemoteProcessGroup { protected readonly TextTip = TextTip; editRemoteProcessGroupForm: FormGroup; + readonly: boolean; constructor( @Inject(MAT_DIALOG_DATA) public request: EditComponentDialogRequest, private formBuilder: FormBuilder, + private canvasUtils: CanvasUtils, private client: Client ) { + this.readonly = + !request.entity.permissions.canWrite || + !this.canvasUtils.remoteProcessGroupSupportsModification(request.entity); + this.editRemoteProcessGroupForm = this.formBuilder.group({ urls: new FormControl(request.entity.component.targetUris, Validators.required), transportProtocol: new FormControl(request.entity.component.transportProtocol, Validators.required), diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/manage-remote-ports/manage-remote-ports.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/manage-remote-ports/manage-remote-ports.component.html index 392fbcfa98..174944b14b 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/manage-remote-ports/manage-remote-ports.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/manage-remote-ports/manage-remote-ports.component.html @@ -193,7 +193,7 @@ port.transmitting === false ) {
} diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/edit-parameter-context/edit-parameter-context.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/edit-parameter-context/edit-parameter-context.component.html index 585b4209a1..1c2f4e8022 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/edit-parameter-context/edit-parameter-context.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/edit-parameter-context/edit-parameter-context.component.html @@ -15,7 +15,9 @@ ~ limitations under the License. --> -

{{ this.isNew ? 'Add' : 'Edit' }} Parameter Context

+

+ {{ readonly ? 'Parameter Context Details' : isNew ? 'Add Parameter Context' : 'Edit Parameter Context' }} +

@if ((updateRequest | async)!; as requestEntity) { @@ -101,13 +103,18 @@
Name - +
Description - +
@@ -156,15 +163,19 @@ } @else { @if ({ value: (saving$ | async)! }; as saving) { - - + @if (readonly) { + + } @else { + + + } } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/edit-parameter-context/edit-parameter-context.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/edit-parameter-context/edit-parameter-context.component.ts index 3aac271a45..4b740f1e68 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/edit-parameter-context/edit-parameter-context.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/edit-parameter-context/edit-parameter-context.component.ts @@ -79,6 +79,8 @@ export class EditParameterContext { @Output() editParameterContext: EventEmitter = new EventEmitter(); editParameterContextForm: FormGroup; + readonly: boolean; + isNew: boolean; parameterProvider: ParameterProviderConfiguration | null = null; @@ -92,20 +94,26 @@ export class EditParameterContext { ) { if (request.parameterContext) { this.isNew = false; + this.readonly = !request.parameterContext.permissions.canWrite; this.editParameterContextForm = this.formBuilder.group({ name: new FormControl(request.parameterContext.component.name, Validators.required), description: new FormControl(request.parameterContext.component.description), - parameters: new FormControl(request.parameterContext.component.parameters), - inheritedParameterContexts: new FormControl( - request.parameterContext.component.inheritedParameterContexts - ) + parameters: new FormControl({ + value: request.parameterContext.component.parameters, + disabled: this.readonly + }), + inheritedParameterContexts: new FormControl({ + value: request.parameterContext.component.inheritedParameterContexts, + disabled: this.readonly + }) }); if (request.parameterContext.component.parameterProviderConfiguration) { this.parameterProvider = request.parameterContext.component.parameterProviderConfiguration.component; } } else { this.isNew = true; + this.readonly = false; this.editParameterContextForm = this.formBuilder.group({ name: new FormControl('', Validators.required), diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-inheritance/parameter-context-inheritance.component.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-inheritance/parameter-context-inheritance.component.scss index 823fb0e9b7..694e74f95a 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-inheritance/parameter-context-inheritance.component.scss +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-inheritance/parameter-context-inheritance.component.scss @@ -21,6 +21,7 @@ border-radius: 4px; overflow: hidden; display: block; + user-select: none; } .parameter-context-draggable-item { diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.html index 8ac3a57ea3..98cbf2a221 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.html @@ -25,21 +25,6 @@ (matSortChange)="sortData($event)" [matSortActive]="initialSortColumn" [matSortDirection]="initialSortDirection"> - - - - - @if (canRead(item)) { -
- - @if (canRead(item)) { -
- } -
- } - -
- Name @@ -73,11 +58,11 @@
- @if (canRead(item) && canWrite(item)) { + @if (canRead(item)) {
+ [title]="canWrite(item) ? 'Edit' : 'View Configuration'">
} @if (canDelete(item)) {
= new EventEmitter(); @Output() deleteParameterContext: EventEmitter = new EventEmitter(); - displayedColumns: string[] = ['moreDetails', 'name', 'provider', 'description', 'actions']; + displayedColumns: string[] = ['name', 'provider', 'description', 'actions']; dataSource: MatTableDataSource = new MatTableDataSource(); constructor(private nifiCommon: NiFiCommon) {} diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-table/parameter-table.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-table/parameter-table.component.html index 46c598fa2e..49eed16d3d 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-table/parameter-table.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-table/parameter-table.component.html @@ -17,7 +17,7 @@
- @if (canAddParameters) { + @if (canAddParameters && !isDisabled) {
} - @if (canEdit(item)) { + @if (canEdit(item) && !isDisabled) {
} - @if (canDelete(item)) { + @if (canDelete(item) && !isDisabled) {
-

Edit Flow Analysis Rule

+

+
+
+ {{ readonly ? 'Flow Analysis Rule Details' : 'Edit Flow Analysis Rule' }} +
+
+ {{ formatType(request.flowAnalysisRule) }} +
+
+

@@ -25,7 +34,7 @@
Name - +
Id
@@ -54,6 +63,7 @@ @for (option of strategies; track option) { Comments - +
@@ -90,15 +105,19 @@ @if ({ value: (saving$ | async)! }; as saving) { - - + @if (readonly) { + + } @else { + + + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/edit-flow-analysis-rule/edit-flow-analysis-rule.component.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/edit-flow-analysis-rule/edit-flow-analysis-rule.component.scss index 5f0d7da2a1..0e3d28a171 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/edit-flow-analysis-rule/edit-flow-analysis-rule.component.scss +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/edit-flow-analysis-rule/edit-flow-analysis-rule.component.scss @@ -17,6 +17,10 @@ @use '@angular/material' as mat; +h2.mdc-dialog__title::before { + height: 0; +} + .flow-analysis-rule-edit-form { @include mat.button-density(-1); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/edit-flow-analysis-rule/edit-flow-analysis-rule.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/edit-flow-analysis-rule/edit-flow-analysis-rule.component.ts index 00d76b485b..cc3ce3481e 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/edit-flow-analysis-rule/edit-flow-analysis-rule.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/edit-flow-analysis-rule/edit-flow-analysis-rule.component.ts @@ -79,6 +79,7 @@ export class EditFlowAnalysisRule { new EventEmitter(); editFlowAnalysisRuleForm: FormGroup; + readonly: boolean; strategies: SelectOption[] = [ { @@ -95,6 +96,9 @@ export class EditFlowAnalysisRule { private nifiCommon: NiFiCommon, private clusterConnectionService: ClusterConnectionService ) { + this.readonly = + !request.flowAnalysisRule.permissions.canWrite || request.flowAnalysisRule.status.runStatus !== 'DISABLED'; + const serviceProperties: any = request.flowAnalysisRule.component.properties; const properties: Property[] = Object.entries(serviceProperties).map((entry: any) => { const [property, value] = entry; @@ -110,7 +114,7 @@ export class EditFlowAnalysisRule { name: new FormControl(request.flowAnalysisRule.component.name, Validators.required), state: new FormControl(request.flowAnalysisRule.component.state === 'STOPPED', Validators.required), enforcementPolicy: new FormControl('ENFORCE', Validators.required), - properties: new FormControl(properties), + properties: new FormControl({ value: properties, disabled: this.readonly }), comments: new FormControl(request.flowAnalysisRule.component.comments) }); } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/flow-analysis-rule-table/flow-analysis-rule-table.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/flow-analysis-rule-table/flow-analysis-rule-table.component.html index 620182b6b9..ecfe0c68c9 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/flow-analysis-rule-table/flow-analysis-rule-table.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/flow-analysis-rules/flow-analysis-rule-table/flow-analysis-rule-table.component.html @@ -35,7 +35,6 @@ class="pointer fa fa-book primary-color" (click)="viewDocumentationClicked(item, $event)" title="View Documentation">
- @if (hasComments(item)) {
- @if (canConfigure(item)) { -
- } - +
@if (canDisable(item)) {
-

Edit Parameter Provider

+

+
+
Edit Parameter Provider
+
+ {{ formatType(request.parameterProvider) }} +
+
+

@@ -26,7 +33,7 @@
Name - +
@@ -80,7 +87,12 @@
Comments - +
@@ -89,15 +101,19 @@ @if ({ value: (saving$ | async)! }; as saving) { - - + @if (readonly) { + + } @else { + + + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/edit-parameter-provider/edit-parameter-provider.component.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/edit-parameter-provider/edit-parameter-provider.component.scss index 717bc5565d..af4509a55b 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/edit-parameter-provider/edit-parameter-provider.component.scss +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/edit-parameter-provider/edit-parameter-provider.component.scss @@ -17,6 +17,10 @@ @use '@angular/material' as mat; +h2.mdc-dialog__title::before { + height: 0; +} + .parameter-provider-edit-form { @include mat.button-density(-1); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/edit-parameter-provider/edit-parameter-provider.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/edit-parameter-provider/edit-parameter-provider.component.ts index 2c3a3588c9..0d1910a7d4 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/edit-parameter-provider/edit-parameter-provider.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/edit-parameter-provider/edit-parameter-provider.component.ts @@ -76,6 +76,7 @@ export class EditParameterProvider { new EventEmitter(); editParameterProviderForm: FormGroup; + readonly: boolean; constructor( @Inject(MAT_DIALOG_DATA) public request: EditParameterProviderRequest, @@ -84,6 +85,8 @@ export class EditParameterProvider { private nifiCommon: NiFiCommon, private clusterConnectionService: ClusterConnectionService ) { + this.readonly = !request.parameterProvider.permissions.canWrite; + const providerProperties = request.parameterProvider.component.properties; const properties: Property[] = Object.entries(providerProperties).map((entry: any) => { const [property, value] = entry; @@ -97,7 +100,7 @@ export class EditParameterProvider { // build the form this.editParameterProviderForm = this.formBuilder.group({ name: new FormControl(request.parameterProvider.component.name, Validators.required), - properties: new FormControl(properties), + properties: new FormControl({ value: properties, disabled: this.readonly }), comments: new FormControl(request.parameterProvider.component.comments) }); } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/parameter-providers-table/parameter-providers-table.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/parameter-providers-table/parameter-providers-table.component.html index 12713e56d5..be05fede02 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/parameter-providers-table/parameter-providers-table.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/parameter-providers-table/parameter-providers-table.component.html @@ -33,9 +33,6 @@ @if (canRead(item)) {
- -
-
- @if (canConfigure(item)) { + @if (canRead(item)) {
+ [title]="canWrite(item) ? 'Edit' : 'View Configuration'">
} @if (hasAdvancedUi(item)) {
-

Edit Registry Client

+

+
+
Edit Registry Client
+
+ {{ formatType(request.registryClient) }} +
+
+

@@ -35,9 +42,9 @@
-
Id
+
Type
- {{ request.registryClient.component.type }} + {{ formatType(request.registryClient) }}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/edit-registry-client/edit-registry-client.component.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/edit-registry-client/edit-registry-client.component.scss index 73e8b732ed..5874955c32 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/edit-registry-client/edit-registry-client.component.scss +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/edit-registry-client/edit-registry-client.component.scss @@ -17,6 +17,10 @@ @use '@angular/material' as mat; +h2.mdc-dialog__title::before { + height: 0; +} + .edit-registry-client-form { @include mat.button-density(-1); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/edit-registry-client/edit-registry-client.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/edit-registry-client/edit-registry-client.component.ts index 0711e907e5..9111959bb4 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/edit-registry-client/edit-registry-client.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/edit-registry-client/edit-registry-client.component.ts @@ -24,12 +24,11 @@ import { MatButtonModule } from '@angular/material/button'; import { AsyncPipe } from '@angular/common'; import { Observable } from 'rxjs'; import { - DocumentedType, InlineServiceCreationRequest, InlineServiceCreationResponse, Parameter, Property, - TextTipInput + RegistryClientEntity } from '../../../../../state/shared'; import { EditRegistryClientDialogRequest, EditRegistryClientRequest } from '../../../state/registry-clients'; import { NifiSpinnerDirective } from '../../../../../ui/common/spinner/nifi-spinner.directive'; @@ -101,15 +100,8 @@ export class EditRegistryClient { }); } - formatType(option: DocumentedType): string { - return this.nifiCommon.substringAfterLast(option.type, '.'); - } - - getOptionTipData(option: DocumentedType): TextTipInput { - return { - // @ts-ignore - text: option.description - }; + formatType(entity: RegistryClientEntity): string { + return this.nifiCommon.formatType(entity.component); } submitForm(postUpdateNavigation?: string[]) { diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-client-table/registry-client-table.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-client-table/registry-client-table.component.html index 8fb199052a..65b56f3d72 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-client-table/registry-client-table.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-client-table/registry-client-table.component.html @@ -31,7 +31,6 @@ @if (canRead(item)) {
- @if (hasErrors(item)) {
-

Edit Reporting Task

+

+
+
+ {{ readonly ? 'Reporting Task Details' : 'Edit Reporting Task' }} +
+
+ {{ formatType(request.reportingTask) }} +
+
+

@@ -26,9 +35,11 @@
Name - + - Enabled + + Enabled +
Id
@@ -59,6 +70,7 @@ @for (option of strategies; track option) { + type="text" + [readonly]="readonly" />
@@ -100,7 +113,12 @@
Comments - +
@@ -108,15 +126,19 @@ @if ({ value: (saving$ | async)! }; as saving) { - - + @if (readonly) { + + } @else { + + + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/edit-reporting-task/edit-reporting-task.component.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/edit-reporting-task/edit-reporting-task.component.scss index 2a17b60fbf..cd1e577596 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/edit-reporting-task/edit-reporting-task.component.scss +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/edit-reporting-task/edit-reporting-task.component.scss @@ -17,6 +17,10 @@ @use '@angular/material' as mat; +h2.mdc-dialog__title::before { + height: 0; +} + .reporting-task-edit-form { @include mat.button-density(-1); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/edit-reporting-task/edit-reporting-task.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/edit-reporting-task/edit-reporting-task.component.ts index 7ca02cd592..2e1d9dc097 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/edit-reporting-task/edit-reporting-task.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/edit-reporting-task/edit-reporting-task.component.ts @@ -83,6 +83,8 @@ export class EditReportingTask { new EventEmitter(); editReportingTaskForm: FormGroup; + readonly: boolean; + schedulingStrategy: string; cronDrivenSchedulingPeriod: string; timerDrivenSchedulingPeriod: string; @@ -108,6 +110,11 @@ export class EditReportingTask { private nifiCommon: NiFiCommon, private clusterConnectionService: ClusterConnectionService ) { + this.readonly = + !request.reportingTask.permissions.canWrite || + (request.reportingTask.status.runStatus !== 'STOPPED' && + request.reportingTask.status.runStatus !== 'DISABLED'); + const serviceProperties: any = request.reportingTask.component.properties; const properties: Property[] = Object.entries(serviceProperties).map((entry: any) => { const [property, value] = entry; @@ -137,13 +144,16 @@ export class EditReportingTask { // build the form this.editReportingTaskForm = this.formBuilder.group({ name: new FormControl(request.reportingTask.component.name, Validators.required), - state: new FormControl(request.reportingTask.component.state === 'STOPPED', Validators.required), + state: new FormControl( + { value: request.reportingTask.component.state !== 'DISABLED', disabled: this.readonly }, + Validators.required + ), schedulingStrategy: new FormControl( request.reportingTask.component.schedulingStrategy, Validators.required ), schedulingPeriod: new FormControl(schedulingPeriod, Validators.required), - properties: new FormControl(properties), + properties: new FormControl({ value: properties, disabled: this.readonly }), comments: new FormControl(request.reportingTask.component.comments) }); } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/reporting-task-table/reporting-task-table.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/reporting-task-table/reporting-task-table.component.html index 13dbffa452..36f0915f0c 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/reporting-task-table/reporting-task-table.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/reporting-tasks/reporting-task-table/reporting-task-table.component.html @@ -35,7 +35,6 @@ class="pointer fa fa-book primary-color" (click)="viewDocumentationClicked(item, $event)" title="View Documentation">
- @if (hasComments(item)) {
- @if (canStop(item)) { -
- } - @if (canEdit(item)) { -
- } +
@if (hasAdvancedUi(item)) {
} + @if (canStop(item)) { +
+ } @if (canStart(item)) {
@if (canEditOrDelete(currentUser, item)) {
} diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/controller-service-references/controller-service-references.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/controller-service-references/controller-service-references.component.html index 4c5244b40e..d928415010 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/controller-service-references/controller-service-references.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/controller-service-references/controller-service-references.component.html @@ -106,7 +106,8 @@ class="pointer fa fa-sticky-note-o primary-color" nifiTooltip [tooltipComponentType]="BulletinsTip" - [tooltipInputData]="getBulletinsTipData(reference)">
+ [tooltipInputData]="getBulletinsTipData(reference)" + [delayClose]="false">
} @if (hasActiveThreads(reference.component)) {
({{ reference.component.activeThreadCount }})
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/controller-service-table/controller-service-table.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/controller-service-table/controller-service-table.component.html index 0bfb32f119..a50e1acac0 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/controller-service-table/controller-service-table.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/controller-service-table/controller-service-table.component.html @@ -118,19 +118,16 @@ @if (definedByCurrentGroup(item)) {
- @if (canConfigure(item)) { -
- } +
@if (hasAdvancedUi(item)) {
} - @if (canDisable(item)) {
-

Edit Controller Service

+

+
+
+ {{ readonly ? 'Controller Service Details' : 'Edit Controller Service' }} +
+
+ {{ formatType(request.controllerService) }} +
+
+

@@ -26,7 +35,7 @@
Name - +
@@ -69,7 +78,7 @@ Bulletin Level @for (option of bulletinLevels; track option) { - + {{ option.text }} } @@ -112,7 +121,12 @@
Comments - +
@@ -120,15 +134,19 @@ @if ({ value: (saving$ | async)! }; as saving) { - - + @if (readonly) { + + } @else { + + + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/edit-controller-service/edit-controller-service.component.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/edit-controller-service/edit-controller-service.component.scss index 7197e5ad23..2ede7b4eff 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/edit-controller-service/edit-controller-service.component.scss +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/edit-controller-service/edit-controller-service.component.scss @@ -17,6 +17,10 @@ @use '@angular/material' as mat; +h2.mdc-dialog__title::before { + height: 0; +} + .controller-service-edit-form { @include mat.button-density(-1); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/edit-controller-service/edit-controller-service.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/edit-controller-service/edit-controller-service.component.ts index d523067267..8d894b9923 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/edit-controller-service/edit-controller-service.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/edit-controller-service/edit-controller-service.component.ts @@ -82,6 +82,7 @@ export class EditControllerService { new EventEmitter(); editControllerServiceForm: FormGroup; + readonly: boolean; bulletinLevels = [ { @@ -113,6 +114,10 @@ export class EditControllerService { private nifiCommon: NiFiCommon, private clusterConnectionService: ClusterConnectionService ) { + this.readonly = + !request.controllerService.permissions.canWrite || + request.controllerService.status.runStatus !== 'DISABLED'; + const serviceProperties: any = request.controllerService.component.properties; const properties: Property[] = Object.entries(serviceProperties).map((entry: any) => { const [property, value] = entry; @@ -127,7 +132,7 @@ export class EditControllerService { this.editControllerServiceForm = this.formBuilder.group({ name: new FormControl(request.controllerService.component.name, Validators.required), bulletinLevel: new FormControl(request.controllerService.component.bulletinLevel, Validators.required), - properties: new FormControl(properties), + properties: new FormControl({ value: properties, disabled: this.readonly }), comments: new FormControl(request.controllerService.component.comments) }); } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/combo-editor/combo-editor.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/combo-editor/combo-editor.component.html index 155ff4e664..88b7fca1f9 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/combo-editor/combo-editor.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/combo-editor/combo-editor.component.html @@ -31,6 +31,7 @@ - + - +
- - + @if (readonly) { + + } @else { + + + }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/combo-editor/combo-editor.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/combo-editor/combo-editor.component.ts index 78042e0835..4aa45c78f1 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/combo-editor/combo-editor.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/combo-editor/combo-editor.component.ts @@ -84,6 +84,7 @@ export class ComboEditor { this.initialAllowableValues(); } @Input() width!: number; + @Input() readonly: boolean = false; @Output() ok: EventEmitter = new EventEmitter(); @Output() cancel: EventEmitter = new EventEmitter(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/nf-editor/nf-editor.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/nf-editor/nf-editor.component.html index 67fde7d3de..2c9c41fb33 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/nf-editor/nf-editor.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/nf-editor/nf-editor.component.html @@ -15,7 +15,7 @@ ~ limitations under the License. --> -
+
@@ -50,27 +50,40 @@ (mousedown)="preventDrag($event)" (codeMirrorLoaded)="codeMirrorLoaded($event)">
- Set empty string + @if (!readonly) { + Set empty string + + }
- - + @if (readonly) { + + } @else { + + + }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/nf-editor/nf-editor.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/nf-editor/nf-editor.component.ts index a279e846fd..ebc0c9568e 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/nf-editor/nf-editor.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/editors/nf-editor/nf-editor.component.ts @@ -82,6 +82,7 @@ export class NfEditor implements OnDestroy { this.loadParameters(); } @Input() width!: number; + @Input() readonly: boolean = false; @Output() ok: EventEmitter = new EventEmitter(); @Output() cancel: EventEmitter = new EventEmitter(); @@ -116,7 +117,7 @@ export class NfEditor implements OnDestroy { codeMirrorLoaded(codeEditor: any): void { this.editor = codeEditor.codeMirror; - this.editor.setSize('100%', 100); + this.editor.setSize('100%', '100%'); this.editor.execCommand('selectAll'); } @@ -161,6 +162,7 @@ export class NfEditor implements OnDestroy { getOptions(): any { return { mode: this.mode, + readOnly: this.readonly, lineNumbers: true, matchBrackets: true, extraKeys: { diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/property-table.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/property-table.component.html index ef73a58ed0..558363196b 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/property-table.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/property-table.component.html @@ -18,12 +18,14 @@
Required field
-
- - -
+ @if (!isDisabled) { +
+ + +
+ }
@@ -101,18 +103,6 @@
- @if (item.descriptor.identifiesControllerService) { -
- } - @if (canConvertToParameter(item)) { -
- } @if (canGoToParameter(item)) {
} - @if (item.type == 'userDefined') { -
+ @if (!isDisabled) { + @if (item.descriptor.identifiesControllerService) { +
+ } + @if (canConvertToParameter(item)) { +
+ } + @if (item.type == 'userDefined') { +
+ } }
@@ -157,6 +161,7 @@ [item]="editorItem" [getParameters]="getParameters" [width]="editorWidth" + [readonly]="isDisabled" (ok)="savePropertyValue(editorItem, $event)" (cancel)="closeEditor()"> } @else { @@ -164,6 +169,7 @@ [item]="editorItem" [getParameters]="getParameters" [width]="editorWidth" + [readonly]="isDisabled" (ok)="savePropertyValue(editorItem, $event)" (cancel)="closeEditor()"> } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/property-table.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/property-table.component.ts index 9d4483e895..94870cb38a 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/property-table.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/property-table/property-table.component.ts @@ -244,7 +244,6 @@ export class PropertyTable implements AfterViewInit, ControlValueAccessor { } setDisabledState(isDisabled: boolean): void { - // TODO - update component to disable controls accordingly this.isDisabled = isDisabled; } @@ -410,8 +409,8 @@ export class PropertyTable implements AfterViewInit, ControlValueAccessor { this.editorOpen = true; if (this.hasAllowableValues(item)) { - this.editorWidth = width; - this.editorOffsetX = -24; + this.editorWidth = width + 50; + this.editorOffsetX = 0; this.editorOffsetY = 24; } else { this.editorWidth = width + 100; @@ -431,8 +430,6 @@ export class PropertyTable implements AfterViewInit, ControlValueAccessor { } canGoToService(item: PropertyItem): boolean { - // TODO - add Input() for supportsGoTo? currently only false in summary table - const descriptor: PropertyDescriptor = item.descriptor; if (item.value && descriptor.identifiesControllerService && descriptor.allowableValues) { return descriptor.allowableValues.some( diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/styles/_app.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/styles/_app.scss index 8ae8689fcb..361f73640e 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/styles/_app.scss +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/styles/_app.scss @@ -100,6 +100,10 @@ font-weight: normal !important; } + .mat-mdc-tab-header { + user-select: none; + } + .mat-mdc-icon-button { --mdc-icon-button-state-layer-size: 28px; --mdc-icon-button-icon-size: 14px;