Fixed file search issue

This commit is contained in:
frikky
2023-03-23 00:53:58 +01:00
parent d9eaff1532
commit 4a1c209be7
12 changed files with 203 additions and 147 deletions
+3 -4
View File
@@ -241,16 +241,15 @@ func buildImageMemory(fs billy.Filesystem, tags []string, dockerfileFolder strin
BuildArgs: map[string]*string{}, BuildArgs: map[string]*string{},
Labels: labels, Labels: labels,
} }
// NetworkMode: "host", // NetworkMode: "host",
httpProxy := os.Getenv("HTTP_PROXY") httpProxy := os.Getenv("HTTP_PROXY")
if len(httpProxy) > 0 { if len(httpProxy) > 0 {
buildOptions.BuildArgs["http_proxy"] = &httpProxy buildOptions.BuildArgs["HTTP_PROXY"] = &httpProxy
} }
httpsProxy := os.Getenv("HTTPS_PROXY") httpsProxy := os.Getenv("HTTPS_PROXY")
if len(httpProxy) > 0 { if len(httpProxy) > 0 {
buildOptions.BuildArgs["https_proxy"] = &httpsProxy buildOptions.BuildArgs["HTTPS_PROXY"] = &httpsProxy
} }
// Build the actual image // Build the actual image
@@ -352,7 +351,7 @@ func buildImage(tags []string, dockerfileFolder string) error {
httpProxy := os.Getenv("HTTP_PROXY") httpProxy := os.Getenv("HTTP_PROXY")
if len(httpProxy) > 0 { if len(httpProxy) > 0 {
buildOptions.BuildArgs["http_proxy"] = &httpProxy buildOptions.BuildArgs["HTTP_PROXY"] = &httpProxy
} }
httpsProxy := os.Getenv("HTTPS_PROXY") httpsProxy := os.Getenv("HTTPS_PROXY")
if len(httpProxy) > 0 { if len(httpProxy) > 0 {
+1 -1
View File
@@ -19,7 +19,7 @@ require (
github.com/gorilla/mux v1.8.0 github.com/gorilla/mux v1.8.0
github.com/h2non/filetype v1.1.3 github.com/h2non/filetype v1.1.3
github.com/satori/go.uuid v1.2.0 github.com/satori/go.uuid v1.2.0
github.com/shuffle/shuffle-shared v0.3.70 github.com/shuffle/shuffle-shared v0.3.71
golang.org/x/crypto v0.3.0 golang.org/x/crypto v0.3.0
google.golang.org/api v0.103.0 google.golang.org/api v0.103.0
google.golang.org/appengine v1.6.7 google.golang.org/appengine v1.6.7
+1 -1
View File
@@ -369,7 +369,7 @@ func handleGetStreamResults(resp http.ResponseWriter, request *http.Request) {
ctx := context.Background() ctx := context.Background()
workflowExecution, err := shuffle.GetWorkflowExecution(ctx, actionResult.ExecutionId) workflowExecution, err := shuffle.GetWorkflowExecution(ctx, actionResult.ExecutionId)
if err != nil { if err != nil {
log.Printf("[WARNING] Failed getting execution (streamresult) %s: %s", actionResult.ExecutionId, err) log.Printf("[WARNING][%s] Failed getting execution (streamresult): %s", actionResult.ExecutionId, err)
resp.WriteHeader(401) resp.WriteHeader(401)
resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "Bad authorization key or execution_id might not exist."}`))) resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "Bad authorization key or execution_id might not exist."}`)))
return return
+33 -33
View File
@@ -1,38 +1,38 @@
version: '3' version: '3'
services: services:
frontend: #frontend:
image: ghcr.io/shuffle/shuffle-frontend:latest # image: ghcr.io/shuffle/shuffle-frontend:latest
container_name: shuffle-frontend # container_name: shuffle-frontend
hostname: shuffle-frontend # hostname: shuffle-frontend
ports: # ports:
- "${FRONTEND_PORT}:80" # - "${FRONTEND_PORT}:80"
- "${FRONTEND_PORT_HTTPS}:443" # - "${FRONTEND_PORT_HTTPS}:443"
networks: # networks:
- shuffle # - shuffle
environment: # environment:
- BACKEND_HOSTNAME=${BACKEND_HOSTNAME} # - BACKEND_HOSTNAME=${BACKEND_HOSTNAME}
restart: unless-stopped # restart: unless-stopped
depends_on: # depends_on:
- backend # - backend
backend: #backend:
image: ghcr.io/shuffle/shuffle-backend:latest # image: ghcr.io/shuffle/shuffle-backend:latest
container_name: shuffle-backend # container_name: shuffle-backend
hostname: ${BACKEND_HOSTNAME} # hostname: ${BACKEND_HOSTNAME}
# Here for debugging: # # Here for debugging:
ports: # ports:
- "${BACKEND_PORT}:5001" # - "${BACKEND_PORT}:5001"
networks: # networks:
- shuffle # - shuffle
volumes: # volumes:
- /var/run/docker.sock:/var/run/docker.sock # - /var/run/docker.sock:/var/run/docker.sock
- ${SHUFFLE_APP_HOTLOAD_LOCATION}:/shuffle-apps:z # - ${SHUFFLE_APP_HOTLOAD_LOCATION}:/shuffle-apps:z
- ${SHUFFLE_FILE_LOCATION}:/shuffle-files:z # - ${SHUFFLE_FILE_LOCATION}:/shuffle-files:z
env_file: .env # env_file: .env
environment: # environment:
#- DOCKER_HOST=tcp://docker-socket-proxy:2375 # #- DOCKER_HOST=tcp://docker-socket-proxy:2375
- SHUFFLE_APP_HOTLOAD_FOLDER=/shuffle-apps # - SHUFFLE_APP_HOTLOAD_FOLDER=/shuffle-apps
- SHUFFLE_FILE_LOCATION=/shuffle-files # - SHUFFLE_FILE_LOCATION=/shuffle-files
restart: unless-stopped # restart: unless-stopped
orborus: orborus:
image: ghcr.io/shuffle/shuffle-orborus:latest image: ghcr.io/shuffle/shuffle-orborus:latest
container_name: shuffle-orborus container_name: shuffle-orborus
+3 -1
View File
@@ -8,6 +8,7 @@
"@emotion/is-prop-valid": "^1.1.1", "@emotion/is-prop-valid": "^1.1.1",
"@emotion/react": "^11.7.0", "@emotion/react": "^11.7.0",
"@emotion/styled": "^11.6.0", "@emotion/styled": "^11.6.0",
"@lezer/highlight": "^1.1.3",
"@material-ui/core": "^4.5.2", "@material-ui/core": "^4.5.2",
"@material-ui/icons": "^4.5.1", "@material-ui/icons": "^4.5.1",
"@material-ui/lab": "^4.0.0-alpha.58", "@material-ui/lab": "^4.0.0-alpha.58",
@@ -17,6 +18,7 @@
"@mui/icons-material": "^5.2.1", "@mui/icons-material": "^5.2.1",
"@mui/material": "^5.2.3", "@mui/material": "^5.2.3",
"@mui/x-data-grid": "^5.17.11", "@mui/x-data-grid": "^5.17.11",
"@uiw/codemirror-themes": "^4.19.9",
"@uiw/react-codemirror": "^3.2.1", "@uiw/react-codemirror": "^3.2.1",
"@use-it/interval": "^1.0.0", "@use-it/interval": "^1.0.0",
"algoliasearch": "^4.13.1", "algoliasearch": "^4.13.1",
@@ -83,7 +85,7 @@
"zone.js": "~0.11.4" "zone.js": "~0.11.4"
}, },
"scripts": { "scripts": {
"start": "react-scripts start", "start": "PORT=3000 react-scripts start",
"build": "react-scripts build", "build": "react-scripts build",
"test": "react-scripts test", "test": "react-scripts test",
"eject": "react-scripts eject", "eject": "react-scripts eject",
+2 -2
View File
@@ -541,8 +541,8 @@ const App = (message, props) => {
/> />
} }
/> />
<Route exact path="/workflows/:key/run" element={<RunWorkflow serverside={serverside} userdata={userdata} globalUrl={globalUrl} isLoaded={isLoaded} isLoggedIn={isLoggedIn} surfaceColor={theme.palette.surfaceColor} inputColor={theme.palette.inputColor}{...props} /> } /> <Route exact path="/workflows/:key/run" element={<RunWorkflow userdata={userdata} globalUrl={globalUrl} isLoaded={isLoaded} isLoggedIn={isLoggedIn} surfaceColor={theme.palette.surfaceColor} inputColor={theme.palette.inputColor}{...props} /> } />
<Route exact path="/workflows/:key/execute" element={<RunWorkflow serverside={serverside} userdata={userdata} globalUrl={globalUrl} isLoaded={isLoaded} isLoggedIn={isLoggedIn} surfaceColor={theme.palette.surfaceColor} inputColor={theme.palette.inputColor}{...props} /> } /> <Route exact path="/workflows/:key/execute" element={<RunWorkflow userdata={userdata} globalUrl={globalUrl} isLoaded={isLoaded} isLoggedIn={isLoggedIn} surfaceColor={theme.palette.surfaceColor} inputColor={theme.palette.inputColor}{...props} /> } />
<Route <Route
exact exact
path="/docs/:key" path="/docs/:key"
+3
View File
@@ -1298,7 +1298,10 @@ const AppFramework = (props) => {
} }
//setDiscoveryData({}) //setDiscoveryData({})
if (setDiscoveryWrapper !== undefined) {
setDiscoveryWrapper({}) setDiscoveryWrapper({})
}
setSelectionOpen(false) setSelectionOpen(false)
setDefaultSearch("") setDefaultSearch("")
setPaperTitle("") setPaperTitle("")
+3 -7
View File
@@ -46,7 +46,7 @@ const Files = (props) => {
const [renderTextBox, setRenderTextBox] = React.useState(false); const [renderTextBox, setRenderTextBox] = React.useState(false);
const alert = useAlert(); const alert = useAlert();
const allowedFileTypes = ["txt", "py", "yaml", "yml","json", "html", "js", "csv",] const allowedFileTypes = ["txt", "py", "yaml", "yml","json", "html", "js", "csv", "log"]
var upload = ""; var upload = "";
const handleKeyDown = (event) => { const handleKeyDown = (event) => {
@@ -108,11 +108,7 @@ const Files = (props) => {
setFiles([]); setFiles([]);
} }
console.log("NAMESPACES: ", responseJson.namespaces); if (responseJson.namespaces !== undefined && responseJson.namespaces !== null) {
if (
responseJson.namespaces !== undefined &&
responseJson.namespaces !== null
) {
setFileNamespaces(responseJson.namespaces); setFileNamespaces(responseJson.namespaces);
} }
}) })
@@ -574,7 +570,7 @@ const Files = (props) => {
} }
const filenamesplit = file.filename.split(".") const filenamesplit = file.filename.split(".")
const iseditable = file.filesize < 100000 && file.status === "active" && allowedFileTypes.includes(filenamesplit[filenamesplit.length-1]) const iseditable = file.filesize < 2000000 && file.status === "active" && allowedFileTypes.includes(filenamesplit[filenamesplit.length-1])
return ( return (
<ListItem <ListItem
+21 -14
View File
@@ -18,8 +18,8 @@ import theme from '../theme';
import Checkbox from '@mui/material/Checkbox'; import Checkbox from '@mui/material/Checkbox';
import { orange } from '@mui/material/colors'; import { orange } from '@mui/material/colors';
import { isMobile } from "react-device-detect" import { isMobile } from "react-device-detect"
import { GetParsedPaths, FindJsonPath } from "../views/Apps.jsx";
import NestedMenuItem from "material-ui-nested-menu-item"; import NestedMenuItem from "material-ui-nested-menu-item";
import { GetParsedPaths, FindJsonPath } from "../views/Apps.jsx";
import { import {
FullscreenExit as FullscreenExitIcon, FullscreenExit as FullscreenExitIcon,
@@ -83,12 +83,12 @@ const shuffleTheme = createTheme({
theme: 'dark', theme: 'dark',
settings: { settings: {
background: '#282828', background: '#282828',
foreground: '#ffffff', foreground: '#282828',
caret: '#5d00ff', caret: '#5d00ff',
selection: '#036dd626', selection: '#036dd626',
selectionMatch: '#036dd626', selectionMatch: '#036dd626',
lineHighlight: '#8a91991a', lineHighlight: '#8a91991a',
gutterBackground: '#fff', gutterBackground: '#282828',
gutterForeground: '#8a919966', gutterForeground: '#8a919966',
fontSize: 18, fontSize: 18,
borderRadius: theme.palette.borderRadius, borderRadius: theme.palette.borderRadius,
@@ -156,7 +156,6 @@ const CodeEditor = (props) => {
} }
let navigate = useNavigate(); let navigate = useNavigate();
// console.log("is it file editor? - ", isFileEditor);
useEffect(() => { useEffect(() => {
var allVariables = [] var allVariables = []
@@ -449,9 +448,9 @@ const CodeEditor = (props) => {
const found = input.match(/[$]{1}([a-zA-Z0-9_-]+\.?){1}([a-zA-Z0-9#_-]+\.?){0,}/g) const found = input.match(/[$]{1}([a-zA-Z0-9_-]+\.?){1}([a-zA-Z0-9#_-]+\.?){0,}/g)
console.log("FOUND: ", found) console.log("FOUND: ", found)
// Whelp this is inefficient af. Single loop pls // Whelp this is inefficient af. Single loop pls
// When the found array is empty. // When the found array is empty.
if (found !== null && found !== undefined) {
try { try {
for (var i = 0; i < found.length; i++) { for (var i = 0; i < found.length; i++) {
try { try {
@@ -545,6 +544,7 @@ const CodeEditor = (props) => {
} catch (e) { } catch (e) {
//console.log("Outer replace error: ", e) //console.log("Outer replace error: ", e)
} }
}
const tmpValidation = validateJson(input.valueOf()) const tmpValidation = validateJson(input.valueOf())
//setValidation(true) //setValidation(true)
@@ -687,15 +687,15 @@ const CodeEditor = (props) => {
PaperComponent={PaperComponent} PaperComponent={PaperComponent}
PaperProps={{ PaperProps={{
style: { style: {
backgroundColor: theme.palette.surfaceColor,
color: "white",
minWidth: isMobile ? "100%" : 1200,
maxWidth: isMobile ? "100%" : 1200,
minHeight: isMobile ? "100%" : 900,
maxHeight: isMobile ? "100%" : 900,
padding: isMobile ? "25px 10px 25px 10px" : 25,
border: theme.palette.defaultBorder,
zIndex: 12501, zIndex: 12501,
color: "white",
minWidth: isMobile ? "100%" : isFileEditor ? 650 : 1200,
maxWidth: isMobile ? "100%" : isFileEditor ? 650 : 1200,
minHeight: isMobile ? "100%" : 720,
maxHeight: isMobile ? "100%" : 720,
border: theme.palette.defaultBorder,
padding: isMobile ? "25px 10px 25px 10px" : 25,
backgroundColor: theme.palette.surfaceColor,
}, },
}} }}
> >
@@ -1156,6 +1156,11 @@ const CodeEditor = (props) => {
theme={shuffleTheme} theme={shuffleTheme}
value = {localcodedata} value = {localcodedata}
height={isFileEditor ? 450 : 700} height={isFileEditor ? 450 : 700}
width={isFileEditor ? 650 : 550}
style={{
maxWidth: isFileEditor ? 450 : 500,
wordBreak: "break-word",
}}
onCursorActivity = {(value) => { onCursorActivity = {(value) => {
// console.log(value.getCursor()) // console.log(value.getCursor())
setCurrentCharacter(value.getCursor().ch) setCurrentCharacter(value.getCursor().ch)
@@ -1165,6 +1170,8 @@ const CodeEditor = (props) => {
highlight_variables(value) highlight_variables(value)
}} }}
onChange={(value) => { onChange={(value) => {
//console.log("Value: '", value.getValue(), "'")
setlocalcodedata(value.getValue()) setlocalcodedata(value.getValue())
expectedOutput(value.getValue()) expectedOutput(value.getValue())
@@ -1179,7 +1186,7 @@ const CodeEditor = (props) => {
styleSelectedText: true, styleSelectedText: true,
keyMap: 'sublime', keyMap: 'sublime',
mode: 'python', mode: 'python',
lineWrapping: linewrap, lineWrapping: true,
//theme: codeTheme, //theme: codeTheme,
// mode: {codelang}, // mode: {codelang},
}} }}
+36 -6
View File
@@ -43,6 +43,7 @@ import {
DialogContent, DialogContent,
CircularProgress, CircularProgress,
Box, Box,
InputAdornment,
} from "@material-ui/core"; } from "@material-ui/core";
import { Autocomplete } from "@mui/material"; import { Autocomplete } from "@mui/material";
@@ -67,6 +68,8 @@ import {
Schedule as ScheduleIcon, Schedule as ScheduleIcon,
Cloud as CloudIcon, Cloud as CloudIcon,
Business as BusinessIcon, Business as BusinessIcon,
Visibility as VisibilityIcon,
VisibilityOff as VisibilityOffIcon,
} from "@material-ui/icons"; } from "@material-ui/icons";
import { useAlert } from "react-alert"; import { useAlert } from "react-alert";
@@ -185,6 +188,8 @@ const Admin = (props) => {
const [dealerror, setDealerror] = React.useState(""); const [dealerror, setDealerror] = React.useState("");
const [dealList, setDealList] = React.useState([]); const [dealList, setDealList] = React.useState([]);
const [adminTab, setAdminTab] = React.useState(1); const [adminTab, setAdminTab] = React.useState(1);
const [showApiKey, setShowApiKey] = useState(false);
const [billingInfo, setBillingInfo] = React.useState({}); const [billingInfo, setBillingInfo] = React.useState({});
@@ -2242,7 +2247,7 @@ const Admin = (props) => {
<DialogTitle> <DialogTitle>
<span style={{ color: "white" }}>Enable cloud features</span> <span style={{ color: "white" }}>Enable cloud features</span>
</DialogTitle> </DialogTitle>
<DialogContent> <DialogContent color="textSecondary">
What does{" "} What does{" "}
<a <a
href="https://shuffler.io/docs/organizations#cloud_sync" href="https://shuffler.io/docs/organizations#cloud_sync"
@@ -2532,18 +2537,26 @@ const Admin = (props) => {
Billing Billing
</span> </span>
/> />
<Tab
disabled={true}
label=<span>
Branding
</span>
/>
<Tab <Tab
disabled={true} disabled={true}
label=<span> label=<span>
Usage Usage
</span> </span>
/> />
{/*
<Tab <Tab
disabled={true} disabled={true}
label=<span> label=<span>
Notifications Notifications
</span> </span>
/> />
*/}
</Tabs> </Tabs>
<Divider <Divider
@@ -2614,13 +2627,28 @@ const Admin = (props) => {
<div style={{ display: "flex" }}> <div style={{ display: "flex" }}>
<TextField <TextField
color="primary" color="primary"
style={{ backgroundColor: theme.palette.inputColor }} style={{
backgroundColor: theme.palette.inputColor,
maxWidth: 500,
}}
InputProps={{ InputProps={{
style: { style: {
height: "50px", height: "50px",
color: "white", color: "white",
fontSize: "1em", fontSize: "1em",
}, },
endAdornment: (
<InputAdornment position="end">
<IconButton
aria-label="toggle password visibility"
onClick={() => {
setShowApiKey(!showApiKey)
}}
>
{showApiKey ? <VisibilityIcon /> : <VisibilityOffIcon />}
</IconButton>
</InputAdornment>
)
}} }}
required required
fullWidth={true} fullWidth={true}
@@ -2631,6 +2659,7 @@ const Admin = (props) => {
placeholder="Cloud Apikey" placeholder="Cloud Apikey"
variant="outlined" variant="outlined"
defaultValue={userSettings.apikey} defaultValue={userSettings.apikey}
type={!isCloud || showApiKey ? "text" : "password"}
/> />
{selectedOrganization.cloud_sync_active ? ( {selectedOrganization.cloud_sync_active ? (
<Button <Button
@@ -2718,10 +2747,11 @@ const Admin = (props) => {
) : null} ) : null}
</div> </div>
)} )}
<Typography <Typography variant="h6" style={{ marginLeft: 5, marginTop: 40, marginBottom: 5 }}>
style={{ marginTop: 40, marginLeft: 10, marginBottom: 5 }} Cloud sync features
> </Typography>
Cloud sync features (monthly usage) <Typography variant="body2" color="textSecondary" style={{marginBottom: 10, marginLeft: 5, }}>
If not otherwise specified, Usage will reset monthly
</Typography> </Typography>
<Grid container style={{ width: "100%", marginBottom: 15 }}> <Grid container style={{ width: "100%", marginBottom: 15 }}>
{selectedOrganization.sync_features === undefined || {selectedOrganization.sync_features === undefined ||
+12 -7
View File
@@ -8320,17 +8320,15 @@ const AngularWorkflow = (defaultprops) => {
var injectedData = <div></div>; var injectedData = <div></div>;
if ( if (selectedEdge.conditions !== undefined && selectedEdge.conditions !== null && selectedEdge.conditions.length > 0) {
selectedEdge.conditions !== undefined &&
selectedEdge.conditions !== null &&
selectedEdge.conditions.length > 0
) {
injectedData = selectedEdge.conditions.map((condition, index) => { injectedData = selectedEdge.conditions.map((condition, index) => {
return ConditionHandler(condition, index); return ConditionHandler(condition, index);
}); });
} }
// FIXME - remove index // Startnode = dest node
const conditionsDisabled = false
const conditionId = uuidv4(); const conditionId = uuidv4();
return ( return (
<div style={appApiViewStyle}> <div style={appApiViewStyle}>
@@ -8363,7 +8361,7 @@ const AngularWorkflow = (defaultprops) => {
<Button <Button
style={{ margin: "auto", marginTop: "10px" }} style={{ margin: "auto", marginTop: "10px" }}
color="primary" color="secondary"
variant="outlined" variant="outlined"
onClick={() => { onClick={() => {
if (conditionsModalOpen) { if (conditionsModalOpen) {
@@ -8396,6 +8394,13 @@ const AngularWorkflow = (defaultprops) => {
> >
New condition New condition
</Button> </Button>
{/* Check if dest is the same as start */}
{conditionsDisabled ?
<Typography variant="body1">
Conditions are unavailable between triggers and the startnode.
</Typography>
: null}
</div> </div>
); );
}; };
+16 -2
View File
@@ -1618,7 +1618,16 @@ const AppCreator = (defaultprops) => {
} }
setProjectCategories(all_categories); setProjectCategories(all_categories);
// Rearrange them by which has action_label
const firstActions = newActions.filter(data => data.action_label !== undefined && data.action_label !== null && data.action_label !== "No Label")
console.log("First actions: ", firstActions)
const secondActions = newActions.filter(data => data.action_label === undefined || data.action_label === null || data.action_label === "No Label")
newActions = firstActions.concat(secondActions)
setActions(newActions); setActions(newActions);
//data.paths[item.url][item.method.toLowerCase()]["x-label"] = item.action_label
setFilteredActions(newActions); setFilteredActions(newActions);
setIsAppLoaded(true); setIsAppLoaded(true);
}; };
@@ -4031,12 +4040,16 @@ const AppCreator = (defaultprops) => {
}} }}
value={data.action_label} value={data.action_label}
style={{ style={{
border: data.action_label === undefined || data.action_label === "No Label" ? "" : `2px solid ${bgColor}`,
borderRadius: theme.shape.borderRadius,
backgroundColor: inputColor, backgroundColor: inputColor,
paddingLeft: 10, paddingLeft: 10,
color: "white", color: "white",
height: 30, height: 30,
maxWidth: 50, maxWidth: 35,
marginLeft: 10, marginLeft: 10,
marginRight: 10,
overflow: "hidden",
}} }}
inputProps={{ inputProps={{
name: "Method", name: "Method",
@@ -4048,7 +4061,8 @@ const AppCreator = (defaultprops) => {
<MenuItem <MenuItem
key={labelindex} key={labelindex}
value={label} value={label}
style={{ }} style={{
}}
> >
{label} {label}
</MenuItem> </MenuItem>