diff --git a/frontend/src/components/OrgHeader.jsx b/frontend/src/components/OrgHeader.jsx index 448bf5b1..823189ae 100644 --- a/frontend/src/components/OrgHeader.jsx +++ b/frontend/src/components/OrgHeader.jsx @@ -607,7 +607,7 @@ const OrgHeader = (props) => { {/*isCloud ? null : */} SAML SSO (v1.1) - + SSO Entrypoint (IdP) @@ -682,6 +682,11 @@ const OrgHeader = (props) => { + {isCloud ? + + IdP URL for Shuffle: https://shuffler.io/api/v1/login_sso + + : null} {isCloud ? null : ( diff --git a/frontend/src/components/ParsedAction.jsx b/frontend/src/components/ParsedAction.jsx index c2a0ec6e..7372b3b3 100644 --- a/frontend/src/components/ParsedAction.jsx +++ b/frontend/src/components/ParsedAction.jsx @@ -83,6 +83,7 @@ import { ExpandMore as ExpandMoreIcon, VpnKey as VpnKeyIcon, AutoFixHigh as AutoFixHighIcon, + SquareFoot as SquareFootIcon, } from '@mui/icons-material'; //} from "@material-ui/icons"; @@ -167,6 +168,7 @@ const ParsedAction = (props) => { isCloud, lastSaved, setLastSaved, + setShowVideo, //expansionModalOpen, //setExpansionModalOpen, } = props; @@ -525,8 +527,12 @@ const ParsedAction = (props) => { const valid = validateJson(foundResult) if (valid.valid) { - exampledata = valid.result; - break; + if (valid.result.success === false) { + //console.log("Skipping success false autocomplete") + } else { + exampledata = valid.result; + break; + } } else { exampledata = foundResult; } @@ -777,6 +783,10 @@ const ParsedAction = (props) => { selectedAction.parameters[count].value = event.target.value; var forceUpdate = false + if (isCloud && (selectedAction.app_name === "Shuffle Tools" || selectedAction.app_name === "email") && (selectedAction.name === "send_email_shuffle" || selectedAction.name === "send_sms_shuffle") && data.name === "apikey") { + console.log("APIKEY - this shouldn't show up!") + } + if (selectedAction.app_name === "Shuffle Tools" && selectedAction.name === "filter_list" && data.name === "input_list") { //console.log("FILTER LIST!: ", event, count, data) const parsedvalue = event.target.value @@ -1140,6 +1150,16 @@ const ParsedAction = (props) => { ); } + // Added autofill to make this ALOT simpler + if (isCloud && (selectedAction.app_name === "Shuffle Tools" || selectedAction.app_name === "email") && (selectedAction.name === "send_email_shuffle" || selectedAction.name === "send_sms_shuffle") && data.name === "apikey") { + if (selectedActionParameters[count].length === 0) { + selectedAction.parameters[count].value = "TMP: Will be replaced during execution if cloud" + setSelectedAction(selectedAction) + } + + return null + } + var staticcolor = "inherit"; var actioncolor = "inherit"; var varcolor = "inherit"; @@ -1429,8 +1449,15 @@ const ParsedAction = (props) => { multiline={multiline} helperText={returnHelperText(data.name, data.value)} onClick={() => { + console.log("Clicked field: ", clickedFieldId, data.name) + if (data.name === "file_id") { + console.log("show file video?") + if (setShowVideo !== undefined) { + setShowVideo("https://www.youtube.com/embed/DPYowyTbsSk") + } + } + //(data.name.toLowerCase().includes("api") || /* - console.log("Clicked field: ", clickedFieldId); setExpansionModalOpen(false); if ( setScrollConfig !== undefined && @@ -1689,6 +1716,7 @@ const ParsedAction = (props) => { .endsWith("$") ? values[0].autocomplete : "$" + values[0].autocomplete; + toComplete = toComplete.toLowerCase().replaceAll(" ", "_"); console.log("AUTOCOMPLETE: ", toComplete); for (var key in values) { @@ -1951,7 +1979,30 @@ const ParsedAction = (props) => { baseIndent ) })} - {icon} {newname} + {icon} {newname} + {pathdata.type === "list" ? { + e.preventDefault() + e.stopPropagation() + + console.log("INNER: ", innerdata, pathdata) + + // Removing .list from autocomplete + var newname = pathdata.name + if (newname.length > 5) { + newname = newname.slice(0, newname.length-5) + } + selectedActionParameters[count].value += `{{ $${innerdata.name}.${newname} | size }}` + selectedAction.parameters[count].value = selectedActionParameters[count].value; + setSelectedAction(selectedAction); + setUpdate(Math.random()); + setShowDropdown(false); + setMenuPosition(null); + + // innerdata.name + // pathdata.name + //handleItemClick([innerdata, newpathdata]) + //console.log("CLICK LENGTH!") + }} /> : null} @@ -2036,6 +2087,10 @@ const ParsedAction = (props) => { { /*
*/ } + + //console.log(data.configuration) + + const buttonTitle = `Authenticate ${selectedApp.name.replaceAll("_", " ")}` return (
{hideBodyButton} @@ -2044,7 +2099,7 @@ const ParsedAction = (props) => { > {data.configuration === true ? ( { const { fieldCount, setFieldCount, actionlist, changeActionParameterCodeMirror, expansionModalOpen, setExpansionModalOpen, codedata, setcodedata } = props const [localcodedata, setlocalcodedata] = React.useState(codedata === undefined || codedata === null || codedata.length === 0 ? "" : codedata); @@ -67,10 +72,12 @@ const CodeEditor = (props) => { const [currentVariable, setCurrentVariable] = React.useState(""); const [anchorEl, setAnchorEl] = React.useState(null); const [anchorEl2, setAnchorEl2] = React.useState(null); + const [anchorEl3, setAnchorEl3] = React.useState(null); const [mainVariables, setMainVariables] = React.useState([]); const [availableVariables, setAvailableVariables] = React.useState([]); const liquidOpen = Boolean(anchorEl); const mathOpen = Boolean(anchorEl2); + const pythonOpen = Boolean(anchorEl3); useEffect(() => { @@ -337,13 +344,19 @@ const CodeEditor = (props) => { const handleClick = (item) => { - if (item === undefined || item.value === undefined) { + if (item === undefined || item.value === undefined || item.value === null) { return } - setlocalcodedata(localcodedata+" | "+item.value+" }}") + if (!item.value.includes("{%")) { + setlocalcodedata(localcodedata+" | "+item.value+" }}") + } else { + setlocalcodedata(localcodedata+item.value) + } + setAnchorEl(null) setAnchorEl2(null) + setAnchorEl3(null) } return ( @@ -479,6 +492,41 @@ const CodeEditor = (props) => { ) })} + + { + setAnchorEl3(null); + }} + MenuListProps={{ + 'aria-labelledby': 'basic-button', + }} + > + {pythonFilters.map((item, index) => { + return ( + { + handleClick(item) + }}>{item.name} + ) + })} +
{ styleSelectedText: true, theme: codeTheme, keyMap: 'sublime', - mode: 'javascript', + mode: 'python', lineWrapping: linewrap, // mode: {codelang}, }} diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx index 3d16564e..60b7455b 100644 --- a/frontend/src/views/AngularWorkflow.jsx +++ b/frontend/src/views/AngularWorkflow.jsx @@ -349,6 +349,7 @@ const AngularWorkflow = (defaultprops) => { const [executionModalView, setExecutionModalView] = React.useState(0); const [executionData, setExecutionData] = React.useState({}); const [appsLoaded, setAppsLoaded] = React.useState(false); + const [showVideo, setShowVideo] = React.useState(""); const [lastSaved, setLastSaved] = React.useState(true); @@ -1851,6 +1852,9 @@ const AngularWorkflow = (defaultprops) => { } } + // Unselecting all + //cy.elements().unselect() + //if (nodedata.app_name === undefined && nodedata.source === undefined) { // return; //} @@ -5882,6 +5886,7 @@ const AngularWorkflow = (defaultprops) => { const getNextActionName = (appName) => { var highest = ""; + const allitems = workflow.actions.concat(workflow.triggers); for (var key in allitems) { const item = allitems[key]; @@ -5900,6 +5905,8 @@ const AngularWorkflow = (defaultprops) => { } } + appName = appName.replaceAll(" ", "_") + if (highest) { return appName + "_" + (parseInt(highest) + 1); } else { @@ -5923,11 +5930,8 @@ const AngularWorkflow = (defaultprops) => { if (workflow.actions !== undefined && workflow.actions !== null) { const foundInfo = workflow.actions.find(ac => ac.id === selectedAction.id) - console.log("aigo: ", foundInfo) } - console.log("PRe: ", selectedAction) - // Does this one find the wrong one? //var newSelectedAction = JSON.parse(JSON.stringify(selectedAction)) var newSelectedAction = selectedAction @@ -5940,7 +5944,6 @@ const AngularWorkflow = (defaultprops) => { // Simmple action swap autocompleter if (selectedAction.parameters !== undefined && newSelectedAction.parameters !== undefined && selectedAction.id === newSelectedAction.id) { - console.log("OLD: ", selectedAction, "NEW: ", newSelectedAction) for (var paramkey in selectedAction.parameters) { const param = selectedAction.parameters[paramkey]; @@ -5981,14 +5984,12 @@ const AngularWorkflow = (defaultprops) => { newSelectedAction.fillGradient.length > 0 ) { newSelectedAction.fillstyle = "linear-gradient"; - console.log("GRADIENT!: ", newSelectedAction); } else { newSelectedAction.iconBackground = iconInfo.iconBackgroundColor; } const foundnode = cy.getElementById(newSelectedAction.id); if (foundnode !== null && foundnode !== undefined) { - console.log("UPDATING NODE!"); foundnode.data(newSelectedAction); } } @@ -10890,6 +10891,7 @@ const AngularWorkflow = (defaultprops) => { defaultReturn = { frameBorder={false} webkitallowFullscreen={true} mozallowFullscreen={true} - allowFullscreen={true} + allowFullScreen={true} style={{ "top": 0, "left": 0, @@ -11170,7 +11172,7 @@ const AngularWorkflow = (defaultprops) => { frameBorder={false} webkitallowFullscreen={true} mozallowFullscreen={true} - allowFullscreen={true} + allowFullScreen={true} style={{ "top": 0, "left": 0, @@ -13883,6 +13885,39 @@ const parsedExecutionArgument = () => { {codePopoutModal} {configureWorkflowModal} {editWorkflowModal} + + {showVideo !== undefined && showVideo.length > 0 ? +
+ { + setShowVideo("") + }} + > + + +