diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py
index 51690770..1ae7049c 100755
--- a/backend/app_sdk/app_base.py
+++ b/backend/app_sdk/app_base.py
@@ -1914,7 +1914,6 @@ class AppBase:
c_parentheses = parse_nested_param(parse_string, 0)[0]
match_string = re.escape(c_parentheses)
custom_casting = re.findall(fr"({wrapper_group})\({match_string}", parse_string)
- print("[DEBUG] In ELSE: %s" % custom_casting)
# check if a wrapper was found
if len(custom_casting) != 0:
inner_result = parse_type(c_parentheses, custom_casting[0])
@@ -2093,7 +2092,6 @@ class AppBase:
except IndexError:
newvalue, is_loop = (tmpitem, parsersplit[outercnt+1:])
else:
- #print("[INFO] In ELSE - handling %s and %s" % (firstitem, seconditem))
if isinstance(firstitem, str):
if firstitem.lower() == "max" or firstitem.lower() == "last" or firstitem.lower() == "end":
firstitem = len(basejson)-1
diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go
index c1e71f2f..a9d72774 100755
--- a/backend/go-app/walkoff.go
+++ b/backend/go-app/walkoff.go
@@ -552,7 +552,9 @@ func handleGetStreamResults(resp http.ResponseWriter, request *http.Request) {
ctx := context.Background()
workflowExecution, err := shuffle.GetWorkflowExecution(ctx, actionResult.ExecutionId)
if err != nil {
- log.Printf("[WARNING][%s] Failed getting execution (streamresult): %s", actionResult.ExecutionId, err)
+ if len(actionResult.ExecutionId) > 0 {
+ log.Printf("[WARNING][%s] Failed getting execution (streamresult): %s", actionResult.ExecutionId, err)
+ }
resp.WriteHeader(401)
resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "Bad authorization key or execution_id might not exist."}`)))
return
diff --git a/frontend/src/components/AppFramework.jsx b/frontend/src/components/AppFramework.jsx
index 383553fd..fbdf7fa0 100644
--- a/frontend/src/components/AppFramework.jsx
+++ b/frontend/src/components/AppFramework.jsx
@@ -40,12 +40,12 @@ cytoscape.use(edgehandles);
export const findSpecificApp = (framework, inputcategory) => {
// Get the frameworkinfo for the org and fill in
if (framework === undefined || framework === null) {
- console.log("findSpecificApp: framework is null")
+ //console.log("findSpecificApp: framework is null")
return null
}
if (inputcategory === undefined || inputcategory === null) {
- console.log("findSpecificApp: category is null")
+ //console.log("findSpecificApp: category is null")
return null
}
@@ -118,8 +118,8 @@ export const findSpecificApp = (framework, inputcategory) => {
}
return {
- name: "EDR :default",
- large_image: parsedDatatypeImages["EDR & AV"],
+ name: "IAM :default",
+ large_image: parsedDatatypeImages["IAM"],
count: 0,
description: "",
id: "",
@@ -654,7 +654,7 @@ const AppFramework = (props) => {
const handleLoadNextSuggestion = (frameworkData) => {
- console.log("Should check for next apps to load from App suggestion model")
+ //console.log("Should check for next apps to load from App suggestion model")
//fetch(globalUrl + "/api/v1/workflows/usecases", {
//credentials: "include",
//cors: "no-cors",
@@ -720,7 +720,7 @@ const AppFramework = (props) => {
}
const showRecommendations = (changed, frameworkData) => {
- console.log("Inside recommendation loader")
+ //console.log("Inside recommendation loader")
setChangedApp(changed)
handleLoadNextSuggestion(frameworkData)
@@ -761,7 +761,7 @@ const AppFramework = (props) => {
//console.log("APptype, changed, framework: ", apptype.toLowerCase(), alternativeChanged.toLowerCase(), changed.toLowerCase(), frameworkData)
if (changed.toLowerCase() === apptype.toLowerCase() || changed.toLowerCase().includes(apptype.toLowerCase()) || alternativeChanged.toLowerCase() === apptype.toLowerCase() || alternativeChanged.toLowerCase().includes(apptype.toLowerCase())) {
potential = true
- console.log("Potential: !", apptype)
+ //console.log("Potential: !", apptype)
if (frameworkData[apptype] !== undefined && frameworkData[apptype].name !== undefined && frameworkData[apptype].name !== null && frameworkData[apptype].name.length > 0) {
usecase.items[itemtype].app = frameworkData[apptype]
@@ -819,10 +819,10 @@ const AppFramework = (props) => {
continue
}
} else {
- console.log("No usecase to try to match it to (usecase.usecase_references in UsecaseSearch)")
+ //console.log("No usecase to try to match it to (usecase.usecase_references in UsecaseSearch)")
}
- console.log("Usecase: ", usecase)
+ //console.log("Usecase: ", usecase)
if (matches.length === usecase.items.length) {
usecase.color = "#c51152"
usecase.type = usecaseTypes[key].name
@@ -833,8 +833,8 @@ const AppFramework = (props) => {
}
// FIXME: Check if a usecase has already been handled
- console.log("")
- console.log("GOT USECASES: ", showusecases)
+ //console.log("")
+ //console.log("GOT USECASES: ", showusecases)
// FIXME: Just showing one usecase at a time for now
if (showusecases.length > 0) {
@@ -894,38 +894,37 @@ const AppFramework = (props) => {
parsedUsecase.process.push(edge.data)
}
- fetch(globalUrl + "/api/v1/workflows/usecases", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- Accept: "application/json",
- },
- body: JSON.stringify(parsedUsecase),
- credentials: "include",
- })
- .then((response) => {
- if (response.status !== 200) {
- console.log("Status not 200 for framework!");
- }
+ fetch(globalUrl + "/api/v1/workflows/usecases", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ Accept: "application/json",
+ },
+ body: JSON.stringify(parsedUsecase),
+ credentials: "include",
+ })
+ .then((response) => {
+ if (response.status !== 200) {
+ console.log("Status not 200 for framework!");
+ }
- return response.json();
- })
- .then((responseJson) => {
- if (responseJson.success === false) {
- if (responseJson.reason !== undefined) {
- toast("Failed updating: " + responseJson.reason)
- } else {
- toast("Failed to update framework for your org.")
- }
+ return response.json();
+ })
+ .then((responseJson) => {
+ if (responseJson.success === false) {
+ if (responseJson.reason !== undefined) {
+ toast("Failed updating: " + responseJson.reason)
} else {
- toast("Updated usecase.")
+ toast("Failed to update framework for your org.")
}
- })
- .catch((error) => {
- toast(error.toString());
- //setFrameworkLoaded(true)
- })
- }
+ } else {
+ toast("Updated usecase.")
+ }
+ })
+ .catch((error) => {
+ toast(error.toString());
+ })
+ }
const activateApp = (appid) => {
fetch(globalUrl+"/api/v1/apps/"+appid+"/activate", {
@@ -957,45 +956,54 @@ const AppFramework = (props) => {
}
const setFrameworkItem = (data) => {
- console.log("Setting framework item: ", data, isCloud)
if (!isCloud) {
activateApp(data.id)
}
- fetch(globalUrl + "/api/v1/apps/frameworkConfiguration", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- Accept: "application/json",
- },
- body: JSON.stringify(data),
- credentials: "include",
- })
- .then((response) => {
- if (response.status !== 200) {
- console.log("Status not 200 for framework!");
- }
+ fetch(globalUrl + "/api/v1/apps/frameworkConfiguration", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ Accept: "application/json",
+ },
+ body: JSON.stringify(data),
+ credentials: "include",
+ })
+ .then((response) => {
+ if (response.status !== 200) {
+ console.log("Status not 200 for framework!");
+ }
- return response.json();
- })
- .then((responseJson) => {
- if (responseJson.success === false) {
- if (responseJson.reason !== undefined) {
- toast("Failed updating: " + responseJson.reason)
- } else {
- toast("Failed to update framework for your org.")
+ return response.json();
+ })
+ .then((responseJson) => {
+ if (responseJson.success === false) {
+ if (responseJson.reason !== undefined) {
+ toast("Failed getting appframework: " + responseJson.reason)
+ } else {
+ toast("Failed to update framework for your org.")
- }
- }
+ }
+ } else {
+ if (data.id === "remove") {
+ frameworkData[data.type] = {}
+ frameworkData[data.type.toLowerCase()] = {}
+ } else {
+ frameworkData[data.type] = data
+ frameworkData[data.type.toLowerCase()] = data
+ }
- //setFrameworkLoaded(true)
- //setFrameworkData(responseJson)
- })
- .catch((error) => {
- toast(error.toString());
- //setFrameworkLoaded(true)
- })
- }
+ setDiscoveryData({})
+ if (setFrameworkData !== undefined) {
+ setFrameworkData(frameworkData)
+ }
+ }
+ })
+ .catch((error) => {
+ toast(error.toString());
+ //setFrameworkLoaded(true)
+ })
+ }
useEffect(() => {
if (!window.location.pathname.includes("usecases")) {
@@ -1058,7 +1066,6 @@ const AppFramework = (props) => {
frameworkData[keys[key]] = submitValue
}
- console.log("Frameworkdata: ", frameworkData)
setFrameworkData(frameworkData)
if (discoveryData.large_image !== undefined && discoveryData.large_image !== null && discoveryData.large_image.includes("storage.googleapis.com")) {
@@ -1076,8 +1083,6 @@ const AppFramework = (props) => {
const isCloud = window.location.host === "localhost:3002" || window.location.host === "shuffler.io";
-
-
const imgSize = 50;
var parsedFrameworkData = frameworkData === undefined ? {} : frameworkData
@@ -1263,7 +1268,7 @@ const AppFramework = (props) => {
var parsedStyle2 = {
"ghost": "yes",
- "border-width": "7px",
+ "border-width": "7px",
}
/*
@@ -1399,7 +1404,6 @@ const AppFramework = (props) => {
const onNodeSelect = (event) => {
var data = event.target.data();
- console.log("Node: ", data)
if (data.id === "SHUFFLE") {
event.target.unselect()
return
@@ -1465,6 +1469,15 @@ const AppFramework = (props) => {
const foundMiddleImage = userdata !== undefined && userdata !== null && userdata.active_org !== undefined && userdata.active_org.image !== undefined && userdata.active_org.image !== null && userdata.active_org.image !== "" ? userdata.active_org.image : '/images/Shuffle_logo.png'
+ const siemcheck = parsedFrameworkData.SIEM.large_image === undefined || (parsedFrameworkData.SIEM.name !== undefined && parsedFrameworkData.SIEM.name !== null && parsedFrameworkData.SIEM.name.includes(":default"))
+ const iamcheck = parsedFrameworkData.IAM.large_image === undefined || (parsedFrameworkData.IAM.name !== undefined && parsedFrameworkData.IAM.name !== null && parsedFrameworkData.IAM.name.includes(":default"))
+ const casescheck = parsedFrameworkData.Cases.large_image === undefined || (parsedFrameworkData.Cases.name !== undefined && parsedFrameworkData.Cases.name !== null && parsedFrameworkData.Cases.name.includes(":default"))
+ const assetscheck = parsedFrameworkData.Assets.large_image === undefined || (parsedFrameworkData.Assets.name !== undefined && parsedFrameworkData.Assets.name !== null && parsedFrameworkData.Assets.name.includes(":default"))
+ const intelcheck = parsedFrameworkData.Intel.large_image === undefined || (parsedFrameworkData.Intel.name !== undefined && parsedFrameworkData.Intel.name !== null && parsedFrameworkData.Intel.name.includes(":default"))
+ const commscheck = parsedFrameworkData.Comms.large_image === undefined || (parsedFrameworkData.Comms.name !== undefined && parsedFrameworkData.Comms.name !== null && parsedFrameworkData.Comms.name.includes(":default"))
+ const edrcheck = parsedFrameworkData["EDR & AV"].large_image === undefined || (parsedFrameworkData["EDR & AV"].name !== undefined && parsedFrameworkData["EDR & AV"].name !== null && parsedFrameworkData["EDR & AV"].name.includes(":default"))
+ const networkcheck = parsedFrameworkData.Network.large_image === undefined || (parsedFrameworkData.Network.name !== undefined && parsedFrameworkData.Network.name !== null && parsedFrameworkData.Network.name.includes(":default"))
+
const fontSize = `${12*scale}px`
const defaultSize = `${85*scale}px`
@@ -1484,11 +1497,11 @@ const AppFramework = (props) => {
name: parsedFrameworkData.Cases.name === undefined ? "" : parsedFrameworkData.Cases.name,
description: parsedFrameworkData.Cases.description === undefined ? "" : parsedFrameworkData.Cases.description,
app_id: parsedFrameworkData.Cases.id === undefined ? "" : parsedFrameworkData.Cases.id,
- text_margin_y: parsedFrameworkData.Cases.large_image === undefined ? textMarginDefault : textMarginImage,
- margin_x: parsedFrameworkData.Cases.large_image === undefined ? `${32*scale}px` : "0px",
- margin_y: parsedFrameworkData.Cases.large_image === undefined ? `${19*scale}px` : `0px`,
- width: parsedFrameworkData.Cases.large_image === undefined ? iconSize : defaultSize,
- height: parsedFrameworkData.Cases.large_image === undefined ? iconSize : defaultSize,
+ text_margin_y: casescheck ? textMarginDefault : textMarginImage,
+ margin_x: casescheck ? `${32*scale}px` : "0px",
+ margin_y: casescheck ? `${19*scale}px` : `0px`,
+ width: casescheck ? iconSize : defaultSize,
+ height: casescheck ? iconSize : defaultSize,
large_image: parsedFrameworkData.Cases.large_image === undefined ? parsedDatatypeImages["CASES"] : parsedFrameworkData.Cases.large_image,
label: securityFramework[0].text.toUpperCase(),
@@ -1501,6 +1514,7 @@ const AppFramework = (props) => {
}
},
{
+
group: "nodes",
data: {
font_size: fontSize,
@@ -1512,11 +1526,11 @@ const AppFramework = (props) => {
name: parsedFrameworkData.IAM.name === undefined ? "" : parsedFrameworkData.IAM.name,
description: parsedFrameworkData.IAM.description === undefined ? "" : parsedFrameworkData.IAM.description,
app_id: parsedFrameworkData.IAM.id === undefined ? "" : parsedFrameworkData.IAM.id,
- text_margin_y: parsedFrameworkData.IAM.large_image === undefined ? textMarginDefault : textMarginImage,
- margin_x: parsedFrameworkData.IAM.large_image === undefined ? `${32*scale}px` : "0px",
- margin_y: parsedFrameworkData.IAM.large_image === undefined ? `${19*scale}px` : `0px`,
- width: parsedFrameworkData.IAM.large_image === undefined ? iconSize : defaultSize,
- height: parsedFrameworkData.IAM.large_image === undefined ? iconSize : defaultSize,
+ text_margin_y: iamcheck ? textMarginDefault : textMarginImage,
+ margin_x: iamcheck ? `${32*scale}px` : "0px",
+ margin_y: iamcheck ? `${19*scale}px` : `0px`,
+ width: iamcheck ? iconSize : defaultSize,
+ height: iamcheck ? iconSize : defaultSize,
large_image: parsedFrameworkData.IAM.large_image === undefined ? parsedDatatypeImages["IAM"] : parsedFrameworkData.IAM.large_image,
label: securityFramework[3].text.toUpperCase(),
@@ -1540,11 +1554,11 @@ const AppFramework = (props) => {
name: parsedFrameworkData.Assets.name === undefined ? "" : parsedFrameworkData.Assets.name,
description: parsedFrameworkData.Assets.description === undefined ? "" : parsedFrameworkData.Assets.description,
app_id: parsedFrameworkData.Assets.id === undefined ? "" : parsedFrameworkData.Assets.id,
- text_margin_y: parsedFrameworkData.Assets.large_image === undefined ? textMarginDefault : textMarginImage,
- margin_x: parsedFrameworkData.Assets.large_image === undefined ? `${32*scale}px` : "0px",
- margin_y: parsedFrameworkData.Assets.large_image === undefined ? `${19*scale}px` : `0px`,
- width: parsedFrameworkData.Assets.large_image === undefined ? iconSize : defaultSize,
- height: parsedFrameworkData.Assets.large_image === undefined ? iconSize : defaultSize,
+ text_margin_y: assetscheck ? textMarginDefault : textMarginImage,
+ margin_x: assetscheck ? `${32*scale}px` : "0px",
+ margin_y: assetscheck ? `${19*scale}px` : `0px`,
+ width: assetscheck ? iconSize : defaultSize,
+ height: assetscheck ? iconSize : defaultSize,
large_image: parsedFrameworkData.Assets.large_image === undefined ? parsedDatatypeImages["ASSETS"] : parsedFrameworkData.Assets.large_image,
label: securityFramework[2].text.toUpperCase(),
@@ -1568,11 +1582,11 @@ const AppFramework = (props) => {
name: parsedFrameworkData.Intel.name === undefined ? "" : parsedFrameworkData.Intel.name,
description: parsedFrameworkData.Intel.description === undefined ? "" : parsedFrameworkData.Intel.description,
app_id: parsedFrameworkData.Intel.id === undefined ? "" : parsedFrameworkData.Intel.id,
- text_margin_y: parsedFrameworkData.Intel.large_image === undefined ? textMarginDefault : textMarginImage,
- margin_x: parsedFrameworkData.Intel.large_image === undefined ? `${32*scale}px` : "0px",
- margin_y: parsedFrameworkData.Intel.large_image === undefined ? `${19*scale}px` : `0px`,
- width: parsedFrameworkData.Intel.large_image === undefined ? iconSize : defaultSize,
- height: parsedFrameworkData.Intel.large_image === undefined ? iconSize : defaultSize,
+ text_margin_y: intelcheck ? textMarginDefault : textMarginImage,
+ margin_x: intelcheck ? `${32*scale}px` : "0px",
+ margin_y: intelcheck ? `${19*scale}px` : `0px`,
+ width: intelcheck ? iconSize : defaultSize,
+ height: intelcheck ? iconSize : defaultSize,
large_image: parsedFrameworkData.Intel.large_image === undefined ? parsedDatatypeImages["INTEL"] : parsedFrameworkData.Intel.large_image,
label: securityFramework[4].text.toUpperCase(),
@@ -1596,11 +1610,11 @@ const AppFramework = (props) => {
name: parsedFrameworkData.Comms.name === undefined ? "" : parsedFrameworkData.Comms.name,
description: parsedFrameworkData.Comms.description === undefined ? "" : parsedFrameworkData.Comms.description,
app_id: parsedFrameworkData.Comms.id === undefined ? "" : parsedFrameworkData.Comms.id,
- text_margin_y: parsedFrameworkData.Comms.large_image === undefined ? textMarginDefault : textMarginImage,
- margin_x: parsedFrameworkData.Comms.large_image === undefined ? `${32*scale}px` : "0px",
- margin_y: parsedFrameworkData.Comms.large_image === undefined ? `${19*scale}px` : `0px`,
- width: parsedFrameworkData.Comms.large_image === undefined ? iconSize : defaultSize,
- height: parsedFrameworkData.Comms.large_image === undefined ? iconSize : defaultSize,
+ text_margin_y: commscheck ? textMarginDefault : textMarginImage,
+ margin_x: commscheck ? `${32*scale}px` : "0px",
+ margin_y: commscheck ? `${19*scale}px` : `0px`,
+ width: commscheck ? iconSize : defaultSize,
+ height: commscheck ? iconSize : defaultSize,
large_image: parsedFrameworkData.Comms.large_image === undefined ? parsedDatatypeImages["COMMS"] : parsedFrameworkData.Comms.large_image,
label: securityFramework[5].text.toUpperCase(),
@@ -1624,11 +1638,11 @@ const AppFramework = (props) => {
name: parsedFrameworkData["EDR & AV"].name === undefined ? "" : parsedFrameworkData["EDR & AV"].name,
description: parsedFrameworkData["EDR & AV"].description === undefined ? "" : parsedFrameworkData["EDR & AV"].description,
app_id: parsedFrameworkData["EDR & AV"].id === undefined ? "" : parsedFrameworkData["EDR & AV"].id,
- text_margin_y: parsedFrameworkData["EDR & AV"].large_image === undefined ? textMarginDefault : textMarginImage,
- margin_x: parsedFrameworkData["EDR & AV"].large_image === undefined ? `${32*scale}px` : "0px",
- margin_y: parsedFrameworkData["EDR & AV"].large_image === undefined ? `${19*scale}px` : `0px`,
- width: parsedFrameworkData["EDR & AV"].large_image === undefined ? iconSize : defaultSize,
- height: parsedFrameworkData["EDR & AV"].large_image === undefined ? iconSize : defaultSize,
+ text_margin_y: edrcheck ? textMarginDefault : textMarginImage,
+ margin_x: edrcheck ? `${32*scale}px` : "0px",
+ margin_y: edrcheck ? `${19*scale}px` : `0px`,
+ width: edrcheck ? iconSize : defaultSize,
+ height: edrcheck ? iconSize : defaultSize,
large_image: parsedFrameworkData["EDR & AV"].large_image === undefined ? parsedDatatypeImages["EDR & AV"] : parsedFrameworkData["EDR & AV"].large_image,
label: securityFramework[7].text.toUpperCase(),
@@ -1652,11 +1666,11 @@ const AppFramework = (props) => {
name: parsedFrameworkData.Network.name === undefined ? "" : parsedFrameworkData.Network.name,
description: parsedFrameworkData.Network.description === undefined ? "" : parsedFrameworkData.Network.description,
app_id: parsedFrameworkData.Network.id === undefined ? "" : parsedFrameworkData.Network.id,
- text_margin_y: parsedFrameworkData.Network.large_image === undefined ? textMarginDefault : textMarginImage,
- margin_x: parsedFrameworkData.Network.large_image === undefined ? `${32*scale}px` : "0px",
- margin_y: parsedFrameworkData.Network.large_image === undefined ? `${19*scale}px` : `0px`,
- width: parsedFrameworkData.Network.large_image === undefined ? iconSize : defaultSize,
- height: parsedFrameworkData.Network.large_image === undefined ? iconSize : defaultSize,
+ text_margin_y: networkcheck ? textMarginDefault : textMarginImage,
+ margin_x: networkcheck ? `${32*scale}px` : "0px",
+ margin_y: networkcheck ? `${19*scale}px` : `0px`,
+ width: networkcheck ? iconSize : defaultSize,
+ height: networkcheck ? iconSize : defaultSize,
large_image: parsedFrameworkData.Network.large_image === undefined ? parsedDatatypeImages["NETWORK"] : parsedFrameworkData.Network.large_image,
label: securityFramework[6].text.toUpperCase(),
id: securityFramework[6].text.toUpperCase(),
@@ -1679,11 +1693,11 @@ const AppFramework = (props) => {
name: parsedFrameworkData.SIEM.name === undefined ? "" : parsedFrameworkData.SIEM.name,
description: parsedFrameworkData.SIEM.description === undefined ? "" : parsedFrameworkData.SIEM.description,
app_id: parsedFrameworkData.SIEM.id === undefined ? "" : parsedFrameworkData.SIEM.id,
- text_margin_y: parsedFrameworkData.SIEM.large_image === undefined ? textMarginDefault : textMarginImage,
- margin_x: parsedFrameworkData.SIEM.large_image === undefined ? `${32*scale}px` : "0px",
- margin_y: parsedFrameworkData.SIEM.large_image === undefined ? `${19*scale}px` : `0px`,
- width: parsedFrameworkData.SIEM.large_image === undefined ? iconSize : defaultSize,
- height: parsedFrameworkData.SIEM.large_image === undefined ? iconSize : defaultSize,
+ text_margin_y: siemcheck ? textMarginDefault : textMarginImage,
+ margin_x: siemcheck ? `${32*scale}px` : "0px",
+ margin_y: siemcheck ? `${19*scale}px` : `0px`,
+ width: siemcheck ? iconSize : defaultSize,
+ height: siemcheck ? iconSize : defaultSize,
large_image: parsedFrameworkData.SIEM.large_image === undefined ? parsedDatatypeImages["SIEM"] : parsedFrameworkData.SIEM.large_image,
label: securityFramework[1].text.toUpperCase(),
id: securityFramework[1].text.toUpperCase(),
@@ -1988,6 +2002,7 @@ const AppFramework = (props) => {
const bgColor = color === undefined || color === null || color.length === 0 ? theme.palette.surfaceColor : color
return (
+ {/*
{
inputSearch={changedApp}
apps={apps}
/>
-
- {injectedApps.map((apps, appindex) => {
+
+ */}
+
+ {/*injectedApps.map((apps, appindex) => {
var categoryTop = 100
var categoryLeft = 100
@@ -2028,8 +2045,11 @@ const AppFramework = (props) => {
return null
}
+ const scale = 0.9
+ const offsetTop = -70
+ const offsetLeft = 0
return (
-
+
{apps.map((app, appIndex) => {
return (
{
}
if (setFrameworkData !== undefined) {
- console.log("Setting frameworkdata")
// Find discoveryData.id
var keys = []
for (const [key, value] of Object.entries(frameworkData)) {
@@ -2088,7 +2107,7 @@ const AppFramework = (props) => {
})}
)
- })}
+ })*/}
{showOptions === false ? null :
diff --git a/frontend/src/components/AppSearchButtons.jsx b/frontend/src/components/AppSearchButtons.jsx
index 553b7e41..262843ad 100644
--- a/frontend/src/components/AppSearchButtons.jsx
+++ b/frontend/src/components/AppSearchButtons.jsx
@@ -37,7 +37,7 @@ import {
} from '@mui/material';
const AppSearchButtons = (props) => {
- const { userdata, globalUrl, appFramework, moreButton, finishedApps, appType, totalApps, index, onNodeSelect, setDiscoveryData, appName, AppImage, setDefaultSearch, discoveryData, checkLogin, setMissing, } = props
+ const { userdata, globalUrl, appFramework, moreButton, finishedApps, appType, totalApps, index, onNodeSelect, setDiscoveryData, appName, AppImage, setDefaultSearch, discoveryData, checkLogin, setMissing, getAppFramework, } = props
const ref = useRef()
let navigate = useNavigate();
@@ -48,8 +48,6 @@ const AppSearchButtons = (props) => {
useEffect(() => {
if (newSelectedApp !== undefined && setMissing != undefined) {
- console.log("AppSearchButtons: setMissing is defined!")
-
const submitAppFramework = {
"description": newSelectedApp.description,
"id": newSelectedApp.objectID,
@@ -60,11 +58,17 @@ const AppSearchButtons = (props) => {
setFrameworkItem(submitAppFramework)
setMissing(newSelectedApp)
+
+ if (getAppFramework !== undefined) {
+ setTimeout(() => {
+ getAppFramework()
+ }, 1000)
+ }
}
}, [newSelectedApp])
if (appType === undefined) {
- console.log("Apptype is required in AppSearchButtons")
+ //console.log("Apptype is required in AppSearchButtons")
return null;
}
diff --git a/frontend/src/components/ConfigureWorkflow.jsx b/frontend/src/components/ConfigureWorkflow.jsx
index 81e9fd3d..ef727fde 100755
--- a/frontend/src/components/ConfigureWorkflow.jsx
+++ b/frontend/src/components/ConfigureWorkflow.jsx
@@ -77,10 +77,8 @@ const ConfigureWorkflow = (props) => {
const [checkStarted, setCheckStarted] = React.useState(false);
useEffect(() => {
- console.log("Required actions: ", requiredActions)
+ //console.log("Configure Workflow: Required actions: ", requiredActions)
if (requiredActions.length === 0) {
- console.log("No more actions? Set parent to done?")
-
if (setConfigurationFinished !== undefined) {
setConfigurationFinished(true)
}
@@ -731,6 +729,7 @@ const ConfigureWorkflow = (props) => {
parsedName = (parsedName.charAt(0).toUpperCase() + parsedName.slice(1)).replaceAll("_", " ");
+ console.log("AUTH Action: ", action)
return (
{
const newWorkflow = isEditing === true ? false : true
const priority = userdata === undefined || userdata === null ? null : userdata.priorities.find(prio => prio.type === "usecase" && prio.active === true)
- console.log("PRIO: ", priority)
-
var upload = "";
var total_count = 0
@@ -485,7 +483,7 @@ const EditWorkflow = (props) => {
-
+
}
- {(missingSource !== undefined || missingDestination !== undefined) ?
+ {(appSetupDone === false && missingSource !== undefined || missingDestination !== undefined) ?
- {"Find relevevant Apps for this Usecase"}
+ {"Find relevant Apps for this Usecase"}
: null}
@@ -491,6 +525,8 @@ const WorkflowTemplatePopup = (props) => {
AppImage={missingSource.image}
setMissing={setMissingSource}
+
+ getAppFramework={getAppFramework}
/>
: null}
@@ -505,6 +541,8 @@ const WorkflowTemplatePopup = (props) => {
AppImage={missingDestination.image}
setMissing={setMissingDestination}
+
+ getAppFramework={getAppFramework}
/>
: null}
diff --git a/frontend/src/views/Admin.jsx b/frontend/src/views/Admin.jsx
index f653bd2c..39e7fa25 100755
--- a/frontend/src/views/Admin.jsx
+++ b/frontend/src/views/Admin.jsx
@@ -4406,7 +4406,7 @@ If you're interested, please let me know a time that works for you, or set up a
/>
setDefaultEnvironment(environment)}
color="primary"
>
diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx
index 2f461690..fc7aae3c 100755
--- a/frontend/src/views/AngularWorkflow.jsx
+++ b/frontend/src/views/AngularWorkflow.jsx
@@ -13362,6 +13362,67 @@ const AngularWorkflow = (defaultprops) => {
{workflow.name}
+
+ {workflow.public === true || userdata.active_org.id === undefined || userdata.active_org.id === null || workflow.org_id === null || workflow.org_id === undefined || workflow.org_id.length === 0 || userdata.active_org.id === workflow.org_id ? null :
+
+ Warning: Change {
+ toast("Changing to correct organization. Please wait a few seconds.")
+
+ localStorage.setItem("globalUrl", "");
+ localStorage.setItem("getting_started_sidebar", "open");
+ fetch(`${globalUrl}/api/v1/orgs/${workflow.org_id}/change`, {
+ mode: "cors",
+ credentials: "include",
+ crossDomain: true,
+ method: "POST",
+ body: JSON.stringify({"org_id": workflow.org_id}),
+ withCredentials: true,
+ headers: {
+ "Content-Type": "application/json; charset=utf-8",
+ },
+ })
+ .then(function (response) {
+ if (response.status !== 200) {
+ console.log("Error in response");
+ }
+
+ return response.json();
+ })
+ .then(function (responseJson) {
+ console.log("In here?")
+ if (responseJson.success === true) {
+ if (responseJson.region_url !== undefined && responseJson.region_url !== null && responseJson.region_url.length > 0) {
+ console.log("Region Change: ", responseJson.region_url);
+ localStorage.setItem("globalUrl", responseJson.region_url);
+ //globalUrl = responseJson.region_url
+ }
+
+ setTimeout(() => {
+ window.location.reload();
+ }, 2000);
+
+ toast("Successfully changed active organization - refreshing!");
+ } else {
+ if (responseJson.reason !== undefined && responseJson.reason !== null && responseJson.reason.length > 0) {
+ toast(responseJson.reason);
+ } else {
+ toast("Failed changing org. Try again or contact support@shuffler.io if this persists.");
+ }
+ }
+ })
+ .catch((error) => {
+ console.log("error changing: ", error);
+ //removeCookie("session_token", {path: "/"})
+ })
+
+
+
+ }}
+ >Active Organization to edit this Workflow.
+
+ }
{parentWorkflows.slice(0,5).map((wf, index) => {
@@ -13740,9 +13801,64 @@ const AngularWorkflow = (defaultprops) => {
: null
+
+
const RightsideBar = () => {
const [hovered, setHovered] = useState(false)
+ useEffect(() => {
+ const handleKeyDown = (event) => {
+ if ((event.metaKey || event.ctrlKey) && event.key === '/') {
+ event.preventDefault(); // Prevent default browser behavior (like opening search bar)
+ if (!workflow.public && !executionRequestStarted) {
+ executeWorkflow(executionText, workflow.start, lastSaved);
+ }
+ }
+ if ((event.ctrlKey || event.metaKey) && event.key === "'") {
+ // Check if Ctrl (Windows/Linux) or Command (Mac) key is pressed along with '/'
+ if (!workflow.public && !executionModalOpen) {
+ setExecutionModalOpen(true);
+ getWorkflowExecution(props.match.params.key, "");
+ } else if (!workflow.public && executionModalOpen) {
+ setExecutionModalOpen(false);
+ }
+ }
+
+ if ((event.ctrlKey || event.metaKey) && event.key === "]") {
+ console.log("Show workflow revisions key pressed")
+ if (!workflow.public) {
+ setShowWorkflowRevisions(true)
+ setSelectedRevision(workflow)
+ //setOriginalWorkflow(workflow)
+ }
+ }
+
+ if (( event.ctrlKey || event.metaKey ) && event.key === ";") {
+ if (!workflow.public && executionModalOpen) {
+ getWorkflowExecution(props.match.params.key, "");
+ }
+ }
+
+ if (( event.ctrlKey || event.metaKey ) && event.shiftKey) {
+ console.log("Shift key pressed")
+ if (!workflow.public && executionModalOpen) {
+ setExecutionRunning(false);
+ stop()
+ const cursearch = typeof window === "undefined" || window.location === undefined ? "" : window.location.search;
+ const newitem = removeParam("execution_id", cursearch);
+ navigate(curpath + newitem)
+ setExecutionModalView(0);
+ }
+ }
+ };
+
+ document.addEventListener('keydown', handleKeyDown);
+
+ return () => {
+ document.removeEventListener('keydown', handleKeyDown);
+ };
+ }, [executeWorkflow, executionText, workflow, lastSaved, executionRequestStarted]);
+
return (
{
) : (
-
+
@@ -14065,7 +14181,7 @@ const AngularWorkflow = (defaultprops) => {
@@ -14076,8 +14192,8 @@ const AngularWorkflow = (defaultprops) => {
variant={"outlined"}
onClick={() => {
setShowWorkflowRevisions(true)
- setSelectedRevision(workflow)
- //setOriginalWorkflow(workflow)
+ setSelectedRevision(workflow)
+ //setOriginalWorkflow(workflow)
}}
>
@@ -14279,6 +14395,52 @@ const AngularWorkflow = (defaultprops) => {
//return null;
};
+ const unPublishWorkflow = (data) => {
+ if (!isCloud) {
+ toast("Function only supported on cloud")
+ return
+ }
+
+ if (data.public !== true) {
+ toast("Workflow is not public. Can't unpublish");
+ return
+ }
+
+ // This ALWAYS talks to Shuffle cloud
+ data = JSON.parse(JSON.stringify(data));
+ const url = `${globalUrl}/api/v1/workflows/${data.id}/unpublish`;
+ fetch(url, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ Accept: "application/json",
+ },
+ body: JSON.stringify(data),
+ credentials: "include",
+ })
+ .then((response) => {
+ if (response.status !== 200) {
+ console.log("Status not 200 for workflow publish :O!");
+ }
+
+ return response.json();
+ })
+ .then((responseJson) => {
+ if (responseJson.reason !== undefined) {
+ toast("Unpublishing: "+responseJson.reason)
+ }
+
+ if (responseJson.success === true) {
+ workflow.public = false
+ setWorkflow(workflow)
+ }
+ })
+ .catch((error) => {
+ toast("Failed publishing: is the workflow valid? Remember to save the workflow first.")
+ console.log(error.toString())
+ })
+ }
+
// This can execute a workflow with firestore. Used for test, as datastore is old and stuff
// Too much work to move everything over alone, so won't touch it for now
//
+
+
{
) : (
-
- {
- setExecutionRunning(false);
- stop();
- getWorkflowExecution(props.match.params.key, "");
- setExecutionModalView(0);
- setLastExecution(executionData.execution_id);
- }}
+
+
- {
- setExecutionRunning(false);
- stop()
- }}
- >
-
-
- {
- const cursearch = typeof window === "undefined" || window.location === undefined ? "" : window.location.search;
- const newitem = removeParam("execution_id", cursearch);
- navigate(curpath + newitem)
- setExecutionRunning(false);
- stop()
- }}
- >
- See more runs
-
-
-
+
{
+ setExecutionRunning(false);
+ stop();
+ getWorkflowExecution(props.match.params.key, "");
+ setExecutionModalView(0);
+ setLastExecution(executionData.execution_id);
+ }}
+ >
+ {
+ setExecutionRunning(false);
+ stop()
+ }}
+ >
+
+
+
+ {
+ const cursearch = typeof window === "undefined" || window.location === undefined ? "" : window.location.search;
+ const newitem = removeParam("execution_id", cursearch);
+ navigate(curpath + newitem)
+ setExecutionRunning(false);
+ stop()
+ }}
+ >
+ See more runs
+
+
+
+
{
color="primary"
title="Explore logs for the workflow"
placement="top"
- style={{ zIndex: 50000 }}
+ style={{ zIndex: 50000, }}
>
@@ -1713,12 +1719,15 @@ const Dashboard = (props) => {
{treeKeys.length > 0 ?