mirror of
https://github.com/invoke-ai/InvokeAI.git
synced 2026-04-23 03:00:31 -04:00
revert(ui): rip out linear view config stuff
This commit is contained in:
@@ -2,7 +2,6 @@ import type { SystemStyleObject } from '@invoke-ai/ui-library';
|
||||
import { Box, Circle, Flex, IconButton, Spacer } from '@invoke-ai/ui-library';
|
||||
import { useAppDispatch } from 'app/store/storeHooks';
|
||||
import { DndListDropIndicator } from 'features/dnd/DndListDropIndicator';
|
||||
import { InputFieldLinearViewConfigIconButton } from 'features/nodes/components/flow/nodes/Invocation/fields/InputFieldLinearViewConfigIconButton';
|
||||
import { InputFieldNotesIconButtonEditable } from 'features/nodes/components/flow/nodes/Invocation/fields/InputFieldNotesIconButtonEditable';
|
||||
import { InputFieldResetToInitialValueIconButton } from 'features/nodes/components/flow/nodes/Invocation/fields/InputFieldResetToInitialValueIconButton';
|
||||
import { useLinearViewFieldDnd } from 'features/nodes/components/sidePanel/workflow/useLinearViewFieldDnd';
|
||||
@@ -61,7 +60,6 @@ export const InputFieldEditModeLinear = memo(({ nodeId, fieldName }: Props) => {
|
||||
<InputFieldTitle nodeId={nodeId} fieldName={fieldName} />
|
||||
<Spacer />
|
||||
{isMouseOverNode && <Circle me={2} size={2} borderRadius="full" bg="invokeBlue.500" />}
|
||||
<InputFieldLinearViewConfigIconButton nodeId={nodeId} fieldName={fieldName} />
|
||||
<InputFieldNotesIconButtonEditable nodeId={nodeId} fieldName={fieldName} />
|
||||
<InputFieldResetToInitialValueIconButton nodeId={nodeId} fieldName={fieldName} />
|
||||
<IconButton
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
import {
|
||||
FormControl,
|
||||
FormLabel,
|
||||
IconButton,
|
||||
Popover,
|
||||
PopoverContent,
|
||||
PopoverTrigger,
|
||||
Select,
|
||||
} from '@invoke-ai/ui-library';
|
||||
import { useAppDispatch } from 'app/store/storeHooks';
|
||||
import { useInputFieldIsExposed } from 'features/nodes/hooks/useInputFieldIsExposed';
|
||||
import { useInputFieldLinearViewConfig } from 'features/nodes/hooks/useInputFieldLinearViewConfig';
|
||||
import { fieldLinearViewConfigChanged } from 'features/nodes/store/nodesSlice';
|
||||
import type { FieldInputInstance } from 'features/nodes/types/field';
|
||||
import type { ChangeEvent } from 'react';
|
||||
import { memo, useCallback } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { PiWrenchFill } from 'react-icons/pi';
|
||||
|
||||
type Props = {
|
||||
nodeId: string;
|
||||
fieldName: string;
|
||||
};
|
||||
|
||||
const parseNotesDisplay = (
|
||||
notesDisplay: string
|
||||
): NonNullable<FieldInputInstance['linearViewConfig']>['notesDisplay'] => {
|
||||
switch (notesDisplay) {
|
||||
case 'none':
|
||||
return 'none';
|
||||
case 'helper-text':
|
||||
return 'helper-text';
|
||||
case 'icon-with-popover':
|
||||
return 'icon-with-popover';
|
||||
default:
|
||||
return 'none';
|
||||
}
|
||||
};
|
||||
|
||||
export const InputFieldLinearViewConfigIconButton = memo(({ nodeId, fieldName }: Props) => {
|
||||
const dispatch = useAppDispatch();
|
||||
const { t } = useTranslation();
|
||||
const isExposed = useInputFieldIsExposed(nodeId, fieldName);
|
||||
const linearViewConfig = useInputFieldLinearViewConfig(nodeId, fieldName);
|
||||
const onChangeNotesDisplay = useCallback(
|
||||
(e: ChangeEvent<HTMLSelectElement>) => {
|
||||
const notesDisplay = parseNotesDisplay(e.target.value);
|
||||
dispatch(
|
||||
fieldLinearViewConfigChanged({ nodeId, fieldName, linearViewConfig: { ...linearViewConfig, notesDisplay } })
|
||||
);
|
||||
},
|
||||
[dispatch, fieldName, linearViewConfig, nodeId]
|
||||
);
|
||||
|
||||
if (!isExposed) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Popover>
|
||||
<PopoverTrigger>
|
||||
<IconButton
|
||||
variant="ghost"
|
||||
tooltip="Linear View Config"
|
||||
aria-label="Linear View Config"
|
||||
icon={<PiWrenchFill />}
|
||||
pointerEvents="auto"
|
||||
size="xs"
|
||||
/>
|
||||
</PopoverTrigger>
|
||||
<PopoverContent p={2} w={256}>
|
||||
<FormControl orientation="vertical">
|
||||
<FormLabel>{t('nodes.notesDisplay')}</FormLabel>
|
||||
<Select value={linearViewConfig?.notesDisplay ?? 'none'} onChange={onChangeNotesDisplay}>
|
||||
<option value="none">{t('common.none')}</option>
|
||||
<option value="helper-text">{t('nodes.helperText')}</option>
|
||||
<option value="icon-with-popover">{t('nodes.iconWithPopover')}</option>
|
||||
</Select>
|
||||
</FormControl>
|
||||
</PopoverContent>
|
||||
</Popover>
|
||||
);
|
||||
});
|
||||
|
||||
InputFieldLinearViewConfigIconButton.displayName = 'InputFieldLinearViewConfigIconButton';
|
||||
@@ -1,10 +1,7 @@
|
||||
import { Box, FormControl, FormLabel, Spacer } from '@invoke-ai/ui-library';
|
||||
import { InputFieldNotesHelperText } from 'features/nodes/components/flow/nodes/Invocation/fields/InputFieldNotesHelperText';
|
||||
import { InputFieldNotesIconButtonReadonly } from 'features/nodes/components/flow/nodes/Invocation/fields/InputFieldNotesIconButtonReadonly';
|
||||
import { InputFieldRenderer } from 'features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer';
|
||||
import { InputFieldResetToInitialValueIconButton } from 'features/nodes/components/flow/nodes/Invocation/fields/InputFieldResetToInitialValueIconButton';
|
||||
import { useInputFieldLabel } from 'features/nodes/hooks/useInputFieldLabel';
|
||||
import { useInputFieldLinearViewConfig } from 'features/nodes/hooks/useInputFieldLinearViewConfig';
|
||||
import { useInputFieldTemplateTitle } from 'features/nodes/hooks/useInputFieldTemplateTitle';
|
||||
import { memo } from 'react';
|
||||
|
||||
@@ -16,24 +13,17 @@ type Props = {
|
||||
export const InputFieldViewMode = memo(({ nodeId, fieldName }: Props) => {
|
||||
const label = useInputFieldLabel(nodeId, fieldName);
|
||||
const fieldTemplateTitle = useInputFieldTemplateTitle(nodeId, fieldName);
|
||||
const linearViewConfig = useInputFieldLinearViewConfig(nodeId, fieldName);
|
||||
|
||||
return (
|
||||
<FormControl w="full" gap={2} flexDir="column">
|
||||
<FormLabel fontSize="sm" display="flex" w="full" m={0} gap={2} px={1}>
|
||||
{label || fieldTemplateTitle}
|
||||
<Spacer />
|
||||
{linearViewConfig?.notesDisplay === 'icon-with-popover' && (
|
||||
<InputFieldNotesIconButtonReadonly nodeId={nodeId} fieldName={fieldName} />
|
||||
)}
|
||||
<InputFieldResetToInitialValueIconButton nodeId={nodeId} fieldName={fieldName} />
|
||||
</FormLabel>
|
||||
<Box w="full" h="full">
|
||||
<InputFieldRenderer nodeId={nodeId} fieldName={fieldName} />
|
||||
</Box>
|
||||
{linearViewConfig?.notesDisplay === 'helper-text' && (
|
||||
<InputFieldNotesHelperText nodeId={nodeId} fieldName={fieldName} />
|
||||
)}
|
||||
</FormControl>
|
||||
);
|
||||
});
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
import { createSelector } from '@reduxjs/toolkit';
|
||||
import { useAppSelector } from 'app/store/storeHooks';
|
||||
import { selectNodesSlice } from 'features/nodes/store/selectors';
|
||||
import { isInvocationNode } from 'features/nodes/types/invocation';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
export const useInputFieldLinearViewConfig = (nodeId: string, fieldName: string) => {
|
||||
const selector = useMemo(
|
||||
() =>
|
||||
createSelector(selectNodesSlice, (nodes) => {
|
||||
const node = nodes.nodes.find((node) => node.id === nodeId);
|
||||
if (!isInvocationNode(node)) {
|
||||
return;
|
||||
}
|
||||
return node?.data.inputs[fieldName]?.linearViewConfig;
|
||||
}),
|
||||
[fieldName, nodeId]
|
||||
);
|
||||
|
||||
const linearViewConfig = useAppSelector(selector);
|
||||
return linearViewConfig;
|
||||
};
|
||||
@@ -14,7 +14,6 @@ import type {
|
||||
ControlLoRAModelFieldValue,
|
||||
ControlNetModelFieldValue,
|
||||
EnumFieldValue,
|
||||
FieldInputInstance,
|
||||
FieldValue,
|
||||
FloatFieldValue,
|
||||
FloatGeneratorFieldValue,
|
||||
@@ -431,21 +430,6 @@ export const nodesSlice = createSlice({
|
||||
}
|
||||
field.notes = val;
|
||||
},
|
||||
fieldLinearViewConfigChanged: (
|
||||
state,
|
||||
action: PayloadAction<{
|
||||
nodeId: string;
|
||||
fieldName: string;
|
||||
linearViewConfig?: FieldInputInstance['linearViewConfig'];
|
||||
}>
|
||||
) => {
|
||||
const { nodeId, fieldName, linearViewConfig } = action.payload;
|
||||
const field = getField(nodeId, fieldName, state);
|
||||
if (!field) {
|
||||
return;
|
||||
}
|
||||
field.linearViewConfig = linearViewConfig;
|
||||
},
|
||||
notesNodeValueChanged: (state, action: PayloadAction<{ nodeId: string; value: string }>) => {
|
||||
const { nodeId, value } = action.payload;
|
||||
const nodeIndex = state.nodes.findIndex((n) => n.id === nodeId);
|
||||
@@ -516,7 +500,6 @@ export const {
|
||||
fieldIntegerGeneratorValueChanged,
|
||||
fieldStringGeneratorValueChanged,
|
||||
fieldNotesChanged,
|
||||
fieldLinearViewConfigChanged,
|
||||
nodeEditorReset,
|
||||
nodeIsIntermediateChanged,
|
||||
nodeIsOpenChanged,
|
||||
|
||||
@@ -35,14 +35,10 @@ import { zBoardField, zColorField, zImageField, zModelIdentifierField, zSchedule
|
||||
// #region Base schemas & misc
|
||||
const zFieldInput = z.enum(['connection', 'direct', 'any']);
|
||||
const zFieldUIComponent = z.enum(['none', 'textarea', 'slider']);
|
||||
const zFieldInputInstanceLinearViewConfigBase = z.object({
|
||||
notesDisplay: z.enum(['none', 'helper-text', 'icon-with-popover']).nullish(),
|
||||
});
|
||||
const zFieldInputInstanceBase = z.object({
|
||||
name: z.string().trim().min(1),
|
||||
label: z.string().nullish(),
|
||||
notes: z.string().nullish(),
|
||||
linearViewConfig: zFieldInputInstanceLinearViewConfigBase.nullish(),
|
||||
});
|
||||
const zFieldTemplateBase = z.object({
|
||||
name: z.string().min(1),
|
||||
|
||||
Reference in New Issue
Block a user