Updated billing list with links to track users
This commit is contained in:
@@ -431,6 +431,18 @@ const Billing = (props) => {
|
||||
<Typography variant="h6" style={{ marginTop: 10, marginBottom: 10, flex: 5, }}>
|
||||
{top_text}
|
||||
</Typography>
|
||||
|
||||
{top_text === "Base Cloud Access" && userdata.has_card_available === false ?
|
||||
<img
|
||||
src="/images/stripenew.png"
|
||||
style={{
|
||||
margin: "auto",
|
||||
width: 100,
|
||||
backgroundColor: "white",
|
||||
borderRadius: theme.palette.borderRadius,
|
||||
}}
|
||||
/>
|
||||
: null}
|
||||
{isCloud && highlight === true && top_text !== "Base Cloud Access" ?
|
||||
<Tooltip
|
||||
title="Sign EULA"
|
||||
@@ -562,9 +574,10 @@ const Billing = (props) => {
|
||||
userdata.has_card_available === true ?
|
||||
"While you have a card attached to your account, Shuffle will no longer prevent workflows from running. Billing will occur at the start of each month."
|
||||
:
|
||||
`You are not subscribed to any plan and are using the free plan with max 10,000 app runs per month. Upgrade to deactivate this limit. Your organisations manager email is ${selectedOrganization.org}.`
|
||||
`You are not subscribed to any plan and are using the free plan with max 10,000 app runs per month. Upgrade to deactivate this limit.`
|
||||
}
|
||||
</Typography>
|
||||
Billing email: {selectedOrganization.org}
|
||||
{/*isCloud ?
|
||||
<Button
|
||||
variant="contained"
|
||||
@@ -589,6 +602,8 @@ const Billing = (props) => {
|
||||
height: 40,
|
||||
fontSize: 14,
|
||||
color: "white",
|
||||
backgroundImage: userdata.has_card_available ? null : "linear-gradient(to right, #f86a3e, #f34079)",
|
||||
|
||||
}}
|
||||
onClick={() => {
|
||||
if (isCloud) {
|
||||
@@ -632,20 +647,6 @@ const Billing = (props) => {
|
||||
</Button>
|
||||
: null}
|
||||
|
||||
{userdata.has_card_available === false ?
|
||||
<img
|
||||
src="/images/stripenew.png"
|
||||
style={{
|
||||
margin: "auto",
|
||||
marginTop: 20,
|
||||
width: 100,
|
||||
marginLeft: "35%",
|
||||
backgroundColor: "white",
|
||||
borderRadius: theme.palette.borderRadius,
|
||||
clip: "rect(30px, 30px, 30px, 30px)",
|
||||
}}
|
||||
/>
|
||||
: null}
|
||||
</span>
|
||||
: null}
|
||||
{showSupport ?
|
||||
|
||||
@@ -113,8 +113,6 @@ const AppStats = (defaultprops) => {
|
||||
return
|
||||
}
|
||||
|
||||
console.log("START TIME", starttime, endtime)
|
||||
|
||||
var url = `${globalUrl}/api/v1/workflows/${workflow.id}/executions/count`
|
||||
|
||||
if (starttime !== "") {
|
||||
@@ -178,8 +176,6 @@ const AppStats = (defaultprops) => {
|
||||
const allData = Promise.all(promises);
|
||||
|
||||
allData.then((data) => {
|
||||
console.log("IN ALL DATA")
|
||||
|
||||
var total = 0
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
if (data[i].runcount !== undefined) {
|
||||
|
||||
@@ -454,12 +454,7 @@ const ParsedAction = (props) => {
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: Add values from previous executions if they exist
|
||||
if (
|
||||
workflow.execution_variables !== null &&
|
||||
workflow.execution_variables !== undefined &&
|
||||
workflow.execution_variables.length > 0
|
||||
) {
|
||||
if (workflow.execution_variables !== null && workflow.execution_variables !== undefined && workflow.execution_variables.length > 0) {
|
||||
for (let [key,keyval] in Object.entries(workflow.execution_variables)) {
|
||||
const item = workflow.execution_variables[key];
|
||||
actionlist.push({
|
||||
@@ -474,76 +469,85 @@ const ParsedAction = (props) => {
|
||||
}
|
||||
|
||||
// Loops parent nodes' old results to fix autocomplete
|
||||
if (getParents !== undefined) {
|
||||
var parents = getParents(selectedAction);
|
||||
if (getParents !== undefined) {
|
||||
var parents = getParents(selectedAction)
|
||||
|
||||
if (parents.length > 1) {
|
||||
for (let [key,keyval] in Object.entries(parents)) {
|
||||
const item = parents[key];
|
||||
if (item.label === "Execution Argument") {
|
||||
continue;
|
||||
var labels = []
|
||||
//for (let [parentkey, parentkeyval] in Object.entries(parents)) {
|
||||
for (let parentkey in parents) {
|
||||
const parentNode = parents[parentkey]
|
||||
if (parentNode.label === "Execution Argument") {
|
||||
continue
|
||||
}
|
||||
|
||||
var exampledata = item.example === undefined || item.example === null ? "" : item.example;
|
||||
//if (labels.includes(item.label)) {
|
||||
// continue
|
||||
//}
|
||||
|
||||
labels.push(parentNode.label)
|
||||
|
||||
var exampledata = parentNode.example === undefined || parentNode.example === null ? "" : parentNode.example
|
||||
// Find previous execution and their variables
|
||||
//exampledata === "" &&
|
||||
if (workflowExecutions.length > 0) {
|
||||
// Look for the ID
|
||||
const found = false;
|
||||
for (let [key,keyval] in Object.entries(workflowExecutions)) {
|
||||
if (
|
||||
workflowExecutions[key].results === undefined ||
|
||||
workflowExecutions[key].results === null
|
||||
) {
|
||||
for (let wfkey in workflowExecutions) {
|
||||
if (workflowExecutions[wfkey].results === undefined || workflowExecutions[wfkey].results === null) {
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
var foundResult = workflowExecutions[key].results.find(
|
||||
(result) => result.action.id === item.id
|
||||
);
|
||||
var foundResult = workflowExecutions[wfkey].results.find((result) => result.action.id === parentNode.id)
|
||||
|
||||
if (foundResult === undefined || foundResult === null) {
|
||||
continue;
|
||||
continue
|
||||
}
|
||||
|
||||
if (foundResult.result !== undefined && foundResult.result !== null) {
|
||||
foundResult = foundResult.result
|
||||
}
|
||||
if (foundResult.result !== undefined && foundResult.result !== null) {
|
||||
foundResult = foundResult.result
|
||||
}
|
||||
|
||||
const valid = validateJson(foundResult)
|
||||
if (valid.valid) {
|
||||
if (valid.result.success === false) {
|
||||
//console.log("Skipping success false autocomplete")
|
||||
} else {
|
||||
exampledata = valid.result;
|
||||
break;
|
||||
}
|
||||
const valid = validateJson(foundResult)
|
||||
if (valid.valid) {
|
||||
if (valid.result.success === false) {
|
||||
//console.log("Skipping success false autocomplete")
|
||||
} else {
|
||||
|
||||
// FIXME: Have a merge system to allow to use kind of any key from that node in the last 10-20 execs
|
||||
//if (exampledata.length > 0) {
|
||||
// exampledata = valid.result
|
||||
//} else {
|
||||
// exampledata = valid.result
|
||||
//}
|
||||
|
||||
exampledata = valid.result
|
||||
break
|
||||
}
|
||||
} else {
|
||||
exampledata = foundResult;
|
||||
}
|
||||
exampledata = foundResult
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 1. Take
|
||||
const itemlabelComplete =
|
||||
item.label === null || item.label === undefined
|
||||
? ""
|
||||
: item.label.split(" ").join("_");
|
||||
const itemlabelComplete = parentNode.label === null || parentNode.label === undefined ? "" : parentNode.label.split(" ").join("_");
|
||||
|
||||
const actionvalue = {
|
||||
type: "action",
|
||||
id: item.id,
|
||||
name: item.label,
|
||||
id: parentNode.id,
|
||||
name: parentNode.label,
|
||||
autocomplete: itemlabelComplete,
|
||||
example: exampledata,
|
||||
};
|
||||
}
|
||||
|
||||
actionlist.push(actionvalue);
|
||||
actionlist.push(actionvalue)
|
||||
}
|
||||
}
|
||||
|
||||
//console.log("ACTIONLIST: ", actionlist)
|
||||
setActionlist(actionlist);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -672,7 +676,6 @@ const ParsedAction = (props) => {
|
||||
selectedAction.parameters[count]["value_replace"] =
|
||||
paramcheck["value_replace"];
|
||||
}
|
||||
console.log("RESULT: ", selectedAction);
|
||||
setSelectedAction(selectedAction);
|
||||
//setUpdate(Math.random())
|
||||
return;
|
||||
@@ -2550,9 +2553,9 @@ const ParsedAction = (props) => {
|
||||
{datafield}
|
||||
{/*shufflecode*/}
|
||||
{showDropdown &&
|
||||
showDropdownNumber === count &&
|
||||
data.variant === "STATIC_VALUE" &&
|
||||
jsonList.length > 0 ? (
|
||||
showDropdownNumber === count &&
|
||||
data.variant === "STATIC_VALUE" &&
|
||||
jsonList.length > 0 ? (
|
||||
<FormControl fullWidth style={{ marginTop: 0 }}>
|
||||
<InputLabel
|
||||
id="action-autocompleter"
|
||||
@@ -2618,7 +2621,8 @@ const ParsedAction = (props) => {
|
||||
<FormatListNumberedIcon style={iconStyle} />
|
||||
) : (
|
||||
<ExpandMoreIcon style={iconStyle} />
|
||||
);
|
||||
)
|
||||
|
||||
return (
|
||||
<MenuItem
|
||||
key={data.name}
|
||||
|
||||
@@ -1096,7 +1096,6 @@ const AngularWorkflow = (defaultprops) => {
|
||||
return response.json();
|
||||
})
|
||||
.then((responseJson) => {
|
||||
//console.log("RESPONSE: ", responseJson)
|
||||
handleUpdateResults(responseJson, executionRequest);
|
||||
})
|
||||
.catch((error) => {
|
||||
@@ -1349,12 +1348,10 @@ const AngularWorkflow = (defaultprops) => {
|
||||
const sendStreamRequest = (body) => {
|
||||
//console.log("Stream not activated yet.")
|
||||
if (!isCloud) {
|
||||
console.log("Stream not activated yet for onprem")
|
||||
return
|
||||
}
|
||||
|
||||
if (streamDisabled) {
|
||||
console.log("Stream disabled - send")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1365,7 +1362,7 @@ const AngularWorkflow = (defaultprops) => {
|
||||
//const url = ${globalUrl}/api/v1/workflows/${props.match.params.key}/stream
|
||||
//const streamUrl = "http://localhost:5002"
|
||||
|
||||
console.log("Stream request: ", body)
|
||||
//console.log("Stream request: ", body)
|
||||
const streamUrl = "https://stream.shuffler.io"
|
||||
const url = `${streamUrl}/api/v1/workflows/${props.match.params.key}/stream`
|
||||
|
||||
@@ -1397,7 +1394,7 @@ const AngularWorkflow = (defaultprops) => {
|
||||
return response.json();
|
||||
})
|
||||
.then((responseJson) => {
|
||||
console.log("Stream resp: ", responseJson)
|
||||
//console.log("Stream resp: ", responseJson)
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log("Stream send error: ", error.toString())
|
||||
@@ -1410,11 +1407,21 @@ const AngularWorkflow = (defaultprops) => {
|
||||
var success = false;
|
||||
|
||||
if (isCloud && !isLoggedIn) {
|
||||
console.log("Should redirect to register with redirect.");
|
||||
window.location.href = `/register?view=/workflows/${props.match.params.key}&message=You need sign up to use workflows with Shuffle`;
|
||||
return;
|
||||
console.log("Should redirect to register with redirect.")
|
||||
window.location.href = `/register?view=/workflows/${props.match.params.key}&message=You need sign up to use workflows with Shuffle`
|
||||
return
|
||||
}
|
||||
|
||||
if (curworkflow === undefined || curworkflow === null) {
|
||||
console.log("No workflow during save")
|
||||
return
|
||||
}
|
||||
|
||||
if (curworkflow.actions === undefined || curworkflow.actions === null || curworkflow.actions.length === 0) {
|
||||
console.log("Can't save without actions")
|
||||
return
|
||||
}
|
||||
|
||||
setSavingState(2);
|
||||
|
||||
// This might not be the right course of action, but seems logical, as items could be running already
|
||||
@@ -4467,7 +4474,6 @@ const AngularWorkflow = (defaultprops) => {
|
||||
|
||||
const foundresult = GetParamMatch(paramname, exampledata, "");
|
||||
if (foundresult.length > 0) {
|
||||
console.log("FOUND ReS for field: ", dstdata.parameters[dstdataParamKey].name, foundresult)
|
||||
if (dstdata.parameters[dstdataParamKey].value.length === 0) {
|
||||
dstdata.parameters[dstdataParamKey].value = `$${parentlabel}${foundresult}`;
|
||||
dstdata.parameters[dstdataParamKey].autocompleted = true
|
||||
@@ -4550,7 +4556,6 @@ const AngularWorkflow = (defaultprops) => {
|
||||
if (sourcenode.data("app_name") !== "Shuffle Workflow" && sourcenode.data("app_name") !== "User Input") {
|
||||
setTimeout(() => {
|
||||
const alledges = cy.edges().jsons()
|
||||
console.log("edges: ", alledges, edge)
|
||||
var targetedge = alledges.findIndex(
|
||||
(data) => data.data.source === edge.source && data.data.id !== edge.id
|
||||
)
|
||||
@@ -4576,7 +4581,6 @@ const AngularWorkflow = (defaultprops) => {
|
||||
const edgeCurve = calculateEdgeCurve(sourcenode.position(), destinationnode.position())
|
||||
const currentedge = cy.getElementById(edge.id)
|
||||
if (currentedge !== undefined && currentedge !== null) {
|
||||
console.log("Setting edge curve: ", edgeCurve)
|
||||
currentedge.style('control-point-distance', edgeCurve.distance)
|
||||
currentedge.style('control-point-weight', edgeCurve.weight)
|
||||
}
|
||||
@@ -4587,7 +4591,6 @@ const AngularWorkflow = (defaultprops) => {
|
||||
(data) => data.id === edge.target
|
||||
);
|
||||
if (targetnode !== -1) {
|
||||
console.log("TARGETNODE: ", targetnode);
|
||||
if (workflow.triggers[targetnode].app_name === "User Input" || workflow.triggers[targetnode].app_name === "Shuffle Workflow" || workflow.triggers[targetnode].app_name === "Shuffle Subflow") {
|
||||
} else {
|
||||
toast("Can't have triggers as target of branch");
|
||||
@@ -4689,7 +4692,6 @@ const AngularWorkflow = (defaultprops) => {
|
||||
/*
|
||||
targetnode = workflow.triggers.findIndex(data => data.id === edge.target)
|
||||
if (targetnode !== -1) {
|
||||
console.log("TARGETNODE: ", targetnode)
|
||||
if (workflow.triggers[targetnode].app_name === "User Input" || workflow.triggers[targetnode].app_name === "Shuffle Workflow") {
|
||||
} else {
|
||||
toast("Can't have triggers as target of branch")
|
||||
@@ -4883,7 +4885,6 @@ const AngularWorkflow = (defaultprops) => {
|
||||
// toast("Recommendations to show??")
|
||||
//}
|
||||
|
||||
console.log("Added to workflow!!")
|
||||
setWorkflow(workflow);
|
||||
fetchRecommendations(workflow)
|
||||
} else if (nodedata.type === "TRIGGER") {
|
||||
@@ -6180,7 +6181,6 @@ const AngularWorkflow = (defaultprops) => {
|
||||
if (inputworkflow.actions !== undefined && inputworkflow.actions !== null && inputworkflow.actions.length > 0) {
|
||||
cy.remove('*')
|
||||
}
|
||||
console.log("INPUT: ", inputworkflow)
|
||||
}
|
||||
|
||||
if (inputworkflow.actions === undefined || inputworkflow.actions === null) {
|
||||
@@ -6482,6 +6482,7 @@ const AngularWorkflow = (defaultprops) => {
|
||||
// Get selected node
|
||||
|
||||
if (selectedNode.data().type === "TRIGGER") {
|
||||
|
||||
console.log("Should remove trigger!");
|
||||
console.log(selectedNode.data());
|
||||
const triggerindex = workflow.triggers.findIndex(
|
||||
@@ -8780,7 +8781,7 @@ const AngularWorkflow = (defaultprops) => {
|
||||
results.push({ id: allkeys[parentkey], type: "TRIGGER" });
|
||||
} else {
|
||||
if (handled.includes(currentnode.data().id)) {
|
||||
continue;
|
||||
continue
|
||||
} else {
|
||||
handled.push(currentnode.data().id);
|
||||
results.push(currentnode.data());
|
||||
@@ -8817,11 +8818,12 @@ const AngularWorkflow = (defaultprops) => {
|
||||
}
|
||||
|
||||
// Remove on the end as we don't want to remove everything
|
||||
results = results.filter((data) => data.id !== action.id);
|
||||
results = results.filter((data) => data.type === "ACTION" || data.app_name === "Shuffle Workflow" || data.app_name === "User Input");
|
||||
results.push({ label: "Execution Argument", type: "INTERNAL" });
|
||||
return results;
|
||||
};
|
||||
results = results.filter((data) => data.id !== action.id)
|
||||
results = results.filter((data) => data.type === "ACTION" || data.app_name === "Shuffle Workflow" || data.app_name === "User Input")
|
||||
results.push({ label: "Execution Argument", type: "INTERNAL" })
|
||||
|
||||
return results
|
||||
}
|
||||
|
||||
// BOLD name: type: required?
|
||||
// FORM
|
||||
@@ -10290,7 +10292,6 @@ const AngularWorkflow = (defaultprops) => {
|
||||
return response.json();
|
||||
})
|
||||
.then((responseJson) => {
|
||||
//console.log("RESPONSE: ");
|
||||
setTriggerAuthentication(responseJson);
|
||||
clearInterval(id);
|
||||
newwin.close();
|
||||
@@ -14290,7 +14291,7 @@ const AngularWorkflow = (defaultprops) => {
|
||||
lastSaved && !workflow.public ? "outlined" : "contained"
|
||||
}
|
||||
onClick={() => {
|
||||
saveWorkflow()
|
||||
saveWorkflow(workflow)
|
||||
|
||||
if (workflow.public === true) {
|
||||
console.log("Public!")
|
||||
@@ -14773,7 +14774,7 @@ const AngularWorkflow = (defaultprops) => {
|
||||
</Typography>
|
||||
<Typography variant="body2" color="textSecondary">
|
||||
This workflow is public and <span style={{ color: "#f86a3e", cursor: "pointer", }} onClick={() => {
|
||||
saveWorkflow()
|
||||
saveWorkflow(workflow)
|
||||
}}>must be saved</span> or exported before use.
|
||||
</Typography>
|
||||
{Object.getOwnPropertyNames(creatorProfile).length !== 0 && creatorProfile.github_avatar !== undefined && creatorProfile.github_avatar !== null ?
|
||||
@@ -15563,7 +15564,7 @@ const AngularWorkflow = (defaultprops) => {
|
||||
style={{ color: "white", fontSize: 16 }}
|
||||
>
|
||||
<h2 style={{ color: "rgba(255,255,255,0.5)" }}>
|
||||
<DirectionsRunIcon style={{ marginRight: 10 }} />
|
||||
<DirectionsRunIcon style={{ marginRight: 0, }} />
|
||||
All Workflow Runs
|
||||
</h2>
|
||||
</Breadcrumbs>
|
||||
@@ -18394,9 +18395,16 @@ const AngularWorkflow = (defaultprops) => {
|
||||
cy.removeListener("drag");
|
||||
cy.removeListener("free");
|
||||
cy.removeListener("cxttap");
|
||||
|
||||
//cy.remove('*')
|
||||
setElements([])
|
||||
}
|
||||
|
||||
setupGraph(newrevision)
|
||||
// Remove all cy nodes
|
||||
setTimeout(() => {
|
||||
setupGraph(newrevision)
|
||||
}, 100)
|
||||
|
||||
|
||||
// Re-adding cytoscape triggers
|
||||
if (cy !== undefined && cy !== null) {
|
||||
|
||||
@@ -518,7 +518,7 @@ export const validateJson = (showResult) => {
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log("Failed parsing inside json subvalues: ", e)
|
||||
//console.log("Failed parsing inside json subvalues: ", e)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -570,12 +570,10 @@ func deployServiceWorkers(image string) {
|
||||
overrideHttpProxy := os.Getenv("SHUFFLE_INTERNAL_HTTP_PROXY")
|
||||
overrideHttpsProxy := os.Getenv("SHUFFLE_INTERNAL_HTTPS_PROXY")
|
||||
if len(overrideHttpProxy) > 0 {
|
||||
log.Printf("[DEBUG] Added internal proxy: %s", overrideHttpProxy)
|
||||
serviceSpec.TaskTemplate.ContainerSpec.Env = append(serviceSpec.TaskTemplate.ContainerSpec.Env, fmt.Sprintf("SHUFFLE_INTERNAL_HTTP_PROXY=%s", overrideHttpProxy))
|
||||
}
|
||||
|
||||
if len(overrideHttpsProxy) > 0 {
|
||||
log.Printf("[DEBUG] Added internal proxy: %s", overrideHttpsProxy)
|
||||
serviceSpec.TaskTemplate.ContainerSpec.Env = append(serviceSpec.TaskTemplate.ContainerSpec.Env, fmt.Sprintf("SHUFFLE_INTERNAL_HTTPS_PROXY=%s", overrideHttpsProxy))
|
||||
}
|
||||
|
||||
@@ -1758,12 +1756,10 @@ func main() {
|
||||
overrideHttpProxy := os.Getenv("SHUFFLE_INTERNAL_HTTP_PROXY")
|
||||
overrideHttpsProxy := os.Getenv("SHUFFLE_INTERNAL_HTTPS_PROXY")
|
||||
if len(overrideHttpProxy) > 0 {
|
||||
log.Printf("[DEBUG] Added internal proxy: %s", overrideHttpProxy)
|
||||
env = append(env, fmt.Sprintf("SHUFFLE_INTERNAL_HTTP_PROXY=%s", overrideHttpProxy))
|
||||
}
|
||||
|
||||
if len(overrideHttpsProxy) > 0 {
|
||||
log.Printf("[DEBUG] Added internal proxy: %s", overrideHttpsProxy)
|
||||
env = append(env, fmt.Sprintf("SHUFFLE_INTERNAL_HTTPS_PROXY=%s", overrideHttpsProxy))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user