Skip to content

Commit 3c43351

Browse files
feat(ui): add reset to default value button to field title
1 parent b1359b6 commit 3c43351

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { IconButton } from '@invoke-ai/ui-library';
2+
import { useAppDispatch } from 'app/store/storeHooks';
3+
import { useFieldInputTemplate } from 'features/nodes/hooks/useFieldInputTemplate';
4+
import { useFieldValue } from 'features/nodes/hooks/useFieldValue';
5+
import { fieldValueReset } from 'features/nodes/store/nodesSlice';
6+
import { isEqual } from 'lodash-es';
7+
import { memo, useCallback, useMemo } from 'react';
8+
import { useTranslation } from 'react-i18next';
9+
import { PiArrowCounterClockwiseBold } from 'react-icons/pi';
10+
11+
type Props = {
12+
nodeId: string;
13+
fieldName: string;
14+
};
15+
16+
const FieldResetToDefaultValueButton = ({ nodeId, fieldName }: Props) => {
17+
const dispatch = useAppDispatch();
18+
const { t } = useTranslation();
19+
const value = useFieldValue(nodeId, fieldName);
20+
const fieldTemplate = useFieldInputTemplate(nodeId, fieldName);
21+
const isDisabled = useMemo(() => {
22+
return isEqual(value, fieldTemplate.default);
23+
}, [value, fieldTemplate.default]);
24+
const onClick = useCallback(() => {
25+
dispatch(fieldValueReset({ nodeId, fieldName, value: fieldTemplate.default }));
26+
}, [dispatch, fieldName, fieldTemplate.default, nodeId]);
27+
28+
return (
29+
<IconButton
30+
variant="ghost"
31+
tooltip={t('nodes.resetToDefaultValue')}
32+
aria-label={t('nodes.resetToDefaultValue')}
33+
icon={<PiArrowCounterClockwiseBold />}
34+
onClick={onClick}
35+
isDisabled={isDisabled}
36+
pointerEvents="auto"
37+
size="xs"
38+
/>
39+
);
40+
};
41+
42+
export default memo(FieldResetToDefaultValueButton);

invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/InputField.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Flex, FormControl } from '@invoke-ai/ui-library';
2+
import FieldResetToDefaultValueButton from 'features/nodes/components/flow/nodes/Invocation/fields/FieldResetToDefaultValueButton';
23
import { useConnectionState } from 'features/nodes/hooks/useConnectionState';
34
import { useFieldInputTemplate } from 'features/nodes/hooks/useFieldInputTemplate';
45
import { useFieldIsInvalid } from 'features/nodes/hooks/useFieldIsInvalid';
@@ -68,8 +69,9 @@ const InputField = ({ nodeId, fieldName }: Props) => {
6869
px={2}
6970
>
7071
<Flex flexDir="column" w="full" gap={1} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>
71-
<Flex>
72+
<Flex gap={1}>
7273
<EditableFieldTitle nodeId={nodeId} fieldName={fieldName} kind="inputs" isInvalid={isInvalid} withTooltip />
74+
{isHovered && <FieldResetToDefaultValueButton nodeId={nodeId} fieldName={fieldName} />}
7375
{isHovered && <FieldLinearViewToggle nodeId={nodeId} fieldName={fieldName} />}
7476
</Flex>
7577
<InputFieldRenderer nodeId={nodeId} fieldName={fieldName} />

0 commit comments

Comments
 (0)