Loads of minor fixes

This commit is contained in:
Frikky
2024-07-04 00:11:20 +02:00
parent ead4bfb967
commit 877114f8dd
9 changed files with 1058 additions and 952 deletions
+76 -11
View File
@@ -79,6 +79,7 @@ const AppGrid = (props) => {
const [formMail, setFormMail] = React.useState(""); const [formMail, setFormMail] = React.useState("");
const [message, setMessage] = React.useState(""); const [message, setMessage] = React.useState("");
const [formMessage, setFormMessage] = React.useState(""); const [formMessage, setFormMessage] = React.useState("");
const [deactivatedIndexes, setDeactivatedIndexes] = React.useState([]);
const buttonStyle = { const buttonStyle = {
borderRadius: 30, borderRadius: 30,
@@ -352,7 +353,7 @@ const AppGrid = (props) => {
if (responseJson.success === false) { if (responseJson.success === false) {
toast.error(responseJson.reason); toast.error(responseJson.reason);
} else { } else {
toast.success(`App ${type}d Successfully!`); //toast.success(`App ${type}d Successfully!`);
if (type === 'activate') { if (type === 'activate') {
setAllActivatedAppIds(prev => [...prev, data.objectID]); setAllActivatedAppIds(prev => [...prev, data.objectID]);
setIsAnyAppActivated(true); setIsAnyAppActivated(true);
@@ -395,7 +396,7 @@ const AppGrid = (props) => {
{!isLoading ? ( {!isLoading ? (
<div> <div>
{hits.length === 0 && searchQuery.length >= 0 && showNoAppFound ? ( {hits.length === 0 && searchQuery.length >= 0 && showNoAppFound ? (
<Typography variant="body1" style={{ marginTop: '30%' }}>No App Found</Typography> <Typography variant="body1" style={{ marginTop: '30%' }}>No Apps Found</Typography>
) : ( ) : (
<Grid item spacing={2} justifyContent="flex-start"> <Grid item spacing={2} justifyContent="flex-start">
<div <div
@@ -1551,9 +1552,13 @@ const AppGrid = (props) => {
<Typography variant="h5" style={{ marginBottom: 30, marginTop: 30, fontWeight: "400", fontSize: 24 }}> <Typography variant="h5" style={{ marginBottom: 30, marginTop: 30, fontWeight: "400", fontSize: 24 }}>
Filter By Filter By
</Typography> </Typography>
<FilterUsersAndOrgsAppByCategory selectedCategoryForUsersAndOgsApps={selectedCategoryForUsersAndOgsApps} setselectedCategoryForUsersAndOgsApps={setselectedCategoryForUsersAndOgsApps} /> <FilterUsersAndOrgsAppByCategory selectedCategoryForUsersAndOgsApps={selectedCategoryForUsersAndOgsApps} setselectedCategoryForUsersAndOgsApps={setselectedCategoryForUsersAndOgsApps} />
<FilterUsersAndOrgsAppByActionLabel selectedTagsForUserAndOrgApps={selectedTagsForUserAndOrgApps} setSelectedTagsForUserAndOrgApps={setSelectedTagsForUserAndOrgApps} /> <FilterUsersAndOrgsAppByActionLabel selectedTagsForUserAndOrgApps={selectedTagsForUserAndOrgApps} setSelectedTagsForUserAndOrgApps={setSelectedTagsForUserAndOrgApps} />
<FilterUsersAndOrgsAppByCreatedWith selectedOptionOfCreatedWith={selectedOptionOfCreatedWith} setSelectedOptionOfCreatedWith={setSelectedOptionOfCreatedWith} /> <FilterUsersAndOrgsAppByCreatedWith selectedOptionOfCreatedWith={selectedOptionOfCreatedWith} setSelectedOptionOfCreatedWith={setSelectedOptionOfCreatedWith} />
<FilterUsersAndOrgsAppCreatedBy /> <FilterUsersAndOrgsAppCreatedBy />
</div> </div>
)} )}
@@ -1722,6 +1727,10 @@ const AppGrid = (props) => {
? `/apps/${data.id}` ? `/apps/${data.id}`
: `https://shuffler.io/apps/${data.id}`; : `https://shuffler.io/apps/${data.id}`;
if (data.name === "" && data.id === "") {
return null
}
return ( return (
<Zoom <Zoom
key={index} key={index}
@@ -1818,17 +1827,71 @@ const AppGrid = (props) => {
width: 230, width: 230,
textAlign: 'start', textAlign: 'start',
marginLeft: 8, marginLeft: 8,
color: "rgba(158, 158, 158, 1)" color: "rgba(158, 158, 158, 1)",
display: "flex",
}} }}
> >
{data.tags && <div style={{minWidth: 120, overflow: "hidden", }}>
data.tags.map((tag, tagIndex) => ( {data.generated !== true ?
<span key={tagIndex}> <div>
{normalizedString(tag)} {data.tags &&
{tagIndex < data.tags.length - 1 ? ", " : ""} data.tags.slice(0,2).map((tag, tagIndex) => (
</span> <span key={tagIndex}>
))} {normalizedString(tag)}
</div> {tagIndex < data.tags.length - 1 ? ", " : ""}
</span>
))
}
</div>
: null}
</div>
{currTab === 1 && !deactivatedIndexes.includes(index) && mouseHoverIndex === index && data.generated === true ?
<Button style={{
marginLeft: 15,
width: 102,
height: 35,
borderRadius: 200,
backgroundColor: "rgba(73, 73, 73, 1)",
color: "rgba(241, 241, 241, 1)",
textTransform: "none",
}}
onClick={(event) => {
//deactivatedIndexes.push(index)
//setDeactivatedIndexes(deactivatedIndexes)
event.preventDefault();
event.stopPropagation();
//handleActivateButton(event, data, "deactivate");
// FIXME: Put this in a function lol
const url = `${globalUrl}/api/v1/apps/${data.id}/deactivate`;
fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
credentials: "include",
})
.then((response) => response.json())
.then((responseJson) => {
if (responseJson.success === false) {
toast.error(responseJson.reason);
} else {
toast.success("App Deactivated Successfully. Reload UI to see updated changes.")
//const updatedIds = allActivatedAppIds.filter(id => id !== data.objectID);
//setAllActivatedAppIds(updatedIds);
}
})
.catch(error => {
console.log("app error: ", error.toString());
})
}}>
Deactivate
</Button>
: null}
</div>
{/* )} */} {/* )} */}
</div> </div>
</ButtonBase> </ButtonBase>
@@ -1946,6 +2009,7 @@ const AppGrid = (props) => {
selectedOptionOfCreatedWith={selectedOptionOfCreatedWith} selectedOptionOfCreatedWith={selectedOptionOfCreatedWith}
/> />
)} )}
<AppTab <AppTab
selectedCategoryForUsersAndOgsApps={selectedCategoryForUsersAndOgsApps} selectedCategoryForUsersAndOgsApps={selectedCategoryForUsersAndOgsApps}
selectedTagsForUserAndOrgApps={selectedTagsForUserAndOrgApps} selectedTagsForUserAndOrgApps={selectedTagsForUserAndOrgApps}
@@ -1954,6 +2018,7 @@ const AppGrid = (props) => {
setSelectedTagsForUserAndOrgApps={setSelectedTagsForUserAndOrgApps} setSelectedTagsForUserAndOrgApps={setSelectedTagsForUserAndOrgApps}
setSelectedOptionOfCreatedWith={setSelectedOptionOfCreatedWith} setSelectedOptionOfCreatedWith={setSelectedOptionOfCreatedWith}
/> />
</div> </div>
<Configure clickAnalytics /> <Configure clickAnalytics />
</InstantSearch> </InstantSearch>
+5 -5
View File
@@ -1623,12 +1623,12 @@ const Billing = (props) => {
{userdata.support === true ? {userdata.support === true ?
<div style={{ marginBottom: 10, marginTop: clickedFromOrgTab ? 16 : null, color: clickedFromOrgTab ? "#F1F1F1" : null }}> <div style={{ marginBottom: 10, marginTop: clickedFromOrgTab ? 16 : null, color: clickedFromOrgTab ? "#F1F1F1" : null }}>
For sales: Create&nbsp; For sales: Create&nbsp;
<a href={"https://docs.google.com/document/d/1OeJSi42812EMg7fUAw1HAj1ymOG8rfp8Ma_DGJKvwgI/copy?usp=sharing&organization=" + selectedOrganization.id} target="_blank" rel="noopener noreferrer" style={{ textDecoration: "none", color: "#f85a3e" }}> <a href={"https://docs.google.com/document/d/1N-ZJNn8lWaqiXITrqYcnTt53oXGLNYFEzc5PU-tdAps/copy" + selectedOrganization.id} target="_blank" rel="noopener noreferrer" style={{ textDecoration: "none", color: "#f85a3e" }}>
New Cloud Contract EU contract
</a> </a>
&nbsp;or&nbsp; &nbsp;or&nbsp;
<a href={"https://docs.google.com/document/d/1IguxpeV4Wwwr9C0MPyUNhhajEu_PxjRfP7f0hYyRYOI/copy?usp=sharing&organization=" + selectedOrganization.id} target="_blank" rel="noopener noreferrer" style={{ textDecoration: "none", color: "#f85a3e" }}> <a href={"https://docs.google.com/document/d/1cF-Cwxt1TcahlLrpl1GH2hFZO4gxppLeYjHW6QB0EzQ/copy" + selectedOrganization.id} target="_blank" rel="noopener noreferrer" style={{ textDecoration: "none", color: "#f85a3e" }}>
New Onprem Contract NOT EU contract
</a> </a>
&nbsp; - &nbsp; &nbsp; - &nbsp;
<a href={"https://drive.google.com/drive/folders/1zVvwwkbQXW3p-DJYa0GBDzFo_ZnV_I_5"} target="_blank" rel="noopener noreferrer" style={{ textDecoration: "none", color: "#f85a3e" }}> <a href={"https://drive.google.com/drive/folders/1zVvwwkbQXW3p-DJYa0GBDzFo_ZnV_I_5"} target="_blank" rel="noopener noreferrer" style={{ textDecoration: "none", color: "#f85a3e" }}>
@@ -1636,7 +1636,7 @@ const Billing = (props) => {
</a> </a>
&nbsp; - &nbsp; &nbsp; - &nbsp;
<a href={"https://github.com/Shuffle/Shuffle-docs/tree/master/handbook/Sales"} target="_blank" rel="noopener noreferrer" style={{ textDecoration: "none", color: "#f85a3e" }}> <a href={"https://github.com/Shuffle/Shuffle-docs/tree/master/handbook/Sales"} target="_blank" rel="noopener noreferrer" style={{ textDecoration: "none", color: "#f85a3e" }}>
Sales Process Sales Process (old)
</a> </a>
</div> </div>
: :
+12 -1
View File
@@ -6,6 +6,7 @@ import UsecaseSearch from "../components/UsecaseSearch.jsx"
import WorkflowGrid from "../components/WorkflowGrid.jsx" import WorkflowGrid from "../components/WorkflowGrid.jsx"
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import WorkflowTemplatePopup from "./WorkflowTemplatePopup.jsx"; import WorkflowTemplatePopup from "./WorkflowTemplatePopup.jsx";
import WorkflowValidationTimeline from "../components/WorkflowValidationTimeline.jsx"
import { import {
Badge, Badge,
@@ -206,6 +207,16 @@ const EditWorkflow = (props) => {
<Typography variant="body2" color="textSecondary" style={{marginTop: 20, maxWidth: 440,}}> <Typography variant="body2" color="textSecondary" style={{marginTop: 20, maxWidth: 440,}}>
Workflows can be built from scratch, or from templates. <a href="/usecases" rel="noopener noreferrer" target="_blank" style={{ textDecoration: "none", color: "#f86a3e" }}>Usecases</a> can help you discover next steps, and you can <a href="/search?tab=workflows" rel="noopener noreferrer" target="_blank" style={{ textDecoration: "none", color: "#f86a3e" }}>search</a> for them directly. <a href="/docs/workflows" rel="noopener noreferrer" target="_blank" style={{ textDecoration: "none", color: "#f86a3e" }}>Learn more</a> Workflows can be built from scratch, or from templates. <a href="/usecases" rel="noopener noreferrer" target="_blank" style={{ textDecoration: "none", color: "#f86a3e" }}>Usecases</a> can help you discover next steps, and you can <a href="/search?tab=workflows" rel="noopener noreferrer" target="_blank" style={{ textDecoration: "none", color: "#f86a3e" }}>search</a> for them directly. <a href="/docs/workflows" rel="noopener noreferrer" target="_blank" style={{ textDecoration: "none", color: "#f86a3e" }}>Learn more</a>
</Typography> </Typography>
<div style={{marginTop: 10, marginBottom: 10, marginRight: 50, }}>
<WorkflowValidationTimeline
originalWorkflow={workflow}
apps={apps}
workflow={workflow}
/>
</div>
{showUpload === true ? {showUpload === true ?
<div style={{ float: "right" }}> <div style={{ float: "right" }}>
<Tooltip color="primary" title={"Import manually"} placement="top"> <Tooltip color="primary" title={"Import manually"} placement="top">
@@ -957,7 +968,7 @@ const EditWorkflow = (props) => {
}} }}
> >
{showMoreClicked ? <ExpandLessIcon /> : <ExpandMoreIcon/>} {showMoreClicked ? <ExpandLessIcon /> : <ExpandMoreIcon/>}
{showMoreClicked ? "Collapse": "Expand"} {showMoreClicked ? "Less Options": "More Options"}
</Button> </Button>
</Tooltip> </Tooltip>
</div> </div>
+11 -11
View File
@@ -515,16 +515,16 @@ const LicencePopup = (props) => {
} }
useEffect(() => { useEffect(() => {
console.log("New variant: ", shuffleVariant) console.log("New variant: ", shuffleVariant)
if (shuffleVariant === 1) { if (shuffleVariant === 1) {
setCalculatedCost("$600") setCalculatedCost("$960")
setSelectedValue(8) setSelectedValue(8)
} else { } else {
setCalculatedCost("$540") setCalculatedCost("$960")
setSelectedValue(300) setSelectedValue(300)
} }
}, [shuffleVariant]) }, [shuffleVariant])
if (typeof window === 'undefined' || window.location === undefined) { if (typeof window === 'undefined' || window.location === undefined) {
return null return null
@@ -680,7 +680,7 @@ const LicencePopup = (props) => {
color: "white", color: "white",
} }
console.log("Priceitem: ", shuffleVariant)
const isLoggedInHandler = () => { const isLoggedInHandler = () => {
if (calculatedCost === payasyougo) { if (calculatedCost === payasyougo) {
handlePayasyougo(props.userdata) handlePayasyougo(props.userdata)
@@ -690,7 +690,7 @@ const LicencePopup = (props) => {
const priceItem = window.location.origin === "https://shuffler.io" ? const priceItem = window.location.origin === "https://shuffler.io" ?
shuffleVariant === 0 ? "app_executions" : "cores" shuffleVariant === 0 ? "app_executions" : "cores"
: :
shuffleVariant === 0 ? "price_1MROFrDzMUgUjxHShcSxgHO1" : "price_1NXjQqDzMUgUjxHSg690R4FP" shuffleVariant === 0 ? "price_1PWI5zDzMUgUjxHSKkz0fGdN" : "price_1NXjQqDzMUgUjxHSg690R4FP"
const successUrl = `${window.location.origin}/admin?admin_tab=billing&payment=success` const successUrl = `${window.location.origin}/admin?admin_tab=billing&payment=success`
const failUrl = `${window.location.origin}/pricing?admin_tab=billing&payment=failure` const failUrl = `${window.location.origin}/pricing?admin_tab=billing&payment=failure`
+6 -6
View File
@@ -517,12 +517,11 @@ const Header = (props) => {
window.location.href = responseJson["url"] window.location.href = responseJson["url"]
return return
}, 2000) }, 2000)
} } else {
setTimeout(() => { setTimeout(() => {
window.location.reload() window.location.reload()
}, 2000); }, 2000);
}
toast("Successfully changed active organization - refreshing!"); toast("Successfully changed active organization - refreshing!");
} else { } else {
if (responseJson.reason !== undefined && responseJson.reason !== null && responseJson.reason.length > 0) { if (responseJson.reason !== undefined && responseJson.reason !== null && responseJson.reason.length > 0) {
@@ -1547,7 +1546,7 @@ const Header = (props) => {
<div style={{ position: "relative", height: topbarHeight, backgroundImage: "linear-gradient(to right, #f86a3e, #f34079)", overflow: "hidden", }}> <div style={{ position: "relative", height: topbarHeight, backgroundImage: "linear-gradient(to right, #f86a3e, #f34079)", overflow: "hidden", }}>
<Typography variant="body1" style={{ paddingTop: 7, margin: "auto", textAlign: "center", color: "white", }}> <Typography variant="body1" style={{ paddingTop: 7, margin: "auto", textAlign: "center", color: "white", }}>
{/* Shuffle 1.4.0 is out! Read more about&nbsp; */} {/* Shuffle 1.4.0 is out! Read more about&nbsp; */}
Shuffle now offers&nbsp; Early Success! More&nbsp;
{/* <u> {/* <u>
<a href="https://github.com/Shuffle/Shuffle/releases/tag/v1.4.0" target="_blank" style={{ color: "inherit", }} onClick={() => { <a href="https://github.com/Shuffle/Shuffle/releases/tag/v1.4.0" target="_blank" style={{ color: "inherit", }} onClick={() => {
ReactGA.event({ ReactGA.event({
@@ -1596,10 +1595,11 @@ const Header = (props) => {
navigate("/training") navigate("/training")
}} style={{ cursor: "pointer", textDecoration: "none", color: "rgba(255,255,255,0.8)" }}> }} style={{ cursor: "pointer", textDecoration: "none", fontWeight:600, color: "rgba(255,255,255,0.8)" }}>
Public Training! Public Trainings
</span> </span>
</u> </u>
&nbsp;Ahead!
</Typography> </Typography>
<IconButton color="secondary" style={{ position: "absolute", top: -3, right: 20, }} onClick={(event) => { <IconButton color="secondary" style={{ position: "absolute", top: -3, right: 20, }} onClick={(event) => {
setShowTopbar(false) setShowTopbar(false)
@@ -308,6 +308,7 @@ const OrgHeaderexpanded = (props) => {
client_secret: openidClientSecret, client_secret: openidClientSecret,
openid_authorization: openidAuthorization, openid_authorization: openidAuthorization,
openid_token: openidToken, openid_token: openidToken,
SSORequired: SSORequired,
} }
) )
} }
+5 -1
View File
@@ -307,7 +307,6 @@ const ParsedAction = (props) => {
(action) => (action) =>
action.name.toLowerCase() === selectedAction.name.toLowerCase() action.name.toLowerCase() === selectedAction.name.toLowerCase()
); );
console.log("FOUNDACTION: ", foundAction);
if (foundAction !== null && foundAction !== undefined) { if (foundAction !== null && foundAction !== undefined) {
var foundparams = []; var foundparams = [];
for (let [paramkey,paramkeyval] in Object.entries(foundAction.parameters)) { for (let [paramkey,paramkeyval] in Object.entries(foundAction.parameters)) {
@@ -549,6 +548,11 @@ const ParsedAction = (props) => {
} }
} }
} }
if (parentNode.label === undefined) {
parentNode.label = ""
}
newActionList.push({ newActionList.push({
type: "action", type: "action",
id: parentNode.id, id: parentNode.id,
+5 -1
View File
@@ -5385,13 +5385,17 @@ If you're interested, please let me know a time that works for you, or set up a
<ListItem key={index} style={{ backgroundColor: bgColor }}> <ListItem key={index} style={{ backgroundColor: bgColor }}>
<ListItemText <ListItemText
primary= primary=
<Tooltip title={data.validation.valid === true ? "Valid. Click to explore." : "Configuration failed. Click to learn why"} placement="top"> <Tooltip title={data.validation !== null && data.validation !== undefined && data.validation.valid === true ? "Valid. Click to explore." : "Configuration failed. Click to learn why"} placement="top">
<IconButton> <IconButton>
{validIcon} {validIcon}
</IconButton> </IconButton>
</Tooltip> </Tooltip>
style={{ minWidth: 65, maxWidth: 65, }} style={{ minWidth: 65, maxWidth: 65, }}
onClick={() => { onClick={() => {
if (data.validation === null || data.validation === undefined) {
return
}
if (data.validation.workflow_id === undefined || data.validation.workflow_id === null || data.validation.workflow_id.length === 0) { if (data.validation.workflow_id === undefined || data.validation.workflow_id === null || data.validation.workflow_id.length === 0) {
toast.warn("No workflow runs found for this auth yet. Check back later.") toast.warn("No workflow runs found for this auth yet. Check back later.")
return return
+28 -7
View File
@@ -139,6 +139,7 @@ import Draggable from "react-draggable";
import cytoscapestyle from "../defaultCytoscapeStyle.jsx"; import cytoscapestyle from "../defaultCytoscapeStyle.jsx";
import ShuffleCodeEditor from "../components/ShuffleCodeEditor1.jsx"; import ShuffleCodeEditor from "../components/ShuffleCodeEditor1.jsx";
import WorkflowValidationTimeline from "../components/WorkflowValidationTimeline.jsx"
import { validateJson, GetIconInfo } from "../views/Workflows.jsx"; import { validateJson, GetIconInfo } from "../views/Workflows.jsx";
import { GetParsedPaths, internalIds, } from "../views/Apps.jsx"; import { GetParsedPaths, internalIds, } from "../views/Apps.jsx";
import ConfigureWorkflow from "../components/ConfigureWorkflow.jsx"; import ConfigureWorkflow from "../components/ConfigureWorkflow.jsx";
@@ -319,6 +320,7 @@ export function SetJsonDotnotation(jsonInput, inputKey) {
export const green = "#86c142"; export const green = "#86c142";
export const yellow = "#FECC00"; export const yellow = "#FECC00";
export const red = "red";
export function removeParam(key, sourceURL) { export function removeParam(key, sourceURL) {
if (sourceURL === undefined) { if (sourceURL === undefined) {
@@ -1641,7 +1643,6 @@ const releaseToConnectLabel = "Release to Connect"
setExecutionData(responseJson) setExecutionData(responseJson)
} else { } else {
if (responseJson.status === "ABORTED" || responseJson.status === "STOPPED" || responseJson.status === "FAILURE" || responseJson.status === "WAITING" || responseJson.status === "FINISHED") { if (responseJson.status === "ABORTED" || responseJson.status === "STOPPED" || responseJson.status === "FAILURE" || responseJson.status === "WAITING" || responseJson.status === "FINISHED") {
console.log("DONE!")
stop() stop()
} }
@@ -6732,7 +6733,6 @@ const releaseToConnectLabel = "Release to Connect"
const parentlabel = parentNode.data("label").toLowerCase().replace(" ", "_") const parentlabel = parentNode.data("label").toLowerCase().replace(" ", "_")
const parentname = parentNode.data("app_name").toLowerCase().replace(" ", "_") const parentname = parentNode.data("app_name").toLowerCase().replace(" ", "_")
if (!parentlabel.startsWith(parentname)+"_") { if (!parentlabel.startsWith(parentname)+"_") {
console.log("Return 1")
return return
} }
@@ -7135,7 +7135,6 @@ const releaseToConnectLabel = "Release to Connect"
// Find how many executions it has // Find how many executions it has
var executions = 0 var executions = 0
const matchingExecutions = workflowExecutions.filter((execution => execution.execution_source === nodedata.app_name.toLowerCase())) const matchingExecutions = workflowExecutions.filter((execution => execution.execution_source === nodedata.app_name.toLowerCase()))
console.log("Matches: ", matchingExecutions.length)
const color = matchingExecutions.length > 0 ? "#34a853" : "#ea4436" const color = matchingExecutions.length > 0 ? "#34a853" : "#ea4436"
const decoratorNode = { const decoratorNode = {
position: { position: {
@@ -10204,6 +10203,7 @@ const releaseToConnectLabel = "Release to Connect"
// Starts on current node and climbs UP the tree to the root object. // Starts on current node and climbs UP the tree to the root object.
// Sends back everything in it's path // Sends back everything in it's path
// FIXME: Use the GetParentNodes in WorkflowValidationTimeline.jsx instead
const getParents = (action) => { const getParents = (action) => {
if (action === undefined || action === null) { if (action === undefined || action === null) {
return [] return []
@@ -18717,6 +18717,7 @@ const releaseToConnectLabel = "Release to Connect"
: null} : null}
</div> </div>
{executionData.workflow !== undefined && executionData.workflow !== null && executionData.workflow.actions !== undefined && executionData.workflow.actions !== null && executionData.workflow.actions.length > 0 ? {executionData.workflow !== undefined && executionData.workflow !== null && executionData.workflow.actions !== undefined && executionData.workflow.actions !== null && executionData.workflow.actions.length > 0 ?
<div style={{ display: "flex", marginLeft: 10, }}> <div style={{ display: "flex", marginLeft: 10, }}>
<Typography variant="body1"> <Typography variant="body1">
@@ -18828,12 +18829,31 @@ const releaseToConnectLabel = "Release to Connect"
{new Date(executionData.completed_at * 1000).toLocaleString("en-GB")} {new Date(executionData.completed_at * 1000).toLocaleString("en-GB")}
</Typography> </Typography>
</div> </div>
) : null} ) : null}
{executionData.workflow !== undefined && executionData.workflow !== null && executionData.status !== "EXECUTING" ?
<div style={{marginTop: 5, marginBottom: 5, }}>
<WorkflowValidationTimeline
originalWorkflow={workflow}
apps={apps}
workflow={executionData.workflow}
getParents={getParents}
execution={executionData}
/>
</div>
: null}
<div style={{ marginTop: 10 }} /> <div style={{ marginTop: 10 }} />
{executionData.execution_argument !== undefined &&
executionData.execution_argument.length > 0 {executionData.execution_argument !== undefined && executionData.execution_argument !== null &&
executionData.execution_argument.length > 1
? parsedExecutionArgument() ? parsedExecutionArgument()
: null} :
null}
<Divider <Divider
style={{ style={{
backgroundColor: "rgba(255,255,255,0.6)", backgroundColor: "rgba(255,255,255,0.6)",
@@ -18841,6 +18861,7 @@ const releaseToConnectLabel = "Release to Connect"
marginBottom: 20, marginBottom: 20,
}} }}
/> />
{executionData.results !== undefined && {executionData.results !== undefined &&
executionData.results !== null && executionData.results !== null &&
executionData.results.length > 1 && executionData.results.length > 1 &&
@@ -19534,7 +19555,7 @@ const releaseToConnectLabel = "Release to Connect"
if (stringjson.includes("\n") && !stringjson.includes("\n")) { if (stringjson.includes("\n") && !stringjson.includes("\n")) {
return "Looks like you have a newline problem. Consider using the | replace: '\n', '\\n' }} filter in Liquid." return "Looks like you have a newline problem. Consider using the | replace: '\n', '\\n' }} filter in Liquid."
} else { } else {
return "The result looks like it should be JSON, but is invalid. Look for potential" return "The result looks like it should be JSON, but is invalid. Look for potential single quotes instead of double quotes, missing commas or newlines"
} }
} }
} }