Fixed name and description for Custom Component when they are empty

This commit is contained in:
Lucas Oliveira 2023-12-09 21:58:20 -03:00
commit 06e17ada01
6 changed files with 22 additions and 14 deletions

View file

@ -3,8 +3,6 @@ from langflow.field_typing import Data
class Component(CustomComponent): class Component(CustomComponent):
display_name: str = "Custom Component"
description: str = "Create any custom component you want!"
documentation: str = "http://docs.langflow.org/components/custom" documentation: str = "http://docs.langflow.org/components/custom"
def build_config(self): def build_config(self):

View file

@ -19,8 +19,8 @@ from langflow.utils import validate
class CustomComponent(Component): class CustomComponent(Component):
display_name: Optional[str] = "Custom Component" display_name: Optional[str] = None
description: Optional[str] = "Custom Component" description: Optional[str] = None
code: Optional[str] = None code: Optional[str] = None
field_config: dict = {} field_config: dict = {}
code_class_base_inheritance: ClassVar[str] = "CustomComponent" code_class_base_inheritance: ClassVar[str] = "CustomComponent"

View file

@ -75,7 +75,7 @@ class FrontendNode(BaseModel):
"template": self.template.to_dict(self.format_field), "template": self.template.to_dict(self.format_field),
"description": self.description, "description": self.description,
"base_classes": self.base_classes, "base_classes": self.base_classes,
"display_name": self.display_name or self.name, "display_name": self.display_name,
"custom_fields": self.custom_fields, "custom_fields": self.custom_fields,
"output_types": self.output_types, "output_types": self.output_types,
"documentation": self.documentation, "documentation": self.documentation,

View file

@ -46,7 +46,7 @@ class Component(CustomComponent):
class CustomComponentFrontendNode(FrontendNode): class CustomComponentFrontendNode(FrontendNode):
name: str = "CustomComponent" name: str = "CustomComponent"
display_name: str = "Custom Component" display_name: str = None
beta: bool = True beta: bool = True
template: Template = Template( template: Template = Template(
type_name="CustomComponent", type_name="CustomComponent",

View file

@ -156,11 +156,16 @@ export default function ParameterComponent({
}; };
const handleNodeClass = (newNodeClass: APIClassType, code?: string): void => { const handleNodeClass = (newNodeClass: APIClassType, code?: string): void => {
if (!data.node) return;
if (data.node!.template[name].value !== newNodeClass.template[name].value) { if (data.node!.template[name].value !== newNodeClass.template[name].value) {
takeSnapshot(); takeSnapshot();
} }
data.node = newNodeClass; data.node! = {
data.node.template[name].value = code; ...newNodeClass,
description: newNodeClass.description ?? data.node!.description,
display_name: newNodeClass.display_name ?? data.node!.display_name,
};
data.node!.template[name].value = code;
updateNodeInternals(data.id); updateNodeInternals(data.id);
// Set state to pending // Set state to pending
//@ts-ignore //@ts-ignore

View file

@ -107,6 +107,8 @@ export default function GenericNode({
const showNode = data.showNode ?? true; const showNode = data.showNode ?? true;
const nameEditable = data.node?.flow || data.type === "CustomComponent";
return ( return (
<> <>
<NodeToolbar> <NodeToolbar>
@ -164,7 +166,7 @@ export default function GenericNode({
/> />
{showNode && ( {showNode && (
<div className="generic-node-tooltip-div"> <div className="generic-node-tooltip-div">
{data.node?.flow && inputName ? ( {nameEditable && inputName ? (
<div> <div>
<InputComponent <InputComponent
onBlur={() => { onBlur={() => {
@ -194,7 +196,7 @@ export default function GenericNode({
<div className="generic-node-tooltip-div pr-2 text-primary"> <div className="generic-node-tooltip-div pr-2 text-primary">
{data.node?.display_name} {data.node?.display_name}
</div> </div>
{data.node?.flow && ( {nameEditable && (
<IconComponent <IconComponent
name="Pencil" name="Pencil"
className="h-4 w-4 text-ring" className="h-4 w-4 text-ring"
@ -362,14 +364,14 @@ export default function GenericNode({
className={ className={
showNode showNode
? "overflow-hidden " + ? "overflow-hidden " +
(data.node?.description === "" && !data.node?.flow (data.node?.description === "" && !nameEditable
? "pb-5" ? "pb-5"
: "py-5") : "py-5")
: "" : ""
} }
> >
<div className="generic-node-desc"> <div className="generic-node-desc">
{showNode && data.node?.flow && inputDescription ? ( {showNode && nameEditable && inputDescription ? (
<Textarea <Textarea
autoFocus autoFocus
onBlur={() => { onBlur={() => {
@ -401,7 +403,9 @@ export default function GenericNode({
<div <div
className={cn( className={cn(
"generic-node-desc-text truncate-multiline word-break-break-word", "generic-node-desc-text truncate-multiline word-break-break-word",
data.node?.description === "" && data.node?.flow (data.node?.description === "" ||
!data.node?.description) &&
nameEditable
? "font-light italic" ? "font-light italic"
: "" : ""
)} )}
@ -410,7 +414,8 @@ export default function GenericNode({
takeSnapshot(); takeSnapshot();
}} }}
> >
{data.node?.description === "" && data.node?.flow {(data.node?.description === "" || !data.node?.description) &&
nameEditable
? "Double Click to Edit Description" ? "Double Click to Edit Description"
: data.node?.description} : data.node?.description}
</div> </div>