mirror of
https://github.com/invoke-ai/InvokeAI.git
synced 2026-02-14 22:35:00 -05:00
tidy(ui): split up FormElementEditModeHeader components
This commit is contained in:
committed by
Kent Keirsey
parent
e9e2bab4ee
commit
3045cd7b3a
@@ -5,14 +5,13 @@ import { ContainerElementSettings } from 'features/nodes/components/sidePanel/bu
|
||||
import { useDepthContext } from 'features/nodes/components/sidePanel/builder/contexts';
|
||||
import { NodeFieldElementSettings } from 'features/nodes/components/sidePanel/builder/NodeFieldElementSettings';
|
||||
import { formElementRemoved } from 'features/nodes/store/workflowSlice';
|
||||
import { type FormElement, isContainerElement, isNodeFieldElement } from 'features/nodes/types/workflow';
|
||||
import type { FormElement } from 'features/nodes/types/workflow';
|
||||
import { isContainerElement, isNodeFieldElement } from 'features/nodes/types/workflow';
|
||||
import { startCase } from 'lodash-es';
|
||||
import { memo, useCallback, useMemo } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { PiXBold } from 'react-icons/pi';
|
||||
|
||||
import { useIsRootElement } from './dnd-hooks';
|
||||
|
||||
const sx: SystemStyleObject = {
|
||||
w: 'full',
|
||||
ps: 2,
|
||||
@@ -26,56 +25,62 @@ const sx: SystemStyleObject = {
|
||||
'&[data-depth="0"]': { bg: 'baseAlpha.100' },
|
||||
'&[data-depth="1"]': { bg: 'baseAlpha.150' },
|
||||
'&[data-depth="2"]': { bg: 'baseAlpha.200' },
|
||||
'&[data-is-root="false"]': { cursor: 'grab' },
|
||||
};
|
||||
|
||||
export const FormElementEditModeHeader = memo(
|
||||
forwardRef(({ element }: { element: FormElement }, ref) => {
|
||||
const { t } = useTranslation();
|
||||
const depth = useDepthContext();
|
||||
const dispatch = useAppDispatch();
|
||||
const isRootElement = useIsRootElement(element.id);
|
||||
const removeElement = useCallback(() => {
|
||||
if (isRootElement) {
|
||||
return;
|
||||
}
|
||||
dispatch(formElementRemoved({ id: element.id }));
|
||||
}, [dispatch, element.id, isRootElement]);
|
||||
const label = useMemo(() => {
|
||||
if (isRootElement) {
|
||||
return 'Root Container';
|
||||
}
|
||||
if (isContainerElement(element) && element.data.layout === 'column') {
|
||||
return `Container (column layout)`;
|
||||
}
|
||||
if (isContainerElement(element) && element.data.layout === 'row') {
|
||||
return `Container (row layout)`;
|
||||
}
|
||||
return startCase(element.type);
|
||||
}, [element, isRootElement]);
|
||||
|
||||
return (
|
||||
<Flex ref={ref} sx={sx} data-depth={depth} data-is-root={isRootElement}>
|
||||
<Text fontWeight="semibold" noOfLines={1} wordBreak="break-all" userSelect="none">
|
||||
{label}
|
||||
</Text>
|
||||
<Flex ref={ref} sx={sx} data-depth={depth}>
|
||||
<Label element={element} />
|
||||
<Spacer />
|
||||
{isContainerElement(element) && !isRootElement && <ContainerElementSettings element={element} />}
|
||||
{isContainerElement(element) && <ContainerElementSettings element={element} />}
|
||||
{isNodeFieldElement(element) && <NodeFieldElementSettings element={element} />}
|
||||
{!isRootElement && (
|
||||
<IconButton
|
||||
tooltip={t('common.delete')}
|
||||
aria-label={t('common.delete')}
|
||||
onClick={removeElement}
|
||||
icon={<PiXBold />}
|
||||
variant="link"
|
||||
size="sm"
|
||||
alignSelf="stretch"
|
||||
colorScheme="error"
|
||||
/>
|
||||
)}
|
||||
<RemoveElementButton element={element} />
|
||||
</Flex>
|
||||
);
|
||||
})
|
||||
);
|
||||
FormElementEditModeHeader.displayName = 'FormElementEditModeHeader';
|
||||
|
||||
const RemoveElementButton = memo(({ element }: { element: FormElement }) => {
|
||||
const { t } = useTranslation();
|
||||
const dispatch = useAppDispatch();
|
||||
const removeElement = useCallback(() => {
|
||||
dispatch(formElementRemoved({ id: element.id }));
|
||||
}, [dispatch, element.id]);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
tooltip={t('common.delete')}
|
||||
aria-label={t('common.delete')}
|
||||
onClick={removeElement}
|
||||
icon={<PiXBold />}
|
||||
variant="link"
|
||||
size="sm"
|
||||
alignSelf="stretch"
|
||||
colorScheme="error"
|
||||
/>
|
||||
);
|
||||
});
|
||||
RemoveElementButton.displayName = 'RemoveElementButton';
|
||||
|
||||
const Label = memo(({ element }: { element: FormElement }) => {
|
||||
const label = useMemo(() => {
|
||||
if (isContainerElement(element) && element.data.layout === 'column') {
|
||||
return `Container (column layout)`;
|
||||
}
|
||||
if (isContainerElement(element) && element.data.layout === 'row') {
|
||||
return `Container (row layout)`;
|
||||
}
|
||||
return startCase(element.type);
|
||||
}, [element]);
|
||||
|
||||
return (
|
||||
<Text fontWeight="semibold" noOfLines={1} wordBreak="break-all" userSelect="none">
|
||||
{label}
|
||||
</Text>
|
||||
);
|
||||
});
|
||||
Label.displayName = 'Label';
|
||||
|
||||
Reference in New Issue
Block a user