Added basic zip upload reader sample with files in-memory based on @Dhaval's work.
This commit is contained in:
@@ -922,7 +922,9 @@ const Framework = (props) => {
|
||||
const baselocationX = 285*scale
|
||||
const baselocationY = 50*scale
|
||||
const shiftmodifier = 3*scale
|
||||
const svgSize = `${40*scale}px`
|
||||
//const svgSize = `${40*scale}px`
|
||||
const svgSize = `${40}px`
|
||||
console.log("Size: ", svgSize)
|
||||
|
||||
|
||||
console.log("Framework: ", parsedFrameworkData)
|
||||
|
||||
@@ -1010,8 +1010,9 @@ const Admin = (props) => {
|
||||
body: file,
|
||||
})
|
||||
.then((response) => {
|
||||
if (response.status !== 200) {
|
||||
if (response.status !== 200 && response.status !== 201) {
|
||||
console.log("Status not 200 for apps :O!");
|
||||
alert.error("File was created, but failed to upload.")
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1022,17 +1023,21 @@ const Admin = (props) => {
|
||||
//setFiles(responseJson)
|
||||
})
|
||||
.catch((error) => {
|
||||
//alert.error(error.toString())
|
||||
alert.error(error.toString())
|
||||
});
|
||||
};
|
||||
|
||||
const handleCreateFile = (filename, file) => {
|
||||
const data = {
|
||||
var data = {
|
||||
filename: filename,
|
||||
org_id: selectedOrganization.id,
|
||||
workflow_id: "global",
|
||||
};
|
||||
|
||||
if (selectedNamespace !== undefined && selectedNamespace !== null && selectedNamespace.length > 0 && selectedNamespace !== "default") {
|
||||
data.namespace = selectedNamespace
|
||||
}
|
||||
|
||||
fetch(globalUrl + "/api/v1/files/create", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
@@ -3991,7 +3996,7 @@ const Admin = (props) => {
|
||||
>
|
||||
{environment.archived ? "Activate" : "Disable"}
|
||||
</Button>
|
||||
<Button variant={environment.archived ? "contained" : "outlined"} style={{borderRadius: "0px"}} onClick={() => {
|
||||
<Button variant={"outlined"} style={{borderRadius: "0px"}} onClick={() => {
|
||||
console.log("Should clear executions for: ", environment)
|
||||
abortEnvironmentWorkflows(environment)
|
||||
}} color="primary">Clear executions</Button>
|
||||
@@ -4240,7 +4245,7 @@ const Admin = (props) => {
|
||||
/>
|
||||
<Tab
|
||||
index={5}
|
||||
disabled={isCloud || userdata.admin !== "true"}
|
||||
disabled={userdata.admin !== "true"}
|
||||
label=<span>
|
||||
<EcoIcon style={iconStyle} />
|
||||
Environments
|
||||
|
||||
@@ -1795,103 +1795,103 @@ const AngularWorkflow = (defaultprops) => {
|
||||
//
|
||||
|
||||
// Wait for new node to possibly be selected
|
||||
setTimeout(() => {
|
||||
const typeIds = cy.elements('node:selected').jsons();
|
||||
console.log("Found: ", typeIds)
|
||||
for (var idkey in typeIds) {
|
||||
const item = typeIds[idkey]
|
||||
console.log("items: ", item)
|
||||
if (item.data.isButton === true) {
|
||||
console.log("Reselect old node & return - or just return?")
|
||||
|
||||
if (item.data.buttonType === "delete" && item.data.attachedTo === nodedata.id) {
|
||||
console.log("delete of same node!")
|
||||
}
|
||||
return
|
||||
//setTimeout(() => {
|
||||
const typeIds = cy.elements('node:selected').jsons();
|
||||
console.log("Found: ", typeIds)
|
||||
for (var idkey in typeIds) {
|
||||
const item = typeIds[idkey]
|
||||
console.log("items: ", item)
|
||||
if (item.data.isButton === true) {
|
||||
console.log("Reselect old node & return - or just return?")
|
||||
|
||||
if (item.data.buttonType === "delete" && item.data.attachedTo === nodedata.id) {
|
||||
console.log("delete of same node!")
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
//if (nodedata.app_name === undefined && nodedata.source === undefined) {
|
||||
// return;
|
||||
//}
|
||||
//event.target.removeClass("selected");
|
||||
//
|
||||
//if (nodedata.app_name === undefined && nodedata.source === undefined) {
|
||||
// return;
|
||||
//}
|
||||
//event.target.removeClass("selected");
|
||||
//
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//// If button is clicked, select current node
|
||||
//// If button is clicked, select current node
|
||||
|
||||
// Attempt at rewrite of name in other actions in following nodes.
|
||||
// Should probably be done in the onBlur for the textfield instead
|
||||
/*
|
||||
if (event.target.data().type === "ACTION") {
|
||||
const nodeaction = event.target.data()
|
||||
const curaction = workflow.actions.find(a => a.id === nodeaction.id)
|
||||
console.log("workflowaction: ", curaction)
|
||||
console.log("nodeaction: ", nodeaction)
|
||||
if (nodeaction.label !== curaction.label) {
|
||||
console.log("BEACH!")
|
||||
// Attempt at rewrite of name in other actions in following nodes.
|
||||
// Should probably be done in the onBlur for the textfield instead
|
||||
/*
|
||||
if (event.target.data().type === "ACTION") {
|
||||
const nodeaction = event.target.data()
|
||||
const curaction = workflow.actions.find(a => a.id === nodeaction.id)
|
||||
console.log("workflowaction: ", curaction)
|
||||
console.log("nodeaction: ", nodeaction)
|
||||
if (nodeaction.label !== curaction.label) {
|
||||
console.log("BEACH!")
|
||||
|
||||
var params = []
|
||||
const fixedName = "$"+curaction.label.toLowerCase().replace(" ", "_")
|
||||
for (var actionkey in workflow.actions) {
|
||||
if (workflow.actions[actionkey].id === curaction.id) {
|
||||
var params = []
|
||||
const fixedName = "$"+curaction.label.toLowerCase().replace(" ", "_")
|
||||
for (var actionkey in workflow.actions) {
|
||||
if (workflow.actions[actionkey].id === curaction.id) {
|
||||
continue
|
||||
}
|
||||
|
||||
for (var paramkey in workflow.actions[actionkey].parameters) {
|
||||
const param = workflow.actions[actionkey].parameters[paramkey]
|
||||
if (param.value === null || param.value === undefined || !param.value.includes("$")) {
|
||||
continue
|
||||
}
|
||||
|
||||
for (var paramkey in workflow.actions[actionkey].parameters) {
|
||||
const param = workflow.actions[actionkey].parameters[paramkey]
|
||||
if (param.value === null || param.value === undefined || !param.value.includes("$")) {
|
||||
continue
|
||||
}
|
||||
|
||||
const innername = param.value.toLowerCase().replace(" ", "_")
|
||||
if (innername.includes(fixedName)) {
|
||||
//workflow.actions[actionkey].parameters[paramkey].replace(
|
||||
//console.log("FOUND!: ", innername)
|
||||
}
|
||||
const innername = param.value.toLowerCase().replace(" ", "_")
|
||||
if (innername.includes(fixedName)) {
|
||||
//workflow.actions[actionkey].parameters[paramkey].replace(
|
||||
//console.log("FOUND!: ", innername)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
*/
|
||||
|
||||
//cy.removeListener("select");
|
||||
//cy.on("select", "node", (e) => onNodeSelect(e, appAuthentication));
|
||||
//cy.on("select", "edge", (e) => onEdgeSelect(e));
|
||||
//cy.removeListener("select");
|
||||
//cy.on("select", "node", (e) => onNodeSelect(e, appAuthentication));
|
||||
//cy.on("select", "edge", (e) => onEdgeSelect(e));
|
||||
|
||||
|
||||
// FIXME - check if they have value before overriding like this for no reason.
|
||||
// Would save a lot of time (400~ ms -> 30ms)
|
||||
//console.log("ACTION: ", selectedAction)
|
||||
//console.log("APP: ", selectedApp)
|
||||
// FIXME - check if they have value before overriding like this for no reason.
|
||||
// Would save a lot of time (400~ ms -> 30ms)
|
||||
//console.log("ACTION: ", selectedAction)
|
||||
//console.log("APP: ", selectedApp)
|
||||
|
||||
ReactDOM.unstable_batchedUpdates(() => {
|
||||
setSelectedAction({});
|
||||
setSelectedApp({});
|
||||
setSelectedTrigger({});
|
||||
setSelectedComment({})
|
||||
setSelectedEdge({});
|
||||
ReactDOM.unstable_batchedUpdates(() => {
|
||||
setSelectedAction({});
|
||||
setSelectedApp({});
|
||||
setSelectedTrigger({});
|
||||
setSelectedComment({})
|
||||
setSelectedEdge({});
|
||||
|
||||
setSelectedEdge({})
|
||||
setSelectedActionEnvironment({})
|
||||
setTriggerAuthentication({})
|
||||
setSelectedTriggerIndex(-1)
|
||||
setTriggerFolders([])
|
||||
setSubworkflow({})
|
||||
setSelectedEdge({})
|
||||
setSelectedActionEnvironment({})
|
||||
setTriggerAuthentication({})
|
||||
setSelectedTriggerIndex(-1)
|
||||
setTriggerFolders([])
|
||||
setSubworkflow({})
|
||||
|
||||
// Can be used for right side view
|
||||
setRightSideBarOpen(false);
|
||||
setScrollConfig({
|
||||
top: 0,
|
||||
left: 0,
|
||||
selected: "",
|
||||
});
|
||||
// Can be used for right side view
|
||||
setRightSideBarOpen(false);
|
||||
setScrollConfig({
|
||||
top: 0,
|
||||
left: 0,
|
||||
selected: "",
|
||||
});
|
||||
//console.timeEnd("UNSELECT");
|
||||
})
|
||||
}, 150)
|
||||
})
|
||||
//}, 150)
|
||||
};
|
||||
|
||||
const onEdgeSelect = (event) => {
|
||||
@@ -3600,7 +3600,12 @@ const AngularWorkflow = (defaultprops) => {
|
||||
|
||||
// FIXME: Don't allow multiple in cloud yet. Cloud -> Onprem isn't stable.
|
||||
if (isCloud) {
|
||||
setEnvironments([{ Name: "Cloud", Type: "cloud" }]);
|
||||
console.log("Envs: ", responseJson)
|
||||
if (responseJson.length > 0) {
|
||||
setEnvironments(responseJson);
|
||||
} else {
|
||||
setEnvironments([{ Name: "Cloud", Type: "cloud" }]);
|
||||
}
|
||||
} else {
|
||||
setEnvironments(responseJson);
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ const UsecaseListComponent = ({keys, isCloud, globalUrl, frameworkData, isLogged
|
||||
}
|
||||
|
||||
const getUsecase = (name, index, subindex) => {
|
||||
fetch(globalUrl + "/api/v1/workflows/usecases/"+name.replaceAll(" ", "_"), {
|
||||
fetch(`${globalUrl}/api/v1/workflows/usecases/${escape(name.replaceAll(" ", "_"))}`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
@@ -100,7 +100,20 @@ const UsecaseListComponent = ({keys, isCloud, globalUrl, frameworkData, isLogged
|
||||
|
||||
setExpandedIndex(index)
|
||||
setExpandedItem(subindex)
|
||||
})
|
||||
|
||||
setTimeout(() => {
|
||||
//console.log("Scroll!")
|
||||
const found = document.getElementById("selected_box");
|
||||
console.log("Found to scroll: ", found)
|
||||
if (found !== undefined && found !== null) {
|
||||
//console.log("FOUND!!")
|
||||
found.scrollTo({
|
||||
top: 100,
|
||||
behavior: "smooth",
|
||||
})
|
||||
}
|
||||
}, 100);
|
||||
})
|
||||
.catch((error) => {
|
||||
//alert.error(error.toString());
|
||||
setInputUsecase({})
|
||||
@@ -224,67 +237,77 @@ const UsecaseListComponent = ({keys, isCloud, globalUrl, frameworkData, isLogged
|
||||
<Typography variant="h6" style={{maxWidth: 215}}>
|
||||
<b>{subcase.name}</b>
|
||||
</Typography>
|
||||
<div style={{position: "absolute", top: -26, right: -20, width: 50, }}>
|
||||
{finished ?
|
||||
<Tooltip
|
||||
title="A workflow has been assigned for this use case"
|
||||
placement="top"
|
||||
>
|
||||
<IconButton
|
||||
style={{}}
|
||||
onClick={(e) => {
|
||||
}}
|
||||
>
|
||||
<DoneAllIcon style={{ color: usecase.color }} />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
: null}
|
||||
{subcase.blogpost !== null && subcase.blogpost !== undefined && subcase.blogpost.length > 0 ?
|
||||
<a
|
||||
href={subcase.blogpost}
|
||||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
style={{ textDecoration: "none", color: "#f85a3e" }}
|
||||
>
|
||||
{finished ?
|
||||
<Tooltip
|
||||
title="Click to visit the blogpost"
|
||||
title="A workflow has been assigned for this use case"
|
||||
placement="top"
|
||||
>
|
||||
<IconButton
|
||||
style={{marginTop: finished ? 5 : 40, }}
|
||||
style={{
|
||||
position: "absolute",
|
||||
bottom: 15,
|
||||
right: -15,
|
||||
}}
|
||||
onClick={(e) => {
|
||||
}}
|
||||
>
|
||||
<DescriptionIcon style={{ color: usecase.color }} />
|
||||
<DoneAllIcon style={{ color: usecase.color }} />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
</a>
|
||||
: null}
|
||||
{subcase.video !== null && subcase.video !== undefined && subcase.video.length > 0 ?
|
||||
<a
|
||||
href={subcase.video}
|
||||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
style={{ textDecoration: "none", color: "#f85a3e" }}
|
||||
>
|
||||
<Tooltip
|
||||
title="Click to see a video for this usecase"
|
||||
placement="top"
|
||||
: null}
|
||||
{subcase.blogpost !== null && subcase.blogpost !== undefined && subcase.blogpost.length > 0 ?
|
||||
<a
|
||||
href={subcase.blogpost}
|
||||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
style={{ textDecoration: "none", color: "#f85a3e" }}
|
||||
>
|
||||
<IconButton
|
||||
style={{paddingTop: 5,}}
|
||||
onClick={(e) => {
|
||||
}}
|
||||
<Tooltip
|
||||
title="Click to visit the blogpost"
|
||||
placement="top"
|
||||
>
|
||||
<PlayArrowIcon style={{ color: usecase.color }} />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
</a>
|
||||
: null}
|
||||
</div>
|
||||
<IconButton
|
||||
style={{
|
||||
position: "absolute",
|
||||
bottom: -25,
|
||||
right: -15,
|
||||
}}
|
||||
onClick={(e) => {
|
||||
}}
|
||||
>
|
||||
<DescriptionIcon style={{ color: usecase.color }} />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
</a>
|
||||
: null}
|
||||
{subcase.video !== null && subcase.video !== undefined && subcase.video.length > 0 ?
|
||||
<a
|
||||
href={subcase.video}
|
||||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
style={{ textDecoration: "none", color: "#f85a3e" }}
|
||||
>
|
||||
<Tooltip
|
||||
title="Click to see a video for this usecase"
|
||||
placement="top"
|
||||
>
|
||||
<IconButton
|
||||
style={{
|
||||
position: "absolute",
|
||||
bottom: -65,
|
||||
right: -15,
|
||||
}}
|
||||
onClick={(e) => {
|
||||
}}
|
||||
>
|
||||
<PlayArrowIcon style={{ color: usecase.color }} />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
</a>
|
||||
: null}
|
||||
</div>
|
||||
:
|
||||
<div style={{textAlign: "left", position: "relative",}}>
|
||||
<div style={{textAlign: "left", position: "relative",}} id="selected_box">
|
||||
<Typography variant="h6">
|
||||
<b>{subcase.name}</b>
|
||||
</Typography>
|
||||
@@ -482,7 +505,7 @@ const UsecaseListComponent = ({keys, isCloud, globalUrl, frameworkData, isLogged
|
||||
</div>
|
||||
</div>
|
||||
:
|
||||
<div style={{flex: 1, textAlign: "left",}}>
|
||||
<div style={{flex: 1, textAlign: "left", marginRight: 10, }}>
|
||||
<Typography variant="body1">
|
||||
{subcase.description}
|
||||
</Typography>
|
||||
|
||||
Reference in New Issue
Block a user