Refactor: Minimize only works with 1 handle node and change minimized node UI

This commit is contained in:
igorrCarvalho 2023-09-13 17:23:35 -03:00
commit c70de1e881
4 changed files with 61 additions and 21 deletions

View file

@ -32,7 +32,7 @@ import {
} from "../../../../utils/styleUtils"; } from "../../../../utils/styleUtils";
import { classNames, groupByFamily } from "../../../../utils/utils"; import { classNames, groupByFamily } from "../../../../utils/utils";
export default function ParameterComponent({ export default function ParameterComponent({
left, left,
id, id,
data, data,
@ -181,11 +181,6 @@ export default function ParameterComponent({
return ( return (
!showNode ? ( !showNode ? (
<div
ref={ref}
className="mt-1 flex w-full flex-wrap items-center justify-between bg-muted px-5 py-2"
>
{
left && left &&
(type === "str" || (type === "str" ||
type === "bool" || type === "bool" ||
@ -211,7 +206,7 @@ export default function ParameterComponent({
isValidConnection(connection, reactFlowInstance!) isValidConnection(connection, reactFlowInstance!)
} }
className={classNames( className={classNames(
left ? "-ml-0.5 " : "-mr-0.5 ", left ? "-ml-0.5 my-12 " : " -mr-0.4 my-12 ",
"h-3 w-3 rounded-full border-2 bg-background" "h-3 w-3 rounded-full border-2 bg-background"
)} )}
style={{ style={{
@ -220,8 +215,7 @@ export default function ParameterComponent({
}} }}
></Handle> ></Handle>
</ShadTooltip> </ShadTooltip>
)} )
</ div>
) : ( ) : (
<div <div
ref={ref} ref={ref}

View file

@ -31,6 +31,39 @@ export default function GenericNode({
const [validationStatus, setValidationStatus] = const [validationStatus, setValidationStatus] =
useState<validationStatusType | null>(null); useState<validationStatusType | null>(null);
const [showNode, setShowNode] = useState<boolean>(true); const [showNode, setShowNode] = useState<boolean>(true);
const [handles, setHandles] = useState<boolean[] | []>([]);
let numberOfInputs: boolean[] = [];
function countHandles(): void {
numberOfInputs = Object.keys(data.node!.template)
.filter((templateField) => templateField.charAt(0) !== "_").map((templateCamp) => {
if (!data.node?.template[templateCamp].show) return false
switch (data.node?.template[templateCamp].type) {
case "str":
return false;
case "bool":
return false;
case "float":
return false;
case "code":
return false;
case "prompt":
return false;
case "file":
return false;
case "int":
return false;
default:
return true
}
})
setHandles(numberOfInputs)
};
useEffect(() => {
countHandles();
}, [])
// State for outline color // State for outline color
const { sseData, isBuilding } = useSSE(); const { sseData, isBuilding } = useSSE();
useEffect(() => { useEffect(() => {
@ -51,7 +84,9 @@ export default function GenericNode({
}, },
}); });
updateFlow(flow); updateFlow(flow);
console.log(myFlow)
} }
countHandles();
}, [data]); }, [data]);
// New useEffect to watch for changes in sseData and update validation status // New useEffect to watch for changes in sseData and update validation status
@ -73,27 +108,28 @@ export default function GenericNode({
setData={setData} setData={setData}
deleteNode={deleteNode} deleteNode={deleteNode}
setShowNode={setShowNode} setShowNode={setShowNode}
numberOfHandles={handles}
></NodeToolbarComponent> ></NodeToolbarComponent>
</NodeToolbar> </NodeToolbar>
<div <div
className={classNames( className={classNames(
selected ? "border border-ring" : "border", selected ? "border border-ring" : "border",
showNode ? "w-96" : "w-32", showNode ? "w-96" : "w-24 h-24 rounded-full",
"generic-node-div", "generic-node-div",
)} )}
> >
{data.node?.beta && ( {data.node?.beta && showNode && (
<div className="beta-badge-wrapper"> <div className="beta-badge-wrapper">
<div className="beta-badge-content">BETA</div> <div className="beta-badge-content">BETA</div>
</div> </div>
)} )}
<div> <div>
<div className={"generic-node-div-title " + (!showNode ? "relative rounded-t-lg rounded-b-lg" : "justify-between rounded-t-lg")}> <div className={"generic-node-div-title " + (!showNode ? "relative rounded-full w-24 h-24" : "justify-between rounded-t-lg")}>
<div className={"generic-node-title-arrangement " + (!showNode && "justify-center")}> <div className={"generic-node-title-arrangement rounded-full" + (!showNode && "justify-center")}>
<IconComponent <IconComponent
name={name} name={name}
className={"generic-node-icon " + (!showNode && "absolute left-10")} className={"generic-node-icon " + (!showNode && "absolute left-7")}
iconColor={`${nodeColors[types[data.type]]}`} iconColor={`${nodeColors[types[data.type]]}`}
/> />
{showNode && ( {showNode && (
@ -112,8 +148,7 @@ export default function GenericNode({
{Object.keys(data.node!.template) {Object.keys(data.node!.template)
.filter((templateField) => templateField.charAt(0) !== "_") .filter((templateField) => templateField.charAt(0) !== "_")
.map((templateField: string, idx) => ( .map((templateField: string, idx) => (
<div key={idx}> data.node!.template[templateField].show &&
{data.node!.template[templateField].show &&
!data.node!.template[templateField].advanced && ( !data.node!.template[templateField].advanced && (
<ParameterComponent <ParameterComponent
key={ key={
@ -165,8 +200,7 @@ export default function GenericNode({
} }
showNode={showNode} showNode={showNode}
/> />
)} )))}
</div>))}
<ParameterComponent <ParameterComponent
key={[data.type, data.id, ...data.node!.base_classes].join("|")} key={[data.type, data.id, ...data.node!.base_classes].join("|")}
data={data} data={data}

View file

@ -12,6 +12,7 @@ export default function NodeToolbarComponent({
setData, setData,
deleteNode, deleteNode,
setShowNode, setShowNode,
numberOfHandles,
}: nodeToolbarPropsType): JSX.Element { }: nodeToolbarPropsType): JSX.Element {
const [nodeLength, setNodeLength] = useState( const [nodeLength, setNodeLength] = useState(
Object.keys(data.node!.template).filter( Object.keys(data.node!.template).filter(
@ -29,6 +30,15 @@ export default function NodeToolbarComponent({
).length ).length
); );
function canMinimize() {
let countHandles: number = 0;
numberOfHandles.forEach((bool) => {
if (bool) countHandles += 1;
});
if (countHandles > 1) return false;
return true;
}
const { paste } = useContext(TabsContext); const { paste } = useContext(TabsContext);
const reactFlowInstance = useReactFlow(); const reactFlowInstance = useReactFlow();
return ( return (
@ -119,11 +129,12 @@ export default function NodeToolbarComponent({
</div> </div>
</ShadTooltip> </ShadTooltip>
<ShadTooltip content="Minimize" side="top"> <ShadTooltip content={canMinimize() ? "Minimize" : "Only nodes with 1 or less input handles can minimize"} side="top">
<button <button
className="relative inline-flex items-center rounded-r-md bg-background px-2 py-2 text-foreground shadow-md ring-1 ring-inset ring-ring transition-all duration-500 ease-in-out hover:bg-muted focus:z-10" className="relative inline-flex items-center rounded-r-md bg-background px-2 py-2 text-foreground shadow-md ring-1 ring-inset ring-ring transition-all duration-500 ease-in-out hover:bg-muted focus:z-10"
onClick={() => { onClick={(event) => {
setShowNode(prev => !prev); if (canMinimize()) return setShowNode(prev => !prev);
event.preventDefault();
}} }}
> >
<IconComponent name="Minus" className="h-4 w-4" /> <IconComponent name="Minus" className="h-4 w-4" />

View file

@ -400,6 +400,7 @@ export type nodeToolbarPropsType = {
deleteNode: (idx: string) => void; deleteNode: (idx: string) => void;
setData: (newState: NodeDataType) => void; setData: (newState: NodeDataType) => void;
setShowNode: (boolean: any) => void; setShowNode: (boolean: any) => void;
numberOfHandles: boolean[] | [];
}; };
export type parsedDataType = { export type parsedDataType = {