Merge branch 'modalRefactor' into python_custom_node_component

This commit is contained in:
Lucas Oliveira 2023-07-23 19:50:51 -03:00
commit b6ee0ff800
20 changed files with 655 additions and 334 deletions

View file

@ -134,6 +134,7 @@ async def stream_build(flow_id: str):
# to set the input_keys values
artifacts.update(vertex.artifacts)
except Exception as exc:
logger.exception(exc)
params = str(exc)
valid = False
flow_data_store[flow_id]["status"] = BuildStatus.FAILURE

View file

@ -176,6 +176,8 @@ class Vertex:
for node in nodes:
built = node.build()
if isinstance(built, list):
if key not in self.params:
self.params[key] = []
self.params[key].extend(built)
else:
self.params[key].append(built)

View file

@ -64,15 +64,20 @@ def setup_static_files(app: FastAPI, static_files_dir: Path):
return FileResponse(path)
# app = create_app()
# setup_static_files(app, static_files_dir)
def get_static_files_dir():
"""Get the static files directory relative to Langflow's main.py file."""
frontend_path = Path(__file__).parent
return frontend_path / "frontend"
def setup_app(static_files_dir: Optional[Path] = None) -> FastAPI:
"""Setup the FastAPI app."""
# get the directory of the current file
if not static_files_dir:
frontend_path = Path(__file__).parent
static_files_dir = frontend_path / "frontend"
static_files_dir = get_static_files_dir()
if not static_files_dir or not static_files_dir.exists():
raise RuntimeError(f"Static files directory {static_files_dir} does not exist.")
app = create_app()
setup_static_files(app, static_files_dir)
return app

View file

@ -15,6 +15,7 @@ class TextSplittersFrontendNode(FrontendNode):
required=True,
show=True,
name="documents",
is_list=True,
)
)
name = "separator"

View file

@ -259,7 +259,7 @@ class VectorStoreFrontendNode(FrontendNode):
field.required = False
field.show = True
field.advanced = False
field.is_list = True
elif "embedding" in field.name:
# for backwards compatibility
field.name = "embedding"

View file

@ -7,7 +7,7 @@ type InputProps = {
name: string | null;
description: string | null;
maxLength?: number;
flows: Array<{ id: string; name: string }>;
flows: Array<{ id: string; name: string; description: string }>;
tabId: string;
setName: (name: string) => void;
setDescription: (description: string) => void;
@ -37,7 +37,13 @@ export const EditFlowSettings: React.FC<InputProps> = ({
setName(value);
};
const [desc, setDesc] = useState(
flows.find((f) => f.id === tabId).description
);
const handleDescriptionChange = (event: ChangeEvent<HTMLTextAreaElement>) => {
flows.find((f) => f.id === tabId).description = event.target.value;
setDesc(flows.find((f) => f.id === tabId).description);
setDescription(event.target.value);
};
@ -70,7 +76,7 @@ export const EditFlowSettings: React.FC<InputProps> = ({
name="description"
id="description"
onChange={handleDescriptionChange}
value={description ?? ""}
value={desc}
placeholder="Flow description"
className="mt-2 max-h-[100px] font-normal"
rows={3}

View file

@ -191,6 +191,7 @@ export default function CodeTabsComponent({
<AccordionComponent
trigger={t["data"]["id"]}
open={openAccordion}
keyValue={t["data"]["id"]}
>
<div className="api-modal-table-arrangement">
<Table className="table-fixed bg-muted outline-1">
@ -224,8 +225,6 @@ export default function CodeTabsComponent({
t.data.node.template[n].type === "int")
)
.map((n, i) => {
//console.log(t.data.node.template[n]);
return (
<TableRow
key={i}

View file

@ -1,7 +1,8 @@
import { useEffect, useState } from "react";
import { useContext, useEffect, useState } from "react";
import { InputListComponentType } from "../../types/components";
import _ from "lodash";
import { PopUpContext } from "../../contexts/popUpContext";
import IconComponent from "../genericIconComponent";
export default function InputListComponent({
@ -12,12 +13,13 @@ export default function InputListComponent({
onAddInput,
}: InputListComponentType) {
const [inputList, setInputList] = useState(value ?? [""]);
const { closeEdit } = useContext(PopUpContext);
useEffect(() => {
if (value) {
setInputList(value);
}
}, [value]);
}, [closeEdit]);
useEffect(() => {
if (disabled) {
@ -48,7 +50,7 @@ export default function InputListComponent({
placeholder="Type something..."
onChange={(e) => {
setInputList((old) => {
let newInputList = _.cloneDeep(old);
let newInputList = _.cloneDeep(inputList);
newInputList[idx] = e.target.value;
return newInputList;
});

View file

@ -76,7 +76,7 @@ export async function postValidatePrompt(
*/
export async function getExamples(): Promise<FlowType[]> {
const url =
"https://api.github.com/repos/logspace-ai/langflow_examples/contents/examples?ref=fix_examples";
"https://api.github.com/repos/logspace-ai/langflow_examples/contents/examples?ref=main";
const response = await axios.get(url);
const jsonFiles = response.data.filter((file: any) => {

View file

@ -545,7 +545,7 @@ The cursor: default; property value restores the browser's default cursor style
@apply z-10 mt-1 max-h-60 overflow-auto rounded-md bg-background py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm;
}
.dropdown-component-true-options {
@apply dropdown-component-options w-[215px];
@apply dropdown-component-options lg:w-[32%]
}
.dropdown-component-false-options {
@apply dropdown-component-options w-full;

View file

@ -22,10 +22,11 @@ import {
TableRow,
} from "../../components/ui/table";
import { limitScrollFieldsModal } from "../../constants/constants";
import { PopUpContext } from "../../contexts/popUpContext";
import { TabsContext } from "../../contexts/tabsContext";
import { typesContext } from "../../contexts/typesContext";
import { NodeDataType } from "../../types/flow";
import { classNames } from "../../utils/utils";
import { classNames, getRandomKeyByssmm } from "../../utils/utils";
import BaseModal from "../baseModal";
const EditNodeModal = forwardRef(
@ -47,6 +48,7 @@ const EditNodeModal = forwardRef(
const [myData, setMyData] = useState(data);
const { setTabsState, tabId } = useContext(TabsContext);
const { reactFlowInstance } = useContext(typesContext);
const { setCloseEdit } = useContext(PopUpContext);
let disabled =
reactFlowInstance?.getEdges().some((e) => e.targetHandle === data.id) ??
@ -70,6 +72,7 @@ const EditNodeModal = forwardRef(
useEffect(() => {
setMyData(data); // reset data to what it is on node when opening modal
setCloseEdit(getRandomKeyByssmm().toString());
}, [modalOpen]);
return (

View file

@ -96,6 +96,10 @@ export default function GenericModal({
}
}, [inputValue, type]);
useEffect(() => {
setInputValue(value);
}, [value]);
const coloredContent = (inputValue || "")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")

View file

@ -93,22 +93,24 @@ export default function NodeToolbarComponent({ data, setData, deleteNode }) {
</ShadTooltip>
<ShadTooltip content="Edit" side="top">
<EditNodeModal
data={data}
setData={setData}
nodeLength={nodeLength}
>
<div
className={classNames(
"relative -ml-px 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" +
(nodeLength == 0
? " text-muted-foreground"
: " text-foreground")
)}
<div>
<EditNodeModal
data={data}
setData={setData}
nodeLength={nodeLength}
>
<IconComponent name="Settings2" className="h-4 w-4 " />
</div>
</EditNodeModal>
<div
className={classNames(
"relative -ml-px 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" +
(nodeLength == 0
? " text-muted-foreground"
: " text-foreground")
)}
>
<IconComponent name="Settings2" className="h-4 w-4 " />
</div>
</EditNodeModal>
</div>
</ShadTooltip>
</span>
</div>