diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx
index 631d9c0c..3347d1cc 100755
--- a/frontend/src/views/AngularWorkflow.jsx
+++ b/frontend/src/views/AngularWorkflow.jsx
@@ -12796,61 +12796,6 @@ const releaseToConnectLabel = "Release to Connect"
);
};
- if (Object.getOwnPropertyNames(selectedTrigger).length > 0) {
- if (workflow.triggers[selectedTriggerIndex] === undefined) {
- return null;
- }
-
- if (
- workflow.triggers[selectedTriggerIndex].parameters === undefined ||
- workflow.triggers[selectedTriggerIndex].parameters === null ||
- workflow.triggers[selectedTriggerIndex].parameters.length === 0
- ) {
- workflow.triggers[selectedTriggerIndex].parameters = [];
- workflow.triggers[selectedTriggerIndex].parameters[0] = {
- name: "workflow",
- value: "",
- };
- workflow.triggers[selectedTriggerIndex].parameters[1] = {
- name: "argument",
- value: "",
- id:"subflow_field"
- };
- workflow.triggers[selectedTriggerIndex].parameters[2] = {
- name: "user_apikey",
- value: "",
- };
- workflow.triggers[selectedTriggerIndex].parameters[3] = {
- name: "startnode",
- value: "",
- };
- workflow.triggers[selectedTriggerIndex].parameters[4] = {
- name: "check_result",
- value: "false",
- };
- workflow.triggers[selectedTriggerIndex].parameters[5] = {
- name: "auth_override",
- value: "",
- };
-
- /*
- // API-key has been replaced by auth key for the execution.
- // Parents can now automatically execute children without auth from a user, as long as the subflow in question is owned by the same org and the subflow is actually referencing it during checkin.
- console.log("SETTINGS: ", userSettings);
- if (
- userSettings !== undefined &&
- userSettings !== null &&
- userSettings.apikey !== null &&
- userSettings.apikey !== undefined &&
- userSettings.apikey.length > 0
- ) {
- workflow.triggers[selectedTriggerIndex].parameters[2] = {
- name: "user_apikey",
- value: userSettings.apikey,
- };
- }
- */
- }
var handleSubflowStartnodeSelection = (e) => {
setSubworkflowStartnode(e.target.value);
@@ -12925,7 +12870,6 @@ const releaseToConnectLabel = "Release to Connect"
setWorkflow(workflow);
};
- }
var subflowtypes = [
@@ -12996,862 +12940,7 @@ const releaseToConnectLabel = "Release to Connect"
setMenuPosition(null);
};
- const SubflowSidebar = Object.getOwnPropertyNames(selectedTrigger).length === 0 || workflow.triggers[selectedTriggerIndex] === undefined || selectedTrigger.trigger_type !== "SUBFLOW" ? null :
-
-
-
- {selectedTrigger.app_name}
-
-
-
-
-
-
- What are subflows?
-
-
-
-
- Name
-
-
-
-
-
-
- Delay
- {
- if (isNaN(event.target.value)) {
- console.log("NAN: ", event.target.value)
- return
- }
-
- const parsedNumber = parseInt(event.target.value)
- if (parsedNumber > 86400) {
- console.log("Max number is 1 day (86400)")
- return
- }
-
- selectedTrigger.execution_delay = parseInt(event.target.value)
- setSelectedTrigger(selectedTrigger)
- }}
- />
-
-
-
-
-
-
{
- const newvalue = workflow.triggers[selectedTriggerIndex].parameters[4] === undefined || workflow.triggers[selectedTriggerIndex].parameters[4].value === "false"? "true" : "false";
- workflow.triggers[selectedTriggerIndex].parameters[4] = {
- name: "check_result",
- value: newvalue,
- };
-
- setWorkflow(workflow);
- setUpdate(Math.random());
- }}
- color="primary"
- value="Wait for results"
- />
- }
- style={{ marginTop: 10 }}
- label={Wait for results
}
- />
-
-
-
-
-
- Select a workflow to execute
-
-
- {workflow.triggers[selectedTriggerIndex].parameters[0].value
- .length === 0 ? null : workflow.triggers[selectedTriggerIndex]
- .parameters[0].value === props.match.params.key ? null : (
-
- )}
-
-
- {workflows === undefined ||
- workflows === null ||
- workflows.length === 0 ? null : (
-
-
option.id === value.id}
- getOptionLabel={(option) => {
- if (
- option === undefined ||
- option === null ||
- option.name === undefined ||
- option.name === null
- ) {
- return "No Workflow Selected";
- }
-
- const newname = (
- option.name.charAt(0).toUpperCase() + option.name.substring(1)
- ).replaceAll("_", " ");
- return newname;
- }}
- options={workflows}
- fullWidth
- style={{
- backgroundColor: theme.palette.inputColor,
- height: 50,
- borderRadius: theme.palette.borderRadius,
- }}
- onChange={(event, newValue) => {
- setLastSaved(false)
- console.log("Found value: ", newValue)
-
- var parsedinput = { target: { value: newValue } }
-
- // For variables
- if (typeof newValue === 'string' && newValue.startsWith("$")) {
- parsedinput = {
- target: {
- value: {
- "name": newValue,
- "id": newValue,
- "actions": [],
- "triggers": [],
- }
- }
- }
- }
-
- handleWorkflowSelectionUpdate(parsedinput)
- }}
- renderOption={(props, data, state) => {
- if (data.id === workflow.id) {
- data = workflow;
- }
-
- //key={index}
- return (
-
- {data.image !== undefined && data.image !== null && data.image.length > 0 ?
-
- : null}
-
- Choose Subflow '{data.name}'
-
-
- }>
-
-
- )
- }}
- renderInput={(params) => {
- return (
-
- );
- }}
- />
- )}
-
- {subworkflow === undefined ||
- subworkflow === null ||
- subworkflow.id === undefined ||
- subworkflow.actions === null ||
- subworkflow.actions === undefined ||
- subworkflow.actions.length === 0 ? null : (
-
-
-
- Select the Startnode
-
-
- option.id === value.id}
- getOptionLabel={(option) => {
- if (option === undefined || option === null || option.label === undefined || option.label === null) {
- if (option.length === 36) {
-
- }
-
- return "TMP";
- }
-
- const newname = (
- option.label.charAt(0).toUpperCase() + option.label.substring(1)
- ).replaceAll("_", " ");
- return newname;
- }}
- options={subworkflow.actions}
- fullWidth
- style={{
- backgroundColor: theme.palette.inputColor,
- height: 50,
- borderRadius: theme.palette.borderRadius,
- }}
- onChange={(event, newValue) => {
- setLastSaved(false)
- handleSubflowStartnodeSelection({ target: { value: newValue } })
- }}
- renderOption={(props, action, state) => {
- const isParent = getParents(selectedTrigger).find(
- (parent) => parent.id === action.id
- )
-
- return (
-
- );
- }}
- renderInput={(params) => {
- return (
-
- );
- }}
- />
-
- )}
-
-
- Execution Argument
-
-
-
-
-
- {
- event.preventDefault()
- // setFieldCount(count)
- setCodeEditorModalOpen(true)
- setActiveDialog("codeeditor")
- //setcodedata(data.value)
- var parsedvalue = workflow?.triggers[selectedTriggerIndex]?.parameters[1]?.value
- // if (parsedvalue === undefined || parsedvalue === null) {
- // parsedvalue = ""
- // }
- console.log("Data sending to codeeditor: ",{
- "name": workflow.triggers[selectedTriggerIndex].parameters[1].name,
- "value": parsedvalue,
- "field_number": 1,
- "actionlist": subflowActionList,
- "field_id": "subflow_field",
- })
- setEditorData({
- "name": workflow.triggers[selectedTriggerIndex].parameters[1].name,
- "value": parsedvalue,
- "field_number": 1,
- "actionlist": subflowActionList,
- "field_id": "subflow_field",
- })
- }}
- />
-
-
- {
- setMenuPosition({
- top: event.pageY + 10,
- left: event.pageX + 10,
- });
- //setShowDropdownNumber(3)
- setShowDropdown(true);
- }}
- />
-
-
-
- ),
- }}
- rows="6"
- multiline
- fullWidth
- color="primary"
- placeholder="Some execution data"
- defaultValue={
- workflow?.triggers[selectedTriggerIndex]?.parameters[1]?.value
- }
- onBlur={(e) => {
- workflow.triggers[selectedTriggerIndex].parameters[1].value = e.target.value
- setWorkflow(workflow)
- setLastSaved(false)
-
- }}
- />
- {!showDropdown ? null :
-
- }
- parentMenuOpen={!!menuPosition}
- style={{
- backgroundColor: theme.palette.inputColor,
- color: "white",
- minWidth: 250,
- }}
- onClick={() => {
- handleItemClick([innerdata]);
- }}
- >
- {parsedPaths.map((pathdata, index) => {
- // FIXME: Should be recursive in here
- const icon =
- pathdata.type === "value" ? (
-
- ) : pathdata.type === "list" ? (
-
- ) : (
-
- )
-
- return (
-
- );
- })}
-
- */}
-
-
- {icon} {innerdata.name}
-
- }
- parentMenuOpen={!!menuPosition}
- style={{
- color: "white",
- minWidth: 250,
- maxWidth: 250,
- maxHeight: 50,
- overflow: "hidden",
- }}
- onClick={() => {
- console.log("CLICKED: ", innerdata);
- console.log(innerdata.example)
- handleItemClick([innerdata]);
- }}
- >
-
-
-
-
- {parsedPaths.map((pathdata, index) => {
- // FIXME: Should be recursive in here
- //
- const icon =
- pathdata.type === "value" ? (
-
- ) : pathdata.type === "list" ? (
-
- ) : (
-
- );
- //
-
- const indentation_count = (pathdata.name.match(/\./g) || []).length+1
- const baseIndent =
- //const boxPadding = pathdata.type === "object" ? "10px 0px 0px 0px" : 0
- const boxPadding = 0
- const namesplit = pathdata.name.split(".")
- const newname = namesplit[namesplit.length-1]
- return (
-
- );
- })}
-
-
-
- ) : (
-
- );
- })}
-
- }
- {/*
-
- {
- workflow.triggers[selectedTriggerIndex].parameters[2].value =
- e.target.value;
- setWorkflow(workflow);
- }}
- />
- */}
-
-
-
-
-
-
-
-
- Authentication Override
-
-
-
-
-
-
-
-
+
const CommentSidebar = () => {
if (Object.getOwnPropertyNames(selectedComment).length > 0) {
@@ -14038,20 +13127,32 @@ const releaseToConnectLabel = "Release to Connect"
// Special SCHEDULE handler
var trigger_header_auth = ""
- if (Object.getOwnPropertyNames(selectedTrigger).length > 0 && workflow.triggers !== null && workflow.triggers !== undefined && workflow.triggers.length >= selectedTriggerIndex && workflow.triggers[selectedTriggerIndex] !== undefined ) {
- if (selectedTrigger.trigger_type === "SCHEDULE" && workflow.triggers[selectedTriggerIndex].parameters === undefined || workflow.triggers[selectedTriggerIndex].parameters === null) {
- console.log("Autofixing schedule")
- workflow.triggers[selectedTriggerIndex].parameters = [];
- workflow.triggers[selectedTriggerIndex].parameters[0] = {
- name: "cron",
- value: isCloud ? "*/25 * * * *" : "60",
- };
- workflow.triggers[selectedTriggerIndex].parameters[1] = {
- name: "execution_argument",
- value: '{"example": {"json": "is cool"}}',
- };
- setWorkflow(workflow);
+ if (Object.getOwnPropertyNames(selectedTrigger).length > 0 && workflow.triggers !== null && workflow.triggers !== undefined && workflow.triggers.length >= selectedTriggerIndex && workflow.triggers[selectedTriggerIndex] !== undefined ) {
+
+ if (selectedTrigger.trigger_type === "SCHEDULE") {
+ if (workflow.triggers[selectedTriggerIndex] === undefined) {
+ return null;
+ }
+
+ if (
+ workflow.triggers[selectedTriggerIndex].parameters === undefined ||
+ workflow.triggers[selectedTriggerIndex].parameters === null ||
+ workflow.triggers[selectedTriggerIndex].parameters.length === 0
+ ) {
+ console.log("Autofixing schedule")
+
+ workflow.triggers[selectedTriggerIndex].parameters = [];
+ workflow.triggers[selectedTriggerIndex].parameters[0] = {
+ name: "cron",
+ value: isCloud ? "*/25 * * * *" : "60",
+ };
+ workflow.triggers[selectedTriggerIndex].parameters[1] = {
+ name: "execution_argument",
+ value: '{"example": {"json": "is cool"}}',
+ };
+ setWorkflow(workflow);
+ }
} else if (selectedTrigger.trigger_type === "WEBHOOK") {
if (workflow.triggers[selectedTriggerIndex] === undefined) {
return null;
@@ -14143,9 +13244,63 @@ const releaseToConnectLabel = "Release to Connect"
setWorkflow(workflow);
}
+ }else if(selectedTrigger.trigger_type === "SUBFLOW"){
+
+ if (
+ workflow.triggers[selectedTriggerIndex].parameters === undefined ||
+ workflow.triggers[selectedTriggerIndex].parameters === null ||
+ workflow.triggers[selectedTriggerIndex].parameters.length === 0
+ ) {
+ workflow.triggers[selectedTriggerIndex].parameters = [];
+ workflow.triggers[selectedTriggerIndex].parameters[0] = {
+ name: "workflow",
+ value: "",
+ };
+ workflow.triggers[selectedTriggerIndex].parameters[1] = {
+ name: "argument",
+ value: "",
+ id:"subflow_field"
+ };
+ workflow.triggers[selectedTriggerIndex].parameters[2] = {
+ name: "user_apikey",
+ value: "",
+ };
+ workflow.triggers[selectedTriggerIndex].parameters[3] = {
+ name: "startnode",
+ value: "",
+ };
+ workflow.triggers[selectedTriggerIndex].parameters[4] = {
+ name: "check_result",
+ value: "false",
+ };
+ workflow.triggers[selectedTriggerIndex].parameters[5] = {
+ name: "auth_override",
+ value: "",
+ };
+ setWorkflow(workflow)
+ /*
+ // API-key has been replaced by auth key for the execution.
+ // Parents can now automatically execute children without auth from a user, as long as the subflow in question is owned by the same org and the subflow is actually referencing it during checkin.
+ console.log("SETTINGS: ", userSettings);
+ if (
+ userSettings !== undefined &&
+ userSettings !== null &&
+ userSettings.apikey !== null &&
+ userSettings.apikey !== undefined &&
+ userSettings.apikey.length > 0
+ ) {
+ workflow.triggers[selectedTriggerIndex].parameters[2] = {
+ name: "user_apikey",
+ value: userSettings.apikey,
+ };
+ }
+ */
+ }
}
}
+ console.log(selectedTrigger)
+
const WebhookSidebar = Object.getOwnPropertyNames(selectedTrigger).length === 0 || workflow.triggers[selectedTriggerIndex] === undefined || selectedTrigger.trigger_type !== "WEBHOOK" ? null :
@@ -15689,7 +14844,8 @@ const releaseToConnectLabel = "Release to Connect"
}
- const PipelineSidebar = Object.getOwnPropertyNames(selectedTrigger).length === 0 || workflow.triggers[selectedTriggerIndex] === undefined && selectedTrigger.trigger_type !== "SCHEDULE" ? null :
+
+ const PipelineSidebar = Object.getOwnPropertyNames(selectedTrigger).length === 0 || workflow.triggers[selectedTriggerIndex] === undefined && selectedTrigger.trigger_type !== "PIPELINE" ? null :
{selectedTrigger.app_name}: {selectedTrigger.status}
@@ -16194,6 +15350,863 @@ const releaseToConnectLabel = "Release to Connect"
+ const SubflowSidebar = Object.getOwnPropertyNames(selectedTrigger).length === 0 || workflow.triggers[selectedTriggerIndex] === undefined || selectedTrigger.trigger_type !== "SUBFLOW" ? null :
+
+
+
+ {selectedTrigger.app_name}
+
+
+
+
+
+
+ What are subflows?
+
+
+
+
+ Name
+
+
+
+
+
+
+ Delay
+ {
+ if (isNaN(event.target.value)) {
+ console.log("NAN: ", event.target.value)
+ return
+ }
+
+ const parsedNumber = parseInt(event.target.value)
+ if (parsedNumber > 86400) {
+ console.log("Max number is 1 day (86400)")
+ return
+ }
+
+ selectedTrigger.execution_delay = parseInt(event.target.value)
+ setSelectedTrigger(selectedTrigger)
+ }}
+ />
+
+
+
+
+
+
{
+ const newvalue = workflow.triggers[selectedTriggerIndex].parameters[4] === undefined || workflow.triggers[selectedTriggerIndex].parameters[4].value === "false"? "true" : "false";
+ workflow.triggers[selectedTriggerIndex].parameters[4] = {
+ name: "check_result",
+ value: newvalue,
+ };
+
+ setWorkflow(workflow);
+ setUpdate(Math.random());
+ }}
+ color="primary"
+ value="Wait for results"
+ />
+ }
+ style={{ marginTop: 10 }}
+ label={Wait for results
}
+ />
+
+
+
+
+
+ Select a workflow to execute
+
+
+ {workflow.triggers[selectedTriggerIndex].parameters[0].value
+ .length === 0 ? null : workflow.triggers[selectedTriggerIndex]
+ .parameters[0].value === props.match.params.key ? null : (
+
+ )}
+
+
+ {workflows === undefined ||
+ workflows === null ||
+ workflows.length === 0 ? null : (
+
+
option.id === value.id}
+ getOptionLabel={(option) => {
+ if (
+ option === undefined ||
+ option === null ||
+ option.name === undefined ||
+ option.name === null
+ ) {
+ return "No Workflow Selected";
+ }
+
+ const newname = (
+ option.name.charAt(0).toUpperCase() + option.name.substring(1)
+ ).replaceAll("_", " ");
+ return newname;
+ }}
+ options={workflows}
+ fullWidth
+ style={{
+ backgroundColor: theme.palette.inputColor,
+ height: 50,
+ borderRadius: theme.palette.borderRadius,
+ }}
+ onChange={(event, newValue) => {
+ setLastSaved(false)
+ console.log("Found value: ", newValue)
+
+ var parsedinput = { target: { value: newValue } }
+
+ // For variables
+ if (typeof newValue === 'string' && newValue.startsWith("$")) {
+ parsedinput = {
+ target: {
+ value: {
+ "name": newValue,
+ "id": newValue,
+ "actions": [],
+ "triggers": [],
+ }
+ }
+ }
+ }
+
+ handleWorkflowSelectionUpdate(parsedinput)
+ }}
+ renderOption={(props, data, state) => {
+ if (data.id === workflow.id) {
+ data = workflow;
+ }
+
+ //key={index}
+ return (
+
+ {data.image !== undefined && data.image !== null && data.image.length > 0 ?
+
+ : null}
+
+ Choose Subflow '{data.name}'
+
+
+ }>
+
+
+ )
+ }}
+ renderInput={(params) => {
+ return (
+
+ );
+ }}
+ />
+ )}
+
+ {subworkflow === undefined ||
+ subworkflow === null ||
+ subworkflow.id === undefined ||
+ subworkflow.actions === null ||
+ subworkflow.actions === undefined ||
+ subworkflow.actions.length === 0 ? null : (
+
+
+
+ Select the Startnode
+
+
+ option.id === value.id}
+ getOptionLabel={(option) => {
+ if (option === undefined || option === null || option.label === undefined || option.label === null) {
+ if (option.length === 36) {
+
+ }
+
+ return "TMP";
+ }
+
+ const newname = (
+ option.label.charAt(0).toUpperCase() + option.label.substring(1)
+ ).replaceAll("_", " ");
+ return newname;
+ }}
+ options={subworkflow.actions}
+ fullWidth
+ style={{
+ backgroundColor: theme.palette.inputColor,
+ height: 50,
+ borderRadius: theme.palette.borderRadius,
+ }}
+ onChange={(event, newValue) => {
+ setLastSaved(false)
+ handleSubflowStartnodeSelection({ target: { value: newValue } })
+ }}
+ renderOption={(props, action, state) => {
+ const isParent = getParents(selectedTrigger).find(
+ (parent) => parent.id === action.id
+ )
+
+ return (
+
+ );
+ }}
+ renderInput={(params) => {
+ return (
+
+ );
+ }}
+ />
+
+ )}
+
+
+ Execution Argument
+
+
+
+
+
+ {
+ event.preventDefault()
+ // setFieldCount(count)
+ setCodeEditorModalOpen(true)
+ setActiveDialog("codeeditor")
+ //setcodedata(data.value)
+ var parsedvalue = workflow?.triggers[selectedTriggerIndex]?.parameters[1]?.value
+ // if (parsedvalue === undefined || parsedvalue === null) {
+ // parsedvalue = ""
+ // }
+ console.log("Data sending to codeeditor: ",{
+ "name": workflow.triggers[selectedTriggerIndex].parameters[1].name,
+ "value": parsedvalue,
+ "field_number": 1,
+ "actionlist": subflowActionList,
+ "field_id": "subflow_field",
+ })
+ setEditorData({
+ "name": workflow.triggers[selectedTriggerIndex].parameters[1].name,
+ "value": parsedvalue,
+ "field_number": 1,
+ "actionlist": subflowActionList,
+ "field_id": "subflow_field",
+ })
+ }}
+ />
+
+
+ {
+ setMenuPosition({
+ top: event.pageY + 10,
+ left: event.pageX + 10,
+ });
+ //setShowDropdownNumber(3)
+ setShowDropdown(true);
+ }}
+ />
+
+
+
+ ),
+ }}
+ rows="6"
+ multiline
+ fullWidth
+ color="primary"
+ placeholder="Some execution data"
+ defaultValue={
+ workflow?.triggers[selectedTriggerIndex]?.parameters[1]?.value
+ }
+ onBlur={(e) => {
+ workflow.triggers[selectedTriggerIndex].parameters[1].value = e.target.value
+ setWorkflow(workflow)
+ setLastSaved(false)
+
+ }}
+ />
+ {!showDropdown ? null :
+
+ }
+ parentMenuOpen={!!menuPosition}
+ style={{
+ backgroundColor: theme.palette.inputColor,
+ color: "white",
+ minWidth: 250,
+ }}
+ onClick={() => {
+ handleItemClick([innerdata]);
+ }}
+ >
+ {parsedPaths.map((pathdata, index) => {
+ // FIXME: Should be recursive in here
+ const icon =
+ pathdata.type === "value" ? (
+
+ ) : pathdata.type === "list" ? (
+
+ ) : (
+
+ )
+
+ return (
+
+ );
+ })}
+
+ */}
+
+
+ {icon} {innerdata.name}
+
+ }
+ parentMenuOpen={!!menuPosition}
+ style={{
+ color: "white",
+ minWidth: 250,
+ maxWidth: 250,
+ maxHeight: 50,
+ overflow: "hidden",
+ }}
+ onClick={() => {
+ console.log("CLICKED: ", innerdata);
+ console.log(innerdata.example)
+ handleItemClick([innerdata]);
+ }}
+ >
+
+
+
+
+ {parsedPaths.map((pathdata, index) => {
+ // FIXME: Should be recursive in here
+ //
+ const icon =
+ pathdata.type === "value" ? (
+
+ ) : pathdata.type === "list" ? (
+
+ ) : (
+
+ );
+ //
+
+ const indentation_count = (pathdata.name.match(/\./g) || []).length+1
+ const baseIndent =
+ //const boxPadding = pathdata.type === "object" ? "10px 0px 0px 0px" : 0
+ const boxPadding = 0
+ const namesplit = pathdata.name.split(".")
+ const newname = namesplit[namesplit.length-1]
+ return (
+
+ );
+ })}
+
+
+
+ ) : (
+
+ );
+ })}
+
+ }
+ {/*
+
+ {
+ workflow.triggers[selectedTriggerIndex].parameters[2].value =
+ e.target.value;
+ setWorkflow(workflow);
+ }}
+ />
+ */}
+
+
+
+
+
+
+
+
+ Authentication Override
+
+
+
+
+
+
+
+
+
const cytoscapeViewWidths = isMobile ? 50 : 950;
const bottomBarStyle = {
position: "fixed",