From 34f7fbe76eb2b73da46be247f84e639872ba8404 Mon Sep 17 00:00:00 2001 From: frikky Date: Thu, 21 May 2020 20:49:07 +0200 Subject: [PATCH 01/13] Updated docs routing --- backend/go-app/main.go | 56 +++++++++++++++++-------- frontend/src/Apps.js | 8 ++-- frontend/src/Docs.js | 93 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 122 insertions(+), 35 deletions(-) diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 591d8a84..3a20ceef 100644 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -3921,6 +3921,14 @@ func setBadMemcache(ctx context.Context, path string) { //} } +type Result struct { + Success bool `json:"success"` + Reason string `json:"reason"` + List []string `json:"list"` +} + +var docs_list = Result{List: []string{}} + func getDocList(resp http.ResponseWriter, request *http.Request) { cors := handleCors(resp, request) if cors { @@ -3939,11 +3947,24 @@ func getDocList(resp http.ResponseWriter, request *http.Request) { // return //} + if len(docs_list.List) > 0 { + b, err := json.Marshal(docs_list) + if err != nil { + log.Printf("Failed marshaling result: %s", err) + //http.Error(resp, err.Error(), 500) + } else { + resp.WriteHeader(200) + resp.Write(b) + return + } + } + client := github.NewClient(nil) - _, item1, _, err := client.Repositories.GetContents(ctx, "shaffuru", "shuffle-docs", "docs", nil) + _, item1, _, err := client.Repositories.GetContents(ctx, "frikky", "shuffle-docs", "docs", nil) if err != nil { + log.Printf("Github error: %s", err) resp.WriteHeader(500) - resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "Error listing directory"`))) + resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "Error listing directory: %s"`, err))) return } @@ -3964,16 +3985,12 @@ func getDocList(resp http.ResponseWriter, request *http.Request) { log.Println(names) - type Result struct { - Success bool `json:"success"` - Reason string `json:"reason"` - List []string `json:"list"` - } - var result Result result.Success = true result.Reason = "Success" result.List = names + docs_list = result + b, err := json.Marshal(result) if err != nil { http.Error(resp, err.Error(), 500) @@ -4001,6 +4018,8 @@ func getDocList(resp http.ResponseWriter, request *http.Request) { } // r.HandleFunc("/api/v1/docs/{key}", getDocs).Methods("GET", "OPTIONS") +var alldocs = map[string][]byte{} + func getDocs(resp http.ResponseWriter, request *http.Request) { cors := handleCors(resp, request) if cors { @@ -4016,16 +4035,15 @@ func getDocs(resp http.ResponseWriter, request *http.Request) { //ctx := context.Background() docPath := fmt.Sprintf("https://raw.githubusercontent.com/shaffuru/shuffle-docs/master/docs/%s.md", location[4]) - //if item, err := memcache.Get(ctx, docPath); err == memcache.ErrCacheMiss { - // // Not in cache - //} else if err != nil { - // // Error with cache - // log.Printf("Error getting item: %v", err) - //} else { - // resp.WriteHeader(200) - // resp.Write([]byte(item.Value)) - // return - //} + //location[4] + //var, ok := alldocs["asd"] + key, ok := alldocs[fmt.Sprintf("%s", location[4])] + // Custom cache for github issues lol + if ok { + resp.WriteHeader(200) + resp.Write(key) + return + } client := &http.Client{} req, err := http.NewRequest( @@ -4078,6 +4096,8 @@ func getDocs(resp http.ResponseWriter, request *http.Request) { return } + alldocs[location[4]] = b + // Add to cache if it doesn't exist //item := &memcache.Item{ // Key: docPath, diff --git a/frontend/src/Apps.js b/frontend/src/Apps.js index a1141d38..e9a1a256 100644 --- a/frontend/src/Apps.js +++ b/frontend/src/Apps.js @@ -338,11 +338,11 @@ const Apps = (props) => {
-

App creation

- What are apps? -  - OpenAPI specification +

App Creator

+ Security API's +  - OpenAPI directory
- Apps are how you interact with workflows, and are used to execute workflows. They are created with the app creator, using OpenAPI specification or manually in python. + Apps interact with eachother in workflows. They are created with the app creator, using OpenAPI specification or manually in python. Use the links above to find potential apps you're looking for using OpenAPI or make one from scratch. There's 1000+ available.
@@ -3091,8 +3100,16 @@ const AngularWorkflow = (props) => { const [anchorEl, setAnchorEl] = React.useState(null); const deleteCondition = (conditionIndex) => { - //selectedEdge.conditions.splice(conditionIndex, 1) - //setSelectedEdge(selectedEdge) + console.log(selectedEdge) + if (selectedEdge.conditions.length === 1) { + selectedEdge.conditions = [] + } else { + selectedEdge.conditions.splice(conditionIndex, 1) + } + + setSelectedEdge(selectedEdge) + setOpen(false) + setUpdate("delete "+conditionIndex) } const paperVariableStyle = { @@ -3108,6 +3125,7 @@ const AngularWorkflow = (props) => { } const menuClick = (event) => { + console.log("MENU CLICK") setOpen(!open) setAnchorEl(event.currentTarget); } From 668557b52bfee6f9b7024444dae1b257d1d3164b Mon Sep 17 00:00:00 2001 From: frikky Date: Fri, 22 May 2020 12:56:36 +0200 Subject: [PATCH 04/13] Added doc scrolling --- .env | 2 +- backend/go-app/main.go | 2 +- docker-compose.yml | 2 + frontend/src/App.js | 8 +- frontend/src/Apps.js | 113 +++++++++++++++++++++++++++- frontend/src/Docs.js | 5 +- functions/onprem/orborus/orborus.go | 7 +- functions/onprem/orborus/run.sh | 1 + 8 files changed, 127 insertions(+), 13 deletions(-) diff --git a/.env b/.env index 4928d5d6..c97e13f3 100644 --- a/.env +++ b/.env @@ -6,4 +6,4 @@ ENVIRONMENT_NAME=Shuffle BACKEND_HOSTNAME=shuffle-backend BACKEND_PORT=5010 FRONTEND_PORT=3001 -OUTER_HOSTNAME=shuffle-backend \ No newline at end of file +OUTER_HOSTNAME=shuffle-backend diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 3a20ceef..e2a4e636 100644 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -1980,7 +1980,7 @@ func handleLogin(resp http.ResponseWriter, request *http.Request) { }) loginData = fmt.Sprintf(`{"success": true, "cookies": [{"key": "session_token", "value": "%s", "expiration": %d}]}`, Userdata.Session, expiration.Unix()) - log.Printf("SESSION LENGTH MORE THAN 0 IN LOGIN: %s", Userdata.Session) + //log.Printf("SESSION LENGTH MORE THAN 0 IN LOGIN: %s", Userdata.Session) err = SetSession(ctx, *Userdata, Userdata.Session) if err != nil { diff --git a/docker-compose.yml b/docker-compose.yml index b2c4b28b..17fec1a9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,6 +17,8 @@ services: image: frikky/shuffle:database container_name: shuffle-database hostname: shuffle-database + ports: + - "8000:8000" networks: - shuffle restart: unless-stopped diff --git a/frontend/src/App.js b/frontend/src/App.js index 26586734..48cc6b24 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -52,10 +52,10 @@ const theme = createMuiTheme({ palette: { primary: { main: "#f85a3e" - }, - secondary: { - main: '#e8eaf6', - }, + }, + secondary: { + main: '#e8eaf6', + }, }, typography: { useNextVariants: true diff --git a/frontend/src/Apps.js b/frontend/src/Apps.js index e9a1a256..fc394cd1 100644 --- a/frontend/src/Apps.js +++ b/frontend/src/Apps.js @@ -41,6 +41,7 @@ const Apps = (props) => { const [openApi, setOpenApi] = React.useState("") const [openApiData, setOpenApiData] = React.useState("") const [appValidation, setAppValidation] = React.useState("") + const [loadAppsModalOpen, setLoadAppsModalOpen] = React.useState(false); const [openApiModal, setOpenApiModal] = React.useState(false); const [openApiModalType, setOpenApiModalType] = React.useState(""); const [openApiError, setOpenApiError] = React.useState("") @@ -400,16 +401,27 @@ const Apps = (props) => {
{isLoading ? : null} +
{ window.location.href = "/apps/new?id="+appValidation } + + + const handleGithubValidation = () => { + console.log("VALIDATE") + setValidation(true) + //const circularLoader = validation ? : null + } + + const appsModalLoad = loadAppsModalOpen ? + { + setOpenApi("") + setLoadAppsModalOpen(false) + }} + PaperProps={{ + style: { + backgroundColor: surfaceColor, + color: "white", + minWidth: "800px", + minHeight: "320px", + }, + }} + > + +
+ Load from github repo +
+
+ + Github repository + setOpenApi(e.target.value)} + placeholder="https://github.com/frikky/shuffle-apps" + fullWidth + /> +
+ setOpenApi(e.target.value)} + placeholder="https://github.com/frikky/shuffle-apps" + fullWidth + /> + setOpenApi(e.target.value)} + placeholder="https://github.com/frikky/shuffle-apps" + fullWidth + /> +
+
+ + {circularLoader} + + + +
+ : null + const errorText = openApiError.length > 0 ?
Error: {openApiError}
: null const circularLoader = validation ? : null const modalView = openApiModal ? @@ -693,11 +797,11 @@ const Apps = (props) => { - + @@ -708,6 +812,7 @@ const Apps = (props) => {
{appView} {modalView} + {appsModalLoad}
:
diff --git a/frontend/src/Docs.js b/frontend/src/Docs.js index 8b4acd26..55c7c09c 100644 --- a/frontend/src/Docs.js +++ b/frontend/src/Docs.js @@ -64,7 +64,7 @@ const Docs = (props) => { if (parent !== null) { var elements = parent.getElementsByTagName('h2') - const name = window.location.hash.slice(1, window.location.hash.lenth).toLowerCase().split("%20").join(" ") + const name = window.location.hash.slice(1, window.location.hash.lenth).toLowerCase().split("%20").join(" ").split("_").join(" ") console.log(name) var found = false @@ -167,6 +167,9 @@ const Docs = (props) => { } function OuterLink(props) { + if (props.href.includes("http") || props.href.includes("mailto")) { + return {props.children} + } return {props.children} } diff --git a/functions/onprem/orborus/orborus.go b/functions/onprem/orborus/orborus.go index 5d510f2c..6996fc5a 100644 --- a/functions/onprem/orborus/orborus.go +++ b/functions/onprem/orborus/orborus.go @@ -28,7 +28,7 @@ import ( var baseUrl = os.Getenv("BASE_URL") var baseimagename = "frikky/shuffle" -//var dockerApiVersion = os.Getenv("DOCKER_API_VERSION") +var dockerApiVersion = os.Getenv("DOCKER_API_VERSION") var environment = os.Getenv("ENVIRONMENT_NAME") var orgId = os.Getenv("ORG_ID") @@ -310,7 +310,10 @@ func main() { fmt.Sprintf("ENVIRONMENT_NAME=%s", environment), fmt.Sprintf("BASE_URL=%s", baseUrl), } - //fmt.Sprintf("DOCKER_API_VERSION=%s", dockerApiVersion), + + if dockerApiVersion != "" { + env = append(env, fmt.Sprintf("DOCKER_API_VERSION=%s", dockerApiVersion)) + } err = deployWorker(dockercli, workerImage, containerName, env) if err != nil { diff --git a/functions/onprem/orborus/run.sh b/functions/onprem/orborus/run.sh index 37c16f15..9c6d8db5 100644 --- a/functions/onprem/orborus/run.sh +++ b/functions/onprem/orborus/run.sh @@ -2,6 +2,7 @@ docker run \ --env ORG_ID=$ORG_ID \ --env ENVIRONMENT_NAME="Shuffle" \ --env BASE_URL=http://shuffle-backend:5001 \ + --env DOCKER_API_VERSION=1.42 \ --network "shuffle_shuffle" \ -v /var/run/docker.sock:/var/run/docker.sock \ frikky/shuffle:orborus From 33e8d089b0bfbcd24f4ce846796c1c5d78d2b5b9 Mon Sep 17 00:00:00 2001 From: frikky Date: Fri, 22 May 2020 18:32:05 +0200 Subject: [PATCH 05/13] Fixed app download from any git(hub) repo --- backend/go-app/go.mod | 1 + backend/go-app/go.sum | 14 +++++++ backend/go-app/main.go | 56 +++++++++++++------------ backend/go-app/walkoff.go | 88 +++++++++++++++++++++++++++++++++------ frontend/src/Apps.js | 70 ++++++++++++++++++++++--------- frontend/src/LoginPage.js | 2 +- 6 files changed, 171 insertions(+), 60 deletions(-) diff --git a/backend/go-app/go.mod b/backend/go-app/go.mod index d4ef8407..20a8da9f 100644 --- a/backend/go-app/go.mod +++ b/backend/go-app/go.mod @@ -28,6 +28,7 @@ require ( google.golang.org/api v0.23.0 google.golang.org/appengine v1.6.6 google.golang.org/genproto v0.0.0-20200507105951-43844f6eee31 + gopkg.in/src-d/go-git.v4 v4.13.1 // indirect gopkg.in/yaml.v2 v2.2.8 gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 ) diff --git a/backend/go-app/go.sum b/backend/go-app/go.sum index 2b4ecfda..6bff1e65 100644 --- a/backend/go-app/go.sum +++ b/backend/go-app/go.sum @@ -46,6 +46,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -146,6 +147,7 @@ github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -153,6 +155,7 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -160,9 +163,14 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= @@ -178,6 +186,7 @@ golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79 h1:IaQbIIB2X/Mp/DKctl6ROxz1KyMlKp4uyvL6+kQ7C88= @@ -289,6 +298,7 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -385,6 +395,10 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/backend/go-app/main.go b/backend/go-app/main.go index e2a4e636..e20d4386 100644 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -5621,30 +5621,6 @@ func runInit(ctx context.Context) { } } - // Getting apps to see if we should initialize a test - workflowapps, err := getAllWorkflowApps(ctx) - if err != nil { - log.Printf("Failed getting apps: %s", err) - } else if err == nil && len(workflowapps) == 0 { - log.Printf("Apps: loading TEST") - fs := memfs.New() - storer := memory.NewStorage() - r, err := git.Clone(storer, fs, &git.CloneOptions{ - URL: "https://github.com/frikky/shuffle-apps", - }) - - if err != nil { - log.Printf("Failed loading repo into memory: %s", err) - } - - dir, err := fs.ReadDir("") - if err != nil { - log.Printf("FAiled reading folder: %s", err) - } - _ = r - iterateAppGithubFolders(fs, dir, "", "testing") - } - // Gets schedules and starts them schedules, err := getAllSchedules(ctx) if err != nil { @@ -5674,6 +5650,33 @@ func runInit(ctx context.Context) { } } + // Getting apps to see if we should initialize a test + workflowapps, err := getAllWorkflowApps(ctx) + if err != nil { + log.Printf("Failed getting apps: %s", err) + } else if err == nil && len(workflowapps) == 0 { + log.Printf("Apps: loading TEST") + fs := memfs.New() + storer := memory.NewStorage() + r, err := git.Clone(storer, fs, &git.CloneOptions{ + URL: "https://github.com/frikky/shuffle-apps", + }) + + if err != nil { + log.Printf("Failed loading repo into memory: %s", err) + } + + dir, err := fs.ReadDir("") + if err != nil { + log.Printf("Failed reading folder: %s", err) + } + _ = r + //iterateAppGithubFolders(fs, dir, "", "testing") + + // FIXME: Get all the apps? + iterateAppGithubFolders(fs, dir, "", "") + } + log.Printf("Finished INIT") } @@ -5721,9 +5724,8 @@ func init() { r.HandleFunc("/api/v1/streams", handleWorkflowQueue).Methods("POST") r.HandleFunc("/api/v1/streams/results", handleGetStreamResults).Methods("POST", "OPTIONS") - // Apps - r.HandleFunc("/api/v1/apps/get_existing", loadExistingApps).Methods("GET", "OPTIONS") - r.HandleFunc("/api/v1/apps/get_existing/{appname}", loadExistingApps).Methods("GET", "OPTIONS") + r.HandleFunc("/api/v1/apps/get_existing", loadSpecificApps).Methods("POST", "OPTIONS") + r.HandleFunc("/api/v1/apps/validate", validateAppInput).Methods("POST", "OPTIONS") r.HandleFunc("/api/v1/apps/{appId}", deleteWorkflowApp).Methods("DELETE", "OPTIONS") r.HandleFunc("/api/v1/apps/{appId}/config", getWorkflowAppConfig).Methods("GET", "OPTIONS") diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index ac4c4653..ed5c52b4 100644 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -26,6 +26,7 @@ import ( "github.com/go-git/go-billy/v5" "github.com/go-git/go-billy/v5/memfs" "github.com/go-git/go-git/v5" + http2 "gopkg.in/src-d/go-git.v4/plumbing/transport/http" newscheduler "github.com/carlescere/scheduler" "github.com/go-git/go-git/v5/storage/memory" @@ -3113,7 +3114,7 @@ func deployWebhookFunction(ctx context.Context, name, localization, applocation return nil } -func loadExistingApps(resp http.ResponseWriter, request *http.Request) { +func loadSpecificApps(resp http.ResponseWriter, request *http.Request) { cors := handleCors(resp, request) if cors { return @@ -3129,22 +3130,83 @@ func loadExistingApps(resp http.ResponseWriter, request *http.Request) { return } + body, err := ioutil.ReadAll(request.Body) + if err != nil { + log.Printf("Error with body read: %s", err) + resp.WriteHeader(401) + resp.Write([]byte(`{"success": false}`)) + return + } + + // Field1 & 2 can be a lot of things.. + type tmpStruct struct { + URL string `json:"url"` + Field1 string `json:"field_1"` + Field2 string `json:"field_2"` + } + //log.Printf("Body: %s", string(body)) + + var tmpBody tmpStruct + err = json.Unmarshal(body, &tmpBody) + if err != nil { + log.Printf("Error with unmarshal tmpBody: %s", err) + resp.WriteHeader(401) + resp.Write([]byte(`{"success": false}`)) + return + } + fs := memfs.New() - storer := memory.NewStorage() - r, err := git.Clone(storer, fs, &git.CloneOptions{ - URL: "https://github.com/frikky/shuffle-apps", - }) - if err != nil { - log.Printf("Failed loading repo into memory: %s", err) - } + if strings.Contains(tmpBody.URL, "github") || strings.Contains(tmpBody.URL, "gitlab") || strings.Contains(tmpBody.URL, "bitbucket") { + cloneOptions := &git.CloneOptions{ + URL: tmpBody.URL, + } - dir, err := fs.ReadDir("/") - if err != nil { - log.Printf("FAiled reading folder: %s", err) + // FIXME: Better auth. + if len(tmpBody.Field1) > 0 && len(tmpBody.Field2) > 0 { + cloneOptions.Auth = &http2.BasicAuth{ + Username: tmpBody.Field1, + Password: tmpBody.Field2, + } + } + + storer := memory.NewStorage() + r, err := git.Clone(storer, fs, cloneOptions) + if err != nil { + log.Printf("Failed loading repo into memory: %s", err) + resp.WriteHeader(401) + resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "%s"}`, err))) + return + } + + dir, err := fs.ReadDir("/") + if err != nil { + log.Printf("FAiled reading folder: %s", err) + } + _ = r + iterateAppGithubFolders(fs, dir, "", "") + + } else if strings.Contains(tmpBody.URL, "s3") { + //https://docs.aws.amazon.com/sdk-for-go/api/service/s3/ + + //sess := session.Must(session.NewSession()) + //downloader := s3manager.NewDownloader(sess) + + //// Write the contents of S3 Object to the file + //storer := memory.NewStorage() + //n, err := downloader.Download(storer, &s3.GetObjectInput{ + // Bucket: aws.String(myBucket), + // Key: aws.String(myString), + //}) + //if err != nil { + // return fmt.Errorf("failed to download file, %v", err) + //} + //fmt.Printf("file downloaded, %d bytes\n", n) + } else { + resp.WriteHeader(401) + resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "%s is unsupported"}`, tmpBody.URL))) + return } - _ = r - iterateAppGithubFolders(fs, dir, "", "") resp.WriteHeader(200) resp.Write([]byte(fmt.Sprintf(`{"success": true}`))) diff --git a/frontend/src/Apps.js b/frontend/src/Apps.js index fc394cd1..aeb09d03 100644 --- a/frontend/src/Apps.js +++ b/frontend/src/Apps.js @@ -30,6 +30,7 @@ const Apps = (props) => { const { globalUrl, isLoggedIn, isLoaded } = props; //const [workflows, setWorkflows] = React.useState([]); + const baseRepository = "https://github.com/frikky/shuffle-apps" const alert = useAlert() const [selectedApp, setSelectedApp] = React.useState({}); const [firstrequest, setFirstrequest] = React.useState(true) @@ -45,6 +46,9 @@ const Apps = (props) => { const [openApiModal, setOpenApiModal] = React.useState(false); const [openApiModalType, setOpenApiModalType] = React.useState(""); const [openApiError, setOpenApiError] = React.useState("") + const [field1, setField1] = React.useState("") + const [field2, setField2] = React.useState("") + const { start, stop } = useInterval({ duration: 5000, startImmediate: false, @@ -406,10 +410,10 @@ const Apps = (props) => { color="primary" style={{margin: 5, maxHeight: 50, marginTop: 10}} onClick={() => { - getExistingApps() + getSpecificApps(baseRepository) }} > - Load existing apps + Load apps
{ : null - // Gets the URL itself (hopefully this works in most cases? - // Will then forward the data to an internal endpoint to validate the api - const getExistingApps = () => { + // Load data e.g. from github + const getSpecificApps = (url) => { setValidation(true) setIsLoading(true) start() - alert.success("Downloading and building apps. Feel free to move around meanwhile.") + const parsedData = { + "url": url, + } + + if (field1.length > 0) { + parsedData["field_1"] = field1 + } + + if (field2.length > 0) { + parsedData["field_2"] = field2 + } + + alert.success("Getting specific apps from your URL.") var cors = "cors" fetch(globalUrl+"/api/v1/apps/get_existing", { - method: "GET", + method: "POST", mode: "cors", headers: { 'Accept': 'application/json', }, + body: JSON.stringify(parsedData), credentials: "include", }) .then((response) => { - if (response.status !== 200) { - alert.success("Failed loading.") - } else { + if (response.status === 200) { response.text().then(function (text) { console.log("RETURN: ", text) alert.success("Loaded existing apps!") @@ -500,6 +515,16 @@ const Apps = (props) => { } setIsLoading(false) stop() + + return response.json() + }) + .then((responseJson) => { + console.log("DATA: ", responseJson) + if (responseJson.reason !== undefined) { + alert.error("Failed loading: "+responseJson.reason) + } else { + alert.error("Failed loading") + } }) .catch(error => { alert.error(error.toString()) @@ -636,9 +661,8 @@ const Apps = (props) => { const handleGithubValidation = () => { - console.log("VALIDATE") - setValidation(true) - //const circularLoader = validation ? : null + getSpecificApps(openApi) + setLoadAppsModalOpen(false) } const appsModalLoad = loadAppsModalOpen ? @@ -647,6 +671,8 @@ const Apps = (props) => { onClose={() => { setOpenApi("") setLoadAppsModalOpen(false) + setField1("") + setField2("") }} PaperProps={{ style: { @@ -663,11 +689,12 @@ const Apps = (props) => {
- Github repository + Repository (supported: github, gitlab, bitbucket) { placeholder="https://github.com/frikky/shuffle-apps" fullWidth /> + + Authentication (optional - private repos etc):
{ fontSize: "1em", }, }} - onChange={e => setOpenApi(e.target.value)} - placeholder="https://github.com/frikky/shuffle-apps" + onChange={e => setField1(e.target.value)} + type="username" + placeholder="Username / APIkey (optional)" fullWidth /> { fontSize: "1em", }, }} - onChange={e => setOpenApi(e.target.value)} - placeholder="https://github.com/frikky/shuffle-apps" + onChange={e => setField2(e.target.value)} + type="password" + placeholder="Password (optional)" fullWidth />
@@ -718,6 +749,7 @@ const Apps = (props) => { Cancel diff --git a/frontend/src/LoginPage.js b/frontend/src/LoginPage.js index 040aeeac..7ff22e80 100644 --- a/frontend/src/LoginPage.js +++ b/frontend/src/LoginPage.js @@ -172,7 +172,7 @@ const LoginDialog = props => { const basedata =
-
+

{formtitle}

Username
From 6dac515dbe671fc0332f4590ee4cf0964c6fa621 Mon Sep 17 00:00:00 2001 From: frikky Date: Fri, 22 May 2020 18:32:43 +0200 Subject: [PATCH 06/13] Fix auth --- frontend/src/App.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/App.js b/frontend/src/App.js index 48cc6b24..a492c501 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -38,12 +38,12 @@ import AlertTemplate from "react-alert-template-basic"; import { positions, Provider } from "react-alert"; // Testing - localhost -const globalUrl = "http://192.168.3.6:5001" +//const globalUrl = "http://192.168.3.6:5001" //console.log("HOST: ", process.env) // Production - backend proxy forwarding in nginx -//const globalUrl = window.location.origin +const globalUrl = window.location.origin const surfaceColor = "#27292D" const inputColor = "#383B40" From 80d3229f3f104fbbc3c4bf3f7a4c56b196d40f1c Mon Sep 17 00:00:00 2001 From: frikky Date: Fri, 22 May 2020 18:40:34 +0200 Subject: [PATCH 07/13] Started reimplementing scheduler --- .env | 5 +++++ backend/go-app/main.go | 25 ++++++++++++++++++++++--- docker-compose.yml | 1 + 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/.env b/.env index c97e13f3..101e99be 100644 --- a/.env +++ b/.env @@ -2,6 +2,11 @@ ORG_ID=Shuffle ENVIRONMENT_NAME=Shuffle +# Different locations etc +APP_DOWNLOAD_LOCATION=https://github.com/frikky/shuffle-apps +APP_DOWNLOAD_AUTH_USERNAME="" +APP_DOWNLOAD_AUTH_PASSWORD="" + # Other configs BACKEND_HOSTNAME=shuffle-backend BACKEND_PORT=5010 diff --git a/backend/go-app/main.go b/backend/go-app/main.go index e20d4386..f0a3a77d 100644 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -51,6 +51,7 @@ import ( // Web // "github.com/gorilla/handlers" "github.com/gorilla/mux" + http2 "gopkg.in/src-d/go-git.v4/plumbing/transport/http" // Old items (cloud) // "google.golang.org/appengine" // "google.golang.org/appengine/memcache" @@ -5658,9 +5659,27 @@ func runInit(ctx context.Context) { log.Printf("Apps: loading TEST") fs := memfs.New() storer := memory.NewStorage() - r, err := git.Clone(storer, fs, &git.CloneOptions{ - URL: "https://github.com/frikky/shuffle-apps", - }) + + url := os.Getenv("APP_DOWNLOAD_LOCATION") + if len(url) == 0 { + url = "https://github.com/frikky/shuffle-apps" + } + + username := os.Getenv("APP_DOWNLOAD_AUTH_USERNAME") + password := os.Getenv("APP_DOWNLOAD_AUTH_PASSWORD") + cloneOptions := &git.CloneOptions{ + URL: url, + } + + if len(username) > 0 && len(password) > 0 { + cloneOptions.Auth = &http2.BasicAuth{ + Username: username, + Password: password, + } + } + log.Printf("Getting apps from %s", url) + + r, err := git.Clone(storer, fs, cloneOptions) if err != nil { log.Printf("Failed loading repo into memory: %s", err) diff --git a/docker-compose.yml b/docker-compose.yml index 17fec1a9..3fd3bc2c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -39,6 +39,7 @@ services: environment: - ORG_ID=${ORG_ID} - DATASTORE_EMULATOR_HOST=shuffle-database:8000 + - APP_DOWNLOAD_LOCATION=${APP_DOWNLOAD_LOCATION} restart: unless-stopped depends_on: - database From 0819a926a7ba64bff50d79caed2b1e3c4b23802a Mon Sep 17 00:00:00 2001 From: frikky Date: Fri, 22 May 2020 18:45:28 +0200 Subject: [PATCH 08/13] Fixed coloring --- frontend/src/AdminSetup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/AdminSetup.js b/frontend/src/AdminSetup.js index 11642974..d79c01f6 100644 --- a/frontend/src/AdminSetup.js +++ b/frontend/src/AdminSetup.js @@ -141,7 +141,7 @@ const AdminAccount = props => { const basedata =
- +

{formtitle}

Username
From 376dc67bf68595b509afc15cea8084337ab69aec Mon Sep 17 00:00:00 2001 From: frikky Date: Fri, 22 May 2020 19:09:24 +0200 Subject: [PATCH 09/13] Started backend app search engine --- backend/go-app/main.go | 5 ++- backend/go-app/walkoff.go | 45 ++++++++++++++++++++++ frontend/src/AngularWorkflow.js | 40 +++++++++++++------- frontend/src/Apps.js | 67 +++++++++++++++++++-------------- 4 files changed, 113 insertions(+), 44 deletions(-) diff --git a/backend/go-app/main.go b/backend/go-app/main.go index f0a3a77d..3b413141 100644 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -5743,15 +5743,16 @@ func init() { r.HandleFunc("/api/v1/streams", handleWorkflowQueue).Methods("POST") r.HandleFunc("/api/v1/streams/results", handleGetStreamResults).Methods("POST", "OPTIONS") + // App specific r.HandleFunc("/api/v1/apps/get_existing", loadSpecificApps).Methods("POST", "OPTIONS") - r.HandleFunc("/api/v1/apps/validate", validateAppInput).Methods("POST", "OPTIONS") r.HandleFunc("/api/v1/apps/{appId}", deleteWorkflowApp).Methods("DELETE", "OPTIONS") r.HandleFunc("/api/v1/apps/{appId}/config", getWorkflowAppConfig).Methods("GET", "OPTIONS") r.HandleFunc("/api/v1/apps", getWorkflowApps).Methods("GET", "OPTIONS") r.HandleFunc("/api/v1/apps", setNewWorkflowApp).Methods("PUT", "OPTIONS") + r.HandleFunc("/api/v1/apps/search", getSpecificApps).Methods("POST", "OPTIONS") - // Legacy things + // Legacy app things r.HandleFunc("/api/v1/workflows/apps/validate", validateAppInput).Methods("POST", "OPTIONS") r.HandleFunc("/api/v1/workflows/apps", getWorkflowApps).Methods("GET", "OPTIONS") r.HandleFunc("/api/v1/workflows/apps", setNewWorkflowApp).Methods("PUT", "OPTIONS") diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index ed5c52b4..9c039655 100644 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -2917,6 +2917,51 @@ func handleGetfile(resp http.ResponseWriter, request *http.Request) ([]byte, err return buf.Bytes(), nil } +func getSpecificApps(resp http.ResponseWriter, request *http.Request) { + cors := handleCors(resp, request) + if cors { + return + } + + // Just need to be logged in + // FIXME - should have some permissions? + _, err := handleApiAuthentication(resp, request) + if err != nil { + log.Printf("Api authentication failed in set new app: %s", err) + resp.WriteHeader(401) + resp.Write([]byte(`{"success": false}`)) + return + } + + body, err := ioutil.ReadAll(request.Body) + if err != nil { + log.Printf("Error with body read: %s", err) + resp.WriteHeader(401) + resp.Write([]byte(`{"success": false}`)) + return + } + + type tmpStruct struct { + Search string `json:"search"` + } + + var tmpBody tmpStruct + err = json.Unmarshal(body, &tmpBody) + if err != nil { + log.Printf("Error with unmarshal tmpBody: %s", err) + resp.WriteHeader(401) + resp.Write([]byte(`{"success": false}`)) + return + } + + // FIXME - continue the search here with github repos etc. + // Caching might be smart :D + log.Printf("Body: %s", string(body)) + + resp.WriteHeader(200) + resp.Write([]byte(fmt.Sprintf(`{"success": true}`))) +} + func validateAppInput(resp http.ResponseWriter, request *http.Request) { cors := handleCors(resp, request) if cors { diff --git a/frontend/src/AngularWorkflow.js b/frontend/src/AngularWorkflow.js index ec848df6..869182cb 100644 --- a/frontend/src/AngularWorkflow.js +++ b/frontend/src/AngularWorkflow.js @@ -90,8 +90,8 @@ const AngularWorkflow = (props) => { const [cystyle, ] = useState(cytoscapestyle) const [cy, setCy] = React.useState() + const [appSearch, setAppSearch] = React.useState("") const [currentView, setCurrentView] = React.useState("apps") - const [, setAppSearchValue] = React.useState("") const [triggerAuthentication, setTriggerAuthentication] = React.useState({}) const [triggerFolders, setTriggerFolders] = React.useState([]) @@ -1385,10 +1385,6 @@ const AngularWorkflow = (props) => { }); } - const setAppSearch = (event) => { - setFilteredApps(apps.filter(app => app.name.includes(event.target.value))) - } - const appViewStyle = { marginLeft: "5px", marginRight: "5px", @@ -1568,6 +1564,7 @@ const AngularWorkflow = (props) => { } const HandleLeftView = () => { + // Defaults to apps. var thisview = if (currentView === "triggers") { thisview = @@ -1577,14 +1574,6 @@ const AngularWorkflow = (props) => { return(
-
{ - setLeftViewOpen(false) - setLeftBarSize(50) - }}> - - - -
{thisview} @@ -1981,11 +1970,36 @@ const AngularWorkflow = (props) => { overflowX: "hidden", } + const runAppSearch = (event) => { + setAppSearch(event.target.value) + setFilteredApps(apps.filter(app => app.name.toLowerCase().includes(event.target.value.trim().toLowerCase()))) + } + const AppView = () => { return(
+ {/* + { + runAppSearch(event) + }} + /> + */} {filteredApps.map(app=> { // FIXME - add label to apps, as this might be slow with A LOT of apps var newAppname = app.name diff --git a/frontend/src/Apps.js b/frontend/src/Apps.js index aeb09d03..9c5b6c2b 100644 --- a/frontend/src/Apps.js +++ b/frontend/src/Apps.js @@ -38,6 +38,7 @@ const Apps = (props) => { const [filteredApps, setFilteredApps] = React.useState([]) const [validation, setValidation] = React.useState(false) const [isLoading, setIsLoading] = React.useState(false) + const [appSearchLoading, setAppSearchLoading] = React.useState(false) const [openApi, setOpenApi] = React.useState("") const [openApiData, setOpenApiData] = React.useState("") @@ -109,7 +110,7 @@ const Apps = (props) => { if (responseJson.length > 0) { setSelectedApp(responseJson[0]) } - }) + }) .catch(error => { alert.error(error.toString()) }); @@ -254,33 +255,6 @@ const Apps = (props) => { marginBottom: 10, } - //const handleFile = (event) =>{ - // const formData = new FormData(); - // formData.append('file', event.target.files[0]); - - // fetch(globalUrl+"/api/v1/workflows/apps/validate", { - // method: 'POST', - // headers: { - // 'Accept': 'application/json', - // }, - // body: formData, - // credentials: "include", - // }) - // .then((response) => { - // if (response.status !== 200) { - // console.log("Status not 200 for apps :O!") - // return - // } - // return response.json() - // }) - // .then((responseJson) => { - // console.log(responseJson) - // }) - // .catch(error => { - // alert.error(error.toString()) - // }); - //} - const UploadView = () => { //var imageline = selectedApp.large_image === undefined || selectedApp.large_image.length === 0 ? // @@ -386,7 +360,13 @@ const Apps = (props) => { const handleSearchChange = (event) => { const searchfield = event.target.value.toLowerCase() const newapps = apps.filter(data => data.name.toLowerCase().includes(searchfield) || data.description.toLowerCase().includes(searchfield)) - setFilteredApps(newapps) + + if (newapps.length === 0 && !appSearchLoading) { + setAppSearchLoading(true) + runAppSearch(searchfield) + } else { + setFilteredApps(newapps) + } } const appView = isLoggedIn ? @@ -461,6 +441,12 @@ const Apps = (props) => {

Try a broader search term. E.g. "http" or "TheHive"

+
+ + {appSearchLoading ? + + : null + } : @@ -577,6 +563,29 @@ const Apps = (props) => { }); } + const runAppSearch = (searchterm) => { + const data = {"search": searchterm} + + fetch(globalUrl+"/api/v1/apps/search", { + method: 'POST', + headers: { + 'Accept': 'application/json', + }, + body: JSON.stringify(data), + credentials: "include", + }) + .then((response) => { + setAppSearchLoading(false) + return response.json() + }) + .then((responseJson) => { + console.log(responseJson) + }) + .catch(error => { + alert.error(error.toString()) + }); + } + const validateRemote = () => { setValidation(true) From 190d13080c0f6d8844e27208d2a18a32676a8080 Mon Sep 17 00:00:00 2001 From: frikky Date: Sat, 23 May 2020 06:55:26 +0200 Subject: [PATCH 10/13] Added action and parameter info to App selection --- frontend/src/AngularWorkflow.js | 93 +++++++++++++++++++++++---------- frontend/src/Apps.js | 74 +++++++++++++++++++++++++- 2 files changed, 136 insertions(+), 31 deletions(-) diff --git a/frontend/src/AngularWorkflow.js b/frontend/src/AngularWorkflow.js index 869182cb..5ad736b9 100644 --- a/frontend/src/AngularWorkflow.js +++ b/frontend/src/AngularWorkflow.js @@ -2338,10 +2338,15 @@ const AngularWorkflow = (props) => {
{ @@ -2551,6 +2561,11 @@ const AngularWorkflow = (props) => { backgroundColor: inputColor, } }} + SelectDisplayProps={{ + style: { + marginLeft: 10, + } + }} fullWidth onChange={(e) => { const env = environments.find(a => a.Name === e.target.value) @@ -2586,6 +2601,11 @@ const AngularWorkflow = (props) => { fullWidth onChange={setNewSelectedAction} style={{backgroundColor: inputColor, color: "white", height: "50px"}} + SelectDisplayProps={{ + style: { + marginLeft: 10, + } + }} > {selectedApp.actions.map(data => { var newActionname = data.name @@ -2820,18 +2840,23 @@ const AngularWorkflow = (props) => { datafield =
{ { + setSelectedAction(event.target.value) + }} + style={{backgroundColor: inputColor, color: "white", height: "50px"}} + SelectDisplayProps={{ + style: { + marginLeft: 10, + } + }} + > + {selectedApp.actions.map(data => { + var newActionname = data.label !== undefined && data.label.length > 0 ? data.label : data.name + + // ROFL FIXME - loop + newActionname = newActionname.replace("_", " ") + newActionname = newActionname.replace("_", " ") + newActionname = newActionname.replace("_", " ") + newActionname = newActionname.replace("_", " ") + newActionname = newActionname.charAt(0).toUpperCase()+newActionname.substring(1) + return ( + + {newActionname} + + + ) + })} + +
+ + {selectedAction.parameters !== undefined ? +
+ Arguments + {selectedAction.parameters.map(data => { + var itemColor = "#f85a3e" + if (!data.required) { + itemColor = "#ffeb3b" + } + + const circleSize = 10 + return ( + +
+ {data.name} + + + ) + })} +
+ : null} + {editButton} {deleteButton}
@@ -384,6 +452,7 @@ const Apps = (props) => {

Available integrations

{isLoading ? : null} + {/* + */}