diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/workflow/publish.ts b/invokeai/frontend/web/src/features/nodes/components/sidePanel/workflow/publish.ts index b754a1a05c..397d127b2f 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/workflow/publish.ts +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/workflow/publish.ts @@ -6,7 +6,7 @@ import { $templates } from 'features/nodes/store/nodesSlice'; import { selectNodes, selectNodesSlice, - selectWorkflowFormNodeFieldFieldIdentifiers, + selectWorkflowFormNodeFieldFieldIdentifiersDeduped, selectWorkflowId, } from 'features/nodes/store/selectors'; import type { Templates } from 'features/nodes/store/types'; @@ -54,7 +54,7 @@ export const useIsValidationRunInProgress = () => { }; export const selectFieldIdentifiersWithInvocationTypes = createSelector( - selectWorkflowFormNodeFieldFieldIdentifiers, + selectWorkflowFormNodeFieldFieldIdentifiersDeduped, selectNodesSlice, (fieldIdentifiers, nodes) => { const result: FieldIdentiferWithLabelAndType[] = []; diff --git a/invokeai/frontend/web/src/features/nodes/store/selectors.ts b/invokeai/frontend/web/src/features/nodes/store/selectors.ts index 177efefde1..0a1ef2f0ff 100644 --- a/invokeai/frontend/web/src/features/nodes/store/selectors.ts +++ b/invokeai/frontend/web/src/features/nodes/store/selectors.ts @@ -1,6 +1,7 @@ import type { Selector } from '@reduxjs/toolkit'; import { createSelector } from '@reduxjs/toolkit'; import type { RootState } from 'app/store/store'; +import { uniqBy } from 'es-toolkit/compat'; import { getElement } from 'features/nodes/components/sidePanel/builder/form-manipulation'; import type { NodesState } from 'features/nodes/store/types'; import type { FieldInputInstance } from 'features/nodes/types/field'; @@ -93,13 +94,16 @@ export const selectFormInitialValues = createNodesSelector((workflow) => workflo export const selectNodeFieldElements = createNodesSelector((workflow) => Object.values(workflow.form.elements).filter(isNodeFieldElement) ); -export const selectWorkflowFormNodeFieldFieldIdentifiers = createSelector( +export const selectWorkflowFormNodeFieldFieldIdentifiersDeduped = createSelector( selectNodeFieldElements, - (nodeFieldElements) => nodeFieldElements.map((el) => el.data.fieldIdentifier) + (nodeFieldElements) => + uniqBy(nodeFieldElements, (el) => `${el.data.fieldIdentifier.nodeId}-${el.data.fieldIdentifier.fieldName}`).map( + (el) => el.data.fieldIdentifier + ) ); export const buildSelectElement = (id: string) => createNodesSelector((workflow) => workflow.form?.elements[id]); export const buildSelectWorkflowFormNodeExists = (nodeId: string, fieldName: string) => - createSelector(selectWorkflowFormNodeFieldFieldIdentifiers, (identifiers) => + createSelector(selectWorkflowFormNodeFieldFieldIdentifiersDeduped, (identifiers) => identifiers.some((identifier) => identifier.nodeId === nodeId && identifier.fieldName === fieldName) );