Merge remote-tracking branch 'origin/cz/bug/state/zustand' into update_lc

This commit is contained in:
anovazzi1 2024-01-10 17:47:33 -03:00
commit b4d9118748
6 changed files with 847 additions and 8129 deletions

34
package-lock.json generated
View file

@ -5,7 +5,6 @@
"packages": { "packages": {
"": { "": {
"dependencies": { "dependencies": {
"@preact/signals-react": "^2.0.0",
"@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-popover": "^1.0.7",
"cmdk": "^0.2.0" "cmdk": "^0.2.0"
} }
@ -55,31 +54,6 @@
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
"integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A=="
}, },
"node_modules/@preact/signals-core": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.5.1.tgz",
"integrity": "sha512-dE6f+WCX5ZUDwXzUIWNMhhglmuLpqJhuy3X3xHrhZYI0Hm2LyQwOu0l9mdPiWrVNsE+Q7txOnJPgtIqHCYoBVA==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/preact"
}
},
"node_modules/@preact/signals-react": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@preact/signals-react/-/signals-react-2.0.0.tgz",
"integrity": "sha512-tMVi2SXFXlojaiPNWa8dlYaidR/XvEgMSp+iymKJgMssBM/QVtUQrodKZek1BJju+dkVHiyeuQHmkuLOI9oyNw==",
"dependencies": {
"@preact/signals-core": "^1.5.1",
"use-sync-external-store": "^1.2.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/preact"
},
"peerDependencies": {
"react": "^16.14.0 || 17.x || 18.x"
}
},
"node_modules/@radix-ui/primitive": { "node_modules/@radix-ui/primitive": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz",
@ -953,14 +927,6 @@
"optional": true "optional": true
} }
} }
},
"node_modules/use-sync-external-store": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
"integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
} }
} }
} }

View file

@ -1,6 +1,5 @@
{ {
"dependencies": { "dependencies": {
"@preact/signals-react": "^2.0.0",
"@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-popover": "^1.0.7",
"cmdk": "^0.2.0" "cmdk": "^0.2.0"
} }

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,3 @@
import { useSignal, useSignalEffect } from "@preact/signals-react";
import { cloneDeep } from "lodash"; import { cloneDeep } from "lodash";
import { forwardRef, useEffect, useState } from "react"; import { forwardRef, useEffect, useState } from "react";
import ShadTooltip from "../../components/ShadTooltipComponent"; import ShadTooltip from "../../components/ShadTooltipComponent";
@ -55,31 +54,32 @@ const EditNodeModal = forwardRef(
}, },
ref ref
) => { ) => {
const [myData, setMyData] = useState(data);
const setPending = useFlowStore((state) => state.setPending);
const edges = useFlowStore((state) => state.edges); const edges = useFlowStore((state) => state.edges);
const setNode = useFlowStore((state) => state.setNode); const setNode = useFlowStore((state) => state.setNode);
const myData = useSignal(data);
const [render, setRender] = useState(false);
useSignalEffect(() => {
setRender(!render);
});
function changeAdvanced(n) { function changeAdvanced(n) {
const newValue = cloneDeep(myData.value); setMyData((old) => {
newValue.node!.template[n].advanced = let newData = cloneDeep(old);
!newValue.node!.template[n].advanced; newData.node!.template[n].advanced =
myData.value = newValue; !newData.node!.template[n].advanced;
return newData;
});
} }
const handleOnNewValue = (newValue: any, name) => { const handleOnNewValue = (newValue: any, name) => {
const newSignalValue = cloneDeep(myData.value); setMyData((old) => {
newSignalValue.node!.template[name].value = newValue; let newData = cloneDeep(old);
myData.value = newSignalValue; newData.node!.template[name].value = newValue;
return newData;
});
}; };
useEffect(() => { useEffect(() => {
if (open) { if (open) {
myData.value = cloneDeep(data); // clone data to avoid changing data on node when opening modal setMyData(data); // reset data to what it is on node when opening modal
} }
}, [open]); }, [open]);
@ -92,15 +92,15 @@ const EditNodeModal = forwardRef(
open={open} open={open}
setOpen={setOpen} setOpen={setOpen}
onChangeOpenModal={(open) => { onChangeOpenModal={(open) => {
myData.value = cloneDeep(data); setMyData(data);
}} }}
> >
<BaseModal.Trigger> <BaseModal.Trigger>
<></> <></>
</BaseModal.Trigger> </BaseModal.Trigger>
<BaseModal.Header description={myData.value.node?.description!}> <BaseModal.Header description={myData.node?.description!}>
<span className="pr-2">{myData.value.type}</span> <span className="pr-2">{myData.type}</span>
<Badge variant="secondary">ID: {myData.value.id}</Badge> <Badge variant="secondary">ID: {myData.id}</Badge>
</BaseModal.Header> </BaseModal.Header>
<BaseModal.Content> <BaseModal.Content>
<div className="flex pb-2"> <div className="flex pb-2">
@ -133,23 +133,21 @@ const EditNodeModal = forwardRef(
</TableRow> </TableRow>
</TableHeader> </TableHeader>
<TableBody className="p-0"> <TableBody className="p-0">
{Object.keys(myData.value.node!.template) {Object.keys(myData.node!.template)
.filter( .filter(
(templateParam) => (templateParam) =>
templateParam.charAt(0) !== "_" && templateParam.charAt(0) !== "_" &&
myData.value.node?.template[templateParam].show && myData.node?.template[templateParam].show &&
LANGFLOW_SUPPORTED_TYPES.has( LANGFLOW_SUPPORTED_TYPES.has(
myData.value?.node?.template[templateParam].type myData.node.template[templateParam].type
) )
) )
.map((templateParam, index) => { .map((templateParam, index) => {
let id = { let id = {
inputTypes: inputTypes:
myData.value.node!.template[templateParam] myData.node!.template[templateParam].input_types,
.input_types, type: myData.node!.template[templateParam].type,
type: myData.value.node!.template[templateParam] id: myData.id,
.type,
id: myData.value.id,
fieldName: templateParam, fieldName: templateParam,
}; };
let disabled = let disabled =
@ -157,14 +155,12 @@ const EditNodeModal = forwardRef(
(edge) => (edge) =>
edge.targetHandle === edge.targetHandle ===
scapedJSONStringfy( scapedJSONStringfy(
myData.value.node!.template[templateParam] myData.node!.template[templateParam].proxy
.proxy
? { ? {
...id, ...id,
proxy: proxy:
myData.value.node?.template[ myData.node?.template[templateParam]
templateParam .proxy,
].proxy,
} }
: id : id
) )
@ -174,46 +170,39 @@ const EditNodeModal = forwardRef(
<TableCell className="truncate p-0 text-center text-sm text-foreground sm:px-3"> <TableCell className="truncate p-0 text-center text-sm text-foreground sm:px-3">
<ShadTooltip <ShadTooltip
content={ content={
myData.value.node?.template[templateParam] myData.node?.template[templateParam].proxy
.proxy ? myData.node?.template[templateParam]
? myData.value.node?.template[ .proxy?.id
templateParam
].proxy?.id
: null : null
} }
> >
<span> <span>
{myData.value.node?.template[templateParam] {myData.node?.template[templateParam]
.display_name .display_name
? myData.value?.node?.template[ ? myData.node.template[templateParam]
templateParam .display_name
].display_name : myData.node?.template[templateParam]
: myData.value.node?.template[ .name}
templateParam
].name}
</span> </span>
</ShadTooltip> </ShadTooltip>
</TableCell> </TableCell>
<TableCell className="w-[300px] p-0 text-center text-xs text-foreground "> <TableCell className="w-[300px] p-0 text-center text-xs text-foreground ">
{myData.value.node?.template[templateParam] {myData.node?.template[templateParam].type ===
.type === "str" && "str" &&
!myData.value?.node?.template[templateParam] !myData.node.template[templateParam].options ? (
.options ? (
<div className="mx-auto"> <div className="mx-auto">
{myData.value?.node?.template[templateParam] {myData.node.template[templateParam]
.list ? ( .list ? (
<InputListComponent <InputListComponent
editNode={true} editNode={true}
disabled={disabled} disabled={disabled}
value={ value={
!myData.value?.node?.template[ !myData.node.template[templateParam]
templateParam .value ||
].value || myData.node.template[templateParam]
myData.value?.node?.template[ .value === ""
templateParam
].value === ""
? [""] ? [""]
: myData.value?.node?.template[ : myData.node.template[
templateParam templateParam
].value ].value
} }
@ -224,18 +213,16 @@ const EditNodeModal = forwardRef(
); );
}} }}
/> />
) : myData.value?.node?.template[ ) : myData.node.template[templateParam]
templateParam .multiline ? (
].multiline ? (
<TextAreaComponent <TextAreaComponent
id={"textarea-edit-" + index} id={"textarea-edit-" + index}
data-testid={"textarea-edit-" + index} data-testid={"textarea-edit-" + index}
disabled={disabled} disabled={disabled}
editNode={true} editNode={true}
value={ value={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .value ?? ""
].value ?? ""
} }
onChange={( onChange={(
value: string | string[] value: string | string[]
@ -252,14 +239,12 @@ const EditNodeModal = forwardRef(
editNode={true} editNode={true}
disabled={disabled} disabled={disabled}
password={ password={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .password ?? false
].password ?? false
} }
value={ value={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .value ?? ""
].value ?? ""
} }
onChange={(value) => { onChange={(value) => {
handleOnNewValue( handleOnNewValue(
@ -270,25 +255,24 @@ const EditNodeModal = forwardRef(
/> />
)} )}
</div> </div>
) : myData.value.node?.template[templateParam] ) : myData.node?.template[templateParam]
.type === "NestedDict" ? ( .type === "NestedDict" ? (
<div className=" w-full"> <div className=" w-full">
<DictComponent <DictComponent
disabled={disabled} disabled={disabled}
editNode={true} editNode={true}
value={ value={
myData.value.node!.template[ myData.node!.template[
templateParam templateParam
]?.value?.toString() === "{}" ]?.value?.toString() === "{}"
? { ? {
yourkey: "value", yourkey: "value",
} }
: myData.value.node!.template[ : myData.node!.template[templateParam]
templateParam .value
].value
} }
onChange={(newValue) => { onChange={(newValue) => {
myData.value.node!.template[ myData.node!.template[
templateParam templateParam
].value = newValue; ].value = newValue;
handleOnNewValue( handleOnNewValue(
@ -299,13 +283,13 @@ const EditNodeModal = forwardRef(
id="editnode-div-dict-input" id="editnode-div-dict-input"
/> />
</div> </div>
) : myData.value.node?.template[templateParam] ) : myData.node?.template[templateParam]
.type === "dict" ? ( .type === "dict" ? (
<div <div
className={classNames( className={classNames(
"max-h-48 w-full overflow-auto custom-scroll", "max-h-48 w-full overflow-auto custom-scroll",
myData.value.node!.template[templateParam] myData.node!.template[templateParam].value
.value?.length > 1 ?.length > 1
? "my-3" ? "my-3"
: "" : ""
)} )}
@ -314,15 +298,13 @@ const EditNodeModal = forwardRef(
disabled={disabled} disabled={disabled}
editNode={true} editNode={true}
value={ value={
myData.value.node!.template[ myData.node!.template[templateParam]
templateParam .value?.length === 0 ||
].value?.length === 0 || !myData.node!.template[templateParam]
!myData.value.node!.template[ .value
templateParam
].value
? [{ "": "" }] ? [{ "": "" }]
: convertObjToArray( : convertObjToArray(
myData.value.node!.template[ myData.node!.template[
templateParam templateParam
].value ].value
) )
@ -331,7 +313,7 @@ const EditNodeModal = forwardRef(
onChange={(newValue) => { onChange={(newValue) => {
const valueToNumbers = const valueToNumbers =
convertValuesToNumbers(newValue); convertValuesToNumbers(newValue);
myData.value.node!.template[ myData.node!.template[
templateParam templateParam
].value = valueToNumbers; ].value = valueToNumbers;
setErrorDuplicateKey( setErrorDuplicateKey(
@ -344,7 +326,7 @@ const EditNodeModal = forwardRef(
}} }}
/> />
</div> </div>
) : myData.value.node?.template[templateParam] ) : myData.node?.template[templateParam]
.type === "bool" ? ( .type === "bool" ? (
<div className="ml-auto"> <div className="ml-auto">
{" "} {" "}
@ -352,9 +334,8 @@ const EditNodeModal = forwardRef(
id={"toggle-edit-" + index} id={"toggle-edit-" + index}
disabled={disabled} disabled={disabled}
enabled={ enabled={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .value
].value
} }
setEnabled={(isEnabled) => { setEnabled={(isEnabled) => {
handleOnNewValue( handleOnNewValue(
@ -365,52 +346,48 @@ const EditNodeModal = forwardRef(
size="small" size="small"
/> />
</div> </div>
) : myData.value.node?.template[templateParam] ) : myData.node?.template[templateParam]
.type === "float" ? ( .type === "float" ? (
<div className="mx-auto"> <div className="mx-auto">
<FloatComponent <FloatComponent
disabled={disabled} disabled={disabled}
editNode={true} editNode={true}
rangeSpec={ rangeSpec={
myData.value.node!.template[ myData.node!.template[templateParam]
templateParam .rangeSpec
].rangeSpec
} }
value={ value={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .value ?? ""
].value ?? ""
} }
onChange={(value) => { onChange={(value) => {
handleOnNewValue(value, templateParam); handleOnNewValue(value, templateParam);
}} }}
/> />
</div> </div>
) : myData.value.node?.template[templateParam] ) : myData.node?.template[templateParam]
.type === "str" && .type === "str" &&
myData.value?.node?.template[templateParam] myData.node.template[templateParam]
.options ? ( .options ? (
<div className="mx-auto"> <div className="mx-auto">
<Dropdown <Dropdown
numberOfOptions={nodeLength} numberOfOptions={nodeLength}
editNode={true} editNode={true}
options={ options={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .options
].options
} }
onSelect={(value) => onSelect={(value) =>
handleOnNewValue(value, templateParam) handleOnNewValue(value, templateParam)
} }
value={ value={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .value ?? "Choose an option"
].value ?? "Choose an option"
} }
id={"dropdown-edit-" + index} id={"dropdown-edit-" + index}
></Dropdown> ></Dropdown>
</div> </div>
) : myData.value.node?.template[templateParam] ) : myData.node?.template[templateParam]
.type === "int" ? ( .type === "int" ? (
<div className="mx-auto"> <div className="mx-auto">
<IntComponent <IntComponent
@ -418,33 +395,30 @@ const EditNodeModal = forwardRef(
disabled={disabled} disabled={disabled}
editNode={true} editNode={true}
value={ value={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .value ?? ""
].value ?? ""
} }
onChange={(value) => { onChange={(value) => {
handleOnNewValue(value, templateParam); handleOnNewValue(value, templateParam);
}} }}
/> />
</div> </div>
) : myData.value.node?.template[templateParam] ) : myData.node?.template[templateParam]
.type === "file" ? ( .type === "file" ? (
<div className="mx-auto"> <div className="mx-auto">
<InputFileComponent <InputFileComponent
editNode={true} editNode={true}
disabled={disabled} disabled={disabled}
value={ value={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .value ?? ""
].value ?? ""
} }
onChange={(value: string | string[]) => { onChange={(value: string | string[]) => {
handleOnNewValue(value, templateParam); handleOnNewValue(value, templateParam);
}} }}
fileTypes={ fileTypes={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .fileTypes
].fileTypes
} }
onFileChange={(filePath: string) => { onFileChange={(filePath: string) => {
data.node!.template[ data.node!.template[
@ -453,24 +427,23 @@ const EditNodeModal = forwardRef(
}} }}
></InputFileComponent> ></InputFileComponent>
</div> </div>
) : myData.value.node?.template[templateParam] ) : myData.node?.template[templateParam]
.type === "prompt" ? ( .type === "prompt" ? (
<div className="mx-auto"> <div className="mx-auto">
<PromptAreaComponent <PromptAreaComponent
readonly={ readonly={
myData.value.node?.flow ? true : false myData.node?.flow ? true : false
} }
field_name={templateParam} field_name={templateParam}
editNode={true} editNode={true}
disabled={disabled} disabled={disabled}
nodeClass={myData.value.node} nodeClass={myData.node}
setNodeClass={(nodeClass) => { setNodeClass={(nodeClass) => {
myData.value.node = nodeClass; myData.node = nodeClass;
}} }}
value={ value={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .value ?? ""
].value ?? ""
} }
onChange={(value: string | string[]) => { onChange={(value: string | string[]) => {
handleOnNewValue(value, templateParam); handleOnNewValue(value, templateParam);
@ -481,15 +454,14 @@ const EditNodeModal = forwardRef(
} }
/> />
</div> </div>
) : myData.value.node?.template[templateParam] ) : myData.node?.template[templateParam]
.type === "code" ? ( .type === "code" ? (
<div className="mx-auto"> <div className="mx-auto">
<CodeAreaComponent <CodeAreaComponent
readonly={ readonly={
myData.value.node?.flow && myData.node?.flow &&
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .dynamic
].dynamic
? true ? true
: false : false
} }
@ -504,9 +476,8 @@ const EditNodeModal = forwardRef(
disabled={disabled} disabled={disabled}
editNode={true} editNode={true}
value={ value={
myData.value?.node?.template[ myData.node.template[templateParam]
templateParam .value ?? ""
].value ?? ""
} }
onChange={(value: string | string[]) => { onChange={(value: string | string[]) => {
handleOnNewValue(value, templateParam); handleOnNewValue(value, templateParam);
@ -514,7 +485,7 @@ const EditNodeModal = forwardRef(
id={"code-area-edit" + index} id={"code-area-edit" + index}
/> />
</div> </div>
) : myData.value.node?.template[templateParam] ) : myData.node?.template[templateParam]
.type === "Any" ? ( .type === "Any" ? (
"-" "-"
) : ( ) : (
@ -526,13 +497,11 @@ const EditNodeModal = forwardRef(
<ToggleShadComponent <ToggleShadComponent
id={ id={
"show" + "show" +
myData.value.node?.template[templateParam] myData.node?.template[templateParam].name
.name
} }
enabled={ enabled={
!myData.value.node?.template[ !myData.node?.template[templateParam]
templateParam .advanced
].advanced
} }
setEnabled={(e) => { setEnabled={(e) => {
changeAdvanced(templateParam); changeAdvanced(templateParam);
@ -562,9 +531,10 @@ const EditNodeModal = forwardRef(
...old, ...old,
data: { data: {
...old.data, ...old.data,
node: myData.value.node, node: myData.node,
}, },
})); }));
setPending(true);
setOpen(false); setOpen(false);
}} }}
type="submit" type="submit"

View file

@ -32,10 +32,13 @@ const useFlowStore = create<FlowStoreType>((set, get) => ({
nodes: [], nodes: [],
edges: [], edges: [],
isBuilding: false, isBuilding: false,
isPending: false,
isBuilt: false, isBuilt: false,
reactFlowInstance: null, reactFlowInstance: null,
lastCopiedSelection: null, lastCopiedSelection: null,
setPending: (isPending) => {
set({ isPending });
},
resetFlow: ({ nodes, edges, viewport }) => { resetFlow: ({ nodes, edges, viewport }) => {
set({ set({
nodes, nodes,

View file

@ -12,7 +12,9 @@ export type FlowStoreType = {
updateSSEData: (sseData: object) => void; updateSSEData: (sseData: object) => void;
sseData: object; sseData: object;
isBuilding: boolean; isBuilding: boolean;
isPending: boolean;
setIsBuilding: (isBuilding: boolean) => void; setIsBuilding: (isBuilding: boolean) => void;
setPending: (isPending: boolean) => void;
resetFlow: (flow: { resetFlow: (flow: {
nodes: Node[]; nodes: Node[];
edges: Edge[]; edges: Edge[];