import React, { useState, useEffect } from "react"; import { InputAdornment, Tooltip, TextField, CircularProgress, ButtonGroup, Button, Avatar, ListItemAvatar, Typography, List, ListItem, ListItemText, Fade, } from "@material-ui/core"; import { FavoriteBorder as FavoriteBorderIcon } from "@material-ui/icons"; import { FixName } from "../views/Apps.jsx"; // Handles workflow updates on first open to highlight the issues of the workflow // Variables // Action (exists, missing fields) // Action auth // Triggers // // Specifically used for UNSAVED workflows only? const ConfigureWorkflow = (props) => { const { globalUrl, theme, workflow, appAuthentication, setSelectedAction, setAuthenticationModalOpen, setSelectedApp, apps, selectedAction, setConfigureWorkflowModalOpen, saveWorkflow, newWebhook, submitSchedule, referenceUrl, isCloud, setAuthenticationType, alert, showTriggers, } = props; const [requiredActions, setRequiredActions] = React.useState([]); const [requiredVariables, setRequiredVariables] = React.useState([]); const [requiredTriggers, setRequiredTriggers] = React.useState([]); const [previousAuth, setPreviousAuth] = React.useState(appAuthentication); const [itemChanged, setItemChanged] = React.useState(false); const [firstLoad, setFirstLoad] = React.useState(""); const [showFinalizeAnimation, setShowFinalizeAnimation] = React.useState(false); if (workflow === undefined || workflow === null) { return null; } if (apps === undefined || apps === null) { return null; } if (appAuthentication === undefined || appAuthentication === null) { return null; } const getApp = (actionId, appId) => { fetch(globalUrl + "/api/v1/apps/" + appId + "/config?openapi=false", { headers: { Accept: "application/json", }, credentials: "include", }) .then((response) => { if (response.status === 200) { //alert.success("Successfully GOT app "+appId) } else { alert.error("Failed getting app"); } return response.json(); }) .then((responseJson) => { console.log("ACTION: ", responseJson); if ( responseJson.actions !== undefined && responseJson.actions !== null ) { } }) .catch((error) => { alert.error(error.toString()); }); }; if (firstLoad.length === 0 || firstLoad !== workflow.id) { if (apps === undefined || apps === null || apps.length === 0) { console.log("No apps loaded: ", apps); setConfigureWorkflowModalOpen(false); return null; } setFirstLoad(workflow.id) const newactions = []; for (var key in workflow.actions) { const action = workflow.actions[key]; var newaction = { large_image: action.large_image, app_name: action.app_name, app_version: action.app_version, activation_done: false, must_activate: false, must_authenticate: false, auth_done: false, action_ids: [], action: action, update_version: action.app_version, app: {}, }; const app = apps.find( (app) => app.name === action.app_name && (app.app_version === action.app_version || (app.loop_versions !== null && app.loop_versions.includes(action.app_version))) ); if (app === undefined || app === null) { //console.log("App not found: ", action.app_name); const subapp = apps.find(app => app.name === action.app_name) if (subapp !== undefined && subapp !== null) { newaction.update_version = "1.1.0" } newaction.must_activate = true; } else { if ( action.authentication_id === "" && app.authentication.required === true ) { // Check if configuration is filled or not var filled = true; for (var key in action.parameters) { if (action.parameters[key].configuration) { //console.log("Found config: ", action.parameters[key]) if ( action.parameters[key].value === null || action.parameters[key].value.length === 0 ) { filled = false; break; } } } if (!filled) { newaction.must_authenticate = true; newaction.action_ids.push(action.id); } } else if (action.authentication_id !== "" && app.authentication.required === true) { console.log("Should verify authentication ID ", action.authentication_id) } newaction.app = app; } if ( action.errors !== undefined && action.errors !== null && action.errors.length > 0 ) { //console.log("Node has errors!: ", action.errors) } if (newaction.must_authenticate) { var authenticationOptions = []; for (var key in appAuthentication) { const auth = appAuthentication[key]; if (auth.app.name === app.name && auth.active) { //console.log("Found auth: ", auth) authenticationOptions.push(auth); newaction.authenticationId = auth.id; break; } } if ( newaction.authenticationId === null || newaction.authenticationId === undefined || newaction.authenticationId.length === "" ) { //console.log("FAILED to authenticate node!") if ( newactions.find( (tmpaction) => tmpaction.app_id === newaction.app_id && tmpaction.app_name === newaction.app_name ) !== undefined ) { //console.log("Action already found."); } else { newactions.push(newaction); } } else { //console.log("Skipping node as it's already authenticated.") newaction.authentication = authenticationOptions; workflow.actions[key] = newaction; } } else if (newaction.must_activate) { if ( newactions.find( (tmpaction) => tmpaction.app_id === newaction.app_id && tmpaction.app_name === newaction.app_name ) !== undefined ) { console.log("Action already found."); } else { newactions.push(newaction); } } } for (var key in workflow.workflow_variables) { const variable = workflow.workflow_variables[key]; if ( variable.value === undefined || variable.value === undefined || variable.value.length < 2 ) { variable.value = ""; variable.index = key; requiredVariables.push(variable); } } for (var key in workflow.triggers) { var trigger = workflow.triggers[key]; trigger.index = key; if (trigger.status === "running") { continue; } if ( trigger.trigger_type === "SUBFLOW" || trigger.trigger_type === "USERINPUT" ) { continue; } requiredTriggers.push(trigger); } if ( requiredTriggers.length === 0 && requiredVariables.length === 0 && newactions.length === 0 ) { setConfigureWorkflowModalOpen(false); } setRequiredTriggers(requiredTriggers); setRequiredVariables(requiredVariables); setRequiredActions(newactions); } if (appAuthentication.length !== previousAuth.length) { var newactions = [] for (var actionkey in requiredActions) { var newaction = requiredActions[actionkey]; const app = newaction.app; for (var key in appAuthentication) { const auth = appAuthentication[key]; // Does this account for all the different ones of the same? if (auth.app.name === app.name && auth.active === true) { newaction.auth_done = true; break; } } newactions.push(newaction); } setRequiredActions(newactions); setPreviousAuth(appAuthentication); // Set auth done to true //"auth_done": false } const TriggerSection = (props) => { const { trigger } = props; return ( {trigger.label} {trigger.trigger_type === "WEBHOOK" && trigger.status !== "running" ? ( ) : trigger.trigger_type === "SCHEDULE" && trigger.status !== "running" ? ( ) : null} {/* ) }} fullWidth color="primary" type={"text"} placeholder={`New value for ${trigger.name}`} onChange={(event) => { console.log("NEW VALUE ON INDEX", trigger.value) }} onBlur={(event) => { //workflow.variables[variable.index] = event.target.value }} /> } style={{}} /> */} ); }; const VariableSection = (props) => { const { variable } = props; //Name: {variable.name} - {variable.value}. return ( , }} fullWidth color="primary" type={"text"} placeholder={`New value for ${variable.name}`} onChange={(event) => { console.log( "NEW VALUE ON INDEX", variable.index, variable.value ); }} onBlur={(event) => { workflow.workflow_variables[variable.index].value = event.target.value; }} /> } style={{}} /> ); }; const activateApp = (app_id, app_name, app_version) => { fetch( `${globalUrl}/api/v1/apps/${app_id}/activate?app_name=${app_name}&app_version=${app_version}`, { method: "GET", headers: { "Content-Type": "application/json", Accept: "application/json", }, credentials: "include", } ) .then((response) => { if (response.status !== 200) { //window.location.pathname = "/search" //alert.error("Failed to find this app. Is it public?") } return response.json(); }) .then((responseJson) => { if (responseJson.success === false) { if (responseJson.reason !== undefined) { alert.error("Failed to activate the app: "+responseJson.reason); } else { alert.error("Failed to activate the app"); } } else { alert.success("App activated for your organization!"); } }) .catch((error) => { alert.error(error.toString()); }); }; const AppSection = (props) => { const { action } = props; return ( {/* {action.app_name} */} {action.must_authenticate ? : null} {action.must_activate ? ( ) : null} {action.update_version !== action.app_version ? ( ) : null} ); } // Based on the color here. Default: #f86a3e //backgroundColor: selectedUsecaseCategory === usecase.name ? usecase.color : theme.palette.surfaceColor, const topColor = "#f86a3e, #fc3922" return (
{workflow.name} The following configuration makes the workflow ready immediately. {requiredActions.length > 0 ? ( Required Actions {requiredActions.map((data, index) => { return ( ) })} ) : null} {requiredVariables.length > 0 ? ( Variables {requiredVariables.map((data, index) => { return ; })} ) : null} {requiredTriggers.length > 0 && showTriggers !== false ? ( Triggers {requiredTriggers.map((data, index) => { return ; })} ) : null}
{showFinalizeAnimation ? finalize workflow animation { console.log("Img loaded.") setTimeout(() => { console.log("Img closing.") setConfigureWorkflowModalOpen(false); }, 1250) }}/> : {/* */} }
); }; export default ConfigureWorkflow;