diff --git a/ui/src/components/DropdownTitle.tsx b/ui/src/components/DropdownTitle.tsx index fa9cf38..3067aa1 100644 --- a/ui/src/components/DropdownTitle.tsx +++ b/ui/src/components/DropdownTitle.tsx @@ -135,7 +135,8 @@ export default function DropdownTitle() { height={"29px"} aria-label="menu" size={"sm"} - colorScheme="teal" + colorScheme="gray" + backgroundColor={"gray.700"} onClick={onOpen} onMouseEnter={onOpen} onMouseLeave={delayedClose} diff --git a/ui/src/share/ShareDialog.tsx b/ui/src/share/ShareDialog.tsx index e9be3df..fc68cdd 100644 --- a/ui/src/share/ShareDialog.tsx +++ b/ui/src/share/ShareDialog.tsx @@ -1,14 +1,20 @@ import { + Box, Button, Flex, HStack, Input, + InputGroup, + InputLeftAddon, + InputRightAddon, Link, Modal, ModalBody, ModalContent, ModalHeader, ModalOverlay, + Radio, + RadioGroup, Stack, Text, useToast, @@ -16,7 +22,13 @@ import { import { Workflow, WorkflowPrivacy, WorkflowVersion } from "../types/dbTypes"; import { useEffect, useRef, useState } from "react"; import CustomSelector from "../components/CustomSelector"; -import { IconCloud, IconCopy, IconExternalLink } from "@tabler/icons-react"; +import { + IconCheck, + IconCloud, + IconCopy, + IconExternalLink, + IconPlus, +} from "@tabler/icons-react"; import { userSettingsTable, workflowVersionsTable, @@ -27,6 +39,7 @@ import { api } from "/scripts/api.js"; // @ts-ignore import { app } from "/scripts/app.js"; import { generateRandomKey, getNodeDefs, privacyOptions } from "./shareUtils"; +import { formatTimestamp } from "../utils"; interface Props { onClose: () => void; @@ -40,6 +53,9 @@ export default function ShareDialog({ onClose }: Props) { const [loading, setLoading] = useState(false); const [cloudHost, setCloudHost] = useState(""); const [privacy, setPrivacy] = useState("PRIVATE"); + const [selectedVersion, setSelectedVersion] = useState< + string | "new_version" + >("new_version"); const cloudHostRef = useRef(""); const [workflow, setWorkflow] = useState(); const toast = useToast(); @@ -69,6 +85,8 @@ export default function ShareDialog({ onClose }: Props) { cloudID: cloudVersionID, })); loadData(); + window.open(cloudHost + "/workflow/" + cloudID, "_blank"); + setLoading(false); }; useEffect(() => { loadData(); @@ -116,14 +134,19 @@ export default function ShareDialog({ onClose }: Props) { ? ((await userSettingsTable?.getSetting("cloudHost")) as string) : "http://localhost:3000"; const nodeDefs = getNodeDefs(); - const newVer = await workflowVersionsTable?.add({ - workflowID: workflow!.id, - name: versionName, - createTime: Date.now(), - json: JSON.stringify(app.graph.serialize()), - }); - if (!newVer) { - alert("Failed to create new version, please try again."); + let version: WorkflowVersion | undefined; + if (selectedVersion === "new_version") { + version = await workflowVersionsTable?.add({ + workflowID: workflow!.id, + name: versionName, + createTime: Date.now(), + json: JSON.stringify(app.graph.serialize()), + }); + } else { + version = await workflowVersionsTable?.get(selectedVersion); + } + if (!version) { + alert(`Failed to find version: ${selectedVersion}, please try again.`); setLoading(false); return; } @@ -137,16 +160,14 @@ export default function ShareDialog({ onClose }: Props) { "Share Workflow", "width=800,height=800", ); - setLoading(false); const handleChildReady = (event: MessageEvent) => { if (event.origin === host && event.data === "child_ready") { const curWorkflow = workflowsTable?.curWorkflow; // Send data to the new window after it loads - console.log("sending privacy", privacy); sharePopup!.postMessage( { workflow: curWorkflow, - version: newVer, + version: version, nodeDefs: nodeDefs, privacy: privacy, }, @@ -203,40 +224,58 @@ export default function ShareDialog({ onClose }: Props) { )} - - New Version - { - setVersionName(e.target.value); - }} - /> - - {localVersions.slice(0, 4).map((ver) => { - return ( - - {ver.name} - {ver.cloudID && ( - - - - )} + Choose a version to share: + { + setSelectedVersion(val); + }} + > + + + { + setVersionName(e.target.value); + }} + /> + + + New version + - ); - })} + + {localVersions.slice(0, 4).map((ver) => { + return ( + + + {ver.name} + {formatTimestamp(ver.createTime)} + {ver.cloudID && ( + + + + )} + + + ); + })} +