mcgilman commented on code in PR #8367:
URL: https://github.com/apache/nifi/pull/8367#discussion_r1481486857


##########
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/parameter-providers/parameter-providers.effects.ts:
##########
@@ -61,9 +71,17 @@ export class ParameterProvidersEffects {
                             }
                         })
                     ),
-                    catchError((error) =>
-                        
of(ParameterProviderActions.parameterProvidersApiError({ error: error.error }))
-                    )
+                    catchError((error: HttpErrorResponse) => {
+                        if (status === 'success') {

Review Comment:
   `ErrorHelper.handleLoadingError` can be used here.



##########
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/parameter-providers/parameter-providers.actions.ts:
##########
@@ -24,9 +24,14 @@ import {
     DeleteParameterProviderRequest,
     DeleteParameterProviderSuccess,
     EditParameterProviderRequest,
+    FetchParameterProviderParametersRequest,
+    FetchParameterProviderParametersResponse,
     LoadParameterProvidersResponse,
+    ParameterProviderParameterApplicationEntity,
+    PollParameterProviderParametersUpdateSuccess,
     SelectParameterProviderRequest
 } from './index';
+import { FetchParameterProviderParameters } from 
'../../ui/parameter-providers/fetch-parameter-provider-parameters/fetch-parameter-provider-parameters.component';

Review Comment:
   This is unused.



##########
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/fetch-parameter-provider-parameters/fetch-parameter-provider-parameters.component.ts:
##########
@@ -0,0 +1,600 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Component, Inject, Input, OnInit } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
+import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators 
} from '@angular/forms';
+import { ErrorBanner } from 
'../../../../../ui/common/error-banner/error-banner.component';
+import { MatButtonModule } from '@angular/material/button';
+import { NifiSpinnerDirective } from 
'../../../../../ui/common/spinner/nifi-spinner.directive';
+import { Client } from '../../../../../service/client.service';
+import { NiFiCommon } from '../../../../../service/nifi-common.service';
+import {
+    FetchedParameterMapping,
+    FetchParameterProviderDialogRequest,
+    ParameterGroupConfiguration,
+    ParameterProviderApplyParametersRequest,
+    ParameterProviderEntity,
+    ParameterProviderParameterApplicationEntity,
+    ParameterProvidersState,
+    ParameterSensitivity,
+    ParameterStatusEntity
+} from '../../../state/parameter-providers';
+import { debounceTime, Observable, Subject } from 'rxjs';
+import { TextTip } from 
'../../../../../ui/common/tooltips/text-tip/text-tip.component';
+import { NifiTooltipDirective } from 
'../../../../../ui/common/tooltips/nifi-tooltip.directive';
+import { MatTableDataSource, MatTableModule } from '@angular/material/table';
+import { MatSortModule, Sort } from '@angular/material/sort';
+import { ParameterGroupsTable } from 
'./parameter-groups-table/parameter-groups-table.component';
+import { MatCheckboxChange, MatCheckboxModule } from 
'@angular/material/checkbox';
+import { MatInputModule } from '@angular/material/input';
+import { ParameterReferences } from 
'../../../../../ui/common/parameter-references/parameter-references.component';
+import { AffectedComponentEntity } from '../../../../../state/shared';
+import * as ParameterProviderActions from 
'../../../state/parameter-providers/parameter-providers.actions';
+import { Store } from '@ngrx/store';
+
+@Component({
+    selector: 'fetch-parameter-provider-parameters',
+    standalone: true,
+    imports: [
+        CommonModule,
+        MatDialogModule,
+        ReactiveFormsModule,
+        ErrorBanner,
+        MatButtonModule,
+        NifiSpinnerDirective,
+        NifiTooltipDirective,
+        MatTableModule,
+        MatSortModule,
+        ParameterGroupsTable,
+        MatCheckboxModule,
+        MatInputModule,
+        ParameterReferences
+    ],
+    templateUrl: './fetch-parameter-provider-parameters.component.html',
+    styleUrls: ['./fetch-parameter-provider-parameters.component.scss']
+})
+export class FetchParameterProviderParameters implements OnInit {
+    fetchParametersForm: FormGroup;
+    parameterProvider: ParameterProviderEntity;
+    selectedParameterGroup: ParameterGroupConfiguration | null = null;
+    parameterGroupConfigurations: ParameterGroupConfiguration[];
+    parameterGroupNames: string[] = [];
+    parameterContextsToCreate: { [key: string]: string } = {};
+    parameterContextsToUpdate: string[] = [];
+
+    displayedColumns = ['sensitive', 'name', 'indicators'];
+
+    // each group has a different set of parameters, map by groupName
+    dataSources: { [key: string]: MatTableDataSource<FetchedParameterMapping> 
} = {};
+
+    // each group's parameter table can have a different sort active, map by 
groupName
+    activeSorts: { [key: string]: Sort } = {};
+
+    // each group can have a selected parameter, map by groupName
+    selectedParameters: { [key: string]: FetchedParameterMapping } = {};
+
+    // as the selected parameter of the current group changes
+    selectParameterChanged: Subject<FetchedParameterMapping | null> = new 
Subject<FetchedParameterMapping | null>();
+
+    parameterReferences: AffectedComponentEntity[] = [];
+
+    @Input() saving$!: Observable<boolean>;
+    @Input() updateRequest!: 
Observable<ParameterProviderApplyParametersRequest | null>;
+
+    protected readonly TextTip = TextTip;
+    protected readonly Object = Object;
+
+    constructor(
+        private formBuilder: FormBuilder,
+        private client: Client,
+        private nifiCommon: NiFiCommon,
+        private store: Store<ParameterProvidersState>,
+        @Inject(MAT_DIALOG_DATA) public request: 
FetchParameterProviderDialogRequest
+    ) {
+        this.parameterProvider = request.parameterProvider;
+
+        this.fetchParametersForm = this.formBuilder.group({});
+        this.parameterGroupConfigurations = 
this.parameterProvider.component.parameterGroupConfigurations.slice();
+        this.parameterGroupConfigurations.forEach((parameterGroupConfig) => {
+            const params = 
this.getParameterSensitivitiesAsFormControls(parameterGroupConfig);
+            this.fetchParametersForm.addControl(
+                parameterGroupConfig.groupName,
+                this.formBuilder.group({
+                    createParameterContext: new FormControl(),
+                    parameterContextName: new FormControl(
+                        parameterGroupConfig.parameterContextName,
+                        Validators.required
+                    ),
+                    parameterSensitivities: this.formBuilder.group(params)
+                })
+            );
+            this.parameterGroupNames.push(parameterGroupConfig.groupName);
+        });
+
+        if (this.parameterProvider.component.referencingParameterContexts) {
+            this.parameterContextsToUpdate = 
this.parameterProvider.component.referencingParameterContexts
+                .map((parameterContext) => parameterContext.component?.name ?? 
'')
+                .filter((name) => name.length > 0);
+        }
+    }
+
+    ngOnInit(): void {
+        this.selectParameterChanged.subscribe((selectedParameter) => {
+            const parameterGroupName = this.selectedParameterGroup?.groupName;
+            if (selectedParameter) {
+                // keep track of the currently selected parameter for each 
group
+                if (parameterGroupName) {
+                    this.selectedParameters[parameterGroupName] = 
selectedParameter;
+
+                    this.parameterReferences =
+                        
selectedParameter.status?.parameter?.parameter.referencingComponents ?? [];
+                }
+            } else {
+                if (parameterGroupName) {
+                    delete this.selectedParameters[parameterGroupName];
+                    this.parameterReferences = [];
+                }
+            }
+        });
+
+        if (this.parameterGroupConfigurations.length > 0) {
+            // select the first parameter group
+            const initialParamGroup = this.parameterGroupConfigurations[0];
+
+            // preload the first datasource into the map
+            this.getParameterMappingDataSource(initialParamGroup);
+            this.autoSelectParameter();
+
+            // watch for changes to the parameter context name inputs, update 
the local map
+            this.parameterGroupConfigurations.forEach((groupConfig) => {
+                this.fetchParametersForm
+                    .get(`${groupConfig.groupName}.parameterContextName`)
+                    ?.valueChanges.pipe(debounceTime(200))
+                    .subscribe((name) => {
+                        if (Object.hasOwn(this.parameterContextsToCreate, 
groupConfig.groupName)) {
+                            
this.parameterContextsToCreate[groupConfig.groupName] = name;
+                        }
+                    });
+            });
+        }
+    }
+
+    submitForm() {
+        console.log('Form data', this.fetchParametersForm);
+        const data = this.getFormData();
+        this.store.dispatch(
+            
ParameterProviderActions.submitParameterProviderParametersUpdateRequest({
+                request: data
+            })
+        );
+    }
+
+    parameterGroupSelected(parameterGroup: ParameterGroupConfiguration) {
+        this.selectedParameterGroup = parameterGroup;
+        this.autoSelectParameter();
+    }
+
+    private autoSelectParameter() {
+        if (this.selectedParameterGroup) {
+            const selectedParam = 
this.selectedParameters[this.selectedParameterGroup.groupName];
+            if (selectedParam) {
+                this.selectParameterChanged.next(selectedParam);
+            } else {
+                // select the first param
+                const paramsDs = 
this.dataSources[this.selectedParameterGroup.groupName];
+                if (paramsDs) {
+                    this.selectParameterChanged.next(paramsDs.data[0]);
+                }
+            }
+        }
+    }
+
+    canCreateParameterContext(parameterGroupConfig: 
ParameterGroupConfiguration): boolean {
+        // the passed in parameter group could have changed its sync status 
due to user input,
+        // check the original parameter group from the server.
+        const originalParameterGroupConfig = 
this.parameterProvider.component.parameterGroupConfigurations.find(
+            (g) => g.groupName === parameterGroupConfig.groupName
+        );
+        if (originalParameterGroupConfig) {
+            return !this.isSynced(originalParameterGroupConfig);
+        }
+        return false;
+    }
+
+    canEditParameterContextName(parameterGroupConfig: 
ParameterGroupConfiguration): boolean {
+        // can only edit the context name if the create parameter context 
checkbox is checked.
+        return 
this.fetchParametersForm.get(`${parameterGroupConfig.groupName}.createParameterContext`)?.value;
+    }
+
+    showParameterList(parameterGroupConfig: ParameterGroupConfiguration): 
boolean {
+        // show only a list of parameters if the group is not synced with a 
parameter context and the user isn't actively trying to create a context for it
+        return (
+            !this.isSynced(parameterGroupConfig) &&
+            
!this.fetchParametersForm.get(`${parameterGroupConfig.groupName}.createParameterContext`)?.value
+        );
+    }
+
+    isSynced(parameterGroupConfig: ParameterGroupConfiguration): boolean {
+        return !!parameterGroupConfig.synchronized;
+    }
+
+    getParameterMappingDataSource(parameterGroupConfig: 
ParameterGroupConfiguration) {
+        if (!this.dataSources[parameterGroupConfig.groupName]) {
+            // const ds = new MatTableDataSource<ParameterSensitivity>();

Review Comment:
   This line can be removed.



##########
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/parameter-providers/parameter-providers.reducer.ts:
##########
@@ -59,11 +66,9 @@ export const parameterProvidersReducer = createReducer(
         status: 'success' as const
     })),
 
-    on(parameterProvidersApiError, (state: ParameterProvidersState, { error }) 
=> ({

Review Comment:
   `error: null` above in `loadParameterProvidersSuccess` reducer can be 
removed.



##########
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/parameter-providers/fetch-parameter-provider-parameters/fetch-parameter-provider-parameters.component.ts:
##########
@@ -0,0 +1,600 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Component, Inject, Input, OnInit } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
+import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators 
} from '@angular/forms';
+import { ErrorBanner } from 
'../../../../../ui/common/error-banner/error-banner.component';
+import { MatButtonModule } from '@angular/material/button';
+import { NifiSpinnerDirective } from 
'../../../../../ui/common/spinner/nifi-spinner.directive';
+import { Client } from '../../../../../service/client.service';
+import { NiFiCommon } from '../../../../../service/nifi-common.service';
+import {
+    FetchedParameterMapping,
+    FetchParameterProviderDialogRequest,
+    ParameterGroupConfiguration,
+    ParameterProviderApplyParametersRequest,
+    ParameterProviderEntity,
+    ParameterProviderParameterApplicationEntity,
+    ParameterProvidersState,
+    ParameterSensitivity,
+    ParameterStatusEntity
+} from '../../../state/parameter-providers';
+import { debounceTime, Observable, Subject } from 'rxjs';
+import { TextTip } from 
'../../../../../ui/common/tooltips/text-tip/text-tip.component';
+import { NifiTooltipDirective } from 
'../../../../../ui/common/tooltips/nifi-tooltip.directive';
+import { MatTableDataSource, MatTableModule } from '@angular/material/table';
+import { MatSortModule, Sort } from '@angular/material/sort';
+import { ParameterGroupsTable } from 
'./parameter-groups-table/parameter-groups-table.component';
+import { MatCheckboxChange, MatCheckboxModule } from 
'@angular/material/checkbox';
+import { MatInputModule } from '@angular/material/input';
+import { ParameterReferences } from 
'../../../../../ui/common/parameter-references/parameter-references.component';
+import { AffectedComponentEntity } from '../../../../../state/shared';
+import * as ParameterProviderActions from 
'../../../state/parameter-providers/parameter-providers.actions';
+import { Store } from '@ngrx/store';
+
+@Component({
+    selector: 'fetch-parameter-provider-parameters',
+    standalone: true,
+    imports: [
+        CommonModule,
+        MatDialogModule,
+        ReactiveFormsModule,
+        ErrorBanner,
+        MatButtonModule,
+        NifiSpinnerDirective,
+        NifiTooltipDirective,
+        MatTableModule,
+        MatSortModule,
+        ParameterGroupsTable,
+        MatCheckboxModule,
+        MatInputModule,
+        ParameterReferences
+    ],
+    templateUrl: './fetch-parameter-provider-parameters.component.html',
+    styleUrls: ['./fetch-parameter-provider-parameters.component.scss']
+})
+export class FetchParameterProviderParameters implements OnInit {
+    fetchParametersForm: FormGroup;
+    parameterProvider: ParameterProviderEntity;
+    selectedParameterGroup: ParameterGroupConfiguration | null = null;
+    parameterGroupConfigurations: ParameterGroupConfiguration[];
+    parameterGroupNames: string[] = [];
+    parameterContextsToCreate: { [key: string]: string } = {};
+    parameterContextsToUpdate: string[] = [];
+
+    displayedColumns = ['sensitive', 'name', 'indicators'];
+
+    // each group has a different set of parameters, map by groupName
+    dataSources: { [key: string]: MatTableDataSource<FetchedParameterMapping> 
} = {};
+
+    // each group's parameter table can have a different sort active, map by 
groupName
+    activeSorts: { [key: string]: Sort } = {};
+
+    // each group can have a selected parameter, map by groupName
+    selectedParameters: { [key: string]: FetchedParameterMapping } = {};
+
+    // as the selected parameter of the current group changes
+    selectParameterChanged: Subject<FetchedParameterMapping | null> = new 
Subject<FetchedParameterMapping | null>();
+
+    parameterReferences: AffectedComponentEntity[] = [];
+
+    @Input() saving$!: Observable<boolean>;
+    @Input() updateRequest!: 
Observable<ParameterProviderApplyParametersRequest | null>;
+
+    protected readonly TextTip = TextTip;
+    protected readonly Object = Object;
+
+    constructor(
+        private formBuilder: FormBuilder,
+        private client: Client,
+        private nifiCommon: NiFiCommon,
+        private store: Store<ParameterProvidersState>,
+        @Inject(MAT_DIALOG_DATA) public request: 
FetchParameterProviderDialogRequest
+    ) {
+        this.parameterProvider = request.parameterProvider;
+
+        this.fetchParametersForm = this.formBuilder.group({});
+        this.parameterGroupConfigurations = 
this.parameterProvider.component.parameterGroupConfigurations.slice();
+        this.parameterGroupConfigurations.forEach((parameterGroupConfig) => {
+            const params = 
this.getParameterSensitivitiesAsFormControls(parameterGroupConfig);
+            this.fetchParametersForm.addControl(
+                parameterGroupConfig.groupName,
+                this.formBuilder.group({
+                    createParameterContext: new FormControl(),
+                    parameterContextName: new FormControl(
+                        parameterGroupConfig.parameterContextName,
+                        Validators.required
+                    ),
+                    parameterSensitivities: this.formBuilder.group(params)
+                })
+            );
+            this.parameterGroupNames.push(parameterGroupConfig.groupName);
+        });
+
+        if (this.parameterProvider.component.referencingParameterContexts) {
+            this.parameterContextsToUpdate = 
this.parameterProvider.component.referencingParameterContexts
+                .map((parameterContext) => parameterContext.component?.name ?? 
'')
+                .filter((name) => name.length > 0);
+        }
+    }
+
+    ngOnInit(): void {
+        this.selectParameterChanged.subscribe((selectedParameter) => {
+            const parameterGroupName = this.selectedParameterGroup?.groupName;
+            if (selectedParameter) {
+                // keep track of the currently selected parameter for each 
group
+                if (parameterGroupName) {
+                    this.selectedParameters[parameterGroupName] = 
selectedParameter;
+
+                    this.parameterReferences =
+                        
selectedParameter.status?.parameter?.parameter.referencingComponents ?? [];
+                }
+            } else {
+                if (parameterGroupName) {
+                    delete this.selectedParameters[parameterGroupName];
+                    this.parameterReferences = [];
+                }
+            }
+        });
+
+        if (this.parameterGroupConfigurations.length > 0) {
+            // select the first parameter group
+            const initialParamGroup = this.parameterGroupConfigurations[0];
+
+            // preload the first datasource into the map
+            this.getParameterMappingDataSource(initialParamGroup);
+            this.autoSelectParameter();
+
+            // watch for changes to the parameter context name inputs, update 
the local map
+            this.parameterGroupConfigurations.forEach((groupConfig) => {
+                this.fetchParametersForm
+                    .get(`${groupConfig.groupName}.parameterContextName`)
+                    ?.valueChanges.pipe(debounceTime(200))
+                    .subscribe((name) => {
+                        if (Object.hasOwn(this.parameterContextsToCreate, 
groupConfig.groupName)) {
+                            
this.parameterContextsToCreate[groupConfig.groupName] = name;
+                        }
+                    });
+            });
+        }
+    }
+
+    submitForm() {
+        console.log('Form data', this.fetchParametersForm);

Review Comment:
   `console.log` should be removed.



##########
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/parameter-providers/parameter-providers.effects.ts:
##########
@@ -356,4 +388,242 @@ export class ParameterProvidersEffects {
             ),
         { dispatch: false }
     );
+
+    fetchParameterProviderParametersAndOpenDialog$ = createEffect(() =>
+        this.actions$.pipe(
+            
ofType(ParameterProviderActions.fetchParameterProviderParametersAndOpenDialog),
+            map((action) => action.request),
+            switchMap((request) =>
+                
from(this.parameterProviderService.fetchParameters(request)).pipe(
+                    map((response: ParameterProviderEntity) =>
+                        
ParameterProviderActions.fetchParameterProviderParametersSuccess({
+                            response: { parameterProvider: response }
+                        })
+                    ),
+                    catchError((error) =>
+                        of(
+                            
ParameterProviderActions.parameterProvidersBannerApiError({
+                                error: error.error
+                            })
+                        )
+                    )
+                )
+            )
+        )
+    );
+
+    fetchParameterProviderParametersSuccess$ = createEffect(() =>
+        this.actions$.pipe(
+            
ofType(ParameterProviderActions.fetchParameterProviderParametersSuccess),
+            map((action) => action.response),
+            switchMap((response) =>
+                of(ParameterProviderActions.openFetchParameterProviderDialog({ 
request: response }))
+            )
+        )
+    );
+
+    openFetchParameterProvidersParametersDialog$ = createEffect(
+        () =>
+            this.actions$.pipe(
+                
ofType(ParameterProviderActions.openFetchParameterProviderDialog),
+                map((action) => action.request),
+                tap((request) => {
+                    const dialogRef = 
this.dialog.open(FetchParameterProviderParameters, {
+                        panelClass: 'xl-dialog',
+                        data: request
+                    });
+
+                    const referencingParameterContexts =
+                        
request.parameterProvider.component.referencingParameterContexts;
+                    if (referencingParameterContexts?.length > 0) {
+                        // add an error if one of the referenced parameter 
contexts is not readable/writeable
+                        const canReadWriteAll = 
referencingParameterContexts.every(
+                            (paramContextRef) =>
+                                paramContextRef.permissions.canRead && 
paramContextRef.permissions.canWrite
+                        );
+                        if (!canReadWriteAll) {
+                            this.store.dispatch(
+                                
ParameterProviderActions.parameterProvidersBannerApiError({
+                                    error: 'You do not have permissions to 
modify one or more synced parameter contexts.'
+                                })
+                            );
+                        }
+                    }
+                    const affectedComponents = 
request.parameterProvider.component.affectedComponents;
+                    if (affectedComponents?.length > 0) {
+                        // add an error if one of the affected components is 
not readable/writeable
+                        const canReadWriteAll = affectedComponents.every(
+                            (paramContextRef) =>
+                                paramContextRef.permissions.canRead && 
paramContextRef.permissions.canWrite
+                        );
+                        if (!canReadWriteAll) {
+                            this.store.dispatch(
+                                
ParameterProviderActions.parameterProvidersBannerApiError({
+                                    error: 'You do not have permissions to 
modify one or more affected components.'
+                                })
+                            );
+                        }
+                    }
+
+                    dialogRef.componentInstance.updateRequest = 
this.store.select(
+                        selectApplyParameterProviderParametersRequest
+                    );
+                    dialogRef.componentInstance.saving$ = 
this.store.select(selectSaving);
+
+                    dialogRef.afterClosed().subscribe((response) => {
+                        
this.store.dispatch(ParameterProviderActions.resetFetchedParameterProvider());
+                        this.store.dispatch(ErrorActions.clearBannerErrors());
+
+                        if (response !== 'ROUTED') {
+                            this.store.dispatch(
+                                
ParameterProviderActions.selectParameterProvider({
+                                    request: {
+                                        id: request.parameterProvider.id
+                                    }
+                                })
+                            );
+                            this.store.dispatch(
+                                
ParameterProviderActions.submitParameterProviderParametersUpdateComplete()
+                            );
+                        }
+                    });
+                })
+            ),
+        { dispatch: false }
+    );
+
+    parameterProvidersBannerApiError$ = createEffect(() =>
+        this.actions$.pipe(
+            ofType(ParameterProviderActions.parameterProvidersBannerApiError),
+            map((action) => action.error),
+            switchMap((error) => of(ErrorActions.addBannerError({ error })))
+        )
+    );
+
+    submitParameterProviderParametersUpdateRequest$ = createEffect(() =>
+        this.actions$.pipe(
+            
ofType(ParameterProviderActions.submitParameterProviderParametersUpdateRequest),
+            map((action) => action.request),
+            switchMap((request) =>
+                from(
+                    
this.parameterProviderService.applyParameters(request).pipe(
+                        map((response: any) =>
+                            
ParameterProviderActions.submitParameterProviderParametersUpdateRequestSuccess({
+                                response: {
+                                    request: response.request
+                                }
+                            })
+                        ),
+                        catchError((error) =>
+                            of(
+                                // TODO: maybe a snackbar error?
+                                
ParameterProviderActions.parameterProvidersBannerApiError({
+                                    error: error.error
+                                })
+                            )
+                        )
+                    )
+                )
+            )
+        )
+    );
+
+    submitParameterProviderParametersUpdateRequestSuccess$ = createEffect(() =>
+        this.actions$.pipe(
+            
ofType(ParameterProviderActions.submitParameterProviderParametersUpdateRequestSuccess),
+            map((action) => action.response),
+            switchMap((response) => {
+                const updateRequest = response.request;
+                if (updateRequest.complete) {
+                    return 
of(ParameterProviderActions.deleteParameterProviderParametersUpdateRequest());
+                } else {
+                    return 
of(ParameterProviderActions.startPollingParameterProviderParametersUpdateRequest());
+                }
+            })
+        )
+    );
+
+    startPollingParameterProviderParametersUpdateRequest$ = createEffect(() =>
+        this.actions$.pipe(
+            
ofType(ParameterProviderActions.startPollingParameterProviderParametersUpdateRequest),
+            switchMap(() =>
+                interval(2000, asyncScheduler).pipe(
+                    takeUntil(
+                        this.actions$.pipe(
+                            
ofType(ParameterProviderActions.stopPollingParameterProviderParametersUpdateRequest)
+                        )
+                    )
+                )
+            ),
+            switchMap(() => 
of(ParameterProviderActions.pollParameterProviderParametersUpdateRequest()))
+        )
+    );
+
+    pollParameterProviderParametersUpdateRequest$ = createEffect(() =>
+        this.actions$.pipe(
+            
ofType(ParameterProviderActions.pollParameterProviderParametersUpdateRequest),
+            concatLatestFrom(() => 
this.store.select(selectApplyParameterProviderParametersRequest)),
+            switchMap(([, updateRequest]) => {
+                if (updateRequest) {
+                    return from(
+                        
this.parameterProviderService.pollParameterProviderParametersUpdateRequest(updateRequest)
+                    ).pipe(
+                        map((response) =>
+                            
ParameterProviderActions.pollParameterProviderParametersUpdateRequestSuccess({
+                                response: {
+                                    request: response.request
+                                }
+                            })
+                        ),
+                        catchError((error) =>
+                            of(
+                                // TODO: maybe a snackbar error?
+                                
ParameterProviderActions.parameterProvidersBannerApiError({
+                                    error: error.error
+                                })
+                            )
+                        )
+                    );
+                } else {
+                    return NEVER;
+                }
+            })
+        )
+    );
+
+    pollParameterProviderParametersUpdateRequestSuccess$ = createEffect(() =>
+        this.actions$.pipe(
+            
ofType(ParameterProviderActions.pollParameterProviderParametersUpdateRequestSuccess),
+            map((action) => action.response),
+            switchMap((response) => {
+                const updateRequest = response.request;
+                if (updateRequest.complete) {

Review Comment:
   We can `filter` for `updateRequest.complete` and not need to return `NEVER` 
here.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to