Merge branch 'frontChanges' of github.com:logspace-ai/langflow into frontChanges

This commit is contained in:
Lucas Oliveira 2023-05-11 23:41:33 -03:00
commit a80bf37be4
13 changed files with 473 additions and 675 deletions

888
poetry.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
[tool.poetry]
name = "langflow"
version = "0.0.68"
version = "0.0.69"
description = "A Python package with a built-in web application"
authors = ["Logspace <contact@logspace.ai>"]
maintainers = [
@ -29,7 +29,7 @@ google-search-results = "^2.4.1"
google-api-python-client = "^2.79.0"
typer = "^0.7.0"
gunicorn = "^20.1.0"
langchain = "~0.0.150"
langchain = "^0.0.166"
openai = "^0.27.2"
types-pyyaml = "^6.0.12.8"
dill = "^0.3.6"

View file

@ -1,5 +1,6 @@
import { useEffect, useState } from "react";
import { useContext, useEffect, useState } from "react";
import { FloatComponentType } from "../../types/components";
import { TabsContext } from "../../contexts/tabsContext";
export default function FloatComponent({
value,
@ -13,6 +14,7 @@ export default function FloatComponent({
onChange("");
}
}, [disabled, onChange]);
const {setDisableCP} = useContext(TabsContext)
return (
<div className={disabled ? "pointer-events-none cursor-not-allowed" : ""}>
<input
@ -27,6 +29,12 @@ export default function FloatComponent({
setMyValue(e.target.value);
onChange(e.target.value);
}}
onBlur={() => {
setDisableCP(false)
}}
onFocus={() => {
setDisableCP(true)
}}
/>
</div>
);

View file

@ -1,6 +1,7 @@
import { useEffect, useState } from "react";
import { useContext, useEffect, useState } from "react";
import { InputComponentType } from "../../types/components";
import { classNames } from "../../utils";
import { TabsContext } from "../../contexts/tabsContext";
export default function InputComponent({
value,
@ -10,6 +11,7 @@ export default function InputComponent({
}: InputComponentType) {
const [myValue, setMyValue] = useState(value ?? "");
const [pwdVisible, setPwdVisible] = useState(false);
const {setDisableCP} = useContext(TabsContext)
useEffect(() => {
if (disabled) {
setMyValue("");
@ -26,8 +28,14 @@ export default function InputComponent({
>
<input
value={myValue}
onBlur={() => {
setDisableCP(false)
}}
onFocus={() => {
setDisableCP(true)
}}
className={classNames(
"block w-full pr-12 form-input dark:text-gray-300 dark:bg-gray-900 dark:border-gray-600 rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm",
"block w-full pr-12 form-input dark:bg-gray-900 dark:border-gray-600 rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm",
disabled ? " bg-gray-200 dark:bg-gray-700" : "",
password && !pwdVisible && myValue !== "" ? "password" : ""
)}
@ -38,7 +46,7 @@ export default function InputComponent({
}}
/>
<button
className="absolute inset-y-0 right-0 items-center px-4 text-gray-600 dark:text-gray-300"
className="absolute inset-y-0 right-0 items-center px-4 text-gray-600"
onClick={() => {
setPwdVisible(!pwdVisible);
}}

View file

@ -1,6 +1,7 @@
import { PlusIcon, XMarkIcon } from "@heroicons/react/24/outline";
import { useEffect, useState } from "react";
import { useContext, useEffect, useState } from "react";
import { InputListComponentType } from "../../types/components";
import { TabsContext } from "../../contexts/tabsContext";
var _ = require("lodash");
@ -16,6 +17,7 @@ export default function InputListComponent({
onChange([""]);
}
}, [disabled, onChange]);
const {setDisableCP} = useContext(TabsContext)
return (
<div
className={
@ -41,6 +43,12 @@ export default function InputListComponent({
});
onChange(inputList);
}}
onBlur={() => {
setDisableCP(false)
}}
onFocus={() => {
setDisableCP(true)
}}
/>
{idx === inputList.length - 1 ? (
<button

View file

@ -1,5 +1,6 @@
import { useEffect, useState } from "react";
import { useContext, useEffect, useState } from "react";
import { FloatComponentType } from "../../types/components";
import { TabsContext } from "../../contexts/tabsContext";
export default function IntComponent({
value,
@ -13,6 +14,7 @@ export default function IntComponent({
onChange("");
}
}, [disabled, onChange]);
const {setDisableCP} =useContext(TabsContext)
return (
<div
className={
@ -43,7 +45,14 @@ export default function IntComponent({
setMyValue(e.target.value);
onChange(e.target.value);
}}
onBlur={() => {
setDisableCP(false)
}}
onFocus={() => {
setDisableCP(true)
}}
/>
</div>
);
}

View file

@ -26,6 +26,8 @@ const TabsContextInitialValue: TabsContextType = {
downloadFlow: (flow: FlowType) => {},
uploadFlow: () => {},
hardReset: () => {},
disableCP:false,
setDisableCP:(state:boolean)=>{},
};
export const TabsContext = createContext<TabsContextType>(
@ -212,10 +214,13 @@ export function TabsProvider({ children }: { children: ReactNode }) {
return newFlows;
});
}
const [disableCP, setDisableCP] = useState(false);
return (
<TabsContext.Provider
value={{
disableCP,
setDisableCP,
save,
hardReset,
tabIndex,

View file

@ -49,10 +49,9 @@ export default function ApiModal({flowName}) {
API_URL = "${window.location.protocol}//${window.location.host}/predict"
def predict(message):
with open("${flowName}.json:, "r") as f:
with open("${flowName}.json", "r") as f:
json_data = json.load(f)
payload['exported_flow'] = json_data
payload['message'] = message
payload = {'exported_flow': json_data, 'message': message}
response = requests.post(API_URL, json=payload)
return response.json() # JSON {"result": "Response"}

View file

@ -16,7 +16,7 @@ export default function ExportModal() {
const { closePopUp } = useContext(PopUpContext);
const ref = useRef();
const { setErrorData } = useContext(alertContext);
const { flows, tabIndex, updateFlow, downloadFlow } = useContext(TabsContext);
const { flows, tabIndex, updateFlow, downloadFlow,setDisableCP } = useContext(TabsContext);
function setModalOpen(x: boolean) {
setOpen(x);
if (x === false) {
@ -113,6 +113,12 @@ export default function ExportModal() {
placeholder="File name"
id="name"
className="focus:border focus:border-blue block w-full px-3 py-2 border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-800 dark:border-gray-600 dark:focus:border-blue-500 dark:focus:ring-blue-500 text-gray-900 dark:text-gray-100"
onBlur={() => {
setDisableCP(false);
}}
onFocus={() => {
setDisableCP(true);
}}
/>
</div>
<div className="w-full">
@ -127,6 +133,12 @@ export default function ExportModal() {
</span>
</label>
<textarea
onBlur={() => {
setDisableCP(false);
}}
onFocus={() => {
setDisableCP(true);
}}
name="description"
id="description"
onChange={(event) => {
@ -151,6 +163,12 @@ export default function ExportModal() {
id="checkbox"
type="checkbox"
className="h-4 w-4 text-blue-600 border-gray-300 rounded dark:bg-gray-800 dark:border-gray-600 dark:focus:border-blue-500 dark:focus:ring-blue-500"
onBlur={() => {
setDisableCP(false);
}}
onFocus={() => {
setDisableCP(true);
}}
/>
<span className="ml-2 font-medium text-gray-700 dark:text-white">
Save with my API keys

View file

@ -74,7 +74,6 @@ export default function ButtonBox({
}
return (
<button disabled={deactivate} onClick={onClick}>
<Tooltip title={description} placement="bottom">
<div
className={classNames(
"flex flex-col justify-center items-center rounded-lg text-center shadow border border-gray-300 dark:border-gray-800 hover:shadow-lg transform hover:scale-105",
@ -105,7 +104,6 @@ export default function ButtonBox({
</h3>
</div>
</div>
</Tooltip>
</button>
);
}

View file

@ -14,7 +14,7 @@ export default function TabComponent({
selected: boolean;
onClick: () => void;
}) {
const { removeFlow, updateFlow, flows } = useContext(TabsContext);
const { removeFlow, updateFlow, flows, setDisableCP } = useContext(TabsContext);
const [isRename, setIsRename] = useState(false);
const [value, setValue] = useState("");
return (
@ -40,11 +40,15 @@ export default function TabComponent({
<div className="bg-white dark:text-white dark:bg-gray-700/60 flex select-none justify-between w-44 items-center border border-b-0 border-gray-300 dark:border-gray-600 px-4 py-1 rounded-t-xl -ml-px">
{isRename ? (
<input
onFocus={() => {
setDisableCP(true);
}}
autoFocus
className="bg-transparent focus:border-none active:outline hover:outline focus:outline outline-gray-300 rounded-md w-28"
onBlur={() => {
setIsRename(false);
if (value !== "") {
setDisableCP(false);
let newFlow = _.cloneDeep(flow);
newFlow.name = value;
updateFlow(newFlow);

View file

@ -37,7 +37,7 @@ const nodeTypes = {
var _ = require("lodash");
export default function FlowPage({ flow }: { flow: FlowType }) {
let { updateFlow, incrementNodeId } =
let { updateFlow, incrementNodeId, disableCP} =
useContext(TabsContext);
const { types, reactFlowInstance, setReactFlowInstance, templates } =
useContext(typesContext);
@ -46,11 +46,11 @@ export default function FlowPage({ flow }: { flow: FlowType }) {
const { undo, redo, canUndo, canRedo, takeSnapshot } = useUndoRedo();
const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {
if ((event.ctrlKey || event.metaKey) && (event.key === 'c') && lastSelection) {
if ((event.ctrlKey || event.metaKey) && (event.key === 'c') && lastSelection && !disableCP) {
event.preventDefault();
setLastCopiedSelection(lastSelection);
}
if ((event.ctrlKey || event.metaKey) && (event.key === 'v') && lastCopiedSelection) {
if ((event.ctrlKey || event.metaKey) && (event.key === 'v') && lastCopiedSelection && !disableCP) {
event.preventDefault();
paste();
}

View file

@ -12,6 +12,9 @@ export type TabsContextType = {
downloadFlow: (flow: FlowType) => void;
uploadFlow: () => void;
hardReset: () => void;
//disable CopyPaste
disableCP: boolean;
setDisableCP: (value: boolean) => void;
};
export type LangFlowState = {