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 a230eba67b NIFI-13100: Updating API response error handling for canvas 
based actions (#8702)
a230eba67b is described below

commit a230eba67ba29f7c6a2aa9042a74245d1195e0d2
Author: Matt Gilman <[email protected]>
AuthorDate: Mon Apr 29 14:15:28 2024 -0400

    NIFI-13100: Updating API response error handling for canvas based actions 
(#8702)
    
    * NIFI-13100:
    - Updating API response error handling for canvas based actions.
    
    * NIFI-13100:
    - Stopping polling when change version and revert changes fails.
    
    * NIFI-13100:
    - Fixing formatting.
    
    
    This closes #8702
---
 .../service/behavior/draggable-behavior.service.ts |   6 +-
 .../service/canvas-context-menu.service.ts         |  18 +-
 .../service/manager/connection-manager.service.ts  |   6 +-
 .../service/manager/label-manager.service.ts       |   5 +-
 .../pages/flow-designer/state/flow/flow.actions.ts |  11 +-
 .../pages/flow-designer/state/flow/flow.effects.ts | 363 +++++++++++++--------
 .../pages/flow-designer/state/flow/flow.reducer.ts |  21 +-
 .../flow-designer/state/flow/flow.selectors.ts     |   4 -
 .../app/pages/flow-designer/state/flow/index.ts    |  16 +-
 .../operation-control.component.ts                 |  12 +-
 .../new-canvas-item/new-canvas-item.component.ts   |  19 +-
 .../create-connection.component.html               |   1 +
 .../create-connection.component.ts                 |   4 +-
 .../edit-connection/edit-connection.component.html |   1 +
 .../edit-connection/edit-connection.component.ts   |   7 +-
 .../items/label/edit-label/edit-label.component.ts |   3 +-
 .../items/port/edit-port/edit-port.component.ts    |   3 +-
 .../edit-process-group.component.html              |   1 +
 .../edit-process-group.component.spec.ts           |   3 +
 .../edit-process-group.component.ts                |   4 +-
 20 files changed, 293 insertions(+), 215 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/behavior/draggable-behavior.service.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/behavior/draggable-behavior.service.ts
index c68f692c87..5404e91769 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/behavior/draggable-behavior.service.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/behavior/draggable-behavior.service.ts
@@ -322,7 +322,8 @@ export class DraggableBehavior {
             },
             restoreOnFailure: {
                 position: d.position
-            }
+            },
+            errorStrategy: 'snackbar'
         };
     }
 
@@ -361,7 +362,8 @@ export class DraggableBehavior {
             },
             restoreOnFailure: {
                 bends: connection.bends
-            }
+            },
+            errorStrategy: 'snackbar'
         };
     }
 
diff --git 
a/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-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/canvas-context-menu.service.ts
index 938152634a..3e707b2853 100644
--- 
a/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-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/canvas-context-menu.service.ts
@@ -599,7 +599,8 @@ export class CanvasContextMenu implements 
ContextMenuDefinitionProvider {
                                 id: d.id,
                                 uri: d.uri,
                                 type: d.type,
-                                revision: this.client.getRevision(d)
+                                revision: this.client.getRevision(d),
+                                errorStrategy: 'snackbar'
                             });
                         });
                         this.store.dispatch(
@@ -640,7 +641,8 @@ export class CanvasContextMenu implements 
ContextMenuDefinitionProvider {
                                 id: d.id,
                                 uri: d.uri,
                                 type: d.type,
-                                revision: this.client.getRevision(d)
+                                revision: this.client.getRevision(d),
+                                errorStrategy: 'snackbar'
                             });
                         });
                         this.store.dispatch(
@@ -710,7 +712,8 @@ export class CanvasContextMenu implements 
ContextMenuDefinitionProvider {
                                 id: d.id,
                                 uri: d.uri,
                                 type: d.type,
-                                revision: this.client.getRevision(d)
+                                revision: this.client.getRevision(d),
+                                errorStrategy: 'snackbar'
                             });
                         });
                         this.store.dispatch(
@@ -741,7 +744,8 @@ export class CanvasContextMenu implements 
ContextMenuDefinitionProvider {
                                 id: d.id,
                                 uri: d.uri,
                                 type: d.type,
-                                revision: this.client.getRevision(d)
+                                revision: this.client.getRevision(d),
+                                errorStrategy: 'snackbar'
                             });
                         });
                         this.store.dispatch(
@@ -768,7 +772,8 @@ export class CanvasContextMenu implements 
ContextMenuDefinitionProvider {
                             id: d.id,
                             uri: d.uri,
                             type: d.type,
-                            revision: this.client.getRevision(d)
+                            revision: this.client.getRevision(d),
+                            errorStrategy: 'snackbar'
                         });
                     });
 
@@ -796,7 +801,8 @@ export class CanvasContextMenu implements 
ContextMenuDefinitionProvider {
                             id: d.id,
                             uri: d.uri,
                             type: d.type,
-                            revision: this.client.getRevision(d)
+                            revision: this.client.getRevision(d),
+                            errorStrategy: 'snackbar'
                         });
                     });
                     this.store.dispatch(
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/manager/connection-manager.service.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/manager/connection-manager.service.ts
index 809f0ed027..eef4990c7b 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/manager/connection-manager.service.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/manager/connection-manager.service.ts
@@ -356,7 +356,8 @@ export class ConnectionManager {
                 disconnectedNodeAcknowledged: 
this.clusterConnectionService.isDisconnectionAcknowledged(),
                 component: connection
             },
-            restoreOnFailure: restoreOnFailure
+            restoreOnFailure: restoreOnFailure,
+            errorStrategy: 'snackbar'
         };
 
         // updateConnection is not needed here because we don't need any
@@ -2012,7 +2013,8 @@ export class ConnectionManager {
                                     type: ComponentType.Connection,
                                     uri: connectionData.uri,
                                     previousDestination: 
connectionData.component.destination,
-                                    payload
+                                    payload,
+                                    errorStrategy: 'snackbar'
                                 }
                             })
                         );
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/manager/label-manager.service.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/manager/label-manager.service.ts
index cbdbb086dc..86428e57aa 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/manager/label-manager.service.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/manager/label-manager.service.ts
@@ -348,7 +348,7 @@ export class LabelManager {
                     different = true;
                 }
 
-                // only save the updated bends if necessary
+                // only save the updated dimensions if necessary
                 if (different) {
                     const updateLabel: UpdateComponentRequest = {
                         id: labelData.id,
@@ -368,7 +368,8 @@ export class LabelManager {
                                 width: widthSet ? labelData.component.width : 
LabelManager.INITIAL_WIDTH,
                                 height: heightSet ? labelData.component.height 
: LabelManager.INITIAL_HEIGHT
                             }
-                        }
+                        },
+                        errorStrategy: 'snackbar'
                     };
 
                     self.store.dispatch(
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.actions.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.actions.ts
index 0a0f8f4af8..3471a4d2b0 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.actions.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.actions.ts
@@ -153,10 +153,6 @@ export const loadChildProcessGroupSuccess = createAction(
     props<{ response: ComponentEntity }>()
 );
 
-export const flowApiError = createAction(`${CANVAS_PREFIX} Flow Api Error`, 
props<{ error: string }>());
-
-export const clearFlowApiError = createAction(`${CANVAS_PREFIX} Clear Flow Api 
Error`);
-
 export const startProcessGroupPolling = createAction(`${CANVAS_PREFIX} Start 
Process Group Polling`);
 
 export const stopProcessGroupPolling = createAction(`${CANVAS_PREFIX} Stop 
Process Group Polling`);
@@ -766,11 +762,6 @@ export const saveToFlowRegistrySuccess = createAction(
     props<{ response: VersionControlInformationEntity }>()
 );
 
-export const flowVersionBannerError = createAction(
-    `${CANVAS_PREFIX} Flow Version Banner Error`,
-    props<{ error: string }>()
-);
-
 export const stopVersionControlRequest = createAction(
     `${CANVAS_PREFIX} Stop Version Control Request`,
     props<{ request: ConfirmStopVersionControlRequest }>()
@@ -788,6 +779,8 @@ export const stopVersionControlSuccess = createAction(
 
 export const flowSnackbarError = createAction(`${CANVAS_PREFIX} Flow Snackbar 
Error`, props<{ error: string }>());
 
+export const flowBannerError = createAction(`${CANVAS_PREFIX} Flow Banner 
Error`, props<{ error: string }>());
+
 export const openShowLocalChangesDialogRequest = createAction(
     `${CANVAS_PREFIX} Open Show Local Changes Dialog Request`,
     props<{ request: OpenLocalChangesDialogRequest }>()
diff --git 
a/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-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.effects.ts
index bbfe801474..a8d6206cba 100644
--- 
a/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-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.effects.ts
@@ -46,7 +46,6 @@ import {
     DeleteComponentResponse,
     GroupComponentsDialogRequest,
     ImportFromRegistryDialogRequest,
-    LoadProcessGroupRequest,
     LoadProcessGroupResponse,
     MoveComponentRequest,
     SaveVersionDialogRequest,
@@ -69,6 +68,7 @@ import {
     selectCopiedSnippet,
     selectCurrentParameterContext,
     selectCurrentProcessGroupId,
+    selectFlowLoadingStatus,
     selectInputPort,
     selectMaxZIndex,
     selectOutputPort,
@@ -130,6 +130,7 @@ import { ChangeComponentVersionDialog } from 
'../../../../ui/common/change-compo
 import { SnippetService } from '../../service/snippet.service';
 import { selectTransform } from '../transform/transform.selectors';
 import { EditLabel } from 
'../../ui/canvas/items/label/edit-label/edit-label.component';
+import { ErrorHelper } from '../../../../service/error-helper.service';
 
 @Injectable()
 export class FlowEffects {
@@ -150,7 +151,8 @@ export class FlowEffects {
         private dialog: MatDialog,
         private propertyTableHelperService: PropertyTableHelperService,
         private parameterHelperService: ParameterHelperService,
-        private extensionTypesService: ExtensionTypesService
+        private extensionTypesService: ExtensionTypesService,
+        private errorHelper: ErrorHelper
     ) {}
 
     reloadFlow$ = createEffect(() =>
@@ -174,7 +176,8 @@ export class FlowEffects {
         this.actions$.pipe(
             ofType(FlowActions.loadProcessGroup),
             map((action) => action.request),
-            switchMap((request: LoadProcessGroupRequest) =>
+            concatLatestFrom(() => this.store.select(selectFlowLoadingStatus)),
+            switchMap(([request, status]) =>
                 combineLatest([
                     this.flowService.getFlow(request.id),
                     this.flowService.getFlowStatus(),
@@ -190,7 +193,9 @@ export class FlowEffects {
                             }
                         });
                     }),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) =>
+                        of(this.errorHelper.handleLoadingError(status, 
errorResponse))
+                    )
                 )
             )
         )
@@ -257,7 +262,9 @@ export class FlowEffects {
 
                                 return FlowActions.openNewProcessGroupDialog({ 
request: dialogRequest });
                             }),
-                            catchError((error) => 
of(FlowActions.flowApiError({ error: error.error })))
+                            catchError((errorResponse: HttpErrorResponse) =>
+                                
of(this.snackBarOrFullScreenError(errorResponse))
+                            )
                         );
                     case ComponentType.RemoteProcessGroup:
                         return 
of(FlowActions.openNewRemoteProcessGroupDialog({ request }));
@@ -278,10 +285,12 @@ export class FlowEffects {
 
                                 return 
FlowActions.openImportFromRegistryDialog({ request: dialogRequest });
                             }),
-                            catchError((error) => 
of(FlowActions.flowApiError({ error: error.error })))
+                            catchError((errorResponse: HttpErrorResponse) =>
+                                
of(this.snackBarOrFullScreenError(errorResponse))
+                            )
                         );
                     default:
-                        return of(FlowActions.flowApiError({ error: 
'Unsupported type of Component.' }));
+                        return of(FlowActions.flowSnackbarError({ error: 
'Unsupported type of Component.' }));
                 }
             })
         )
@@ -326,7 +335,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -345,6 +354,7 @@ export class FlowEffects {
                         })
                         .afterClosed()
                         .subscribe(() => {
+                            
this.store.dispatch(ErrorActions.clearBannerErrors());
                             this.store.dispatch(FlowActions.setDragging({ 
dragging: false }));
                         });
                 })
@@ -367,7 +377,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.bannerOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -447,10 +457,10 @@ export class FlowEffects {
                                 }
                             });
                         }),
-                        catchError((error) => {
+                        catchError((errorResponse: HttpErrorResponse) => {
                             
this.store.dispatch(FlowActions.stopRemoteProcessGroupPolling());
 
-                            return of(FlowActions.flowApiError({ error: 
error.error }));
+                            return 
of(this.snackBarOrFullScreenError(errorResponse));
                         })
                     )
                 )
@@ -471,6 +481,7 @@ export class FlowEffects {
                         })
                         .afterClosed()
                         .subscribe(() => {
+                            
this.store.dispatch(ErrorActions.clearBannerErrors());
                             this.store.dispatch(FlowActions.setDragging({ 
dragging: false }));
                         });
                 })
@@ -493,7 +504,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.bannerOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -514,7 +525,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.bannerOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -542,7 +553,7 @@ export class FlowEffects {
                             request: dialogRequest
                         });
                     }),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -584,7 +595,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.bannerOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -633,7 +644,7 @@ export class FlowEffects {
                         tap({
                             error: (errorResponse: HttpErrorResponse) => {
                                 this.canvasUtils.removeTempEdge();
-                                
this.store.dispatch(FlowActions.flowSnackbarError({ error: errorResponse.error 
}));
+                                
this.store.dispatch(this.snackBarOrFullScreenError(errorResponse));
                             }
                         })
                     )
@@ -660,7 +671,7 @@ export class FlowEffects {
 
                     dialogReference.afterClosed().subscribe(() => {
                         this.canvasUtils.removeTempEdge();
-                        this.store.dispatch(FlowActions.clearFlowApiError());
+                        this.store.dispatch(ErrorActions.clearBannerErrors());
                     });
                 })
             ),
@@ -682,7 +693,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.bannerOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -702,7 +713,7 @@ export class FlowEffects {
                         .afterClosed()
                         .subscribe(() => {
                             this.store.dispatch(FlowActions.setDragging({ 
dragging: false }));
-                            
this.store.dispatch(FlowActions.clearFlowApiError());
+                            
this.store.dispatch(ErrorActions.clearBannerErrors());
                         });
                 })
             ),
@@ -724,7 +735,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.bannerOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -745,7 +756,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -766,7 +777,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -821,6 +832,7 @@ export class FlowEffects {
 
                         dialogReference.afterClosed().subscribe(() => {
                             this.store.dispatch(FlowActions.setDragging({ 
dragging: false }));
+                            
this.store.dispatch(ErrorActions.clearBannerErrors());
                         });
                     } else {
                         this.dialog
@@ -855,7 +867,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.bannerOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -1057,7 +1069,7 @@ export class FlowEffects {
                     case ComponentType.Label:
                         return of(FlowActions.openEditLabelDialog({ request 
}));
                     default:
-                        return of(FlowActions.flowApiError({ error: 
'Unsupported type of Component.' }));
+                        return of(FlowActions.flowSnackbarError({ error: 
'Unsupported type of Component.' }));
                 }
             })
         )
@@ -1078,13 +1090,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) =>
-                        of(
-                            FlowActions.flowApiError({
-                                error: error.error
-                            })
-                        )
-                    )
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -1103,7 +1109,7 @@ export class FlowEffects {
                         })
                         .afterClosed()
                         .subscribe(() => {
-                            
this.store.dispatch(FlowActions.clearFlowApiError());
+                            
this.store.dispatch(ErrorActions.clearBannerErrors());
                             this.store.dispatch(
                                 FlowActions.selectComponents({
                                     request: {
@@ -1135,7 +1141,7 @@ export class FlowEffects {
                         })
                         .afterClosed()
                         .subscribe(() => {
-                            
this.store.dispatch(FlowActions.clearFlowApiError());
+                            
this.store.dispatch(ErrorActions.clearBannerErrors());
                             this.store.dispatch(
                                 FlowActions.selectComponents({
                                     request: {
@@ -1185,7 +1191,7 @@ export class FlowEffects {
                                         }
                                     })
                                 );
-                                
this.store.dispatch(ErrorActions.snackBarError({ error: errorResponse.error }));
+                                
this.store.dispatch(this.snackBarOrFullScreenError(errorResponse));
                             }
                         })
                     )
@@ -1258,8 +1264,8 @@ export class FlowEffects {
                                 ];
                                 goTo(commands, 'Controller Service');
                             },
-                            error: () => {
-                                // TODO - handle error
+                            error: (errorResponse: HttpErrorResponse) => {
+                                
this.store.dispatch(this.snackBarOrFullScreenError(errorResponse));
                             }
                         });
                     };
@@ -1282,6 +1288,7 @@ export class FlowEffects {
                                         uri: request.uri,
                                         type: request.type,
                                         payload: 
updateProcessorRequest.payload,
+                                        errorStrategy: 'banner',
                                         postUpdateNavigation: 
updateProcessorRequest.postUpdateNavigation
                                     }
                                 })
@@ -1289,7 +1296,7 @@ export class FlowEffects {
                         });
 
                     editDialogReference.afterClosed().subscribe((response) => {
-                        this.store.dispatch(FlowActions.clearFlowApiError());
+                        this.store.dispatch(ErrorActions.clearBannerErrors());
 
                         if (response != 'ROUTED') {
                             this.store.dispatch(
@@ -1361,7 +1368,7 @@ export class FlowEffects {
                             });
                         }
 
-                        this.store.dispatch(FlowActions.clearFlowApiError());
+                        this.store.dispatch(ErrorActions.clearBannerErrors());
                         this.store.dispatch(
                             FlowActions.selectComponents({
                                 request: {
@@ -1410,14 +1417,15 @@ export class FlowEffects {
                                         id: request.entity.id,
                                         uri: request.uri,
                                         type: request.type,
-                                        payload
+                                        payload,
+                                        errorStrategy: 'banner'
                                     }
                                 })
                             );
                         });
 
                     editDialogReference.afterClosed().subscribe(() => {
-                        this.store.dispatch(FlowActions.clearFlowApiError());
+                        this.store.dispatch(ErrorActions.clearBannerErrors());
                         if (request.entity.id === currentProcessGroupId) {
                             this.store.dispatch(
                                 FlowActions.enterProcessGroup({
@@ -1480,14 +1488,15 @@ export class FlowEffects {
                                         id: request.entity.id,
                                         uri: request.uri,
                                         type: request.type,
-                                        payload
+                                        payload,
+                                        errorStrategy: 'banner'
                                     }
                                 })
                             );
                         });
 
                     editDialogReference.afterClosed().subscribe((response) => {
-                        this.store.dispatch(FlowActions.clearFlowApiError());
+                        this.store.dispatch(ErrorActions.clearBannerErrors());
 
                         if (response != 'ROUTED') {
                             this.store.dispatch(
@@ -1525,12 +1534,13 @@ export class FlowEffects {
                         };
                         return FlowActions.updateComponentSuccess({ response: 
updateComponentResponse });
                     }),
-                    catchError((error) => {
+                    catchError((errorResponse: HttpErrorResponse) => {
                         const updateComponentFailure: UpdateComponentFailure = 
{
                             id: request.id,
                             type: request.type,
+                            errorStrategy: request.errorStrategy,
                             restoreOnFailure: request.restoreOnFailure,
-                            error: error.error
+                            errorResponse
                         };
                         return of(FlowActions.updateComponentFailure({ 
response: updateComponentFailure }));
                     })
@@ -1560,7 +1570,13 @@ export class FlowEffects {
         this.actions$.pipe(
             ofType(FlowActions.updateComponentFailure),
             map((action) => action.response),
-            switchMap((response) => of(FlowActions.flowApiError({ error: 
response.error })))
+            switchMap((response) => {
+                if (response.errorStrategy === 'banner') {
+                    return 
of(this.bannerOrFullScreenError(response.errorResponse));
+                } else {
+                    return 
of(this.snackBarOrFullScreenError(response.errorResponse));
+                }
+            })
         )
     );
 
@@ -1580,12 +1596,13 @@ export class FlowEffects {
                         };
                         return FlowActions.updateProcessorSuccess({ response: 
updateComponentResponse });
                     }),
-                    catchError((error) => {
+                    catchError((errorResponse: HttpErrorResponse) => {
                         const updateComponentFailure: UpdateComponentFailure = 
{
                             id: request.id,
                             type: request.type,
+                            errorStrategy: request.errorStrategy,
                             restoreOnFailure: request.restoreOnFailure,
-                            error: error.error
+                            errorResponse
                         };
                         return of(FlowActions.updateComponentFailure({ 
response: updateComponentFailure }));
                     })
@@ -1638,7 +1655,7 @@ export class FlowEffects {
                             }
                         });
                     }),
-                    catchError((error) => of(FlowActions.flowApiError({ error 
})))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -1693,7 +1710,7 @@ export class FlowEffects {
                             }
                         });
                     }),
-                    catchError((error) => of(FlowActions.flowApiError({ error 
})))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -1713,7 +1730,7 @@ export class FlowEffects {
                             }
                         });
                     }),
-                    catchError((error) => of(FlowActions.flowApiError({ error 
})))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -1733,7 +1750,7 @@ export class FlowEffects {
                             }
                         });
                     }),
-                    catchError((error) => of(FlowActions.flowApiError({ error 
})))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -1755,7 +1772,7 @@ export class FlowEffects {
                         };
                         return FlowActions.updateConnectionSuccess({ response: 
updateComponentResponse });
                     }),
-                    catchError((error) => {
+                    catchError((errorResponse: HttpErrorResponse) => {
                         this.connectionManager.renderConnection(request.id, {
                             updatePath: true,
                             updateLabel: false
@@ -1764,8 +1781,9 @@ export class FlowEffects {
                         const updateComponentFailure: UpdateComponentFailure = 
{
                             id: request.id,
                             type: request.type,
+                            errorStrategy: request.errorStrategy,
                             restoreOnFailure: request.restoreOnFailure,
-                            error: error.error
+                            errorResponse
                         };
                         return of(FlowActions.updateComponentFailure({ 
response: updateComponentFailure }));
                     })
@@ -1896,7 +1914,7 @@ export class FlowEffects {
                             response: deleteResponses
                         });
                     }),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 );
             })
         )
@@ -1962,7 +1980,7 @@ export class FlowEffects {
                             
this.snippetService.copySnippet(response.snippet.id, pasteLocation, 
processGroupId)
                         ).pipe(map((response) => FlowActions.pasteSuccess({ 
response })));
                     }),
-                    catchError((error) => of(FlowActions.flowSnackbarError({ 
error: error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -2085,7 +2103,9 @@ export class FlowEffects {
                                 response: deleteResponses
                             });
                         }),
-                        catchError((error) => of(FlowActions.flowApiError({ 
error: error.error })))
+                        catchError((errorResponse: HttpErrorResponse) =>
+                            of(this.snackBarOrFullScreenError(errorResponse))
+                        )
                     );
                 } else {
                     const snippet: Snippet = requests.reduce(
@@ -2161,7 +2181,9 @@ export class FlowEffects {
                                 response: deleteResponses
                             });
                         }),
-                        catchError((error) => of(FlowActions.flowApiError({ 
error: error.error })))
+                        catchError((errorResponse: HttpErrorResponse) =>
+                            of(this.snackBarOrFullScreenError(errorResponse))
+                        )
                     );
                 }
             })
@@ -2405,11 +2427,11 @@ export class FlowEffects {
                                 })
                             );
                         },
-                        error: (error) => {
+                        error: (errorResponse: HttpErrorResponse) => {
                             this.store.dispatch(
                                 FlowActions.showOkDialog({
                                     title: 'Failed to Replay Event',
-                                    message: error.error
+                                    message: errorResponse.error
                                 })
                             );
                         }
@@ -2445,7 +2467,8 @@ export class FlowEffects {
                     FlowActions.enableComponent({
                         request: {
                             id: pgId,
-                            type: ComponentType.ProcessGroup
+                            type: ComponentType.ProcessGroup,
+                            errorStrategy: 'snackbar'
                         }
                     })
                 );
@@ -2486,9 +2509,13 @@ export class FlowEffects {
                                         }
                                     });
                                 }),
-                                catchError((errorResponse: HttpErrorResponse) 
=>
-                                    of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                                )
+                                catchError((errorResponse: HttpErrorResponse) 
=> {
+                                    if (request.errorStrategy === 'banner') {
+                                        return 
of(this.bannerOrFullScreenError(errorResponse));
+                                    } else {
+                                        return 
of(this.snackBarOrFullScreenError(errorResponse));
+                                    }
+                                })
                             );
                         }
                         return of(
@@ -2506,9 +2533,13 @@ export class FlowEffects {
                                     }
                                 });
                             }),
-                            catchError((errorResponse: HttpErrorResponse) =>
-                                of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                            )
+                            catchError((errorResponse: HttpErrorResponse) => {
+                                if (request.errorStrategy === 'banner') {
+                                    return 
of(this.bannerOrFullScreenError(errorResponse));
+                                } else {
+                                    return 
of(this.snackBarOrFullScreenError(errorResponse));
+                                }
+                            })
                         );
                     default:
                         return of(
@@ -2562,7 +2593,8 @@ export class FlowEffects {
                     FlowActions.disableComponent({
                         request: {
                             id: pgId,
-                            type: ComponentType.ProcessGroup
+                            type: ComponentType.ProcessGroup,
+                            errorStrategy: 'snackbar'
                         }
                     })
                 );
@@ -2603,9 +2635,13 @@ export class FlowEffects {
                                         }
                                     });
                                 }),
-                                catchError((errorResponse: HttpErrorResponse) 
=>
-                                    of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                                )
+                                catchError((errorResponse: HttpErrorResponse) 
=> {
+                                    if (request.errorStrategy === 'banner') {
+                                        return 
of(this.bannerOrFullScreenError(errorResponse));
+                                    } else {
+                                        return 
of(this.snackBarOrFullScreenError(errorResponse));
+                                    }
+                                })
                             );
                         }
                         return of(
@@ -2623,9 +2659,13 @@ export class FlowEffects {
                                     }
                                 });
                             }),
-                            catchError((errorResponse: HttpErrorResponse) =>
-                                of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                            )
+                            catchError((errorResponse: HttpErrorResponse) => {
+                                if (request.errorStrategy === 'banner') {
+                                    return 
of(this.bannerOrFullScreenError(errorResponse));
+                                } else {
+                                    return 
of(this.snackBarOrFullScreenError(errorResponse));
+                                }
+                            })
                         );
                     default:
                         return of(
@@ -2679,7 +2719,8 @@ export class FlowEffects {
                     FlowActions.startComponent({
                         request: {
                             id: pgId,
-                            type: ComponentType.ProcessGroup
+                            type: ComponentType.ProcessGroup,
+                            errorStrategy: 'snackbar'
                         }
                     })
                 );
@@ -2721,9 +2762,13 @@ export class FlowEffects {
                                         }
                                     });
                                 }),
-                                catchError((errorResponse: HttpErrorResponse) 
=>
-                                    of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                                )
+                                catchError((errorResponse: HttpErrorResponse) 
=> {
+                                    if (request.errorStrategy === 'banner') {
+                                        return 
of(this.bannerOrFullScreenError(errorResponse));
+                                    } else {
+                                        return 
of(this.snackBarOrFullScreenError(errorResponse));
+                                    }
+                                })
                             );
                         }
                         return of(
@@ -2744,9 +2789,13 @@ export class FlowEffects {
                                     }
                                 });
                             }),
-                            catchError((errorResponse: HttpErrorResponse) =>
-                                of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                            )
+                            catchError((errorResponse: HttpErrorResponse) => {
+                                if (request.errorStrategy === 'banner') {
+                                    return 
of(this.bannerOrFullScreenError(errorResponse));
+                                } else {
+                                    return 
of(this.snackBarOrFullScreenError(errorResponse));
+                                }
+                            })
                         );
                     default:
                         return of(
@@ -2800,7 +2849,8 @@ export class FlowEffects {
                     FlowActions.stopComponent({
                         request: {
                             id: pgId,
-                            type: ComponentType.ProcessGroup
+                            type: ComponentType.ProcessGroup,
+                            errorStrategy: 'snackbar'
                         }
                     })
                 );
@@ -2842,9 +2892,13 @@ export class FlowEffects {
                                         }
                                     });
                                 }),
-                                catchError((errorResponse: HttpErrorResponse) 
=>
-                                    of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                                )
+                                catchError((errorResponse: HttpErrorResponse) 
=> {
+                                    if (request.errorStrategy === 'banner') {
+                                        return 
of(this.bannerOrFullScreenError(errorResponse));
+                                    } else {
+                                        return 
of(this.snackBarOrFullScreenError(errorResponse));
+                                    }
+                                })
                             );
                         }
                         return of(
@@ -2865,9 +2919,13 @@ export class FlowEffects {
                                     }
                                 });
                             }),
-                            catchError((errorResponse: HttpErrorResponse) =>
-                                of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                            )
+                            catchError((errorResponse: HttpErrorResponse) => {
+                                if (request.errorStrategy === 'banner') {
+                                    return 
of(this.bannerOrFullScreenError(errorResponse));
+                                } else {
+                                    return 
of(this.snackBarOrFullScreenError(errorResponse));
+                                }
+                            })
                         );
                     default:
                         return of(
@@ -2896,13 +2954,7 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((errorResponse: HttpErrorResponse) =>
-                        of(
-                            FlowActions.flowSnackbarError({
-                                error: errorResponse.error
-                            })
-                        )
-                    )
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -2955,10 +3007,9 @@ export class FlowEffects {
                             }
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 );
-            }),
-            catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+            })
         )
     );
 
@@ -2973,7 +3024,7 @@ export class FlowEffects {
                             response
                         })
                     ),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 );
             })
         )
@@ -3001,7 +3052,7 @@ export class FlowEffects {
 
                         return FlowActions.openSaveVersionDialog({ request: 
dialogRequest });
                     }),
-                    catchError((error) => of(FlowActions.flowSnackbarError({ 
error: error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 );
             })
         )
@@ -3083,7 +3134,7 @@ export class FlowEffects {
                     map((response) => {
                         return FlowActions.saveToFlowRegistrySuccess({ 
response });
                     }),
-                    catchError((error) => 
of(FlowActions.flowVersionBannerError({ error: error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.bannerOrFullScreenError(errorResponse)))
                 );
             })
         )
@@ -3099,17 +3150,47 @@ export class FlowEffects {
         )
     );
 
-    flowVersionBannerError$ = createEffect(() =>
+    flowBannerError$ = createEffect(() =>
         this.actions$.pipe(
-            ofType(FlowActions.flowVersionBannerError),
+            ofType(FlowActions.flowBannerError),
             map((action) => action.error),
             switchMap((error) => of(ErrorActions.addBannerError({ error })))
         )
     );
 
+    flowSnackbarError$ = createEffect(() =>
+        this.actions$.pipe(
+            ofType(FlowActions.flowSnackbarError),
+            map((action) => action.error),
+            tap(() => {
+                this.dialog.closeAll();
+            }),
+            switchMap((error) => of(ErrorActions.snackBarError({ error })))
+        )
+    );
+
+    private bannerOrFullScreenError(errorResponse: HttpErrorResponse) {
+        if (this.errorHelper.showErrorInContext(errorResponse.status)) {
+            return FlowActions.flowBannerError({
+                error: errorResponse.error
+            });
+        } else {
+            return ErrorActions.fullScreenError(errorResponse.error);
+        }
+    }
+
+    private snackBarOrFullScreenError(errorResponse: HttpErrorResponse) {
+        if (this.errorHelper.showErrorInContext(errorResponse.status)) {
+            return FlowActions.flowSnackbarError({ error: errorResponse.error 
});
+        } else {
+            return ErrorActions.fullScreenError(errorResponse.error);
+        }
+    }
+
     /////////////////////////////////
     // Stop version control effects
     /////////////////////////////////
+
     stopVersionControlRequest$ = createEffect(
         () =>
             this.actions$.pipe(
@@ -3143,7 +3224,7 @@ export class FlowEffects {
                         dialogRef.close();
                     });
                 }),
-                catchError((error) => of(FlowActions.flowSnackbarError({ 
error: error.error })))
+                catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
             ),
         { dispatch: false }
     );
@@ -3161,7 +3242,7 @@ export class FlowEffects {
                         };
                         return FlowActions.stopVersionControlSuccess({ 
response: stopResponse });
                     }),
-                    catchError((errorResponse) => 
of(FlowActions.flowSnackbarError({ error: errorResponse.error })))
+                    catchError((errorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -3185,6 +3266,7 @@ export class FlowEffects {
     /////////////////////////////////
     // Commit local changes effects
     /////////////////////////////////
+
     openCommitLocalChangesDialogRequest$ = createEffect(() =>
         this.actions$.pipe(
             ofType(FlowActions.openCommitLocalChangesDialogRequest),
@@ -3201,7 +3283,7 @@ export class FlowEffects {
 
                         return FlowActions.openSaveVersionDialog({ request: 
dialogRequest });
                     }),
-                    catchError((error) => of(FlowActions.flowApiError({ error: 
error.error })))
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 );
             })
         )
@@ -3244,6 +3326,7 @@ export class FlowEffects {
     /////////////////////////////
     // Change version effects
     /////////////////////////////
+
     openChangeVersionDialogRequest$ = createEffect(() =>
         this.actions$.pipe(
             ofType(FlowActions.openChangeVersionDialogRequest),
@@ -3252,7 +3335,7 @@ export class FlowEffects {
                 
from(this.flowService.getVersionInformation(request.processGroupId)).pipe(
                     tap({
                         error: (errorResponse: HttpErrorResponse) =>
-                            
this.store.dispatch(FlowActions.flowSnackbarError({ error: errorResponse.error 
}))
+                            
this.store.dispatch(this.snackBarOrFullScreenError(errorResponse))
                     })
                 )
             ),
@@ -3272,7 +3355,7 @@ export class FlowEffects {
                             })
                         ),
                         catchError((errorResponse: HttpErrorResponse) =>
-                            of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
+                            of(this.snackBarOrFullScreenError(errorResponse))
                         )
                     );
                 } else {
@@ -3338,9 +3421,7 @@ export class FlowEffects {
             switchMap((request) => {
                 return 
from(this.flowService.initiateChangeVersionUpdate(request)).pipe(
                     map((flowUpdate) => FlowActions.changeVersionSuccess({ 
response: flowUpdate })),
-                    catchError((errorResponse: HttpErrorResponse) =>
-                        of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                    )
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 );
             })
         )
@@ -3377,9 +3458,10 @@ export class FlowEffects {
                 return from(
                     
this.flowService.getChangeVersionUpdateRequest(changeVersionRequest.request.requestId).pipe(
                         map((response) => 
FlowActions.pollChangeVersionSuccess({ response })),
-                        catchError((errorResponse: HttpErrorResponse) =>
-                            of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                        )
+                        catchError((errorResponse: HttpErrorResponse) => {
+                            
this.store.dispatch(FlowActions.stopPollingChangeVersion());
+                            return 
of(this.snackBarOrFullScreenError(errorResponse));
+                        })
                     )
                 );
             })
@@ -3402,28 +3484,16 @@ export class FlowEffects {
             switchMap((response) =>
                 
from(this.flowService.deleteChangeVersionUpdateRequest(response.request.requestId)).pipe(
                     map(() => FlowActions.reloadFlow()),
-                    catchError((errorResponse: HttpErrorResponse) =>
-                        of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                    )
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
     );
 
-    flowSnackbarError$ = createEffect(() =>
-        this.actions$.pipe(
-            ofType(FlowActions.flowSnackbarError),
-            map((action) => action.error),
-            tap(() => {
-                this.dialog.closeAll();
-            }),
-            switchMap((error) => of(ErrorActions.snackBarError({ error })))
-        )
-    );
-
     ///////////////////////////////
     // Show local changes effects
     ///////////////////////////////
+
     openLocalChangesDialogRequest = (mode: 'SHOW' | 'REVERT') =>
         createEffect(() =>
             this.actions$.pipe(
@@ -3448,7 +3518,7 @@ export class FlowEffects {
                             })
                         ),
                         catchError((errorResponse: HttpErrorResponse) =>
-                            of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
+                            of(this.snackBarOrFullScreenError(errorResponse))
                         )
                     )
                 )
@@ -3497,6 +3567,7 @@ export class FlowEffects {
     /////////////////////////////////
     // Revert version effects
     /////////////////////////////////
+
     openRevertLocalChangesDialogRequest$ = 
this.openLocalChangesDialogRequest('REVERT');
 
     openRevertChangesProgressDialog$ = createEffect(() =>
@@ -3525,9 +3596,7 @@ export class FlowEffects {
             switchMap((request) => {
                 return 
from(this.flowService.initiateRevertFlowVersion(request)).pipe(
                     map((flowUpdate) => FlowActions.revertChangesSuccess({ 
response: flowUpdate })),
-                    catchError((errorResponse: HttpErrorResponse) =>
-                        of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                    )
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 );
             })
         )
@@ -3564,9 +3633,10 @@ export class FlowEffects {
                 return from(
                     
this.flowService.getRevertChangesUpdateRequest(changeVersionRequest.request.requestId).pipe(
                         map((response) => 
FlowActions.pollRevertChangesSuccess({ response })),
-                        catchError((errorResponse: HttpErrorResponse) =>
-                            of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                        )
+                        catchError((errorResponse: HttpErrorResponse) => {
+                            
this.store.dispatch(FlowActions.stopPollingRevertChanges());
+                            return 
of(this.snackBarOrFullScreenError(errorResponse));
+                        })
                     )
                 );
             })
@@ -3589,9 +3659,7 @@ export class FlowEffects {
             switchMap((response) =>
                 
from(this.flowService.deleteRevertChangesUpdateRequest(response.request.requestId)).pipe(
                     map(() => FlowActions.reloadFlow()),
-                    catchError((errorResponse: HttpErrorResponse) =>
-                        of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                    )
+                    catchError((errorResponse: HttpErrorResponse) => 
of(this.snackBarOrFullScreenError(errorResponse)))
                 )
             )
         )
@@ -3627,7 +3695,8 @@ export class FlowEffects {
                             id: request.id,
                             zIndex: maxZIndex + 1
                         }
-                    }
+                    },
+                    errorStrategy: 'snackbar'
                 };
 
                 return 
from(this.flowService.updateComponent(updateRequest)).pipe(
@@ -3639,9 +3708,16 @@ export class FlowEffects {
                         };
                         return FlowActions.updateComponentSuccess({ response: 
updateResponse });
                     }),
-                    catchError((errorResponse: HttpErrorResponse) =>
-                        of(FlowActions.flowSnackbarError({ error: 
errorResponse.error }))
-                    )
+                    catchError((errorResponse: HttpErrorResponse) => {
+                        const updateComponentFailure: UpdateComponentFailure = 
{
+                            id: updateRequest.id,
+                            type: updateRequest.type,
+                            errorStrategy: updateRequest.errorStrategy,
+                            restoreOnFailure: updateRequest.restoreOnFailure,
+                            errorResponse
+                        };
+                        return of(FlowActions.updateComponentFailure({ 
response: updateComponentFailure }));
+                    })
                 );
             })
         )
@@ -3663,7 +3739,7 @@ export class FlowEffects {
                         ),
                         tap({
                             error: (errorResponse: HttpErrorResponse) => {
-                                
this.store.dispatch(FlowActions.flowSnackbarError({ error: errorResponse.error 
}));
+                                
this.store.dispatch(this.snackBarOrFullScreenError(errorResponse));
                             }
                         })
                     )
@@ -3687,7 +3763,8 @@ export class FlowEffects {
                                             id: request.fetchRequest.id
                                         },
                                         revision: request.fetchRequest.revision
-                                    }
+                                    },
+                                    errorStrategy: 'snackbar'
                                 }
                             })
                         );
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.reducer.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.reducer.ts
index 3ce6560e2f..962ae96966 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.reducer.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.reducer.ts
@@ -19,7 +19,6 @@ import { createReducer, on } from '@ngrx/store';
 import {
     changeVersionComplete,
     changeVersionSuccess,
-    clearFlowApiError,
     copySuccess,
     createComponentComplete,
     createComponentSuccess,
@@ -36,8 +35,8 @@ import {
     enableComponent,
     enableComponentSuccess,
     enableProcessGroupSuccess,
-    flowApiError,
-    flowVersionBannerError,
+    flowBannerError,
+    flowSnackbarError,
     groupComponents,
     groupComponentsSuccess,
     loadChildProcessGroupSuccess,
@@ -163,7 +162,6 @@ export const initialState: FlowState = {
     allowTransition: false,
     navigationCollapsed: false,
     operationCollapsed: false,
-    error: null,
     status: 'pending'
 };
 
@@ -244,17 +242,11 @@ export const flowReducer = createReducer(
             }
         });
     }),
-    on(flowApiError, (state, { error }) => ({
+    on(flowBannerError, flowSnackbarError, (state) => ({
         ...state,
         dragging: false,
         saving: false,
-        error: error,
-        status: 'error' as const
-    })),
-    on(clearFlowApiError, (state) => ({
-        ...state,
-        error: null,
-        status: 'pending' as const
+        versionSaving: false
     })),
     on(
         createProcessor,
@@ -449,7 +441,6 @@ export const flowReducer = createReducer(
             });
         }
     ),
-
     on(runOnceSuccess, (state, { response }) => {
         return produce(state, (draftState) => {
             const collection: any[] | null = 
getComponentCollection(draftState, ComponentType.Processor);
@@ -528,10 +519,6 @@ export const flowReducer = createReducer(
     on(changeVersionComplete, revertChangesComplete, (state) => ({
         ...state,
         changeVersionRequest: null
-    })),
-    on(flowVersionBannerError, (state) => ({
-        ...state,
-        versionSaving: false
     }))
 );
 
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.selectors.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.selectors.ts
index 536b5378f8..88f99b1f6f 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.selectors.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.selectors.ts
@@ -30,10 +30,6 @@ export const selectChangeVersionRequest = createSelector(
     (state: FlowState) => state.changeVersionRequest
 );
 
-export const selectFlow = createSelector(selectFlowState, (state: FlowState) 
=> state.flow);
-
-export const selectApiError = createSelector(selectFlowState, (state: 
FlowState) => state.error);
-
 export const selectSaving = createSelector(selectFlowState, (state: FlowState) 
=> state.saving);
 
 export const selectVersionSaving = createSelector(selectFlowState, (state: 
FlowState) => state.versionSaving);
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/index.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/index.ts
index a44d271245..5cc8372a0e 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/index.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/index.ts
@@ -31,6 +31,7 @@ import {
     VersionedFlowSnapshotMetadataEntity
 } from '../../../../state/shared';
 import { ParameterContextEntity } from 
'../../../parameter-contexts/state/parameter-context-listing';
+import { HttpErrorResponse } from '@angular/common/http';
 
 export const flowFeatureKey = 'flowState';
 
@@ -395,6 +396,7 @@ export interface UpdateComponentRequest {
     type: ComponentType;
     uri: string;
     payload: any;
+    errorStrategy: 'snackbar' | 'banner';
     restoreOnFailure?: any;
     postUpdateNavigation?: string[];
 }
@@ -408,9 +410,10 @@ export interface UpdateComponentResponse {
 }
 
 export interface UpdateComponentFailure {
-    error: string;
+    errorResponse: HttpErrorResponse;
     id: string;
     type: ComponentType;
+    errorStrategy: 'snackbar' | 'banner';
     restoreOnFailure?: any;
 }
 
@@ -624,11 +627,10 @@ export interface FlowState {
     saving: boolean;
     navigationCollapsed: boolean;
     operationCollapsed: boolean;
-    error: string | null;
     versionSaving: boolean;
     changeVersionRequest: FlowUpdateRequestEntity | null;
     copiedSnippet: CopiedSnippet | null;
-    status: 'pending' | 'loading' | 'error' | 'success';
+    status: 'pending' | 'loading' | 'success';
 }
 
 export interface RunOnceRequest {
@@ -643,6 +645,7 @@ export interface RunOnceResponse {
 export interface EnableProcessGroupRequest {
     id: string;
     type: ComponentType;
+    errorStrategy: 'snackbar' | 'banner';
 }
 
 export interface EnableComponentRequest {
@@ -650,6 +653,7 @@ export interface EnableComponentRequest {
     uri: string;
     type: ComponentType;
     revision: Revision;
+    errorStrategy: 'snackbar' | 'banner';
 }
 
 export interface EnableComponentsRequest {
@@ -672,6 +676,7 @@ export interface EnableProcessGroupResponse {
 export interface DisableProcessGroupRequest {
     id: string;
     type: ComponentType;
+    errorStrategy: 'snackbar' | 'banner';
 }
 
 export interface DisableComponentRequest {
@@ -679,6 +684,7 @@ export interface DisableComponentRequest {
     uri: string;
     type: ComponentType;
     revision: Revision;
+    errorStrategy: 'snackbar' | 'banner';
 }
 
 export interface DisableComponentsRequest {
@@ -701,6 +707,7 @@ export interface DisableProcessGroupResponse {
 export interface StartProcessGroupRequest {
     id: string;
     type: ComponentType;
+    errorStrategy: 'snackbar' | 'banner';
 }
 
 export interface StartComponentRequest {
@@ -708,6 +715,7 @@ export interface StartComponentRequest {
     uri: string;
     type: ComponentType;
     revision: Revision;
+    errorStrategy: 'snackbar' | 'banner';
 }
 
 export interface StartComponentsRequest {
@@ -752,11 +760,13 @@ export interface StopComponentRequest {
     uri: string;
     type: ComponentType;
     revision: Revision;
+    errorStrategy: 'snackbar' | 'banner';
 }
 
 export interface StopProcessGroupRequest {
     id: string;
     type: ComponentType;
+    errorStrategy: 'snackbar' | 'banner';
 }
 
 export interface StopComponentResponse {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/graph-controls/operation-control/operation-control.component.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/graph-controls/operation-control/operation-control.component.ts
index 42bdbdcd56..295af07d6a 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/graph-controls/operation-control/operation-control.component.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/graph-controls/operation-control/operation-control.component.ts
@@ -289,7 +289,8 @@ export class OperationControl {
                     id: d.id,
                     uri: d.uri,
                     type: d.type,
-                    revision: this.client.getRevision(d)
+                    revision: this.client.getRevision(d),
+                    errorStrategy: 'snackbar'
                 });
             });
             this.store.dispatch(
@@ -318,7 +319,8 @@ export class OperationControl {
                     id: d.id,
                     uri: d.uri,
                     type: d.type,
-                    revision: this.client.getRevision(d)
+                    revision: this.client.getRevision(d),
+                    errorStrategy: 'snackbar'
                 });
             });
             this.store.dispatch(
@@ -347,7 +349,8 @@ export class OperationControl {
                     id: d.id,
                     uri: d.uri,
                     type: d.type,
-                    revision: this.client.getRevision(d)
+                    revision: this.client.getRevision(d),
+                    errorStrategy: 'snackbar'
                 });
             });
             this.store.dispatch(
@@ -376,7 +379,8 @@ export class OperationControl {
                     id: d.id,
                     uri: d.uri,
                     type: d.type,
-                    revision: this.client.getRevision(d)
+                    revision: this.client.getRevision(d),
+                    errorStrategy: 'snackbar'
                 });
             });
             this.store.dispatch(
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/header/new-canvas-item/new-canvas-item.component.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/header/new-canvas-item/new-canvas-item.component.ts
index 6a42dc247a..04a476f6ca 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/header/new-canvas-item/new-canvas-item.component.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/header/new-canvas-item/new-canvas-item.component.ts
@@ -97,26 +97,11 @@ export class NewCanvasItem {
                     }
                 })
             );
+        } else {
+            this.store.dispatch(setDragging({ dragging: false }));
         }
 
         // reset dragging state
         event.source._dragRef.reset();
     }
-
-    /**
-     * TODO - Improve drag boundary by computing the drag render position...
-     *
-     * [cdkDragConstrainPosition]="computeDragRenderPos.bind(this)"
-     *
-     * @param pos
-     * @param dragRef
-     */
-    // computeDragRenderPos(pos: any, dragRef: any) {
-    //     const canvasContainer: any = 
document.getElementById('canvas-container');
-    //     const rect = canvasContainer.getBoundingClientRect();
-    //     return {
-    //         x: pos.x,
-    //         y: pos.y < rect.y ? rect.y : pos.y
-    //     }
-    // }
 }
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.html
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.html
index 2ddddf9350..82a73182ec 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.html
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.html
@@ -18,6 +18,7 @@
 <h2 mat-dialog-title>Create Connection</h2>
 @if (breadcrumbs$ | async; as breadcrumbs) {
     <form class="create-connection-form" [formGroup]="createConnectionForm">
+        <error-banner></error-banner>
         <mat-dialog-content>
             <mat-tab-group>
                 <mat-tab label="Details">
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.ts
index f0207890b7..020368e86f 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.ts
@@ -57,6 +57,7 @@ import { DestinationRemoteProcessGroup } from 
'../destination/destination-remote
 import { BreadcrumbEntity } from '../../../../../state/shared';
 import { ClusterConnectionService } from 
'../../../../../../../service/cluster-connection.service';
 import { CanvasUtils } from '../../../../../service/canvas-utils.service';
+import { ErrorBanner } from 
'../../../../../../../ui/common/error-banner/error-banner.component';
 
 @Component({
     selector: 'create-connection',
@@ -85,7 +86,8 @@ import { CanvasUtils } from 
'../../../../../service/canvas-utils.service';
         SourceProcessGroup,
         DestinationProcessGroup,
         SourceRemoteProcessGroup,
-        DestinationRemoteProcessGroup
+        DestinationRemoteProcessGroup,
+        ErrorBanner
     ],
     templateUrl: './create-connection.component.html',
     styleUrls: ['./create-connection.component.scss']
diff --git 
a/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-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 889881b1c3..18d1c4edc1 100644
--- 
a/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-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
@@ -19,6 +19,7 @@
     {{ connectionReadonly || sourceReadonly || destinationReadonly ? 
'Connection Details' : 'Edit Connection' }}
 </h2>
 <form class="edit-connection-form" [formGroup]="editConnectionForm">
+    <error-banner></error-banner>
     <mat-dialog-content>
         <mat-tab-group>
             <mat-tab label="Details">
diff --git 
a/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-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 6db3584089..bd2e1b53ad 100644
--- 
a/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-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
@@ -55,6 +55,7 @@ import { DestinationProcessGroup } from 
'../destination/destination-process-grou
 import { SourceRemoteProcessGroup } from 
'../source/source-remote-process-group/source-remote-process-group.component';
 import { DestinationRemoteProcessGroup } from 
'../destination/destination-remote-process-group/destination-remote-process-group.component';
 import { BreadcrumbEntity } from '../../../../../state/shared';
+import { ErrorBanner } from 
'../../../../../../../ui/common/error-banner/error-banner.component';
 
 @Component({
     selector: 'edit-connection',
@@ -83,7 +84,8 @@ import { BreadcrumbEntity } from 
'../../../../../state/shared';
         SourceProcessGroup,
         DestinationProcessGroup,
         SourceRemoteProcessGroup,
-        DestinationRemoteProcessGroup
+        DestinationRemoteProcessGroup,
+        ErrorBanner
     ],
     templateUrl: './edit-connection.component.html',
     styleUrls: ['./edit-connection.component.scss']
@@ -414,7 +416,8 @@ export class EditConnectionComponent {
                     type: ComponentType.Connection,
                     uri: this.dialogRequest.entity.uri,
                     previousDestination: this.previousDestination,
-                    payload
+                    payload,
+                    errorStrategy: 'banner'
                 }
             })
         );
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/label/edit-label/edit-label.component.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/label/edit-label/edit-label.component.ts
index abf2ed0ce9..116c24719f 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/label/edit-label/edit-label.component.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/label/edit-label/edit-label.component.ts
@@ -108,7 +108,8 @@ export class EditLabel {
                     id: this.request.entity.id,
                     type: this.request.type,
                     uri: this.request.uri,
-                    payload
+                    payload,
+                    errorStrategy: 'banner'
                 }
             })
         );
diff --git 
a/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-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 26c0f30dae..69ffb16ba0 100644
--- 
a/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-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
@@ -120,7 +120,8 @@ export class EditPort {
                     id: this.request.entity.id,
                     type: this.request.type,
                     uri: this.request.uri,
-                    payload
+                    payload,
+                    errorStrategy: 'banner'
                 }
             })
         );
diff --git 
a/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-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 8951c4f941..281baba1c3 100644
--- 
a/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-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
@@ -17,6 +17,7 @@
 
 <h2 mat-dialog-title>{{ readonly ? 'Process Group Details' : 'Edit Process 
Group' }}</h2>
 <form class="process-group-edit-form" [formGroup]="editProcessGroupForm">
+    <error-banner></error-banner>
     <mat-dialog-content>
         <mat-tab-group>
             <mat-tab label="Settings">
diff --git 
a/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.spec.ts
 
b/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.spec.ts
index 2d4086c000..1a1eaffe4e 100644
--- 
a/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.spec.ts
+++ 
b/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.spec.ts
@@ -21,6 +21,8 @@ import { EditProcessGroup } from 
'./edit-process-group.component';
 import { MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { ClusterConnectionService } from 
'../../../../../../../service/cluster-connection.service';
+import { provideMockStore } from '@ngrx/store/testing';
+import { initialState } from '../../../../../state/flow/flow.reducer';
 
 describe('EditProcessGroup', () => {
     let component: EditProcessGroup;
@@ -110,6 +112,7 @@ describe('EditProcessGroup', () => {
             imports: [EditProcessGroup, NoopAnimationsModule],
             providers: [
                 { provide: MAT_DIALOG_DATA, useValue: data },
+                provideMockStore({ initialState }),
                 {
                     provide: ClusterConnectionService,
                     useValue: {
diff --git 
a/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-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 252b328c4e..da70e2efdb 100644
--- 
a/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-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
@@ -36,6 +36,7 @@ import { ParameterContextEntity } from 
'../../../../../../parameter-contexts/sta
 import { ControllerServiceTable } from 
'../../../../../../../ui/common/controller-service/controller-service-table/controller-service-table.component';
 import { EditComponentDialogRequest } from '../../../../../state/flow';
 import { ClusterConnectionService } from 
'../../../../../../../service/cluster-connection.service';
+import { ErrorBanner } from 
'../../../../../../../ui/common/error-banner/error-banner.component';
 
 @Component({
     selector: 'edit-process-group',
@@ -55,7 +56,8 @@ import { ClusterConnectionService } from 
'../../../../../../../service/cluster-c
         NifiSpinnerDirective,
         NifiTooltipDirective,
         FormsModule,
-        ControllerServiceTable
+        ControllerServiceTable,
+        ErrorBanner
     ],
     styleUrls: ['./edit-process-group.component.scss']
 })

Reply via email to