Skip to content

Commit

Permalink
NIFI-3785: Various feedback requests completed. Moved move controller…
Browse files Browse the repository at this point in the history
… component to flow-designer. Added disabling options that have a move conflict
  • Loading branch information
Freedom9339 committed Jun 25, 2024
1 parent 1d35de1 commit 6c4fab1
Show file tree
Hide file tree
Showing 24 changed files with 4,150 additions and 602 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1042,6 +1042,15 @@ Set<DocumentedTypeDTO> getControllerServiceTypes(final String serviceType, final
*/
ProcessGroupEntity getProcessGroup(String groupId);

/**
* Returns the process group.
*
* @param groupId group
* @param recurse boolean
* @return ProcessGroup transfer object
*/
ProcessGroupEntity getProcessGroup(String groupId, boolean recurse);

/**
* Verifies that a Parameter Context matching the given DTO can be created
* @param parameterContext the DTO that represents the Parameter Context
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4681,11 +4681,14 @@ public Set<PortEntity> getOutputPorts(final String groupId) {
}

private ProcessGroupEntity createProcessGroupEntity(final ProcessGroup group) {
return createProcessGroupEntity(group, false);
}
private ProcessGroupEntity createProcessGroupEntity(final ProcessGroup group, final boolean recurse) {
final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(group.getIdentifier()));
final PermissionsDTO permissions = dtoFactory.createPermissionsDto(group);
final ProcessGroupStatusDTO status = dtoFactory.createConciseProcessGroupStatusDto(controllerFacade.getProcessGroupStatus(group.getIdentifier()));
final List<BulletinEntity> bulletins = getProcessGroupBulletins(group);
return entityFactory.createProcessGroupEntity(dtoFactory.createProcessGroupDto(group), revision, permissions, status, bulletins);
return entityFactory.createProcessGroupEntity(dtoFactory.createProcessGroupDto(group, recurse), revision, permissions, status, bulletins);
}

private List<BulletinEntity> getProcessGroupBulletins(final ProcessGroup group) {
Expand Down Expand Up @@ -4865,8 +4868,13 @@ public FlowBreadcrumbEntity getProcessGroupBreadcrumbs(final String groupId) {

@Override
public ProcessGroupEntity getProcessGroup(final String groupId) {
return getProcessGroup(groupId, false);
}

@Override
public ProcessGroupEntity getProcessGroup(final String groupId, final boolean recurse) {
final ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId);
return createProcessGroupEntity(processGroup);
return createProcessGroupEntity(processGroup, recurse);
}

private ControllerServiceEntity createControllerServiceEntity(final ControllerServiceNode serviceNode, final boolean includeReferencingComponents) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,9 @@ private FlowDTO populateRemainingSnippetContent(FlowDTO flow) {
)
public Response getProcessGroup(
@Parameter(description = "The process group id.")
@PathParam("id") final String groupId) {
@PathParam("id") final String groupId,
@QueryParam("includeContent") @DefaultValue("false")
@Parameter(description = "Include content for process group") boolean includeContent) {

if (isReplicateRequest()) {
return replicate(HttpMethod.GET);
Expand All @@ -257,10 +259,10 @@ public Response getProcessGroup(
});

// get this process group contents
final ProcessGroupEntity entity = serviceFacade.getProcessGroup(groupId);
final ProcessGroupEntity entity = serviceFacade.getProcessGroup(groupId, includeContent);
populateRemainingProcessGroupEntityContent(entity);

if (entity.getComponent() != null) {
if (entity.getComponent() != null && !includeContent) {
entity.getComponent().setContents(null);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
*/

import { Injectable } from '@angular/core';
import { EMPTY, Observable } from 'rxjs';
import { EMPTY, Observable, of } from 'rxjs';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Client } from '../../../service/client.service';
import { NiFiCommon } from '../../../service/nifi-common.service';
Expand All @@ -26,7 +26,11 @@ import {
CreateControllerServiceRequest,
PropertyDescriptorRetriever
} from '../../../state/shared';
import { ConfigureControllerServiceRequest, DeleteControllerServiceRequest, MoveControllerServiceRequest } from '../state/controller-services';
import {
ConfigureControllerServiceRequest,
DeleteControllerServiceRequest,
MoveControllerServiceRequest
} from '../state/controller-services';
import { ClusterConnectionService } from '../../../service/cluster-connection.service';

@Injectable({ providedIn: 'root' })
Expand All @@ -41,13 +45,17 @@ export class ControllerServiceService implements ControllerServiceCreator, Prope
) {}

getControllerServices(processGroupId: string): Observable<any> {
const uiOnly: any = { uiOnly: true };
return this.httpClient.get(
`${ControllerServiceService.API}/flow/process-groups/${processGroupId}/controller-services`,
{
params: uiOnly
}
);
if (processGroupId != '') {
const uiOnly: any = { uiOnly: true };
return this.httpClient.get(
`${ControllerServiceService.API}/flow/process-groups/${processGroupId}/controller-services`,
{
params: uiOnly
}
);
} else {
return of([]);
}
}

getFlow(processGroupId: string): Observable<any> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ export class FlowService implements PropertyDescriptorRetriever {
return this.httpClient.get(`${FlowService.API}/process-groups/${id}`);
}

getProcessGroupWithContent(id: string): Observable<any> {
const params = new HttpParams().set('includeContent', true);
return this.httpClient.get(`${FlowService.API}/process-groups/${id}`, { params: params });
}

createFunnel(processGroupId = 'root', createFunnel: CreateComponentRequest): Observable<any> {
return this.httpClient.post(`${FlowService.API}/process-groups/${processGroupId}/funnels`, {
revision: createFunnel.revision,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
ConfigureControllerServiceRequest,
ConfigureControllerServiceSuccess,
CreateControllerServiceSuccess,
MoveControllerServiceDialogRequest,
MoveControllerServiceRequest,
MoveControllerServiceSuccess,
DeleteControllerServiceRequest,
Expand All @@ -32,7 +33,6 @@ import {
CreateControllerServiceRequest,
DisableControllerServiceDialogRequest,
EditControllerServiceDialogRequest,
MoveControllerServiceDialogRequest,
FetchComponentVersionsRequest,
SetEnableControllerServiceDialogRequest
} from '../../../../state/shared';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { concatLatestFrom } from '@ngrx/operators';
import * as ControllerServicesActions from './controller-services.actions';
import { catchError, combineLatest, from, map, of, switchMap, take, takeUntil, tap } from 'rxjs';
import { catchError, combineLatest, concatMap, from, map, of, switchMap, take, takeUntil, tap } from 'rxjs';
import { MatDialog } from '@angular/material/dialog';
import { Store } from '@ngrx/store';
import { NiFiState } from '../../../../state';
Expand All @@ -37,14 +37,15 @@ import {
} from '../../../../state/shared';
import { Router } from '@angular/router';
import {
selectProcessGroupFlow,
selectCurrentProcessGroupId,
selectParameterContext,
selectSaving,
selectStatus
} from './controller-services.selectors';
import { ControllerServiceService } from '../../service/controller-service.service';
import { EnableControllerService } from '../../../../ui/common/controller-service/enable-controller-service/enable-controller-service.component';
import { MoveControllerService } from '../../../../ui/common/controller-service/move-controller-service/move-controller-service.component';
import { MoveControllerService } from '../../ui/move-controller-service/move-controller-service.component';
import { DisableControllerService } from '../../../../ui/common/controller-service/disable-controller-service/disable-controller-service.component';
import { PropertyTableHelperService } from '../../../../service/property-table-helper.service';
import * as ErrorActions from '../../../../state/error/error.actions';
Expand Down Expand Up @@ -102,7 +103,8 @@ export class ControllerServicesEffects {
controllerServices: controllerServicesResponse.controllerServices,
loadedTimestamp: controllerServicesResponse.currentTime,
breadcrumb: flowResponse.processGroupFlow.breadcrumb,
parameterContext: flowResponse.processGroupFlow.parameterContext ?? null
parameterContext: flowResponse.processGroupFlow.parameterContext ?? null,
processGroupFlow: flowResponse.processGroupFlow
}
})
),
Expand Down Expand Up @@ -641,13 +643,37 @@ export class ControllerServicesEffects {
this.actions$.pipe(
ofType(ControllerServicesActions.openMoveControllerServiceDialog),
map((action) => action.request),
concatLatestFrom(() => this.store.select(selectCurrentProcessGroupId)),
tap(([request, currentProcessGroupId]) => {
const serviceId: string = request.id;
request.processGroupFlow = this.flowService.getFlow(currentProcessGroupId);
concatLatestFrom(() => [
this.store.select(selectCurrentProcessGroupId),
this.store.select(selectProcessGroupFlow)
]),
concatMap(([request, currentProcessGroupId, processGroupFlow]) =>
combineLatest([
this.flowService.getProcessGroupWithContent(currentProcessGroupId),
this.controllerServiceService.getControllerServices(
processGroupFlow?.breadcrumb.parentBreadcrumb?.id || ''
)
]).pipe(
map(([processGroupEntity, parentControllerServices]) => {
return {
request,
currentProcessGroupId,
processGroupFlow,
processGroupEntity,
parentControllerServices
};
})
)
),
tap((request) => {
const clone = Object.assign({}, request.request);
clone.processGroupEntity = request.processGroupEntity;
clone.processGroupFlow = request.processGroupFlow;
clone.parentControllerServices = request.parentControllerServices.controllerServices;
const serviceId: string = request.request.id;
const moveDialogReference = this.dialog.open(MoveControllerService, {
...XL_DIALOG,
data: request,
...LARGE_DIALOG,
data: clone,
id: serviceId
});

Expand All @@ -663,7 +689,7 @@ export class ControllerServicesEffects {
this.store.dispatch(
ControllerServicesActions.loadControllerServices({
request: {
processGroupId: currentProcessGroupId
processGroupId: request.currentProcessGroupId
}
})
);
Expand Down Expand Up @@ -695,21 +721,16 @@ export class ControllerServicesEffects {
)
);

moveControllerServiceSuccess$ = createEffect( () =>
this.actions$.pipe(
ofType(ControllerServicesActions.moveControllerServiceSuccess),
map((action) => action.response),
tap((request) => {
this.dialog.closeAll();
this.router.navigate([
'/process-groups',
request.controllerService.parentGroupId,
'controller-services',
request.controllerService.id
]);
})
),
{ dispatch: false }
moveControllerServiceSuccess$ = createEffect(
() =>
this.actions$.pipe(
ofType(ControllerServicesActions.moveControllerServiceSuccess),
map((action) => action.response),
tap(() => {
this.dialog.closeAll();
})
),
{ dispatch: false }
);

openDisableControllerServiceDialog$ = createEffect(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ export const controllerServicesReducer = createReducer(
breadcrumb: response.breadcrumb,
parameterContext: response.parameterContext,
loadedTimestamp: response.loadedTimestamp,
processGroupFlow: response.processGroupFlow,
status: 'success' as const
})),
on(controllerServicesBannerApiError, (state) => ({
Expand Down Expand Up @@ -102,9 +103,11 @@ export const controllerServicesReducer = createReducer(
}),
on(moveControllerServiceSuccess, (state, { response }) => {
return produce(state, (draftState) => {
const componentIndex: number = draftState.controllerServices.findIndex((f: any) => response.controllerService.id === f.id);
const componentIndex: number = draftState.controllerServices.findIndex(
(f: any) => response.controllerService.id === f.id
);
if (componentIndex > -1) {
draftState.controllerServices[componentIndex] = response.controllerService;
draftState.controllerServices.splice(componentIndex, 1);
}
draftState.saving = false;
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ export const selectCurrentProcessGroupId = createSelector(
(state: ControllerServicesState) => state.processGroupId
);

export const selectProcessGroupFlow = createSelector(
selectControllerServicesState,
(state: ControllerServicesState) => state.processGroupFlow
);

export const selectParameterContext = createSelector(
selectControllerServicesState,
(state: ControllerServicesState) => state.parameterContext
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/

import { ControllerServiceEntity, ParameterContextReferenceEntity } from '../../../../state/shared';
import { ProcessGroupFlow } from '../flow';
import { BreadcrumbEntity } from '../shared';
import { Revision } from './../../../../state/shared/index';

Expand All @@ -31,6 +32,7 @@ export interface LoadControllerServicesResponse {
controllerServices: ControllerServiceEntity[];
parameterContext: ParameterContextReferenceEntity | null;
loadedTimestamp: string;
processGroupFlow: ProcessGroupFlow;
}

export interface CreateControllerServiceSuccess {
Expand All @@ -52,6 +54,14 @@ export interface ConfigureControllerServiceSuccess {
postUpdateNavigationBoundary?: string[];
}

export interface MoveControllerServiceDialogRequest {
id: string;
controllerService: ControllerServiceEntity;
processGroupFlow?: ProcessGroupFlow;
processGroupEntity?: any;
parentControllerServices: ControllerServiceEntity[];
}

export interface MoveControllerServiceRequest {
controllerService: ControllerServiceEntity;
data: MoveControllerServiceData;
Expand Down Expand Up @@ -81,6 +91,7 @@ export interface SelectControllerServiceRequest {

export interface ControllerServicesState {
processGroupId: string;
processGroupFlow?: ProcessGroupFlow;
breadcrumb: BreadcrumbEntity;
controllerServices: ControllerServiceEntity[];
parameterContext: ParameterContextReferenceEntity | null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ export const selectCurrentParameterContext = createSelector(

export const selectCanvasPermissions = createSelector(selectFlowState, (state: FlowState) => state.flow.permissions);

export const selectProcessGroupFlow = createSelector(
selectFlowState,
(state: FlowState) => state.flow.processGroupFlow
);

export const selectBreadcrumbs = createSelector(
selectFlowState,
(state: FlowState) => state.flow.processGroupFlow.breadcrumb
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ <h3 class="primary-color">Controller Services</h3>
[selectedServiceId]="selectedServiceId$ | async"
[controllerServices]="serviceState.controllerServices"
[formatScope]="formatScope(serviceState.breadcrumb)"
[isManagementControllerService]="isManagementControllerService"
[definedByCurrentGroup]="definedByCurrentGroup(serviceState.breadcrumb)"
[currentUser]="(currentUser$ | async)!"
[flowConfiguration]="flowConfiguration"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,17 +238,17 @@ export class ControllerServices implements OnDestroy {
);
}

moveControllerService(entity: ControllerServiceEntity): void {
this.store.dispatch(
openMoveControllerServiceDialog({
request: {
id: entity.id,
controllerService: entity,
processGroupFlow: null
}
})
);
}
moveControllerService(entity: ControllerServiceEntity): void {
this.store.dispatch(
openMoveControllerServiceDialog({
request: {
id: entity.id,
controllerService: entity,
parentControllerServices: []
}
})
);
}

disableControllerService(entity: ControllerServiceEntity): void {
this.store.dispatch(
Expand Down Expand Up @@ -333,6 +333,10 @@ export class ControllerServices implements OnDestroy {
);
}

isManagementControllerService(): boolean {
return false;
}

ngOnDestroy(): void {
this.store.dispatch(resetControllerServicesState());
}
Expand Down
Loading

0 comments on commit 6c4fab1

Please sign in to comment.