This is an automated email from the ASF dual-hosted git repository.

mcgilman pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 649bfcf53e NIFI-14485 Add Bounded Process Group column to Parameter 
Contexts Page (#9884)
649bfcf53e is described below

commit 649bfcf53e361f0ac16a0fb189cf89fd3deae00f
Author: buczi <[email protected]>
AuthorDate: Wed Jul 23 00:20:21 2025 +0200

    NIFI-14485 Add Bounded Process Group column to Parameter Contexts Page 
(#9884)
    
    * NIFI-14485 Add Process Group Column to Parameter Context page
    
    Signed-off-by: Maciej Bukalo <[email protected]>
    
    * NIFI-14485 Filter out bound process groups without read permission
    
    Signed-off-by: Maciej Bukalo <[email protected]>
    
    * NIFI-14485 Reformat files
    
    Signed-off-by: Maciej Bukalo <[email protected]>
    
    * NIFI-14485 Show all available process groups when hovering
    
    Signed-off-by: Maciej Bukalo <[email protected]>
    
    * NIFI-14485 Adjust process group column in parameter context
    
    Signed-off-by: Maciej Bukalo <[email protected]>
    
    * NIFI-14485 Add full tests compatible with es2016
    
    Signed-off-by: Maciej Bukalo <[email protected]>
    
    * NIFI-14485 Remove failing tess
    
    Signed-off-by: Maciej Bukalo <[email protected]>
    
    ---------
    
    Signed-off-by: Maciej Bukalo <[email protected]>
---
 .../feature/parameter-contexts.module.ts           |   4 +-
 .../parameter-context-table.component.html         |  20 ++
 .../parameter-context-table.component.scss         |   2 +-
 .../parameter-context-table.component.spec.ts      | 306 ++++++++++++++++++++-
 .../parameter-context-table.component.ts           |  52 +++-
 .../process-group-references.component.html        |   6 +-
 .../process-group-references.component.scss        |  10 +-
 .../process-group-references.component.ts          |   1 +
 .../process-group-tip.component.html               |  22 ++
 .../process-group-tip.component.scss}              |   8 +-
 .../process-group-tip.component.spec.ts}           |  13 +-
 .../process-group-tip.component.ts}                |  18 +-
 12 files changed, 431 insertions(+), 31 deletions(-)

diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/feature/parameter-contexts.module.ts
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/feature/parameter-contexts.module.ts
index f5f212ed75..721cb84472 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/feature/parameter-contexts.module.ts
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/feature/parameter-contexts.module.ts
@@ -26,6 +26,7 @@ import { ParameterContextListingEffects } from 
'../state/parameter-context-listi
 import { Navigation } from 
'../../../ui/common/navigation/navigation.component';
 import { BannerText } from 
'../../../ui/common/banner-text/banner-text.component';
 import { ParameterContextListing } from 
'../ui/parameter-context-listing/parameter-context-listing.component';
+import { ProcessGroupReferences } from 
'../ui/parameter-context-listing/process-group-references/process-group-references.component';
 
 @NgModule({
     declarations: [ParameterContexts],
@@ -37,7 +38,8 @@ import { ParameterContextListing } from 
'../ui/parameter-context-listing/paramet
         EffectsModule.forFeature(ParameterContextListingEffects),
         ParameterContextListing,
         Navigation,
-        BannerText
+        BannerText,
+        ProcessGroupReferences
     ]
 })
 export class ParameterContextsModule {}
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.html
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.html
index 44dce74ab8..a3421adac7 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.html
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.html
@@ -54,6 +54,26 @@
                 </td>
             </ng-container>
 
+            <!-- Process Group Column -->
+            <ng-container matColumnDef="process groups">
+                <th mat-header-cell *matHeaderCellDef mat-sort-header>Process 
Groups</th>
+                <td mat-cell *matCellDef="let item">
+                    <div class="flex justify-start gap-x-2 items-center">
+                        @let hasMultipleGroups = 
hasMultipleProcessGroups(item);
+                        <div [class.unset]="hasMultipleGroups">
+                            {{ formatProcessGroups(item) }}
+                        </div>
+                        @if (hasMultipleGroups) {
+                            <i
+                                class="fa fa-info-circle primary-color"
+                                nifiTooltip
+                                [tooltipComponentType]="ProcessGroupTip"
+                                
[tooltipInputData]="getBoundedProcessGroups(item)"></i>
+                        }
+                    </div>
+                </td>
+            </ng-container>
+
             <!-- Actions Column -->
             <ng-container matColumnDef="actions">
                 <th mat-header-cell *matHeaderCellDef></th>
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.scss
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.scss
index 08d3256a74..5cf03d8d2f 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.scss
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.scss
@@ -18,7 +18,7 @@
 .parameter-context-table {
     .listing-table {
         .mat-column-name {
-            width: 25%;
+            width: 20%;
         }
     }
 }
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.spec.ts
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.spec.ts
index b50ddbac10..cd2a3bb1a0 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.spec.ts
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.spec.ts
@@ -19,6 +19,11 @@ import { ComponentFixture, TestBed } from 
'@angular/core/testing';
 
 import { ParameterContextTable } from './parameter-context-table.component';
 import { NoopAnimationsModule } from '@angular/platform-browser/animations';
+import { MatTableDataSource } from '@angular/material/table';
+import { ParameterContextEntity } from '../../../../../state/shared';
+import { Sort } from '@angular/material/sort';
+import { RouterModule } from '@angular/router';
+import { MatIconModule } from '@angular/material/icon';
 
 describe('ParameterContextTable', () => {
     let component: ParameterContextTable;
@@ -26,7 +31,7 @@ describe('ParameterContextTable', () => {
 
     beforeEach(() => {
         TestBed.configureTestingModule({
-            imports: [ParameterContextTable, NoopAnimationsModule]
+            imports: [ParameterContextTable, NoopAnimationsModule, 
RouterModule, MatIconModule]
         });
         fixture = TestBed.createComponent(ParameterContextTable);
         component = fixture.componentInstance;
@@ -36,4 +41,303 @@ describe('ParameterContextTable', () => {
     it('should create', () => {
         expect(component).toBeTruthy();
     });
+
+    describe('with canRead returning true', () => {
+        beforeEach(() => {
+            jest.spyOn(component, 'canRead').mockReturnValue(true);
+        });
+
+        it('should format name correctly', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    name: 'Example Name'
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatName(entity)).toEqual('Example Name');
+        });
+
+        it('should format provider correctly', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    parameterProviderConfiguration: {
+                        component: {
+                            parameterGroupName: 'Example Group Name',
+                            parameterProviderName: 'Example Provider'
+                        }
+                    }
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatProvider(entity)).toEqual('Example Group 
Name from Example Provider');
+        });
+
+        it('should format description correctly', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    description: 'Example Description'
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatDescription(entity)).toEqual('Example 
Description');
+        });
+
+        it('should format process groups correctly when there are more than 1 
process group', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    boundProcessGroups: [
+                        {
+                            id: '1',
+                            permissions: { canRead: true },
+                            component: { id: '111', name: 'PG1' }
+                        },
+                        {
+                            id: '2',
+                            permissions: { canRead: true },
+                            component: { id: '222', name: 'PG1' }
+                        }
+                    ]
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatProcessGroups(entity)).toEqual('2 
referencing Process Groups');
+        });
+
+        it('should format process groups correctly when there is one process 
group', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    boundProcessGroups: [
+                        {
+                            id: '1',
+                            permissions: { canRead: true },
+                            component: { id: '111', name: 'PG1' }
+                        }
+                    ]
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatProcessGroups(entity)).toEqual('PG1');
+        });
+
+        it('should format process groups correctly when there are no process 
groups', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    boundProcessGroups: []
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatProcessGroups(entity)).toEqual('');
+        });
+
+        it('should format process groups correctly when there is 1 process 
groups but without read permission', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    boundProcessGroups: [
+                        {
+                            id: '1',
+                            permissions: { canRead: false },
+                            component: { id: '111', name: 'PG1' }
+                        }
+                    ]
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatProcessGroups(entity)).toEqual('1 
referencing Process Group');
+        });
+
+        it.each([
+            { active: 'name', direction: 'asc', expectedOrder: ['2', '1', '3'] 
},
+            { active: 'name', direction: 'desc', expectedOrder: ['3', '1', 
'2'] },
+            { active: 'description', direction: 'asc', expectedOrder: ['2', 
'1', '3'] },
+            { active: 'description', direction: 'desc', expectedOrder: ['3', 
'1', '2'] },
+            { active: 'provider', direction: 'asc', expectedOrder: ['1', '2', 
'3'] },
+            { active: 'provider', direction: 'desc', expectedOrder: ['3', '2', 
'1'] },
+            { active: 'process groups', direction: 'asc', expectedOrder: ['1', 
'2', '3'] },
+            { active: 'process groups', direction: 'desc', expectedOrder: 
['3', '2', '1'] }
+        ])('should sort entities correctly by %s', ({ active, direction, 
expectedOrder }) => {
+            const mockEntities = [
+                {
+                    id: '1',
+                    component: {
+                        name: 'B',
+                        description: 'Second',
+                        parameterProviderConfiguration: {
+                            component: {
+                                parameterGroupName: 'Name1'
+                            }
+                        },
+                        boundProcessGroups: [
+                            {
+                                id: '1',
+                                permissions: { canRead: true },
+                                component: { id: '111', name: 'PG1' }
+                            }
+                        ]
+                    }
+                } as unknown as ParameterContextEntity,
+                {
+                    id: '2',
+                    component: {
+                        name: 'A',
+                        description: 'First',
+                        parameterProviderConfiguration: {
+                            component: {
+                                parameterGroupName: 'Name2'
+                            }
+                        },
+                        boundProcessGroups: [
+                            {
+                                id: '2',
+                                permissions: { canRead: true },
+                                component: { id: '222', name: 'PG2' }
+                            }
+                        ]
+                    }
+                } as unknown as ParameterContextEntity,
+                {
+                    id: '3',
+                    component: {
+                        name: 'C',
+                        description: 'Third',
+                        parameterProviderConfiguration: {
+                            component: {
+                                parameterGroupName: 'Name3'
+                            }
+                        },
+                        boundProcessGroups: [
+                            {
+                                id: '3',
+                                permissions: { canRead: true },
+                                component: { id: '333', name: 'PG3' }
+                            }
+                        ]
+                    }
+                } as unknown as ParameterContextEntity
+            ] as ParameterContextEntity[];
+
+            const sortEvent = { active, direction } as Sort;
+            component.dataSource = new MatTableDataSource(mockEntities);
+
+            component.sortData(sortEvent);
+            const sortedData = component.dataSource.data.map((entity) => 
entity.id);
+
+            expect(sortedData).toEqual(expectedOrder);
+        });
+    });
+
+    describe('with canRead returning false', () => {
+        beforeEach(() => {
+            jest.spyOn(component, 'canRead').mockReturnValue(false);
+        });
+
+        it('should format name correctly', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    name: 'Example Name'
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatName(entity)).toEqual('1');
+        });
+
+        it('should format provider correctly', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    parameterProviderConfiguration: {
+                        component: {
+                            parameterGroupName: 'Example Group Name',
+                            parameterProviderName: 'Example Provider'
+                        }
+                    }
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatProvider(entity)).toEqual('');
+        });
+
+        it('should format description correctly', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    description: 'Example Description'
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatDescription(entity)).toEqual('');
+        });
+
+        it('should format process groups correctly', () => {
+            const entity: ParameterContextEntity = {
+                id: '1',
+                component: {
+                    boundProcessGroups: [
+                        {
+                            id: '1',
+                            permissions: { canRead: true },
+                            component: { id: '111', name: 'PG1' }
+                        },
+                        {
+                            id: '2',
+                            permissions: { canRead: true },
+                            component: { id: '222', name: 'PG1' }
+                        }
+                    ]
+                }
+            } as unknown as ParameterContextEntity;
+
+            expect(component.formatProcessGroups(entity)).toEqual('');
+        });
+    });
+
+    describe('verify parameter context actions', () => {
+        const parameterContext: ParameterContextEntity = {
+            id: '1',
+            permissions: { canRead: true, canWrite: true },
+            revision: { version: 0, clientId: '1', lastModifier: '1' },
+            uri: '/nifi-api/parameter-contexts/1',
+            component: {
+                name: 'Test Parameter Context',
+                description: 'Test Description',
+                parameterProviderConfiguration: {
+                    component: {
+                        parameterGroupName: 'Test Group'
+                    }
+                },
+                boundProcessGroups: []
+            }
+        } as unknown as ParameterContextEntity;
+
+        it('should trigger the select action', async () => {
+            jest.spyOn(component.selectParameterContext, 'next');
+            component.select(parameterContext);
+            
expect(component.selectParameterContext.next).toHaveBeenCalledWith(parameterContext);
+        });
+
+        it('should trigger the edit action', () => {
+            jest.spyOn(component.editParameterContext, 'next');
+            component.editClicked(parameterContext);
+            
expect(component.editParameterContext.next).toHaveBeenCalledWith(parameterContext);
+        });
+
+        it('should trigger the delete action', () => {
+            jest.spyOn(component.deleteParameterContext, 'next');
+            component.deleteClicked(parameterContext);
+            
expect(component.deleteParameterContext.next).toHaveBeenCalledWith(parameterContext);
+        });
+
+        it('should trigger the manage access policies action', () => {
+            jest.spyOn(component.manageAccessPolicies, 'next');
+            component.manageAccessPoliciesClicked(parameterContext);
+            
expect(component.manageAccessPolicies.next).toHaveBeenCalledWith(parameterContext);
+        });
+    });
 });
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.ts
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.ts
index 1eb8088587..fbbc0744a3 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.ts
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.ts
@@ -18,23 +18,34 @@
 import { Component, EventEmitter, Input, Output } from '@angular/core';
 import { MatTableDataSource, MatTableModule } from '@angular/material/table';
 import { MatSortModule, Sort } from '@angular/material/sort';
-import { NiFiCommon } from '@nifi/shared';
+import { NiFiCommon, NifiTooltipDirective } from '@nifi/shared';
 import { FlowConfiguration } from '../../../../../state/flow-configuration';
 import { CurrentUser } from '../../../../../state/current-user';
-import { ParameterContextEntity } from '../../../../../state/shared';
+import { BoundProcessGroup, ParameterContextEntity } from 
'../../../../../state/shared';
 import { MatIconButton } from '@angular/material/button';
 import { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
 import { RouterLink } from '@angular/router';
 import { NgClass } from '@angular/common';
+import { ProcessGroupTip } from 
'../../../../../ui/common/tooltips/process-group-tip/process-group-tip.component';
 
 @Component({
     selector: 'parameter-context-table',
     templateUrl: './parameter-context-table.component.html',
     styleUrls: ['./parameter-context-table.component.scss'],
-    imports: [MatTableModule, MatSortModule, MatIconButton, MatMenuTrigger, 
MatMenu, MatMenuItem, RouterLink, NgClass]
+    imports: [
+        MatTableModule,
+        MatSortModule,
+        MatIconButton,
+        MatMenuTrigger,
+        MatMenu,
+        MatMenuItem,
+        RouterLink,
+        NgClass,
+        NifiTooltipDirective
+    ]
 })
 export class ParameterContextTable {
-    @Input() initialSortColumn: 'name' | 'provider' | 'description' = 'name';
+    @Input() initialSortColumn: 'name' | 'provider' | 'description' | 'process 
groups' = 'name';
     @Input() initialSortDirection: 'asc' | 'desc' = 'asc';
     activeSort: Sort = {
         active: this.initialSortColumn,
@@ -54,7 +65,7 @@ export class ParameterContextTable {
     @Output() deleteParameterContext: EventEmitter<ParameterContextEntity> = 
new EventEmitter<ParameterContextEntity>();
     @Output() manageAccessPolicies: EventEmitter<ParameterContextEntity> = new 
EventEmitter<ParameterContextEntity>();
 
-    displayedColumns: string[] = ['name', 'provider', 'description', 
'actions'];
+    displayedColumns: string[] = ['name', 'provider', 'description', 'process 
groups', 'actions'];
     dataSource: MatTableDataSource<ParameterContextEntity> = new 
MatTableDataSource<ParameterContextEntity>();
 
     constructor(private nifiCommon: NiFiCommon) {}
@@ -86,6 +97,32 @@ export class ParameterContextTable {
         return this.canRead(entity) && entity.component ? 
entity.component.description : '';
     }
 
+    formatProcessGroups(entity: ParameterContextEntity): string {
+        const boundedProcessGroups = this.getBoundedProcessGroups(entity);
+        return boundedProcessGroups.length <= 1
+            ? this.getAllowedProcessGroupName(boundedProcessGroups)
+            : boundedProcessGroups.length.toString() + ' referencing Process 
Groups';
+    }
+
+    hasMultipleProcessGroups(entity: ParameterContextEntity): boolean {
+        const boundedProcessGroups = this.getBoundedProcessGroups(entity);
+        return boundedProcessGroups.length > 1;
+    }
+
+    getBoundedProcessGroups(entity: ParameterContextEntity): 
BoundProcessGroup[] {
+        if (!this.canRead(entity) || entity.component === undefined) {
+            return [];
+        }
+        return entity.component.boundProcessGroups;
+    }
+
+    private getAllowedProcessGroupName(groups: BoundProcessGroup[]): string {
+        if (groups.length === 0) {
+            return '';
+        }
+        return groups[0].permissions.canRead ? groups[0].component.name : '1 
referencing Process Group';
+    }
+
     editClicked(entity: ParameterContextEntity): void {
         this.editParameterContext.next(entity);
     }
@@ -157,10 +194,15 @@ export class ParameterContextTable {
                 case 'description':
                     retVal = 
this.nifiCommon.compareString(this.formatDescription(a), 
this.formatDescription(b));
                     break;
+                case 'process groups':
+                    retVal = 
this.nifiCommon.compareString(this.formatProcessGroups(a), 
this.formatProcessGroups(b));
+                    break;
                 default:
                     return 0;
             }
             return retVal * (isAsc ? 1 : -1);
         });
     }
+
+    protected readonly ProcessGroupTip = ProcessGroupTip;
 }
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.html
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.html
index fccf63741c..20337f7720 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.html
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.html
@@ -53,7 +53,11 @@
             @if (references.length > 0) {
                 @for (reference of references; track reference) {
                     <li>
-                        <a [routerLink]="getRouteForReference(reference)">{{ 
reference.component.name }}</a>
+                        @if (disabledLinks) {
+                            {{ reference.component.name }}
+                        } @else {
+                            <a 
[routerLink]="getRouteForReference(reference)">{{ reference.component.name 
}}</a>
+                        }
                     </li>
                 }
             }
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.scss
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.scss
index 907d0568d8..08ebc77f1b 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.scss
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.scss
@@ -16,8 +16,14 @@
  */
 
 .process-group-references {
-    ul.nested {
-        padding-inline-start: 20px;
+    ul {
+        list-style: none;
+        margin: 0;
+
+        &.nested {
+            list-style: disc;
+            padding-inline-start: 20px;
+        }
     }
 
     .references {
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.ts
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.ts
index 5e88c7d8e2..e80d1d3470 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.ts
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.ts
@@ -35,6 +35,7 @@ export class ProcessGroupReferences {
         this.authorizedProcessGroupReferences = 
this.getAuthorized(processGroupReferences);
         this.unauthorizedProcessGroupReferences = 
this.getUnauthorized(processGroupReferences);
     }
+    @Input() disabledLinks = false;
 
     authorizedProcessGroupReferences: BoundProcessGroup[] = [];
     unauthorizedProcessGroupReferences: BoundProcessGroup[] = [];
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.html
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.html
new file mode 100644
index 0000000000..25e90c670c
--- /dev/null
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.html
@@ -0,0 +1,22 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<div class="tooltip process-group-tip">
+    @if (data) {
+        <process-group-references [processGroupReferences]="data" 
[disabledLinks]="true"> </process-group-references>
+    }
+</div>
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.scss
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.scss
similarity index 87%
copy from 
nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.scss
copy to 
nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.scss
index 08d3256a74..c36976bf29 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.scss
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.scss
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-.parameter-context-table {
-    .listing-table {
-        .mat-column-name {
-            width: 25%;
-        }
-    }
+.process-group-tip {
+    max-width: 400px;
 }
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.spec.ts
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.spec.ts
similarity index 72%
copy from 
nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.spec.ts
copy to 
nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.spec.ts
index b50ddbac10..a4c607c10a 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/parameter-context-table/parameter-context-table.component.spec.ts
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.spec.ts
@@ -17,18 +17,17 @@
 
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
-import { ParameterContextTable } from './parameter-context-table.component';
-import { NoopAnimationsModule } from '@angular/platform-browser/animations';
+import { ProcessGroupTip } from './process-group-tip.component';
 
-describe('ParameterContextTable', () => {
-    let component: ParameterContextTable;
-    let fixture: ComponentFixture<ParameterContextTable>;
+describe('ProcessGroupTip', () => {
+    let component: ProcessGroupTip;
+    let fixture: ComponentFixture<ProcessGroupTip>;
 
     beforeEach(() => {
         TestBed.configureTestingModule({
-            imports: [ParameterContextTable, NoopAnimationsModule]
+            imports: [ProcessGroupTip]
         });
-        fixture = TestBed.createComponent(ParameterContextTable);
+        fixture = TestBed.createComponent(ProcessGroupTip);
         component = fixture.componentInstance;
         fixture.detectChanges();
     });
diff --git 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.scss
 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.ts
similarity index 58%
copy from 
nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.scss
copy to 
nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.ts
index 907d0568d8..54a20ab6e4 100644
--- 
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component.scss
+++ 
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/ui/common/tooltips/process-group-tip/process-group-tip.component.ts
@@ -15,12 +15,16 @@
  * limitations under the License.
  */
 
-.process-group-references {
-    ul.nested {
-        padding-inline-start: 20px;
-    }
+import { Component, Input } from '@angular/core';
+import { BoundProcessGroup } from '../../../../state/shared';
+import { ProcessGroupReferences } from 
'../../../../pages/parameter-contexts/ui/parameter-context-listing/process-group-references/process-group-references.component';
 
-    .references {
-        margin-left: 20px;
-    }
+@Component({
+    selector: 'process-group-tip',
+    templateUrl: './process-group-tip.component.html',
+    imports: [ProcessGroupReferences],
+    styleUrls: ['./process-group-tip.component.scss']
+})
+export class ProcessGroupTip {
+    @Input() data: BoundProcessGroup[] | undefined;
 }


Reply via email to