processGroups: processComponentCollection()

in nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/flow-designer/state/flow/flow.reducer.ts [240:471]


                        processGroups: processComponentCollection(
                            response.flow.processGroupFlow.flow.processGroups,
                            state.flow.processGroupFlow.flow.processGroups,
                            state.addedCache,
                            state.removedCache,
                            response.connectedStateChanged
                        ),
                        remoteProcessGroups: processComponentCollection(
                            response.flow.processGroupFlow.flow.remoteProcessGroups,
                            state.flow.processGroupFlow.flow.remoteProcessGroups,
                            state.addedCache,
                            state.removedCache,
                            response.connectedStateChanged
                        ),
                        funnels: processComponentCollection(
                            response.flow.processGroupFlow.flow.funnels,
                            state.flow.processGroupFlow.flow.funnels,
                            state.addedCache,
                            state.removedCache,
                            response.connectedStateChanged
                        ),
                        labels: processComponentCollection(
                            response.flow.processGroupFlow.flow.labels,
                            state.flow.processGroupFlow.flow.labels,
                            state.addedCache,
                            state.removedCache,
                            response.connectedStateChanged
                        ),
                        connections: processComponentCollection(
                            response.flow.processGroupFlow.flow.connections,
                            state.flow.processGroupFlow.flow.connections,
                            state.addedCache,
                            state.removedCache,
                            response.connectedStateChanged
                        )
                    }
                }
            };
            draftState.flowStatus = response.flowStatus;
            draftState.controllerBulletins = response.controllerBulletins;
            draftState.registryClients = response.registryClients;
            draftState.addedCache = [];
            draftState.removedCache = [];
            draftState.status = 'success' as const;
        });
    }),
    on(setRegistryClients, (state, { request }) => ({
        ...state,
        registryClients: request
    })),
    on(loadProcessGroupComplete, (state) => ({
        ...state,
        status: 'complete' as const
    })),
    on(loadConnectionSuccess, (state, { response }) => {
        return produce(state, (draftState) => {
            const proposedConnection = response.connection;
            const componentIndex: number = draftState.flow.processGroupFlow.flow.connections.findIndex(
                (f: any) => proposedConnection.id === f.id
            );
            if (componentIndex > -1) {
                const currentConnection = draftState.flow.processGroupFlow.flow.connections[componentIndex];
                const isNewerOrEqualRevision =
                    proposedConnection.revision.version >= currentConnection.revision.version;

                if (isNewerOrEqualRevision) {
                    draftState.flow.processGroupFlow.flow.connections[componentIndex] = proposedConnection;
                }
            }
        });
    }),
    on(loadProcessorSuccess, pollProcessorUntilStoppedSuccess, (state, { response }) => {
        return produce(state, (draftState) => {
            const proposedProcessor = response.processor;
            const componentIndex: number = draftState.flow.processGroupFlow.flow.processors.findIndex(
                (f: any) => proposedProcessor.id === f.id
            );
            if (componentIndex > -1) {
                const currentProcessor = draftState.flow.processGroupFlow.flow.processors[componentIndex];
                const isNewerOrEqualRevision = proposedProcessor.revision.version >= currentProcessor.revision.version;

                if (isNewerOrEqualRevision) {
                    draftState.flow.processGroupFlow.flow.processors[componentIndex] = proposedProcessor;
                }
            }
        });
    }),
    on(loadInputPortSuccess, (state, { response }) => {
        return produce(state, (draftState) => {
            const proposedInputPort = response.inputPort;
            const componentIndex: number = draftState.flow.processGroupFlow.flow.inputPorts.findIndex(
                (f: any) => proposedInputPort.id === f.id
            );
            if (componentIndex > -1) {
                const currentInputPort = draftState.flow.processGroupFlow.flow.inputPorts[componentIndex];
                const isNewerOrEqualRevision = proposedInputPort.revision.version >= currentInputPort.revision.version;

                if (isNewerOrEqualRevision) {
                    draftState.flow.processGroupFlow.flow.inputPorts[componentIndex] = proposedInputPort;
                }
            }
        });
    }),
    on(loadRemoteProcessGroupSuccess, (state, { response }) => {
        return produce(state, (draftState) => {
            const proposedRemoteProcessGroup = response.remoteProcessGroup;
            const componentIndex: number = draftState.flow.processGroupFlow.flow.remoteProcessGroups.findIndex(
                (f: any) => proposedRemoteProcessGroup.id === f.id
            );
            if (componentIndex > -1) {
                const currentRemoteProcessGroup =
                    draftState.flow.processGroupFlow.flow.remoteProcessGroups[componentIndex];
                const isNewerOrEqualRevision =
                    proposedRemoteProcessGroup.revision.version >= currentRemoteProcessGroup.revision.version;

                if (isNewerOrEqualRevision) {
                    draftState.flow.processGroupFlow.flow.remoteProcessGroups[componentIndex] =
                        proposedRemoteProcessGroup;
                }
            }
        });
    }),
    on(loadChildProcessGroupSuccess, (state, { response }) => {
        return produce(state, (draftState) => {
            const proposedChildProcessGroup = response;
            const componentIndex: number = draftState.flow.processGroupFlow.flow.processGroups.findIndex(
                (f: any) => proposedChildProcessGroup.id === f.id
            );
            if (componentIndex > -1) {
                const currentChildProcessGroup = draftState.flow.processGroupFlow.flow.processGroups[componentIndex];
                const isNewerOrEqualRevision =
                    proposedChildProcessGroup.revision.version >= currentChildProcessGroup.revision.version;

                if (isNewerOrEqualRevision) {
                    draftState.flow.processGroupFlow.flow.processGroups[componentIndex] = proposedChildProcessGroup;
                }
            }

            draftState.saving = false;
        });
    }),
    on(flowBannerError, flowSnackbarError, (state) => ({
        ...state,
        dragging: false,
        saving: false,
        versionSaving: false
    })),
    on(startPollingProcessorUntilStopped, (state, { request }) => ({
        ...state,
        pollingProcessor: request
    })),
    on(stopPollingProcessor, (state) => ({
        ...state,
        pollingProcessor: null
    })),
    on(
        createProcessor,
        createProcessGroup,
        uploadProcessGroup,
        groupComponents,
        createConnection,
        createPort,
        createFunnel,
        createLabel,
        importFromRegistry,
        (state) => ({
            ...state,
            saving: true
        })
    ),
    on(createComponentSuccess, groupComponentsSuccess, (state, { response }) => {
        return produce(state, (draftState) => {
            const collection: any[] | null = getComponentCollection(draftState, response.type);

            if (collection) {
                collection.push(response.payload);
            }
        });
    }),
    on(createComponentComplete, (state, { response }) => {
        return produce(state, (draftState) => {
            draftState.addedCache.push(response.payload.id);
            draftState.dragging = false;
            draftState.saving = false;
        });
    }),
    on(
        updateComponent,
        updateProcessor,
        updateConnection,
        enableComponent,
        disableComponent,
        startComponent,
        stopComponent,
        runOnce,
        (state) => ({
            ...state,
            saving: true
        })
    ),
    on(
        enableProcessGroupSuccess,
        disableProcessGroupSuccess,
        startProcessGroupSuccess,
        stopProcessGroupSuccess,
        (state) => ({
            ...state,
            saving: false
        })
    ),
    on(updateComponentSuccess, updateProcessorSuccess, updateConnectionSuccess, (state, { response }) => {
        return produce(state, (draftState) => {
            const collection: any[] | null = getComponentCollection(draftState, response.type);

            if (collection) {
                const componentIndex: number = collection.findIndex((f: any) => response.id === f.id);
                if (componentIndex > -1) {
                    collection[componentIndex] = response.response;
                }
            }

            draftState.saving = false;
        });
    }),
    on(updateComponentFailure, (state, { response }) => {
        return produce(state, (draftState) => {
            if (response.restoreOnFailure) {
                const collection: any[] | null = getComponentCollection(draftState, response.type);

                if (collection) {
                    const componentIndex: number = collection.findIndex((f: any) => response.id === f.id);
                    if (componentIndex > -1) {