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

rfellows 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 339a06a8c6 NIFI-12937: Adding error handling to the Parameter Context 
Listing page (#8555)
339a06a8c6 is described below

commit 339a06a8c6337d290361acb4c57be348930ff9c5
Author: Matt Gilman <[email protected]>
AuthorDate: Tue Mar 26 15:07:14 2024 -0400

    NIFI-12937: Adding error handling to the Parameter Context Listing page 
(#8555)
    
    * NIFI-12937:
    - Adding error handling to the Parameter Context Listing page.
    
    * NIFI-12937:
    - Addressing review feedback.
    
    This closes #8555
---
 .../src/main/nifi/proxy.config.mjs                 |   2 +-
 .../state/parameter-context-listing/index.ts       |   3 +-
 .../parameter-context-listing.actions.ts           |  14 +-
 .../parameter-context-listing.effects.ts           | 188 +++++++++++++--------
 .../parameter-context-listing.reducer.ts           |  26 +--
 .../parameter-context-listing.selectors.ts         |   5 +
 .../edit-parameter-context.component.html          |  16 +-
 .../edit-parameter-context.component.ts            |   4 +-
 .../parameter-context-table.component.ts           |   2 +-
 .../disable-controller-service.component.html      |   2 +-
 .../enable-controller-service.component.html       |   2 +-
 .../src/main/nifi/src/assets/styles/_app.scss      |   1 +
 .../src/main/nifi/src/assets/utils.scss            |   5 +-
 13 files changed, 173 insertions(+), 97 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/proxy.config.mjs
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/proxy.config.mjs
index a2377fe6fd..4f4d30253f 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/proxy.config.mjs
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/proxy.config.mjs
@@ -17,7 +17,7 @@ const target = {
             console.log('Received Response from the Target:', 
proxyRes.statusCode, req.url);
         });
     },
-    bypass: function(req, res, proxyOptions) {
+    bypass: function (req) {
         if (req.url.startsWith('/nifi/')) {
             return req.url;
         }
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/index.ts
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/index.ts
index 80b07b6ba9..06eb2d71ef 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/index.ts
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/index.ts
@@ -89,6 +89,5 @@ export interface ParameterContextListingState {
     updateRequestEntity: ParameterContextUpdateRequestEntity | null;
     saving: boolean;
     loadedTimestamp: string;
-    error: string | null;
-    status: 'pending' | 'loading' | 'error' | 'success';
+    status: 'pending' | 'loading' | 'success';
 }
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.actions.ts
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.actions.ts
index 14ccaa463d..8642ca7944 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.actions.ts
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.actions.ts
@@ -35,8 +35,13 @@ export const loadParameterContextsSuccess = createAction(
     props<{ response: LoadParameterContextsResponse }>()
 );
 
-export const parameterContextListingApiError = createAction(
-    '[Parameter Context Listing] Load Parameter Context Listing Error',
+export const parameterContextListingSnackbarApiError = createAction(
+    '[Parameter Context Listing] Load Parameter Context Listing Snackbar Api 
Error',
+    props<{ error: string }>()
+);
+
+export const parameterContextListingBannerApiError = createAction(
+    '[Parameter Context Listing] Load Parameter Context Listing Banner Api 
Error',
     props<{ error: string }>()
 );
 
@@ -100,6 +105,11 @@ export const deleteParameterContextUpdateRequest = 
createAction(
     '[Parameter Context Listing] Delete Parameter Context Update Request'
 );
 
+export const deleteParameterContextUpdateRequestSuccess = createAction(
+    '[Parameter Context Listing] Delete Parameter Context Update Request 
Success',
+    props<{ response: PollParameterContextUpdateSuccess }>()
+);
+
 export const editParameterContextComplete = createAction('[Parameter Context 
Listing] Edit Parameter Context Complete');
 
 export const promptParameterContextDeletion = createAction(
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.effects.ts
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.effects.ts
index 7229979dde..fbcc2046e9 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.effects.ts
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.effects.ts
@@ -18,13 +18,14 @@
 import { Injectable } from '@angular/core';
 import { Actions, concatLatestFrom, createEffect, ofType } from 
'@ngrx/effects';
 import * as ParameterContextListingActions from 
'./parameter-context-listing.actions';
+import * as ErrorActions from '../../../../state/error/error.actions';
 import {
     asyncScheduler,
     catchError,
+    filter,
     from,
     interval,
     map,
-    NEVER,
     Observable,
     of,
     switchMap,
@@ -39,15 +40,23 @@ import { Router } from '@angular/router';
 import { ParameterContextService } from 
'../../service/parameter-contexts.service';
 import { YesNoDialog } from 
'../../../../ui/common/yes-no-dialog/yes-no-dialog.component';
 import { EditParameterContext } from 
'../../ui/parameter-context-listing/edit-parameter-context/edit-parameter-context.component';
-import { selectParameterContexts, selectSaving, selectUpdateRequest } from 
'./parameter-context-listing.selectors';
+import {
+    selectParameterContexts,
+    selectParameterContextStatus,
+    selectSaving,
+    selectUpdateRequest
+} from './parameter-context-listing.selectors';
 import {
     EditParameterRequest,
     EditParameterResponse,
+    isDefinedAndNotNull,
     Parameter,
     ParameterContextUpdateRequest
 } from '../../../../state/shared';
 import { EditParameterDialog } from 
'../../../../ui/common/edit-parameter-dialog/edit-parameter-dialog.component';
 import { OkDialog } from '../../../../ui/common/ok-dialog/ok-dialog.component';
+import { ErrorHelper } from '../../../../service/error-helper.service';
+import { HttpErrorResponse } from '@angular/common/http';
 
 @Injectable()
 export class ParameterContextListingEffects {
@@ -56,13 +65,15 @@ export class ParameterContextListingEffects {
         private store: Store<NiFiState>,
         private parameterContextService: ParameterContextService,
         private dialog: MatDialog,
-        private router: Router
+        private router: Router,
+        private errorHelper: ErrorHelper
     ) {}
 
     loadParameterContexts$ = createEffect(() =>
         this.actions$.pipe(
             ofType(ParameterContextListingActions.loadParameterContexts),
-            switchMap(() =>
+            concatLatestFrom(() => 
this.store.select(selectParameterContextStatus)),
+            switchMap(([, status]) =>
                 from(this.parameterContextService.getParameterContexts()).pipe(
                     map((response) =>
                         
ParameterContextListingActions.loadParameterContextsSuccess({
@@ -72,12 +83,8 @@ export class ParameterContextListingEffects {
                             }
                         })
                     ),
-                    catchError((error) =>
-                        of(
-                            
ParameterContextListingActions.parameterContextListingApiError({
-                                error: error.error
-                            })
-                        )
+                    catchError((errorResponse: HttpErrorResponse) =>
+                        of(this.errorHelper.handleLoadingError(status, 
errorResponse))
                     )
                 )
             )
@@ -121,13 +128,15 @@ export class ParameterContextListingEffects {
                         );
                     };
 
-                    
dialogReference.componentInstance.addParameterContext.pipe(take(1)).subscribe((payload:
 any) => {
-                        this.store.dispatch(
-                            
ParameterContextListingActions.createParameterContext({
-                                request: { payload }
-                            })
-                        );
-                    });
+                    dialogReference.componentInstance.addParameterContext
+                        .pipe(takeUntil(dialogReference.afterClosed()))
+                        .subscribe((payload: any) => {
+                            this.store.dispatch(
+                                
ParameterContextListingActions.createParameterContext({
+                                    request: { payload }
+                                })
+                            );
+                        });
                 })
             ),
         { dispatch: false }
@@ -146,13 +155,18 @@ export class ParameterContextListingEffects {
                             }
                         })
                     ),
-                    catchError((error) =>
-                        of(
-                            
ParameterContextListingActions.parameterContextListingApiError({
-                                error: error.error
-                            })
-                        )
-                    )
+                    catchError((errorResponse: HttpErrorResponse) => {
+                        if 
(this.errorHelper.showErrorInContext(errorResponse.status)) {
+                            return of(
+                                
ParameterContextListingActions.parameterContextListingBannerApiError({
+                                    error: errorResponse.error
+                                })
+                            );
+                        } else {
+                            this.dialog.closeAll();
+                            return 
of(this.errorHelper.fullScreenError(errorResponse));
+                        }
+                    })
                 )
             )
         )
@@ -169,6 +183,22 @@ export class ParameterContextListingEffects {
         { dispatch: false }
     );
 
+    parameterContextListingBannerApiError$ = createEffect(() =>
+        this.actions$.pipe(
+            
ofType(ParameterContextListingActions.parameterContextListingBannerApiError),
+            map((action) => action.error),
+            switchMap((error) => of(ErrorActions.addBannerError({ error })))
+        )
+    );
+
+    parameterContextListingSnackbarApiError$ = createEffect(() =>
+        this.actions$.pipe(
+            
ofType(ParameterContextListingActions.parameterContextListingSnackbarApiError),
+            map((action) => action.error),
+            switchMap((error) => of(ErrorActions.snackBarError({ error })))
+        )
+    );
+
     navigateToEditService$ = createEffect(
         () =>
             this.actions$.pipe(
@@ -194,13 +224,14 @@ export class ParameterContextListingEffects {
                             }
                         })
                     ),
-                    catchError((error) =>
-                        of(
-                            
ParameterContextListingActions.parameterContextListingApiError({
-                                error: error.error
+                    catchError((errorResponse: HttpErrorResponse) => {
+                        this.router.navigate(['/parameter-contexts']);
+                        return of(
+                            
ParameterContextListingActions.parameterContextListingSnackbarApiError({
+                                error: errorResponse.error
                             })
-                        )
-                    )
+                        );
+                    })
                 )
             )
         )
@@ -281,7 +312,7 @@ export class ParameterContextListingEffects {
                     };
 
                     editDialogReference.componentInstance.editParameterContext
-                        .pipe(take(1))
+                        .pipe(takeUntil(editDialogReference.afterClosed()))
                         .subscribe((payload: any) => {
                             this.store.dispatch(
                                 
ParameterContextListingActions.submitParameterContextUpdateRequest({
@@ -294,6 +325,8 @@ export class ParameterContextListingEffects {
                         });
 
                     editDialogReference.afterClosed().subscribe((response) => {
+                        this.store.dispatch(ErrorActions.clearBannerErrors());
+
                         if (response != 'ROUTED') {
                             this.store.dispatch(
                                 
ParameterContextListingActions.selectParameterContext({
@@ -323,13 +356,18 @@ export class ParameterContextListingEffects {
                             }
                         })
                     ),
-                    catchError((error) =>
-                        of(
-                            
ParameterContextListingActions.parameterContextListingApiError({
-                                error: error.error
-                            })
-                        )
-                    )
+                    catchError((errorResponse: HttpErrorResponse) => {
+                        if 
(this.errorHelper.showErrorInContext(errorResponse.status)) {
+                            return of(
+                                
ParameterContextListingActions.parameterContextListingBannerApiError({
+                                    error: errorResponse.error
+                                })
+                            );
+                        } else {
+                            this.dialog.closeAll();
+                            return 
of(this.errorHelper.fullScreenError(errorResponse));
+                        }
+                    })
                 )
             )
         )
@@ -369,29 +407,31 @@ export class ParameterContextListingEffects {
     pollParameterContextUpdateRequest$ = createEffect(() =>
         this.actions$.pipe(
             
ofType(ParameterContextListingActions.pollParameterContextUpdateRequest),
-            concatLatestFrom(() => this.store.select(selectUpdateRequest)),
-            switchMap(([, updateRequest]) => {
-                if (updateRequest) {
-                    return 
from(this.parameterContextService.pollParameterContextUpdate(updateRequest.request)).pipe(
-                        map((response) =>
-                            
ParameterContextListingActions.pollParameterContextUpdateRequestSuccess({
-                                response: {
-                                    requestEntity: response
-                                }
-                            })
-                        ),
-                        catchError((error) =>
-                            of(
-                                
ParameterContextListingActions.parameterContextListingApiError({
-                                    error: error.error
+            concatLatestFrom(() => 
this.store.select(selectUpdateRequest).pipe(isDefinedAndNotNull())),
+            switchMap(([, updateRequest]) =>
+                
from(this.parameterContextService.pollParameterContextUpdate(updateRequest.request)).pipe(
+                    map((response) =>
+                        
ParameterContextListingActions.pollParameterContextUpdateRequestSuccess({
+                            response: {
+                                requestEntity: response
+                            }
+                        })
+                    ),
+                    catchError((errorResponse: HttpErrorResponse) => {
+                        
this.store.dispatch(ParameterContextListingActions.stopPollingParameterContextUpdateRequest());
+
+                        if 
(this.errorHelper.showErrorInContext(errorResponse.status)) {
+                            return of(
+                                
ParameterContextListingActions.parameterContextListingBannerApiError({
+                                    error: errorResponse.error
                                 })
-                            )
-                        )
-                    );
-                } else {
-                    return NEVER;
-                }
-            })
+                            );
+                        } else {
+                            return 
of(this.errorHelper.fullScreenError(errorResponse));
+                        }
+                    })
+                )
+            )
         )
     );
 
@@ -399,14 +439,8 @@ export class ParameterContextListingEffects {
         this.actions$.pipe(
             
ofType(ParameterContextListingActions.pollParameterContextUpdateRequestSuccess),
             map((action) => action.response),
-            switchMap((response) => {
-                const updateRequest: ParameterContextUpdateRequest = 
response.requestEntity.request;
-                if (updateRequest.complete) {
-                    return 
of(ParameterContextListingActions.stopPollingParameterContextUpdateRequest());
-                } else {
-                    return NEVER;
-                }
-            })
+            filter((response) => response.requestEntity.request.complete),
+            switchMap(() => 
of(ParameterContextListingActions.stopPollingParameterContextUpdateRequest()))
         )
     );
 
@@ -421,11 +455,19 @@ export class ParameterContextListingEffects {
         () =>
             this.actions$.pipe(
                 
ofType(ParameterContextListingActions.deleteParameterContextUpdateRequest),
-                concatLatestFrom(() => this.store.select(selectUpdateRequest)),
+                concatLatestFrom(() => 
this.store.select(selectUpdateRequest).pipe(isDefinedAndNotNull())),
                 tap(([, updateRequest]) => {
-                    if (updateRequest) {
-                        
this.parameterContextService.deleteParameterContextUpdate(updateRequest.request).subscribe();
-                    }
+                    this.parameterContextService
+                        .deleteParameterContextUpdate(updateRequest.request)
+                        .subscribe((response) => {
+                            this.store.dispatch(
+                                
ParameterContextListingActions.deleteParameterContextUpdateRequestSuccess({
+                                    response: {
+                                        requestEntity: response
+                                    }
+                                })
+                            );
+                        });
                 })
             ),
         { dispatch: false }
@@ -472,7 +514,7 @@ export class ParameterContextListingEffects {
                     ),
                     catchError((error) =>
                         of(
-                            
ParameterContextListingActions.parameterContextListingApiError({
+                            
ParameterContextListingActions.parameterContextListingSnackbarApiError({
                                 error: error.error
                             })
                         )
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.reducer.ts
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.reducer.ts
index e1db22deb0..2deea52cf1 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.reducer.ts
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.reducer.ts
@@ -25,10 +25,12 @@ import {
     editParameterContextComplete,
     loadParameterContexts,
     loadParameterContextsSuccess,
-    parameterContextListingApiError,
+    parameterContextListingSnackbarApiError,
+    parameterContextListingBannerApiError,
     pollParameterContextUpdateRequestSuccess,
     submitParameterContextUpdateRequest,
-    submitParameterContextUpdateRequestSuccess
+    submitParameterContextUpdateRequestSuccess,
+    deleteParameterContextUpdateRequestSuccess
 } from './parameter-context-listing.actions';
 import { ParameterContextUpdateRequestEntity, Revision } from 
'../../../../state/shared';
 
@@ -37,7 +39,6 @@ export const initialState: ParameterContextListingState = {
     updateRequestEntity: null,
     saving: false,
     loadedTimestamp: '',
-    error: null,
     status: 'pending'
 };
 
@@ -54,11 +55,9 @@ export const parameterContextListingReducer = createReducer(
         error: null,
         status: 'success' as const
     })),
-    on(parameterContextListingApiError, (state, { error }) => ({
+    on(parameterContextListingSnackbarApiError, 
parameterContextListingBannerApiError, (state) => ({
         ...state,
-        saving: false,
-        error,
-        status: 'error' as const
+        saving: false
     })),
     on(createParameterContext, (state) => ({
         ...state,
@@ -74,10 +73,15 @@ export const parameterContextListingReducer = createReducer(
         ...state,
         saving: true
     })),
-    on(submitParameterContextUpdateRequestSuccess, 
pollParameterContextUpdateRequestSuccess, (state, { response }) => ({
-        ...state,
-        updateRequestEntity: response.requestEntity
-    })),
+    on(
+        submitParameterContextUpdateRequestSuccess,
+        pollParameterContextUpdateRequestSuccess,
+        deleteParameterContextUpdateRequestSuccess,
+        (state, { response }) => ({
+            ...state,
+            updateRequestEntity: response.requestEntity
+        })
+    ),
     on(editParameterContextComplete, (state) => {
         return produce(state, (draftState) => {
             const updateRequestEntity: ParameterContextUpdateRequestEntity | 
null = draftState.updateRequestEntity;
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.selectors.ts
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.selectors.ts
index 6fbda6645b..622429a95f 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.selectors.ts
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/parameter-contexts/state/parameter-context-listing/parameter-context-listing.selectors.ts
@@ -54,6 +54,11 @@ export const selectParameterContexts = createSelector(
     (state: ParameterContextListingState) => state.parameterContexts
 );
 
+export const selectParameterContextStatus = createSelector(
+    selectParameterContextListingState,
+    (state: ParameterContextListingState) => state.status
+);
+
 export const selectContext = (id: string) =>
     createSelector(selectParameterContexts, (parameterContexts: 
ParameterContextEntity[]) =>
         parameterContexts.find((entity) => id == entity.id)
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 4942a4d721..422f0ac108 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
@@ -17,6 +17,7 @@
 
 <h2 mat-dialog-title>{{ this.isNew ? 'Add' : 'Edit' }} Parameter Context</h2>
 <form class="parameter-context-edit-form" 
[formGroup]="editParameterContextForm">
+    <error-banner></error-banner>
     @if ((updateRequest | async)!; as requestEntity) {
         <mat-dialog-content>
             <div class="results-content flex gap-x-8">
@@ -26,12 +27,21 @@
                         @for (updateStep of requestEntity.request.updateSteps; 
track updateStep) {
                             <div class="flex justify-between items-center">
                                 <div class="value">{{ updateStep.description 
}}</div>
-                                @if (updateStep.complete) {
-                                    <div class="fa fa-check complete"></div>
+                                @if (updateStep.failureReason) {
+                                    <div class="fa fa-times 
warn-default"></div>
                                 } @else {
-                                    <div class="fa fa-spin 
fa-circle-o-notch"></div>
+                                    @if (updateStep.complete) {
+                                        <div class="fa fa-check 
complete"></div>
+                                    } @else {
+                                        <div class="fa fa-spin 
fa-circle-o-notch"></div>
+                                    }
                                 }
                             </div>
+                            @if (updateStep.failureReason) {
+                                <div class="text-xs ml-2">
+                                    {{ updateStep.failureReason }}
+                                </div>
+                            }
                         }
                     </div>
                 </div>
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 b8920bec3f..123c703a87 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
@@ -40,6 +40,7 @@ import { ProcessGroupReferences } from 
'../process-group-references/process-grou
 import { ParameterContextInheritance } from 
'../parameter-context-inheritance/parameter-context-inheritance.component';
 import { ParameterReferences } from 
'../../../../../ui/common/parameter-references/parameter-references.component';
 import { RouterLink } from '@angular/router';
+import { ErrorBanner } from 
'../../../../../ui/common/error-banner/error-banner.component';
 
 @Component({
     selector: 'edit-parameter-context',
@@ -61,7 +62,8 @@ import { RouterLink } from '@angular/router';
         ProcessGroupReferences,
         ParameterContextInheritance,
         ParameterReferences,
-        RouterLink
+        RouterLink,
+        ErrorBanner
     ],
     styleUrls: ['./edit-parameter-context.component.scss']
 })
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.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/parameter-context-table/parameter-context-table.component.ts
index c9d9aa534b..46792e3485 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.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/parameter-context-table/parameter-context-table.component.ts
@@ -98,7 +98,7 @@ export class ParameterContextTable {
     }
 
     canManageAccessPolicies(): boolean {
-        return this.flowConfiguration.supportsManagedAuthorizer && 
this.currentUser.tenantsPermissions.canRead;
+        return this.flowConfiguration?.supportsManagedAuthorizer && 
this.currentUser.tenantsPermissions.canRead;
     }
 
     canGoToParameterProvider(entity: ParameterContextEntity): boolean {
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/disable-controller-service/disable-controller-service.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/disable-controller-service/disable-controller-service.component.html
index af84fcf9fc..43c70c827e 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/disable-controller-service/disable-controller-service.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/disable-controller-service/disable-controller-service.component.html
@@ -143,6 +143,6 @@
     <div class="fa fa-check complete"></div>
 </ng-template>
 <ng-template #stepError>
-    <div class="fa fa-times text-red-400"></div>
+    <div class="fa fa-times warn-default"></div>
 </ng-template>
 <ng-template #stepNotStarted><div class="w-3.5"></div></ng-template>
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/enable-controller-service/enable-controller-service.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/enable-controller-service/enable-controller-service.component.html
index 1abf1dbc34..f65d7a5e19 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/controller-service/enable-controller-service/enable-controller-service.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/enable-controller-service/enable-controller-service.component.html
@@ -164,6 +164,6 @@
     <div class="fa fa-check complete"></div>
 </ng-template>
 <ng-template #stepError>
-    <div class="fa fa-times text-red-400"></div>
+    <div class="fa fa-times warn-default"></div>
 </ng-template>
 <ng-template #stepNotStarted><div class="w-3.5"></div></ng-template>
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 8463bf2720..e8d232aece 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
@@ -287,6 +287,7 @@
         fill: $accent-palette-lighter !important;
     }
 
+    .warn-default,
     .stale,
     .locally-modified-and-stale {
         color: $warn-palette-default !important;
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/utils.scss
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/utils.scss
index 3e6b318801..d6bc19345f 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/utils.scss
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/utils.scss
@@ -85,7 +85,10 @@
     $color-palette: map.get($theme, $palette);
 
     $default: mat.get-color-from-palette($color-palette, default);
-    $high-contrast: mat.get-color-from-palette($color-palette, 
if(luminosity($default) > luminosity($surface), lighter, darker));
+    $high-contrast: mat.get-color-from-palette(
+        $color-palette,
+        if(luminosity($default) > luminosity($surface), lighter, darker)
+    );
     $on-surface: ensure-contrast($default, $surface, $high-contrast);
 
     @return $on-surface;


Reply via email to